- @storage/@gstorage will no longer work if you have a trade or a storage opened already.

- Cleaned up a bit @gstorage
- Added a bunch of npc functions required to properly handle moving the NPC cells when an npc is moved from it's previous location.
- Added npc_setcells to handle setting down the NPC cells of ontouch npcs.


git-svn-id: https://svn.code.sf.net/p/rathena/svn/trunk@9990 54d463be-8e91-2dee-dedb-b68131a5f0ec
This commit is contained in:
skotlex 2007-03-11 20:02:42 +00:00
parent 03b226591b
commit ddfc677c99
5 changed files with 107 additions and 44 deletions

View File

@ -4,6 +4,10 @@ AS OF SVN REV. 5091, WE ARE NOW USING TRUNK. ALL UNTESTED BUGFIXES/FEATURES GO
IF YOU HAVE A WORKING AND TESTED BUGFIX PUT IT INTO STABLE AS WELL AS TRUNK.
2007/03/12
* @storage/@gstorage will no longer work if you have a trade or a storage
opened already.
* Corrected script command movenpc so it properly moves the ontouch npc
cells as well.
* Changed the unit-walk packet to be 0x86 as pointed out by FlavioJS. This
new packet is much smaller, and should greatly decrease bandwidth usage.
The only drawback is that the character will not display at all if the

View File

@ -2163,6 +2163,9 @@ int atcommand_charspeed(const int fd, struct map_session_data* sd, const char* c
int atcommand_storage(const int fd, struct map_session_data* sd, const char* command, const char* message)
{
nullpo_retr(-1, sd);
if (sd->npc_id || sd->vender_id || sd->state.trading || sd->state.storage_flag)
return -1;
if (storage_storageopen(sd) == 1)
{ //Already open.
@ -2182,21 +2185,24 @@ int atcommand_guildstorage(const int fd, struct map_session_data* sd, const char
struct storage *stor; //changes from Freya/Yor
nullpo_retr(-1, sd);
if (sd->status.guild_id > 0) {
if (sd->state.storage_flag) {
clif_displaymessage(fd, msg_txt(251));
return -1;
}
if ((stor = account2storage2(sd->status.account_id)) != NULL && stor->storage_status == 1) {
clif_displaymessage(fd, msg_txt(251));
return -1;
}
storage_guild_storageopen(sd);
} else {
if (!sd->status.guild_id) {
clif_displaymessage(fd, msg_txt(252));
return -1;
}
if (sd->npc_id || sd->vender_id || sd->state.trading || sd->state.storage_flag)
return -1;
if (sd->state.storage_flag) {
clif_displaymessage(fd, msg_txt(251));
return -1;
}
if ((stor = account2storage2(sd->status.account_id)) != NULL && stor->storage_status == 1) {
clif_displaymessage(fd, msg_txt(251));
return -1;
}
storage_guild_storageopen(sd);
return 0;
}

View File

@ -1662,7 +1662,7 @@ void npc_delsrcfile (char *name)
int npc_parse_warp (char *w1,char *w2,char *w3,char *w4)
{
int x, y, xs, ys, to_x, to_y, m;
int i, j;
int i;
char mapname[MAP_NAME_LENGTH], to_mapname[MAP_NAME_LENGTH];
struct npc_data *nd;
@ -1704,18 +1704,10 @@ int npc_parse_warp (char *w1,char *w2,char *w3,char *w4)
nd->u.warp.y = to_y;
nd->u.warp.xs = xs;
nd->u.warp.ys = ys;
for (i = 0; i < ys; i++) {
for (j = 0; j < xs; j++) {
if (map_getcell(m, x-xs/2+j, y-ys/2+i, CELL_CHKNOPASS))
continue;
map_setcell(m, x-xs/2+j, y-ys/2+i, CELL_SETNPC);
}
}
npc_warp++;
nd->bl.type = BL_NPC;
nd->bl.subtype = WARP;
npc_setcells(nd);
map_addblock(&nd->bl);
status_set_viewdata(&nd->bl, nd->class_);
status_change_init(&nd->bl);
@ -2055,20 +2047,9 @@ static int npc_parse_script(char *w1,char *w2,char *w3,char *w4,char *first_line
if (sscanf(w4, "%d,%d,%d", &class_, &xs, &ys) == 3) {
// 接触型NPC
int i, j;
if (xs >= 0) xs = xs * 2 + 1;
if (ys >= 0) ys = ys * 2 + 1;
if (m >= 0) {
for (i = 0; i < ys; i++) {
for (j = 0; j < xs; j++) {
if (map_getcell(m, x - xs/2 + j, y - ys/2 + i, CELL_CHKNOPASS))
continue;
map_setcell(m, x - xs/2 + j, y - ys/2 + i, CELL_SETNPC);
}
}
}
nd->u.scr.xs = xs;
nd->u.scr.ys = ys;
} else {
@ -2119,6 +2100,7 @@ static int npc_parse_script(char *w1,char *w2,char *w3,char *w4,char *first_line
status_change_init(&nd->bl);
unit_dataset(&nd->bl);
nd->ud.dir = dir;
npc_setcells(nd);
map_addblock(&nd->bl);
// Unused. You can always use xxx::OnXXXX events. Have this removed to improve perfomance.
/*if (evflag) { // イベント型
@ -2217,6 +2199,86 @@ static int npc_parse_script(char *w1,char *w2,char *w3,char *w4,char *first_line
return 0;
}
void npc_setcells(struct npc_data *nd)
{
int m = nd->bl.m, x = nd->bl.x, y = nd->bl.y, xs, ys;
int i,j;
if (nd->bl.subtype == WARP) {
xs = nd->u.warp.xs;
ys = nd->u.warp.ys;
} else {
xs = nd->u.scr.xs;
ys = nd->u.scr.ys;
}
if (m < 0 || xs < 1 || ys < 1)
return;
for (i = 0; i < ys; i++) {
for (j = 0; j < xs; j++) {
if (map_getcell(m, x-xs/2+j, y-ys/2+i, CELL_CHKNOPASS))
continue;
map_setcell(m, x-xs/2+j, y-ys/2+i, CELL_SETNPC);
}
}
}
int npc_unsetcells_sub(struct block_list *bl, va_list ap)
{
struct npc_data *nd = (struct npc_data*)bl;
int id = va_arg(ap,int);
if (nd->bl.id == id) return 0;
npc_setcells(nd);
return 1;
}
void npc_unsetcells(struct npc_data *nd)
{
int m = nd->bl.m, x = nd->bl.x, y = nd->bl.y, xs, ys;
int i,j, x0, x1, y0, y1;
if (nd->bl.subtype == WARP) {
xs = nd->u.warp.xs;
ys = nd->u.warp.ys;
} else {
xs = nd->u.scr.xs;
ys = nd->u.scr.ys;
}
if (m < 0 || xs < 1 || ys < 1)
return;
//Locate max range on which we can localte npce cells
for(x0 = x-xs/2; x0 > 0 && map_getcell(m, x0, y, CELL_CHKNPC); x0--);
for(x1 = x+xs/2-1; x1 < map[m].xs && map_getcell(m, x1, y, CELL_CHKNPC); x1++);
for(y0 = y-ys/2; y0 > 0 && map_getcell(m, x, y0, CELL_CHKNPC); y0--);
for(y1 = y+ys/2-1; y1 < map[m].xs && map_getcell(m, x, y1, CELL_CHKNPC); y1++);
for (i = 0; i < ys; i++) {
for (j = 0; j < xs; j++)
map_setcell(m, x-xs/2+j, y-ys/2+i, CELL_CLRNPC);
}
//Reset NPC cells for other nearby npcs.
map_foreachinarea( npc_unsetcells_sub, m, x0, y0, x1, y1, BL_NPC, nd->bl.id);
}
void npc_movenpc(struct npc_data *nd, int x, int y)
{
const int m = nd->bl.m;
if (m < 0 || nd->bl.prev == NULL) return; //Not on a map.
if (x < 0) x = 0;
else if (x >= map[m].xs) x = map[m].xs-1;
if (y < 0) y = 0;
else if (y >= map[m].ys) y = map[m].ys-1;
npc_unsetcells(nd);
map_foreachinrange(clif_outsight, &nd->bl, AREA_SIZE, BL_PC, &nd->bl);
map_moveblock(&nd->bl, x, y, gettick());
map_foreachinrange(clif_insight, &nd->bl, AREA_SIZE, BL_PC, &nd->bl);
npc_setcells(nd);
}
/*==========================================
* function行解析
*------------------------------------------

View File

@ -54,6 +54,8 @@ int npc_parse_mob2 (struct spawn_data*, int index); // [Wizputer]
int npc_parse_warp(char *w1,char *w2,char *w3,char *w4);
int npc_globalmessage(const char *name,const char *mes);
void npc_setcells(struct npc_data *nd);
void npc_movenpc(struct npc_data *nd, int x, int y);
int npc_enable(const char *name,int flag);
int npc_changename(const char *name, const char *newname, short look); // [Lance]
struct npc_data* npc_name2id(const char *name);

View File

@ -10895,7 +10895,6 @@ BUILDIN_FUNC(movenpc)
TBL_NPC *nd = NULL;
const char *npc;
int x,y;
short m;
npc = conv_str(st,& (st->stack->stack_data[st->start+2]));
x = conv_num(st,& (st->stack->stack_data[st->start+3]));
@ -10904,17 +10903,7 @@ BUILDIN_FUNC(movenpc)
if ((nd = npc_name2id(npc)) == NULL)
return -1;
if ((m=nd->bl.m) < 0 || nd->bl.prev == NULL)
return -1; //Not on a map.
if (x < 0) x = 0;
else if (x >= map[m].xs) x = map[m].xs-1;
if (y < 0) y = 0;
else if (y >= map[m].ys) y = map[m].ys-1;
map_foreachinrange(clif_outsight, &nd->bl, AREA_SIZE, BL_PC, &nd->bl);
map_moveblock(&nd->bl, x, y, gettick());
map_foreachinrange(clif_insight, &nd->bl, AREA_SIZE, BL_PC, &nd->bl);
npc_movenpc(nd, x, y);
return 0;
}