浏览代码

* 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)

git-svn-id: https://svn.code.sf.net/p/rathena/svn/trunk@11397 54d463be-8e91-2dee-dedb-b68131a5f0ec

ultramage 17 年之前
父节点
当前提交
e106eb1930
共有 3 个文件被更改,包括 39 次插入34 次删除
  1. 4 0
      Changelog-Trunk.txt
  2. 0 1
      src/map/map.h
  3. 35 33
      src/map/skill.c

+ 4 - 0
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

+ 0 - 1
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;
 };

+ 35 - 33
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);
 		}