From d00b2d7fcdde9110a9e41a545439f77bce93e4dc Mon Sep 17 00:00:00 2001 From: xazax-hun Date: Tue, 27 Dec 2011 20:41:29 +0000 Subject: Fixed an issue, players were able to see disabled NPCs with maya purple card. (bugreport:2221) git-svn-id: https://rathena.svn.sourceforge.net/svnroot/rathena/trunk@15288 54d463be-8e91-2dee-dedb-b68131a5f0ec --- src/map/clif.c | 27 +++++++++++++++++++++++++-- src/map/npc.c | 6 ++++++ 2 files changed, 31 insertions(+), 2 deletions(-) diff --git a/src/map/clif.c b/src/map/clif.c index a8969d38e..19f10f828 100644 --- a/src/map/clif.c +++ b/src/map/clif.c @@ -1217,7 +1217,13 @@ int clif_spawn(struct block_list *bl) vd = status_get_viewdata(bl); if( !vd || vd->class_ == INVISIBLE_CLASS ) return 0; - + + /** + * Hide NPC from maya puprle card. + **/ + if(bl->type == BL_NPC && (((TBL_NPC*)bl)->sc.option&OPTION_INVISIBLE)) + return 0; + len = clif_set_unit_idle(bl, buf,true); clif_send(buf, len, bl, AREA_WOS); if (disguised(bl)) @@ -1472,6 +1478,12 @@ void clif_move(struct unit_data *ud) vd = status_get_viewdata(bl); if (!vd || vd->class_ == INVISIBLE_CLASS) return; //This performance check is needed to keep GM-hidden objects from being notified to bots. + + /** + * Hide NPC from maya puprle card. + **/ + if(bl->type == BL_NPC && (((TBL_NPC*)bl)->sc.option&OPTION_INVISIBLE)) + return; if (ud->state.speed_changed) { // Since we don't know how to update the speed of other objects, @@ -3800,6 +3812,12 @@ void clif_getareachar_unit(struct map_session_data* sd,struct block_list *bl) vd = status_get_viewdata(bl); if (!vd || vd->class_ == INVISIBLE_CLASS) return; + + /** + * Hide NPC from maya puprle card. + **/ + if(bl->type == BL_NPC && (((TBL_NPC*)bl)->sc.option&OPTION_INVISIBLE)) + return; ud = unit_bl2ud(bl); len = ( ud && ud->walktimer != INVALID_TIMER ) ? clif_set_unit_walking(bl,ud,buf) : clif_set_unit_idle(bl,buf,false); @@ -4233,6 +4251,10 @@ int clif_outsight(struct block_list *bl,va_list ap) case BL_SKILL: clif_clearchar_skillunit((struct skill_unit *)bl,tsd->fd); break; + case BL_NPC: + if( !(((TBL_NPC*)bl)->sc.option&OPTION_INVISIBLE) ) + clif_clearunit_single(bl->id,CLR_OUTSIGHT,tsd->fd); + break; default: if ((vd=status_get_viewdata(bl)) && vd->class_ != INVISIBLE_CLASS) clif_clearunit_single(bl->id,CLR_OUTSIGHT,tsd->fd); @@ -4241,7 +4263,8 @@ int clif_outsight(struct block_list *bl,va_list ap) } if (sd && sd->fd) { //sd is watching tbl go out of view. - if ((vd=status_get_viewdata(tbl)) && vd->class_ != INVISIBLE_CLASS) + if (((vd=status_get_viewdata(tbl)) && vd->class_ != INVISIBLE_CLASS) && + !(bl->type == BL_NPC && (((TBL_NPC*)bl)->sc.option&OPTION_INVISIBLE))) clif_clearunit_single(tbl->id,CLR_OUTSIGHT,sd->fd); } return 0; diff --git a/src/map/npc.c b/src/map/npc.c index 4606cfc8e..0d112b937 100644 --- a/src/map/npc.c +++ b/src/map/npc.c @@ -169,13 +169,19 @@ int npc_enable(const char* name, int flag) } if (flag&1) + { nd->sc.option&=~OPTION_INVISIBLE; + clif_spawn(&nd->bl); + } else if (flag&2) nd->sc.option&=~OPTION_HIDE; else if (flag&4) nd->sc.option|= OPTION_HIDE; else //Can't change the view_data to invisible class because the view_data for all npcs is shared! [Skotlex] + { nd->sc.option|= OPTION_INVISIBLE; + clif_clearunit_area(&nd->bl,CLR_OUTSIGHT); // Hack to trick maya purple card [Xazax] + } if (nd->class_ == WARP_CLASS || nd->class_ == FLAG_CLASS) { //Client won't display option changes for these classes [Toms] -- cgit v1.2.3-70-g09d2