📄 skill.c
字号:
src->x+range,src->y+range,0,src,skl->skill_id,skl->skill_lv,tick);
break;
default:
skill_attack(skl->type,src,src,target,skl->skill_id,skl->skill_lv,tick,skl->flag);
break;
}
}
else {
if(src->m != skl->map)
return 0;
switch(skl->skill_id) {
case WZ_METEOR:
if(skl->type >= 0) {
skill_unitsetting(src,skl->skill_id,skl->skill_lv,skl->type>>16,skl->type&0xFFFF,0);
clif_skill_poseffect(src,skl->skill_id,skl->skill_lv,skl->x,skl->y,tick);
}
else
skill_unitsetting(src,skl->skill_id,skl->skill_lv,skl->x,skl->y,0);
break;
}
}
return 0;
}
/*==========================================
*
*------------------------------------------
*/
int skill_addtimerskill(struct block_list *src,unsigned int tick,int target,int x,int y,int skill_id,int skill_lv,int type,int flag)
{
int i;
if(src->type == BL_PC) {
struct map_session_data *sd = (struct map_session_data *)src;
for(i=0;i<MAX_SKILLTIMERSKILL;i++) {
if(sd->skilltimerskill[i].timer == -1) {
sd->skilltimerskill[i].timer = add_timer(tick, skill_timerskill, src->id, i);
sd->skilltimerskill[i].src_id = src->id;
sd->skilltimerskill[i].target_id = target;
sd->skilltimerskill[i].skill_id = skill_id;
sd->skilltimerskill[i].skill_lv = skill_lv;
sd->skilltimerskill[i].map = src->m;
sd->skilltimerskill[i].x = x;
sd->skilltimerskill[i].y = y;
sd->skilltimerskill[i].type = type;
sd->skilltimerskill[i].flag = flag;
return 0;
}
}
return 1;
}
else if(src->type == BL_MOB) {
struct mob_data *md = (struct mob_data *)src;
for(i=0;i<MAX_MOBSKILLTIMERSKILL;i++) {
if(md->skilltimerskill[i].timer == -1) {
md->skilltimerskill[i].timer = add_timer(tick, skill_timerskill, src->id, i);
md->skilltimerskill[i].src_id = src->id;
md->skilltimerskill[i].target_id = target;
md->skilltimerskill[i].skill_id = skill_id;
md->skilltimerskill[i].skill_lv = skill_lv;
md->skilltimerskill[i].map = src->m;
md->skilltimerskill[i].x = x;
md->skilltimerskill[i].y = y;
md->skilltimerskill[i].type = type;
md->skilltimerskill[i].flag = flag;
return 0;
}
}
return 1;
}
return 1;
}
/*==========================================
*
*------------------------------------------
*/
int skill_cleartimerskill(struct block_list *src)
{
int i;
if(src->type == BL_PC) {
struct map_session_data *sd = (struct map_session_data *)src;
for(i=0;i<MAX_SKILLTIMERSKILL;i++) {
if(sd->skilltimerskill[i].timer != -1) {
delete_timer(sd->skilltimerskill[i].timer, skill_timerskill);
sd->skilltimerskill[i].timer = -1;
}
}
}
else if(src->type == BL_MOB) {
struct mob_data *md = (struct mob_data *)src;
for(i=0;i<MAX_MOBSKILLTIMERSKILL;i++) {
if(md->skilltimerskill[i].timer != -1) {
delete_timer(md->skilltimerskill[i].timer, skill_timerskill);
md->skilltimerskill[i].timer = -1;
}
}
}
return 0;
}
/* 斖埻僗僉儖巊梡張棟彫暘偗偙偙傑偱
* -------------------------------------------------------------------------
*/
/*==========================================
* 僗僉儖巊梡乮塺彞姰椆丄ID巜掕峌寕宯乯
* 乮僗僷僎僢僥傿偵岦偗偰侾曕慜恑両(僟儊億)乯
*------------------------------------------
*/
int skill_castend_damage_id( struct block_list* src, struct block_list *bl,int skillid,int skilllv,unsigned int tick,int flag )
{
struct map_session_data *sd=NULL;
int i;
if(src->type==BL_PC)
sd=(struct map_session_data *)src;
if(sd && pc_isdead(sd))
return 1;
if((skillid == WZ_SIGHTRASHER || skillid == CR_GRANDCROSS) && src != bl)
bl = src;
if(bl == NULL || bl->prev == NULL)
return 1;
if(bl->type == BL_PC && pc_isdead((struct map_session_data *)bl))
return 1;
map_freeblock_lock();
switch(skillid)
{
/* 晲婍峌寕宯僗僉儖 */
case SM_BASH: /* 僶僢僔儏 */
case MC_MAMMONITE: /* 儊儅乕僫僀僩 */
case AC_DOUBLE: /* 僟僽儖僗僩儗僀僼傿儞僌 */
case AS_SONICBLOW: /* 僜僯僢僋僽儘乕 */
case KN_PIERCE: /* 僺傾乕僗 */
case KN_SPEARBOOMERANG: /* 僗僺傾僽乕儊儔儞 */
case TF_POISON: /* 僀儞儀僫儉 */
case TF_SPRINKLESAND: /* 嵒傑偒 */
case AC_CHARGEARROW: /* 僠儍乕僕傾儘乕 */
case KN_SPEARSTAB: /* 僗僺傾僗僞僽 */
case RG_RAID: /* 僒僾儔僀僘傾僞僢僋 */
case RG_INTIMIDATE: /* 僀儞僥傿儈僨僀僩 */
case BA_MUSICALSTRIKE: /* 儈儏乕僕僇儖僗僩儔僀僋 */
case DC_THROWARROW: /* 栴寕偪 */
case BA_DISSONANCE: /* 晄嫤榓壒 */
case CR_HOLYCROSS: /* 儂乕儕乕僋儘僗 */
case CR_SHIELDCHARGE:
case CR_SHIELDBOOMERANG:
/* 埲壓MOB愱梡 */
/* 扨懱峌寕丄SP尭彮峌寕丄墦嫍棧峌寕丄杊屼柍帇峌寕丄懡抜峌寕 */
case NPC_PIERCINGATT:
case NPC_MENTALBREAKER:
case NPC_RANGEATTACK:
case NPC_CRITICALSLASH:
case NPC_COMBOATTACK:
/* 昁拞峌寕丄撆峌寕丄埫崟峌寕丄捑栙峌寕丄僗僞儞峌寕 */
case NPC_GUIDEDATTACK:
case NPC_POISON:
case NPC_BLINDATTACK:
case NPC_SILENCEATTACK:
case NPC_STUNATTACK:
/* 愇壔峌寕丄庺偄峌寕丄悋柊峌寕丄儔儞僟儉ATK峌寕 */
case NPC_PETRIFYATTACK:
case NPC_CURSEATTACK:
case NPC_SLEEPATTACK:
case NPC_RANDOMATTACK:
/* 悈懏惈峌寕丄抧懏惈峌寕丄壩懏惈峌寕丄晽懏惈峌寕 */
case NPC_WATERATTACK:
case NPC_GROUNDATTACK:
case NPC_FIREATTACK:
case NPC_WINDATTACK:
/* 撆懏惈峌寕丄惞懏惈峌寕丄埮懏惈峌寕丄擮懏惈峌寕丄SP尭彮峌寕 */
case NPC_POISONATTACK:
case NPC_HOLYATTACK:
case NPC_DARKNESSATTACK:
case NPC_TELEKINESISATTACK:
skill_attack(BF_WEAPON,src,src,bl,skillid,skilllv,tick,flag);
break;
case NPC_DARKBREATH:
clif_emotion(src,7);
skill_attack(BF_MISC,src,src,bl,skillid,skilllv,tick,flag);
break;
case MO_INVESTIGATE: /* 敪櫎 */
{
struct status_change *sc_data = battle_get_sc_data(src);
skill_attack(BF_WEAPON,src,src,bl,skillid,skilllv,tick,flag);
if(sc_data[SC_BLADESTOP].timer != -1)
skill_status_change_end(src,SC_BLADESTOP,-1);
}
break;
case KN_BRANDISHSPEAR: /* 僽儔儞僨傿僢僔儏僗僺傾 */
{
struct mob_data* mb=(struct mob_data*)bl;
skill_attack(BF_WEAPON,src,src,bl,skillid,skilllv,tick,flag);
if(mb->hp > 0){
skill_blown(src,bl,skill_get_blewcount(skillid,skilllv));
if(bl->type == BL_MOB)
clif_fixmobpos((struct mob_data *)bl);
else if(bl->type == BL_PET)
clif_fixpetpos((struct pet_data *)bl);
else
clif_fixpos(bl);
}
}
break;
case RG_BACKSTAP: /* 僶僢僋僗僞僽 */
{
int dir = map_calc_dir(src,bl->x,bl->y),t_dir = battle_get_dir(bl);
int dist = distance(src->x,src->y,bl->x,bl->y);
if((dist > 0 && !map_check_dir(dir,t_dir)) || bl->type == BL_SKILL) {
struct status_change *sc_data = battle_get_sc_data(src);
if(sc_data && sc_data[SC_HIDING].timer != -1)
skill_status_change_end(src, SC_HIDING, -1); // 僴僀僨傿儞僌夝彍
skill_attack(BF_WEAPON,src,src,bl,skillid,skilllv,tick,flag);
}
else if(src->type == BL_PC)
clif_skill_fail(sd,sd->skillid,0,0);
}
break;
case MO_FINGEROFFENSIVE: /* 巜抏 */
{
struct status_change *sc_data = battle_get_sc_data(src);
if(!battle_config.finger_offensive_type)
skill_attack(BF_WEAPON,src,src,bl,skillid,skilllv,tick,flag);
else {
skill_attack(BF_WEAPON,src,src,bl,skillid,skilllv,tick,flag);
if(sd) {
for(i=1;i<sd->spiritball_old;i++)
skill_addtimerskill(src,tick+i*200,bl->id,0,0,skillid,skilllv,BF_WEAPON,flag);
sd->canmove_tick = tick + (sd->spiritball_old-1)*200;
}
}
if(sc_data[SC_BLADESTOP].timer != -1)
skill_status_change_end(src,SC_BLADESTOP,-1);
}
break;
case MO_CHAINCOMBO: /* 楢懪彾 */
{
struct status_change *sc_data = battle_get_sc_data(src);
skill_attack(BF_WEAPON,src,src,bl,skillid,skilllv,tick,flag);
if(sc_data[SC_BLADESTOP].timer != -1)
skill_status_change_end(src,SC_BLADESTOP,-1);
}
break;
case MO_COMBOFINISH: /* 栆棿対 */
skill_attack(BF_WEAPON,src,src,bl,skillid,skilllv,tick,flag);
break;
case MO_EXTREMITYFIST: /* 垻廋梾攅朠対 */
{
struct status_change *sc_data = battle_get_sc_data(src);
if(sd) {
struct walkpath_data wpd;
int dx,dy;
dx = bl->x - sd->bl.x;
dy = bl->y - sd->bl.y;
if(dx > 0) dx++;
else if(dx < 0) dx--;
if(dy > 0) dy++;
else if(dy < 0) dy--;
if(dx == 0 && dy == 0) dx++;
if(path_search(&wpd,src->m,sd->bl.x,sd->bl.y,sd->bl.x+dx,sd->bl.y+dy,1) == -1) {
dx = bl->x - sd->bl.x;
dy = bl->y - sd->bl.y;
if(path_search(&wpd,src->m,sd->bl.x,sd->bl.y,sd->bl.x+dx,sd->bl.y+dy,1) == -1) {
clif_skill_fail(sd,sd->skillid,0,0);
break;
}
}
sd->to_x = sd->bl.x + dx;
sd->to_y = sd->bl.y + dy;
skill_attack(BF_WEAPON,src,src,bl,skillid,skilllv,tick,flag);
clif_walkok(sd);
clif_movechar(sd);
if(dx < 0) dx = -dx;
if(dy < 0) dy = -dy;
sd->attackabletime = sd->canmove_tick = tick + 100 + sd->speed * ((dx > dy)? dx:dy);
if(sd->canact_tick < sd->canmove_tick)
sd->canact_tick = sd->canmove_tick;
pc_movepos(sd,sd->to_x,sd->to_y);
skill_status_change_end(&sd->bl,SC_COMBO,-1);
}
else
skill_attack(BF_WEAPON,src,src,bl,skillid,skilllv,tick,flag);
skill_status_change_end(src, SC_EXPLOSIONSPIRITS, -1);
if(sc_data[SC_BLADESTOP].timer != -1)
skill_status_change_end(src,SC_BLADESTOP,-1);
}
break;
/* 晲婍宯斖埻峌寕僗僉儖 */
case AC_SHOWER: /* 傾儘乕僔儍儚乕 */
case SM_MAGNUM: /* 儅僌僫儉僽儗僀僋 */
case AS_GRIMTOOTH: /* 僌儕儉僩僁乕僗 */
case MC_CARTREVOLUTION: /* 僇乕僩儗償僅儕儏乕僔儑儞 */
case NPC_SPLASHATTACK: /* 僗僾儔僢僔儏傾僞僢僋 */
if(flag&1){
/* 屄暿偵僟儊乕僕傪梌偊傞 */
if(bl->id!=skill_area_temp[1]){
int dist=0;
if(skillid==SM_MAGNUM){ /* 儅僌僫儉僽儗僀僋側傜拞怱偐傜偺嫍棧傪寁嶼 */
int dx=abs( bl->x - skill_area_temp[2] );
int dy=abs( bl->y - skill_area_temp[3] );
dist=((dx>dy)?dx:dy);
}
skill_attack(BF_WEAPON,src,src,bl,skillid,skilllv,tick,
0x0500|dist );
}
}else{
int ar=1;
int x=bl->x,y=bl->y;
if( skillid==SM_MAGNUM){
x=src->x;
y=src->y;
}else if(skillid==AC_SHOWER) /* 傾儘乕僔儍儚乕斖埻 */
ar=2;
else if(skillid==NPC_SPLASHATTACK) /* 僗僾儔僢僔儏傾僞僢僋偼斖埻7*7 */
ar=3;
skill_area_temp[1]=bl->id;
skill_area_temp[2]=x;
skill_area_temp[3]=y;
/* 傑偢僞乕僎僢僩偵峌寕傪壛偊傞 */
skill_attack(BF_WEAPON,src,src,bl,skillid,skilllv,tick,0);
/* 偦偺屻僞乕僎僢僩埲奜偺斖埻撪偺揋慡懱偵張棟傪峴偆 */
map_foreachinarea(skill_area_sub,
bl->m,x-ar,y-ar,x+ar,y+ar,0,
src,skillid,skilllv,tick, flag|BCT_ENEMY|1,
skill_castend_damage_id);
}
break;
case KN_BOWLINGBASH: /* 儃僂儕儞僌僶僢僔儏 */
if(flag&1){
/* 屄暿偵僟儊乕僕傪梌偊傞 */
if(bl->id!=skill_area_temp[1])
skill_attack(BF_WEAPON,src,src,bl,skillid,skilllv,tick,0x0500);
}
else {
int damage;
map_freeblock_lock();
damage = skill_attack(BF_WEAPON,src,src,bl,skillid,skilllv,tick,0);
if(damage > 0) {
int i,c; /* 懠恖偐傜暦偄偨摦偒側偺偱娫堘偭偰傞壜擻惈戝仌岠棪偑埆偄偭偡亜亙 */
c = skill_get_blewcount(skillid,skilllv);
if(map[bl->m].flag.gvg) c = 0;
for(i=0;i<c;i++){
skill_blown(src,bl,1);
if(bl->type == BL_MOB)
clif_fixmobpos((struct mob_data *)bl);
else if(bl->type == BL_PET)
clif_fixpetpos((struct pet_data *)bl);
else
clif_fixpos(bl);
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);
if(skill_area_temp[0]>1) break;
}
skill_area_temp[1]=bl->id;
skill_area_temp[2]=bl->x;
skill_area_temp[3]=bl->y;
/* 偦偺屻僞乕僎僢僩埲奜偺斖埻撪偺揋慡懱偵張棟傪峴偆 */
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);
battle_damage(src,bl,damage,1);
if(rdamage > 0)
battle_damage(bl,src,rdamage,0);
}
map_freeblock_unlock();
}
break;
case ALL_RESURRECTION: /* 儕僓儗僋僔儑儞 */
case PR_TURNUNDEAD: /* 僞乕儞傾儞僨僢僪 */
if(bl->type != BL_PC && battle_check_undead(battle_get_race(bl),battle_get_elem_type(bl)))
skill_attack(BF_MAGIC,src,src,bl,skillid,skilllv,tick,flag);
else {
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -