Sfoglia il codice sorgente

Corrected skills that lose mob targets (#3120)

* Fixes #2163, fixes #2720, and fixes #2761.
* Feint Bomb now closer mimics official behavior.
* Monsters now properly target the clone and refrain from attacking the Shadow Chaser.
* Shadow Chasers are now able to cast skills while in Feint Bomb hiding state.
* Removed extra skill cast value that wasn't used.
* Removed extra mob target release function as one already existed.
* Corrected Zanzou and Genwaku target release behavior as well.
Thanks to @ilovelemon, @redlightliu, and @MrAntares!
Aleos 7 anni fa
parent
commit
53d70b3e24
4 ha cambiato i file con 8 aggiunte e 41 eliminazioni
  1. 1 1
      db/pre-re/skill_cast_db.txt
  2. 1 1
      db/re/skill_cast_db.txt
  3. 6 38
      src/map/skill.cpp
  4. 0 1
      src/map/status.cpp

+ 1 - 1
db/pre-re/skill_cast_db.txt

@@ -1366,7 +1366,7 @@
 //-- SC_BLOODYLUST
 2303,2000,2000,0,10000:20000:30000,0,180000
 //-- SC_FEINTBOMB
-2304,1000,0,0,500,1500,5000
+2304,1000,0,0,1500,0,5000
 //-- SC_ESCAPE
 5010,0,500,0,50000,20000,10000:8000:6000:4000:2000
 //==========================================

+ 1 - 1
db/re/skill_cast_db.txt

@@ -1382,7 +1382,7 @@
 //-- SC_BLOODYLUST
 2303,2000,2000,0,10000:20000:30000,0,180000,-1
 //-- SC_FEINTBOMB
-2304,1000,0,0,500,1500,5000,-1
+2304,1000,0,0,1500,0,5000,-1
 //-- SC_ESCAPE
 5010,0,500,0,50000,20000,10000:8000:6000:4000:2000,-1
 //==========================================

+ 6 - 38
src/map/skill.cpp

@@ -324,7 +324,6 @@ static int skill_unit_onplace(struct skill_unit *src,struct block_list *bl,unsig
 int skill_unit_onleft(uint16 skill_id, struct block_list *bl,unsigned int tick);
 static int skill_unit_effect(struct block_list *bl,va_list ap);
 static int skill_bind_trap(struct block_list *bl, va_list ap);
-static int skill_mob_releasetarget(struct block_list *bl, va_list ap);
 
 int skill_get_casttype (uint16 skill_id) {
 	int inf = skill_get_inf(skill_id);
@@ -10574,7 +10573,7 @@ int skill_castend_nodamage_id (struct block_list *src, struct block_list *bl, ui
 					delete_timer(md2->deletetimer, mob_timer_delete);
 				md2->deletetimer = add_timer (gettick() + skill_get_time(skill_id, skill_lv), mob_timer_delete, md2->bl.id, 0);
 				mob_spawn( md2 );
-				pc_setinvincibletimer(sd,500);// unlock target lock
+				map_foreachinallrange(unit_changetarget, src, AREA_SIZE, BL_MOB, src, &md2->bl);
 				clif_skill_nodamage(src,bl,skill_id,skill_lv,1);
 				skill_blown(src,bl,skill_get_blewcount(skill_id,skill_lv),unit_getdir(bl),BLOWN_NONE);
 			}
@@ -10619,6 +10618,7 @@ int skill_castend_nodamage_id (struct block_list *src, struct block_list *bl, ui
 					if (bl->type == BL_PC && pc_issit((TBL_PC*)bl))
 						clif_sitting(bl); //Avoid sitting sync problem
 					clif_blown(bl);
+					map_foreachinallrange(unit_changetarget, src, AREA_SIZE, BL_CHAR, src, bl);
 				}
 			}
 		}
@@ -12174,10 +12174,10 @@ int skill_castend_pos2(struct block_list* src, int x, int y, uint16 skill_id, ui
 				clif_skill_fail(sd,skill_id,USESKILL_FAIL_LEVEL,0);
 				return 1;
 			}
-			// Release all targets against the caster.
-			map_foreachinallrange(skill_mob_releasetarget, src, AREA_SIZE, BL_MOB, src, &group->unit->bl);
+			map_foreachinallrange(unit_changetarget, src, AREA_SIZE, BL_MOB, src, &group->unit->bl); // Release all targets against the caster
+			pc_setinvincibletimer(sd, skill_get_time(skill_id, skill_lv));
 			skill_blown(src, src, skill_get_blewcount(skill_id, skill_lv), unit_getdir(src), BLOWN_IGNORE_NO_KNOCKBACK); // Don't stop the caster from backsliding if special_state.no_knockback is active
-			clif_skill_nodamage(src,src,skill_id,skill_lv,sc_start(src,src,type,100,skill_lv,skill_get_time2(skill_id,skill_lv)));
+			clif_skill_nodamage(src,src,skill_id,skill_lv,sc_start(src,src,type,100,skill_lv,skill_get_time(skill_id,skill_lv)));
 		}
 		break;
 
@@ -17301,38 +17301,6 @@ static int skill_bind_trap(struct block_list *bl, va_list ap) {
 	return 1;
 }
 
-/**
- * Release monsters that are targetting the caster and change target.
- * @param bl: Monster data
- * @param src: Player data
- * @param skill: Skill unit group data
- */
-static int skill_mob_releasetarget(struct block_list *bl, va_list ap)
-{
-	struct block_list *src = NULL, *skill = NULL;
-	struct mob_data *md = NULL;
-
-	nullpo_ret(bl);
-	nullpo_ret(ap);
-	nullpo_ret(src = va_arg(ap, struct block_list *));
-	nullpo_ret(skill = va_arg(ap, struct block_list *));
-
-	if (bl->type != BL_MOB)
-		return 0;
-
-	md = map_id2md(bl->id);
-
-	if (md && md->target_id == src->id) {
-		struct unit_data *ud = unit_bl2ud(bl);
-
-		md->attacked_id = 0;
-		md->target_id = skill->id;
-		ud->target_to = skill->id;
-	}
-
-	return 1;
-}
-
 /*==========================================
  * Check new skill unit cell when overlapping in other skill unit cell.
  * Catched skill in cell value pushed to *unit pointer.
@@ -18456,7 +18424,7 @@ static int skill_unit_timer_sub(DBKey key, DBData *data, va_list ap)
 				struct block_list *src = map_id2bl(group->src_id);
 
 				if (src)
-					map_foreachinrange(skill_area_sub, &unit->bl, unit->range, BL_CHAR|BL_SKILL, src, SC_FEINTBOMB, group->skill_lv, tick, BCT_ENEMY|SD_ANIMATION|5, skill_castend_damage_id);
+					map_foreachinrange(skill_area_sub, &unit->bl, unit->range, BL_CHAR|BL_SKILL, src, group->skill_id, group->skill_lv, tick, BCT_ENEMY|SD_ANIMATION|5, skill_castend_damage_id);
 				skill_delunit(unit);
 			}
 			break;

+ 0 - 1
src/map/status.cpp

@@ -1438,7 +1438,6 @@ void initChangeTables(void)
 	StatusChangeStateTable[SC_CRYSTALIZE]			|= SCS_NOCAST;
 	StatusChangeStateTable[SC__IGNORANCE]			|= SCS_NOCAST;
 	StatusChangeStateTable[SC__MANHOLE]				|= SCS_NOCAST;
-	StatusChangeStateTable[SC__FEINTBOMB]			|= SCS_NOCAST;
 	StatusChangeStateTable[SC_DEEPSLEEP]			|= SCS_NOCAST;
 	StatusChangeStateTable[SC_SATURDAYNIGHTFEVER]	|= SCS_NOCAST;
 	StatusChangeStateTable[SC_CURSEDCIRCLE_TARGET]	|= SCS_NOCAST;