📄 skill.c
字号:
map_freeblock_unlock();
return 1;
}
break;
/* 杺朄宯僗僉儖 */
case MG_SOULSTRIKE: /* 僜僂儖僗僩儔僀僋 */
case MG_COLDBOLT: /* 僐乕儖僪儃儖僩 */
case MG_FIREBOLT: /* 僼傽僀傾乕儃儖僩 */
case MG_LIGHTNINGBOLT: /* 儔僀僩僯儞僌儃儖僩 */
case WZ_EARTHSPIKE: /* 傾乕僗僗僷僀僋 */
case AL_HEAL: /* 僸乕儖 */
case AL_HOLYLIGHT: /* 儂乕儕乕儔僀僩 */
case MG_FROSTDIVER: /* 僼儘僗僩僟僀僶乕 */
case WZ_JUPITEL: /* 儐僺僥儖僒儞僟乕 */
case NPC_MAGICALATTACK: /* MOB:杺朄懪寕峌寕 */
skill_attack(BF_MAGIC,src,src,bl,skillid,skilllv,tick,flag);
break;
case WZ_WATERBALL: /* 僂僅乕僞乕儃乕儖 */
skill_attack(BF_MAGIC,src,src,bl,skillid,skilllv,tick,flag);
if(skilllv>1)
skill_status_change_start(src,SC_WATERBALL,skilllv,bl->id,0,0,0,0);
break;
case PR_BENEDICTIO: /* 惞懱崀暉 */
if(battle_get_race(bl)==1 || battle_get_race(bl)==6)
skill_attack(BF_MAGIC,src,src,bl,skillid,skilllv,tick,flag);
break;
/* 杺朄宯斖埻峌寕僗僉儖 */
case MG_NAPALMBEAT: /* 僫僷乕儉價乕僩 */
case MG_FIREBALL: /* 僼傽僀儎乕儃乕儖 */
if(flag&1){
/* 屄暿偵僟儊乕僕傪梌偊傞 */
if(bl->id!=skill_area_temp[1]){
if(skillid==MG_FIREBALL){ /* 僼傽僀儎乕儃乕儖側傜拞怱偐傜偺嫍棧傪寁嶼 */
int dx=abs( bl->x - skill_area_temp[2] );
int dy=abs( bl->y - skill_area_temp[3] );
skill_area_temp[0]=((dx>dy)?dx:dy);
}
skill_attack(BF_MAGIC,src,src,bl,skillid,skilllv,tick,
skill_area_temp[0]| 0x0500);
}
}else{
int ar=(skillid==MG_NAPALMBEAT)?1:2;
skill_area_temp[1]=bl->id;
if(skillid==MG_NAPALMBEAT){ /* 僫僷乕儉偱偼愭偵悢偊傞 */
skill_area_temp[0]=0;
map_foreachinarea(skill_area_sub,
bl->m,bl->x-1,bl->y-1,bl->x+1,bl->y+1,0,
src,skillid,skilllv,tick, flag|BCT_ENEMY ,
skill_area_sub_count);
}else{
skill_area_temp[0]=0;
skill_area_temp[2]=bl->x;
skill_area_temp[3]=bl->y;
}
/* 傑偢僞乕僎僢僩偵峌寕傪壛偊傞 */
skill_attack(BF_MAGIC,src,src,bl,skillid,skilllv,tick,
skill_area_temp[0] );
/* 偦偺屻僞乕僎僢僩埲奜偺斖埻撪偺揋慡懱偵張棟傪峴偆 */
map_foreachinarea(skill_area_sub,
bl->m,bl->x-ar,bl->y-ar,bl->x+ar,bl->y+ar,0,
src,skillid,skilllv,tick, flag|BCT_ENEMY|1,
skill_castend_damage_id);
}
break;
case WZ_FROSTNOVA: /* 僼儘僗僩僲償傽 */
skill_castend_pos2(src,bl->x,bl->y,skillid,skilllv,tick,0);
break;
case WZ_SIGHTRASHER:
clif_skill_nodamage(src,bl,skillid,skilllv,1);
skill_castend_pos2(src,bl->x,bl->y,skillid,skilllv,tick,0);
skill_status_change_end(src,SC_SIGHT,-1);
break;
/* 偦偺懠 */
case HT_BLITZBEAT: /* 僽儕僢僣價乕僩 */
if(flag&1){
/* 屄暿偵僟儊乕僕傪梌偊傞 */
if(bl->id!=skill_area_temp[1])
skill_attack(BF_MISC,src,src,bl,skillid,skilllv,tick,skill_area_temp[0]|(flag&0xf00000));
}else{
skill_area_temp[0]=0;
skill_area_temp[1]=bl->id;
if(flag&0xf00000)
map_foreachinarea(skill_area_sub,bl->m,bl->x-1,bl->y-1,bl->x+1,bl->y+1,0,
src,skillid,skilllv,tick, flag|BCT_ENEMY ,skill_area_sub_count);
/* 傑偢僞乕僎僢僩偵峌寕傪壛偊傞 */
skill_attack(BF_MISC,src,src,bl,skillid,skilllv,tick,skill_area_temp[0]|(flag&0xf00000));
/* 偦偺屻僞乕僎僢僩埲奜偺斖埻撪偺揋慡懱偵張棟傪峴偆 */
map_foreachinarea(skill_area_sub,
bl->m,bl->x-1,bl->y-1,bl->x+1,bl->y+1,0,
src,skillid,skilllv,tick, flag|BCT_ENEMY|1,
skill_castend_damage_id);
}
break;
case CR_GRANDCROSS: /* 僌儔儞僪僋儘僗 */
/* 僗僉儖儐僯僢僩攝抲 */
skill_castend_pos2(src,bl->x,bl->y,skillid,skilllv,tick,0);
if(sd)
sd->canmove_tick = tick + 900;
else if(src->type == BL_MOB)
mob_changestate((struct mob_data *)src,MS_DELAY,900);
break;
case TF_THROWSTONE: /* 愇搳偘 */
case NPC_SMOKING: /* 僗儌乕僉儞僌 */
skill_attack(BF_MISC,src,src,bl,skillid,skilllv,tick,0 );
break;
case NPC_SELFDESTRUCTION: /* 帺敋 */
if(flag&1){
/* 屄暿偵僟儊乕僕傪梌偊傞 */
if(src->type==BL_MOB){
struct mob_data* mb=(struct mob_data*)src;
mb->hp=skill_area_temp[2];
if(bl->id!=skill_area_temp[1])
skill_attack(BF_MISC,src,src,bl,skillid,skilllv,tick,flag );
mb->hp=1;
}
}else{
skill_area_temp[1]=bl->id;
skill_area_temp[2]=battle_get_hp(src);
/* 傑偢僞乕僎僢僩偵峌寕傪壛偊傞 */
skill_attack(BF_MISC,src,src,bl,skillid,skilllv,tick,flag );
/* 偦偺屻僞乕僎僢僩埲奜偺斖埻撪偺揋慡懱偵張棟傪峴偆 */
map_foreachinarea(skill_area_sub,
bl->m,bl->x-5,bl->y-5,bl->x+5,bl->y+5,0,
src,skillid,skilllv,tick, flag|BCT_ALL|1,
skill_castend_damage_id);
battle_damage(src,src,1,0);
}
break;
/* HP媧廂/HP媧廂杺朄 */
case NPC_BLOODDRAIN:
case NPC_ENERGYDRAIN:
{
int heal;
heal = skill_attack((skillid==NPC_BLOODDRAIN)?BF_WEAPON:BF_MAGIC,src,src,bl,skillid,skilllv,tick,flag);
if( heal > 0 ){
struct block_list tbl;
tbl.id = 0;
tbl.m = src->m;
tbl.x = src->x;
tbl.y = src->y;
clif_skill_nodamage(&tbl,src,AL_HEAL,heal,1);
battle_heal(NULL,src,heal,0,0);
}
}
break;
case 0:
if(sd) {
if(flag&3){
if(bl->id!=skill_area_temp[1])
skill_attack(BF_WEAPON,src,src,bl,skillid,skilllv,tick,0x0500);
}
else{
int ar=sd->splash_range;
skill_area_temp[1]=bl->id;
map_foreachinarea(skill_area_sub,
bl->m, bl->x - ar, bl->y - ar, bl->x + ar, bl->y + ar, 0,
src, skillid, skilllv, tick, flag | BCT_ENEMY | 1,
skill_castend_damage_id);
}
}
break;
default:
map_freeblock_unlock();
return 1;
}
map_freeblock_unlock();
return 0;
}
/*==========================================
* 僗僉儖巊梡乮塺彞姰椆丄ID巜掕巟墖宯乯
*------------------------------------------
*/
int skill_castend_nodamage_id( struct block_list *src, struct block_list *bl,int skillid,int skilllv,unsigned int tick,int flag )
{
struct map_session_data *sd=NULL;
struct map_session_data *dstsd=NULL;
struct mob_data *md=NULL;
struct mob_data *dstmd=NULL;
int i,abra_skillid=0,abra_skilllv;
int sc_def_vit,sc_def_mdef,strip_fix,strip_time,strip_per;
//僋儔僗僠僃儞僕梡儃僗儌儞僗僞乕ID
int changeclass[]={1038,1039,1046,1059,1086,1087,1112,1115
,1157,1159,1190,1272,1312,1373,1492};
int poringclass[]={1002};
if(src->type==BL_PC)
sd=(struct map_session_data *)src;
else if(src->type==BL_MOB)
md=(struct mob_data *)src;
sc_def_vit = 100 - (3 + battle_get_vit(bl) + battle_get_luk(bl)/3);
sc_def_mdef = 100 - (3 + battle_get_mdef(bl) + battle_get_luk(bl)/3);
strip_fix = battle_get_dex(src) - battle_get_dex(bl);
if(bl->type==BL_PC)
dstsd=(struct map_session_data *)bl;
else if(bl->type==BL_MOB){
dstmd=(struct mob_data *)bl;
if(sc_def_vit>50)
sc_def_vit=50;
if(sc_def_mdef>50)
sc_def_mdef=50;
}
if(sc_def_vit < 0)
sc_def_vit=0;
if(sc_def_mdef < 0)
sc_def_mdef=0;
if(strip_fix < 0)
strip_fix=0;
if(bl == NULL || bl->prev == NULL)
return 1;
if(sd && pc_isdead(sd))
return 1;
if(dstsd && pc_isdead(dstsd) && skillid != ALL_RESURRECTION)
return 1;
if(battle_get_class(bl) == 1288)
return 1;
map_freeblock_lock();
switch(skillid)
{
case AL_HEAL: /* 僸乕儖 */
{
int heal=skill_calc_heal( src, skilllv );
int heal_get_jobexp;
if( bl->type==BL_PC && ((struct map_session_data *)bl)->special_state.no_magic_damage )
heal=0; /* 墿嬥宄僇乕僪乮僸乕儖検侽乯 */
clif_skill_nodamage(src,bl,skillid,heal,1);
heal_get_jobexp = battle_heal(NULL,bl,heal,0,0);
// JOB宱尡抣妉摼
if(src->type == BL_PC && bl->type==BL_PC && heal > 0 && src != bl && battle_config.heal_exp > 0){
heal_get_jobexp = heal_get_jobexp * battle_config.heal_exp / 100;
if(heal_get_jobexp <= 0)
heal_get_jobexp = 1;
pc_gainexp((struct map_session_data *)src,0,heal_get_jobexp);
}
}
break;
case ALL_RESURRECTION: /* 儕僓儗僋僔儑儞 */
if(bl->type==BL_PC){
int per=0;
struct map_session_data *tsd=(struct map_session_data*)bl;
if( (map[bl->m].flag.pvp) && tsd->pvp_point<0 )
break; /* PVP偱暅妶晄壜擻忬懺 */
if(pc_isdead(tsd)){ /* 巰朣敾掕 */
clif_skill_nodamage(src,bl,skillid,skilllv,1);
switch(skilllv){
case 1: per=10; break;
case 2: per=30; break;
case 3: per=50; break;
case 4: per=80; break;
}
tsd->status.hp=tsd->status.max_hp*per/100;
if(tsd->status.hp<=0) tsd->status.hp=1;
if(tsd->special_state.restart_full_recover ){ /* 僆僔儕僗僇乕僪 */
tsd->status.hp=tsd->status.max_hp;
tsd->status.sp=tsd->status.max_sp;
}
pc_setstand(tsd);
if(battle_config.pc_invincible_time > 0)
pc_setinvincibletimer(tsd,battle_config.pc_invincible_time);
clif_updatestatus(tsd,SP_HP);
clif_resurrection(&tsd->bl,1);
if(src != bl && sd && battle_config.resurrection_exp > 0) {
int exp = 0,jexp = 0;
int lv = tsd->status.base_level - sd->status.base_level, jlv = tsd->status.job_level - sd->status.job_level;
if(lv > 0) {
exp = (int)((double)tsd->status.base_exp * (double)lv * (double)battle_config.resurrection_exp / 1000000.);
if(exp < 1) exp = 1;
}
if(jlv > 0) {
jexp = (int)((double)tsd->status.job_exp * (double)lv * (double)battle_config.resurrection_exp / 1000000.);
if(jexp < 1) jexp = 1;
}
if(exp > 0 || jexp > 0)
pc_gainexp(sd,exp,jexp);
}
}
}
break;
case AL_DECAGI: /* 懍搙尭彮 */
if( bl->type==BL_PC && ((struct map_session_data *)bl)->special_state.no_magic_damage )
break;
if( rand()%100 < (50+skilllv*3+(battle_get_lv(src)+battle_get_int(src)/5)-sc_def_mdef) ) {
clif_skill_nodamage(src,bl,skillid,skilllv,1);
skill_status_change_start(bl,SkillStatusChangeTable[skillid],skilllv,0,0,0,skill_get_time(skillid,skilllv),0);
}
break;
case AL_CRUCIS:
if(flag&1) {
int race = battle_get_race(bl),ele = battle_get_elem_type(bl);
if(battle_check_target(src,bl,BCT_ENEMY) && (race == 6 || battle_check_undead(race,ele))) {
int slv=battle_get_lv(src),tlv=battle_get_lv(bl),rate;
rate = 25 + skilllv*2 + slv - tlv;
if(rand()%100 < rate)
skill_status_change_start(bl,SkillStatusChangeTable[skillid],skilllv,0,0,0,0,0);
}
}
else {
int range = 15;
clif_skill_nodamage(src,bl,skillid,skilllv,1);
map_foreachinarea(skill_area_sub,
src->m,src->x-range,src->y-range,src->x+range,src->y+range,0,
src,skillid,skilllv,tick, flag|BCT_ENEMY|1,
skill_castend_nodamage_id);
}
break;
case PR_LEXDIVINA: /* 儗僢僋僗僨傿價乕僫 */
{
struct status_change *sc_data = battle_get_sc_data(bl);
clif_skill_nodamage(src,bl,skillid,skilllv,1);
if( bl->type==BL_PC && ((struct map_session_data *)bl)->special_state.no_magic_damage )
break;
if(sc_data && sc_data[SC_DIVINA].timer != -1)
skill_status_change_end(bl,SC_DIVINA,-1);
else if( rand()%100 < sc_def_vit ) {
skill_status_change_start(bl,SkillStatusChangeTable[skillid],skilllv,0,0,0,skill_get_time(skillid,skilllv),0);
}
}
break;
case SA_ABRACADABRA:
do{
abra_skillid=skill_abra_dataset(skilllv);
}while(abra_skillid == 0);
abra_skilllv=skill_get_max(abra_skillid)>pc_checkskill(sd,SA_ABRACADABRA)?pc_checkskill(sd,SA_ABRACADABRA):skill_get_max(abra_skillid);
clif_skill_nodamage(src,bl,skillid,skilllv,1);
sd->skillitem=abra_skillid;
sd->skillitemlv=abra_skilllv;
clif_item_skill(sd,abra_skillid,abra_skilllv,"傾僽儔僇僟僽儔");
break;
case SA_COMA:
clif_skill_nodamage(src,bl,skillid,skilllv,1);
if( bl->type==BL_PC && ((struct map_session_data *)bl)->special_state.no_magic_damage )
break;
if(dstsd){
dstsd->status.hp=1;
dstsd->status.sp=1;
clif_updatestatus(dstsd,SP_HP);
clif_updatestatus(dstsd,SP_SP);
}
if(dstmd) dstmd->hp=1;
break;
case SA_FULLRECOVERY:
clif_skill_nodamage(src,bl,skillid,skilllv,1);
if( bl->type==BL_PC && ((struct map_session_data *)bl)->special_state.no_magic_damage )
break;
if(dstsd) pc_heal(dstsd,dstsd->status.max_hp,dstsd->status.max_sp);
if(dstmd) dstmd->hp=battle_get_max_hp(&dstmd->bl);
break;
case SA_SUMMONMONSTER:
clif_skill_nodamage(src,bl,skillid,skilllv,1);
if (sd) mob_once_spawn(sd,map[sd->bl.m].name,sd->bl.x,sd->bl.y,"--ja--",-1,1,"");
break;
case SA_LEVELUP:
clif_skill_nodamage(src,bl,skillid,skilllv,1);
if (sd && pc_nextbaseexp(sd)) pc_gainexp(sd,pc_nextbaseexp(sd)*10/100,0);
break;
case SA_INSTANTDEATH:
clif_skill_nodamage(src,bl,skillid,skilllv,1);
if (sd) pc_damage(NULL,sd,sd->status.max_hp);
break;
case SA_QUESTION:
case SA_GRAVITY:
clif_skill_nodamage(src,bl,skillid,skilllv,1);
break;
case SA_CLASSCHANGE:
clif_skill_nodamage(src,bl,ski
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -