فهرست منبع

* Now fiberlocking a fiberlocked target doesn't renew the timer but instead increases its fireweakness [Inkfish]
- This makes doublecasting firebolts on a double fiberlocked target having double damage from both 2 bolts possible = =(bugreport:3061)


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

Inkfish 16 سال پیش
والد
کامیت
f3572b9e6d
6فایلهای تغییر یافته به همراه22 افزوده شده و 12 حذف شده
  1. 3 0
      Changelog-Trunk.txt
  2. 6 6
      src/map/battle.c
  3. 2 2
      src/map/mob.c
  4. 6 0
      src/map/skill.c
  5. 4 3
      src/map/status.c
  6. 1 1
      src/map/unit.c

+ 3 - 0
Changelog-Trunk.txt

@@ -3,6 +3,9 @@ Date	Added
 AS OF SVN REV. 5091, WE ARE NOW USING TRUNK.  ALL UNTESTED BUGFIXES/FEATURES GO INTO TRUNK.
 IF YOU HAVE A WORKING AND TESTED BUGFIX PUT IT INTO STABLE AS WELL AS TRUNK.
 
+09/05/20
+	* Now fiberlocking a fiberlocked target doesn't renew the timer but instead increases its fireweakness [Inkfish]
+	- This makes doublecasting firebolts on a double fiberlocked target having double damage from both 2 bolts possible = =(bugreport:3061)
 09/05/19
 	* Added missing packet 0x2c9 and fixed 0x2da's length error. [Inkfish]
 	* Fiberlock now can trap multiple enemies on the same cell and its triggering area was reduced to 1x1. [Inkfish]

+ 6 - 6
src/map/battle.c

@@ -252,13 +252,13 @@ int battle_attr_fix(struct block_list *src, struct block_list *target, int damag
 		if(sc->data[SC_DELUGE] && atk_elem == ELE_WATER)
 			ratio += enchant_eff[sc->data[SC_DELUGE]->val1-1];
 	}
-	if (tsc && tsc->count)
+	if( atk_elem == ELE_FIRE && tsc && tsc->count && tsc->data[SC_SPIDERWEB] )
 	{
-		if(tsc->data[SC_SPIDERWEB] && atk_elem == ELE_FIRE)
-		{	// [Celest]
-			damage <<= 1;
-			status_change_end(target, SC_SPIDERWEB, -1);
-		}
+		tsc->data[SC_SPIDERWEB]->val1 = 0; // free to move now
+		if( tsc->data[SC_SPIDERWEB]->val2-- > 0 )
+			damage <<= 1; // double damage
+		if( tsc->data[SC_SPIDERWEB]->val2 == 0 )
+			status_change_end(target,SC_SPIDERWEB,-1);
 	}
 	return damage*ratio/100;
 }

+ 2 - 2
src/map/mob.c

@@ -1339,7 +1339,7 @@ static bool mob_ai_sub_hard(struct mob_data *md, unsigned int tick)
 		{	//Rude attacked check.
 			if( !battle_check_range(&md->bl, tbl, md->status.rhw.range)
 			&&  ( //Can't attack back and can't reach back.
-			      (!can_move && DIFF_TICK(tick, md->ud.canmove_tick) > 0 && (battle_config.mob_ai&0x2 || md->sc.data[SC_SPIDERWEB]))
+			      (!can_move && DIFF_TICK(tick, md->ud.canmove_tick) > 0 && (battle_config.mob_ai&0x2 || (md->sc.data[SC_SPIDERWEB] && md->sc.data[SC_SPIDERWEB]->val1)))
 			      || !mob_can_reach(md, tbl, md->min_chase, MSS_RUSH)
 			    )
 			&&  md->state.attacked_count++ >= RUDE_ATTACKED_COUNT
@@ -1360,7 +1360,7 @@ static bool mob_ai_sub_hard(struct mob_data *md, unsigned int tick)
 				|| (battle_config.mob_ai&0x2 && !status_check_skilluse(&md->bl, abl, 0, 0)) // Cannot normal attack back to Attacker
 				|| (!battle_check_range(&md->bl, abl, md->status.rhw.range) // Not on Melee Range and ...
 				&& ( // Reach check
-					(!can_move && DIFF_TICK(tick, md->ud.canmove_tick) > 0 && (battle_config.mob_ai&0x2 || md->sc.data[SC_SPIDERWEB]))
+					(!can_move && DIFF_TICK(tick, md->ud.canmove_tick) > 0 && (battle_config.mob_ai&0x2 || (md->sc.data[SC_SPIDERWEB] && md->sc.data[SC_SPIDERWEB]->val1)))
 					|| !mob_can_reach(md, abl, dist+md->db->range3, MSS_RUSH)
 				)
 				) )

+ 6 - 0
src/map/skill.c

@@ -7355,6 +7355,12 @@ int skill_unit_onplace_timer (struct skill_unit *src, struct block_list *bl, uns
 			break;
 
 		case UNT_SPIDERWEB:
+			if( tsc && tsc->data[SC_SPIDERWEB] && tsc->data[SC_SPIDERWEB]->val1 > 0 )
+			{ // If you are fiberlocked and can't move, it will only increase your fireweakness level. [Inkfish]
+				tsc->data[SC_SPIDERWEB]->val2++;
+				sg->interval = -1;
+				break;
+			}
 		case UNT_ANKLESNARE:
 			if( ( sg->val2 == 0 || sg->unit_id == UNT_SPIDERWEB ) && tsc )
 			{

+ 4 - 3
src/map/status.c

@@ -3535,7 +3535,7 @@ static signed short status_calc_flee(struct block_list *bl, struct status_change
 		flee += sc->data[SC_MOON_COMFORT]->val2;
 	if(sc->data[SC_CLOSECONFINE])
 		flee += 10;
-	if(sc->data[SC_SPIDERWEB])
+	if(sc->data[SC_SPIDERWEB] && sc->data[SC_SPIDERWEB]->val1)
 		flee -= flee * 50/100;
 	if(sc->data[SC_BERSERK])
 		flee -= flee * 50/100;
@@ -5814,8 +5814,9 @@ int status_change_start(struct block_list* bl,enum sc_type type,int rate,int val
 				tick /= 5; //TODO: Reduce skill's duration. But for how long?
 			break;
 		case SC_SPIDERWEB:
-			if (bl->type == BL_PC)
-				tick /=2;
+			if( bl->type == BL_PC )
+				tick /= 2;
+			val1 = val2 = 1;
 			break;
 		case SC_ARMOR:
 			//NPC_DEFENDER:

+ 1 - 1
src/map/unit.c

@@ -741,7 +741,7 @@ int unit_can_move(struct block_list *bl)
 			|| sc->data[SC_TRICKDEAD]
 			|| sc->data[SC_BLADESTOP]
 			|| sc->data[SC_BLADESTOP_WAIT]
-			|| sc->data[SC_SPIDERWEB]
+			|| (sc->data[SC_SPIDERWEB] && sc->data[SC_SPIDERWEB]->val1)
 			|| (sc->data[SC_DANCING] && sc->data[SC_DANCING]->val4 && (
 				!sc->data[SC_LONGING] ||
 				(sc->data[SC_DANCING]->val1&0xFFFF) == CG_MOONLIT ||