diff options
-rw-r--r-- | conf/msg_athena.conf | 8 | ||||
-rw-r--r-- | doc/atcommands.txt | 13 | ||||
-rw-r--r-- | src/common/mmo.h | 1 | ||||
-rw-r--r-- | src/map/atcommand.c | 86 | ||||
-rw-r--r-- | src/map/storage.c | 13 | ||||
-rw-r--r-- | src/map/storage.h | 1 |
6 files changed, 121 insertions, 1 deletions
diff --git a/conf/msg_athena.conf b/conf/msg_athena.conf index 388f16dc0..7c3a8b8a4 100644 --- a/conf/msg_athena.conf +++ b/conf/msg_athena.conf @@ -1398,5 +1398,13 @@ // atcommand.c::is_atcommand 1393: You can't use commands while dead. +// @clearstorage +1394: Your storage was cleaned. +1395: Your guild storage was cleaned. + +// @clearcart +1396: You do not have a cart to be cleaned. +1397: Your cart was cleaned. + //Custom translations import: conf/import/msg_conf.txt diff --git a/doc/atcommands.txt b/doc/atcommands.txt index cec5685d3..4d233e27f 100644 --- a/doc/atcommands.txt +++ b/doc/atcommands.txt @@ -676,6 +676,19 @@ Deletes all inventory items (not equipped items). --------------------------------------- +@clearstorage +@cleargstorage + +Deletes all items in storage (or guild storage). + +--------------------------------------- + +@clearcart + +Deletes all items in cart, but it will not remove the cart. + +--------------------------------------- + @cleanarea @cleanmap diff --git a/src/common/mmo.h b/src/common/mmo.h index 1e3f74b7d..c067562ea 100644 --- a/src/common/mmo.h +++ b/src/common/mmo.h @@ -253,6 +253,7 @@ struct guild_storage { short storage_status; short storage_amount; struct item items[MAX_GUILD_STORAGE]; + unsigned short lock; }; struct s_pet { diff --git a/src/map/atcommand.c b/src/map/atcommand.c index d115fdffa..2e2ec658f 100644 --- a/src/map/atcommand.c +++ b/src/map/atcommand.c @@ -52,7 +52,7 @@ #define ATCOMMAND_LENGTH 50 #define ACMD_FUNC(x) static int atcommand_ ## x (const int fd, struct map_session_data* sd, const char* command, const char* message) -#define MAX_MSG 1400 +#define MAX_MSG 1500 typedef struct AtCommandInfo AtCommandInfo; @@ -5258,6 +5258,86 @@ ACMD_FUNC(storeall) return 0; } +ACMD_FUNC(clearstorage) +{ + int i, j; + nullpo_retr(-1, sd); + + if (sd->state.storage_flag == 1) { + clif_displaymessage(fd, msg_txt(250)); + return -1; + } + + j = sd->status.storage.storage_amount; + for (i = 0; i < j; ++i) { + storage_delitem(sd, i, sd->status.storage.items[i].amount); + } + storage_storageclose(sd); + + clif_displaymessage(fd, msg_txt(1394)); // Your storage was cleaned. + return 0; +} + +ACMD_FUNC(cleargstorage) +{ + int i, j; + struct guild *g; + struct guild_storage *gstorage; + nullpo_retr(-1, sd); + + g = guild_search(sd->status.guild_id); + + if (g == NULL) { + clif_displaymessage(fd, msg_txt(43)); + return -1; + } + + if (sd->state.storage_flag == 1) { + clif_displaymessage(fd, msg_txt(250)); + return -1; + } + + if (sd->state.storage_flag == 2) { + clif_displaymessage(fd, msg_txt(251)); + return -1; + } + + gstorage = guild2storage2(sd->status.guild_id); + if (gstorage == NULL) {// Doesn't have opened @gstorage yet, so we skip the deletion since *shouldn't* have any item there. + return -1; + } + + j = gstorage->storage_amount; + gstorage->lock = 1; // Lock @gstorage: do not allow any item to be retrieved or stored from any guild member + for (i = 0; i < j; ++i) { + guild_storage_delitem(sd, gstorage, i, gstorage->items[i].amount); + } + storage_guild_storageclose(sd); + gstorage->lock = 0; // Cleaning done, release lock + + clif_displaymessage(fd, msg_txt(1395)); // Your guild storage was cleaned. + return 0; +} + +ACMD_FUNC(clearcart) +{ + nullpo_retr(-1, sd); + + if (pc_iscarton(sd) == 0) { + clif_displaymessage(fd, msg_txt(1396)); // You do not have a cart to be cleaned. + return -1; + } + + if (sd->state.vending == 1) { //Somehow... + return -1; + } + + clif_clearcart(fd); + + clif_displaymessage(fd, msg_txt(1397)); // Your cart was cleaned. + return 0; +} + /*========================================== * @skillid by [MouseJstr] * lookup a skill by name @@ -8739,6 +8819,10 @@ void atcommand_basecommands(void) { ACMD_DEF(item), ACMD_DEF(item2), ACMD_DEF(itemreset), + ACMD_DEF2("clearinventory", itemreset), + ACMD_DEF(clearstorage), + ACMD_DEF(cleargstorage), + ACMD_DEF(clearcart), ACMD_DEF2("blvl", baselevelup), ACMD_DEF2("jlvl", joblevelup), ACMD_DEF(help), diff --git a/src/map/storage.c b/src/map/storage.c index c66f12852..eb7760a0f 100644 --- a/src/map/storage.c +++ b/src/map/storage.c @@ -405,6 +405,9 @@ int storage_guild_storageopen(struct map_session_data* sd) } if(gstor->storage_status) return 1; + + if( gstor->lock ) + return 1; gstor->storage_status = 1; sd->state.storage_flag = 2; @@ -522,6 +525,11 @@ int storage_guild_storageadd(struct map_session_data* sd, int index, int amount) if( amount < 1 || amount > sd->status.inventory[index].amount ) return 0; + + if( stor->lock ) { + storage_guild_storageclose(sd); + return 0; + } if(guild_storage_additem(sd,stor,&sd->status.inventory[index],amount)==0) pc_delitem(sd,index,amount,0,4,LOG_TYPE_GSTORAGE); @@ -555,6 +563,11 @@ int storage_guild_storageget(struct map_session_data* sd, int index, int amount) if(amount < 1 || amount > stor->items[index].amount) return 0; + + if( stor->lock ) { + storage_guild_storageclose(sd); + return 0; + } if((flag = pc_additem(sd,&stor->items[index],amount,LOG_TYPE_GSTORAGE)) == 0) guild_storage_delitem(sd,stor,index,amount); diff --git a/src/map/storage.h b/src/map/storage.h index 5a38d865b..c08ec81cb 100644 --- a/src/map/storage.h +++ b/src/map/storage.h @@ -24,6 +24,7 @@ void do_reconnect_storage(void); void storage_storage_quit(struct map_session_data *sd, int flag); struct guild_storage* guild2storage(int guild_id); +struct guild_storage *guild2storage2(int guild_id); int guild_storage_delete(int guild_id); int storage_guild_storageopen(struct map_session_data *sd); int guild_storage_additem(struct map_session_data *sd,struct guild_storage *stor,struct item *item_data,int amount); |