From bc5f5bce06657ed1899f9635d7d4b353a033569e Mon Sep 17 00:00:00 2001 From: skotlex Date: Tue, 8 Aug 2006 15:07:29 +0000 Subject: - Fixed yet again AS_SPLASHER doing full damage on all characters. Now you can use the NK split damage value in the skill_db if you want damage divided by the amount of targets rather than by 2. - Fixed crash on the battle_drain functions. - Cleaned up HAMI_CASTLE, HLIF_AVOID, HAMI_DEFENCE so that it's usable by other types of objects other than Homunculus. - Cleaned up the Asura Strike code so that the SP/Spheres/States is not consumed when the skill fails due to Fog of Wall. - When a negative delay for a skill is specified, this delay is now added on top of the character's amotion rather than adelay - Modified main.sql to make the guild table allow NULL on the emblem data. - Added file conf-tmpl/Changelog.txt git-svn-id: https://rathena.svn.sourceforge.net/svnroot/rathena/trunk@8185 54d463be-8e91-2dee-dedb-b68131a5f0ec --- src/map/skill.c | 84 +++++++++++++++++++++++++-------------------------------- 1 file changed, 37 insertions(+), 47 deletions(-) (limited to 'src/map/skill.c') diff --git a/src/map/skill.c b/src/map/skill.c index 5eaadd6bd..929d4eb90 100644 --- a/src/map/skill.c +++ b/src/map/skill.c @@ -1775,7 +1775,7 @@ int skill_attack (int attack_type, struct block_list* src, struct block_list *ds struct Damage dmg; struct status_data *sstatus, *tstatus; struct status_change *sc; - struct map_session_data *sd=NULL, *tsd=NULL; + struct map_session_data *sd, *tsd; int type,lv,damage,rdamage=0; if(skillid > 0 && skilllv <= 0) return 0; @@ -1793,11 +1793,9 @@ int skill_attack (int attack_type, struct block_list* src, struct block_list *ds if (!status_check_skilluse(dsrc, bl, skillid, 2)) return 0; } - - if (dsrc->type == BL_PC) - sd = (struct map_session_data *)dsrc; - if (bl->type == BL_PC) - tsd = (struct map_session_data *)bl; + + BL_CAST(BL_PC, dsrc, sd); + BL_CAST(BL_PC, bl, tsd); sstatus = status_get_status_data(dsrc); tstatus = status_get_status_data(bl); @@ -2111,7 +2109,8 @@ int skill_attack (int attack_type, struct block_list* src, struct block_list *ds status_fix_damage(bl,src,rdamage,0); clif_damage(src,src,tick, dmg.amotion,0,rdamage,1,4,0); //Use Reflect Shield to signal this kind of skill trigger. [Skotlex] - battle_drain(tsd, src, rdamage, rdamage, sstatus->race, is_boss(src)); + if (tsd && src != bl) + battle_drain(tsd, src, rdamage, rdamage, sstatus->race, is_boss(src)); skill_additional_effect(bl,src,CR_REFLECTSHIELD, 1,BF_WEAPON,tick); } @@ -2849,8 +2848,8 @@ int skill_castend_damage_id (struct block_list* src, struct block_list *bl, int map_foreachinrange(skill_area_sub, bl, skill_get_splash(skillid, skilllv), BL_CHAR, src, skillid, skilllv, tick, BCT_ENEMY, skill_area_sub_count); - else - skill_area_temp[0] = 1; + else if (skillid==AS_SPLASHER) //Need split damage anyway. + skill_area_temp[0] = 2; map_foreachinrange(skill_area_sub, bl, skill_get_splash(skillid, skilllv), BL_CHAR, @@ -3697,6 +3696,8 @@ int skill_castend_nodamage_id (struct block_list *src, struct block_list *bl, in case NJ_KASUMIKIRI: case NJ_UTSUSEMI: case NJ_NEN: + case HLIF_AVOID: //[orn] + case HAMI_DEFENCE: //[orn] clif_skill_nodamage(src,bl,skillid,skilllv, sc_start(bl,type,100,skilllv,skill_get_time(skillid,skilllv))); break; @@ -5447,8 +5448,6 @@ int skill_castend_nodamage_id (struct block_list *src, struct block_list *bl, in break; case AM_CALLHOMUN: //[orn] - { - int i = 0; if (sd) { if ((sd->status.hom_id == 0 || sd->homunculus.vaporize == 1)) { @@ -5466,7 +5465,7 @@ int skill_castend_nodamage_id (struct block_list *src, struct block_list *bl, in clif_skill_fail(sd,skillid,0,0); } break; - } + case AM_REST: //[orn] { if (sd) @@ -5502,31 +5501,22 @@ int skill_castend_nodamage_id (struct block_list *src, struct block_list *bl, in } case HAMI_CASTLE: //[orn] + if(rand()%100 > 20*skilllv || src == bl) + break; //Failed. { - if(hd && rand()%100 < 20*skilllv) - { - int x,y; - struct walkpath_data wpd; - struct map_session_data *sd = hd->master; - if( path_search(&wpd,hd->bl.m,hd->bl.x,hd->bl.y,sd->bl.x,sd->bl.y,0) != 0 ) { - clif_skill_fail(sd,skillid,0,0); - break; - } - - clif_skill_nodamage(&hd->bl,&sd->bl,skillid,skilllv,1); - - x = hd->bl.x; - y = hd->bl.y; + int x,y; + x = src->x; + y = src->y; - unit_movepos(&hd->bl,sd->bl.x,sd->bl.y,0,0); - unit_movepos(&sd->bl,x,y,0,0); - clif_fixpos(&hd->bl) ; - clif_fixpos(&sd->bl) ; + if (unit_movepos(src,bl->x,bl->y,0,0)) { + clif_skill_nodamage(src,bl,skillid,skilllv,1); + clif_fixpos(src) ; + if (unit_movepos(bl,x,y,0,0)) + clif_fixpos(bl) ; - map_foreachinarea(skill_chastle_mob_changetarget,hd->bl.m, - hd->bl.x-AREA_SIZE,hd->bl.y-AREA_SIZE, - hd->bl.x+AREA_SIZE,hd->bl.y+AREA_SIZE, - BL_MOB,&hd->master->bl,&hd->bl); + //TODO: Shouldn't also players and the like switch targets? + map_foreachinrange(skill_chastle_mob_changetarget,src, + AREA_SIZE, BL_MOB, bl, src); } } break; @@ -5560,12 +5550,6 @@ int skill_castend_nodamage_id (struct block_list *src, struct block_list *bl, in } } break; - case HLIF_AVOID: //[orn] - case HAMI_DEFENCE: //[orn] - if ( hd ) { - clif_skill_nodamage(src,&hd->master->bl,skillid,skilllv, - sc_start(&hd->master->bl,type,100,skilllv,skill_get_time(skillid,skilllv))) ; - } case HAMI_BLOODLUST: //[orn] case HFLI_FLEET: //[orn] case HFLI_SPEED: //[orn] @@ -5772,8 +5756,9 @@ int skill_castend_id (int tid, unsigned int tick, int id, int data) return 1; } while(0); //Skill failed. - if (ud->skillid == MO_EXTREMITYFIST && sd) - { //When Asura fails... + if (ud->skillid == MO_EXTREMITYFIST && sd && + !(sc && sc->count && sc->data[SC_FOGWALL].timer != -1)) + { //When Asura fails... (except when it fails from Fog of Wall) //Consume SP/spheres skill_check_condition(sd,ud->skillid, ud->skilllv,1); sc = &sd->sc; @@ -8574,7 +8559,7 @@ int skill_delayfix (struct block_list *bl, int skill_id, int skill_lv) else time = battle_config.default_skill_delay; } else if (time < 0) - time = -time + status_get_adelay(bl); // if set to <0, the attack delay is added. + time = -time + status_get_amotion(bl); // if set to <0, the attack motion is added. if (battle_config.delay_dependon_dex && !(delaynodex&1)) { // if skill casttime is allowed to be reduced by dex @@ -9354,12 +9339,17 @@ int skill_ganbatein (struct block_list *bl, va_list ap) int skill_chastle_mob_changetarget(struct block_list *bl,va_list ap) { struct mob_data* md; + struct unit_data*ud = unit_bl2ud(bl); struct block_list *from_bl; struct block_list *to_bl; - nullpo_retr(0, md = (struct mob_data*)bl); - nullpo_retr(0, from_bl = va_arg(ap,struct block_list *)); - nullpo_retr(0, to_bl = va_arg(ap,struct block_list *)); - if(md->target_id == from_bl->id) + md = (struct mob_data*)bl; + from_bl = va_arg(ap,struct block_list *); + to_bl = va_arg(ap,struct block_list *); + + if(ud && ud->target == from_bl->id) + ud->target = to_bl->id; + + if(md->bl.type == BL_MOB && md->target_id == from_bl->id) md->target_id = to_bl->id; return 0; } -- cgit v1.2.3-60-g2f50