From 85b47e326ad041744606c3e71a8ca67b4b34c313 Mon Sep 17 00:00:00 2001 From: malufett Date: Sun, 3 May 2015 17:24:35 +0800 Subject: Fixed Bug#8650 -http://hercules.ws/board/tracker/issue-8650-minstrel-poem-of-netherworld-or-despair-song-skillleffect/?gopid=25083#entry25083 Signed-off-by: malufett --- src/map/battle.c | 4 +++- src/map/skill.c | 14 +++++++------- src/map/status.c | 10 +++++++++- src/map/status.h | 2 +- src/map/unit.c | 2 ++ 5 files changed, 22 insertions(+), 10 deletions(-) (limited to 'src/map') diff --git a/src/map/battle.c b/src/map/battle.c index 31b04ad44..ad151ac6c 100644 --- a/src/map/battle.c +++ b/src/map/battle.c @@ -6385,7 +6385,9 @@ int battle_check_target( struct block_list *src, struct block_list *target,int f TBL_SKILL *su = (TBL_SKILL*)target; if( !su->group ) return 0; - if( skill->get_inf2(su->group->skill_id)&INF2_TRAP && su->group->unit_id != UNT_USED_TRAPS) { //Only a few skills can target traps... + if( skill->get_inf2(su->group->skill_id)&INF2_TRAP && + su->group->unit_id != UNT_USED_TRAPS && + su->group->unit_id != UNT_NETHERWORLD ) { //Only a few skills can target traps... switch( battle->get_current_skill(src) ) { case RK_DRAGONBREATH:// it can only hit traps in pvp/gvg maps case RK_DRAGONBREATH_WATER: diff --git a/src/map/skill.c b/src/map/skill.c index a9737f129..5748c4fd3 100644 --- a/src/map/skill.c +++ b/src/map/skill.c @@ -4592,14 +4592,12 @@ int skill_castend_damage_id(struct block_list* src, struct block_list *bl, uint1 status_change_end(bl, SC_RUSH_WINDMILL, INVALID_TIMER); status_change_end(bl, SC_ECHOSONG, INVALID_TIMER); status_change_end(bl, SC_HARMONIZE, INVALID_TIMER); + status_change_end(bl, SC_NETHERWORLD, INVALID_TIMER); status_change_end(bl, SC_SIREN, INVALID_TIMER); - status_change_end(bl, SC_DEEP_SLEEP, INVALID_TIMER); - status_change_end(bl, SC_SIRCLEOFNATURE, INVALID_TIMER); status_change_end(bl, SC_GLOOMYDAY, INVALID_TIMER); status_change_end(bl, SC_SONG_OF_MANA, INVALID_TIMER); status_change_end(bl, SC_DANCE_WITH_WUG, INVALID_TIMER); status_change_end(bl, SC_SATURDAY_NIGHT_FEVER, INVALID_TIMER); - status_change_end(bl, SC_LERADS_DEW, INVALID_TIMER); status_change_end(bl, SC_MELODYOFSINK, INVALID_TIMER); status_change_end(bl, SC_BEYOND_OF_WARCRY, INVALID_TIMER); status_change_end(bl, SC_UNLIMITED_HUMMING_VOICE, INVALID_TIMER); @@ -6565,6 +6563,7 @@ int skill_castend_nodamage_id(struct block_list *src, struct block_list *bl, uin status_change_end(bl, SC_STUN, INVALID_TIMER); status_change_end(bl, SC_WHITEIMPRISON, INVALID_TIMER); } + status_change_end(bl, SC_NETHERWORLD, INVALID_TIMER); //Is this equation really right? It looks so... special. if( battle->check_undead(tstatus->race,tstatus->def_ele) ) { status->change_start(src, bl, SC_BLIND, @@ -12336,10 +12335,11 @@ int skill_unit_onplace_timer(struct skill_unit *src, struct block_list *bl, int6 skill->attack(BF_WEAPON,ss,&src->bl,bl,WM_SEVERE_RAINSTORM_MELEE,sg->skill_lv,tick,0); break; case UNT_NETHERWORLD: - if( !(status_get_mode(bl)&MD_BOSS)) { - if( !(tsc && tsc->data[type]) ){ - sc_start(ss, bl, type, 100, sg->skill_lv, skill->get_time2(sg->skill_id,sg->skill_lv)); - } + if ( battle->check_target(&src->bl, bl, BCT_PARTY) == -1 && bl->id != sg->src_id ) { + sc_start(ss, bl, type, 100, sg->skill_lv, skill->get_time2(sg->skill_id, sg->skill_lv)); + sg->limit = 0; + clif->changetraplook(&src->bl, UNT_USED_TRAPS); + sg->unit_id = UNT_USED_TRAPS; } break; case UNT_THORNS_TRAP: diff --git a/src/map/status.c b/src/map/status.c index bf886b875..6e4090580 100644 --- a/src/map/status.c +++ b/src/map/status.c @@ -654,7 +654,7 @@ void initChangeTables(void) { set_sc( MI_RUSH_WINDMILL , SC_RUSH_WINDMILL , SI_RUSHWINDMILL , SCB_WATK ); set_sc( MI_ECHOSONG , SC_ECHOSONG , SI_ECHOSONG , SCB_DEF2 ); set_sc( MI_HARMONIZE , SC_HARMONIZE , SI_HARMONIZE , SCB_STR|SCB_AGI|SCB_VIT|SCB_INT|SCB_DEX|SCB_LUK ); - set_sc( WM_POEMOFNETHERWORLD , SC_STOP , SI_NETHERWORLD , SCB_NONE ); + set_sc_with_vfx(WM_POEMOFNETHERWORLD, SC_NETHERWORLD , SI_NETHERWORLD , SCB_NONE); set_sc_with_vfx( WM_VOICEOFSIREN , SC_SIREN , SI_SIREN , SCB_NONE ); set_sc_with_vfx( WM_LULLABY_DEEPSLEEP , SC_DEEP_SLEEP , SI_DEEPSLEEP , SCB_NONE ); set_sc( WM_SIRCLEOFNATURE , SC_SIRCLEOFNATURE , SI_SIRCLEOFNATURE , SCB_NONE ); @@ -6591,6 +6591,9 @@ int status_get_sc_def(struct block_list *src, struct block_list *bl, enum sc_typ case SC_NEEDLE_OF_PARALYZE: tick_def2 = (st->vit + st->luk) * 50; break; + case SC_NETHERWORLD: + tick_def2 = 1000 * (((bl->type == BL_PC) ? ((TBL_PC*)bl)->status.job_level : 0) / 10 + status->get_lv(bl) / 50); + break; default: //Effect that cannot be reduced? Likely a buff. if (!(rnd()%10000 < rate)) @@ -6692,6 +6695,9 @@ int status_get_sc_def(struct block_list *src, struct block_list *bl, enum sc_typ case SC_FROSTMISTY: tick = max(tick, 6000); break; + case SC_NETHERWORLD: + tick = max(tick, 4000); + break; default: //Skills need to trigger even if the duration is reduced below 1ms tick = max(tick, 1); @@ -7223,6 +7229,7 @@ int status_change_start(struct block_list *src, struct block_list *bl, enum sc_t // Other Effects case SC_VACUUM_EXTREME: + case SC_NETHERWORLD: return 0; } @@ -9311,6 +9318,7 @@ int status_change_start(struct block_list *src, struct block_list *bl, enum sc_t case SC_MEIKYOUSISUI: case SC_NEEDLE_OF_PARALYZE: case SC_DEATHBOUND: + case SC_NETHERWORLD: unit->stop_walking(bl,1); break; case SC_ANKLESNARE: diff --git a/src/map/status.h b/src/map/status.h index c8a7a08f7..3b85c4014 100644 --- a/src/map/status.h +++ b/src/map/status.h @@ -527,7 +527,7 @@ typedef enum sc_type { SC_BEYOND_OF_WARCRY, SC_UNLIMITED_HUMMING_VOICE, // 410 SC_SITDOWN_FORCE, - //SC_NETHERWORLD, + SC_NETHERWORLD, /** * Sura **/ diff --git a/src/map/unit.c b/src/map/unit.c index 2dba10aeb..b44d58d9a 100644 --- a/src/map/unit.c +++ b/src/map/unit.c @@ -1081,6 +1081,7 @@ int unit_can_move(struct block_list *bl) { || sc->data[SC_NEEDLE_OF_PARALYZE] || sc->data[SC_VACUUM_EXTREME] || (sc->data[SC_FEAR] && sc->data[SC_FEAR]->val2 > 0) + || sc->data[SC_NETHERWORLD] || (sc->data[SC_SPIDERWEB] && sc->data[SC_SPIDERWEB]->val1) || (sc->data[SC_CLOAKING] && sc->data[SC_CLOAKING]->val1 < 3 && !(sc->data[SC_CLOAKING]->val4&1)) //Need wall at level 1-2 || ( @@ -2375,6 +2376,7 @@ int unit_remove_map(struct block_list *bl, clr_type clrtype, const char* file, i status_change_end(bl, SC__MANHOLE, INVALID_TIMER); status_change_end(bl, SC_VACUUM_EXTREME, INVALID_TIMER); status_change_end(bl, SC_CURSEDCIRCLE_ATKER, INVALID_TIMER); //callme before warp + status_change_end(bl, SC_NETHERWORLD, INVALID_TIMER); } if (bl->type&(BL_CHAR|BL_PET)) { -- cgit v1.2.3-60-g2f50