From a76908de39c38dcb65afb6d1ab628bc414abd483 Mon Sep 17 00:00:00 2001 From: Lance Date: Mon, 1 May 2006 05:48:06 +0000 Subject: * Optimized fake npc system. Added npc_checknear back to npc_buysellsel. git-svn-id: https://rathena.svn.sourceforge.net/svnroot/rathena/trunk@6426 54d463be-8e91-2dee-dedb-b68131a5f0ec --- src/map/clif.c | 18 ++++++++++++++++++ src/map/npc.c | 15 ++++++++------- src/map/script.c | 13 ------------- 3 files changed, 26 insertions(+), 20 deletions(-) (limited to 'src') diff --git a/src/map/clif.c b/src/map/clif.c index 0efd160b4..8321368c0 100644 --- a/src/map/clif.c +++ b/src/map/clif.c @@ -1809,10 +1809,16 @@ void clif_sendfakenpc(struct map_session_data *sd, int npcid) { int clif_scriptmenu(struct map_session_data *sd, int npcid, char *mes) { int fd; int slen = strlen(mes) + 8; + struct block_list *bl = map_id2bl(npcid); WFIFOHEAD(fd, slen); nullpo_retr(0, sd); + if (bl->type == BL_PC || bl->m!=sd->bl.m || + bl->xbl.x-AREA_SIZE-1 || bl->x>sd->bl.x+AREA_SIZE+1 || + bl->ybl.y-AREA_SIZE-1 || bl->y>sd->bl.y+AREA_SIZE+1) + clif_sendfakenpc(sd, npcid); + fd=sd->fd; WFIFOW(fd,0)=0xb7; WFIFOW(fd,2)=slen; @@ -1829,8 +1835,14 @@ int clif_scriptmenu(struct map_session_data *sd, int npcid, char *mes) { */ int clif_scriptinput(struct map_session_data *sd, int npcid) { int fd; + struct block_list *bl = map_id2bl(npcid); nullpo_retr(0, sd); + + if (bl->type == BL_PC || bl->m!=sd->bl.m || + bl->xbl.x-AREA_SIZE-1 || bl->x>sd->bl.x+AREA_SIZE+1 || + bl->ybl.y-AREA_SIZE-1 || bl->y>sd->bl.y+AREA_SIZE+1) + clif_sendfakenpc(sd, npcid); fd=sd->fd; WFIFOHEAD(fd, packet_len_table[0x142]); @@ -1847,9 +1859,15 @@ int clif_scriptinput(struct map_session_data *sd, int npcid) { */ int clif_scriptinputstr(struct map_session_data *sd, int npcid) { int fd; + struct block_list *bl = map_id2bl(npcid); nullpo_retr(0, sd); + if (bl->type == BL_PC || bl->m!=sd->bl.m || + bl->xbl.x-AREA_SIZE-1 || bl->x>sd->bl.x+AREA_SIZE+1 || + bl->ybl.y-AREA_SIZE-1 || bl->y>sd->bl.y+AREA_SIZE+1) + clif_sendfakenpc(sd, npcid); + fd=sd->fd; WFIFOHEAD(fd, packet_len_table[0x1d4]); WFIFOW(fd,0)=0x1d4; diff --git a/src/map/npc.c b/src/map/npc.c index a38d36a3d..12c17de7a 100644 --- a/src/map/npc.c +++ b/src/map/npc.c @@ -979,9 +979,9 @@ int npc_checknear(struct map_session_data *sd,int id) return 1; } - // Reprecated, please do not uncomment this. [Lance] - //if (nd->class_<0) // イベント系は常にOK - // return 0; + + if (nd->class_<0) // イベント系は常にOK + return 0; // エリア判定 if (nd->bl.m!=sd->bl.m || @@ -1026,13 +1026,14 @@ int npc_click(struct map_session_data *sd,int id) return 1; } + if (npc_checknear(sd,id)) return 1; nd=(struct npc_data *)map_id2bl(id); - //Disabled npc. - if (nd->sc.option&OPTION_INVISIBLE) + //Hidden/Disabled npc. + if (nd->class_ < 0 || nd->sc.option&OPTION_INVISIBLE) return 1; sd->npc_id=id; @@ -1085,8 +1086,8 @@ int npc_buysellsel(struct map_session_data *sd,int id,int type) nullpo_retr(1, sd); - //if (npc_checknear(sd,id)) - // return 1; + if (npc_checknear(sd,id)) + return 1; nd=(struct npc_data *)map_id2bl(id); if (nd->bl.subtype!=SHOP) { diff --git a/src/map/script.c b/src/map/script.c index f9a87e1be..eeb055ed0 100644 --- a/src/map/script.c +++ b/src/map/script.c @@ -10909,20 +10909,7 @@ int run_script_main(struct script_state *st) st->state = RUN; } } else { - struct block_list *bl; st->state = RUN; - if(st->oid && st->rid && (bl = map_id2bl(st->oid))){ - // Perfomance impact, use buildin_doevent instead for interactive item scripts. - /*if(bl->type == BL_PC){ - clif_sendfakenpc(((TBL_PC *)bl),dummy_npc_id); - } else */ - if(bl->type == BL_NPC){ - if((bl = map_id2bl(st->rid))){ // Should be type PC now - if(npc_checknear(((TBL_PC *)bl), st->oid)) - clif_sendfakenpc(((struct map_session_data *)bl),st->oid); - } - } - } } while( st->state == RUN) { c= get_com((unsigned char *) st->script,&st->pos); -- cgit v1.2.3-70-g09d2