|
@@ -4224,20 +4224,39 @@ static int skill_active_reverberation(struct block_list *bl, va_list ap) {
|
|
return 1;
|
|
return 1;
|
|
}
|
|
}
|
|
|
|
|
|
|
|
+/**
|
|
|
|
+ * Reveal hidden trap
|
|
|
|
+ **/
|
|
static int skill_reveal_trap(struct block_list *bl, va_list ap)
|
|
static int skill_reveal_trap(struct block_list *bl, va_list ap)
|
|
{
|
|
{
|
|
TBL_SKILL *su = (TBL_SKILL*)bl;
|
|
TBL_SKILL *su = (TBL_SKILL*)bl;
|
|
|
|
|
|
- if (su->alive && su->group && skill_get_inf2(su->group->skill_id)&INF2_TRAP)
|
|
|
|
- { //Reveal trap.
|
|
|
|
|
|
+ if (su->alive && su->group && su->hidden && skill_get_inf2(su->group->skill_id)&INF2_TRAP) {
|
|
//Change look is not good enough, the client ignores it as an actual trap still. [Skotlex]
|
|
//Change look is not good enough, the client ignores it as an actual trap still. [Skotlex]
|
|
//clif_changetraplook(bl, su->group->unit_id);
|
|
//clif_changetraplook(bl, su->group->unit_id);
|
|
- clif_getareachar_skillunit(&su->bl, su, AREA, 0);
|
|
|
|
|
|
+
|
|
|
|
+ su->hidden = false;
|
|
|
|
+ skill_getareachar_skillunit_visibilty(su, AREA);
|
|
return 1;
|
|
return 1;
|
|
}
|
|
}
|
|
return 0;
|
|
return 0;
|
|
}
|
|
}
|
|
|
|
|
|
|
|
+/**
|
|
|
|
+ * Attempt to reaveal trap in area
|
|
|
|
+ * @param src Skill caster
|
|
|
|
+ * @param range Affected range
|
|
|
|
+ * @param x
|
|
|
|
+ * @param y
|
|
|
|
+ * TODO: Remove hardcode usages for this function
|
|
|
|
+ **/
|
|
|
|
+void skill_reveal_trap_inarea(struct block_list *src, int range, int x, int y) {
|
|
|
|
+ if (!battle_config.traps_setting)
|
|
|
|
+ return;
|
|
|
|
+ nullpo_retv(src);
|
|
|
|
+ map_foreachinarea(skill_reveal_trap, src->m, x-range, y-range, x+range, y+range, BL_SKILL);
|
|
|
|
+}
|
|
|
|
+
|
|
/*==========================================
|
|
/*==========================================
|
|
*
|
|
*
|
|
*
|
|
*
|
|
@@ -6529,11 +6548,12 @@ int skill_castend_nodamage_id (struct block_list *src, struct block_list *bl, ui
|
|
|
|
|
|
case AC_CONCENTRATION:
|
|
case AC_CONCENTRATION:
|
|
{
|
|
{
|
|
|
|
+ int splash = skill_get_splash(skill_id, skill_lv);
|
|
clif_skill_nodamage(src,bl,skill_id,skill_lv,
|
|
clif_skill_nodamage(src,bl,skill_id,skill_lv,
|
|
sc_start(src,bl,type,100,skill_lv,skill_get_time(skill_id,skill_lv)));
|
|
sc_start(src,bl,type,100,skill_lv,skill_get_time(skill_id,skill_lv)));
|
|
|
|
+ skill_reveal_trap_inarea(src, splash, src->x, src->y);
|
|
map_foreachinrange( status_change_timer_sub, src,
|
|
map_foreachinrange( status_change_timer_sub, src,
|
|
- skill_get_splash(skill_id, skill_lv), BL_CHAR,
|
|
|
|
- src,NULL,type,tick);
|
|
|
|
|
|
+ splash, BL_CHAR, src, NULL, type, tick);
|
|
}
|
|
}
|
|
break;
|
|
break;
|
|
|
|
|
|
@@ -11363,9 +11383,7 @@ int skill_castend_pos2(struct block_list* src, int x, int y, uint16 skill_id, ui
|
|
map_foreachinarea( status_change_timer_sub,
|
|
map_foreachinarea( status_change_timer_sub,
|
|
src->m, x-i, y-i, x+i,y+i,BL_CHAR,
|
|
src->m, x-i, y-i, x+i,y+i,BL_CHAR,
|
|
src,NULL,SC_SIGHT,tick);
|
|
src,NULL,SC_SIGHT,tick);
|
|
- if(battle_config.traps_setting&1)
|
|
|
|
- map_foreachinarea(skill_reveal_trap, src->m, x-i, y-i, x+i, y+i, BL_SKILL);
|
|
|
|
- break;
|
|
|
|
|
|
+ skill_reveal_trap_inarea(src, i, x, y);
|
|
break;
|
|
break;
|
|
|
|
|
|
case SR_RIDEINLIGHTNING:
|
|
case SR_RIDEINLIGHTNING:
|
|
@@ -12242,7 +12260,7 @@ static int skill_dance_overlap_sub(struct block_list* bl, va_list ap)
|
|
else //Remove dissonance
|
|
else //Remove dissonance
|
|
target->val2 &= ~UF_ENSEMBLE;
|
|
target->val2 &= ~UF_ENSEMBLE;
|
|
|
|
|
|
- clif_getareachar_skillunit(&target->bl, target, AREA, 0); //Update look of affected cell.
|
|
|
|
|
|
+ skill_getareachar_skillunit_visibilty(target, AREA);
|
|
|
|
|
|
return 1;
|
|
return 1;
|
|
}
|
|
}
|
|
@@ -12350,6 +12368,7 @@ struct skill_unit_group *skill_unitsetting(struct block_list *src, uint16 skill_
|
|
struct status_change *sc;
|
|
struct status_change *sc;
|
|
int active_flag = 1;
|
|
int active_flag = 1;
|
|
int subunt = 0;
|
|
int subunt = 0;
|
|
|
|
+ bool hidden = false;
|
|
|
|
|
|
nullpo_retr(NULL, src);
|
|
nullpo_retr(NULL, src);
|
|
|
|
|
|
@@ -12363,6 +12382,7 @@ struct skill_unit_group *skill_unitsetting(struct block_list *src, uint16 skill_
|
|
sd = BL_CAST(BL_PC, src);
|
|
sd = BL_CAST(BL_PC, src);
|
|
status = status_get_status_data(src);
|
|
status = status_get_status_data(src);
|
|
sc = status_get_sc(src); // for traps, firewall and fogwall - celest
|
|
sc = status_get_sc(src); // for traps, firewall and fogwall - celest
|
|
|
|
+ hidden = (unit_flag&UF_HIDDEN_TRAP && (battle_config.traps_setting == 2 || (battle_config.traps_setting == 1 && map_flag_vs(src->m))));
|
|
|
|
|
|
switch( skill_id ) {
|
|
switch( skill_id ) {
|
|
case MH_STEINWAND:
|
|
case MH_STEINWAND:
|
|
@@ -12822,7 +12842,7 @@ struct skill_unit_group *skill_unitsetting(struct block_list *src, uint16 skill_
|
|
if( !alive )
|
|
if( !alive )
|
|
continue;
|
|
continue;
|
|
|
|
|
|
- nullpo_retr(NULL, (unit = skill_initunit(group,i,ux,uy,unit_val1,unit_val2)));
|
|
|
|
|
|
+ nullpo_retr(NULL, (unit = skill_initunit(group,i,ux,uy,unit_val1,unit_val2,hidden)));
|
|
unit->limit = limit;
|
|
unit->limit = limit;
|
|
unit->range = range;
|
|
unit->range = range;
|
|
|
|
|
|
@@ -17250,6 +17270,77 @@ bool skill_check_camouflage(struct block_list *bl, struct status_change_entry *s
|
|
return wall;
|
|
return wall;
|
|
}
|
|
}
|
|
|
|
|
|
|
|
+/**
|
|
|
|
+ * Process skill unit visibilty for single BL in area
|
|
|
|
+ * @param bl
|
|
|
|
+ * @param ap
|
|
|
|
+ * @author [Cydh]
|
|
|
|
+ **/
|
|
|
|
+int skill_getareachar_skillunit_visibilty_sub(struct block_list *bl, va_list ap) {
|
|
|
|
+ struct skill_unit *su = NULL;
|
|
|
|
+ struct block_list *src = NULL;
|
|
|
|
+ unsigned int party1 = 0;
|
|
|
|
+ bool visible = true;
|
|
|
|
+
|
|
|
|
+ nullpo_ret(bl);
|
|
|
|
+ nullpo_ret((su = va_arg(ap, struct skill_unit*)));
|
|
|
|
+ nullpo_ret((src = va_arg(ap, struct block_list*)));
|
|
|
|
+ party1 = va_arg(ap, unsigned int);
|
|
|
|
+
|
|
|
|
+ if (src != bl) {
|
|
|
|
+ unsigned int party2 = status_get_party_id(bl);
|
|
|
|
+ if (!party1 || !party2 || party1 != party2)
|
|
|
|
+ visible = false;
|
|
|
|
+ }
|
|
|
|
+
|
|
|
|
+ clif_getareachar_skillunit(bl, su, SELF, visible);
|
|
|
|
+ return 1;
|
|
|
|
+}
|
|
|
|
+
|
|
|
|
+/**
|
|
|
|
+ * Check for skill unit visibilty in area on
|
|
|
|
+ * - skill first placement
|
|
|
|
+ * - skill moved (knocked back, moved dance)
|
|
|
|
+ * @param su Skill unit
|
|
|
|
+ * @param target Affected target for this visibility @see enum send_target
|
|
|
|
+ * @author [Cydh]
|
|
|
|
+ **/
|
|
|
|
+void skill_getareachar_skillunit_visibilty(struct skill_unit *su, enum send_target target) {
|
|
|
|
+ nullpo_retv(su);
|
|
|
|
+
|
|
|
|
+ if (!su->hidden) // It's not hidden, just do this!
|
|
|
|
+ clif_getareachar_skillunit(&su->bl, su, target, true);
|
|
|
|
+ else {
|
|
|
|
+ struct block_list *src = battle_get_master(&su->bl);
|
|
|
|
+ map_foreachinarea(skill_getareachar_skillunit_visibilty_sub, su->bl.m, su->bl.x-AREA_SIZE, su->bl.y-AREA_SIZE,
|
|
|
|
+ su->bl.x+AREA_SIZE, su->bl.y+AREA_SIZE, BL_PC, su, src, status_get_party_id(src));
|
|
|
|
+ }
|
|
|
|
+}
|
|
|
|
+
|
|
|
|
+/**
|
|
|
|
+ * Check for skill unit visibilty on single BL on insight/spawn action
|
|
|
|
+ * @param su Skill unit
|
|
|
|
+ * @param bl Block list
|
|
|
|
+ * @author [Cydh]
|
|
|
|
+ **/
|
|
|
|
+void skill_getareachar_skillunit_visibilty_single(struct skill_unit *su, struct block_list *bl) {
|
|
|
|
+ bool visible = true;
|
|
|
|
+ struct block_list *src = NULL;
|
|
|
|
+
|
|
|
|
+ nullpo_retv(bl);
|
|
|
|
+ nullpo_retv(su);
|
|
|
|
+ nullpo_retv((src = battle_get_master(&su->bl)));
|
|
|
|
+
|
|
|
|
+ if (su->hidden && src != bl) {
|
|
|
|
+ unsigned int party1 = status_get_party_id(src);
|
|
|
|
+ unsigned int party2 = status_get_party_id(bl);
|
|
|
|
+ if (!party1 || !party2 || party1 != party2)
|
|
|
|
+ visible = false;
|
|
|
|
+ }
|
|
|
|
+
|
|
|
|
+ clif_getareachar_skillunit(bl, su, SELF, visible);
|
|
|
|
+}
|
|
|
|
+
|
|
/**
|
|
/**
|
|
* Initialize new skill unit for skill unit group.
|
|
* Initialize new skill unit for skill unit group.
|
|
* Overall, Skill Unit makes skill unit group which each group holds their cell datas (skill unit)
|
|
* Overall, Skill Unit makes skill unit group which each group holds their cell datas (skill unit)
|
|
@@ -17260,7 +17351,7 @@ bool skill_check_camouflage(struct block_list *bl, struct status_change_entry *s
|
|
* @param val1
|
|
* @param val1
|
|
* @param val2
|
|
* @param val2
|
|
*/
|
|
*/
|
|
-struct skill_unit *skill_initunit(struct skill_unit_group *group, int idx, int x, int y, int val1, int val2)
|
|
|
|
|
|
+struct skill_unit *skill_initunit(struct skill_unit_group *group, int idx, int x, int y, int val1, int val2, bool hidden)
|
|
{
|
|
{
|
|
struct skill_unit *unit;
|
|
struct skill_unit *unit;
|
|
|
|
|
|
@@ -17283,6 +17374,7 @@ struct skill_unit *skill_initunit(struct skill_unit_group *group, int idx, int x
|
|
unit->alive = 1;
|
|
unit->alive = 1;
|
|
unit->val1 = val1;
|
|
unit->val1 = val1;
|
|
unit->val2 = val2;
|
|
unit->val2 = val2;
|
|
|
|
+ unit->hidden = hidden;
|
|
|
|
|
|
// Stores new skill unit
|
|
// Stores new skill unit
|
|
idb_put(skillunit_db, unit->bl.id, unit);
|
|
idb_put(skillunit_db, unit->bl.id, unit);
|
|
@@ -17312,7 +17404,7 @@ struct skill_unit *skill_initunit(struct skill_unit_group *group, int idx, int x
|
|
break;
|
|
break;
|
|
}
|
|
}
|
|
|
|
|
|
- clif_getareachar_skillunit(&unit->bl, unit, AREA, 0);
|
|
|
|
|
|
+ skill_getareachar_skillunit_visibilty(unit, AREA);
|
|
return unit;
|
|
return unit;
|
|
}
|
|
}
|
|
|
|
|
|
@@ -18163,7 +18255,7 @@ void skill_unit_move_unit(struct block_list *bl, int dx, int dy) {
|
|
|
|
|
|
map_moveblock(bl, dx, dy, tick);
|
|
map_moveblock(bl, dx, dy, tick);
|
|
map_foreachincell(skill_unit_effect,bl->m,bl->x,bl->y,su->group->bl_flag,bl,tick,1);
|
|
map_foreachincell(skill_unit_effect,bl->m,bl->x,bl->y,su->group->bl_flag,bl,tick,1);
|
|
- clif_getareachar_skillunit(bl, su, AREA, 0);
|
|
|
|
|
|
+ skill_getareachar_skillunit_visibilty(su, AREA);
|
|
return;
|
|
return;
|
|
}
|
|
}
|
|
|
|
|
|
@@ -18257,7 +18349,7 @@ void skill_unit_move_unit_group(struct skill_unit_group *group, int16 m, int16 d
|
|
if (!(m_flag[i]&0x2)) { //We only moved the cell in 0-1
|
|
if (!(m_flag[i]&0x2)) { //We only moved the cell in 0-1
|
|
if (group->state.song_dance&0x1) //Check for dissonance effect.
|
|
if (group->state.song_dance&0x1) //Check for dissonance effect.
|
|
skill_dance_overlap(unit1, 1);
|
|
skill_dance_overlap(unit1, 1);
|
|
- clif_getareachar_skillunit(&unit1->bl, unit1, AREA, 0);
|
|
|
|
|
|
+ skill_getareachar_skillunit_visibilty(unit1, AREA);
|
|
map_foreachincell(skill_unit_effect,unit1->bl.m,unit1->bl.x,unit1->bl.y,group->bl_flag,&unit1->bl,tick,1);
|
|
map_foreachincell(skill_unit_effect,unit1->bl.m,unit1->bl.x,unit1->bl.y,group->bl_flag,&unit1->bl,tick,1);
|
|
}
|
|
}
|
|
}
|
|
}
|