From 74a30ea8d414cec9fba211298c72b2a686b0582a Mon Sep 17 00:00:00 2001 From: Lance Date: Sat, 1 Apr 2006 09:37:50 +0000 Subject: Fixed the dynamic shop system memory allocation and id_db problem. Added sample script. git-svn-id: https://rathena.svn.sourceforge.net/svnroot/rathena/trunk@5842 54d463be-8e91-2dee-dedb-b68131a5f0ec --- npc/sample/npc_dynamic_shop.txt | 84 +++++++++++++++++++++++++++++++++++++++++ npc/scripts_custom.conf | 1 + src/map/clif.c | 9 ++--- src/map/npc.c | 4 +- src/map/script.c | 4 +- 5 files changed, 94 insertions(+), 8 deletions(-) create mode 100644 npc/sample/npc_dynamic_shop.txt diff --git a/npc/sample/npc_dynamic_shop.txt b/npc/sample/npc_dynamic_shop.txt new file mode 100644 index 000000000..59e76c72c --- /dev/null +++ b/npc/sample/npc_dynamic_shop.txt @@ -0,0 +1,84 @@ +- shop dyn_shop1 -1,501:50 + +prontera.gat,181,200,4 script Dynamic Shop 123,{ +callshop "dyn_shop1",0; +end; + +OnSellItem: +for(set @i, 0; @i < getarraysize(@sold_nameid); set @i, @i + 1){ + if(countitem(@sold_nameid[@i]) < @sold_quantity[@i] || @sold_quantity[@i] <= 0){ + mes "omgh4x!"; + end; + } + if(@sold_nameid[@i] == 501){ + set $@rpotsleft, $@rpotsleft + @sold_quantity[@i]; + set Zeny, Zeny + @sold_quantity[@i]*20; + delitem 501, @sold_quantity[@i]; + } else { + if(@sold_nameid[@i] == 502){ + set $@opotsleft, $@opotsleft + @sold_quantity[@i]; + set Zeny, Zeny + @sold_quantity[@i]*100; + delitem 502, @sold_quantity[@i]; + } else { + mes "Sorry, I don't need your items."; + } + } +} +deletearray @sold_quantity, getarraysize(@sold_quantity); +deletearray @sold_nameid, getarraysize(@sold_nameid); +mes "Deal completed."; +close; + +OnBuyItem: +for(set @i, 0; @i < getarraysize(@bought_nameid); set @i, @i + 1){ + if(@bought_quantity[@i] <= 0){ + mes "omgh4x!"; + end; + } + if(@bought_nameid[@i] == 501){ + if(@bought_quantity[@i] > $@rpotsleft){ + if($@rpotsleft > 0){ + set @bought_quantity[@i], $@rpotsleft; + } else { + mes "We are out of red potions!"; + close; + } + } + if(Zeny >= 40*@bought_quantity[@i]){ + set Zeny, Zeny - 40*@bought_quantity[@i]; + getitem 501, @bought_quantity[@i]; + set $@rpotsleft, $@rpotsleft - @bought_quantity[@i]; + } else { + mes "You have insufficient cash."; + close; + } + } else { + if(@bought_quantity[@i] > $@opotsleft){ + if($@opotsleft > 0){ + set @bought_quantity[@i], $@opotsleft; + } else { + mes "We are out of orange potions!"; + close; + } + } + if(Zeny >= 200*@bought_quantity[@i]){ + set Zeny, Zeny - 200*@bought_quantity[@i]; + getitem 502, @bought_quantity[@i]; + set $@opotsleft, $@opotsleft - @bought_quantity[@i]; + } else { + mes "You have insufficient cash."; + close; + } + } +} +deletearray @bought_quantity, getarraysize(@bought_quantity); +deletearray @bought_nameid, getarraysize(@bought_nameid); +mes "Trade done."; +close; + +OnInit: +npcshopitem "dyn_shop1", 501,40,502,200; +set $@rpotsleft, 10; +set $@opotsleft, 10; +end; +} \ No newline at end of file diff --git a/npc/scripts_custom.conf b/npc/scripts_custom.conf index 083d50fb8..2bcecceb6 100644 --- a/npc/scripts_custom.conf +++ b/npc/scripts_custom.conf @@ -89,6 +89,7 @@ npc: npc/custom/adoption.txt //npc: npc/custom/Lance/FR_HallOfFame.c //npc: npc/custom/Lance/FR_WeatherController.c //npc: npc/custom/Lance/FR_MailSystem.c +//npc: npc/custom/sample/npc_dynamic_shop.txt // -------------------------------------------------------------- // -------------------------------------------------------------- diff --git a/src/map/clif.c b/src/map/clif.c index 9ce77129d..1f51506b1 100644 --- a/src/map/clif.c +++ b/src/map/clif.c @@ -8974,7 +8974,6 @@ void clif_parse_NpcBuyListSend(int fd,struct map_session_data *sd) n = (RFIFOW(fd,2)-4) /4; item_list = (unsigned short*)RFIFOP(fd,4); - if (sd->trade_partner || !sd->npc_shopid){ fail = 1; }else{ @@ -8983,8 +8982,8 @@ void clif_parse_NpcBuyListSend(int fd,struct map_session_data *sd) for(i=0;inpc_shopid))->master_nd)){ sprintf(npc_ev, "%s::OnSellItem", nd->exname); for(i=0;istatus.inventory[item_list[i*2]-2].nameid); + setd_sub(sd, "@sold_quantity", i, (void *)item_list[i*2+1]); } + npc_event(sd, npc_ev, 0); fail = 0; }else{ fail = npc_selllist(sd,n,item_list); diff --git a/src/map/npc.c b/src/map/npc.c index d1a35ff61..eaed2bdee 100644 --- a/src/map/npc.c +++ b/src/map/npc.c @@ -2766,14 +2766,14 @@ int do_init_npc(void) return 0; } // [Lance] - int npc_changename(const char *name, const char *newname, short look){ +int npc_changename(const char *name, const char *newname, short look){ struct npc_data *nd= (struct npc_data *) strdb_remove(npcname_db,(unsigned char*)name); if (nd==NULL) return 0; npc_enable(name,0); strcpy(nd->name,newname); nd->class_ = look; - strdb_put(npcname_db,nd->name,nd); npc_enable(newname,1); return 0; } + diff --git a/src/map/script.c b/src/map/script.c index fdae52784..204922fa5 100644 --- a/src/map/script.c +++ b/src/map/script.c @@ -9871,7 +9871,9 @@ int buildin_npcshopitem(struct script_state *st) } nd = (struct npc_data *)aRealloc(nd,sizeof(struct npc_data) + - sizeof(nd->u.shop_item[0]) * n); + sizeof(nd->u.shop_item[0]) * (n+1)); + + map_addiddb(&nd->bl); nd->master_nd = ((struct npc_data *)map_id2bl(st->oid)); } else { -- cgit v1.2.3-70-g09d2