#include #include "ItemCSVReader.h" using namespace std; inline string trim_left(const string &str) { string::size_type n = str.find_first_not_of(" \t\v\n\r"); return n == string::npos ? str : str.substr(n, str.length()); } inline string trim_right(const string &str) { string::size_type n = str.find_last_not_of(" \t\v\n\r"); return n == string::npos ? str : str.substr(0, n + 1); } string trim(const string& str) {return trim_left(trim_right(str));} static string* StringSplit(string strOrigin, const string &strTok) { uint32_t cutAt; int32_t index = 0; auto strResult = new string[30]; while ((cutAt = strOrigin.find_first_of(strTok)) != strOrigin.npos) { if (cutAt > 0) { strResult[index++] = strOrigin.substr(0, cutAt); } strOrigin = strOrigin.substr(cutAt + 1); } if (strOrigin.length() > 0) { strResult[index++] = strOrigin.substr(0, cutAt); } for( int32_t i=0;i(sizeof(arType) / sizeof(arType[0])) ;j++) { string tempString = arType[j]; if (inputString.find(tempString) != string::npos && tempString.find(inputString) != string::npos) { retInt = j; break; } } return retInt; } int32_t get_Item_SubType_Value(int32_t type_value, const string &inputString) { static std::map> subtypes; subtypes[ITEM_WEAPON] = { "WEAPON_SWORD", "WEAPON_DAGGER", "WEAPON_BOW", "WEAPON_TWO_HANDED", "WEAPON_BELL", "WEAPON_FAN", "WEAPON_ARROW", #ifdef ENABLE_WOLFMAN "WEAPON_MOUNT_SPEAR", "WEAPON_CLAW", #endif #ifdef ENABLE_QUIVER_SYSTEM "WEAPON_QUIVER", #endif }; subtypes[ITEM_ARMOR] = { "ARMOR_BODY", "ARMOR_HEAD", "ARMOR_SHIELD", "ARMOR_WRIST", "ARMOR_FOOTS", "ARMOR_NECK", "ARMOR_EAR", #ifdef ENABLE_PENDANT "ARMOR_PENDANT", #endif "ARMOR_NUM_TYPES", }; subtypes[ITEM_USE] = { "USE_POTION", "USE_TALISMAN", "USE_TUNING", "USE_MOVE", "USE_TREASURE_BOX", "USE_MONEYBAG", "USE_BAIT", "USE_ABILITY_UP", "USE_AFFECT", "USE_CREATE_STONE", "USE_SPECIAL", "USE_POTION_NODELAY", "USE_CLEAR", "USE_INVISIBILITY", "USE_DETACHMENT", "USE_BUCKET", "USE_POTION_CONTINUE", "USE_CLEAN_SOCKET", "USE_CHANGE_ATTRIBUTE", "USE_ADD_ATTRIBUTE", "USE_ADD_ACCESSORY_SOCKET", "USE_PUT_INTO_ACCESSORY_SOCKET", "USE_ADD_ATTRIBUTE2", "USE_RECIPE", "USE_CHANGE_ATTRIBUTE2", "USE_BIND", "USE_UNBIND", "USE_TIME_CHARGE_PER", "USE_TIME_CHARGE_FIX", "USE_PUT_INTO_BELT_SOCKET", "USE_PUT_INTO_RING_SOCKET", "USE_CHEST", "USE_CHANGE_ATTRIBUTE_DS", #ifdef ENABLE_CHANGING_COSTUME_BONUS "USE_CHANGE_COSTUME_ATTR", "USE_RESET_COSTUME_ATTR", #endif #ifdef ENABLE_COSTUME_AURA_SYSTEM "USE_PUT_INTO_AURA_SOCKET", #endif }; subtypes[ITEM_AUTOUSE] = { "AUTOUSE_POTION", "AUTOUSE_ABILITY_UP", "AUTOUSE_BOMB", "AUTOUSE_GOLD", "AUTOUSE_MONEYBAG", "AUTOUSE_TREASURE_BOX", }; subtypes[ITEM_MATERIAL] = { "MATERIAL_LEATHER", "MATERIAL_BLOOD", "MATERIAL_ROOT", "MATERIAL_NEEDLE", "MATERIAL_JEWEL", "MATERIAL_DS_REFINE_NORMAL", "MATERIAL_DS_REFINE_BLESSED", "MATERIAL_DS_REFINE_HOLLY", }; subtypes[ITEM_SPECIAL] = { "SPECIAL_MAP", "SPECIAL_KEY", "SPECIAL_DOC", "SPECIAL_SPIRIT", "SPECIAL_ORE", /*** Do not delete ***/ }; subtypes[ITEM_TOOL] = { "TOOL_FISHING_ROD", }; subtypes[ITEM_LOTTERY] = { "LOTTERY_TICKET", "LOTTERY_INSTANT", }; subtypes[ITEM_METIN] = { "METIN_NORMAL", "METIN_GOLD", }; subtypes[ITEM_FISH] = { "FISH_ALIVE", "FISH_DEAD", }; subtypes[ITEM_RESOURCE] = { "RESOURCE_FISHBONE", "RESOURCE_WATERSTONEPIECE", "RESOURCE_WATERSTONE", "RESOURCE_BLOOD_PEARL", "RESOURCE_BLUE_PEARL", "RESOURCE_WHITE_PEARL", "RESOURCE_BUCKET", "RESOURCE_CRYSTAL", "RESOURCE_GEM", "RESOURCE_STONE", "RESOURCE_METIN", "RESOURCE_ORE", #ifdef ENABLE_COSTUME_AURA_SYSTEM "RESOURCE_AURA", #endif }; subtypes[ITEM_UNIQUE] = { "UNIQUE_NONE", "UNIQUE_BOOK", "UNIQUE_SPECIAL_RIDE", "UNIQUE_3", "UNIQUE_4", "UNIQUE_5", "UNIQUE_6", "UNIQUE_7", "UNIQUE_8", "UNIQUE_9", "USE_SPECIAL", }; /*** Do not delete ***/ subtypes[ITEM_QUEST] = { "QUEST_SKILLBOOK" }; subtypes[ITEM_PICK] = { "BASIC", "RELIC", }; /*** End ***/ subtypes[ITEM_COSTUME] = { "COSTUME_BODY", "COSTUME_HAIR", #ifdef ENABLE_SHOULDER_SASH_SYSTEM "COSTUME_SASH", #endif #ifdef ENABLE_COSTUME_WEAPON_SYSTEM "COSTUME_WEAPON", #endif #ifdef ENABLE_COSTUME_MOUNT_SYSTEM "COSTUME_MOUNT", #endif #ifdef ENABLE_COSTUME_AURA_SYSTEM "COSTUME_AURA", #endif #ifdef ENABLE_EFFECT_SYSTEM "COSTUME_EFFECT_BODY", "COSTUME_EFFECT_WEAPON", #endif }; subtypes[ITEM_DS] = { "DS_SLOT1", "DS_SLOT2", "DS_SLOT3", "DS_SLOT4", "DS_SLOT5", "DS_SLOT6" }; subtypes[ITEM_EXTRACT] = { "EXTRACT_DRAGON_SOUL", "EXTRACT_DRAGON_HEART", }; #ifdef ENABLE_CHANGING_COSTUME_BONUS subtypes[ITEM_MEDIUM] = { "MEDIUM_MOVE_COSTUME_ATTR", }; #endif subtypes[ITEM_PET] = { #ifdef __GROWTH_PET__ "PET_EGG", "PET_UPBRINGING", "PET_BAG", "PET_FEEDSTUFF", "PET_SKILL", "PET_SKILL_DEL_BOOK", "PET_NAME_CHANGE", "PET_EXPFOOD", "PET_SKILL_ALL_DEL_BOOK", "PET_EXPFOOD_PER", "PET_ATTR_CHANGE", "PET_ATTR_CHANGE_ITEMVNUM", #endif #ifdef ENABLE_COSTUME_PET_SYSTEM "PET_SLOT", #endif "PET_NONE", }; if (type_value < 0 || type_value >= ITEM_TYPE_MAX) { fprintf(stderr, "Out of range type! (type_value: %d, max valid type: %d)", type_value, ITEM_TYPE_MAX); return -1; } if (subtypes.count(type_value) == 0) { return 0; } std::string trimmedInput = trim(inputString); if (type_value == ITEM_QUEST && (trimmedInput.compare("NONE") == 0 || trimmedInput.compare("0") == 0)) { return 0; } for (size_t i = 0, size = subtypes[type_value].size(); i < size; ++i) { if (trimmedInput.compare(subtypes[type_value][i]) == 0) { return i; } } fprintf(stderr, "Subtype %s is not valid for type %d", trimmedInput.c_str(), type_value); return -1; } int32_t get_Item_AntiFlag_Value(const string &inputString) { string arAntiFlag[] = { "ANTI_FEMALE", "ANTI_MALE", "ANTI_MUSA", "ANTI_ASSASSIN", "ANTI_SURA", "ANTI_MUDANG", "ANTI_GET", "ANTI_DROP", "ANTI_SELL", "ANTI_EMPIRE_A", "ANTI_EMPIRE_B", "ANTI_EMPIRE_C", "ANTI_SAVE", "ANTI_GIVE", "ANTI_PKDROP", "ANTI_STACK", "ANTI_MYSHOP", "ANTI_SAFEBOX", #ifdef ENABLE_WOLFMAN "ANTI_WOLFMAN", #endif "ANTI_CHANGE_ATTRIBUTE", "ANTI_DESTROY", }; int32_t retValue = 0; string* arInputString = StringSplit(inputString, "|"); int32_t comp = sizeof(arAntiFlag) / sizeof(arAntiFlag[0]); for(int32_t i = 0; i < comp; ++i) { string tempString = arAntiFlag[i]; for (int32_t j=0; j < 30; ++j) { string tempString2 = arInputString[j]; if (tempString2.compare("") == 0) { break; } if (tempString2.compare(tempString) == 0) { retValue = retValue + (int32_t)pow(2, i); } } } delete []arInputString; return retValue; } int32_t get_Item_Flag_Value(const string &inputString) { string arFlag[] = { "ITEM_TUNABLE", "ITEM_SAVE", "ITEM_STACKABLE", "COUNT_PER_1GOLD", "ITEM_SLOW_QUERY", "ITEM_UNIQUE", "ITEM_MAKECOUNT", "ITEM_IRREMOVABLE", "CONFIRM_WHEN_USE", "QUEST_USE", "QUEST_USE_MULTIPLE", "QUEST_GIVE", "LOG", "ITEM_APPLICABLE", #ifdef ENABLE_SPECULAR_SYSTEM "ITEM_COLOR", #endif }; int32_t retValue = 0; string* arInputString = StringSplit(inputString, "|"); int32_t sizeOf = sizeof(arFlag)/sizeof(arFlag[0]); for(int32_t i =0;i< sizeOf;i++) { string tempString = arFlag[i]; for (int32_t j=0; j<30 ; j++) { string tempString2 = arInputString[j]; if (tempString2.compare("") == 0) { break; } if (tempString2.compare(tempString) == 0) { retValue = retValue + (int32_t)pow(2, i); } } } delete []arInputString; return retValue; } int32_t get_Item_WearFlag_Value(const string &inputString) { string arWearrFlag[] = { "WEAR_BODY", "WEAR_HEAD", "WEAR_FOOTS", "WEAR_WRIST", "WEAR_WEAPON", "WEAR_NECK", "WEAR_EAR", "WEAR_SHIELD", "WEAR_UNIQUE", "WEAR_ARROW", "WEAR_HAIR", "WEAR_COSTUME_BODY", "WEAR_COSTUME_HAIR", #ifdef ENABLE_SHOULDER_SASH_SYSTEM "WEAR_COSTUME_SASH", #endif #ifdef ENABLE_COSTUME_WEAPON_SYSTEM "WEAR_COSTUME_WEAPON", #endif #ifdef ENABLE_COSTUME_MOUNT_SYSTEM "WEAR_COSTUME_MOUNT", #endif #ifdef ENABLE_COSTUME_AURA_SYSTEM "WEAR_COSTUME_AURA", #endif #ifdef ENABLE_EFFECT_SYSTEM "WEAR_COSTUME_EFFECT_ARMOR", "WEAR_COSTUME_EFFECT_WEAPON", #endif #ifdef ENABLE_PENDANT "WEAR_PENDANT", #endif #ifdef ENABLE_COSTUME_PET_SYSTEM "WEAR_PET", #endif }; int32_t retValue = 0; string* arInputString = StringSplit(inputString, "|"); int32_t sizeOf = sizeof(arWearrFlag)/sizeof(arWearrFlag[0]); for(int32_t i =0;i