From ee7cef96cc979d62f2060e7ab51400951f2ad2ed Mon Sep 17 00:00:00 2001 From: mordred Date: Fri, 23 Nov 2018 15:02:42 +0100 Subject: [PATCH 01/14] Added variant identification to exds and fixed exd_struct_gen with adam --- deps/datReader/Exd.cpp | 87 + deps/datReader/Exd.h | 2 + deps/datReader/Exh.h | 3 + src/tools/exd_struct_gen/ex.json | 3966 ++++++++++++++++++++++++++++- src/tools/exd_struct_gen/main.cpp | 125 +- 5 files changed, 4031 insertions(+), 152 deletions(-) diff --git a/deps/datReader/Exd.cpp b/deps/datReader/Exd.cpp index b4513130..f86ac318 100644 --- a/deps/datReader/Exd.cpp +++ b/deps/datReader/Exd.cpp @@ -81,6 +81,90 @@ namespace xiv { } + const std::vector Exd::get_row( uint32_t id, uint32_t subRow ) + { + + auto cacheEntryIt = _idCache.find( id ); + if( cacheEntryIt == _idCache.end() ) + throw std::runtime_error( "Id not found: " + std::to_string( id ) ); + + // Iterates over all the files + const uint32_t member_count = _exh->get_members().size(); + auto& file_ptr = cacheEntryIt->second.file; + + std::vector< char > dataCpy = file_ptr->get_data_sections().front(); + std::istringstream iss( std::string( dataCpy.begin(), dataCpy.end() ) ); + + // Get the vector fields for the given record and preallocate it + auto fields = _data[id]; + fields.reserve( member_count ); + iss.seekg( cacheEntryIt->second.offset + 6 ); + + uint8_t subRows = *reinterpret_cast< uint8_t* >( &dataCpy[ cacheEntryIt->second.offset + 5 ] ); + + for( auto& member_entry : _exh->get_exh_members() ) + { + // Seek to the position of the member to extract. + // 6 is because we have uint32_t/uint16_t at the start of each record + iss.seekg( cacheEntryIt->second.offset + 6 + member_entry.offset ); + + // Switch depending on the type to extract + switch( member_entry.type ) + { + case DataType::string: + // Extract the offset to the actual string + // Seek to it then extract the actual string + { + auto string_offset = extract( iss, "string_offset", false ); + iss.seekg( cacheEntryIt->second.offset + 6 + _exh->get_header().data_offset + string_offset ); + fields.emplace_back( utils::bparse::extract_cstring( iss, "string" ) ); + } + break; + + case DataType::boolean: + fields.emplace_back( extract( iss, "bool" ) ); + break; + + case DataType::int8: + fields.emplace_back( extract( iss, "int8_t" ) ); + break; + + case DataType::int16: + fields.emplace_back( extract( iss, "int16_t", false ) ); + break; + case DataType::int32: + fields.emplace_back( extract( iss, "int32_t", false ) ); + break; + + case DataType::uint32: + fields.emplace_back( extract( iss, "uint32_t", false ) ); + break; + + case DataType::float32: + fields.emplace_back( extract( iss, "float", false ) ); + break; + + case DataType::uint64: + fields.emplace_back( extract( iss, "uint64_t", false ) ); + break; + + default: + auto type = static_cast< uint16_t >( member_entry.type ); + if( type < 0x19 || type > 0x20 ) + throw std::runtime_error("Unknown DataType: " + std::to_string( type )); + uint64_t val = extract< uint64_t >( iss, "bool" ); + int32_t shift = type - 0x19; + int32_t i = 1 << shift; + val &= i; + fields.emplace_back( ( val & i ) == i ); + break; + } + } + return fields; + + } + + const std::vector Exd::get_row( uint32_t id ) { @@ -98,6 +182,9 @@ namespace xiv // Get the vector fields for the given record and preallocate it auto fields = _data[id]; fields.reserve( member_count ); + iss.seekg( cacheEntryIt->second.offset + 6 ); + + uint8_t subRows = *reinterpret_cast< uint8_t* >( &dataCpy[ cacheEntryIt->second.offset + 5 ] ); for( auto& member_entry : _exh->get_exh_members() ) { diff --git a/deps/datReader/Exd.h b/deps/datReader/Exd.h index 0bafa5e4..c504176b 100644 --- a/deps/datReader/Exd.h +++ b/deps/datReader/Exd.h @@ -47,6 +47,8 @@ public: // Get a row by its id const std::vector get_row(uint32_t id); + // Get a row by its id and sub-row + const std::vector get_row(uint32_t id, uint32_t subRow); // Get all rows const std::map>& get_rows(); diff --git a/deps/datReader/Exh.h b/deps/datReader/Exh.h index 2a7cf630..80b11150 100644 --- a/deps/datReader/Exh.h +++ b/deps/datReader/Exh.h @@ -31,6 +31,9 @@ namespace xiv uint16_t field_count; uint16_t exd_count; uint16_t language_count; + uint16_t unknown1; + uint8_t u2; + uint8_t variant; }; struct ExhMember diff --git a/src/tools/exd_struct_gen/ex.json b/src/tools/exd_struct_gen/ex.json index 6f27ec8c..70e27d0d 100644 --- a/src/tools/exd_struct_gen/ex.json +++ b/src/tools/exd_struct_gen/ex.json @@ -1,5 +1,5 @@ { - "version": "2018.05.16.0000.0000", + "version": "2018.10.30.0000.0000", "sheets": [ { "sheet": "Achievement", @@ -53,15 +53,173 @@ }, { "index": 9, + "name": "Key", + "converter": { + "type": "complexlink", + "links": [ + { + "sheet": "Achievement", + "when": { + "key": "Type", + "value": 2 + } + }, + { + "sheet": "ClassJob", + "when": { + "key": "Type", + "value": 3 + } + }, + { + "sheet": "Quest", + "when": { + "key": "Type", + "value": 6 + } + }, + { + "sheet": "ClassJob", + "when": { + "key": "Type", + "value": 7 + } + }, + { + "sheet": "Map", + "when": { + "key": "Type", + "value": 8 + } + }, + { + "sheet": "Quest", + "when": { + "key": "Type", + "value": 9 + } + }, + { + "sheet": "GrandCompany", + "when": { + "key": "Type", + "value": 11 + } + }, + { + "sheet": "InstanceContent", + "when": { + "key": "Type", + "value": 14 + } + }, + { + "sheet": "BeastTribe", + "when": { + "key": "Type", + "value": 15 + } + }, + { + "sheet": "GrandCompany", + "when": { + "key": "Type", + "value": 18 + } + }, + { + "sheet": "AetherCurrentCompFlgSet", + "when": { + "key": "Type", + "value": 20 + } + }, + { + "sheet": "Quest", + "when": { + "key": "Type", + "value": 24 + } + }, + { + "sheet": "ClassJob", + "when": { + "key": "Type", + "value": 24 + } + } + ] + } + }, + { + "index": 10, "type": "repeat", - "count": 9, + "count": 8, "definition": { - "name": "Data" + "name": "Data", + "converter": { + "type": "complexlink", + "links": [ + { + "sheet": "Achievement", + "when": { + "key": "Type", + "value": 2 + } + }, + { + "sheet": "Quest", + "when": { + "key": "Type", + "value": 6 + } + }, + { + "sheet": "Quest", + "when": { + "key": "Type", + "value": 9 + } + }, + { + "sheet": "BeastReputationRank", + "when": { + "key": "Type", + "value": 15 + } + }, + { + "sheet": "AetherCurrentCompFlgSet", + "when": { + "key": "Type", + "value": 20 + } + }, + { + "sheet": "Quest", + "when": { + "key": "Type", + "value": 24 + } + }, + { + "sheet": "ClassJob", + "when": { + "key": "Type", + "value": 24 + } + } + ] + } } }, { "index": 18, "name": "Order" + }, + { + "index": 20, + "name": "InitialHide" } ] }, @@ -79,6 +237,10 @@ "type": "link", "target": "AchievementKind" } + }, + { + "index": 3, + "name": "HideCategory" } ] }, @@ -263,7 +425,7 @@ }, { "index": 44, - "name": "ActionData", + "name": "UnlockLink", "converter": { "type": "generic" } @@ -403,6 +565,10 @@ } ] }, + { + "sheet": "ActionTimelineMove", + "definitions": [] + }, { "sheet": "ActionTimelineReplace", "definitions": [ @@ -432,6 +598,91 @@ } ] }, + { + "sheet": "ActivityFeedButtons", + "definitions": [ + { + "index": 1, + "name": "BannerURL" + }, + { + "index": 2, + "name": "Description" + }, + { + "index": 3, + "name": "Language" + }, + { + "index": 4, + "name": "PictureURL" + } + ] + }, + { + "sheet": "ActivityFeedCaptions", + "definitions": [ + { + "name": "JA" + }, + { + "index": 1, + "name": "EN" + }, + { + "index": 2, + "name": "DE" + }, + { + "index": 3, + "name": "FR" + } + ] + }, + { + "sheet": "ActivityFeedGroupCaptions", + "definitions": [ + { + "name": "JA" + }, + { + "index": 1, + "name": "EN" + }, + { + "index": 2, + "name": "DE" + }, + { + "index": 3, + "name": "FR" + } + ] + }, + { + "sheet": "ActivityFeedImages", + "definitions": [ + { + "name": "ExpansionImage" + }, + { + "index": 1, + "name": "ActivityFeedJA" + }, + { + "index": 2, + "name": "ActivityFeedEN" + }, + { + "index": 3, + "name": "ActivityFeedDE" + }, + { + "index": 4, + "name": "ActivityFeedFR" + } + ] + }, { "sheet": "Addon", "defaultColumn": "Text", @@ -441,6 +692,22 @@ } ] }, + { + "sheet": "AddonHud", + "definitions": [ + { + "name": "Long" + }, + { + "index": 1, + "name": "Short" + }, + { + "index": 2, + "name": "Function" + } + ] + }, { "sheet": "Adventure", "defaultColumn": "Name", @@ -545,6 +812,7 @@ }, { "sheet": "AetherCurrent", + "defaultColumn": "Quest", "definitions": [ { "name": "Quest", @@ -611,6 +879,33 @@ "sheet": "Aetheryte", "defaultColumn": "PlaceName", "definitions": [ + { + "name": "Singular" + }, + { + "index": 1, + "name": "Adjective" + }, + { + "index": 2, + "name": "Plural" + }, + { + "index": 3, + "name": "PossessivePronoun" + }, + { + "index": 4, + "name": "StartsWithVowel" + }, + { + "index": 6, + "name": "Pronoun" + }, + { + "index": 7, + "name": "Article" + }, { "index": 8, "name": "PlaceName", @@ -655,6 +950,14 @@ "index": 16, "name": "AethernetGroup" }, + { + "index": 18, + "name": "RequiredQuest", + "converter": { + "type": "link", + "target": "Quest" + } + }, { "index": 19, "name": "Map", @@ -673,6 +976,15 @@ } ] }, + { + "sheet": "AetheryteSystemDefine", + "defaultColumn": "name", + "definitions": [ + { + "name": "Text" + } + ] + }, { "sheet": "AirshipExplorationLevel", "definitions": [ @@ -1014,6 +1326,31 @@ } ] }, + { + "sheet": "ArrayEventHandler", + "definitions": [ + { + "type": "repeat", + "count": 16, + "definition": { + "name": "Data", + "converter": { + "type": "multiref", + "targets": [ + "InstanceContentGuide", + "Story", + "Opening", + "CustomTalk", + "DefaultTalk", + "GilShop", + "Warp", + "Quest" + ] + } + } + } + ] + }, { "sheet": "AttackType", "defaultColumn": "Name", @@ -1023,6 +1360,18 @@ } ] }, + { + "sheet": "BacklightColor", + "defaultColumn": "Color", + "definitions": [ + { + "name": "Color", + "converter": { + "type": "color" + } + } + ] + }, { "sheet": "Balloon", "defaultColumn": "Dialogue", @@ -1037,6 +1386,9 @@ "sheet": "BaseParam", "defaultColumn": "Name", "definitions": [ + { + "name": "Order" + }, { "index": 1, "name": "Name" @@ -1307,6 +1659,84 @@ } ] }, + { + "sheet": "BGMFade", + "definitions": [ + { + "index": 2, + "name": "BGMFadeType", + "converter": { + "type": "link", + "target": "BGMFadeType" + } + } + ] + }, + { + "sheet": "BGMSituation", + "definitions": [ + { + "name": "BGM{Day}", + "converter": { + "type": "link", + "target": "BGM" + } + }, + { + "index": 1, + "name": "BGM{Night}", + "converter": { + "type": "link", + "target": "BGM" + } + }, + { + "index": 2, + "name": "BGM{Battle}", + "converter": { + "type": "link", + "target": "BGM" + } + }, + { + "index": 3, + "name": "BGM{Field}", + "converter": { + "type": "link", + "target": "BGM" + } + } + ] + }, + { + "sheet": "BGMSwitch", + "definitions": [ + { + "name": "BGMSystemDefine", + "converter": { + "type": "link", + "target": "BGMSystemDefine" + } + }, + { + "index": 1, + "name": "Quest", + "converter": { + "type": "link", + "target": "Quest" + } + } + ] + }, + { + "sheet": "BGMSystemDefine", + "defaultColumn": "Define", + "definitions": [ + { + "name": "Define" + } + ] + }, { "sheet": "BNpcAnnounceIcon", "defaultColumn": "Icon", @@ -1322,6 +1752,21 @@ { "sheet": "BNpcBase", "definitions": [ + { + "name": "Behavior", + "converter": { + "type": "link", + "target": "Behavior" + } + }, + { + "index": 1, + "name": "ActionTimelineMove", + "converter": { + "type": "link", + "target": "ActionTimelineMove" + } + }, { "index": 4, "name": "Scale" @@ -1357,6 +1802,14 @@ "type": "link", "target": "ArrayEventHandler" } + }, + { + "index": 12, + "name": "BNpcParts", + "converter": { + "type": "link", + "target": "BNpcParts" + } } ] }, @@ -1483,9 +1936,173 @@ { "name": "Singular" }, + { + "index": 1, + "name": "Adjective" + }, { "index": 2, "name": "Plural" + }, + { + "index": 3, + "name": "PossessivePronoun" + }, + { + "index": 4, + "name": "StartsWithVowel" + }, + { + "index": 6, + "name": "Pronoun" + }, + { + "index": 7, + "name": "Article" + } + ] + }, + { + "sheet": "BNpcParts", + "definitions": [ + { + "name": "BNpcBase[1]", + "converter": { + "type": "link", + "target": "BNpcBase" + } + }, + { + "index": 1, + "name": "PartSlot[1]" + }, + { + "index": 6, + "name": "X[1]" + }, + { + "index": 7, + "name": "Y[1]" + }, + { + "index": 8, + "name": "Z[1]" + }, + { + "index": 10, + "name": "Scale[1]" + }, + { + "index": 11, + "name": "BNpcBase[2]", + "converter": { + "type": "link", + "target": "BNpcBase" + } + }, + { + "index": 12, + "name": "PartSlot[2]" + }, + { + "index": 17, + "name": "X[2]" + }, + { + "index": 18, + "name": "Y[2]" + }, + { + "index": 19, + "name": "Z[2]" + }, + { + "index": 21, + "name": "Scale[2]" + }, + { + "index": 22, + "name": "BNpcBase[3]", + "converter": { + "type": "link", + "target": "BNpcBase" + } + }, + { + "index": 23, + "name": "PartSlot[3]" + }, + { + "index": 28, + "name": "X[3]" + }, + { + "index": 29, + "name": "Y[3]" + }, + { + "index": 30, + "name": "Z[3]" + }, + { + "index": 31, + "name": "Scale[3]" + }, + { + "index": 33, + "name": "BNpcBase[4]", + "converter": { + "type": "link", + "target": "BNpcBase" + } + }, + { + "index": 34, + "name": "PartSlot[4]" + }, + { + "index": 39, + "name": "X[4]" + }, + { + "index": 40, + "name": "Y[4]" + }, + { + "index": 41, + "name": "Z[4]" + }, + { + "index": 43, + "name": "Scale[4]" + }, + { + "index": 44, + "name": "BNpcBase[5]", + "converter": { + "type": "link", + "target": "BNpcBase" + } + }, + { + "index": 45, + "name": "PartSlot[5]" + }, + { + "index": 50, + "name": "X[5]" + }, + { + "index": 51, + "name": "Y[5]" + }, + { + "index": 52, + "name": "Z[5]" + }, + { + "index": 54, + "name": "Scale[5]" } ] }, @@ -1560,10 +2177,30 @@ { "name": "Singular" }, + { + "index": 1, + "name": "Adjective" + }, { "index": 2, "name": "Plural" }, + { + "index": 3, + "name": "PossessivePronoun" + }, + { + "index": 4, + "name": "StartsWithVowel" + }, + { + "index": 6, + "name": "Pronoun" + }, + { + "index": 7, + "name": "Article" + }, { "index": 8, "name": "Name" @@ -1615,7 +2252,7 @@ "sheet": "BuddyItem", "definitions": [ { - "name": "Name", + "name": "Item", "converter": { "type": "link", "target": "Item" @@ -1946,6 +2583,42 @@ } ] }, + { + "sheet": "ChocoboRaceTutorial", + "definitions": [ + { + "type": "repeat", + "count": 8, + "definition": { + "name": "NpcYell", + "converter": { + "type": "link", + "target": "NpcYell" + } + } + } + ] + }, + { + "sheet": "ChocoboRaceWeather", + "definitions": [ + { + "name": "WeatherType[1]", + "converter": { + "type": "link", + "target": "Weather" + } + }, + { + "index": 1, + "name": "WeatherType[2]", + "converter": { + "type": "link", + "target": "Weather" + } + } + ] + }, { "sheet": "ChocoboTaxi", "definitions": [ @@ -2266,10 +2939,38 @@ { "name": "Singular" }, + { + "index": 1, + "name": "Adjective" + }, { "index": 2, "name": "Plural" }, + { + "index": 3, + "name": "PossessivePronoun" + }, + { + "index": 4, + "name": "StartsWithVowel" + }, + { + "index": 6, + "name": "Pronoun" + }, + { + "index": 7, + "name": "Article" + }, + { + "index": 8, + "name": "Model", + "converter": { + "type": "link", + "target": "ModelChara" + } + }, { "index": 14, "name": "Behavior", @@ -2628,6 +3329,17 @@ "sheet": "CompleteJournal", "defaultColumn": "Name", "definitions": [ + { + "index": 1, + "name": "RequiredLevel" + }, + { + "index": 3, + "name": "Icon", + "converter": { + "type": "icon" + } + }, { "index": 5, "name": "Name" @@ -2666,6 +3378,18 @@ } ] }, + { + "sheet": "ContentCloseCycle", + "definitions": [ + { + "name": "Unixtime" + }, + { + "index": 1, + "name": "Time{Seconds}" + } + ] + }, { "sheet": "ContentExAction", "definitions": [ @@ -2684,13 +3408,55 @@ }, { "sheet": "ContentFinderCondition", + "defaultColumn": "Name", "definitions": [ { - "index": 3, - "name": "InstanceContent", + "index": 1, + "name": "TerritoryType", "converter": { "type": "link", - "target": "InstanceContent" + "target": "TerritoryType" + } + }, + { + "index": 2, + "name": "ContentLinkType" + }, + { + "index": 3, + "name": "Content", + "converter": { + "type": "complexlink", + "links": [ + { + "sheet": "InstanceContent", + "when": { + "key": "ContentLinkType", + "value": 1 + } + }, + { + "sheet": "PartyContent", + "when": { + "key": "ContentLinkType", + "value": 2 + } + }, + { + "sheet": "PublicContent", + "when": { + "key": "ContentLinkType", + "value": 3 + } + }, + { + "sheet": "GoldSaucerContent", + "when": { + "key": "ContentLinkType", + "value": 4 + } + } + ] } }, { @@ -2718,8 +3484,20 @@ "name": "ItemLevel{Sync}" }, { - "index": 24, - "name": "ContentIndicator" + "index": 20, + "name": "AllowReplacement" + }, + { + "index": 26, + "name": "HighEndDuty" + }, + { + "index": 30, + "name": "DutyRecorderAllowed" + }, + { + "index": 32, + "name": "Name" }, { "index": 33, @@ -2729,9 +3507,17 @@ "target": "ContentType" } }, + { + "index": 34, + "name": "Transient", + "converter": { + "type": "link", + "target": "ContentFinderConditionTransient" + } + }, { "index": 37, - "name": "Icon", + "name": "Image", "converter": { "type": "icon" } @@ -2740,12 +3526,49 @@ }, { "sheet": "ContentFinderConditionTransient", + "defaultColumn": "Description", "definitions": [ { "name": "Description" } ] }, + { + "sheet": "ContentGauge", + "definitions": [ + { + "name": "Name" + }, + { + "index": 1, + "name": "Color", + "converter": { + "type": "link", + "target": "ContentGaugeColor" + } + }, + { + "index": 3, + "name": "TextString" + } + ] + }, + { + "sheet": "ContentGaugeColor", + "definitions": [ + { + "name": "AndroidColor{1}" + }, + { + "index": 1, + "name": "AndroidColor{2}" + }, + { + "index": 2, + "name": "AndroidColor{3}" + } + ] + }, { "sheet": "ContentMemberType", "defaultColumn": "InstanceContent", @@ -2804,6 +3627,18 @@ "index": 6, "name": "IsInDutyFinder" }, + { + "index": 7, + "name": "OpenRule", + "converter": { + "type": "link", + "target": "ContentRouletteOpenRule" + } + }, + { + "index": 9, + "name": "RequiredLevel" + }, { "index": 11, "name": "ItemLevel{Required}" @@ -2815,6 +3650,14 @@ "type": "icon" } }, + { + "index": 14, + "name": "ContentRouletteRoleBonus", + "converter": { + "type": "link", + "target": "ContentRouletteRoleBonus" + } + }, { "index": 15, "name": "Reward{TomeA}" @@ -2842,6 +3685,44 @@ { "index": 32, "name": "RequireAllDuties" + }, + { + "index": 34, + "name": "ContentRouletteOpenRule" + }, + { + "index": 35, + "name": "InstanceContent", + "converter": { + "type": "link", + "target": "InstanceContent" + } + } + ] + }, + { + "sheet": "ContentRouletteOpenRule", + "definitions": [ + { + "index": 1, + "name": "Type" + } + ] + }, + { + "sheet": "ContentRouletteRoleBonus", + "definitions": [ + { + "index": 6, + "name": "ItemRewardType", + "converter": { + "type": "link", + "target": "Item" + } + }, + { + "index": 7, + "name": "RewardAmount" } ] }, @@ -2857,21 +3738,43 @@ }, { "index": 2, - "name": "RequiredAmount" - } - ] - }, - { - "sheet": "ContentsNoteCategory", - "defaultColumn": "Type", - "definitions": [ + "name": "MenuOrder" + }, { - "index": 1, - "name": "Type", + "index": 3, + "name": "RequiredAmount" + }, + { + "index": 5, + "name": "ExpMultiplier" + }, + { + "index": 7, + "name": "GilRward" + }, + { + "index": 8, + "name": "LevelUnlock" + }, + { + "index": 9, + "name": "HowTo", "converter": { "type": "link", - "target": "ContentType" + "target": "HowTo" } + }, + { + "index": 11, + "name": "Name" + }, + { + "index": 12, + "name": "Description" + }, + { + "index": 13, + "name": "ExpCap" } ] }, @@ -3079,6 +3982,14 @@ "target": "Leve" } }, + { + "index": 1, + "name": "CraftLeveTalk", + "converter": { + "type": "link", + "target": "CraftLeveTalk" + } + }, { "index": 2, "name": "Repeats" @@ -3115,6 +4026,100 @@ } ] }, + { + "sheet": "Credit", + "definitions": [ + { + "index": 1, + "name": "Roles(1)", + "converter": { + "type": "link", + "target": "CreditCast" + } + }, + { + "index": 2, + "name": "JapaneseCast(1)", + "converter": { + "type": "link", + "target": "CreditCast" + } + }, + { + "index": 3, + "name": "EnglishCast(1)", + "converter": { + "type": "link", + "target": "CreditCast" + } + }, + { + "index": 4, + "name": "FrenchCast(1)", + "converter": { + "type": "link", + "target": "CreditCast" + } + }, + { + "index": 5, + "name": "GermanCast(1)", + "converter": { + "type": "link", + "target": "CreditCast" + } + }, + { + "index": 6, + "name": "Roles(2)", + "converter": { + "type": "link", + "target": "CreditCast" + } + }, + { + "index": 7, + "name": "JapaneseCast(2)", + "converter": { + "type": "link", + "target": "CreditCast" + } + }, + { + "index": 8, + "name": "EnglishCast(2)", + "converter": { + "type": "link", + "target": "CreditCast" + } + }, + { + "index": 9, + "name": "FrenchCast(2)", + "converter": { + "type": "link", + "target": "CreditCast" + } + }, + { + "index": 10, + "name": "GermanCast(2)", + "converter": { + "type": "link", + "target": "CreditCast" + } + } + ] + }, + { + "sheet": "CreditCast", + "defaultColumn": "Name", + "definitions": [ + { + "name": "Name" + } + ] + }, { "sheet": "Currency", "defaultColumn": "Item", @@ -3221,6 +4226,16 @@ } ] }, + { + "sheet": "DeepDungeon", + "defaultColumn": "Name", + "definitions": [ + { + "index": 22, + "name": "Name" + } + ] + }, { "sheet": "DeepDungeonBan", "defaultColumn": "Name", @@ -3292,10 +4307,30 @@ "index": 1, "name": "Singular" }, + { + "index": 2, + "name": "Adjective" + }, { "index": 3, "name": "Plural" }, + { + "index": 4, + "name": "PossessivePronoun" + }, + { + "index": 5, + "name": "StartsWithVowel" + }, + { + "index": 7, + "name": "Pronoun" + }, + { + "index": 8, + "name": "Article" + }, { "index": 9, "name": "Name" @@ -3340,10 +4375,30 @@ "index": 1, "name": "Singular" }, + { + "index": 2, + "name": "Adjective" + }, { "index": 3, "name": "Plural" }, + { + "index": 4, + "name": "PossessivePronoun" + }, + { + "index": 5, + "name": "StartsWithVowel" + }, + { + "index": 7, + "name": "Pronoun" + }, + { + "index": 8, + "name": "Article" + }, { "index": 9, "name": "Name" @@ -3362,6 +4417,98 @@ } ] }, + { + "sheet": "DeepDungeonLayer", + "definitions": [ + { + "name": "DeepDungeon", + "converter": { + "type": "link", + "target": "DeepDungeon" + } + } + ] + }, + { + "sheet": "DeepDungeonMagicStone", + "defaultColumn": "Name", + "definitions": [ + { + "name": "Icon", + "converter": { + "type": "icon" + } + }, + { + "index": 1, + "name": "Singular" + }, + { + "index": 2, + "name": "Adjective" + }, + { + "index": 3, + "name": "Plural" + }, + { + "index": 4, + "name": "PossessivePronoun" + }, + { + "index": 5, + "name": "StartsWithVowel" + }, + { + "index": 7, + "name": "Pronoun" + }, + { + "index": 8, + "name": "Article" + }, + { + "index": 9, + "name": "Name" + }, + { + "index": 10, + "name": "Tooltip" + } + ] + }, + { + "sheet": "DeepDungeonMap5X", + "definitions": [ + { + "type": "repeat", + "count": 5, + "definition": { + "name": "DeepDungeonRoom", + "converter": { + "type": "link", + "target": "DeepDungeonRoom" + } + } + } + ] + }, + { + "sheet": "DeepDungeonRoom", + "definitions": [ + { + "type": "repeat", + "count": 5, + "definition": { + "name": "Level", + "converter": { + "type": "link", + "target": "Level" + } + } + } + ] + }, { "sheet": "DeepDungeonStatus", "definitions": [ @@ -3416,6 +4563,19 @@ } ] }, + { + "sheet": "DefaultTalkLipSyncType", + "defaultColumn": "ActionTimeline", + "definitions": [ + { + "name": "ActionTimeline", + "converter": { + "type": "link", + "target": "ActionTimeline" + } + } + ] + }, { "sheet": "DeliveryQuest", "defaultColumn": "Quest", @@ -3579,6 +4739,14 @@ "target": "EmoteMode" } }, + { + "index": 15, + "name": "HasCancelEmote" + }, + { + "index": 16, + "name": "DrawsWeapon" + }, { "index": 18, "name": "TextCommand", @@ -3932,10 +5100,30 @@ { "name": "Singular" }, + { + "index": 1, + "name": "Adjective" + }, { "index": 2, "name": "Plural" }, + { + "index": 3, + "name": "PossessivePronoun" + }, + { + "index": 4, + "name": "StartsWithVowel" + }, + { + "index": 6, + "name": "Pronoun" + }, + { + "index": 7, + "name": "Article" + }, { "index": 8, "name": "Title" @@ -3957,6 +5145,14 @@ { "index": 9, "name": "Data" + }, + { + "index": 11, + "name": "SgbPath", + "converter": { + "type": "link", + "target": "ExportedSG" + } } ] }, @@ -3966,6 +5162,30 @@ "definitions": [ { "name": "Singular" + }, + { + "index": 1, + "name": "Adjective" + }, + { + "index": 2, + "name": "Plural" + }, + { + "index": 3, + "name": "PossessivePronoun" + }, + { + "index": 4, + "name": "StartsWithVowel" + }, + { + "index": 6, + "name": "Pronoun" + }, + { + "index": 7, + "name": "Article" } ] }, @@ -4065,6 +5285,43 @@ } ] }, + { + "sheet": "EurekaAetherItem", + "defaultColumn": "Singular", + "definitions": [ + { + "name": "Singular" + }, + { + "index": 1, + "name": "Adjective" + }, + { + "index": 2, + "name": "Plural" + }, + { + "index": 3, + "name": "PossessivePronoun" + }, + { + "index": 4, + "name": "StartsWithVowel" + }, + { + "index": 6, + "name": "Pronoun" + }, + { + "index": 7, + "name": "Article" + }, + { + "index": 8, + "name": "Name" + } + ] + }, { "sheet": "EurekaAethernet", "defaultColumn": "Location", @@ -4087,6 +5344,67 @@ } ] }, + { + "sheet": "EurekaLogosMixerProbability", + "definitions": [ + { + "name": "Probability<%>" + } + ] + }, + { + "sheet": "EurekaMagiaAction", + "definitions": [ + { + "name": "Action", + "converter": { + "type": "link", + "target": "Action" + } + }, + { + "index": 1, + "name": "MaxUses" + } + ] + }, + { + "sheet": "EurekaMagiciteItem", + "definitions": [ + { + "name": "EurekaMagiciteItemType", + "converter": { + "type": "link", + "target": "EurekaMagiciteItemType" + } + }, + { + "index": 1, + "name": "ClassJobCategory", + "converter": { + "type": "link", + "target": "ClassJobCategory" + } + }, + { + "index": 2, + "name": "Item", + "converter": { + "type": "link", + "target": "Item" + } + } + ] + }, + { + "sheet": "EurekaMagiciteItemType", + "defaultColumn": "Type", + "definitions": [ + { + "name": "Type" + } + ] + }, { "sheet": "EurekaSphereElementAdjust", "defaultColumn": "PowerModifier", @@ -4113,6 +5431,18 @@ { "index": 2, "name": "CastTime" + }, + { + "index": 3, + "type": "repeat", + "count": 3, + "definition": { + "name": "Animation", + "converter": { + "type": "link", + "target": "ActionTimeline" + } + } } ] }, @@ -4169,18 +5499,34 @@ }, { "sheet": "EventItem", - "defaultColumn": "Name", + "defaultColumn": "Singular", "definitions": [ { "name": "Singular" }, + { + "index": 1, + "name": "Adjective" + }, { "index": 2, "name": "Plural" }, { - "index": 5, - "name": "Rarity" + "index": 3, + "name": "PossessivePronoun" + }, + { + "index": 4, + "name": "StartsWithVowel" + }, + { + "index": 6, + "name": "Pronoun" + }, + { + "index": 7, + "name": "Article" }, { "index": 9, @@ -4193,6 +5539,14 @@ "type": "icon" } }, + { + "index": 11, + "name": "Action", + "converter": { + "type": "link", + "target": "Action" + } + }, { "index": 12, "name": "StackSize" @@ -4211,6 +5565,19 @@ } ] }, + { + "sheet": "EventItemCastTimeline", + "defaultColumn": "ActionTimeline", + "definitions": [ + { + "name": "ActionTimeline", + "converter": { + "type": "link", + "target": "ActionTimeline" + } + } + ] + }, { "sheet": "EventItemHelp", "defaultColumn": "Description", @@ -4220,6 +5587,28 @@ } ] }, + { + "sheet": "EventItemTimeline", + "defaultColumn": "ActionTimeline", + "definitions": [ + { + "name": "ActionTimeline", + "converter": { + "type": "link", + "target": "ActionTimeline" + } + } + ] + }, + { + "sheet": "ExportedSG", + "defaultColumn": "SgbPath", + "definitions": [ + { + "name": "SgbPath" + } + ] + }, { "sheet": "ExVersion", "defaultColumn": "Name", @@ -4278,6 +5667,10 @@ "target": "BGM" } }, + { + "index": 19, + "name": "HasWorldMapIcon" + }, { "index": 27, "name": "Name" @@ -4491,6 +5884,15 @@ } ] }, + { + "sheet": "Festival", + "defaultColumn": "Name", + "definitions": [ + { + "name": "Name" + } + ] + }, { "sheet": "FieldMarker", "defaultColumn": "Icon", @@ -4511,6 +5913,31 @@ } ] }, + { + "sheet": "FishingRecordType", + "defaultColumn": "Addon", + "definitions": [ + { + "name": "Addon", + "converter": { + "type": "link", + "target": "Addon" + } + } + ] + }, + { + "sheet": "FishingRecordTypeTransient", + "defaultColumn": "Icon", + "definitions": [ + { + "name": "Image", + "converter": { + "type": "icon" + } + } + ] + }, { "sheet": "FishingSpot", "defaultColumn": "PlaceName", @@ -4592,7 +6019,19 @@ "name": "GatheringItemLevel" }, { - "index": 4, + "index": 3, + "name": "IsHidden" + }, + { + "index": 5, + "name": "FishingRecordType", + "converter": { + "type": "link", + "target": "FishingRecordType" + } + }, + { + "index": 6, "name": "TerritoryType", "converter": { "type": "link", @@ -4600,11 +6039,19 @@ } }, { - "index": 5, - "name": "IsFish" + "index": 7, + "name": "IsInLog" }, { - "index": 6, + "index": 8, + "name": "TimeRestricted" + }, + { + "index": 9, + "name": "WeatherRestricted" + }, + { + "index": 10, "name": "GatheringSubCategory", "converter": { "type": "link", @@ -4613,6 +6060,95 @@ } ] }, + { + "sheet": "Frontline03", + "definitions": [ + { + "index": 9, + "type": "repeat", + "count": 3, + "definition": { + "name": "EmptyIcon", + "converter": { + "type": "icon" + } + } + }, + { + "index": 12, + "type": "repeat", + "count": 3, + "definition": { + "name": "MaelstromIcon", + "converter": { + "type": "icon" + } + } + }, + { + "index": 15, + "type": "repeat", + "count": 3, + "definition": { + "name": "TwinAdderIcon", + "converter": { + "type": "icon" + } + } + }, + { + "index": 18, + "type": "repeat", + "count": 3, + "definition": { + "name": "ImmortalFlamesIcon", + "converter": { + "type": "icon" + } + } + } + ] + }, + { + "sheet": "Frontline04", + "definitions": [ + { + "name": "Level[1]", + "converter": { + "type": "link", + "target": "Level" + } + }, + { + "index": 1, + "name": "Level[2]", + "converter": { + "type": "link", + "target": "Level" + } + }, + { + "index": 2, + "name": "Level[3]", + "converter": { + "type": "link", + "target": "Level" + } + }, + { + "index": 6, + "type": "repeat", + "count": 27, + "definition": { + "name": "Unknown{Level}", + "converter": { + "type": "link", + "target": "Level" + } + } + } + ] + }, { "sheet": "GardeningSeed", "defaultColumn": "Item", @@ -4703,6 +6239,59 @@ } ] }, + { + "sheet": "GatheringLeve", + "definitions": [ + { + "index": 4, + "name": "RequiredItem[1]", + "converter": { + "type": "link", + "target": "EventItem" + } + }, + { + "index": 5, + "name": "LeveLevel" + }, + { + "index": 6, + "name": "RequiredItem[2]", + "converter": { + "type": "link", + "target": "EventItem" + } + } + ] + }, + { + "sheet": "GatheringLeveRoute", + "definitions": [ + { + "type": "repeat", + "count": 12, + "definition": { + "type": "group", + "members": [ + { + "name": "GatheringPoint", + "converter": { + "type": "link", + "target": "GatheringPoint" + } + }, + { + "name": "Level", + "converter": { + "type": "link", + "target": "Level" + } + } + ] + } + } + ] + }, { "sheet": "GatheringNotebookList", "definitions": [ @@ -4848,9 +6437,29 @@ { "name": "Singular" }, + { + "index": 1, + "name": "Adjective" + }, { "index": 2, "name": "Plural" + }, + { + "index": 3, + "name": "PossessivePronoun" + }, + { + "index": 4, + "name": "StartsWithVowel" + }, + { + "index": 6, + "name": "Pronoun" + }, + { + "index": 7, + "name": "Article" } ] }, @@ -4895,6 +6504,46 @@ } ] }, + { + "sheet": "GcArmyCaptureTactics", + "defaultColumn": "Name", + "definitions": [ + { + "name": "Name", + "converter": { + "type": "link", + "target": "Status" + } + }, + { + "index": 1, + "name": "HP" + }, + { + "index": 2, + "name": "DamageDealt" + }, + { + "index": 3, + "name": "DamageReceived" + }, + { + "index": 4, + "name": "Tactic", + "converter": { + "type": "link", + "target": "Addon" + } + }, + { + "index": 5, + "name": "Icon", + "converter": { + "type": "icon" + } + } + ] + }, { "sheet": "GcArmyExpedition", "defaultColumn": "Name", @@ -5141,15 +6790,35 @@ }, { "sheet": "GCRankGridaniaFemaleText", - "defaultColumn": "Name", + "defaultColumn": "Singular", "definitions": [ { - "name": "Name" + "name": "Singular" + }, + { + "index": 1, + "name": "Adjective" }, { "index": 2, "name": "Plural" }, + { + "index": 3, + "name": "PossessivePronoun" + }, + { + "index": 4, + "name": "StartsWithVowel" + }, + { + "index": 6, + "name": "Pronoun" + }, + { + "index": 7, + "name": "Article" + }, { "index": 8, "name": "Name{Rank}" @@ -5158,15 +6827,35 @@ }, { "sheet": "GCRankGridaniaMaleText", - "defaultColumn": "Name", + "defaultColumn": "Singular", "definitions": [ { - "name": "Name" + "name": "Singular" + }, + { + "index": 1, + "name": "Adjective" }, { "index": 2, "name": "Plural" }, + { + "index": 3, + "name": "PossessivePronoun" + }, + { + "index": 4, + "name": "StartsWithVowel" + }, + { + "index": 6, + "name": "Pronoun" + }, + { + "index": 7, + "name": "Article" + }, { "index": 8, "name": "Name{Rank}" @@ -5175,15 +6864,35 @@ }, { "sheet": "GCRankLimsaFemaleText", - "defaultColumn": "Name", + "defaultColumn": "Singular", "definitions": [ { - "name": "Name" + "name": "Singular" + }, + { + "index": 1, + "name": "Adjective" }, { "index": 2, "name": "Plural" }, + { + "index": 3, + "name": "PossessivePronoun" + }, + { + "index": 4, + "name": "StartsWithVowel" + }, + { + "index": 6, + "name": "Pronoun" + }, + { + "index": 7, + "name": "Article" + }, { "index": 8, "name": "Name{Rank}" @@ -5192,15 +6901,35 @@ }, { "sheet": "GCRankLimsaMaleText", - "defaultColumn": "Name", + "defaultColumn": "Singular", "definitions": [ { - "name": "Name" + "name": "Singular" + }, + { + "index": 1, + "name": "Adjective" }, { "index": 2, "name": "Plural" }, + { + "index": 3, + "name": "PossessivePronoun" + }, + { + "index": 4, + "name": "StartsWithVowel" + }, + { + "index": 6, + "name": "Pronoun" + }, + { + "index": 7, + "name": "Article" + }, { "index": 8, "name": "Name{Rank}" @@ -5209,15 +6938,35 @@ }, { "sheet": "GCRankUldahFemaleText", - "defaultColumn": "Name", + "defaultColumn": "Singular", "definitions": [ { - "name": "Name" + "name": "Singular" + }, + { + "index": 1, + "name": "Adjective" }, { "index": 2, "name": "Plural" }, + { + "index": 3, + "name": "PossessivePronoun" + }, + { + "index": 4, + "name": "StartsWithVowel" + }, + { + "index": 6, + "name": "Pronoun" + }, + { + "index": 7, + "name": "Article" + }, { "index": 8, "name": "Name{Rank}" @@ -5226,15 +6975,35 @@ }, { "sheet": "GCRankUldahMaleText", - "defaultColumn": "Name", + "defaultColumn": "Singular", "definitions": [ { - "name": "Name" + "name": "Singular" + }, + { + "index": 1, + "name": "Adjective" }, { "index": 2, "name": "Plural" }, + { + "index": 3, + "name": "PossessivePronoun" + }, + { + "index": 4, + "name": "StartsWithVowel" + }, + { + "index": 6, + "name": "Pronoun" + }, + { + "index": 7, + "name": "Article" + }, { "index": 8, "name": "Name{Rank}" @@ -5383,6 +7152,10 @@ "target": "Action" } }, + { + "index": 4, + "name": "UnlockLink" + }, { "index": 7, "name": "Icon", @@ -5392,6 +7165,58 @@ } ] }, + { + "sheet": "GFATE", + "definitions": [ + { + "index": 22, + "type": "repeat", + "count": 16, + "definition": { + "name": "Icon", + "converter": { + "type": "icon" + } + } + } + ] + }, + { + "sheet": "GFateClimbing2", + "definitions": [ + { + "name": "ContentEntry", + "converter": { + "type": "link", + "target": "ContentEntry" + } + } + ] + }, + { + "sheet": "GFateClimbing2Content", + "definitions": [ + { + "name": "PublicContentTextData", + "converter": { + "type": "link", + "target": "PublicContentTextData" + } + } + ] + }, + { + "sheet": "GFateClimbing2TotemType", + "definitions": [ + { + "name": "PublicContentTextData", + "converter": { + "type": "link", + "target": "PublicContentTextData" + } + } + ] + }, { "sheet": "GilShop", "defaultColumn": "Name", @@ -5399,6 +7224,41 @@ "definitions": [ { "name": "Name" + }, + { + "index": 1, + "name": "Icon", + "converter": { + "type": "icon" + } + }, + { + "index": 2, + "type": "repeat", + "count": 4, + "definition": { + "name": "Quest{Required}", + "converter": { + "type": "link", + "target": "Quest" + } + } + }, + { + "index": 6, + "name": "AcceptTalk", + "converter": { + "type": "link", + "target": "DefaultTalk" + } + }, + { + "index": 7, + "name": "FailTalk", + "converter": { + "type": "link", + "target": "DefaultTalk" + } } ] }, @@ -5438,6 +7298,46 @@ } ] }, + { + "sheet": "GoldSaucerArcadeMachine", + "definitions": [ + { + "index": 6, + "name": "Fail Image", + "converter": { + "type": "icon" + } + }, + { + "index": 35, + "name": "Poor", + "converter": { + "type": "icon" + } + }, + { + "index": 36, + "name": "Good", + "converter": { + "type": "icon" + } + }, + { + "index": 37, + "name": "Great", + "converter": { + "type": "icon" + } + }, + { + "index": 38, + "name": "Excellent", + "converter": { + "type": "icon" + } + } + ] + }, { "sheet": "GoldSaucerTextData", "defaultColumn": "Text", @@ -5545,6 +7445,14 @@ "sheet": "GuildleveAssignment", "isGenericReferenceTarget": true, "definitions": [ + { + "index": 1, + "name": "AssignmentTalk", + "converter": { + "type": "link", + "target": "GuildleveAssignmentTalk" + } + }, { "index": 2, "type": "repeat", @@ -5559,6 +7467,23 @@ } ] }, + { + "sheet": "GuildleveAssignmentCategory", + "defaultColumn": "", + "definitions": [ + { + "type": "repeat", + "count": 8, + "definition": { + "name": "Category", + "converter": { + "type": "link", + "target": "LeveAssignmentType" + } + } + } + ] + }, { "sheet": "GuildOrderGuide", "isGenericReferenceTarget": true, @@ -5569,6 +7494,30 @@ "isGenericReferenceTarget": true, "definitions": [] }, + { + "sheet": "HairMakeType", + "definitions": [ + { + "name": "Race", + "converter": { + "type": "link", + "target": "Race" + } + }, + { + "index": 1, + "name": "Tribe", + "converter": { + "type": "link", + "target": "Tribe" + } + }, + { + "index": 2, + "name": "Gender" + } + ] + }, { "sheet": "HouseRetainerPose", "defaultColumn": "ActionTimeline", @@ -5582,6 +7531,112 @@ } ] }, + { + "sheet": "HousingAethernet", + "definitions": [ + { + "name": "Level", + "converter": { + "type": "link", + "target": "Level" + } + }, + { + "index": 1, + "name": "TerritoryType", + "converter": { + "type": "link", + "target": "TerritoryType" + } + }, + { + "index": 2, + "name": "PlaceName", + "converter": { + "type": "link", + "target": "PlaceName" + } + }, + { + "index": 3, + "name": "Order" + } + ] + }, + { + "sheet": "HousingAppeal", + "defaultColumn": "Tag", + "definitions": [ + { + "name": "Tag" + }, + { + "index": 1, + "name": "Icon", + "converter": { + "type": "icon" + } + }, + { + "index": 2, + "name": "Order" + } + ] + }, + { + "sheet": "HousingEmploymentNpcList", + "definitions": [ + { + "name": "Race", + "converter": { + "type": "link", + "target": "HousingEmploymentNpcRace" + } + }, + { + "index": 1, + "type": "repeat", + "count": 2, + "definition": { + "name": "ENpcBase", + "converter": { + "type": "link", + "target": "ENpcBase" + } + } + } + ] + }, + { + "sheet": "HousingEmploymentNpcRace", + "defaultColumn": "Race", + "definitions": [ + { + "name": "Race" + } + ] + }, + { + "sheet": "HousingExterior", + "definitions": [ + { + "index": 2, + "name": "PlaceName", + "converter": { + "type": "link", + "target": "PlaceName" + } + }, + { + "index": 3, + "name": "HousingSize" + }, + { + "index": 4, + "name": "Model" + } + ] + }, { "sheet": "HousingFurniture", "defaultColumn": "Item", @@ -5613,9 +7668,17 @@ "target": "HousingLayoutLimit" } }, + { + "index": 5, + "name": "AquariumTier" + }, { "index": 6, - "name": "Event" + "name": "CustomTalk", + "converter": { + "type": "link", + "target": "CustomTalk" + } }, { "index": 7, @@ -5628,6 +7691,247 @@ { "index": 8, "name": "DestroyOnRemoval" + }, + { + "index": 9, + "name": "Tooltip", + "converter": { + "type": "link", + "target": "HousingPlacement" + } + } + ] + }, + { + "sheet": "HousingMapMarkerInfo", + "definitions": [ + { + "index": 4, + "name": "Map", + "converter": { + "type": "link", + "target": "Map" + } + } + ] + }, + { + "sheet": "HousingMerchantPose", + "defaultColumn": "Pose", + "definitions": [ + { + "name": "ActionTimeline", + "converter": { + "type": "link", + "target": "ActionTimeline" + } + }, + { + "index": 1, + "name": "Pose" + } + ] + }, + { + "sheet": "HousingLandSet", + "defaultColumn": "", + "definitions": [ + { + "type": "repeat", + "count": 60, + "definition": { + "name": "PlotSize" + } + }, + { + "index": 300, + "type": "repeat", + "count": 60, + "definition": { + "name": "InitialPrice" + } + } + ] + }, + { + "sheet": "HousingPlacement", + "defaultColumn": "Text", + "definitions": [ + { + "name": "Text" + } + ] + }, + { + "sheet": "HousingPreset", + "definitions": [ + { + "name": "Singular" + }, + { + "index": 1, + "name": "Adjective" + }, + { + "index": 2, + "name": "Plural" + }, + { + "index": 3, + "name": "PossessivePronoun" + }, + { + "index": 4, + "name": "StartsWithVowel" + }, + { + "index": 6, + "name": "Pronoun" + }, + { + "index": 7, + "name": "Article" + }, + { + "index": 8, + "name": "PlaceName", + "converter": { + "type": "link", + "target": "PlaceName" + } + }, + { + "index": 9, + "name": "HousingSize" + }, + { + "index": 10, + "name": "ExteriorRoof", + "converter": { + "type": "link", + "target": "Item" + } + }, + { + "index": 11, + "name": "ExteriorWall", + "converter": { + "type": "link", + "target": "Item" + } + }, + { + "index": 12, + "name": "ExteriorWindow", + "converter": { + "type": "link", + "target": "Item" + } + }, + { + "index": 13, + "name": "ExteriorDoor", + "converter": { + "type": "link", + "target": "Item" + } + }, + { + "index": 14, + "name": "InteriorWall", + "converter": { + "type": "link", + "target": "Item" + } + }, + { + "index": 15, + "name": "InteriorFlooring", + "converter": { + "type": "link", + "target": "Item" + } + }, + { + "index": 16, + "name": "InteriorLighting", + "converter": { + "type": "link", + "target": "Item" + } + }, + { + "index": 17, + "name": "OtherFloorWall", + "converter": { + "type": "link", + "target": "Item" + } + }, + { + "index": 18, + "name": "OtherFloorFlooring", + "converter": { + "type": "link", + "target": "Item" + } + }, + { + "index": 19, + "name": "OtherFloorLighting", + "converter": { + "type": "link", + "target": "Item" + } + }, + { + "index": 20, + "name": "BasementWall", + "converter": { + "type": "link", + "target": "Item" + } + }, + { + "index": 21, + "name": "BasementFlooring", + "converter": { + "type": "link", + "target": "Item" + } + }, + { + "index": 22, + "name": "BasementLighting", + "converter": { + "type": "link", + "target": "Item" + } + }, + { + "index": 23, + "name": "MansionLighting", + "converter": { + "type": "link", + "target": "Item" + } + } + ] + }, + { + "sheet": "HousingUnitedExterior", + "definitions": [ + { + "index": 1, + "type": "repeat", + "count": 8, + "definition": { + "name": "Item", + "converter": { + "type": "link", + "target": "HousingExterior" + } + } } ] }, @@ -5664,7 +7968,11 @@ }, { "index": 5, - "name": "Event" + "name": "CustomTalk", + "converter": { + "type": "link", + "target": "CustomTalk" + } }, { "index": 6, @@ -5680,6 +7988,53 @@ } ] }, + { + "sheet": "HowTo", + "definitions": [ + { + "index": 2, + "type": "repeat", + "count": 10, + "definition": { + "name": "Images", + "converter": { + "type": "link", + "target": "HowToPage" + } + } + }, + { + "index": 12, + "name": "Category", + "converter": { + "type": "link", + "target": "HowToCategory" + } + } + ] + }, + { + "sheet": "HowToCategory", + "defaultColumn": "Category", + "definitions": [ + { + "name": "Category" + } + ] + }, + { + "sheet": "HowToPage", + "defaultColumn": "Image", + "definitions": [ + { + "index": 2, + "name": "Image", + "converter": { + "type": "icon" + } + } + ] + }, { "sheet": "InstanceContent", "defaultColumn": "Name", @@ -5712,23 +8067,43 @@ } }, { - "index": 9, - "name": "TerritoryType", + "index": 6, + "name": "WinBGM", "converter": { "type": "link", - "target": "TerritoryType" + "target": "BGM" + } + }, + { + "index": 7, + "name": "Cutscene", + "converter": { + "type": "link", + "target": "Cutscene" + } + }, + { + "index": 9, + "name": "Order" + }, + { + "index": 12, + "name": "InstanceContentTextData{Boss}{Start}", + "converter": { + "type": "link", + "target": "InstanceContentTextData" } }, { "index": 13, - "name": "InstanceContentTextData{Boss}{Start}" + "name": "InstanceContentTextData{Boss}{End}", + "converter": { + "type": "link", + "target": "InstanceContentTextData" + } }, { "index": 14, - "name": "InstanceContentTextData{Boss}{End}" - }, - { - "index": 15, "name": "BNpcBase{Boss}", "converter": { "type": "link", @@ -5736,7 +8111,7 @@ } }, { - "index": 16, + "index": 15, "name": "InstanceContentTextData{Objective}{Start}", "converter": { "type": "link", @@ -5744,7 +8119,7 @@ } }, { - "index": 17, + "index": 16, "name": "InstanceContentTextData{Objective}{End}", "converter": { "type": "link", @@ -5752,31 +8127,48 @@ } }, { - "index": 18, + "index": 17, "name": "SortKey" }, { - "index": 21, + "index": 20, "name": "NewPlayerBonusA" }, { - "index": 22, + "index": 21, "name": "NewPlayerBonusB" }, { - "index": 24, + "index": 22, + "name": "FinalBossExp" + }, + { + "index": 23, "name": "FinalBossCurrencyA" }, { - "index": 25, + "index": 24, "name": "FinalBossCurrencyB" }, { - "index": 26, + "index": 25, "name": "FinalBossCurrencyC" }, { - "index": 32, + "index": 26, + "type": "repeat", + "count": 5, + "definition": { + "type": "group", + "members": [ + { + "name": "BossExp" + } + ] + } + }, + { + "index": 31, "type": "repeat", "count": 5, "definition": { @@ -5789,7 +8181,7 @@ } }, { - "index": 37, + "index": 36, "type": "repeat", "count": 5, "definition": { @@ -5802,7 +8194,7 @@ } }, { - "index": 42, + "index": 41, "type": "repeat", "count": 5, "definition": { @@ -5815,7 +8207,11 @@ } }, { - "index": 52, + "index": 46, + "name": "InstanceClearExp" + }, + { + "index": 51, "name": "InstanceContentBuff", "converter": { "type": "link", @@ -5823,7 +8219,15 @@ } }, { - "index": 56, + "index": 52, + "name": "ReqInstance", + "converter": { + "type": "link", + "target": "InstanceContent" + } + }, + { + "index": 55, "name": "PartyCondition" } ] @@ -5856,14 +8260,30 @@ { "name": "Singular" }, + { + "index": 1, + "name": "Adjective" + }, { "index": 2, "name": "Plural" }, + { + "index": 3, + "name": "PossessivePronoun" + }, { "index": 4, "name": "StartsWithVowel" }, + { + "index": 6, + "name": "Pronoun" + }, + { + "index": 7, + "name": "Article" + }, { "index": 8, "name": "Description" @@ -5897,10 +8317,67 @@ }, { "index": 14, - "name": "Stain", + "name": "AdditionalData", "converter": { - "type": "link", - "target": "Stain" + "type": "complexlink", + "links": [ + { + "sheet": "Stain", + "when": { + "key": "FilterGroup", + "value": 15 + } + }, + { + "sheet": "TreasureHuntRank", + "when": { + "key": "FilterGroup", + "value": 18 + } + }, + { + "sheet": "GardeningSeed", + "when": { + "key": "FilterGroup", + "value": 20 + } + }, + { + "sheet": "AetherialWheel", + "when": { + "key": "FilterGroup", + "value": 25 + } + }, + { + "sheet": "CompanyAction", + "when": { + "key": "FilterGroup", + "value": 26 + } + }, + { + "sheet": "TripleTriadCard", + "when": { + "key": "FilterGroup", + "value": 27 + } + }, + { + "sheet": "AirshipExplorationPart", + "when": { + "key": "FilterGroup", + "value": 28 + } + }, + { + "sheet": "SubmarinePart", + "when": { + "key": "FilterGroup", + "value": 37 + } + } + ] } }, { @@ -5943,6 +8420,10 @@ "index": 22, "name": "IsIndisposable" }, + { + "index": 23, + "name": "IsEquippable" + }, { "index": 24, "name": "Price{Mid}" @@ -6162,6 +8643,10 @@ { "index": 86, "name": "IsPvP" + }, + { + "index": 87, + "name": "IsGlamourous" } ] }, @@ -6227,6 +8712,302 @@ } ] }, + { + "sheet": "ItemLevel", + "definitions": [ + { + "name": "Strength" + }, + { + "index": 1, + "name": "Dexterity" + }, + { + "index": 2, + "name": "Vitality" + }, + { + "index": 3, + "name": "Intelligence" + }, + { + "index": 4, + "name": "Mind" + }, + { + "index": 5, + "name": "Piety" + }, + { + "index": 6, + "name": "HP" + }, + { + "index": 7, + "name": "MP" + }, + { + "index": 8, + "name": "TP" + }, + { + "index": 9, + "name": "GP" + }, + { + "index": 10, + "name": "CP" + }, + { + "index": 11, + "name": "PhysicalDamage" + }, + { + "index": 12, + "name": "MagicalDamage" + }, + { + "index": 13, + "name": "Delay" + }, + { + "index": 14, + "name": "AdditionalEffect" + }, + { + "index": 15, + "name": "AttackSpeed" + }, + { + "index": 16, + "name": "BlockRate" + }, + { + "index": 17, + "name": "BlockStrength" + }, + { + "index": 18, + "name": "Tenacity" + }, + { + "index": 19, + "name": "AttackPower" + }, + { + "index": 20, + "name": "Defense" + }, + { + "index": 21, + "name": "DirectHitRate" + }, + { + "index": 22, + "name": "Evasion" + }, + { + "index": 23, + "name": "MagicDefense" + }, + { + "index": 24, + "name": "CriticalHitPower" + }, + { + "index": 25, + "name": "CriticalHitResilience" + }, + { + "index": 26, + "name": "CriticalHit" + }, + { + "index": 27, + "name": "CriticalHitEvasion" + }, + { + "index": 28, + "name": "SlashingResistance" + }, + { + "index": 29, + "name": "PiercingResistance" + }, + { + "index": 30, + "name": "BluntResistance" + }, + { + "index": 31, + "name": "ProjectileResistance" + }, + { + "index": 32, + "name": "AttackMagicPotency" + }, + { + "index": 33, + "name": "HealingMagicPotency" + }, + { + "index": 34, + "name": "EnhancementMagicPotency" + }, + { + "index": 35, + "name": "EnfeeblingMagicPotency" + }, + { + "index": 36, + "name": "FireResistance" + }, + { + "index": 37, + "name": "IceResistance" + }, + { + "index": 38, + "name": "WindResistance" + }, + { + "index": 39, + "name": "EarthResistance" + }, + { + "index": 40, + "name": "LightningResistance" + }, + { + "index": 41, + "name": "WaterResistance" + }, + { + "index": 42, + "name": "MagicResistance" + }, + { + "index": 43, + "name": "Determination" + }, + { + "index": 44, + "name": "SkillSpeed" + }, + { + "index": 45, + "name": "SpellSpeed" + }, + { + "index": 46, + "name": "Haste" + }, + { + "index": 47, + "name": "Morale" + }, + { + "index": 48, + "name": "Enmity" + }, + { + "index": 49, + "name": "EnmityReduction" + }, + { + "index": 50, + "name": "CarefulDesynthesis" + }, + { + "index": 51, + "name": "EXPBonus" + }, + { + "index": 52, + "name": "Regen" + }, + { + "index": 53, + "name": "Refresh" + }, + { + "index": 54, + "name": "MovementSpeed" + }, + { + "index": 55, + "name": "Spikes" + }, + { + "index": 56, + "name": "SlowResistance" + }, + { + "index": 57, + "name": "PetrificationResistance" + }, + { + "index": 58, + "name": "ParalysisResistance" + }, + { + "index": 59, + "name": "SilenceResistance" + }, + { + "index": 60, + "name": "BlindResistance" + }, + { + "index": 61, + "name": "PoisonResistance" + }, + { + "index": 62, + "name": "StunResistance" + }, + { + "index": 63, + "name": "SleepResistance" + }, + { + "index": 64, + "name": "BindResistance" + }, + { + "index": 65, + "name": "HeavyResistance" + }, + { + "index": 66, + "name": "DoomResistance" + }, + { + "index": 67, + "name": "ReducedDurabilityLoss" + }, + { + "index": 68, + "name": "IncreasedSpiritbondGain" + }, + { + "index": 69, + "name": "Craftsmanship" + }, + { + "index": 70, + "name": "Control" + }, + { + "index": 71, + "name": "Gathering" + }, + { + "index": 72, + "name": "Perception" + } + ] + }, { "sheet": "ItemSearchCategory", "defaultColumn": "Name", @@ -6435,7 +9216,16 @@ }, { "index": 17, - "name": "DataId" + "name": "DataId", + "converter": { + "type": "multiref", + "targets": [ + "CraftLeve", + "CompanyLeve", + "GatheringLeve", + "BattleLeve" + ] + } }, { "index": 21, @@ -6559,7 +9349,47 @@ }, { "index": 6, - "name": "ObjectKey" + "name": "Object", + "converter": { + "type": "complexlink", + "links": [ + { + "sheet": "ENpcBase", + "when": { + "key": "Type", + "value": 8 + } + }, + { + "sheet": "BNpcBase", + "when": { + "key": "Type", + "value": 9 + } + }, + { + "sheet": "Aetheryte", + "when": { + "key": "Type", + "value": 12 + } + }, + { + "sheet": "GatheringPoint", + "when": { + "key": "Type", + "value": 14 + } + }, + { + "sheet": "EObj", + "when": { + "key": "Type", + "value": 45 + } + } + ] + } }, { "index": 7, @@ -6571,7 +9401,16 @@ }, { "index": 8, - "name": "EventId" + "name": "EventId", + "converter": { + "type": "multiref", + "targets": [ + "TripleTriad", + "Adventure", + "Opening", + "Quest" + ] + } }, { "index": 9, @@ -6654,7 +9493,6 @@ "defaultColumn": "Name", "definitions": [ { - "index": 1, "name": "LogKind", "converter": { "type": "link", @@ -6723,6 +9561,31 @@ } ] }, + { + "sheet": "LotteryExchangeShop", + "definitions": [ + { + "index": 1, + "type": "repeat", + "count": 16, + "definition": { + "name": "ItemAccepted", + "converter": { + "type": "link", + "target": "Item" + } + } + }, + { + "index": 17, + "type": "repeat", + "count": 16, + "definition": { + "name": "AmountAccepted" + } + } + ] + }, { "sheet": "MacroIcon", "defaultColumn": "Icon", @@ -6791,6 +9654,34 @@ } ] }, + { + "sheet": "ManeuversArmor", + "definitions": [ + { + "index": 1, + "type": "repeat", + "count": 2, + "definition": { + "name": "BNpcBase", + "converter": { + "type": "link", + "target": "BNpcName" + } + } + }, + { + "index": 5, + "type": "repeat", + "count": 5, + "definition": { + "name": "Icon", + "converter": { + "type": "icon" + } + } + } + ] + }, { "sheet": "Map", "defaultColumn": "PlaceName", @@ -6908,7 +9799,40 @@ }, { "index": 8, - "name": "Data{Key}" + "name": "Data{Key}", + "converter": { + "type": "complexlink", + "links": [ + { + "sheet": "Map", + "when": { + "key": "Data{Type}", + "value": 1 + } + }, + { + "sheet": "Map", + "when": { + "key": "Data{Type}", + "value": 2 + } + }, + { + "sheet": "Aetheryte", + "when": { + "key": "Data{Type}", + "value": 3 + } + }, + { + "sheet": "PlaceName", + "when": { + "key": "Data{Type}", + "value": 4 + } + } + ] + } } ] }, @@ -7083,6 +10007,26 @@ } ] }, + { + "sheet": "MiniGameRA", + "definitions": [ + { + "index": 1, + "name": "Icon", + "converter": { + "type": "icon" + } + }, + { + "index": 2, + "name": "BGM", + "converter": { + "type": "link", + "target": "BGM" + } + } + ] + }, { "sheet": "MinionRace", "defaultColumn": "Name", @@ -7114,6 +10058,27 @@ } ] }, + { + "sheet": "MobHuntOrderType", + "definitions": [ + { + "index": 1, + "name": "Quest", + "converter": { + "type": "link", + "target": "Quest" + } + }, + { + "index": 2, + "name": "EventItem", + "converter": { + "type": "link", + "target": "EventItem" + } + } + ] + }, { "sheet": "MobHuntTarget", "definitions": [ @@ -7177,6 +10142,27 @@ } ] }, + { + "sheet": "ModelState", + "defaultColumn": "Start", + "definitions": [ + { + "name": "Start", + "converter": { + "type": "link", + "target": "ActionTimeline" + } + }, + { + "index": 1, + "name": "End", + "converter": { + "type": "link", + "target": "ActionTimeline" + } + } + ] + }, { "sheet": "MonsterNote", "defaultColumn": "Name", @@ -7261,18 +10247,58 @@ { "name": "Singular" }, + { + "index": 1, + "name": "Adjective" + }, { "index": 2, "name": "Plural" }, + { + "index": 3, + "name": "PossessivePronoun" + }, + { + "index": 4, + "name": "StartsWithVowel" + }, + { + "index": 6, + "name": "Pronoun" + }, + { + "index": 7, + "name": "Article" + }, + { + "index": 8, + "name": "ModelChara", + "converter": { + "type": "link", + "target": "ModelChara" + } + }, { "index": 10, - "name": "FlyingCondition" + "name": "FlyingCondition", + "converter": { + "type": "link", + "target": "MountFlyingCondition" + } }, { "index": 14, "name": "IsFlying" }, + { + "index": 16, + "name": "MountCustomize", + "converter": { + "type": "link", + "target": "MountCustomize" + } + }, { "index": 17, "name": "RideBGM", @@ -7291,6 +10317,30 @@ "converter": { "type": "icon" } + }, + { + "index": 36, + "name": "ExtraSeats" + }, + { + "index": 37, + "name": "MountAction", + "converter": { + "type": "link", + "target": "MountAction" + } + }, + { + "index": 38, + "name": "IsAirborne" + }, + { + "index": 40, + "name": "UseEP" + }, + { + "index": 42, + "name": "IsImmobile" } ] }, @@ -7310,6 +10360,149 @@ } ] }, + { + "sheet": "MountCustomize", + "definitions": [ + { + "index": 1, + "name": "HyurMaleScale" + }, + { + "index": 2, + "name": "HyurFemaleScale" + }, + { + "index": 3, + "name": "ElezenMaleScale" + }, + { + "index": 4, + "name": "ElezenFemaleScale" + }, + { + "index": 5, + "name": "LalaMaleScale" + }, + { + "index": 6, + "name": "LalaFemaleScale" + }, + { + "index": 7, + "name": "MiqoMaleScale" + }, + { + "index": 8, + "name": "MiqoFemaleScale" + }, + { + "index": 9, + "name": "RoeMaleScale" + }, + { + "index": 10, + "name": "RoeFemaleScale" + }, + { + "index": 11, + "name": "AuRaMaleScale" + }, + { + "index": 12, + "name": "AuRaFemaleScale" + }, + { + "index": 13, + "name": "HyurMaleCameraHeight" + }, + { + "index": 14, + "name": "HyurFemaleCameraHeight" + }, + { + "index": 15, + "name": "ElezenMaleCameraHeight" + }, + { + "index": 16, + "name": "ElezenFemaleCameraHeight" + }, + { + "index": 17, + "name": "LalaMaleCameraHeight" + }, + { + "index": 18, + "name": "LalaFemaleCameraHeight" + }, + { + "index": 19, + "name": "MiqoMaleCameraHeight" + }, + { + "index": 20, + "name": "MiqoFemaleCameraHeight" + }, + { + "index": 21, + "name": "RoeMaleCameraHeight" + }, + { + "index": 22, + "name": "RoeFemaleCameraHeight" + }, + { + "index": 23, + "name": "AuRaMaleCameraHeight" + }, + { + "index": 24, + "name": "AuRaFemaleCameraHeight" + } + ] + }, + { + "sheet": "MountFlyingCondition", + "defaultColumn": "Quest", + "definitions": [ + { + "name": "Quest", + "converter": { + "type": "link", + "target": "Quest" + } + } + ] + }, + { + "sheet": "MountSpeed", + "defaultColumn": "Quest", + "definitions": [ + { + "name": "Quest", + "converter": { + "type": "link", + "target": "Quest" + } + } + ] + }, + { + "sheet": "MountTransient", + "definitions": [ + { + "name": "Description" + }, + { + "index": 1, + "name": "Description{Enhanced}" + }, + { + "index": 2, + "name": "Tooltip" + } + ] + }, { "sheet": "MoveTimeline", "defaultColumn": "Idle", @@ -7397,10 +10590,10 @@ }, { "sheet": "MoveVfx", - "defaultColumn": "0", + "defaultColumn": "VFXNormal", "definitions": [ { - "name": "0", + "name": "VFXNormal", "converter": { "type": "link", "target": "VFX" @@ -7408,7 +10601,7 @@ }, { "index": 1, - "name": "1", + "name": "VFXWalking", "converter": { "type": "link", "target": "VFX" @@ -7568,6 +10761,16 @@ } ] }, + { + "sheet": "NpcYell", + "defaultColumn": "Text", + "definitions": [ + { + "index": 9, + "name": "Text" + } + ] + }, { "sheet": "Omen", "defaultColumn": "FileName", @@ -7604,6 +10807,14 @@ "definitions": [ { "name": "Name" + }, + { + "index": 1, + "name": "Quest", + "converter": { + "type": "link", + "target": "Quest" + } } ] }, @@ -7688,6 +10899,76 @@ } ] }, + { + "sheet": "PartyContent", + "defaultColumn": "Name", + "definitions": [ + { + "name": "Key" + }, + { + "index": 1, + "name": "TimeLimit" + }, + { + "index": 2, + "name": "Name" + }, + { + "index": 3, + "name": "TextData{Start}", + "converter": { + "type": "link", + "target": "PartyContentTextData" + } + }, + { + "index": 4, + "name": "TextData{End}", + "converter": { + "type": "link", + "target": "PartyContentTextData" + } + }, + { + "index": 33, + "name": "ContentFinderCondition", + "converter": { + "type": "link", + "target": "ContentFinderCondition" + } + }, + { + "index": 34, + "name": "Image", + "converter": { + "type": "icon" + } + } + ] + }, + { + "sheet": "PartyContentCutscene", + "defaultColumn": "Name", + "definitions": [ + { + "name": "Cutscene", + "converter": { + "type": "link", + "target": "Cutscene" + } + } + ] + }, + { + "sheet": "PartyContentTextData", + "defaultColumn": "Data", + "definitions": [ + { + "name": "Data" + } + ] + }, { "sheet": "Perform", "defaultColumn": "Name", @@ -7790,6 +11071,13 @@ "index": 1, "name": "Description" }, + { + "index": 2, + "name": "Icon", + "converter": { + "type": "icon" + } + }, { "index": 3, "name": "Action", @@ -7845,10 +11133,49 @@ } ] }, + { + "sheet": "PlantPotFlowerSeed", + "definitions": [ + { + "type": "repeat", + "count": 9, + "definition": { + "name": "SeedIcon", + "converter": { + "type": "icon" + } + } + } + ] + }, + { + "sheet": "PreHandler", + "defaultColumn": "", + "definitions": [ + { + "name": "GilShop", + "converter": { + "type": "link", + "target": "GilShop" + } + }, + { + "index": 2, + "name": "ActionTimeline", + "converter": { + "type": "link", + "target": "ActionTimeline" + } + } + ] + }, { "sheet": "PublicContent", "defaultColumn": "Name", "definitions": [ + { + "name": "Type" + }, { "index": 1, "name": "TimeLimit" @@ -7865,11 +11192,92 @@ "name": "Name" }, { - "index": 7, - "name": "TerritoryType", + "index": 4, + "name": "TextData{Start}", "converter": { "type": "link", - "target": "TerritoryType" + "target": "PublicContentTextData" + } + }, + { + "index": 5, + "name": "TextData{End}", + "converter": { + "type": "link", + "target": "PublicContentTextData" + } + }, + { + "index": 7, + "name": "ContentFinderCondition", + "converter": { + "type": "link", + "target": "ContentFinderCondition" + } + }, + { + "index": 8, + "name": "AdditionalData", + "converter": { + "type": "complexlink", + "links": [ + { + "sheet": "Eureka", + "when": { + "key": "Type", + "value": 3 + } + }, + { + "sheet": "GFateClimbing2Content", + "when": { + "key": "Type", + "value": 5 + } + } + ] + } + } + ] + }, + { + "sheet": "PublicContentCutscene", + "definitions": [ + { + "name": "Cutscene", + "converter": { + "type": "link", + "target": "Cutscene" + } + }, + { + "index": 1, + "name": "Cutscene2", + "converter": { + "type": "link", + "target": "Cutscene" + } + } + ] + }, + { + "sheet": "PublicContentTextData", + "defaultColumn": "TextData", + "definitions": [ + { + "name": "TextData" + } + ] + }, + { + "sheet": "PvPAction", + "defaultColumn": "Action", + "definitions": [ + { + "name": "Action", + "converter": { + "type": "link", + "target": "Action" } } ] @@ -7891,6 +11299,61 @@ } ] }, + { + "sheet": "PvPRank", + "definitions": [ + { + "name": "ExpRequired" + } + ] + }, + { + "sheet": "PvPSelectTrait", + "definitions": [ + { + "name": "Effect" + }, + { + "index": 1, + "name": "Icon", + "converter": { + "type": "icon" + } + }, + { + "index": 2, + "name": "Value" + } + ] + }, + { + "sheet": "PvPTrait", + "definitions": [ + { + "name": "Trait{1}", + "converter": { + "type": "link", + "target": "Trait" + } + }, + { + "index": 1, + "name": "Trait{2}", + "converter": { + "type": "link", + "target": "Trait" + } + }, + { + "index": 2, + "name": "Trait{3}", + "converter": { + "type": "link", + "target": "Trait" + } + } + ] + }, { "sheet": "Quest", "defaultColumn": "Name", @@ -7927,6 +11390,10 @@ "index": 5, "name": "QuestLevelOffset" }, + { + "index": 6, + "name": "Level{Max}" + }, { "index": 7, "name": "ClassJobCategory[1]", @@ -8023,6 +11490,14 @@ } } }, + { + "index": 27, + "name": "Festival", + "converter": { + "type": "link", + "target": "Festival" + } + }, { "index": 30, "name": "Bell{Start}" @@ -8083,6 +11558,14 @@ "index": 44, "name": "RepeatIntervalType" }, + { + "index": 45, + "name": "QuestRepeatFlag", + "converter": { + "type": "link", + "target": "QuestRepeatFlag" + } + }, { "index": 50, "type": "repeat", @@ -8162,8 +11645,19 @@ "definition": { "name": "Item{Reward}[0]", "converter": { - "type": "link", - "target": "Item" + "type": "complexlink", + "links": [ + { + "sheet": "QuestClassJobReward", + "when": { + "key": "ItemRewardType", + "value": 6 + } + }, + { + "sheet": "Item" + } + ] } } }, @@ -8339,7 +11833,6 @@ }, { "sheet": "QuestClassJobReward", - "defaultColumn": "Name", "definitions": [ { "name": "ClassJobCategory", @@ -8390,6 +11883,35 @@ } ] }, + { + "sheet": "QuestClassJobSupply", + "defaultColumn": "Name", + "definitions": [ + { + "name": "ClassJobCategory", + "converter": { + "type": "link", + "target": "ClassJobCategory" + } + }, + { + "index": 2, + "name": "ENpcResident", + "converter": { + "type": "link", + "target": "ENpcResident" + } + }, + { + "index": 3, + "name": "Item", + "converter": { + "type": "link", + "target": "Item" + } + } + ] + }, { "sheet": "QuestRepeatFlag", "defaultColumn": "Quest", @@ -8407,6 +11929,12 @@ "sheet": "QuestRewardOther", "defaultColumn": "Name", "definitions": [ + { + "name": "Icon", + "converter": { + "type": "icon" + } + }, { "index": 1, "name": "Name" @@ -8730,6 +12258,10 @@ { "index": 42, "name": "IsSpecializationRequired" + }, + { + "index": 44, + "name": "PatchNumber" } ] }, @@ -8752,6 +12284,10 @@ "index": 1, "name": "Stars" }, + { + "index": 2, + "name": "SuggestedCraftsmanship" + }, { "index": 3, "name": "Difficulty" @@ -9048,6 +12584,31 @@ } ] }, + { + "sheet": "Resident", + "definitions": [ + { + "index": 1, + "name": "Model" + }, + { + "index": 2, + "name": "NpcYell", + "converter": { + "type": "link", + "target": "NpcYell" + } + }, + { + "index": 3, + "name": "ResidentMotionType", + "converter": { + "type": "link", + "target": "ResidentMotionType" + } + } + ] + }, { "sheet": "RetainerTask", "definitions": [ @@ -9204,6 +12765,27 @@ } ] }, + { + "sheet": "RPParameter", + "defaultColumn": "BNpcName", + "definitions": [ + { + "name": "BNpcName", + "converter": { + "type": "link", + "target": "BNpcName" + } + }, + { + "index": 1, + "name": "ClassJob", + "converter": { + "type": "link", + "target": "ClassJob" + } + } + ] + }, { "sheet": "Salvage", "defaultColumn": "OptimalSkill", @@ -9474,7 +13056,7 @@ "name": "Level", "converter": { "type": "link", - "target": "level" + "target": "Level" } } ] @@ -9492,7 +13074,10 @@ "sheet": "ScreenImage", "definitions": [ { - "name": "Image" + "name": "Image", + "converter": { + "type": "icon" + } } ] }, @@ -9706,6 +13291,26 @@ } ] }, + { + "sheet": "SpearfishingRecordPage", + "definitions": [ + { + "index": 3, + "name": "PlaceName", + "converter": { + "type": "link", + "target": "PlaceName" + } + }, + { + "index": 4, + "name": "Image", + "converter": { + "type": "icon" + } + } + ] + }, { "sheet": "SpecialShop", "defaultColumn": "Name", @@ -9831,6 +13436,14 @@ ] } }, + { + "index": 1862, + "name": "Quest{Unlock}", + "converter": { + "type": "link", + "target": "Quest" + } + }, { "index": 1863, "name": "Quest{Shop}", @@ -9838,6 +13451,22 @@ "type": "link", "target": "Quest" } + }, + { + "index": 1864, + "name": "NotCompleteText", + "converter": { + "type": "link", + "target": "DefaultTalk" + } + }, + { + "index": 1865, + "name": "CompleteText", + "converter": { + "type": "link", + "target": "DefaultTalk" + } } ] }, @@ -9986,10 +13615,26 @@ }, { "sheet": "StatusLoopVFX", - "defaultColumn": "Location", + "defaultColumn": "VFX", "definitions": [ { - "name": "Location", + "name": "VFX", + "converter": { + "type": "link", + "target": "VFX" + } + }, + { + "index": 2, + "name": "VFX2", + "converter": { + "type": "link", + "target": "VFX" + } + }, + { + "index": 4, + "name": "VFX3", "converter": { "type": "link", "target": "VFX" @@ -10120,7 +13765,7 @@ }, { "sheet": "TerritoryType", - "defaultColumn": "Name", + "defaultColumn": "PlaceName", "definitions": [ { "name": "Name" @@ -10227,12 +13872,15 @@ { "index": 2, "name": "IsPrefix" + }, + { + "index": 3, + "name": "Order" } ] }, { "sheet": "Tomestones", - "defaultColumn": "WeeklyLimit", "definitions": [ { "name": "WeeklyLimit" @@ -10332,6 +13980,14 @@ "index": 3, "name": "Level" }, + { + "index": 4, + "name": "Quest", + "converter": { + "type": "link", + "target": "Quest" + } + }, { "index": 5, "name": "Value" @@ -10392,7 +14048,7 @@ } }, { - "index": 2, + "index": 4, "name": "BNpcCustomize", "converter": { "type": "link", @@ -10400,15 +14056,7 @@ } }, { - "index": 3, - "name": "BNpcEquip", - "converter": { - "type": "link", - "target": "BNpcEquip" - } - }, - { - "index": 4, + "index": 5, "type": "repeat", "count": 6, "definition": { @@ -10420,23 +14068,23 @@ } }, { - "index": 12, + "index": 13, "name": "Speed" }, { - "index": 13, + "index": 14, "name": "Scale" }, { - "index": 14, + "index": 15, "name": "IsPvP" }, { - "index": 15, + "index": 16, "name": "IsEvent" }, { - "index": 16, + "index": 17, "name": "PlayerCamera" } ] @@ -10842,6 +14490,18 @@ } ] }, + { + "sheet": "UIColor", + "definitions": [ + { + "name": "Foreground" + }, + { + "index": 1, + "name": "Background" + } + ] + }, { "sheet": "VaseFlower", "definitions": [ @@ -10885,7 +14545,7 @@ }, { "index": 2, - "name": "DefaultTalk1", + "name": "ConditionSuccessEvent", "converter": { "type": "link", "target": "DefaultTalk" @@ -10893,7 +14553,7 @@ }, { "index": 3, - "name": "DefaultTalk2", + "name": "ConditionFailEvent", "converter": { "type": "link", "target": "DefaultTalk" @@ -10901,7 +14561,7 @@ }, { "index": 4, - "name": "DefaultTalk3", + "name": "ConfirmEvent", "converter": { "type": "link", "target": "DefaultTalk" @@ -10909,11 +14569,19 @@ }, { "index": 5, - "name": "WarpCondition" + "name": "WarpCondition", + "converter": { + "type": "link", + "target": "WarpCondition" + } }, { "index": 6, - "name": "WarpLogic" + "name": "WarpLogic", + "converter": { + "type": "link", + "target": "WarpLogic" + } } ] }, @@ -10954,6 +14622,44 @@ } ] }, + { + "sheet": "WarpLogic", + "defaultColumn": "WarpName", + "definitions": [ + { + "index": 1, + "name": "WarpName" + }, + { + "index": 3, + "type": "repeat", + "count": 10, + "definition": { + "name": "Function" + } + }, + { + "index": 13, + "type": "repeat", + "count": 10, + "definition": { + "name": "Argument" + } + }, + { + "index": 23, + "name": "Question" + }, + { + "index": 24, + "name": "Response{Yes}" + }, + { + "index": 25, + "name": "Response{No}" + } + ] + }, { "sheet": "Weather", "defaultColumn": "Name", @@ -11033,9 +14739,24 @@ { "sheet": "WeeklyBingoOrderData", "definitions": [ + { + "name": "Type" + }, { "index": 1, - "name": "Data" + "name": "Data", + "converter": { + "type": "complexlink", + "links": [ + { + "sheet": "InstanceContent", + "when": { + "key": "Type", + "value": 0 + } + } + ] + } }, { "index": 3, @@ -11125,16 +14846,39 @@ } ] }, + { + "sheet": "WeeklyLotBonus", + "definitions": [ + { + "type": "repeat", + "count": 31, + "definition": { + "name": "WeeklyLotBonusThreshold", + "converter": { + "type": "link", + "target": "WeeklyLotBonusThreshold" + } + } + } + ] + }, { "sheet": "World", "definitions": [ { - "index": 1, + "name": "Name" + }, + { + "index": 2, "name": "DataCenter", "converter": { "type": "link", "target": "WorldDCGroupType" } + }, + { + "index": 3, + "name": "IsPublic" } ] }, @@ -11226,4 +14970,4 @@ ] } ] -} \ No newline at end of file +} diff --git a/src/tools/exd_struct_gen/main.cpp b/src/tools/exd_struct_gen/main.cpp index d60b153b..3cad3b5f 100644 --- a/src/tools/exd_struct_gen/main.cpp +++ b/src/tools/exd_struct_gen/main.cpp @@ -45,8 +45,8 @@ std::vector< std::string > cppKeyWords "class" }; -//std::string datLocation( "/opt/sapphire_3_15_0/bin/sqpack" ); -std::string datLocation( "C:\\SquareEnix\\FINAL FANTASY XIV - A Realm Reborn\\game\\sqpack" ); +std::string datLocation( "/home/mordred/sqpack" ); +//std::string datLocation( "C:\\SquareEnix\\FINAL FANTASY XIV - A Realm Reborn\\game\\sqpack" ); std::map< uint8_t, std::string > g_typeMap; @@ -117,29 +117,57 @@ std::string generateStruct( const std::string& exd ) std::ifstream exJson( "ex.json" ); exJson >> json; - for( auto& definition : json["sheets"][exd] ) + for( auto& sheet : json[ "sheets" ] ) { - uint32_t index; - std::string converterTarget = ""; - bool isRepeat = false; - int num = 0; - - index = definition["index"].get< uint32_t >(); - indexToNameMap[ index ] = std::string( definition["name"] ); - - converterTarget = std::string( definition["converter"]["target"] ); - if( nameTaken.find( converterTarget ) != nameTaken.end() ) - indexToTarget[ index ] = converterTarget; - - if( auto count = definition["count"] ) + if( sheet[ "sheet" ] != exd ) + continue; + + for( auto& definition : sheet[ "definitions" ] ) { - num = std::stoi( std::string( count ) ); - isRepeat = true; - indexIsArrayMap[ index ] = true; - indexCountMap[ index ] = num; + uint32_t index; + std::string converterTarget = ""; + bool isRepeat = false; + int num = 0; + try + { + index = definition.at( "index" ); + } + catch( ... ) + { + index = 0; + } + + try + { + std::string fieldName = std::string( definition.at( "name" ) ); + indexToNameMap[ index ] = fieldName; + } + catch( ... ) + { + } - std::string fName = definition["definition"]["name"]; - indexToNameMap[ index ] = fName; + try + { + converterTarget = std::string( definition.at( "converter" ).at( "target" ) ); + if( nameTaken.find( converterTarget ) != nameTaken.end() ) + indexToTarget[ index ] = converterTarget; + } + catch( ... ) + { + } + + try + { + num = definition.at( "count" ); + isRepeat = true; + indexIsArrayMap[ index ] = true; + indexCountMap[ index ] = num; + std::string fName = definition.at( "definition" ).at( "name" ); + indexToNameMap[ index ] = fName; + } + catch( ... ) + { + } } @@ -213,7 +241,15 @@ std::string generateStruct( const std::string& exd ) count++; } - result += "\n " + exd + "( uint32_t row_id, Core::Data::ExdDataGenerated* exdData );\n"; + auto exhHead = exh.get_header(); + if( exhHead.variant == 2 ) + { + result += "\n " + exd + "( uint32_t row_id, uint32_t subRow, Core::Data::ExdDataGenerated* exdData );\n"; + } + else + { + result += "\n " + exd + "( uint32_t row_id, Core::Data::ExdDataGenerated* exdData );\n"; + } result += "};\n\n"; return result; @@ -229,11 +265,20 @@ std::string generateConstructorsDecl( const std::string& exd ) int count = 0; - - result += "\nCore::Data::" + exd + "::" + exd + "( uint32_t row_id, Core::Data::ExdDataGenerated* exdData )\n"; - result += "{\n"; std::string indent = " "; - result += indent + "auto row = exdData->m_" + exd + "Dat.get_row( row_id );\n"; + auto exhHead = exh.get_header(); + if( exhHead.variant == 2 ) + { + result += "\nCore::Data::" + exd + "::" + exd + "( uint32_t row_id, uint32_t subRow, Core::Data::ExdDataGenerated* exdData )\n"; + result += "{\n"; + result += indent + "auto row = exdData->m_" + exd + "Dat.get_row( row_id, subRow );\n"; + } + else + { + result += "\nCore::Data::" + exd + "::" + exd + "( uint32_t row_id, Core::Data::ExdDataGenerated* exdData )\n"; + result += "{\n"; + result += indent + "auto row = exdData->m_" + exd + "Dat.get_row( row_id );\n"; + } for( auto member : exhMem ) { if( indexToNameMap.find( count ) == indexToNameMap.end() ) @@ -333,22 +378,20 @@ int main( int argc, char** argv ) //BOOST_FOREACH( boost::property_tree::ptree::value_type &sheet, m_propTree.get_child( "sheets" ) ) //{ - //std::string name = sheet.second.get< std::string >( "sheet" ); //nameTaken[name] = "1"; //} - - for( auto& sheet : json["sheets"] ) - { - std::string name = json["sheet"]; - - forwards += "struct " + name + ";\n"; - structDefs += generateStruct( name ); - dataDecl += generateDatAccessDecl( name ); - idListsDecl += generateIdListDecl( name ); - getterDecl += generateDirectGetters( name ); - datAccCall += generateSetDatAccessCall( name ); - constructorDecl += generateConstructorsDecl( name ); - idListGetters += generateIdListGetter( name ); + // + for( auto& sheet : json[ "sheets" ] ) + { + std::string name = sheet[ "sheet" ]; + forwards += "struct " + name + ";\n"; + structDefs += generateStruct( name ); + dataDecl += generateDatAccessDecl( name ); + idListsDecl += generateIdListDecl( name ); + getterDecl += generateDirectGetters( name ); + datAccCall += generateSetDatAccessCall( name ); + constructorDecl += generateConstructorsDecl( name ); + idListGetters += generateIdListGetter( name ); } getterDecl += From 32c6ef0b7c2616a24185035a745a6ddac67fa7ac Mon Sep 17 00:00:00 2001 From: Mordred Date: Fri, 23 Nov 2018 21:16:02 +0100 Subject: [PATCH 02/14] Fixed exd to work with generated data, also fixed generator ( boost leftovers ) --- src/common/Exd/ExdDataGenerated.cpp | 633 ++++++- src/common/Exd/ExdDataGenerated.h | 1538 +++++++++++------ src/servers/Scripts/common/WarpTaxi.cpp | 5 +- .../Network/Handlers/CFHandlers.cpp | 2 +- src/servers/sapphire_zone/Zone/Land.cpp | 14 +- .../sapphire_zone/Zone/TerritoryMgr.cpp | 2 +- src/tools/exd_struct_gen/ExdData.cpp.tmpl | 4 +- src/tools/exd_struct_gen/ExdData.h.tmpl | 8 +- src/tools/exd_struct_gen/main.cpp | 4 +- 9 files changed, 1620 insertions(+), 590 deletions(-) diff --git a/src/common/Exd/ExdDataGenerated.cpp b/src/common/Exd/ExdDataGenerated.cpp index aafcb458..d6585c1a 100644 --- a/src/common/Exd/ExdDataGenerated.cpp +++ b/src/common/Exd/ExdDataGenerated.cpp @@ -1,10 +1,6 @@ #include "ExdDataGenerated.h" #include -#include - - - Core::Data::Achievement::Achievement( uint32_t row_id, Core::Data::ExdDataGenerated* exdData ) { auto row = exdData->m_AchievementDat.get_row( row_id ); @@ -26,6 +22,7 @@ Core::Data::Achievement::Achievement( uint32_t row_id, Core::Data::ExdDataGenera data.push_back( exdData->getField< int32_t >( row, 16 ) ); data.push_back( exdData->getField< int32_t >( row, 17 ) ); order = exdData->getField< uint16_t >( row, 18 ); + initialHide = exdData->getField< bool >( row, 20 ); } Core::Data::AchievementCategory::AchievementCategory( uint32_t row_id, Core::Data::ExdDataGenerated* exdData ) @@ -33,6 +30,7 @@ Core::Data::AchievementCategory::AchievementCategory( uint32_t row_id, Core::Dat auto row = exdData->m_AchievementCategoryDat.get_row( row_id ); name = exdData->getField< std::string >( row, 0 ); achievementKind = exdData->getField< uint8_t >( row, 1 ); + hideCategory = exdData->getField< bool >( row, 3 ); } Core::Data::AchievementKind::AchievementKind( uint32_t row_id, Core::Data::ExdDataGenerated* exdData ) @@ -199,9 +197,9 @@ Core::Data::Addon::Addon( uint32_t row_id, Core::Data::ExdDataGenerated* exdData Core::Data::AddonHud::AddonHud( uint32_t row_id, Core::Data::ExdDataGenerated* exdData ) { auto row = exdData->m_AddonHudDat.get_row( row_id ); - longs = exdData->getField< std::string >( row, 0 ); - shorts = exdData->getField< std::string >( row, 1 ); - function = exdData->getField< std::string >( row, 2 ); + _long = exdData->getField< std::string >( row, 0 ); + _short = exdData->getField< std::string >( row, 1 ); + _function = exdData->getField< std::string >( row, 2 ); } Core::Data::Adventure::Adventure( uint32_t row_id, Core::Data::ExdDataGenerated* exdData ) @@ -268,6 +266,13 @@ Core::Data::AetherialWheel::AetherialWheel( uint32_t row_id, Core::Data::ExdData Core::Data::Aetheryte::Aetheryte( uint32_t row_id, Core::Data::ExdDataGenerated* exdData ) { auto row = exdData->m_AetheryteDat.get_row( row_id ); + singular = exdData->getField< std::string >( row, 0 ); + adjective = exdData->getField< int8_t >( row, 1 ); + plural = exdData->getField< std::string >( row, 2 ); + possessivePronoun = exdData->getField< int8_t >( row, 3 ); + startsWithVowel = exdData->getField< int8_t >( row, 4 ); + pronoun = exdData->getField< int8_t >( row, 6 ); + article = exdData->getField< int8_t >( row, 7 ); placeName = exdData->getField< uint16_t >( row, 8 ); aethernetName = exdData->getField< uint16_t >( row, 9 ); territory = exdData->getField< uint16_t >( row, 10 ); @@ -357,9 +362,9 @@ Core::Data::AnimaWeapon5PatternGroup::AnimaWeapon5PatternGroup( uint32_t row_id, name = exdData->getField< std::string >( row, 0 ); } -Core::Data::AnimaWeapon5SpiritTalk::AnimaWeapon5SpiritTalk( uint32_t row_id, Core::Data::ExdDataGenerated* exdData ) +Core::Data::AnimaWeapon5SpiritTalk::AnimaWeapon5SpiritTalk( uint32_t row_id, uint32_t subRow, Core::Data::ExdDataGenerated* exdData ) { - auto row = exdData->m_AnimaWeapon5SpiritTalkDat.get_row( row_id ); + auto row = exdData->m_AnimaWeapon5SpiritTalkDat.get_row( row_id, subRow ); dialogue = exdData->getField< int32_t >( row, 0 ); } @@ -378,9 +383,9 @@ Core::Data::AnimaWeapon5TradeItem::AnimaWeapon5TradeItem( uint32_t row_id, Core: category = exdData->getField< uint8_t >( row, 27 ); } -Core::Data::AnimaWeaponFUITalk::AnimaWeaponFUITalk( uint32_t row_id, Core::Data::ExdDataGenerated* exdData ) +Core::Data::AnimaWeaponFUITalk::AnimaWeaponFUITalk( uint32_t row_id, uint32_t subRow, Core::Data::ExdDataGenerated* exdData ) { - auto row = exdData->m_AnimaWeaponFUITalkDat.get_row( row_id ); + auto row = exdData->m_AnimaWeaponFUITalkDat.get_row( row_id, subRow ); dialogue = exdData->getField< int32_t >( row, 0 ); } @@ -476,6 +481,7 @@ Core::Data::Balloon::Balloon( uint32_t row_id, Core::Data::ExdDataGenerated* exd Core::Data::BaseParam::BaseParam( uint32_t row_id, Core::Data::ExdDataGenerated* exdData ) { auto row = exdData->m_BaseParamDat.get_row( row_id ); + order = exdData->getField< int8_t >( row, 0 ); name = exdData->getField< std::string >( row, 1 ); description = exdData->getField< std::string >( row, 2 ); oneHWpn = exdData->getField< uint8_t >( row, 4 ); @@ -582,9 +588,9 @@ Core::Data::BeastTribe::BeastTribe( uint32_t row_id, Core::Data::ExdDataGenerate nameRelation = exdData->getField< std::string >( row, 18 ); } -Core::Data::Behavior::Behavior( uint32_t row_id, Core::Data::ExdDataGenerated* exdData ) +Core::Data::Behavior::Behavior( uint32_t row_id, uint32_t subRow, Core::Data::ExdDataGenerated* exdData ) { - auto row = exdData->m_BehaviorDat.get_row( row_id ); + auto row = exdData->m_BehaviorDat.get_row( row_id, subRow ); balloon = exdData->getField< uint16_t >( row, 6 ); } @@ -609,9 +615,9 @@ Core::Data::BGMSituation::BGMSituation( uint32_t row_id, Core::Data::ExdDataGene bGMField = exdData->getField< uint16_t >( row, 3 ); } -Core::Data::BGMSwitch::BGMSwitch( uint32_t row_id, Core::Data::ExdDataGenerated* exdData ) +Core::Data::BGMSwitch::BGMSwitch( uint32_t row_id, uint32_t subRow, Core::Data::ExdDataGenerated* exdData ) { - auto row = exdData->m_BGMSwitchDat.get_row( row_id ); + auto row = exdData->m_BGMSwitchDat.get_row( row_id, subRow ); bGMSystemDefine = exdData->getField< uint8_t >( row, 0 ); quest = exdData->getField< uint32_t >( row, 1 ); } @@ -676,8 +682,12 @@ Core::Data::BNpcName::BNpcName( uint32_t row_id, Core::Data::ExdDataGenerated* e { auto row = exdData->m_BNpcNameDat.get_row( row_id ); singular = exdData->getField< std::string >( row, 0 ); + adjective = exdData->getField< int8_t >( row, 1 ); plural = exdData->getField< std::string >( row, 2 ); + possessivePronoun = exdData->getField< int8_t >( row, 3 ); startsWithVowel = exdData->getField< int8_t >( row, 4 ); + pronoun = exdData->getField< int8_t >( row, 6 ); + article = exdData->getField< int8_t >( row, 7 ); } Core::Data::BNpcParts::BNpcParts( uint32_t row_id, Core::Data::ExdDataGenerated* exdData ) @@ -739,9 +749,12 @@ Core::Data::BuddyEquip::BuddyEquip( uint32_t row_id, Core::Data::ExdDataGenerate { auto row = exdData->m_BuddyEquipDat.get_row( row_id ); singular = exdData->getField< std::string >( row, 0 ); + adjective = exdData->getField< int8_t >( row, 1 ); plural = exdData->getField< std::string >( row, 2 ); + possessivePronoun = exdData->getField< int8_t >( row, 3 ); startsWithVowel = exdData->getField< int8_t >( row, 4 ); - rarity = exdData->getField< int8_t >( row, 5 ); + pronoun = exdData->getField< int8_t >( row, 6 ); + article = exdData->getField< int8_t >( row, 7 ); name = exdData->getField< std::string >( row, 8 ); modelTop = exdData->getField< int32_t >( row, 9 ); modelBody = exdData->getField< int32_t >( row, 10 ); @@ -1077,9 +1090,13 @@ Core::Data::Companion::Companion( uint32_t row_id, Core::Data::ExdDataGenerated* { auto row = exdData->m_CompanionDat.get_row( row_id ); singular = exdData->getField< std::string >( row, 0 ); + adjective = exdData->getField< int8_t >( row, 1 ); plural = exdData->getField< std::string >( row, 2 ); + possessivePronoun = exdData->getField< int8_t >( row, 3 ); startsWithVowel = exdData->getField< int8_t >( row, 4 ); - rarity = exdData->getField< int8_t >( row, 5 ); + pronoun = exdData->getField< int8_t >( row, 6 ); + article = exdData->getField< int8_t >( row, 7 ); + model = exdData->getField< uint16_t >( row, 8 ); behavior = exdData->getField< uint8_t >( row, 14 ); icon = exdData->getField< uint16_t >( row, 26 ); cost = exdData->getField< uint8_t >( row, 30 ); @@ -1247,7 +1264,7 @@ Core::Data::ContentFinderCondition::ContentFinderCondition( uint32_t row_id, Cor auto row = exdData->m_ContentFinderConditionDat.get_row( row_id ); territoryType = exdData->getField< uint16_t >( row, 1 ); contentLinkType = exdData->getField< uint8_t >( row, 2 ); - instanceContent = exdData->getField< uint16_t >( row, 3 ); + content = exdData->getField< uint16_t >( row, 3 ); contentMemberType = exdData->getField< uint8_t >( row, 9 ); classJobLevelRequired = exdData->getField< uint8_t >( row, 15 ); classJobLevelSync = exdData->getField< uint8_t >( row, 16 ); @@ -1255,6 +1272,7 @@ Core::Data::ContentFinderCondition::ContentFinderCondition( uint32_t row_id, Cor itemLevelSync = exdData->getField< uint16_t >( row, 18 ); allowReplacement = exdData->getField< bool >( row, 20 ); highEndDuty = exdData->getField< bool >( row, 26 ); + dutyRecorderAllowed = exdData->getField< bool >( row, 30 ); name = exdData->getField< std::string >( row, 32 ); contentType = exdData->getField< uint8_t >( row, 33 ); transient = exdData->getField< uint8_t >( row, 34 ); @@ -1415,9 +1433,9 @@ Core::Data::CraftType::CraftType( uint32_t row_id, Core::Data::ExdDataGenerated* name = exdData->getField< std::string >( row, 2 ); } -Core::Data::Credit::Credit( uint32_t row_id, Core::Data::ExdDataGenerated* exdData ) +Core::Data::Credit::Credit( uint32_t row_id, uint32_t subRow, Core::Data::ExdDataGenerated* exdData ) { - auto row = exdData->m_CreditDat.get_row( row_id ); + auto row = exdData->m_CreditDat.get_row( row_id, subRow ); roles1 = exdData->getField< uint16_t >( row, 1 ); japaneseCast1 = exdData->getField< uint16_t >( row, 2 ); englishCast1 = exdData->getField< uint16_t >( row, 3 ); @@ -1556,9 +1574,12 @@ Core::Data::DeepDungeonEquipment::DeepDungeonEquipment( uint32_t row_id, Core::D auto row = exdData->m_DeepDungeonEquipmentDat.get_row( row_id ); icon = exdData->getField< uint32_t >( row, 0 ); singular = exdData->getField< std::string >( row, 1 ); + adjective = exdData->getField< int8_t >( row, 2 ); plural = exdData->getField< std::string >( row, 3 ); + possessivePronoun = exdData->getField< int8_t >( row, 4 ); startsWithVowel = exdData->getField< int8_t >( row, 5 ); - rarity = exdData->getField< int8_t >( row, 6 ); + pronoun = exdData->getField< int8_t >( row, 7 ); + article = exdData->getField< int8_t >( row, 8 ); name = exdData->getField< std::string >( row, 9 ); description = exdData->getField< std::string >( row, 10 ); } @@ -1576,9 +1597,12 @@ Core::Data::DeepDungeonItem::DeepDungeonItem( uint32_t row_id, Core::Data::ExdDa auto row = exdData->m_DeepDungeonItemDat.get_row( row_id ); icon = exdData->getField< uint32_t >( row, 0 ); singular = exdData->getField< std::string >( row, 1 ); + adjective = exdData->getField< int8_t >( row, 2 ); plural = exdData->getField< std::string >( row, 3 ); + possessivePronoun = exdData->getField< int8_t >( row, 4 ); startsWithVowel = exdData->getField< int8_t >( row, 5 ); - rarity = exdData->getField< int8_t >( row, 6 ); + pronoun = exdData->getField< int8_t >( row, 7 ); + article = exdData->getField< int8_t >( row, 8 ); name = exdData->getField< std::string >( row, 9 ); tooltip = exdData->getField< std::string >( row, 10 ); action = exdData->getField< uint32_t >( row, 11 ); @@ -1595,16 +1619,19 @@ Core::Data::DeepDungeonMagicStone::DeepDungeonMagicStone( uint32_t row_id, Core: auto row = exdData->m_DeepDungeonMagicStoneDat.get_row( row_id ); icon = exdData->getField< uint32_t >( row, 0 ); singular = exdData->getField< std::string >( row, 1 ); + adjective = exdData->getField< int8_t >( row, 2 ); plural = exdData->getField< std::string >( row, 3 ); + possessivePronoun = exdData->getField< int8_t >( row, 4 ); startsWithVowel = exdData->getField< int8_t >( row, 5 ); - rarity = exdData->getField< int8_t >( row, 6 ); + pronoun = exdData->getField< int8_t >( row, 7 ); + article = exdData->getField< int8_t >( row, 8 ); name = exdData->getField< std::string >( row, 9 ); tooltip = exdData->getField< std::string >( row, 10 ); } -Core::Data::DeepDungeonMap5X::DeepDungeonMap5X( uint32_t row_id, Core::Data::ExdDataGenerated* exdData ) +Core::Data::DeepDungeonMap5X::DeepDungeonMap5X( uint32_t row_id, uint32_t subRow, Core::Data::ExdDataGenerated* exdData ) { - auto row = exdData->m_DeepDungeonMap5XDat.get_row( row_id ); + auto row = exdData->m_DeepDungeonMap5XDat.get_row( row_id, subRow ); deepDungeonRoom.push_back( exdData->getField< uint16_t >( row, 0 ) ); deepDungeonRoom.push_back( exdData->getField< uint16_t >( row, 1 ) ); deepDungeonRoom.push_back( exdData->getField< uint16_t >( row, 2 ) ); @@ -1665,9 +1692,9 @@ Core::Data::DisposalShopFilterType::DisposalShopFilterType( uint32_t row_id, Cor category = exdData->getField< std::string >( row, 0 ); } -Core::Data::DisposalShopItem::DisposalShopItem( uint32_t row_id, Core::Data::ExdDataGenerated* exdData ) +Core::Data::DisposalShopItem::DisposalShopItem( uint32_t row_id, uint32_t subRow, Core::Data::ExdDataGenerated* exdData ) { - auto row = exdData->m_DisposalShopItemDat.get_row( row_id ); + auto row = exdData->m_DisposalShopItemDat.get_row( row_id, subRow ); itemDisposed = exdData->getField< int32_t >( row, 0 ); itemReceived = exdData->getField< int32_t >( row, 2 ); quantityReceived = exdData->getField< uint32_t >( row, 4 ); @@ -1844,7 +1871,12 @@ Core::Data::ENpcResident::ENpcResident( uint32_t row_id, Core::Data::ExdDataGene { auto row = exdData->m_ENpcResidentDat.get_row( row_id ); singular = exdData->getField< std::string >( row, 0 ); + adjective = exdData->getField< int8_t >( row, 1 ); plural = exdData->getField< std::string >( row, 2 ); + possessivePronoun = exdData->getField< int8_t >( row, 3 ); + startsWithVowel = exdData->getField< int8_t >( row, 4 ); + pronoun = exdData->getField< int8_t >( row, 6 ); + article = exdData->getField< int8_t >( row, 7 ); title = exdData->getField< std::string >( row, 8 ); map = exdData->getField< uint8_t >( row, 9 ); } @@ -1860,6 +1892,12 @@ Core::Data::EObjName::EObjName( uint32_t row_id, Core::Data::ExdDataGenerated* e { auto row = exdData->m_EObjNameDat.get_row( row_id ); singular = exdData->getField< std::string >( row, 0 ); + adjective = exdData->getField< int8_t >( row, 1 ); + plural = exdData->getField< std::string >( row, 2 ); + possessivePronoun = exdData->getField< int8_t >( row, 3 ); + startsWithVowel = exdData->getField< int8_t >( row, 4 ); + pronoun = exdData->getField< int8_t >( row, 6 ); + article = exdData->getField< int8_t >( row, 7 ); } Core::Data::EquipRaceCategory::EquipRaceCategory( uint32_t row_id, Core::Data::ExdDataGenerated* exdData ) @@ -1894,6 +1932,19 @@ Core::Data::EquipSlotCategory::EquipSlotCategory( uint32_t row_id, Core::Data::E soulCrystal = exdData->getField< int8_t >( row, 13 ); } +Core::Data::EurekaAetherItem::EurekaAetherItem( uint32_t row_id, Core::Data::ExdDataGenerated* exdData ) +{ + auto row = exdData->m_EurekaAetherItemDat.get_row( row_id ); + singular = exdData->getField< std::string >( row, 0 ); + adjective = exdData->getField< int8_t >( row, 1 ); + plural = exdData->getField< std::string >( row, 2 ); + possessivePronoun = exdData->getField< int8_t >( row, 3 ); + startsWithVowel = exdData->getField< int8_t >( row, 4 ); + pronoun = exdData->getField< int8_t >( row, 6 ); + article = exdData->getField< int8_t >( row, 7 ); + name = exdData->getField< std::string >( row, 8 ); +} + Core::Data::EurekaAethernet::EurekaAethernet( uint32_t row_id, Core::Data::ExdDataGenerated* exdData ) { auto row = exdData->m_EurekaAethernetDat.get_row( row_id ); @@ -1906,6 +1957,33 @@ Core::Data::EurekaGrowData::EurekaGrowData( uint32_t row_id, Core::Data::ExdData baseResistance = exdData->getField< uint16_t >( row, 0 ); } +Core::Data::EurekaLogosMixerProbability::EurekaLogosMixerProbability( uint32_t row_id, Core::Data::ExdDataGenerated* exdData ) +{ + auto row = exdData->m_EurekaLogosMixerProbabilityDat.get_row( row_id ); + probability = exdData->getField< uint8_t >( row, 0 ); +} + +Core::Data::EurekaMagiaAction::EurekaMagiaAction( uint32_t row_id, Core::Data::ExdDataGenerated* exdData ) +{ + auto row = exdData->m_EurekaMagiaActionDat.get_row( row_id ); + action = exdData->getField< uint32_t >( row, 0 ); + maxUses = exdData->getField< uint8_t >( row, 1 ); +} + +Core::Data::EurekaMagiciteItem::EurekaMagiciteItem( uint32_t row_id, Core::Data::ExdDataGenerated* exdData ) +{ + auto row = exdData->m_EurekaMagiciteItemDat.get_row( row_id ); + eurekaMagiciteItemType = exdData->getField< uint8_t >( row, 0 ); + classJobCategory = exdData->getField< uint8_t >( row, 1 ); + item = exdData->getField< uint32_t >( row, 2 ); +} + +Core::Data::EurekaMagiciteItemType::EurekaMagiciteItemType( uint32_t row_id, Core::Data::ExdDataGenerated* exdData ) +{ + auto row = exdData->m_EurekaMagiciteItemTypeDat.get_row( row_id ); + type = exdData->getField< std::string >( row, 0 ); +} + Core::Data::EurekaSphereElementAdjust::EurekaSphereElementAdjust( uint32_t row_id, Core::Data::ExdDataGenerated* exdData ) { auto row = exdData->m_EurekaSphereElementAdjustDat.get_row( row_id ); @@ -1958,9 +2036,12 @@ Core::Data::EventItem::EventItem( uint32_t row_id, Core::Data::ExdDataGenerated* { auto row = exdData->m_EventItemDat.get_row( row_id ); singular = exdData->getField< std::string >( row, 0 ); + adjective = exdData->getField< int8_t >( row, 1 ); plural = exdData->getField< std::string >( row, 2 ); + possessivePronoun = exdData->getField< int8_t >( row, 3 ); startsWithVowel = exdData->getField< int8_t >( row, 4 ); - rarity = exdData->getField< int8_t >( row, 5 ); + pronoun = exdData->getField< int8_t >( row, 6 ); + article = exdData->getField< int8_t >( row, 7 ); name = exdData->getField< std::string >( row, 9 ); icon = exdData->getField< uint16_t >( row, 10 ); action = exdData->getField< uint16_t >( row, 11 ); @@ -2010,6 +2091,7 @@ Core::Data::Fate::Fate( uint32_t row_id, Core::Data::ExdDataGenerated* exdData ) iconObjective = exdData->getField< uint32_t >( row, 10 ); iconMap = exdData->getField< uint32_t >( row, 11 ); music = exdData->getField< int32_t >( row, 13 ); + hasWorldMapIcon = exdData->getField< bool >( row, 19 ); name = exdData->getField< std::string >( row, 27 ); description = exdData->getField< std::string >( row, 28 ); objective = exdData->getField< std::string >( row, 29 ); @@ -2086,6 +2168,12 @@ Core::Data::FCRights::FCRights( uint32_t row_id, Core::Data::ExdDataGenerated* e fCRank = exdData->getField< uint8_t >( row, 3 ); } +Core::Data::Festival::Festival( uint32_t row_id, Core::Data::ExdDataGenerated* exdData ) +{ + auto row = exdData->m_FestivalDat.get_row( row_id ); + name = exdData->getField< std::string >( row, 0 ); +} + Core::Data::FieldMarker::FieldMarker( uint32_t row_id, Core::Data::ExdDataGenerated* exdData ) { auto row = exdData->m_FieldMarkerDat.get_row( row_id ); @@ -2093,6 +2181,12 @@ Core::Data::FieldMarker::FieldMarker( uint32_t row_id, Core::Data::ExdDataGenera icon = exdData->getField< uint16_t >( row, 1 ); } +Core::Data::FishingRecordType::FishingRecordType( uint32_t row_id, Core::Data::ExdDataGenerated* exdData ) +{ + auto row = exdData->m_FishingRecordTypeDat.get_row( row_id ); + addon = exdData->getField< int32_t >( row, 0 ); +} + Core::Data::FishingRecordTypeTransient::FishingRecordTypeTransient( uint32_t row_id, Core::Data::ExdDataGenerated* exdData ) { auto row = exdData->m_FishingRecordTypeTransientDat.get_row( row_id ); @@ -2129,8 +2223,12 @@ Core::Data::FishParameter::FishParameter( uint32_t row_id, Core::Data::ExdDataGe text = exdData->getField< std::string >( row, 0 ); item = exdData->getField< int32_t >( row, 1 ); gatheringItemLevel = exdData->getField< uint16_t >( row, 2 ); + isHidden = exdData->getField< bool >( row, 3 ); + fishingRecordType = exdData->getField< uint8_t >( row, 5 ); territoryType = exdData->getField< int32_t >( row, 6 ); - isFish = exdData->getField< bool >( row, 7 ); + isInLog = exdData->getField< bool >( row, 7 ); + timeRestricted = exdData->getField< bool >( row, 8 ); + weatherRestricted = exdData->getField< bool >( row, 9 ); gatheringSubCategory = exdData->getField< uint16_t >( row, 10 ); } @@ -2220,9 +2318,9 @@ Core::Data::GatheringItemLevelConvertTable::GatheringItemLevelConvertTable( uint stars = exdData->getField< uint8_t >( row, 1 ); } -Core::Data::GatheringItemPoint::GatheringItemPoint( uint32_t row_id, Core::Data::ExdDataGenerated* exdData ) +Core::Data::GatheringItemPoint::GatheringItemPoint( uint32_t row_id, uint32_t subRow, Core::Data::ExdDataGenerated* exdData ) { - auto row = exdData->m_GatheringItemPointDat.get_row( row_id ); + auto row = exdData->m_GatheringItemPointDat.get_row( row_id, subRow ); gatheringPoint = exdData->getField< uint32_t >( row, 0 ); } @@ -2390,8 +2488,12 @@ Core::Data::GatheringPointName::GatheringPointName( uint32_t row_id, Core::Data: { auto row = exdData->m_GatheringPointNameDat.get_row( row_id ); singular = exdData->getField< std::string >( row, 0 ); + adjective = exdData->getField< int8_t >( row, 1 ); plural = exdData->getField< std::string >( row, 2 ); + possessivePronoun = exdData->getField< int8_t >( row, 3 ); startsWithVowel = exdData->getField< int8_t >( row, 4 ); + pronoun = exdData->getField< int8_t >( row, 6 ); + article = exdData->getField< int8_t >( row, 7 ); } Core::Data::GatheringSubCategory::GatheringSubCategory( uint32_t row_id, Core::Data::ExdDataGenerated* exdData ) @@ -2468,48 +2570,78 @@ Core::Data::GcArmyTraining::GcArmyTraining( uint32_t row_id, Core::Data::ExdData Core::Data::GCRankGridaniaFemaleText::GCRankGridaniaFemaleText( uint32_t row_id, Core::Data::ExdDataGenerated* exdData ) { auto row = exdData->m_GCRankGridaniaFemaleTextDat.get_row( row_id ); - name = exdData->getField< std::string >( row, 0 ); + singular = exdData->getField< std::string >( row, 0 ); + adjective = exdData->getField< int8_t >( row, 1 ); plural = exdData->getField< std::string >( row, 2 ); + possessivePronoun = exdData->getField< int8_t >( row, 3 ); + startsWithVowel = exdData->getField< int8_t >( row, 4 ); + pronoun = exdData->getField< int8_t >( row, 6 ); + article = exdData->getField< int8_t >( row, 7 ); nameRank = exdData->getField< std::string >( row, 8 ); } Core::Data::GCRankGridaniaMaleText::GCRankGridaniaMaleText( uint32_t row_id, Core::Data::ExdDataGenerated* exdData ) { auto row = exdData->m_GCRankGridaniaMaleTextDat.get_row( row_id ); - name = exdData->getField< std::string >( row, 0 ); + singular = exdData->getField< std::string >( row, 0 ); + adjective = exdData->getField< int8_t >( row, 1 ); plural = exdData->getField< std::string >( row, 2 ); + possessivePronoun = exdData->getField< int8_t >( row, 3 ); + startsWithVowel = exdData->getField< int8_t >( row, 4 ); + pronoun = exdData->getField< int8_t >( row, 6 ); + article = exdData->getField< int8_t >( row, 7 ); nameRank = exdData->getField< std::string >( row, 8 ); } Core::Data::GCRankLimsaFemaleText::GCRankLimsaFemaleText( uint32_t row_id, Core::Data::ExdDataGenerated* exdData ) { auto row = exdData->m_GCRankLimsaFemaleTextDat.get_row( row_id ); - name = exdData->getField< std::string >( row, 0 ); + singular = exdData->getField< std::string >( row, 0 ); + adjective = exdData->getField< int8_t >( row, 1 ); plural = exdData->getField< std::string >( row, 2 ); + possessivePronoun = exdData->getField< int8_t >( row, 3 ); + startsWithVowel = exdData->getField< int8_t >( row, 4 ); + pronoun = exdData->getField< int8_t >( row, 6 ); + article = exdData->getField< int8_t >( row, 7 ); nameRank = exdData->getField< std::string >( row, 8 ); } Core::Data::GCRankLimsaMaleText::GCRankLimsaMaleText( uint32_t row_id, Core::Data::ExdDataGenerated* exdData ) { auto row = exdData->m_GCRankLimsaMaleTextDat.get_row( row_id ); - name = exdData->getField< std::string >( row, 0 ); + singular = exdData->getField< std::string >( row, 0 ); + adjective = exdData->getField< int8_t >( row, 1 ); plural = exdData->getField< std::string >( row, 2 ); + possessivePronoun = exdData->getField< int8_t >( row, 3 ); + startsWithVowel = exdData->getField< int8_t >( row, 4 ); + pronoun = exdData->getField< int8_t >( row, 6 ); + article = exdData->getField< int8_t >( row, 7 ); nameRank = exdData->getField< std::string >( row, 8 ); } Core::Data::GCRankUldahFemaleText::GCRankUldahFemaleText( uint32_t row_id, Core::Data::ExdDataGenerated* exdData ) { auto row = exdData->m_GCRankUldahFemaleTextDat.get_row( row_id ); - name = exdData->getField< std::string >( row, 0 ); + singular = exdData->getField< std::string >( row, 0 ); + adjective = exdData->getField< int8_t >( row, 1 ); plural = exdData->getField< std::string >( row, 2 ); + possessivePronoun = exdData->getField< int8_t >( row, 3 ); + startsWithVowel = exdData->getField< int8_t >( row, 4 ); + pronoun = exdData->getField< int8_t >( row, 6 ); + article = exdData->getField< int8_t >( row, 7 ); nameRank = exdData->getField< std::string >( row, 8 ); } Core::Data::GCRankUldahMaleText::GCRankUldahMaleText( uint32_t row_id, Core::Data::ExdDataGenerated* exdData ) { auto row = exdData->m_GCRankUldahMaleTextDat.get_row( row_id ); - name = exdData->getField< std::string >( row, 0 ); + singular = exdData->getField< std::string >( row, 0 ); + adjective = exdData->getField< int8_t >( row, 1 ); plural = exdData->getField< std::string >( row, 2 ); + possessivePronoun = exdData->getField< int8_t >( row, 3 ); + startsWithVowel = exdData->getField< int8_t >( row, 4 ); + pronoun = exdData->getField< int8_t >( row, 6 ); + article = exdData->getField< int8_t >( row, 7 ); nameRank = exdData->getField< std::string >( row, 8 ); } @@ -2521,9 +2653,9 @@ Core::Data::GCScripShopCategory::GCScripShopCategory( uint32_t row_id, Core::Dat subCategory = exdData->getField< int8_t >( row, 2 ); } -Core::Data::GCScripShopItem::GCScripShopItem( uint32_t row_id, Core::Data::ExdDataGenerated* exdData ) +Core::Data::GCScripShopItem::GCScripShopItem( uint32_t row_id, uint32_t subRow, Core::Data::ExdDataGenerated* exdData ) { - auto row = exdData->m_GCScripShopItemDat.get_row( row_id ); + auto row = exdData->m_GCScripShopItemDat.get_row( row_id, subRow ); item = exdData->getField< int32_t >( row, 0 ); requiredGrandCompanyRank = exdData->getField< int32_t >( row, 1 ); costGCSeals = exdData->getField< uint32_t >( row, 2 ); @@ -2588,6 +2720,24 @@ Core::Data::GFATE::GFATE( uint32_t row_id, Core::Data::ExdDataGenerated* exdData icon.push_back( exdData->getField< uint32_t >( row, 37 ) ); } +Core::Data::GFateClimbing2::GFateClimbing2( uint32_t row_id, Core::Data::ExdDataGenerated* exdData ) +{ + auto row = exdData->m_GFateClimbing2Dat.get_row( row_id ); + contentEntry = exdData->getField< uint32_t >( row, 0 ); +} + +Core::Data::GFateClimbing2Content::GFateClimbing2Content( uint32_t row_id, Core::Data::ExdDataGenerated* exdData ) +{ + auto row = exdData->m_GFateClimbing2ContentDat.get_row( row_id ); + publicContentTextData = exdData->getField< uint32_t >( row, 0 ); +} + +Core::Data::GFateClimbing2TotemType::GFateClimbing2TotemType( uint32_t row_id, Core::Data::ExdDataGenerated* exdData ) +{ + auto row = exdData->m_GFateClimbing2TotemTypeDat.get_row( row_id ); + publicContentTextData = exdData->getField< uint32_t >( row, 0 ); +} + Core::Data::GilShop::GilShop( uint32_t row_id, Core::Data::ExdDataGenerated* exdData ) { auto row = exdData->m_GilShopDat.get_row( row_id ); @@ -2601,9 +2751,9 @@ Core::Data::GilShop::GilShop( uint32_t row_id, Core::Data::ExdDataGenerated* exd failTalk = exdData->getField< int32_t >( row, 7 ); } -Core::Data::GilShopItem::GilShopItem( uint32_t row_id, Core::Data::ExdDataGenerated* exdData ) +Core::Data::GilShopItem::GilShopItem( uint32_t row_id, uint32_t subRow, Core::Data::ExdDataGenerated* exdData ) { - auto row = exdData->m_GilShopItemDat.get_row( row_id ); + auto row = exdData->m_GilShopItemDat.get_row( row_id, subRow ); item = exdData->getField< int32_t >( row, 0 ); rowRequired.push_back( exdData->getField< int32_t >( row, 3 ) ); rowRequired.push_back( exdData->getField< int32_t >( row, 4 ) ); @@ -2711,9 +2861,17 @@ Core::Data::HousingAethernet::HousingAethernet( uint32_t row_id, Core::Data::Exd order = exdData->getField< uint8_t >( row, 3 ); } -Core::Data::HousingEmploymentNpcList::HousingEmploymentNpcList( uint32_t row_id, Core::Data::ExdDataGenerated* exdData ) +Core::Data::HousingAppeal::HousingAppeal( uint32_t row_id, Core::Data::ExdDataGenerated* exdData ) { - auto row = exdData->m_HousingEmploymentNpcListDat.get_row( row_id ); + auto row = exdData->m_HousingAppealDat.get_row( row_id ); + tag = exdData->getField< std::string >( row, 0 ); + icon = exdData->getField< uint32_t >( row, 1 ); + order = exdData->getField< uint8_t >( row, 2 ); +} + +Core::Data::HousingEmploymentNpcList::HousingEmploymentNpcList( uint32_t row_id, uint32_t subRow, Core::Data::ExdDataGenerated* exdData ) +{ + auto row = exdData->m_HousingEmploymentNpcListDat.get_row( row_id, subRow ); race = exdData->getField< uint8_t >( row, 0 ); eNpcBase.push_back( exdData->getField< uint32_t >( row, 1 ) ); eNpcBase.push_back( exdData->getField< uint32_t >( row, 2 ) ); @@ -2725,6 +2883,14 @@ Core::Data::HousingEmploymentNpcRace::HousingEmploymentNpcRace( uint32_t row_id, race = exdData->getField< std::string >( row, 0 ); } +Core::Data::HousingExterior::HousingExterior( uint32_t row_id, Core::Data::ExdDataGenerated* exdData ) +{ + auto row = exdData->m_HousingExteriorDat.get_row( row_id ); + placeName = exdData->getField< uint16_t >( row, 2 ); + housingSize = exdData->getField< uint8_t >( row, 3 ); + model = exdData->getField< std::string >( row, 4 ); +} + Core::Data::HousingFurniture::HousingFurniture( uint32_t row_id, Core::Data::ExdDataGenerated* exdData ) { auto row = exdData->m_HousingFurnitureDat.get_row( row_id ); @@ -2733,23 +2899,151 @@ Core::Data::HousingFurniture::HousingFurniture( uint32_t row_id, Core::Data::Exd usageType = exdData->getField< uint8_t >( row, 2 ); usageParameter = exdData->getField< uint32_t >( row, 3 ); housingLayoutLimit = exdData->getField< uint8_t >( row, 4 ); - customTalk = exdData->getField< uint8_t >( row, 5 ); - event = exdData->getField< uint32_t >( row, 6 ); + aquariumTier = exdData->getField< uint8_t >( row, 5 ); + customTalk = exdData->getField< uint32_t >( row, 6 ); item = exdData->getField< uint32_t >( row, 7 ); destroyOnRemoval = exdData->getField< bool >( row, 8 ); tooltip = exdData->getField< bool >( row, 9 ); } +Core::Data::HousingMapMarkerInfo::HousingMapMarkerInfo( uint32_t row_id, uint32_t subRow, Core::Data::ExdDataGenerated* exdData ) +{ + auto row = exdData->m_HousingMapMarkerInfoDat.get_row( row_id, subRow ); + map = exdData->getField< uint16_t >( row, 4 ); +} + +Core::Data::HousingMerchantPose::HousingMerchantPose( uint32_t row_id, Core::Data::ExdDataGenerated* exdData ) +{ + auto row = exdData->m_HousingMerchantPoseDat.get_row( row_id ); + actionTimeline = exdData->getField< uint16_t >( row, 0 ); + pose = exdData->getField< std::string >( row, 1 ); +} + Core::Data::HousingLandSet::HousingLandSet( uint32_t row_id, Core::Data::ExdDataGenerated* exdData ) { - auto row = exdData->m_HousingLandSetDat.get_row( row_id ); - for ( int i = 0; i < 60; i++ ) - sizes.push_back( exdData->getField< uint8_t >( row, i ) ); - for ( int i = 60; i < 60 + 60; i++ ) - minPrices.push_back( exdData->getField< uint32_t >( row, i ) ); - for ( int i = 300; i < 300 + 60; i++ ) - prices.push_back( exdData->getField< uint32_t >( row, i ) ); - + auto row = exdData->m_HousingLandSetDat.get_row( row_id ); + plotSize.push_back( exdData->getField< uint8_t >( row, 0 ) ); + plotSize.push_back( exdData->getField< uint8_t >( row, 1 ) ); + plotSize.push_back( exdData->getField< uint8_t >( row, 2 ) ); + plotSize.push_back( exdData->getField< uint8_t >( row, 3 ) ); + plotSize.push_back( exdData->getField< uint8_t >( row, 4 ) ); + plotSize.push_back( exdData->getField< uint8_t >( row, 5 ) ); + plotSize.push_back( exdData->getField< uint8_t >( row, 6 ) ); + plotSize.push_back( exdData->getField< uint8_t >( row, 7 ) ); + plotSize.push_back( exdData->getField< uint8_t >( row, 8 ) ); + plotSize.push_back( exdData->getField< uint8_t >( row, 9 ) ); + plotSize.push_back( exdData->getField< uint8_t >( row, 10 ) ); + plotSize.push_back( exdData->getField< uint8_t >( row, 11 ) ); + plotSize.push_back( exdData->getField< uint8_t >( row, 12 ) ); + plotSize.push_back( exdData->getField< uint8_t >( row, 13 ) ); + plotSize.push_back( exdData->getField< uint8_t >( row, 14 ) ); + plotSize.push_back( exdData->getField< uint8_t >( row, 15 ) ); + plotSize.push_back( exdData->getField< uint8_t >( row, 16 ) ); + plotSize.push_back( exdData->getField< uint8_t >( row, 17 ) ); + plotSize.push_back( exdData->getField< uint8_t >( row, 18 ) ); + plotSize.push_back( exdData->getField< uint8_t >( row, 19 ) ); + plotSize.push_back( exdData->getField< uint8_t >( row, 20 ) ); + plotSize.push_back( exdData->getField< uint8_t >( row, 21 ) ); + plotSize.push_back( exdData->getField< uint8_t >( row, 22 ) ); + plotSize.push_back( exdData->getField< uint8_t >( row, 23 ) ); + plotSize.push_back( exdData->getField< uint8_t >( row, 24 ) ); + plotSize.push_back( exdData->getField< uint8_t >( row, 25 ) ); + plotSize.push_back( exdData->getField< uint8_t >( row, 26 ) ); + plotSize.push_back( exdData->getField< uint8_t >( row, 27 ) ); + plotSize.push_back( exdData->getField< uint8_t >( row, 28 ) ); + plotSize.push_back( exdData->getField< uint8_t >( row, 29 ) ); + plotSize.push_back( exdData->getField< uint8_t >( row, 30 ) ); + plotSize.push_back( exdData->getField< uint8_t >( row, 31 ) ); + plotSize.push_back( exdData->getField< uint8_t >( row, 32 ) ); + plotSize.push_back( exdData->getField< uint8_t >( row, 33 ) ); + plotSize.push_back( exdData->getField< uint8_t >( row, 34 ) ); + plotSize.push_back( exdData->getField< uint8_t >( row, 35 ) ); + plotSize.push_back( exdData->getField< uint8_t >( row, 36 ) ); + plotSize.push_back( exdData->getField< uint8_t >( row, 37 ) ); + plotSize.push_back( exdData->getField< uint8_t >( row, 38 ) ); + plotSize.push_back( exdData->getField< uint8_t >( row, 39 ) ); + plotSize.push_back( exdData->getField< uint8_t >( row, 40 ) ); + plotSize.push_back( exdData->getField< uint8_t >( row, 41 ) ); + plotSize.push_back( exdData->getField< uint8_t >( row, 42 ) ); + plotSize.push_back( exdData->getField< uint8_t >( row, 43 ) ); + plotSize.push_back( exdData->getField< uint8_t >( row, 44 ) ); + plotSize.push_back( exdData->getField< uint8_t >( row, 45 ) ); + plotSize.push_back( exdData->getField< uint8_t >( row, 46 ) ); + plotSize.push_back( exdData->getField< uint8_t >( row, 47 ) ); + plotSize.push_back( exdData->getField< uint8_t >( row, 48 ) ); + plotSize.push_back( exdData->getField< uint8_t >( row, 49 ) ); + plotSize.push_back( exdData->getField< uint8_t >( row, 50 ) ); + plotSize.push_back( exdData->getField< uint8_t >( row, 51 ) ); + plotSize.push_back( exdData->getField< uint8_t >( row, 52 ) ); + plotSize.push_back( exdData->getField< uint8_t >( row, 53 ) ); + plotSize.push_back( exdData->getField< uint8_t >( row, 54 ) ); + plotSize.push_back( exdData->getField< uint8_t >( row, 55 ) ); + plotSize.push_back( exdData->getField< uint8_t >( row, 56 ) ); + plotSize.push_back( exdData->getField< uint8_t >( row, 57 ) ); + plotSize.push_back( exdData->getField< uint8_t >( row, 58 ) ); + plotSize.push_back( exdData->getField< uint8_t >( row, 59 ) ); + for ( int i = 60; i < 60 + 60; i++ ) + minPrice.push_back( exdData->getField< uint32_t >( row, i ) ); + initialPrice.push_back( exdData->getField< uint32_t >( row, 300 ) ); + initialPrice.push_back( exdData->getField< uint32_t >( row, 301 ) ); + initialPrice.push_back( exdData->getField< uint32_t >( row, 302 ) ); + initialPrice.push_back( exdData->getField< uint32_t >( row, 303 ) ); + initialPrice.push_back( exdData->getField< uint32_t >( row, 304 ) ); + initialPrice.push_back( exdData->getField< uint32_t >( row, 305 ) ); + initialPrice.push_back( exdData->getField< uint32_t >( row, 306 ) ); + initialPrice.push_back( exdData->getField< uint32_t >( row, 307 ) ); + initialPrice.push_back( exdData->getField< uint32_t >( row, 308 ) ); + initialPrice.push_back( exdData->getField< uint32_t >( row, 309 ) ); + initialPrice.push_back( exdData->getField< uint32_t >( row, 310 ) ); + initialPrice.push_back( exdData->getField< uint32_t >( row, 311 ) ); + initialPrice.push_back( exdData->getField< uint32_t >( row, 312 ) ); + initialPrice.push_back( exdData->getField< uint32_t >( row, 313 ) ); + initialPrice.push_back( exdData->getField< uint32_t >( row, 314 ) ); + initialPrice.push_back( exdData->getField< uint32_t >( row, 315 ) ); + initialPrice.push_back( exdData->getField< uint32_t >( row, 316 ) ); + initialPrice.push_back( exdData->getField< uint32_t >( row, 317 ) ); + initialPrice.push_back( exdData->getField< uint32_t >( row, 318 ) ); + initialPrice.push_back( exdData->getField< uint32_t >( row, 319 ) ); + initialPrice.push_back( exdData->getField< uint32_t >( row, 320 ) ); + initialPrice.push_back( exdData->getField< uint32_t >( row, 321 ) ); + initialPrice.push_back( exdData->getField< uint32_t >( row, 322 ) ); + initialPrice.push_back( exdData->getField< uint32_t >( row, 323 ) ); + initialPrice.push_back( exdData->getField< uint32_t >( row, 324 ) ); + initialPrice.push_back( exdData->getField< uint32_t >( row, 325 ) ); + initialPrice.push_back( exdData->getField< uint32_t >( row, 326 ) ); + initialPrice.push_back( exdData->getField< uint32_t >( row, 327 ) ); + initialPrice.push_back( exdData->getField< uint32_t >( row, 328 ) ); + initialPrice.push_back( exdData->getField< uint32_t >( row, 329 ) ); + initialPrice.push_back( exdData->getField< uint32_t >( row, 330 ) ); + initialPrice.push_back( exdData->getField< uint32_t >( row, 331 ) ); + initialPrice.push_back( exdData->getField< uint32_t >( row, 332 ) ); + initialPrice.push_back( exdData->getField< uint32_t >( row, 333 ) ); + initialPrice.push_back( exdData->getField< uint32_t >( row, 334 ) ); + initialPrice.push_back( exdData->getField< uint32_t >( row, 335 ) ); + initialPrice.push_back( exdData->getField< uint32_t >( row, 336 ) ); + initialPrice.push_back( exdData->getField< uint32_t >( row, 337 ) ); + initialPrice.push_back( exdData->getField< uint32_t >( row, 338 ) ); + initialPrice.push_back( exdData->getField< uint32_t >( row, 339 ) ); + initialPrice.push_back( exdData->getField< uint32_t >( row, 340 ) ); + initialPrice.push_back( exdData->getField< uint32_t >( row, 341 ) ); + initialPrice.push_back( exdData->getField< uint32_t >( row, 342 ) ); + initialPrice.push_back( exdData->getField< uint32_t >( row, 343 ) ); + initialPrice.push_back( exdData->getField< uint32_t >( row, 344 ) ); + initialPrice.push_back( exdData->getField< uint32_t >( row, 345 ) ); + initialPrice.push_back( exdData->getField< uint32_t >( row, 346 ) ); + initialPrice.push_back( exdData->getField< uint32_t >( row, 347 ) ); + initialPrice.push_back( exdData->getField< uint32_t >( row, 348 ) ); + initialPrice.push_back( exdData->getField< uint32_t >( row, 349 ) ); + initialPrice.push_back( exdData->getField< uint32_t >( row, 350 ) ); + initialPrice.push_back( exdData->getField< uint32_t >( row, 351 ) ); + initialPrice.push_back( exdData->getField< uint32_t >( row, 352 ) ); + initialPrice.push_back( exdData->getField< uint32_t >( row, 353 ) ); + initialPrice.push_back( exdData->getField< uint32_t >( row, 354 ) ); + initialPrice.push_back( exdData->getField< uint32_t >( row, 355 ) ); + initialPrice.push_back( exdData->getField< uint32_t >( row, 356 ) ); + initialPrice.push_back( exdData->getField< uint32_t >( row, 357 ) ); + initialPrice.push_back( exdData->getField< uint32_t >( row, 358 ) ); + initialPrice.push_back( exdData->getField< uint32_t >( row, 359 ) ); } Core::Data::HousingPlacement::HousingPlacement( uint32_t row_id, Core::Data::ExdDataGenerated* exdData ) @@ -2762,7 +3056,14 @@ Core::Data::HousingPreset::HousingPreset( uint32_t row_id, Core::Data::ExdDataGe { auto row = exdData->m_HousingPresetDat.get_row( row_id ); singular = exdData->getField< std::string >( row, 0 ); + adjective = exdData->getField< int8_t >( row, 1 ); plural = exdData->getField< std::string >( row, 2 ); + possessivePronoun = exdData->getField< int8_t >( row, 3 ); + startsWithVowel = exdData->getField< int8_t >( row, 4 ); + pronoun = exdData->getField< int8_t >( row, 6 ); + article = exdData->getField< int8_t >( row, 7 ); + placeName = exdData->getField< uint16_t >( row, 8 ); + housingSize = exdData->getField< uint8_t >( row, 9 ); exteriorRoof = exdData->getField< int32_t >( row, 10 ); exteriorWall = exdData->getField< int32_t >( row, 11 ); exteriorWindow = exdData->getField< int32_t >( row, 12 ); @@ -2779,6 +3080,19 @@ Core::Data::HousingPreset::HousingPreset( uint32_t row_id, Core::Data::ExdDataGe mansionLighting = exdData->getField< int32_t >( row, 23 ); } +Core::Data::HousingUnitedExterior::HousingUnitedExterior( uint32_t row_id, Core::Data::ExdDataGenerated* exdData ) +{ + auto row = exdData->m_HousingUnitedExteriorDat.get_row( row_id ); + item.push_back( exdData->getField< uint32_t >( row, 1 ) ); + item.push_back( exdData->getField< uint32_t >( row, 2 ) ); + item.push_back( exdData->getField< uint32_t >( row, 3 ) ); + item.push_back( exdData->getField< uint32_t >( row, 4 ) ); + item.push_back( exdData->getField< uint32_t >( row, 5 ) ); + item.push_back( exdData->getField< uint32_t >( row, 6 ) ); + item.push_back( exdData->getField< uint32_t >( row, 7 ) ); + item.push_back( exdData->getField< uint32_t >( row, 8 ) ); +} + Core::Data::HousingYardObject::HousingYardObject( uint32_t row_id, Core::Data::ExdDataGenerated* exdData ) { auto row = exdData->m_HousingYardObjectDat.get_row( row_id ); @@ -2845,7 +3159,7 @@ Core::Data::InstanceContent::InstanceContent( uint32_t row_id, Core::Data::ExdDa finalBossCurrencyC = exdData->getField< uint16_t >( row, 25 ); instanceClearExp = exdData->getField< uint32_t >( row, 46 ); instanceContentBuff = exdData->getField< int32_t >( row, 51 ); - territoryType = exdData->getField< uint32_t >( row, 52 ); + reqInstance = exdData->getField< uint32_t >( row, 52 ); partyCondition = exdData->getField< uint8_t >( row, 55 ); } @@ -2866,8 +3180,12 @@ Core::Data::Item::Item( uint32_t row_id, Core::Data::ExdDataGenerated* exdData ) { auto row = exdData->m_ItemDat.get_row( row_id ); singular = exdData->getField< std::string >( row, 0 ); + adjective = exdData->getField< int8_t >( row, 1 ); plural = exdData->getField< std::string >( row, 2 ); + possessivePronoun = exdData->getField< int8_t >( row, 3 ); startsWithVowel = exdData->getField< int8_t >( row, 4 ); + pronoun = exdData->getField< int8_t >( row, 6 ); + article = exdData->getField< int8_t >( row, 7 ); description = exdData->getField< std::string >( row, 8 ); name = exdData->getField< std::string >( row, 9 ); icon = exdData->getField< uint16_t >( row, 10 ); @@ -2950,6 +3268,84 @@ Core::Data::ItemFood::ItemFood( uint32_t row_id, Core::Data::ExdDataGenerated* e auto row = exdData->m_ItemFoodDat.get_row( row_id ); } +Core::Data::ItemLevel::ItemLevel( uint32_t row_id, Core::Data::ExdDataGenerated* exdData ) +{ + auto row = exdData->m_ItemLevelDat.get_row( row_id ); + strength = exdData->getField< uint16_t >( row, 0 ); + dexterity = exdData->getField< uint16_t >( row, 1 ); + vitality = exdData->getField< uint16_t >( row, 2 ); + intelligence = exdData->getField< uint16_t >( row, 3 ); + mind = exdData->getField< uint16_t >( row, 4 ); + piety = exdData->getField< uint16_t >( row, 5 ); + hP = exdData->getField< uint16_t >( row, 6 ); + mP = exdData->getField< uint16_t >( row, 7 ); + tP = exdData->getField< uint16_t >( row, 8 ); + gP = exdData->getField< uint16_t >( row, 9 ); + cP = exdData->getField< uint16_t >( row, 10 ); + physicalDamage = exdData->getField< uint16_t >( row, 11 ); + magicalDamage = exdData->getField< uint16_t >( row, 12 ); + delay = exdData->getField< uint16_t >( row, 13 ); + additionalEffect = exdData->getField< uint16_t >( row, 14 ); + attackSpeed = exdData->getField< uint16_t >( row, 15 ); + blockRate = exdData->getField< uint16_t >( row, 16 ); + blockStrength = exdData->getField< uint16_t >( row, 17 ); + tenacity = exdData->getField< uint16_t >( row, 18 ); + attackPower = exdData->getField< uint16_t >( row, 19 ); + defense = exdData->getField< uint16_t >( row, 20 ); + directHitRate = exdData->getField< uint16_t >( row, 21 ); + evasion = exdData->getField< uint16_t >( row, 22 ); + magicDefense = exdData->getField< uint16_t >( row, 23 ); + criticalHitPower = exdData->getField< uint16_t >( row, 24 ); + criticalHitResilience = exdData->getField< uint16_t >( row, 25 ); + criticalHit = exdData->getField< uint16_t >( row, 26 ); + criticalHitEvasion = exdData->getField< uint16_t >( row, 27 ); + slashingResistance = exdData->getField< uint16_t >( row, 28 ); + piercingResistance = exdData->getField< uint16_t >( row, 29 ); + bluntResistance = exdData->getField< uint16_t >( row, 30 ); + projectileResistance = exdData->getField< uint16_t >( row, 31 ); + attackMagicPotency = exdData->getField< uint16_t >( row, 32 ); + healingMagicPotency = exdData->getField< uint16_t >( row, 33 ); + enhancementMagicPotency = exdData->getField< uint16_t >( row, 34 ); + enfeeblingMagicPotency = exdData->getField< uint16_t >( row, 35 ); + fireResistance = exdData->getField< uint16_t >( row, 36 ); + iceResistance = exdData->getField< uint16_t >( row, 37 ); + windResistance = exdData->getField< uint16_t >( row, 38 ); + earthResistance = exdData->getField< uint16_t >( row, 39 ); + lightningResistance = exdData->getField< uint16_t >( row, 40 ); + waterResistance = exdData->getField< uint16_t >( row, 41 ); + magicResistance = exdData->getField< uint16_t >( row, 42 ); + determination = exdData->getField< uint16_t >( row, 43 ); + skillSpeed = exdData->getField< uint16_t >( row, 44 ); + spellSpeed = exdData->getField< uint16_t >( row, 45 ); + haste = exdData->getField< uint16_t >( row, 46 ); + morale = exdData->getField< uint16_t >( row, 47 ); + enmity = exdData->getField< uint16_t >( row, 48 ); + enmityReduction = exdData->getField< uint16_t >( row, 49 ); + carefulDesynthesis = exdData->getField< uint16_t >( row, 50 ); + eXPBonus = exdData->getField< uint16_t >( row, 51 ); + regen = exdData->getField< uint16_t >( row, 52 ); + refresh = exdData->getField< uint16_t >( row, 53 ); + movementSpeed = exdData->getField< uint16_t >( row, 54 ); + spikes = exdData->getField< uint16_t >( row, 55 ); + slowResistance = exdData->getField< uint16_t >( row, 56 ); + petrificationResistance = exdData->getField< uint16_t >( row, 57 ); + paralysisResistance = exdData->getField< uint16_t >( row, 58 ); + silenceResistance = exdData->getField< uint16_t >( row, 59 ); + blindResistance = exdData->getField< uint16_t >( row, 60 ); + poisonResistance = exdData->getField< uint16_t >( row, 61 ); + stunResistance = exdData->getField< uint16_t >( row, 62 ); + sleepResistance = exdData->getField< uint16_t >( row, 63 ); + bindResistance = exdData->getField< uint16_t >( row, 64 ); + heavyResistance = exdData->getField< uint16_t >( row, 65 ); + doomResistance = exdData->getField< uint16_t >( row, 66 ); + reducedDurabilityLoss = exdData->getField< uint16_t >( row, 67 ); + increasedSpiritbondGain = exdData->getField< uint16_t >( row, 68 ); + craftsmanship = exdData->getField< uint16_t >( row, 69 ); + control = exdData->getField< uint16_t >( row, 70 ); + gathering = exdData->getField< uint16_t >( row, 71 ); + perception = exdData->getField< uint16_t >( row, 72 ); +} + Core::Data::ItemSearchCategory::ItemSearchCategory( uint32_t row_id, Core::Data::ExdDataGenerated* exdData ) { auto row = exdData->m_ItemSearchCategoryDat.get_row( row_id ); @@ -3199,9 +3595,9 @@ Core::Data::Map::Map( uint32_t row_id, Core::Data::ExdDataGenerated* exdData ) discoveryArrayByte = exdData->getField< bool >( row, 15 ); } -Core::Data::MapMarker::MapMarker( uint32_t row_id, Core::Data::ExdDataGenerated* exdData ) +Core::Data::MapMarker::MapMarker( uint32_t row_id, uint32_t subRow, Core::Data::ExdDataGenerated* exdData ) { - auto row = exdData->m_MapMarkerDat.get_row( row_id ); + auto row = exdData->m_MapMarkerDat.get_row( row_id, subRow ); x = exdData->getField< int16_t >( row, 0 ); y = exdData->getField< int16_t >( row, 1 ); icon = exdData->getField< uint16_t >( row, 2 ); @@ -3276,6 +3672,13 @@ Core::Data::Materia::Materia( uint32_t row_id, Core::Data::ExdDataGenerated* exd value.push_back( exdData->getField< uint8_t >( row, 20 ) ); } +Core::Data::MiniGameRA::MiniGameRA( uint32_t row_id, Core::Data::ExdDataGenerated* exdData ) +{ + auto row = exdData->m_MiniGameRADat.get_row( row_id ); + icon = exdData->getField< int32_t >( row, 1 ); + bGM = exdData->getField< int32_t >( row, 2 ); +} + Core::Data::MinionRace::MinionRace( uint32_t row_id, Core::Data::ExdDataGenerated* exdData ) { auto row = exdData->m_MinionRaceDat.get_row( row_id ); @@ -3354,8 +3757,12 @@ Core::Data::Mount::Mount( uint32_t row_id, Core::Data::ExdDataGenerated* exdData { auto row = exdData->m_MountDat.get_row( row_id ); singular = exdData->getField< std::string >( row, 0 ); + adjective = exdData->getField< int8_t >( row, 1 ); plural = exdData->getField< std::string >( row, 2 ); + possessivePronoun = exdData->getField< int8_t >( row, 3 ); startsWithVowel = exdData->getField< int8_t >( row, 4 ); + pronoun = exdData->getField< int8_t >( row, 6 ); + article = exdData->getField< int8_t >( row, 7 ); modelChara = exdData->getField< int32_t >( row, 8 ); flyingCondition = exdData->getField< uint8_t >( row, 10 ); isFlying = exdData->getField< uint8_t >( row, 14 ); @@ -3363,8 +3770,11 @@ Core::Data::Mount::Mount( uint32_t row_id, Core::Data::ExdDataGenerated* exdData rideBGM = exdData->getField< uint16_t >( row, 17 ); order = exdData->getField< int16_t >( row, 29 ); icon = exdData->getField< uint16_t >( row, 30 ); + extraSeats = exdData->getField< uint8_t >( row, 36 ); mountAction = exdData->getField< uint16_t >( row, 37 ); isAirborne = exdData->getField< bool >( row, 38 ); + useEP = exdData->getField< bool >( row, 40 ); + isImmobile = exdData->getField< bool >( row, 42 ); } Core::Data::MountAction::MountAction( uint32_t row_id, Core::Data::ExdDataGenerated* exdData ) @@ -3393,6 +3803,18 @@ Core::Data::MountCustomize::MountCustomize( uint32_t row_id, Core::Data::ExdData roeFemaleScale = exdData->getField< float >( row, 10 ); auRaMaleScale = exdData->getField< float >( row, 11 ); auRaFemaleScale = exdData->getField< float >( row, 12 ); + hyurMaleCameraHeight = exdData->getField< uint8_t >( row, 13 ); + hyurFemaleCameraHeight = exdData->getField< uint8_t >( row, 14 ); + elezenMaleCameraHeight = exdData->getField< uint8_t >( row, 15 ); + elezenFemaleCameraHeight = exdData->getField< uint8_t >( row, 16 ); + lalaMaleCameraHeight = exdData->getField< uint8_t >( row, 17 ); + lalaFemaleCameraHeight = exdData->getField< uint8_t >( row, 18 ); + miqoMaleCameraHeight = exdData->getField< uint8_t >( row, 19 ); + miqoFemaleCameraHeight = exdData->getField< uint8_t >( row, 20 ); + roeMaleCameraHeight = exdData->getField< uint8_t >( row, 21 ); + roeFemaleCameraHeight = exdData->getField< uint8_t >( row, 22 ); + auRaMaleCameraHeight = exdData->getField< uint8_t >( row, 23 ); + auRaFemaleCameraHeight = exdData->getField< uint8_t >( row, 24 ); } Core::Data::MountFlyingCondition::MountFlyingCondition( uint32_t row_id, Core::Data::ExdDataGenerated* exdData ) @@ -3533,12 +3955,30 @@ Core::Data::ParamGrow::ParamGrow( uint32_t row_id, Core::Data::ExdDataGenerated* huntingLogExpReward = exdData->getField< int32_t >( row, 9 ); } +Core::Data::PartyContent::PartyContent( uint32_t row_id, Core::Data::ExdDataGenerated* exdData ) +{ + auto row = exdData->m_PartyContentDat.get_row( row_id ); + key = exdData->getField< uint8_t >( row, 0 ); + timeLimit = exdData->getField< uint16_t >( row, 1 ); + name = exdData->getField< std::string >( row, 2 ); + textDataStart = exdData->getField< uint32_t >( row, 3 ); + textDataEnd = exdData->getField< uint32_t >( row, 4 ); + contentFinderCondition = exdData->getField< uint16_t >( row, 33 ); + image = exdData->getField< uint32_t >( row, 34 ); +} + Core::Data::PartyContentCutscene::PartyContentCutscene( uint32_t row_id, Core::Data::ExdDataGenerated* exdData ) { auto row = exdData->m_PartyContentCutsceneDat.get_row( row_id ); cutscene = exdData->getField< uint32_t >( row, 0 ); } +Core::Data::PartyContentTextData::PartyContentTextData( uint32_t row_id, Core::Data::ExdDataGenerated* exdData ) +{ + auto row = exdData->m_PartyContentTextDataDat.get_row( row_id ); + data = exdData->getField< std::string >( row, 0 ); +} + Core::Data::Perform::Perform( uint32_t row_id, Core::Data::ExdDataGenerated* exdData ) { auto row = exdData->m_PerformDat.get_row( row_id ); @@ -3615,13 +4055,14 @@ Core::Data::PreHandler::PreHandler( uint32_t row_id, Core::Data::ExdDataGenerate Core::Data::PublicContent::PublicContent( uint32_t row_id, Core::Data::ExdDataGenerated* exdData ) { auto row = exdData->m_PublicContentDat.get_row( row_id ); + type = exdData->getField< uint8_t >( row, 0 ); timeLimit = exdData->getField< uint16_t >( row, 1 ); mapIcon = exdData->getField< uint32_t >( row, 2 ); name = exdData->getField< std::string >( row, 3 ); textDataStart = exdData->getField< uint32_t >( row, 4 ); textDataEnd = exdData->getField< uint32_t >( row, 5 ); contentFinderCondition = exdData->getField< uint16_t >( row, 7 ); - eureka = exdData->getField< uint16_t >( row, 8 ); + additionalData = exdData->getField< uint16_t >( row, 8 ); } Core::Data::PublicContentCutscene::PublicContentCutscene( uint32_t row_id, Core::Data::ExdDataGenerated* exdData ) @@ -3643,9 +4084,9 @@ Core::Data::PvPAction::PvPAction( uint32_t row_id, Core::Data::ExdDataGenerated* action = exdData->getField< uint16_t >( row, 0 ); } -Core::Data::PvPActionSort::PvPActionSort( uint32_t row_id, Core::Data::ExdDataGenerated* exdData ) +Core::Data::PvPActionSort::PvPActionSort( uint32_t row_id, uint32_t subRow, Core::Data::ExdDataGenerated* exdData ) { - auto row = exdData->m_PvPActionSortDat.get_row( row_id ); + auto row = exdData->m_PvPActionSortDat.get_row( row_id, subRow ); name = exdData->getField< uint8_t >( row, 0 ); action = exdData->getField< uint16_t >( row, 1 ); } @@ -3681,6 +4122,7 @@ Core::Data::Quest::Quest( uint32_t row_id, Core::Data::ExdDataGenerated* exdData classJobCategory0 = exdData->getField< uint8_t >( row, 3 ); classJobLevel0 = exdData->getField< uint16_t >( row, 4 ); questLevelOffset = exdData->getField< uint8_t >( row, 5 ); + levelMax = exdData->getField< uint16_t >( row, 6 ); classJobCategory1 = exdData->getField< uint8_t >( row, 7 ); classJobLevel1 = exdData->getField< uint16_t >( row, 8 ); previousQuestJoin = exdData->getField< uint8_t >( row, 9 ); @@ -3697,6 +4139,7 @@ Core::Data::Quest::Quest( uint32_t row_id, Core::Data::ExdDataGenerated* exdData instanceContent.push_back( exdData->getField< uint32_t >( row, 24 ) ); instanceContent.push_back( exdData->getField< uint32_t >( row, 25 ) ); instanceContent.push_back( exdData->getField< uint32_t >( row, 26 ) ); + festival = exdData->getField< uint8_t >( row, 27 ); bellStart = exdData->getField< uint16_t >( row, 30 ); bellEnd = exdData->getField< uint16_t >( row, 31 ); beastTribe = exdData->getField< uint8_t >( row, 32 ); @@ -3707,6 +4150,7 @@ Core::Data::Quest::Quest( uint32_t row_id, Core::Data::ExdDataGenerated* exdData eNpcResidentEnd = exdData->getField< uint32_t >( row, 42 ); isRepeatable = exdData->getField< bool >( row, 43 ); repeatIntervalType = exdData->getField< uint8_t >( row, 44 ); + questRepeatFlag = exdData->getField< uint8_t >( row, 45 ); scriptInstruction.push_back( exdData->getField< std::string >( row, 50 ) ); scriptInstruction.push_back( exdData->getField< std::string >( row, 51 ) ); scriptInstruction.push_back( exdData->getField< std::string >( row, 52 ) ); @@ -4044,9 +4488,9 @@ Core::Data::Quest::Quest( uint32_t row_id, Core::Data::ExdDataGenerated* exdData sortKey = exdData->getField< uint16_t >( row, 1514 ); } -Core::Data::QuestClassJobReward::QuestClassJobReward( uint32_t row_id, Core::Data::ExdDataGenerated* exdData ) +Core::Data::QuestClassJobReward::QuestClassJobReward( uint32_t row_id, uint32_t subRow, Core::Data::ExdDataGenerated* exdData ) { - auto row = exdData->m_QuestClassJobRewardDat.get_row( row_id ); + auto row = exdData->m_QuestClassJobRewardDat.get_row( row_id, subRow ); classJobCategory = exdData->getField< uint8_t >( row, 0 ); rewardItem.push_back( exdData->getField< uint32_t >( row, 1 ) ); rewardItem.push_back( exdData->getField< uint32_t >( row, 2 ) ); @@ -4066,9 +4510,9 @@ Core::Data::QuestClassJobReward::QuestClassJobReward( uint32_t row_id, Core::Dat requiredAmount.push_back( exdData->getField< uint8_t >( row, 16 ) ); } -Core::Data::QuestClassJobSupply::QuestClassJobSupply( uint32_t row_id, Core::Data::ExdDataGenerated* exdData ) +Core::Data::QuestClassJobSupply::QuestClassJobSupply( uint32_t row_id, uint32_t subRow, Core::Data::ExdDataGenerated* exdData ) { - auto row = exdData->m_QuestClassJobSupplyDat.get_row( row_id ); + auto row = exdData->m_QuestClassJobSupplyDat.get_row( row_id, subRow ); classJobCategory = exdData->getField< uint8_t >( row, 0 ); eNpcResident = exdData->getField< uint32_t >( row, 2 ); item = exdData->getField< uint32_t >( row, 3 ); @@ -4417,9 +4861,9 @@ Core::Data::RelicNoteCategory::RelicNoteCategory( uint32_t row_id, Core::Data::E text = exdData->getField< std::string >( row, 1 ); } -Core::Data::Resident::Resident( uint32_t row_id, Core::Data::ExdDataGenerated* exdData ) +Core::Data::Resident::Resident( uint32_t row_id, uint32_t subRow, Core::Data::ExdDataGenerated* exdData ) { - auto row = exdData->m_ResidentDat.get_row( row_id ); + auto row = exdData->m_ResidentDat.get_row( row_id, subRow ); model = exdData->getField< uint64_t >( row, 1 ); npcYell = exdData->getField< int32_t >( row, 2 ); residentMotionType = exdData->getField< uint8_t >( row, 3 ); @@ -4510,9 +4954,9 @@ Core::Data::SatisfactionNpc::SatisfactionNpc( uint32_t row_id, Core::Data::ExdDa icon = exdData->getField< int32_t >( row, 70 ); } -Core::Data::SatisfactionSupply::SatisfactionSupply( uint32_t row_id, Core::Data::ExdDataGenerated* exdData ) +Core::Data::SatisfactionSupply::SatisfactionSupply( uint32_t row_id, uint32_t subRow, Core::Data::ExdDataGenerated* exdData ) { - auto row = exdData->m_SatisfactionSupplyDat.get_row( row_id ); + auto row = exdData->m_SatisfactionSupplyDat.get_row( row_id, subRow ); slot = exdData->getField< uint8_t >( row, 0 ); probability = exdData->getField< uint8_t >( row, 1 ); item = exdData->getField< int32_t >( row, 2 ); @@ -4547,9 +4991,9 @@ Core::Data::ScenarioTreeTips::ScenarioTreeTips( uint32_t row_id, Core::Data::Exd tips2 = exdData->getField< uint32_t >( row, 3 ); } -Core::Data::ScenarioTreeTipsClassQuest::ScenarioTreeTipsClassQuest( uint32_t row_id, Core::Data::ExdDataGenerated* exdData ) +Core::Data::ScenarioTreeTipsClassQuest::ScenarioTreeTipsClassQuest( uint32_t row_id, uint32_t subRow, Core::Data::ExdDataGenerated* exdData ) { - auto row = exdData->m_ScenarioTreeTipsClassQuestDat.get_row( row_id ); + auto row = exdData->m_ScenarioTreeTipsClassQuestDat.get_row( row_id, subRow ); quest = exdData->getField< uint32_t >( row, 0 ); requiredLevel = exdData->getField< uint16_t >( row, 1 ); requiredExpansion = exdData->getField< uint8_t >( row, 2 ); @@ -4875,6 +5319,7 @@ Core::Data::Title::Title( uint32_t row_id, Core::Data::ExdDataGenerated* exdData masculine = exdData->getField< std::string >( row, 0 ); feminine = exdData->getField< std::string >( row, 1 ); isPrefix = exdData->getField< bool >( row, 2 ); + order = exdData->getField< uint16_t >( row, 3 ); } Core::Data::Tomestones::Tomestones( uint32_t row_id, Core::Data::ExdDataGenerated* exdData ) @@ -5085,6 +5530,13 @@ Core::Data::TutorialTank::TutorialTank( uint32_t row_id, Core::Data::ExdDataGene objective = exdData->getField< uint8_t >( row, 0 ); } +Core::Data::UIColor::UIColor( uint32_t row_id, Core::Data::ExdDataGenerated* exdData ) +{ + auto row = exdData->m_UIColorDat.get_row( row_id ); + foreground = exdData->getField< uint32_t >( row, 0 ); + background = exdData->getField< uint32_t >( row, 1 ); +} + Core::Data::VaseFlower::VaseFlower( uint32_t row_id, Core::Data::ExdDataGenerated* exdData ) { auto row = exdData->m_VaseFlowerDat.get_row( row_id ); @@ -5102,9 +5554,9 @@ Core::Data::Warp::Warp( uint32_t row_id, Core::Data::ExdDataGenerated* exdData ) auto row = exdData->m_WarpDat.get_row( row_id ); level = exdData->getField< uint32_t >( row, 0 ); placeName = exdData->getField< uint16_t >( row, 1 ); - defaultTalk1 = exdData->getField< uint32_t >( row, 2 ); - defaultTalk2 = exdData->getField< uint32_t >( row, 3 ); - defaultTalk3 = exdData->getField< uint32_t >( row, 4 ); + conditionSuccessEvent = exdData->getField< uint32_t >( row, 2 ); + conditionFailEvent = exdData->getField< uint32_t >( row, 3 ); + confirmEvent = exdData->getField< uint32_t >( row, 4 ); warpCondition = exdData->getField< uint16_t >( row, 5 ); warpLogic = exdData->getField< uint16_t >( row, 6 ); } @@ -5121,7 +5573,7 @@ Core::Data::WarpCondition::WarpCondition( uint32_t row_id, Core::Data::ExdDataGe Core::Data::WarpLogic::WarpLogic( uint32_t row_id, Core::Data::ExdDataGenerated* exdData ) { auto row = exdData->m_WarpLogicDat.get_row( row_id ); - warpName = exdData->getField< bool >( row, 2 ); + warpName = exdData->getField< std::string >( row, 1 ); function.push_back( exdData->getField< std::string >( row, 3 ) ); function.push_back( exdData->getField< std::string >( row, 4 ) ); function.push_back( exdData->getField< std::string >( row, 5 ) ); @@ -5142,9 +5594,9 @@ Core::Data::WarpLogic::WarpLogic( uint32_t row_id, Core::Data::ExdDataGenerated* argument.push_back( exdData->getField< uint32_t >( row, 20 ) ); argument.push_back( exdData->getField< uint32_t >( row, 21 ) ); argument.push_back( exdData->getField< uint32_t >( row, 22 ) ); - textString = exdData->getField< std::string >( row, 23 ); - response1 = exdData->getField< std::string >( row, 24 ); - response2 = exdData->getField< std::string >( row, 25 ); + question = exdData->getField< std::string >( row, 23 ); + responseYes = exdData->getField< std::string >( row, 24 ); + responseNo = exdData->getField< std::string >( row, 25 ); } Core::Data::Weather::Weather( uint32_t row_id, Core::Data::ExdDataGenerated* exdData ) @@ -5155,9 +5607,9 @@ Core::Data::Weather::Weather( uint32_t row_id, Core::Data::ExdDataGenerated* exd description = exdData->getField< std::string >( row, 2 ); } -Core::Data::WeatherGroup::WeatherGroup( uint32_t row_id, Core::Data::ExdDataGenerated* exdData ) +Core::Data::WeatherGroup::WeatherGroup( uint32_t row_id, uint32_t subRow, Core::Data::ExdDataGenerated* exdData ) { - auto row = exdData->m_WeatherGroupDat.get_row( row_id ); + auto row = exdData->m_WeatherGroupDat.get_row( row_id, subRow ); weatherRate = exdData->getField< int32_t >( row, 1 ); } @@ -5237,6 +5689,7 @@ Core::Data::World::World( uint32_t row_id, Core::Data::ExdDataGenerated* exdData auto row = exdData->m_WorldDat.get_row( row_id ); name = exdData->getField< std::string >( row, 0 ); dataCenter = exdData->getField< uint8_t >( row, 2 ); + isPublic = exdData->getField< bool >( row, 3 ); } Core::Data::WorldDCGroupType::WorldDCGroupType( uint32_t row_id, Core::Data::ExdDataGenerated* exdData ) @@ -5254,9 +5707,9 @@ Core::Data::YKW::YKW( uint32_t row_id, Core::Data::ExdDataGenerated* exdData ) location.push_back( exdData->getField< uint16_t >( row, 4 ) ); } -Core::Data::ZoneSharedGroup::ZoneSharedGroup( uint32_t row_id, Core::Data::ExdDataGenerated* exdData ) +Core::Data::ZoneSharedGroup::ZoneSharedGroup( uint32_t row_id, uint32_t subRow, Core::Data::ExdDataGenerated* exdData ) { - auto row = exdData->m_ZoneSharedGroupDat.get_row( row_id ); + auto row = exdData->m_ZoneSharedGroupDat.get_row( row_id, subRow ); quest1 = exdData->getField< uint32_t >( row, 2 ); quest2 = exdData->getField< uint32_t >( row, 6 ); quest3 = exdData->getField< uint32_t >( row, 10 ); @@ -5455,8 +5908,13 @@ bool Core::Data::ExdDataGenerated::init( const std::string& path ) m_EObjNameDat = setupDatAccess( "EObjName", xiv::exd::Language::en ); m_EquipRaceCategoryDat = setupDatAccess( "EquipRaceCategory", xiv::exd::Language::none ); m_EquipSlotCategoryDat = setupDatAccess( "EquipSlotCategory", xiv::exd::Language::none ); + m_EurekaAetherItemDat = setupDatAccess( "EurekaAetherItem", xiv::exd::Language::en ); m_EurekaAethernetDat = setupDatAccess( "EurekaAethernet", xiv::exd::Language::none ); m_EurekaGrowDataDat = setupDatAccess( "EurekaGrowData", xiv::exd::Language::none ); + m_EurekaLogosMixerProbabilityDat = setupDatAccess( "EurekaLogosMixerProbability", xiv::exd::Language::none ); + m_EurekaMagiaActionDat = setupDatAccess( "EurekaMagiaAction", xiv::exd::Language::none ); + m_EurekaMagiciteItemDat = setupDatAccess( "EurekaMagiciteItem", xiv::exd::Language::none ); + m_EurekaMagiciteItemTypeDat = setupDatAccess( "EurekaMagiciteItemType", xiv::exd::Language::en ); m_EurekaSphereElementAdjustDat = setupDatAccess( "EurekaSphereElementAdjust", xiv::exd::Language::none ); m_EventActionDat = setupDatAccess( "EventAction", xiv::exd::Language::en ); m_EventIconPriorityDat = setupDatAccess( "EventIconPriority", xiv::exd::Language::none ); @@ -5478,7 +5936,9 @@ bool Core::Data::ExdDataGenerated::init( const std::string& path ) m_FCProfileDat = setupDatAccess( "FCProfile", xiv::exd::Language::en ); m_FCReputationDat = setupDatAccess( "FCReputation", xiv::exd::Language::en ); m_FCRightsDat = setupDatAccess( "FCRights", xiv::exd::Language::en ); + m_FestivalDat = setupDatAccess( "Festival", xiv::exd::Language::none ); m_FieldMarkerDat = setupDatAccess( "FieldMarker", xiv::exd::Language::en ); + m_FishingRecordTypeDat = setupDatAccess( "FishingRecordType", xiv::exd::Language::none ); m_FishingRecordTypeTransientDat = setupDatAccess( "FishingRecordTypeTransient", xiv::exd::Language::none ); m_FishingSpotDat = setupDatAccess( "FishingSpot", xiv::exd::Language::en ); m_FishParameterDat = setupDatAccess( "FishParameter", xiv::exd::Language::en ); @@ -5520,6 +5980,9 @@ bool Core::Data::ExdDataGenerated::init( const std::string& path ) m_GCSupplyDutyRewardDat = setupDatAccess( "GCSupplyDutyReward", xiv::exd::Language::none ); m_GeneralActionDat = setupDatAccess( "GeneralAction", xiv::exd::Language::en ); m_GFATEDat = setupDatAccess( "GFATE", xiv::exd::Language::none ); + m_GFateClimbing2Dat = setupDatAccess( "GFateClimbing2", xiv::exd::Language::none ); + m_GFateClimbing2ContentDat = setupDatAccess( "GFateClimbing2Content", xiv::exd::Language::none ); + m_GFateClimbing2TotemTypeDat = setupDatAccess( "GFateClimbing2TotemType", xiv::exd::Language::none ); m_GilShopDat = setupDatAccess( "GilShop", xiv::exd::Language::en ); m_GilShopItemDat = setupDatAccess( "GilShopItem", xiv::exd::Language::none ); m_GoldSaucerArcadeMachineDat = setupDatAccess( "GoldSaucerArcadeMachine", xiv::exd::Language::en ); @@ -5534,12 +5997,17 @@ bool Core::Data::ExdDataGenerated::init( const std::string& path ) m_HairMakeTypeDat = setupDatAccess( "HairMakeType", xiv::exd::Language::none ); m_HouseRetainerPoseDat = setupDatAccess( "HouseRetainerPose", xiv::exd::Language::none ); m_HousingAethernetDat = setupDatAccess( "HousingAethernet", xiv::exd::Language::none ); + m_HousingAppealDat = setupDatAccess( "HousingAppeal", xiv::exd::Language::en ); m_HousingEmploymentNpcListDat = setupDatAccess( "HousingEmploymentNpcList", xiv::exd::Language::none ); m_HousingEmploymentNpcRaceDat = setupDatAccess( "HousingEmploymentNpcRace", xiv::exd::Language::en ); + m_HousingExteriorDat = setupDatAccess( "HousingExterior", xiv::exd::Language::none ); m_HousingFurnitureDat = setupDatAccess( "HousingFurniture", xiv::exd::Language::none ); + m_HousingMapMarkerInfoDat = setupDatAccess( "HousingMapMarkerInfo", xiv::exd::Language::none ); + m_HousingMerchantPoseDat = setupDatAccess( "HousingMerchantPose", xiv::exd::Language::en ); m_HousingLandSetDat = setupDatAccess( "HousingLandSet", xiv::exd::Language::none ); m_HousingPlacementDat = setupDatAccess( "HousingPlacement", xiv::exd::Language::en ); m_HousingPresetDat = setupDatAccess( "HousingPreset", xiv::exd::Language::en ); + m_HousingUnitedExteriorDat = setupDatAccess( "HousingUnitedExterior", xiv::exd::Language::none ); m_HousingYardObjectDat = setupDatAccess( "HousingYardObject", xiv::exd::Language::none ); m_HowToDat = setupDatAccess( "HowTo", xiv::exd::Language::en ); m_HowToCategoryDat = setupDatAccess( "HowToCategory", xiv::exd::Language::en ); @@ -5550,6 +6018,7 @@ bool Core::Data::ExdDataGenerated::init( const std::string& path ) m_ItemDat = setupDatAccess( "Item", xiv::exd::Language::en ); m_ItemActionDat = setupDatAccess( "ItemAction", xiv::exd::Language::none ); m_ItemFoodDat = setupDatAccess( "ItemFood", xiv::exd::Language::none ); + m_ItemLevelDat = setupDatAccess( "ItemLevel", xiv::exd::Language::none ); m_ItemSearchCategoryDat = setupDatAccess( "ItemSearchCategory", xiv::exd::Language::en ); m_ItemSeriesDat = setupDatAccess( "ItemSeries", xiv::exd::Language::en ); m_ItemSpecialBonusDat = setupDatAccess( "ItemSpecialBonus", xiv::exd::Language::en ); @@ -5582,6 +6051,7 @@ bool Core::Data::ExdDataGenerated::init( const std::string& path ) m_MasterpieceSupplyDutyDat = setupDatAccess( "MasterpieceSupplyDuty", xiv::exd::Language::none ); m_MasterpieceSupplyMultiplierDat = setupDatAccess( "MasterpieceSupplyMultiplier", xiv::exd::Language::none ); m_MateriaDat = setupDatAccess( "Materia", xiv::exd::Language::none ); + m_MiniGameRADat = setupDatAccess( "MiniGameRA", xiv::exd::Language::none ); m_MinionRaceDat = setupDatAccess( "MinionRace", xiv::exd::Language::en ); m_MinionRulesDat = setupDatAccess( "MinionRules", xiv::exd::Language::en ); m_MinionSkillTypeDat = setupDatAccess( "MinionSkillType", xiv::exd::Language::en ); @@ -5609,7 +6079,9 @@ bool Core::Data::ExdDataGenerated::init( const std::string& path ) m_OrchestrionPathDat = setupDatAccess( "OrchestrionPath", xiv::exd::Language::none ); m_OrchestrionUiparamDat = setupDatAccess( "OrchestrionUiparam", xiv::exd::Language::none ); m_ParamGrowDat = setupDatAccess( "ParamGrow", xiv::exd::Language::none ); + m_PartyContentDat = setupDatAccess( "PartyContent", xiv::exd::Language::en ); m_PartyContentCutsceneDat = setupDatAccess( "PartyContentCutscene", xiv::exd::Language::none ); + m_PartyContentTextDataDat = setupDatAccess( "PartyContentTextData", xiv::exd::Language::en ); m_PerformDat = setupDatAccess( "Perform", xiv::exd::Language::en ); m_PerformTransientDat = setupDatAccess( "PerformTransient", xiv::exd::Language::en ); m_PetDat = setupDatAccess( "Pet", xiv::exd::Language::en ); @@ -5711,6 +6183,7 @@ bool Core::Data::ExdDataGenerated::init( const std::string& path ) m_TutorialDPSDat = setupDatAccess( "TutorialDPS", xiv::exd::Language::none ); m_TutorialHealerDat = setupDatAccess( "TutorialHealer", xiv::exd::Language::none ); m_TutorialTankDat = setupDatAccess( "TutorialTank", xiv::exd::Language::none ); + m_UIColorDat = setupDatAccess( "UIColor", xiv::exd::Language::none ); m_VaseFlowerDat = setupDatAccess( "VaseFlower", xiv::exd::Language::none ); m_VFXDat = setupDatAccess( "VFX", xiv::exd::Language::none ); m_WarpDat = setupDatAccess( "Warp", xiv::exd::Language::en ); diff --git a/src/common/Exd/ExdDataGenerated.h b/src/common/Exd/ExdDataGenerated.h index b4da203b..d4b76dc5 100644 --- a/src/common/Exd/ExdDataGenerated.h +++ b/src/common/Exd/ExdDataGenerated.h @@ -13,8 +13,8 @@ #include #include -namespace Core::Data -{ +namespace Core { +namespace Data { class ExdDataGenerated; @@ -174,8 +174,13 @@ struct EObj; struct EObjName; struct EquipRaceCategory; struct EquipSlotCategory; +struct EurekaAetherItem; struct EurekaAethernet; struct EurekaGrowData; +struct EurekaLogosMixerProbability; +struct EurekaMagiaAction; +struct EurekaMagiciteItem; +struct EurekaMagiciteItemType; struct EurekaSphereElementAdjust; struct EventAction; struct EventIconPriority; @@ -197,7 +202,9 @@ struct FCHierarchy; struct FCProfile; struct FCReputation; struct FCRights; +struct Festival; struct FieldMarker; +struct FishingRecordType; struct FishingRecordTypeTransient; struct FishingSpot; struct FishParameter; @@ -239,6 +246,9 @@ struct GCSupplyDuty; struct GCSupplyDutyReward; struct GeneralAction; struct GFATE; +struct GFateClimbing2; +struct GFateClimbing2Content; +struct GFateClimbing2TotemType; struct GilShop; struct GilShopItem; struct GoldSaucerArcadeMachine; @@ -253,12 +263,17 @@ struct GuildOrderOfficer; struct HairMakeType; struct HouseRetainerPose; struct HousingAethernet; +struct HousingAppeal; struct HousingEmploymentNpcList; struct HousingEmploymentNpcRace; +struct HousingExterior; struct HousingFurniture; +struct HousingMapMarkerInfo; +struct HousingMerchantPose; struct HousingLandSet; struct HousingPlacement; struct HousingPreset; +struct HousingUnitedExterior; struct HousingYardObject; struct HowTo; struct HowToCategory; @@ -269,6 +284,7 @@ struct InstanceContentTextData; struct Item; struct ItemAction; struct ItemFood; +struct ItemLevel; struct ItemSearchCategory; struct ItemSeries; struct ItemSpecialBonus; @@ -301,6 +317,7 @@ struct Marker; struct MasterpieceSupplyDuty; struct MasterpieceSupplyMultiplier; struct Materia; +struct MiniGameRA; struct MinionRace; struct MinionRules; struct MinionSkillType; @@ -328,7 +345,9 @@ struct OrchestrionCategory; struct OrchestrionPath; struct OrchestrionUiparam; struct ParamGrow; +struct PartyContent; struct PartyContentCutscene; +struct PartyContentTextData; struct Perform; struct PerformTransient; struct Pet; @@ -430,6 +449,7 @@ struct Tutorial; struct TutorialDPS; struct TutorialHealer; struct TutorialTank; +struct UIColor; struct VaseFlower; struct VFX; struct Warp; @@ -462,6 +482,7 @@ struct Achievement int32_t key; std::vector< int32_t > data; uint16_t order; + bool initialHide; Achievement( uint32_t row_id, Core::Data::ExdDataGenerated* exdData ); }; @@ -470,6 +491,7 @@ struct AchievementCategory { std::string name; uint8_t achievementKind; + bool hideCategory; AchievementCategory( uint32_t row_id, Core::Data::ExdDataGenerated* exdData ); }; @@ -652,9 +674,9 @@ struct Addon struct AddonHud { - std::string longs; - std::string shorts; - std::string function; + std::string _long; + std::string _short; + std::string _function; AddonHud( uint32_t row_id, Core::Data::ExdDataGenerated* exdData ); }; @@ -713,6 +735,13 @@ struct AetherialWheel struct Aetheryte { + std::string singular; + int8_t adjective; + std::string plural; + int8_t possessivePronoun; + int8_t startsWithVowel; + int8_t pronoun; + int8_t article; uint16_t placeName; uint16_t aethernetName; uint16_t territory; @@ -810,7 +839,7 @@ struct AnimaWeapon5SpiritTalk { int32_t dialogue; - AnimaWeapon5SpiritTalk( uint32_t row_id, Core::Data::ExdDataGenerated* exdData ); + AnimaWeapon5SpiritTalk( uint32_t row_id, uint32_t subRow, Core::Data::ExdDataGenerated* exdData ); }; struct AnimaWeapon5SpiritTalkParam @@ -834,7 +863,7 @@ struct AnimaWeaponFUITalk { int32_t dialogue; - AnimaWeaponFUITalk( uint32_t row_id, Core::Data::ExdDataGenerated* exdData ); + AnimaWeaponFUITalk( uint32_t row_id, uint32_t subRow, Core::Data::ExdDataGenerated* exdData ); }; struct AnimaWeaponFUITalkParam @@ -909,6 +938,7 @@ struct Balloon struct BaseParam { + int8_t order; std::string name; std::string description; uint8_t oneHWpn; @@ -983,7 +1013,7 @@ struct Behavior { uint16_t balloon; - Behavior( uint32_t row_id, Core::Data::ExdDataGenerated* exdData ); + Behavior( uint32_t row_id, uint32_t subRow, Core::Data::ExdDataGenerated* exdData ); }; struct BGM @@ -1015,7 +1045,7 @@ struct BGMSwitch uint8_t bGMSystemDefine; uint32_t quest; - BGMSwitch( uint32_t row_id, Core::Data::ExdDataGenerated* exdData ); + BGMSwitch( uint32_t row_id, uint32_t subRow, Core::Data::ExdDataGenerated* exdData ); }; struct BGMSystemDefine @@ -1081,8 +1111,12 @@ struct BNpcCustomize struct BNpcName { std::string singular; + int8_t adjective; std::string plural; + int8_t possessivePronoun; int8_t startsWithVowel; + int8_t pronoun; + int8_t article; BNpcName( uint32_t row_id, Core::Data::ExdDataGenerated* exdData ); }; @@ -1148,9 +1182,12 @@ struct BuddyAction struct BuddyEquip { std::string singular; + int8_t adjective; std::string plural; + int8_t possessivePronoun; int8_t startsWithVowel; - int8_t rarity; + int8_t pronoun; + int8_t article; std::string name; int32_t modelTop; int32_t modelBody; @@ -1398,9 +1435,13 @@ struct ClassJobCategory struct Companion { std::string singular; + int8_t adjective; std::string plural; + int8_t possessivePronoun; int8_t startsWithVowel; - int8_t rarity; + int8_t pronoun; + int8_t article; + uint16_t model; uint8_t behavior; uint16_t icon; uint8_t cost; @@ -1552,7 +1593,7 @@ struct ContentFinderCondition { uint16_t territoryType; uint8_t contentLinkType; - uint16_t instanceContent; + uint16_t content; uint8_t contentMemberType; uint8_t classJobLevelRequired; uint8_t classJobLevelSync; @@ -1560,6 +1601,7 @@ struct ContentFinderCondition uint16_t itemLevelSync; bool allowReplacement; bool highEndDuty; + bool dutyRecorderAllowed; std::string name; uint8_t contentType; uint8_t transient; @@ -1743,7 +1785,7 @@ struct Credit uint16_t frenchCast2; uint16_t germanCast2; - Credit( uint32_t row_id, Core::Data::ExdDataGenerated* exdData ); + Credit( uint32_t row_id, uint32_t subRow, Core::Data::ExdDataGenerated* exdData ); }; struct CreditCast @@ -1822,9 +1864,12 @@ struct DeepDungeonEquipment { uint32_t icon; std::string singular; + int8_t adjective; std::string plural; + int8_t possessivePronoun; int8_t startsWithVowel; - int8_t rarity; + int8_t pronoun; + int8_t article; std::string name; std::string description; @@ -1844,9 +1889,12 @@ struct DeepDungeonItem { uint32_t icon; std::string singular; + int8_t adjective; std::string plural; + int8_t possessivePronoun; int8_t startsWithVowel; - int8_t rarity; + int8_t pronoun; + int8_t article; std::string name; std::string tooltip; uint32_t action; @@ -1865,9 +1913,12 @@ struct DeepDungeonMagicStone { uint32_t icon; std::string singular; + int8_t adjective; std::string plural; + int8_t possessivePronoun; int8_t startsWithVowel; - int8_t rarity; + int8_t pronoun; + int8_t article; std::string name; std::string tooltip; @@ -1878,7 +1929,7 @@ struct DeepDungeonMap5X { std::vector< uint16_t > deepDungeonRoom; - DeepDungeonMap5X( uint32_t row_id, Core::Data::ExdDataGenerated* exdData ); + DeepDungeonMap5X( uint32_t row_id, uint32_t subRow, Core::Data::ExdDataGenerated* exdData ); }; struct DeepDungeonRoom @@ -1939,7 +1990,7 @@ struct DisposalShopItem int32_t itemReceived; uint32_t quantityReceived; - DisposalShopItem( uint32_t row_id, Core::Data::ExdDataGenerated* exdData ); + DisposalShopItem( uint32_t row_id, uint32_t subRow, Core::Data::ExdDataGenerated* exdData ); }; struct DpsChallenge @@ -2057,7 +2108,12 @@ struct ENpcBase struct ENpcResident { std::string singular; + int8_t adjective; std::string plural; + int8_t possessivePronoun; + int8_t startsWithVowel; + int8_t pronoun; + int8_t article; std::string title; uint8_t map; @@ -2075,6 +2131,12 @@ struct EObj struct EObjName { std::string singular; + int8_t adjective; + std::string plural; + int8_t possessivePronoun; + int8_t startsWithVowel; + int8_t pronoun; + int8_t article; EObjName( uint32_t row_id, Core::Data::ExdDataGenerated* exdData ); }; @@ -2113,6 +2175,20 @@ struct EquipSlotCategory EquipSlotCategory( uint32_t row_id, Core::Data::ExdDataGenerated* exdData ); }; +struct EurekaAetherItem +{ + std::string singular; + int8_t adjective; + std::string plural; + int8_t possessivePronoun; + int8_t startsWithVowel; + int8_t pronoun; + int8_t article; + std::string name; + + EurekaAetherItem( uint32_t row_id, Core::Data::ExdDataGenerated* exdData ); +}; + struct EurekaAethernet { uint16_t location; @@ -2127,6 +2203,37 @@ struct EurekaGrowData EurekaGrowData( uint32_t row_id, Core::Data::ExdDataGenerated* exdData ); }; +struct EurekaLogosMixerProbability +{ + uint8_t probability; + + EurekaLogosMixerProbability( uint32_t row_id, Core::Data::ExdDataGenerated* exdData ); +}; + +struct EurekaMagiaAction +{ + uint32_t action; + uint8_t maxUses; + + EurekaMagiaAction( uint32_t row_id, Core::Data::ExdDataGenerated* exdData ); +}; + +struct EurekaMagiciteItem +{ + uint8_t eurekaMagiciteItemType; + uint8_t classJobCategory; + uint32_t item; + + EurekaMagiciteItem( uint32_t row_id, Core::Data::ExdDataGenerated* exdData ); +}; + +struct EurekaMagiciteItemType +{ + std::string type; + + EurekaMagiciteItemType( uint32_t row_id, Core::Data::ExdDataGenerated* exdData ); +}; + struct EurekaSphereElementAdjust { uint16_t powerModifier; @@ -2165,9 +2272,12 @@ struct EventIconType struct EventItem { std::string singular; + int8_t adjective; std::string plural; + int8_t possessivePronoun; int8_t startsWithVowel; - int8_t rarity; + int8_t pronoun; + int8_t article; std::string name; uint16_t icon; uint16_t action; @@ -2223,6 +2333,7 @@ struct Fate uint32_t iconObjective; uint32_t iconMap; int32_t music; + bool hasWorldMapIcon; std::string name; std::string description; std::string objective; @@ -2309,6 +2420,13 @@ struct FCRights FCRights( uint32_t row_id, Core::Data::ExdDataGenerated* exdData ); }; +struct Festival +{ + std::string name; + + Festival( uint32_t row_id, Core::Data::ExdDataGenerated* exdData ); +}; + struct FieldMarker { int32_t vFX; @@ -2317,6 +2435,13 @@ struct FieldMarker FieldMarker( uint32_t row_id, Core::Data::ExdDataGenerated* exdData ); }; +struct FishingRecordType +{ + int32_t addon; + + FishingRecordType( uint32_t row_id, Core::Data::ExdDataGenerated* exdData ); +}; + struct FishingRecordTypeTransient { int32_t image; @@ -2345,8 +2470,12 @@ struct FishParameter std::string text; int32_t item; uint16_t gatheringItemLevel; + bool isHidden; + uint8_t fishingRecordType; int32_t territoryType; - bool isFish; + bool isInLog; + bool timeRestricted; + bool weatherRestricted; uint16_t gatheringSubCategory; FishParameter( uint32_t row_id, Core::Data::ExdDataGenerated* exdData ); @@ -2415,7 +2544,7 @@ struct GatheringItemPoint { uint32_t gatheringPoint; - GatheringItemPoint( uint32_t row_id, Core::Data::ExdDataGenerated* exdData ); + GatheringItemPoint( uint32_t row_id, uint32_t subRow, Core::Data::ExdDataGenerated* exdData ); }; struct GatheringLeve @@ -2481,8 +2610,12 @@ struct GatheringPointBonusType struct GatheringPointName { std::string singular; + int8_t adjective; std::string plural; + int8_t possessivePronoun; int8_t startsWithVowel; + int8_t pronoun; + int8_t article; GatheringPointName( uint32_t row_id, Core::Data::ExdDataGenerated* exdData ); }; @@ -2568,8 +2701,13 @@ struct GcArmyTraining struct GCRankGridaniaFemaleText { - std::string name; + std::string singular; + int8_t adjective; std::string plural; + int8_t possessivePronoun; + int8_t startsWithVowel; + int8_t pronoun; + int8_t article; std::string nameRank; GCRankGridaniaFemaleText( uint32_t row_id, Core::Data::ExdDataGenerated* exdData ); @@ -2577,8 +2715,13 @@ struct GCRankGridaniaFemaleText struct GCRankGridaniaMaleText { - std::string name; + std::string singular; + int8_t adjective; std::string plural; + int8_t possessivePronoun; + int8_t startsWithVowel; + int8_t pronoun; + int8_t article; std::string nameRank; GCRankGridaniaMaleText( uint32_t row_id, Core::Data::ExdDataGenerated* exdData ); @@ -2586,8 +2729,13 @@ struct GCRankGridaniaMaleText struct GCRankLimsaFemaleText { - std::string name; + std::string singular; + int8_t adjective; std::string plural; + int8_t possessivePronoun; + int8_t startsWithVowel; + int8_t pronoun; + int8_t article; std::string nameRank; GCRankLimsaFemaleText( uint32_t row_id, Core::Data::ExdDataGenerated* exdData ); @@ -2595,8 +2743,13 @@ struct GCRankLimsaFemaleText struct GCRankLimsaMaleText { - std::string name; + std::string singular; + int8_t adjective; std::string plural; + int8_t possessivePronoun; + int8_t startsWithVowel; + int8_t pronoun; + int8_t article; std::string nameRank; GCRankLimsaMaleText( uint32_t row_id, Core::Data::ExdDataGenerated* exdData ); @@ -2604,8 +2757,13 @@ struct GCRankLimsaMaleText struct GCRankUldahFemaleText { - std::string name; + std::string singular; + int8_t adjective; std::string plural; + int8_t possessivePronoun; + int8_t startsWithVowel; + int8_t pronoun; + int8_t article; std::string nameRank; GCRankUldahFemaleText( uint32_t row_id, Core::Data::ExdDataGenerated* exdData ); @@ -2613,8 +2771,13 @@ struct GCRankUldahFemaleText struct GCRankUldahMaleText { - std::string name; + std::string singular; + int8_t adjective; std::string plural; + int8_t possessivePronoun; + int8_t startsWithVowel; + int8_t pronoun; + int8_t article; std::string nameRank; GCRankUldahMaleText( uint32_t row_id, Core::Data::ExdDataGenerated* exdData ); @@ -2636,7 +2799,7 @@ struct GCScripShopItem uint32_t costGCSeals; uint8_t sortKey; - GCScripShopItem( uint32_t row_id, Core::Data::ExdDataGenerated* exdData ); + GCScripShopItem( uint32_t row_id, uint32_t subRow, Core::Data::ExdDataGenerated* exdData ); }; struct GCShop @@ -2688,6 +2851,27 @@ struct GFATE GFATE( uint32_t row_id, Core::Data::ExdDataGenerated* exdData ); }; +struct GFateClimbing2 +{ + uint32_t contentEntry; + + GFateClimbing2( uint32_t row_id, Core::Data::ExdDataGenerated* exdData ); +}; + +struct GFateClimbing2Content +{ + uint32_t publicContentTextData; + + GFateClimbing2Content( uint32_t row_id, Core::Data::ExdDataGenerated* exdData ); +}; + +struct GFateClimbing2TotemType +{ + uint32_t publicContentTextData; + + GFateClimbing2TotemType( uint32_t row_id, Core::Data::ExdDataGenerated* exdData ); +}; + struct GilShop { std::string name; @@ -2706,7 +2890,7 @@ struct GilShopItem uint16_t stateRequired; uint16_t patch; - GilShopItem( uint32_t row_id, Core::Data::ExdDataGenerated* exdData ); + GilShopItem( uint32_t row_id, uint32_t subRow, Core::Data::ExdDataGenerated* exdData ); }; struct GoldSaucerArcadeMachine @@ -2812,12 +2996,21 @@ struct HousingAethernet HousingAethernet( uint32_t row_id, Core::Data::ExdDataGenerated* exdData ); }; +struct HousingAppeal +{ + std::string tag; + uint32_t icon; + uint8_t order; + + HousingAppeal( uint32_t row_id, Core::Data::ExdDataGenerated* exdData ); +}; + struct HousingEmploymentNpcList { uint8_t race; std::vector< uint32_t > eNpcBase; - HousingEmploymentNpcList( uint32_t row_id, Core::Data::ExdDataGenerated* exdData ); + HousingEmploymentNpcList( uint32_t row_id, uint32_t subRow, Core::Data::ExdDataGenerated* exdData ); }; struct HousingEmploymentNpcRace @@ -2827,6 +3020,15 @@ struct HousingEmploymentNpcRace HousingEmploymentNpcRace( uint32_t row_id, Core::Data::ExdDataGenerated* exdData ); }; +struct HousingExterior +{ + uint16_t placeName; + uint8_t housingSize; + std::string model; + + HousingExterior( uint32_t row_id, Core::Data::ExdDataGenerated* exdData ); +}; + struct HousingFurniture { uint16_t modelKey; @@ -2834,8 +3036,8 @@ struct HousingFurniture uint8_t usageType; uint32_t usageParameter; uint8_t housingLayoutLimit; - uint8_t customTalk; - uint32_t event; + uint8_t aquariumTier; + uint32_t customTalk; uint32_t item; bool destroyOnRemoval; bool tooltip; @@ -2843,6 +3045,30 @@ struct HousingFurniture HousingFurniture( uint32_t row_id, Core::Data::ExdDataGenerated* exdData ); }; +struct HousingMapMarkerInfo +{ + uint16_t map; + + HousingMapMarkerInfo( uint32_t row_id, uint32_t subRow, Core::Data::ExdDataGenerated* exdData ); +}; + +struct HousingMerchantPose +{ + uint16_t actionTimeline; + std::string pose; + + HousingMerchantPose( uint32_t row_id, Core::Data::ExdDataGenerated* exdData ); +}; + +struct HousingLandSet +{ + std::vector< uint8_t > plotSize; + std::vector< uint32_t > minPrice; + std::vector< uint32_t > initialPrice; + + HousingLandSet( uint32_t row_id, Core::Data::ExdDataGenerated* exdData ); +}; + struct HousingPlacement { std::string text; @@ -2850,19 +3076,17 @@ struct HousingPlacement HousingPlacement( uint32_t row_id, Core::Data::ExdDataGenerated* exdData ); }; -struct HousingLandSet -{ - std::vector< uint8_t > sizes; - std::vector< uint32_t > minPrices; - std::vector< uint32_t > prices; - - HousingLandSet( uint32_t row_id, Core::Data::ExdDataGenerated* exdData ); -}; - struct HousingPreset { std::string singular; + int8_t adjective; std::string plural; + int8_t possessivePronoun; + int8_t startsWithVowel; + int8_t pronoun; + int8_t article; + uint16_t placeName; + uint8_t housingSize; int32_t exteriorRoof; int32_t exteriorWall; int32_t exteriorWindow; @@ -2881,6 +3105,13 @@ struct HousingPreset HousingPreset( uint32_t row_id, Core::Data::ExdDataGenerated* exdData ); }; +struct HousingUnitedExterior +{ + std::vector< uint32_t > item; + + HousingUnitedExterior( uint32_t row_id, Core::Data::ExdDataGenerated* exdData ); +}; + struct HousingYardObject { uint8_t modelKey; @@ -2941,7 +3172,7 @@ struct InstanceContent uint16_t finalBossCurrencyC; uint32_t instanceClearExp; int32_t instanceContentBuff; - uint32_t territoryType; + uint32_t reqInstance; uint8_t partyCondition; InstanceContent( uint32_t row_id, Core::Data::ExdDataGenerated* exdData ); @@ -2965,8 +3196,12 @@ struct InstanceContentTextData struct Item { std::string singular; + int8_t adjective; std::string plural; + int8_t possessivePronoun; int8_t startsWithVowel; + int8_t pronoun; + int8_t article; std::string description; std::string name; uint16_t icon; @@ -3037,6 +3272,85 @@ struct ItemFood ItemFood( uint32_t row_id, Core::Data::ExdDataGenerated* exdData ); }; +struct ItemLevel +{ + uint16_t strength; + uint16_t dexterity; + uint16_t vitality; + uint16_t intelligence; + uint16_t mind; + uint16_t piety; + uint16_t hP; + uint16_t mP; + uint16_t tP; + uint16_t gP; + uint16_t cP; + uint16_t physicalDamage; + uint16_t magicalDamage; + uint16_t delay; + uint16_t additionalEffect; + uint16_t attackSpeed; + uint16_t blockRate; + uint16_t blockStrength; + uint16_t tenacity; + uint16_t attackPower; + uint16_t defense; + uint16_t directHitRate; + uint16_t evasion; + uint16_t magicDefense; + uint16_t criticalHitPower; + uint16_t criticalHitResilience; + uint16_t criticalHit; + uint16_t criticalHitEvasion; + uint16_t slashingResistance; + uint16_t piercingResistance; + uint16_t bluntResistance; + uint16_t projectileResistance; + uint16_t attackMagicPotency; + uint16_t healingMagicPotency; + uint16_t enhancementMagicPotency; + uint16_t enfeeblingMagicPotency; + uint16_t fireResistance; + uint16_t iceResistance; + uint16_t windResistance; + uint16_t earthResistance; + uint16_t lightningResistance; + uint16_t waterResistance; + uint16_t magicResistance; + uint16_t determination; + uint16_t skillSpeed; + uint16_t spellSpeed; + uint16_t haste; + uint16_t morale; + uint16_t enmity; + uint16_t enmityReduction; + uint16_t carefulDesynthesis; + uint16_t eXPBonus; + uint16_t regen; + uint16_t refresh; + uint16_t movementSpeed; + uint16_t spikes; + uint16_t slowResistance; + uint16_t petrificationResistance; + uint16_t paralysisResistance; + uint16_t silenceResistance; + uint16_t blindResistance; + uint16_t poisonResistance; + uint16_t stunResistance; + uint16_t sleepResistance; + uint16_t bindResistance; + uint16_t heavyResistance; + uint16_t doomResistance; + uint16_t reducedDurabilityLoss; + uint16_t increasedSpiritbondGain; + uint16_t craftsmanship; + uint16_t control; + uint16_t gathering; + uint16_t perception; + + ItemLevel( uint32_t row_id, Core::Data::ExdDataGenerated* exdData ); +}; + struct ItemSearchCategory { std::string name; @@ -3288,7 +3602,7 @@ struct MapMarker uint8_t dataType; uint16_t dataKey; - MapMarker( uint32_t row_id, Core::Data::ExdDataGenerated* exdData ); + MapMarker( uint32_t row_id, uint32_t subRow, Core::Data::ExdDataGenerated* exdData ); }; struct MapMarkerRegion @@ -3340,6 +3654,14 @@ struct Materia Materia( uint32_t row_id, Core::Data::ExdDataGenerated* exdData ); }; +struct MiniGameRA +{ + int32_t icon; + int32_t bGM; + + MiniGameRA( uint32_t row_id, Core::Data::ExdDataGenerated* exdData ); +}; + struct MinionRace { std::string name; @@ -3420,8 +3742,12 @@ struct MonsterNoteTarget struct Mount { std::string singular; + int8_t adjective; std::string plural; + int8_t possessivePronoun; int8_t startsWithVowel; + int8_t pronoun; + int8_t article; int32_t modelChara; uint8_t flyingCondition; uint8_t isFlying; @@ -3429,8 +3755,11 @@ struct Mount uint16_t rideBGM; int16_t order; uint16_t icon; + uint8_t extraSeats; uint16_t mountAction; bool isAirborne; + bool useEP; + bool isImmobile; Mount( uint32_t row_id, Core::Data::ExdDataGenerated* exdData ); }; @@ -3456,6 +3785,18 @@ struct MountCustomize float roeFemaleScale; float auRaMaleScale; float auRaFemaleScale; + uint8_t hyurMaleCameraHeight; + uint8_t hyurFemaleCameraHeight; + uint8_t elezenMaleCameraHeight; + uint8_t elezenFemaleCameraHeight; + uint8_t lalaMaleCameraHeight; + uint8_t lalaFemaleCameraHeight; + uint8_t miqoMaleCameraHeight; + uint8_t miqoFemaleCameraHeight; + uint8_t roeMaleCameraHeight; + uint8_t roeFemaleCameraHeight; + uint8_t auRaMaleCameraHeight; + uint8_t auRaFemaleCameraHeight; MountCustomize( uint32_t row_id, Core::Data::ExdDataGenerated* exdData ); }; @@ -3613,6 +3954,19 @@ struct ParamGrow ParamGrow( uint32_t row_id, Core::Data::ExdDataGenerated* exdData ); }; +struct PartyContent +{ + uint8_t key; + uint16_t timeLimit; + std::string name; + uint32_t textDataStart; + uint32_t textDataEnd; + uint16_t contentFinderCondition; + uint32_t image; + + PartyContent( uint32_t row_id, Core::Data::ExdDataGenerated* exdData ); +}; + struct PartyContentCutscene { uint32_t cutscene; @@ -3620,6 +3974,13 @@ struct PartyContentCutscene PartyContentCutscene( uint32_t row_id, Core::Data::ExdDataGenerated* exdData ); }; +struct PartyContentTextData +{ + std::string data; + + PartyContentTextData( uint32_t row_id, Core::Data::ExdDataGenerated* exdData ); +}; + struct Perform { std::string name; @@ -3695,13 +4056,14 @@ struct PreHandler struct PublicContent { + uint8_t type; uint16_t timeLimit; uint32_t mapIcon; std::string name; uint32_t textDataStart; uint32_t textDataEnd; uint16_t contentFinderCondition; - uint16_t eureka; + uint16_t additionalData; PublicContent( uint32_t row_id, Core::Data::ExdDataGenerated* exdData ); }; @@ -3733,7 +4095,7 @@ struct PvPActionSort uint8_t name; uint16_t action; - PvPActionSort( uint32_t row_id, Core::Data::ExdDataGenerated* exdData ); + PvPActionSort( uint32_t row_id, uint32_t subRow, Core::Data::ExdDataGenerated* exdData ); }; struct PvPRank @@ -3769,6 +4131,7 @@ struct Quest uint8_t classJobCategory0; uint16_t classJobLevel0; uint8_t questLevelOffset; + uint16_t levelMax; uint8_t classJobCategory1; uint16_t classJobLevel1; uint8_t previousQuestJoin; @@ -3782,6 +4145,7 @@ struct Quest uint8_t grandCompanyRank; uint8_t instanceContentJoin; std::vector< uint32_t > instanceContent; + uint8_t festival; uint16_t bellStart; uint16_t bellEnd; uint8_t beastTribe; @@ -3792,6 +4156,7 @@ struct Quest uint32_t eNpcResidentEnd; bool isRepeatable; uint8_t repeatIntervalType; + uint8_t questRepeatFlag; std::vector< std::string > scriptInstruction; std::vector< uint32_t > scriptArg; std::vector< uint32_t > level; @@ -3835,7 +4200,7 @@ struct QuestClassJobReward std::vector< uint32_t > requiredItem; std::vector< uint8_t > requiredAmount; - QuestClassJobReward( uint32_t row_id, Core::Data::ExdDataGenerated* exdData ); + QuestClassJobReward( uint32_t row_id, uint32_t subRow, Core::Data::ExdDataGenerated* exdData ); }; struct QuestClassJobSupply @@ -3844,7 +4209,7 @@ struct QuestClassJobSupply uint32_t eNpcResident; uint32_t item; - QuestClassJobSupply( uint32_t row_id, Core::Data::ExdDataGenerated* exdData ); + QuestClassJobSupply( uint32_t row_id, uint32_t subRow, Core::Data::ExdDataGenerated* exdData ); }; struct QuestRepeatFlag @@ -4052,7 +4417,7 @@ struct Resident int32_t npcYell; uint8_t residentMotionType; - Resident( uint32_t row_id, Core::Data::ExdDataGenerated* exdData ); + Resident( uint32_t row_id, uint32_t subRow, Core::Data::ExdDataGenerated* exdData ); }; struct RetainerTask @@ -4145,7 +4510,7 @@ struct SatisfactionSupply uint16_t collectabilityHigh; uint16_t reward; - SatisfactionSupply( uint32_t row_id, Core::Data::ExdDataGenerated* exdData ); + SatisfactionSupply( uint32_t row_id, uint32_t subRow, Core::Data::ExdDataGenerated* exdData ); }; struct SatisfactionSupplyReward @@ -4183,7 +4548,7 @@ struct ScenarioTreeTipsClassQuest uint8_t requiredExpansion; uint32_t requiredQuest; - ScenarioTreeTipsClassQuest( uint32_t row_id, Core::Data::ExdDataGenerated* exdData ); + ScenarioTreeTipsClassQuest( uint32_t row_id, uint32_t subRow, Core::Data::ExdDataGenerated* exdData ); }; struct ScenarioTreeTipsQuest @@ -4441,6 +4806,7 @@ struct Title std::string masculine; std::string feminine; bool isPrefix; + uint16_t order; Title( uint32_t row_id, Core::Data::ExdDataGenerated* exdData ); }; @@ -4656,6 +5022,14 @@ struct TutorialTank TutorialTank( uint32_t row_id, Core::Data::ExdDataGenerated* exdData ); }; +struct UIColor +{ + uint32_t foreground; + uint32_t background; + + UIColor( uint32_t row_id, Core::Data::ExdDataGenerated* exdData ); +}; + struct VaseFlower { uint32_t item; @@ -4674,9 +5048,9 @@ struct Warp { uint32_t level; uint16_t placeName; - uint32_t defaultTalk1; - uint32_t defaultTalk2; - uint32_t defaultTalk3; + uint32_t conditionSuccessEvent; + uint32_t conditionFailEvent; + uint32_t confirmEvent; uint16_t warpCondition; uint16_t warpLogic; @@ -4695,12 +5069,12 @@ struct WarpCondition struct WarpLogic { - bool warpName; + std::string warpName; std::vector< std::string > function; std::vector< uint32_t > argument; - std::string textString; - std::string response1; - std::string response2; + std::string question; + std::string responseYes; + std::string responseNo; WarpLogic( uint32_t row_id, Core::Data::ExdDataGenerated* exdData ); }; @@ -4718,7 +5092,7 @@ struct WeatherGroup { int32_t weatherRate; - WeatherGroup( uint32_t row_id, Core::Data::ExdDataGenerated* exdData ); + WeatherGroup( uint32_t row_id, uint32_t subRow, Core::Data::ExdDataGenerated* exdData ); }; struct WeatherRate @@ -4772,6 +5146,7 @@ struct World { std::string name; uint8_t dataCenter; + bool isPublic; World( uint32_t row_id, Core::Data::ExdDataGenerated* exdData ); }; @@ -4800,7 +5175,7 @@ struct ZoneSharedGroup uint32_t quest5; uint32_t quest6; - ZoneSharedGroup( uint32_t row_id, Core::Data::ExdDataGenerated* exdData ); + ZoneSharedGroup( uint32_t row_id, uint32_t subRow, Core::Data::ExdDataGenerated* exdData ); }; @@ -4982,8 +5357,13 @@ struct ZoneSharedGroup xiv::exd::Exd m_EObjNameDat; xiv::exd::Exd m_EquipRaceCategoryDat; xiv::exd::Exd m_EquipSlotCategoryDat; + xiv::exd::Exd m_EurekaAetherItemDat; xiv::exd::Exd m_EurekaAethernetDat; xiv::exd::Exd m_EurekaGrowDataDat; + xiv::exd::Exd m_EurekaLogosMixerProbabilityDat; + xiv::exd::Exd m_EurekaMagiaActionDat; + xiv::exd::Exd m_EurekaMagiciteItemDat; + xiv::exd::Exd m_EurekaMagiciteItemTypeDat; xiv::exd::Exd m_EurekaSphereElementAdjustDat; xiv::exd::Exd m_EventActionDat; xiv::exd::Exd m_EventIconPriorityDat; @@ -5005,7 +5385,9 @@ struct ZoneSharedGroup xiv::exd::Exd m_FCProfileDat; xiv::exd::Exd m_FCReputationDat; xiv::exd::Exd m_FCRightsDat; + xiv::exd::Exd m_FestivalDat; xiv::exd::Exd m_FieldMarkerDat; + xiv::exd::Exd m_FishingRecordTypeDat; xiv::exd::Exd m_FishingRecordTypeTransientDat; xiv::exd::Exd m_FishingSpotDat; xiv::exd::Exd m_FishParameterDat; @@ -5047,6 +5429,9 @@ struct ZoneSharedGroup xiv::exd::Exd m_GCSupplyDutyRewardDat; xiv::exd::Exd m_GeneralActionDat; xiv::exd::Exd m_GFATEDat; + xiv::exd::Exd m_GFateClimbing2Dat; + xiv::exd::Exd m_GFateClimbing2ContentDat; + xiv::exd::Exd m_GFateClimbing2TotemTypeDat; xiv::exd::Exd m_GilShopDat; xiv::exd::Exd m_GilShopItemDat; xiv::exd::Exd m_GoldSaucerArcadeMachineDat; @@ -5061,12 +5446,17 @@ struct ZoneSharedGroup xiv::exd::Exd m_HairMakeTypeDat; xiv::exd::Exd m_HouseRetainerPoseDat; xiv::exd::Exd m_HousingAethernetDat; + xiv::exd::Exd m_HousingAppealDat; xiv::exd::Exd m_HousingEmploymentNpcListDat; xiv::exd::Exd m_HousingEmploymentNpcRaceDat; + xiv::exd::Exd m_HousingExteriorDat; xiv::exd::Exd m_HousingFurnitureDat; + xiv::exd::Exd m_HousingMapMarkerInfoDat; + xiv::exd::Exd m_HousingMerchantPoseDat; xiv::exd::Exd m_HousingLandSetDat; xiv::exd::Exd m_HousingPlacementDat; xiv::exd::Exd m_HousingPresetDat; + xiv::exd::Exd m_HousingUnitedExteriorDat; xiv::exd::Exd m_HousingYardObjectDat; xiv::exd::Exd m_HowToDat; xiv::exd::Exd m_HowToCategoryDat; @@ -5077,6 +5467,7 @@ struct ZoneSharedGroup xiv::exd::Exd m_ItemDat; xiv::exd::Exd m_ItemActionDat; xiv::exd::Exd m_ItemFoodDat; + xiv::exd::Exd m_ItemLevelDat; xiv::exd::Exd m_ItemSearchCategoryDat; xiv::exd::Exd m_ItemSeriesDat; xiv::exd::Exd m_ItemSpecialBonusDat; @@ -5109,6 +5500,7 @@ struct ZoneSharedGroup xiv::exd::Exd m_MasterpieceSupplyDutyDat; xiv::exd::Exd m_MasterpieceSupplyMultiplierDat; xiv::exd::Exd m_MateriaDat; + xiv::exd::Exd m_MiniGameRADat; xiv::exd::Exd m_MinionRaceDat; xiv::exd::Exd m_MinionRulesDat; xiv::exd::Exd m_MinionSkillTypeDat; @@ -5136,7 +5528,9 @@ struct ZoneSharedGroup xiv::exd::Exd m_OrchestrionPathDat; xiv::exd::Exd m_OrchestrionUiparamDat; xiv::exd::Exd m_ParamGrowDat; + xiv::exd::Exd m_PartyContentDat; xiv::exd::Exd m_PartyContentCutsceneDat; + xiv::exd::Exd m_PartyContentTextDataDat; xiv::exd::Exd m_PerformDat; xiv::exd::Exd m_PerformTransientDat; xiv::exd::Exd m_PetDat; @@ -5238,6 +5632,7 @@ struct ZoneSharedGroup xiv::exd::Exd m_TutorialDPSDat; xiv::exd::Exd m_TutorialHealerDat; xiv::exd::Exd m_TutorialTankDat; + xiv::exd::Exd m_UIColorDat; xiv::exd::Exd m_VaseFlowerDat; xiv::exd::Exd m_VFXDat; xiv::exd::Exd m_WarpDat; @@ -5257,435 +5652,455 @@ struct ZoneSharedGroup xiv::exd::Exd m_ZoneSharedGroupDat; - using AchievementPtr = std::shared_ptr< Achievement >; - using AchievementCategoryPtr = std::shared_ptr< AchievementCategory >; - using AchievementKindPtr = std::shared_ptr< AchievementKind >; - using ActionPtr = std::shared_ptr< Action >; - using ActionCastTimelinePtr = std::shared_ptr< ActionCastTimeline >; - using ActionCastVFXPtr = std::shared_ptr< ActionCastVFX >; - using ActionCategoryPtr = std::shared_ptr< ActionCategory >; - using ActionComboRoutePtr = std::shared_ptr< ActionComboRoute >; - using ActionIndirectionPtr = std::shared_ptr< ActionIndirection >; - using ActionParamPtr = std::shared_ptr< ActionParam >; - using ActionProcStatusPtr = std::shared_ptr< ActionProcStatus >; - using ActionTimelinePtr = std::shared_ptr< ActionTimeline >; - using ActionTimelineMovePtr = std::shared_ptr< ActionTimelineMove >; - using ActionTimelineReplacePtr = std::shared_ptr< ActionTimelineReplace >; - using ActionTransientPtr = std::shared_ptr< ActionTransient >; - using ActivityFeedButtonsPtr = std::shared_ptr< ActivityFeedButtons >; - using ActivityFeedCaptionsPtr = std::shared_ptr< ActivityFeedCaptions >; - using ActivityFeedGroupCaptionsPtr = std::shared_ptr< ActivityFeedGroupCaptions >; - using ActivityFeedImagesPtr = std::shared_ptr< ActivityFeedImages >; - using AddonPtr = std::shared_ptr< Addon >; - using AddonHudPtr = std::shared_ptr< AddonHud >; - using AdventurePtr = std::shared_ptr< Adventure >; - using AdventureExPhasePtr = std::shared_ptr< AdventureExPhase >; - using AetherCurrentPtr = std::shared_ptr< AetherCurrent >; - using AetherCurrentCompFlgSetPtr = std::shared_ptr< AetherCurrentCompFlgSet >; - using AetherialWheelPtr = std::shared_ptr< AetherialWheel >; - using AetherytePtr = std::shared_ptr< Aetheryte >; - using AetheryteSystemDefinePtr = std::shared_ptr< AetheryteSystemDefine >; - using AirshipExplorationLevelPtr = std::shared_ptr< AirshipExplorationLevel >; - using AirshipExplorationLogPtr = std::shared_ptr< AirshipExplorationLog >; - using AirshipExplorationParamTypePtr = std::shared_ptr< AirshipExplorationParamType >; - using AirshipExplorationPartPtr = std::shared_ptr< AirshipExplorationPart >; - using AirshipExplorationPointPtr = std::shared_ptr< AirshipExplorationPoint >; - using AnimaWeapon5Ptr = std::shared_ptr< AnimaWeapon5 >; - using AnimaWeapon5ParamPtr = std::shared_ptr< AnimaWeapon5Param >; - using AnimaWeapon5PatternGroupPtr = std::shared_ptr< AnimaWeapon5PatternGroup >; - using AnimaWeapon5SpiritTalkPtr = std::shared_ptr< AnimaWeapon5SpiritTalk >; - using AnimaWeapon5SpiritTalkParamPtr = std::shared_ptr< AnimaWeapon5SpiritTalkParam >; - using AnimaWeapon5TradeItemPtr = std::shared_ptr< AnimaWeapon5TradeItem >; - using AnimaWeaponFUITalkPtr = std::shared_ptr< AnimaWeaponFUITalk >; - using AnimaWeaponFUITalkParamPtr = std::shared_ptr< AnimaWeaponFUITalkParam >; - using AnimaWeaponIconPtr = std::shared_ptr< AnimaWeaponIcon >; - using AnimaWeaponItemPtr = std::shared_ptr< AnimaWeaponItem >; - using AquariumFishPtr = std::shared_ptr< AquariumFish >; - using AquariumWaterPtr = std::shared_ptr< AquariumWater >; - using ArrayEventHandlerPtr = std::shared_ptr< ArrayEventHandler >; - using AttackTypePtr = std::shared_ptr< AttackType >; - using BacklightColorPtr = std::shared_ptr< BacklightColor >; - using BalloonPtr = std::shared_ptr< Balloon >; - using BaseParamPtr = std::shared_ptr< BaseParam >; - using BattleLevePtr = std::shared_ptr< BattleLeve >; - using BeastRankBonusPtr = std::shared_ptr< BeastRankBonus >; - using BeastReputationRankPtr = std::shared_ptr< BeastReputationRank >; - using BeastTribePtr = std::shared_ptr< BeastTribe >; - using BehaviorPtr = std::shared_ptr< Behavior >; - using BGMPtr = std::shared_ptr< BGM >; - using BGMFadePtr = std::shared_ptr< BGMFade >; - using BGMSituationPtr = std::shared_ptr< BGMSituation >; - using BGMSwitchPtr = std::shared_ptr< BGMSwitch >; - using BGMSystemDefinePtr = std::shared_ptr< BGMSystemDefine >; - using BNpcAnnounceIconPtr = std::shared_ptr< BNpcAnnounceIcon >; - using BNpcBasePtr = std::shared_ptr< BNpcBase >; - using BNpcCustomizePtr = std::shared_ptr< BNpcCustomize >; - using BNpcNamePtr = std::shared_ptr< BNpcName >; - using BNpcPartsPtr = std::shared_ptr< BNpcParts >; - using BuddyPtr = std::shared_ptr< Buddy >; - using BuddyActionPtr = std::shared_ptr< BuddyAction >; - using BuddyEquipPtr = std::shared_ptr< BuddyEquip >; - using BuddyItemPtr = std::shared_ptr< BuddyItem >; - using BuddyRankPtr = std::shared_ptr< BuddyRank >; - using BuddySkillPtr = std::shared_ptr< BuddySkill >; - using CabinetPtr = std::shared_ptr< Cabinet >; - using CabinetCategoryPtr = std::shared_ptr< CabinetCategory >; - using CalendarPtr = std::shared_ptr< Calendar >; - using CharaMakeCustomizePtr = std::shared_ptr< CharaMakeCustomize >; - using CharaMakeTypePtr = std::shared_ptr< CharaMakeType >; - using ChocoboRacePtr = std::shared_ptr< ChocoboRace >; - using ChocoboRaceAbilityPtr = std::shared_ptr< ChocoboRaceAbility >; - using ChocoboRaceAbilityTypePtr = std::shared_ptr< ChocoboRaceAbilityType >; - using ChocoboRaceItemPtr = std::shared_ptr< ChocoboRaceItem >; - using ChocoboRaceRankPtr = std::shared_ptr< ChocoboRaceRank >; - using ChocoboRaceStatusPtr = std::shared_ptr< ChocoboRaceStatus >; - using ChocoboRaceTerritoryPtr = std::shared_ptr< ChocoboRaceTerritory >; - using ChocoboRaceTutorialPtr = std::shared_ptr< ChocoboRaceTutorial >; - using ChocoboRaceWeatherPtr = std::shared_ptr< ChocoboRaceWeather >; - using ChocoboTaxiPtr = std::shared_ptr< ChocoboTaxi >; - using ChocoboTaxiStandPtr = std::shared_ptr< ChocoboTaxiStand >; - using ClassJobPtr = std::shared_ptr< ClassJob >; - using ClassJobCategoryPtr = std::shared_ptr< ClassJobCategory >; - using CompanionPtr = std::shared_ptr< Companion >; - using CompanionMovePtr = std::shared_ptr< CompanionMove >; - using CompanionTransientPtr = std::shared_ptr< CompanionTransient >; - using CompanyActionPtr = std::shared_ptr< CompanyAction >; - using CompanyCraftDraftPtr = std::shared_ptr< CompanyCraftDraft >; - using CompanyCraftDraftCategoryPtr = std::shared_ptr< CompanyCraftDraftCategory >; - using CompanyCraftManufactoryStatePtr = std::shared_ptr< CompanyCraftManufactoryState >; - using CompanyCraftPartPtr = std::shared_ptr< CompanyCraftPart >; - using CompanyCraftProcessPtr = std::shared_ptr< CompanyCraftProcess >; - using CompanyCraftSequencePtr = std::shared_ptr< CompanyCraftSequence >; - using CompanyCraftSupplyItemPtr = std::shared_ptr< CompanyCraftSupplyItem >; - using CompanyCraftTypePtr = std::shared_ptr< CompanyCraftType >; - using CompleteJournalPtr = std::shared_ptr< CompleteJournal >; - using CompleteJournalCategoryPtr = std::shared_ptr< CompleteJournalCategory >; - using ContentCloseCyclePtr = std::shared_ptr< ContentCloseCycle >; - using ContentExActionPtr = std::shared_ptr< ContentExAction >; - using ContentFinderConditionPtr = std::shared_ptr< ContentFinderCondition >; - using ContentFinderConditionTransientPtr = std::shared_ptr< ContentFinderConditionTransient >; - using ContentGaugePtr = std::shared_ptr< ContentGauge >; - using ContentGaugeColorPtr = std::shared_ptr< ContentGaugeColor >; - using ContentMemberTypePtr = std::shared_ptr< ContentMemberType >; - using ContentNpcTalkPtr = std::shared_ptr< ContentNpcTalk >; - using ContentRoulettePtr = std::shared_ptr< ContentRoulette >; - using ContentRouletteOpenRulePtr = std::shared_ptr< ContentRouletteOpenRule >; - using ContentRouletteRoleBonusPtr = std::shared_ptr< ContentRouletteRoleBonus >; - using ContentsNotePtr = std::shared_ptr< ContentsNote >; - using ContentTalkPtr = std::shared_ptr< ContentTalk >; - using ContentTalkParamPtr = std::shared_ptr< ContentTalkParam >; - using ContentTypePtr = std::shared_ptr< ContentType >; - using CraftActionPtr = std::shared_ptr< CraftAction >; - using CraftLevePtr = std::shared_ptr< CraftLeve >; - using CraftTypePtr = std::shared_ptr< CraftType >; - using CreditPtr = std::shared_ptr< Credit >; - using CreditCastPtr = std::shared_ptr< CreditCast >; - using CurrencyPtr = std::shared_ptr< Currency >; - using CustomTalkPtr = std::shared_ptr< CustomTalk >; - using CutscenePtr = std::shared_ptr< Cutscene >; - using CutScreenImagePtr = std::shared_ptr< CutScreenImage >; - using DailySupplyItemPtr = std::shared_ptr< DailySupplyItem >; - using DeepDungeonPtr = std::shared_ptr< DeepDungeon >; - using DeepDungeonBanPtr = std::shared_ptr< DeepDungeonBan >; - using DeepDungeonDangerPtr = std::shared_ptr< DeepDungeonDanger >; - using DeepDungeonEquipmentPtr = std::shared_ptr< DeepDungeonEquipment >; - using DeepDungeonFloorEffectUIPtr = std::shared_ptr< DeepDungeonFloorEffectUI >; - using DeepDungeonItemPtr = std::shared_ptr< DeepDungeonItem >; - using DeepDungeonLayerPtr = std::shared_ptr< DeepDungeonLayer >; - using DeepDungeonMagicStonePtr = std::shared_ptr< DeepDungeonMagicStone >; - using DeepDungeonMap5XPtr = std::shared_ptr< DeepDungeonMap5X >; - using DeepDungeonRoomPtr = std::shared_ptr< DeepDungeonRoom >; - using DeepDungeonStatusPtr = std::shared_ptr< DeepDungeonStatus >; - using DefaultTalkPtr = std::shared_ptr< DefaultTalk >; - using DefaultTalkLipSyncTypePtr = std::shared_ptr< DefaultTalkLipSyncType >; - using DeliveryQuestPtr = std::shared_ptr< DeliveryQuest >; - using DisposalShopPtr = std::shared_ptr< DisposalShop >; - using DisposalShopFilterTypePtr = std::shared_ptr< DisposalShopFilterType >; - using DisposalShopItemPtr = std::shared_ptr< DisposalShopItem >; - using DpsChallengePtr = std::shared_ptr< DpsChallenge >; - using DpsChallengeOfficerPtr = std::shared_ptr< DpsChallengeOfficer >; - using DpsChallengeTransientPtr = std::shared_ptr< DpsChallengeTransient >; - using EmotePtr = std::shared_ptr< Emote >; - using EmoteCategoryPtr = std::shared_ptr< EmoteCategory >; - using ENpcBasePtr = std::shared_ptr< ENpcBase >; - using ENpcResidentPtr = std::shared_ptr< ENpcResident >; - using EObjPtr = std::shared_ptr< EObj >; - using EObjNamePtr = std::shared_ptr< EObjName >; - using EquipRaceCategoryPtr = std::shared_ptr< EquipRaceCategory >; - using EquipSlotCategoryPtr = std::shared_ptr< EquipSlotCategory >; - using EurekaAethernetPtr = std::shared_ptr< EurekaAethernet >; - using EurekaGrowDataPtr = std::shared_ptr< EurekaGrowData >; - using EurekaSphereElementAdjustPtr = std::shared_ptr< EurekaSphereElementAdjust >; - using EventActionPtr = std::shared_ptr< EventAction >; - using EventIconPriorityPtr = std::shared_ptr< EventIconPriority >; - using EventIconTypePtr = std::shared_ptr< EventIconType >; - using EventItemPtr = std::shared_ptr< EventItem >; - using EventItemCastTimelinePtr = std::shared_ptr< EventItemCastTimeline >; - using EventItemHelpPtr = std::shared_ptr< EventItemHelp >; - using EventItemTimelinePtr = std::shared_ptr< EventItemTimeline >; - using ExportedSGPtr = std::shared_ptr< ExportedSG >; - using ExVersionPtr = std::shared_ptr< ExVersion >; - using FatePtr = std::shared_ptr< Fate >; - using FCActivityPtr = std::shared_ptr< FCActivity >; - using FCActivityCategoryPtr = std::shared_ptr< FCActivityCategory >; - using FCAuthorityPtr = std::shared_ptr< FCAuthority >; - using FCAuthorityCategoryPtr = std::shared_ptr< FCAuthorityCategory >; - using FCChestNamePtr = std::shared_ptr< FCChestName >; - using FccShopPtr = std::shared_ptr< FccShop >; - using FCHierarchyPtr = std::shared_ptr< FCHierarchy >; - using FCProfilePtr = std::shared_ptr< FCProfile >; - using FCReputationPtr = std::shared_ptr< FCReputation >; - using FCRightsPtr = std::shared_ptr< FCRights >; - using FieldMarkerPtr = std::shared_ptr< FieldMarker >; - using FishingRecordTypeTransientPtr = std::shared_ptr< FishingRecordTypeTransient >; - using FishingSpotPtr = std::shared_ptr< FishingSpot >; - using FishParameterPtr = std::shared_ptr< FishParameter >; - using Frontline03Ptr = std::shared_ptr< Frontline03 >; - using Frontline04Ptr = std::shared_ptr< Frontline04 >; - using GardeningSeedPtr = std::shared_ptr< GardeningSeed >; - using GatheringConditionPtr = std::shared_ptr< GatheringCondition >; - using GatheringExpPtr = std::shared_ptr< GatheringExp >; - using GatheringItemPtr = std::shared_ptr< GatheringItem >; - using GatheringItemLevelConvertTablePtr = std::shared_ptr< GatheringItemLevelConvertTable >; - using GatheringItemPointPtr = std::shared_ptr< GatheringItemPoint >; - using GatheringLevePtr = std::shared_ptr< GatheringLeve >; - using GatheringLeveRoutePtr = std::shared_ptr< GatheringLeveRoute >; - using GatheringNotebookListPtr = std::shared_ptr< GatheringNotebookList >; - using GatheringPointPtr = std::shared_ptr< GatheringPoint >; - using GatheringPointBasePtr = std::shared_ptr< GatheringPointBase >; - using GatheringPointBonusPtr = std::shared_ptr< GatheringPointBonus >; - using GatheringPointBonusTypePtr = std::shared_ptr< GatheringPointBonusType >; - using GatheringPointNamePtr = std::shared_ptr< GatheringPointName >; - using GatheringSubCategoryPtr = std::shared_ptr< GatheringSubCategory >; - using GatheringTypePtr = std::shared_ptr< GatheringType >; - using GcArmyCaptureTacticsPtr = std::shared_ptr< GcArmyCaptureTactics >; - using GcArmyExpeditionPtr = std::shared_ptr< GcArmyExpedition >; - using GcArmyExpeditionMemberBonusPtr = std::shared_ptr< GcArmyExpeditionMemberBonus >; - using GcArmyExpeditionTypePtr = std::shared_ptr< GcArmyExpeditionType >; - using GcArmyMemberGrowPtr = std::shared_ptr< GcArmyMemberGrow >; - using GcArmyTrainingPtr = std::shared_ptr< GcArmyTraining >; - using GCRankGridaniaFemaleTextPtr = std::shared_ptr< GCRankGridaniaFemaleText >; - using GCRankGridaniaMaleTextPtr = std::shared_ptr< GCRankGridaniaMaleText >; - using GCRankLimsaFemaleTextPtr = std::shared_ptr< GCRankLimsaFemaleText >; - using GCRankLimsaMaleTextPtr = std::shared_ptr< GCRankLimsaMaleText >; - using GCRankUldahFemaleTextPtr = std::shared_ptr< GCRankUldahFemaleText >; - using GCRankUldahMaleTextPtr = std::shared_ptr< GCRankUldahMaleText >; - using GCScripShopCategoryPtr = std::shared_ptr< GCScripShopCategory >; - using GCScripShopItemPtr = std::shared_ptr< GCScripShopItem >; - using GCShopPtr = std::shared_ptr< GCShop >; - using GCShopItemCategoryPtr = std::shared_ptr< GCShopItemCategory >; - using GCSupplyDutyPtr = std::shared_ptr< GCSupplyDuty >; - using GCSupplyDutyRewardPtr = std::shared_ptr< GCSupplyDutyReward >; - using GeneralActionPtr = std::shared_ptr< GeneralAction >; - using GFATEPtr = std::shared_ptr< GFATE >; - using GilShopPtr = std::shared_ptr< GilShop >; - using GilShopItemPtr = std::shared_ptr< GilShopItem >; - using GoldSaucerArcadeMachinePtr = std::shared_ptr< GoldSaucerArcadeMachine >; - using GoldSaucerTextDataPtr = std::shared_ptr< GoldSaucerTextData >; - using GrandCompanyPtr = std::shared_ptr< GrandCompany >; - using GrandCompanyRankPtr = std::shared_ptr< GrandCompanyRank >; - using GuardianDeityPtr = std::shared_ptr< GuardianDeity >; - using GuildleveAssignmentPtr = std::shared_ptr< GuildleveAssignment >; - using GuildleveAssignmentCategoryPtr = std::shared_ptr< GuildleveAssignmentCategory >; - using GuildOrderGuidePtr = std::shared_ptr< GuildOrderGuide >; - using GuildOrderOfficerPtr = std::shared_ptr< GuildOrderOfficer >; - using HairMakeTypePtr = std::shared_ptr< HairMakeType >; - using HouseRetainerPosePtr = std::shared_ptr< HouseRetainerPose >; - using HousingAethernetPtr = std::shared_ptr< HousingAethernet >; - using HousingEmploymentNpcListPtr = std::shared_ptr< HousingEmploymentNpcList >; - using HousingEmploymentNpcRacePtr = std::shared_ptr< HousingEmploymentNpcRace >; - using HousingFurniturePtr = std::shared_ptr< HousingFurniture >; - using HousingLandSetPtr = std::shared_ptr< HousingLandSet >; - using HousingPlacementPtr = std::shared_ptr< HousingPlacement >; - using HousingPresetPtr = std::shared_ptr< HousingPreset >; - using HousingYardObjectPtr = std::shared_ptr< HousingYardObject >; - using HowToPtr = std::shared_ptr< HowTo >; - using HowToCategoryPtr = std::shared_ptr< HowToCategory >; - using HowToPagePtr = std::shared_ptr< HowToPage >; - using InstanceContentPtr = std::shared_ptr< InstanceContent >; - using InstanceContentBuffPtr = std::shared_ptr< InstanceContentBuff >; - using InstanceContentTextDataPtr = std::shared_ptr< InstanceContentTextData >; - using ItemPtr = std::shared_ptr< Item >; - using ItemActionPtr = std::shared_ptr< ItemAction >; - using ItemFoodPtr = std::shared_ptr< ItemFood >; - using ItemSearchCategoryPtr = std::shared_ptr< ItemSearchCategory >; - using ItemSeriesPtr = std::shared_ptr< ItemSeries >; - using ItemSpecialBonusPtr = std::shared_ptr< ItemSpecialBonus >; - using ItemUICategoryPtr = std::shared_ptr< ItemUICategory >; - using JournalCategoryPtr = std::shared_ptr< JournalCategory >; - using JournalGenrePtr = std::shared_ptr< JournalGenre >; - using JournalSectionPtr = std::shared_ptr< JournalSection >; - using LevePtr = std::shared_ptr< Leve >; - using LeveAssignmentTypePtr = std::shared_ptr< LeveAssignmentType >; - using LeveClientPtr = std::shared_ptr< LeveClient >; - using LevelPtr = std::shared_ptr< Level >; - using LeveRewardItemPtr = std::shared_ptr< LeveRewardItem >; - using LeveRewardItemGroupPtr = std::shared_ptr< LeveRewardItemGroup >; - using LeveVfxPtr = std::shared_ptr< LeveVfx >; - using LogFilterPtr = std::shared_ptr< LogFilter >; - using LogKindPtr = std::shared_ptr< LogKind >; - using LogKindCategoryTextPtr = std::shared_ptr< LogKindCategoryText >; - using LogMessagePtr = std::shared_ptr< LogMessage >; - using LotteryExchangeShopPtr = std::shared_ptr< LotteryExchangeShop >; - using MacroIconPtr = std::shared_ptr< MacroIcon >; - using MacroIconRedirectOldPtr = std::shared_ptr< MacroIconRedirectOld >; - using MainCommandPtr = std::shared_ptr< MainCommand >; - using MainCommandCategoryPtr = std::shared_ptr< MainCommandCategory >; - using ManeuversArmorPtr = std::shared_ptr< ManeuversArmor >; - using MapPtr = std::shared_ptr< Map >; - using MapMarkerPtr = std::shared_ptr< MapMarker >; - using MapMarkerRegionPtr = std::shared_ptr< MapMarkerRegion >; - using MapSymbolPtr = std::shared_ptr< MapSymbol >; - using MarkerPtr = std::shared_ptr< Marker >; - using MasterpieceSupplyDutyPtr = std::shared_ptr< MasterpieceSupplyDuty >; - using MasterpieceSupplyMultiplierPtr = std::shared_ptr< MasterpieceSupplyMultiplier >; - using MateriaPtr = std::shared_ptr< Materia >; - using MinionRacePtr = std::shared_ptr< MinionRace >; - using MinionRulesPtr = std::shared_ptr< MinionRules >; - using MinionSkillTypePtr = std::shared_ptr< MinionSkillType >; - using MobHuntOrderTypePtr = std::shared_ptr< MobHuntOrderType >; - using MobHuntTargetPtr = std::shared_ptr< MobHuntTarget >; - using ModelCharaPtr = std::shared_ptr< ModelChara >; - using ModelStatePtr = std::shared_ptr< ModelState >; - using MonsterNotePtr = std::shared_ptr< MonsterNote >; - using MonsterNoteTargetPtr = std::shared_ptr< MonsterNoteTarget >; - using MountPtr = std::shared_ptr< Mount >; - using MountActionPtr = std::shared_ptr< MountAction >; - using MountCustomizePtr = std::shared_ptr< MountCustomize >; - using MountFlyingConditionPtr = std::shared_ptr< MountFlyingCondition >; - using MountSpeedPtr = std::shared_ptr< MountSpeed >; - using MountTransientPtr = std::shared_ptr< MountTransient >; - using MoveTimelinePtr = std::shared_ptr< MoveTimeline >; - using MoveVfxPtr = std::shared_ptr< MoveVfx >; - using NpcEquipPtr = std::shared_ptr< NpcEquip >; - using NpcYellPtr = std::shared_ptr< NpcYell >; - using OmenPtr = std::shared_ptr< Omen >; - using OnlineStatusPtr = std::shared_ptr< OnlineStatus >; - using OpeningPtr = std::shared_ptr< Opening >; - using OrchestrionPtr = std::shared_ptr< Orchestrion >; - using OrchestrionCategoryPtr = std::shared_ptr< OrchestrionCategory >; - using OrchestrionPathPtr = std::shared_ptr< OrchestrionPath >; - using OrchestrionUiparamPtr = std::shared_ptr< OrchestrionUiparam >; - using ParamGrowPtr = std::shared_ptr< ParamGrow >; - using PartyContentCutscenePtr = std::shared_ptr< PartyContentCutscene >; - using PerformPtr = std::shared_ptr< Perform >; - using PerformTransientPtr = std::shared_ptr< PerformTransient >; - using PetPtr = std::shared_ptr< Pet >; - using PetActionPtr = std::shared_ptr< PetAction >; - using PicturePtr = std::shared_ptr< Picture >; - using PlaceNamePtr = std::shared_ptr< PlaceName >; - using PlantPotFlowerSeedPtr = std::shared_ptr< PlantPotFlowerSeed >; - using PreHandlerPtr = std::shared_ptr< PreHandler >; - using PublicContentPtr = std::shared_ptr< PublicContent >; - using PublicContentCutscenePtr = std::shared_ptr< PublicContentCutscene >; - using PublicContentTextDataPtr = std::shared_ptr< PublicContentTextData >; - using PvPActionPtr = std::shared_ptr< PvPAction >; - using PvPActionSortPtr = std::shared_ptr< PvPActionSort >; - using PvPRankPtr = std::shared_ptr< PvPRank >; - using PvPSelectTraitPtr = std::shared_ptr< PvPSelectTrait >; - using PvPTraitPtr = std::shared_ptr< PvPTrait >; - using QuestPtr = std::shared_ptr< Quest >; - using QuestClassJobRewardPtr = std::shared_ptr< QuestClassJobReward >; - using QuestClassJobSupplyPtr = std::shared_ptr< QuestClassJobSupply >; - using QuestRepeatFlagPtr = std::shared_ptr< QuestRepeatFlag >; - using QuestRewardOtherPtr = std::shared_ptr< QuestRewardOther >; - using QuickChatPtr = std::shared_ptr< QuickChat >; - using QuickChatTransientPtr = std::shared_ptr< QuickChatTransient >; - using RacePtr = std::shared_ptr< Race >; - using RacingChocoboItemPtr = std::shared_ptr< RacingChocoboItem >; - using RacingChocoboNamePtr = std::shared_ptr< RacingChocoboName >; - using RacingChocoboNameCategoryPtr = std::shared_ptr< RacingChocoboNameCategory >; - using RacingChocoboNameInfoPtr = std::shared_ptr< RacingChocoboNameInfo >; - using RacingChocoboParamPtr = std::shared_ptr< RacingChocoboParam >; - using RecipePtr = std::shared_ptr< Recipe >; - using RecipeElementPtr = std::shared_ptr< RecipeElement >; - using RecipeLevelTablePtr = std::shared_ptr< RecipeLevelTable >; - using RecipeNotebookListPtr = std::shared_ptr< RecipeNotebookList >; - using RecommendContentsPtr = std::shared_ptr< RecommendContents >; - using RelicPtr = std::shared_ptr< Relic >; - using Relic3Ptr = std::shared_ptr< Relic3 >; - using RelicItemPtr = std::shared_ptr< RelicItem >; - using RelicNotePtr = std::shared_ptr< RelicNote >; - using RelicNoteCategoryPtr = std::shared_ptr< RelicNoteCategory >; - using ResidentPtr = std::shared_ptr< Resident >; - using RetainerTaskPtr = std::shared_ptr< RetainerTask >; - using RetainerTaskLvRangePtr = std::shared_ptr< RetainerTaskLvRange >; - using RetainerTaskNormalPtr = std::shared_ptr< RetainerTaskNormal >; - using RetainerTaskParameterPtr = std::shared_ptr< RetainerTaskParameter >; - using RetainerTaskRandomPtr = std::shared_ptr< RetainerTaskRandom >; - using RPParameterPtr = std::shared_ptr< RPParameter >; - using SalvagePtr = std::shared_ptr< Salvage >; - using SatisfactionNpcPtr = std::shared_ptr< SatisfactionNpc >; - using SatisfactionSupplyPtr = std::shared_ptr< SatisfactionSupply >; - using SatisfactionSupplyRewardPtr = std::shared_ptr< SatisfactionSupplyReward >; - using ScenarioTreePtr = std::shared_ptr< ScenarioTree >; - using ScenarioTreeTipsPtr = std::shared_ptr< ScenarioTreeTips >; - using ScenarioTreeTipsClassQuestPtr = std::shared_ptr< ScenarioTreeTipsClassQuest >; - using ScenarioTreeTipsQuestPtr = std::shared_ptr< ScenarioTreeTipsQuest >; - using ScenarioTypePtr = std::shared_ptr< ScenarioType >; - using ScreenImagePtr = std::shared_ptr< ScreenImage >; - using SecretRecipeBookPtr = std::shared_ptr< SecretRecipeBook >; - using SkyIsland2MissionPtr = std::shared_ptr< SkyIsland2Mission >; - using SkyIsland2MissionDetailPtr = std::shared_ptr< SkyIsland2MissionDetail >; - using SkyIsland2MissionTypePtr = std::shared_ptr< SkyIsland2MissionType >; - using SkyIsland2RangeTypePtr = std::shared_ptr< SkyIsland2RangeType >; - using SpearfishingItemPtr = std::shared_ptr< SpearfishingItem >; - using SpearfishingNotebookPtr = std::shared_ptr< SpearfishingNotebook >; - using SpearfishingRecordPagePtr = std::shared_ptr< SpearfishingRecordPage >; - using SpecialShopPtr = std::shared_ptr< SpecialShop >; - using SpecialShopItemCategoryPtr = std::shared_ptr< SpecialShopItemCategory >; - using StainPtr = std::shared_ptr< Stain >; - using StainTransientPtr = std::shared_ptr< StainTransient >; - using StatusPtr = std::shared_ptr< Status >; - using StatusHitEffectPtr = std::shared_ptr< StatusHitEffect >; - using StatusLoopVFXPtr = std::shared_ptr< StatusLoopVFX >; - using StoryPtr = std::shared_ptr< Story >; - using SubmarineExplorationPtr = std::shared_ptr< SubmarineExploration >; - using SubmarinePartPtr = std::shared_ptr< SubmarinePart >; - using SubmarineRankPtr = std::shared_ptr< SubmarineRank >; - using SwitchTalkPtr = std::shared_ptr< SwitchTalk >; - using TerritoryTypePtr = std::shared_ptr< TerritoryType >; - using TextCommandPtr = std::shared_ptr< TextCommand >; - using TitlePtr = std::shared_ptr< Title >; - using TomestonesPtr = std::shared_ptr< Tomestones >; - using TomestonesItemPtr = std::shared_ptr< TomestonesItem >; - using TopicSelectPtr = std::shared_ptr< TopicSelect >; - using TownPtr = std::shared_ptr< Town >; - using TraitPtr = std::shared_ptr< Trait >; - using TraitRecastPtr = std::shared_ptr< TraitRecast >; - using TraitTransientPtr = std::shared_ptr< TraitTransient >; - using TransformationPtr = std::shared_ptr< Transformation >; - using TreasurePtr = std::shared_ptr< Treasure >; - using TreasureHuntRankPtr = std::shared_ptr< TreasureHuntRank >; - using TribePtr = std::shared_ptr< Tribe >; - using TripleTriadPtr = std::shared_ptr< TripleTriad >; - using TripleTriadCardPtr = std::shared_ptr< TripleTriadCard >; - using TripleTriadCardRarityPtr = std::shared_ptr< TripleTriadCardRarity >; - using TripleTriadCardResidentPtr = std::shared_ptr< TripleTriadCardResident >; - using TripleTriadCardTypePtr = std::shared_ptr< TripleTriadCardType >; - using TripleTriadCompetitionPtr = std::shared_ptr< TripleTriadCompetition >; - using TripleTriadRulePtr = std::shared_ptr< TripleTriadRule >; - using TutorialPtr = std::shared_ptr< Tutorial >; - using TutorialDPSPtr = std::shared_ptr< TutorialDPS >; - using TutorialHealerPtr = std::shared_ptr< TutorialHealer >; - using TutorialTankPtr = std::shared_ptr< TutorialTank >; - using VaseFlowerPtr = std::shared_ptr< VaseFlower >; - using VFXPtr = std::shared_ptr< VFX >; - using WarpPtr = std::shared_ptr< Warp >; - using WarpConditionPtr = std::shared_ptr< WarpCondition >; - using WarpLogicPtr = std::shared_ptr< WarpLogic >; - using WeatherPtr = std::shared_ptr< Weather >; - using WeatherGroupPtr = std::shared_ptr< WeatherGroup >; - using WeatherRatePtr = std::shared_ptr< WeatherRate >; - using WeddingBGMPtr = std::shared_ptr< WeddingBGM >; - using WeeklyBingoOrderDataPtr = std::shared_ptr< WeeklyBingoOrderData >; - using WeeklyBingoRewardDataPtr = std::shared_ptr< WeeklyBingoRewardData >; - using WeeklyBingoTextPtr = std::shared_ptr< WeeklyBingoText >; - using WeeklyLotBonusPtr = std::shared_ptr< WeeklyLotBonus >; - using WorldPtr = std::shared_ptr< World >; - using WorldDCGroupTypePtr = std::shared_ptr< WorldDCGroupType >; - using YKWPtr = std::shared_ptr< YKW >; - using ZoneSharedGroupPtr = std::shared_ptr< ZoneSharedGroup >; + using AchievementPtr = std::shared_ptr< Achievement >; + using AchievementCategoryPtr = std::shared_ptr< AchievementCategory >; + using AchievementKindPtr = std::shared_ptr< AchievementKind >; + using ActionPtr = std::shared_ptr< Action >; + using ActionCastTimelinePtr = std::shared_ptr< ActionCastTimeline >; + using ActionCastVFXPtr = std::shared_ptr< ActionCastVFX >; + using ActionCategoryPtr = std::shared_ptr< ActionCategory >; + using ActionComboRoutePtr = std::shared_ptr< ActionComboRoute >; + using ActionIndirectionPtr = std::shared_ptr< ActionIndirection >; + using ActionParamPtr = std::shared_ptr< ActionParam >; + using ActionProcStatusPtr = std::shared_ptr< ActionProcStatus >; + using ActionTimelinePtr = std::shared_ptr< ActionTimeline >; + using ActionTimelineMovePtr = std::shared_ptr< ActionTimelineMove >; + using ActionTimelineReplacePtr = std::shared_ptr< ActionTimelineReplace >; + using ActionTransientPtr = std::shared_ptr< ActionTransient >; + using ActivityFeedButtonsPtr = std::shared_ptr< ActivityFeedButtons >; + using ActivityFeedCaptionsPtr = std::shared_ptr< ActivityFeedCaptions >; + using ActivityFeedGroupCaptionsPtr = std::shared_ptr< ActivityFeedGroupCaptions >; + using ActivityFeedImagesPtr = std::shared_ptr< ActivityFeedImages >; + using AddonPtr = std::shared_ptr< Addon >; + using AddonHudPtr = std::shared_ptr< AddonHud >; + using AdventurePtr = std::shared_ptr< Adventure >; + using AdventureExPhasePtr = std::shared_ptr< AdventureExPhase >; + using AetherCurrentPtr = std::shared_ptr< AetherCurrent >; + using AetherCurrentCompFlgSetPtr = std::shared_ptr< AetherCurrentCompFlgSet >; + using AetherialWheelPtr = std::shared_ptr< AetherialWheel >; + using AetherytePtr = std::shared_ptr< Aetheryte >; + using AetheryteSystemDefinePtr = std::shared_ptr< AetheryteSystemDefine >; + using AirshipExplorationLevelPtr = std::shared_ptr< AirshipExplorationLevel >; + using AirshipExplorationLogPtr = std::shared_ptr< AirshipExplorationLog >; + using AirshipExplorationParamTypePtr = std::shared_ptr< AirshipExplorationParamType >; + using AirshipExplorationPartPtr = std::shared_ptr< AirshipExplorationPart >; + using AirshipExplorationPointPtr = std::shared_ptr< AirshipExplorationPoint >; + using AnimaWeapon5Ptr = std::shared_ptr< AnimaWeapon5 >; + using AnimaWeapon5ParamPtr = std::shared_ptr< AnimaWeapon5Param >; + using AnimaWeapon5PatternGroupPtr = std::shared_ptr< AnimaWeapon5PatternGroup >; + using AnimaWeapon5SpiritTalkPtr = std::shared_ptr< AnimaWeapon5SpiritTalk >; + using AnimaWeapon5SpiritTalkParamPtr = std::shared_ptr< AnimaWeapon5SpiritTalkParam >; + using AnimaWeapon5TradeItemPtr = std::shared_ptr< AnimaWeapon5TradeItem >; + using AnimaWeaponFUITalkPtr = std::shared_ptr< AnimaWeaponFUITalk >; + using AnimaWeaponFUITalkParamPtr = std::shared_ptr< AnimaWeaponFUITalkParam >; + using AnimaWeaponIconPtr = std::shared_ptr< AnimaWeaponIcon >; + using AnimaWeaponItemPtr = std::shared_ptr< AnimaWeaponItem >; + using AquariumFishPtr = std::shared_ptr< AquariumFish >; + using AquariumWaterPtr = std::shared_ptr< AquariumWater >; + using ArrayEventHandlerPtr = std::shared_ptr< ArrayEventHandler >; + using AttackTypePtr = std::shared_ptr< AttackType >; + using BacklightColorPtr = std::shared_ptr< BacklightColor >; + using BalloonPtr = std::shared_ptr< Balloon >; + using BaseParamPtr = std::shared_ptr< BaseParam >; + using BattleLevePtr = std::shared_ptr< BattleLeve >; + using BeastRankBonusPtr = std::shared_ptr< BeastRankBonus >; + using BeastReputationRankPtr = std::shared_ptr< BeastReputationRank >; + using BeastTribePtr = std::shared_ptr< BeastTribe >; + using BehaviorPtr = std::shared_ptr< Behavior >; + using BGMPtr = std::shared_ptr< BGM >; + using BGMFadePtr = std::shared_ptr< BGMFade >; + using BGMSituationPtr = std::shared_ptr< BGMSituation >; + using BGMSwitchPtr = std::shared_ptr< BGMSwitch >; + using BGMSystemDefinePtr = std::shared_ptr< BGMSystemDefine >; + using BNpcAnnounceIconPtr = std::shared_ptr< BNpcAnnounceIcon >; + using BNpcBasePtr = std::shared_ptr< BNpcBase >; + using BNpcCustomizePtr = std::shared_ptr< BNpcCustomize >; + using BNpcNamePtr = std::shared_ptr< BNpcName >; + using BNpcPartsPtr = std::shared_ptr< BNpcParts >; + using BuddyPtr = std::shared_ptr< Buddy >; + using BuddyActionPtr = std::shared_ptr< BuddyAction >; + using BuddyEquipPtr = std::shared_ptr< BuddyEquip >; + using BuddyItemPtr = std::shared_ptr< BuddyItem >; + using BuddyRankPtr = std::shared_ptr< BuddyRank >; + using BuddySkillPtr = std::shared_ptr< BuddySkill >; + using CabinetPtr = std::shared_ptr< Cabinet >; + using CabinetCategoryPtr = std::shared_ptr< CabinetCategory >; + using CalendarPtr = std::shared_ptr< Calendar >; + using CharaMakeCustomizePtr = std::shared_ptr< CharaMakeCustomize >; + using CharaMakeTypePtr = std::shared_ptr< CharaMakeType >; + using ChocoboRacePtr = std::shared_ptr< ChocoboRace >; + using ChocoboRaceAbilityPtr = std::shared_ptr< ChocoboRaceAbility >; + using ChocoboRaceAbilityTypePtr = std::shared_ptr< ChocoboRaceAbilityType >; + using ChocoboRaceItemPtr = std::shared_ptr< ChocoboRaceItem >; + using ChocoboRaceRankPtr = std::shared_ptr< ChocoboRaceRank >; + using ChocoboRaceStatusPtr = std::shared_ptr< ChocoboRaceStatus >; + using ChocoboRaceTerritoryPtr = std::shared_ptr< ChocoboRaceTerritory >; + using ChocoboRaceTutorialPtr = std::shared_ptr< ChocoboRaceTutorial >; + using ChocoboRaceWeatherPtr = std::shared_ptr< ChocoboRaceWeather >; + using ChocoboTaxiPtr = std::shared_ptr< ChocoboTaxi >; + using ChocoboTaxiStandPtr = std::shared_ptr< ChocoboTaxiStand >; + using ClassJobPtr = std::shared_ptr< ClassJob >; + using ClassJobCategoryPtr = std::shared_ptr< ClassJobCategory >; + using CompanionPtr = std::shared_ptr< Companion >; + using CompanionMovePtr = std::shared_ptr< CompanionMove >; + using CompanionTransientPtr = std::shared_ptr< CompanionTransient >; + using CompanyActionPtr = std::shared_ptr< CompanyAction >; + using CompanyCraftDraftPtr = std::shared_ptr< CompanyCraftDraft >; + using CompanyCraftDraftCategoryPtr = std::shared_ptr< CompanyCraftDraftCategory >; + using CompanyCraftManufactoryStatePtr = std::shared_ptr< CompanyCraftManufactoryState >; + using CompanyCraftPartPtr = std::shared_ptr< CompanyCraftPart >; + using CompanyCraftProcessPtr = std::shared_ptr< CompanyCraftProcess >; + using CompanyCraftSequencePtr = std::shared_ptr< CompanyCraftSequence >; + using CompanyCraftSupplyItemPtr = std::shared_ptr< CompanyCraftSupplyItem >; + using CompanyCraftTypePtr = std::shared_ptr< CompanyCraftType >; + using CompleteJournalPtr = std::shared_ptr< CompleteJournal >; + using CompleteJournalCategoryPtr = std::shared_ptr< CompleteJournalCategory >; + using ContentCloseCyclePtr = std::shared_ptr< ContentCloseCycle >; + using ContentExActionPtr = std::shared_ptr< ContentExAction >; + using ContentFinderConditionPtr = std::shared_ptr< ContentFinderCondition >; + using ContentFinderConditionTransientPtr = std::shared_ptr< ContentFinderConditionTransient >; + using ContentGaugePtr = std::shared_ptr< ContentGauge >; + using ContentGaugeColorPtr = std::shared_ptr< ContentGaugeColor >; + using ContentMemberTypePtr = std::shared_ptr< ContentMemberType >; + using ContentNpcTalkPtr = std::shared_ptr< ContentNpcTalk >; + using ContentRoulettePtr = std::shared_ptr< ContentRoulette >; + using ContentRouletteOpenRulePtr = std::shared_ptr< ContentRouletteOpenRule >; + using ContentRouletteRoleBonusPtr = std::shared_ptr< ContentRouletteRoleBonus >; + using ContentsNotePtr = std::shared_ptr< ContentsNote >; + using ContentTalkPtr = std::shared_ptr< ContentTalk >; + using ContentTalkParamPtr = std::shared_ptr< ContentTalkParam >; + using ContentTypePtr = std::shared_ptr< ContentType >; + using CraftActionPtr = std::shared_ptr< CraftAction >; + using CraftLevePtr = std::shared_ptr< CraftLeve >; + using CraftTypePtr = std::shared_ptr< CraftType >; + using CreditPtr = std::shared_ptr< Credit >; + using CreditCastPtr = std::shared_ptr< CreditCast >; + using CurrencyPtr = std::shared_ptr< Currency >; + using CustomTalkPtr = std::shared_ptr< CustomTalk >; + using CutscenePtr = std::shared_ptr< Cutscene >; + using CutScreenImagePtr = std::shared_ptr< CutScreenImage >; + using DailySupplyItemPtr = std::shared_ptr< DailySupplyItem >; + using DeepDungeonPtr = std::shared_ptr< DeepDungeon >; + using DeepDungeonBanPtr = std::shared_ptr< DeepDungeonBan >; + using DeepDungeonDangerPtr = std::shared_ptr< DeepDungeonDanger >; + using DeepDungeonEquipmentPtr = std::shared_ptr< DeepDungeonEquipment >; + using DeepDungeonFloorEffectUIPtr = std::shared_ptr< DeepDungeonFloorEffectUI >; + using DeepDungeonItemPtr = std::shared_ptr< DeepDungeonItem >; + using DeepDungeonLayerPtr = std::shared_ptr< DeepDungeonLayer >; + using DeepDungeonMagicStonePtr = std::shared_ptr< DeepDungeonMagicStone >; + using DeepDungeonMap5XPtr = std::shared_ptr< DeepDungeonMap5X >; + using DeepDungeonRoomPtr = std::shared_ptr< DeepDungeonRoom >; + using DeepDungeonStatusPtr = std::shared_ptr< DeepDungeonStatus >; + using DefaultTalkPtr = std::shared_ptr< DefaultTalk >; + using DefaultTalkLipSyncTypePtr = std::shared_ptr< DefaultTalkLipSyncType >; + using DeliveryQuestPtr = std::shared_ptr< DeliveryQuest >; + using DisposalShopPtr = std::shared_ptr< DisposalShop >; + using DisposalShopFilterTypePtr = std::shared_ptr< DisposalShopFilterType >; + using DisposalShopItemPtr = std::shared_ptr< DisposalShopItem >; + using DpsChallengePtr = std::shared_ptr< DpsChallenge >; + using DpsChallengeOfficerPtr = std::shared_ptr< DpsChallengeOfficer >; + using DpsChallengeTransientPtr = std::shared_ptr< DpsChallengeTransient >; + using EmotePtr = std::shared_ptr< Emote >; + using EmoteCategoryPtr = std::shared_ptr< EmoteCategory >; + using ENpcBasePtr = std::shared_ptr< ENpcBase >; + using ENpcResidentPtr = std::shared_ptr< ENpcResident >; + using EObjPtr = std::shared_ptr< EObj >; + using EObjNamePtr = std::shared_ptr< EObjName >; + using EquipRaceCategoryPtr = std::shared_ptr< EquipRaceCategory >; + using EquipSlotCategoryPtr = std::shared_ptr< EquipSlotCategory >; + using EurekaAetherItemPtr = std::shared_ptr< EurekaAetherItem >; + using EurekaAethernetPtr = std::shared_ptr< EurekaAethernet >; + using EurekaGrowDataPtr = std::shared_ptr< EurekaGrowData >; + using EurekaLogosMixerProbabilityPtr = std::shared_ptr< EurekaLogosMixerProbability >; + using EurekaMagiaActionPtr = std::shared_ptr< EurekaMagiaAction >; + using EurekaMagiciteItemPtr = std::shared_ptr< EurekaMagiciteItem >; + using EurekaMagiciteItemTypePtr = std::shared_ptr< EurekaMagiciteItemType >; + using EurekaSphereElementAdjustPtr = std::shared_ptr< EurekaSphereElementAdjust >; + using EventActionPtr = std::shared_ptr< EventAction >; + using EventIconPriorityPtr = std::shared_ptr< EventIconPriority >; + using EventIconTypePtr = std::shared_ptr< EventIconType >; + using EventItemPtr = std::shared_ptr< EventItem >; + using EventItemCastTimelinePtr = std::shared_ptr< EventItemCastTimeline >; + using EventItemHelpPtr = std::shared_ptr< EventItemHelp >; + using EventItemTimelinePtr = std::shared_ptr< EventItemTimeline >; + using ExportedSGPtr = std::shared_ptr< ExportedSG >; + using ExVersionPtr = std::shared_ptr< ExVersion >; + using FatePtr = std::shared_ptr< Fate >; + using FCActivityPtr = std::shared_ptr< FCActivity >; + using FCActivityCategoryPtr = std::shared_ptr< FCActivityCategory >; + using FCAuthorityPtr = std::shared_ptr< FCAuthority >; + using FCAuthorityCategoryPtr = std::shared_ptr< FCAuthorityCategory >; + using FCChestNamePtr = std::shared_ptr< FCChestName >; + using FccShopPtr = std::shared_ptr< FccShop >; + using FCHierarchyPtr = std::shared_ptr< FCHierarchy >; + using FCProfilePtr = std::shared_ptr< FCProfile >; + using FCReputationPtr = std::shared_ptr< FCReputation >; + using FCRightsPtr = std::shared_ptr< FCRights >; + using FestivalPtr = std::shared_ptr< Festival >; + using FieldMarkerPtr = std::shared_ptr< FieldMarker >; + using FishingRecordTypePtr = std::shared_ptr< FishingRecordType >; + using FishingRecordTypeTransientPtr = std::shared_ptr< FishingRecordTypeTransient >; + using FishingSpotPtr = std::shared_ptr< FishingSpot >; + using FishParameterPtr = std::shared_ptr< FishParameter >; + using Frontline03Ptr = std::shared_ptr< Frontline03 >; + using Frontline04Ptr = std::shared_ptr< Frontline04 >; + using GardeningSeedPtr = std::shared_ptr< GardeningSeed >; + using GatheringConditionPtr = std::shared_ptr< GatheringCondition >; + using GatheringExpPtr = std::shared_ptr< GatheringExp >; + using GatheringItemPtr = std::shared_ptr< GatheringItem >; + using GatheringItemLevelConvertTablePtr = std::shared_ptr< GatheringItemLevelConvertTable >; + using GatheringItemPointPtr = std::shared_ptr< GatheringItemPoint >; + using GatheringLevePtr = std::shared_ptr< GatheringLeve >; + using GatheringLeveRoutePtr = std::shared_ptr< GatheringLeveRoute >; + using GatheringNotebookListPtr = std::shared_ptr< GatheringNotebookList >; + using GatheringPointPtr = std::shared_ptr< GatheringPoint >; + using GatheringPointBasePtr = std::shared_ptr< GatheringPointBase >; + using GatheringPointBonusPtr = std::shared_ptr< GatheringPointBonus >; + using GatheringPointBonusTypePtr = std::shared_ptr< GatheringPointBonusType >; + using GatheringPointNamePtr = std::shared_ptr< GatheringPointName >; + using GatheringSubCategoryPtr = std::shared_ptr< GatheringSubCategory >; + using GatheringTypePtr = std::shared_ptr< GatheringType >; + using GcArmyCaptureTacticsPtr = std::shared_ptr< GcArmyCaptureTactics >; + using GcArmyExpeditionPtr = std::shared_ptr< GcArmyExpedition >; + using GcArmyExpeditionMemberBonusPtr = std::shared_ptr< GcArmyExpeditionMemberBonus >; + using GcArmyExpeditionTypePtr = std::shared_ptr< GcArmyExpeditionType >; + using GcArmyMemberGrowPtr = std::shared_ptr< GcArmyMemberGrow >; + using GcArmyTrainingPtr = std::shared_ptr< GcArmyTraining >; + using GCRankGridaniaFemaleTextPtr = std::shared_ptr< GCRankGridaniaFemaleText >; + using GCRankGridaniaMaleTextPtr = std::shared_ptr< GCRankGridaniaMaleText >; + using GCRankLimsaFemaleTextPtr = std::shared_ptr< GCRankLimsaFemaleText >; + using GCRankLimsaMaleTextPtr = std::shared_ptr< GCRankLimsaMaleText >; + using GCRankUldahFemaleTextPtr = std::shared_ptr< GCRankUldahFemaleText >; + using GCRankUldahMaleTextPtr = std::shared_ptr< GCRankUldahMaleText >; + using GCScripShopCategoryPtr = std::shared_ptr< GCScripShopCategory >; + using GCScripShopItemPtr = std::shared_ptr< GCScripShopItem >; + using GCShopPtr = std::shared_ptr< GCShop >; + using GCShopItemCategoryPtr = std::shared_ptr< GCShopItemCategory >; + using GCSupplyDutyPtr = std::shared_ptr< GCSupplyDuty >; + using GCSupplyDutyRewardPtr = std::shared_ptr< GCSupplyDutyReward >; + using GeneralActionPtr = std::shared_ptr< GeneralAction >; + using GFATEPtr = std::shared_ptr< GFATE >; + using GFateClimbing2Ptr = std::shared_ptr< GFateClimbing2 >; + using GFateClimbing2ContentPtr = std::shared_ptr< GFateClimbing2Content >; + using GFateClimbing2TotemTypePtr = std::shared_ptr< GFateClimbing2TotemType >; + using GilShopPtr = std::shared_ptr< GilShop >; + using GilShopItemPtr = std::shared_ptr< GilShopItem >; + using GoldSaucerArcadeMachinePtr = std::shared_ptr< GoldSaucerArcadeMachine >; + using GoldSaucerTextDataPtr = std::shared_ptr< GoldSaucerTextData >; + using GrandCompanyPtr = std::shared_ptr< GrandCompany >; + using GrandCompanyRankPtr = std::shared_ptr< GrandCompanyRank >; + using GuardianDeityPtr = std::shared_ptr< GuardianDeity >; + using GuildleveAssignmentPtr = std::shared_ptr< GuildleveAssignment >; + using GuildleveAssignmentCategoryPtr = std::shared_ptr< GuildleveAssignmentCategory >; + using GuildOrderGuidePtr = std::shared_ptr< GuildOrderGuide >; + using GuildOrderOfficerPtr = std::shared_ptr< GuildOrderOfficer >; + using HairMakeTypePtr = std::shared_ptr< HairMakeType >; + using HouseRetainerPosePtr = std::shared_ptr< HouseRetainerPose >; + using HousingAethernetPtr = std::shared_ptr< HousingAethernet >; + using HousingAppealPtr = std::shared_ptr< HousingAppeal >; + using HousingEmploymentNpcListPtr = std::shared_ptr< HousingEmploymentNpcList >; + using HousingEmploymentNpcRacePtr = std::shared_ptr< HousingEmploymentNpcRace >; + using HousingExteriorPtr = std::shared_ptr< HousingExterior >; + using HousingFurniturePtr = std::shared_ptr< HousingFurniture >; + using HousingMapMarkerInfoPtr = std::shared_ptr< HousingMapMarkerInfo >; + using HousingMerchantPosePtr = std::shared_ptr< HousingMerchantPose >; + using HousingLandSetPtr = std::shared_ptr< HousingLandSet >; + using HousingPlacementPtr = std::shared_ptr< HousingPlacement >; + using HousingPresetPtr = std::shared_ptr< HousingPreset >; + using HousingUnitedExteriorPtr = std::shared_ptr< HousingUnitedExterior >; + using HousingYardObjectPtr = std::shared_ptr< HousingYardObject >; + using HowToPtr = std::shared_ptr< HowTo >; + using HowToCategoryPtr = std::shared_ptr< HowToCategory >; + using HowToPagePtr = std::shared_ptr< HowToPage >; + using InstanceContentPtr = std::shared_ptr< InstanceContent >; + using InstanceContentBuffPtr = std::shared_ptr< InstanceContentBuff >; + using InstanceContentTextDataPtr = std::shared_ptr< InstanceContentTextData >; + using ItemPtr = std::shared_ptr< Item >; + using ItemActionPtr = std::shared_ptr< ItemAction >; + using ItemFoodPtr = std::shared_ptr< ItemFood >; + using ItemLevelPtr = std::shared_ptr< ItemLevel >; + using ItemSearchCategoryPtr = std::shared_ptr< ItemSearchCategory >; + using ItemSeriesPtr = std::shared_ptr< ItemSeries >; + using ItemSpecialBonusPtr = std::shared_ptr< ItemSpecialBonus >; + using ItemUICategoryPtr = std::shared_ptr< ItemUICategory >; + using JournalCategoryPtr = std::shared_ptr< JournalCategory >; + using JournalGenrePtr = std::shared_ptr< JournalGenre >; + using JournalSectionPtr = std::shared_ptr< JournalSection >; + using LevePtr = std::shared_ptr< Leve >; + using LeveAssignmentTypePtr = std::shared_ptr< LeveAssignmentType >; + using LeveClientPtr = std::shared_ptr< LeveClient >; + using LevelPtr = std::shared_ptr< Level >; + using LeveRewardItemPtr = std::shared_ptr< LeveRewardItem >; + using LeveRewardItemGroupPtr = std::shared_ptr< LeveRewardItemGroup >; + using LeveVfxPtr = std::shared_ptr< LeveVfx >; + using LogFilterPtr = std::shared_ptr< LogFilter >; + using LogKindPtr = std::shared_ptr< LogKind >; + using LogKindCategoryTextPtr = std::shared_ptr< LogKindCategoryText >; + using LogMessagePtr = std::shared_ptr< LogMessage >; + using LotteryExchangeShopPtr = std::shared_ptr< LotteryExchangeShop >; + using MacroIconPtr = std::shared_ptr< MacroIcon >; + using MacroIconRedirectOldPtr = std::shared_ptr< MacroIconRedirectOld >; + using MainCommandPtr = std::shared_ptr< MainCommand >; + using MainCommandCategoryPtr = std::shared_ptr< MainCommandCategory >; + using ManeuversArmorPtr = std::shared_ptr< ManeuversArmor >; + using MapPtr = std::shared_ptr< Map >; + using MapMarkerPtr = std::shared_ptr< MapMarker >; + using MapMarkerRegionPtr = std::shared_ptr< MapMarkerRegion >; + using MapSymbolPtr = std::shared_ptr< MapSymbol >; + using MarkerPtr = std::shared_ptr< Marker >; + using MasterpieceSupplyDutyPtr = std::shared_ptr< MasterpieceSupplyDuty >; + using MasterpieceSupplyMultiplierPtr = std::shared_ptr< MasterpieceSupplyMultiplier >; + using MateriaPtr = std::shared_ptr< Materia >; + using MiniGameRAPtr = std::shared_ptr< MiniGameRA >; + using MinionRacePtr = std::shared_ptr< MinionRace >; + using MinionRulesPtr = std::shared_ptr< MinionRules >; + using MinionSkillTypePtr = std::shared_ptr< MinionSkillType >; + using MobHuntOrderTypePtr = std::shared_ptr< MobHuntOrderType >; + using MobHuntTargetPtr = std::shared_ptr< MobHuntTarget >; + using ModelCharaPtr = std::shared_ptr< ModelChara >; + using ModelStatePtr = std::shared_ptr< ModelState >; + using MonsterNotePtr = std::shared_ptr< MonsterNote >; + using MonsterNoteTargetPtr = std::shared_ptr< MonsterNoteTarget >; + using MountPtr = std::shared_ptr< Mount >; + using MountActionPtr = std::shared_ptr< MountAction >; + using MountCustomizePtr = std::shared_ptr< MountCustomize >; + using MountFlyingConditionPtr = std::shared_ptr< MountFlyingCondition >; + using MountSpeedPtr = std::shared_ptr< MountSpeed >; + using MountTransientPtr = std::shared_ptr< MountTransient >; + using MoveTimelinePtr = std::shared_ptr< MoveTimeline >; + using MoveVfxPtr = std::shared_ptr< MoveVfx >; + using NpcEquipPtr = std::shared_ptr< NpcEquip >; + using NpcYellPtr = std::shared_ptr< NpcYell >; + using OmenPtr = std::shared_ptr< Omen >; + using OnlineStatusPtr = std::shared_ptr< OnlineStatus >; + using OpeningPtr = std::shared_ptr< Opening >; + using OrchestrionPtr = std::shared_ptr< Orchestrion >; + using OrchestrionCategoryPtr = std::shared_ptr< OrchestrionCategory >; + using OrchestrionPathPtr = std::shared_ptr< OrchestrionPath >; + using OrchestrionUiparamPtr = std::shared_ptr< OrchestrionUiparam >; + using ParamGrowPtr = std::shared_ptr< ParamGrow >; + using PartyContentPtr = std::shared_ptr< PartyContent >; + using PartyContentCutscenePtr = std::shared_ptr< PartyContentCutscene >; + using PartyContentTextDataPtr = std::shared_ptr< PartyContentTextData >; + using PerformPtr = std::shared_ptr< Perform >; + using PerformTransientPtr = std::shared_ptr< PerformTransient >; + using PetPtr = std::shared_ptr< Pet >; + using PetActionPtr = std::shared_ptr< PetAction >; + using PicturePtr = std::shared_ptr< Picture >; + using PlaceNamePtr = std::shared_ptr< PlaceName >; + using PlantPotFlowerSeedPtr = std::shared_ptr< PlantPotFlowerSeed >; + using PreHandlerPtr = std::shared_ptr< PreHandler >; + using PublicContentPtr = std::shared_ptr< PublicContent >; + using PublicContentCutscenePtr = std::shared_ptr< PublicContentCutscene >; + using PublicContentTextDataPtr = std::shared_ptr< PublicContentTextData >; + using PvPActionPtr = std::shared_ptr< PvPAction >; + using PvPActionSortPtr = std::shared_ptr< PvPActionSort >; + using PvPRankPtr = std::shared_ptr< PvPRank >; + using PvPSelectTraitPtr = std::shared_ptr< PvPSelectTrait >; + using PvPTraitPtr = std::shared_ptr< PvPTrait >; + using QuestPtr = std::shared_ptr< Quest >; + using QuestClassJobRewardPtr = std::shared_ptr< QuestClassJobReward >; + using QuestClassJobSupplyPtr = std::shared_ptr< QuestClassJobSupply >; + using QuestRepeatFlagPtr = std::shared_ptr< QuestRepeatFlag >; + using QuestRewardOtherPtr = std::shared_ptr< QuestRewardOther >; + using QuickChatPtr = std::shared_ptr< QuickChat >; + using QuickChatTransientPtr = std::shared_ptr< QuickChatTransient >; + using RacePtr = std::shared_ptr< Race >; + using RacingChocoboItemPtr = std::shared_ptr< RacingChocoboItem >; + using RacingChocoboNamePtr = std::shared_ptr< RacingChocoboName >; + using RacingChocoboNameCategoryPtr = std::shared_ptr< RacingChocoboNameCategory >; + using RacingChocoboNameInfoPtr = std::shared_ptr< RacingChocoboNameInfo >; + using RacingChocoboParamPtr = std::shared_ptr< RacingChocoboParam >; + using RecipePtr = std::shared_ptr< Recipe >; + using RecipeElementPtr = std::shared_ptr< RecipeElement >; + using RecipeLevelTablePtr = std::shared_ptr< RecipeLevelTable >; + using RecipeNotebookListPtr = std::shared_ptr< RecipeNotebookList >; + using RecommendContentsPtr = std::shared_ptr< RecommendContents >; + using RelicPtr = std::shared_ptr< Relic >; + using Relic3Ptr = std::shared_ptr< Relic3 >; + using RelicItemPtr = std::shared_ptr< RelicItem >; + using RelicNotePtr = std::shared_ptr< RelicNote >; + using RelicNoteCategoryPtr = std::shared_ptr< RelicNoteCategory >; + using ResidentPtr = std::shared_ptr< Resident >; + using RetainerTaskPtr = std::shared_ptr< RetainerTask >; + using RetainerTaskLvRangePtr = std::shared_ptr< RetainerTaskLvRange >; + using RetainerTaskNormalPtr = std::shared_ptr< RetainerTaskNormal >; + using RetainerTaskParameterPtr = std::shared_ptr< RetainerTaskParameter >; + using RetainerTaskRandomPtr = std::shared_ptr< RetainerTaskRandom >; + using RPParameterPtr = std::shared_ptr< RPParameter >; + using SalvagePtr = std::shared_ptr< Salvage >; + using SatisfactionNpcPtr = std::shared_ptr< SatisfactionNpc >; + using SatisfactionSupplyPtr = std::shared_ptr< SatisfactionSupply >; + using SatisfactionSupplyRewardPtr = std::shared_ptr< SatisfactionSupplyReward >; + using ScenarioTreePtr = std::shared_ptr< ScenarioTree >; + using ScenarioTreeTipsPtr = std::shared_ptr< ScenarioTreeTips >; + using ScenarioTreeTipsClassQuestPtr = std::shared_ptr< ScenarioTreeTipsClassQuest >; + using ScenarioTreeTipsQuestPtr = std::shared_ptr< ScenarioTreeTipsQuest >; + using ScenarioTypePtr = std::shared_ptr< ScenarioType >; + using ScreenImagePtr = std::shared_ptr< ScreenImage >; + using SecretRecipeBookPtr = std::shared_ptr< SecretRecipeBook >; + using SkyIsland2MissionPtr = std::shared_ptr< SkyIsland2Mission >; + using SkyIsland2MissionDetailPtr = std::shared_ptr< SkyIsland2MissionDetail >; + using SkyIsland2MissionTypePtr = std::shared_ptr< SkyIsland2MissionType >; + using SkyIsland2RangeTypePtr = std::shared_ptr< SkyIsland2RangeType >; + using SpearfishingItemPtr = std::shared_ptr< SpearfishingItem >; + using SpearfishingNotebookPtr = std::shared_ptr< SpearfishingNotebook >; + using SpearfishingRecordPagePtr = std::shared_ptr< SpearfishingRecordPage >; + using SpecialShopPtr = std::shared_ptr< SpecialShop >; + using SpecialShopItemCategoryPtr = std::shared_ptr< SpecialShopItemCategory >; + using StainPtr = std::shared_ptr< Stain >; + using StainTransientPtr = std::shared_ptr< StainTransient >; + using StatusPtr = std::shared_ptr< Status >; + using StatusHitEffectPtr = std::shared_ptr< StatusHitEffect >; + using StatusLoopVFXPtr = std::shared_ptr< StatusLoopVFX >; + using StoryPtr = std::shared_ptr< Story >; + using SubmarineExplorationPtr = std::shared_ptr< SubmarineExploration >; + using SubmarinePartPtr = std::shared_ptr< SubmarinePart >; + using SubmarineRankPtr = std::shared_ptr< SubmarineRank >; + using SwitchTalkPtr = std::shared_ptr< SwitchTalk >; + using TerritoryTypePtr = std::shared_ptr< TerritoryType >; + using TextCommandPtr = std::shared_ptr< TextCommand >; + using TitlePtr = std::shared_ptr< Title >; + using TomestonesPtr = std::shared_ptr< Tomestones >; + using TomestonesItemPtr = std::shared_ptr< TomestonesItem >; + using TopicSelectPtr = std::shared_ptr< TopicSelect >; + using TownPtr = std::shared_ptr< Town >; + using TraitPtr = std::shared_ptr< Trait >; + using TraitRecastPtr = std::shared_ptr< TraitRecast >; + using TraitTransientPtr = std::shared_ptr< TraitTransient >; + using TransformationPtr = std::shared_ptr< Transformation >; + using TreasurePtr = std::shared_ptr< Treasure >; + using TreasureHuntRankPtr = std::shared_ptr< TreasureHuntRank >; + using TribePtr = std::shared_ptr< Tribe >; + using TripleTriadPtr = std::shared_ptr< TripleTriad >; + using TripleTriadCardPtr = std::shared_ptr< TripleTriadCard >; + using TripleTriadCardRarityPtr = std::shared_ptr< TripleTriadCardRarity >; + using TripleTriadCardResidentPtr = std::shared_ptr< TripleTriadCardResident >; + using TripleTriadCardTypePtr = std::shared_ptr< TripleTriadCardType >; + using TripleTriadCompetitionPtr = std::shared_ptr< TripleTriadCompetition >; + using TripleTriadRulePtr = std::shared_ptr< TripleTriadRule >; + using TutorialPtr = std::shared_ptr< Tutorial >; + using TutorialDPSPtr = std::shared_ptr< TutorialDPS >; + using TutorialHealerPtr = std::shared_ptr< TutorialHealer >; + using TutorialTankPtr = std::shared_ptr< TutorialTank >; + using UIColorPtr = std::shared_ptr< UIColor >; + using VaseFlowerPtr = std::shared_ptr< VaseFlower >; + using VFXPtr = std::shared_ptr< VFX >; + using WarpPtr = std::shared_ptr< Warp >; + using WarpConditionPtr = std::shared_ptr< WarpCondition >; + using WarpLogicPtr = std::shared_ptr< WarpLogic >; + using WeatherPtr = std::shared_ptr< Weather >; + using WeatherGroupPtr = std::shared_ptr< WeatherGroup >; + using WeatherRatePtr = std::shared_ptr< WeatherRate >; + using WeddingBGMPtr = std::shared_ptr< WeddingBGM >; + using WeeklyBingoOrderDataPtr = std::shared_ptr< WeeklyBingoOrderData >; + using WeeklyBingoRewardDataPtr = std::shared_ptr< WeeklyBingoRewardData >; + using WeeklyBingoTextPtr = std::shared_ptr< WeeklyBingoText >; + using WeeklyLotBonusPtr = std::shared_ptr< WeeklyLotBonus >; + using WorldPtr = std::shared_ptr< World >; + using WorldDCGroupTypePtr = std::shared_ptr< WorldDCGroupType >; + using YKWPtr = std::shared_ptr< YKW >; + using ZoneSharedGroupPtr = std::shared_ptr< ZoneSharedGroup >; template< class T > std::shared_ptr< T > get( uint32_t id ) @@ -5859,8 +6274,13 @@ struct ZoneSharedGroup std::set< uint32_t > m_EObjNameIdList; std::set< uint32_t > m_EquipRaceCategoryIdList; std::set< uint32_t > m_EquipSlotCategoryIdList; + std::set< uint32_t > m_EurekaAetherItemIdList; std::set< uint32_t > m_EurekaAethernetIdList; std::set< uint32_t > m_EurekaGrowDataIdList; + std::set< uint32_t > m_EurekaLogosMixerProbabilityIdList; + std::set< uint32_t > m_EurekaMagiaActionIdList; + std::set< uint32_t > m_EurekaMagiciteItemIdList; + std::set< uint32_t > m_EurekaMagiciteItemTypeIdList; std::set< uint32_t > m_EurekaSphereElementAdjustIdList; std::set< uint32_t > m_EventActionIdList; std::set< uint32_t > m_EventIconPriorityIdList; @@ -5882,7 +6302,9 @@ struct ZoneSharedGroup std::set< uint32_t > m_FCProfileIdList; std::set< uint32_t > m_FCReputationIdList; std::set< uint32_t > m_FCRightsIdList; + std::set< uint32_t > m_FestivalIdList; std::set< uint32_t > m_FieldMarkerIdList; + std::set< uint32_t > m_FishingRecordTypeIdList; std::set< uint32_t > m_FishingRecordTypeTransientIdList; std::set< uint32_t > m_FishingSpotIdList; std::set< uint32_t > m_FishParameterIdList; @@ -5924,6 +6346,9 @@ struct ZoneSharedGroup std::set< uint32_t > m_GCSupplyDutyRewardIdList; std::set< uint32_t > m_GeneralActionIdList; std::set< uint32_t > m_GFATEIdList; + std::set< uint32_t > m_GFateClimbing2IdList; + std::set< uint32_t > m_GFateClimbing2ContentIdList; + std::set< uint32_t > m_GFateClimbing2TotemTypeIdList; std::set< uint32_t > m_GilShopIdList; std::set< uint32_t > m_GilShopItemIdList; std::set< uint32_t > m_GoldSaucerArcadeMachineIdList; @@ -5938,12 +6363,17 @@ struct ZoneSharedGroup std::set< uint32_t > m_HairMakeTypeIdList; std::set< uint32_t > m_HouseRetainerPoseIdList; std::set< uint32_t > m_HousingAethernetIdList; + std::set< uint32_t > m_HousingAppealIdList; std::set< uint32_t > m_HousingEmploymentNpcListIdList; std::set< uint32_t > m_HousingEmploymentNpcRaceIdList; + std::set< uint32_t > m_HousingExteriorIdList; std::set< uint32_t > m_HousingFurnitureIdList; + std::set< uint32_t > m_HousingMapMarkerInfoIdList; + std::set< uint32_t > m_HousingMerchantPoseIdList; std::set< uint32_t > m_HousingLandSetIdList; std::set< uint32_t > m_HousingPlacementIdList; std::set< uint32_t > m_HousingPresetIdList; + std::set< uint32_t > m_HousingUnitedExteriorIdList; std::set< uint32_t > m_HousingYardObjectIdList; std::set< uint32_t > m_HowToIdList; std::set< uint32_t > m_HowToCategoryIdList; @@ -5954,6 +6384,7 @@ struct ZoneSharedGroup std::set< uint32_t > m_ItemIdList; std::set< uint32_t > m_ItemActionIdList; std::set< uint32_t > m_ItemFoodIdList; + std::set< uint32_t > m_ItemLevelIdList; std::set< uint32_t > m_ItemSearchCategoryIdList; std::set< uint32_t > m_ItemSeriesIdList; std::set< uint32_t > m_ItemSpecialBonusIdList; @@ -5986,6 +6417,7 @@ struct ZoneSharedGroup std::set< uint32_t > m_MasterpieceSupplyDutyIdList; std::set< uint32_t > m_MasterpieceSupplyMultiplierIdList; std::set< uint32_t > m_MateriaIdList; + std::set< uint32_t > m_MiniGameRAIdList; std::set< uint32_t > m_MinionRaceIdList; std::set< uint32_t > m_MinionRulesIdList; std::set< uint32_t > m_MinionSkillTypeIdList; @@ -6013,7 +6445,9 @@ struct ZoneSharedGroup std::set< uint32_t > m_OrchestrionPathIdList; std::set< uint32_t > m_OrchestrionUiparamIdList; std::set< uint32_t > m_ParamGrowIdList; + std::set< uint32_t > m_PartyContentIdList; std::set< uint32_t > m_PartyContentCutsceneIdList; + std::set< uint32_t > m_PartyContentTextDataIdList; std::set< uint32_t > m_PerformIdList; std::set< uint32_t > m_PerformTransientIdList; std::set< uint32_t > m_PetIdList; @@ -6115,6 +6549,7 @@ struct ZoneSharedGroup std::set< uint32_t > m_TutorialDPSIdList; std::set< uint32_t > m_TutorialHealerIdList; std::set< uint32_t > m_TutorialTankIdList; + std::set< uint32_t > m_UIColorIdList; std::set< uint32_t > m_VaseFlowerIdList; std::set< uint32_t > m_VFXIdList; std::set< uint32_t > m_WarpIdList; @@ -7070,6 +7505,12 @@ const std::set< uint32_t >& getEquipSlotCategoryIdList() loadIdList( m_EquipSlotCategoryDat, m_EquipSlotCategoryIdList ); return m_EquipSlotCategoryIdList; } +const std::set< uint32_t >& getEurekaAetherItemIdList() +{ + if( m_EurekaAetherItemIdList.size() == 0 ) + loadIdList( m_EurekaAetherItemDat, m_EurekaAetherItemIdList ); + return m_EurekaAetherItemIdList; +} const std::set< uint32_t >& getEurekaAethernetIdList() { if( m_EurekaAethernetIdList.size() == 0 ) @@ -7082,6 +7523,30 @@ const std::set< uint32_t >& getEurekaGrowDataIdList() loadIdList( m_EurekaGrowDataDat, m_EurekaGrowDataIdList ); return m_EurekaGrowDataIdList; } +const std::set< uint32_t >& getEurekaLogosMixerProbabilityIdList() +{ + if( m_EurekaLogosMixerProbabilityIdList.size() == 0 ) + loadIdList( m_EurekaLogosMixerProbabilityDat, m_EurekaLogosMixerProbabilityIdList ); + return m_EurekaLogosMixerProbabilityIdList; +} +const std::set< uint32_t >& getEurekaMagiaActionIdList() +{ + if( m_EurekaMagiaActionIdList.size() == 0 ) + loadIdList( m_EurekaMagiaActionDat, m_EurekaMagiaActionIdList ); + return m_EurekaMagiaActionIdList; +} +const std::set< uint32_t >& getEurekaMagiciteItemIdList() +{ + if( m_EurekaMagiciteItemIdList.size() == 0 ) + loadIdList( m_EurekaMagiciteItemDat, m_EurekaMagiciteItemIdList ); + return m_EurekaMagiciteItemIdList; +} +const std::set< uint32_t >& getEurekaMagiciteItemTypeIdList() +{ + if( m_EurekaMagiciteItemTypeIdList.size() == 0 ) + loadIdList( m_EurekaMagiciteItemTypeDat, m_EurekaMagiciteItemTypeIdList ); + return m_EurekaMagiciteItemTypeIdList; +} const std::set< uint32_t >& getEurekaSphereElementAdjustIdList() { if( m_EurekaSphereElementAdjustIdList.size() == 0 ) @@ -7208,12 +7673,24 @@ const std::set< uint32_t >& getFCRightsIdList() loadIdList( m_FCRightsDat, m_FCRightsIdList ); return m_FCRightsIdList; } +const std::set< uint32_t >& getFestivalIdList() +{ + if( m_FestivalIdList.size() == 0 ) + loadIdList( m_FestivalDat, m_FestivalIdList ); + return m_FestivalIdList; +} const std::set< uint32_t >& getFieldMarkerIdList() { if( m_FieldMarkerIdList.size() == 0 ) loadIdList( m_FieldMarkerDat, m_FieldMarkerIdList ); return m_FieldMarkerIdList; } +const std::set< uint32_t >& getFishingRecordTypeIdList() +{ + if( m_FishingRecordTypeIdList.size() == 0 ) + loadIdList( m_FishingRecordTypeDat, m_FishingRecordTypeIdList ); + return m_FishingRecordTypeIdList; +} const std::set< uint32_t >& getFishingRecordTypeTransientIdList() { if( m_FishingRecordTypeTransientIdList.size() == 0 ) @@ -7460,6 +7937,24 @@ const std::set< uint32_t >& getGFATEIdList() loadIdList( m_GFATEDat, m_GFATEIdList ); return m_GFATEIdList; } +const std::set< uint32_t >& getGFateClimbing2IdList() +{ + if( m_GFateClimbing2IdList.size() == 0 ) + loadIdList( m_GFateClimbing2Dat, m_GFateClimbing2IdList ); + return m_GFateClimbing2IdList; +} +const std::set< uint32_t >& getGFateClimbing2ContentIdList() +{ + if( m_GFateClimbing2ContentIdList.size() == 0 ) + loadIdList( m_GFateClimbing2ContentDat, m_GFateClimbing2ContentIdList ); + return m_GFateClimbing2ContentIdList; +} +const std::set< uint32_t >& getGFateClimbing2TotemTypeIdList() +{ + if( m_GFateClimbing2TotemTypeIdList.size() == 0 ) + loadIdList( m_GFateClimbing2TotemTypeDat, m_GFateClimbing2TotemTypeIdList ); + return m_GFateClimbing2TotemTypeIdList; +} const std::set< uint32_t >& getGilShopIdList() { if( m_GilShopIdList.size() == 0 ) @@ -7544,6 +8039,12 @@ const std::set< uint32_t >& getHousingAethernetIdList() loadIdList( m_HousingAethernetDat, m_HousingAethernetIdList ); return m_HousingAethernetIdList; } +const std::set< uint32_t >& getHousingAppealIdList() +{ + if( m_HousingAppealIdList.size() == 0 ) + loadIdList( m_HousingAppealDat, m_HousingAppealIdList ); + return m_HousingAppealIdList; +} const std::set< uint32_t >& getHousingEmploymentNpcListIdList() { if( m_HousingEmploymentNpcListIdList.size() == 0 ) @@ -7556,17 +8057,35 @@ const std::set< uint32_t >& getHousingEmploymentNpcRaceIdList() loadIdList( m_HousingEmploymentNpcRaceDat, m_HousingEmploymentNpcRaceIdList ); return m_HousingEmploymentNpcRaceIdList; } +const std::set< uint32_t >& getHousingExteriorIdList() +{ + if( m_HousingExteriorIdList.size() == 0 ) + loadIdList( m_HousingExteriorDat, m_HousingExteriorIdList ); + return m_HousingExteriorIdList; +} const std::set< uint32_t >& getHousingFurnitureIdList() { if( m_HousingFurnitureIdList.size() == 0 ) loadIdList( m_HousingFurnitureDat, m_HousingFurnitureIdList ); return m_HousingFurnitureIdList; } +const std::set< uint32_t >& getHousingMapMarkerInfoIdList() +{ + if( m_HousingMapMarkerInfoIdList.size() == 0 ) + loadIdList( m_HousingMapMarkerInfoDat, m_HousingMapMarkerInfoIdList ); + return m_HousingMapMarkerInfoIdList; +} +const std::set< uint32_t >& getHousingMerchantPoseIdList() +{ + if( m_HousingMerchantPoseIdList.size() == 0 ) + loadIdList( m_HousingMerchantPoseDat, m_HousingMerchantPoseIdList ); + return m_HousingMerchantPoseIdList; +} const std::set< uint32_t >& getHousingLandSetIdList() { - if( m_HousingLandSetIdList.size() == 0 ) - loadIdList( m_HousingLandSetDat, m_HousingLandSetIdList ); - return m_HousingLandSetIdList; + if( m_HousingLandSetIdList.size() == 0 ) + loadIdList( m_HousingLandSetDat, m_HousingLandSetIdList ); + return m_HousingLandSetIdList; } const std::set< uint32_t >& getHousingPlacementIdList() { @@ -7580,6 +8099,12 @@ const std::set< uint32_t >& getHousingPresetIdList() loadIdList( m_HousingPresetDat, m_HousingPresetIdList ); return m_HousingPresetIdList; } +const std::set< uint32_t >& getHousingUnitedExteriorIdList() +{ + if( m_HousingUnitedExteriorIdList.size() == 0 ) + loadIdList( m_HousingUnitedExteriorDat, m_HousingUnitedExteriorIdList ); + return m_HousingUnitedExteriorIdList; +} const std::set< uint32_t >& getHousingYardObjectIdList() { if( m_HousingYardObjectIdList.size() == 0 ) @@ -7640,6 +8165,12 @@ const std::set< uint32_t >& getItemFoodIdList() loadIdList( m_ItemFoodDat, m_ItemFoodIdList ); return m_ItemFoodIdList; } +const std::set< uint32_t >& getItemLevelIdList() +{ + if( m_ItemLevelIdList.size() == 0 ) + loadIdList( m_ItemLevelDat, m_ItemLevelIdList ); + return m_ItemLevelIdList; +} const std::set< uint32_t >& getItemSearchCategoryIdList() { if( m_ItemSearchCategoryIdList.size() == 0 ) @@ -7832,6 +8363,12 @@ const std::set< uint32_t >& getMateriaIdList() loadIdList( m_MateriaDat, m_MateriaIdList ); return m_MateriaIdList; } +const std::set< uint32_t >& getMiniGameRAIdList() +{ + if( m_MiniGameRAIdList.size() == 0 ) + loadIdList( m_MiniGameRADat, m_MiniGameRAIdList ); + return m_MiniGameRAIdList; +} const std::set< uint32_t >& getMinionRaceIdList() { if( m_MinionRaceIdList.size() == 0 ) @@ -7994,12 +8531,24 @@ const std::set< uint32_t >& getParamGrowIdList() loadIdList( m_ParamGrowDat, m_ParamGrowIdList ); return m_ParamGrowIdList; } +const std::set< uint32_t >& getPartyContentIdList() +{ + if( m_PartyContentIdList.size() == 0 ) + loadIdList( m_PartyContentDat, m_PartyContentIdList ); + return m_PartyContentIdList; +} const std::set< uint32_t >& getPartyContentCutsceneIdList() { if( m_PartyContentCutsceneIdList.size() == 0 ) loadIdList( m_PartyContentCutsceneDat, m_PartyContentCutsceneIdList ); return m_PartyContentCutsceneIdList; } +const std::set< uint32_t >& getPartyContentTextDataIdList() +{ + if( m_PartyContentTextDataIdList.size() == 0 ) + loadIdList( m_PartyContentTextDataDat, m_PartyContentTextDataIdList ); + return m_PartyContentTextDataIdList; +} const std::set< uint32_t >& getPerformIdList() { if( m_PerformIdList.size() == 0 ) @@ -8606,6 +9155,12 @@ const std::set< uint32_t >& getTutorialTankIdList() loadIdList( m_TutorialTankDat, m_TutorialTankIdList ); return m_TutorialTankIdList; } +const std::set< uint32_t >& getUIColorIdList() +{ + if( m_UIColorIdList.size() == 0 ) + loadIdList( m_UIColorDat, m_UIColorIdList ); + return m_UIColorIdList; +} const std::set< uint32_t >& getVaseFlowerIdList() { if( m_VaseFlowerIdList.size() == 0 ) @@ -8713,6 +9268,7 @@ const std::set< uint32_t >& getZoneSharedGroupIdList() }; } +} #endif diff --git a/src/servers/Scripts/common/WarpTaxi.cpp b/src/servers/Scripts/common/WarpTaxi.cpp index 69194be2..b36763e7 100644 --- a/src/servers/Scripts/common/WarpTaxi.cpp +++ b/src/servers/Scripts/common/WarpTaxi.cpp @@ -61,7 +61,8 @@ public: if( !warp ) return; - player.eventStart( actorId, warp->defaultTalk1, Event::EventHandler::Nest, 0, 0, std::bind( &WarpTaxi::inner2, this, std::placeholders::_1, std::placeholders::_2 ) ); - player.playScene( warp->defaultTalk1, 0, HIDE_HOTBAR, 0, 0, 7, nullptr ); + player.eventStart( actorId, warp->conditionSuccessEvent, Event::EventHandler::Nest, 0, 0, + std::bind( &WarpTaxi::inner2, this, std::placeholders::_1, std::placeholders::_2 ) ); + player.playScene( warp->conditionSuccessEvent, 0, HIDE_HOTBAR, 0, 0, 7, nullptr ); } }; \ No newline at end of file diff --git a/src/servers/sapphire_zone/Network/Handlers/CFHandlers.cpp b/src/servers/sapphire_zone/Network/Handlers/CFHandlers.cpp index f1f8c2ef..df03db4f 100644 --- a/src/servers/sapphire_zone/Network/Handlers/CFHandlers.cpp +++ b/src/servers/sapphire_zone/Network/Handlers/CFHandlers.cpp @@ -77,7 +77,7 @@ void Core::Network::GameConnection::cfRegisterDuty( const Packets::FFXIVARR_PACK if( !cfCondition ) return; - auto instance = pTeriMgr->createInstanceContent( cfCondition->instanceContent ); + auto instance = pTeriMgr->createInstanceContent( cfCondition->content ); if( !instance ) return; diff --git a/src/servers/sapphire_zone/Zone/Land.cpp b/src/servers/sapphire_zone/Zone/Land.cpp index e0e4bbba..c39701af 100644 --- a/src/servers/sapphire_zone/Zone/Land.cpp +++ b/src/servers/sapphire_zone/Zone/Land.cpp @@ -58,12 +58,12 @@ void Core::Land::load() pDb->directExecute( "INSERT INTO land ( landsetid, landid, type, size, status, landprice ) " "VALUES ( " + std::to_string( m_landSetId ) + "," + std::to_string( m_landId ) + "," + std::to_string( static_cast< uint8_t >( m_type ) ) + "," - + std::to_string( m_landInfo->sizes[ m_landId ] ) + "," - + " 1, " + std::to_string( m_landInfo->prices[ m_landId ] ) + " );" ); + + std::to_string( m_landInfo->plotSize[ m_landId ] ) + "," + + " 1, " + std::to_string( m_landInfo->initialPrice[ m_landId ] ) + " );" ); - m_currentPrice = m_landInfo->prices[ m_landId ]; - m_minPrice = m_landInfo->minPrices[ m_landId ]; - m_size = m_landInfo->sizes[ m_landId ]; + m_currentPrice = m_landInfo->initialPrice[ m_landId ]; + m_minPrice = m_landInfo->minPrice[ m_landId ]; + m_size = m_landInfo->plotSize[ m_landId ]; m_state = HouseState::forSale; } else @@ -73,8 +73,8 @@ void Core::Land::load() m_state = res->getUInt( "Status" ); m_currentPrice = res->getUInt( "LandPrice" ); m_ownerPlayerId = res->getUInt( "OwnerId" ); - m_minPrice = m_landInfo->minPrices[ m_landId ]; - m_maxPrice = m_landInfo->prices[ m_landId ]; + m_minPrice = m_landInfo->minPrice[ m_landId ]; + m_maxPrice = m_landInfo->initialPrice[ m_landId ]; } init(); } diff --git a/src/servers/sapphire_zone/Zone/TerritoryMgr.cpp b/src/servers/sapphire_zone/Zone/TerritoryMgr.cpp index d8cb748e..d355bc81 100644 --- a/src/servers/sapphire_zone/Zone/TerritoryMgr.cpp +++ b/src/servers/sapphire_zone/Zone/TerritoryMgr.cpp @@ -249,7 +249,7 @@ Core::ZonePtr Core::TerritoryMgr::createInstanceContent( uint32_t contentFinderC auto pContentFinderCondition = pExdData->get< Core::Data::ContentFinderCondition >( contentFinderConditionId ); if( !pContentFinderCondition ) return nullptr; - auto instanceContentId = pContentFinderCondition->instanceContent; + auto instanceContentId = pContentFinderCondition->content; auto pInstanceContent = pExdData->get< Core::Data::InstanceContent >( instanceContentId ); if( !pInstanceContent ) diff --git a/src/tools/exd_struct_gen/ExdData.cpp.tmpl b/src/tools/exd_struct_gen/ExdData.cpp.tmpl index f63e8ce0..a4babc6d 100644 --- a/src/tools/exd_struct_gen/ExdData.cpp.tmpl +++ b/src/tools/exd_struct_gen/ExdData.cpp.tmpl @@ -36,8 +36,8 @@ bool Core::Data::ExdDataGenerated::init( const std::string& path ) { try { - m_data = boost::make_shared< xiv::dat::GameData >( path ); - m_exd_data = boost::make_shared< xiv::exd::ExdData >( *m_data ); + m_data = std::make_shared< xiv::dat::GameData >( path ); + m_exd_data = std::make_shared< xiv::exd::ExdData >( *m_data ); SETUPDATACCESS } diff --git a/src/tools/exd_struct_gen/ExdData.h.tmpl b/src/tools/exd_struct_gen/ExdData.h.tmpl index 055a9e12..58b6267c 100644 --- a/src/tools/exd_struct_gen/ExdData.h.tmpl +++ b/src/tools/exd_struct_gen/ExdData.h.tmpl @@ -11,7 +11,7 @@ #include #include #include -#include +#include namespace Core { namespace Data { @@ -35,13 +35,13 @@ STRUCTS template< class T > T getField( std::vector< xiv::exd::Field >& fields, uint32_t index ) { - return *boost::get< T >( &fields.at( index ) ); + return boost::get< T >( fields.at( index ) ); } void loadIdList( xiv::exd::Exd& data, std::set< uint32_t >& outIdList ); - boost::shared_ptr< xiv::dat::GameData > m_data; - boost::shared_ptr< xiv::exd::ExdData > m_exd_data; + std::shared_ptr< xiv::dat::GameData > m_data; + std::shared_ptr< xiv::exd::ExdData > m_exd_data; DATACCESS diff --git a/src/tools/exd_struct_gen/main.cpp b/src/tools/exd_struct_gen/main.cpp index 3cad3b5f..306e2473 100644 --- a/src/tools/exd_struct_gen/main.cpp +++ b/src/tools/exd_struct_gen/main.cpp @@ -45,8 +45,8 @@ std::vector< std::string > cppKeyWords "class" }; -std::string datLocation( "/home/mordred/sqpack" ); -//std::string datLocation( "C:\\SquareEnix\\FINAL FANTASY XIV - A Realm Reborn\\game\\sqpack" ); +//std::string datLocation( "/home/mordred/sqpack" ); +std::string datLocation( "C:\\SquareEnix\\FINAL FANTASY XIV - A Realm Reborn\\game\\sqpack" ); std::map< uint8_t, std::string > g_typeMap; From 4c573cde738ceb2bd8b1838d4b71cf0acdea3c54 Mon Sep 17 00:00:00 2001 From: Mordred Date: Fri, 23 Nov 2018 21:20:16 +0100 Subject: [PATCH 03/14] One slipped through --- src/tools/exd_struct_gen/ExdData.h.tmpl | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/tools/exd_struct_gen/ExdData.h.tmpl b/src/tools/exd_struct_gen/ExdData.h.tmpl index 58b6267c..20ac48c5 100644 --- a/src/tools/exd_struct_gen/ExdData.h.tmpl +++ b/src/tools/exd_struct_gen/ExdData.h.tmpl @@ -35,7 +35,7 @@ STRUCTS template< class T > T getField( std::vector< xiv::exd::Field >& fields, uint32_t index ) { - return boost::get< T >( fields.at( index ) ); + return std::get< T >( fields.at( index ) ); } void loadIdList( xiv::exd::Exd& data, std::set< uint32_t >& outIdList ); From 28abe4c6f94c38f7d758e057f96c0a6e3ca19990 Mon Sep 17 00:00:00 2001 From: Mordred Date: Sat, 24 Nov 2018 01:35:25 +0100 Subject: [PATCH 04/14] Variant2 exds are now readable --- deps/datReader/Exd.cpp | 33 ++++++++++++++++++++++-------- deps/datReader/Exh.h | 6 +++--- src/common/Exd/ExdDataGenerated.h | 16 +++++++++++++++ src/tools/exd_struct_test/main.cpp | 21 +++++++++++-------- 4 files changed, 56 insertions(+), 20 deletions(-) diff --git a/deps/datReader/Exd.cpp b/deps/datReader/Exd.cpp index f86ac318..e82fcc96 100644 --- a/deps/datReader/Exd.cpp +++ b/deps/datReader/Exd.cpp @@ -2,7 +2,7 @@ #include "bparse.h" #include "stream.h" - +#include #include "Exh.h" using xiv::utils::bparse::extract; @@ -58,7 +58,7 @@ namespace xiv for ( auto &file_ptr : _files ) { // Get a stream - std::vector< char > dataCpy = file_ptr->get_data_sections().front(); + std::vector< char > dataCpy = file_ptr->get_data_sections().front(); std::istringstream iss( std::string( dataCpy.begin(), dataCpy.end() ) ); // Extract the header and skip to the record indices @@ -101,12 +101,17 @@ namespace xiv iss.seekg( cacheEntryIt->second.offset + 6 ); uint8_t subRows = *reinterpret_cast< uint8_t* >( &dataCpy[ cacheEntryIt->second.offset + 5 ] ); - + + if( subRow >= subRows ) + throw std::runtime_error( "Out of bounds sub-row!" ); + + int offset = cacheEntryIt->second.offset + 6 + ( subRow * _exh->get_header().data_offset + 2 * ( subRow + 1 ) ); + for( auto& member_entry : _exh->get_exh_members() ) { - // Seek to the position of the member to extract. + // Seek to the position of the member to extract. // 6 is because we have uint32_t/uint16_t at the start of each record - iss.seekg( cacheEntryIt->second.offset + 6 + member_entry.offset ); + iss.seekg( offset + member_entry.offset ); // Switch depending on the type to extract switch( member_entry.type ) @@ -115,9 +120,10 @@ namespace xiv // Extract the offset to the actual string // Seek to it then extract the actual string { - auto string_offset = extract( iss, "string_offset", false ); - iss.seekg( cacheEntryIt->second.offset + 6 + _exh->get_header().data_offset + string_offset ); - fields.emplace_back( utils::bparse::extract_cstring( iss, "string" ) ); + throw std::runtime_error( "String not implemented for variant 2!" ); + //auto string_offset = extract( iss, "string_offset", false ); + //iss.seekg( cacheEntryIt->second.offset + 6 + _exh->get_header().data_offset + string_offset ); + //fields.emplace_back( utils::bparse::extract_cstring( iss, "string" ) ); } break; @@ -129,9 +135,18 @@ namespace xiv fields.emplace_back( extract( iss, "int8_t" ) ); break; + case DataType::uint8: + fields.emplace_back( extract( iss, "uint8_t" ) ); + break; + case DataType::int16: fields.emplace_back( extract( iss, "int16_t", false ) ); break; + + case DataType::uint16: + fields.emplace_back( extract( iss, "uint16_t", false ) ); + break; + case DataType::int32: fields.emplace_back( extract( iss, "int32_t", false ) ); break; @@ -184,7 +199,7 @@ namespace xiv fields.reserve( member_count ); iss.seekg( cacheEntryIt->second.offset + 6 ); - uint8_t subRows = *reinterpret_cast< uint8_t* >( &dataCpy[ cacheEntryIt->second.offset + 5 ] ); + uint8_t subRows = *reinterpret_cast< uint8_t* >( &dataCpy[ cacheEntryIt->second.offset + 5 ] ); for( auto& member_entry : _exh->get_exh_members() ) { diff --git a/deps/datReader/Exh.h b/deps/datReader/Exh.h index 80b11150..be273185 100644 --- a/deps/datReader/Exh.h +++ b/deps/datReader/Exh.h @@ -31,9 +31,9 @@ namespace xiv uint16_t field_count; uint16_t exd_count; uint16_t language_count; - uint16_t unknown1; - uint8_t u2; - uint8_t variant; + uint16_t unknown1; + uint8_t u2; + uint8_t variant; }; struct ExhMember diff --git a/src/common/Exd/ExdDataGenerated.h b/src/common/Exd/ExdDataGenerated.h index d4b76dc5..6eda3351 100644 --- a/src/common/Exd/ExdDataGenerated.h +++ b/src/common/Exd/ExdDataGenerated.h @@ -6117,6 +6117,22 @@ struct ZoneSharedGroup return nullptr; } + template< class T > + std::shared_ptr< T > get( uint32_t id, uint32_t slotId ) + { + try + { + auto info = std::make_shared< T >( id, slotId, this ); + return info; + } + catch( std::runtime_error error ) + { + std::cout << error.what(); + return nullptr; + } + return nullptr; + } + std::set< uint32_t > m_AchievementIdList; std::set< uint32_t > m_AchievementCategoryIdList; diff --git a/src/tools/exd_struct_test/main.cpp b/src/tools/exd_struct_test/main.cpp index a13d017b..ea4389d9 100644 --- a/src/tools/exd_struct_test/main.cpp +++ b/src/tools/exd_struct_test/main.cpp @@ -21,8 +21,8 @@ Core::Logger g_log; Core::Data::ExdDataGenerated g_exdData; -const std::string datLocation( "/opt/sapphire_3_15_0/bin/sqpack" ); -//const std::string datLocation( "C:\\SquareEnix\\FINAL FANTASY XIV - A Realm Reborn\\game\\sqpack\\ffxiv" ); +//const std::string datLocation( "/opt/sapphire_3_15_0/bin/sqpack" ); +const std::string datLocation( "C:\\SquareEnix\\FINAL FANTASY XIV - A Realm Reborn\\game\\sqpack" ); int main() @@ -38,15 +38,20 @@ int main() } - g_log.info( "getting id list " ); - auto idList = g_exdData.getTerritoryTypeIdList(); + //g_log.info( "getting id list " ); + //auto idList = g_exdData.getGilShopIdList(); - g_log.info( "getting id list done" ); - for( auto id : idList ) + //g_log.info( "getting id list done" ); + //for( auto id : idList ) { - auto teri1 = g_exdData.get< Core::Data::TerritoryType >( id ); + auto teri1 = g_exdData.get< Core::Data::GilShopItem >( 262440, 0 ); + g_log.info( "0 -> " + std::to_string( teri1->item ) ); - g_log.info( teri1->name ); + auto teri2 = g_exdData.get< Core::Data::GilShopItem >( 262440, 1 ); + g_log.info( "1 -> " + std::to_string( teri2->item ) ); + + auto teri3 = g_exdData.get< Core::Data::GilShopItem >( 262440, 2 ); + g_log.info( "2 -> " + std::to_string( teri3->item ) ); } return 0; From b739b154b9085bf3f99a11e01fed6a6df1bd630f Mon Sep 17 00:00:00 2001 From: NotAdam Date: Sat, 24 Nov 2018 15:17:18 +1100 Subject: [PATCH 05/14] buying from gilshops now works --- src/common/Common.h | 2 +- src/common/Exd/ExdDataGenerated.h | 2 +- src/common/Network/CommonActorControl.h | 1 + src/servers/Scripts/common/GilShop.cpp | 22 +++++++---- src/servers/sapphire_zone/Manager/ShopMgr.cpp | 34 +++++++++++++++++ src/servers/sapphire_zone/Manager/ShopMgr.h | 10 +++++ .../Network/Handlers/EventHandlers.cpp | 4 +- .../Network/Handlers/PacketHandlers.cpp | 38 +------------------ src/servers/sapphire_zone/Zone/HousingMgr.cpp | 27 +++++++++++++ src/servers/sapphire_zone/Zone/HousingMgr.h | 2 + src/servers/sapphire_zone/Zone/Land.cpp | 16 +++++++- src/servers/sapphire_zone/Zone/Land.h | 4 +- src/servers/sapphire_zone/mainGameServer.cpp | 3 ++ 13 files changed, 114 insertions(+), 51 deletions(-) create mode 100644 src/servers/sapphire_zone/Manager/ShopMgr.cpp create mode 100644 src/servers/sapphire_zone/Manager/ShopMgr.h diff --git a/src/common/Common.h b/src/common/Common.h index 543cf72d..fe8eb6bc 100644 --- a/src/common/Common.h +++ b/src/common/Common.h @@ -805,8 +805,8 @@ namespace Core::Common none, forSale, sold, + privateHouse, fcHouse, - privateHouse }; enum HouseIconAdd : uint8_t diff --git a/src/common/Exd/ExdDataGenerated.h b/src/common/Exd/ExdDataGenerated.h index 6eda3351..af2974ef 100644 --- a/src/common/Exd/ExdDataGenerated.h +++ b/src/common/Exd/ExdDataGenerated.h @@ -6127,7 +6127,7 @@ struct ZoneSharedGroup } catch( std::runtime_error error ) { - std::cout << error.what(); + // std::cout << error.what(); return nullptr; } return nullptr; diff --git a/src/common/Network/CommonActorControl.h b/src/common/Network/CommonActorControl.h index e028e136..72ff77f3 100644 --- a/src/common/Network/CommonActorControl.h +++ b/src/common/Network/CommonActorControl.h @@ -290,6 +290,7 @@ enum ActorControlType : uint16_t AchievementList = 0x3E9, RequestHousingBuildPreset = 0x44C, + RequestBuildPreset = 0x450, // no idea what this is, it gets sent with BuildPresetHandler and has the plot id in param1 RequestLandSignFree = 0x451, RequestLandSignOwned = 0x452, RequestWardLandInfo = 0x453, diff --git a/src/servers/Scripts/common/GilShop.cpp b/src/servers/Scripts/common/GilShop.cpp index e6c988ea..6554ca72 100644 --- a/src/servers/Scripts/common/GilShop.cpp +++ b/src/servers/Scripts/common/GilShop.cpp @@ -1,6 +1,9 @@ #include #include +#include +#include + using namespace Core; class GilShop : @@ -16,11 +19,11 @@ public: void onTalk( uint32_t eventId, Entity::Player& player, uint64_t actorId ) override { - player.playScene( eventId, 0, SCENE_FLAGS, 0, 2, shopCallback ); + player.playScene( eventId, 0, SCENE_FLAGS, 0, 2, std::bind( &GilShop::shopCallback, this, std::placeholders::_1, std::placeholders::_2 ) ); } private: - static void shopInteractionCallback( Entity::Player& player, const Event::SceneResult& result ) + void shopInteractionCallback( Entity::Player& player, const Event::SceneResult& result ) { // item purchase if( result.param1 == 768 ) @@ -28,17 +31,20 @@ private: // buy if( result.param2 == 1 ) { + auto shopMgr = getFramework()->get< Sapphire::World::Manager::ShopMgr >(); + shopMgr->purchaseGilShopItem( player, result.eventId, result.param3, result.param4 ); } - // sell + // sell else if( result.param2 == 2 ) { - + // so apparently shops will always show a sell window + // BUT won't always let you sell stuff (eg, housing permit menu) + // there doesn't seem to be anything in gilshop exd for that, so maybe it's some shitty server hack? } - player.sendDebug( "got tradeQuantity: " + std::to_string( result.param4 ) ); - player.playGilShop( result.eventId, SCENE_FLAGS, shopInteractionCallback ); + player.playGilShop( result.eventId, SCENE_FLAGS, std::bind( &GilShop::shopInteractionCallback, this, std::placeholders::_1, std::placeholders::_2 ) ); return; } @@ -46,8 +52,8 @@ private: player.playScene( result.eventId, 255, SCENE_FLAGS ); } - static void shopCallback( Entity::Player& player, const Event::SceneResult& result ) + void shopCallback( Entity::Player& player, const Event::SceneResult& result ) { - player.playGilShop( result.eventId, SCENE_FLAGS, shopInteractionCallback ); + player.playGilShop( result.eventId, SCENE_FLAGS, std::bind( &GilShop::shopInteractionCallback, this, std::placeholders::_1, std::placeholders::_2 ) ); } }; \ No newline at end of file diff --git a/src/servers/sapphire_zone/Manager/ShopMgr.cpp b/src/servers/sapphire_zone/Manager/ShopMgr.cpp new file mode 100644 index 00000000..78173a1f --- /dev/null +++ b/src/servers/sapphire_zone/Manager/ShopMgr.cpp @@ -0,0 +1,34 @@ +#include "ShopMgr.h" + +#include +#include +#include +#include + +extern Core::Framework g_fw; +using namespace Core; + +bool Sapphire::World::Manager::ShopMgr::purchaseGilShopItem( Entity::Player& player, uint32_t shopId, uint16_t itemId, uint32_t quantity ) +{ + auto exdData = g_fw.get< Data::ExdDataGenerated >(); + if( !exdData ) + return false; + + auto gilShopItem = exdData->get< Data::GilShopItem >( shopId, itemId ); + if( !gilShopItem ) + return false; + + auto item = exdData->get< Data::Item >( gilShopItem->item ); + if( !item ) + return false; + + if( player.getCurrency( Common::CurrencyType::Gil ) < item->priceMid ) + return false; + + if( !player.addItem( gilShopItem->item, quantity ) ) + return false; + + player.removeCurrency( Common::CurrencyType::Gil, item->priceMid ); + + return true; +} \ No newline at end of file diff --git a/src/servers/sapphire_zone/Manager/ShopMgr.h b/src/servers/sapphire_zone/Manager/ShopMgr.h new file mode 100644 index 00000000..8ec5de4d --- /dev/null +++ b/src/servers/sapphire_zone/Manager/ShopMgr.h @@ -0,0 +1,10 @@ +#include "ForwardsZone.h" + +namespace Sapphire::World::Manager +{ + class ShopMgr + { + public: + bool purchaseGilShopItem( Core::Entity::Player& player, uint32_t shopId, uint16_t itemId, uint32_t quantity ); + }; +} \ No newline at end of file diff --git a/src/servers/sapphire_zone/Network/Handlers/EventHandlers.cpp b/src/servers/sapphire_zone/Network/Handlers/EventHandlers.cpp index d6d77bb2..becbcdc5 100644 --- a/src/servers/sapphire_zone/Network/Handlers/EventHandlers.cpp +++ b/src/servers/sapphire_zone/Network/Handlers/EventHandlers.cpp @@ -273,7 +273,9 @@ void Core::Network::GameConnection::eventHandlerShop( const Packets::FFXIVARR_PA " (0x" + Util::intToHexString( static_cast< uint64_t >( eventId & 0xFFFFFFF ), 8 ) + ")" ); player.sendDebug( "Calling: " + objName + "." + eventName ); - player.eventStart( 0, eventId, Event::EventHandler::UI, 0, packet.data().param ); + player.eventStart( player.getId(), eventId, Event::EventHandler::UI, 0, packet.data().param ); + + pScriptMgr->onTalk( player, player.getId(), eventId ); } diff --git a/src/servers/sapphire_zone/Network/Handlers/PacketHandlers.cpp b/src/servers/sapphire_zone/Network/Handlers/PacketHandlers.cpp index c7604ba8..821b9b3d 100644 --- a/src/servers/sapphire_zone/Network/Handlers/PacketHandlers.cpp +++ b/src/servers/sapphire_zone/Network/Handlers/PacketHandlers.cpp @@ -673,40 +673,6 @@ void Core::Network::GameConnection::buildPresetHandler( const Core::Network::Pac { const auto packet = ZoneChannelPacket< Client::FFXIVIpcBuildPresetHandler >( inPacket ); - auto zone = player.getCurrentZone(); - auto plotNum = packet.data().plotNum; - auto preset = packet.data().itemId; - std::string landString = std::string( packet.data().stateString ); - auto hZone = std::dynamic_pointer_cast< HousingZone >( zone ); - - if( !hZone ) - return; - - auto pLand = hZone->getLand( plotNum ); - /* - if (!pLand) - player.sendDebug( "Something went wrong..." ); - - if( stateString.find( "Private" ) ) - { - pLand->setPreset( preset ); - pLand->setState( HouseState::privateHouse ); - pLand->UpdateLandDb(); - hZone->sendLandUpdate( plotNum ); - } - else if( stateString.find("Free") ) - { - pLand->setPreset( preset ); - pLand->setState( HouseState::fcHouse ); - pLand->UpdateLandDb(); - hZone->sendLandUpdate( plotNum ); - } - else - { - player.sendDebug( "You tried to build a preset on not supported land." ); - } - - auto pSuccessBuildingPacket = makeActorControl142( player.getId(), BuildPresetResponse, plotNum ); - - player.queuePacket( pSuccessBuildingPacket );*/ + auto pHousingMgr = g_fw.get< HousingMgr >(); + pHousingMgr->buildPresetEstate( player, packet.data().plotNum, packet.data().itemId ); } diff --git a/src/servers/sapphire_zone/Zone/HousingMgr.cpp b/src/servers/sapphire_zone/Zone/HousingMgr.cpp index c9d50ca0..8b52c753 100644 --- a/src/servers/sapphire_zone/Zone/HousingMgr.cpp +++ b/src/servers/sapphire_zone/Zone/HousingMgr.cpp @@ -273,3 +273,30 @@ void Core::HousingMgr::sendWardLandInfo( Entity::Player& player, uint8_t wardId, player.queuePacket( wardInfoPacket ); } +void Core::HousingMgr::buildPresetEstate( Entity::Player& player, uint8_t plotNum, uint32_t presetItem ) +{ + auto hZone = std::dynamic_pointer_cast< HousingZone >( player.getCurrentZone() ); + + if( !hZone ) + return; + + auto pLand = hZone->getLand( plotNum ); + if( !pLand ) + return; + + // todo: when doing FC houses, look up the type from the original purchase and check perms from FC and set state accordingly + if( pLand->getPlayerOwner() != player.getId() ) + return; + + // todo: check if permit is in inventory and remove one + + pLand->setPreset( presetItem ); + pLand->setState( HouseState::privateHouse ); + pLand->setLandType( LandType::Private ); + pLand->updateLandDb(); + hZone->sendLandUpdate( plotNum ); + + auto pSuccessBuildingPacket = makeActorControl142( player.getId(), ActorControl::BuildPresetResponse, plotNum ); + + player.queuePacket( pSuccessBuildingPacket ); +} diff --git a/src/servers/sapphire_zone/Zone/HousingMgr.h b/src/servers/sapphire_zone/Zone/HousingMgr.h index bc5d94d8..cacaa9c1 100644 --- a/src/servers/sapphire_zone/Zone/HousingMgr.h +++ b/src/servers/sapphire_zone/Zone/HousingMgr.h @@ -34,6 +34,8 @@ namespace Core bool relinquishLand( Entity::Player& player, uint8_t plot ); + void buildPresetEstate( Entity::Player& player, uint8_t plotNum, uint32_t presetItem ); + private: }; diff --git a/src/servers/sapphire_zone/Zone/Land.cpp b/src/servers/sapphire_zone/Zone/Land.cpp index c39701af..8488c139 100644 --- a/src/servers/sapphire_zone/Zone/Land.cpp +++ b/src/servers/sapphire_zone/Zone/Land.cpp @@ -79,7 +79,7 @@ void Core::Land::load() init(); } -uint16_t Core::Land::convertItemIdToHousingItemId( uint16_t itemId ) +uint32_t Core::Land::convertItemIdToHousingItemId( uint32_t itemId ) { auto pExdData = g_fw.get< Data::ExdDataGenerated >(); auto info = pExdData->get< Core::Data::Item >( itemId ); @@ -246,7 +246,7 @@ void Core::Land::updateLandDb() pDb->directExecute( "UPDATE land SET status = " + std::to_string( m_state ) + ", LandPrice = " + std::to_string( getCurrentPrice() ) + ", UpdateTime = " + std::to_string( getDevaluationTime() ) - + ", OwnerId = " + std::to_string( getPlayerOwner() ) + + ", OwnerId = " + std::to_string( getPlayerOwner() ) + ", HouseId = " + std::to_string( 0 ) //TODO: add house id + ", Type = " + std::to_string( static_cast< uint32_t >( m_type ) ) //TODO: add house id + " WHERE LandSetId = " + std::to_string( m_landSetId ) @@ -265,3 +265,15 @@ void Core::Land::update( uint32_t currTime ) } } } + +bool Core::Land::setPreset( uint32_t itemId ) +{ + auto housingItemId = convertItemIdToHousingItemId( itemId ); + + auto exdData = g_fw.get< Core::Data::ExdDataGenerated >(); + if( !exdData ) + return false; + + auto housingPreset = exdData->get< Core::Data::HousingPreset >( housingItemId ); + +} diff --git a/src/servers/sapphire_zone/Zone/Land.h b/src/servers/sapphire_zone/Zone/Land.h index 173a00a7..243ca62c 100644 --- a/src/servers/sapphire_zone/Zone/Land.h +++ b/src/servers/sapphire_zone/Zone/Land.h @@ -48,7 +48,7 @@ namespace Core uint32_t getPlayerOwner(); //Housing Functions void setCurrentPrice( uint32_t currentPrice ); - void setPreset( uint32_t itemId ); + bool setPreset( uint32_t itemId ); void updateLandDb(); void update( uint32_t currTime ); @@ -62,7 +62,7 @@ namespace Core uint8_t getLandTag( uint8_t slot ); private: - uint16_t convertItemIdToHousingItemId( uint16_t itemId ); + uint32_t convertItemIdToHousingItemId( uint32_t itemId ); void init(); uint8_t m_wardNum; diff --git a/src/servers/sapphire_zone/mainGameServer.cpp b/src/servers/sapphire_zone/mainGameServer.cpp index 489857b0..e6acc87d 100644 --- a/src/servers/sapphire_zone/mainGameServer.cpp +++ b/src/servers/sapphire_zone/mainGameServer.cpp @@ -12,6 +12,7 @@ #include "Zone/HousingMgr.h" #include "DebugCommand/DebugCommandHandler.h" #include "Manager/PlayerMgr.h" +#include "Manager/ShopMgr.h" #include @@ -32,6 +33,7 @@ bool setupFramework() auto pDebugCom = std::make_shared< DebugCommandHandler >(); auto pConfig = std::make_shared< ConfigMgr >(); auto pPlayerMgr = std::make_shared< Sapphire::World::Manager::PlayerMgr >(); + auto pShopMgr = std::make_shared< Sapphire::World::Manager::ShopMgr >(); pLogger->setLogPath( "log/SapphireZone" ); pLogger->init(); @@ -47,6 +49,7 @@ bool setupFramework() g_fw.set< DebugCommandHandler >( pDebugCom ); g_fw.set< ConfigMgr >( pConfig ); g_fw.set< Sapphire::World::Manager::PlayerMgr >( pPlayerMgr ); + g_fw.set< Sapphire::World::Manager::ShopMgr >( pShopMgr ); // actuall catch errors here... return true; From 12eadd02e93a6b8223257a7e903561af72961619 Mon Sep 17 00:00:00 2001 From: NotAdam Date: Sun, 25 Nov 2018 01:55:53 +1100 Subject: [PATCH 06/14] broken housing --- src/common/Network/CommonActorControl.h | 1 + src/servers/sapphire_zone/Actor/Player.cpp | 2 +- src/servers/sapphire_zone/Zone/House.cpp | 15 +++++- src/servers/sapphire_zone/Zone/HousingMgr.cpp | 6 ++- .../sapphire_zone/Zone/HousingZone.cpp | 15 +++++- src/servers/sapphire_zone/Zone/Land.cpp | 48 ++++++++++++++++--- src/servers/sapphire_zone/Zone/Land.h | 5 +- 7 files changed, 79 insertions(+), 13 deletions(-) diff --git a/src/common/Network/CommonActorControl.h b/src/common/Network/CommonActorControl.h index 72ff77f3..5d126c49 100644 --- a/src/common/Network/CommonActorControl.h +++ b/src/common/Network/CommonActorControl.h @@ -290,6 +290,7 @@ enum ActorControlType : uint16_t AchievementList = 0x3E9, RequestHousingBuildPreset = 0x44C, + RequestEstateHallRemoval = 0x44F, RequestBuildPreset = 0x450, // no idea what this is, it gets sent with BuildPresetHandler and has the plot id in param1 RequestLandSignFree = 0x451, RequestLandSignOwned = 0x452, diff --git a/src/servers/sapphire_zone/Actor/Player.cpp b/src/servers/sapphire_zone/Actor/Player.cpp index 7aba3e56..62e6143a 100644 --- a/src/servers/sapphire_zone/Actor/Player.cpp +++ b/src/servers/sapphire_zone/Actor/Player.cpp @@ -1580,7 +1580,7 @@ void Core::Entity::Player::sendZonePackets() auto pHousingMgr = g_fw.get< HousingMgr >(); if( Core::LandPtr pLand = pHousingMgr->getLandByOwnerId( getId() ) ) { - setLandPermissions( LandPermissionSlot::Private, 0x00, pLand->getLandId(), pLand->getWardNum(), pLand->getZoneId() ); + setLandPermissions( LandPermissionSlot::Private, 0x00, pLand->getLandId(), pLand->getWardNum(), pLand->getTerritoryTypeId() ); } sendLandPermissions(); diff --git a/src/servers/sapphire_zone/Zone/House.cpp b/src/servers/sapphire_zone/Zone/House.cpp index 7b9a74b3..55ca5b1d 100644 --- a/src/servers/sapphire_zone/Zone/House.cpp +++ b/src/servers/sapphire_zone/Zone/House.cpp @@ -3,6 +3,7 @@ #include #include +#include #include "House.h" @@ -20,6 +21,18 @@ Core::House::House( uint32_t houseId, uint32_t landSetId, uint8_t landId, uint8_ { memset( &m_houseParts, 0x00, sizeof( m_houseParts ) ); memset( &m_commentMsg, 0x00, sizeof( m_commentMsg ) ); + + auto pDB = g_fw.get< Db::DbWorkerPool< Db::ZoneDbConnection > >(); + auto res = pDB->query("SELECT * FROM house WHERE HouseId = " + std::to_string( houseId ) ); + + if( !res->next() ) + { + pDB->directExecute("INSERT INTO house ( LandSetId, HouseId ) VALUES ( " + std::to_string( m_landSetId ) + ", " + std::to_string( m_houseId ) + " )" ); + } + else + { + // todo + } } Core::House::~House() @@ -70,4 +83,4 @@ void Core::House::setHousePartColor( Common::HousePartSlot slot, uint32_t id ) uint32_t Core::House::getHousePart( Common::HousePartSlot slot ) const { return m_houseParts[ slot ]; -} +} \ No newline at end of file diff --git a/src/servers/sapphire_zone/Zone/HousingMgr.cpp b/src/servers/sapphire_zone/Zone/HousingMgr.cpp index 8b52c753..28c18adf 100644 --- a/src/servers/sapphire_zone/Zone/HousingMgr.cpp +++ b/src/servers/sapphire_zone/Zone/HousingMgr.cpp @@ -98,7 +98,7 @@ void Core::HousingMgr::sendLandSignOwned( Entity::Player& player, uint8_t wardId memcpy( &landInfoSignPacket->data().ownerName, playerName.c_str(), playerName.size() ); landInfoSignPacket->data().wardNum = land->getWardNum(); landInfoSignPacket->data().worldId = 67; - landInfoSignPacket->data().zoneId = land->getZoneId(); + landInfoSignPacket->data().zoneId = land->getTerritoryTypeId(); player.queuePacket( landInfoSignPacket ); } @@ -290,7 +290,9 @@ void Core::HousingMgr::buildPresetEstate( Entity::Player& player, uint8_t plotNu // todo: check if permit is in inventory and remove one - pLand->setPreset( presetItem ); + if( !pLand->setPreset( presetItem ) ) + return; + pLand->setState( HouseState::privateHouse ); pLand->setLandType( LandType::Private ); pLand->updateLandDb(); diff --git a/src/servers/sapphire_zone/Zone/HousingZone.cpp b/src/servers/sapphire_zone/Zone/HousingZone.cpp index 9d52a1f4..8ca52012 100644 --- a/src/servers/sapphire_zone/Zone/HousingZone.cpp +++ b/src/servers/sapphire_zone/Zone/HousingZone.cpp @@ -10,6 +10,7 @@ #include "Actor/Player.h" #include "Actor/Actor.h" #include "Land.h" +#include "House.h" #include "Forwards.h" #include "HousingZone.h" @@ -149,12 +150,24 @@ void Core::HousingZone::sendLandUpdate( uint8_t landId ) landUpdatePacket->data().landId = landId; landUpdatePacket->data().land.plotSize = pLand->getSize(); landUpdatePacket->data().land.houseState = pLand->getState(); - landUpdatePacket->data().land.type = static_cast< uint8_t >( pLand->getLandType() ); + landUpdatePacket->data().land.type = 0; landUpdatePacket->data().land.iconAddIcon = pLand->getSharing(); landUpdatePacket->data().land.fcId = pLand->getFcId(); landUpdatePacket->data().land.fcIcon = pLand->getFcIcon(); landUpdatePacket->data().land.fcIconColor = pLand->getFcColor(); + if( auto house = pLand->getHouse() ) + { + // todo: this is retarded, need a getter to the internal array + for( int i = 0; i < 8; i++ ) + { + auto slot = static_cast< Common::HousePartSlot >( i ); + auto part = pLand->getHouse()->getHousePart( slot ); + + landUpdatePacket->data().land.housePart[ slot ] = part; + } + } + pPlayer->queuePacket( landUpdatePacket ); } } diff --git a/src/servers/sapphire_zone/Zone/Land.cpp b/src/servers/sapphire_zone/Zone/Land.cpp index 8488c139..3fbcd3ae 100644 --- a/src/servers/sapphire_zone/Zone/Land.cpp +++ b/src/servers/sapphire_zone/Zone/Land.cpp @@ -20,14 +20,15 @@ #include "Forwards.h" #include "Land.h" #include "Framework.h" +#include "House.h" extern Core::Framework g_fw; using namespace Core::Common; -Core::Land::Land( uint16_t zoneId, uint8_t wardNum, uint8_t landId, uint32_t landSetId, +Core::Land::Land( uint16_t territoryTypeId, uint8_t wardNum, uint8_t landId, uint32_t landSetId, Core::Data::HousingLandSetPtr info ) : - m_zoneId( zoneId ), + m_territoryTypeId( territoryTypeId ), m_wardNum( wardNum ), m_landId( landId ), m_currentPrice( 0 ), @@ -36,7 +37,11 @@ Core::Land::Land( uint16_t zoneId, uint8_t wardNum, uint8_t landId, uint32_t lan m_ownerPlayerId( 0 ), m_landSetId( landSetId ), m_landInfo( info ), - m_type( Common::LandType::Private ) + m_type( Common::LandType::Private ), + m_fcIcon( 0 ), + m_fcIconColor( 0 ), + m_fcId( 0 ), + m_iconAddIcon( 0 ) { memset( &m_tag, 0x00, 3 ); @@ -147,9 +152,9 @@ uint8_t Core::Land::getLandId() const return m_landId; } -uint16_t Core::Land::getZoneId() const +uint16_t Core::Land::getTerritoryTypeId() const { - return m_zoneId; + return m_territoryTypeId; } Core::HousePtr Core::Land::getHouse() const @@ -242,12 +247,17 @@ void Core::Land::init() void Core::Land::updateLandDb() { + uint32_t houseId = 0; + + if( getHouse() ) + houseId = getHouse()->getHouseId(); + auto pDb = g_fw.get< Db::DbWorkerPool< Db::ZoneDbConnection > >(); pDb->directExecute( "UPDATE land SET status = " + std::to_string( m_state ) + ", LandPrice = " + std::to_string( getCurrentPrice() ) + ", UpdateTime = " + std::to_string( getDevaluationTime() ) + ", OwnerId = " + std::to_string( getPlayerOwner() ) - + ", HouseId = " + std::to_string( 0 ) //TODO: add house id + + ", HouseId = " + std::to_string( houseId ) + ", Type = " + std::to_string( static_cast< uint32_t >( m_type ) ) //TODO: add house id + " WHERE LandSetId = " + std::to_string( m_landSetId ) + " AND LandId = " + std::to_string( m_landId ) + ";" ); @@ -266,6 +276,17 @@ void Core::Land::update( uint32_t currTime ) } } +uint32_t Core::Land::getNextHouseId() +{ + auto pDb = g_fw.get< Db::DbWorkerPool< Db::ZoneDbConnection > >(); + auto pQR = pDb->query( "SELECT MAX( HouseId ) FROM house" ); + + if( !pQR->next() ) + return 0; + + return pQR->getUInt( 1 ) + 1; +} + bool Core::Land::setPreset( uint32_t itemId ) { auto housingItemId = convertItemIdToHousingItemId( itemId ); @@ -275,5 +296,20 @@ bool Core::Land::setPreset( uint32_t itemId ) return false; auto housingPreset = exdData->get< Core::Data::HousingPreset >( housingItemId ); + if( !housingPreset ) + return false; + if( !getHouse() ) + { + // todo: i guess we'd create a house here? + auto newId = getNextHouseId(); + m_pHouse = make_House( newId, getLandSetId(), getLandId(), getWardNum(), getTerritoryTypeId() ); + } + + getHouse()->setHousePart( Common::HousePartSlot::ExteriorRoof, housingPreset->exteriorRoof ); + getHouse()->setHousePart( Common::HousePartSlot::ExteriorWall, housingPreset->exteriorWall ); + getHouse()->setHousePart( Common::HousePartSlot::ExteriorWindow, housingPreset->exteriorWindow ); + getHouse()->setHousePart( Common::HousePartSlot::ExteriorDoor, housingPreset->exteriorDoor ); + + return true; } diff --git a/src/servers/sapphire_zone/Zone/Land.h b/src/servers/sapphire_zone/Zone/Land.h index 243ca62c..3bf792d2 100644 --- a/src/servers/sapphire_zone/Zone/Land.h +++ b/src/servers/sapphire_zone/Zone/Land.h @@ -33,7 +33,7 @@ namespace Core uint32_t getLandSetId() const; uint8_t getWardNum() const; uint8_t getLandId() const; - uint16_t getZoneId() const; + uint16_t getTerritoryTypeId() const; Common::LandType getLandType() const; Core::HousePtr getHouse() const; @@ -64,11 +64,12 @@ namespace Core private: uint32_t convertItemIdToHousingItemId( uint32_t itemId ); void init(); + uint32_t getNextHouseId(); uint8_t m_wardNum; uint8_t m_landId; uint32_t m_landSetId; - uint16_t m_zoneId; + uint16_t m_territoryTypeId; uint8_t m_size; uint8_t m_state; Common::LandType m_type; From 14417f2cfa6c28d655651f7d50ef0c7a882bc6cb Mon Sep 17 00:00:00 2001 From: NotAdam Date: Sun, 25 Nov 2018 23:20:56 +1100 Subject: [PATCH 07/14] GilShop improvements, init land values in db to 0, fix for login crash --- src/servers/Scripts/common/GilShop.cpp | 7 +++---- src/servers/sapphire_zone/Event/EventHandler.h | 1 + src/servers/sapphire_zone/Network/GameConnection.cpp | 4 ++++ .../sapphire_zone/Network/Handlers/EventHandlers.cpp | 1 + src/servers/sapphire_zone/Zone/Land.cpp | 6 +++--- 5 files changed, 12 insertions(+), 7 deletions(-) diff --git a/src/servers/Scripts/common/GilShop.cpp b/src/servers/Scripts/common/GilShop.cpp index 6554ca72..d2d8cd5b 100644 --- a/src/servers/Scripts/common/GilShop.cpp +++ b/src/servers/Scripts/common/GilShop.cpp @@ -37,11 +37,10 @@ private: } // sell - else if( result.param2 == 2 ) + // can't sell if the vendor is yourself (eg, housing permit shop) + else if( result.param2 == 2 && result.actorId != player.getId() ) { - // so apparently shops will always show a sell window - // BUT won't always let you sell stuff (eg, housing permit menu) - // there doesn't seem to be anything in gilshop exd for that, so maybe it's some shitty server hack? + } player.playGilShop( result.eventId, SCENE_FLAGS, std::bind( &GilShop::shopInteractionCallback, this, std::placeholders::_1, std::placeholders::_2 ) ); diff --git a/src/servers/sapphire_zone/Event/EventHandler.h b/src/servers/sapphire_zone/Event/EventHandler.h index c9008964..77735623 100644 --- a/src/servers/sapphire_zone/Event/EventHandler.h +++ b/src/servers/sapphire_zone/Event/EventHandler.h @@ -8,6 +8,7 @@ namespace Core::Event struct SceneResult { + uint64_t actorId; uint32_t eventId; uint16_t param1; uint16_t param2; diff --git a/src/servers/sapphire_zone/Network/GameConnection.cpp b/src/servers/sapphire_zone/Network/GameConnection.cpp index cb960315..0e00e7f4 100644 --- a/src/servers/sapphire_zone/Network/GameConnection.cpp +++ b/src/servers/sapphire_zone/Network/GameConnection.cpp @@ -321,6 +321,10 @@ void Core::Network::GameConnection::processOutQueue() pRP.addPacket( pPacket ); totalSize += pPacket->getSize(); + + // todo: figure out a good max set size and make it configurable + if( totalSize > 5000 ) + break; } if( totalSize > 0 ) diff --git a/src/servers/sapphire_zone/Network/Handlers/EventHandlers.cpp b/src/servers/sapphire_zone/Network/Handlers/EventHandlers.cpp index becbcdc5..ffb3124a 100644 --- a/src/servers/sapphire_zone/Network/Handlers/EventHandlers.cpp +++ b/src/servers/sapphire_zone/Network/Handlers/EventHandlers.cpp @@ -221,6 +221,7 @@ void Core::Network::GameConnection::eventHandlerReturn( const Packets::FFXIVARR_ if( eventCallback ) { Event::SceneResult result; + result.actorId = pEvent->getActorId(); result.eventId = eventId; result.param1 = param1; result.param2 = param2; diff --git a/src/servers/sapphire_zone/Zone/Land.cpp b/src/servers/sapphire_zone/Zone/Land.cpp index 3fbcd3ae..26335d5a 100644 --- a/src/servers/sapphire_zone/Zone/Land.cpp +++ b/src/servers/sapphire_zone/Zone/Land.cpp @@ -37,7 +37,7 @@ Core::Land::Land( uint16_t territoryTypeId, uint8_t wardNum, uint8_t landId, uin m_ownerPlayerId( 0 ), m_landSetId( landSetId ), m_landInfo( info ), - m_type( Common::LandType::Private ), + m_type( Common::LandType::none ), m_fcIcon( 0 ), m_fcIconColor( 0 ), m_fcId( 0 ), @@ -60,11 +60,11 @@ void Core::Land::load() "AND LandId = " + std::to_string( m_landId ) ); if( !res->next() ) { - pDb->directExecute( "INSERT INTO land ( landsetid, landid, type, size, status, landprice ) " + pDb->directExecute( "INSERT INTO land ( landsetid, landid, type, size, status, landprice, UpdateTime, OwnerId, HouseId ) " "VALUES ( " + std::to_string( m_landSetId ) + "," + std::to_string( m_landId ) + "," + std::to_string( static_cast< uint8_t >( m_type ) ) + "," + std::to_string( m_landInfo->plotSize[ m_landId ] ) + "," - + " 1, " + std::to_string( m_landInfo->initialPrice[ m_landId ] ) + " );" ); + + " 1, " + std::to_string( m_landInfo->initialPrice[ m_landId ] ) + ", 0, 0, 0 );" ); m_currentPrice = m_landInfo->initialPrice[ m_landId ]; m_minPrice = m_landInfo->minPrice[ m_landId ]; From 62833689ae7a60870bb8b4b08e3050d2b7a578c6 Mon Sep 17 00:00:00 2001 From: NotAdam Date: Sun, 25 Nov 2018 23:29:37 +1100 Subject: [PATCH 08/14] Make max set size 15k so login feels slower so we are more retail accurate --- src/servers/sapphire_zone/Network/GameConnection.cpp | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/servers/sapphire_zone/Network/GameConnection.cpp b/src/servers/sapphire_zone/Network/GameConnection.cpp index 0e00e7f4..bfeda82f 100644 --- a/src/servers/sapphire_zone/Network/GameConnection.cpp +++ b/src/servers/sapphire_zone/Network/GameConnection.cpp @@ -323,7 +323,7 @@ void Core::Network::GameConnection::processOutQueue() totalSize += pPacket->getSize(); // todo: figure out a good max set size and make it configurable - if( totalSize > 5000 ) + if( totalSize > 15000 ) break; } From 7374af583905524097d3041e177fd747066a2139 Mon Sep 17 00:00:00 2001 From: mordred Date: Sun, 25 Nov 2018 16:45:48 +0100 Subject: [PATCH 09/14] Begin of db manager tool --- src/dbm/CMakeLists.txt | 31 +++++++ src/dbm/DbManager.cpp | 69 +++++++++++++++ src/dbm/DbManager.h | 49 +++++++++++ src/dbm/main.cpp | 189 +++++++++++++++++++++++++++++++++++++++++ 4 files changed, 338 insertions(+) create mode 100644 src/dbm/CMakeLists.txt create mode 100644 src/dbm/DbManager.cpp create mode 100644 src/dbm/DbManager.h create mode 100644 src/dbm/main.cpp diff --git a/src/dbm/CMakeLists.txt b/src/dbm/CMakeLists.txt new file mode 100644 index 00000000..0736265e --- /dev/null +++ b/src/dbm/CMakeLists.txt @@ -0,0 +1,31 @@ +cmake_minimum_required(VERSION 3.0) +cmake_policy(SET CMP0015 NEW) +project(sapphire_dbm) + +file(GLOB SERVER_PUBLIC_INCLUDE_FILES "${CMAKE_CURRENT_SOURCE_DIR}/*" ) +file(GLOB SERVER_SOURCE_FILES "${CMAKE_CURRENT_SOURCE_DIR}*.c*") + +add_executable(sapphire_dbm ${SERVER_PUBLIC_INCLUDE_FILES} ${SERVER_SOURCE_FILES}) + +set_target_properties(sapphire_dbm PROPERTIES + CXX_STANDARD 17 + CXX_STANDARD_REQUIRED ON + CXX_EXTENSIONS ON + RUNTIME_OUTPUT_DIRECTORY_DEBUG "${CMAKE_CURRENT_SOURCE_DIR}/../../bin/" + RUNTIME_OUTPUT_DIRECTORY_RELEASE "${CMAKE_CURRENT_SOURCE_DIR}/../../bin/" + RUNTIME_OUTPUT_DIRECTORY_RELWITHDEBINFO "${CMAKE_CURRENT_SOURCE_DIR}/../../bin/" + RUNTIME_OUTPUT_DIRECTORY_MINSIZEREL "${CMAKE_CURRENT_SOURCE_DIR}/../../bin/" +) + +target_include_directories( sapphire_dbm + PUBLIC + "${CMAKE_CURRENT_SOURCE_DIR}/" + PRIVATE + "${CMAKE_CURRENT_SOURCE_DIR}/../" ) + target_link_libraries( sapphire_dbm PRIVATE mysqlConnector common xivdat ) +if (UNIX) + target_link_libraries( sapphire_dbm PRIVATE stdc++fs ) +else() + target_link_libraries( sapphire_dbm PRIVATE mysql ) +endif() + diff --git a/src/dbm/DbManager.cpp b/src/dbm/DbManager.cpp new file mode 100644 index 00000000..7035e29f --- /dev/null +++ b/src/dbm/DbManager.cpp @@ -0,0 +1,69 @@ +#include "DbManager.h" +#include +DbManager::DbManager( const std::string& host, const std::string& database, const std::string& user, const std::string& pw, uint16_t port ) : + m_host( host ), + m_database( database ), + m_user( user ), + m_password( pw ), + m_port( port ) +{ +} + +DbManager::~DbManager() +{ + +} + +bool DbManager::connect() +{ + std::shared_ptr< Mysql::MySqlBase > base( new Mysql::MySqlBase() ); + Mysql::optionMap options; + options[ Mysql::MYSQL_OPT_RECONNECT ] = "1"; + options[ Mysql::MYSQL_SET_CHARSET_NAME ] = "utf8"; + + try + { + m_pConnection = base->connect( m_host, m_user, m_password, options, m_port ); + } + catch( std::runtime_error& e ) + { + m_lastError = e.what(); + return false; + } + return true; +} + +bool DbManager::selectSchema() +{ + if( !m_pConnection ) + { + m_lastError = "No valid db connection!"; + return false; + } + + try + { + m_pConnection->setSchema( m_database ); + } + catch( std::runtime_error& e ) + { + m_lastError = e.what(); + return false; + } + return true; +} + +const std::string& DbManager::getLastError() +{ + return m_lastError; +} + +void DbManager::setMode( Mode mode ) +{ + m_mode = mode; +} + +Mode DbManager::getMode() const +{ + return m_mode; +} diff --git a/src/dbm/DbManager.h b/src/dbm/DbManager.h new file mode 100644 index 00000000..7c6cd2eb --- /dev/null +++ b/src/dbm/DbManager.h @@ -0,0 +1,49 @@ +#ifndef SAPPHIRE_DBMANAGER +#define SAPPHIRE_DBMANAGER +#include +#include +#include + +namespace Mysql +{ + class Connection; +} + +enum class Mode +{ + INIT, + LIQUIDATE, + UPDATE, + CHECK, + CLEAN_CHARS +}; + +class DbManager +{ + public: + DbManager( const std::string& host, const std::string& database, const std::string& user, const std::string& pw, uint16_t port ); + + void setMode( Mode mode ); + Mode getMode() const; + + bool connect(); + bool selectSchema(); + + virtual ~DbManager(); + + const std::string& getLastError(); + + private: + std::string m_host; + std::string m_database; + std::string m_user; + std::string m_password; + uint16_t m_port; + std::shared_ptr< Mysql::Connection > m_pConnection; + std::string m_lastError; + Mode m_mode; +}; + + + +#endif diff --git a/src/dbm/main.cpp b/src/dbm/main.cpp new file mode 100644 index 00000000..d7e337c9 --- /dev/null +++ b/src/dbm/main.cpp @@ -0,0 +1,189 @@ + +#include +#include +#include +#include +#include +#include + + +namespace filesys = std::experimental::filesystem; + +#include +#include +#include +#include + +#include "DbManager.h" + +Core::Logger g_log; + +std::vector< std::string > getAllFilesInDir( const std::string& dirPath, + const std::vector< std::string > dirSkipList = {} ) +{ + + // Create a vector of string + std::vector< std::string > listOfFiles; + try + { + // Check if given path exists and points to a directory + if( filesys::exists( dirPath ) && filesys::is_directory( dirPath ) ) + { + // Create a Recursive Directory Iterator object and points to the starting of directory + filesys::recursive_directory_iterator iter( dirPath ); + + // Create a Recursive Directory Iterator object pointing to end. + filesys::recursive_directory_iterator end; + + // Iterate till end + while( iter != end ) + { + // Check if current entry is a directory and if exists in skip list + if( filesys::is_directory( iter->path() ) && + ( std::find( dirSkipList.begin(), dirSkipList.end(), iter->path().filename() ) != dirSkipList.end() ) ) + { + // Skip the iteration of current directory pointed by iterator +#ifdef USING_BOOST + // Boost Fileystsem API to skip current directory iteration + iter.no_push(); +#else + // c++17 Filesystem API to skip current directory iteration + iter.disable_recursion_pending(); +#endif + } + else + { + // Add the name in vector + listOfFiles.push_back( iter->path().string() ); + } + + std::error_code ec; + // Increment the iterator to point to next entry in recursive iteration + iter.increment( ec ); + if( ec ) + { + std::cerr << "Error While Accessing : " << iter->path().string() << " :: " << ec.message() << '\n'; + } + } + } + } + catch( std::system_error& e ) + { + std::cerr << "Exception :: " << e.what(); + } + return listOfFiles; +} + +std::string delChar( std::string &str, char del ) +{ + str.erase( std::remove( str.begin(), str.end(), del ), str.end() ); + return str; +} + +void printUsage() +{ + g_log.info( " Usage: sapphire_dbm " ); + g_log.info( "\t --mode" ); + g_log.info( "\t\t initialize -> Creates DB if not present and inserts default tables/data" ); + g_log.info( "\t\t check -> Checks if Sapphire DB-Version matches your DB-Version" ); + g_log.info( "\t\t update -> Updates your DB-Version to Sapphire DB-Version" ); + g_log.info( "\t\t clearchars -> Removes all character data from DB. Accounts will stay untouched" ); + g_log.info( "\t\t liquidate -> Removes all tables and deletes the DB" ); + g_log.info( "\t --user " ); + g_log.info( "\t --pass ( default empty )" ); + g_log.info( "\t --host ( default 127.0.0.1 )" ); + g_log.info( "\t --port ( default 3306 )" ); + g_log.info( "\t --database " ); + +} + +int main( int32_t argc, char* argv[] ) +{ + std::string arg( "" ); + std::string val( "" ); + + std::string mode; + std::string user; + std::string host; + std::string database; + + g_log.setLogPath( "log/SapphireDbm" ); + g_log.init(); + + + std::vector< std::string > args( argv + 1, argv + argc ); + for( uint32_t i = 0; i + 1 < args.size(); i += 2 ) + { + arg = std::string( args[ i ] ); + val = std::string( args[ i + 1 ] ); + + // trim '-' from start of arg + arg = arg.erase( 0, arg.find_first_not_of( '-' ) ); + if( arg == "mode" ) + mode = val; + else if( arg == "user" ) + user = val; + else if( arg == "host" ) + host = val; + else if( arg == "database" ) + database = val; + } + + if( host.empty() ) + host = "127.0.0.1"; + + if( mode.empty() || user.empty() || database.empty() ) + { + printUsage(); + return 0; + } + + auto dbm = DbManager( host, database, user, "", 3306 ); + + //initialize|check|update|clearchars|liquidate + if( mode.find( "initialize" ) != std::string::npos ) + { + dbm.setMode( Mode::INIT ); + } + else if( mode.find( "check" ) != std::string::npos ) + { + dbm.setMode( Mode::CHECK ); + } + else if( mode.find( "update" ) != std::string::npos ) + { + dbm.setMode( Mode::UPDATE ); + } + else if( mode.find( "clearchars" ) != std::string::npos ) + { + dbm.setMode( Mode::CLEAN_CHARS ); + } + else if( mode.find( "liquidate" ) != std::string::npos ) + { + dbm.setMode( Mode::LIQUIDATE ); + } + else + { + g_log.fatal( "Not a valid mode: " + mode + " !" ); + return 0; + } + + g_log.info( "Launching in " + mode + " mode..." ); + + if( !dbm.connect() ) + { + g_log.fatal( "Could not connect to server!" ); + g_log.fatal( dbm.getLastError() ); + return 0; + } + + if( !dbm.selectSchema() ) + { + g_log.fatal( "Could not set schema!" ); + g_log.fatal( dbm.getLastError() ); + return 0; + } + + + + return 0; +} From b6f7beb61f8fad95493079ab327c5b59e1e7f57c Mon Sep 17 00:00:00 2001 From: Mordred Date: Mon, 26 Nov 2018 00:05:10 +0100 Subject: [PATCH 10/14] Ongoing implementation of migration utility --- CMakeLists.txt | 2 +- src/dbm/DbManager.cpp | 67 +++++++++++++++++++++++++++++++++++++++++++ src/dbm/DbManager.h | 6 ++++ src/dbm/main.cpp | 19 ++++++------ 4 files changed, 84 insertions(+), 10 deletions(-) diff --git a/CMakeLists.txt b/CMakeLists.txt index 4e82357f..a0b051f8 100644 --- a/CMakeLists.txt +++ b/CMakeLists.txt @@ -37,7 +37,7 @@ add_subdirectory( "deps/mysqlConnector" ) add_subdirectory( "src/common" ) add_subdirectory( "src/servers" ) -#add_subdirectory( "src/dbm" ) +add_subdirectory( "src/dbm" ) add_subdirectory( "src/tools/exd_common_gen" ) add_subdirectory( "src/tools/exd_struct_gen" ) diff --git a/src/dbm/DbManager.cpp b/src/dbm/DbManager.cpp index 7035e29f..908895b6 100644 --- a/src/dbm/DbManager.cpp +++ b/src/dbm/DbManager.cpp @@ -14,6 +14,21 @@ DbManager::~DbManager() } +bool DbManager::execute( const std::string& sql ) +{ + try + { + auto stmt = m_pConnection->createStatement(); + bool result = stmt->execute( sql ); + return result; + } + catch( std::runtime_error& e ) + { + m_lastError = e.what(); + return false; + } +} + bool DbManager::connect() { std::shared_ptr< Mysql::MySqlBase > base( new Mysql::MySqlBase() ); @@ -67,3 +82,55 @@ Mode DbManager::getMode() const { return m_mode; } + +bool DbManager::performAction() +{ + bool result = false; + execute( " SET autocommit = 0 " ); + m_pConnection->beginTransaction(); + + switch( m_mode ) + { + case Mode::INIT: + result = modeInit(); + break; + case Mode::LIQUIDATE: + break; + case Mode::UPDATE: + break; + case Mode::CHECK: + break; + case Mode::CLEAN_CHARS: + break; + } + if( !result ) + m_pConnection->rollbackTransaction(); + else + m_pConnection->commitTransaction(); + + return result; +} + +bool DbManager::modeInit() +{ + + bool result = false; + + if( selectSchema() ) + { + m_lastError = "Database already existing, use mode first to remove it."; + return false; + } + + if( !execute( "CREATE DATABASE " + m_database ) ) + return false; + + if( !execute( "CREATE TABLE `dbversion` (\n" + " `major` int(11) NOT NULL,\n" + " `minor` int(11) NOT NULL\n" + ") ENGINE=InnoDB DEFAULT CHARSET=latin1;" ) ) + return false; + + + return false; +} diff --git a/src/dbm/DbManager.h b/src/dbm/DbManager.h index 7c6cd2eb..1d9db329 100644 --- a/src/dbm/DbManager.h +++ b/src/dbm/DbManager.h @@ -29,6 +29,12 @@ class DbManager bool connect(); bool selectSchema(); + bool execute( const std::string& sql ); + + bool performAction(); + + bool modeInit(); + virtual ~DbManager(); const std::string& getLastError(); diff --git a/src/dbm/main.cpp b/src/dbm/main.cpp index d7e337c9..3c1f8d14 100644 --- a/src/dbm/main.cpp +++ b/src/dbm/main.cpp @@ -43,13 +43,8 @@ std::vector< std::string > getAllFilesInDir( const std::string& dirPath, ( std::find( dirSkipList.begin(), dirSkipList.end(), iter->path().filename() ) != dirSkipList.end() ) ) { // Skip the iteration of current directory pointed by iterator -#ifdef USING_BOOST - // Boost Fileystsem API to skip current directory iteration - iter.no_push(); -#else // c++17 Filesystem API to skip current directory iteration iter.disable_recursion_pending(); -#endif } else { @@ -57,7 +52,7 @@ std::vector< std::string > getAllFilesInDir( const std::string& dirPath, listOfFiles.push_back( iter->path().string() ); } - std::error_code ec; + std::error_code ec; // Increment the iterator to point to next entry in recursive iteration iter.increment( ec ); if( ec ) @@ -176,13 +171,19 @@ int main( int32_t argc, char* argv[] ) return 0; } - if( !dbm.selectSchema() ) + if( !dbm.performAction() ) { - g_log.fatal( "Could not set schema!" ); + g_log.fatal( "Could not perform action!" ); g_log.fatal( dbm.getLastError() ); - return 0; } + //if( !dbm.selectSchema() ) + //{ + // g_log.fatal( "Could not set schema!" ); + // g_log.fatal( dbm.getLastError() ); + // return 0; + //} + return 0; From 111c2bb08cc5bb62a511afed9df23a60d317de1f Mon Sep 17 00:00:00 2001 From: NotAdam Date: Mon, 26 Nov 2018 17:56:29 +1100 Subject: [PATCH 11/14] houses now correctly build and send landupdate/show on login --- .../Network/PacketDef/Zone/ServerZoneDef.h | 2 +- src/servers/sapphire_zone/Zone/House.cpp | 13 ++-- src/servers/sapphire_zone/Zone/House.h | 9 ++- .../sapphire_zone/Zone/HousingZone.cpp | 62 +++++++++++++------ src/servers/sapphire_zone/Zone/Land.cpp | 8 +-- 5 files changed, 62 insertions(+), 32 deletions(-) diff --git a/src/common/Network/PacketDef/Zone/ServerZoneDef.h b/src/common/Network/PacketDef/Zone/ServerZoneDef.h index 22c07e60..44247c6d 100644 --- a/src/common/Network/PacketDef/Zone/ServerZoneDef.h +++ b/src/common/Network/PacketDef/Zone/ServerZoneDef.h @@ -1607,7 +1607,7 @@ struct LandStruct uint32_t fcIcon;// 12 uint32_t fcIconColor; // 16 uint16_t housePart[ 8 ]; // 34 - uint8_t color[ 8 ]; // 36 + uint8_t houseColour[ 8 ]; // 36 }; struct FFXIVIpcLandUpdate : FFXIVIpcBasePacket< LandUpdate > diff --git a/src/servers/sapphire_zone/Zone/House.cpp b/src/servers/sapphire_zone/Zone/House.cpp index 55ca5b1d..40aa2b73 100644 --- a/src/servers/sapphire_zone/Zone/House.cpp +++ b/src/servers/sapphire_zone/Zone/House.cpp @@ -67,20 +67,25 @@ uint32_t Core::House::getHouseId() const uint8_t Core::House::getHousePartColor( Common::HousePartSlot slot ) const { - return m_housePartsColor[ slot ]; + return std::get< 1 >( m_houseParts[ slot ] ); } void Core::House::setHousePart( Common::HousePartSlot slot, uint32_t id ) { - m_houseParts[ slot ] = id; + std::get< 0 >( m_houseParts[ slot ] ) = id; } void Core::House::setHousePartColor( Common::HousePartSlot slot, uint32_t id ) { - m_housePartsColor[ slot ] = id; + std::get< 1 >( m_houseParts[ slot ] ) = id; } uint32_t Core::House::getHousePart( Common::HousePartSlot slot ) const { - return m_houseParts[ slot ]; + return std::get< 0 >( m_houseParts[ slot ] ); +} + +Core::House::HousePartsArray const& Core::House::getHouseParts() const +{ + return m_houseParts; } \ No newline at end of file diff --git a/src/servers/sapphire_zone/Zone/House.h b/src/servers/sapphire_zone/Zone/House.h index 080aea2e..410ab80d 100644 --- a/src/servers/sapphire_zone/Zone/House.h +++ b/src/servers/sapphire_zone/Zone/House.h @@ -11,11 +11,13 @@ namespace Core class House { - public: House( uint32_t houseId, uint32_t landSetId, uint8_t landId, uint8_t wardNum, uint16_t territoryTypeId ); virtual ~House(); + using HousePart = std::tuple< uint32_t, uint8_t >; + using HousePartsArray = std::array< HousePart, 8 >; + //gerneral uint32_t getLandSetId() const; uint8_t getLandId() const; @@ -29,6 +31,8 @@ namespace Core uint32_t getHousePart( Common::HousePartSlot slot ) const; uint8_t getHousePartColor( Common::HousePartSlot slot ) const; + HousePartsArray const& getHouseParts() const; + private: uint32_t m_landSetId; uint8_t m_landId; @@ -36,8 +40,7 @@ namespace Core uint16_t m_territoryTypeId; uint32_t m_houseId; - uint32_t m_houseParts[ 8 ]; - uint8_t m_housePartsColor[ 8 ]; + HousePartsArray m_houseParts; char m_commentMsg[ 193 ]; }; diff --git a/src/servers/sapphire_zone/Zone/HousingZone.cpp b/src/servers/sapphire_zone/Zone/HousingZone.cpp index 8ca52012..37beafcd 100644 --- a/src/servers/sapphire_zone/Zone/HousingZone.cpp +++ b/src/servers/sapphire_zone/Zone/HousingZone.cpp @@ -127,13 +127,30 @@ void Core::HousingZone::sendLandSet( Entity::Player& player ) for( uint8_t i = startIndex, count = 0; i < ( startIndex + 30 ); ++i, ++count ) { auto pLand = getLand( i ); - landsetInitializePacket->data().land[ count ].plotSize = pLand->getSize(); - landsetInitializePacket->data().land[ count ].houseState = pLand->getState(); - landsetInitializePacket->data().land[ count ].type = static_cast< uint8_t >( pLand->getLandType() ); - landsetInitializePacket->data().land[ count ].iconAddIcon = pLand->getSharing(); - landsetInitializePacket->data().land[ count ].fcId = pLand->getFcId(); - landsetInitializePacket->data().land[ count ].fcIcon = pLand->getFcIcon(); - landsetInitializePacket->data().land[ count ].fcIconColor = pLand->getFcColor(); + + // todo: move this and sendLandUpdate building logic to its own function + auto& landData = landsetInitializePacket->data().land[ count ]; + + landData.plotSize = pLand->getSize(); + landData.houseState = pLand->getState(); + landData.type = static_cast< uint8_t >( pLand->getLandType() ); + landData.iconAddIcon = pLand->getSharing(); + landData.fcId = pLand->getFcId(); + landData.fcIcon = pLand->getFcIcon(); + landData.fcIconColor = pLand->getFcColor(); + + if( auto house = pLand->getHouse() ) + { + auto& parts = house->getHouseParts(); + + for( auto i = 0; i != parts.size(); i++ ) + { + auto [ part, colour ] = parts[ i ]; + + landData.housePart[ i ] = part; + landData.houseColour[ i ] = colour; + } + } } player.queuePacket( landsetInitializePacket ); @@ -148,23 +165,28 @@ void Core::HousingZone::sendLandUpdate( uint8_t landId ) auto landUpdatePacket = makeZonePacket< FFXIVIpcLandUpdate >( pPlayer->getId() ); landUpdatePacket->data().landId = landId; - landUpdatePacket->data().land.plotSize = pLand->getSize(); - landUpdatePacket->data().land.houseState = pLand->getState(); - landUpdatePacket->data().land.type = 0; - landUpdatePacket->data().land.iconAddIcon = pLand->getSharing(); - landUpdatePacket->data().land.fcId = pLand->getFcId(); - landUpdatePacket->data().land.fcIcon = pLand->getFcIcon(); - landUpdatePacket->data().land.fcIconColor = pLand->getFcColor(); + + auto& landData = landUpdatePacket->data().land; + + landData.plotSize = pLand->getSize(); + landData.houseState = pLand->getState(); + landData.type = static_cast< uint8_t >( pLand->getLandType() ); + landData.iconAddIcon = pLand->getSharing(); + landData.fcId = pLand->getFcId(); + landData.fcIcon = pLand->getFcIcon(); + landData.fcIconColor = pLand->getFcColor(); + if( auto house = pLand->getHouse() ) { - // todo: this is retarded, need a getter to the internal array - for( int i = 0; i < 8; i++ ) - { - auto slot = static_cast< Common::HousePartSlot >( i ); - auto part = pLand->getHouse()->getHousePart( slot ); + auto& parts = house->getHouseParts(); - landUpdatePacket->data().land.housePart[ slot ] = part; + for( auto i = 0; i != parts.size(); i++ ) + { + auto [ part, colour ] = parts[ i ]; + + landData.housePart[ i ] = part; + landData.houseColour[ i ] = colour; } } diff --git a/src/servers/sapphire_zone/Zone/Land.cpp b/src/servers/sapphire_zone/Zone/Land.cpp index 26335d5a..81ce268e 100644 --- a/src/servers/sapphire_zone/Zone/Land.cpp +++ b/src/servers/sapphire_zone/Zone/Land.cpp @@ -306,10 +306,10 @@ bool Core::Land::setPreset( uint32_t itemId ) m_pHouse = make_House( newId, getLandSetId(), getLandId(), getWardNum(), getTerritoryTypeId() ); } - getHouse()->setHousePart( Common::HousePartSlot::ExteriorRoof, housingPreset->exteriorRoof ); - getHouse()->setHousePart( Common::HousePartSlot::ExteriorWall, housingPreset->exteriorWall ); - getHouse()->setHousePart( Common::HousePartSlot::ExteriorWindow, housingPreset->exteriorWindow ); - getHouse()->setHousePart( Common::HousePartSlot::ExteriorDoor, housingPreset->exteriorDoor ); + getHouse()->setHousePart( Common::HousePartSlot::ExteriorRoof, convertItemIdToHousingItemId( housingPreset->exteriorRoof ) ); + getHouse()->setHousePart( Common::HousePartSlot::ExteriorWall, convertItemIdToHousingItemId( housingPreset->exteriorWall ) ); + getHouse()->setHousePart( Common::HousePartSlot::ExteriorWindow, convertItemIdToHousingItemId( housingPreset->exteriorWindow ) ); + getHouse()->setHousePart( Common::HousePartSlot::ExteriorDoor, convertItemIdToHousingItemId( housingPreset->exteriorDoor ) ); return true; } From 89c8293eefda559e7adc75d4ce64cd40a950ebda Mon Sep 17 00:00:00 2001 From: NotAdam Date: Mon, 26 Nov 2018 23:18:16 +1100 Subject: [PATCH 12/14] New land sql, run update_land.sql --- sql/update_land.sql | 4 +++- 1 file changed, 3 insertions(+), 1 deletion(-) diff --git a/sql/update_land.sql b/sql/update_land.sql index 6baa174e..d6034988 100644 --- a/sql/update_land.sql +++ b/sql/update_land.sql @@ -1,2 +1,4 @@ ALTER TABLE `land` ADD `Type` SMALLINT(6) NOT NULL DEFAULT '0' AFTER `LandId`; -ALTER TABLE `house` ADD `HouseName` binary(23) DEFAULT "" AFTER `Comment`; \ No newline at end of file +ALTER TABLE `house` ADD `HouseName` binary(23) DEFAULT "" AFTER `Comment`; +ALTER TABLE `house` ADD `HousePartModels` BINARY(48) DEFAULT "" AFTER `Endorsements`; +ALTER TABLE `house` ADD `HousePartColours` BINARY(48) DEFAULT "" AFTER `HousePartModels`; \ No newline at end of file From 345de714941ce624cf236befab7a5831e10c803a Mon Sep 17 00:00:00 2001 From: NotAdam Date: Mon, 26 Nov 2018 23:32:22 +1100 Subject: [PATCH 13/14] save & load house state --- src/common/Database/ZoneDbConnection.cpp | 13 +++- src/common/Database/ZoneDbConnection.h | 3 + src/common/Network/CommonActorControl.h | 4 + src/servers/sapphire_zone/Zone/House.cpp | 75 ++++++++++++++++--- src/servers/sapphire_zone/Zone/House.h | 9 ++- src/servers/sapphire_zone/Zone/HousingMgr.cpp | 11 ++- .../sapphire_zone/Zone/HousingZone.cpp | 12 +-- src/servers/sapphire_zone/Zone/Land.cpp | 11 +++ 8 files changed, 115 insertions(+), 23 deletions(-) diff --git a/src/common/Database/ZoneDbConnection.cpp b/src/common/Database/ZoneDbConnection.cpp index cf76f4f0..bb92489c 100644 --- a/src/common/Database/ZoneDbConnection.cpp +++ b/src/common/Database/ZoneDbConnection.cpp @@ -181,8 +181,8 @@ void Core::Db::ZoneDbConnection::doPrepareStatements() "secWeaponModel, aggressionMode, enemyType, pose, " "modelChara, displayFlags, Look, Models " "FROM bnpctemplate WHERE 1;", - CONNECTION_BOTH); - + CONNECTION_BOTH ); + prepareStatement( CHARA_ITEMGLOBAL_UP, "UPDATE charaglobalitem SET stack = ?, durability = ?, stain = ? WHERE ItemId = ?;", CONNECTION_BOTH ); @@ -191,6 +191,15 @@ void Core::Db::ZoneDbConnection::doPrepareStatements() "UPDATE charaglobalitem SET IS_DELETE = 1 WHERE ItemId = ?;", CONNECTION_BOTH ); + /// HOUSING + prepareStatement( HOUSING_HOUSE_INS, + "INSERT INTO house ( LandSetId, HouseId ) VALUES ( ?, ? );", + CONNECTION_BOTH ); + + prepareStatement( HOUSING_HOUSE_UP, + "UPDATE house SET BuildTime = ?, Aetheryte = ?, Comment = ?, HouseName = ?, Endorsements = ?, HousePartModels = ?, HousePartColours = ? WHERE HouseId = ?;", + CONNECTION_BOTH ); + /*prepareStatement( LAND_INS, "INSERT INTO land ( LandSetId ) VALUES ( ? );", CONNECTION_BOTH ); diff --git a/src/common/Database/ZoneDbConnection.h b/src/common/Database/ZoneDbConnection.h index 0a106cd3..aa3cdf0f 100644 --- a/src/common/Database/ZoneDbConnection.h +++ b/src/common/Database/ZoneDbConnection.h @@ -81,6 +81,9 @@ namespace Core::Db LAND_INS, LAND_SEL, LAND_UP, + HOUSING_HOUSE_INS, + HOUSING_HOUSE_UP, + HOUSING_HOUSE_DEL, MAX_STATEMENTS diff --git a/src/common/Network/CommonActorControl.h b/src/common/Network/CommonActorControl.h index 5d126c49..496ed69e 100644 --- a/src/common/Network/CommonActorControl.h +++ b/src/common/Network/CommonActorControl.h @@ -297,7 +297,11 @@ enum ActorControlType : uint16_t RequestWardLandInfo = 0x453, RequestLandRelinquish = 0x454, RequestEstateRename = 0x45A, + RequestEstateEditGreeting = 0x45B, RequestEstateGreeting = 0x45C, // sends FFXIVIpcHousingEstateGreeting in return + RequestEstateEditGuestAccessSettings = 0x45D, + RequestEstateTagSettings = 0x45F, + RequestHousingItemUI = 0x463, RequestSharedEstateSettings = 0x46F, diff --git a/src/servers/sapphire_zone/Zone/House.cpp b/src/servers/sapphire_zone/Zone/House.cpp index 40aa2b73..333bfec4 100644 --- a/src/servers/sapphire_zone/Zone/House.cpp +++ b/src/servers/sapphire_zone/Zone/House.cpp @@ -4,6 +4,7 @@ #include #include #include +#include #include "House.h" @@ -19,25 +20,79 @@ Core::House::House( uint32_t houseId, uint32_t landSetId, uint8_t landId, uint8_ m_wardNum( wardNum ), m_territoryTypeId( territoryTypeId ) { - memset( &m_houseParts, 0x00, sizeof( m_houseParts ) ); - memset( &m_commentMsg, 0x00, sizeof( m_commentMsg ) ); - auto pDB = g_fw.get< Db::DbWorkerPool< Db::ZoneDbConnection > >(); - auto res = pDB->query("SELECT * FROM house WHERE HouseId = " + std::to_string( houseId ) ); + + // todo: convert to prepared statement + auto res = pDB->query( "SELECT * FROM house WHERE HouseId = " + std::to_string( houseId ) ); if( !res->next() ) { - pDB->directExecute("INSERT INTO house ( LandSetId, HouseId ) VALUES ( " + std::to_string( m_landSetId ) + ", " + std::to_string( m_houseId ) + " )" ); + g_fw.get< Core::Logger >()->info( "Creating house House#" + std::to_string( houseId ) + " in LandSet#" + std::to_string( landSetId ) ); + + auto stmt = pDB->getPreparedStatement( Db::HOUSING_HOUSE_INS ); + + stmt->setUInt( 1, m_landSetId ); + stmt->setUInt( 2, m_houseId ); + + pDB->execute( stmt ); } else { - // todo + m_estateMessage = res->getString( "Comment" ); + m_houseName = res->getString( "HouseName" ); + + auto housePartModels = res->getBlobVector( "HousePartModels" ); + auto housePartColours = res->getBlobVector( "HousePartColours" ); + + auto models = reinterpret_cast< uint32_t* >( &housePartModels[ 0 ] ); + auto colours = &housePartColours[ 0 ]; + + for( auto i = 0; i < 8; i++ ) + { + m_houseParts[ i ] = { models[ i ], colours[ i ] }; + } } } Core::House::~House() { +} +void Core::House::updateHouseDb() +{ + auto pDB = g_fw.get< Db::DbWorkerPool< Db::ZoneDbConnection > >(); + + // BuildTime = 1, Aetheryte = 2, Comment = 3, HouseName = 4, Endorsements = 5, + // HousePartModels = 6, HousePartColours = 7, HouseId = 8 + auto stmt = pDB->getPreparedStatement( Db::HOUSING_HOUSE_UP ); + stmt->setUInt( 8, m_houseId ); + + stmt->setInt64( 1, m_buildTime ); + stmt->setInt( 2, 0 ); + + stmt->setString( 3, m_estateMessage ); + stmt->setString( 4, m_houseName ); + + stmt->setUInt64( 5, 0 ); + + std::vector< uint32_t > models; + std::vector< uint8_t > colours; + + for( auto i = 0; i < 8; i++ ) + { + auto& part = m_houseParts[ i ]; + models.push_back( part.first ); + colours.push_back( part.second ); + } + + // todo: this is shit + std::vector< uint8_t > tmpModels( models.size() * 4 ); + memcpy( tmpModels.data(), models.data(), tmpModels.size() ); + + stmt->setBinary( 6, tmpModels ); + stmt->setBinary( 7, colours ); + + pDB->execute( stmt ); } uint32_t Core::House::getLandSetId() const @@ -67,22 +122,22 @@ uint32_t Core::House::getHouseId() const uint8_t Core::House::getHousePartColor( Common::HousePartSlot slot ) const { - return std::get< 1 >( m_houseParts[ slot ] ); + return m_houseParts[ slot ].second; } void Core::House::setHousePart( Common::HousePartSlot slot, uint32_t id ) { - std::get< 0 >( m_houseParts[ slot ] ) = id; + m_houseParts[ slot ].first = id; } void Core::House::setHousePartColor( Common::HousePartSlot slot, uint32_t id ) { - std::get< 1 >( m_houseParts[ slot ] ) = id; + m_houseParts[ slot ].second = id; } uint32_t Core::House::getHousePart( Common::HousePartSlot slot ) const { - return std::get< 0 >( m_houseParts[ slot ] ); + return m_houseParts[ slot ].first; } Core::House::HousePartsArray const& Core::House::getHouseParts() const diff --git a/src/servers/sapphire_zone/Zone/House.h b/src/servers/sapphire_zone/Zone/House.h index 410ab80d..17abaaba 100644 --- a/src/servers/sapphire_zone/Zone/House.h +++ b/src/servers/sapphire_zone/Zone/House.h @@ -15,7 +15,7 @@ namespace Core House( uint32_t houseId, uint32_t landSetId, uint8_t landId, uint8_t wardNum, uint16_t territoryTypeId ); virtual ~House(); - using HousePart = std::tuple< uint32_t, uint8_t >; + using HousePart = std::pair< uint32_t, uint8_t >; using HousePartsArray = std::array< HousePart, 8 >; //gerneral @@ -33,6 +33,8 @@ namespace Core HousePartsArray const& getHouseParts() const; + void updateHouseDb(); + private: uint32_t m_landSetId; uint8_t m_landId; @@ -40,9 +42,12 @@ namespace Core uint16_t m_territoryTypeId; uint32_t m_houseId; + uint64_t m_buildTime; + HousePartsArray m_houseParts; - char m_commentMsg[ 193 ]; + std::string m_estateMessage; + std::string m_houseName; }; } diff --git a/src/servers/sapphire_zone/Zone/HousingMgr.cpp b/src/servers/sapphire_zone/Zone/HousingMgr.cpp index 28c18adf..24b4540e 100644 --- a/src/servers/sapphire_zone/Zone/HousingMgr.cpp +++ b/src/servers/sapphire_zone/Zone/HousingMgr.cpp @@ -295,10 +295,19 @@ void Core::HousingMgr::buildPresetEstate( Entity::Player& player, uint8_t plotNu pLand->setState( HouseState::privateHouse ); pLand->setLandType( LandType::Private ); - pLand->updateLandDb(); hZone->sendLandUpdate( plotNum ); auto pSuccessBuildingPacket = makeActorControl142( player.getId(), ActorControl::BuildPresetResponse, plotNum ); player.queuePacket( pSuccessBuildingPacket ); + + pLand->updateLandDb(); + + // start house built event + // CmnDefHousingBuildHouse_00149 + player.eventStart( player.getId(), 0x000B0095, Event::EventHandler::EventType::Housing, 1, 1 ); + // todo: wtf are these flags + player.playScene( 0x000B0095, 0, 4164955899, 0, 1, plotNum, nullptr ); + + // todo: send perms/flags for house } diff --git a/src/servers/sapphire_zone/Zone/HousingZone.cpp b/src/servers/sapphire_zone/Zone/HousingZone.cpp index 37beafcd..be5434b4 100644 --- a/src/servers/sapphire_zone/Zone/HousingZone.cpp +++ b/src/servers/sapphire_zone/Zone/HousingZone.cpp @@ -145,10 +145,8 @@ void Core::HousingZone::sendLandSet( Entity::Player& player ) for( auto i = 0; i != parts.size(); i++ ) { - auto [ part, colour ] = parts[ i ]; - - landData.housePart[ i ] = part; - landData.houseColour[ i ] = colour; + landData.housePart[ i ] = parts[ i ].first; + landData.houseColour[ i ] = parts[ i ].second; } } } @@ -183,10 +181,8 @@ void Core::HousingZone::sendLandUpdate( uint8_t landId ) for( auto i = 0; i != parts.size(); i++ ) { - auto [ part, colour ] = parts[ i ]; - - landData.housePart[ i ] = part; - landData.houseColour[ i ] = colour; + landData.housePart[ i ] = parts[ i ].first; + landData.houseColour[ i ] = parts[ i ].second; } } diff --git a/src/servers/sapphire_zone/Zone/Land.cpp b/src/servers/sapphire_zone/Zone/Land.cpp index 81ce268e..4db6c196 100644 --- a/src/servers/sapphire_zone/Zone/Land.cpp +++ b/src/servers/sapphire_zone/Zone/Land.cpp @@ -80,6 +80,13 @@ void Core::Land::load() m_ownerPlayerId = res->getUInt( "OwnerId" ); m_minPrice = m_landInfo->minPrice[ m_landId ]; m_maxPrice = m_landInfo->initialPrice[ m_landId ]; + + auto houseId = res->getUInt( "HouseId" ); + + // fetch the house if we have one for this land + if( houseId > 0 ) + m_pHouse = make_House( houseId, m_landSetId, m_landId, m_wardNum, m_territoryTypeId ); + } init(); } @@ -252,6 +259,7 @@ void Core::Land::updateLandDb() if( getHouse() ) houseId = getHouse()->getHouseId(); + // todo: change to prepared statement auto pDb = g_fw.get< Db::DbWorkerPool< Db::ZoneDbConnection > >(); pDb->directExecute( "UPDATE land SET status = " + std::to_string( m_state ) + ", LandPrice = " + std::to_string( getCurrentPrice() ) @@ -261,6 +269,9 @@ void Core::Land::updateLandDb() + ", Type = " + std::to_string( static_cast< uint32_t >( m_type ) ) //TODO: add house id + " WHERE LandSetId = " + std::to_string( m_landSetId ) + " AND LandId = " + std::to_string( m_landId ) + ";" ); + + if( auto house = getHouse() ) + house->updateHouseDb(); } void Core::Land::update( uint32_t currTime ) From 7b3a8943491a1d93be14fc480183c644d3254e5e Mon Sep 17 00:00:00 2001 From: NotAdam Date: Mon, 26 Nov 2018 23:43:40 +1100 Subject: [PATCH 14/14] Correct house db column sizes --- sql/update_land.sql | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/sql/update_land.sql b/sql/update_land.sql index d6034988..87f14e23 100644 --- a/sql/update_land.sql +++ b/sql/update_land.sql @@ -1,4 +1,4 @@ ALTER TABLE `land` ADD `Type` SMALLINT(6) NOT NULL DEFAULT '0' AFTER `LandId`; ALTER TABLE `house` ADD `HouseName` binary(23) DEFAULT "" AFTER `Comment`; -ALTER TABLE `house` ADD `HousePartModels` BINARY(48) DEFAULT "" AFTER `Endorsements`; -ALTER TABLE `house` ADD `HousePartColours` BINARY(48) DEFAULT "" AFTER `HousePartModels`; \ No newline at end of file +ALTER TABLE `house` ADD `HousePartModels` BINARY(32) DEFAULT "" AFTER `Endorsements`; +ALTER TABLE `house` ADD `HousePartColours` BINARY(8) DEFAULT "" AFTER `HousePartModels`; \ No newline at end of file