|
@@ -321,6 +321,7 @@ 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);
|
|
@@ -11990,10 +11991,13 @@ int skill_castend_pos2(struct block_list* src, int x, int y, uint16 skill_id, ui
|
|
|
if( sd ) clif_magicdecoy_list(sd,skill_lv,x,y);
|
|
|
break;
|
|
|
|
|
|
- case SC_FEINTBOMB:
|
|
|
- skill_unitsetting(src,skill_id,skill_lv,x,y,0); // Set bomb on current Position
|
|
|
- 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)));
|
|
|
+ case SC_FEINTBOMB: {
|
|
|
+ struct skill_unit_group *group = skill_unitsetting(src,skill_id,skill_lv,x,y,0); // Set bomb on current Position
|
|
|
+
|
|
|
+ map_foreachinrange(skill_mob_releasetarget, src, AREA_SIZE, BL_MOB, src, &group->unit->bl); // Release all targets against the caster.
|
|
|
+ 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)));
|
|
|
+ }
|
|
|
break;
|
|
|
|
|
|
case SC_ESCAPE:
|
|
@@ -17096,6 +17100,38 @@ 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.
|
|
@@ -18201,11 +18237,9 @@ static int skill_unit_timer_sub(DBKey key, DBData *data, va_list ap)
|
|
|
|
|
|
case UNT_FEINTBOMB: {
|
|
|
struct block_list *src = map_id2bl(group->src_id);
|
|
|
- struct status_change *sc;
|
|
|
- if (src && (sc = status_get_sc(src)) != NULL && sc->data[SC__FEINTBOMB]) { // Copycat explodes if caster is still hidden.
|
|
|
+
|
|
|
+ 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);
|
|
|
- status_change_end(bl, SC__FEINTBOMB, INVALID_TIMER);
|
|
|
- }
|
|
|
skill_delunit(unit);
|
|
|
}
|
|
|
break;
|