diff options
-rw-r--r-- | Changelog-Trunk.txt | 4 | ||||
-rw-r--r-- | src/map/map.h | 1 | ||||
-rw-r--r-- | src/map/skill.c | 68 |
3 files changed, 39 insertions, 34 deletions
diff --git a/Changelog-Trunk.txt b/Changelog-Trunk.txt index d89524bc4..cab099369 100644 --- a/Changelog-Trunk.txt +++ b/Changelog-Trunk.txt @@ -4,6 +4,10 @@ AS OF SVN REV. 5091, WE ARE NOW USING TRUNK. ALL UNTESTED BUGFIXES/FEATURES GO IF YOU HAVE A WORKING AND TESTED BUGFIX PUT IT INTO STABLE AS WELL AS TRUNK. 2007/10/10 + * Removed 'into_abyss' effect on traps; tests show that it works ONLY + for Gemstones (tho' iRO website claims otherwise) - bugreport:171 + - corrected code that was exploiting the flag as an 'expired' trap flag + (replaced it with a more jAthena-ish approach) * Fixed a messup in r11347 causing skill units to expire, trigger or not trigger, completely randomly 2007/10/09 diff --git a/src/map/map.h b/src/map/map.h index 679fd8529..2fbb7ffed 100644 --- a/src/map/map.h +++ b/src/map/map.h @@ -300,7 +300,6 @@ struct skill_unit_group { struct { unsigned ammo_consume : 1; unsigned magic_power : 1; - unsigned into_abyss : 1; unsigned song_dance : 2; //0x1 Song/Dance, 0x2 Ensemble } state; }; diff --git a/src/map/skill.c b/src/map/skill.c index b2e20506f..2fa86ea1d 100644 --- a/src/map/skill.c +++ b/src/map/skill.c @@ -5187,21 +5187,26 @@ int skill_castend_nodamage_id (struct block_list *src, struct block_list *bl, in break; case HT_REMOVETRAP: + //FIXME: I think clif_skill_fail() is supposed to be sent if it fails below [ultramage] clif_skill_nodamage(src,bl,skillid,skilllv,1); { - struct skill_unit *su=NULL; - struct item item_tmp; - int flag; - if((bl->type==BL_SKILL) && - (su=(struct skill_unit *)bl) && - (su->group->src_id == src->id || map_flag_vs(bl->m)) && - (skill_get_inf2(su->group->skill_id) & INF2_TRAP)) - { - if(sd && !su->group->state.into_abyss) - { //Avoid collecting traps when it does not costs to place them down. [Skotlex] - if(battle_config.skill_removetrap_type){ + struct skill_unit* su; + struct skill_unit_group* sg; + BL_CAST(BL_SKILL, bl, su); + + if( (su) + && (sg = su->group) + && (sg->src_id == src->id || map_flag_vs(bl->m)) + && (skill_get_inf2(sg->skill_id)&INF2_TRAP) ) + { // prevent picking up expired traps + if( !(sg->unit_id == UNT_USED_TRAPS || (sg->unit_id == UNT_ANKLESNARE && sg->val2 != 0 )) ) + { + if( battle_config.skill_removetrap_type ) + { // get back all items used to deploy the trap for(i=0;i<10;i++) { if(skill_db[su->group->skill_id].itemid[i] > 0){ + int flag; + struct item item_tmp; memset(&item_tmp,0,sizeof(item_tmp)); item_tmp.nameid = skill_db[su->group->skill_id].itemid[i]; item_tmp.identify = 1; @@ -5211,7 +5216,8 @@ int skill_castend_nodamage_id (struct block_list *src, struct block_list *bl, in } } } - }else{ + } else { // get back 1 trap + struct item item_tmp; memset(&item_tmp,0,sizeof(item_tmp)); item_tmp.nameid = ITEMID_TRAP; item_tmp.identify = 1; @@ -6788,10 +6794,9 @@ struct skill_unit_group *skill_unitsetting (struct block_list *src, int skillid, case HT_FLASHER: case HT_FREEZINGTRAP: case HT_BLASTMINE: - if (map_flag_gvg(src->m)) + if( map_flag_gvg(src->m) ) limit *= 4; // longer trap times in WOE [celest] - if (battle_config.vs_traps_bctall && map_flag_vs(src->m) - && (src->type&battle_config.vs_traps_bctall)) + if( battle_config.vs_traps_bctall && map_flag_vs(src->m) && (src->type&battle_config.vs_traps_bctall) ) target = BCT_ALL; break; @@ -6949,7 +6954,6 @@ struct skill_unit_group *skill_unitsetting (struct block_list *src, int skillid, group->val3=val3; group->target_flag=target; group->bl_flag= skill_get_unit_bl_target(skillid); - group->state.into_abyss = (sc && sc->data[SC_INTOABYSS].timer != -1); //Store into abyss state, to know it shouldn't give traps back. [Skotlex] group->state.magic_power = (flag&2 || (sc && sc->data[SC_MAGICPOWER].timer != -1)); //Store the magic power flag. [Skotlex] group->state.ammo_consume = (sd && sd->state.arrow_atk && skillid != GS_GROUNDDRIFT); //Store if this skill needs to consume ammo. group->state.song_dance = (unit_flag&(UF_DANCE|UF_SONG)?1:0)|(unit_flag&UF_ENSEMBLE?2:0); //Signals if this is a song/dance/duet @@ -7399,7 +7403,6 @@ int skill_unit_onplace_timer (struct skill_unit *src, struct block_list *bl, uns sg->unit_id = UNT_USED_TRAPS; clif_changetraplook(&src->bl, UNT_USED_TRAPS); sg->limit=DIFF_TICK(tick,sg->tick)+1500; - sg->state.into_abyss = 1; //Prevent Remove Trap from giving you the trap back. [Skotlex] } break; @@ -7423,7 +7426,6 @@ int skill_unit_onplace_timer (struct skill_unit *src, struct block_list *bl, uns sg->limit = DIFF_TICK(tick,sg->tick)+sec; sg->interval = -1; src->range = 0; - sg->state.into_abyss = 1; //Prevent Remove Trap from giving you the trap back. [Skotlex] } break; @@ -7437,7 +7439,6 @@ int skill_unit_onplace_timer (struct skill_unit *src, struct block_list *bl, uns sg->unit_id = UNT_USED_TRAPS; clif_changetraplook(&src->bl, UNT_FIREPILLAR_ACTIVE); sg->limit=DIFF_TICK(tick,sg->tick)+1500; - sg->state.into_abyss = 1; //Prevent Remove Trap from giving you the trap back. [Skotlex] break; case UNT_CLAYMORETRAP: @@ -7455,7 +7456,6 @@ int skill_unit_onplace_timer (struct skill_unit *src, struct block_list *bl, uns sg->unit_id = UNT_USED_TRAPS; clif_changetraplook(&src->bl, UNT_USED_TRAPS); sg->limit=DIFF_TICK(tick,sg->tick)+1500; - sg->state.into_abyss = 1; //Prevent Remove Trap from giving you the trap back. [Skotlex] break; case UNT_TALKIEBOX: @@ -7467,7 +7467,6 @@ int skill_unit_onplace_timer (struct skill_unit *src, struct block_list *bl, uns clif_changetraplook(&src->bl, UNT_USED_TRAPS); sg->limit = DIFF_TICK(tick, sg->tick) + 5000; sg->val2 = -1; - sg->state.into_abyss = 1; //Prevent Remove Trap from giving you the trap back. [Skotlex] } break; @@ -7624,7 +7623,6 @@ int skill_unit_onplace_timer (struct skill_unit *src, struct block_list *bl, uns sg->unit_id = UNT_USED_TRAPS; clif_changetraplook(&src->bl, UNT_FIREPILLAR_ACTIVE); sg->limit=DIFF_TICK(tick,sg->tick)+1500; - sg->state.into_abyss = 1; break; case UNT_KAENSIN: @@ -8762,9 +8760,7 @@ int skill_check_condition(struct map_session_data* sd, int skill, int lv, int ty } if(sc && sc->data[SC_INTOABYSS].timer != -1) continue; - } else - if(itemid[i] == ITEMID_TRAP && sc && sc->data[SC_INTOABYSS].timer != -1) - continue; + } if((skill == AM_POTIONPITCHER || skill == CR_SLIMPITCHER || @@ -10251,9 +10247,15 @@ int skill_unit_timer_sub (struct block_list* bl, va_list ap) clif_changetraplook(bl, UNT_FIREPILLAR_ACTIVE); group->limit=DIFF_TICK(tick+1500,group->tick); unit->limit=DIFF_TICK(tick+1500,group->tick); - break; - case UNT_SKIDTRAP: + break; + case UNT_ANKLESNARE: + if( group->val2 > 0 ) { // used trap + skill_delunit(unit,0); + break; + } + // else fall through + case UNT_SKIDTRAP: case UNT_LANDMINE: case UNT_SHOCKWAVE: case UNT_SANDMAN: @@ -10263,18 +10265,18 @@ int skill_unit_timer_sub (struct block_list* bl, va_list ap) case UNT_TALKIEBOX: { struct block_list* src = map_id2bl(group->src_id); - // revert unit back into a trap - if( src && src->type == BL_PC && !group->state.into_abyss ) // but only when it cost a trap to deploy it - { + if( src && src->type == BL_PC ) + { // revert unit back into a trap struct item item_tmp; memset(&item_tmp,0,sizeof(item_tmp)); - item_tmp.nameid=ITEMID_TRAP; - item_tmp.identify=1; + item_tmp.nameid = ITEMID_TRAP; + item_tmp.identify = 1; map_addflooritem(&item_tmp,1,bl->m,bl->x,bl->y,0,0,0,0); } skill_delunit(unit, 0); - break; } + break; + default: skill_delunit(unit, 0); } |