//------------------------------------------------------------------------
//緑文字の記述が追加する記述
//追加行については目安です
//TeraPadや秀丸などを用いて必ず全角スペース4つをtabに変換してください
//------------------------------------------------------------------------
○GvGSE用の処理を追加
src/lib/mmo.h ~67
#define MAX_GUILDALLIANCE 16
#define MAX_GUILDSKILL 15 //ギルドスキルの数
//▼▼▼ここから▼▼▼---------------------------------------------------
//GVGSE用の処理を追加
//#define MAX_GUILDCASTLE 20 //全砦数
#define MAX_GUILDCASTLE 30 //全砦数
//▲▲▲ここまで▲▲▲---------------------------------------------------
src/map/battle.c@battle_damage() ~145
if(target->type==BL_MOB){ // MOB
struct mob_data *md=(struct mob_data *)target;
if(md && md->ud.skilltimer!=-1 && md->ud.state.skillcastcancel) // 詠唱妨害
unit_skillcastcancel(target,0);
mob_damage(bl,md,damage,0);
//▼▼▼ここから▼▼▼---------------------------------------------------
//GVGSE用の処理を追加
// if(sd && md && md->bl.prev != NULL && !unit_isdead(&md->bl) && flag&(BF_WEAPON|BF_NORMAL) && status_get_class(target) != 1288)
if(sd && md && md->bl.prev != NULL && !unit_isdead(&md->bl) && flag&(BF_WEAPON|BF_NORMAL) && status_get_class(target) != 1288 &&
status_get_class(target) != 1905 && status_get_class(target) != 1907 && status_get_class(target) != 1908)
//▲▲▲ここまで▲▲▲---------------------------------------------------
{
int mode = status_get_mode(target);
~234
else if(target->type==BL_HOM){ // HOM
struct homun_data *hd=(struct homun_data *)target;
if(hd && hd->ud.skilltimer!=-1 && hd->ud.state.skillcastcancel) // 詠唱妨害
unit_skillcastcancel(target,0);
homun_damage(bl,hd,damage);
//▼▼▼ここから▼▼▼---------------------------------------------------
//GVGSE用の処理を追加
// if(sd && hd && hd->bl.prev != NULL && !unit_isdead(&hd->bl) && flag&(BF_WEAPON|BF_NORMAL) && status_get_class(target) != 1288)
if(sd && hd && hd->bl.prev != NULL && !unit_isdead(&hd->bl) && flag&(BF_WEAPON|BF_NORMAL) && status_get_class(target) != 1288 &&
status_get_class(target) != 1905 && status_get_class(target) != 1907 && status_get_class(target) != 1908)
//▲▲▲ここまで▲▲▲---------------------------------------------------
{
int mode = status_get_mode(target);
clif.c@clif_mob0078() ~1094
WBUFW(buf,13)=(unsigned short)md->estate;
WBUFW(buf,15)=mob_get_viewclass(md->class);
#if PACKETVER >= 20071106
WBUFW(buf,0)=0x0078;
WBUFB(buf,2)=0;
WBUFL(buf,3)=md->bl.id;
WBUFW(buf,7)=status_get_speed(&md->bl);
WBUFW(buf,9)=md->bstate;
WBUFW(buf,11)=md->hstate;
WBUFW(buf,13)=(unsigned short)md->estate;
WBUFW(buf,15)=mob_get_viewclass(md->class);
//▼▼▼ここから▼▼▼---------------------------------------------------
//GVGSE用の処理を追加
// if((md->class == 1285 || md->class == 1286 || md->class == 1287) && md->guild_id){
if(((md->class >= 1285 && md->class <= 1287) || md->class == 1899 || md->class == 1900) && md->guild_id){
//▲▲▲ここまで▲▲▲---------------------------------------------------
struct guild *g=guild_search(md->guild_id);
if(g)
WBUFL(buf,23)=g->emblem_id;
WBUFL(buf,27)=md->guild_id;
}
WBUFW(buf,43)=md->opt3;
WBUFPOS(buf,47,md->bl.x,md->bl.y);
WBUFB(buf,49)|=md->dir&0x0f;
WBUFB(buf,50)=5;
WBUFB(buf,51)=5;
WBUFW(buf,53)=((level = status_get_lv(&md->bl))>99)? 99:level;
#else
WBUFW(buf,0)=0x0078;
WBUFL(buf,2)=md->bl.id;
WBUFW(buf,6)=status_get_speed(&md->bl);
WBUFW(buf,8)=md->bstate;
WBUFW(buf,10)=md->hstate;
WBUFW(buf,12)=(unsigned short)md->estate;
WBUFW(buf,14)=mob_get_viewclass(md->class);
//▼▼▼ここから▼▼▼---------------------------------------------------
//GVGSE用の処理を追加
// if((md->class == 1285 || md->class == 1286 || md->class == 1287) && md->guild_id){
if(((md->class >= 1285 && md->class <= 1287) || md->class == 1899 || md->class == 1900) && md->guild_id){
//▲▲▲ここまで▲▲▲---------------------------------------------------
struct guild *g=guild_search(md->guild_id);
if(g)
WBUFL(buf,22)=g->emblem_id;
WBUFL(buf,26)=md->guild_id;
}
src/map/clif.c@clif_mob007b() ~1295
WBUFW(buf,12)=(unsigned short)md->estate;
WBUFW(buf,14)=mob_get_viewclass(md->class);
WBUFL(buf,22)=gettick();
//▼▼▼ここから▼▼▼---------------------------------------------------
//GVGSE用の処理を追加
// if((md->class == 1285 || md->class == 1286 || md->class == 1287) && md->guild_id){
if(((md->class >= 1285 && md->class <= 1287) || md->class == 1899 || md->class == 1900) && md->guild_id){
//▲▲▲ここまで▲▲▲---------------------------------------------------
struct guild *g=guild_search(md->guild_id);
if(g)
src/map/mob.c@mob_spawn() ~412
md->next_walktime = tick+atn_rand()%50+5000;
md->state.nodrop=0;
md->state.noexp=0;
md->state.nomvp=0;
// md->guild_id = 0;
//▼▼▼ここから▼▼▼---------------------------------------------------
//GVGSE用の処理を追加
// if(md->class == 1288 || md->class == 1287 || md->class == 1286 || md->class == 1285) {
if((md->class <= 1288 && md->class >= 1285) || md->class == 1905 || md->class == 1908 || md->class == 1907 || md->class == 1900 || md->class == 1899) {
//▲▲▲ここまで▲▲▲---------------------------------------------------
struct guild_castle *gc=guild_mapname2gc(map[md->bl.m].name);
if(gc)
md->guild_id = gc->guild_id;
}
@mob_can_reach() ~475
//=========== guildcastle guardian no search start===========
//when players are the guild castle member not attack them !
//▼▼▼ここから▼▼▼---------------------------------------------------
//GVGSE用の処理を追加
// if(md->class == 1285 || md->class == 1286 || md->class == 1287){
if((md->class >= 1285 && md->class <= 1287) || md->class == 1899 || md->class == 1900){
//▲▲▲ここまで▲▲▲---------------------------------------------------
struct map_session_data *sd;
struct guild *g;
struct guild_castle *gc=guild_mapname2gc(map[bl->m].name);
if(bl->type == BL_PC){
@mob_gvmobcheck() ~3428
nullpo_retr(0,sd);
nullpo_retr(0,bl);
//▼▼▼ここから▼▼▼---------------------------------------------------
//GVGSE用の処理を追加
// if(bl->type==BL_MOB && (md=(struct mob_data *)bl) &&
// (md->class == 1288 || md->class == 1287 || md->class == 1286 || md->class == 1285))
// {
if(bl->type==BL_MOB && (md=(struct mob_data *)bl) &&
((md->class <= 1288 && md->class >= 1285) || md->class == 1905 ||
md->class == 1908 || md->class == 1907 || md->class == 1900 || md->class == 1899))
{
//▲▲▲ここまで▲▲▲---------------------------------------------------
struct guild_castle *gc=guild_mapname2gc(map[sd->bl.m].name);
struct guild *g=guild_search(sd->status.guild_id);
src/map/script.c@buildin_maprespawnguildid_sub() ~7606
if(sd){
if(flag&1 && g_id && sd->status.guild_id == g_id)
pc_setpos(sd,sd->status.save_point.map,sd->status.save_point.x,sd->status.save_point.y,3,0);
else if(flag&2 && (!g_id || sd->status.guild_id != g_id))
pc_setpos(sd,sd->status.save_point.map,sd->status.save_point.x,sd->status.save_point.y,3,0);
}
if(flag&4 && md){
//▼▼▼ここから▼▼▼---------------------------------------------------
//GVGSE用の処理を追加
// if(md->class < 1285 || md->class > 1288)
// unit_remove_map(&md->bl,1,0);
if(!(md->class >= 1285 || md->class <= 1288) || !(md->class >= 1899 || md->class <= 1900) || !(md->class >= 1907 || md->class <= 1908))
unit_remove_map(&md->bl,1,0);
//▲▲▲ここまで▲▲▲---------------------------------------------------
}
return 0;
}
src/map/skill.c@skill_castend_nodamage_id() ~3604
case TK_HIGHJUMP://走り高跳び(ノピティギ)
{
int x,y,dir = status_get_dir(src);
x = src->x + dirx[dir]*skilllv*2;
y = src->y + diry[dir]*skilllv*2;
clif_skill_nodamage(src,bl,skillid,skilllv,1);
// 着地地点とその一歩先が移動可能セルでPC,MOB,NPCいずれも居ないなら
//▼▼▼ここから▼▼▼---------------------------------------------------
//GVGSE用の処理を追加
// if( !map[src->m].flag.pvp && (!map[src->m].flag.noteleport || map[src->m].flag.gvg) &&
// map_getcell(src->m,x,y,CELL_CHKPASS) && map_getcell(src->m,x+dirx[dir],y+diry[dir],CELL_CHKPASS) &&
// !map_count_oncell(src->m,x,y,BL_PC|BL_MOB|BL_NPC)
// ) {
if( !map[src->m].flag.pvp && (!map[src->m].flag.noteleport || (map[src->m].flag.gvg && !map[src->m].flag.noicewall)) &&
map_getcell(src->m,x,y,CELL_CHKPASS) && map_getcell(src->m,x+dirx[dir],y+diry[dir],CELL_CHKPASS) &&
!map_count_oncell(src->m,x,y,BL_PC|BL_MOB|BL_NPC)
) {
//▲▲▲ここまで▲▲▲---------------------------------------------------
unit_movepos(src,x,y,0x11);
}
}
break;
○守護石へのスキル使用を禁止する(妄想仕様のためお好みでどうぞ タロット禁止だけ入れておくのもいいです)
src/map/battle.c@battle_damage() ~510
if(damage > 0) { //GvG PK
struct guild_castle *gc=guild_mapname2gc(map[bl->m].name);
struct guild *g;
//▼▼▼ここから▼▼▼---------------------------------------------------
//GVGSE用の処理を追加
// if(class == 1288) { // 1288:エンペリウム
if(class == 1288 || class == 1907 || class == 1908) { // 1288:エンペリウム 1907~1908:守護石
//▲▲▲ここまで▲▲▲---------------------------------------------------
if(flag&BF_SKILL && skill_num!=PA_PRESSURE && skill_num!=HW_GRAVITATION)//プレッシャー
return 0;
//▼▼▼ここから▼▼▼---------------------------------------------------
//GVGSE用の処理を追加
if(class == 1288) {
if(src->type == BL_PC) {
g=guild_search(((struct map_session_data *)src)->status.guild_id);
if(g == NULL)
return 0;//ギルド未加入ならダメージ無し
else if((gc != NULL) && g->guild_id == gc->guild_id)
return 0;//自占領ギルドのエンペならダメージ無し
else if(guild_checkskill(g,GD_APPROVAL) <= 0)
return 0;//正規ギルド承認がないとダメージ無し
else if (g && gc && guild_check_alliance(gc->guild_id, g->guild_id, 0) == 1)
return 0; // 同盟ならダメージ無し
}
else
return 0;
}
//▲▲▲ここまで▲▲▲---------------------------------------------------
}
if(map[bl->m].flag.gvg && skill_num!=PA_PRESSURE && skill_num!=HW_GRAVITATION){
@battle_calc_weapon_attack() 2348~
}else{
damage += damage * (150 + sc_data[SC_EDP].val1 * 50) / 100;
}
// no_cardfix = 1;
}
// サクリファイス
//▼▼▼ここから▼▼▼---------------------------------------------------
//GVGSE用の処理を追加
// if (sc_data[SC_SACRIFICE].timer != -1 && !skill_num && status_get_class(target)!=1288) {
if (sc_data[SC_SACRIFICE].timer != -1 && !skill_num && status_get_class(target)!=1288 && status_get_class(target)!=1907 && status_get_class(target)!=1908) {
//▲▲▲ここまで▲▲▲---------------------------------------------------
int mhp = status_get_max_hp(src);
src/map/skill.c@skill_additional_effect() ~1230
// if(sd && skillid != MC_CARTREVOLUTION && attack_type&BF_WEAPON){ /* カードによる追加効果 */
if(sd && skillid != WS_CARTTERMINATION && skillid != CR_ACIDDEMONSTRATION){ /* カードによる追加効果 */
int i;
int sc_def_card=100;
for(i=SC_STONE;i<=SC_BLEED;i++){
//▼▼▼ここから▼▼▼---------------------------------------------------
//守護石のスキル無効化
// if(!dstmd || dstmd->class != 1288){
if(!dstmd || dstmd->class != 1288 || dstmd->class != 1907 || dstmd->class != 1908){
//▲▲▲ここまで▲▲▲---------------------------------------------------
if(sd->addeff_range_flag[i-SC_STONE]>2){
sd->addeff_range_flag[i-SC_STONE]-=2; // レンジフラグがあれば元に戻す
continue;
}
~1338
//殴ってmob変化
//▼▼▼ここから▼▼▼---------------------------------------------------
//守護石のスキル無効化
// if(sd && dstmd && mob_db[dstmd->class].race != 7 && !map[dstmd->bl.m].flag.nobranch
// && !(mob_db[dstmd->class].mode&0x20) && attack_type&BF_WEAPON && dstmd->class != 1288 && dstmd->state.special_mob_ai != 1)
// {
if(sd && dstmd && mob_db[dstmd->class].race != 7 && !map[dstmd->bl.m].flag.nobranch
&& !(mob_db[dstmd->class].mode&0x20) && attack_type&BF_WEAPON && dstmd->class != 1288 && dstmd->class != 1907 && dstmd->class != 1908 && dstmd->state.special_mob_ai != 1)
{
//▲▲▲ここまで▲▲▲---------------------------------------------------
if(atn_rand()%10000 < sd->mob_class_change_rate)
{
//clif_skill_nodamage(src,bl,SA_CLASSCHANGE,1,1);
mob_class_change_randam(dstmd,sd->status.base_level);
}
}
return 0;
}
@skill_castend_damage_id() ~2748
case HVAN_CAPRICE://カプリス
{
static int caprice[4] = { MG_COLDBOLT,MG_FIREBOLT,MG_LIGHTNINGBOLT,WZ_EARTHSPIKE};
battle_skill_attack(BF_MAGIC,src,src,bl,caprice[atn_rand()%4],skilllv,tick,flag);
clif_skill_nodamage(src,src,skillid,skilllv,1);
}
break;
case CG_TAROTCARD: /*運命のタロットカード*/
//▼▼▼ここから▼▼▼---------------------------------------------------
//守護石のスキル無効化
// if(status_get_class(bl) == 1288){ //エンペリウム無効
if(status_get_class(bl) == 1288 || status_get_class(bl) == 1907 || status_get_class(bl) == 1908){ //エンペリウム無効
//▲▲▲ここまで▲▲▲---------------------------------------------------
clif_skill_fail(sd,skillid,0,0);
break;
}
else
skill_tarot_card_of_fate(src,bl,skillid,skilllv,tick,flag,0);
break;
case MG_FROSTDIVER: /* フロストダイバー */
@skill_castend_nodamage_id() ~3113
if(bl->prev == NULL)
return 1;
if(unit_isdead(bl) && skillid != ALL_RESURRECTION)
return 1;
//▼▼▼ここから▼▼▼---------------------------------------------------
//守護石のスキル無効化
// if(status_get_class(bl) == 1288)
if(src != bl && (status_get_class(bl) == 1288 || status_get_class(bl) == 1907 || status_get_class(bl) == 1908))
return 1;
//▲▲▲ここまで▲▲▲---------------------------------------------------
sd = BL_DOWNCAST( BL_PC, src );
md = BL_DOWNCAST( BL_MOB, src );
@skill_check_condition() ~9310
case SG_HATE:
{
struct mob_data *md = map_id2md(sc->target);
//▼▼▼ここから▼▼▼---------------------------------------------------
//守護石のスキル無効化
// if(md && md->class == 1288) { // エンペは登録不可
if(md && (md->class == 1288 || md->class == 1907 || md->class == 1908)) { // エンペは登録不可
//▲▲▲ここまで▲▲▲---------------------------------------------------
clif_skill_fail(sd,sc->id,0,0);
return 0;
}
}
break;
case SG_FUSION:
src/map/unit.c@unit_skilluse_id2() ~1014
case HP_BASILICA:
if(sc_data && sc_data[SC_BASILICA].timer != -1)
casttime = 0;
break;
case PA_PRESSURE:
//▼▼▼ここから▼▼▼---------------------------------------------------
//守護石のスキル無効化
// if(status_get_class(target) == 1288 && src_sd) {
if((status_get_class(target) == 1288 || status_get_class(target) == 1907 || status_get_class(target) == 1908) && src_sd) {
//▲▲▲ここまで▲▲▲---------------------------------------------------
clif_skill_fail(src_sd,skill_num,0,0); //エンペリウムには使用不可
return 0;
}
break;