/** * This file is part of Hercules. * http://herc.ws - http://github.com/HerculesWS/Hercules * * Copyright (C) 2012-2018 Hercules Dev Team * Copyright (C) Athena Dev Teams * * Hercules is free software: you can redistribute it and/or modify * it under the terms of the GNU General Public License as published by * the Free Software Foundation, either version 3 of the License, or * (at your option) any later version. * * This program is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the * GNU General Public License for more details. * * You should have received a copy of the GNU General Public License * along with this program. If not, see . */ #ifndef MAP_ITEMDB_H #define MAP_ITEMDB_H /* #include "map/map.h" */ #include "common/hercules.h" #include "common/db.h" #include "common/mmo.h" // ITEM_NAME_LENGTH struct config_setting_t; struct script_code; struct hplugin_data_store; /** * Defines **/ #ifndef MAX_ITEMDB #define MAX_ITEMDB 0xFFFF #endif #ifndef MAX_ITEM_ID #if PACKETVER_MAIN_NUM >= 20181121 || PACKETVER_RE_NUM >= 20180704 || PACKETVER_ZERO_NUM >= 20181114 #define MAX_ITEM_ID INT32_MAX #else #define MAX_ITEM_ID 0xFFFF #endif #endif #ifndef MAX_ITEMDELAYS #define MAX_ITEMDELAYS 10 // The maximum number of item delays #endif #ifndef MAX_SEARCH #define MAX_SEARCH 5 //Designed for search functions, species max number of matches to display. #endif #ifndef MAX_ITEMS_PER_COMBO #define MAX_ITEMS_PER_COMBO 6 /* maximum amount of items a combo may require */ #endif #define CARD0_FORGE 0x00FF #define CARD0_CREATE 0x00FE #define CARD0_PET ((short)0xFF00) //Marks if the card0 given is "special" (non-item id used to mark pets/created items. [Skotlex] #define itemdb_isspecial(i) ((i) == CARD0_FORGE || (i) == CARD0_CREATE || (i) == CARD0_PET) #ifndef UNKNOWN_ITEM_ID //Use apple for unknown items. #define UNKNOWN_ITEM_ID 512 #endif #if MAX_ITEM_ID < MAX_ITEMDB #error "MAX_ITEM_ID must be bigger or same with MAX_ITEMDB" #endif #if MAX_ITEM_ID > 0xFFFF && PACKETVER_MAIN_NUM < 20181121 && PACKETVER_RE_NUM < 20180704 && PACKETVER_ZERO_NUM < 20181114 #error "For clients before 20181121 Main and 20180704 RE and 20181114 zero, MAX_ITEM_ID must be smaller than 0x10000" #endif enum item_itemid { ITEMID_RED_POTION = 501, ITEMID_YELLOW_POTION = 503, ITEMID_WHITE_POTION = 504, ITEMID_BLUE_POTION = 505, ITEMID_APPLE = 512, ITEMID_CARROT = 515, ITEMID_HOLY_WATER = 523, ITEMID_PUMPKIN = 535, ITEMID_RED_SLIM_POTION = 545, ITEMID_YELLOW_SLIM_POTION = 546, ITEMID_WHITE_SLIM_POTION = 547, ITEMID_WING_OF_FLY = 601, ITEMID_WING_OF_BUTTERFLY = 602, ITEMID_BRANCH_OF_DEAD_TREE = 604, ITEMID_ANODYNE = 605, ITEMID_ALOEBERA = 606, ITEMID_SPECTACLES = 611, ITEMID_POISON_BOTTLE = 678, ITEMID_EMPTY_BOTTLE = 713, ITEMID_EMPERIUM = 714, ITEMID_YELLOW_GEMSTONE = 715, ITEMID_RED_GEMSTONE = 716, ITEMID_BLUE_GEMSTONE = 717, ITEMID_ORIDECON_STONE = 756, ITEMID_ALCHOL = 970, ITEMID_ORIDECON = 984, ITEMID_ANVIL = 986, ITEMID_ORIDECON_ANVIL = 987, ITEMID_GOLDEN_ANVIL = 988, ITEMID_EMPERIUM_ANVIL = 989, ITEMID_BOODY_RED = 990, ITEMID_CRYSTAL_BLUE = 991, ITEMID_WIND_OF_VERDURE = 992, ITEMID_YELLOW_LIVE = 993, ITEMID_FLAME_HEART = 994, ITEMID_MISTIC_FROZEN = 995, ITEMID_ROUGH_WIND = 996, ITEMID_GREAT_NATURE = 997, ITEMID_IRON = 998, ITEMID_STEEL = 999, ITEMID_STAR_CRUMB = 1000, ITEMID_IRON_ORE = 1002, ITEMID_PHRACON = 1010, ITEMID_EMVERETARCON = 1011, ITEMID_BOOBY_TRAP = 1065, ITEMID_PILEBUNCKER = 1549, ITEMID_ANGRA_MANYU = 1599, ITEMID_STRANGE_EMBRYO = 6415, ITEMID_FACE_PAINT = 6120, ITEMID_SCARLET_PTS = 6360, ITEMID_INDIGO_PTS = 6361, ITEMID_YELLOW_WISH_PTS = 6362, ITEMID_LIME_GREEN_PTS = 6363, ITEMID_BLACKSMITH_BLESSING = 6635, ITEMID_STONE = 7049, ITEMID_FIRE_BOTTLE = 7135, ITEMID_ACID_BOTTLE = 7136, ITEMID_MENEATER_PLANT_BOTTLE = 7137, ITEMID_MINI_BOTTLE = 7138, ITEMID_COATING_BOTTLE = 7139, ITEMID_FRAGMENT_OF_CRYSTAL = 7321, ITEMID_SKULL_ = 7420, ITEMID_SPECIAL_ALLOY_TRAP = 7940, ITEMID_CATNIP_FRUIT = 11602, ITEMID_RED_POUCH_OF_SURPRISE = 12024, ITEMID_BLOODY_DEAD_BRANCH = 12103, ITEMID_PORING_BOX = 12109, ITEMID_MERCENARY_RED_POTION = 12184, ITEMID_MERCENARY_BLUE_POTION = 12185, ITEMID_BATTLE_MANUAL = 12208, ITEMID_BUBBLE_GUM = 12210, ITEMID_GIANT_FLY_WING = 12212, ITEMID_NEURALIZER = 12213, ITEMID_M_CENTER_POTION = 12241, ITEMID_M_AWAKENING_POTION = 12242, ITEMID_M_BERSERK_POTION = 12243, ITEMID_COMP_BATTLE_MANUAL = 12263, ITEMID_COMP_BUBBLE_GUM = 12264, ITEMID_LOVE_ANGEL = 12287, ITEMID_SQUIRREL = 12288, ITEMID_GOGO = 12289, ITEMID_PICTURE_DIARY = 12304, ITEMID_MINI_HEART = 12305, ITEMID_NEWCOMER = 12306, ITEMID_KID = 12307, ITEMID_MAGIC_CASTLE = 12308, ITEMID_BULGING_HEAD = 12309, ITEMID_THICK_MANUAL50 = 12312, ITEMID_N_FLY_WING = 12323, ITEMID_N_BUTTERFLY_WING = 12324, ITEMID_N_MAGNIFIER = 12325, ITEMID_ANSILA = 12333, ITEMID_REPAIRA = 12392, ITEMID_REPAIRB = 12393, ITEMID_REPAIRC = 12394, ITEMID_BLACK_THING = 12435, ITEMID_BOARDING_HALTER = 12622, ITEMID_NOBLE_NAMEPLATE = 12705, ITEMID_POISON_PARALYSIS = 12717, ITEMID_POISON_LEECH = 12718, ITEMID_POISON_OBLIVION = 12719, ITEMID_POISON_CONTAMINATION = 12720, ITEMID_POISON_NUMB = 12721, ITEMID_POISON_FEVER = 12722, ITEMID_POISON_LAUGHING = 12723, ITEMID_POISON_FATIGUE = 12724, ITEMID_NAUTHIZ = 12725, ITEMID_RAIDO = 12726, ITEMID_BERKANA = 12727, ITEMID_ISA = 12728, ITEMID_OTHILA = 12729, ITEMID_URUZ = 12730, ITEMID_THURISAZ = 12731, ITEMID_WYRD = 12732, ITEMID_HAGALAZ = 12733, ITEMID_C_WING_OF_FLY = 12887, ITEMID_DUN_TELE_SCROLL1 = 14527, ITEMID_BATTLE_MANUAL25 = 14532, ITEMID_BATTLE_MANUAL100 = 14533, ITEMID_BATTLE_MANUAL_X3 = 14545, ITEMID_DUN_TELE_SCROLL2 = 14581, ITEMID_WOB_RUNE = 14582, ITEMID_WOB_SCHWALTZ = 14583, ITEMID_WOB_RACHEL = 14584, ITEMID_WOB_LOCAL = 14585, ITEMID_SIEGE_TELEPORT_SCROLL = 14591, ITEMID_JOB_MANUAL50 = 14592, ITEMID_PILEBUNCKER_S = 16030, ITEMID_PILEBUNCKER_P = 16031, ITEMID_PILEBUNCKER_T = 16032, ITEMID_LUX_ANIMA = 22540, }; enum cards_item_list { ITEMID_GHOSTRING_CARD = 4047, ITEMID_PHREEONI_CARD = 4121, ITEMID_MISTRESS_CARD = 4132, ITEMID_ORC_LOAD_CARD = 4135, ITEMID_ORC_HERO_CARD = 4143, ITEMID_TAO_GUNKA_CARD = 4302, }; /** * Mechanic **/ enum mechanic_item_list { ITEMID_ACCELERATOR = 2800, ITEMID_HOVERING_BOOSTER, // 2801 ITEMID_SUICIDAL_DEVICE, // 2802 ITEMID_SHAPE_SHIFTER, // 2803 ITEMID_COOLING_DEVICE, // 2804 ITEMID_MAGNETIC_FIELD_GENERATOR, // 2805 ITEMID_BARRIER_BUILDER, // 2806 ITEMID_REPAIR_KIT, // 2807 ITEMID_CAMOUFLAGE_GENERATOR, // 2808 ITEMID_HIGH_QUALITY_COOLER, // 2809 ITEMID_SPECIAL_COOLER, // 2810 ITEMID_MONKEY_SPANNER = 6186, }; /** * Spell Books */ enum spell_book_item_list { ITEMID_MAGIC_BOOK_FB = 6189, ITEMID_MAGIC_BOOK_CB, // 6190 ITEMID_MAGIC_BOOK_LB, // 6191 ITEMID_MAGIC_BOOK_SG, // 6192 ITEMID_MAGIC_BOOK_LOV, // 6193 ITEMID_MAGIC_BOOK_MS, // 6194 ITEMID_MAGIC_BOOK_CM, // 6195 ITEMID_MAGIC_BOOK_TV, // 6196 ITEMID_MAGIC_BOOK_TS, // 6197 ITEMID_MAGIC_BOOK_JT, // 6198 ITEMID_MAGIC_BOOK_WB, // 6199 ITEMID_MAGIC_BOOK_HD, // 6200 ITEMID_MAGIC_BOOK_ES, // 6201 ITEMID_MAGIC_BOOK_ES_, // 6202 ITEMID_MAGIC_BOOK_CL, // 6203 ITEMID_MAGIC_BOOK_CR, // 6204 ITEMID_MAGIC_BOOK_DL, // 6205 }; /** * Mercenary Scrolls */ enum mercenary_scroll_item_list { ITEMID_BOW_MERCENARY_SCROLL1 = 12153, ITEMID_BOW_MERCENARY_SCROLL2, // 12154 ITEMID_BOW_MERCENARY_SCROLL3, // 12155 ITEMID_BOW_MERCENARY_SCROLL4, // 12156 ITEMID_BOW_MERCENARY_SCROLL5, // 12157 ITEMID_BOW_MERCENARY_SCROLL6, // 12158 ITEMID_BOW_MERCENARY_SCROLL7, // 12159 ITEMID_BOW_MERCENARY_SCROLL8, // 12160 ITEMID_BOW_MERCENARY_SCROLL9, // 12161 ITEMID_BOW_MERCENARY_SCROLL10, // 12162 ITEMID_SWORDMERCENARY_SCROLL1, // 12163 ITEMID_SWORDMERCENARY_SCROLL2, // 12164 ITEMID_SWORDMERCENARY_SCROLL3, // 12165 ITEMID_SWORDMERCENARY_SCROLL4, // 12166 ITEMID_SWORDMERCENARY_SCROLL5, // 12167 ITEMID_SWORDMERCENARY_SCROLL6, // 12168 ITEMID_SWORDMERCENARY_SCROLL7, // 12169 ITEMID_SWORDMERCENARY_SCROLL8, // 12170 ITEMID_SWORDMERCENARY_SCROLL9, // 12171 ITEMID_SWORDMERCENARY_SCROLL10, // 12172 ITEMID_SPEARMERCENARY_SCROLL1, // 12173 ITEMID_SPEARMERCENARY_SCROLL2, // 12174 ITEMID_SPEARMERCENARY_SCROLL3, // 12175 ITEMID_SPEARMERCENARY_SCROLL4, // 12176 ITEMID_SPEARMERCENARY_SCROLL5, // 12177 ITEMID_SPEARMERCENARY_SCROLL6, // 12178 ITEMID_SPEARMERCENARY_SCROLL7, // 12179 ITEMID_SPEARMERCENARY_SCROLL8, // 12180 ITEMID_SPEARMERCENARY_SCROLL9, // 12181 ITEMID_SPEARMERCENARY_SCROLL10, // 12182 }; /** * Geneticist */ enum geneticist_item_list { /// Pharmacy / Cooking ITEMID_SEED_OF_HORNY_PLANT = 6210, ITEMID_BLOODSUCK_PLANT_SEED, // 6211 ITEMID_BOMB_MUSHROOM_SPORE, // 6212 ITEMID_HP_INCREASE_POTIONS = 12422, ITEMID_HP_INCREASE_POTIONM, // 12423 ITEMID_HP_INCREASE_POTIONL, // 12424 ITEMID_SP_INCREASE_POTIONS, // 12425 ITEMID_SP_INCREASE_POTIONM, // 12426 ITEMID_SP_INCREASE_POTIONL, // 12427 ITEMID_ENRICH_WHITE_POTIONZ, // 12428 ITEMID_SAVAGE_BBQ, // 12429 ITEMID_WUG_BLOOD_COCKTAIL, // 12430 ITEMID_MINOR_BRISKET, // 12431 ITEMID_SIROMA_ICETEA, // 12432 ITEMID_DROCERA_HERB_STEW, // 12433 ITEMID_PETTI_TAIL_NOODLE, // 12434 ITEMID_VITATA500, // 12436 ITEMID_ENRICH_CELERMINE_JUICE, // 12437 ITEMID_CURE_FREE, // 12475 /// Bombs ITEMID_APPLE_BOMB = 13260, ITEMID_COCONUT_BOMB, // 13261 ITEMID_MELON_BOMB, // 13262 ITEMID_PINEAPPLE_BOMB, // 13263 ITEMID_BANANA_BOMB, // 13264 ITEMID_BLACK_LUMP, // 13265 ITEMID_BLACK_HARD_LUMP, // 13266 ITEMID_VERY_HARD_LUMP, // 13267 /// Throwables ITEMID_MYSTERIOUS_POWDER, // 13268 ITEMID_BOOST500_TO_THROW, // 13269 ITEMID_FULL_SWINGK_TO_THROW, // 13270 ITEMID_MANA_PLUS_TO_THROW, // 13271 ITEMID_CURE_FREE_TO_THROW, // 13272 ITEMID_STAMINA_UP_M_TO_THROW, // 13273 ITEMID_DIGESTIVE_F_TO_THROW, // 13274 ITEMID_HP_INC_POTS_TO_THROW, // 13275 ITEMID_HP_INC_POTM_TO_THROW, // 13276 ITEMID_HP_INC_POTL_TO_THROW, // 13277 ITEMID_SP_INC_POTS_TO_THROW, // 13278 ITEMID_SP_INC_POTM_TO_THROW, // 13279 ITEMID_SP_INC_POTL_TO_THROW, // 13280 ITEMID_EN_WHITE_POTZ_TO_THROW, // 13281 ITEMID_VITATA500_TO_THROW, // 13282 ITEMID_EN_CEL_JUICE_TO_THROW, // 13283 ITEMID_SAVAGE_BBQ_TO_THROW, // 13284 ITEMID_WUG_COCKTAIL_TO_THROW, // 13285 ITEMID_M_BRISKET_TO_THROW, // 13286 ITEMID_SIROMA_ICETEA_TO_THROW, // 13287 ITEMID_DROCERA_STEW_TO_THROW, // 13288 ITEMID_PETTI_NOODLE_TO_THROW, // 13289 ITEMID_BLACK_THING_TO_THROW, // 13290 }; // enum e_chain_cache { ECC_ORE, ECC_SIEGFRIED, ECC_NEO_INSURANCE, /* */ ECC_MAX, }; enum item_class_upper { ITEMUPPER_NONE = 0x00, ITEMUPPER_NORMAL = 0x01, ITEMUPPER_UPPER = 0x02, ITEMUPPER_BABY = 0x04, ITEMUPPER_THIRD = 0x08, ITEMUPPER_THIRDUPPER = 0x10, ITEMUPPER_THIRDBABY = 0x20, ITEMUPPER_ALL = 0x3f, // Sum of all the above }; /** * Item Trade restrictions */ enum ItemTradeRestrictions { ITR_NONE = 0x000, ///< No restrictions ITR_NODROP = 0x001, ///< Item can't be dropped ITR_NOTRADE = 0x002, ///< Item can't be traded (nor vended) ITR_PARTNEROVERRIDE = 0x004, ///< Wedded partner can override ITR_NOTRADE restriction ITR_NOSELLTONPC = 0x008, ///< Item can't be sold to NPCs ITR_NOCART = 0x010, ///< Item can't be placed in the cart ITR_NOSTORAGE = 0x020, ///< Item can't be placed in the storage ITR_NOGSTORAGE = 0x040, ///< Item can't be placed in the guild storage ITR_NOMAIL = 0x080, ///< Item can't be attached to mail messages ITR_NOAUCTION = 0x100, ///< Item can't be auctioned ITR_ALL = 0x1ff ///< Sum of all the above values }; /** * Item No-use restrictions */ enum ItemNouseRestrictions { INR_NONE = 0x0, ///< No restrictions INR_SITTING = 0x1, ///< Item can't be used while sitting INR_ALL = 0x1 ///< Sum of all the above values }; /** * Item Option Types */ enum ItemOptionTypes { IT_OPT_INDEX = 0, IT_OPT_VALUE, IT_OPT_PARAM, IT_OPT_MAX }; /** * Item name search flags **/ enum item_name_search_flag { IT_SEARCH_NAME_PARTIAL, IT_SEARCH_NAME_EXACT, IT_SEARCH_NAME_MAX, }; /** Convenience item list (entry) used in various functions */ struct itemlist_entry { int id; ///< Item ID or (inventory) index int amount; ///< Amount }; /** Convenience item list used in various functions */ VECTOR_STRUCT_DECL(itemlist, struct itemlist_entry); struct item_combo { struct script_code *script; int nameid[MAX_ITEMS_PER_COMBO];/* nameid array */ unsigned char count; int id; /* id of this combo */ }; struct item_group { int id; int *nameid; unsigned short qty; }; struct item_chain_entry { int id; unsigned short rate; struct item_chain_entry *next; }; struct item_chain { struct item_chain_entry *items; unsigned short qty; }; struct item_package_rand_entry { int id; unsigned short qty; unsigned short rate; unsigned short hours; unsigned int announce : 1; unsigned int named : 1; unsigned int force_serial: 1; struct item_package_rand_entry *next; }; struct item_package_must_entry { int id; unsigned short qty; unsigned short hours; unsigned int announce : 1; unsigned int named : 1; unsigned int force_serial : 1; }; struct item_package_rand_group { struct item_package_rand_entry *random_list; unsigned short random_qty; }; struct item_package { int id; struct item_package_rand_group *random_groups; struct item_package_must_entry *must_items; unsigned short random_qty; unsigned short must_qty; }; struct itemdb_option { int16 index; struct script_code *script; }; struct item_lapineddukddak { int16 NeedCount; int8 NeedRefineMin; int8 NeedRefineMax; VECTOR_DECL(struct itemlist_entry) SourceItems; struct script_code *script; }; struct item_data { int nameid; char name[ITEM_NAME_LENGTH],jname[ITEM_NAME_LENGTH]; int value_buy; int value_sell; int type; int subtype; int maxchance; //For logs, for external game info, for scripts: Max drop chance of this item (e.g. 0.01% , etc.. if it = 0, then monsters don't drop it, -1 denotes items sold in shops only) [Lupus] int sex; int equip; int weight; int atk; int def; int range; int slot; int view_sprite; int elv; int wlv; int view_id; int matk; int elvmax;/* maximum level for this item */ int dropeffectmode; int delay; uint64 class_base[3]; ///< Specifies if the base can wear this item (split in 3 indexes per type: 1-1, 2-1, 2-2) unsigned class_upper : 6; ///< Specifies if the upper-type can equip it (bitfield, 0x01: normal, 0x02: upper, 0x04: baby normal, 0x08: third normal, 0x10: third upper, 0x20: third baby) struct { unsigned short chance; int id; } mob[MAX_SEARCH]; ///< Holds the mobs that have the highest drop rate for this item. [Skotlex] struct script_code *script; ///< Default script for everything. struct script_code *equip_script; ///< Script executed once when equipping. struct script_code *unequip_script; ///< Script executed once when unequipping. struct script_code *rental_start_script; ///< Script executed once this item get rented struct script_code *rental_end_script; ///< Script executed once this item rent ends struct { unsigned available : 1; unsigned no_refine : 1; // [celest] unsigned delay_consume : 1; ///< Signifies items that are not consumed immediately upon double-click [Skotlex] unsigned trade_restriction : 9; ///< Item trade restrictions mask (@see enum ItemTradeRestrictions) unsigned autoequip : 1; unsigned auto_favorite : 1; unsigned buyingstore : 1; unsigned bindonequip : 1; unsigned keepafteruse : 1; unsigned force_serial : 1; unsigned no_options: 1; // < disallows use of item options on the item. (non-equippable items are automatically flagged) [Smokexyz] unsigned drop_announce : 1; // Official Drop Announce [Jedzkie] unsigned showdropeffect: 1; // < Allow showing effect on item drop [Asheraf] } flag; struct {// item stacking limitation unsigned int amount; unsigned int inventory:1; unsigned int cart:1; unsigned int storage:1; unsigned int guildstorage:1; } stack; struct { unsigned int flag; ///< Item nouse restriction mask (@see enum ItemNouseRestrictions) unsigned short override; } item_usage; short gm_lv_trade_override; ///< GM-level to override trade_restriction /* bugreport:309 */ struct item_combo **combos; unsigned char combos_count; /* TODO add a pointer to some sort of (struct extra) and gather all the not-common vals into it to save memory */ struct item_group *group; struct item_package *package; struct item_lapineddukddak *lapineddukddak; struct hplugin_data_store *hdata; ///< HPM Plugin Data Store }; #define itemdb_name(n) (itemdb->search(n)->name) #define itemdb_jname(n) (itemdb->search(n)->jname) #define itemdb_type(n) (itemdb->search(n)->type) #define itemdb_atk(n) (itemdb->search(n)->atk) #define itemdb_def(n) (itemdb->search(n)->def) #define itemdb_subtype(n) (itemdb->search(n)->subtype) #define itemdb_sprite(n) (itemdb->search(n)->view_sprite) #define itemdb_weight(n) (itemdb->search(n)->weight) #define itemdb_equip(n) (itemdb->search(n)->equip) #define itemdb_usescript(n) (itemdb->search(n)->script) #define itemdb_equipscript(n) (itemdb->search(n)->script) #define itemdb_wlv(n) (itemdb->search(n)->wlv) #define itemdb_range(n) (itemdb->search(n)->range) #define itemdb_slot(n) (itemdb->search(n)->slot) #define itemdb_available(n) (itemdb->search(n)->flag.available) #define itemdb_viewid(n) (itemdb->search(n)->view_id) #define itemdb_autoequip(n) (itemdb->search(n)->flag.autoequip) #define itemdb_value_buy(n) (itemdb->search(n)->value_buy) #define itemdb_value_sell(n) (itemdb->search(n)->value_sell) #define itemdb_canrefine(n) (!itemdb->search(n)->flag.no_refine) #define itemdb_allowoption(n) (!itemdb->search(n)->flag.no_options) #define itemdb_showdropeffect(n) (itemdb->search(n)->flag.showdropeffect) #define itemdb_dropeffectmode(n) (itemdb->search(n)->dropeffectmode) #define itemdb_is_element(n) ((n) >= ITEMID_SCARLET_PTS && (n) <= ITEMID_LIME_GREEN_PTS) #define itemdb_is_spellbook(n) ((n) >= ITEMID_MAGIC_BOOK_FB && (n) <= ITEMID_MAGIC_BOOK_DL) #define itemdb_is_poison(n) ((n) >= ITEMID_POISON_PARALYSIS && (n) <= ITEMID_POISON_FATIGUE) #define itemid_isgemstone(n) ((n) >= ITEMID_YELLOW_GEMSTONE && (n) <= ITEMID_BLUE_GEMSTONE) #define itemdb_is_GNbomb(n) ((n) >= ITEMID_APPLE_BOMB && (n) <= ITEMID_VERY_HARD_LUMP) #define itemdb_is_GNthrowable(n) ((n) >= ITEMID_MYSTERIOUS_POWDER && (n) <= ITEMID_BLACK_THING_TO_THROW) #define itemid_is_pilebunker(n) ((n) == ITEMID_PILEBUNCKER || (n) == ITEMID_PILEBUNCKER_P || (n) == ITEMID_PILEBUNCKER_S || (n) == ITEMID_PILEBUNCKER_T) #define itemdb_is_shadowequip(n) ((n) & (EQP_SHADOW_ARMOR|EQP_SHADOW_WEAPON|EQP_SHADOW_SHIELD|EQP_SHADOW_SHOES|EQP_SHADOW_ACC_R|EQP_SHADOW_ACC_L)) #define itemdb_is_costumeequip(n) ((n) & (EQP_COSTUME_HEAD_TOP|EQP_COSTUME_HEAD_MID|EQP_COSTUME_HEAD_LOW|EQP_COSTUME_GARMENT)) //Item trade restrictions [Skotlex] #define itemdb_isdropable(item, gmlv) (itemdb->isrestricted((item), (gmlv), 0, itemdb->isdropable_sub)) #define itemdb_cantrade(item, gmlv, gmlv2) (itemdb->isrestricted((item), (gmlv), (gmlv2), itemdb->cantrade_sub)) #define itemdb_canpartnertrade(item, gmlv, gmlv2) (itemdb->isrestricted((item), (gmlv), (gmlv2), itemdb->canpartnertrade_sub)) #define itemdb_cansell(item, gmlv) (itemdb->isrestricted((item), (gmlv), 0, itemdb->cansell_sub)) #define itemdb_cancartstore(item, gmlv) (itemdb->isrestricted((item), (gmlv), 0, itemdb->cancartstore_sub)) #define itemdb_canstore(item, gmlv) (itemdb->isrestricted((item), (gmlv), 0, itemdb->canstore_sub)) #define itemdb_canguildstore(item, gmlv) (itemdb->isrestricted((item), (gmlv), 0, itemdb->canguildstore_sub)) #define itemdb_canmail(item, gmlv) (itemdb->isrestricted((item), (gmlv), 0, itemdb->canmail_sub)) #define itemdb_canauction(item, gmlv) (itemdb->isrestricted((item), (gmlv), 0, itemdb->canauction_sub)) struct itemdb_interface { void (*init) (bool minimal); void (*final) (void); void (*reload) (void); void (*name_constants) (void); /* */ struct item_group *groups; unsigned short group_count; /* */ struct item_chain *chains; unsigned short chain_count; unsigned short chain_cache[ECC_MAX]; /* */ struct item_package *packages; unsigned short package_count; /* list of item combos loaded */ struct item_combo **combos; unsigned short combo_count; /* */ struct DBMap *names; /* */ struct item_data *array[MAX_ITEMDB]; struct DBMap *other;// int nameid -> struct item_data* struct DBMap *options; // int opt_id -> struct itemdb_option* struct item_data dummy; //This is the default dummy item used for non-existant items. [Skotlex] /* */ void (*read_groups) (void); void (*read_chains) (void); void (*read_packages) (void); void (*read_options) (void); /* */ void (*write_cached_packages) (const char *config_filename); bool (*read_cached_packages) (const char *config_filename); /* */ struct item_data* (*name2id) (const char *str); struct item_data* (*search_name) (const char *name); int (*search_name_array) (struct item_data **data, const int size, const char *str, enum item_name_search_flag flag); struct item_data* (*load)(int nameid); struct item_data* (*search)(int nameid); struct item_data* (*exists) (int nameid); struct itemdb_option* (*option_exists) (int idx); bool (*in_group) (struct item_group *group, int nameid); int (*group_item) (struct item_group *group); int (*chain_item) (unsigned short chain_id, int *rate); void (*package_item) (struct map_session_data *sd, struct item_package *package); int (*searchname_sub) (union DBKey key, struct DBData *data, va_list ap); int (*searchname_array_sub) (union DBKey key, struct DBData data, va_list ap); int (*searchrandomid) (struct item_group *group); const char* (*typename) (int type); void (*jobmask2mapid) (uint64 *bclass, uint64 jobmask); void (*jobid2mapid) (uint64 *bclass, int job_class, bool enable); void (*create_dummy_data) (void); struct item_data* (*create_item_data) (int nameid); int (*isequip) (int nameid); int (*isequip2) (struct item_data *data); int (*isstackable) (int nameid); int (*isstackable2) (struct item_data *data); int (*isdropable_sub) (struct item_data *item, int gmlv, int unused); int (*cantrade_sub) (struct item_data *item, int gmlv, int gmlv2); int (*canpartnertrade_sub) (struct item_data *item, int gmlv, int gmlv2); int (*cansell_sub) (struct item_data *item, int gmlv, int unused); int (*cancartstore_sub) (struct item_data *item, int gmlv, int unused); int (*canstore_sub) (struct item_data *item, int gmlv, int unused); int (*canguildstore_sub) (struct item_data *item, int gmlv, int unused); int (*canmail_sub) (struct item_data *item, int gmlv, int unused); int (*canauction_sub) (struct item_data *item, int gmlv, int unused); int (*isrestricted) (struct item *item, int gmlv, int gmlv2, int(*func)(struct item_data *, int, int)); int (*isidentified) (int nameid); int (*isidentified2) (struct item_data *data); bool (*read_combodb_libconfig) (void); bool (*read_combodb_libconfig_sub) (struct config_setting_t *it, int idx, const char *source); int (*gendercheck) (struct item_data *id); int (*validate_entry) (struct item_data *entry, int n, const char *source); void (*readdb_options_additional_fields) (struct itemdb_option *ito, struct config_setting_t *t, const char *source); void (*readdb_additional_fields) (int itemid, struct config_setting_t *it, int n, const char *source); void (*readdb_job_sub) (struct item_data *id, struct config_setting_t *t); int (*readdb_libconfig_sub) (struct config_setting_t *it, int n, const char *source); int (*readdb_libconfig) (const char *filename); uint64 (*unique_id) (struct map_session_data *sd); void (*read) (bool minimal); void (*destroy_item_data) (struct item_data *self, int free_self); int (*final_sub) (union DBKey key, struct DBData *data, va_list ap); int (*options_final_sub) (union DBKey key, struct DBData *data, va_list ap); void (*clear) (bool total); struct item_combo * (*id2combo) (int id); 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); bool (*read_libconfig_lapineddukddak) (void); bool (*read_libconfig_lapineddukddak_sub) (struct config_setting_t *it, const char *source); bool (*read_libconfig_lapineddukddak_sub_sources) (struct config_setting_t *sources, struct item_data *data); }; #ifdef HERCULES_CORE void itemdb_defaults(void); #endif // HERCULES_CORE HPShared struct itemdb_interface *itemdb; #endif /* MAP_ITEMDB_H */