|
@@ -4213,7 +4213,9 @@ static int skill_reveal_trap(struct block_list *bl, va_list ap)
|
|
{ //Reveal trap.
|
|
{ //Reveal 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;
|
|
@@ -12228,7 +12230,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;
|
|
}
|
|
}
|
|
@@ -12336,6 +12338,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);
|
|
|
|
|
|
@@ -12349,6 +12352,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:
|
|
@@ -12809,7 +12813,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;
|
|
|
|
|
|
@@ -17222,6 +17226,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)
|
|
@@ -17232,7 +17307,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;
|
|
|
|
|
|
@@ -17255,6 +17330,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);
|
|
@@ -17284,7 +17360,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;
|
|
}
|
|
}
|
|
|
|
|
|
@@ -18135,7 +18211,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;
|
|
}
|
|
}
|
|
|
|
|
|
@@ -18229,7 +18305,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);
|
|
}
|
|
}
|
|
}
|
|
}
|