diff options
Diffstat (limited to 'src/map/clif.c')
-rw-r--r-- | src/map/clif.c | 89 |
1 files changed, 61 insertions, 28 deletions
diff --git a/src/map/clif.c b/src/map/clif.c index 721f5fc37..6bffa5aa4 100644 --- a/src/map/clif.c +++ b/src/map/clif.c @@ -2922,17 +2922,21 @@ static void clif_equipItems(struct map_session_data *sd, enum inventory_type typ static void clif_storageList(struct map_session_data *sd, struct item *items, int items_length) { nullpo_retv(sd); - - clif->inventoryStart(sd, INVTYPE_STORAGE, "Storage"); - if (sd->storage.aggregate > 0) - clif->storageItems(sd, INVTYPE_STORAGE, items, items_length); + const struct storage_settings *stst = storage->get_settings(sd->storage.current); + nullpo_retv(stst); + struct storage_data *stor = storage->ensure(sd, sd->storage.current); + nullpo_retv(stor); + + clif->inventoryStart(sd, INVTYPE_STORAGE, stst->name); + if (stor->aggregate > 0) + clif->storageItems(sd, INVTYPE_STORAGE, items, items_length, stst->name); clif->inventoryEnd(sd, INVTYPE_STORAGE); } static void clif_guildStorageList(struct map_session_data *sd, struct item *items, int items_length) { clif->inventoryStart(sd, INVTYPE_GUILD_STORAGE, "Guild storage"); - clif->storageItems(sd, INVTYPE_GUILD_STORAGE, items, items_length); + clif->storageItems(sd, INVTYPE_GUILD_STORAGE, items, items_length, "Storage"); clif->inventoryEnd(sd, INVTYPE_GUILD_STORAGE); } @@ -2979,10 +2983,11 @@ static void clif_inventoryEnd(struct map_session_data *sd, enum inventory_type t #endif } -static void clif_storageItems(struct map_session_data *sd, enum inventory_type type, struct item *items, int items_length) +static void clif_storageItems(struct map_session_data *sd, enum inventory_type type, struct item *items, int items_length, const char *name) { nullpo_retv(sd); nullpo_retv(items); + nullpo_retv(name); int normal_count = 0, equip_count = 0; for (int i = 0; i < items_length; ++i) { @@ -3004,7 +3009,7 @@ static void clif_storageItems(struct map_session_data *sd, enum inventory_type t storelist_normal.invType = type; #endif #if PACKETVER >= 20120925 && PACKETVER_RE_NUM < 20180829 && PACKETVER_ZERO_NUM < 20180919 && PACKETVER_MAIN_NUM < 20181002 - safestrncpy(storelist_normal.name, "Storage", NAME_LENGTH); + safestrncpy(storelist_normal.name, name, NAME_LENGTH); #endif clif->send(&storelist_normal, storelist_normal.PacketLength, &sd->bl, SELF); @@ -3019,7 +3024,7 @@ static void clif_storageItems(struct map_session_data *sd, enum inventory_type t storelist_equip.invType = type; #endif #if PACKETVER >= 20120925 && PACKETVER_RE_NUM < 20180829 && PACKETVER_ZERO_NUM < 20180919 && PACKETVER_MAIN_NUM < 20181002 - safestrncpy(storelist_equip.name, "Storage", NAME_LENGTH); + safestrncpy(storelist_equip.name, name, NAME_LENGTH); #endif clif->send(&storelist_equip, storelist_equip.PacketLength, &sd->bl, SELF); @@ -3035,7 +3040,7 @@ static void clif_storageItems(struct map_session_data *sd, enum inventory_type t storelist_normal.invType = type; #endif #if PACKETVER >= 20120925 && PACKETVER_RE_NUM < 20180829 && PACKETVER_ZERO_NUM < 20180919 && PACKETVER_MAIN_NUM < 20181002 - safestrncpy(storelist_normal.name, "Storage", NAME_LENGTH); + safestrncpy(storelist_normal.name, name, NAME_LENGTH); #endif clif->send(&storelist_normal, storelist_normal.PacketLength, &sd->bl, SELF); @@ -3050,7 +3055,7 @@ static void clif_storageItems(struct map_session_data *sd, enum inventory_type t storelist_equip.invType = type; #endif #if PACKETVER >= 20120925 && PACKETVER_RE_NUM < 20180829 && PACKETVER_ZERO_NUM < 20180919 && PACKETVER_MAIN_NUM < 20181002 - safestrncpy(storelist_equip.name, "Storage", NAME_LENGTH); + safestrncpy(storelist_equip.name, name, NAME_LENGTH); #endif clif->send(&storelist_equip, storelist_equip.PacketLength, &sd->bl, SELF); @@ -9244,14 +9249,24 @@ static void clif_serviceMessageColor(struct map_session_data *sd, uint32 color, static void clif_refresh_storagewindow(struct map_session_data *sd) { nullpo_retv(sd); + // Notify the client that the storage is open if (sd->state.storage_flag == STORAGE_FLAG_NORMAL) { - if (sd->storage.aggregate > 0) { - storage->sortitem(VECTOR_DATA(sd->storage.item), VECTOR_LENGTH(sd->storage.item)); - } - clif->storageList(sd, VECTOR_DATA(sd->storage.item), VECTOR_LENGTH(sd->storage.item)); - clif->updatestorageamount(sd, sd->storage.aggregate, MAX_STORAGE); + const struct storage_settings* stst = storage->get_settings(sd->storage.current); + nullpo_retv(stst); + + struct storage_data* stor = NULL; + if ((stor = storage->ensure(sd, sd->storage.current)) == NULL) + return; + + if (stor->aggregate > 0) + storage->sortitem(VECTOR_DATA(stor->item), VECTOR_LENGTH(stor->item)); + + clif->storageList(sd, VECTOR_DATA(stor->item), VECTOR_LENGTH(stor->item)); + + clif->updatestorageamount(sd, stor->aggregate, MAX_STORAGE); } + // Notify the client that the gstorage is open otherwise it will // remain locked forever and nobody will be able to access it if (sd->state.storage_flag == STORAGE_FLAG_GUILD) { @@ -9327,7 +9342,12 @@ static void clif_refresh(struct map_session_data *sd) pc->disguise(sd, disguise); } - clif->refresh_storagewindow(sd); + // Close storage when refreshing the client + // to avoid an unnecessary complication of things. + if (sd->state.storage_flag == STORAGE_FLAG_NORMAL) + storage->close(sd); + else if (sd->state.storage_flag == STORAGE_FLAG_GUILD) + gstorage->close(sd); } static void clif_send_selforarea(int fd, struct block_list *bl, const void *buf, int len) @@ -13341,10 +13361,13 @@ static void clif_parse_MoveToKafra(int fd, struct map_session_data *sd) if (item_index < 0 || item_index >= sd->status.inventorySize || item_amount < 1) return; - if (sd->state.storage_flag == STORAGE_FLAG_NORMAL) - storage->add(sd, item_index, item_amount); - else if (sd->state.storage_flag == STORAGE_FLAG_GUILD) + if (sd->state.storage_flag == STORAGE_FLAG_NORMAL) { + struct storage_data *stor = storage->ensure(sd, sd->storage.current); + if (stor != NULL) + storage->add(sd, stor, item_index, item_amount); + } else if (sd->state.storage_flag == STORAGE_FLAG_GUILD) { gstorage->add(sd, item_index, item_amount); + } } static void clif_parse_MoveFromKafra(int fd, struct map_session_data *sd) __attribute__((nonnull (2))); @@ -13359,13 +13382,17 @@ static void clif_parse_MoveFromKafra(int fd, struct map_session_data *sd) int item_index, item_amount; + item_index = RFIFOW(fd,packet_db[RFIFOW(fd,0)].pos[0])-1; item_amount = RFIFOL(fd,packet_db[RFIFOW(fd,0)].pos[1]); - if (sd->state.storage_flag == STORAGE_FLAG_NORMAL) - storage->get(sd, item_index, item_amount); - else if(sd->state.storage_flag == STORAGE_FLAG_GUILD) + if (sd->state.storage_flag == STORAGE_FLAG_NORMAL) { + struct storage_data *stor = storage->ensure(sd, sd->storage.current); + if (stor != NULL) + storage->get(sd, stor, item_index, item_amount); + } else if (sd->state.storage_flag == STORAGE_FLAG_GUILD) { gstorage->get(sd, item_index, item_amount); + } } static void clif_parse_MoveToKafraFromCart(int fd, struct map_session_data *sd) __attribute__((nonnull (2))); @@ -13378,10 +13405,13 @@ static void clif_parse_MoveToKafraFromCart(int fd, struct map_session_data *sd) if (!pc_iscarton(sd)) return; - if (sd->state.storage_flag == STORAGE_FLAG_NORMAL) - storage->addfromcart(sd, RFIFOW(fd,2) - 2, RFIFOL(fd,4)); - else if (sd->state.storage_flag == STORAGE_FLAG_GUILD) + if (sd->state.storage_flag == STORAGE_FLAG_NORMAL) { + struct storage_data *stor = storage->ensure(sd, sd->storage.current); + if (stor != NULL) + storage->addfromcart(sd, stor, RFIFOW(fd, 2) - 2, RFIFOL(fd, 4)); + } else if (sd->state.storage_flag == STORAGE_FLAG_GUILD) { gstorage->addfromcart(sd, RFIFOW(fd,2) - 2, RFIFOL(fd,4)); + } } static void clif_parse_MoveFromKafraToCart(int fd, struct map_session_data *sd) __attribute__((nonnull (2))); @@ -13394,10 +13424,13 @@ static void clif_parse_MoveFromKafraToCart(int fd, struct map_session_data *sd) if (!pc_iscarton(sd)) return; - if (sd->state.storage_flag == STORAGE_FLAG_NORMAL) - storage->gettocart(sd, RFIFOW(fd,2)-1, RFIFOL(fd,4)); - else if (sd->state.storage_flag == STORAGE_FLAG_GUILD) + if (sd->state.storage_flag == STORAGE_FLAG_NORMAL) { + struct storage_data *stor = storage->ensure(sd, sd->storage.current); + if (stor != NULL) + storage->gettocart(sd, stor, RFIFOW(fd,2) - 1, RFIFOL(fd, 4)); + } else if (sd->state.storage_flag == STORAGE_FLAG_GUILD) { gstorage->gettocart(sd, RFIFOW(fd,2)-1, RFIFOL(fd,4)); + } } static void clif_parse_CloseKafra(int fd, struct map_session_data *sd) __attribute__((nonnull (2))); |