Bläddra i källkod

Fixed Fiberlock sometimes fails due to the long interval of skill_unit_timer. It may never fail now, though this may not be official. (bugreport:3136)

git-svn-id: https://svn.code.sf.net/p/rathena/svn/trunk@13834 54d463be-8e91-2dee-dedb-b68131a5f0ec
Inkfish 16 år sedan
förälder
incheckning
efb13f2571
3 ändrade filer med 34 tillägg och 20 borttagningar
  1. 2 0
      Changelog-Trunk.txt
  2. 1 1
      db/skill_unit_db.txt
  3. 31 19
      src/map/skill.c

+ 2 - 0
Changelog-Trunk.txt

@@ -3,6 +3,8 @@ 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/06/01
+	* Fixed Fiberlock sometimes fails due to the long interval of skill_unit_timer. It may never fail now, though this may not be official. (bugreport:3136) [Inkfish]
 09/05/30
 	* Fixed gemstones are still required when players equipped Mistress Card. (bugreport:3147, follow up to: r13815) [Inkfish]
 	* Fiberlock only catches targets the moment its casted. [Inkfish]

+ 1 - 1
db/skill_unit_db.txt

@@ -81,7 +81,7 @@
 369,0xb3,    , -1, 0,10000,all,  0x008	//PA_GOSPEL
 395,0xb5,    ,  4, 0,  -1,all,   0x200	//CG_MOONLIT
 404,0xb6,    , -1, 0,  -1,all,   0x000	//PF_FOGWALL
-405,0xb7,    ,  0, 0,1000,enemy, 0x000	//PF_SPIDERWEB
+405,0xb7,    ,  0, 0,  -1,enemy, 0x000	//PF_SPIDERWEB
 409,0xb2,    ,  0,-1,  -1,noone, 0x000	//WE_CALLBABY
 410,0xb2,    ,  0,-1,  -1,noone, 0x000	//WE_CALLPARENT
 428,0x86,    ,  0, 1, 100,enemy, 0x000	//SG_SUN_WARM

+ 31 - 19
src/map/skill.c

@@ -6943,7 +6943,7 @@ struct skill_unit_group* skill_unitsetting (struct block_list *src, short skilli
 	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
 
   	//if tick is greater than current, do not invoke onplace function just yet. [Skotlex]
-	if (DIFF_TICK(group->tick, gettick()) > 100)
+	if (DIFF_TICK(group->tick, gettick()) > SKILLUNITTIMER_INTERVAL)
 		active_flag = 0;
 
 	if(skillid==HT_TALKIEBOX || skillid==RG_GRAFFITI){
@@ -7089,7 +7089,31 @@ static int skill_unit_onplace (struct skill_unit *src, struct block_list *bl, un
 	type = status_skill2sc(sg->skill_id);
 	sce = (sc && type != -1)?sc->data[type]:NULL;
 	skillid = sg->skill_id; //In case the group is deleted, we need to return the correct skill id, still.
-	switch (sg->unit_id) {
+	switch (sg->unit_id)
+	{
+	case UNT_SPIDERWEB:
+		if( sc && sc->data[SC_SPIDERWEB] && sc->data[SC_SPIDERWEB]->val1 > 0 )
+		{ // If you are fiberlocked and can't move, it will only increase your fireweakness level. [Inkfish]
+			sc->data[SC_SPIDERWEB]->val2++;
+			break;
+		}
+		else if( sc )
+		{
+			int sec = skill_get_time2(sg->skill_id,sg->skill_lv);
+			if( status_change_start(bl,type,10000,sg->skill_lv,sg->group_id,0,0,sec,8) )
+			{
+				const struct TimerData* td = sc->data[type]?get_timer(sc->data[type]->timer):NULL; 
+				if( td )
+					sec = DIFF_TICK(td->tick, tick);
+				map_moveblock(bl, src->bl.x, src->bl.y, tick);
+				clif_fixpos(bl);
+				sg->val2 = bl->id;
+			}
+			else
+				sec = 3000; //Couldn't trap it?
+			sg->limit = DIFF_TICK(tick,sg->tick)+sec;
+		}
+		break;
 	case UNT_SAFETYWALL:
 		//TODO: Find a more reliable way to handle the link to sg, this could cause dangling pointers. [Skotlex]
 		if (!sce)
@@ -7256,8 +7280,6 @@ int skill_unit_onplace_timer (struct skill_unit *src, struct block_list *bl, uns
 
 	if (sg->interval == -1) {
 		switch (sg->unit_id) {
-			case UNT_SPIDERWEB: // The 'interval' value was set to -1 so that the unit wouldn't trigger in the next interval,
-				break;			// but FiberLock can trap multiple targets on the same cell. [Inkfish]
 			case UNT_ANKLESNARE: //These happen when a trap is splash-triggered by multiple targets on the same cell.
 			case UNT_FIREPILLAR_ACTIVE:
 				return 0;
@@ -7415,20 +7437,8 @@ int skill_unit_onplace_timer (struct skill_unit *src, struct block_list *bl, uns
 			}
 			break;
 
-		case UNT_SPIDERWEB:
-			if( DIFF_TICK(tick, sg->tick) > SKILLUNITTIMER_INTERVAL )
-			{ // Visual effect stays but can't catch anyone anymore. [Inkfish]
-				sg->interval = -1;
-				break;
-			}
-			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 )
+			if( sg->val2 == 0 && tsc )
 			{
 				int sec = skill_get_time2(sg->skill_id,sg->skill_lv);
 				if( status_change_start(bl,type,10000,sg->skill_lv,sg->group_id,0,0,sec, 8) )
@@ -7442,8 +7452,7 @@ int skill_unit_onplace_timer (struct skill_unit *src, struct block_list *bl, uns
 				}
 				else
 					sec = 3000; //Couldn't trap it?
-				if( sg->unit_id == UNT_ANKLESNARE )
-					clif_01ac(&src->bl); // mysterious packet
+				clif_01ac(&src->bl); // mysterious packet
 				sg->limit = DIFF_TICK(tick,sg->tick)+sec;
 				sg->interval = -1;
 				src->range = 0;
@@ -10455,6 +10464,9 @@ int skill_unit_move_sub (struct block_list* bl, va_list ap)
 	if( !unit->alive || target->prev == NULL )
 		return 0;
 
+	if( unit->group->skill_id == PF_SPIDERWEB && flag&1 )
+		return 0; // Fiberlock is never supposed to trigger on skill_unit_move. [Inkfish]
+
 	dissonance = skill_dance_switch(unit, 0);
 
 	//Necessary in case the group is deleted after calling on_place/on_out [Skotlex]