diff options
author | Andrei Karas <akaras@inbox.ru> | 2019-01-14 17:17:06 +0000 |
---|---|---|
committer | GitHub <noreply@github.com> | 2019-01-14 17:17:06 +0000 |
commit | 2a471f2f94cf31f3b36e33dcb438fc41754554da (patch) | |
tree | c7f14d25c552acba5fc946bb56bc6642acc5d15e | |
parent | 9148085c96cc4b9273959ca8c596eeb8bba1f55b (diff) | |
parent | 14d89f00e32cc2b21c53b66a41d4564fd1a0d3aa (diff) | |
download | hercules-2a471f2f94cf31f3b36e33dcb438fc41754554da.tar.gz hercules-2a471f2f94cf31f3b36e33dcb438fc41754554da.tar.bz2 hercules-2a471f2f94cf31f3b36e33dcb438fc41754554da.tar.xz hercules-2a471f2f94cf31f3b36e33dcb438fc41754554da.zip |
Merge pull request #2337 from 4144/fixitemdb
Fix item db with item id bigger than 65535
-rw-r--r-- | src/map/itemdb.c | 32 | ||||
-rw-r--r-- | src/map/itemdb.h | 1 |
2 files changed, 33 insertions, 0 deletions
diff --git a/src/map/itemdb.c b/src/map/itemdb.c index 5e447d4c0..03f0fdc06 100644 --- a/src/map/itemdb.c +++ b/src/map/itemdb.c @@ -1700,7 +1700,12 @@ static int itemdb_validate_entry(struct item_data *entry, int n, const char *sou nullpo_ret(entry); nullpo_ret(source); +#if PACKETVER_MAIN_NUM >= 20181121 || PACKETVER_RE_NUM >= 20180704 || PACKETVER_ZERO_NUM >= 20181114 if (entry->nameid <= 0 || entry->nameid > MAX_ITEM_ID) { +#else + if (entry->nameid <= 0) { +#endif + // item id wrong for any packet versions ShowWarning("itemdb_validate_entry: Invalid item ID %d in entry %d of '%s', allowed values 0 < ID < %d (MAX_ITEM_ID), skipping.\n", entry->nameid, n, source, MAX_ITEM_ID); if (entry->script) { @@ -1716,7 +1721,14 @@ static int itemdb_validate_entry(struct item_data *entry, int n, const char *sou entry->unequip_script = NULL; } return 0; +#if PACKETVER_MAIN_NUM >= 20181121 || PACKETVER_RE_NUM >= 20180704 || PACKETVER_ZERO_NUM >= 20181114 } +#else + } else if (entry->nameid > MAX_ITEM_ID) { + // item id too big for packet version before item id in 4 bytes + entry->view_id = UNKNOWN_ITEM_ID; + } +#endif { const char *c = entry->name; @@ -2434,6 +2446,8 @@ static void itemdb_read(bool minimal) } } + itemdb->other->foreach(itemdb->other, itemdb->addname_sub); + if (minimal) return; @@ -2448,6 +2462,23 @@ static void itemdb_read(bool minimal) } /** + * Add item name with high id into map + * @see DBApply + */ +static int itemdb_addname_sub(union DBKey key, struct DBData *data, va_list ap) +{ + struct item_data *item = DB->data2ptr(data); + struct DBData prev; + + if (itemdb->names->put(itemdb->names, DB->str2key(item->name), DB->ptr2data(item), &prev)) { + struct item_data *oldItem = DB->data2ptr(&prev); + ShowError("itemdb_read: duplicate AegisName '%s' in item ID %d and %d\n", item->name, item->nameid, oldItem->nameid); + } + + return 0; +} + +/** * retrieves item_combo data by combo id **/ static struct item_combo *itemdb_id2combo(int id) @@ -2789,4 +2820,5 @@ void itemdb_defaults(void) itemdb->is_item_usable = itemdb_is_item_usable; itemdb->lookup_const = itemdb_lookup_const; itemdb->lookup_const_mask = itemdb_lookup_const_mask; + itemdb->addname_sub = itemdb_addname_sub; } diff --git a/src/map/itemdb.h b/src/map/itemdb.h index 0c08efbeb..315787993 100644 --- a/src/map/itemdb.h +++ b/src/map/itemdb.h @@ -683,6 +683,7 @@ struct itemdb_interface { bool (*is_item_usable) (struct item_data *item); bool (*lookup_const) (const struct config_setting_t *it, const char *name, int *value); bool (*lookup_const_mask) (const struct config_setting_t *it, const char *name, int *value); + int (*addname_sub) (union DBKey key, struct DBData *data, va_list ap); }; #ifdef HERCULES_CORE |