From f5c9e56aa1631bbcf027b32dc29a33e258ccdab2 Mon Sep 17 00:00:00 2001 From: collett Date: Sat, 6 Feb 2021 05:18:26 +0900 Subject: [PATCH 01/43] bug fixes and implement house exterior editing. --- src/common/Network/PacketDef/Ipcs.h | 12 +++- .../Network/PacketDef/Zone/ClientZoneDef.h | 12 ++++ src/world/Inventory/ItemContainer.cpp | 3 + src/world/Manager/HousingMgr.cpp | 66 ++++++++++++++++++- src/world/Manager/HousingMgr.h | 2 + src/world/Manager/InventoryMgr.cpp | 16 ++--- src/world/Manager/TerritoryMgr.cpp | 24 +++++-- src/world/Network/GameConnection.cpp | 1 + src/world/Network/GameConnection.h | 2 + src/world/Network/Handlers/PacketHandlers.cpp | 17 +++++ src/world/Territory/House.cpp | 5 ++ src/world/Territory/House.h | 2 + src/world/Territory/Land.cpp | 17 ++++- src/world/Territory/Land.h | 4 -- 14 files changed, 161 insertions(+), 22 deletions(-) diff --git a/src/common/Network/PacketDef/Ipcs.h b/src/common/Network/PacketDef/Ipcs.h index 4f38f3ed..6e584ede 100644 --- a/src/common/Network/PacketDef/Ipcs.h +++ b/src/common/Network/PacketDef/Ipcs.h @@ -194,6 +194,15 @@ namespace Sapphire::Network::Packets EventPlay128 = 0x038A, // updated 5.35 hotfix EventPlay255 = 0x034B, // updated 5.35 hotfix + EventYield = 0x037D, // updated 5.35 hotfix + //EventYield4 = 0x0000, + //EventYield8 = 0x0000, + //EventYield16 = 0x0000, + //EventYield32 = 0x0000, + //EventYield64 = 0x0000, + //EventYield128 = 0x0000, + //EventYield255 = 0x0000, + EventStart = 0x009A, // updated 5.35 hotfix EventFinish = 0x007E, // updated 5.35 hotfix @@ -374,7 +383,7 @@ namespace Sapphire::Network::Packets OutOfRangeEventHandler = 0x0319, // updated 5.35 hotfix EnterTeriEventHandler = 0x0192, // updated 5.35 hotfix ShopEventHandler = 0x01F6, // updated 5.35 hotfix - + EventYieldHandler = 0x0128, // updated 5.35 hotfix ReturnEventHandler = 0x02B4, // updated 5.35 hotfix TradeReturnEventHandler = 0x00A4, // updated 5.35 hotfix TradeMultipleReturnEventHander = 0x035C, // updated 5.35 hotfix @@ -387,6 +396,7 @@ namespace Sapphire::Network::Packets LandRenameHandler = 0x0155, // updated 5.35 hotfix HousingUpdateHouseGreeting = 0x02EA, // updated 5.35 hotfix HousingUpdateObjectPosition = 0x00D5, // updated 5.35 hotfix + HousingEditExterior = 0x0098, // updated 5.35 hotfix SetSharedEstateSettings = 0x017B, // updated 5.0 diff --git a/src/common/Network/PacketDef/Zone/ClientZoneDef.h b/src/common/Network/PacketDef/Zone/ClientZoneDef.h index 19b4fff5..678a20f2 100644 --- a/src/common/Network/PacketDef/Zone/ClientZoneDef.h +++ b/src/common/Network/PacketDef/Zone/ClientZoneDef.h @@ -426,6 +426,18 @@ struct FFXIVIpcDive : uint32_t padding; }; +struct FFXIVIpcHousingEditExterior : + FFXIVIpcBasePacket< HousingEditExterior > +{ + uint16_t landId; + uint8_t unknown[6]; + uint8_t removeFlag; + uint8_t unknown2; + uint16_t container[9]; + uint16_t slot[9]; + uint16_t padding; +}; + } #endif //_CORE_NETWORK_PACKETS_ZONE_CLIENT_IPC_H diff --git a/src/world/Inventory/ItemContainer.cpp b/src/world/Inventory/ItemContainer.cpp index 46bedfb5..c150f1fd 100644 --- a/src/world/Inventory/ItemContainer.cpp +++ b/src/world/Inventory/ItemContainer.cpp @@ -92,7 +92,10 @@ Sapphire::ItemPtr Sapphire::ItemContainer::getItem( uint8_t slotId ) void Sapphire::ItemContainer::setItem( uint8_t slotId, ItemPtr pItem ) { if( slotId > m_size ) + { + Logger::error( "Slot out of range {0}", slotId ); return; + } m_itemMap[ slotId ] = pItem; } diff --git a/src/world/Manager/HousingMgr.cpp b/src/world/Manager/HousingMgr.cpp index 9cd612bb..ae4228eb 100644 --- a/src/world/Manager/HousingMgr.cpp +++ b/src/world/Manager/HousingMgr.cpp @@ -702,10 +702,12 @@ void Sapphire::World::Manager::HousingMgr::buildPresetEstate( Entity::Player& pl pLand->updateLandDb(); - // start house built event + // start house built event - disabled because it fucks your audio device // CmnDefHousingBuildHouse_00149 - player.eventStart( player.getId(), 0x000B0095, Event::EventHandler::EventType::Housing, 1, 1 ); - player.playScene( 0x000B0095, 0, static_cast< uint32_t >( SET_BASE | HIDE_HOTBAR ) , 0, 1, plotNum, nullptr ); + //player.eventStart( player.getId(), 0x000B0095, Event::EventHandler::EventType::Housing, 1, 1 ); + //player.playScene( 0x000B0095, 0, static_cast< uint32_t >( SET_BASE | HIDE_HOTBAR ) , 0, 1, plotNum, nullptr ); + // instead we do a fake zone to unlock the client + Common::Service< TerritoryMgr >::ref().movePlayer( player.getCurrentTerritory(), player.getAsPlayer() ); player.setLandFlags( LandFlagsSlot::Private, EstateBuilt, ident ); player.sendLandFlagsSlot( LandFlagsSlot::Private ); @@ -903,6 +905,8 @@ void Sapphire::World::Manager::HousingMgr::updateHouseModels( Sapphire::HousePtr { assert( house ); + house->clearModelCache(); + auto& containers = getEstateInventory( house->getLandIdent() ); auto extContainer = containers.find( static_cast< uint16_t >( InventoryType::HousingExteriorAppearance ) ); @@ -1627,3 +1631,59 @@ Sapphire::Inventory::HousingItemPtr Sapphire::World::Manager::HousingMgr::getHou return Inventory::make_HousingItem( tmpItem->getUId(), tmpItem->getId() ); } + +void Sapphire::World::Manager::HousingMgr::editExterior( Sapphire::Entity::Player& player, uint16_t plot, std::vector< uint16_t > containerList, std::vector< uint8_t> slotList, uint8_t removeFlag ) +{ + auto terri = std::dynamic_pointer_cast< HousingZone >( player.getCurrentTerritory() ); + if( !terri ) + return; + + auto land = terri->getLand( static_cast< uint8_t >( plot ) ); + if( !land ) + return; + + if( !hasPermission( player, *land, 0 ) ) + return; + + auto& exteriorAppearenceContainer = getEstateInventory( land->getLandIdent() )[ InventoryType::HousingExteriorAppearance ]; + + auto& invMgr = Service< InventoryMgr >::ref(); + + for( int i = 0; i < 9; i++ ) + { + auto container = containerList.at( i ); + auto slot = slotList.at( i ); + if( container == 0x270F || slot == 0xFF ) + { + if( i >= 5 ) + { + auto removed = ( ( removeFlag >> ( i - 5 ) ) & 1 ) > 0; + if( removed ) + { + auto oldItem = exteriorAppearenceContainer->getItem( i ); + if( oldItem ) + { + exteriorAppearenceContainer->removeItem( i ); + invMgr.removeItemFromHousingContainer( land->getLandIdent(), exteriorAppearenceContainer->getId(), i ); + player.addItem( oldItem, false, false, false ); + } + } + } + continue; + } + auto item = getHousingItemFromPlayer( player, static_cast< Sapphire::Common::InventoryType >( container ), slot ); + if( item ) + { + auto oldItem = exteriorAppearenceContainer->getItem( i ); + exteriorAppearenceContainer->setItem( i, item ); + if( oldItem ) + { + player.insertInventoryItem( static_cast< Sapphire::Common::InventoryType >( container ), slot, oldItem ); + } + } + } + invMgr.sendInventoryContainer( player, exteriorAppearenceContainer ); + invMgr.saveHousingContainer( land->getLandIdent(), exteriorAppearenceContainer ); + updateHouseModels( land->getHouse() ); + std::dynamic_pointer_cast< HousingZone >( player.getCurrentTerritory() )->sendLandUpdate( plot ); +} \ No newline at end of file diff --git a/src/world/Manager/HousingMgr.h b/src/world/Manager/HousingMgr.h index b810354f..17dff202 100644 --- a/src/world/Manager/HousingMgr.h +++ b/src/world/Manager/HousingMgr.h @@ -181,6 +181,8 @@ namespace Sapphire::World::Manager bool hasPermission( Entity::Player& player, Land& land, uint32_t permission ); + void editExterior( Sapphire::Entity::Player& player, uint16_t plot, std::vector< uint16_t > containerList, std::vector< uint8_t > slotList, uint8_t removeFlag ); + private: Inventory::HousingItemPtr getHousingItemFromPlayer( Entity::Player& player, Common::InventoryType type, uint8_t slot ); diff --git a/src/world/Manager/InventoryMgr.cpp b/src/world/Manager/InventoryMgr.cpp index b4c3759e..722100d7 100644 --- a/src/world/Manager/InventoryMgr.cpp +++ b/src/world/Manager/InventoryMgr.cpp @@ -143,15 +143,15 @@ void Sapphire::World::Manager::InventoryMgr::updateHousingItemPosition( Sapphire stmt->setUInt64( 1, item->getUId() ); - stmt->setUInt( 2, pos.x ); - stmt->setUInt( 3, pos.y ); - stmt->setUInt( 4, pos.z ); - stmt->setInt( 5, rot ); + stmt->setDouble( 2, static_cast< double >( pos.x ) ); + stmt->setDouble( 3, static_cast< double >( pos.y ) ); + stmt->setDouble( 4, static_cast< double >( pos.z ) ); + stmt->setDouble( 5, static_cast< double >( rot ) ); - stmt->setUInt( 6, pos.x ); - stmt->setUInt( 7, pos.y ); - stmt->setUInt( 8, pos.z ); - stmt->setInt( 9, rot ); + stmt->setDouble( 6, static_cast< double >( pos.x ) ); + stmt->setDouble( 7, static_cast< double >( pos.y ) ); + stmt->setDouble( 8, static_cast< double >( pos.z ) ); + stmt->setDouble( 9, static_cast< double >( rot ) ); db.execute( stmt ); } diff --git a/src/world/Manager/TerritoryMgr.cpp b/src/world/Manager/TerritoryMgr.cpp index 7997cdc4..50711549 100644 --- a/src/world/Manager/TerritoryMgr.cpp +++ b/src/world/Manager/TerritoryMgr.cpp @@ -540,6 +540,7 @@ void Sapphire::World::Manager::TerritoryMgr::updateTerritoryInstances( uint64_t // remove zone from maps m_territorySet.erase( zone ); + m_guIdToTerritoryPtrMap.erase( zone->getGuId() ); it = m_landIdentToTerritoryPtrMap.erase( it ); } else @@ -627,14 +628,27 @@ bool Sapphire::World::Manager::TerritoryMgr::movePlayer( TerritoryPtr pZone, Sap // mark character as zoning in progress pPlayer->setLoadingComplete( false ); + bool zoneChanged = true; if( pPlayer->getLastPing() != 0 && pPlayer->getCurrentTerritory() ) - pPlayer->getCurrentTerritory()->removeActor( pPlayer ); + { + zoneChanged = pPlayer->getCurrentTerritory()->getGuId() != pZone->getGuId(); + if( zoneChanged ) + pPlayer->getCurrentTerritory()->removeActor( pPlayer ); + } - pPlayer->setCurrentZone( pZone ); - pZone->pushActor( pPlayer ); + if( zoneChanged ) + { + pPlayer->setCurrentZone( pZone ); + pZone->pushActor( pPlayer ); - // map player to instanceId so it can be tracked. - m_playerIdToInstanceMap[ pPlayer->getId() ] = pZone->getGuId(); + // map player to instanceId so it can be tracked. + m_playerIdToInstanceMap[ pPlayer->getId() ] = pZone->getGuId(); + } + else + { + pPlayer->removeFromInRange(); + pPlayer->clearInRangeSet(); + } pPlayer->sendZonePackets(); diff --git a/src/world/Network/GameConnection.cpp b/src/world/Network/GameConnection.cpp index 82b401ee..95ac30c4 100644 --- a/src/world/Network/GameConnection.cpp +++ b/src/world/Network/GameConnection.cpp @@ -90,6 +90,7 @@ Sapphire::Network::GameConnection::GameConnection( Sapphire::Network::HivePtr pH setZoneHandler( ClientZoneIpcType::ReqPlaceHousingItem, "ReqPlaceHousingItem", &GameConnection::reqPlaceHousingItem ); setZoneHandler( ClientZoneIpcType::HousingUpdateObjectPosition, "HousingUpdateObjectPosition", &GameConnection::reqMoveHousingItem ); + setZoneHandler( ClientZoneIpcType::HousingEditExterior, "HousingEditExterior", &GameConnection::housingEditExterior ); setZoneHandler( ClientZoneIpcType::TalkEventHandler, "EventHandlerTalk", &GameConnection::eventHandlerTalk ); setZoneHandler( ClientZoneIpcType::EmoteEventHandler, "EventHandlerEmote", &GameConnection::eventHandlerEmote ); diff --git a/src/world/Network/GameConnection.h b/src/world/Network/GameConnection.h index 8a3aabc0..84c9a1c0 100644 --- a/src/world/Network/GameConnection.h +++ b/src/world/Network/GameConnection.h @@ -181,6 +181,8 @@ namespace Sapphire::Network DECLARE_HANDLER( reqMoveHousingItem ); + DECLARE_HANDLER( housingEditExterior ); + DECLARE_HANDLER( marketBoardSearch ); DECLARE_HANDLER( marketBoardRequestItemInfo ); diff --git a/src/world/Network/Handlers/PacketHandlers.cpp b/src/world/Network/Handlers/PacketHandlers.cpp index af472089..35fd8b10 100644 --- a/src/world/Network/Handlers/PacketHandlers.cpp +++ b/src/world/Network/Handlers/PacketHandlers.cpp @@ -691,6 +691,23 @@ void Sapphire::Network::GameConnection::reqMoveHousingItem( const Packets::FFXIV housingMgr.reqMoveHousingItem( player, data.ident, data.slot, data.pos, data.rotation ); } +void Sapphire::Network::GameConnection::housingEditExterior( const Packets::FFXIVARR_PACKET_RAW& inPacket, Entity::Player& player ) +{ + auto& housingMgr = Common::Service< HousingMgr >::ref(); + const auto packet = ZoneChannelPacket< Client::FFXIVIpcHousingEditExterior >( inPacket ); + + std::vector< uint16_t > containerList; + std::vector< uint8_t > slotList; + for( int i = 0; i < 9; i++ ) + { + auto container = packet.data().container[i]; + containerList.push_back( container ); + slotList.push_back( container != 0x270F ? static_cast< uint8_t >( packet.data().slot[i] ) : 0xFF ); + } + + housingMgr.editExterior( player, packet.data().landId, containerList, slotList, packet.data().removeFlag ); +} + void Sapphire::Network::GameConnection::marketBoardSearch( const Packets::FFXIVARR_PACKET_RAW& inPacket, Entity::Player& player ) { diff --git a/src/world/Territory/House.cpp b/src/world/Territory/House.cpp index c5f44bc6..518021dc 100644 --- a/src/world/Territory/House.cpp +++ b/src/world/Territory/House.cpp @@ -64,6 +64,11 @@ Sapphire::House::ExteriorModelsArray const& Sapphire::House::getHouseModels() co return m_exteriorModelCache; } +void Sapphire::House::clearModelCache() +{ + m_exteriorModelCache.fill( std::make_pair( 0, 0 ) ); +} + const std::string& Sapphire::House::getHouseName() const { return m_estateName; diff --git a/src/world/Territory/House.h b/src/world/Territory/House.h index 9a3a3da0..6d195cd0 100644 --- a/src/world/Territory/House.h +++ b/src/world/Territory/House.h @@ -41,6 +41,8 @@ namespace Sapphire ExteriorModelsArray const& getHouseModels() const; + void clearModelCache(); + void updateHouseDb(); void setHasAetheryte( bool hasAetheryte ); diff --git a/src/world/Territory/Land.cpp b/src/world/Territory/Land.cpp index fe7f8771..bb16550c 100644 --- a/src/world/Territory/Land.cpp +++ b/src/world/Territory/Land.cpp @@ -240,5 +240,20 @@ void Sapphire::Land::update( uint64_t tickCount ) Sapphire::Land::InvMaxItemsPair Sapphire::Land::getInventoryItemMax() const { - return std::make_pair( m_maxPlacedExternalItems, m_maxPlacedInternalItems ); + switch( m_size ) + { + case HouseSize::Cottage: + { + return std::make_pair( 20, 200 ); + } + case HouseSize::House: + { + return std::make_pair( 30, 300 ); + } + case HouseSize::Mansion: + { + return std::make_pair( 40, 400 ); + } + } + assert( false ); } diff --git a/src/world/Territory/Land.h b/src/world/Territory/Land.h index 48f696e2..4cd2f522 100644 --- a/src/world/Territory/Land.h +++ b/src/world/Territory/Land.h @@ -86,10 +86,6 @@ namespace Sapphire Sapphire::HousePtr m_pHouse; - //item storage - uint16_t m_maxPlacedExternalItems; - uint16_t m_maxPlacedInternalItems; - //price uint32_t m_initPrice; uint32_t m_nextDrop; From a2ef0832bc8949765906dbf798ddf1283ded58c4 Mon Sep 17 00:00:00 2001 From: collett Date: Tue, 16 Feb 2021 17:47:13 +0900 Subject: [PATCH 02/43] 5.45 exd update --- src/common/Exd/ExdDataGenerated.cpp | 1680 ++++++++++++++++++--------- src/common/Exd/ExdDataGenerated.h | 287 ++++- 2 files changed, 1353 insertions(+), 614 deletions(-) diff --git a/src/common/Exd/ExdDataGenerated.cpp b/src/common/Exd/ExdDataGenerated.cpp index fd44e942..ca3d835a 100644 --- a/src/common/Exd/ExdDataGenerated.cpp +++ b/src/common/Exd/ExdDataGenerated.cpp @@ -342,6 +342,7 @@ Sapphire::Data::AirshipExplorationParamType::AirshipExplorationParamType( uint32 Sapphire::Data::AirshipExplorationPart::AirshipExplorationPart( uint32_t row_id, Sapphire::Data::ExdDataGenerated* exdData ) { auto row = exdData->m_AirshipExplorationPartDat.get_row( row_id ); + slot = exdData->getField< uint8_t >( row, 0 ); rank = exdData->getField< uint8_t >( row, 1 ); components = exdData->getField< uint8_t >( row, 2 ); surveillance = exdData->getField< int16_t >( row, 3 ); @@ -349,6 +350,7 @@ Sapphire::Data::AirshipExplorationPart::AirshipExplorationPart( uint32_t row_id, speed = exdData->getField< int16_t >( row, 5 ); range = exdData->getField< int16_t >( row, 6 ); favor = exdData->getField< int16_t >( row, 7 ); + _class = exdData->getField< uint16_t >( row, 8 ); repairMaterials = exdData->getField< uint8_t >( row, 9 ); } @@ -481,21 +483,36 @@ Sapphire::Data::AozActionTransient::AozActionTransient( uint32_t row_id, Sapphir icon = exdData->getField< uint32_t >( row, 1 ); stats = exdData->getField< std::string >( row, 2 ); description = exdData->getField< std::string >( row, 3 ); + locationKey = exdData->getField< uint8_t >( row, 4 ); location = exdData->getField< uint16_t >( row, 5 ); - startQuest = exdData->getField< uint32_t >( row, 6 ); - nextQuest = exdData->getField< uint32_t >( row, 7 ); + requiredForQuest = exdData->getField< uint32_t >( row, 6 ); + previousQuest = exdData->getField< uint32_t >( row, 7 ); + targetsEnemy = exdData->getField< bool >( row, 8 ); + targetsSelfOrAlly = exdData->getField< bool >( row, 9 ); + causeSlow = exdData->getField< bool >( row, 10 ); + causePetrify = exdData->getField< bool >( row, 11 ); + causeParalysis = exdData->getField< bool >( row, 12 ); + causeInterrupt = exdData->getField< bool >( row, 13 ); + causeBlind = exdData->getField< bool >( row, 14 ); + causeStun = exdData->getField< bool >( row, 15 ); + causeSleep = exdData->getField< bool >( row, 16 ); + causeBind = exdData->getField< bool >( row, 17 ); + causeHeavy = exdData->getField< bool >( row, 18 ); + causeDeath = exdData->getField< bool >( row, 19 ); } Sapphire::Data::AOZArrangement::AOZArrangement( uint32_t row_id, uint32_t subRow, Sapphire::Data::ExdDataGenerated* exdData ) { auto row = exdData->m_AOZArrangementDat.get_row( row_id, subRow ); aOZContentBriefingBNpc = exdData->getField< uint16_t >( row, 0 ); + position = exdData->getField< uint16_t >( row, 1 ); } Sapphire::Data::AOZBoss::AOZBoss( uint32_t row_id, Sapphire::Data::ExdDataGenerated* exdData ) { auto row = exdData->m_AOZBossDat.get_row( row_id ); boss = exdData->getField< uint16_t >( row, 0 ); + position = exdData->getField< uint16_t >( row, 1 ); } Sapphire::Data::AOZContent::AOZContent( uint32_t row_id, Sapphire::Data::ExdDataGenerated* exdData ) @@ -525,6 +542,7 @@ Sapphire::Data::AOZContentBriefingBNpc::AOZContentBriefingBNpc( uint32_t row_id, bNpcName = exdData->getField< uint32_t >( row, 0 ); targetSmall = exdData->getField< uint32_t >( row, 1 ); targetLarge = exdData->getField< uint32_t >( row, 2 ); + hideStats = exdData->getField< bool >( row, 3 ); endurance = exdData->getField< uint8_t >( row, 4 ); fire = exdData->getField< uint8_t >( row, 5 ); ice = exdData->getField< uint8_t >( row, 6 ); @@ -536,16 +554,16 @@ Sapphire::Data::AOZContentBriefingBNpc::AOZContentBriefingBNpc( uint32_t row_id, piercing = exdData->getField< uint8_t >( row, 12 ); blunt = exdData->getField< uint8_t >( row, 13 ); magic = exdData->getField< uint8_t >( row, 14 ); - slowResistance = exdData->getField< bool >( row, 15 ); - petrificationResistance = exdData->getField< bool >( row, 16 ); - paralysisResistance = exdData->getField< bool >( row, 17 ); - silenceResistance = exdData->getField< bool >( row, 18 ); - blindResistance = exdData->getField< bool >( row, 19 ); - stunResistance = exdData->getField< bool >( row, 20 ); - sleepResistance = exdData->getField< bool >( row, 21 ); - bindResistance = exdData->getField< bool >( row, 22 ); - heavyResistance = exdData->getField< bool >( row, 23 ); - instaDeathResistance = exdData->getField< bool >( row, 24 ); + slowVuln = exdData->getField< bool >( row, 15 ); + petrificationVuln = exdData->getField< bool >( row, 16 ); + paralysisVuln = exdData->getField< bool >( row, 17 ); + interruptionVuln = exdData->getField< bool >( row, 18 ); + blindVuln = exdData->getField< bool >( row, 19 ); + stunVuln = exdData->getField< bool >( row, 20 ); + sleepVuln = exdData->getField< bool >( row, 21 ); + bindVuln = exdData->getField< bool >( row, 22 ); + heavyVuln = exdData->getField< bool >( row, 23 ); + flatOrDeathVuln = exdData->getField< bool >( row, 24 ); } Sapphire::Data::AquariumFish::AquariumFish( uint32_t row_id, Sapphire::Data::ExdDataGenerated* exdData ) @@ -1076,6 +1094,7 @@ Sapphire::Data::BuddyEquip::BuddyEquip( uint32_t row_id, Sapphire::Data::ExdData iconHead = exdData->getField< uint16_t >( row, 13 ); iconBody = exdData->getField< uint16_t >( row, 14 ); iconLegs = exdData->getField< uint16_t >( row, 15 ); + order = exdData->getField< uint8_t >( row, 16 ); } Sapphire::Data::BuddyItem::BuddyItem( uint32_t row_id, Sapphire::Data::ExdDataGenerated* exdData ) @@ -1605,6 +1624,7 @@ Sapphire::Data::ClassJob::ClassJob( uint32_t row_id, Sapphire::Data::ExdDataGene expArrayIndex = exdData->getField< int8_t >( row, 4 ); battleClassIndex = exdData->getField< int8_t >( row, 5 ); jobIndex = exdData->getField< uint8_t >( row, 7 ); + dohDolJobIndex = exdData->getField< int8_t >( row, 8 ); modifierHitPoints = exdData->getField< uint16_t >( row, 9 ); modifierManaPoints = exdData->getField< uint16_t >( row, 10 ); modifierStrength = exdData->getField< uint16_t >( row, 11 ); @@ -2045,26 +2065,28 @@ Sapphire::Data::ContentFinderCondition::ContentFinderCondition( uint32_t row_id, addedIn53 = exdData->getField< bool >( row, 19 ); allowUndersized = exdData->getField< bool >( row, 20 ); allowReplacement = exdData->getField< bool >( row, 21 ); - highEndDuty = exdData->getField< bool >( row, 27 ); - dutyRecorderAllowed = exdData->getField< bool >( row, 31 ); - name = exdData->getField< std::string >( row, 36 ); - contentType = exdData->getField< uint8_t >( row, 37 ); - transientKey = exdData->getField< uint8_t >( row, 38 ); - transient = exdData->getField< uint32_t >( row, 39 ); - sortKey = exdData->getField< uint16_t >( row, 40 ); - image = exdData->getField< uint32_t >( row, 41 ); - icon = exdData->getField< uint32_t >( row, 42 ); - levelingRoulette = exdData->getField< bool >( row, 44 ); - level5060Roulette = exdData->getField< bool >( row, 45 ); - mSQRoulette = exdData->getField< bool >( row, 46 ); - guildHestRoulette = exdData->getField< bool >( row, 47 ); - expertRoulette = exdData->getField< bool >( row, 48 ); - trialRoulette = exdData->getField< bool >( row, 49 ); - dailyFrontlineChallenge = exdData->getField< bool >( row, 50 ); - level70Roulette = exdData->getField< bool >( row, 51 ); - mentorRoulette = exdData->getField< bool >( row, 52 ); - allianceRoulette = exdData->getField< bool >( row, 58 ); - normalRaidRoulette = exdData->getField< bool >( row, 60 ); + allowExplorerMode = exdData->getField< bool >( row, 23 ); + unknown54 = exdData->getField< bool >( row, 25 ); + highEndDuty = exdData->getField< bool >( row, 28 ); + dutyRecorderAllowed = exdData->getField< bool >( row, 32 ); + name = exdData->getField< std::string >( row, 37 ); + contentType = exdData->getField< uint8_t >( row, 38 ); + transientKey = exdData->getField< uint8_t >( row, 39 ); + transient = exdData->getField< uint32_t >( row, 40 ); + sortKey = exdData->getField< uint16_t >( row, 41 ); + image = exdData->getField< uint32_t >( row, 42 ); + icon = exdData->getField< uint32_t >( row, 43 ); + levelingRoulette = exdData->getField< bool >( row, 45 ); + level506070Roulette = exdData->getField< bool >( row, 46 ); + mSQRoulette = exdData->getField< bool >( row, 47 ); + guildHestRoulette = exdData->getField< bool >( row, 48 ); + expertRoulette = exdData->getField< bool >( row, 49 ); + trialRoulette = exdData->getField< bool >( row, 50 ); + dailyFrontlineChallenge = exdData->getField< bool >( row, 51 ); + level80Roulette = exdData->getField< bool >( row, 52 ); + mentorRoulette = exdData->getField< bool >( row, 53 ); + allianceRoulette = exdData->getField< bool >( row, 59 ); + normalRaidRoulette = exdData->getField< bool >( row, 61 ); } Sapphire::Data::ContentFinderConditionTransient::ContentFinderConditionTransient( uint32_t row_id, Sapphire::Data::ExdDataGenerated* exdData ) @@ -2096,6 +2118,7 @@ Sapphire::Data::ContentMemberType::ContentMemberType( uint32_t row_id, Sapphire: healersPerParty = exdData->getField< uint8_t >( row, 10 ); meleesPerParty = exdData->getField< uint8_t >( row, 11 ); rangedPerParty = exdData->getField< uint8_t >( row, 12 ); + unknown54 = exdData->getField< uint8_t >( row, 13 ); } Sapphire::Data::ContentNpcTalk::ContentNpcTalk( uint32_t row_id, Sapphire::Data::ExdDataGenerated* exdData ) @@ -2122,22 +2145,23 @@ Sapphire::Data::ContentRoulette::ContentRoulette( uint32_t row_id, Sapphire::Dat { auto row = exdData->m_ContentRouletteDat.get_row( row_id ); name = exdData->getField< std::string >( row, 0 ); - description = exdData->getField< std::string >( row, 2 ); - dutyType = exdData->getField< std::string >( row, 3 ); - isInDutyFinder = exdData->getField< bool >( row, 6 ); - openRule = exdData->getField< bool >( row, 7 ); - requiredLevel = exdData->getField< bool >( row, 9 ); - itemLevelRequired = exdData->getField< uint8_t >( row, 11 ); - icon = exdData->getField< uint16_t >( row, 13 ); - contentRouletteRoleBonus = exdData->getField< uint32_t >( row, 14 ); - rewardTomeA = exdData->getField< uint8_t >( row, 15 ); - rewardTomeB = exdData->getField< uint16_t >( row, 16 ); - rewardTomeC = exdData->getField< uint16_t >( row, 17 ); - sortKey = exdData->getField< uint16_t >( row, 20 ); - contentMemberType = exdData->getField< uint8_t >( row, 22 ); - requireAllDuties = exdData->getField< bool >( row, 32 ); - contentRouletteOpenRule = exdData->getField< bool >( row, 34 ); - instanceContent = exdData->getField< uint8_t >( row, 35 ); + category = exdData->getField< std::string >( row, 1 ); + description = exdData->getField< std::string >( row, 3 ); + dutyType = exdData->getField< std::string >( row, 4 ); + isInDutyFinder = exdData->getField< bool >( row, 8 ); + openRule = exdData->getField< uint8_t >( row, 9 ); + requiredLevel = exdData->getField< uint8_t >( row, 11 ); + itemLevelRequired = exdData->getField< uint16_t >( row, 13 ); + icon = exdData->getField< uint32_t >( row, 15 ); + contentRouletteRoleBonus = exdData->getField< uint8_t >( row, 16 ); + rewardTomeA = exdData->getField< uint16_t >( row, 17 ); + rewardTomeB = exdData->getField< uint16_t >( row, 18 ); + rewardTomeC = exdData->getField< uint16_t >( row, 19 ); + sortKey = exdData->getField< uint8_t >( row, 22 ); + contentMemberType = exdData->getField< uint8_t >( row, 24 ); + requireAllDuties = exdData->getField< bool >( row, 34 ); + contentRouletteOpenRule = exdData->getField< uint8_t >( row, 36 ); + instanceContent = exdData->getField< uint16_t >( row, 37 ); } Sapphire::Data::ContentRouletteOpenRule::ContentRouletteOpenRule( uint32_t row_id, Sapphire::Data::ExdDataGenerated* exdData ) @@ -2172,6 +2196,28 @@ Sapphire::Data::ContentsNote::ContentsNote( uint32_t row_id, Sapphire::Data::Exd expCap = exdData->getField< int32_t >( row, 13 ); } +Sapphire::Data::ContentsTutorial::ContentsTutorial( uint32_t row_id, Sapphire::Data::ExdDataGenerated* exdData ) +{ + auto row = exdData->m_ContentsTutorialDat.get_row( row_id ); + name = exdData->getField< std::string >( row, 0 ); + description = exdData->getField< std::string >( row, 1 ); + page.push_back( exdData->getField< int32_t >( row, 2 ) ); + page.push_back( exdData->getField< int32_t >( row, 3 ) ); + page.push_back( exdData->getField< int32_t >( row, 4 ) ); + page.push_back( exdData->getField< int32_t >( row, 5 ) ); + page.push_back( exdData->getField< int32_t >( row, 6 ) ); + page.push_back( exdData->getField< int32_t >( row, 7 ) ); + page.push_back( exdData->getField< int32_t >( row, 8 ) ); + page.push_back( exdData->getField< int32_t >( row, 9 ) ); +} + +Sapphire::Data::ContentsTutorialPage::ContentsTutorialPage( uint32_t row_id, Sapphire::Data::ExdDataGenerated* exdData ) +{ + auto row = exdData->m_ContentsTutorialPageDat.get_row( row_id ); + image = exdData->getField< int32_t >( row, 0 ); + description = exdData->getField< std::string >( row, 1 ); +} + Sapphire::Data::ContentTalk::ContentTalk( uint32_t row_id, Sapphire::Data::ExdDataGenerated* exdData ) { auto row = exdData->m_ContentTalkDat.get_row( row_id ); @@ -2260,7 +2306,8 @@ Sapphire::Data::Credit::Credit( uint32_t row_id, uint32_t subRow, Sapphire::Data Sapphire::Data::CreditBackImage::CreditBackImage( uint32_t row_id, uint32_t subRow, Sapphire::Data::ExdDataGenerated* exdData ) { auto row = exdData->m_CreditBackImageDat.get_row( row_id, subRow ); - backImage = exdData->getField< uint32_t >( row, 2 ); + unknown54 = exdData->getField< bool >( row, 2 ); + backImage = exdData->getField< uint32_t >( row, 3 ); } Sapphire::Data::CreditCast::CreditCast( uint32_t row_id, Sapphire::Data::ExdDataGenerated* exdData ) @@ -2284,13 +2331,6 @@ Sapphire::Data::CreditListText::CreditListText( uint32_t row_id, Sapphire::Data: name = exdData->getField< std::string >( row, 0 ); } -Sapphire::Data::Currency::Currency( uint32_t row_id, Sapphire::Data::ExdDataGenerated* exdData ) -{ - auto row = exdData->m_CurrencyDat.get_row( row_id ); - item = exdData->getField< uint32_t >( row, 0 ); - limit = exdData->getField< uint32_t >( row, 3 ); -} - Sapphire::Data::CustomTalk::CustomTalk( uint32_t row_id, Sapphire::Data::ExdDataGenerated* exdData ) { auto row = exdData->m_CustomTalkDat.get_row( row_id ); @@ -2358,6 +2398,7 @@ Sapphire::Data::CustomTalk::CustomTalk( uint32_t row_id, Sapphire::Data::ExdData scriptArg.push_back( exdData->getField< uint32_t >( row, 61 ) ); scriptArg.push_back( exdData->getField< uint32_t >( row, 62 ) ); text = exdData->getField< bool >( row, 66 ); + unknown54 = exdData->getField< bool >( row, 77 ); } Sapphire::Data::CustomTalkDynamicIcon::CustomTalkDynamicIcon( uint32_t row_id, uint32_t subRow, Sapphire::Data::ExdDataGenerated* exdData ) @@ -2809,6 +2850,7 @@ Sapphire::Data::Emote::Emote( uint32_t row_id, Sapphire::Data::ExdDataGenerated* emoteMode = exdData->getField< uint8_t >( row, 12 ); hasCancelEmote = exdData->getField< bool >( row, 15 ); drawsWeapon = exdData->getField< bool >( row, 16 ); + order = exdData->getField< uint16_t >( row, 17 ); textCommand = exdData->getField< int32_t >( row, 18 ); icon = exdData->getField< uint16_t >( row, 19 ); logMessageTargeted = exdData->getField< uint16_t >( row, 20 ); @@ -3591,7 +3633,7 @@ Sapphire::Data::GatheringItem::GatheringItem( uint32_t row_id, Sapphire::Data::E auto row = exdData->m_GatheringItemDat.get_row( row_id ); item = exdData->getField< int32_t >( row, 0 ); gatheringItemLevel = exdData->getField< uint16_t >( row, 1 ); - isHidden = exdData->getField< uint32_t >( row, 3 ); + isHidden = exdData->getField< bool >( row, 4 ); } Sapphire::Data::GatheringItemLevelConvertTable::GatheringItemLevelConvertTable( uint32_t row_id, Sapphire::Data::ExdDataGenerated* exdData ) @@ -3783,7 +3825,8 @@ Sapphire::Data::GatheringPointBonus::GatheringPointBonus( uint32_t row_id, Sapph conditionValue = exdData->getField< uint32_t >( row, 1 ); bonusType = exdData->getField< uint8_t >( row, 3 ); bonusValue = exdData->getField< uint16_t >( row, 4 ); - addedIn53 = exdData->getField< bool >( row, 6 ); + unknown53 = exdData->getField< bool >( row, 6 ); + unknown54 = exdData->getField< uint32_t >( row, 7 ); } Sapphire::Data::GatheringPointBonusType::GatheringPointBonusType( uint32_t row_id, Sapphire::Data::ExdDataGenerated* exdData ) @@ -4162,7 +4205,8 @@ Sapphire::Data::GroupPoseFrame::GroupPoseFrame( uint32_t row_id, Sapphire::Data: auto row = exdData->m_GroupPoseFrameDat.get_row( row_id ); image = exdData->getField< int32_t >( row, 1 ); gridText = exdData->getField< std::string >( row, 2 ); - text = exdData->getField< std::string >( row, 6 ); + unknown54 = exdData->getField< int32_t >( row, 6 ); + text = exdData->getField< std::string >( row, 7 ); } Sapphire::Data::GroupPoseStamp::GroupPoseStamp( uint32_t row_id, Sapphire::Data::ExdDataGenerated* exdData ) @@ -4170,7 +4214,9 @@ Sapphire::Data::GroupPoseStamp::GroupPoseStamp( uint32_t row_id, Sapphire::Data: auto row = exdData->m_GroupPoseStampDat.get_row( row_id ); stampIcon = exdData->getField< int32_t >( row, 0 ); category = exdData->getField< int32_t >( row, 2 ); - name = exdData->getField< std::string >( row, 6 ); + unknown540 = exdData->getField< int32_t >( row, 4 ); + unknown541 = exdData->getField< bool >( row, 5 ); + name = exdData->getField< std::string >( row, 8 ); } Sapphire::Data::GroupPoseStampCategory::GroupPoseStampCategory( uint32_t row_id, Sapphire::Data::ExdDataGenerated* exdData ) @@ -4680,12 +4726,12 @@ Sapphire::Data::HWDCrafterSupply::HWDCrafterSupply( uint32_t row_id, Sapphire::D itemTradeIn.push_back( exdData->getField< uint32_t >( row, 14 ) ); itemTradeIn.push_back( exdData->getField< uint32_t >( row, 15 ) ); itemTradeIn.push_back( exdData->getField< uint32_t >( row, 16 ) ); - level.push_back( exdData->getField< uint8_t >( row, 17 ) ); - level.push_back( exdData->getField< uint8_t >( row, 18 ) ); - level.push_back( exdData->getField< uint8_t >( row, 19 ) ); - level.push_back( exdData->getField< uint8_t >( row, 20 ) ); - level.push_back( exdData->getField< uint8_t >( row, 21 ) ); - level.push_back( exdData->getField< uint8_t >( row, 22 ) ); + itemTradeIn.push_back( exdData->getField< uint32_t >( row, 17 ) ); + itemTradeIn.push_back( exdData->getField< uint32_t >( row, 18 ) ); + itemTradeIn.push_back( exdData->getField< uint32_t >( row, 19 ) ); + itemTradeIn.push_back( exdData->getField< uint32_t >( row, 20 ) ); + itemTradeIn.push_back( exdData->getField< uint32_t >( row, 21 ) ); + itemTradeIn.push_back( exdData->getField< uint32_t >( row, 22 ) ); level.push_back( exdData->getField< uint8_t >( row, 23 ) ); level.push_back( exdData->getField< uint8_t >( row, 24 ) ); level.push_back( exdData->getField< uint8_t >( row, 25 ) ); @@ -4697,142 +4743,271 @@ Sapphire::Data::HWDCrafterSupply::HWDCrafterSupply( uint32_t row_id, Sapphire::D level.push_back( exdData->getField< uint8_t >( row, 31 ) ); level.push_back( exdData->getField< uint8_t >( row, 32 ) ); level.push_back( exdData->getField< uint8_t >( row, 33 ) ); - levelMax.push_back( exdData->getField< uint8_t >( row, 34 ) ); - levelMax.push_back( exdData->getField< uint8_t >( row, 35 ) ); - levelMax.push_back( exdData->getField< uint8_t >( row, 36 ) ); - levelMax.push_back( exdData->getField< uint8_t >( row, 37 ) ); - levelMax.push_back( exdData->getField< uint8_t >( row, 38 ) ); - levelMax.push_back( exdData->getField< uint8_t >( row, 39 ) ); - levelMax.push_back( exdData->getField< uint8_t >( row, 40 ) ); - levelMax.push_back( exdData->getField< uint8_t >( row, 41 ) ); - levelMax.push_back( exdData->getField< uint8_t >( row, 42 ) ); - levelMax.push_back( exdData->getField< uint8_t >( row, 43 ) ); - levelMax.push_back( exdData->getField< uint8_t >( row, 44 ) ); - levelMax.push_back( exdData->getField< uint8_t >( row, 45 ) ); + level.push_back( exdData->getField< uint8_t >( row, 34 ) ); + level.push_back( exdData->getField< uint8_t >( row, 35 ) ); + level.push_back( exdData->getField< uint8_t >( row, 36 ) ); + level.push_back( exdData->getField< uint8_t >( row, 37 ) ); + level.push_back( exdData->getField< uint8_t >( row, 38 ) ); + level.push_back( exdData->getField< uint8_t >( row, 39 ) ); + level.push_back( exdData->getField< uint8_t >( row, 40 ) ); + level.push_back( exdData->getField< uint8_t >( row, 41 ) ); + level.push_back( exdData->getField< uint8_t >( row, 42 ) ); + level.push_back( exdData->getField< uint8_t >( row, 43 ) ); + level.push_back( exdData->getField< uint8_t >( row, 44 ) ); + level.push_back( exdData->getField< uint8_t >( row, 45 ) ); levelMax.push_back( exdData->getField< uint8_t >( row, 46 ) ); levelMax.push_back( exdData->getField< uint8_t >( row, 47 ) ); levelMax.push_back( exdData->getField< uint8_t >( row, 48 ) ); levelMax.push_back( exdData->getField< uint8_t >( row, 49 ) ); levelMax.push_back( exdData->getField< uint8_t >( row, 50 ) ); - baseCollectableRating.push_back( exdData->getField< uint16_t >( row, 68 ) ); - baseCollectableRating.push_back( exdData->getField< uint16_t >( row, 69 ) ); - baseCollectableRating.push_back( exdData->getField< uint16_t >( row, 70 ) ); - baseCollectableRating.push_back( exdData->getField< uint16_t >( row, 71 ) ); - baseCollectableRating.push_back( exdData->getField< uint16_t >( row, 72 ) ); - baseCollectableRating.push_back( exdData->getField< uint16_t >( row, 73 ) ); - baseCollectableRating.push_back( exdData->getField< uint16_t >( row, 74 ) ); - baseCollectableRating.push_back( exdData->getField< uint16_t >( row, 75 ) ); - baseCollectableRating.push_back( exdData->getField< uint16_t >( row, 76 ) ); - baseCollectableRating.push_back( exdData->getField< uint16_t >( row, 77 ) ); - baseCollectableRating.push_back( exdData->getField< uint16_t >( row, 78 ) ); - baseCollectableRating.push_back( exdData->getField< uint16_t >( row, 79 ) ); - baseCollectableRating.push_back( exdData->getField< uint16_t >( row, 80 ) ); - baseCollectableRating.push_back( exdData->getField< uint16_t >( row, 81 ) ); - baseCollectableRating.push_back( exdData->getField< uint16_t >( row, 82 ) ); - baseCollectableRating.push_back( exdData->getField< uint16_t >( row, 83 ) ); - baseCollectableRating.push_back( exdData->getField< uint16_t >( row, 84 ) ); - midCollectableRating.push_back( exdData->getField< uint16_t >( row, 85 ) ); - midCollectableRating.push_back( exdData->getField< uint16_t >( row, 86 ) ); - midCollectableRating.push_back( exdData->getField< uint16_t >( row, 87 ) ); - midCollectableRating.push_back( exdData->getField< uint16_t >( row, 88 ) ); - midCollectableRating.push_back( exdData->getField< uint16_t >( row, 89 ) ); - midCollectableRating.push_back( exdData->getField< uint16_t >( row, 90 ) ); - midCollectableRating.push_back( exdData->getField< uint16_t >( row, 91 ) ); - midCollectableRating.push_back( exdData->getField< uint16_t >( row, 92 ) ); - midCollectableRating.push_back( exdData->getField< uint16_t >( row, 93 ) ); - midCollectableRating.push_back( exdData->getField< uint16_t >( row, 94 ) ); - midCollectableRating.push_back( exdData->getField< uint16_t >( row, 95 ) ); - midCollectableRating.push_back( exdData->getField< uint16_t >( row, 96 ) ); - midCollectableRating.push_back( exdData->getField< uint16_t >( row, 97 ) ); - midCollectableRating.push_back( exdData->getField< uint16_t >( row, 98 ) ); - midCollectableRating.push_back( exdData->getField< uint16_t >( row, 99 ) ); - midCollectableRating.push_back( exdData->getField< uint16_t >( row, 100 ) ); - midCollectableRating.push_back( exdData->getField< uint16_t >( row, 101 ) ); - highCollectableRating.push_back( exdData->getField< uint16_t >( row, 102 ) ); - highCollectableRating.push_back( exdData->getField< uint16_t >( row, 103 ) ); - highCollectableRating.push_back( exdData->getField< uint16_t >( row, 104 ) ); - highCollectableRating.push_back( exdData->getField< uint16_t >( row, 105 ) ); - highCollectableRating.push_back( exdData->getField< uint16_t >( row, 106 ) ); - highCollectableRating.push_back( exdData->getField< uint16_t >( row, 107 ) ); - highCollectableRating.push_back( exdData->getField< uint16_t >( row, 108 ) ); - highCollectableRating.push_back( exdData->getField< uint16_t >( row, 109 ) ); - highCollectableRating.push_back( exdData->getField< uint16_t >( row, 110 ) ); - highCollectableRating.push_back( exdData->getField< uint16_t >( row, 111 ) ); - highCollectableRating.push_back( exdData->getField< uint16_t >( row, 112 ) ); - highCollectableRating.push_back( exdData->getField< uint16_t >( row, 113 ) ); - highCollectableRating.push_back( exdData->getField< uint16_t >( row, 114 ) ); - highCollectableRating.push_back( exdData->getField< uint16_t >( row, 115 ) ); - highCollectableRating.push_back( exdData->getField< uint16_t >( row, 116 ) ); - highCollectableRating.push_back( exdData->getField< uint16_t >( row, 117 ) ); - highCollectableRating.push_back( exdData->getField< uint16_t >( row, 118 ) ); - baseCollectableReward.push_back( exdData->getField< uint16_t >( row, 119 ) ); - baseCollectableReward.push_back( exdData->getField< uint16_t >( row, 120 ) ); - baseCollectableReward.push_back( exdData->getField< uint16_t >( row, 121 ) ); - baseCollectableReward.push_back( exdData->getField< uint16_t >( row, 122 ) ); - baseCollectableReward.push_back( exdData->getField< uint16_t >( row, 123 ) ); - baseCollectableReward.push_back( exdData->getField< uint16_t >( row, 124 ) ); - baseCollectableReward.push_back( exdData->getField< uint16_t >( row, 125 ) ); - baseCollectableReward.push_back( exdData->getField< uint16_t >( row, 126 ) ); - baseCollectableReward.push_back( exdData->getField< uint16_t >( row, 127 ) ); - baseCollectableReward.push_back( exdData->getField< uint16_t >( row, 128 ) ); - baseCollectableReward.push_back( exdData->getField< uint16_t >( row, 129 ) ); - baseCollectableReward.push_back( exdData->getField< uint16_t >( row, 130 ) ); - baseCollectableReward.push_back( exdData->getField< uint16_t >( row, 131 ) ); - baseCollectableReward.push_back( exdData->getField< uint16_t >( row, 132 ) ); - baseCollectableReward.push_back( exdData->getField< uint16_t >( row, 133 ) ); - baseCollectableReward.push_back( exdData->getField< uint16_t >( row, 134 ) ); - baseCollectableReward.push_back( exdData->getField< uint16_t >( row, 135 ) ); - midCollectableReward.push_back( exdData->getField< uint16_t >( row, 136 ) ); - midCollectableReward.push_back( exdData->getField< uint16_t >( row, 137 ) ); - midCollectableReward.push_back( exdData->getField< uint16_t >( row, 138 ) ); - midCollectableReward.push_back( exdData->getField< uint16_t >( row, 139 ) ); - midCollectableReward.push_back( exdData->getField< uint16_t >( row, 140 ) ); - midCollectableReward.push_back( exdData->getField< uint16_t >( row, 141 ) ); - midCollectableReward.push_back( exdData->getField< uint16_t >( row, 142 ) ); - midCollectableReward.push_back( exdData->getField< uint16_t >( row, 143 ) ); - midCollectableReward.push_back( exdData->getField< uint16_t >( row, 144 ) ); - midCollectableReward.push_back( exdData->getField< uint16_t >( row, 145 ) ); - midCollectableReward.push_back( exdData->getField< uint16_t >( row, 146 ) ); - midCollectableReward.push_back( exdData->getField< uint16_t >( row, 147 ) ); - midCollectableReward.push_back( exdData->getField< uint16_t >( row, 148 ) ); - midCollectableReward.push_back( exdData->getField< uint16_t >( row, 149 ) ); - midCollectableReward.push_back( exdData->getField< uint16_t >( row, 150 ) ); - midCollectableReward.push_back( exdData->getField< uint16_t >( row, 151 ) ); - midCollectableReward.push_back( exdData->getField< uint16_t >( row, 152 ) ); - highCollectableReward.push_back( exdData->getField< uint16_t >( row, 153 ) ); - highCollectableReward.push_back( exdData->getField< uint16_t >( row, 154 ) ); - highCollectableReward.push_back( exdData->getField< uint16_t >( row, 155 ) ); - highCollectableReward.push_back( exdData->getField< uint16_t >( row, 156 ) ); - highCollectableReward.push_back( exdData->getField< uint16_t >( row, 157 ) ); - highCollectableReward.push_back( exdData->getField< uint16_t >( row, 158 ) ); - highCollectableReward.push_back( exdData->getField< uint16_t >( row, 159 ) ); - highCollectableReward.push_back( exdData->getField< uint16_t >( row, 160 ) ); - highCollectableReward.push_back( exdData->getField< uint16_t >( row, 161 ) ); - highCollectableReward.push_back( exdData->getField< uint16_t >( row, 162 ) ); - highCollectableReward.push_back( exdData->getField< uint16_t >( row, 163 ) ); - highCollectableReward.push_back( exdData->getField< uint16_t >( row, 164 ) ); - highCollectableReward.push_back( exdData->getField< uint16_t >( row, 165 ) ); - highCollectableReward.push_back( exdData->getField< uint16_t >( row, 166 ) ); - highCollectableReward.push_back( exdData->getField< uint16_t >( row, 167 ) ); - highCollectableReward.push_back( exdData->getField< uint16_t >( row, 168 ) ); - highCollectableReward.push_back( exdData->getField< uint16_t >( row, 169 ) ); - termName.push_back( exdData->getField< uint8_t >( row, 221 ) ); - termName.push_back( exdData->getField< uint8_t >( row, 222 ) ); - termName.push_back( exdData->getField< uint8_t >( row, 223 ) ); - termName.push_back( exdData->getField< uint8_t >( row, 224 ) ); - termName.push_back( exdData->getField< uint8_t >( row, 225 ) ); - termName.push_back( exdData->getField< uint8_t >( row, 226 ) ); - termName.push_back( exdData->getField< uint8_t >( row, 227 ) ); - termName.push_back( exdData->getField< uint8_t >( row, 228 ) ); - termName.push_back( exdData->getField< uint8_t >( row, 229 ) ); - termName.push_back( exdData->getField< uint8_t >( row, 230 ) ); - termName.push_back( exdData->getField< uint8_t >( row, 231 ) ); - termName.push_back( exdData->getField< uint8_t >( row, 232 ) ); - termName.push_back( exdData->getField< uint8_t >( row, 233 ) ); - termName.push_back( exdData->getField< uint8_t >( row, 234 ) ); - termName.push_back( exdData->getField< uint8_t >( row, 235 ) ); - termName.push_back( exdData->getField< uint8_t >( row, 236 ) ); - termName.push_back( exdData->getField< uint8_t >( row, 237 ) ); + levelMax.push_back( exdData->getField< uint8_t >( row, 51 ) ); + levelMax.push_back( exdData->getField< uint8_t >( row, 52 ) ); + levelMax.push_back( exdData->getField< uint8_t >( row, 53 ) ); + levelMax.push_back( exdData->getField< uint8_t >( row, 54 ) ); + levelMax.push_back( exdData->getField< uint8_t >( row, 55 ) ); + levelMax.push_back( exdData->getField< uint8_t >( row, 56 ) ); + levelMax.push_back( exdData->getField< uint8_t >( row, 57 ) ); + levelMax.push_back( exdData->getField< uint8_t >( row, 58 ) ); + levelMax.push_back( exdData->getField< uint8_t >( row, 59 ) ); + levelMax.push_back( exdData->getField< uint8_t >( row, 60 ) ); + levelMax.push_back( exdData->getField< uint8_t >( row, 61 ) ); + levelMax.push_back( exdData->getField< uint8_t >( row, 62 ) ); + levelMax.push_back( exdData->getField< uint8_t >( row, 63 ) ); + levelMax.push_back( exdData->getField< uint8_t >( row, 64 ) ); + levelMax.push_back( exdData->getField< uint8_t >( row, 65 ) ); + levelMax.push_back( exdData->getField< uint8_t >( row, 66 ) ); + levelMax.push_back( exdData->getField< uint8_t >( row, 67 ) ); + levelMax.push_back( exdData->getField< uint8_t >( row, 68 ) ); + baseCollectableRating.push_back( exdData->getField< uint16_t >( row, 92 ) ); + baseCollectableRating.push_back( exdData->getField< uint16_t >( row, 93 ) ); + baseCollectableRating.push_back( exdData->getField< uint16_t >( row, 94 ) ); + baseCollectableRating.push_back( exdData->getField< uint16_t >( row, 95 ) ); + baseCollectableRating.push_back( exdData->getField< uint16_t >( row, 96 ) ); + baseCollectableRating.push_back( exdData->getField< uint16_t >( row, 97 ) ); + baseCollectableRating.push_back( exdData->getField< uint16_t >( row, 98 ) ); + baseCollectableRating.push_back( exdData->getField< uint16_t >( row, 99 ) ); + baseCollectableRating.push_back( exdData->getField< uint16_t >( row, 100 ) ); + baseCollectableRating.push_back( exdData->getField< uint16_t >( row, 101 ) ); + baseCollectableRating.push_back( exdData->getField< uint16_t >( row, 102 ) ); + baseCollectableRating.push_back( exdData->getField< uint16_t >( row, 103 ) ); + baseCollectableRating.push_back( exdData->getField< uint16_t >( row, 104 ) ); + baseCollectableRating.push_back( exdData->getField< uint16_t >( row, 105 ) ); + baseCollectableRating.push_back( exdData->getField< uint16_t >( row, 106 ) ); + baseCollectableRating.push_back( exdData->getField< uint16_t >( row, 107 ) ); + baseCollectableRating.push_back( exdData->getField< uint16_t >( row, 108 ) ); + baseCollectableRating.push_back( exdData->getField< uint16_t >( row, 109 ) ); + baseCollectableRating.push_back( exdData->getField< uint16_t >( row, 110 ) ); + baseCollectableRating.push_back( exdData->getField< uint16_t >( row, 111 ) ); + baseCollectableRating.push_back( exdData->getField< uint16_t >( row, 112 ) ); + baseCollectableRating.push_back( exdData->getField< uint16_t >( row, 113 ) ); + baseCollectableRating.push_back( exdData->getField< uint16_t >( row, 114 ) ); + midCollectableRating.push_back( exdData->getField< uint16_t >( row, 115 ) ); + midCollectableRating.push_back( exdData->getField< uint16_t >( row, 116 ) ); + midCollectableRating.push_back( exdData->getField< uint16_t >( row, 117 ) ); + midCollectableRating.push_back( exdData->getField< uint16_t >( row, 118 ) ); + midCollectableRating.push_back( exdData->getField< uint16_t >( row, 119 ) ); + midCollectableRating.push_back( exdData->getField< uint16_t >( row, 120 ) ); + midCollectableRating.push_back( exdData->getField< uint16_t >( row, 121 ) ); + midCollectableRating.push_back( exdData->getField< uint16_t >( row, 122 ) ); + midCollectableRating.push_back( exdData->getField< uint16_t >( row, 123 ) ); + midCollectableRating.push_back( exdData->getField< uint16_t >( row, 124 ) ); + midCollectableRating.push_back( exdData->getField< uint16_t >( row, 125 ) ); + midCollectableRating.push_back( exdData->getField< uint16_t >( row, 126 ) ); + midCollectableRating.push_back( exdData->getField< uint16_t >( row, 127 ) ); + midCollectableRating.push_back( exdData->getField< uint16_t >( row, 128 ) ); + midCollectableRating.push_back( exdData->getField< uint16_t >( row, 129 ) ); + midCollectableRating.push_back( exdData->getField< uint16_t >( row, 130 ) ); + midCollectableRating.push_back( exdData->getField< uint16_t >( row, 131 ) ); + midCollectableRating.push_back( exdData->getField< uint16_t >( row, 132 ) ); + midCollectableRating.push_back( exdData->getField< uint16_t >( row, 133 ) ); + midCollectableRating.push_back( exdData->getField< uint16_t >( row, 134 ) ); + midCollectableRating.push_back( exdData->getField< uint16_t >( row, 135 ) ); + midCollectableRating.push_back( exdData->getField< uint16_t >( row, 136 ) ); + midCollectableRating.push_back( exdData->getField< uint16_t >( row, 137 ) ); + highCollectableRating.push_back( exdData->getField< uint16_t >( row, 138 ) ); + highCollectableRating.push_back( exdData->getField< uint16_t >( row, 139 ) ); + highCollectableRating.push_back( exdData->getField< uint16_t >( row, 140 ) ); + highCollectableRating.push_back( exdData->getField< uint16_t >( row, 141 ) ); + highCollectableRating.push_back( exdData->getField< uint16_t >( row, 142 ) ); + highCollectableRating.push_back( exdData->getField< uint16_t >( row, 143 ) ); + highCollectableRating.push_back( exdData->getField< uint16_t >( row, 144 ) ); + highCollectableRating.push_back( exdData->getField< uint16_t >( row, 145 ) ); + highCollectableRating.push_back( exdData->getField< uint16_t >( row, 146 ) ); + highCollectableRating.push_back( exdData->getField< uint16_t >( row, 147 ) ); + highCollectableRating.push_back( exdData->getField< uint16_t >( row, 148 ) ); + highCollectableRating.push_back( exdData->getField< uint16_t >( row, 149 ) ); + highCollectableRating.push_back( exdData->getField< uint16_t >( row, 150 ) ); + highCollectableRating.push_back( exdData->getField< uint16_t >( row, 151 ) ); + highCollectableRating.push_back( exdData->getField< uint16_t >( row, 152 ) ); + highCollectableRating.push_back( exdData->getField< uint16_t >( row, 153 ) ); + highCollectableRating.push_back( exdData->getField< uint16_t >( row, 154 ) ); + highCollectableRating.push_back( exdData->getField< uint16_t >( row, 155 ) ); + highCollectableRating.push_back( exdData->getField< uint16_t >( row, 156 ) ); + highCollectableRating.push_back( exdData->getField< uint16_t >( row, 157 ) ); + highCollectableRating.push_back( exdData->getField< uint16_t >( row, 158 ) ); + highCollectableRating.push_back( exdData->getField< uint16_t >( row, 159 ) ); + highCollectableRating.push_back( exdData->getField< uint16_t >( row, 160 ) ); + baseCollectableReward.push_back( exdData->getField< uint16_t >( row, 161 ) ); + baseCollectableReward.push_back( exdData->getField< uint16_t >( row, 162 ) ); + baseCollectableReward.push_back( exdData->getField< uint16_t >( row, 163 ) ); + baseCollectableReward.push_back( exdData->getField< uint16_t >( row, 164 ) ); + baseCollectableReward.push_back( exdData->getField< uint16_t >( row, 165 ) ); + baseCollectableReward.push_back( exdData->getField< uint16_t >( row, 166 ) ); + baseCollectableReward.push_back( exdData->getField< uint16_t >( row, 167 ) ); + baseCollectableReward.push_back( exdData->getField< uint16_t >( row, 168 ) ); + baseCollectableReward.push_back( exdData->getField< uint16_t >( row, 169 ) ); + baseCollectableReward.push_back( exdData->getField< uint16_t >( row, 170 ) ); + baseCollectableReward.push_back( exdData->getField< uint16_t >( row, 171 ) ); + baseCollectableReward.push_back( exdData->getField< uint16_t >( row, 172 ) ); + baseCollectableReward.push_back( exdData->getField< uint16_t >( row, 173 ) ); + baseCollectableReward.push_back( exdData->getField< uint16_t >( row, 174 ) ); + baseCollectableReward.push_back( exdData->getField< uint16_t >( row, 175 ) ); + baseCollectableReward.push_back( exdData->getField< uint16_t >( row, 176 ) ); + baseCollectableReward.push_back( exdData->getField< uint16_t >( row, 177 ) ); + baseCollectableReward.push_back( exdData->getField< uint16_t >( row, 178 ) ); + baseCollectableReward.push_back( exdData->getField< uint16_t >( row, 179 ) ); + baseCollectableReward.push_back( exdData->getField< uint16_t >( row, 180 ) ); + baseCollectableReward.push_back( exdData->getField< uint16_t >( row, 181 ) ); + baseCollectableReward.push_back( exdData->getField< uint16_t >( row, 182 ) ); + baseCollectableReward.push_back( exdData->getField< uint16_t >( row, 183 ) ); + midCollectableReward.push_back( exdData->getField< uint16_t >( row, 184 ) ); + midCollectableReward.push_back( exdData->getField< uint16_t >( row, 185 ) ); + midCollectableReward.push_back( exdData->getField< uint16_t >( row, 186 ) ); + midCollectableReward.push_back( exdData->getField< uint16_t >( row, 187 ) ); + midCollectableReward.push_back( exdData->getField< uint16_t >( row, 188 ) ); + midCollectableReward.push_back( exdData->getField< uint16_t >( row, 189 ) ); + midCollectableReward.push_back( exdData->getField< uint16_t >( row, 190 ) ); + midCollectableReward.push_back( exdData->getField< uint16_t >( row, 191 ) ); + midCollectableReward.push_back( exdData->getField< uint16_t >( row, 192 ) ); + midCollectableReward.push_back( exdData->getField< uint16_t >( row, 193 ) ); + midCollectableReward.push_back( exdData->getField< uint16_t >( row, 194 ) ); + midCollectableReward.push_back( exdData->getField< uint16_t >( row, 195 ) ); + midCollectableReward.push_back( exdData->getField< uint16_t >( row, 196 ) ); + midCollectableReward.push_back( exdData->getField< uint16_t >( row, 197 ) ); + midCollectableReward.push_back( exdData->getField< uint16_t >( row, 198 ) ); + midCollectableReward.push_back( exdData->getField< uint16_t >( row, 199 ) ); + midCollectableReward.push_back( exdData->getField< uint16_t >( row, 200 ) ); + midCollectableReward.push_back( exdData->getField< uint16_t >( row, 201 ) ); + midCollectableReward.push_back( exdData->getField< uint16_t >( row, 202 ) ); + midCollectableReward.push_back( exdData->getField< uint16_t >( row, 203 ) ); + midCollectableReward.push_back( exdData->getField< uint16_t >( row, 204 ) ); + midCollectableReward.push_back( exdData->getField< uint16_t >( row, 205 ) ); + midCollectableReward.push_back( exdData->getField< uint16_t >( row, 206 ) ); + highCollectableReward.push_back( exdData->getField< uint16_t >( row, 207 ) ); + highCollectableReward.push_back( exdData->getField< uint16_t >( row, 208 ) ); + highCollectableReward.push_back( exdData->getField< uint16_t >( row, 209 ) ); + highCollectableReward.push_back( exdData->getField< uint16_t >( row, 210 ) ); + highCollectableReward.push_back( exdData->getField< uint16_t >( row, 211 ) ); + highCollectableReward.push_back( exdData->getField< uint16_t >( row, 212 ) ); + highCollectableReward.push_back( exdData->getField< uint16_t >( row, 213 ) ); + highCollectableReward.push_back( exdData->getField< uint16_t >( row, 214 ) ); + highCollectableReward.push_back( exdData->getField< uint16_t >( row, 215 ) ); + highCollectableReward.push_back( exdData->getField< uint16_t >( row, 216 ) ); + highCollectableReward.push_back( exdData->getField< uint16_t >( row, 217 ) ); + highCollectableReward.push_back( exdData->getField< uint16_t >( row, 218 ) ); + highCollectableReward.push_back( exdData->getField< uint16_t >( row, 219 ) ); + highCollectableReward.push_back( exdData->getField< uint16_t >( row, 220 ) ); + highCollectableReward.push_back( exdData->getField< uint16_t >( row, 221 ) ); + highCollectableReward.push_back( exdData->getField< uint16_t >( row, 222 ) ); + highCollectableReward.push_back( exdData->getField< uint16_t >( row, 223 ) ); + highCollectableReward.push_back( exdData->getField< uint16_t >( row, 224 ) ); + highCollectableReward.push_back( exdData->getField< uint16_t >( row, 225 ) ); + highCollectableReward.push_back( exdData->getField< uint16_t >( row, 226 ) ); + highCollectableReward.push_back( exdData->getField< uint16_t >( row, 227 ) ); + highCollectableReward.push_back( exdData->getField< uint16_t >( row, 228 ) ); + highCollectableReward.push_back( exdData->getField< uint16_t >( row, 229 ) ); + baseCollectableRewardPostPhase.push_back( exdData->getField< uint16_t >( row, 230 ) ); + baseCollectableRewardPostPhase.push_back( exdData->getField< uint16_t >( row, 231 ) ); + baseCollectableRewardPostPhase.push_back( exdData->getField< uint16_t >( row, 232 ) ); + baseCollectableRewardPostPhase.push_back( exdData->getField< uint16_t >( row, 233 ) ); + baseCollectableRewardPostPhase.push_back( exdData->getField< uint16_t >( row, 234 ) ); + baseCollectableRewardPostPhase.push_back( exdData->getField< uint16_t >( row, 235 ) ); + baseCollectableRewardPostPhase.push_back( exdData->getField< uint16_t >( row, 236 ) ); + baseCollectableRewardPostPhase.push_back( exdData->getField< uint16_t >( row, 237 ) ); + baseCollectableRewardPostPhase.push_back( exdData->getField< uint16_t >( row, 238 ) ); + baseCollectableRewardPostPhase.push_back( exdData->getField< uint16_t >( row, 239 ) ); + baseCollectableRewardPostPhase.push_back( exdData->getField< uint16_t >( row, 240 ) ); + baseCollectableRewardPostPhase.push_back( exdData->getField< uint16_t >( row, 241 ) ); + baseCollectableRewardPostPhase.push_back( exdData->getField< uint16_t >( row, 242 ) ); + baseCollectableRewardPostPhase.push_back( exdData->getField< uint16_t >( row, 243 ) ); + baseCollectableRewardPostPhase.push_back( exdData->getField< uint16_t >( row, 244 ) ); + baseCollectableRewardPostPhase.push_back( exdData->getField< uint16_t >( row, 245 ) ); + baseCollectableRewardPostPhase.push_back( exdData->getField< uint16_t >( row, 246 ) ); + baseCollectableRewardPostPhase.push_back( exdData->getField< uint16_t >( row, 247 ) ); + baseCollectableRewardPostPhase.push_back( exdData->getField< uint16_t >( row, 248 ) ); + baseCollectableRewardPostPhase.push_back( exdData->getField< uint16_t >( row, 249 ) ); + baseCollectableRewardPostPhase.push_back( exdData->getField< uint16_t >( row, 250 ) ); + baseCollectableRewardPostPhase.push_back( exdData->getField< uint16_t >( row, 251 ) ); + baseCollectableRewardPostPhase.push_back( exdData->getField< uint16_t >( row, 252 ) ); + midCollectableRewardPostPhase.push_back( exdData->getField< uint16_t >( row, 253 ) ); + midCollectableRewardPostPhase.push_back( exdData->getField< uint16_t >( row, 254 ) ); + midCollectableRewardPostPhase.push_back( exdData->getField< uint16_t >( row, 255 ) ); + midCollectableRewardPostPhase.push_back( exdData->getField< uint16_t >( row, 256 ) ); + midCollectableRewardPostPhase.push_back( exdData->getField< uint16_t >( row, 257 ) ); + midCollectableRewardPostPhase.push_back( exdData->getField< uint16_t >( row, 258 ) ); + midCollectableRewardPostPhase.push_back( exdData->getField< uint16_t >( row, 259 ) ); + midCollectableRewardPostPhase.push_back( exdData->getField< uint16_t >( row, 260 ) ); + midCollectableRewardPostPhase.push_back( exdData->getField< uint16_t >( row, 261 ) ); + midCollectableRewardPostPhase.push_back( exdData->getField< uint16_t >( row, 262 ) ); + midCollectableRewardPostPhase.push_back( exdData->getField< uint16_t >( row, 263 ) ); + midCollectableRewardPostPhase.push_back( exdData->getField< uint16_t >( row, 264 ) ); + midCollectableRewardPostPhase.push_back( exdData->getField< uint16_t >( row, 265 ) ); + midCollectableRewardPostPhase.push_back( exdData->getField< uint16_t >( row, 266 ) ); + midCollectableRewardPostPhase.push_back( exdData->getField< uint16_t >( row, 267 ) ); + midCollectableRewardPostPhase.push_back( exdData->getField< uint16_t >( row, 268 ) ); + midCollectableRewardPostPhase.push_back( exdData->getField< uint16_t >( row, 269 ) ); + midCollectableRewardPostPhase.push_back( exdData->getField< uint16_t >( row, 270 ) ); + midCollectableRewardPostPhase.push_back( exdData->getField< uint16_t >( row, 271 ) ); + midCollectableRewardPostPhase.push_back( exdData->getField< uint16_t >( row, 272 ) ); + midCollectableRewardPostPhase.push_back( exdData->getField< uint16_t >( row, 273 ) ); + midCollectableRewardPostPhase.push_back( exdData->getField< uint16_t >( row, 274 ) ); + midCollectableRewardPostPhase.push_back( exdData->getField< uint16_t >( row, 275 ) ); + highCollectableRewardPostPhase.push_back( exdData->getField< uint16_t >( row, 276 ) ); + highCollectableRewardPostPhase.push_back( exdData->getField< uint16_t >( row, 277 ) ); + highCollectableRewardPostPhase.push_back( exdData->getField< uint16_t >( row, 278 ) ); + highCollectableRewardPostPhase.push_back( exdData->getField< uint16_t >( row, 279 ) ); + highCollectableRewardPostPhase.push_back( exdData->getField< uint16_t >( row, 280 ) ); + highCollectableRewardPostPhase.push_back( exdData->getField< uint16_t >( row, 281 ) ); + highCollectableRewardPostPhase.push_back( exdData->getField< uint16_t >( row, 282 ) ); + highCollectableRewardPostPhase.push_back( exdData->getField< uint16_t >( row, 283 ) ); + highCollectableRewardPostPhase.push_back( exdData->getField< uint16_t >( row, 284 ) ); + highCollectableRewardPostPhase.push_back( exdData->getField< uint16_t >( row, 285 ) ); + highCollectableRewardPostPhase.push_back( exdData->getField< uint16_t >( row, 286 ) ); + highCollectableRewardPostPhase.push_back( exdData->getField< uint16_t >( row, 287 ) ); + highCollectableRewardPostPhase.push_back( exdData->getField< uint16_t >( row, 288 ) ); + highCollectableRewardPostPhase.push_back( exdData->getField< uint16_t >( row, 289 ) ); + highCollectableRewardPostPhase.push_back( exdData->getField< uint16_t >( row, 290 ) ); + highCollectableRewardPostPhase.push_back( exdData->getField< uint16_t >( row, 291 ) ); + highCollectableRewardPostPhase.push_back( exdData->getField< uint16_t >( row, 292 ) ); + highCollectableRewardPostPhase.push_back( exdData->getField< uint16_t >( row, 293 ) ); + highCollectableRewardPostPhase.push_back( exdData->getField< uint16_t >( row, 294 ) ); + highCollectableRewardPostPhase.push_back( exdData->getField< uint16_t >( row, 295 ) ); + highCollectableRewardPostPhase.push_back( exdData->getField< uint16_t >( row, 296 ) ); + highCollectableRewardPostPhase.push_back( exdData->getField< uint16_t >( row, 297 ) ); + highCollectableRewardPostPhase.push_back( exdData->getField< uint16_t >( row, 298 ) ); + termName.push_back( exdData->getField< uint8_t >( row, 299 ) ); + termName.push_back( exdData->getField< uint8_t >( row, 300 ) ); + termName.push_back( exdData->getField< uint8_t >( row, 301 ) ); + termName.push_back( exdData->getField< uint8_t >( row, 302 ) ); + termName.push_back( exdData->getField< uint8_t >( row, 303 ) ); + termName.push_back( exdData->getField< uint8_t >( row, 304 ) ); + termName.push_back( exdData->getField< uint8_t >( row, 305 ) ); + termName.push_back( exdData->getField< uint8_t >( row, 306 ) ); + termName.push_back( exdData->getField< uint8_t >( row, 307 ) ); + termName.push_back( exdData->getField< uint8_t >( row, 308 ) ); + termName.push_back( exdData->getField< uint8_t >( row, 309 ) ); + termName.push_back( exdData->getField< uint8_t >( row, 310 ) ); + termName.push_back( exdData->getField< uint8_t >( row, 311 ) ); + termName.push_back( exdData->getField< uint8_t >( row, 312 ) ); + termName.push_back( exdData->getField< uint8_t >( row, 313 ) ); + termName.push_back( exdData->getField< uint8_t >( row, 314 ) ); + termName.push_back( exdData->getField< uint8_t >( row, 315 ) ); + termName.push_back( exdData->getField< uint8_t >( row, 316 ) ); + termName.push_back( exdData->getField< uint8_t >( row, 317 ) ); + termName.push_back( exdData->getField< uint8_t >( row, 318 ) ); + termName.push_back( exdData->getField< uint8_t >( row, 319 ) ); + termName.push_back( exdData->getField< uint8_t >( row, 320 ) ); + termName.push_back( exdData->getField< uint8_t >( row, 321 ) ); } Sapphire::Data::HWDCrafterSupplyReward::HWDCrafterSupplyReward( uint32_t row_id, Sapphire::Data::ExdDataGenerated* exdData ) @@ -4843,6 +5018,12 @@ Sapphire::Data::HWDCrafterSupplyReward::HWDCrafterSupplyReward( uint32_t row_id, Points = exdData->getField< uint16_t >( row, 2 ); } +Sapphire::Data::HWDCrafterSupplyTerm::HWDCrafterSupplyTerm( uint32_t row_id, Sapphire::Data::ExdDataGenerated* exdData ) +{ + auto row = exdData->m_HWDCrafterSupplyTermDat.get_row( row_id ); + name = exdData->getField< std::string >( row, 0 ); +} + Sapphire::Data::HWDDevLayerControl::HWDDevLayerControl( uint32_t row_id, Sapphire::Data::ExdDataGenerated* exdData ) { auto row = exdData->m_HWDDevLayerControlDat.get_row( row_id ); @@ -4927,32 +5108,32 @@ Sapphire::Data::HWDGathererInspection::HWDGathererInspection( uint32_t row_id, S itemRequired.push_back( exdData->getField< uint32_t >( row, 50 ) ); itemRequired.push_back( exdData->getField< uint32_t >( row, 51 ) ); itemRequired.push_back( exdData->getField< uint32_t >( row, 52 ) ); - fishParameter.push_back( exdData->getField< uint32_t >( row, 53 ) ); - fishParameter.push_back( exdData->getField< uint32_t >( row, 54 ) ); - fishParameter.push_back( exdData->getField< uint32_t >( row, 55 ) ); - fishParameter.push_back( exdData->getField< uint32_t >( row, 56 ) ); - fishParameter.push_back( exdData->getField< uint32_t >( row, 57 ) ); - fishParameter.push_back( exdData->getField< uint32_t >( row, 58 ) ); - fishParameter.push_back( exdData->getField< uint32_t >( row, 59 ) ); - fishParameter.push_back( exdData->getField< uint32_t >( row, 60 ) ); - fishParameter.push_back( exdData->getField< uint32_t >( row, 61 ) ); - fishParameter.push_back( exdData->getField< uint32_t >( row, 62 ) ); - fishParameter.push_back( exdData->getField< uint32_t >( row, 63 ) ); - fishParameter.push_back( exdData->getField< uint32_t >( row, 64 ) ); - fishParameter.push_back( exdData->getField< uint32_t >( row, 65 ) ); - fishParameter.push_back( exdData->getField< uint32_t >( row, 66 ) ); - fishParameter.push_back( exdData->getField< uint32_t >( row, 67 ) ); - fishParameter.push_back( exdData->getField< uint32_t >( row, 68 ) ); - fishParameter.push_back( exdData->getField< uint32_t >( row, 69 ) ); - fishParameter.push_back( exdData->getField< uint32_t >( row, 70 ) ); - fishParameter.push_back( exdData->getField< uint32_t >( row, 71 ) ); - fishParameter.push_back( exdData->getField< uint32_t >( row, 72 ) ); - fishParameter.push_back( exdData->getField< uint32_t >( row, 73 ) ); - fishParameter.push_back( exdData->getField< uint32_t >( row, 74 ) ); - fishParameter.push_back( exdData->getField< uint32_t >( row, 75 ) ); - fishParameter.push_back( exdData->getField< uint32_t >( row, 76 ) ); - fishParameter.push_back( exdData->getField< uint32_t >( row, 77 ) ); - fishParameter.push_back( exdData->getField< uint32_t >( row, 78 ) ); + itemRequired.push_back( exdData->getField< uint32_t >( row, 53 ) ); + itemRequired.push_back( exdData->getField< uint32_t >( row, 54 ) ); + itemRequired.push_back( exdData->getField< uint32_t >( row, 55 ) ); + itemRequired.push_back( exdData->getField< uint32_t >( row, 56 ) ); + itemRequired.push_back( exdData->getField< uint32_t >( row, 57 ) ); + itemRequired.push_back( exdData->getField< uint32_t >( row, 58 ) ); + itemRequired.push_back( exdData->getField< uint32_t >( row, 59 ) ); + itemRequired.push_back( exdData->getField< uint32_t >( row, 60 ) ); + itemRequired.push_back( exdData->getField< uint32_t >( row, 61 ) ); + itemRequired.push_back( exdData->getField< uint32_t >( row, 62 ) ); + itemRequired.push_back( exdData->getField< uint32_t >( row, 63 ) ); + itemRequired.push_back( exdData->getField< uint32_t >( row, 64 ) ); + itemRequired.push_back( exdData->getField< uint32_t >( row, 65 ) ); + itemRequired.push_back( exdData->getField< uint32_t >( row, 66 ) ); + itemRequired.push_back( exdData->getField< uint32_t >( row, 67 ) ); + itemRequired.push_back( exdData->getField< uint32_t >( row, 68 ) ); + itemRequired.push_back( exdData->getField< uint32_t >( row, 69 ) ); + itemRequired.push_back( exdData->getField< uint32_t >( row, 70 ) ); + itemRequired.push_back( exdData->getField< uint32_t >( row, 71 ) ); + itemRequired.push_back( exdData->getField< uint32_t >( row, 72 ) ); + itemRequired.push_back( exdData->getField< uint32_t >( row, 73 ) ); + itemRequired.push_back( exdData->getField< uint32_t >( row, 74 ) ); + itemRequired.push_back( exdData->getField< uint32_t >( row, 75 ) ); + itemRequired.push_back( exdData->getField< uint32_t >( row, 76 ) ); + itemRequired.push_back( exdData->getField< uint32_t >( row, 77 ) ); + itemRequired.push_back( exdData->getField< uint32_t >( row, 78 ) ); fishParameter.push_back( exdData->getField< uint32_t >( row, 79 ) ); fishParameter.push_back( exdData->getField< uint32_t >( row, 80 ) ); fishParameter.push_back( exdData->getField< uint32_t >( row, 81 ) ); @@ -4980,271 +5161,453 @@ Sapphire::Data::HWDGathererInspection::HWDGathererInspection( uint32_t row_id, S fishParameter.push_back( exdData->getField< uint32_t >( row, 103 ) ); fishParameter.push_back( exdData->getField< uint32_t >( row, 104 ) ); fishParameter.push_back( exdData->getField< uint32_t >( row, 105 ) ); - amountRequired.push_back( exdData->getField< uint8_t >( row, 106 ) ); - amountRequired.push_back( exdData->getField< uint8_t >( row, 107 ) ); - amountRequired.push_back( exdData->getField< uint8_t >( row, 108 ) ); - amountRequired.push_back( exdData->getField< uint8_t >( row, 109 ) ); - amountRequired.push_back( exdData->getField< uint8_t >( row, 110 ) ); - amountRequired.push_back( exdData->getField< uint8_t >( row, 111 ) ); - amountRequired.push_back( exdData->getField< uint8_t >( row, 112 ) ); - amountRequired.push_back( exdData->getField< uint8_t >( row, 113 ) ); - amountRequired.push_back( exdData->getField< uint8_t >( row, 114 ) ); - amountRequired.push_back( exdData->getField< uint8_t >( row, 115 ) ); - amountRequired.push_back( exdData->getField< uint8_t >( row, 116 ) ); - amountRequired.push_back( exdData->getField< uint8_t >( row, 117 ) ); - amountRequired.push_back( exdData->getField< uint8_t >( row, 118 ) ); - amountRequired.push_back( exdData->getField< uint8_t >( row, 119 ) ); - amountRequired.push_back( exdData->getField< uint8_t >( row, 120 ) ); - amountRequired.push_back( exdData->getField< uint8_t >( row, 121 ) ); - amountRequired.push_back( exdData->getField< uint8_t >( row, 122 ) ); - amountRequired.push_back( exdData->getField< uint8_t >( row, 123 ) ); - amountRequired.push_back( exdData->getField< uint8_t >( row, 124 ) ); - amountRequired.push_back( exdData->getField< uint8_t >( row, 125 ) ); - amountRequired.push_back( exdData->getField< uint8_t >( row, 126 ) ); - amountRequired.push_back( exdData->getField< uint8_t >( row, 127 ) ); - amountRequired.push_back( exdData->getField< uint8_t >( row, 128 ) ); - amountRequired.push_back( exdData->getField< uint8_t >( row, 129 ) ); - amountRequired.push_back( exdData->getField< uint8_t >( row, 130 ) ); - amountRequired.push_back( exdData->getField< uint8_t >( row, 131 ) ); - amountRequired.push_back( exdData->getField< uint8_t >( row, 132 ) ); - amountRequired.push_back( exdData->getField< uint8_t >( row, 133 ) ); - amountRequired.push_back( exdData->getField< uint8_t >( row, 134 ) ); - amountRequired.push_back( exdData->getField< uint8_t >( row, 135 ) ); - amountRequired.push_back( exdData->getField< uint8_t >( row, 136 ) ); - amountRequired.push_back( exdData->getField< uint8_t >( row, 137 ) ); - amountRequired.push_back( exdData->getField< uint8_t >( row, 138 ) ); - amountRequired.push_back( exdData->getField< uint8_t >( row, 139 ) ); - amountRequired.push_back( exdData->getField< uint8_t >( row, 140 ) ); - amountRequired.push_back( exdData->getField< uint8_t >( row, 141 ) ); - amountRequired.push_back( exdData->getField< uint8_t >( row, 142 ) ); - amountRequired.push_back( exdData->getField< uint8_t >( row, 143 ) ); - amountRequired.push_back( exdData->getField< uint8_t >( row, 144 ) ); - amountRequired.push_back( exdData->getField< uint8_t >( row, 145 ) ); - amountRequired.push_back( exdData->getField< uint8_t >( row, 146 ) ); - amountRequired.push_back( exdData->getField< uint8_t >( row, 147 ) ); - amountRequired.push_back( exdData->getField< uint8_t >( row, 148 ) ); - amountRequired.push_back( exdData->getField< uint8_t >( row, 149 ) ); - amountRequired.push_back( exdData->getField< uint8_t >( row, 150 ) ); - amountRequired.push_back( exdData->getField< uint8_t >( row, 151 ) ); - amountRequired.push_back( exdData->getField< uint8_t >( row, 152 ) ); - amountRequired.push_back( exdData->getField< uint8_t >( row, 153 ) ); - amountRequired.push_back( exdData->getField< uint8_t >( row, 154 ) ); - amountRequired.push_back( exdData->getField< uint8_t >( row, 155 ) ); - amountRequired.push_back( exdData->getField< uint8_t >( row, 156 ) ); - amountRequired.push_back( exdData->getField< uint8_t >( row, 157 ) ); + fishParameter.push_back( exdData->getField< uint32_t >( row, 106 ) ); + fishParameter.push_back( exdData->getField< uint32_t >( row, 107 ) ); + fishParameter.push_back( exdData->getField< uint32_t >( row, 108 ) ); + fishParameter.push_back( exdData->getField< uint32_t >( row, 109 ) ); + fishParameter.push_back( exdData->getField< uint32_t >( row, 110 ) ); + fishParameter.push_back( exdData->getField< uint32_t >( row, 111 ) ); + fishParameter.push_back( exdData->getField< uint32_t >( row, 112 ) ); + fishParameter.push_back( exdData->getField< uint32_t >( row, 113 ) ); + fishParameter.push_back( exdData->getField< uint32_t >( row, 114 ) ); + fishParameter.push_back( exdData->getField< uint32_t >( row, 115 ) ); + fishParameter.push_back( exdData->getField< uint32_t >( row, 116 ) ); + fishParameter.push_back( exdData->getField< uint32_t >( row, 117 ) ); + fishParameter.push_back( exdData->getField< uint32_t >( row, 118 ) ); + fishParameter.push_back( exdData->getField< uint32_t >( row, 119 ) ); + fishParameter.push_back( exdData->getField< uint32_t >( row, 120 ) ); + fishParameter.push_back( exdData->getField< uint32_t >( row, 121 ) ); + fishParameter.push_back( exdData->getField< uint32_t >( row, 122 ) ); + fishParameter.push_back( exdData->getField< uint32_t >( row, 123 ) ); + fishParameter.push_back( exdData->getField< uint32_t >( row, 124 ) ); + fishParameter.push_back( exdData->getField< uint32_t >( row, 125 ) ); + fishParameter.push_back( exdData->getField< uint32_t >( row, 126 ) ); + fishParameter.push_back( exdData->getField< uint32_t >( row, 127 ) ); + fishParameter.push_back( exdData->getField< uint32_t >( row, 128 ) ); + fishParameter.push_back( exdData->getField< uint32_t >( row, 129 ) ); + fishParameter.push_back( exdData->getField< uint32_t >( row, 130 ) ); + fishParameter.push_back( exdData->getField< uint32_t >( row, 131 ) ); + fishParameter.push_back( exdData->getField< uint32_t >( row, 132 ) ); + fishParameter.push_back( exdData->getField< uint32_t >( row, 133 ) ); + fishParameter.push_back( exdData->getField< uint32_t >( row, 134 ) ); + fishParameter.push_back( exdData->getField< uint32_t >( row, 135 ) ); + fishParameter.push_back( exdData->getField< uint32_t >( row, 136 ) ); + fishParameter.push_back( exdData->getField< uint32_t >( row, 137 ) ); + fishParameter.push_back( exdData->getField< uint32_t >( row, 138 ) ); + fishParameter.push_back( exdData->getField< uint32_t >( row, 139 ) ); + fishParameter.push_back( exdData->getField< uint32_t >( row, 140 ) ); + fishParameter.push_back( exdData->getField< uint32_t >( row, 141 ) ); + fishParameter.push_back( exdData->getField< uint32_t >( row, 142 ) ); + fishParameter.push_back( exdData->getField< uint32_t >( row, 143 ) ); + fishParameter.push_back( exdData->getField< uint32_t >( row, 144 ) ); + fishParameter.push_back( exdData->getField< uint32_t >( row, 145 ) ); + fishParameter.push_back( exdData->getField< uint32_t >( row, 146 ) ); + fishParameter.push_back( exdData->getField< uint32_t >( row, 147 ) ); + fishParameter.push_back( exdData->getField< uint32_t >( row, 148 ) ); + fishParameter.push_back( exdData->getField< uint32_t >( row, 149 ) ); + fishParameter.push_back( exdData->getField< uint32_t >( row, 150 ) ); + fishParameter.push_back( exdData->getField< uint32_t >( row, 151 ) ); + fishParameter.push_back( exdData->getField< uint32_t >( row, 152 ) ); + fishParameter.push_back( exdData->getField< uint32_t >( row, 153 ) ); + fishParameter.push_back( exdData->getField< uint32_t >( row, 154 ) ); + fishParameter.push_back( exdData->getField< uint32_t >( row, 155 ) ); + fishParameter.push_back( exdData->getField< uint32_t >( row, 156 ) ); + fishParameter.push_back( exdData->getField< uint32_t >( row, 157 ) ); amountRequired.push_back( exdData->getField< uint8_t >( row, 158 ) ); - itemReceived.push_back( exdData->getField< uint32_t >( row, 159 ) ); - itemReceived.push_back( exdData->getField< uint32_t >( row, 160 ) ); - itemReceived.push_back( exdData->getField< uint32_t >( row, 161 ) ); - itemReceived.push_back( exdData->getField< uint32_t >( row, 162 ) ); - itemReceived.push_back( exdData->getField< uint32_t >( row, 163 ) ); - itemReceived.push_back( exdData->getField< uint32_t >( row, 164 ) ); - itemReceived.push_back( exdData->getField< uint32_t >( row, 165 ) ); - itemReceived.push_back( exdData->getField< uint32_t >( row, 166 ) ); - itemReceived.push_back( exdData->getField< uint32_t >( row, 167 ) ); - itemReceived.push_back( exdData->getField< uint32_t >( row, 168 ) ); - itemReceived.push_back( exdData->getField< uint32_t >( row, 169 ) ); - itemReceived.push_back( exdData->getField< uint32_t >( row, 170 ) ); - itemReceived.push_back( exdData->getField< uint32_t >( row, 171 ) ); - itemReceived.push_back( exdData->getField< uint32_t >( row, 172 ) ); - itemReceived.push_back( exdData->getField< uint32_t >( row, 173 ) ); - itemReceived.push_back( exdData->getField< uint32_t >( row, 174 ) ); - itemReceived.push_back( exdData->getField< uint32_t >( row, 175 ) ); - itemReceived.push_back( exdData->getField< uint32_t >( row, 176 ) ); - itemReceived.push_back( exdData->getField< uint32_t >( row, 177 ) ); - itemReceived.push_back( exdData->getField< uint32_t >( row, 178 ) ); - itemReceived.push_back( exdData->getField< uint32_t >( row, 179 ) ); - itemReceived.push_back( exdData->getField< uint32_t >( row, 180 ) ); - itemReceived.push_back( exdData->getField< uint32_t >( row, 181 ) ); - itemReceived.push_back( exdData->getField< uint32_t >( row, 182 ) ); - itemReceived.push_back( exdData->getField< uint32_t >( row, 183 ) ); - itemReceived.push_back( exdData->getField< uint32_t >( row, 184 ) ); - itemReceived.push_back( exdData->getField< uint32_t >( row, 185 ) ); - itemReceived.push_back( exdData->getField< uint32_t >( row, 186 ) ); - itemReceived.push_back( exdData->getField< uint32_t >( row, 187 ) ); - itemReceived.push_back( exdData->getField< uint32_t >( row, 188 ) ); - itemReceived.push_back( exdData->getField< uint32_t >( row, 189 ) ); - itemReceived.push_back( exdData->getField< uint32_t >( row, 190 ) ); - itemReceived.push_back( exdData->getField< uint32_t >( row, 191 ) ); - itemReceived.push_back( exdData->getField< uint32_t >( row, 192 ) ); - itemReceived.push_back( exdData->getField< uint32_t >( row, 193 ) ); - itemReceived.push_back( exdData->getField< uint32_t >( row, 194 ) ); - itemReceived.push_back( exdData->getField< uint32_t >( row, 195 ) ); - itemReceived.push_back( exdData->getField< uint32_t >( row, 196 ) ); - itemReceived.push_back( exdData->getField< uint32_t >( row, 197 ) ); - itemReceived.push_back( exdData->getField< uint32_t >( row, 198 ) ); - itemReceived.push_back( exdData->getField< uint32_t >( row, 199 ) ); - itemReceived.push_back( exdData->getField< uint32_t >( row, 200 ) ); - itemReceived.push_back( exdData->getField< uint32_t >( row, 201 ) ); - itemReceived.push_back( exdData->getField< uint32_t >( row, 202 ) ); - itemReceived.push_back( exdData->getField< uint32_t >( row, 203 ) ); - itemReceived.push_back( exdData->getField< uint32_t >( row, 204 ) ); - itemReceived.push_back( exdData->getField< uint32_t >( row, 205 ) ); - itemReceived.push_back( exdData->getField< uint32_t >( row, 206 ) ); - itemReceived.push_back( exdData->getField< uint32_t >( row, 207 ) ); - itemReceived.push_back( exdData->getField< uint32_t >( row, 208 ) ); - itemReceived.push_back( exdData->getField< uint32_t >( row, 209 ) ); - itemReceived.push_back( exdData->getField< uint32_t >( row, 210 ) ); - itemReceived.push_back( exdData->getField< uint32_t >( row, 211 ) ); - reward1.push_back( exdData->getField< uint16_t >( row, 212 ) ); - reward1.push_back( exdData->getField< uint16_t >( row, 213 ) ); - reward1.push_back( exdData->getField< uint16_t >( row, 214 ) ); - reward1.push_back( exdData->getField< uint16_t >( row, 215 ) ); - reward1.push_back( exdData->getField< uint16_t >( row, 216 ) ); - reward1.push_back( exdData->getField< uint16_t >( row, 217 ) ); - reward1.push_back( exdData->getField< uint16_t >( row, 218 ) ); - reward1.push_back( exdData->getField< uint16_t >( row, 219 ) ); - reward1.push_back( exdData->getField< uint16_t >( row, 220 ) ); - reward1.push_back( exdData->getField< uint16_t >( row, 221 ) ); - reward1.push_back( exdData->getField< uint16_t >( row, 222 ) ); - reward1.push_back( exdData->getField< uint16_t >( row, 223 ) ); - reward1.push_back( exdData->getField< uint16_t >( row, 224 ) ); - reward1.push_back( exdData->getField< uint16_t >( row, 225 ) ); - reward1.push_back( exdData->getField< uint16_t >( row, 226 ) ); - reward1.push_back( exdData->getField< uint16_t >( row, 227 ) ); - reward1.push_back( exdData->getField< uint16_t >( row, 228 ) ); - reward1.push_back( exdData->getField< uint16_t >( row, 229 ) ); - reward1.push_back( exdData->getField< uint16_t >( row, 230 ) ); - reward1.push_back( exdData->getField< uint16_t >( row, 231 ) ); - reward1.push_back( exdData->getField< uint16_t >( row, 232 ) ); - reward1.push_back( exdData->getField< uint16_t >( row, 233 ) ); - reward1.push_back( exdData->getField< uint16_t >( row, 234 ) ); - reward1.push_back( exdData->getField< uint16_t >( row, 235 ) ); - reward1.push_back( exdData->getField< uint16_t >( row, 236 ) ); - reward1.push_back( exdData->getField< uint16_t >( row, 237 ) ); - reward1.push_back( exdData->getField< uint16_t >( row, 238 ) ); - reward1.push_back( exdData->getField< uint16_t >( row, 239 ) ); - reward1.push_back( exdData->getField< uint16_t >( row, 240 ) ); - reward1.push_back( exdData->getField< uint16_t >( row, 241 ) ); - reward1.push_back( exdData->getField< uint16_t >( row, 242 ) ); - reward1.push_back( exdData->getField< uint16_t >( row, 243 ) ); - reward1.push_back( exdData->getField< uint16_t >( row, 244 ) ); - reward1.push_back( exdData->getField< uint16_t >( row, 245 ) ); - reward1.push_back( exdData->getField< uint16_t >( row, 246 ) ); - reward1.push_back( exdData->getField< uint16_t >( row, 247 ) ); - reward1.push_back( exdData->getField< uint16_t >( row, 248 ) ); - reward1.push_back( exdData->getField< uint16_t >( row, 249 ) ); - reward1.push_back( exdData->getField< uint16_t >( row, 250 ) ); - reward1.push_back( exdData->getField< uint16_t >( row, 251 ) ); - reward1.push_back( exdData->getField< uint16_t >( row, 252 ) ); - reward1.push_back( exdData->getField< uint16_t >( row, 253 ) ); - reward1.push_back( exdData->getField< uint16_t >( row, 254 ) ); - reward1.push_back( exdData->getField< uint16_t >( row, 255 ) ); - reward1.push_back( exdData->getField< uint16_t >( row, 256 ) ); - reward1.push_back( exdData->getField< uint16_t >( row, 257 ) ); - reward1.push_back( exdData->getField< uint16_t >( row, 258 ) ); - reward1.push_back( exdData->getField< uint16_t >( row, 259 ) ); - reward1.push_back( exdData->getField< uint16_t >( row, 260 ) ); - reward1.push_back( exdData->getField< uint16_t >( row, 261 ) ); - reward1.push_back( exdData->getField< uint16_t >( row, 262 ) ); - reward1.push_back( exdData->getField< uint16_t >( row, 263 ) ); - reward1.push_back( exdData->getField< uint16_t >( row, 264 ) ); - reward2.push_back( exdData->getField< uint16_t >( row, 265 ) ); - reward2.push_back( exdData->getField< uint16_t >( row, 266 ) ); - reward2.push_back( exdData->getField< uint16_t >( row, 267 ) ); - reward2.push_back( exdData->getField< uint16_t >( row, 268 ) ); - reward2.push_back( exdData->getField< uint16_t >( row, 269 ) ); - reward2.push_back( exdData->getField< uint16_t >( row, 270 ) ); - reward2.push_back( exdData->getField< uint16_t >( row, 271 ) ); - reward2.push_back( exdData->getField< uint16_t >( row, 272 ) ); - reward2.push_back( exdData->getField< uint16_t >( row, 273 ) ); - reward2.push_back( exdData->getField< uint16_t >( row, 274 ) ); - reward2.push_back( exdData->getField< uint16_t >( row, 275 ) ); - reward2.push_back( exdData->getField< uint16_t >( row, 276 ) ); - reward2.push_back( exdData->getField< uint16_t >( row, 277 ) ); - reward2.push_back( exdData->getField< uint16_t >( row, 278 ) ); - reward2.push_back( exdData->getField< uint16_t >( row, 279 ) ); - reward2.push_back( exdData->getField< uint16_t >( row, 280 ) ); - reward2.push_back( exdData->getField< uint16_t >( row, 281 ) ); - reward2.push_back( exdData->getField< uint16_t >( row, 282 ) ); - reward2.push_back( exdData->getField< uint16_t >( row, 283 ) ); - reward2.push_back( exdData->getField< uint16_t >( row, 284 ) ); - reward2.push_back( exdData->getField< uint16_t >( row, 285 ) ); - reward2.push_back( exdData->getField< uint16_t >( row, 286 ) ); - reward2.push_back( exdData->getField< uint16_t >( row, 287 ) ); - reward2.push_back( exdData->getField< uint16_t >( row, 288 ) ); - reward2.push_back( exdData->getField< uint16_t >( row, 289 ) ); - reward2.push_back( exdData->getField< uint16_t >( row, 290 ) ); - reward2.push_back( exdData->getField< uint16_t >( row, 291 ) ); - reward2.push_back( exdData->getField< uint16_t >( row, 292 ) ); - reward2.push_back( exdData->getField< uint16_t >( row, 293 ) ); - reward2.push_back( exdData->getField< uint16_t >( row, 294 ) ); - reward2.push_back( exdData->getField< uint16_t >( row, 295 ) ); - reward2.push_back( exdData->getField< uint16_t >( row, 296 ) ); - reward2.push_back( exdData->getField< uint16_t >( row, 297 ) ); - reward2.push_back( exdData->getField< uint16_t >( row, 298 ) ); - reward2.push_back( exdData->getField< uint16_t >( row, 299 ) ); - reward2.push_back( exdData->getField< uint16_t >( row, 300 ) ); - reward2.push_back( exdData->getField< uint16_t >( row, 301 ) ); - reward2.push_back( exdData->getField< uint16_t >( row, 302 ) ); - reward2.push_back( exdData->getField< uint16_t >( row, 303 ) ); - reward2.push_back( exdData->getField< uint16_t >( row, 304 ) ); - reward2.push_back( exdData->getField< uint16_t >( row, 305 ) ); - reward2.push_back( exdData->getField< uint16_t >( row, 306 ) ); - reward2.push_back( exdData->getField< uint16_t >( row, 307 ) ); - reward2.push_back( exdData->getField< uint16_t >( row, 308 ) ); - reward2.push_back( exdData->getField< uint16_t >( row, 309 ) ); - reward2.push_back( exdData->getField< uint16_t >( row, 310 ) ); - reward2.push_back( exdData->getField< uint16_t >( row, 311 ) ); - reward2.push_back( exdData->getField< uint16_t >( row, 312 ) ); - reward2.push_back( exdData->getField< uint16_t >( row, 313 ) ); - reward2.push_back( exdData->getField< uint16_t >( row, 314 ) ); - reward2.push_back( exdData->getField< uint16_t >( row, 315 ) ); - reward2.push_back( exdData->getField< uint16_t >( row, 316 ) ); - reward2.push_back( exdData->getField< uint16_t >( row, 317 ) ); - phase.push_back( exdData->getField< uint8_t >( row, 318 ) ); - phase.push_back( exdData->getField< uint8_t >( row, 319 ) ); - phase.push_back( exdData->getField< uint8_t >( row, 320 ) ); - phase.push_back( exdData->getField< uint8_t >( row, 321 ) ); - phase.push_back( exdData->getField< uint8_t >( row, 322 ) ); - phase.push_back( exdData->getField< uint8_t >( row, 323 ) ); - phase.push_back( exdData->getField< uint8_t >( row, 324 ) ); - phase.push_back( exdData->getField< uint8_t >( row, 325 ) ); - phase.push_back( exdData->getField< uint8_t >( row, 326 ) ); - phase.push_back( exdData->getField< uint8_t >( row, 327 ) ); - phase.push_back( exdData->getField< uint8_t >( row, 328 ) ); - phase.push_back( exdData->getField< uint8_t >( row, 329 ) ); - phase.push_back( exdData->getField< uint8_t >( row, 330 ) ); - phase.push_back( exdData->getField< uint8_t >( row, 331 ) ); - phase.push_back( exdData->getField< uint8_t >( row, 332 ) ); - phase.push_back( exdData->getField< uint8_t >( row, 333 ) ); - phase.push_back( exdData->getField< uint8_t >( row, 334 ) ); - phase.push_back( exdData->getField< uint8_t >( row, 335 ) ); - phase.push_back( exdData->getField< uint8_t >( row, 336 ) ); - phase.push_back( exdData->getField< uint8_t >( row, 337 ) ); - phase.push_back( exdData->getField< uint8_t >( row, 338 ) ); - phase.push_back( exdData->getField< uint8_t >( row, 339 ) ); - phase.push_back( exdData->getField< uint8_t >( row, 340 ) ); - phase.push_back( exdData->getField< uint8_t >( row, 341 ) ); - phase.push_back( exdData->getField< uint8_t >( row, 342 ) ); - phase.push_back( exdData->getField< uint8_t >( row, 343 ) ); - phase.push_back( exdData->getField< uint8_t >( row, 344 ) ); - phase.push_back( exdData->getField< uint8_t >( row, 345 ) ); - phase.push_back( exdData->getField< uint8_t >( row, 346 ) ); - phase.push_back( exdData->getField< uint8_t >( row, 347 ) ); - phase.push_back( exdData->getField< uint8_t >( row, 348 ) ); - phase.push_back( exdData->getField< uint8_t >( row, 349 ) ); - phase.push_back( exdData->getField< uint8_t >( row, 350 ) ); - phase.push_back( exdData->getField< uint8_t >( row, 351 ) ); - phase.push_back( exdData->getField< uint8_t >( row, 352 ) ); - phase.push_back( exdData->getField< uint8_t >( row, 353 ) ); - phase.push_back( exdData->getField< uint8_t >( row, 354 ) ); - phase.push_back( exdData->getField< uint8_t >( row, 355 ) ); - phase.push_back( exdData->getField< uint8_t >( row, 356 ) ); - phase.push_back( exdData->getField< uint8_t >( row, 357 ) ); - phase.push_back( exdData->getField< uint8_t >( row, 358 ) ); - phase.push_back( exdData->getField< uint8_t >( row, 359 ) ); - phase.push_back( exdData->getField< uint8_t >( row, 360 ) ); - phase.push_back( exdData->getField< uint8_t >( row, 361 ) ); - phase.push_back( exdData->getField< uint8_t >( row, 362 ) ); - phase.push_back( exdData->getField< uint8_t >( row, 363 ) ); - phase.push_back( exdData->getField< uint8_t >( row, 364 ) ); - phase.push_back( exdData->getField< uint8_t >( row, 365 ) ); - phase.push_back( exdData->getField< uint8_t >( row, 366 ) ); - phase.push_back( exdData->getField< uint8_t >( row, 367 ) ); - phase.push_back( exdData->getField< uint8_t >( row, 368 ) ); - phase.push_back( exdData->getField< uint8_t >( row, 369 ) ); - phase.push_back( exdData->getField< uint8_t >( row, 370 ) ); + amountRequired.push_back( exdData->getField< uint8_t >( row, 159 ) ); + amountRequired.push_back( exdData->getField< uint8_t >( row, 160 ) ); + amountRequired.push_back( exdData->getField< uint8_t >( row, 161 ) ); + amountRequired.push_back( exdData->getField< uint8_t >( row, 162 ) ); + amountRequired.push_back( exdData->getField< uint8_t >( row, 163 ) ); + amountRequired.push_back( exdData->getField< uint8_t >( row, 164 ) ); + amountRequired.push_back( exdData->getField< uint8_t >( row, 165 ) ); + amountRequired.push_back( exdData->getField< uint8_t >( row, 166 ) ); + amountRequired.push_back( exdData->getField< uint8_t >( row, 167 ) ); + amountRequired.push_back( exdData->getField< uint8_t >( row, 168 ) ); + amountRequired.push_back( exdData->getField< uint8_t >( row, 169 ) ); + amountRequired.push_back( exdData->getField< uint8_t >( row, 170 ) ); + amountRequired.push_back( exdData->getField< uint8_t >( row, 171 ) ); + amountRequired.push_back( exdData->getField< uint8_t >( row, 172 ) ); + amountRequired.push_back( exdData->getField< uint8_t >( row, 173 ) ); + amountRequired.push_back( exdData->getField< uint8_t >( row, 174 ) ); + amountRequired.push_back( exdData->getField< uint8_t >( row, 175 ) ); + amountRequired.push_back( exdData->getField< uint8_t >( row, 176 ) ); + amountRequired.push_back( exdData->getField< uint8_t >( row, 177 ) ); + amountRequired.push_back( exdData->getField< uint8_t >( row, 178 ) ); + amountRequired.push_back( exdData->getField< uint8_t >( row, 179 ) ); + amountRequired.push_back( exdData->getField< uint8_t >( row, 180 ) ); + amountRequired.push_back( exdData->getField< uint8_t >( row, 181 ) ); + amountRequired.push_back( exdData->getField< uint8_t >( row, 182 ) ); + amountRequired.push_back( exdData->getField< uint8_t >( row, 183 ) ); + amountRequired.push_back( exdData->getField< uint8_t >( row, 184 ) ); + amountRequired.push_back( exdData->getField< uint8_t >( row, 185 ) ); + amountRequired.push_back( exdData->getField< uint8_t >( row, 186 ) ); + amountRequired.push_back( exdData->getField< uint8_t >( row, 187 ) ); + amountRequired.push_back( exdData->getField< uint8_t >( row, 188 ) ); + amountRequired.push_back( exdData->getField< uint8_t >( row, 189 ) ); + amountRequired.push_back( exdData->getField< uint8_t >( row, 190 ) ); + amountRequired.push_back( exdData->getField< uint8_t >( row, 191 ) ); + amountRequired.push_back( exdData->getField< uint8_t >( row, 192 ) ); + amountRequired.push_back( exdData->getField< uint8_t >( row, 193 ) ); + amountRequired.push_back( exdData->getField< uint8_t >( row, 194 ) ); + amountRequired.push_back( exdData->getField< uint8_t >( row, 195 ) ); + amountRequired.push_back( exdData->getField< uint8_t >( row, 196 ) ); + amountRequired.push_back( exdData->getField< uint8_t >( row, 197 ) ); + amountRequired.push_back( exdData->getField< uint8_t >( row, 198 ) ); + amountRequired.push_back( exdData->getField< uint8_t >( row, 199 ) ); + amountRequired.push_back( exdData->getField< uint8_t >( row, 200 ) ); + amountRequired.push_back( exdData->getField< uint8_t >( row, 201 ) ); + amountRequired.push_back( exdData->getField< uint8_t >( row, 202 ) ); + amountRequired.push_back( exdData->getField< uint8_t >( row, 203 ) ); + amountRequired.push_back( exdData->getField< uint8_t >( row, 204 ) ); + amountRequired.push_back( exdData->getField< uint8_t >( row, 205 ) ); + amountRequired.push_back( exdData->getField< uint8_t >( row, 206 ) ); + amountRequired.push_back( exdData->getField< uint8_t >( row, 207 ) ); + amountRequired.push_back( exdData->getField< uint8_t >( row, 208 ) ); + amountRequired.push_back( exdData->getField< uint8_t >( row, 209 ) ); + amountRequired.push_back( exdData->getField< uint8_t >( row, 210 ) ); + amountRequired.push_back( exdData->getField< uint8_t >( row, 211 ) ); + amountRequired.push_back( exdData->getField< uint8_t >( row, 212 ) ); + amountRequired.push_back( exdData->getField< uint8_t >( row, 213 ) ); + amountRequired.push_back( exdData->getField< uint8_t >( row, 214 ) ); + amountRequired.push_back( exdData->getField< uint8_t >( row, 215 ) ); + amountRequired.push_back( exdData->getField< uint8_t >( row, 216 ) ); + amountRequired.push_back( exdData->getField< uint8_t >( row, 217 ) ); + amountRequired.push_back( exdData->getField< uint8_t >( row, 218 ) ); + amountRequired.push_back( exdData->getField< uint8_t >( row, 219 ) ); + amountRequired.push_back( exdData->getField< uint8_t >( row, 220 ) ); + amountRequired.push_back( exdData->getField< uint8_t >( row, 221 ) ); + amountRequired.push_back( exdData->getField< uint8_t >( row, 222 ) ); + amountRequired.push_back( exdData->getField< uint8_t >( row, 223 ) ); + amountRequired.push_back( exdData->getField< uint8_t >( row, 224 ) ); + amountRequired.push_back( exdData->getField< uint8_t >( row, 225 ) ); + amountRequired.push_back( exdData->getField< uint8_t >( row, 226 ) ); + amountRequired.push_back( exdData->getField< uint8_t >( row, 227 ) ); + amountRequired.push_back( exdData->getField< uint8_t >( row, 228 ) ); + amountRequired.push_back( exdData->getField< uint8_t >( row, 229 ) ); + amountRequired.push_back( exdData->getField< uint8_t >( row, 230 ) ); + amountRequired.push_back( exdData->getField< uint8_t >( row, 231 ) ); + amountRequired.push_back( exdData->getField< uint8_t >( row, 232 ) ); + amountRequired.push_back( exdData->getField< uint8_t >( row, 233 ) ); + amountRequired.push_back( exdData->getField< uint8_t >( row, 234 ) ); + amountRequired.push_back( exdData->getField< uint8_t >( row, 235 ) ); + amountRequired.push_back( exdData->getField< uint8_t >( row, 236 ) ); + itemReceived.push_back( exdData->getField< uint32_t >( row, 237 ) ); + itemReceived.push_back( exdData->getField< uint32_t >( row, 238 ) ); + itemReceived.push_back( exdData->getField< uint32_t >( row, 239 ) ); + itemReceived.push_back( exdData->getField< uint32_t >( row, 240 ) ); + itemReceived.push_back( exdData->getField< uint32_t >( row, 241 ) ); + itemReceived.push_back( exdData->getField< uint32_t >( row, 242 ) ); + itemReceived.push_back( exdData->getField< uint32_t >( row, 243 ) ); + itemReceived.push_back( exdData->getField< uint32_t >( row, 244 ) ); + itemReceived.push_back( exdData->getField< uint32_t >( row, 245 ) ); + itemReceived.push_back( exdData->getField< uint32_t >( row, 246 ) ); + itemReceived.push_back( exdData->getField< uint32_t >( row, 247 ) ); + itemReceived.push_back( exdData->getField< uint32_t >( row, 248 ) ); + itemReceived.push_back( exdData->getField< uint32_t >( row, 249 ) ); + itemReceived.push_back( exdData->getField< uint32_t >( row, 250 ) ); + itemReceived.push_back( exdData->getField< uint32_t >( row, 251 ) ); + itemReceived.push_back( exdData->getField< uint32_t >( row, 252 ) ); + itemReceived.push_back( exdData->getField< uint32_t >( row, 253 ) ); + itemReceived.push_back( exdData->getField< uint32_t >( row, 254 ) ); + itemReceived.push_back( exdData->getField< uint32_t >( row, 255 ) ); + itemReceived.push_back( exdData->getField< uint32_t >( row, 256 ) ); + itemReceived.push_back( exdData->getField< uint32_t >( row, 257 ) ); + itemReceived.push_back( exdData->getField< uint32_t >( row, 258 ) ); + itemReceived.push_back( exdData->getField< uint32_t >( row, 259 ) ); + itemReceived.push_back( exdData->getField< uint32_t >( row, 260 ) ); + itemReceived.push_back( exdData->getField< uint32_t >( row, 261 ) ); + itemReceived.push_back( exdData->getField< uint32_t >( row, 262 ) ); + itemReceived.push_back( exdData->getField< uint32_t >( row, 263 ) ); + itemReceived.push_back( exdData->getField< uint32_t >( row, 264 ) ); + itemReceived.push_back( exdData->getField< uint32_t >( row, 265 ) ); + itemReceived.push_back( exdData->getField< uint32_t >( row, 266 ) ); + itemReceived.push_back( exdData->getField< uint32_t >( row, 267 ) ); + itemReceived.push_back( exdData->getField< uint32_t >( row, 268 ) ); + itemReceived.push_back( exdData->getField< uint32_t >( row, 269 ) ); + itemReceived.push_back( exdData->getField< uint32_t >( row, 270 ) ); + itemReceived.push_back( exdData->getField< uint32_t >( row, 271 ) ); + itemReceived.push_back( exdData->getField< uint32_t >( row, 272 ) ); + itemReceived.push_back( exdData->getField< uint32_t >( row, 273 ) ); + itemReceived.push_back( exdData->getField< uint32_t >( row, 274 ) ); + itemReceived.push_back( exdData->getField< uint32_t >( row, 275 ) ); + itemReceived.push_back( exdData->getField< uint32_t >( row, 276 ) ); + itemReceived.push_back( exdData->getField< uint32_t >( row, 277 ) ); + itemReceived.push_back( exdData->getField< uint32_t >( row, 278 ) ); + itemReceived.push_back( exdData->getField< uint32_t >( row, 279 ) ); + itemReceived.push_back( exdData->getField< uint32_t >( row, 280 ) ); + itemReceived.push_back( exdData->getField< uint32_t >( row, 281 ) ); + itemReceived.push_back( exdData->getField< uint32_t >( row, 282 ) ); + itemReceived.push_back( exdData->getField< uint32_t >( row, 283 ) ); + itemReceived.push_back( exdData->getField< uint32_t >( row, 284 ) ); + itemReceived.push_back( exdData->getField< uint32_t >( row, 285 ) ); + itemReceived.push_back( exdData->getField< uint32_t >( row, 286 ) ); + itemReceived.push_back( exdData->getField< uint32_t >( row, 287 ) ); + itemReceived.push_back( exdData->getField< uint32_t >( row, 288 ) ); + itemReceived.push_back( exdData->getField< uint32_t >( row, 289 ) ); + itemReceived.push_back( exdData->getField< uint32_t >( row, 290 ) ); + itemReceived.push_back( exdData->getField< uint32_t >( row, 291 ) ); + itemReceived.push_back( exdData->getField< uint32_t >( row, 292 ) ); + itemReceived.push_back( exdData->getField< uint32_t >( row, 293 ) ); + itemReceived.push_back( exdData->getField< uint32_t >( row, 294 ) ); + itemReceived.push_back( exdData->getField< uint32_t >( row, 295 ) ); + itemReceived.push_back( exdData->getField< uint32_t >( row, 296 ) ); + itemReceived.push_back( exdData->getField< uint32_t >( row, 297 ) ); + itemReceived.push_back( exdData->getField< uint32_t >( row, 298 ) ); + itemReceived.push_back( exdData->getField< uint32_t >( row, 299 ) ); + itemReceived.push_back( exdData->getField< uint32_t >( row, 300 ) ); + itemReceived.push_back( exdData->getField< uint32_t >( row, 301 ) ); + itemReceived.push_back( exdData->getField< uint32_t >( row, 302 ) ); + itemReceived.push_back( exdData->getField< uint32_t >( row, 303 ) ); + itemReceived.push_back( exdData->getField< uint32_t >( row, 304 ) ); + itemReceived.push_back( exdData->getField< uint32_t >( row, 305 ) ); + itemReceived.push_back( exdData->getField< uint32_t >( row, 306 ) ); + itemReceived.push_back( exdData->getField< uint32_t >( row, 307 ) ); + itemReceived.push_back( exdData->getField< uint32_t >( row, 308 ) ); + itemReceived.push_back( exdData->getField< uint32_t >( row, 309 ) ); + itemReceived.push_back( exdData->getField< uint32_t >( row, 310 ) ); + itemReceived.push_back( exdData->getField< uint32_t >( row, 311 ) ); + itemReceived.push_back( exdData->getField< uint32_t >( row, 312 ) ); + itemReceived.push_back( exdData->getField< uint32_t >( row, 313 ) ); + itemReceived.push_back( exdData->getField< uint32_t >( row, 314 ) ); + itemReceived.push_back( exdData->getField< uint32_t >( row, 315 ) ); + reward1.push_back( exdData->getField< uint16_t >( row, 316 ) ); + reward1.push_back( exdData->getField< uint16_t >( row, 317 ) ); + reward1.push_back( exdData->getField< uint16_t >( row, 318 ) ); + reward1.push_back( exdData->getField< uint16_t >( row, 319 ) ); + reward1.push_back( exdData->getField< uint16_t >( row, 320 ) ); + reward1.push_back( exdData->getField< uint16_t >( row, 321 ) ); + reward1.push_back( exdData->getField< uint16_t >( row, 322 ) ); + reward1.push_back( exdData->getField< uint16_t >( row, 323 ) ); + reward1.push_back( exdData->getField< uint16_t >( row, 324 ) ); + reward1.push_back( exdData->getField< uint16_t >( row, 325 ) ); + reward1.push_back( exdData->getField< uint16_t >( row, 326 ) ); + reward1.push_back( exdData->getField< uint16_t >( row, 327 ) ); + reward1.push_back( exdData->getField< uint16_t >( row, 328 ) ); + reward1.push_back( exdData->getField< uint16_t >( row, 329 ) ); + reward1.push_back( exdData->getField< uint16_t >( row, 330 ) ); + reward1.push_back( exdData->getField< uint16_t >( row, 331 ) ); + reward1.push_back( exdData->getField< uint16_t >( row, 332 ) ); + reward1.push_back( exdData->getField< uint16_t >( row, 333 ) ); + reward1.push_back( exdData->getField< uint16_t >( row, 334 ) ); + reward1.push_back( exdData->getField< uint16_t >( row, 335 ) ); + reward1.push_back( exdData->getField< uint16_t >( row, 336 ) ); + reward1.push_back( exdData->getField< uint16_t >( row, 337 ) ); + reward1.push_back( exdData->getField< uint16_t >( row, 338 ) ); + reward1.push_back( exdData->getField< uint16_t >( row, 339 ) ); + reward1.push_back( exdData->getField< uint16_t >( row, 340 ) ); + reward1.push_back( exdData->getField< uint16_t >( row, 341 ) ); + reward1.push_back( exdData->getField< uint16_t >( row, 342 ) ); + reward1.push_back( exdData->getField< uint16_t >( row, 343 ) ); + reward1.push_back( exdData->getField< uint16_t >( row, 344 ) ); + reward1.push_back( exdData->getField< uint16_t >( row, 345 ) ); + reward1.push_back( exdData->getField< uint16_t >( row, 346 ) ); + reward1.push_back( exdData->getField< uint16_t >( row, 347 ) ); + reward1.push_back( exdData->getField< uint16_t >( row, 348 ) ); + reward1.push_back( exdData->getField< uint16_t >( row, 349 ) ); + reward1.push_back( exdData->getField< uint16_t >( row, 350 ) ); + reward1.push_back( exdData->getField< uint16_t >( row, 351 ) ); + reward1.push_back( exdData->getField< uint16_t >( row, 352 ) ); + reward1.push_back( exdData->getField< uint16_t >( row, 353 ) ); + reward1.push_back( exdData->getField< uint16_t >( row, 354 ) ); + reward1.push_back( exdData->getField< uint16_t >( row, 355 ) ); + reward1.push_back( exdData->getField< uint16_t >( row, 356 ) ); + reward1.push_back( exdData->getField< uint16_t >( row, 357 ) ); + reward1.push_back( exdData->getField< uint16_t >( row, 358 ) ); + reward1.push_back( exdData->getField< uint16_t >( row, 359 ) ); + reward1.push_back( exdData->getField< uint16_t >( row, 360 ) ); + reward1.push_back( exdData->getField< uint16_t >( row, 361 ) ); + reward1.push_back( exdData->getField< uint16_t >( row, 362 ) ); + reward1.push_back( exdData->getField< uint16_t >( row, 363 ) ); + reward1.push_back( exdData->getField< uint16_t >( row, 364 ) ); + reward1.push_back( exdData->getField< uint16_t >( row, 365 ) ); + reward1.push_back( exdData->getField< uint16_t >( row, 366 ) ); + reward1.push_back( exdData->getField< uint16_t >( row, 367 ) ); + reward1.push_back( exdData->getField< uint16_t >( row, 368 ) ); + reward1.push_back( exdData->getField< uint16_t >( row, 369 ) ); + reward1.push_back( exdData->getField< uint16_t >( row, 370 ) ); + reward1.push_back( exdData->getField< uint16_t >( row, 371 ) ); + reward1.push_back( exdData->getField< uint16_t >( row, 372 ) ); + reward1.push_back( exdData->getField< uint16_t >( row, 373 ) ); + reward1.push_back( exdData->getField< uint16_t >( row, 374 ) ); + reward1.push_back( exdData->getField< uint16_t >( row, 375 ) ); + reward1.push_back( exdData->getField< uint16_t >( row, 376 ) ); + reward1.push_back( exdData->getField< uint16_t >( row, 377 ) ); + reward1.push_back( exdData->getField< uint16_t >( row, 378 ) ); + reward1.push_back( exdData->getField< uint16_t >( row, 379 ) ); + reward1.push_back( exdData->getField< uint16_t >( row, 380 ) ); + reward1.push_back( exdData->getField< uint16_t >( row, 381 ) ); + reward1.push_back( exdData->getField< uint16_t >( row, 382 ) ); + reward1.push_back( exdData->getField< uint16_t >( row, 383 ) ); + reward1.push_back( exdData->getField< uint16_t >( row, 384 ) ); + reward1.push_back( exdData->getField< uint16_t >( row, 385 ) ); + reward1.push_back( exdData->getField< uint16_t >( row, 386 ) ); + reward1.push_back( exdData->getField< uint16_t >( row, 387 ) ); + reward1.push_back( exdData->getField< uint16_t >( row, 388 ) ); + reward1.push_back( exdData->getField< uint16_t >( row, 389 ) ); + reward1.push_back( exdData->getField< uint16_t >( row, 390 ) ); + reward1.push_back( exdData->getField< uint16_t >( row, 391 ) ); + reward1.push_back( exdData->getField< uint16_t >( row, 392 ) ); + reward1.push_back( exdData->getField< uint16_t >( row, 393 ) ); + reward1.push_back( exdData->getField< uint16_t >( row, 394 ) ); + reward2.push_back( exdData->getField< uint16_t >( row, 395 ) ); + reward2.push_back( exdData->getField< uint16_t >( row, 396 ) ); + reward2.push_back( exdData->getField< uint16_t >( row, 397 ) ); + reward2.push_back( exdData->getField< uint16_t >( row, 398 ) ); + reward2.push_back( exdData->getField< uint16_t >( row, 399 ) ); + reward2.push_back( exdData->getField< uint16_t >( row, 400 ) ); + reward2.push_back( exdData->getField< uint16_t >( row, 401 ) ); + reward2.push_back( exdData->getField< uint16_t >( row, 402 ) ); + reward2.push_back( exdData->getField< uint16_t >( row, 403 ) ); + reward2.push_back( exdData->getField< uint16_t >( row, 404 ) ); + reward2.push_back( exdData->getField< uint16_t >( row, 405 ) ); + reward2.push_back( exdData->getField< uint16_t >( row, 406 ) ); + reward2.push_back( exdData->getField< uint16_t >( row, 407 ) ); + reward2.push_back( exdData->getField< uint16_t >( row, 408 ) ); + reward2.push_back( exdData->getField< uint16_t >( row, 409 ) ); + reward2.push_back( exdData->getField< uint16_t >( row, 410 ) ); + reward2.push_back( exdData->getField< uint16_t >( row, 411 ) ); + reward2.push_back( exdData->getField< uint16_t >( row, 412 ) ); + reward2.push_back( exdData->getField< uint16_t >( row, 413 ) ); + reward2.push_back( exdData->getField< uint16_t >( row, 414 ) ); + reward2.push_back( exdData->getField< uint16_t >( row, 415 ) ); + reward2.push_back( exdData->getField< uint16_t >( row, 416 ) ); + reward2.push_back( exdData->getField< uint16_t >( row, 417 ) ); + reward2.push_back( exdData->getField< uint16_t >( row, 418 ) ); + reward2.push_back( exdData->getField< uint16_t >( row, 419 ) ); + reward2.push_back( exdData->getField< uint16_t >( row, 420 ) ); + reward2.push_back( exdData->getField< uint16_t >( row, 421 ) ); + reward2.push_back( exdData->getField< uint16_t >( row, 422 ) ); + reward2.push_back( exdData->getField< uint16_t >( row, 423 ) ); + reward2.push_back( exdData->getField< uint16_t >( row, 424 ) ); + reward2.push_back( exdData->getField< uint16_t >( row, 425 ) ); + reward2.push_back( exdData->getField< uint16_t >( row, 426 ) ); + reward2.push_back( exdData->getField< uint16_t >( row, 427 ) ); + reward2.push_back( exdData->getField< uint16_t >( row, 428 ) ); + reward2.push_back( exdData->getField< uint16_t >( row, 429 ) ); + reward2.push_back( exdData->getField< uint16_t >( row, 430 ) ); + reward2.push_back( exdData->getField< uint16_t >( row, 431 ) ); + reward2.push_back( exdData->getField< uint16_t >( row, 432 ) ); + reward2.push_back( exdData->getField< uint16_t >( row, 433 ) ); + reward2.push_back( exdData->getField< uint16_t >( row, 434 ) ); + reward2.push_back( exdData->getField< uint16_t >( row, 435 ) ); + reward2.push_back( exdData->getField< uint16_t >( row, 436 ) ); + reward2.push_back( exdData->getField< uint16_t >( row, 437 ) ); + reward2.push_back( exdData->getField< uint16_t >( row, 438 ) ); + reward2.push_back( exdData->getField< uint16_t >( row, 439 ) ); + reward2.push_back( exdData->getField< uint16_t >( row, 440 ) ); + reward2.push_back( exdData->getField< uint16_t >( row, 441 ) ); + reward2.push_back( exdData->getField< uint16_t >( row, 442 ) ); + reward2.push_back( exdData->getField< uint16_t >( row, 443 ) ); + reward2.push_back( exdData->getField< uint16_t >( row, 444 ) ); + reward2.push_back( exdData->getField< uint16_t >( row, 445 ) ); + reward2.push_back( exdData->getField< uint16_t >( row, 446 ) ); + reward2.push_back( exdData->getField< uint16_t >( row, 447 ) ); + reward2.push_back( exdData->getField< uint16_t >( row, 448 ) ); + reward2.push_back( exdData->getField< uint16_t >( row, 449 ) ); + reward2.push_back( exdData->getField< uint16_t >( row, 450 ) ); + reward2.push_back( exdData->getField< uint16_t >( row, 451 ) ); + reward2.push_back( exdData->getField< uint16_t >( row, 452 ) ); + reward2.push_back( exdData->getField< uint16_t >( row, 453 ) ); + reward2.push_back( exdData->getField< uint16_t >( row, 454 ) ); + reward2.push_back( exdData->getField< uint16_t >( row, 455 ) ); + reward2.push_back( exdData->getField< uint16_t >( row, 456 ) ); + reward2.push_back( exdData->getField< uint16_t >( row, 457 ) ); + reward2.push_back( exdData->getField< uint16_t >( row, 458 ) ); + reward2.push_back( exdData->getField< uint16_t >( row, 459 ) ); + reward2.push_back( exdData->getField< uint16_t >( row, 460 ) ); + reward2.push_back( exdData->getField< uint16_t >( row, 461 ) ); + reward2.push_back( exdData->getField< uint16_t >( row, 462 ) ); + reward2.push_back( exdData->getField< uint16_t >( row, 463 ) ); + reward2.push_back( exdData->getField< uint16_t >( row, 464 ) ); + reward2.push_back( exdData->getField< uint16_t >( row, 465 ) ); + reward2.push_back( exdData->getField< uint16_t >( row, 466 ) ); + reward2.push_back( exdData->getField< uint16_t >( row, 467 ) ); + reward2.push_back( exdData->getField< uint16_t >( row, 468 ) ); + reward2.push_back( exdData->getField< uint16_t >( row, 469 ) ); + reward2.push_back( exdData->getField< uint16_t >( row, 470 ) ); + reward2.push_back( exdData->getField< uint16_t >( row, 471 ) ); + reward2.push_back( exdData->getField< uint16_t >( row, 472 ) ); + reward2.push_back( exdData->getField< uint16_t >( row, 473 ) ); + phase.push_back( exdData->getField< uint8_t >( row, 474 ) ); + phase.push_back( exdData->getField< uint8_t >( row, 475 ) ); + phase.push_back( exdData->getField< uint8_t >( row, 476 ) ); + phase.push_back( exdData->getField< uint8_t >( row, 477 ) ); + phase.push_back( exdData->getField< uint8_t >( row, 478 ) ); + phase.push_back( exdData->getField< uint8_t >( row, 479 ) ); + phase.push_back( exdData->getField< uint8_t >( row, 480 ) ); + phase.push_back( exdData->getField< uint8_t >( row, 481 ) ); + phase.push_back( exdData->getField< uint8_t >( row, 482 ) ); + phase.push_back( exdData->getField< uint8_t >( row, 483 ) ); + phase.push_back( exdData->getField< uint8_t >( row, 484 ) ); + phase.push_back( exdData->getField< uint8_t >( row, 485 ) ); + phase.push_back( exdData->getField< uint8_t >( row, 486 ) ); + phase.push_back( exdData->getField< uint8_t >( row, 487 ) ); + phase.push_back( exdData->getField< uint8_t >( row, 488 ) ); + phase.push_back( exdData->getField< uint8_t >( row, 489 ) ); + phase.push_back( exdData->getField< uint8_t >( row, 490 ) ); + phase.push_back( exdData->getField< uint8_t >( row, 491 ) ); + phase.push_back( exdData->getField< uint8_t >( row, 492 ) ); + phase.push_back( exdData->getField< uint8_t >( row, 493 ) ); + phase.push_back( exdData->getField< uint8_t >( row, 494 ) ); + phase.push_back( exdData->getField< uint8_t >( row, 495 ) ); + phase.push_back( exdData->getField< uint8_t >( row, 496 ) ); + phase.push_back( exdData->getField< uint8_t >( row, 497 ) ); + phase.push_back( exdData->getField< uint8_t >( row, 498 ) ); + phase.push_back( exdData->getField< uint8_t >( row, 499 ) ); + phase.push_back( exdData->getField< uint8_t >( row, 500 ) ); + phase.push_back( exdData->getField< uint8_t >( row, 501 ) ); + phase.push_back( exdData->getField< uint8_t >( row, 502 ) ); + phase.push_back( exdData->getField< uint8_t >( row, 503 ) ); + phase.push_back( exdData->getField< uint8_t >( row, 504 ) ); + phase.push_back( exdData->getField< uint8_t >( row, 505 ) ); + phase.push_back( exdData->getField< uint8_t >( row, 506 ) ); + phase.push_back( exdData->getField< uint8_t >( row, 507 ) ); + phase.push_back( exdData->getField< uint8_t >( row, 508 ) ); + phase.push_back( exdData->getField< uint8_t >( row, 509 ) ); + phase.push_back( exdData->getField< uint8_t >( row, 510 ) ); + phase.push_back( exdData->getField< uint8_t >( row, 511 ) ); + phase.push_back( exdData->getField< uint8_t >( row, 512 ) ); + phase.push_back( exdData->getField< uint8_t >( row, 513 ) ); + phase.push_back( exdData->getField< uint8_t >( row, 514 ) ); + phase.push_back( exdData->getField< uint8_t >( row, 515 ) ); + phase.push_back( exdData->getField< uint8_t >( row, 516 ) ); + phase.push_back( exdData->getField< uint8_t >( row, 517 ) ); + phase.push_back( exdData->getField< uint8_t >( row, 518 ) ); + phase.push_back( exdData->getField< uint8_t >( row, 519 ) ); + phase.push_back( exdData->getField< uint8_t >( row, 520 ) ); + phase.push_back( exdData->getField< uint8_t >( row, 521 ) ); + phase.push_back( exdData->getField< uint8_t >( row, 522 ) ); + phase.push_back( exdData->getField< uint8_t >( row, 523 ) ); + phase.push_back( exdData->getField< uint8_t >( row, 524 ) ); + phase.push_back( exdData->getField< uint8_t >( row, 525 ) ); + phase.push_back( exdData->getField< uint8_t >( row, 526 ) ); + phase.push_back( exdData->getField< uint8_t >( row, 527 ) ); + phase.push_back( exdData->getField< uint8_t >( row, 528 ) ); + phase.push_back( exdData->getField< uint8_t >( row, 529 ) ); + phase.push_back( exdData->getField< uint8_t >( row, 530 ) ); + phase.push_back( exdData->getField< uint8_t >( row, 531 ) ); + phase.push_back( exdData->getField< uint8_t >( row, 532 ) ); + phase.push_back( exdData->getField< uint8_t >( row, 533 ) ); + phase.push_back( exdData->getField< uint8_t >( row, 534 ) ); + phase.push_back( exdData->getField< uint8_t >( row, 535 ) ); + phase.push_back( exdData->getField< uint8_t >( row, 536 ) ); + phase.push_back( exdData->getField< uint8_t >( row, 537 ) ); + phase.push_back( exdData->getField< uint8_t >( row, 538 ) ); + phase.push_back( exdData->getField< uint8_t >( row, 539 ) ); + phase.push_back( exdData->getField< uint8_t >( row, 540 ) ); + phase.push_back( exdData->getField< uint8_t >( row, 541 ) ); + phase.push_back( exdData->getField< uint8_t >( row, 542 ) ); + phase.push_back( exdData->getField< uint8_t >( row, 543 ) ); + phase.push_back( exdData->getField< uint8_t >( row, 544 ) ); + phase.push_back( exdData->getField< uint8_t >( row, 545 ) ); + phase.push_back( exdData->getField< uint8_t >( row, 546 ) ); + phase.push_back( exdData->getField< uint8_t >( row, 547 ) ); + phase.push_back( exdData->getField< uint8_t >( row, 548 ) ); + phase.push_back( exdData->getField< uint8_t >( row, 549 ) ); + phase.push_back( exdData->getField< uint8_t >( row, 550 ) ); + phase.push_back( exdData->getField< uint8_t >( row, 551 ) ); + phase.push_back( exdData->getField< uint8_t >( row, 552 ) ); } Sapphire::Data::HWDGathererInspectionReward::HWDGathererInspectionReward( uint32_t row_id, Sapphire::Data::ExdDataGenerated* exdData ) @@ -5308,17 +5671,12 @@ Sapphire::Data::IKDFishParam::IKDFishParam( uint32_t row_id, Sapphire::Data::Exd auto row = exdData->m_IKDFishParamDat.get_row( row_id ); fish = exdData->getField< uint32_t >( row, 0 ); iKDContentBonus = exdData->getField< uint8_t >( row, 1 ); + unknown54 = exdData->getField< uint8_t >( row, 2 ); } Sapphire::Data::IKDRoute::IKDRoute( uint32_t row_id, Sapphire::Data::ExdDataGenerated* exdData ) { auto row = exdData->m_IKDRouteDat.get_row( row_id ); - spot.push_back( exdData->getField< uint32_t >( row, 0 ) ); - spot.push_back( exdData->getField< uint32_t >( row, 1 ) ); - spot.push_back( exdData->getField< uint32_t >( row, 2 ) ); - spot.push_back( exdData->getField< uint32_t >( row, 3 ) ); - spot.push_back( exdData->getField< uint32_t >( row, 4 ) ); - timeDefine = exdData->getField< uint8_t >( row, 5 ); image = exdData->getField< uint32_t >( row, 6 ); territoryType = exdData->getField< uint32_t >( row, 7 ); name = exdData->getField< std::string >( row, 8 ); @@ -5435,6 +5793,8 @@ Sapphire::Data::InstanceContent::InstanceContent( uint32_t row_id, Sapphire::Dat instanceContentBuff = exdData->getField< uint32_t >( row, 50 ); reqInstance = exdData->getField< int32_t >( row, 51 ); partyCondition = exdData->getField< int16_t >( row, 53 ); + unknown540 = exdData->getField< uint16_t >( row, 61 ); + unknown541 = exdData->getField< uint16_t >( row, 62 ); } Sapphire::Data::InstanceContentBuff::InstanceContentBuff( uint32_t row_id, Sapphire::Data::ExdDataGenerated* exdData ) @@ -5449,6 +5809,8 @@ Sapphire::Data::InstanceContentCSBonus::InstanceContentCSBonus( uint32_t row_id, auto row = exdData->m_InstanceContentCSBonusDat.get_row( row_id ); instance = exdData->getField< uint16_t >( row, 0 ); item = exdData->getField< uint32_t >( row, 1 ); + unknown540 = exdData->getField< uint8_t >( row, 3 ); + unknown541 = exdData->getField< uint8_t >( row, 4 ); } Sapphire::Data::InstanceContentGuide::InstanceContentGuide( uint32_t row_id, Sapphire::Data::ExdDataGenerated* exdData ) @@ -5488,7 +5850,7 @@ Sapphire::Data::Item::Item( uint32_t row_id, Sapphire::Data::ExdDataGenerated* e isUnique = exdData->getField< bool >( row, 21 ); isUntradable = exdData->getField< bool >( row, 22 ); isIndisposable = exdData->getField< bool >( row, 23 ); - isEquippable = exdData->getField< bool >( row, 24 ); + lot = exdData->getField< bool >( row, 24 ); priceMid = exdData->getField< uint32_t >( row, 25 ); priceLow = exdData->getField< uint32_t >( row, 26 ); canBeHq = exdData->getField< bool >( row, 27 ); @@ -5503,34 +5865,35 @@ Sapphire::Data::Item::Item( uint32_t row_id, Sapphire::Data::ExdDataGenerated* e isCollectable = exdData->getField< bool >( row, 37 ); alwaysCollectable = exdData->getField< bool >( row, 38 ); aetherialReduce = exdData->getField< uint16_t >( row, 39 ); - levelEquip = exdData->getField< uint8_t >( row, 40 ); - equipRestriction = exdData->getField< uint8_t >( row, 42 ); - classJobCategory = exdData->getField< uint8_t >( row, 43 ); - grandCompany = exdData->getField< uint8_t >( row, 44 ); - itemSeries = exdData->getField< uint8_t >( row, 45 ); - baseParamModifier = exdData->getField< uint8_t >( row, 46 ); - modelMain = exdData->getField< uint64_t >( row, 47 ); - modelSub = exdData->getField< uint64_t >( row, 48 ); - classJobUse = exdData->getField< uint8_t >( row, 49 ); - damagePhys = exdData->getField< uint16_t >( row, 51 ); - damageMag = exdData->getField< uint16_t >( row, 52 ); - delayms = exdData->getField< uint16_t >( row, 53 ); - blockRate = exdData->getField< uint16_t >( row, 55 ); - block = exdData->getField< uint16_t >( row, 56 ); - defensePhys = exdData->getField< uint16_t >( row, 57 ); - defenseMag = exdData->getField< uint16_t >( row, 58 ); - itemSpecialBonus = exdData->getField< uint8_t >( row, 71 ); - itemSpecialBonusParam = exdData->getField< uint8_t >( row, 72 ); - materializeType = exdData->getField< uint8_t >( row, 85 ); - materiaSlotCount = exdData->getField< uint8_t >( row, 86 ); - isAdvancedMeldingPermitted = exdData->getField< bool >( row, 87 ); - isPvP = exdData->getField< bool >( row, 88 ); - isGlamourous = exdData->getField< bool >( row, 90 ); + unknown54 = exdData->getField< uint16_t >( row, 40 ); + levelEquip = exdData->getField< uint8_t >( row, 41 ); + equipRestriction = exdData->getField< uint8_t >( row, 43 ); + classJobCategory = exdData->getField< uint8_t >( row, 44 ); + grandCompany = exdData->getField< uint8_t >( row, 45 ); + itemSeries = exdData->getField< uint8_t >( row, 46 ); + baseParamModifier = exdData->getField< uint8_t >( row, 47 ); + modelMain = exdData->getField< uint64_t >( row, 48 ); + modelSub = exdData->getField< uint64_t >( row, 49 ); + classJobUse = exdData->getField< uint8_t >( row, 50 ); + damagePhys = exdData->getField< uint16_t >( row, 52 ); + damageMag = exdData->getField< uint16_t >( row, 53 ); + delayms = exdData->getField< uint16_t >( row, 54 ); + blockRate = exdData->getField< uint16_t >( row, 56 ); + block = exdData->getField< uint16_t >( row, 57 ); + defensePhys = exdData->getField< uint16_t >( row, 58 ); + defenseMag = exdData->getField< uint16_t >( row, 59 ); + itemSpecialBonus = exdData->getField< uint8_t >( row, 72 ); + itemSpecialBonusParam = exdData->getField< uint8_t >( row, 73 ); + materializeType = exdData->getField< uint8_t >( row, 86 ); + materiaSlotCount = exdData->getField< uint8_t >( row, 87 ); + isAdvancedMeldingPermitted = exdData->getField< bool >( row, 88 ); + isPvP = exdData->getField< bool >( row, 89 ); + isGlamourous = exdData->getField< bool >( row, 91 ); for( int i = 0; i < 6; ++i ) { - param[i].baseparam = exdData->getField< uint8_t >( row, 59 + i * 2 ); - param[i].value = exdData->getField< int16_t >( row, 60 + i * 2 ); + param[i].baseparam = exdData->getField< uint8_t >( row, 60 + i * 2 ); + param[i].value = exdData->getField< int16_t >( row, 61 + i * 2 ); } } @@ -5898,25 +6261,122 @@ Sapphire::Data::LotteryExchangeShop::LotteryExchangeShop( uint32_t row_id, Sapph itemAccepted.push_back( exdData->getField< int32_t >( row, 14 ) ); itemAccepted.push_back( exdData->getField< int32_t >( row, 15 ) ); itemAccepted.push_back( exdData->getField< int32_t >( row, 16 ) ); - amountAccepted.push_back( exdData->getField< uint32_t >( row, 17 ) ); - amountAccepted.push_back( exdData->getField< uint32_t >( row, 18 ) ); - amountAccepted.push_back( exdData->getField< uint32_t >( row, 19 ) ); - amountAccepted.push_back( exdData->getField< uint32_t >( row, 20 ) ); - amountAccepted.push_back( exdData->getField< uint32_t >( row, 21 ) ); - amountAccepted.push_back( exdData->getField< uint32_t >( row, 22 ) ); - amountAccepted.push_back( exdData->getField< uint32_t >( row, 23 ) ); - amountAccepted.push_back( exdData->getField< uint32_t >( row, 24 ) ); - amountAccepted.push_back( exdData->getField< uint32_t >( row, 25 ) ); - amountAccepted.push_back( exdData->getField< uint32_t >( row, 26 ) ); - amountAccepted.push_back( exdData->getField< uint32_t >( row, 27 ) ); - amountAccepted.push_back( exdData->getField< uint32_t >( row, 28 ) ); - amountAccepted.push_back( exdData->getField< uint32_t >( row, 29 ) ); - amountAccepted.push_back( exdData->getField< uint32_t >( row, 30 ) ); - amountAccepted.push_back( exdData->getField< uint32_t >( row, 31 ) ); - amountAccepted.push_back( exdData->getField< uint32_t >( row, 32 ) ); - lua = exdData->getField< std::string >( row, 65 ); - logMessage.push_back( exdData->getField< uint32_t >( row, 66 ) ); - logMessage.push_back( exdData->getField< uint32_t >( row, 67 ) ); + itemAccepted.push_back( exdData->getField< int32_t >( row, 17 ) ); + itemAccepted.push_back( exdData->getField< int32_t >( row, 18 ) ); + itemAccepted.push_back( exdData->getField< int32_t >( row, 19 ) ); + itemAccepted.push_back( exdData->getField< int32_t >( row, 20 ) ); + itemAccepted.push_back( exdData->getField< int32_t >( row, 21 ) ); + itemAccepted.push_back( exdData->getField< int32_t >( row, 22 ) ); + itemAccepted.push_back( exdData->getField< int32_t >( row, 23 ) ); + itemAccepted.push_back( exdData->getField< int32_t >( row, 24 ) ); + itemAccepted.push_back( exdData->getField< int32_t >( row, 25 ) ); + itemAccepted.push_back( exdData->getField< int32_t >( row, 26 ) ); + itemAccepted.push_back( exdData->getField< int32_t >( row, 27 ) ); + itemAccepted.push_back( exdData->getField< int32_t >( row, 28 ) ); + itemAccepted.push_back( exdData->getField< int32_t >( row, 29 ) ); + itemAccepted.push_back( exdData->getField< int32_t >( row, 30 ) ); + itemAccepted.push_back( exdData->getField< int32_t >( row, 31 ) ); + itemAccepted.push_back( exdData->getField< int32_t >( row, 32 ) ); + amountAccepted.push_back( exdData->getField< uint32_t >( row, 33 ) ); + amountAccepted.push_back( exdData->getField< uint32_t >( row, 34 ) ); + amountAccepted.push_back( exdData->getField< uint32_t >( row, 35 ) ); + amountAccepted.push_back( exdData->getField< uint32_t >( row, 36 ) ); + amountAccepted.push_back( exdData->getField< uint32_t >( row, 37 ) ); + amountAccepted.push_back( exdData->getField< uint32_t >( row, 38 ) ); + amountAccepted.push_back( exdData->getField< uint32_t >( row, 39 ) ); + amountAccepted.push_back( exdData->getField< uint32_t >( row, 40 ) ); + amountAccepted.push_back( exdData->getField< uint32_t >( row, 41 ) ); + amountAccepted.push_back( exdData->getField< uint32_t >( row, 42 ) ); + amountAccepted.push_back( exdData->getField< uint32_t >( row, 43 ) ); + amountAccepted.push_back( exdData->getField< uint32_t >( row, 44 ) ); + amountAccepted.push_back( exdData->getField< uint32_t >( row, 45 ) ); + amountAccepted.push_back( exdData->getField< uint32_t >( row, 46 ) ); + amountAccepted.push_back( exdData->getField< uint32_t >( row, 47 ) ); + amountAccepted.push_back( exdData->getField< uint32_t >( row, 48 ) ); + amountAccepted.push_back( exdData->getField< uint32_t >( row, 49 ) ); + amountAccepted.push_back( exdData->getField< uint32_t >( row, 50 ) ); + amountAccepted.push_back( exdData->getField< uint32_t >( row, 51 ) ); + amountAccepted.push_back( exdData->getField< uint32_t >( row, 52 ) ); + amountAccepted.push_back( exdData->getField< uint32_t >( row, 53 ) ); + amountAccepted.push_back( exdData->getField< uint32_t >( row, 54 ) ); + amountAccepted.push_back( exdData->getField< uint32_t >( row, 55 ) ); + amountAccepted.push_back( exdData->getField< uint32_t >( row, 56 ) ); + amountAccepted.push_back( exdData->getField< uint32_t >( row, 57 ) ); + amountAccepted.push_back( exdData->getField< uint32_t >( row, 58 ) ); + amountAccepted.push_back( exdData->getField< uint32_t >( row, 59 ) ); + amountAccepted.push_back( exdData->getField< uint32_t >( row, 60 ) ); + amountAccepted.push_back( exdData->getField< uint32_t >( row, 61 ) ); + amountAccepted.push_back( exdData->getField< uint32_t >( row, 62 ) ); + amountAccepted.push_back( exdData->getField< uint32_t >( row, 63 ) ); + amountAccepted.push_back( exdData->getField< uint32_t >( row, 64 ) ); + unknown540.push_back( exdData->getField< uint8_t >( row, 65 ) ); + unknown540.push_back( exdData->getField< uint8_t >( row, 66 ) ); + unknown540.push_back( exdData->getField< uint8_t >( row, 67 ) ); + unknown540.push_back( exdData->getField< uint8_t >( row, 68 ) ); + unknown540.push_back( exdData->getField< uint8_t >( row, 69 ) ); + unknown540.push_back( exdData->getField< uint8_t >( row, 70 ) ); + unknown540.push_back( exdData->getField< uint8_t >( row, 71 ) ); + unknown540.push_back( exdData->getField< uint8_t >( row, 72 ) ); + unknown540.push_back( exdData->getField< uint8_t >( row, 73 ) ); + unknown540.push_back( exdData->getField< uint8_t >( row, 74 ) ); + unknown540.push_back( exdData->getField< uint8_t >( row, 75 ) ); + unknown540.push_back( exdData->getField< uint8_t >( row, 76 ) ); + unknown540.push_back( exdData->getField< uint8_t >( row, 77 ) ); + unknown540.push_back( exdData->getField< uint8_t >( row, 78 ) ); + unknown540.push_back( exdData->getField< uint8_t >( row, 79 ) ); + unknown540.push_back( exdData->getField< uint8_t >( row, 80 ) ); + unknown540.push_back( exdData->getField< uint8_t >( row, 81 ) ); + unknown540.push_back( exdData->getField< uint8_t >( row, 82 ) ); + unknown540.push_back( exdData->getField< uint8_t >( row, 83 ) ); + unknown540.push_back( exdData->getField< uint8_t >( row, 84 ) ); + unknown540.push_back( exdData->getField< uint8_t >( row, 85 ) ); + unknown540.push_back( exdData->getField< uint8_t >( row, 86 ) ); + unknown540.push_back( exdData->getField< uint8_t >( row, 87 ) ); + unknown540.push_back( exdData->getField< uint8_t >( row, 88 ) ); + unknown540.push_back( exdData->getField< uint8_t >( row, 89 ) ); + unknown540.push_back( exdData->getField< uint8_t >( row, 90 ) ); + unknown540.push_back( exdData->getField< uint8_t >( row, 91 ) ); + unknown540.push_back( exdData->getField< uint8_t >( row, 92 ) ); + unknown540.push_back( exdData->getField< uint8_t >( row, 93 ) ); + unknown540.push_back( exdData->getField< uint8_t >( row, 94 ) ); + unknown540.push_back( exdData->getField< uint8_t >( row, 95 ) ); + unknown540.push_back( exdData->getField< uint8_t >( row, 96 ) ); + unknown541.push_back( exdData->getField< uint8_t >( row, 97 ) ); + unknown541.push_back( exdData->getField< uint8_t >( row, 98 ) ); + unknown541.push_back( exdData->getField< uint8_t >( row, 99 ) ); + unknown541.push_back( exdData->getField< uint8_t >( row, 100 ) ); + unknown541.push_back( exdData->getField< uint8_t >( row, 101 ) ); + unknown541.push_back( exdData->getField< uint8_t >( row, 102 ) ); + unknown541.push_back( exdData->getField< uint8_t >( row, 103 ) ); + unknown541.push_back( exdData->getField< uint8_t >( row, 104 ) ); + unknown541.push_back( exdData->getField< uint8_t >( row, 105 ) ); + unknown541.push_back( exdData->getField< uint8_t >( row, 106 ) ); + unknown541.push_back( exdData->getField< uint8_t >( row, 107 ) ); + unknown541.push_back( exdData->getField< uint8_t >( row, 108 ) ); + unknown541.push_back( exdData->getField< uint8_t >( row, 109 ) ); + unknown541.push_back( exdData->getField< uint8_t >( row, 110 ) ); + unknown541.push_back( exdData->getField< uint8_t >( row, 111 ) ); + unknown541.push_back( exdData->getField< uint8_t >( row, 112 ) ); + unknown541.push_back( exdData->getField< uint8_t >( row, 113 ) ); + unknown541.push_back( exdData->getField< uint8_t >( row, 114 ) ); + unknown541.push_back( exdData->getField< uint8_t >( row, 115 ) ); + unknown541.push_back( exdData->getField< uint8_t >( row, 116 ) ); + unknown541.push_back( exdData->getField< uint8_t >( row, 117 ) ); + unknown541.push_back( exdData->getField< uint8_t >( row, 118 ) ); + unknown541.push_back( exdData->getField< uint8_t >( row, 119 ) ); + unknown541.push_back( exdData->getField< uint8_t >( row, 120 ) ); + unknown541.push_back( exdData->getField< uint8_t >( row, 121 ) ); + unknown541.push_back( exdData->getField< uint8_t >( row, 122 ) ); + unknown541.push_back( exdData->getField< uint8_t >( row, 123 ) ); + unknown541.push_back( exdData->getField< uint8_t >( row, 124 ) ); + unknown541.push_back( exdData->getField< uint8_t >( row, 125 ) ); + unknown541.push_back( exdData->getField< uint8_t >( row, 126 ) ); + unknown541.push_back( exdData->getField< uint8_t >( row, 127 ) ); + unknown541.push_back( exdData->getField< uint8_t >( row, 128 ) ); + lua = exdData->getField< std::string >( row, 129 ); + logMessage.push_back( exdData->getField< uint32_t >( row, 130 ) ); + logMessage.push_back( exdData->getField< uint32_t >( row, 131 ) ); + logMessage.push_back( exdData->getField< uint32_t >( row, 132 ) ); } Sapphire::Data::MacroIcon::MacroIcon( uint32_t row_id, Sapphire::Data::ExdDataGenerated* exdData ) @@ -6050,16 +6510,16 @@ Sapphire::Data::Materia::Materia( uint32_t row_id, Sapphire::Data::ExdDataGenera item.push_back( exdData->getField< int32_t >( row, 8 ) ); item.push_back( exdData->getField< int32_t >( row, 9 ) ); baseParam = exdData->getField< uint8_t >( row, 10 ); - value.push_back( exdData->getField< uint8_t >( row, 11 ) ); - value.push_back( exdData->getField< uint8_t >( row, 12 ) ); - value.push_back( exdData->getField< uint8_t >( row, 13 ) ); - value.push_back( exdData->getField< uint8_t >( row, 14 ) ); - value.push_back( exdData->getField< uint8_t >( row, 15 ) ); - value.push_back( exdData->getField< uint8_t >( row, 16 ) ); - value.push_back( exdData->getField< uint8_t >( row, 17 ) ); - value.push_back( exdData->getField< uint8_t >( row, 18 ) ); - value.push_back( exdData->getField< uint8_t >( row, 19 ) ); - value.push_back( exdData->getField< uint8_t >( row, 20 ) ); + value.push_back( exdData->getField< int16_t >( row, 11 ) ); + value.push_back( exdData->getField< int16_t >( row, 12 ) ); + value.push_back( exdData->getField< int16_t >( row, 13 ) ); + value.push_back( exdData->getField< int16_t >( row, 14 ) ); + value.push_back( exdData->getField< int16_t >( row, 15 ) ); + value.push_back( exdData->getField< int16_t >( row, 16 ) ); + value.push_back( exdData->getField< int16_t >( row, 17 ) ); + value.push_back( exdData->getField< int16_t >( row, 18 ) ); + value.push_back( exdData->getField< int16_t >( row, 19 ) ); + value.push_back( exdData->getField< int16_t >( row, 20 ) ); } Sapphire::Data::MateriaJoinRate::MateriaJoinRate( uint32_t row_id, Sapphire::Data::ExdDataGenerated* exdData ) @@ -6098,7 +6558,8 @@ Sapphire::Data::MiniGameRA::MiniGameRA( uint32_t row_id, Sapphire::Data::ExdData { auto row = exdData->m_MiniGameRADat.get_row( row_id ); icon = exdData->getField< int32_t >( row, 1 ); - bGM = exdData->getField< int32_t >( row, 2 ); + image = exdData->getField< int32_t >( row, 2 ); + bGM = exdData->getField< int32_t >( row, 3 ); } Sapphire::Data::MinionRace::MinionRace( uint32_t row_id, Sapphire::Data::ExdDataGenerated* exdData ) @@ -6365,6 +6826,14 @@ Sapphire::Data::MoveVfx::MoveVfx( uint32_t row_id, Sapphire::Data::ExdDataGenera vFXWalking = exdData->getField< uint16_t >( row, 1 ); } +Sapphire::Data::MovieStaffList::MovieStaffList( uint32_t row_id, Sapphire::Data::ExdDataGenerated* exdData ) +{ + auto row = exdData->m_MovieStaffListDat.get_row( row_id ); + image = exdData->getField< uint32_t >( row, 0 ); + startTime = exdData->getField< float >( row, 1 ); + endTime = exdData->getField< float >( row, 2 ); +} + Sapphire::Data::MovieSubtitle::MovieSubtitle( uint32_t row_id, Sapphire::Data::ExdDataGenerated* exdData ) { auto row = exdData->m_MovieSubtitleDat.get_row( row_id ); @@ -6407,12 +6876,15 @@ Sapphire::Data::MYCWarResultNotebook::MYCWarResultNotebook( uint32_t row_id, Sap { auto row = exdData->m_MYCWarResultNotebookDat.get_row( row_id ); number = exdData->getField< uint8_t >( row, 0 ); - icon = exdData->getField< int32_t >( row, 1 ); - image = exdData->getField< int32_t >( row, 2 ); - rarity = exdData->getField< uint8_t >( row, 3 ); - nameJP = exdData->getField< std::string >( row, 4 ); - name = exdData->getField< std::string >( row, 5 ); - description = exdData->getField< std::string >( row, 6 ); + unknown540 = exdData->getField< uint8_t >( row, 1 ); + unknown541 = exdData->getField< uint8_t >( row, 2 ); + quest = exdData->getField< int32_t >( row, 3 ); + icon = exdData->getField< int32_t >( row, 4 ); + image = exdData->getField< int32_t >( row, 5 ); + rarity = exdData->getField< uint8_t >( row, 6 ); + nameJP = exdData->getField< std::string >( row, 7 ); + name = exdData->getField< std::string >( row, 8 ); + description = exdData->getField< std::string >( row, 9 ); } Sapphire::Data::NotebookDivision::NotebookDivision( uint32_t row_id, Sapphire::Data::ExdDataGenerated* exdData ) @@ -6485,7 +6957,8 @@ Sapphire::Data::NpcYell::NpcYell( uint32_t row_id, Sapphire::Data::ExdDataGenera balloonTime = exdData->getField< float >( row, 6 ); isBalloonSlow = exdData->getField< bool >( row, 7 ); battleTalkTime = exdData->getField< bool >( row, 8 ); - text = exdData->getField< float >( row, 9 ); + unknown54 = exdData->getField< uint8_t >( row, 9 ); + text = exdData->getField< std::string >( row, 10 ); } Sapphire::Data::Omen::Omen( uint32_t row_id, Sapphire::Data::ExdDataGenerated* exdData ) @@ -6568,7 +7041,8 @@ Sapphire::Data::OrchestrionCategory::OrchestrionCategory( uint32_t row_id, Sapph { auto row = exdData->m_OrchestrionCategoryDat.get_row( row_id ); name = exdData->getField< std::string >( row, 0 ); - hideCategory = exdData->getField< uint8_t >( row, 1 ); + hideOrder = exdData->getField< uint8_t >( row, 1 ); + icon = exdData->getField< uint32_t >( row, 2 ); order = exdData->getField< uint8_t >( row, 3 ); } @@ -6629,6 +7103,33 @@ Sapphire::Data::PartyContent::PartyContent( uint32_t row_id, Sapphire::Data::Exd name = exdData->getField< bool >( row, 2 ); textDataStart = exdData->getField< uint32_t >( row, 3 ); textDataEnd = exdData->getField< uint32_t >( row, 4 ); + lGBEventObject0.push_back( exdData->getField< uint32_t >( row, 5 ) ); + lGBEventObject0.push_back( exdData->getField< uint32_t >( row, 6 ) ); + lGBEventObject0.push_back( exdData->getField< uint32_t >( row, 7 ) ); + lGBEventObject0.push_back( exdData->getField< uint32_t >( row, 8 ) ); + lGBEventObject0.push_back( exdData->getField< uint32_t >( row, 9 ) ); + lGBEventObject0.push_back( exdData->getField< uint32_t >( row, 10 ) ); + lGBEventObject0.push_back( exdData->getField< uint32_t >( row, 11 ) ); + lGBEventObject0.push_back( exdData->getField< uint32_t >( row, 12 ) ); + lGBEventObject0.push_back( exdData->getField< uint32_t >( row, 13 ) ); + lGBEventRange.push_back( exdData->getField< uint32_t >( row, 14 ) ); + lGBEventRange.push_back( exdData->getField< uint32_t >( row, 15 ) ); + lGBEventRange.push_back( exdData->getField< uint32_t >( row, 16 ) ); + lGBEventRange.push_back( exdData->getField< uint32_t >( row, 17 ) ); + lGBEventRange.push_back( exdData->getField< uint32_t >( row, 18 ) ); + lGBEventRange.push_back( exdData->getField< uint32_t >( row, 19 ) ); + lGBEventRange.push_back( exdData->getField< uint32_t >( row, 20 ) ); + lGBEventRange.push_back( exdData->getField< uint32_t >( row, 21 ) ); + lGBEventRange.push_back( exdData->getField< uint32_t >( row, 22 ) ); + lGBEventObject1.push_back( exdData->getField< uint32_t >( row, 23 ) ); + lGBEventObject1.push_back( exdData->getField< uint32_t >( row, 24 ) ); + lGBEventObject1.push_back( exdData->getField< uint32_t >( row, 25 ) ); + lGBEventObject1.push_back( exdData->getField< uint32_t >( row, 26 ) ); + lGBEventObject1.push_back( exdData->getField< uint32_t >( row, 27 ) ); + lGBEventObject1.push_back( exdData->getField< uint32_t >( row, 28 ) ); + lGBEventObject1.push_back( exdData->getField< uint32_t >( row, 29 ) ); + lGBEventObject1.push_back( exdData->getField< uint32_t >( row, 30 ) ); + lGBEventObject1.push_back( exdData->getField< uint32_t >( row, 31 ) ); contentFinderCondition = exdData->getField< uint16_t >( row, 33 ); image = exdData->getField< uint32_t >( row, 34 ); } @@ -6819,6 +7320,9 @@ Sapphire::Data::PublicContent::PublicContent( uint32_t row_id, Sapphire::Data::E textDataEnd = exdData->getField< uint32_t >( row, 5 ); contentFinderCondition = exdData->getField< uint16_t >( row, 9 ); additionalData = exdData->getField< uint16_t >( row, 10 ); + unknown540 = exdData->getField< int32_t >( row, 13 ); + unknown541 = exdData->getField< uint16_t >( row, 14 ); + unknown542 = exdData->getField< uint16_t >( row, 15 ); } Sapphire::Data::PublicContentCutscene::PublicContentCutscene( uint32_t row_id, Sapphire::Data::ExdDataGenerated* exdData ) @@ -8217,6 +8721,7 @@ Sapphire::Data::Quest::Quest( uint32_t row_id, Sapphire::Data::ExdDataGenerated* hideOfferIcon = exdData->getField< bool >( row, 1511 ); eventIconType = exdData->getField< uint8_t >( row, 1512 ); sortKey = exdData->getField< uint16_t >( row, 1514 ); + unknown54 = exdData->getField< bool >( row, 1515 ); } Sapphire::Data::QuestBattle::QuestBattle( uint32_t row_id, Sapphire::Data::ExdDataGenerated* exdData ) @@ -8668,7 +9173,7 @@ Sapphire::Data::QuestClassJobSupply::QuestClassJobSupply( uint32_t row_id, uint3 Sapphire::Data::QuestDerivedClass::QuestDerivedClass( uint32_t row_id, Sapphire::Data::ExdDataGenerated* exdData ) { auto row = exdData->m_QuestDerivedClassDat.get_row( row_id ); - quest = exdData->getField< uint32_t >( row, 0 ); + classJob = exdData->getField< uint8_t >( row, 0 ); } Sapphire::Data::QuestRedo::QuestRedo( uint32_t row_id, Sapphire::Data::ExdDataGenerated* exdData ) @@ -8784,7 +9289,8 @@ Sapphire::Data::Race::Race( uint32_t row_id, Sapphire::Data::ExdDataGenerated* e rSEFHands = exdData->getField< int32_t >( row, 7 ); rSEFLegs = exdData->getField< int32_t >( row, 8 ); rSEFFeet = exdData->getField< int32_t >( row, 9 ); - exPac = exdData->getField< uint8_t >( row, 10 ); + unknown54 = exdData->getField< uint8_t >( row, 10 ); + exPac = exdData->getField< uint8_t >( row, 11 ); } Sapphire::Data::RacingChocoboItem::RacingChocoboItem( uint32_t row_id, Sapphire::Data::ExdDataGenerated* exdData ) @@ -8878,6 +9384,7 @@ Sapphire::Data::RecipeLevelTable::RecipeLevelTable( uint32_t row_id, Sapphire::D difficulty = exdData->getField< uint16_t >( row, 4 ); quality = exdData->getField< uint32_t >( row, 5 ); durability = exdData->getField< uint16_t >( row, 6 ); + conditionsFlag = exdData->getField< uint16_t >( row, 7 ); } Sapphire::Data::RecipeLookup::RecipeLookup( uint32_t row_id, Sapphire::Data::ExdDataGenerated* exdData ) @@ -9141,6 +9648,18 @@ Sapphire::Data::Resident::Resident( uint32_t row_id, uint32_t subRow, Sapphire:: residentMotionType = exdData->getField< uint8_t >( row, 4 ); } +Sapphire::Data::ResistanceWeaponAdjust::ResistanceWeaponAdjust( uint32_t row_id, Sapphire::Data::ExdDataGenerated* exdData ) +{ + auto row = exdData->m_ResistanceWeaponAdjustDat.get_row( row_id ); + maxTotalStats = exdData->getField< uint16_t >( row, 0 ); + maxEachStat = exdData->getField< uint16_t >( row, 1 ); + baseParam.push_back( exdData->getField< uint8_t >( row, 2 ) ); + baseParam.push_back( exdData->getField< uint8_t >( row, 3 ) ); + baseParam.push_back( exdData->getField< uint8_t >( row, 4 ) ); + baseParam.push_back( exdData->getField< uint8_t >( row, 5 ) ); + image = exdData->getField< uint32_t >( row, 6 ); +} + Sapphire::Data::RetainerTask::RetainerTask( uint32_t row_id, Sapphire::Data::ExdDataGenerated* exdData ) { auto row = exdData->m_RetainerTaskDat.get_row( row_id ); @@ -9296,6 +9815,9 @@ Sapphire::Data::ScenarioTree::ScenarioTree( uint32_t row_id, Sapphire::Data::Exd auto row = exdData->m_ScenarioTreeDat.get_row( row_id ); type = exdData->getField< uint8_t >( row, 0 ); image = exdData->getField< uint16_t >( row, 1 ); + unknown540 = exdData->getField< uint32_t >( row, 3 ); + unknown541 = exdData->getField< std::string >( row, 4 ); + unknown542 = exdData->getField< int32_t >( row, 5 ); } Sapphire::Data::ScenarioTreeTips::ScenarioTreeTips( uint32_t row_id, Sapphire::Data::ExdDataGenerated* exdData ) @@ -9661,7 +10183,7 @@ Sapphire::Data::SpecialShop::SpecialShop( uint32_t row_id, Sapphire::Data::ExdDa patchNumber.push_back( exdData->getField< uint16_t >( row, 1498 ) ); patchNumber.push_back( exdData->getField< uint16_t >( row, 1499 ) ); patchNumber.push_back( exdData->getField< uint16_t >( row, 1500 ) ); - useCurrencyType = exdData->getField< bool >( row, 1501 ); + useCurrencyType = exdData->getField< uint8_t >( row, 1501 ); questUnlock = exdData->getField< uint32_t >( row, 1502 ); completeText = exdData->getField< int32_t >( row, 1503 ); notCompleteText = exdData->getField< int32_t >( row, 1504 ); @@ -9697,7 +10219,7 @@ Sapphire::Data::Status::Status( uint32_t row_id, Sapphire::Data::ExdDataGenerate maxStacks = exdData->getField< uint8_t >( row, 3 ); category = exdData->getField< uint8_t >( row, 5 ); hitEffect = exdData->getField< uint8_t >( row, 6 ); - vFX = exdData->getField< uint8_t >( row, 7 ); + vFX = exdData->getField< uint16_t >( row, 7 ); lockMovement = exdData->getField< bool >( row, 8 ); lockActions = exdData->getField< bool >( row, 10 ); lockControl = exdData->getField< bool >( row, 11 ); @@ -11625,6 +12147,7 @@ Sapphire::Data::SubmarinePart::SubmarinePart( uint32_t row_id, Sapphire::Data::E speed = exdData->getField< int16_t >( row, 5 ); range = exdData->getField< int16_t >( row, 6 ); favor = exdData->getField< int16_t >( row, 7 ); + _class = exdData->getField< uint16_t >( row, 8 ); repairMaterials = exdData->getField< uint8_t >( row, 9 ); } @@ -11683,6 +12206,7 @@ Sapphire::Data::TerritoryType::TerritoryType( uint32_t row_id, Sapphire::Data::E exVersion = exdData->getField< uint8_t >( row, 29 ); addedIn53 = exdData->getField< uint8_t >( row, 32 ); mountSpeed = exdData->getField< uint8_t >( row, 33 ); + unknown54 = exdData->getField< bool >( row, 40 ); } Sapphire::Data::TerritoryTypeTransient::TerritoryTypeTransient( uint32_t row_id, Sapphire::Data::ExdDataGenerated* exdData ) @@ -11787,6 +12311,7 @@ Sapphire::Data::Transformation::Transformation( uint32_t row_id, Sapphire::Data: endVFX = exdData->getField< uint16_t >( row, 31 ); action6 = exdData->getField< uint32_t >( row, 32 ); action7 = exdData->getField< uint16_t >( row, 34 ); + unknown54 = exdData->getField< bool >( row, 36 ); } Sapphire::Data::Treasure::Treasure( uint32_t row_id, Sapphire::Data::ExdDataGenerated* exdData ) @@ -11894,6 +12419,13 @@ Sapphire::Data::TripleTriadCardResident::TripleTriadCardResident( uint32_t row_i tripleTriadCardType = exdData->getField< uint8_t >( row, 6 ); saleValue = exdData->getField< uint16_t >( row, 7 ); sortKey = exdData->getField< uint8_t >( row, 8 ); + order = exdData->getField< uint16_t >( row, 9 ); + uIPriority = exdData->getField< uint8_t >( row, 10 ); + unknown54 = exdData->getField< bool >( row, 11 ); + acquisitionType = exdData->getField< uint8_t >( row, 12 ); + acquisition = exdData->getField< uint32_t >( row, 13 ); + location = exdData->getField< uint32_t >( row, 14 ); + quest = exdData->getField< uint32_t >( row, 15 ); } Sapphire::Data::TripleTriadCardType::TripleTriadCardType( uint32_t row_id, Sapphire::Data::ExdDataGenerated* exdData ) @@ -11912,6 +12444,8 @@ Sapphire::Data::TripleTriadRule::TripleTriadRule( uint32_t row_id, Sapphire::Dat { auto row = exdData->m_TripleTriadRuleDat.get_row( row_id ); name = exdData->getField< std::string >( row, 0 ); + description = exdData->getField< std::string >( row, 1 ); + unknown54 = exdData->getField< bool >( row, 4 ); } Sapphire::Data::Tutorial::Tutorial( uint32_t row_id, Sapphire::Data::ExdDataGenerated* exdData ) @@ -12045,6 +12579,22 @@ Sapphire::Data::WeatherReportReplace::WeatherReportReplace( uint32_t row_id, Sap placeNameParent = exdData->getField< uint16_t >( row, 1 ); } +Sapphire::Data::WebGuidance::WebGuidance( uint32_t row_id, Sapphire::Data::ExdDataGenerated* exdData ) +{ + auto row = exdData->m_WebGuidanceDat.get_row( row_id ); + image = exdData->getField< int32_t >( row, 0 ); + url = exdData->getField< uint8_t >( row, 1 ); + name = exdData->getField< std::string >( row, 2 ); + unknown54 = exdData->getField< std::string >( row, 3 ); + description = exdData->getField< std::string >( row, 4 ); +} + +Sapphire::Data::WebURL::WebURL( uint32_t row_id, Sapphire::Data::ExdDataGenerated* exdData ) +{ + auto row = exdData->m_WebURLDat.get_row( row_id ); + uRL = exdData->getField< std::string >( row, 0 ); +} + Sapphire::Data::WeddingBGM::WeddingBGM( uint32_t row_id, Sapphire::Data::ExdDataGenerated* exdData ) { auto row = exdData->m_WeddingBGMDat.get_row( row_id ); @@ -12343,6 +12893,8 @@ bool Sapphire::Data::ExdDataGenerated::init( const std::string& path ) m_ContentRouletteOpenRuleDat = setupDatAccess( "ContentRouletteOpenRule", xiv::exd::Language::none ); m_ContentRouletteRoleBonusDat = setupDatAccess( "ContentRouletteRoleBonus", xiv::exd::Language::none ); m_ContentsNoteDat = setupDatAccess( "ContentsNote", xiv::exd::Language::en ); + m_ContentsTutorialDat = setupDatAccess( "ContentsTutorial", xiv::exd::Language::en ); + m_ContentsTutorialPageDat = setupDatAccess( "ContentsTutorialPage", xiv::exd::Language::en ); m_ContentTalkDat = setupDatAccess( "ContentTalk", xiv::exd::Language::en ); m_ContentTalkParamDat = setupDatAccess( "ContentTalkParam", xiv::exd::Language::none ); m_ContentTypeDat = setupDatAccess( "ContentType", xiv::exd::Language::en ); @@ -12355,7 +12907,6 @@ bool Sapphire::Data::ExdDataGenerated::init( const std::string& path ) m_CreditCastDat = setupDatAccess( "CreditCast", xiv::exd::Language::en ); m_CreditListDat = setupDatAccess( "CreditList", xiv::exd::Language::none ); m_CreditListTextDat = setupDatAccess( "CreditListText", xiv::exd::Language::en ); - m_CurrencyDat = setupDatAccess( "Currency", xiv::exd::Language::none ); m_CustomTalkDat = setupDatAccess( "CustomTalk", xiv::exd::Language::en ); m_CustomTalkDynamicIconDat = setupDatAccess( "CustomTalkDynamicIcon", xiv::exd::Language::none ); m_CustomTalkNestHandlersDat = setupDatAccess( "CustomTalkNestHandlers", xiv::exd::Language::none ); @@ -12544,6 +13095,7 @@ bool Sapphire::Data::ExdDataGenerated::init( const std::string& path ) m_HWDAnnounceDat = setupDatAccess( "HWDAnnounce", xiv::exd::Language::en ); m_HWDCrafterSupplyDat = setupDatAccess( "HWDCrafterSupply", xiv::exd::Language::none ); m_HWDCrafterSupplyRewardDat = setupDatAccess( "HWDCrafterSupplyReward", xiv::exd::Language::none ); + m_HWDCrafterSupplyTermDat = setupDatAccess( "HWDCrafterSupplyTerm", xiv::exd::Language::en ); m_HWDDevLayerControlDat = setupDatAccess( "HWDDevLayerControl", xiv::exd::Language::none ); m_HWDDevLevelUIDat = setupDatAccess( "HWDDevLevelUI", xiv::exd::Language::none ); m_HWDDevLivelyDat = setupDatAccess( "HWDDevLively", xiv::exd::Language::none ); @@ -12642,6 +13194,7 @@ bool Sapphire::Data::ExdDataGenerated::init( const std::string& path ) m_MountTransientDat = setupDatAccess( "MountTransient", xiv::exd::Language::en ); m_MoveTimelineDat = setupDatAccess( "MoveTimeline", xiv::exd::Language::none ); m_MoveVfxDat = setupDatAccess( "MoveVfx", xiv::exd::Language::none ); + m_MovieStaffListDat = setupDatAccess( "MovieStaffList", xiv::exd::Language::none ); m_MovieSubtitleDat = setupDatAccess( "MovieSubtitle", xiv::exd::Language::en ); m_MovieSubtitle500Dat = setupDatAccess( "MovieSubtitle500", xiv::exd::Language::en ); m_MovieSubtitleVoyageDat = setupDatAccess( "MovieSubtitleVoyage", xiv::exd::Language::en ); @@ -12722,6 +13275,7 @@ bool Sapphire::Data::ExdDataGenerated::init( const std::string& path ) m_RelicNoteDat = setupDatAccess( "RelicNote", xiv::exd::Language::none ); m_RelicNoteCategoryDat = setupDatAccess( "RelicNoteCategory", xiv::exd::Language::en ); m_ResidentDat = setupDatAccess( "Resident", xiv::exd::Language::none ); + m_ResistanceWeaponAdjustDat = setupDatAccess( "ResistanceWeaponAdjust", xiv::exd::Language::none ); m_RetainerTaskDat = setupDatAccess( "RetainerTask", xiv::exd::Language::none ); m_RetainerTaskLvRangeDat = setupDatAccess( "RetainerTaskLvRange", xiv::exd::Language::none ); m_RetainerTaskNormalDat = setupDatAccess( "RetainerTaskNormal", xiv::exd::Language::none ); @@ -12802,6 +13356,8 @@ bool Sapphire::Data::ExdDataGenerated::init( const std::string& path ) m_WeatherGroupDat = setupDatAccess( "WeatherGroup", xiv::exd::Language::none ); m_WeatherRateDat = setupDatAccess( "WeatherRate", xiv::exd::Language::none ); m_WeatherReportReplaceDat = setupDatAccess( "WeatherReportReplace", xiv::exd::Language::none ); + m_WebGuidanceDat = setupDatAccess( "WebGuidance", xiv::exd::Language::en ); + m_WebURLDat = setupDatAccess( "WebURL", xiv::exd::Language::en ); m_WeddingBGMDat = setupDatAccess( "WeddingBGM", xiv::exd::Language::en ); m_WeeklyBingoOrderDataDat = setupDatAccess( "WeeklyBingoOrderData", xiv::exd::Language::none ); m_WeeklyBingoRewardDataDat = setupDatAccess( "WeeklyBingoRewardData", xiv::exd::Language::none ); diff --git a/src/common/Exd/ExdDataGenerated.h b/src/common/Exd/ExdDataGenerated.h index 78eaa037..39af9dfa 100644 --- a/src/common/Exd/ExdDataGenerated.h +++ b/src/common/Exd/ExdDataGenerated.h @@ -167,6 +167,8 @@ struct ContentRoulette; struct ContentRouletteOpenRule; struct ContentRouletteRoleBonus; struct ContentsNote; +struct ContentsTutorial; +struct ContentsTutorialPage; struct ContentTalk; struct ContentTalkParam; struct ContentType; @@ -179,7 +181,6 @@ struct CreditBackImage; struct CreditCast; struct CreditList; struct CreditListText; -struct Currency; struct CustomTalk; struct CustomTalkDynamicIcon; struct CustomTalkNestHandlers; @@ -368,6 +369,7 @@ struct HugeCraftworksRank; struct HWDAnnounce; struct HWDCrafterSupply; struct HWDCrafterSupplyReward; +struct HWDCrafterSupplyTerm; struct HWDDevLayerControl; struct HWDDevLevelUI; struct HWDDevLively; @@ -466,6 +468,7 @@ struct MountSpeed; struct MountTransient; struct MoveTimeline; struct MoveVfx; +struct MovieStaffList; struct MovieSubtitle; struct MovieSubtitle500; struct MovieSubtitleVoyage; @@ -546,6 +549,7 @@ struct RelicItem; struct RelicNote; struct RelicNoteCategory; struct Resident; +struct ResistanceWeaponAdjust; struct RetainerTask; struct RetainerTaskLvRange; struct RetainerTaskNormal; @@ -626,6 +630,8 @@ struct Weather; struct WeatherGroup; struct WeatherRate; struct WeatherReportReplace; +struct WebGuidance; +struct WebURL; struct WeddingBGM; struct WeeklyBingoOrderData; struct WeeklyBingoRewardData; @@ -983,6 +989,7 @@ struct AirshipExplorationParamType struct AirshipExplorationPart { + uint8_t slot; uint8_t rank; uint8_t components; int16_t surveillance; @@ -990,6 +997,7 @@ struct AirshipExplorationPart int16_t speed; int16_t range; int16_t favor; + uint16_t _class; uint8_t repairMaterials; AirshipExplorationPart( uint32_t row_id, Sapphire::Data::ExdDataGenerated* exdData ); @@ -1112,9 +1120,22 @@ struct AozActionTransient uint32_t icon; std::string stats; std::string description; + uint8_t locationKey; uint16_t location; - uint32_t startQuest; - uint32_t nextQuest; + uint32_t requiredForQuest; + uint32_t previousQuest; + bool targetsEnemy; + bool targetsSelfOrAlly; + bool causeSlow; + bool causePetrify; + bool causeParalysis; + bool causeInterrupt; + bool causeBlind; + bool causeStun; + bool causeSleep; + bool causeBind; + bool causeHeavy; + bool causeDeath; AozActionTransient( uint32_t row_id, Sapphire::Data::ExdDataGenerated* exdData ); }; @@ -1122,6 +1143,7 @@ struct AozActionTransient struct AOZArrangement { uint16_t aOZContentBriefingBNpc; + uint16_t position; AOZArrangement( uint32_t row_id, uint32_t subRow, Sapphire::Data::ExdDataGenerated* exdData ); }; @@ -1129,6 +1151,7 @@ struct AOZArrangement struct AOZBoss { uint16_t boss; + uint16_t position; AOZBoss( uint32_t row_id, Sapphire::Data::ExdDataGenerated* exdData ); }; @@ -1160,6 +1183,7 @@ struct AOZContentBriefingBNpc uint32_t bNpcName; uint32_t targetSmall; uint32_t targetLarge; + bool hideStats; uint8_t endurance; uint8_t fire; uint8_t ice; @@ -1171,16 +1195,16 @@ struct AOZContentBriefingBNpc uint8_t piercing; uint8_t blunt; uint8_t magic; - bool slowResistance; - bool petrificationResistance; - bool paralysisResistance; - bool silenceResistance; - bool blindResistance; - bool stunResistance; - bool sleepResistance; - bool bindResistance; - bool heavyResistance; - bool instaDeathResistance; + bool slowVuln; + bool petrificationVuln; + bool paralysisVuln; + bool interruptionVuln; + bool blindVuln; + bool stunVuln; + bool sleepVuln; + bool bindVuln; + bool heavyVuln; + bool flatOrDeathVuln; AOZContentBriefingBNpc( uint32_t row_id, Sapphire::Data::ExdDataGenerated* exdData ); }; @@ -1646,6 +1670,7 @@ struct BuddyEquip uint16_t iconHead; uint16_t iconBody; uint16_t iconLegs; + uint8_t order; BuddyEquip( uint32_t row_id, Sapphire::Data::ExdDataGenerated* exdData ); }; @@ -1924,6 +1949,7 @@ struct ClassJob int8_t expArrayIndex; int8_t battleClassIndex; uint8_t jobIndex; + int8_t dohDolJobIndex; uint16_t modifierHitPoints; uint16_t modifierManaPoints; uint16_t modifierStrength; @@ -2294,6 +2320,8 @@ struct ContentFinderCondition bool addedIn53; bool allowUndersized; bool allowReplacement; + bool allowExplorerMode; + bool unknown54; bool highEndDuty; bool dutyRecorderAllowed; std::string name; @@ -2304,13 +2332,13 @@ struct ContentFinderCondition uint32_t image; uint32_t icon; bool levelingRoulette; - bool level5060Roulette; + bool level506070Roulette; bool mSQRoulette; bool guildHestRoulette; bool expertRoulette; bool trialRoulette; bool dailyFrontlineChallenge; - bool level70Roulette; + bool level80Roulette; bool mentorRoulette; bool allianceRoulette; bool normalRaidRoulette; @@ -2349,6 +2377,7 @@ struct ContentMemberType uint8_t healersPerParty; uint8_t meleesPerParty; uint8_t rangedPerParty; + uint8_t unknown54; ContentMemberType( uint32_t row_id, Sapphire::Data::ExdDataGenerated* exdData ); }; @@ -2371,22 +2400,23 @@ struct ContentRandomSelect struct ContentRoulette { std::string name; + std::string category; std::string description; std::string dutyType; bool isInDutyFinder; - bool openRule; - bool requiredLevel; - uint8_t itemLevelRequired; - uint16_t icon; - uint32_t contentRouletteRoleBonus; - uint8_t rewardTomeA; + uint8_t openRule; + uint8_t requiredLevel; + uint16_t itemLevelRequired; + uint32_t icon; + uint8_t contentRouletteRoleBonus; + uint16_t rewardTomeA; uint16_t rewardTomeB; uint16_t rewardTomeC; - uint16_t sortKey; + uint8_t sortKey; uint8_t contentMemberType; bool requireAllDuties; - bool contentRouletteOpenRule; - uint8_t instanceContent; + uint8_t contentRouletteOpenRule; + uint16_t instanceContent; ContentRoulette( uint32_t row_id, Sapphire::Data::ExdDataGenerated* exdData ); }; @@ -2426,6 +2456,23 @@ struct ContentsNote ContentsNote( uint32_t row_id, Sapphire::Data::ExdDataGenerated* exdData ); }; +struct ContentsTutorial +{ + std::string name; + std::string description; + std::vector< int32_t > page; + + ContentsTutorial( uint32_t row_id, Sapphire::Data::ExdDataGenerated* exdData ); +}; + +struct ContentsTutorialPage +{ + int32_t image; + std::string description; + + ContentsTutorialPage( uint32_t row_id, Sapphire::Data::ExdDataGenerated* exdData ); +}; + struct ContentTalk { uint8_t contentTalkParam; @@ -2521,6 +2568,7 @@ struct Credit struct CreditBackImage { + bool unknown54; uint32_t backImage; CreditBackImage( uint32_t row_id, uint32_t subRow, Sapphire::Data::ExdDataGenerated* exdData ); @@ -2550,14 +2598,6 @@ struct CreditListText CreditListText( uint32_t row_id, Sapphire::Data::ExdDataGenerated* exdData ); }; -struct Currency -{ - uint32_t item; - uint32_t limit; - - Currency( uint32_t row_id, Sapphire::Data::ExdDataGenerated* exdData ); -}; - struct CustomTalk { uint32_t iconActor; @@ -2566,6 +2606,7 @@ struct CustomTalk std::vector< std::string > scriptInstruction; std::vector< uint32_t > scriptArg; bool text; + bool unknown54; CustomTalk( uint32_t row_id, Sapphire::Data::ExdDataGenerated* exdData ); }; @@ -2996,6 +3037,7 @@ struct Emote uint8_t emoteMode; bool hasCancelEmote; bool drawsWeapon; + uint16_t order; int32_t textCommand; uint16_t icon; uint16_t logMessageTargeted; @@ -3676,7 +3718,7 @@ struct GatheringItem { int32_t item; uint16_t gatheringItemLevel; - uint32_t isHidden; + bool isHidden; GatheringItem( uint32_t row_id, Sapphire::Data::ExdDataGenerated* exdData ); }; @@ -3767,7 +3809,8 @@ struct GatheringPointBonus uint32_t conditionValue; uint8_t bonusType; uint16_t bonusValue; - bool addedIn53; + bool unknown53; + uint32_t unknown54; GatheringPointBonus( uint32_t row_id, Sapphire::Data::ExdDataGenerated* exdData ); }; @@ -4169,6 +4212,7 @@ struct GroupPoseFrame { int32_t image; std::string gridText; + int32_t unknown54; std::string text; GroupPoseFrame( uint32_t row_id, Sapphire::Data::ExdDataGenerated* exdData ); @@ -4178,6 +4222,8 @@ struct GroupPoseStamp { int32_t stampIcon; int32_t category; + int32_t unknown540; + bool unknown541; std::string name; GroupPoseStamp( uint32_t row_id, Sapphire::Data::ExdDataGenerated* exdData ); @@ -4493,6 +4539,9 @@ struct HWDCrafterSupply std::vector< uint16_t > baseCollectableReward; std::vector< uint16_t > midCollectableReward; std::vector< uint16_t > highCollectableReward; + std::vector< uint16_t > baseCollectableRewardPostPhase; + std::vector< uint16_t > midCollectableRewardPostPhase; + std::vector< uint16_t > highCollectableRewardPostPhase; std::vector< uint8_t > termName; HWDCrafterSupply( uint32_t row_id, Sapphire::Data::ExdDataGenerated* exdData ); @@ -4507,6 +4556,13 @@ struct HWDCrafterSupplyReward HWDCrafterSupplyReward( uint32_t row_id, Sapphire::Data::ExdDataGenerated* exdData ); }; +struct HWDCrafterSupplyTerm +{ + std::string name; + + HWDCrafterSupplyTerm( uint32_t row_id, Sapphire::Data::ExdDataGenerated* exdData ); +}; + struct HWDDevLayerControl { @@ -4621,14 +4677,13 @@ struct IKDFishParam { uint32_t fish; uint8_t iKDContentBonus; + uint8_t unknown54; IKDFishParam( uint32_t row_id, Sapphire::Data::ExdDataGenerated* exdData ); }; struct IKDRoute { - std::vector< uint32_t > spot; - uint8_t timeDefine; uint32_t image; uint32_t territoryType; std::string name; @@ -4713,6 +4768,8 @@ struct InstanceContent uint32_t instanceContentBuff; int32_t reqInstance; int16_t partyCondition; + uint16_t unknown540; + uint16_t unknown541; InstanceContent( uint32_t row_id, Sapphire::Data::ExdDataGenerated* exdData ); }; @@ -4729,6 +4786,8 @@ struct InstanceContentCSBonus { uint16_t instance; uint32_t item; + uint8_t unknown540; + uint8_t unknown541; InstanceContentCSBonus( uint32_t row_id, Sapphire::Data::ExdDataGenerated* exdData ); }; @@ -4771,7 +4830,7 @@ struct Item bool isUnique; bool isUntradable; bool isIndisposable; - bool isEquippable; + bool lot; uint32_t priceMid; uint32_t priceLow; bool canBeHq; @@ -4786,6 +4845,7 @@ struct Item bool isCollectable; bool alwaysCollectable; uint16_t aetherialReduce; + uint16_t unknown54; uint8_t levelEquip; uint8_t equipRestriction; uint8_t classJobCategory; @@ -5179,6 +5239,8 @@ struct LotteryExchangeShop { std::vector< int32_t > itemAccepted; std::vector< uint32_t > amountAccepted; + std::vector< uint8_t > unknown540; + std::vector< uint8_t > unknown541; std::string lua; std::vector< uint32_t > logMessage; @@ -5311,7 +5373,7 @@ struct Materia { std::vector< int32_t > item; uint8_t baseParam; - std::vector< uint8_t > value; + std::vector< int16_t > value; Materia( uint32_t row_id, Sapphire::Data::ExdDataGenerated* exdData ); }; @@ -5342,6 +5404,7 @@ struct MateriaTomestoneRate struct MiniGameRA { int32_t icon; + int32_t image; int32_t bGM; MiniGameRA( uint32_t row_id, Sapphire::Data::ExdDataGenerated* exdData ); @@ -5623,6 +5686,15 @@ struct MoveVfx MoveVfx( uint32_t row_id, Sapphire::Data::ExdDataGenerated* exdData ); }; +struct MovieStaffList +{ + uint32_t image; + float startTime; + float endTime; + + MovieStaffList( uint32_t row_id, Sapphire::Data::ExdDataGenerated* exdData ); +}; + struct MovieSubtitle { float startTime; @@ -5669,6 +5741,9 @@ struct MYCTemporaryItemUICategory struct MYCWarResultNotebook { uint8_t number; + uint8_t unknown540; + uint8_t unknown541; + int32_t quest; int32_t icon; int32_t image; uint8_t rarity; @@ -5752,7 +5827,8 @@ struct NpcYell float balloonTime; bool isBalloonSlow; bool battleTalkTime; - float text; + uint8_t unknown54; + std::string text; NpcYell( uint32_t row_id, Sapphire::Data::ExdDataGenerated* exdData ); }; @@ -5812,7 +5888,8 @@ struct Orchestrion struct OrchestrionCategory { std::string name; - uint8_t hideCategory; + uint8_t hideOrder; + uint32_t icon; uint8_t order; OrchestrionCategory( uint32_t row_id, Sapphire::Data::ExdDataGenerated* exdData ); @@ -5878,6 +5955,9 @@ struct PartyContent bool name; uint32_t textDataStart; uint32_t textDataEnd; + std::vector< uint32_t > lGBEventObject0; + std::vector< uint32_t > lGBEventRange; + std::vector< uint32_t > lGBEventObject1; uint16_t contentFinderCondition; uint32_t image; @@ -6064,6 +6144,9 @@ struct PublicContent uint32_t textDataEnd; uint16_t contentFinderCondition; uint16_t additionalData; + int32_t unknown540; + uint16_t unknown541; + uint16_t unknown542; PublicContent( uint32_t row_id, Sapphire::Data::ExdDataGenerated* exdData ); }; @@ -6232,6 +6315,7 @@ struct Quest bool hideOfferIcon; uint8_t eventIconType; uint16_t sortKey; + bool unknown54; Quest( uint32_t row_id, Sapphire::Data::ExdDataGenerated* exdData ); }; @@ -6278,7 +6362,7 @@ struct QuestClassJobSupply struct QuestDerivedClass { - uint32_t quest; + uint8_t classJob; QuestDerivedClass( uint32_t row_id, Sapphire::Data::ExdDataGenerated* exdData ); }; @@ -6373,6 +6457,7 @@ struct Race int32_t rSEFHands; int32_t rSEFLegs; int32_t rSEFFeet; + uint8_t unknown54; uint8_t exPac; Race( uint32_t row_id, Sapphire::Data::ExdDataGenerated* exdData ); @@ -6474,6 +6559,7 @@ struct RecipeLevelTable uint16_t difficulty; uint32_t quality; uint16_t durability; + uint16_t conditionsFlag; RecipeLevelTable( uint32_t row_id, Sapphire::Data::ExdDataGenerated* exdData ); }; @@ -6585,6 +6671,16 @@ struct Resident Resident( uint32_t row_id, uint32_t subRow, Sapphire::Data::ExdDataGenerated* exdData ); }; +struct ResistanceWeaponAdjust +{ + uint16_t maxTotalStats; + uint16_t maxEachStat; + std::vector< uint8_t > baseParam; + uint32_t image; + + ResistanceWeaponAdjust( uint32_t row_id, Sapphire::Data::ExdDataGenerated* exdData ); +}; + struct RetainerTask { bool isRandom; @@ -6717,6 +6813,9 @@ struct ScenarioTree { uint8_t type; uint16_t image; + uint32_t unknown540; + std::string unknown541; + int32_t unknown542; ScenarioTree( uint32_t row_id, Sapphire::Data::ExdDataGenerated* exdData ); }; @@ -6861,7 +6960,7 @@ struct SpecialShop std::vector< int32_t > unknown; std::vector< int32_t > achievementUnlock; std::vector< uint16_t > patchNumber; - bool useCurrencyType; + uint8_t useCurrencyType; uint32_t questUnlock; int32_t completeText; int32_t notCompleteText; @@ -6901,7 +7000,7 @@ struct Status uint8_t maxStacks; uint8_t category; uint8_t hitEffect; - uint8_t vFX; + uint16_t vFX; bool lockMovement; bool lockActions; bool lockControl; @@ -6994,6 +7093,7 @@ struct SubmarinePart int16_t speed; int16_t range; int16_t favor; + uint16_t _class; uint8_t repairMaterials; SubmarinePart( uint32_t row_id, Sapphire::Data::ExdDataGenerated* exdData ); @@ -7056,6 +7156,7 @@ struct TerritoryType uint8_t exVersion; uint8_t addedIn53; uint8_t mountSpeed; + bool unknown54; TerritoryType( uint32_t row_id, Sapphire::Data::ExdDataGenerated* exdData ); }; @@ -7171,6 +7272,7 @@ struct Transformation uint16_t endVFX; uint32_t action6; uint16_t action7; + bool unknown54; Transformation( uint32_t row_id, Sapphire::Data::ExdDataGenerated* exdData ); }; @@ -7273,6 +7375,13 @@ struct TripleTriadCardResident uint8_t tripleTriadCardType; uint16_t saleValue; uint8_t sortKey; + uint16_t order; + uint8_t uIPriority; + bool unknown54; + uint8_t acquisitionType; + uint32_t acquisition; + uint32_t location; + uint32_t quest; TripleTriadCardResident( uint32_t row_id, Sapphire::Data::ExdDataGenerated* exdData ); }; @@ -7294,6 +7403,8 @@ struct TripleTriadCompetition struct TripleTriadRule { std::string name; + std::string description; + bool unknown54; TripleTriadRule( uint32_t row_id, Sapphire::Data::ExdDataGenerated* exdData ); }; @@ -7435,6 +7546,24 @@ struct WeatherReportReplace WeatherReportReplace( uint32_t row_id, Sapphire::Data::ExdDataGenerated* exdData ); }; +struct WebGuidance +{ + int32_t image; + uint8_t url; + std::string name; + std::string unknown54; + std::string description; + + WebGuidance( uint32_t row_id, Sapphire::Data::ExdDataGenerated* exdData ); +}; + +struct WebURL +{ + std::string uRL; + + WebURL( uint32_t row_id, Sapphire::Data::ExdDataGenerated* exdData ); +}; + struct WeddingBGM { uint16_t song; @@ -7733,6 +7862,8 @@ struct ZoneSharedGroup xiv::exd::Exd m_ContentRouletteOpenRuleDat; xiv::exd::Exd m_ContentRouletteRoleBonusDat; xiv::exd::Exd m_ContentsNoteDat; + xiv::exd::Exd m_ContentsTutorialDat; + xiv::exd::Exd m_ContentsTutorialPageDat; xiv::exd::Exd m_ContentTalkDat; xiv::exd::Exd m_ContentTalkParamDat; xiv::exd::Exd m_ContentTypeDat; @@ -7745,7 +7876,6 @@ struct ZoneSharedGroup xiv::exd::Exd m_CreditCastDat; xiv::exd::Exd m_CreditListDat; xiv::exd::Exd m_CreditListTextDat; - xiv::exd::Exd m_CurrencyDat; xiv::exd::Exd m_CustomTalkDat; xiv::exd::Exd m_CustomTalkDynamicIconDat; xiv::exd::Exd m_CustomTalkNestHandlersDat; @@ -7934,6 +8064,7 @@ struct ZoneSharedGroup xiv::exd::Exd m_HWDAnnounceDat; xiv::exd::Exd m_HWDCrafterSupplyDat; xiv::exd::Exd m_HWDCrafterSupplyRewardDat; + xiv::exd::Exd m_HWDCrafterSupplyTermDat; xiv::exd::Exd m_HWDDevLayerControlDat; xiv::exd::Exd m_HWDDevLevelUIDat; xiv::exd::Exd m_HWDDevLivelyDat; @@ -8032,6 +8163,7 @@ struct ZoneSharedGroup xiv::exd::Exd m_MountTransientDat; xiv::exd::Exd m_MoveTimelineDat; xiv::exd::Exd m_MoveVfxDat; + xiv::exd::Exd m_MovieStaffListDat; xiv::exd::Exd m_MovieSubtitleDat; xiv::exd::Exd m_MovieSubtitle500Dat; xiv::exd::Exd m_MovieSubtitleVoyageDat; @@ -8112,6 +8244,7 @@ struct ZoneSharedGroup xiv::exd::Exd m_RelicNoteDat; xiv::exd::Exd m_RelicNoteCategoryDat; xiv::exd::Exd m_ResidentDat; + xiv::exd::Exd m_ResistanceWeaponAdjustDat; xiv::exd::Exd m_RetainerTaskDat; xiv::exd::Exd m_RetainerTaskLvRangeDat; xiv::exd::Exd m_RetainerTaskNormalDat; @@ -8192,6 +8325,8 @@ struct ZoneSharedGroup xiv::exd::Exd m_WeatherGroupDat; xiv::exd::Exd m_WeatherRateDat; xiv::exd::Exd m_WeatherReportReplaceDat; + xiv::exd::Exd m_WebGuidanceDat; + xiv::exd::Exd m_WebURLDat; xiv::exd::Exd m_WeddingBGMDat; xiv::exd::Exd m_WeeklyBingoOrderDataDat; xiv::exd::Exd m_WeeklyBingoRewardDataDat; @@ -8350,6 +8485,8 @@ struct ZoneSharedGroup using ContentRouletteOpenRulePtr = std::shared_ptr< ContentRouletteOpenRule >; using ContentRouletteRoleBonusPtr = std::shared_ptr< ContentRouletteRoleBonus >; using ContentsNotePtr = std::shared_ptr< ContentsNote >; + using ContentsTutorialPtr = std::shared_ptr< ContentsTutorial >; + using ContentsTutorialPagePtr = std::shared_ptr< ContentsTutorialPage >; using ContentTalkPtr = std::shared_ptr< ContentTalk >; using ContentTalkParamPtr = std::shared_ptr< ContentTalkParam >; using ContentTypePtr = std::shared_ptr< ContentType >; @@ -8362,7 +8499,6 @@ struct ZoneSharedGroup using CreditCastPtr = std::shared_ptr< CreditCast >; using CreditListPtr = std::shared_ptr< CreditList >; using CreditListTextPtr = std::shared_ptr< CreditListText >; - using CurrencyPtr = std::shared_ptr< Currency >; using CustomTalkPtr = std::shared_ptr< CustomTalk >; using CustomTalkDynamicIconPtr = std::shared_ptr< CustomTalkDynamicIcon >; using CustomTalkNestHandlersPtr = std::shared_ptr< CustomTalkNestHandlers >; @@ -8551,6 +8687,7 @@ struct ZoneSharedGroup using HWDAnnouncePtr = std::shared_ptr< HWDAnnounce >; using HWDCrafterSupplyPtr = std::shared_ptr< HWDCrafterSupply >; using HWDCrafterSupplyRewardPtr = std::shared_ptr< HWDCrafterSupplyReward >; + using HWDCrafterSupplyTermPtr = std::shared_ptr< HWDCrafterSupplyTerm >; using HWDDevLayerControlPtr = std::shared_ptr< HWDDevLayerControl >; using HWDDevLevelUIPtr = std::shared_ptr< HWDDevLevelUI >; using HWDDevLivelyPtr = std::shared_ptr< HWDDevLively >; @@ -8649,6 +8786,7 @@ struct ZoneSharedGroup using MountTransientPtr = std::shared_ptr< MountTransient >; using MoveTimelinePtr = std::shared_ptr< MoveTimeline >; using MoveVfxPtr = std::shared_ptr< MoveVfx >; + using MovieStaffListPtr = std::shared_ptr< MovieStaffList >; using MovieSubtitlePtr = std::shared_ptr< MovieSubtitle >; using MovieSubtitle500Ptr = std::shared_ptr< MovieSubtitle500 >; using MovieSubtitleVoyagePtr = std::shared_ptr< MovieSubtitleVoyage >; @@ -8729,6 +8867,7 @@ struct ZoneSharedGroup using RelicNotePtr = std::shared_ptr< RelicNote >; using RelicNoteCategoryPtr = std::shared_ptr< RelicNoteCategory >; using ResidentPtr = std::shared_ptr< Resident >; + using ResistanceWeaponAdjustPtr = std::shared_ptr< ResistanceWeaponAdjust >; using RetainerTaskPtr = std::shared_ptr< RetainerTask >; using RetainerTaskLvRangePtr = std::shared_ptr< RetainerTaskLvRange >; using RetainerTaskNormalPtr = std::shared_ptr< RetainerTaskNormal >; @@ -8809,6 +8948,8 @@ struct ZoneSharedGroup using WeatherGroupPtr = std::shared_ptr< WeatherGroup >; using WeatherRatePtr = std::shared_ptr< WeatherRate >; using WeatherReportReplacePtr = std::shared_ptr< WeatherReportReplace >; + using WebGuidancePtr = std::shared_ptr< WebGuidance >; + using WebURLPtr = std::shared_ptr< WebURL >; using WeddingBGMPtr = std::shared_ptr< WeddingBGM >; using WeeklyBingoOrderDataPtr = std::shared_ptr< WeeklyBingoOrderData >; using WeeklyBingoRewardDataPtr = std::shared_ptr< WeeklyBingoRewardData >; @@ -8967,6 +9108,8 @@ struct ZoneSharedGroup std::set< uint32_t > m_ContentRouletteOpenRuleIdList; std::set< uint32_t > m_ContentRouletteRoleBonusIdList; std::set< uint32_t > m_ContentsNoteIdList; + std::set< uint32_t > m_ContentsTutorialIdList; + std::set< uint32_t > m_ContentsTutorialPageIdList; std::set< uint32_t > m_ContentTalkIdList; std::set< uint32_t > m_ContentTalkParamIdList; std::set< uint32_t > m_ContentTypeIdList; @@ -8979,7 +9122,6 @@ struct ZoneSharedGroup std::set< uint32_t > m_CreditCastIdList; std::set< uint32_t > m_CreditListIdList; std::set< uint32_t > m_CreditListTextIdList; - std::set< uint32_t > m_CurrencyIdList; std::set< uint32_t > m_CustomTalkIdList; std::set< uint32_t > m_CustomTalkDynamicIconIdList; std::set< uint32_t > m_CustomTalkNestHandlersIdList; @@ -9168,6 +9310,7 @@ struct ZoneSharedGroup std::set< uint32_t > m_HWDAnnounceIdList; std::set< uint32_t > m_HWDCrafterSupplyIdList; std::set< uint32_t > m_HWDCrafterSupplyRewardIdList; + std::set< uint32_t > m_HWDCrafterSupplyTermIdList; std::set< uint32_t > m_HWDDevLayerControlIdList; std::set< uint32_t > m_HWDDevLevelUIIdList; std::set< uint32_t > m_HWDDevLivelyIdList; @@ -9266,6 +9409,7 @@ struct ZoneSharedGroup std::set< uint32_t > m_MountTransientIdList; std::set< uint32_t > m_MoveTimelineIdList; std::set< uint32_t > m_MoveVfxIdList; + std::set< uint32_t > m_MovieStaffListIdList; std::set< uint32_t > m_MovieSubtitleIdList; std::set< uint32_t > m_MovieSubtitle500IdList; std::set< uint32_t > m_MovieSubtitleVoyageIdList; @@ -9346,6 +9490,7 @@ struct ZoneSharedGroup std::set< uint32_t > m_RelicNoteIdList; std::set< uint32_t > m_RelicNoteCategoryIdList; std::set< uint32_t > m_ResidentIdList; + std::set< uint32_t > m_ResistanceWeaponAdjustIdList; std::set< uint32_t > m_RetainerTaskIdList; std::set< uint32_t > m_RetainerTaskLvRangeIdList; std::set< uint32_t > m_RetainerTaskNormalIdList; @@ -9426,6 +9571,8 @@ struct ZoneSharedGroup std::set< uint32_t > m_WeatherGroupIdList; std::set< uint32_t > m_WeatherRateIdList; std::set< uint32_t > m_WeatherReportReplaceIdList; + std::set< uint32_t > m_WebGuidanceIdList; + std::set< uint32_t > m_WebURLIdList; std::set< uint32_t > m_WeddingBGMIdList; std::set< uint32_t > m_WeeklyBingoOrderDataIdList; std::set< uint32_t > m_WeeklyBingoRewardDataIdList; @@ -10309,6 +10456,18 @@ const std::set< uint32_t >& getContentsNoteIdList() loadIdList( m_ContentsNoteDat, m_ContentsNoteIdList ); return m_ContentsNoteIdList; } +const std::set< uint32_t >& getContentsTutorialIdList() +{ + if( m_ContentsTutorialIdList.size() == 0 ) + loadIdList( m_ContentsTutorialDat, m_ContentsTutorialIdList ); + return m_ContentsTutorialIdList; +} +const std::set< uint32_t >& getContentsTutorialPageIdList() +{ + if( m_ContentsTutorialPageIdList.size() == 0 ) + loadIdList( m_ContentsTutorialPageDat, m_ContentsTutorialPageIdList ); + return m_ContentsTutorialPageIdList; +} const std::set< uint32_t >& getContentTalkIdList() { if( m_ContentTalkIdList.size() == 0 ) @@ -10381,12 +10540,6 @@ const std::set< uint32_t >& getCreditListTextIdList() loadIdList( m_CreditListTextDat, m_CreditListTextIdList ); return m_CreditListTextIdList; } -const std::set< uint32_t >& getCurrencyIdList() -{ - if( m_CurrencyIdList.size() == 0 ) - loadIdList( m_CurrencyDat, m_CurrencyIdList ); - return m_CurrencyIdList; -} const std::set< uint32_t >& getCustomTalkIdList() { if( m_CustomTalkIdList.size() == 0 ) @@ -11515,6 +11668,12 @@ const std::set< uint32_t >& getHWDCrafterSupplyRewardIdList() loadIdList( m_HWDCrafterSupplyRewardDat, m_HWDCrafterSupplyRewardIdList ); return m_HWDCrafterSupplyRewardIdList; } +const std::set< uint32_t >& getHWDCrafterSupplyTermIdList() +{ + if( m_HWDCrafterSupplyTermIdList.size() == 0 ) + loadIdList( m_HWDCrafterSupplyTermDat, m_HWDCrafterSupplyTermIdList ); + return m_HWDCrafterSupplyTermIdList; +} const std::set< uint32_t >& getHWDDevLayerControlIdList() { if( m_HWDDevLayerControlIdList.size() == 0 ) @@ -12103,6 +12262,12 @@ const std::set< uint32_t >& getMoveVfxIdList() loadIdList( m_MoveVfxDat, m_MoveVfxIdList ); return m_MoveVfxIdList; } +const std::set< uint32_t >& getMovieStaffListIdList() +{ + if( m_MovieStaffListIdList.size() == 0 ) + loadIdList( m_MovieStaffListDat, m_MovieStaffListIdList ); + return m_MovieStaffListIdList; +} const std::set< uint32_t >& getMovieSubtitleIdList() { if( m_MovieSubtitleIdList.size() == 0 ) @@ -12583,6 +12748,12 @@ const std::set< uint32_t >& getResidentIdList() loadIdList( m_ResidentDat, m_ResidentIdList ); return m_ResidentIdList; } +const std::set< uint32_t >& getResistanceWeaponAdjustIdList() +{ + if( m_ResistanceWeaponAdjustIdList.size() == 0 ) + loadIdList( m_ResistanceWeaponAdjustDat, m_ResistanceWeaponAdjustIdList ); + return m_ResistanceWeaponAdjustIdList; +} const std::set< uint32_t >& getRetainerTaskIdList() { if( m_RetainerTaskIdList.size() == 0 ) @@ -13063,6 +13234,18 @@ const std::set< uint32_t >& getWeatherReportReplaceIdList() loadIdList( m_WeatherReportReplaceDat, m_WeatherReportReplaceIdList ); return m_WeatherReportReplaceIdList; } +const std::set< uint32_t >& getWebGuidanceIdList() +{ + if( m_WebGuidanceIdList.size() == 0 ) + loadIdList( m_WebGuidanceDat, m_WebGuidanceIdList ); + return m_WebGuidanceIdList; +} +const std::set< uint32_t >& getWebURLIdList() +{ + if( m_WebURLIdList.size() == 0 ) + loadIdList( m_WebURLDat, m_WebURLIdList ); + return m_WebURLIdList; +} const std::set< uint32_t >& getWeddingBGMIdList() { if( m_WeddingBGMIdList.size() == 0 ) From f4b5c99c88377bdad47553110fdc0df9da940b08 Mon Sep 17 00:00:00 2001 From: collett Date: Tue, 16 Feb 2021 22:47:19 +0900 Subject: [PATCH 03/43] manual opcode & packet updates --- src/common/Common.h | 10 +- src/common/Network/PacketDef/Ipcs.h | 200 +++++++++--------- .../Network/PacketDef/Zone/ServerZoneDef.h | 26 ++- 3 files changed, 120 insertions(+), 116 deletions(-) diff --git a/src/common/Common.h b/src/common/Common.h index d8e7618c..e642b4d8 100644 --- a/src/common/Common.h +++ b/src/common/Common.h @@ -51,11 +51,11 @@ namespace Sapphire::Common enum InventoryOperation : uint16_t { - Discard = 0x013C, - Move = 0x013D, - Swap = 0x013E, - Split = 0x013F, - Merge = 0x0141, + Discard = 0x0117, + Move = 0x0118, + Swap = 0x0119, + Split = 0x011A, + Merge = 0x011C, }; enum ClientLanguage : uint8_t diff --git a/src/common/Network/PacketDef/Ipcs.h b/src/common/Network/PacketDef/Ipcs.h index 6e584ede..74399d28 100644 --- a/src/common/Network/PacketDef/Ipcs.h +++ b/src/common/Network/PacketDef/Ipcs.h @@ -43,27 +43,27 @@ namespace Sapphire::Network::Packets */ enum ServerZoneIpcType : uint16_t { - Ping = 0x0219, // updated 5.35 hotfix - Init = 0x0185, // updated 5.35 hotfix + Ping = 0x0183, // updated 5.45 hotfix + Init = 0x01EA, // updated 5.45 hotfix - ActorFreeSpawn = 0x0239, // updated 5.35 hotfix - InitZone = 0x03CD, // updated 5.35 hotfix + ActorFreeSpawn = 0x0185, // updated 5.45 hotfix + InitZone = 0x0233, // updated 5.45 hotfix - EffectResult = 0x01C2, // updated 5.35 hotfix - ActorControl = 0x02A4, // updated 5.35 hotfix - ActorControlSelf = 0x02C8, // updated 5.35 hotfix - ActorControlTarget = 0x0209, // updated 5.35 hotfix + EffectResult = 0x01D7, // updated 5.45 hotfix + ActorControl = 0x00C2, // updated 5.45 hotfix + ActorControlSelf = 0x03D5, // updated 5.45 hotfix + ActorControlTarget = 0x0171, // updated 5.45 hotfix /*! * @brief Used when resting */ - UpdateHpMpTp = 0x0319, // updated 5.35 hotfix + UpdateHpMpTp = 0x019B, // updated 5.45 hotfix /////////////////////////////////////////////////// ChatBanned = 0xF06B, Playtime = 0x03A4, // updated 5.35 hotfix - Logout = 0x02AD, // updated 5.35 hotfix + Logout = 0x012A, // updated 5.45 hotfix CFNotify = 0x02C4, // updated 5.35 hotfix CFMemberStatus = 0x0079, CFDutyInfo = 0x0193, // updated 5.35 hotfix @@ -85,25 +85,25 @@ namespace Sapphire::Network::Packets WorldVisitList = 0xF0FE, // added 4.5 - SocialList = 0x0216, // updated 5.35 hotfix + SocialList = 0x0315, // updated 5.45 hotfix ExamineSearchInfo = 0x03C3, // updated 5.35 hotfix UpdateSearchInfo = 0x0121, // updated 5.35 hotfix - InitSearchInfo = 0x036F, // updated 5.35 hotfix + InitSearchInfo = 0x01ED, // updated 5.45 hotfix ExamineSearchComment = 0x0102, // updated 4.1 ServerNoticeShort = 0x017A, // updated 5.35 hotfix - ServerNotice = 0x02F8, // updated 5.35 hotfix - SetOnlineStatus = 0x03D7, // updated 5.35 hotfix + ServerNotice = 0x0354, // updated 5.45 hotfix + SetOnlineStatus = 0x0166, // updated 5.45 hotfix CountdownInitiate = 0x0237, // updated 5.25 CountdownCancel = 0x00D9, // updated 5.18 PlayerAddedToBlacklist = 0x033F, // updated 5.1 PlayerRemovedFromBlacklist = 0x0385, // updated 5.1 - BlackList = 0x02DB, // updated 5.35 hotfix + BlackList = 0x02BD, // updated 5.45 hotfix - LinkshellList = 0x01F0, // updated 5.35 hotfix + LinkshellList = 0x021A, // updated 5.45 hotfix MailDeleteRequest = 0xF12B, // updated 5.0 @@ -126,44 +126,44 @@ namespace Sapphire::Network::Packets FreeCompanyUpdateShortMessage = 0xF157, // added 5.0 - StatusEffectList = 0x0382, // updated 5.35 hotfix + StatusEffectList = 0x0243, // updated 5.45 hotfix EurekaStatusEffectList = 0x0167, // updated 5.18 BossStatusEffectList = 0x0312, // added 5.1 - Effect = 0x0192, // updated 5.35 hotfix - AoeEffect8 = 0x012C, // updated 5.35 hotfix + Effect = 0x027F, // updated 5.45 hotfix + AoeEffect8 = 0x009B, // updated 5.45 hotfix AoeEffect16 = 0x01B9, // updated 5.35 hotfix AoeEffect24 = 0x02B4, // updated 5.35 hotfix AoeEffect32 = 0x00A4, // updated 5.35 hotfix - PersistantEffect = 0x0317, // updated 5.35 hotfix + PersistantEffect = 0x0244, // updated 5.45 hotfix - GCAffiliation = 0x0105, // updated 5.35 hotfix + GCAffiliation = 0x0155, // updated 5.45 hotfix - PlayerSpawn = 0x0179, // updated 5.35 hotfix - NpcSpawn = 0x03A8, // updated 5.35 hotfix + PlayerSpawn = 0x01AB, // updated 5.45 hotfix + NpcSpawn = 0x02C9, // updated 5.45 hotfix NpcSpawn2 = 0x01CB, // ( Bigger statuseffectlist? ) updated 5.3 - ActorMove = 0x01BF, // updated 5.35 hotfix + ActorMove = 0x006B, // updated 5.45 hotfix - ActorSetPos = 0x03DF, // updated 5.35 hotfix + ActorSetPos = 0x00C6, // updated 5.45 hotfix - ActorCast = 0x0302, // updated 5.35 hotfix + ActorCast = 0x034C, // updated 5.45 hotfix SomeCustomiseChangePacketProbably = 0x00CD, // added 5.18 PartyList = 0x02B2, // updated 5.35 hotfix PartyMessage = 0x00AE, // updated 5.35 hotfix - HateRank = 0x02CC, // updated 5.35 hotfix - HateList = 0x0198, // updated 5.35 hotfix - ObjectSpawn = 0x02B8, // updated 5.35 hotfix + HateRank = 0x0217, // updated 5.45 hotfix + HateList = 0x00E5, // updated 5.45 hotfix + ObjectSpawn = 0x0336, // updated 5.45 hotfix ObjectDespawn = 0x00C0, // updated 5.35 hotfix - UpdateClassInfo = 0x0235, // updated 5.35 hotfix - SilentSetClassJob = 0x018E, // updated 5.0 - seems to be the case, not sure if it's actually used for anything - PlayerSetup = 0x0290, // updated 5.35 hotfix - PlayerStats = 0x023B, // updated 5.35 hotfix - ActorOwner = 0x00E8, // updated 5.35 hotfix - PlayerStateFlags = 0x00F8, // updated 5.35 hotfix - PlayerClassInfo = 0x02C3, // updated 5.35 hotfix - CharaVisualEffect = 0x02E2, // updated 5.35 hotfix + UpdateClassInfo = 0x0179, // updated 5.45 hotfix + SilentSetClassJob = 0xF18E, // updated 5.0 - seems to be the case, not sure if it's actually used for anything + PlayerSetup = 0x01E9, // updated 5.45 hotfix + PlayerStats = 0x01CC, // updated 5.45 hotfix + ActorOwner = 0x0153, // updated 5.45 hotfix + PlayerStateFlags = 0x02DC, // updated 5.45 hotfix + PlayerClassInfo = 0x02F0, // updated 5.45 hotfix + CharaVisualEffect = 0x026A, // updated 5.45 hotfix - ModelEquip = 0x0277, // updated 5.35 hotfix + ModelEquip = 0x024A, // updated 5.45 hotfix Examine = 0x00BC, // updated 5.35 hotfix CharaNameReq = 0x008E, // updated 5.35 hotfix @@ -174,25 +174,25 @@ namespace Sapphire::Network::Packets SetLevelSync = 0x1186, // not updated for 4.4, not sure what it is anymore - ItemInfo = 0x0214, // updated 5.35 hotfix - ContainerInfo = 0x00C5, // updated 5.35 hotfix - InventoryTransactionFinish = 0x02F0, // updated 5.35 hotfix - InventoryTransaction = 0x01FD, // updated 5.35 hotfix - CurrencyCrystalInfo = 0x0379, // updated 5.35 hotfix + ItemInfo = 0x0175, // updated 5.45 hotfix + ContainerInfo = 0x0193, // updated 5.45 hotfix + InventoryTransactionFinish = 0x00BD, // updated 5.45 hotfix + InventoryTransaction = 0x02EE, // updated 5.45 hotfix + CurrencyCrystalInfo = 0x0363, // updated 5.45 hotfix - InventoryActionAck = 0x03E4, // updated 5.35 hotfix - UpdateInventorySlot = 0x036A, // updated 5.35 hotfix + InventoryActionAck = 0x02FA, // updated 5.45 hotfix + UpdateInventorySlot = 0x017D, // updated 5.45 hotfix - HuntingLogEntry = 0x0146, // updated 5.35 hotfix + HuntingLogEntry = 0x0232, // updated 5.45 hotfix - EventPlay = 0x00F3, // updated 5.35 hotfix - EventPlay4 = 0x00AC, // updated 5.35 hotfix - EventPlay8 = 0x023F, // updated 5.35 hotfix - EventPlay16 = 0x025B, // updated 5.35 hotfix - EventPlay32 = 0x029A, // updated 5.35 hotfix - EventPlay64 = 0x02C1, // updated 5.35 hotfix - EventPlay128 = 0x038A, // updated 5.35 hotfix - EventPlay255 = 0x034B, // updated 5.35 hotfix + EventPlay = 0x0276, // updated 5.45 hotfix + EventPlay4 = 0x028D, // updated 5.45 hotfix + EventPlay8 = 0x0318, // updated 5.45 hotfix + EventPlay16 = 0x020D, // updated 5.45 hotfix + EventPlay32 = 0x03B5, // updated 5.45 hotfix + EventPlay64 = 0x039E, // updated 5.45 hotfix + EventPlay128 = 0x02F4, // updated 5.45 hotfix + EventPlay255 = 0x009D, // updated 5.45 hotfix EventYield = 0x037D, // updated 5.35 hotfix //EventYield4 = 0x0000, @@ -203,24 +203,24 @@ namespace Sapphire::Network::Packets //EventYield128 = 0x0000, //EventYield255 = 0x0000, - EventStart = 0x009A, // updated 5.35 hotfix - EventFinish = 0x007E, // updated 5.35 hotfix + EventStart = 0x02DE, // updated 5.45 hotfix + EventFinish = 0x01A3, // updated 5.45 hotfix EventLinkshell = 0x1169, - QuestActiveList = 0x0117, // updated 5.35 hotfix - QuestUpdate = 0x0073, // updated 5.35 hotfix - QuestCompleteList = 0x0240, // updated 5.35 hotfix + QuestActiveList = 0x015A, // updated 5.45 hotfix + QuestUpdate = 0x037B, // updated 5.45 hotfix + QuestCompleteList = 0x0287, // updated 5.45 hotfix - QuestFinish = 0x00E9, // updated 5.35 hotfix + QuestFinish = 0x0066, // updated 5.45 hotfix MSQTrackerComplete = 0xF1D6, // updated 5.0 MSQTrackerProgress = 0xF1CD, // updated 4.5 ? this actually looks like the two opcodes have been combined, see #474 - QuestMessage = 0x0381, // updated 5.35 hotfix + QuestMessage = 0x017B, // updated 5.45 hotfix - QuestTracker = 0x018B, // updated 5.35 hotfix + QuestTracker = 0x01E8, // updated 5.45 hotfix - Mount = 0x01B5, // updated 5.35 hotfix + Mount = 0x0122, // updated 5.45 hotfix DirectorVars = 0x011D, // updated 5.35 hotfix SomeDirectorUnk1 = 0x0084, // updated 5.18 @@ -240,27 +240,27 @@ namespace Sapphire::Network::Packets EorzeaTimeOffset = 0x01D4, // updated 5.35 hotfix - EquipDisplayFlags = 0x00BE, // updated 5.35 hotfix + EquipDisplayFlags = 0x0316, // updated 5.45 hotfix MiniCactpotInit = 0x0286, // added 5.31 - ShopMessage = 0x0197, // updated 5.35 hotfix - LootMessage = 0x01B7, // updated 5.35 hotfix + ShopMessage = 0x02FC, // updated 5.45 hotfix + LootMessage = 0x03B8, // updated 5.45 hotfix /// Housing ////////////////////////////////////// - LandSetInitialize = 0x0095, // updated 5.35 hotfix + LandSetInitialize = 0x03E2, // updated 5.45 hotfix LandUpdate = 0x00BF, // updated 5.35 hotfix YardObjectSpawn = 0x01CA, // updated 5.35 hotfix HousingIndoorInitialize = 0x01FF, // updated 5.35 hotfix LandPriceUpdate = 0x0380, // updated 5.35 hotfix - LandInfoSign = 0x023D, // updated 5.35 hotfix + LandInfoSign = 0x0398, // updated 5.45 hotfix LandRename = 0x0140, // updated 5.35 hotfix HousingEstateGreeting = 0x00C7, // updated 5.35 hotfix HousingUpdateLandFlagsSlot = 0x027E, // updated 5.35 hotfix - HousingLandFlags = 0x022F, // updated 5.35 hotfix + HousingLandFlags = 0x033B, // updated 5.45 hotfix HousingShowEstateGuestAccess = 0x03B5, // updated 5.35 hotfix - HousingObjectInitialize = 0x01AA, // updated 5.35 hotfix + HousingObjectInitialize = 0x00B5, // updated 5.45 hotfix HousingInternalObjectSpawn = 0x0234, // updated 5.35 hotfix HousingWardInfo = 0x02FD, // updated 5.35 hotfix @@ -277,12 +277,12 @@ namespace Sapphire::Network::Packets DuelChallenge = 0x0277, // 4.2; this is responsible for opening the ui PerformNote = 0x0286, // updated 4.3 - PrepareZoning = 0x026C, // updated 5.35 hotfix - ActorGauge = 0x0112, // updated 5.35 hotfix + PrepareZoning = 0x01EE, // updated 5.45 hotfix + ActorGauge = 0x018E, // updated 5.45 hotfix // daily quest info -> without them sent, login will take longer... - DailyQuests = 0x0139, // updated 5.35 hotfix - DailyQuestRepeatFlags = 0x024C, // updated 5.35 hotfix + DailyQuests = 0x02C4, // updated 5.45 hotfix + DailyQuestRepeatFlags = 0x024D, // updated 5.45 hotfix /// Doman Mahjong ////////////////////////////////////// MahjongOpenGui = 0x02A4, // only available in mahjong instance @@ -302,10 +302,10 @@ namespace Sapphire::Network::Packets */ enum ClientZoneIpcType : uint16_t { - PingHandler = 0x0219, // updated 5.35 hotfix - InitHandler = 0x0185, // updated 5.35 hotfix + PingHandler = 0x0183, // updated 5.45 hotfix + InitHandler = 0x01EA, // updated 5.45 hotfix - FinishLoadingHandler = 0x01BE, // updated 5.35 hotfix + FinishLoadingHandler = 0x023F, // updated 5.45 hotfix CFCommenceHandler = 0x0118, // updated 5.35 hotfix @@ -313,7 +313,7 @@ namespace Sapphire::Network::Packets CFRegisterDuty = 0x0289, // updated 5.35 hotfix CFRegisterRoulette = 0x0088, // updated 5.35 hotfix PlayTimeHandler = 0x02A8, // updated 5.35 hotfix - LogoutHandler = 0x00EC, // updated 5.35 hotfix + LogoutHandler = 0x0312, // updated 5.45 hotfix CancelLogout = 0x03DB, // updated 5.35 hotfix CFDutyInfoHandler = 0x0078, // updated 4.2 @@ -322,23 +322,23 @@ namespace Sapphire::Network::Packets SocialResponseHandler = 0x028D, // updated 5.35 hotfix CreateCrossWorldLS = 0x00AF, // updated 4.3 - ChatHandler = 0x0131, // updated 5.35 hotfix + ChatHandler = 0x00A4, // updated 5.45 hotfix PartyChatHandler = 0x0065, PartySetLeaderHandler = 0x0208, // updated 5.35 hotfix LeavePartyHandler = 0x0337, // updated 5.35 hotfix KickPartyMemberHandler = 0x014C, // updated 5.35 hotfix DisbandPartyHandler = 0x0205, // updated 5.35 hotfix - SocialListHandler = 0x0340, // updated 5.35 hotfix + SocialListHandler = 0x02B0, // updated 5.45 hotfix SetSearchInfoHandler = 0x0314, // updated 5.35 hotfix - ReqSearchInfoHandler = 0x01E9, // updated 5.35 hotfix + ReqSearchInfoHandler = 0x03AC, // updated 5.45 hotfix ReqExamineSearchCommentHandler = 0x00E7, // updated 5.0 ReqRemovePlayerFromBlacklist = 0x00F1, // updated 5.0 - BlackListHandler = 0x0079, // updated 5.35 hotfix + BlackListHandler = 0x02CD, // updated 5.45 hotfix PlayerSearchHandler = 0x00F4, // updated 5.0 - LinkshellListHandler = 0x024B, // updated 5.35 hotfix + LinkshellListHandler = 0x0258, // updated 5.45 hotfix MarketBoardRequestItemListingInfo = 0x0102, // updated 4.5 MarketBoardRequestItemListings = 0x0103, // updated 4.5 @@ -357,41 +357,41 @@ namespace Sapphire::Network::Packets ReqCountdownInitiate = 0x025F, // updated 5.35 hotfix ReqCountdownCancel = 0x0244, // updated 5.25 - ZoneLineHandler = 0x0279, // updated 5.35 hotfix - ClientTrigger = 0x03D3, // updated 5.35 hotfix + ZoneLineHandler = 0x00BA, // updated 5.45 hotfix + ClientTrigger = 0x0146, // updated 5.45 hotfix DiscoveryHandler = 0x00E3, // updated 5.35 hotfix PlaceFieldMarkerPreset = 0x023F, // updated 5.25 PlaceFieldMarker = 0x01BA, // updated 5.25 - SkillHandler = 0x01CD, // updated 5.35 hotfix - GMCommand1 = 0x02AC, // updated 5.35 hotfix - GMCommand2 = 0x029F, // updated 5.35 hotfix + SkillHandler = 0x0388, // updated 5.45 hotfix + GMCommand1 = 0x01E0, // updated 5.45 hotfix + GMCommand2 = 0x0114, // updated 5.45 hotfix AoESkillHandler = 0x030C, // updated 5.35 hotfix - UpdatePositionHandler = 0x0236, // updated 5.35 hotfix + UpdatePositionHandler = 0x031A, // updated 5.45 hotfix - InventoryModifyHandler = 0x0135, // updated 5.35 hotfix + InventoryModifyHandler = 0x0110, // updated 5.45 hotfix InventoryEquipRecommendedItems = 0x0116, // updated 5.35 hotfix ReqPlaceHousingItem = 0x02AE, // updated 5.35 hotfix BuildPresetHandler = 0x01C2, // updated 5.35 hotfix - TalkEventHandler = 0x02A4, // updated 5.35 hotfix - EmoteEventHandler = 0x02C8, // updated 5.35 hotfix - WithinRangeEventHandler = 0x0209, // updated 5.35 hotfix - OutOfRangeEventHandler = 0x0319, // updated 5.35 hotfix - EnterTeriEventHandler = 0x0192, // updated 5.35 hotfix + TalkEventHandler = 0x00C2, // updated 5.45 hotfix + EmoteEventHandler = 0x03D5, // updated 5.45 hotfix + WithinRangeEventHandler = 0x0171, // updated 5.45 hotfix + OutOfRangeEventHandler = 0x019B, // updated 5.45 hotfix + EnterTeriEventHandler = 0x027F, // updated 5.45 hotfix ShopEventHandler = 0x01F6, // updated 5.35 hotfix EventYieldHandler = 0x0128, // updated 5.35 hotfix - ReturnEventHandler = 0x02B4, // updated 5.35 hotfix - TradeReturnEventHandler = 0x00A4, // updated 5.35 hotfix + ReturnEventHandler = 0x02AD, // updated 5.45 hotfix + TradeReturnEventHandler = 0x00A7, // updated 5.45 hotfix TradeMultipleReturnEventHander = 0x035C, // updated 5.35 hotfix LinkshellEventHandler = 0x016B, // updated 4.5 LinkshellEventHandler1 = 0x016C, // updated 4.5 - ReqEquipDisplayFlagsChange = 0x02F6, // updated 5.35 hotfix + ReqEquipDisplayFlagsChange = 0x03B0, // updated 5.45 hotfix LandRenameHandler = 0x0155, // updated 5.35 hotfix HousingUpdateHouseGreeting = 0x02EA, // updated 5.35 hotfix @@ -404,8 +404,8 @@ namespace Sapphire::Network::Packets PerformNoteHandler = 0x029B, // updated 4.3 - WorldInteractionHandler = 0x00A9, // updated 5.35 hotfix - Dive = 0x02CC, // updated 5.35 hotfix + WorldInteractionHandler = 0x02E4, // updated 5.45 hotfix + Dive = 0x00F1, // updated 5.45 hotfix }; //////////////////////////////////////////////////////////////////////////////// diff --git a/src/common/Network/PacketDef/Zone/ServerZoneDef.h b/src/common/Network/PacketDef/Zone/ServerZoneDef.h index e21d1427..0ae32730 100644 --- a/src/common/Network/PacketDef/Zone/ServerZoneDef.h +++ b/src/common/Network/PacketDef/Zone/ServerZoneDef.h @@ -1046,8 +1046,7 @@ namespace Sapphire::Network::Packets::Server unsigned char companionDefRank; unsigned char companionAttRank; unsigned char companionHealRank; - unsigned char mountGuideMask[23]; - unsigned char maybeReservedMountSlots; + unsigned char mountGuideMask[28]; //== char name[32]; unsigned char unknownOword[16]; @@ -1056,10 +1055,11 @@ namespace Sapphire::Network::Packets::Server unsigned char aetheryte[21]; unsigned char discovery[445]; unsigned char howto[34]; - unsigned char minions[51]; + unsigned char minions[53]; unsigned char chocoboTaxiMask[10]; - unsigned char watchedCutscenes[131]; + unsigned char watchedCutscenes[135]; unsigned char companionBardingMask[10]; + unsigned char unknown5_45a; // companionBardingMask[11]? unsigned char companionEquippedHead; unsigned char companionEquippedBody; unsigned char companionEquippedLegs; @@ -1074,7 +1074,7 @@ namespace Sapphire::Network::Packets::Server unsigned char unknownPvp5AB[11]; unsigned char unknown5B9[5]; */ - unsigned char unknown5_3c[234]; + unsigned char unknown5_45b[236]; //== unsigned char pose; /* @@ -1092,28 +1092,32 @@ namespace Sapphire::Network::Packets::Server unsigned char aetherCurrentMask[22]; unsigned char u10[3]; */ - unsigned char unknown5_3d[292]; + unsigned char unknown5_45c[294]; //== - unsigned char orchestrionMask[40]; + unsigned char orchestrionMask[40]; // this field may already be extended, if it is, the beginning bytes are at the end of unknown5_45c unsigned char hallOfNoviceCompletion[3]; unsigned char animaCompletion[11]; unsigned char unknown5_3e[33]; unsigned char unlockedRaids[28]; unsigned char unlockedDungeons[18]; unsigned char unlockedGuildhests[10]; - unsigned char unlockedTrials[9]; // 5.35 trial:pvp either 9:5 or 8:6 not confirmed - unsigned char unlockedPvp[5]; + /* + at least 8 bytes at most 10 bytes in unlockedTrials not confirmed, adjust unlockedPvp so they share a total of 15 bytes and sync with clearedTrials/clearedPvp. + */ + unsigned char unlockedTrials[9]; + unsigned char unlockedPvp[6]; + //== unsigned char clearedRaids[28]; unsigned char clearedDungeons[18]; unsigned char clearedGuildhests[10]; unsigned char clearedTrials[9]; - unsigned char clearedPvp[5]; + unsigned char clearedPvp[6]; /* unsigned short fishingRecordsFishWeight[26]; unsigned int exploratoryMissionNextTimestamp; unsigned char pvpLevel; */ - unsigned char padding2[8]; + unsigned char unknown5_45d[8]; //== }; From 9e9a0f80f99960ccbfc119eeb5eb7a8d0bd3e3e4 Mon Sep 17 00:00:00 2001 From: collett Date: Tue, 16 Feb 2021 23:04:31 +0900 Subject: [PATCH 04/43] merge known opcode from https://github.com/karashiiro/FFXIVOpcodes & discord, adding new opcode defines from them as well. --- src/common/Network/PacketDef/Ipcs.h | 46 ++++++++++++++++++----------- 1 file changed, 29 insertions(+), 17 deletions(-) diff --git a/src/common/Network/PacketDef/Ipcs.h b/src/common/Network/PacketDef/Ipcs.h index 74399d28..0e4c7ea7 100644 --- a/src/common/Network/PacketDef/Ipcs.h +++ b/src/common/Network/PacketDef/Ipcs.h @@ -62,13 +62,13 @@ namespace Sapphire::Network::Packets /////////////////////////////////////////////////// ChatBanned = 0xF06B, - Playtime = 0x03A4, // updated 5.35 hotfix + Playtime = 0x01CC, // updated 5.45 hotfix Logout = 0x012A, // updated 5.45 hotfix - CFNotify = 0x02C4, // updated 5.35 hotfix + CFNotify = 0x026E, // updated 5.45 hotfix CFMemberStatus = 0x0079, CFDutyInfo = 0x0193, // updated 5.35 hotfix CFPlayerInNeed = 0xF07F, - CFPreferredRole = 0x0196, // updated 5.35 hotfix + CFPreferredRole = 0x012E, // updated 5.45 hotfix CFCancel = 0x00EC, // updated 5.35 hotfix SocialRequestError = 0xF0AD, @@ -87,8 +87,8 @@ namespace Sapphire::Network::Packets SocialList = 0x0315, // updated 5.45 hotfix - ExamineSearchInfo = 0x03C3, // updated 5.35 hotfix - UpdateSearchInfo = 0x0121, // updated 5.35 hotfix + ExamineSearchInfo = 0x035F, // updated 5.45 hotfix + UpdateSearchInfo = 0x0310, // updated 5.45 hotfix InitSearchInfo = 0x01ED, // updated 5.45 hotfix ExamineSearchComment = 0x0102, // updated 4.1 @@ -114,14 +114,14 @@ namespace Sapphire::Network::Packets MarketTaxRates = 0x01F8, // updated 5.35 hotfix - MarketBoardSearchResult = 0x032C, // updated 5.35 hotfix - MarketBoardItemListingCount = 0x038F, // updated 5.35 hotfix - MarketBoardItemListingHistory = 0x0186, // updated 5.35 hotfix - MarketBoardItemListing = 0x025F, // updated 5.35 hotfix + MarketBoardSearchResult = 0x01D6, // updated 5.45 hotfix + MarketBoardItemListingCount = 0x00C0, // updated 5.45 hotfix + MarketBoardItemListingHistory = 0x01C3, // updated 5.45 hotfix + MarketBoardItemListing = 0x016B, // updated 5.45 hotfix CharaFreeCompanyTag = 0x013B, // updated 4.5 FreeCompanyBoardMsg = 0x013C, // updated 4.5 - FreeCompanyInfo = 0xF13D, // updated 4.5 + FreeCompanyInfo = 0x03D0, // updated 5.45 hotfix ExamineFreeCompanyInfo = 0xF13E, // updated 4.5 FreeCompanyUpdateShortMessage = 0xF157, // added 5.0 @@ -164,13 +164,13 @@ namespace Sapphire::Network::Packets CharaVisualEffect = 0x026A, // updated 5.45 hotfix ModelEquip = 0x024A, // updated 5.45 hotfix - Examine = 0x00BC, // updated 5.35 hotfix + Examine = 0x0261, // updated 5.45 hotfix CharaNameReq = 0x008E, // updated 5.35 hotfix // nb: see #565 on github UpdateRetainerItemSalePrice = 0xF19F, // updated 5.0 RetainerSaleHistory = 0x020E, // updated 5.21 hotfix - RetainerInformation = 0x01F9, // updated 5.35 hotfix + RetainerInformation = 0x026B, // updated 5.45 hotfix SetLevelSync = 0x1186, // not updated for 4.4, not sure what it is anymore @@ -225,7 +225,7 @@ namespace Sapphire::Network::Packets DirectorVars = 0x011D, // updated 5.35 hotfix SomeDirectorUnk1 = 0x0084, // updated 5.18 SomeDirectorUnk2 = 0xF0C1, // updated 5.18 - SomeDirectorUnk4 = 0x0202, // updated 5.35 hotfix + SomeDirectorUnk4 = 0x0071, // updated 5.45 hotfix SomeDirectorUnk8 = 0x028A, // updated 5.18 SomeDirectorUnk16 = 0x028C, // updated 5.18 DirectorPopUp = 0xF162, // updated 5.18 - display dialogue pop-ups in duties and FATEs, for example, Teraflare's countdown @@ -245,6 +245,8 @@ namespace Sapphire::Network::Packets MiniCactpotInit = 0x0286, // added 5.31 ShopMessage = 0x02FC, // updated 5.45 hotfix LootMessage = 0x03B8, // updated 5.45 hotfix + ResultDialog = 0x0296, // updated 5.45 hotfix + DesynthResult = 0x0323, // updated 5.45 hotfix /// Housing ////////////////////////////////////// @@ -295,6 +297,16 @@ namespace Sapphire::Network::Packets // 2C3 and 2C4 are currently unknown MahjongEndRoundDraw = 0x02C5, // self explanatory MahjongEndGame = 0x02C6, // finished oorasu(all-last) round; shows a result screen. + + /// Airship & Submarine ////////////////////////////////////// + AirshipExplorationResult = 0x0131, // updated 5.45 hotfix + AirshipStatus = 0x0253, // updated 5.45 hotfix + AirshipStatusList = 0x0391, // updated 5.45 hotfix + AirshipTimers = 0x0206, // updated 5.45 hotfix + SubmarineExplorationResult = 0x00EB, // updated 5.45 hotfix + SubmarineProgressionStatus = 0x0333, // updated 5.45 hotfix + SubmarineStatusList = 0x01F2, // updated 5.45 hotfix + SubmarineTimers = 0x013B, // updated 5.45 hotfix }; /** @@ -330,7 +342,7 @@ namespace Sapphire::Network::Packets DisbandPartyHandler = 0x0205, // updated 5.35 hotfix SocialListHandler = 0x02B0, // updated 5.45 hotfix - SetSearchInfoHandler = 0x0314, // updated 5.35 hotfix + SetSearchInfoHandler = 0x0111, // updated 5.45 hotfix ReqSearchInfoHandler = 0x03AC, // updated 5.45 hotfix ReqExamineSearchCommentHandler = 0x00E7, // updated 5.0 @@ -361,8 +373,8 @@ namespace Sapphire::Network::Packets ClientTrigger = 0x0146, // updated 5.45 hotfix DiscoveryHandler = 0x00E3, // updated 5.35 hotfix - PlaceFieldMarkerPreset = 0x023F, // updated 5.25 - PlaceFieldMarker = 0x01BA, // updated 5.25 + PlaceFieldMarkerPreset = 0x01D3, // updated 5.45 hotfix + PlaceFieldMarker = 0x0392, // updated 5.45 hotfix SkillHandler = 0x0388, // updated 5.45 hotfix GMCommand1 = 0x01E0, // updated 5.45 hotfix GMCommand2 = 0x0114, // updated 5.45 hotfix @@ -400,7 +412,7 @@ namespace Sapphire::Network::Packets SetSharedEstateSettings = 0x017B, // updated 5.0 - UpdatePositionInstance = 0x0345, // updated 5.35 hotfix + UpdatePositionInstance = 0x034E, // updated 5.45 hotfix PerformNoteHandler = 0x029B, // updated 4.3 From e976abd586c86c80d5959e245ee9d48032299d89 Mon Sep 17 00:00:00 2001 From: collett Date: Tue, 16 Feb 2021 23:45:23 +0900 Subject: [PATCH 05/43] failed to count bytes --- src/common/Network/PacketDef/Zone/ServerZoneDef.h | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/common/Network/PacketDef/Zone/ServerZoneDef.h b/src/common/Network/PacketDef/Zone/ServerZoneDef.h index 0ae32730..ccf2324f 100644 --- a/src/common/Network/PacketDef/Zone/ServerZoneDef.h +++ b/src/common/Network/PacketDef/Zone/ServerZoneDef.h @@ -1046,7 +1046,7 @@ namespace Sapphire::Network::Packets::Server unsigned char companionDefRank; unsigned char companionAttRank; unsigned char companionHealRank; - unsigned char mountGuideMask[28]; + unsigned char mountGuideMask[27]; //== char name[32]; unsigned char unknownOword[16]; From 3e5b1ae5e9ea7b1062c507e884f23d4f790b547b Mon Sep 17 00:00:00 2001 From: collett Date: Tue, 16 Feb 2021 23:46:41 +0900 Subject: [PATCH 06/43] gameVer changed to 5400 --- src/lobby/GameConnection.cpp | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/src/lobby/GameConnection.cpp b/src/lobby/GameConnection.cpp index 6bc2e174..b7156cd4 100644 --- a/src/lobby/GameConnection.cpp +++ b/src/lobby/GameConnection.cpp @@ -452,8 +452,8 @@ void Lobby::GameConnection::generateEncryptionKey( uint32_t key, const std::stri m_baseKey[ 2 ] = 0x34; m_baseKey[ 3 ] = 0x12; memcpy( m_baseKey + 0x04, &key, 4 ); - m_baseKey[ 8 ] = 0x88; - m_baseKey[ 9 ] = 0x13; + m_baseKey[ 8 ] = 0x18; + m_baseKey[ 9 ] = 0x15; memcpy( ( char* ) m_baseKey + 0x0C, keyPhrase.c_str(), keyPhrase.size() ); Common::Util::md5( m_baseKey, m_encKey, 0x2C ); } From c4effc7e21e9356154feb088b52da9aaa8522edf Mon Sep 17 00:00:00 2001 From: collett Date: Tue, 16 Feb 2021 23:51:42 +0900 Subject: [PATCH 07/43] EquipSlotCategory reverted back or I updated the wrong enum last time? Anyway all values are checked manually and better naming. --- src/common/Common.h | 59 ++++++++++------------------- src/common/Network/PacketDef/Ipcs.h | 4 +- src/world/Actor/PlayerInventory.cpp | 6 +-- src/world/Manager/ItemMgr.cpp | 40 +++++++++---------- 4 files changed, 46 insertions(+), 63 deletions(-) diff --git a/src/common/Common.h b/src/common/Common.h index e642b4d8..a2e9f834 100644 --- a/src/common/Common.h +++ b/src/common/Common.h @@ -161,44 +161,27 @@ namespace Sapphire::Common enum class EquipSlotCategory : uint8_t { - // main slots - - CharaMainHand = 0, - CharaOffHand = 1, - CharaHead = 2, - CharaBody = 3, - CharaHands = 4, - CharaWaist = 5, - CharaLegs = 6, - CharaFeet = 7, - CharaEars = 8, - CharaNeck = 9, - CharaWrist = 10, - CharaRing = 11, - CharaSoulCrystal = 12, - - /* following slots not seem to exist any more. - when multi-slot gear is moved into equipment slot, normal slot listed above is used. - client will move any incompatible gears into armory but no InventoryModifiyHandler is sent. - server need to move those silently in order to sync with client. - */ - - /*! Cannot equip gear to offhand slot */ - //MainTwoHandedWeapon = 13, - /*! Can be equipped in either main or offhand slot */ - //MainOrOffHand = 14, // unused - /*! Cannot equip gear to head */ - //BodyDisallowHead = 15, - /*! Cannot equip gear to hands, legs and feet slots */ - //BodyDisallowHandsLegsFeet = 16, - /*! Cannot equip gear to feet slot */ - //LegsDisallowFeet = 18, - /*! Cannot equp gear to head, hands, legs, feet slots */ - //BodyDisallowAll = 19, - /*! Cannot equip gear to hands slot */ - //BodyDisallowHands = 20, - /*! Cannot equip gear to legs & feet slots */ - //BodyDisallowLegsFeet = 21, + MainHand = 1, + OffHand = 2, + Head = 3, + Body = 4, + Hands = 5, + Waist = 6, + Legs = 7, + Feet = 8, + Ears = 9, + Neck = 10, + Wrist = 11, + Ring = 12, + MainTwoHandedWeapon = 13, + //MainOrOffHand = 14, // unused + BodyDisallowHead = 15, + BodyDisallowHandsLegsFeet = 16, + SoulCrystal = 17, + LegsDisallowFeet = 18, + BodyDisallowAll = 19, + BodyDisallowHands = 20, + BodyDisallowLegsFeet = 21, }; enum InventoryType : uint16_t diff --git a/src/common/Network/PacketDef/Ipcs.h b/src/common/Network/PacketDef/Ipcs.h index 0e4c7ea7..69c988af 100644 --- a/src/common/Network/PacketDef/Ipcs.h +++ b/src/common/Network/PacketDef/Ipcs.h @@ -66,7 +66,7 @@ namespace Sapphire::Network::Packets Logout = 0x012A, // updated 5.45 hotfix CFNotify = 0x026E, // updated 5.45 hotfix CFMemberStatus = 0x0079, - CFDutyInfo = 0x0193, // updated 5.35 hotfix + CFDutyInfo = 0xF193, // updated 5.35 hotfix CFPlayerInNeed = 0xF07F, CFPreferredRole = 0x012E, // updated 5.45 hotfix CFCancel = 0x00EC, // updated 5.35 hotfix @@ -80,7 +80,7 @@ namespace Sapphire::Network::Packets LogMessage = 0x00D0, - Chat = 0x0349, // updated 5.35 hotfix + Chat = 0x01BA, // updated 5.45 hotfix PartyChat = 0x0065, WorldVisitList = 0xF0FE, // added 4.5 diff --git a/src/world/Actor/PlayerInventory.cpp b/src/world/Actor/PlayerInventory.cpp index f94d0237..2d4763fc 100644 --- a/src/world/Actor/PlayerInventory.cpp +++ b/src/world/Actor/PlayerInventory.cpp @@ -580,9 +580,9 @@ Sapphire::ItemPtr Sapphire::Entity::Player::addItem( ItemPtr itemToAdd, bool sil bool foundFreeSlot = false; std::vector< uint16_t > bags = { Bag0, Bag1, Bag2, Bag3 }; - + sendDebug( "adding item: {}, equipSlotCategory: {}, stackSize: {}", itemToAdd->getId(), itemInfo->equipSlotCategory, itemInfo->stackSize ); // add the related armoury bag to the applicable bags and try and fill a free slot there before falling back to regular inventory - if( itemInfo->isEquippable && getEquipDisplayFlags() & StoreNewItemsInArmouryChest ) + if( itemInfo->equipSlotCategory > 0 && getEquipDisplayFlags() & StoreNewItemsInArmouryChest ) { auto bag = World::Manager::ItemMgr::getCharaEquipSlotCategoryToArmoryId( static_cast< Common::EquipSlotCategory >( itemInfo->equipSlotCategory ) ); @@ -601,7 +601,7 @@ Sapphire::ItemPtr Sapphire::Entity::Player::addItem( ItemPtr itemToAdd, bool sil auto item = storage->getItem( slot ); // add any items that are stackable - if( canMerge && item && !itemInfo->isEquippable && item->getId() == itemToAdd->getId() ) + if( canMerge && item && item->getMaxStackSize() > 1 && item->getId() == itemToAdd->getId() ) { uint32_t count = item->getStackSize(); uint32_t maxStack = item->getMaxStackSize(); diff --git a/src/world/Manager/ItemMgr.cpp b/src/world/Manager/ItemMgr.cpp index 3c08d82d..c8331dac 100644 --- a/src/world/Manager/ItemMgr.cpp +++ b/src/world/Manager/ItemMgr.cpp @@ -32,51 +32,51 @@ uint16_t Sapphire::World::Manager::ItemMgr::getCharaEquipSlotCategoryToArmoryId( switch( slot ) { - case Common::EquipSlotCategory::CharaHead: + case Common::EquipSlotCategory::Head: return Common::ArmoryHead; - case Common::EquipSlotCategory::CharaBody: - //case Common::EquipSlotCategory::BodyDisallowHead: - //case Common::EquipSlotCategory::BodyDisallowHandsLegsFeet: - //case Common::EquipSlotCategory::BodyDisallowAll: - //case Common::EquipSlotCategory::BodyDisallowHands: - //case Common::EquipSlotCategory::BodyDisallowLegsFeet: + case Common::EquipSlotCategory::Body: + case Common::EquipSlotCategory::BodyDisallowHead: + case Common::EquipSlotCategory::BodyDisallowHandsLegsFeet: + case Common::EquipSlotCategory::BodyDisallowAll: + case Common::EquipSlotCategory::BodyDisallowHands: + case Common::EquipSlotCategory::BodyDisallowLegsFeet: return Common::ArmoryBody; - case Common::EquipSlotCategory::CharaEars: + case Common::EquipSlotCategory::Ears: return Common::ArmoryEar; - case Common::EquipSlotCategory::CharaFeet: + case Common::EquipSlotCategory::Feet: return Common::ArmoryFeet; - case Common::EquipSlotCategory::CharaHands: + case Common::EquipSlotCategory::Hands: return Common::ArmoryHand; - case Common::EquipSlotCategory::CharaLegs: - //case Common::EquipSlotCategory::LegsDisallowFeet: + case Common::EquipSlotCategory::Legs: + case Common::EquipSlotCategory::LegsDisallowFeet: return Common::ArmoryLegs; - case Common::EquipSlotCategory::CharaMainHand: - //case Common::EquipSlotCategory::MainTwoHandedWeapon: + case Common::EquipSlotCategory::MainHand: + case Common::EquipSlotCategory::MainTwoHandedWeapon: //case Common::EquipSlotCategory::MainOrOffHand: return Common::ArmoryMain; - case Common::EquipSlotCategory::CharaOffHand: + case Common::EquipSlotCategory::OffHand: return Common::ArmoryOff; - case Common::EquipSlotCategory::CharaRing: + case Common::EquipSlotCategory::Ring: return Common::ArmoryRing; - case Common::EquipSlotCategory::CharaWaist: + case Common::EquipSlotCategory::Waist: return Common::ArmoryWaist; - case Common::EquipSlotCategory::CharaWrist: + case Common::EquipSlotCategory::Wrist: return Common::ArmoryWrist; - case Common::EquipSlotCategory::CharaNeck: + case Common::EquipSlotCategory::Neck: return Common::ArmoryNeck; - case Common::EquipSlotCategory::CharaSoulCrystal: + case Common::EquipSlotCategory::SoulCrystal: return Common::ArmorySoulCrystal; default: From f499b53f25c806dd84ab69d34e703fa0f7981622 Mon Sep 17 00:00:00 2001 From: collett Date: Tue, 16 Feb 2021 23:51:59 +0900 Subject: [PATCH 08/43] store new mount bytes to db --- src/world/Actor/Player.h | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/world/Actor/Player.h b/src/world/Actor/Player.h index 41565b32..8dbe9afe 100644 --- a/src/world/Actor/Player.h +++ b/src/world/Actor/Player.h @@ -1068,7 +1068,7 @@ namespace Sapphire::Entity uint8_t m_titleList[48]; uint8_t m_howTo[34]; uint8_t m_minions[40]; - uint8_t m_mountGuide[22]; + uint8_t m_mountGuide[27]; uint8_t m_homePoint; uint8_t m_startTown; uint16_t m_townWarpFstFlags; From bc4f7f490de3aa80b7110ae9f873218efe2343a9 Mon Sep 17 00:00:00 2001 From: collett Date: Fri, 19 Feb 2021 02:36:05 +0900 Subject: [PATCH 09/43] opcode part 2 --- src/common/Network/PacketDef/Ipcs.h | 28 ++++++++++++++-------------- 1 file changed, 14 insertions(+), 14 deletions(-) diff --git a/src/common/Network/PacketDef/Ipcs.h b/src/common/Network/PacketDef/Ipcs.h index 69c988af..15d7429b 100644 --- a/src/common/Network/PacketDef/Ipcs.h +++ b/src/common/Network/PacketDef/Ipcs.h @@ -62,7 +62,7 @@ namespace Sapphire::Network::Packets /////////////////////////////////////////////////// ChatBanned = 0xF06B, - Playtime = 0x01CC, // updated 5.45 hotfix + Playtime = 0x03A4, // updated 5.35 hotfix Logout = 0x012A, // updated 5.45 hotfix CFNotify = 0x026E, // updated 5.45 hotfix CFMemberStatus = 0x0079, @@ -73,9 +73,9 @@ namespace Sapphire::Network::Packets SocialRequestError = 0xF0AD, CFRegistered = 0x010C, // updated 5.35 hotfix - SocialRequestResponse = 0x01C7, // updated 5.35 hotfix - SocialMessage = 0x0308, // updated 5.35 hotfix - SocialMessage2 = 0x037C, // updated 5.35 hotfix + SocialRequestResponse = 0x03A5, // updated 5.45 hotfix + SocialMessage = 0x030C, // updated 5.45 hotfix + SocialMessage2 = 0x00BB, // updated 5.45 hotfix CancelAllianceForming = 0x00C6, // updated 4.2 LogMessage = 0x00D0, @@ -148,8 +148,8 @@ namespace Sapphire::Network::Packets ActorCast = 0x034C, // updated 5.45 hotfix SomeCustomiseChangePacketProbably = 0x00CD, // added 5.18 - PartyList = 0x02B2, // updated 5.35 hotfix - PartyMessage = 0x00AE, // updated 5.35 hotfix + PartyList = 0x00F5, // updated 5.45 hotfix + PartyMessage = 0x01BC, // updated 5.45 hotfix HateRank = 0x0217, // updated 5.45 hotfix HateList = 0x00E5, // updated 5.45 hotfix ObjectSpawn = 0x0336, // updated 5.45 hotfix @@ -194,7 +194,7 @@ namespace Sapphire::Network::Packets EventPlay128 = 0x02F4, // updated 5.45 hotfix EventPlay255 = 0x009D, // updated 5.45 hotfix - EventYield = 0x037D, // updated 5.35 hotfix + EventYield = 0x0268, // updated 5.45 hotfix //EventYield4 = 0x0000, //EventYield8 = 0x0000, //EventYield16 = 0x0000, @@ -330,16 +330,16 @@ namespace Sapphire::Network::Packets CFDutyInfoHandler = 0x0078, // updated 4.2 - SocialReqSendHandler = 0x0387, // updated 5.35 hotfix - SocialResponseHandler = 0x028D, // updated 5.35 hotfix + SocialReqSendHandler = 0x0288, // updated 5.45 hotfix + SocialResponseHandler = 0x029B, // updated 5.45 hotfix CreateCrossWorldLS = 0x00AF, // updated 4.3 ChatHandler = 0x00A4, // updated 5.45 hotfix PartyChatHandler = 0x0065, - PartySetLeaderHandler = 0x0208, // updated 5.35 hotfix - LeavePartyHandler = 0x0337, // updated 5.35 hotfix - KickPartyMemberHandler = 0x014C, // updated 5.35 hotfix - DisbandPartyHandler = 0x0205, // updated 5.35 hotfix + PartySetLeaderHandler = 0x02EF, // updated 5.45 hotfix + LeavePartyHandler = 0x017E, // updated 5.45 hotfix + KickPartyMemberHandler = 0x0070, // updated 5.45 hotfix + DisbandPartyHandler = 0x037A, // updated 5.45 hotfix SocialListHandler = 0x02B0, // updated 5.45 hotfix SetSearchInfoHandler = 0x0111, // updated 5.45 hotfix @@ -395,7 +395,7 @@ namespace Sapphire::Network::Packets OutOfRangeEventHandler = 0x019B, // updated 5.45 hotfix EnterTeriEventHandler = 0x027F, // updated 5.45 hotfix ShopEventHandler = 0x01F6, // updated 5.35 hotfix - EventYieldHandler = 0x0128, // updated 5.35 hotfix + EventYieldHandler = 0x0230, // updated 5.45 hotfix ReturnEventHandler = 0x02AD, // updated 5.45 hotfix TradeReturnEventHandler = 0x00A7, // updated 5.45 hotfix TradeMultipleReturnEventHander = 0x035C, // updated 5.35 hotfix From 0ea81c094d90fd824cc4b6318475af1ba6393a04 Mon Sep 17 00:00:00 2001 From: collett Date: Fri, 19 Feb 2021 02:40:27 +0900 Subject: [PATCH 10/43] pickup correct PlayTime opcode --- src/common/Network/PacketDef/Ipcs.h | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/common/Network/PacketDef/Ipcs.h b/src/common/Network/PacketDef/Ipcs.h index 15d7429b..6beb9eeb 100644 --- a/src/common/Network/PacketDef/Ipcs.h +++ b/src/common/Network/PacketDef/Ipcs.h @@ -62,7 +62,7 @@ namespace Sapphire::Network::Packets /////////////////////////////////////////////////// ChatBanned = 0xF06B, - Playtime = 0x03A4, // updated 5.35 hotfix + Playtime = 0x0302, // updated 5.45 hotfix Logout = 0x012A, // updated 5.45 hotfix CFNotify = 0x026E, // updated 5.45 hotfix CFMemberStatus = 0x0079, From 39e898ad8f2f584a645ec4fc5735a30e367225bb Mon Sep 17 00:00:00 2001 From: Jeido Uran Date: Mon, 22 Feb 2021 20:25:37 +0100 Subject: [PATCH 11/43] manual opcodes update --- src/common/Network/PacketDef/Ipcs.h | 82 ++++++++++++++--------------- 1 file changed, 41 insertions(+), 41 deletions(-) diff --git a/src/common/Network/PacketDef/Ipcs.h b/src/common/Network/PacketDef/Ipcs.h index 6beb9eeb..9bff838d 100644 --- a/src/common/Network/PacketDef/Ipcs.h +++ b/src/common/Network/PacketDef/Ipcs.h @@ -66,13 +66,13 @@ namespace Sapphire::Network::Packets Logout = 0x012A, // updated 5.45 hotfix CFNotify = 0x026E, // updated 5.45 hotfix CFMemberStatus = 0x0079, - CFDutyInfo = 0xF193, // updated 5.35 hotfix + CFDutyInfo = 0x0145, // updated 5.45 hotfix CFPlayerInNeed = 0xF07F, CFPreferredRole = 0x012E, // updated 5.45 hotfix - CFCancel = 0x00EC, // updated 5.35 hotfix + CFCancel = 0x0312, // updated 5.45 hotfix SocialRequestError = 0xF0AD, - CFRegistered = 0x010C, // updated 5.35 hotfix + CFRegistered = 0x01FB, // updated 5.45 hotfix SocialRequestResponse = 0x03A5, // updated 5.45 hotfix SocialMessage = 0x030C, // updated 5.45 hotfix SocialMessage2 = 0x00BB, // updated 5.45 hotfix @@ -92,7 +92,7 @@ namespace Sapphire::Network::Packets InitSearchInfo = 0x01ED, // updated 5.45 hotfix ExamineSearchComment = 0x0102, // updated 4.1 - ServerNoticeShort = 0x017A, // updated 5.35 hotfix + ServerNoticeShort = 0x03B4, // updated 5.45 hotfix ServerNotice = 0x0354, // updated 5.45 hotfix SetOnlineStatus = 0x0166, // updated 5.45 hotfix @@ -131,9 +131,9 @@ namespace Sapphire::Network::Packets BossStatusEffectList = 0x0312, // added 5.1 Effect = 0x027F, // updated 5.45 hotfix AoeEffect8 = 0x009B, // updated 5.45 hotfix - AoeEffect16 = 0x01B9, // updated 5.35 hotfix - AoeEffect24 = 0x02B4, // updated 5.35 hotfix - AoeEffect32 = 0x00A4, // updated 5.35 hotfix + AoeEffect16 = 0x028C, // updated 5.45 hotfix + AoeEffect24 = 0x02AD, // updated 5.45 hotfix + AoeEffect32 = 0x00A7, // updated 5.45 hotfix PersistantEffect = 0x0244, // updated 5.45 hotfix GCAffiliation = 0x0155, // updated 5.45 hotfix @@ -153,7 +153,7 @@ namespace Sapphire::Network::Packets HateRank = 0x0217, // updated 5.45 hotfix HateList = 0x00E5, // updated 5.45 hotfix ObjectSpawn = 0x0336, // updated 5.45 hotfix - ObjectDespawn = 0x00C0, // updated 5.35 hotfix + ObjectDespawn = 0x02D0, // updated 5.45 hotfix UpdateClassInfo = 0x0179, // updated 5.45 hotfix SilentSetClassJob = 0xF18E, // updated 5.0 - seems to be the case, not sure if it's actually used for anything PlayerSetup = 0x01E9, // updated 5.45 hotfix @@ -165,7 +165,7 @@ namespace Sapphire::Network::Packets ModelEquip = 0x024A, // updated 5.45 hotfix Examine = 0x0261, // updated 5.45 hotfix - CharaNameReq = 0x008E, // updated 5.35 hotfix + CharaNameReq = 0x0380, // updated 5.45 hotfix // nb: see #565 on github UpdateRetainerItemSalePrice = 0xF19F, // updated 5.0 @@ -222,7 +222,7 @@ namespace Sapphire::Network::Packets Mount = 0x0122, // updated 5.45 hotfix - DirectorVars = 0x011D, // updated 5.35 hotfix + DirectorVars = 0x0252, // updated 5.45 hotfix SomeDirectorUnk1 = 0x0084, // updated 5.18 SomeDirectorUnk2 = 0xF0C1, // updated 5.18 SomeDirectorUnk4 = 0x0071, // updated 5.45 hotfix @@ -234,11 +234,11 @@ namespace Sapphire::Network::Packets CFAvailableContents = 0xF1FD, // updated 4.2 - WeatherChange = 0x027B, // updated 5.35 hotfix - PlayerTitleList = 0x0251, // updated 5.35 hotfix - Discovery = 0x031B, // updated 5.35 hotfix + WeatherChange = 0x0167, // updated 5.45 hotfix + PlayerTitleList = 0x00F3, // updated 5.45 hotfix + Discovery = 0x0247, // updated 5.45 hotfix - EorzeaTimeOffset = 0x01D4, // updated 5.35 hotfix + EorzeaTimeOffset = 0x00C5, // updated 5.45 hotfix EquipDisplayFlags = 0x0316, // updated 5.45 hotfix @@ -251,28 +251,28 @@ namespace Sapphire::Network::Packets /// Housing ////////////////////////////////////// LandSetInitialize = 0x03E2, // updated 5.45 hotfix - LandUpdate = 0x00BF, // updated 5.35 hotfix - YardObjectSpawn = 0x01CA, // updated 5.35 hotfix - HousingIndoorInitialize = 0x01FF, // updated 5.35 hotfix - LandPriceUpdate = 0x0380, // updated 5.35 hotfix + LandUpdate = 0x027E, // updated 5.45 hotfix + YardObjectSpawn = 0x010E, // updated 5.45 hotfix + HousingIndoorInitialize = 0x01A9, // updated 5.45 hotfix + LandPriceUpdate = 0x0379, // updated 5.45 hotfix LandInfoSign = 0x0398, // updated 5.45 hotfix - LandRename = 0x0140, // updated 5.35 hotfix - HousingEstateGreeting = 0x00C7, // updated 5.35 hotfix - HousingUpdateLandFlagsSlot = 0x027E, // updated 5.35 hotfix + LandRename = 0x00F6, // updated 5.45 hotfix + HousingEstateGreeting = 0x037D, // updated 5.45 hotfix + HousingUpdateLandFlagsSlot = 0x03AF, // updated 5.45 hotfix HousingLandFlags = 0x033B, // updated 5.45 hotfix - HousingShowEstateGuestAccess = 0x03B5, // updated 5.35 hotfix + HousingShowEstateGuestAccess = 0x01B3, // updated 5.45 hotfix HousingObjectInitialize = 0x00B5, // updated 5.45 hotfix - HousingInternalObjectSpawn = 0x0234, // updated 5.35 hotfix + HousingInternalObjectSpawn = 0x00BC, // updated 5.45 hotfix - HousingWardInfo = 0x02FD, // updated 5.35 hotfix - HousingObjectMove = 0x022C, // updated 5.35 hotfix + HousingWardInfo = 0x015E, // updated 5.45 hotfix + HousingObjectMove = 0x03E6, // updated 5.45 hotfix - SharedEstateSettingsResponse = 0x006A, // updated 5.35 hotfix + SharedEstateSettingsResponse = 0x03A4, // updated 5.45 hotfix - LandUpdateHouseName = 0x00B1, // updated 5.35 hotfix + LandUpdateHouseName = 0x0215, // updated 5.45 hotfix - LandSetMap = 0x0149, // updated 5.35 hotfix + LandSetMap = 0x00D2, // updated 5.45 hotfix ////////////////////////////////////////////////// @@ -322,11 +322,11 @@ namespace Sapphire::Network::Packets CFCommenceHandler = 0x0118, // updated 5.35 hotfix CFCancelHandler = 0x0332, // updated 5.35 hotfix - CFRegisterDuty = 0x0289, // updated 5.35 hotfix - CFRegisterRoulette = 0x0088, // updated 5.35 hotfix - PlayTimeHandler = 0x02A8, // updated 5.35 hotfix + CFRegisterDuty = 0x033C, // updated 5.45 hotfix + CFRegisterRoulette = 0x0121, // updated 5.45 hotfix + PlayTimeHandler = 0x0096, // updated 5.45 hotfix LogoutHandler = 0x0312, // updated 5.45 hotfix - CancelLogout = 0x03DB, // updated 5.35 hotfix + CancelLogout = 0x0307, // updated 5.45 hotfix CFDutyInfoHandler = 0x0078, // updated 4.2 @@ -384,17 +384,17 @@ namespace Sapphire::Network::Packets InventoryModifyHandler = 0x0110, // updated 5.45 hotfix - InventoryEquipRecommendedItems = 0x0116, // updated 5.35 hotfix + InventoryEquipRecommendedItems = 0x0186, // updated 5.45 hotfix - ReqPlaceHousingItem = 0x02AE, // updated 5.35 hotfix - BuildPresetHandler = 0x01C2, // updated 5.35 hotfix + ReqPlaceHousingItem = 0x0360, // updated 5.45 hotfix + BuildPresetHandler = 0x01D7, // updated 5.45 hotfix TalkEventHandler = 0x00C2, // updated 5.45 hotfix EmoteEventHandler = 0x03D5, // updated 5.45 hotfix WithinRangeEventHandler = 0x0171, // updated 5.45 hotfix OutOfRangeEventHandler = 0x019B, // updated 5.45 hotfix EnterTeriEventHandler = 0x027F, // updated 5.45 hotfix - ShopEventHandler = 0x01F6, // updated 5.35 hotfix + ShopEventHandler = 0x03D4, // updated 5.45 hotfix EventYieldHandler = 0x0230, // updated 5.45 hotfix ReturnEventHandler = 0x02AD, // updated 5.45 hotfix TradeReturnEventHandler = 0x00A7, // updated 5.45 hotfix @@ -405,12 +405,12 @@ namespace Sapphire::Network::Packets ReqEquipDisplayFlagsChange = 0x03B0, // updated 5.45 hotfix - LandRenameHandler = 0x0155, // updated 5.35 hotfix - HousingUpdateHouseGreeting = 0x02EA, // updated 5.35 hotfix - HousingUpdateObjectPosition = 0x00D5, // updated 5.35 hotfix - HousingEditExterior = 0x0098, // updated 5.35 hotfix + LandRenameHandler = 0x0187, // updated 5.45 hotfix + HousingUpdateHouseGreeting = 0x0367, // updated 5.45 hotfix + HousingUpdateObjectPosition = 0x0265, // updated 5.45 hotfix + HousingEditExterior = 0x0297, // updated 5.45 hotfix - SetSharedEstateSettings = 0x017B, // updated 5.0 + SetSharedEstateSettings = 0x0146, // updated 5.45 hotfix UpdatePositionInstance = 0x034E, // updated 5.45 hotfix From 2b8a25837e0ed92be518e8fedf14a9e630a94ed5 Mon Sep 17 00:00:00 2001 From: collett Date: Tue, 23 Feb 2021 05:20:06 +0900 Subject: [PATCH 12/43] a little bit more --- src/common/Network/PacketDef/Ipcs.h | 5 +++-- 1 file changed, 3 insertions(+), 2 deletions(-) diff --git a/src/common/Network/PacketDef/Ipcs.h b/src/common/Network/PacketDef/Ipcs.h index 9bff838d..bf6aa15f 100644 --- a/src/common/Network/PacketDef/Ipcs.h +++ b/src/common/Network/PacketDef/Ipcs.h @@ -272,7 +272,7 @@ namespace Sapphire::Network::Packets LandUpdateHouseName = 0x0215, // updated 5.45 hotfix - LandSetMap = 0x00D2, // updated 5.45 hotfix + LandSetMap = 0x0103, // updated 5.45 hotfix ////////////////////////////////////////////////// @@ -281,6 +281,7 @@ namespace Sapphire::Network::Packets PrepareZoning = 0x01EE, // updated 5.45 hotfix ActorGauge = 0x018E, // updated 5.45 hotfix + DutyGauge = 0x00D2, // updated 5.45 hotfix // daily quest info -> without them sent, login will take longer... DailyQuests = 0x02C4, // updated 5.45 hotfix @@ -378,7 +379,7 @@ namespace Sapphire::Network::Packets SkillHandler = 0x0388, // updated 5.45 hotfix GMCommand1 = 0x01E0, // updated 5.45 hotfix GMCommand2 = 0x0114, // updated 5.45 hotfix - AoESkillHandler = 0x030C, // updated 5.35 hotfix + AoESkillHandler = 0x03A0, // updated 5.45 hotfix UpdatePositionHandler = 0x031A, // updated 5.45 hotfix From 627cf93b4c54f958eb60eb708e8ad051d92a22bc Mon Sep 17 00:00:00 2001 From: collett Date: Thu, 25 Feb 2021 21:28:58 +0900 Subject: [PATCH 13/43] fix performing --- src/common/Common.h | 1 + src/common/Network/PacketDef/Ipcs.h | 4 ++-- .../Network/PacketDef/Zone/ServerZoneDef.h | 2 +- .../Network/Handlers/ClientTriggerHandler.cpp | 17 ++++++++++++++++- src/world/Network/Handlers/PacketHandlers.cpp | 2 +- 5 files changed, 21 insertions(+), 5 deletions(-) diff --git a/src/common/Common.h b/src/common/Common.h index a2e9f834..3a951027 100644 --- a/src/common/Common.h +++ b/src/common/Common.h @@ -756,6 +756,7 @@ namespace Sapphire::Common BetweenAreas = 24, BoundByDuty = 28, + Performing = 40, WatchingCutscene = 50, // this is actually just a dummy, this id is different diff --git a/src/common/Network/PacketDef/Ipcs.h b/src/common/Network/PacketDef/Ipcs.h index bf6aa15f..3bc671e5 100644 --- a/src/common/Network/PacketDef/Ipcs.h +++ b/src/common/Network/PacketDef/Ipcs.h @@ -277,7 +277,7 @@ namespace Sapphire::Network::Packets ////////////////////////////////////////////////// DuelChallenge = 0x0277, // 4.2; this is responsible for opening the ui - PerformNote = 0x0286, // updated 4.3 + PerformNote = 0x0248, // updated 5.45 hotfix PrepareZoning = 0x01EE, // updated 5.45 hotfix ActorGauge = 0x018E, // updated 5.45 hotfix @@ -415,7 +415,7 @@ namespace Sapphire::Network::Packets UpdatePositionInstance = 0x034E, // updated 5.45 hotfix - PerformNoteHandler = 0x029B, // updated 4.3 + PerformNoteHandler = 0x0336, // updated 5.45 hotfix WorldInteractionHandler = 0x02E4, // updated 5.45 hotfix Dive = 0x00F1, // updated 5.45 hotfix diff --git a/src/common/Network/PacketDef/Zone/ServerZoneDef.h b/src/common/Network/PacketDef/Zone/ServerZoneDef.h index ccf2324f..74126f05 100644 --- a/src/common/Network/PacketDef/Zone/ServerZoneDef.h +++ b/src/common/Network/PacketDef/Zone/ServerZoneDef.h @@ -1851,7 +1851,7 @@ namespace Sapphire::Network::Packets::Server struct FFXIVIpcPerformNote : FFXIVIpcBasePacket< PerformNote > { - uint8_t data[32]; + uint8_t data[16]; }; struct FFXIVIpcHousingUpdateLandFlagsSlot : FFXIVIpcBasePacket< HousingUpdateLandFlagsSlot > diff --git a/src/world/Network/Handlers/ClientTriggerHandler.cpp b/src/world/Network/Handlers/ClientTriggerHandler.cpp index 3e1bb620..3cd9517d 100644 --- a/src/world/Network/Handlers/ClientTriggerHandler.cpp +++ b/src/world/Network/Handlers/ClientTriggerHandler.cpp @@ -494,7 +494,22 @@ void Sapphire::Network::GameConnection::clientTriggerHandler( const Packets::FFX player.sendDebug( "event battle p1: {0}, p11: {1}, p12: {2}, p2: {3}, p3: {4}, p4: {5}, p5: {6}", param1, param11, param12, param2, param3, param4, param5 ); break; } - + case ClientTriggerType::OpenPerformInstrumentUI: + { + //param11 = instrument, 0 = end + player.sendDebug( "perform: {}", param11 ); + if( param11 == 0 ) + { + player.sendToInRangeSet( makeActorControl( player.getId(), ActorControl::SetStatus, 1, 0, 0, 0 ), true ); + player.unsetStateFlag( PlayerStateFlag::Performing ); + } + else + { + player.sendToInRangeSet( makeActorControl( player.getId(), ActorControl::SetStatus, 16, param11, 0, 0 ), true ); + player.setStateFlag( PlayerStateFlag::Performing ); + } + break; + } default: { Logger::debug( "[{0}] Unhandled action: {1:04X}", m_pSession->getId(), commandId ); diff --git a/src/world/Network/Handlers/PacketHandlers.cpp b/src/world/Network/Handlers/PacketHandlers.cpp index 35fd8b10..db311736 100644 --- a/src/world/Network/Handlers/PacketHandlers.cpp +++ b/src/world/Network/Handlers/PacketHandlers.cpp @@ -607,7 +607,7 @@ void Sapphire::Network::GameConnection::performNoteHandler( const Packets::FFXIV Entity::Player& player ) { auto performPacket = makeZonePacket< FFXIVIpcPerformNote >( player.getId() ); - memcpy( &performPacket->data().data[ 0 ], &inPacket.data[ 0x10 ], 32 ); + memcpy( &performPacket->data().data[ 0 ], &inPacket.data[ 0x10 ], 16 ); player.sendToInRangeSet( performPacket ); } From 301bd611801c37a6c17b744d77bde3b997eb9dd9 Mon Sep 17 00:00:00 2001 From: collett Date: Tue, 27 Jul 2021 07:33:55 +0900 Subject: [PATCH 14/43] update to 5.55 hotfix Co-authored-by: Jeido Uran --- src/common/Common.h | 12 +- src/common/CommonGen.h | 31 +- src/common/Exd/ExdDataGenerated.cpp | 990 +++++++++++------- src/common/Exd/ExdDataGenerated.h | 526 +++++++--- src/common/Network/PacketDef/Ipcs.h | 375 ++++--- .../Network/PacketDef/Zone/ClientZoneDef.h | 2 +- .../Network/PacketDef/Zone/ServerZoneDef.h | 40 +- .../quest/subquest/gridania/SubFst041.cpp | 2 +- src/world/Actor/Player.cpp | 2 +- src/world/Actor/Player.h | 10 +- src/world/Actor/PlayerSql.cpp | 3 + src/world/Manager/DebugCommandMgr.cpp | 22 +- src/world/Network/GameConnection.cpp | 8 +- .../PacketWrappers/PlayerSetupPacket.h | 2 +- 14 files changed, 1269 insertions(+), 756 deletions(-) diff --git a/src/common/Common.h b/src/common/Common.h index 3a951027..4e154989 100644 --- a/src/common/Common.h +++ b/src/common/Common.h @@ -25,7 +25,7 @@ namespace Sapphire::Common const uint8_t CURRENT_EXPANSION_ID = 3; const uint8_t CLASSJOB_TOTAL = 38; - const uint8_t CLASSJOB_SLOTS = 28; + const uint8_t CLASSJOB_SLOTS = 30; const uint8_t TOWN_COUNT = 6; @@ -51,11 +51,11 @@ namespace Sapphire::Common enum InventoryOperation : uint16_t { - Discard = 0x0117, - Move = 0x0118, - Swap = 0x0119, - Split = 0x011A, - Merge = 0x011C, + Discard = 0x01DE, + Move = 0x01DF, + Swap = 0x01E0, + Split = 0x01E1, + Merge = 0x01E3, }; enum ClientLanguage : uint8_t diff --git a/src/common/CommonGen.h b/src/common/CommonGen.h index 4833e57a..a0777232 100644 --- a/src/common/CommonGen.h +++ b/src/common/CommonGen.h @@ -204,6 +204,7 @@ enum class ContentType : uint8_t WondrousTails = 24, CustomDeliveries = 25, Eureka = 26, + UltimateRaids = 28, }; /////////////////////////////////////////////////////////// @@ -672,14 +673,14 @@ enum class Weather : uint8_t Moonlight1 = 98, Moonlight2 = 99, Moonlight3 = 100, - FairSkies10 = 101, + RedMoon = 101, Scarlet = 102, Scarlet1 = 103, Scarlet2 = 104, - FairSkies11 = 105, - FairSkies12 = 106, - FairSkies13 = 107, - FairSkies14 = 108, + FairSkies10 = 105, + FairSkies11 = 106, + FairSkies12 = 107, + FairSkies13 = 108, Flames = 109, Tsunamis = 110, Cyclones = 111, @@ -701,7 +702,23 @@ enum class Weather : uint8_t Termination2 = 127, Termination3 = 128, EverlastingLight1 = 129, + Eruptions1 = 130, Termination4 = 131, + FairSkies14 = 132, + UmbralFlare = 133, + UmbralDuststorm = 134, + UmbralLevin = 135, + UmbralTempest = 136, + Starshower = 137, + Delirium = 138, + Clouds2 = 139, + Clouds3 = 140, + Irradiance1 = 141, + Irradiance2 = 142, + StormClouds1 = 143, + Firestorm = 144, + SpectralCurrent = 145, + Climactic = 147, }; /////////////////////////////////////////////////////////// @@ -728,6 +745,10 @@ enum class HousingAppeal : uint8_t Bathhouse = 18, Garden = 19, FarEastern = 20, + VisitorsWelcome = 21, + Bakery = 22, + UnderRenovation = 23, + ConcertHall = 24, }; } diff --git a/src/common/Exd/ExdDataGenerated.cpp b/src/common/Exd/ExdDataGenerated.cpp index ca3d835a..4f04717e 100644 --- a/src/common/Exd/ExdDataGenerated.cpp +++ b/src/common/Exd/ExdDataGenerated.cpp @@ -7,22 +7,23 @@ Sapphire::Data::Achievement::Achievement( uint32_t row_id, Sapphire::Data::ExdDa achievementCategory = exdData->getField< uint8_t >( row, 0 ); name = exdData->getField< std::string >( row, 1 ); description = exdData->getField< std::string >( row, 2 ); - points = exdData->getField< uint8_t >( row, 3 ); - title = exdData->getField< uint16_t >( row, 4 ); - item = exdData->getField< uint32_t >( row, 5 ); - icon = exdData->getField< uint16_t >( row, 6 ); - type = exdData->getField< uint8_t >( row, 8 ); - key = exdData->getField< int32_t >( row, 9 ); - data.push_back( exdData->getField< int32_t >( row, 10 ) ); - data.push_back( exdData->getField< int32_t >( row, 11 ) ); - data.push_back( exdData->getField< int32_t >( row, 12 ) ); - data.push_back( exdData->getField< int32_t >( row, 13 ) ); - data.push_back( exdData->getField< int32_t >( row, 14 ) ); + achievementTarget = exdData->getField< uint8_t >( row, 3 ); + points = exdData->getField< uint8_t >( row, 5 ); + title = exdData->getField< uint16_t >( row, 6 ); + item = exdData->getField< uint32_t >( row, 7 ); + icon = exdData->getField< uint16_t >( row, 11 ); + type = exdData->getField< uint8_t >( row, 13 ); + key = exdData->getField< int32_t >( row, 14 ); data.push_back( exdData->getField< int32_t >( row, 15 ) ); 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 ); - achievementHideCondition = exdData->getField< uint8_t >( row, 20 ); + data.push_back( exdData->getField< int32_t >( row, 18 ) ); + data.push_back( exdData->getField< int32_t >( row, 19 ) ); + data.push_back( exdData->getField< int32_t >( row, 20 ) ); + data.push_back( exdData->getField< int32_t >( row, 21 ) ); + data.push_back( exdData->getField< int32_t >( row, 22 ) ); + order = exdData->getField< uint16_t >( row, 23 ); + achievementHideCondition = exdData->getField< uint8_t >( row, 24 ); } Sapphire::Data::AchievementCategory::AchievementCategory( uint32_t row_id, Sapphire::Data::ExdDataGenerated* exdData ) @@ -50,6 +51,13 @@ Sapphire::Data::AchievementKind::AchievementKind( uint32_t row_id, Sapphire::Dat order = exdData->getField< uint8_t >( row, 1 ); } +Sapphire::Data::AchievementTarget::AchievementTarget( uint32_t row_id, Sapphire::Data::ExdDataGenerated* exdData ) +{ + auto row = exdData->m_AchievementTargetDat.get_row( row_id ); + type = exdData->getField< uint8_t >( row, 0 ); + value = exdData->getField< uint32_t >( row, 1 ); +} + Sapphire::Data::Action::Action( uint32_t row_id, Sapphire::Data::ExdDataGenerated* exdData ) { auto row = exdData->m_ActionDat.get_row( row_id ); @@ -83,6 +91,7 @@ Sapphire::Data::Action::Action( uint32_t row_id, Sapphire::Data::ExdDataGenerate cast100ms = exdData->getField< uint16_t >( row, 37 ); recast100ms = exdData->getField< uint16_t >( row, 38 ); cooldownGroup = exdData->getField< uint8_t >( row, 39 ); + additionalCooldownGroup = exdData->getField< uint8_t >( row, 40 ); maxCharges = exdData->getField< uint8_t >( row, 41 ); attackType = exdData->getField< int8_t >( row, 42 ); aspect = exdData->getField< uint8_t >( row, 43 ); @@ -129,6 +138,8 @@ Sapphire::Data::ActionIndirection::ActionIndirection( uint32_t row_id, Sapphire: { auto row = exdData->m_ActionIndirectionDat.get_row( row_id ); name = exdData->getField< int32_t >( row, 0 ); + classJob = exdData->getField< int8_t >( row, 1 ); + previousComboAction = exdData->getField< int32_t >( row, 2 ); } Sapphire::Data::ActionParam::ActionParam( uint32_t row_id, Sapphire::Data::ExdDataGenerated* exdData ) @@ -307,6 +318,7 @@ Sapphire::Data::Aetheryte::Aetheryte( uint32_t row_id, Sapphire::Data::ExdDataGe level.push_back( exdData->getField< uint32_t >( row, 14 ) ); isAetheryte = exdData->getField< bool >( row, 15 ); aethernetGroup = exdData->getField< uint8_t >( row, 17 ); + invisible = exdData->getField< bool >( row, 18 ); requiredQuest = exdData->getField< uint32_t >( row, 19 ); map = exdData->getField< uint16_t >( row, 20 ); aetherstreamX = exdData->getField< int16_t >( row, 21 ); @@ -474,6 +486,7 @@ Sapphire::Data::AozAction::AozAction( uint32_t row_id, Sapphire::Data::ExdDataGe { auto row = exdData->m_AozActionDat.get_row( row_id ); action = exdData->getField< uint32_t >( row, 0 ); + rank = exdData->getField< uint8_t >( row, 1 ); } Sapphire::Data::AozActionTransient::AozActionTransient( uint32_t row_id, Sapphire::Data::ExdDataGenerated* exdData ) @@ -566,6 +579,22 @@ Sapphire::Data::AOZContentBriefingBNpc::AOZContentBriefingBNpc( uint32_t row_id, flatOrDeathVuln = exdData->getField< bool >( row, 24 ); } +Sapphire::Data::AOZReport::AOZReport( uint32_t row_id, Sapphire::Data::ExdDataGenerated* exdData ) +{ + auto row = exdData->m_AOZReportDat.get_row( row_id ); + reward = exdData->getField< uint8_t >( row, 1 ); + order = exdData->getField< int8_t >( row, 2 ); +} + +Sapphire::Data::AOZScore::AOZScore( uint32_t row_id, Sapphire::Data::ExdDataGenerated* exdData ) +{ + auto row = exdData->m_AOZScoreDat.get_row( row_id ); + isHidden = exdData->getField< bool >( row, 0 ); + score = exdData->getField< int32_t >( row, 1 ); + name = exdData->getField< std::string >( row, 2 ); + description = exdData->getField< std::string >( row, 3 ); +} + Sapphire::Data::AquariumFish::AquariumFish( uint32_t row_id, Sapphire::Data::ExdDataGenerated* exdData ) { auto row = exdData->m_AquariumFishDat.get_row( row_id ); @@ -1219,7 +1248,6 @@ Sapphire::Data::Channeling::Channeling( uint32_t row_id, Sapphire::Data::ExdData auto row = exdData->m_ChannelingDat.get_row( row_id ); file = exdData->getField< std::string >( row, 0 ); widthScale = exdData->getField< uint8_t >( row, 1 ); - addedIn53 = exdData->getField< bool >( row, 2 ); } Sapphire::Data::CharaMakeClassEquip::CharaMakeClassEquip( uint32_t row_id, Sapphire::Data::ExdDataGenerated* exdData ) @@ -1633,6 +1661,7 @@ Sapphire::Data::ClassJob::ClassJob( uint32_t row_id, Sapphire::Data::ExdDataGene modifierIntelligence = exdData->getField< uint16_t >( row, 14 ); modifierMind = exdData->getField< uint16_t >( row, 15 ); modifierPiety = exdData->getField< uint16_t >( row, 16 ); + pvPActionSortRow = exdData->getField< uint8_t >( row, 24 ); classJobParent = exdData->getField< uint8_t >( row, 26 ); nameEnglish = exdData->getField< std::string >( row, 27 ); itemStartingWeapon = exdData->getField< int32_t >( row, 28 ); @@ -1704,6 +1733,7 @@ Sapphire::Data::CollectablesShop::CollectablesShop( uint32_t row_id, Sapphire::D auto row = exdData->m_CollectablesShopDat.get_row( row_id ); name = exdData->getField< std::string >( row, 0 ); quest = exdData->getField< uint32_t >( row, 1 ); + rewardType = exdData->getField< uint8_t >( row, 2 ); shopItems.push_back( exdData->getField< uint16_t >( row, 3 ) ); shopItems.push_back( exdData->getField< uint16_t >( row, 4 ) ); shopItems.push_back( exdData->getField< uint16_t >( row, 5 ) ); @@ -1724,6 +1754,8 @@ Sapphire::Data::CollectablesShopItem::CollectablesShopItem( uint32_t row_id, uin collectablesShopItemGroup = exdData->getField< uint8_t >( row, 1 ); levelMin = exdData->getField< uint16_t >( row, 2 ); levelMax = exdData->getField< uint16_t >( row, 3 ); + stars = exdData->getField< uint8_t >( row, 4 ); + key = exdData->getField< uint8_t >( row, 5 ); collectablesShopRefine = exdData->getField< uint16_t >( row, 6 ); collectablesShopRewardScrip = exdData->getField< uint16_t >( row, 7 ); } @@ -1746,6 +1778,9 @@ Sapphire::Data::CollectablesShopRewardItem::CollectablesShopRewardItem( uint32_t { auto row = exdData->m_CollectablesShopRewardItemDat.get_row( row_id ); item = exdData->getField< uint32_t >( row, 0 ); + rewardLow = exdData->getField< uint8_t >( row, 2 ); + rewardMid = exdData->getField< uint8_t >( row, 3 ); + rewardHigh = exdData->getField< uint8_t >( row, 4 ); } Sapphire::Data::CollectablesShopRewardScrip::CollectablesShopRewardScrip( uint32_t row_id, Sapphire::Data::ExdDataGenerated* exdData ) @@ -2016,6 +2051,16 @@ Sapphire::Data::CompleteJournalCategory::CompleteJournalCategory( uint32_t row_i lastQuest = exdData->getField< uint32_t >( row, 1 ); } +Sapphire::Data::Completion::Completion( uint32_t row_id, Sapphire::Data::ExdDataGenerated* exdData ) +{ + auto row = exdData->m_CompletionDat.get_row( row_id ); + group = exdData->getField< uint16_t >( row, 0 ); + key = exdData->getField< uint16_t >( row, 1 ); + lookupTable = exdData->getField< std::string >( row, 2 ); + text = exdData->getField< std::string >( row, 3 ); + groupTitle = exdData->getField< std::string >( row, 4 ); +} + Sapphire::Data::Condition::Condition( uint32_t row_id, Sapphire::Data::ExdDataGenerated* exdData ) { auto row = exdData->m_ConditionDat.get_row( row_id ); @@ -2062,31 +2107,30 @@ Sapphire::Data::ContentFinderCondition::ContentFinderCondition( uint32_t row_id, classJobLevelSync = exdData->getField< uint8_t >( row, 16 ); itemLevelRequired = exdData->getField< uint16_t >( row, 17 ); itemLevelSync = exdData->getField< uint16_t >( row, 18 ); - addedIn53 = exdData->getField< bool >( row, 19 ); allowUndersized = exdData->getField< bool >( row, 20 ); allowReplacement = exdData->getField< bool >( row, 21 ); allowExplorerMode = exdData->getField< bool >( row, 23 ); - unknown54 = exdData->getField< bool >( row, 25 ); highEndDuty = exdData->getField< bool >( row, 28 ); dutyRecorderAllowed = exdData->getField< bool >( row, 32 ); name = exdData->getField< std::string >( row, 37 ); - contentType = exdData->getField< uint8_t >( row, 38 ); - transientKey = exdData->getField< uint8_t >( row, 39 ); - transient = exdData->getField< uint32_t >( row, 40 ); - sortKey = exdData->getField< uint16_t >( row, 41 ); - image = exdData->getField< uint32_t >( row, 42 ); - icon = exdData->getField< uint32_t >( row, 43 ); - levelingRoulette = exdData->getField< bool >( row, 45 ); - level506070Roulette = exdData->getField< bool >( row, 46 ); - mSQRoulette = exdData->getField< bool >( row, 47 ); - guildHestRoulette = exdData->getField< bool >( row, 48 ); - expertRoulette = exdData->getField< bool >( row, 49 ); - trialRoulette = exdData->getField< bool >( row, 50 ); - dailyFrontlineChallenge = exdData->getField< bool >( row, 51 ); - level80Roulette = exdData->getField< bool >( row, 52 ); - mentorRoulette = exdData->getField< bool >( row, 53 ); - allianceRoulette = exdData->getField< bool >( row, 59 ); - normalRaidRoulette = exdData->getField< bool >( row, 61 ); + nameShort = exdData->getField< std::string >( row, 38 ); + contentType = exdData->getField< uint8_t >( row, 39 ); + transientKey = exdData->getField< uint8_t >( row, 40 ); + transient = exdData->getField< uint32_t >( row, 41 ); + sortKey = exdData->getField< uint16_t >( row, 42 ); + image = exdData->getField< uint32_t >( row, 43 ); + icon = exdData->getField< uint32_t >( row, 44 ); + levelingRoulette = exdData->getField< bool >( row, 46 ); + level506070Roulette = exdData->getField< bool >( row, 48 ); + mSQRoulette = exdData->getField< bool >( row, 49 ); + guildHestRoulette = exdData->getField< bool >( row, 50 ); + expertRoulette = exdData->getField< bool >( row, 51 ); + trialRoulette = exdData->getField< bool >( row, 52 ); + dailyFrontlineChallenge = exdData->getField< bool >( row, 53 ); + level80Roulette = exdData->getField< bool >( row, 54 ); + mentorRoulette = exdData->getField< bool >( row, 55 ); + allianceRoulette = exdData->getField< bool >( row, 61 ); + normalRaidRoulette = exdData->getField< bool >( row, 63 ); } Sapphire::Data::ContentFinderConditionTransient::ContentFinderConditionTransient( uint32_t row_id, Sapphire::Data::ExdDataGenerated* exdData ) @@ -2118,7 +2162,6 @@ Sapphire::Data::ContentMemberType::ContentMemberType( uint32_t row_id, Sapphire: healersPerParty = exdData->getField< uint8_t >( row, 10 ); meleesPerParty = exdData->getField< uint8_t >( row, 11 ); rangedPerParty = exdData->getField< uint8_t >( row, 12 ); - unknown54 = exdData->getField< uint8_t >( row, 13 ); } Sapphire::Data::ContentNpcTalk::ContentNpcTalk( uint32_t row_id, Sapphire::Data::ExdDataGenerated* exdData ) @@ -2280,6 +2323,17 @@ Sapphire::Data::CraftLevelDifference::CraftLevelDifference( uint32_t row_id, Sap qualityFactor = exdData->getField< int16_t >( row, 2 ); } +Sapphire::Data::CraftLeveTalk::CraftLeveTalk( uint32_t row_id, Sapphire::Data::ExdDataGenerated* exdData ) +{ + auto row = exdData->m_CraftLeveTalkDat.get_row( row_id ); + talk.push_back( exdData->getField< std::string >( row, 36 ) ); + talk.push_back( exdData->getField< std::string >( row, 37 ) ); + talk.push_back( exdData->getField< std::string >( row, 38 ) ); + talk.push_back( exdData->getField< std::string >( row, 39 ) ); + talk.push_back( exdData->getField< std::string >( row, 40 ) ); + talk.push_back( exdData->getField< std::string >( row, 41 ) ); +} + Sapphire::Data::CraftType::CraftType( uint32_t row_id, Sapphire::Data::ExdDataGenerated* exdData ) { auto row = exdData->m_CraftTypeDat.get_row( row_id ); @@ -2306,8 +2360,7 @@ Sapphire::Data::Credit::Credit( uint32_t row_id, uint32_t subRow, Sapphire::Data Sapphire::Data::CreditBackImage::CreditBackImage( uint32_t row_id, uint32_t subRow, Sapphire::Data::ExdDataGenerated* exdData ) { auto row = exdData->m_CreditBackImageDat.get_row( row_id, subRow ); - unknown54 = exdData->getField< bool >( row, 2 ); - backImage = exdData->getField< uint32_t >( row, 3 ); + backImage = exdData->getField< uint32_t >( row, 5 ); } Sapphire::Data::CreditCast::CreditCast( uint32_t row_id, Sapphire::Data::ExdDataGenerated* exdData ) @@ -2397,15 +2450,9 @@ Sapphire::Data::CustomTalk::CustomTalk( uint32_t row_id, Sapphire::Data::ExdData scriptArg.push_back( exdData->getField< uint32_t >( row, 60 ) ); scriptArg.push_back( exdData->getField< uint32_t >( row, 61 ) ); scriptArg.push_back( exdData->getField< uint32_t >( row, 62 ) ); - text = exdData->getField< bool >( row, 66 ); - unknown54 = exdData->getField< bool >( row, 77 ); -} - -Sapphire::Data::CustomTalkDynamicIcon::CustomTalkDynamicIcon( uint32_t row_id, uint32_t subRow, Sapphire::Data::ExdDataGenerated* exdData ) -{ - auto row = exdData->m_CustomTalkDynamicIconDat.get_row( row_id, subRow ); - smallIcon = exdData->getField< uint32_t >( row, 0 ); - largeIcon = exdData->getField< uint32_t >( row, 1 ); + mainOption = exdData->getField< std::string >( row, 64 ); + subOption = exdData->getField< std::string >( row, 65 ); + specialLinks = exdData->getField< uint32_t >( row, 75 ); } Sapphire::Data::CustomTalkNestHandlers::CustomTalkNestHandlers( uint32_t row_id, uint32_t subRow, Sapphire::Data::ExdDataGenerated* exdData ) @@ -2420,6 +2467,12 @@ Sapphire::Data::Cutscene::Cutscene( uint32_t row_id, Sapphire::Data::ExdDataGene path = exdData->getField< std::string >( row, 0 ); } +Sapphire::Data::CutSceneIncompQuest::CutSceneIncompQuest( uint32_t row_id, uint32_t subRow, Sapphire::Data::ExdDataGenerated* exdData ) +{ + auto row = exdData->m_CutSceneIncompQuestDat.get_row( row_id, subRow ); + quest = exdData->getField< uint32_t >( row, 0 ); +} + Sapphire::Data::CutsceneMotion::CutsceneMotion( uint32_t row_id, Sapphire::Data::ExdDataGenerated* exdData ) { auto row = exdData->m_CutsceneMotionDat.get_row( row_id ); @@ -2686,25 +2739,7 @@ Sapphire::Data::Description::Description( uint32_t row_id, Sapphire::Data::ExdDa Sapphire::Data::DescriptionPage::DescriptionPage( uint32_t row_id, uint32_t subRow, Sapphire::Data::ExdDataGenerated* exdData ) { auto row = exdData->m_DescriptionPageDat.get_row( row_id, subRow ); - quest = exdData->getField< uint32_t >( row, 0 ); - text1 = exdData->getField< uint16_t >( row, 1 ); - image1 = exdData->getField< uint32_t >( row, 2 ); - text2 = exdData->getField< uint16_t >( row, 3 ); - image2 = exdData->getField< uint32_t >( row, 4 ); - text3 = exdData->getField< uint16_t >( row, 5 ); - image3 = exdData->getField< uint32_t >( row, 6 ); - text4 = exdData->getField< uint16_t >( row, 7 ); - image4 = exdData->getField< uint32_t >( row, 8 ); - text5 = exdData->getField< uint16_t >( row, 9 ); - image5 = exdData->getField< uint32_t >( row, 10 ); - text6 = exdData->getField< uint16_t >( row, 11 ); - image6 = exdData->getField< uint32_t >( row, 12 ); - text7 = exdData->getField< uint16_t >( row, 13 ); - image7 = exdData->getField< uint32_t >( row, 14 ); - text8 = exdData->getField< uint16_t >( row, 15 ); - image8 = exdData->getField< uint32_t >( row, 16 ); - text9 = exdData->getField< uint16_t >( row, 17 ); - image9 = exdData->getField< uint32_t >( row, 18 ); + quest = exdData->getField< uint32_t >( row, 1 ); } Sapphire::Data::DescriptionSection::DescriptionSection( uint32_t row_id, uint32_t subRow, Sapphire::Data::ExdDataGenerated* exdData ) @@ -2983,11 +3018,8 @@ Sapphire::Data::ENpcDressUp::ENpcDressUp( uint32_t row_id, Sapphire::Data::ExdDa Sapphire::Data::ENpcDressUpDress::ENpcDressUpDress( uint32_t row_id, uint32_t subRow, Sapphire::Data::ExdDataGenerated* exdData ) { auto row = exdData->m_ENpcDressUpDressDat.get_row( row_id, subRow ); - addedIn530 = exdData->getField< bool >( row, 5 ); eNpc = exdData->getField< uint32_t >( row, 7 ); - addedIn531 = exdData->getField< uint16_t >( row, 8 ); behavior = exdData->getField< uint16_t >( row, 9 ); - addedIn532 = exdData->getField< uint8_t >( row, 36 ); modelMainHand = exdData->getField< uint64_t >( row, 37 ); dyeMainHand = exdData->getField< uint8_t >( row, 38 ); modelOffHand = exdData->getField< uint64_t >( row, 39 ); @@ -3145,6 +3177,61 @@ Sapphire::Data::EventAction::EventAction( uint32_t row_id, Sapphire::Data::ExdDa animation.push_back( exdData->getField< uint16_t >( row, 5 ) ); } +Sapphire::Data::EventCustomIconType::EventCustomIconType( uint32_t row_id, Sapphire::Data::ExdDataGenerated* exdData ) +{ + auto row = exdData->m_EventCustomIconTypeDat.get_row( row_id ); + announceQuest.push_back( exdData->getField< uint32_t >( row, 0 ) ); + announceQuest.push_back( exdData->getField< uint32_t >( row, 1 ) ); + announceQuest.push_back( exdData->getField< uint32_t >( row, 2 ) ); + announceQuest.push_back( exdData->getField< uint32_t >( row, 3 ) ); + announceQuest.push_back( exdData->getField< uint32_t >( row, 4 ) ); + announceQuest.push_back( exdData->getField< uint32_t >( row, 5 ) ); + announceQuest.push_back( exdData->getField< uint32_t >( row, 6 ) ); + announceQuest.push_back( exdData->getField< uint32_t >( row, 7 ) ); + announceQuest.push_back( exdData->getField< uint32_t >( row, 8 ) ); + announceQuest.push_back( exdData->getField< uint32_t >( row, 9 ) ); + announceQuestLocked.push_back( exdData->getField< uint32_t >( row, 10 ) ); + announceQuestLocked.push_back( exdData->getField< uint32_t >( row, 11 ) ); + announceQuestLocked.push_back( exdData->getField< uint32_t >( row, 12 ) ); + announceQuestLocked.push_back( exdData->getField< uint32_t >( row, 13 ) ); + announceQuestLocked.push_back( exdData->getField< uint32_t >( row, 14 ) ); + announceQuestLocked.push_back( exdData->getField< uint32_t >( row, 15 ) ); + announceQuestLocked.push_back( exdData->getField< uint32_t >( row, 16 ) ); + announceQuestLocked.push_back( exdData->getField< uint32_t >( row, 17 ) ); + announceQuestLocked.push_back( exdData->getField< uint32_t >( row, 18 ) ); + announceQuestLocked.push_back( exdData->getField< uint32_t >( row, 19 ) ); + mapAnnounceQuest0.push_back( exdData->getField< uint32_t >( row, 20 ) ); + mapAnnounceQuest0.push_back( exdData->getField< uint32_t >( row, 21 ) ); + mapAnnounceQuest0.push_back( exdData->getField< uint32_t >( row, 22 ) ); + mapAnnounceQuest0.push_back( exdData->getField< uint32_t >( row, 23 ) ); + mapAnnounceQuest0.push_back( exdData->getField< uint32_t >( row, 24 ) ); + mapAnnounceQuest0.push_back( exdData->getField< uint32_t >( row, 25 ) ); + mapAnnounceQuest0.push_back( exdData->getField< uint32_t >( row, 26 ) ); + mapAnnounceQuest0.push_back( exdData->getField< uint32_t >( row, 27 ) ); + mapAnnounceQuest0.push_back( exdData->getField< uint32_t >( row, 28 ) ); + mapAnnounceQuest0.push_back( exdData->getField< uint32_t >( row, 29 ) ); + mapAnnounceQuestLocked.push_back( exdData->getField< uint32_t >( row, 30 ) ); + mapAnnounceQuestLocked.push_back( exdData->getField< uint32_t >( row, 31 ) ); + mapAnnounceQuestLocked.push_back( exdData->getField< uint32_t >( row, 32 ) ); + mapAnnounceQuestLocked.push_back( exdData->getField< uint32_t >( row, 33 ) ); + mapAnnounceQuestLocked.push_back( exdData->getField< uint32_t >( row, 34 ) ); + mapAnnounceQuestLocked.push_back( exdData->getField< uint32_t >( row, 35 ) ); + mapAnnounceQuestLocked.push_back( exdData->getField< uint32_t >( row, 36 ) ); + mapAnnounceQuestLocked.push_back( exdData->getField< uint32_t >( row, 37 ) ); + mapAnnounceQuestLocked.push_back( exdData->getField< uint32_t >( row, 38 ) ); + mapAnnounceQuestLocked.push_back( exdData->getField< uint32_t >( row, 39 ) ); + mapAnnounceQuest1.push_back( exdData->getField< uint32_t >( row, 40 ) ); + mapAnnounceQuest1.push_back( exdData->getField< uint32_t >( row, 41 ) ); + mapAnnounceQuest1.push_back( exdData->getField< uint32_t >( row, 42 ) ); + mapAnnounceQuest1.push_back( exdData->getField< uint32_t >( row, 43 ) ); + mapAnnounceQuest1.push_back( exdData->getField< uint32_t >( row, 44 ) ); + mapAnnounceQuest1.push_back( exdData->getField< uint32_t >( row, 45 ) ); + mapAnnounceQuest1.push_back( exdData->getField< uint32_t >( row, 46 ) ); + mapAnnounceQuest1.push_back( exdData->getField< uint32_t >( row, 47 ) ); + mapAnnounceQuest1.push_back( exdData->getField< uint32_t >( row, 48 ) ); + mapAnnounceQuest1.push_back( exdData->getField< uint32_t >( row, 49 ) ); +} + Sapphire::Data::EventIconPriority::EventIconPriority( uint32_t row_id, Sapphire::Data::ExdDataGenerated* exdData ) { auto row = exdData->m_EventIconPriorityDat.get_row( row_id ); @@ -3224,6 +3311,14 @@ Sapphire::Data::EventSystemDefine::EventSystemDefine( uint32_t row_id, Sapphire: defineValue = exdData->getField< uint32_t >( row, 1 ); } +Sapphire::Data::ExportedGatheringPoint::ExportedGatheringPoint( uint32_t row_id, Sapphire::Data::ExdDataGenerated* exdData ) +{ + auto row = exdData->m_ExportedGatheringPointDat.get_row( row_id ); + x = exdData->getField< float >( row, 0 ); + y = exdData->getField< float >( row, 1 ); + radius = exdData->getField< uint8_t >( row, 2 ); +} + Sapphire::Data::ExportedSG::ExportedSG( uint32_t row_id, Sapphire::Data::ExdDataGenerated* exdData ) { auto row = exdData->m_ExportedSGDat.get_row( row_id ); @@ -3241,46 +3336,47 @@ Sapphire::Data::ExVersion::ExVersion( uint32_t row_id, Sapphire::Data::ExdDataGe Sapphire::Data::Fate::Fate( uint32_t row_id, Sapphire::Data::ExdDataGenerated* exdData ) { auto row = exdData->m_FateDat.get_row( row_id ); - eurekaFate = exdData->getField< uint8_t >( row, 0 ); - rule = exdData->getField< uint8_t >( row, 1 ); - fateRuleEx = exdData->getField< uint16_t >( row, 2 ); - location = exdData->getField< uint32_t >( row, 3 ); - classJobLevel = exdData->getField< uint8_t >( row, 4 ); - classJobLevelMax = exdData->getField< uint8_t >( row, 5 ); - eventItem = exdData->getField< uint32_t >( row, 6 ); - typeToDoValue.push_back( exdData->getField< uint8_t >( row, 7 ) ); - typeToDoValue.push_back( exdData->getField< uint8_t >( row, 8 ) ); - typeToDoValue.push_back( exdData->getField< uint8_t >( row, 9 ) ); - iconObjective = exdData->getField< uint32_t >( row, 10 ); - iconMap = exdData->getField< uint32_t >( row, 11 ); - iconInactiveMap = exdData->getField< uint32_t >( row, 12 ); - music = exdData->getField< int32_t >( row, 13 ); - lGBGuardNPCLocation = exdData->getField< uint32_t >( row, 14 ); - screenImageAccept = exdData->getField< uint16_t >( row, 15 ); - screenImageComplete = exdData->getField< uint16_t >( row, 16 ); - screenImageFailed = exdData->getField< uint16_t >( row, 17 ); - specialFate = exdData->getField< bool >( row, 20 ); - givenStatus = exdData->getField< uint16_t >( row, 22 ); - adventEvent = exdData->getField< bool >( row, 24 ); - moonFaireEvent = exdData->getField< bool >( row, 25 ); - fATEChain = exdData->getField< uint32_t >( row, 27 ); - name = exdData->getField< std::string >( row, 30 ); - description = exdData->getField< std::string >( row, 31 ); - objective = exdData->getField< std::string >( row, 32 ); - statusText.push_back( exdData->getField< std::string >( row, 33 ) ); - statusText.push_back( exdData->getField< std::string >( row, 34 ) ); - statusText.push_back( exdData->getField< std::string >( row, 35 ) ); + name = exdData->getField< std::string >( row, 0 ); + description = exdData->getField< std::string >( row, 1 ); + objective = exdData->getField< std::string >( row, 2 ); + statusText.push_back( exdData->getField< std::string >( row, 3 ) ); + statusText.push_back( exdData->getField< std::string >( row, 4 ) ); + statusText.push_back( exdData->getField< std::string >( row, 5 ) ); + eurekaFate = exdData->getField< uint8_t >( row, 6 ); + rule = exdData->getField< uint8_t >( row, 7 ); + fateRuleEx = exdData->getField< uint16_t >( row, 8 ); + location = exdData->getField< uint32_t >( row, 9 ); + classJobLevel = exdData->getField< uint8_t >( row, 10 ); + classJobLevelMax = exdData->getField< uint8_t >( row, 11 ); + eventItem = exdData->getField< uint32_t >( row, 12 ); + typeToDoValue.push_back( exdData->getField< uint8_t >( row, 13 ) ); + typeToDoValue.push_back( exdData->getField< uint8_t >( row, 14 ) ); + typeToDoValue.push_back( exdData->getField< uint8_t >( row, 15 ) ); + iconObjective = exdData->getField< uint32_t >( row, 16 ); + iconMap = exdData->getField< uint32_t >( row, 17 ); + iconInactiveMap = exdData->getField< uint32_t >( row, 18 ); + music = exdData->getField< int32_t >( row, 19 ); + lGBGuardNPCLocation = exdData->getField< uint32_t >( row, 20 ); + screenImageAccept = exdData->getField< uint16_t >( row, 21 ); + screenImageComplete = exdData->getField< uint16_t >( row, 22 ); + screenImageFailed = exdData->getField< uint16_t >( row, 23 ); + requiredQuest = exdData->getField< uint32_t >( row, 25 ); + specialFate = exdData->getField< bool >( row, 26 ); + givenStatus = exdData->getField< uint16_t >( row, 28 ); + adventEvent = exdData->getField< bool >( row, 30 ); + moonFaireEvent = exdData->getField< bool >( row, 31 ); + fATEChain = exdData->getField< uint32_t >( row, 33 ); arrayIndex = exdData->getField< uint32_t >( row, 36 ); reqEventItem = exdData->getField< uint32_t >( row, 38 ); turnInEventItem = exdData->getField< uint32_t >( row, 39 ); - objectiveIcon.push_back( exdData->getField< uint16_t >( row, 40 ) ); - objectiveIcon.push_back( exdData->getField< uint16_t >( row, 41 ) ); - objectiveIcon.push_back( exdData->getField< uint16_t >( row, 42 ) ); objectiveIcon.push_back( exdData->getField< uint16_t >( row, 43 ) ); objectiveIcon.push_back( exdData->getField< uint16_t >( row, 44 ) ); objectiveIcon.push_back( exdData->getField< uint16_t >( row, 45 ) ); objectiveIcon.push_back( exdData->getField< uint16_t >( row, 46 ) ); objectiveIcon.push_back( exdData->getField< uint16_t >( row, 47 ) ); + objectiveIcon.push_back( exdData->getField< uint16_t >( row, 48 ) ); + objectiveIcon.push_back( exdData->getField< uint16_t >( row, 49 ) ); + objectiveIcon.push_back( exdData->getField< uint16_t >( row, 50 ) ); } Sapphire::Data::FateEvent::FateEvent( uint32_t row_id, Sapphire::Data::ExdDataGenerated* exdData ) @@ -3564,33 +3660,6 @@ Sapphire::Data::Frontline04::Frontline04( uint32_t row_id, Sapphire::Data::ExdDa level1 = exdData->getField< int32_t >( row, 0 ); level2 = exdData->getField< int32_t >( row, 1 ); level3 = exdData->getField< int32_t >( row, 2 ); - unknownLevel.push_back( exdData->getField< int32_t >( row, 6 ) ); - unknownLevel.push_back( exdData->getField< int32_t >( row, 7 ) ); - unknownLevel.push_back( exdData->getField< int32_t >( row, 8 ) ); - unknownLevel.push_back( exdData->getField< int32_t >( row, 9 ) ); - unknownLevel.push_back( exdData->getField< int32_t >( row, 10 ) ); - unknownLevel.push_back( exdData->getField< int32_t >( row, 11 ) ); - unknownLevel.push_back( exdData->getField< int32_t >( row, 12 ) ); - unknownLevel.push_back( exdData->getField< int32_t >( row, 13 ) ); - unknownLevel.push_back( exdData->getField< int32_t >( row, 14 ) ); - unknownLevel.push_back( exdData->getField< int32_t >( row, 15 ) ); - unknownLevel.push_back( exdData->getField< int32_t >( row, 16 ) ); - unknownLevel.push_back( exdData->getField< int32_t >( row, 17 ) ); - unknownLevel.push_back( exdData->getField< int32_t >( row, 18 ) ); - unknownLevel.push_back( exdData->getField< int32_t >( row, 19 ) ); - unknownLevel.push_back( exdData->getField< int32_t >( row, 20 ) ); - unknownLevel.push_back( exdData->getField< int32_t >( row, 21 ) ); - unknownLevel.push_back( exdData->getField< int32_t >( row, 22 ) ); - unknownLevel.push_back( exdData->getField< int32_t >( row, 23 ) ); - unknownLevel.push_back( exdData->getField< int32_t >( row, 24 ) ); - unknownLevel.push_back( exdData->getField< int32_t >( row, 25 ) ); - unknownLevel.push_back( exdData->getField< int32_t >( row, 26 ) ); - unknownLevel.push_back( exdData->getField< int32_t >( row, 27 ) ); - unknownLevel.push_back( exdData->getField< int32_t >( row, 28 ) ); - unknownLevel.push_back( exdData->getField< int32_t >( row, 29 ) ); - unknownLevel.push_back( exdData->getField< int32_t >( row, 30 ) ); - unknownLevel.push_back( exdData->getField< int32_t >( row, 31 ) ); - unknownLevel.push_back( exdData->getField< int32_t >( row, 32 ) ); } Sapphire::Data::FurnitureCatalogCategory::FurnitureCatalogCategory( uint32_t row_id, Sapphire::Data::ExdDataGenerated* exdData ) @@ -3825,8 +3894,6 @@ Sapphire::Data::GatheringPointBonus::GatheringPointBonus( uint32_t row_id, Sapph conditionValue = exdData->getField< uint32_t >( row, 1 ); bonusType = exdData->getField< uint8_t >( row, 3 ); bonusValue = exdData->getField< uint16_t >( row, 4 ); - unknown53 = exdData->getField< bool >( row, 6 ); - unknown54 = exdData->getField< uint32_t >( row, 7 ); } Sapphire::Data::GatheringPointBonusType::GatheringPointBonusType( uint32_t row_id, Sapphire::Data::ExdDataGenerated* exdData ) @@ -3889,6 +3956,18 @@ Sapphire::Data::GcArmyCaptureTactics::GcArmyCaptureTactics( uint32_t row_id, Sap icon = exdData->getField< uint32_t >( row, 5 ); } +Sapphire::Data::GcArmyEquipPreset::GcArmyEquipPreset( uint32_t row_id, Sapphire::Data::ExdDataGenerated* exdData ) +{ + auto row = exdData->m_GcArmyEquipPresetDat.get_row( row_id ); + mainHand = exdData->getField< int32_t >( row, 0 ); + offHand = exdData->getField< int32_t >( row, 1 ); + head = exdData->getField< int32_t >( row, 2 ); + body = exdData->getField< int32_t >( row, 3 ); + gloves = exdData->getField< int32_t >( row, 4 ); + legs = exdData->getField< int32_t >( row, 5 ); + feet = exdData->getField< int32_t >( row, 6 ); +} + Sapphire::Data::GcArmyExpedition::GcArmyExpedition( uint32_t row_id, Sapphire::Data::ExdDataGenerated* exdData ) { auto row = exdData->m_GcArmyExpeditionDat.get_row( row_id ); @@ -3921,6 +4000,246 @@ Sapphire::Data::GcArmyMemberGrow::GcArmyMemberGrow( uint32_t row_id, Sapphire::D auto row = exdData->m_GcArmyMemberGrowDat.get_row( row_id ); classJob = exdData->getField< uint8_t >( row, 0 ); classBook = exdData->getField< int32_t >( row, 1 ); + equipPreset.push_back( exdData->getField< uint16_t >( row, 2 ) ); + equipPreset.push_back( exdData->getField< uint16_t >( row, 3 ) ); + equipPreset.push_back( exdData->getField< uint16_t >( row, 4 ) ); + equipPreset.push_back( exdData->getField< uint16_t >( row, 5 ) ); + equipPreset.push_back( exdData->getField< uint16_t >( row, 6 ) ); + equipPreset.push_back( exdData->getField< uint16_t >( row, 7 ) ); + equipPreset.push_back( exdData->getField< uint16_t >( row, 8 ) ); + equipPreset.push_back( exdData->getField< uint16_t >( row, 9 ) ); + equipPreset.push_back( exdData->getField< uint16_t >( row, 10 ) ); + equipPreset.push_back( exdData->getField< uint16_t >( row, 11 ) ); + equipPreset.push_back( exdData->getField< uint16_t >( row, 12 ) ); + equipPreset.push_back( exdData->getField< uint16_t >( row, 13 ) ); + equipPreset.push_back( exdData->getField< uint16_t >( row, 14 ) ); + equipPreset.push_back( exdData->getField< uint16_t >( row, 15 ) ); + equipPreset.push_back( exdData->getField< uint16_t >( row, 16 ) ); + equipPreset.push_back( exdData->getField< uint16_t >( row, 17 ) ); + equipPreset.push_back( exdData->getField< uint16_t >( row, 18 ) ); + equipPreset.push_back( exdData->getField< uint16_t >( row, 19 ) ); + equipPreset.push_back( exdData->getField< uint16_t >( row, 20 ) ); + equipPreset.push_back( exdData->getField< uint16_t >( row, 21 ) ); + equipPreset.push_back( exdData->getField< uint16_t >( row, 22 ) ); + equipPreset.push_back( exdData->getField< uint16_t >( row, 23 ) ); + equipPreset.push_back( exdData->getField< uint16_t >( row, 24 ) ); + equipPreset.push_back( exdData->getField< uint16_t >( row, 25 ) ); + equipPreset.push_back( exdData->getField< uint16_t >( row, 26 ) ); + equipPreset.push_back( exdData->getField< uint16_t >( row, 27 ) ); + equipPreset.push_back( exdData->getField< uint16_t >( row, 28 ) ); + equipPreset.push_back( exdData->getField< uint16_t >( row, 29 ) ); + equipPreset.push_back( exdData->getField< uint16_t >( row, 30 ) ); + equipPreset.push_back( exdData->getField< uint16_t >( row, 31 ) ); + equipPreset.push_back( exdData->getField< uint16_t >( row, 32 ) ); + equipPreset.push_back( exdData->getField< uint16_t >( row, 33 ) ); + equipPreset.push_back( exdData->getField< uint16_t >( row, 34 ) ); + equipPreset.push_back( exdData->getField< uint16_t >( row, 35 ) ); + equipPreset.push_back( exdData->getField< uint16_t >( row, 36 ) ); + equipPreset.push_back( exdData->getField< uint16_t >( row, 37 ) ); + equipPreset.push_back( exdData->getField< uint16_t >( row, 38 ) ); + equipPreset.push_back( exdData->getField< uint16_t >( row, 39 ) ); + equipPreset.push_back( exdData->getField< uint16_t >( row, 40 ) ); + equipPreset.push_back( exdData->getField< uint16_t >( row, 41 ) ); + equipPreset.push_back( exdData->getField< uint16_t >( row, 42 ) ); + equipPreset.push_back( exdData->getField< uint16_t >( row, 43 ) ); + equipPreset.push_back( exdData->getField< uint16_t >( row, 44 ) ); + equipPreset.push_back( exdData->getField< uint16_t >( row, 45 ) ); + equipPreset.push_back( exdData->getField< uint16_t >( row, 46 ) ); + equipPreset.push_back( exdData->getField< uint16_t >( row, 47 ) ); + equipPreset.push_back( exdData->getField< uint16_t >( row, 48 ) ); + equipPreset.push_back( exdData->getField< uint16_t >( row, 49 ) ); + equipPreset.push_back( exdData->getField< uint16_t >( row, 50 ) ); + equipPreset.push_back( exdData->getField< uint16_t >( row, 51 ) ); + equipPreset.push_back( exdData->getField< uint16_t >( row, 52 ) ); + equipPreset.push_back( exdData->getField< uint16_t >( row, 53 ) ); + equipPreset.push_back( exdData->getField< uint16_t >( row, 54 ) ); + equipPreset.push_back( exdData->getField< uint16_t >( row, 55 ) ); + equipPreset.push_back( exdData->getField< uint16_t >( row, 56 ) ); + equipPreset.push_back( exdData->getField< uint16_t >( row, 57 ) ); + equipPreset.push_back( exdData->getField< uint16_t >( row, 58 ) ); + equipPreset.push_back( exdData->getField< uint16_t >( row, 59 ) ); + equipPreset.push_back( exdData->getField< uint16_t >( row, 60 ) ); + equipPreset.push_back( exdData->getField< uint16_t >( row, 61 ) ); + physical.push_back( exdData->getField< uint8_t >( row, 63 ) ); + physical.push_back( exdData->getField< uint8_t >( row, 64 ) ); + physical.push_back( exdData->getField< uint8_t >( row, 65 ) ); + physical.push_back( exdData->getField< uint8_t >( row, 66 ) ); + physical.push_back( exdData->getField< uint8_t >( row, 67 ) ); + physical.push_back( exdData->getField< uint8_t >( row, 68 ) ); + physical.push_back( exdData->getField< uint8_t >( row, 69 ) ); + physical.push_back( exdData->getField< uint8_t >( row, 70 ) ); + physical.push_back( exdData->getField< uint8_t >( row, 71 ) ); + physical.push_back( exdData->getField< uint8_t >( row, 72 ) ); + physical.push_back( exdData->getField< uint8_t >( row, 73 ) ); + physical.push_back( exdData->getField< uint8_t >( row, 74 ) ); + physical.push_back( exdData->getField< uint8_t >( row, 75 ) ); + physical.push_back( exdData->getField< uint8_t >( row, 76 ) ); + physical.push_back( exdData->getField< uint8_t >( row, 77 ) ); + physical.push_back( exdData->getField< uint8_t >( row, 78 ) ); + physical.push_back( exdData->getField< uint8_t >( row, 79 ) ); + physical.push_back( exdData->getField< uint8_t >( row, 80 ) ); + physical.push_back( exdData->getField< uint8_t >( row, 81 ) ); + physical.push_back( exdData->getField< uint8_t >( row, 82 ) ); + physical.push_back( exdData->getField< uint8_t >( row, 83 ) ); + physical.push_back( exdData->getField< uint8_t >( row, 84 ) ); + physical.push_back( exdData->getField< uint8_t >( row, 85 ) ); + physical.push_back( exdData->getField< uint8_t >( row, 86 ) ); + physical.push_back( exdData->getField< uint8_t >( row, 87 ) ); + physical.push_back( exdData->getField< uint8_t >( row, 88 ) ); + physical.push_back( exdData->getField< uint8_t >( row, 89 ) ); + physical.push_back( exdData->getField< uint8_t >( row, 90 ) ); + physical.push_back( exdData->getField< uint8_t >( row, 91 ) ); + physical.push_back( exdData->getField< uint8_t >( row, 92 ) ); + physical.push_back( exdData->getField< uint8_t >( row, 93 ) ); + physical.push_back( exdData->getField< uint8_t >( row, 94 ) ); + physical.push_back( exdData->getField< uint8_t >( row, 95 ) ); + physical.push_back( exdData->getField< uint8_t >( row, 96 ) ); + physical.push_back( exdData->getField< uint8_t >( row, 97 ) ); + physical.push_back( exdData->getField< uint8_t >( row, 98 ) ); + physical.push_back( exdData->getField< uint8_t >( row, 99 ) ); + physical.push_back( exdData->getField< uint8_t >( row, 100 ) ); + physical.push_back( exdData->getField< uint8_t >( row, 101 ) ); + physical.push_back( exdData->getField< uint8_t >( row, 102 ) ); + physical.push_back( exdData->getField< uint8_t >( row, 103 ) ); + physical.push_back( exdData->getField< uint8_t >( row, 104 ) ); + physical.push_back( exdData->getField< uint8_t >( row, 105 ) ); + physical.push_back( exdData->getField< uint8_t >( row, 106 ) ); + physical.push_back( exdData->getField< uint8_t >( row, 107 ) ); + physical.push_back( exdData->getField< uint8_t >( row, 108 ) ); + physical.push_back( exdData->getField< uint8_t >( row, 109 ) ); + physical.push_back( exdData->getField< uint8_t >( row, 110 ) ); + physical.push_back( exdData->getField< uint8_t >( row, 111 ) ); + physical.push_back( exdData->getField< uint8_t >( row, 112 ) ); + physical.push_back( exdData->getField< uint8_t >( row, 113 ) ); + physical.push_back( exdData->getField< uint8_t >( row, 114 ) ); + physical.push_back( exdData->getField< uint8_t >( row, 115 ) ); + physical.push_back( exdData->getField< uint8_t >( row, 116 ) ); + physical.push_back( exdData->getField< uint8_t >( row, 117 ) ); + physical.push_back( exdData->getField< uint8_t >( row, 118 ) ); + physical.push_back( exdData->getField< uint8_t >( row, 119 ) ); + physical.push_back( exdData->getField< uint8_t >( row, 120 ) ); + physical.push_back( exdData->getField< uint8_t >( row, 121 ) ); + physical.push_back( exdData->getField< uint8_t >( row, 122 ) ); + mental.push_back( exdData->getField< uint8_t >( row, 124 ) ); + mental.push_back( exdData->getField< uint8_t >( row, 125 ) ); + mental.push_back( exdData->getField< uint8_t >( row, 126 ) ); + mental.push_back( exdData->getField< uint8_t >( row, 127 ) ); + mental.push_back( exdData->getField< uint8_t >( row, 128 ) ); + mental.push_back( exdData->getField< uint8_t >( row, 129 ) ); + mental.push_back( exdData->getField< uint8_t >( row, 130 ) ); + mental.push_back( exdData->getField< uint8_t >( row, 131 ) ); + mental.push_back( exdData->getField< uint8_t >( row, 132 ) ); + mental.push_back( exdData->getField< uint8_t >( row, 133 ) ); + mental.push_back( exdData->getField< uint8_t >( row, 134 ) ); + mental.push_back( exdData->getField< uint8_t >( row, 135 ) ); + mental.push_back( exdData->getField< uint8_t >( row, 136 ) ); + mental.push_back( exdData->getField< uint8_t >( row, 137 ) ); + mental.push_back( exdData->getField< uint8_t >( row, 138 ) ); + mental.push_back( exdData->getField< uint8_t >( row, 139 ) ); + mental.push_back( exdData->getField< uint8_t >( row, 140 ) ); + mental.push_back( exdData->getField< uint8_t >( row, 141 ) ); + mental.push_back( exdData->getField< uint8_t >( row, 142 ) ); + mental.push_back( exdData->getField< uint8_t >( row, 143 ) ); + mental.push_back( exdData->getField< uint8_t >( row, 144 ) ); + mental.push_back( exdData->getField< uint8_t >( row, 145 ) ); + mental.push_back( exdData->getField< uint8_t >( row, 146 ) ); + mental.push_back( exdData->getField< uint8_t >( row, 147 ) ); + mental.push_back( exdData->getField< uint8_t >( row, 148 ) ); + mental.push_back( exdData->getField< uint8_t >( row, 149 ) ); + mental.push_back( exdData->getField< uint8_t >( row, 150 ) ); + mental.push_back( exdData->getField< uint8_t >( row, 151 ) ); + mental.push_back( exdData->getField< uint8_t >( row, 152 ) ); + mental.push_back( exdData->getField< uint8_t >( row, 153 ) ); + mental.push_back( exdData->getField< uint8_t >( row, 154 ) ); + mental.push_back( exdData->getField< uint8_t >( row, 155 ) ); + mental.push_back( exdData->getField< uint8_t >( row, 156 ) ); + mental.push_back( exdData->getField< uint8_t >( row, 157 ) ); + mental.push_back( exdData->getField< uint8_t >( row, 158 ) ); + mental.push_back( exdData->getField< uint8_t >( row, 159 ) ); + mental.push_back( exdData->getField< uint8_t >( row, 160 ) ); + mental.push_back( exdData->getField< uint8_t >( row, 161 ) ); + mental.push_back( exdData->getField< uint8_t >( row, 162 ) ); + mental.push_back( exdData->getField< uint8_t >( row, 163 ) ); + mental.push_back( exdData->getField< uint8_t >( row, 164 ) ); + mental.push_back( exdData->getField< uint8_t >( row, 165 ) ); + mental.push_back( exdData->getField< uint8_t >( row, 166 ) ); + mental.push_back( exdData->getField< uint8_t >( row, 167 ) ); + mental.push_back( exdData->getField< uint8_t >( row, 168 ) ); + mental.push_back( exdData->getField< uint8_t >( row, 169 ) ); + mental.push_back( exdData->getField< uint8_t >( row, 170 ) ); + mental.push_back( exdData->getField< uint8_t >( row, 171 ) ); + mental.push_back( exdData->getField< uint8_t >( row, 172 ) ); + mental.push_back( exdData->getField< uint8_t >( row, 173 ) ); + mental.push_back( exdData->getField< uint8_t >( row, 174 ) ); + mental.push_back( exdData->getField< uint8_t >( row, 175 ) ); + mental.push_back( exdData->getField< uint8_t >( row, 176 ) ); + mental.push_back( exdData->getField< uint8_t >( row, 177 ) ); + mental.push_back( exdData->getField< uint8_t >( row, 178 ) ); + mental.push_back( exdData->getField< uint8_t >( row, 179 ) ); + mental.push_back( exdData->getField< uint8_t >( row, 180 ) ); + mental.push_back( exdData->getField< uint8_t >( row, 181 ) ); + mental.push_back( exdData->getField< uint8_t >( row, 182 ) ); + mental.push_back( exdData->getField< uint8_t >( row, 183 ) ); + tactical.push_back( exdData->getField< uint8_t >( row, 185 ) ); + tactical.push_back( exdData->getField< uint8_t >( row, 186 ) ); + tactical.push_back( exdData->getField< uint8_t >( row, 187 ) ); + tactical.push_back( exdData->getField< uint8_t >( row, 188 ) ); + tactical.push_back( exdData->getField< uint8_t >( row, 189 ) ); + tactical.push_back( exdData->getField< uint8_t >( row, 190 ) ); + tactical.push_back( exdData->getField< uint8_t >( row, 191 ) ); + tactical.push_back( exdData->getField< uint8_t >( row, 192 ) ); + tactical.push_back( exdData->getField< uint8_t >( row, 193 ) ); + tactical.push_back( exdData->getField< uint8_t >( row, 194 ) ); + tactical.push_back( exdData->getField< uint8_t >( row, 195 ) ); + tactical.push_back( exdData->getField< uint8_t >( row, 196 ) ); + tactical.push_back( exdData->getField< uint8_t >( row, 197 ) ); + tactical.push_back( exdData->getField< uint8_t >( row, 198 ) ); + tactical.push_back( exdData->getField< uint8_t >( row, 199 ) ); + tactical.push_back( exdData->getField< uint8_t >( row, 200 ) ); + tactical.push_back( exdData->getField< uint8_t >( row, 201 ) ); + tactical.push_back( exdData->getField< uint8_t >( row, 202 ) ); + tactical.push_back( exdData->getField< uint8_t >( row, 203 ) ); + tactical.push_back( exdData->getField< uint8_t >( row, 204 ) ); + tactical.push_back( exdData->getField< uint8_t >( row, 205 ) ); + tactical.push_back( exdData->getField< uint8_t >( row, 206 ) ); + tactical.push_back( exdData->getField< uint8_t >( row, 207 ) ); + tactical.push_back( exdData->getField< uint8_t >( row, 208 ) ); + tactical.push_back( exdData->getField< uint8_t >( row, 209 ) ); + tactical.push_back( exdData->getField< uint8_t >( row, 210 ) ); + tactical.push_back( exdData->getField< uint8_t >( row, 211 ) ); + tactical.push_back( exdData->getField< uint8_t >( row, 212 ) ); + tactical.push_back( exdData->getField< uint8_t >( row, 213 ) ); + tactical.push_back( exdData->getField< uint8_t >( row, 214 ) ); + tactical.push_back( exdData->getField< uint8_t >( row, 215 ) ); + tactical.push_back( exdData->getField< uint8_t >( row, 216 ) ); + tactical.push_back( exdData->getField< uint8_t >( row, 217 ) ); + tactical.push_back( exdData->getField< uint8_t >( row, 218 ) ); + tactical.push_back( exdData->getField< uint8_t >( row, 219 ) ); + tactical.push_back( exdData->getField< uint8_t >( row, 220 ) ); + tactical.push_back( exdData->getField< uint8_t >( row, 221 ) ); + tactical.push_back( exdData->getField< uint8_t >( row, 222 ) ); + tactical.push_back( exdData->getField< uint8_t >( row, 223 ) ); + tactical.push_back( exdData->getField< uint8_t >( row, 224 ) ); + tactical.push_back( exdData->getField< uint8_t >( row, 225 ) ); + tactical.push_back( exdData->getField< uint8_t >( row, 226 ) ); + tactical.push_back( exdData->getField< uint8_t >( row, 227 ) ); + tactical.push_back( exdData->getField< uint8_t >( row, 228 ) ); + tactical.push_back( exdData->getField< uint8_t >( row, 229 ) ); + tactical.push_back( exdData->getField< uint8_t >( row, 230 ) ); + tactical.push_back( exdData->getField< uint8_t >( row, 231 ) ); + tactical.push_back( exdData->getField< uint8_t >( row, 232 ) ); + tactical.push_back( exdData->getField< uint8_t >( row, 233 ) ); + tactical.push_back( exdData->getField< uint8_t >( row, 234 ) ); + tactical.push_back( exdData->getField< uint8_t >( row, 235 ) ); + tactical.push_back( exdData->getField< uint8_t >( row, 236 ) ); + tactical.push_back( exdData->getField< uint8_t >( row, 237 ) ); + tactical.push_back( exdData->getField< uint8_t >( row, 238 ) ); + tactical.push_back( exdData->getField< uint8_t >( row, 239 ) ); + tactical.push_back( exdData->getField< uint8_t >( row, 240 ) ); + tactical.push_back( exdData->getField< uint8_t >( row, 241 ) ); + tactical.push_back( exdData->getField< uint8_t >( row, 242 ) ); + tactical.push_back( exdData->getField< uint8_t >( row, 243 ) ); + tactical.push_back( exdData->getField< uint8_t >( row, 244 ) ); } Sapphire::Data::GcArmyTraining::GcArmyTraining( uint32_t row_id, Sapphire::Data::ExdDataGenerated* exdData ) @@ -4127,9 +4446,9 @@ Sapphire::Data::GilShopItem::GilShopItem( uint32_t row_id, uint32_t subRow, Sapp { 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 ) ); - rowRequired.push_back( exdData->getField< int32_t >( row, 5 ) ); + questRequired.push_back( exdData->getField< int32_t >( row, 3 ) ); + questRequired.push_back( exdData->getField< int32_t >( row, 4 ) ); + achievementRequired = exdData->getField< int32_t >( row, 5 ); stateRequired = exdData->getField< uint16_t >( row, 7 ); patch = exdData->getField< uint16_t >( row, 8 ); } @@ -4205,7 +4524,6 @@ Sapphire::Data::GroupPoseFrame::GroupPoseFrame( uint32_t row_id, Sapphire::Data: auto row = exdData->m_GroupPoseFrameDat.get_row( row_id ); image = exdData->getField< int32_t >( row, 1 ); gridText = exdData->getField< std::string >( row, 2 ); - unknown54 = exdData->getField< int32_t >( row, 6 ); text = exdData->getField< std::string >( row, 7 ); } @@ -4214,8 +4532,6 @@ Sapphire::Data::GroupPoseStamp::GroupPoseStamp( uint32_t row_id, Sapphire::Data: auto row = exdData->m_GroupPoseStampDat.get_row( row_id ); stampIcon = exdData->getField< int32_t >( row, 0 ); category = exdData->getField< int32_t >( row, 2 ); - unknown540 = exdData->getField< int32_t >( row, 4 ); - unknown541 = exdData->getField< bool >( row, 5 ); name = exdData->getField< std::string >( row, 8 ); } @@ -4262,7 +4578,7 @@ Sapphire::Data::GuideTitle::GuideTitle( uint32_t row_id, Sapphire::Data::ExdData Sapphire::Data::GuildleveAssignment::GuildleveAssignment( uint32_t row_id, Sapphire::Data::ExdDataGenerated* exdData ) { auto row = exdData->m_GuildleveAssignmentDat.get_row( row_id ); - addedIn53 = exdData->getField< uint8_t >( row, 1 ); + type = exdData->getField< std::string >( row, 0 ); assignmentTalk = exdData->getField< uint32_t >( row, 2 ); quest.push_back( exdData->getField< uint32_t >( row, 3 ) ); quest.push_back( exdData->getField< uint32_t >( row, 4 ) ); @@ -4281,6 +4597,19 @@ Sapphire::Data::GuildleveAssignmentCategory::GuildleveAssignmentCategory( uint32 category.push_back( exdData->getField< int32_t >( row, 7 ) ); } +Sapphire::Data::GuildleveAssignmentTalk::GuildleveAssignmentTalk( uint32_t row_id, Sapphire::Data::ExdDataGenerated* exdData ) +{ + auto row = exdData->m_GuildleveAssignmentTalkDat.get_row( row_id ); + talk.push_back( exdData->getField< std::string >( row, 30 ) ); + talk.push_back( exdData->getField< std::string >( row, 31 ) ); + talk.push_back( exdData->getField< std::string >( row, 32 ) ); + talk.push_back( exdData->getField< std::string >( row, 33 ) ); + talk.push_back( exdData->getField< std::string >( row, 34 ) ); + talk.push_back( exdData->getField< std::string >( row, 35 ) ); + talk.push_back( exdData->getField< std::string >( row, 36 ) ); + talk.push_back( exdData->getField< std::string >( row, 37 ) ); +} + Sapphire::Data::GuildOrder::GuildOrder( uint32_t row_id, Sapphire::Data::ExdDataGenerated* exdData ) { auto row = exdData->m_GuildOrderDat.get_row( row_id ); @@ -4635,17 +4964,20 @@ Sapphire::Data::HousingYardObject::HousingYardObject( uint32_t row_id, Sapphire: Sapphire::Data::HowTo::HowTo( uint32_t row_id, Sapphire::Data::ExdDataGenerated* exdData ) { auto row = exdData->m_HowToDat.get_row( row_id ); - images.push_back( exdData->getField< int16_t >( row, 2 ) ); - images.push_back( exdData->getField< int16_t >( row, 3 ) ); - images.push_back( exdData->getField< int16_t >( row, 4 ) ); - images.push_back( exdData->getField< int16_t >( row, 5 ) ); - images.push_back( exdData->getField< int16_t >( row, 6 ) ); - images.push_back( exdData->getField< int16_t >( row, 7 ) ); - images.push_back( exdData->getField< int16_t >( row, 8 ) ); - images.push_back( exdData->getField< int16_t >( row, 9 ) ); - images.push_back( exdData->getField< int16_t >( row, 10 ) ); - images.push_back( exdData->getField< int16_t >( row, 11 ) ); + name = exdData->getField< std::string >( row, 0 ); + announce = exdData->getField< bool >( row, 1 ); + howToPagePC.push_back( exdData->getField< int16_t >( row, 2 ) ); + howToPagePC.push_back( exdData->getField< int16_t >( row, 3 ) ); + howToPagePC.push_back( exdData->getField< int16_t >( row, 4 ) ); + howToPagePC.push_back( exdData->getField< int16_t >( row, 5 ) ); + howToPagePC.push_back( exdData->getField< int16_t >( row, 6 ) ); + howToPageController.push_back( exdData->getField< int16_t >( row, 7 ) ); + howToPageController.push_back( exdData->getField< int16_t >( row, 8 ) ); + howToPageController.push_back( exdData->getField< int16_t >( row, 9 ) ); + howToPageController.push_back( exdData->getField< int16_t >( row, 10 ) ); + howToPageController.push_back( exdData->getField< int16_t >( row, 11 ) ); category = exdData->getField< int8_t >( row, 12 ); + sort = exdData->getField< uint8_t >( row, 13 ); } Sapphire::Data::HowToCategory::HowToCategory( uint32_t row_id, Sapphire::Data::ExdDataGenerated* exdData ) @@ -4657,7 +4989,13 @@ Sapphire::Data::HowToCategory::HowToCategory( uint32_t row_id, Sapphire::Data::E Sapphire::Data::HowToPage::HowToPage( uint32_t row_id, Sapphire::Data::ExdDataGenerated* exdData ) { auto row = exdData->m_HowToPageDat.get_row( row_id ); + type = exdData->getField< uint8_t >( row, 0 ); + iconType = exdData->getField< uint8_t >( row, 1 ); image = exdData->getField< int32_t >( row, 2 ); + textType = exdData->getField< uint8_t >( row, 3 ); + text.push_back( exdData->getField< std::string >( row, 4 ) ); + text.push_back( exdData->getField< std::string >( row, 5 ) ); + text.push_back( exdData->getField< std::string >( row, 6 ) ); } Sapphire::Data::HugeCraftworksNpc::HugeCraftworksNpc( uint32_t row_id, Sapphire::Data::ExdDataGenerated* exdData ) @@ -5671,7 +6009,6 @@ Sapphire::Data::IKDFishParam::IKDFishParam( uint32_t row_id, Sapphire::Data::Exd auto row = exdData->m_IKDFishParamDat.get_row( row_id ); fish = exdData->getField< uint32_t >( row, 0 ); iKDContentBonus = exdData->getField< uint8_t >( row, 1 ); - unknown54 = exdData->getField< uint8_t >( row, 2 ); } Sapphire::Data::IKDRoute::IKDRoute( uint32_t row_id, Sapphire::Data::ExdDataGenerated* exdData ) @@ -5754,8 +6091,6 @@ Sapphire::Data::IndividualWeather::IndividualWeather( uint32_t row_id, Sapphire: weather.push_back( exdData->getField< uint8_t >( row, 3 ) ); weather.push_back( exdData->getField< uint8_t >( row, 4 ) ); weather.push_back( exdData->getField< uint8_t >( row, 5 ) ); - addedIn530 = exdData->getField< uint8_t >( row, 12 ); - addedIn531 = exdData->getField< uint8_t >( row, 13 ); quest.push_back( exdData->getField< uint32_t >( row, 15 ) ); quest.push_back( exdData->getField< uint32_t >( row, 16 ) ); quest.push_back( exdData->getField< uint32_t >( row, 17 ) ); @@ -5773,6 +6108,7 @@ Sapphire::Data::InstanceContent::InstanceContent( uint32_t row_id, Sapphire::Dat bGM = exdData->getField< uint16_t >( row, 4 ); winBGM = exdData->getField< uint16_t >( row, 5 ); cutscene = exdData->getField< uint32_t >( row, 6 ); + lGBEventRange = exdData->getField< uint32_t >( row, 7 ); order = exdData->getField< uint16_t >( row, 8 ); colosseum = exdData->getField< uint8_t >( row, 9 ); instanceContentTextDataBossStart = exdData->getField< uint32_t >( row, 11 ); @@ -5793,8 +6129,6 @@ Sapphire::Data::InstanceContent::InstanceContent( uint32_t row_id, Sapphire::Dat instanceContentBuff = exdData->getField< uint32_t >( row, 50 ); reqInstance = exdData->getField< int32_t >( row, 51 ); partyCondition = exdData->getField< int16_t >( row, 53 ); - unknown540 = exdData->getField< uint16_t >( row, 61 ); - unknown541 = exdData->getField< uint16_t >( row, 62 ); } Sapphire::Data::InstanceContentBuff::InstanceContentBuff( uint32_t row_id, Sapphire::Data::ExdDataGenerated* exdData ) @@ -5809,8 +6143,6 @@ Sapphire::Data::InstanceContentCSBonus::InstanceContentCSBonus( uint32_t row_id, auto row = exdData->m_InstanceContentCSBonusDat.get_row( row_id ); instance = exdData->getField< uint16_t >( row, 0 ); item = exdData->getField< uint32_t >( row, 1 ); - unknown540 = exdData->getField< uint8_t >( row, 3 ); - unknown541 = exdData->getField< uint8_t >( row, 4 ); } Sapphire::Data::InstanceContentGuide::InstanceContentGuide( uint32_t row_id, Sapphire::Data::ExdDataGenerated* exdData ) @@ -5865,35 +6197,33 @@ Sapphire::Data::Item::Item( uint32_t row_id, Sapphire::Data::ExdDataGenerated* e isCollectable = exdData->getField< bool >( row, 37 ); alwaysCollectable = exdData->getField< bool >( row, 38 ); aetherialReduce = exdData->getField< uint16_t >( row, 39 ); - unknown54 = exdData->getField< uint16_t >( row, 40 ); - levelEquip = exdData->getField< uint8_t >( row, 41 ); - equipRestriction = exdData->getField< uint8_t >( row, 43 ); - classJobCategory = exdData->getField< uint8_t >( row, 44 ); - grandCompany = exdData->getField< uint8_t >( row, 45 ); - itemSeries = exdData->getField< uint8_t >( row, 46 ); - baseParamModifier = exdData->getField< uint8_t >( row, 47 ); - modelMain = exdData->getField< uint64_t >( row, 48 ); - modelSub = exdData->getField< uint64_t >( row, 49 ); - classJobUse = exdData->getField< uint8_t >( row, 50 ); - damagePhys = exdData->getField< uint16_t >( row, 52 ); - damageMag = exdData->getField< uint16_t >( row, 53 ); - delayms = exdData->getField< uint16_t >( row, 54 ); - blockRate = exdData->getField< uint16_t >( row, 56 ); - block = exdData->getField< uint16_t >( row, 57 ); - defensePhys = exdData->getField< uint16_t >( row, 58 ); - defenseMag = exdData->getField< uint16_t >( row, 59 ); - itemSpecialBonus = exdData->getField< uint8_t >( row, 72 ); - itemSpecialBonusParam = exdData->getField< uint8_t >( row, 73 ); - materializeType = exdData->getField< uint8_t >( row, 86 ); - materiaSlotCount = exdData->getField< uint8_t >( row, 87 ); - isAdvancedMeldingPermitted = exdData->getField< bool >( row, 88 ); - isPvP = exdData->getField< bool >( row, 89 ); - isGlamourous = exdData->getField< bool >( row, 91 ); - + levelEquip = exdData->getField< uint8_t >( row, 40 ); + equipRestriction = exdData->getField< uint8_t >( row, 42 ); + classJobCategory = exdData->getField< uint8_t >( row, 43 ); + grandCompany = exdData->getField< uint8_t >( row, 44 ); + itemSeries = exdData->getField< uint8_t >( row, 45 ); + baseParamModifier = exdData->getField< uint8_t >( row, 46 ); + modelMain = exdData->getField< uint64_t >( row, 47 ); + modelSub = exdData->getField< uint64_t >( row, 48 ); + classJobUse = exdData->getField< uint8_t >( row, 49 ); + damagePhys = exdData->getField< uint16_t >( row, 51 ); + damageMag = exdData->getField< uint16_t >( row, 52 ); + delayms = exdData->getField< uint16_t >( row, 53 ); + blockRate = exdData->getField< uint16_t >( row, 55 ); + block = exdData->getField< uint16_t >( row, 56 ); + defensePhys = exdData->getField< uint16_t >( row, 57 ); + defenseMag = exdData->getField< uint16_t >( row, 58 ); + itemSpecialBonus = exdData->getField< uint8_t >( row, 71 ); + itemSpecialBonusParam = exdData->getField< uint8_t >( row, 72 ); + materializeType = exdData->getField< uint8_t >( row, 85 ); + materiaSlotCount = exdData->getField< uint8_t >( row, 86 ); + isAdvancedMeldingPermitted = exdData->getField< bool >( row, 87 ); + isPvP = exdData->getField< bool >( row, 88 ); + isGlamourous = exdData->getField< bool >( row, 90 ); for( int i = 0; i < 6; ++i ) { - param[i].baseparam = exdData->getField< uint8_t >( row, 60 + i * 2 ); - param[i].value = exdData->getField< int16_t >( row, 61 + i * 2 ); + param[i].baseparam = exdData->getField< uint8_t >( row, 59 + i * 2 ); + param[i].value = exdData->getField< int16_t >( row, 60 + i * 2 ); } } @@ -6061,6 +6391,12 @@ Sapphire::Data::ItemUICategory::ItemUICategory( uint32_t row_id, Sapphire::Data: orderMajor = exdData->getField< uint8_t >( row, 3 ); } +Sapphire::Data::Jingle::Jingle( uint32_t row_id, Sapphire::Data::ExdDataGenerated* exdData ) +{ + auto row = exdData->m_JingleDat.get_row( row_id ); + name = exdData->getField< std::string >( row, 0 ); +} + Sapphire::Data::JobHudManual::JobHudManual( uint32_t row_id, Sapphire::Data::ExdDataGenerated* exdData ) { auto row = exdData->m_JobHudManualDat.get_row( row_id ); @@ -6309,70 +6645,6 @@ Sapphire::Data::LotteryExchangeShop::LotteryExchangeShop( uint32_t row_id, Sapph amountAccepted.push_back( exdData->getField< uint32_t >( row, 62 ) ); amountAccepted.push_back( exdData->getField< uint32_t >( row, 63 ) ); amountAccepted.push_back( exdData->getField< uint32_t >( row, 64 ) ); - unknown540.push_back( exdData->getField< uint8_t >( row, 65 ) ); - unknown540.push_back( exdData->getField< uint8_t >( row, 66 ) ); - unknown540.push_back( exdData->getField< uint8_t >( row, 67 ) ); - unknown540.push_back( exdData->getField< uint8_t >( row, 68 ) ); - unknown540.push_back( exdData->getField< uint8_t >( row, 69 ) ); - unknown540.push_back( exdData->getField< uint8_t >( row, 70 ) ); - unknown540.push_back( exdData->getField< uint8_t >( row, 71 ) ); - unknown540.push_back( exdData->getField< uint8_t >( row, 72 ) ); - unknown540.push_back( exdData->getField< uint8_t >( row, 73 ) ); - unknown540.push_back( exdData->getField< uint8_t >( row, 74 ) ); - unknown540.push_back( exdData->getField< uint8_t >( row, 75 ) ); - unknown540.push_back( exdData->getField< uint8_t >( row, 76 ) ); - unknown540.push_back( exdData->getField< uint8_t >( row, 77 ) ); - unknown540.push_back( exdData->getField< uint8_t >( row, 78 ) ); - unknown540.push_back( exdData->getField< uint8_t >( row, 79 ) ); - unknown540.push_back( exdData->getField< uint8_t >( row, 80 ) ); - unknown540.push_back( exdData->getField< uint8_t >( row, 81 ) ); - unknown540.push_back( exdData->getField< uint8_t >( row, 82 ) ); - unknown540.push_back( exdData->getField< uint8_t >( row, 83 ) ); - unknown540.push_back( exdData->getField< uint8_t >( row, 84 ) ); - unknown540.push_back( exdData->getField< uint8_t >( row, 85 ) ); - unknown540.push_back( exdData->getField< uint8_t >( row, 86 ) ); - unknown540.push_back( exdData->getField< uint8_t >( row, 87 ) ); - unknown540.push_back( exdData->getField< uint8_t >( row, 88 ) ); - unknown540.push_back( exdData->getField< uint8_t >( row, 89 ) ); - unknown540.push_back( exdData->getField< uint8_t >( row, 90 ) ); - unknown540.push_back( exdData->getField< uint8_t >( row, 91 ) ); - unknown540.push_back( exdData->getField< uint8_t >( row, 92 ) ); - unknown540.push_back( exdData->getField< uint8_t >( row, 93 ) ); - unknown540.push_back( exdData->getField< uint8_t >( row, 94 ) ); - unknown540.push_back( exdData->getField< uint8_t >( row, 95 ) ); - unknown540.push_back( exdData->getField< uint8_t >( row, 96 ) ); - unknown541.push_back( exdData->getField< uint8_t >( row, 97 ) ); - unknown541.push_back( exdData->getField< uint8_t >( row, 98 ) ); - unknown541.push_back( exdData->getField< uint8_t >( row, 99 ) ); - unknown541.push_back( exdData->getField< uint8_t >( row, 100 ) ); - unknown541.push_back( exdData->getField< uint8_t >( row, 101 ) ); - unknown541.push_back( exdData->getField< uint8_t >( row, 102 ) ); - unknown541.push_back( exdData->getField< uint8_t >( row, 103 ) ); - unknown541.push_back( exdData->getField< uint8_t >( row, 104 ) ); - unknown541.push_back( exdData->getField< uint8_t >( row, 105 ) ); - unknown541.push_back( exdData->getField< uint8_t >( row, 106 ) ); - unknown541.push_back( exdData->getField< uint8_t >( row, 107 ) ); - unknown541.push_back( exdData->getField< uint8_t >( row, 108 ) ); - unknown541.push_back( exdData->getField< uint8_t >( row, 109 ) ); - unknown541.push_back( exdData->getField< uint8_t >( row, 110 ) ); - unknown541.push_back( exdData->getField< uint8_t >( row, 111 ) ); - unknown541.push_back( exdData->getField< uint8_t >( row, 112 ) ); - unknown541.push_back( exdData->getField< uint8_t >( row, 113 ) ); - unknown541.push_back( exdData->getField< uint8_t >( row, 114 ) ); - unknown541.push_back( exdData->getField< uint8_t >( row, 115 ) ); - unknown541.push_back( exdData->getField< uint8_t >( row, 116 ) ); - unknown541.push_back( exdData->getField< uint8_t >( row, 117 ) ); - unknown541.push_back( exdData->getField< uint8_t >( row, 118 ) ); - unknown541.push_back( exdData->getField< uint8_t >( row, 119 ) ); - unknown541.push_back( exdData->getField< uint8_t >( row, 120 ) ); - unknown541.push_back( exdData->getField< uint8_t >( row, 121 ) ); - unknown541.push_back( exdData->getField< uint8_t >( row, 122 ) ); - unknown541.push_back( exdData->getField< uint8_t >( row, 123 ) ); - unknown541.push_back( exdData->getField< uint8_t >( row, 124 ) ); - unknown541.push_back( exdData->getField< uint8_t >( row, 125 ) ); - unknown541.push_back( exdData->getField< uint8_t >( row, 126 ) ); - unknown541.push_back( exdData->getField< uint8_t >( row, 127 ) ); - unknown541.push_back( exdData->getField< uint8_t >( row, 128 ) ); lua = exdData->getField< std::string >( row, 129 ); logMessage.push_back( exdData->getField< uint32_t >( row, 130 ) ); logMessage.push_back( exdData->getField< uint32_t >( row, 131 ) ); @@ -6444,6 +6716,12 @@ Sapphire::Data::Map::Map( uint32_t row_id, Sapphire::Data::ExdDataGenerated* exd isEvent = exdData->getField< bool >( row, 17 ); } +Sapphire::Data::MapCondition::MapCondition( uint32_t row_id, Sapphire::Data::ExdDataGenerated* exdData ) +{ + auto row = exdData->m_MapConditionDat.get_row( row_id ); + quest = exdData->getField< uint16_t >( row, 0 ); +} + Sapphire::Data::MapMarker::MapMarker( uint32_t row_id, uint32_t subRow, Sapphire::Data::ExdDataGenerated* exdData ) { auto row = exdData->m_MapMarkerDat.get_row( row_id, subRow ); @@ -6479,23 +6757,6 @@ Sapphire::Data::Marker::Marker( uint32_t row_id, Sapphire::Data::ExdDataGenerate name = exdData->getField< std::string >( row, 1 ); } -Sapphire::Data::MasterpieceSupplyDuty::MasterpieceSupplyDuty( uint32_t row_id, Sapphire::Data::ExdDataGenerated* exdData ) -{ - auto row = exdData->m_MasterpieceSupplyDutyDat.get_row( row_id ); - classJob = exdData->getField< uint8_t >( row, 0 ); - classJobLevel = exdData->getField< uint8_t >( row, 1 ); - rewardCurrency = exdData->getField< uint16_t >( row, 2 ); -} - -Sapphire::Data::MasterpieceSupplyMultiplier::MasterpieceSupplyMultiplier( uint32_t row_id, Sapphire::Data::ExdDataGenerated* exdData ) -{ - auto row = exdData->m_MasterpieceSupplyMultiplierDat.get_row( row_id ); - xpMultiplier.push_back( exdData->getField< uint16_t >( row, 0 ) ); - xpMultiplier.push_back( exdData->getField< uint16_t >( row, 1 ) ); - currencyMultiplier.push_back( exdData->getField< uint16_t >( row, 4 ) ); - currencyMultiplier.push_back( exdData->getField< uint16_t >( row, 5 ) ); -} - Sapphire::Data::Materia::Materia( uint32_t row_id, Sapphire::Data::ExdDataGenerated* exdData ) { auto row = exdData->m_MateriaDat.get_row( row_id ); @@ -6876,15 +7137,14 @@ Sapphire::Data::MYCWarResultNotebook::MYCWarResultNotebook( uint32_t row_id, Sap { auto row = exdData->m_MYCWarResultNotebookDat.get_row( row_id ); number = exdData->getField< uint8_t >( row, 0 ); - unknown540 = exdData->getField< uint8_t >( row, 1 ); - unknown541 = exdData->getField< uint8_t >( row, 2 ); + link = exdData->getField< uint8_t >( row, 2 ); quest = exdData->getField< int32_t >( row, 3 ); - icon = exdData->getField< int32_t >( row, 4 ); - image = exdData->getField< int32_t >( row, 5 ); - rarity = exdData->getField< uint8_t >( row, 6 ); - nameJP = exdData->getField< std::string >( row, 7 ); - name = exdData->getField< std::string >( row, 8 ); - description = exdData->getField< std::string >( row, 9 ); + icon = exdData->getField< int32_t >( row, 5 ); + image = exdData->getField< int32_t >( row, 6 ); + rarity = exdData->getField< uint8_t >( row, 7 ); + nameJP = exdData->getField< std::string >( row, 8 ); + name = exdData->getField< std::string >( row, 9 ); + description = exdData->getField< std::string >( row, 10 ); } Sapphire::Data::NotebookDivision::NotebookDivision( uint32_t row_id, Sapphire::Data::ExdDataGenerated* exdData ) @@ -6957,7 +7217,6 @@ Sapphire::Data::NpcYell::NpcYell( uint32_t row_id, Sapphire::Data::ExdDataGenera balloonTime = exdData->getField< float >( row, 6 ); isBalloonSlow = exdData->getField< bool >( row, 7 ); battleTalkTime = exdData->getField< bool >( row, 8 ); - unknown54 = exdData->getField< uint8_t >( row, 9 ); text = exdData->getField< std::string >( row, 10 ); } @@ -7168,9 +7427,20 @@ Sapphire::Data::Perform::Perform( uint32_t row_id, Sapphire::Data::ExdDataGenera animationPlay02 = exdData->getField< uint16_t >( row, 7 ); stopAnimation = exdData->getField< int32_t >( row, 8 ); instrument = exdData->getField< std::string >( row, 9 ); + order = exdData->getField< int32_t >( row, 10 ); transient = exdData->getField< uint8_t >( row, 11 ); } +Sapphire::Data::PerformGroup::PerformGroup( uint32_t row_id, Sapphire::Data::ExdDataGenerated* exdData ) +{ + auto row = exdData->m_PerformGroupDat.get_row( row_id ); + perform.push_back( exdData->getField< uint8_t >( row, 0 ) ); + perform.push_back( exdData->getField< uint8_t >( row, 1 ) ); + perform.push_back( exdData->getField< uint8_t >( row, 2 ) ); + perform.push_back( exdData->getField< uint8_t >( row, 3 ) ); + perform.push_back( exdData->getField< uint8_t >( row, 4 ) ); +} + Sapphire::Data::PerformTransient::PerformTransient( uint32_t row_id, Sapphire::Data::ExdDataGenerated* exdData ) { auto row = exdData->m_PerformTransientDat.get_row( row_id ); @@ -7195,6 +7465,12 @@ Sapphire::Data::PetAction::PetAction( uint32_t row_id, Sapphire::Data::ExdDataGe disableOrder = exdData->getField< bool >( row, 6 ); } +Sapphire::Data::PetMirage::PetMirage( uint32_t row_id, Sapphire::Data::ExdDataGenerated* exdData ) +{ + auto row = exdData->m_PetMirageDat.get_row( row_id ); + name = exdData->getField< std::string >( row, 2 ); +} + Sapphire::Data::PhysicsGroup::PhysicsGroup( uint32_t row_id, Sapphire::Data::ExdDataGenerated* exdData ) { auto row = exdData->m_PhysicsGroupDat.get_row( row_id ); @@ -7318,11 +7594,12 @@ Sapphire::Data::PublicContent::PublicContent( uint32_t row_id, Sapphire::Data::E name = exdData->getField< std::string >( row, 3 ); textDataStart = exdData->getField< uint32_t >( row, 4 ); textDataEnd = exdData->getField< uint32_t >( row, 5 ); + startCutscene = exdData->getField< uint32_t >( row, 6 ); + lGBEventRange = exdData->getField< uint32_t >( row, 7 ); + lGBPopRange = exdData->getField< uint32_t >( row, 8 ); contentFinderCondition = exdData->getField< uint16_t >( row, 9 ); additionalData = exdData->getField< uint16_t >( row, 10 ); - unknown540 = exdData->getField< int32_t >( row, 13 ); - unknown541 = exdData->getField< uint16_t >( row, 14 ); - unknown542 = exdData->getField< uint16_t >( row, 15 ); + endCutscene = exdData->getField< uint32_t >( row, 16 ); } Sapphire::Data::PublicContentCutscene::PublicContentCutscene( uint32_t row_id, Sapphire::Data::ExdDataGenerated* exdData ) @@ -7338,13 +7615,6 @@ Sapphire::Data::PublicContentTextData::PublicContentTextData( uint32_t row_id, S textData = exdData->getField< std::string >( row, 0 ); } -Sapphire::Data::Purify::Purify( uint32_t row_id, Sapphire::Data::ExdDataGenerated* exdData ) -{ - auto row = exdData->m_PurifyDat.get_row( row_id ); - _class = exdData->getField< uint8_t >( row, 0 ); - level = exdData->getField< uint8_t >( row, 1 ); -} - Sapphire::Data::PvPAction::PvPAction( uint32_t row_id, Sapphire::Data::ExdDataGenerated* exdData ) { auto row = exdData->m_PvPActionDat.get_row( row_id ); @@ -7357,7 +7627,7 @@ Sapphire::Data::PvPAction::PvPAction( uint32_t row_id, Sapphire::Data::ExdDataGe Sapphire::Data::PvPActionSort::PvPActionSort( uint32_t row_id, uint32_t subRow, Sapphire::Data::ExdDataGenerated* exdData ) { auto row = exdData->m_PvPActionSortDat.get_row( row_id, subRow ); - name = exdData->getField< uint8_t >( row, 0 ); + actionType = exdData->getField< uint8_t >( row, 0 ); action = exdData->getField< uint16_t >( row, 1 ); } @@ -8654,7 +8924,7 @@ Sapphire::Data::Quest::Quest( uint32_t row_id, Sapphire::Data::ExdDataGenerated* classJobRequired = exdData->getField< uint8_t >( row, 1438 ); expFactor = exdData->getField< uint16_t >( row, 1440 ); gilReward = exdData->getField< uint32_t >( row, 1441 ); - gCSeals = exdData->getField< uint16_t >( row, 1443 ); + gCSeals = exdData->getField< uint32_t >( row, 1443 ); itemCatalyst.push_back( exdData->getField< uint8_t >( row, 1444 ) ); itemCatalyst.push_back( exdData->getField< uint8_t >( row, 1445 ) ); itemCatalyst.push_back( exdData->getField< uint8_t >( row, 1446 ) ); @@ -8721,7 +8991,6 @@ Sapphire::Data::Quest::Quest( uint32_t row_id, Sapphire::Data::ExdDataGenerated* hideOfferIcon = exdData->getField< bool >( row, 1511 ); eventIconType = exdData->getField< uint8_t >( row, 1512 ); sortKey = exdData->getField< uint16_t >( row, 1514 ); - unknown54 = exdData->getField< bool >( row, 1515 ); } Sapphire::Data::QuestBattle::QuestBattle( uint32_t row_id, Sapphire::Data::ExdDataGenerated* exdData ) @@ -9219,6 +9488,7 @@ Sapphire::Data::QuestRedoChapterUI::QuestRedoChapterUI( uint32_t row_id, Sapphir { auto row = exdData->m_QuestRedoChapterUIDat.get_row( row_id ); quest = exdData->getField< uint32_t >( row, 0 ); + uITab = exdData->getField< uint8_t >( row, 1 ); category = exdData->getField< uint8_t >( row, 2 ); questRedoUISmall = exdData->getField< uint32_t >( row, 4 ); questRedoUILarge = exdData->getField< uint32_t >( row, 5 ); @@ -9289,7 +9559,6 @@ Sapphire::Data::Race::Race( uint32_t row_id, Sapphire::Data::ExdDataGenerated* e rSEFHands = exdData->getField< int32_t >( row, 7 ); rSEFLegs = exdData->getField< int32_t >( row, 8 ); rSEFFeet = exdData->getField< int32_t >( row, 9 ); - unknown54 = exdData->getField< uint8_t >( row, 10 ); exPac = exdData->getField< uint8_t >( row, 11 ); } @@ -9644,7 +9913,6 @@ Sapphire::Data::Resident::Resident( uint32_t row_id, uint32_t subRow, Sapphire:: auto row = exdData->m_ResidentDat.get_row( row_id, subRow ); model = exdData->getField< uint64_t >( row, 1 ); npcYell = exdData->getField< int32_t >( row, 2 ); - addedIn53 = exdData->getField< uint16_t >( row, 3 ); residentMotionType = exdData->getField< uint8_t >( row, 4 ); } @@ -9660,6 +9928,12 @@ Sapphire::Data::ResistanceWeaponAdjust::ResistanceWeaponAdjust( uint32_t row_id, image = exdData->getField< uint32_t >( row, 6 ); } +Sapphire::Data::RetainerFortuneRewardRange::RetainerFortuneRewardRange( uint32_t row_id, Sapphire::Data::ExdDataGenerated* exdData ) +{ + auto row = exdData->m_RetainerFortuneRewardRangeDat.get_row( row_id ); + percentOfLevel = exdData->getField< uint16_t >( row, 0 ); +} + Sapphire::Data::RetainerTask::RetainerTask( uint32_t row_id, Sapphire::Data::ExdDataGenerated* exdData ) { auto row = exdData->m_RetainerTaskDat.get_row( row_id ); @@ -9783,8 +10057,6 @@ Sapphire::Data::SatisfactionNpc::SatisfactionNpc( uint32_t row_id, Sapphire::Dat satisfactionRequired.push_back( exdData->getField< uint16_t >( row, 14 ) ); satisfactionRequired.push_back( exdData->getField< uint16_t >( row, 15 ) ); icon = exdData->getField< int32_t >( row, 70 ); - addedIn530 = exdData->getField< uint8_t >( row, 72 ); - addedIn531 = exdData->getField< uint8_t >( row, 73 ); } Sapphire::Data::SatisfactionSupply::SatisfactionSupply( uint32_t row_id, uint32_t subRow, Sapphire::Data::ExdDataGenerated* exdData ) @@ -9815,9 +10087,6 @@ Sapphire::Data::ScenarioTree::ScenarioTree( uint32_t row_id, Sapphire::Data::Exd auto row = exdData->m_ScenarioTreeDat.get_row( row_id ); type = exdData->getField< uint8_t >( row, 0 ); image = exdData->getField< uint16_t >( row, 1 ); - unknown540 = exdData->getField< uint32_t >( row, 3 ); - unknown541 = exdData->getField< std::string >( row, 4 ); - unknown542 = exdData->getField< int32_t >( row, 5 ); } Sapphire::Data::ScenarioTreeTips::ScenarioTreeTips( uint32_t row_id, Sapphire::Data::ExdDataGenerated* exdData ) @@ -9924,6 +10193,7 @@ Sapphire::Data::SpearfishingNotebook::SpearfishingNotebook( uint32_t row_id, Sap { auto row = exdData->m_SpearfishingNotebookDat.get_row( row_id ); gatheringLevel = exdData->getField< uint8_t >( row, 0 ); + isShadowNode = exdData->getField< bool >( row, 1 ); territoryType = exdData->getField< int32_t >( row, 2 ); x = exdData->getField< int16_t >( row, 3 ); y = exdData->getField< int16_t >( row, 4 ); @@ -10003,66 +10273,6 @@ Sapphire::Data::SpecialShop::SpecialShop( uint32_t row_id, Sapphire::Data::ExdDa questItem.push_back( exdData->getField< int32_t >( row, 1258 ) ); questItem.push_back( exdData->getField< int32_t >( row, 1259 ) ); questItem.push_back( exdData->getField< int32_t >( row, 1260 ) ); - unknown.push_back( exdData->getField< int32_t >( row, 1261 ) ); - unknown.push_back( exdData->getField< int32_t >( row, 1262 ) ); - unknown.push_back( exdData->getField< int32_t >( row, 1263 ) ); - unknown.push_back( exdData->getField< int32_t >( row, 1264 ) ); - unknown.push_back( exdData->getField< int32_t >( row, 1265 ) ); - unknown.push_back( exdData->getField< int32_t >( row, 1266 ) ); - unknown.push_back( exdData->getField< int32_t >( row, 1267 ) ); - unknown.push_back( exdData->getField< int32_t >( row, 1268 ) ); - unknown.push_back( exdData->getField< int32_t >( row, 1269 ) ); - unknown.push_back( exdData->getField< int32_t >( row, 1270 ) ); - unknown.push_back( exdData->getField< int32_t >( row, 1271 ) ); - unknown.push_back( exdData->getField< int32_t >( row, 1272 ) ); - unknown.push_back( exdData->getField< int32_t >( row, 1273 ) ); - unknown.push_back( exdData->getField< int32_t >( row, 1274 ) ); - unknown.push_back( exdData->getField< int32_t >( row, 1275 ) ); - unknown.push_back( exdData->getField< int32_t >( row, 1276 ) ); - unknown.push_back( exdData->getField< int32_t >( row, 1277 ) ); - unknown.push_back( exdData->getField< int32_t >( row, 1278 ) ); - unknown.push_back( exdData->getField< int32_t >( row, 1279 ) ); - unknown.push_back( exdData->getField< int32_t >( row, 1280 ) ); - unknown.push_back( exdData->getField< int32_t >( row, 1281 ) ); - unknown.push_back( exdData->getField< int32_t >( row, 1282 ) ); - unknown.push_back( exdData->getField< int32_t >( row, 1283 ) ); - unknown.push_back( exdData->getField< int32_t >( row, 1284 ) ); - unknown.push_back( exdData->getField< int32_t >( row, 1285 ) ); - unknown.push_back( exdData->getField< int32_t >( row, 1286 ) ); - unknown.push_back( exdData->getField< int32_t >( row, 1287 ) ); - unknown.push_back( exdData->getField< int32_t >( row, 1288 ) ); - unknown.push_back( exdData->getField< int32_t >( row, 1289 ) ); - unknown.push_back( exdData->getField< int32_t >( row, 1290 ) ); - unknown.push_back( exdData->getField< int32_t >( row, 1291 ) ); - unknown.push_back( exdData->getField< int32_t >( row, 1292 ) ); - unknown.push_back( exdData->getField< int32_t >( row, 1293 ) ); - unknown.push_back( exdData->getField< int32_t >( row, 1294 ) ); - unknown.push_back( exdData->getField< int32_t >( row, 1295 ) ); - unknown.push_back( exdData->getField< int32_t >( row, 1296 ) ); - unknown.push_back( exdData->getField< int32_t >( row, 1297 ) ); - unknown.push_back( exdData->getField< int32_t >( row, 1298 ) ); - unknown.push_back( exdData->getField< int32_t >( row, 1299 ) ); - unknown.push_back( exdData->getField< int32_t >( row, 1300 ) ); - unknown.push_back( exdData->getField< int32_t >( row, 1301 ) ); - unknown.push_back( exdData->getField< int32_t >( row, 1302 ) ); - unknown.push_back( exdData->getField< int32_t >( row, 1303 ) ); - unknown.push_back( exdData->getField< int32_t >( row, 1304 ) ); - unknown.push_back( exdData->getField< int32_t >( row, 1305 ) ); - unknown.push_back( exdData->getField< int32_t >( row, 1306 ) ); - unknown.push_back( exdData->getField< int32_t >( row, 1307 ) ); - unknown.push_back( exdData->getField< int32_t >( row, 1308 ) ); - unknown.push_back( exdData->getField< int32_t >( row, 1309 ) ); - unknown.push_back( exdData->getField< int32_t >( row, 1310 ) ); - unknown.push_back( exdData->getField< int32_t >( row, 1311 ) ); - unknown.push_back( exdData->getField< int32_t >( row, 1312 ) ); - unknown.push_back( exdData->getField< int32_t >( row, 1313 ) ); - unknown.push_back( exdData->getField< int32_t >( row, 1314 ) ); - unknown.push_back( exdData->getField< int32_t >( row, 1315 ) ); - unknown.push_back( exdData->getField< int32_t >( row, 1316 ) ); - unknown.push_back( exdData->getField< int32_t >( row, 1317 ) ); - unknown.push_back( exdData->getField< int32_t >( row, 1318 ) ); - unknown.push_back( exdData->getField< int32_t >( row, 1319 ) ); - unknown.push_back( exdData->getField< int32_t >( row, 1320 ) ); achievementUnlock.push_back( exdData->getField< int32_t >( row, 1321 ) ); achievementUnlock.push_back( exdData->getField< int32_t >( row, 1322 ) ); achievementUnlock.push_back( exdData->getField< int32_t >( row, 1323 ) ); @@ -12204,9 +12414,7 @@ Sapphire::Data::TerritoryType::TerritoryType( uint32_t row_id, Sapphire::Data::E achievementIndex = exdData->getField< int8_t >( row, 27 ); isPvpZone = exdData->getField< bool >( row, 28 ); exVersion = exdData->getField< uint8_t >( row, 29 ); - addedIn53 = exdData->getField< uint8_t >( row, 32 ); mountSpeed = exdData->getField< uint8_t >( row, 33 ); - unknown54 = exdData->getField< bool >( row, 40 ); } Sapphire::Data::TerritoryTypeTransient::TerritoryTypeTransient( uint32_t row_id, Sapphire::Data::ExdDataGenerated* exdData ) @@ -12310,8 +12518,7 @@ Sapphire::Data::Transformation::Transformation( uint32_t row_id, Sapphire::Data: startVFX = exdData->getField< uint16_t >( row, 30 ); endVFX = exdData->getField< uint16_t >( row, 31 ); action6 = exdData->getField< uint32_t >( row, 32 ); - action7 = exdData->getField< uint16_t >( row, 34 ); - unknown54 = exdData->getField< bool >( row, 36 ); + action7 = exdData->getField< uint16_t >( row, 35 ); } Sapphire::Data::Treasure::Treasure( uint32_t row_id, Sapphire::Data::ExdDataGenerated* exdData ) @@ -12421,7 +12628,6 @@ Sapphire::Data::TripleTriadCardResident::TripleTriadCardResident( uint32_t row_i sortKey = exdData->getField< uint8_t >( row, 8 ); order = exdData->getField< uint16_t >( row, 9 ); uIPriority = exdData->getField< uint8_t >( row, 10 ); - unknown54 = exdData->getField< bool >( row, 11 ); acquisitionType = exdData->getField< uint8_t >( row, 12 ); acquisition = exdData->getField< uint32_t >( row, 13 ); location = exdData->getField< uint32_t >( row, 14 ); @@ -12440,12 +12646,17 @@ Sapphire::Data::TripleTriadCompetition::TripleTriadCompetition( uint32_t row_id, name = exdData->getField< std::string >( row, 0 ); } +Sapphire::Data::TripleTriadResident::TripleTriadResident( uint32_t row_id, Sapphire::Data::ExdDataGenerated* exdData ) +{ + auto row = exdData->m_TripleTriadResidentDat.get_row( row_id ); + order = exdData->getField< uint16_t >( row, 0 ); +} + Sapphire::Data::TripleTriadRule::TripleTriadRule( uint32_t row_id, Sapphire::Data::ExdDataGenerated* exdData ) { auto row = exdData->m_TripleTriadRuleDat.get_row( row_id ); name = exdData->getField< std::string >( row, 0 ); description = exdData->getField< std::string >( row, 1 ); - unknown54 = exdData->getField< bool >( row, 4 ); } Sapphire::Data::Tutorial::Tutorial( uint32_t row_id, Sapphire::Data::ExdDataGenerated* exdData ) @@ -12477,6 +12688,52 @@ Sapphire::Data::TutorialTank::TutorialTank( uint32_t row_id, Sapphire::Data::Exd objective = exdData->getField< uint8_t >( row, 0 ); } +Sapphire::Data::UDS_Event::UDS_Event( uint32_t row_id, Sapphire::Data::ExdDataGenerated* exdData ) +{ + auto row = exdData->m_UDS_EventDat.get_row( row_id ); + text = exdData->getField< std::string >( row, 0 ); + type = exdData->getField< std::string >( row, 1 ); + property.push_back( exdData->getField< int32_t >( row, 2 ) ); + property.push_back( exdData->getField< int32_t >( row, 3 ) ); + property.push_back( exdData->getField< int32_t >( row, 4 ) ); + property.push_back( exdData->getField< int32_t >( row, 5 ) ); + property.push_back( exdData->getField< int32_t >( row, 6 ) ); + property.push_back( exdData->getField< int32_t >( row, 7 ) ); + property.push_back( exdData->getField< int32_t >( row, 8 ) ); + property.push_back( exdData->getField< int32_t >( row, 9 ) ); + property.push_back( exdData->getField< int32_t >( row, 10 ) ); + property.push_back( exdData->getField< int32_t >( row, 11 ) ); + property.push_back( exdData->getField< int32_t >( row, 12 ) ); + property.push_back( exdData->getField< int32_t >( row, 13 ) ); + property.push_back( exdData->getField< int32_t >( row, 14 ) ); + property.push_back( exdData->getField< int32_t >( row, 15 ) ); + property.push_back( exdData->getField< int32_t >( row, 16 ) ); + property.push_back( exdData->getField< int32_t >( row, 17 ) ); + property.push_back( exdData->getField< int32_t >( row, 18 ) ); + property.push_back( exdData->getField< int32_t >( row, 19 ) ); + property.push_back( exdData->getField< int32_t >( row, 20 ) ); + property.push_back( exdData->getField< int32_t >( row, 21 ) ); + property.push_back( exdData->getField< int32_t >( row, 22 ) ); + property.push_back( exdData->getField< int32_t >( row, 23 ) ); + property.push_back( exdData->getField< int32_t >( row, 24 ) ); + property.push_back( exdData->getField< int32_t >( row, 25 ) ); + property.push_back( exdData->getField< int32_t >( row, 26 ) ); + property.push_back( exdData->getField< int32_t >( row, 27 ) ); + property.push_back( exdData->getField< int32_t >( row, 28 ) ); + property.push_back( exdData->getField< int32_t >( row, 29 ) ); + property.push_back( exdData->getField< int32_t >( row, 30 ) ); + property.push_back( exdData->getField< int32_t >( row, 31 ) ); + property.push_back( exdData->getField< int32_t >( row, 32 ) ); + property.push_back( exdData->getField< int32_t >( row, 33 ) ); +} + +Sapphire::Data::UDS_Property::UDS_Property( uint32_t row_id, Sapphire::Data::ExdDataGenerated* exdData ) +{ + auto row = exdData->m_UDS_PropertyDat.get_row( row_id ); + text = exdData->getField< std::string >( row, 0 ); + type = exdData->getField< std::string >( row, 1 ); +} + Sapphire::Data::UIColor::UIColor( uint32_t row_id, Sapphire::Data::ExdDataGenerated* exdData ) { auto row = exdData->m_UIColorDat.get_row( row_id ); @@ -12585,7 +12842,6 @@ Sapphire::Data::WebGuidance::WebGuidance( uint32_t row_id, Sapphire::Data::ExdDa image = exdData->getField< int32_t >( row, 0 ); url = exdData->getField< uint8_t >( row, 1 ); name = exdData->getField< std::string >( row, 2 ); - unknown54 = exdData->getField< std::string >( row, 3 ); description = exdData->getField< std::string >( row, 4 ); } @@ -12752,6 +13008,7 @@ bool Sapphire::Data::ExdDataGenerated::init( const std::string& path ) m_AchievementCategoryDat = setupDatAccess( "AchievementCategory", xiv::exd::Language::en ); m_AchievementHideConditionDat = setupDatAccess( "AchievementHideCondition", xiv::exd::Language::none ); m_AchievementKindDat = setupDatAccess( "AchievementKind", xiv::exd::Language::en ); + m_AchievementTargetDat = setupDatAccess( "AchievementTarget", xiv::exd::Language::none ); m_ActionDat = setupDatAccess( "Action", xiv::exd::Language::en ); m_ActionCastTimelineDat = setupDatAccess( "ActionCastTimeline", xiv::exd::Language::none ); m_ActionCastVFXDat = setupDatAccess( "ActionCastVFX", xiv::exd::Language::none ); @@ -12798,6 +13055,8 @@ bool Sapphire::Data::ExdDataGenerated::init( const std::string& path ) m_AOZBossDat = setupDatAccess( "AOZBoss", xiv::exd::Language::none ); m_AOZContentDat = setupDatAccess( "AOZContent", xiv::exd::Language::none ); m_AOZContentBriefingBNpcDat = setupDatAccess( "AOZContentBriefingBNpc", xiv::exd::Language::none ); + m_AOZReportDat = setupDatAccess( "AOZReport", xiv::exd::Language::none ); + m_AOZScoreDat = setupDatAccess( "AOZScore", xiv::exd::Language::en ); m_AquariumFishDat = setupDatAccess( "AquariumFish", xiv::exd::Language::none ); m_AquariumWaterDat = setupDatAccess( "AquariumWater", xiv::exd::Language::en ); m_ArrayEventHandlerDat = setupDatAccess( "ArrayEventHandler", xiv::exd::Language::none ); @@ -12878,6 +13137,7 @@ bool Sapphire::Data::ExdDataGenerated::init( const std::string& path ) m_CompanyLeveRuleDat = setupDatAccess( "CompanyLeveRule", xiv::exd::Language::none ); m_CompleteJournalDat = setupDatAccess( "CompleteJournal", xiv::exd::Language::en ); m_CompleteJournalCategoryDat = setupDatAccess( "CompleteJournalCategory", xiv::exd::Language::none ); + m_CompletionDat = setupDatAccess( "Completion", xiv::exd::Language::en ); m_ConditionDat = setupDatAccess( "Condition", xiv::exd::Language::none ); m_ConfigKeyDat = setupDatAccess( "ConfigKey", xiv::exd::Language::en ); m_ContentCloseCycleDat = setupDatAccess( "ContentCloseCycle", xiv::exd::Language::none ); @@ -12901,6 +13161,7 @@ bool Sapphire::Data::ExdDataGenerated::init( const std::string& path ) m_CraftActionDat = setupDatAccess( "CraftAction", xiv::exd::Language::en ); m_CraftLeveDat = setupDatAccess( "CraftLeve", xiv::exd::Language::none ); m_CraftLevelDifferenceDat = setupDatAccess( "CraftLevelDifference", xiv::exd::Language::none ); + m_CraftLeveTalkDat = setupDatAccess( "CraftLeveTalk", xiv::exd::Language::en ); m_CraftTypeDat = setupDatAccess( "CraftType", xiv::exd::Language::en ); m_CreditDat = setupDatAccess( "Credit", xiv::exd::Language::none ); m_CreditBackImageDat = setupDatAccess( "CreditBackImage", xiv::exd::Language::none ); @@ -12908,9 +13169,9 @@ bool Sapphire::Data::ExdDataGenerated::init( const std::string& path ) m_CreditListDat = setupDatAccess( "CreditList", xiv::exd::Language::none ); m_CreditListTextDat = setupDatAccess( "CreditListText", xiv::exd::Language::en ); m_CustomTalkDat = setupDatAccess( "CustomTalk", xiv::exd::Language::en ); - m_CustomTalkDynamicIconDat = setupDatAccess( "CustomTalkDynamicIcon", xiv::exd::Language::none ); m_CustomTalkNestHandlersDat = setupDatAccess( "CustomTalkNestHandlers", xiv::exd::Language::none ); m_CutsceneDat = setupDatAccess( "Cutscene", xiv::exd::Language::none ); + m_CutSceneIncompQuestDat = setupDatAccess( "CutSceneIncompQuest", xiv::exd::Language::none ); m_CutsceneMotionDat = setupDatAccess( "CutsceneMotion", xiv::exd::Language::none ); m_CutsceneWorkIndexDat = setupDatAccess( "CutsceneWorkIndex", xiv::exd::Language::none ); m_CutScreenImageDat = setupDatAccess( "CutScreenImage", xiv::exd::Language::none ); @@ -12971,6 +13232,7 @@ bool Sapphire::Data::ExdDataGenerated::init( const std::string& path ) 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_EventCustomIconTypeDat = setupDatAccess( "EventCustomIconType", xiv::exd::Language::none ); m_EventIconPriorityDat = setupDatAccess( "EventIconPriority", xiv::exd::Language::none ); m_EventIconTypeDat = setupDatAccess( "EventIconType", xiv::exd::Language::none ); m_EventItemDat = setupDatAccess( "EventItem", xiv::exd::Language::en ); @@ -12978,6 +13240,7 @@ bool Sapphire::Data::ExdDataGenerated::init( const std::string& path ) m_EventItemHelpDat = setupDatAccess( "EventItemHelp", xiv::exd::Language::en ); m_EventItemTimelineDat = setupDatAccess( "EventItemTimeline", xiv::exd::Language::none ); m_EventSystemDefineDat = setupDatAccess( "EventSystemDefine", xiv::exd::Language::none ); + m_ExportedGatheringPointDat = setupDatAccess( "ExportedGatheringPoint", xiv::exd::Language::none ); m_ExportedSGDat = setupDatAccess( "ExportedSG", xiv::exd::Language::none ); m_ExVersionDat = setupDatAccess( "ExVersion", xiv::exd::Language::en ); m_FateDat = setupDatAccess( "Fate", xiv::exd::Language::en ); @@ -13027,6 +13290,7 @@ bool Sapphire::Data::ExdDataGenerated::init( const std::string& path ) m_GatheringSubCategoryDat = setupDatAccess( "GatheringSubCategory", xiv::exd::Language::en ); m_GatheringTypeDat = setupDatAccess( "GatheringType", xiv::exd::Language::en ); m_GcArmyCaptureTacticsDat = setupDatAccess( "GcArmyCaptureTactics", xiv::exd::Language::none ); + m_GcArmyEquipPresetDat = setupDatAccess( "GcArmyEquipPreset", xiv::exd::Language::none ); m_GcArmyExpeditionDat = setupDatAccess( "GcArmyExpedition", xiv::exd::Language::en ); m_GcArmyExpeditionMemberBonusDat = setupDatAccess( "GcArmyExpeditionMemberBonus", xiv::exd::Language::none ); m_GcArmyExpeditionTypeDat = setupDatAccess( "GcArmyExpeditionType", xiv::exd::Language::en ); @@ -13069,6 +13333,7 @@ bool Sapphire::Data::ExdDataGenerated::init( const std::string& path ) m_GuideTitleDat = setupDatAccess( "GuideTitle", xiv::exd::Language::en ); m_GuildleveAssignmentDat = setupDatAccess( "GuildleveAssignment", xiv::exd::Language::en ); m_GuildleveAssignmentCategoryDat = setupDatAccess( "GuildleveAssignmentCategory", xiv::exd::Language::none ); + m_GuildleveAssignmentTalkDat = setupDatAccess( "GuildleveAssignmentTalk", xiv::exd::Language::en ); m_GuildOrderDat = setupDatAccess( "GuildOrder", xiv::exd::Language::en ); m_GuildOrderGuideDat = setupDatAccess( "GuildOrderGuide", xiv::exd::Language::none ); m_GuildOrderOfficerDat = setupDatAccess( "GuildOrderOfficer", xiv::exd::Language::none ); @@ -13134,6 +13399,7 @@ bool Sapphire::Data::ExdDataGenerated::init( const std::string& path ) m_ItemSortCategoryDat = setupDatAccess( "ItemSortCategory", xiv::exd::Language::none ); m_ItemSpecialBonusDat = setupDatAccess( "ItemSpecialBonus", xiv::exd::Language::en ); m_ItemUICategoryDat = setupDatAccess( "ItemUICategory", xiv::exd::Language::en ); + m_JingleDat = setupDatAccess( "Jingle", xiv::exd::Language::none ); m_JobHudManualDat = setupDatAccess( "JobHudManual", xiv::exd::Language::none ); m_JobHudManualPriorityDat = setupDatAccess( "JobHudManualPriority", xiv::exd::Language::none ); m_JournalCategoryDat = setupDatAccess( "JournalCategory", xiv::exd::Language::en ); @@ -13160,12 +13426,11 @@ bool Sapphire::Data::ExdDataGenerated::init( const std::string& path ) m_MainCommandCategoryDat = setupDatAccess( "MainCommandCategory", xiv::exd::Language::en ); m_ManeuversArmorDat = setupDatAccess( "ManeuversArmor", xiv::exd::Language::en ); m_MapDat = setupDatAccess( "Map", xiv::exd::Language::none ); + m_MapConditionDat = setupDatAccess( "MapCondition", xiv::exd::Language::none ); m_MapMarkerDat = setupDatAccess( "MapMarker", xiv::exd::Language::none ); m_MapMarkerRegionDat = setupDatAccess( "MapMarkerRegion", xiv::exd::Language::none ); m_MapSymbolDat = setupDatAccess( "MapSymbol", xiv::exd::Language::none ); m_MarkerDat = setupDatAccess( "Marker", xiv::exd::Language::en ); - 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_MateriaJoinRateDat = setupDatAccess( "MateriaJoinRate", xiv::exd::Language::none ); m_MateriaJoinRateGatherCraftDat = setupDatAccess( "MateriaJoinRateGatherCraft", xiv::exd::Language::none ); @@ -13222,9 +13487,11 @@ bool Sapphire::Data::ExdDataGenerated::init( const std::string& path ) m_PartyContentTextDataDat = setupDatAccess( "PartyContentTextData", xiv::exd::Language::en ); m_PatchMarkDat = setupDatAccess( "PatchMark", xiv::exd::Language::none ); m_PerformDat = setupDatAccess( "Perform", xiv::exd::Language::en ); + m_PerformGroupDat = setupDatAccess( "PerformGroup", xiv::exd::Language::none ); m_PerformTransientDat = setupDatAccess( "PerformTransient", xiv::exd::Language::en ); m_PetDat = setupDatAccess( "Pet", xiv::exd::Language::en ); m_PetActionDat = setupDatAccess( "PetAction", xiv::exd::Language::en ); + m_PetMirageDat = setupDatAccess( "PetMirage", xiv::exd::Language::en ); m_PhysicsGroupDat = setupDatAccess( "PhysicsGroup", xiv::exd::Language::none ); m_PhysicsWindDat = setupDatAccess( "PhysicsWind", xiv::exd::Language::none ); m_PictureDat = setupDatAccess( "Picture", xiv::exd::Language::none ); @@ -13236,7 +13503,6 @@ bool Sapphire::Data::ExdDataGenerated::init( const std::string& path ) m_PublicContentDat = setupDatAccess( "PublicContent", xiv::exd::Language::en ); m_PublicContentCutsceneDat = setupDatAccess( "PublicContentCutscene", xiv::exd::Language::none ); m_PublicContentTextDataDat = setupDatAccess( "PublicContentTextData", xiv::exd::Language::en ); - m_PurifyDat = setupDatAccess( "Purify", xiv::exd::Language::none ); m_PvPActionDat = setupDatAccess( "PvPAction", xiv::exd::Language::none ); m_PvPActionSortDat = setupDatAccess( "PvPActionSort", xiv::exd::Language::none ); m_PvPRankDat = setupDatAccess( "PvPRank", xiv::exd::Language::none ); @@ -13276,6 +13542,7 @@ bool Sapphire::Data::ExdDataGenerated::init( const std::string& path ) m_RelicNoteCategoryDat = setupDatAccess( "RelicNoteCategory", xiv::exd::Language::en ); m_ResidentDat = setupDatAccess( "Resident", xiv::exd::Language::none ); m_ResistanceWeaponAdjustDat = setupDatAccess( "ResistanceWeaponAdjust", xiv::exd::Language::none ); + m_RetainerFortuneRewardRangeDat = setupDatAccess( "RetainerFortuneRewardRange", xiv::exd::Language::none ); m_RetainerTaskDat = setupDatAccess( "RetainerTask", xiv::exd::Language::none ); m_RetainerTaskLvRangeDat = setupDatAccess( "RetainerTaskLvRange", xiv::exd::Language::none ); m_RetainerTaskNormalDat = setupDatAccess( "RetainerTaskNormal", xiv::exd::Language::none ); @@ -13340,11 +13607,14 @@ bool Sapphire::Data::ExdDataGenerated::init( const std::string& path ) m_TripleTriadCardResidentDat = setupDatAccess( "TripleTriadCardResident", xiv::exd::Language::none ); m_TripleTriadCardTypeDat = setupDatAccess( "TripleTriadCardType", xiv::exd::Language::en ); m_TripleTriadCompetitionDat = setupDatAccess( "TripleTriadCompetition", xiv::exd::Language::en ); + m_TripleTriadResidentDat = setupDatAccess( "TripleTriadResident", xiv::exd::Language::none ); m_TripleTriadRuleDat = setupDatAccess( "TripleTriadRule", xiv::exd::Language::en ); m_TutorialDat = setupDatAccess( "Tutorial", xiv::exd::Language::none ); 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_UDS_EventDat = setupDatAccess( "UDS_Event", xiv::exd::Language::none ); + m_UDS_PropertyDat = setupDatAccess( "UDS_Property", 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 ); diff --git a/src/common/Exd/ExdDataGenerated.h b/src/common/Exd/ExdDataGenerated.h index 39af9dfa..f4b3e7fa 100644 --- a/src/common/Exd/ExdDataGenerated.h +++ b/src/common/Exd/ExdDataGenerated.h @@ -26,6 +26,7 @@ struct Achievement; struct AchievementCategory; struct AchievementHideCondition; struct AchievementKind; +struct AchievementTarget; struct Action; struct ActionCastTimeline; struct ActionCastVFX; @@ -72,6 +73,8 @@ struct AOZArrangement; struct AOZBoss; struct AOZContent; struct AOZContentBriefingBNpc; +struct AOZReport; +struct AOZScore; struct AquariumFish; struct AquariumWater; struct ArrayEventHandler; @@ -152,6 +155,7 @@ struct CompanyLeve; struct CompanyLeveRule; struct CompleteJournal; struct CompleteJournalCategory; +struct Completion; struct Condition; struct ConfigKey; struct ContentCloseCycle; @@ -175,6 +179,7 @@ struct ContentType; struct CraftAction; struct CraftLeve; struct CraftLevelDifference; +struct CraftLeveTalk; struct CraftType; struct Credit; struct CreditBackImage; @@ -182,9 +187,9 @@ struct CreditCast; struct CreditList; struct CreditListText; struct CustomTalk; -struct CustomTalkDynamicIcon; struct CustomTalkNestHandlers; struct Cutscene; +struct CutSceneIncompQuest; struct CutsceneMotion; struct CutsceneWorkIndex; struct CutScreenImage; @@ -245,6 +250,7 @@ struct EurekaMagiciteItem; struct EurekaMagiciteItemType; struct EurekaSphereElementAdjust; struct EventAction; +struct EventCustomIconType; struct EventIconPriority; struct EventIconType; struct EventItem; @@ -252,6 +258,7 @@ struct EventItemCastTimeline; struct EventItemHelp; struct EventItemTimeline; struct EventSystemDefine; +struct ExportedGatheringPoint; struct ExportedSG; struct ExVersion; struct Fate; @@ -301,6 +308,7 @@ struct GatheringRarePopTimeTable; struct GatheringSubCategory; struct GatheringType; struct GcArmyCaptureTactics; +struct GcArmyEquipPreset; struct GcArmyExpedition; struct GcArmyExpeditionMemberBonus; struct GcArmyExpeditionType; @@ -343,6 +351,7 @@ struct GuidePageString; struct GuideTitle; struct GuildleveAssignment; struct GuildleveAssignmentCategory; +struct GuildleveAssignmentTalk; struct GuildOrder; struct GuildOrderGuide; struct GuildOrderOfficer; @@ -408,6 +417,7 @@ struct ItemSeries; struct ItemSortCategory; struct ItemSpecialBonus; struct ItemUICategory; +struct Jingle; struct JobHudManual; struct JobHudManualPriority; struct JournalCategory; @@ -434,12 +444,11 @@ struct MainCommand; struct MainCommandCategory; struct ManeuversArmor; struct Map; +struct MapCondition; struct MapMarker; struct MapMarkerRegion; struct MapSymbol; struct Marker; -struct MasterpieceSupplyDuty; -struct MasterpieceSupplyMultiplier; struct Materia; struct MateriaJoinRate; struct MateriaJoinRateGatherCraft; @@ -496,9 +505,11 @@ struct PartyContentCutscene; struct PartyContentTextData; struct PatchMark; struct Perform; +struct PerformGroup; struct PerformTransient; struct Pet; struct PetAction; +struct PetMirage; struct PhysicsGroup; struct PhysicsWind; struct Picture; @@ -510,7 +521,6 @@ struct PresetCameraAdjust; struct PublicContent; struct PublicContentCutscene; struct PublicContentTextData; -struct Purify; struct PvPAction; struct PvPActionSort; struct PvPRank; @@ -550,6 +560,7 @@ struct RelicNote; struct RelicNoteCategory; struct Resident; struct ResistanceWeaponAdjust; +struct RetainerFortuneRewardRange; struct RetainerTask; struct RetainerTaskLvRange; struct RetainerTaskNormal; @@ -614,11 +625,14 @@ struct TripleTriadCardRarity; struct TripleTriadCardResident; struct TripleTriadCardType; struct TripleTriadCompetition; +struct TripleTriadResident; struct TripleTriadRule; struct Tutorial; struct TutorialDPS; struct TutorialHealer; struct TutorialTank; +struct UDS_Event; +struct UDS_Property; struct UIColor; struct VaseFlower; struct VFX; @@ -650,6 +664,7 @@ struct Achievement uint8_t achievementCategory; std::string name; std::string description; + uint8_t achievementTarget; uint8_t points; uint16_t title; uint32_t item; @@ -691,6 +706,14 @@ struct AchievementKind AchievementKind( uint32_t row_id, Sapphire::Data::ExdDataGenerated* exdData ); }; +struct AchievementTarget +{ + uint8_t type; + uint32_t value; + + AchievementTarget( uint32_t row_id, Sapphire::Data::ExdDataGenerated* exdData ); +}; + struct Action { std::string name; @@ -723,6 +746,7 @@ struct Action uint16_t cast100ms; uint16_t recast100ms; uint8_t cooldownGroup; + uint8_t additionalCooldownGroup; uint8_t maxCharges; int8_t attackType; uint8_t aspect; @@ -771,6 +795,8 @@ struct ActionComboRoute struct ActionIndirection { int32_t name; + int8_t classJob; + int32_t previousComboAction; ActionIndirection( uint32_t row_id, Sapphire::Data::ExdDataGenerated* exdData ); }; @@ -949,6 +975,7 @@ struct Aetheryte std::vector< uint32_t > level; bool isAetheryte; uint8_t aethernetGroup; + bool invisible; uint32_t requiredQuest; uint16_t map; int16_t aetherstreamX; @@ -1110,6 +1137,7 @@ struct AnimaWeaponItem struct AozAction { uint32_t action; + uint8_t rank; AozAction( uint32_t row_id, Sapphire::Data::ExdDataGenerated* exdData ); }; @@ -1209,6 +1237,24 @@ struct AOZContentBriefingBNpc AOZContentBriefingBNpc( uint32_t row_id, Sapphire::Data::ExdDataGenerated* exdData ); }; +struct AOZReport +{ + uint8_t reward; + int8_t order; + + AOZReport( uint32_t row_id, Sapphire::Data::ExdDataGenerated* exdData ); +}; + +struct AOZScore +{ + bool isHidden; + int32_t score; + std::string name; + std::string description; + + AOZScore( uint32_t row_id, Sapphire::Data::ExdDataGenerated* exdData ); +}; + struct AquariumFish { uint8_t aquariumWater; @@ -1741,7 +1787,6 @@ struct Channeling { std::string file; uint8_t widthScale; - bool addedIn53; Channeling( uint32_t row_id, Sapphire::Data::ExdDataGenerated* exdData ); }; @@ -1958,6 +2003,7 @@ struct ClassJob uint16_t modifierIntelligence; uint16_t modifierMind; uint16_t modifierPiety; + uint8_t pvPActionSortRow; uint8_t classJobParent; std::string nameEnglish; int32_t itemStartingWeapon; @@ -2031,6 +2077,7 @@ struct CollectablesShop { std::string name; uint32_t quest; + uint8_t rewardType; std::vector< uint16_t > shopItems; CollectablesShop( uint32_t row_id, Sapphire::Data::ExdDataGenerated* exdData ); @@ -2042,6 +2089,8 @@ struct CollectablesShopItem uint8_t collectablesShopItemGroup; uint16_t levelMin; uint16_t levelMax; + uint8_t stars; + uint8_t key; uint16_t collectablesShopRefine; uint16_t collectablesShopRewardScrip; @@ -2067,6 +2116,9 @@ struct CollectablesShopRefine struct CollectablesShopRewardItem { uint32_t item; + uint8_t rewardLow; + uint8_t rewardMid; + uint8_t rewardHigh; CollectablesShopRewardItem( uint32_t row_id, Sapphire::Data::ExdDataGenerated* exdData ); }; @@ -2268,6 +2320,17 @@ struct CompleteJournalCategory CompleteJournalCategory( uint32_t row_id, Sapphire::Data::ExdDataGenerated* exdData ); }; +struct Completion +{ + uint16_t group; + uint16_t key; + std::string lookupTable; + std::string text; + std::string groupTitle; + + Completion( uint32_t row_id, Sapphire::Data::ExdDataGenerated* exdData ); +}; + struct Condition { uint32_t logMessage; @@ -2317,14 +2380,13 @@ struct ContentFinderCondition uint8_t classJobLevelSync; uint16_t itemLevelRequired; uint16_t itemLevelSync; - bool addedIn53; bool allowUndersized; bool allowReplacement; bool allowExplorerMode; - bool unknown54; bool highEndDuty; bool dutyRecorderAllowed; std::string name; + std::string nameShort; uint8_t contentType; uint8_t transientKey; uint32_t transient; @@ -2377,7 +2439,6 @@ struct ContentMemberType uint8_t healersPerParty; uint8_t meleesPerParty; uint8_t rangedPerParty; - uint8_t unknown54; ContentMemberType( uint32_t row_id, Sapphire::Data::ExdDataGenerated* exdData ); }; @@ -2541,6 +2602,13 @@ struct CraftLevelDifference CraftLevelDifference( uint32_t row_id, Sapphire::Data::ExdDataGenerated* exdData ); }; +struct CraftLeveTalk +{ + std::vector< std::string > talk; + + CraftLeveTalk( uint32_t row_id, Sapphire::Data::ExdDataGenerated* exdData ); +}; + struct CraftType { uint8_t mainPhysical; @@ -2568,7 +2636,6 @@ struct Credit struct CreditBackImage { - bool unknown54; uint32_t backImage; CreditBackImage( uint32_t row_id, uint32_t subRow, Sapphire::Data::ExdDataGenerated* exdData ); @@ -2605,20 +2672,13 @@ struct CustomTalk std::string name; std::vector< std::string > scriptInstruction; std::vector< uint32_t > scriptArg; - bool text; - bool unknown54; + std::string mainOption; + std::string subOption; + uint32_t specialLinks; CustomTalk( uint32_t row_id, Sapphire::Data::ExdDataGenerated* exdData ); }; -struct CustomTalkDynamicIcon -{ - uint32_t smallIcon; - uint32_t largeIcon; - - CustomTalkDynamicIcon( uint32_t row_id, uint32_t subRow, Sapphire::Data::ExdDataGenerated* exdData ); -}; - struct CustomTalkNestHandlers { uint32_t nestHandler; @@ -2633,6 +2693,13 @@ struct Cutscene Cutscene( uint32_t row_id, Sapphire::Data::ExdDataGenerated* exdData ); }; +struct CutSceneIncompQuest +{ + uint32_t quest; + + CutSceneIncompQuest( uint32_t row_id, uint32_t subRow, Sapphire::Data::ExdDataGenerated* exdData ); +}; + struct CutsceneMotion { float wALK_LOOP_SPEED; @@ -2889,24 +2956,6 @@ struct Description struct DescriptionPage { uint32_t quest; - uint16_t text1; - uint32_t image1; - uint16_t text2; - uint32_t image2; - uint16_t text3; - uint32_t image3; - uint16_t text4; - uint32_t image4; - uint16_t text5; - uint32_t image5; - uint16_t text6; - uint32_t image6; - uint16_t text7; - uint32_t image7; - uint16_t text8; - uint32_t image8; - uint16_t text9; - uint32_t image9; DescriptionPage( uint32_t row_id, uint32_t subRow, Sapphire::Data::ExdDataGenerated* exdData ); }; @@ -3144,11 +3193,8 @@ struct ENpcDressUp struct ENpcDressUpDress { - bool addedIn530; uint32_t eNpc; - uint16_t addedIn531; uint16_t behavior; - uint8_t addedIn532; uint64_t modelMainHand; uint8_t dyeMainHand; uint64_t modelOffHand; @@ -3320,6 +3366,17 @@ struct EventAction EventAction( uint32_t row_id, Sapphire::Data::ExdDataGenerated* exdData ); }; +struct EventCustomIconType +{ + std::vector< uint32_t > announceQuest; + std::vector< uint32_t > announceQuestLocked; + std::vector< uint32_t > mapAnnounceQuest0; + std::vector< uint32_t > mapAnnounceQuestLocked; + std::vector< uint32_t > mapAnnounceQuest1; + + EventCustomIconType( uint32_t row_id, Sapphire::Data::ExdDataGenerated* exdData ); +}; + struct EventIconPriority { std::vector< uint32_t > icon; @@ -3388,6 +3445,15 @@ struct EventSystemDefine EventSystemDefine( uint32_t row_id, Sapphire::Data::ExdDataGenerated* exdData ); }; +struct ExportedGatheringPoint +{ + float x; + float y; + uint8_t radius; + + ExportedGatheringPoint( uint32_t row_id, Sapphire::Data::ExdDataGenerated* exdData ); +}; + struct ExportedSG { std::string sgbPath; @@ -3406,6 +3472,10 @@ struct ExVersion struct Fate { + std::string name; + std::string description; + std::string objective; + std::vector< std::string > statusText; uint8_t eurekaFate; uint8_t rule; uint16_t fateRuleEx; @@ -3422,15 +3492,12 @@ struct Fate uint16_t screenImageAccept; uint16_t screenImageComplete; uint16_t screenImageFailed; + uint32_t requiredQuest; bool specialFate; uint16_t givenStatus; bool adventEvent; bool moonFaireEvent; uint32_t fATEChain; - std::string name; - std::string description; - std::string objective; - std::vector< std::string > statusText; uint32_t arrayIndex; uint32_t reqEventItem; uint32_t turnInEventItem; @@ -3669,7 +3736,6 @@ struct Frontline04 int32_t level1; int32_t level2; int32_t level3; - std::vector< int32_t > unknownLevel; Frontline04( uint32_t row_id, Sapphire::Data::ExdDataGenerated* exdData ); }; @@ -3809,8 +3875,6 @@ struct GatheringPointBonus uint32_t conditionValue; uint8_t bonusType; uint16_t bonusValue; - bool unknown53; - uint32_t unknown54; GatheringPointBonus( uint32_t row_id, Sapphire::Data::ExdDataGenerated* exdData ); }; @@ -3882,6 +3946,19 @@ struct GcArmyCaptureTactics GcArmyCaptureTactics( uint32_t row_id, Sapphire::Data::ExdDataGenerated* exdData ); }; +struct GcArmyEquipPreset +{ + int32_t mainHand; + int32_t offHand; + int32_t head; + int32_t body; + int32_t gloves; + int32_t legs; + int32_t feet; + + GcArmyEquipPreset( uint32_t row_id, Sapphire::Data::ExdDataGenerated* exdData ); +}; + struct GcArmyExpedition { uint8_t requiredFlag; @@ -3916,6 +3993,10 @@ struct GcArmyMemberGrow { uint8_t classJob; int32_t classBook; + std::vector< uint16_t > equipPreset; + std::vector< uint8_t > physical; + std::vector< uint8_t > mental; + std::vector< uint8_t > tactical; GcArmyMemberGrow( uint32_t row_id, Sapphire::Data::ExdDataGenerated* exdData ); }; @@ -4128,7 +4209,8 @@ struct GilShop struct GilShopItem { int32_t item; - std::vector< int32_t > rowRequired; + std::vector< int32_t > questRequired; + int32_t achievementRequired; uint16_t stateRequired; uint16_t patch; @@ -4212,7 +4294,6 @@ struct GroupPoseFrame { int32_t image; std::string gridText; - int32_t unknown54; std::string text; GroupPoseFrame( uint32_t row_id, Sapphire::Data::ExdDataGenerated* exdData ); @@ -4222,8 +4303,6 @@ struct GroupPoseStamp { int32_t stampIcon; int32_t category; - int32_t unknown540; - bool unknown541; std::string name; GroupPoseStamp( uint32_t row_id, Sapphire::Data::ExdDataGenerated* exdData ); @@ -4277,7 +4356,7 @@ struct GuideTitle struct GuildleveAssignment { - uint8_t addedIn53; + std::string type; uint32_t assignmentTalk; std::vector< uint32_t > quest; @@ -4291,6 +4370,13 @@ struct GuildleveAssignmentCategory GuildleveAssignmentCategory( uint32_t row_id, Sapphire::Data::ExdDataGenerated* exdData ); }; +struct GuildleveAssignmentTalk +{ + std::vector< std::string > talk; + + GuildleveAssignmentTalk( uint32_t row_id, Sapphire::Data::ExdDataGenerated* exdData ); +}; + struct GuildOrder { uint32_t eNpcName; @@ -4477,8 +4563,12 @@ struct HousingYardObject struct HowTo { - std::vector< int16_t > images; + std::string name; + bool announce; + std::vector< int16_t > howToPagePC; + std::vector< int16_t > howToPageController; int8_t category; + uint8_t sort; HowTo( uint32_t row_id, Sapphire::Data::ExdDataGenerated* exdData ); }; @@ -4492,7 +4582,11 @@ struct HowToCategory struct HowToPage { + uint8_t type; + uint8_t iconType; int32_t image; + uint8_t textType; + std::vector< std::string > text; HowToPage( uint32_t row_id, Sapphire::Data::ExdDataGenerated* exdData ); }; @@ -4677,7 +4771,6 @@ struct IKDFishParam { uint32_t fish; uint8_t iKDContentBonus; - uint8_t unknown54; IKDFishParam( uint32_t row_id, Sapphire::Data::ExdDataGenerated* exdData ); }; @@ -4733,8 +4826,6 @@ struct InclusionShopSeries struct IndividualWeather { std::vector< uint8_t > weather; - uint8_t addedIn530; - uint8_t addedIn531; std::vector< uint32_t > quest; IndividualWeather( uint32_t row_id, Sapphire::Data::ExdDataGenerated* exdData ); @@ -4748,6 +4839,7 @@ struct InstanceContent uint16_t bGM; uint16_t winBGM; uint32_t cutscene; + uint32_t lGBEventRange; uint16_t order; uint8_t colosseum; uint32_t instanceContentTextDataBossStart; @@ -4768,8 +4860,6 @@ struct InstanceContent uint32_t instanceContentBuff; int32_t reqInstance; int16_t partyCondition; - uint16_t unknown540; - uint16_t unknown541; InstanceContent( uint32_t row_id, Sapphire::Data::ExdDataGenerated* exdData ); }; @@ -4786,8 +4876,6 @@ struct InstanceContentCSBonus { uint16_t instance; uint32_t item; - uint8_t unknown540; - uint8_t unknown541; InstanceContentCSBonus( uint32_t row_id, Sapphire::Data::ExdDataGenerated* exdData ); }; @@ -4845,7 +4933,6 @@ struct Item bool isCollectable; bool alwaysCollectable; uint16_t aetherialReduce; - uint16_t unknown54; uint8_t levelEquip; uint8_t equipRestriction; uint8_t classJobCategory; @@ -5037,6 +5124,13 @@ struct ItemUICategory ItemUICategory( uint32_t row_id, Sapphire::Data::ExdDataGenerated* exdData ); }; +struct Jingle +{ + std::string name; + + Jingle( uint32_t row_id, Sapphire::Data::ExdDataGenerated* exdData ); +}; + struct JobHudManual { uint32_t action; @@ -5239,8 +5333,6 @@ struct LotteryExchangeShop { std::vector< int32_t > itemAccepted; std::vector< uint32_t > amountAccepted; - std::vector< uint8_t > unknown540; - std::vector< uint8_t > unknown541; std::string lua; std::vector< uint32_t > logMessage; @@ -5313,6 +5405,13 @@ struct Map Map( uint32_t row_id, Sapphire::Data::ExdDataGenerated* exdData ); }; +struct MapCondition +{ + uint16_t quest; + + MapCondition( uint32_t row_id, Sapphire::Data::ExdDataGenerated* exdData ); +}; + struct MapMarker { int16_t x; @@ -5352,23 +5451,6 @@ struct Marker Marker( uint32_t row_id, Sapphire::Data::ExdDataGenerated* exdData ); }; -struct MasterpieceSupplyDuty -{ - uint8_t classJob; - uint8_t classJobLevel; - uint16_t rewardCurrency; - - MasterpieceSupplyDuty( uint32_t row_id, Sapphire::Data::ExdDataGenerated* exdData ); -}; - -struct MasterpieceSupplyMultiplier -{ - std::vector< uint16_t > xpMultiplier; - std::vector< uint16_t > currencyMultiplier; - - MasterpieceSupplyMultiplier( uint32_t row_id, Sapphire::Data::ExdDataGenerated* exdData ); -}; - struct Materia { std::vector< int32_t > item; @@ -5741,8 +5823,7 @@ struct MYCTemporaryItemUICategory struct MYCWarResultNotebook { uint8_t number; - uint8_t unknown540; - uint8_t unknown541; + uint8_t link; int32_t quest; int32_t icon; int32_t image; @@ -5827,7 +5908,6 @@ struct NpcYell float balloonTime; bool isBalloonSlow; bool battleTalkTime; - uint8_t unknown54; std::string text; NpcYell( uint32_t row_id, Sapphire::Data::ExdDataGenerated* exdData ); @@ -6000,11 +6080,19 @@ struct Perform uint16_t animationPlay02; int32_t stopAnimation; std::string instrument; + int32_t order; uint8_t transient; Perform( uint32_t row_id, Sapphire::Data::ExdDataGenerated* exdData ); }; +struct PerformGroup +{ + std::vector< uint8_t > perform; + + PerformGroup( uint32_t row_id, Sapphire::Data::ExdDataGenerated* exdData ); +}; + struct PerformTransient { std::string text; @@ -6032,6 +6120,13 @@ struct PetAction PetAction( uint32_t row_id, Sapphire::Data::ExdDataGenerated* exdData ); }; +struct PetMirage +{ + std::string name; + + PetMirage( uint32_t row_id, Sapphire::Data::ExdDataGenerated* exdData ); +}; + struct PhysicsGroup { std::vector< float > simulationTime; @@ -6142,11 +6237,12 @@ struct PublicContent std::string name; uint32_t textDataStart; uint32_t textDataEnd; + uint32_t startCutscene; + uint32_t lGBEventRange; + uint32_t lGBPopRange; uint16_t contentFinderCondition; uint16_t additionalData; - int32_t unknown540; - uint16_t unknown541; - uint16_t unknown542; + uint32_t endCutscene; PublicContent( uint32_t row_id, Sapphire::Data::ExdDataGenerated* exdData ); }; @@ -6166,14 +6262,6 @@ struct PublicContentTextData PublicContentTextData( uint32_t row_id, Sapphire::Data::ExdDataGenerated* exdData ); }; -struct Purify -{ - uint8_t _class; - uint8_t level; - - Purify( uint32_t row_id, Sapphire::Data::ExdDataGenerated* exdData ); -}; - struct PvPAction { uint16_t action; @@ -6184,7 +6272,7 @@ struct PvPAction struct PvPActionSort { - uint8_t name; + uint8_t actionType; uint16_t action; PvPActionSort( uint32_t row_id, uint32_t subRow, Sapphire::Data::ExdDataGenerated* exdData ); @@ -6285,7 +6373,7 @@ struct Quest uint8_t classJobRequired; uint16_t expFactor; uint32_t gilReward; - uint16_t gCSeals; + uint32_t gCSeals; std::vector< uint8_t > itemCatalyst; std::vector< uint8_t > itemCountCatalyst; uint8_t itemRewardType; @@ -6315,7 +6403,6 @@ struct Quest bool hideOfferIcon; uint8_t eventIconType; uint16_t sortKey; - bool unknown54; Quest( uint32_t row_id, Sapphire::Data::ExdDataGenerated* exdData ); }; @@ -6379,6 +6466,7 @@ struct QuestRedo struct QuestRedoChapterUI { uint32_t quest; + uint8_t uITab; uint8_t category; uint32_t questRedoUISmall; uint32_t questRedoUILarge; @@ -6457,7 +6545,6 @@ struct Race int32_t rSEFHands; int32_t rSEFLegs; int32_t rSEFFeet; - uint8_t unknown54; uint8_t exPac; Race( uint32_t row_id, Sapphire::Data::ExdDataGenerated* exdData ); @@ -6665,7 +6752,6 @@ struct Resident { uint64_t model; int32_t npcYell; - uint16_t addedIn53; uint8_t residentMotionType; Resident( uint32_t row_id, uint32_t subRow, Sapphire::Data::ExdDataGenerated* exdData ); @@ -6681,6 +6767,13 @@ struct ResistanceWeaponAdjust ResistanceWeaponAdjust( uint32_t row_id, Sapphire::Data::ExdDataGenerated* exdData ); }; +struct RetainerFortuneRewardRange +{ + uint16_t percentOfLevel; + + RetainerFortuneRewardRange( uint32_t row_id, Sapphire::Data::ExdDataGenerated* exdData ); +}; + struct RetainerTask { bool isRandom; @@ -6778,8 +6871,6 @@ struct SatisfactionNpc std::vector< int32_t > supplyIndex; std::vector< uint16_t > satisfactionRequired; int32_t icon; - uint8_t addedIn530; - uint8_t addedIn531; SatisfactionNpc( uint32_t row_id, Sapphire::Data::ExdDataGenerated* exdData ); }; @@ -6813,9 +6904,6 @@ struct ScenarioTree { uint8_t type; uint16_t image; - uint32_t unknown540; - std::string unknown541; - int32_t unknown542; ScenarioTree( uint32_t row_id, Sapphire::Data::ExdDataGenerated* exdData ); }; @@ -6935,6 +7023,7 @@ struct SpearfishingItem struct SpearfishingNotebook { uint8_t gatheringLevel; + bool isShadowNode; int32_t territoryType; int16_t x; int16_t y; @@ -6957,7 +7046,6 @@ struct SpecialShop { std::string name; std::vector< int32_t > questItem; - std::vector< int32_t > unknown; std::vector< int32_t > achievementUnlock; std::vector< uint16_t > patchNumber; uint8_t useCurrencyType; @@ -7154,9 +7242,7 @@ struct TerritoryType int8_t achievementIndex; bool isPvpZone; uint8_t exVersion; - uint8_t addedIn53; uint8_t mountSpeed; - bool unknown54; TerritoryType( uint32_t row_id, Sapphire::Data::ExdDataGenerated* exdData ); }; @@ -7272,7 +7358,6 @@ struct Transformation uint16_t endVFX; uint32_t action6; uint16_t action7; - bool unknown54; Transformation( uint32_t row_id, Sapphire::Data::ExdDataGenerated* exdData ); }; @@ -7377,7 +7462,6 @@ struct TripleTriadCardResident uint8_t sortKey; uint16_t order; uint8_t uIPriority; - bool unknown54; uint8_t acquisitionType; uint32_t acquisition; uint32_t location; @@ -7400,11 +7484,17 @@ struct TripleTriadCompetition TripleTriadCompetition( uint32_t row_id, Sapphire::Data::ExdDataGenerated* exdData ); }; +struct TripleTriadResident +{ + uint16_t order; + + TripleTriadResident( uint32_t row_id, Sapphire::Data::ExdDataGenerated* exdData ); +}; + struct TripleTriadRule { std::string name; std::string description; - bool unknown54; TripleTriadRule( uint32_t row_id, Sapphire::Data::ExdDataGenerated* exdData ); }; @@ -7442,6 +7532,23 @@ struct TutorialTank TutorialTank( uint32_t row_id, Sapphire::Data::ExdDataGenerated* exdData ); }; +struct UDS_Event +{ + std::string text; + std::string type; + std::vector< int32_t > property; + + UDS_Event( uint32_t row_id, Sapphire::Data::ExdDataGenerated* exdData ); +}; + +struct UDS_Property +{ + std::string text; + std::string type; + + UDS_Property( uint32_t row_id, Sapphire::Data::ExdDataGenerated* exdData ); +}; + struct UIColor { uint32_t uIForeground; @@ -7551,7 +7658,6 @@ struct WebGuidance int32_t image; uint8_t url; std::string name; - std::string unknown54; std::string description; WebGuidance( uint32_t row_id, Sapphire::Data::ExdDataGenerated* exdData ); @@ -7721,6 +7827,7 @@ struct ZoneSharedGroup xiv::exd::Exd m_AchievementCategoryDat; xiv::exd::Exd m_AchievementHideConditionDat; xiv::exd::Exd m_AchievementKindDat; + xiv::exd::Exd m_AchievementTargetDat; xiv::exd::Exd m_ActionDat; xiv::exd::Exd m_ActionCastTimelineDat; xiv::exd::Exd m_ActionCastVFXDat; @@ -7767,6 +7874,8 @@ struct ZoneSharedGroup xiv::exd::Exd m_AOZBossDat; xiv::exd::Exd m_AOZContentDat; xiv::exd::Exd m_AOZContentBriefingBNpcDat; + xiv::exd::Exd m_AOZReportDat; + xiv::exd::Exd m_AOZScoreDat; xiv::exd::Exd m_AquariumFishDat; xiv::exd::Exd m_AquariumWaterDat; xiv::exd::Exd m_ArrayEventHandlerDat; @@ -7847,6 +7956,7 @@ struct ZoneSharedGroup xiv::exd::Exd m_CompanyLeveRuleDat; xiv::exd::Exd m_CompleteJournalDat; xiv::exd::Exd m_CompleteJournalCategoryDat; + xiv::exd::Exd m_CompletionDat; xiv::exd::Exd m_ConditionDat; xiv::exd::Exd m_ConfigKeyDat; xiv::exd::Exd m_ContentCloseCycleDat; @@ -7870,6 +7980,7 @@ struct ZoneSharedGroup xiv::exd::Exd m_CraftActionDat; xiv::exd::Exd m_CraftLeveDat; xiv::exd::Exd m_CraftLevelDifferenceDat; + xiv::exd::Exd m_CraftLeveTalkDat; xiv::exd::Exd m_CraftTypeDat; xiv::exd::Exd m_CreditDat; xiv::exd::Exd m_CreditBackImageDat; @@ -7877,9 +7988,9 @@ struct ZoneSharedGroup xiv::exd::Exd m_CreditListDat; xiv::exd::Exd m_CreditListTextDat; xiv::exd::Exd m_CustomTalkDat; - xiv::exd::Exd m_CustomTalkDynamicIconDat; xiv::exd::Exd m_CustomTalkNestHandlersDat; xiv::exd::Exd m_CutsceneDat; + xiv::exd::Exd m_CutSceneIncompQuestDat; xiv::exd::Exd m_CutsceneMotionDat; xiv::exd::Exd m_CutsceneWorkIndexDat; xiv::exd::Exd m_CutScreenImageDat; @@ -7940,6 +8051,7 @@ struct ZoneSharedGroup xiv::exd::Exd m_EurekaMagiciteItemTypeDat; xiv::exd::Exd m_EurekaSphereElementAdjustDat; xiv::exd::Exd m_EventActionDat; + xiv::exd::Exd m_EventCustomIconTypeDat; xiv::exd::Exd m_EventIconPriorityDat; xiv::exd::Exd m_EventIconTypeDat; xiv::exd::Exd m_EventItemDat; @@ -7947,6 +8059,7 @@ struct ZoneSharedGroup xiv::exd::Exd m_EventItemHelpDat; xiv::exd::Exd m_EventItemTimelineDat; xiv::exd::Exd m_EventSystemDefineDat; + xiv::exd::Exd m_ExportedGatheringPointDat; xiv::exd::Exd m_ExportedSGDat; xiv::exd::Exd m_ExVersionDat; xiv::exd::Exd m_FateDat; @@ -7996,6 +8109,7 @@ struct ZoneSharedGroup xiv::exd::Exd m_GatheringSubCategoryDat; xiv::exd::Exd m_GatheringTypeDat; xiv::exd::Exd m_GcArmyCaptureTacticsDat; + xiv::exd::Exd m_GcArmyEquipPresetDat; xiv::exd::Exd m_GcArmyExpeditionDat; xiv::exd::Exd m_GcArmyExpeditionMemberBonusDat; xiv::exd::Exd m_GcArmyExpeditionTypeDat; @@ -8038,6 +8152,7 @@ struct ZoneSharedGroup xiv::exd::Exd m_GuideTitleDat; xiv::exd::Exd m_GuildleveAssignmentDat; xiv::exd::Exd m_GuildleveAssignmentCategoryDat; + xiv::exd::Exd m_GuildleveAssignmentTalkDat; xiv::exd::Exd m_GuildOrderDat; xiv::exd::Exd m_GuildOrderGuideDat; xiv::exd::Exd m_GuildOrderOfficerDat; @@ -8103,6 +8218,7 @@ struct ZoneSharedGroup xiv::exd::Exd m_ItemSortCategoryDat; xiv::exd::Exd m_ItemSpecialBonusDat; xiv::exd::Exd m_ItemUICategoryDat; + xiv::exd::Exd m_JingleDat; xiv::exd::Exd m_JobHudManualDat; xiv::exd::Exd m_JobHudManualPriorityDat; xiv::exd::Exd m_JournalCategoryDat; @@ -8129,12 +8245,11 @@ struct ZoneSharedGroup xiv::exd::Exd m_MainCommandCategoryDat; xiv::exd::Exd m_ManeuversArmorDat; xiv::exd::Exd m_MapDat; + xiv::exd::Exd m_MapConditionDat; xiv::exd::Exd m_MapMarkerDat; xiv::exd::Exd m_MapMarkerRegionDat; xiv::exd::Exd m_MapSymbolDat; xiv::exd::Exd m_MarkerDat; - xiv::exd::Exd m_MasterpieceSupplyDutyDat; - xiv::exd::Exd m_MasterpieceSupplyMultiplierDat; xiv::exd::Exd m_MateriaDat; xiv::exd::Exd m_MateriaJoinRateDat; xiv::exd::Exd m_MateriaJoinRateGatherCraftDat; @@ -8191,9 +8306,11 @@ struct ZoneSharedGroup xiv::exd::Exd m_PartyContentTextDataDat; xiv::exd::Exd m_PatchMarkDat; xiv::exd::Exd m_PerformDat; + xiv::exd::Exd m_PerformGroupDat; xiv::exd::Exd m_PerformTransientDat; xiv::exd::Exd m_PetDat; xiv::exd::Exd m_PetActionDat; + xiv::exd::Exd m_PetMirageDat; xiv::exd::Exd m_PhysicsGroupDat; xiv::exd::Exd m_PhysicsWindDat; xiv::exd::Exd m_PictureDat; @@ -8205,7 +8322,6 @@ struct ZoneSharedGroup xiv::exd::Exd m_PublicContentDat; xiv::exd::Exd m_PublicContentCutsceneDat; xiv::exd::Exd m_PublicContentTextDataDat; - xiv::exd::Exd m_PurifyDat; xiv::exd::Exd m_PvPActionDat; xiv::exd::Exd m_PvPActionSortDat; xiv::exd::Exd m_PvPRankDat; @@ -8245,6 +8361,7 @@ struct ZoneSharedGroup xiv::exd::Exd m_RelicNoteCategoryDat; xiv::exd::Exd m_ResidentDat; xiv::exd::Exd m_ResistanceWeaponAdjustDat; + xiv::exd::Exd m_RetainerFortuneRewardRangeDat; xiv::exd::Exd m_RetainerTaskDat; xiv::exd::Exd m_RetainerTaskLvRangeDat; xiv::exd::Exd m_RetainerTaskNormalDat; @@ -8309,11 +8426,14 @@ struct ZoneSharedGroup xiv::exd::Exd m_TripleTriadCardResidentDat; xiv::exd::Exd m_TripleTriadCardTypeDat; xiv::exd::Exd m_TripleTriadCompetitionDat; + xiv::exd::Exd m_TripleTriadResidentDat; xiv::exd::Exd m_TripleTriadRuleDat; xiv::exd::Exd m_TutorialDat; xiv::exd::Exd m_TutorialDPSDat; xiv::exd::Exd m_TutorialHealerDat; xiv::exd::Exd m_TutorialTankDat; + xiv::exd::Exd m_UDS_EventDat; + xiv::exd::Exd m_UDS_PropertyDat; xiv::exd::Exd m_UIColorDat; xiv::exd::Exd m_VaseFlowerDat; xiv::exd::Exd m_VFXDat; @@ -8344,6 +8464,7 @@ struct ZoneSharedGroup using AchievementCategoryPtr = std::shared_ptr< AchievementCategory >; using AchievementHideConditionPtr = std::shared_ptr< AchievementHideCondition >; using AchievementKindPtr = std::shared_ptr< AchievementKind >; + using AchievementTargetPtr = std::shared_ptr< AchievementTarget >; using ActionPtr = std::shared_ptr< Action >; using ActionCastTimelinePtr = std::shared_ptr< ActionCastTimeline >; using ActionCastVFXPtr = std::shared_ptr< ActionCastVFX >; @@ -8390,6 +8511,8 @@ struct ZoneSharedGroup using AOZBossPtr = std::shared_ptr< AOZBoss >; using AOZContentPtr = std::shared_ptr< AOZContent >; using AOZContentBriefingBNpcPtr = std::shared_ptr< AOZContentBriefingBNpc >; + using AOZReportPtr = std::shared_ptr< AOZReport >; + using AOZScorePtr = std::shared_ptr< AOZScore >; using AquariumFishPtr = std::shared_ptr< AquariumFish >; using AquariumWaterPtr = std::shared_ptr< AquariumWater >; using ArrayEventHandlerPtr = std::shared_ptr< ArrayEventHandler >; @@ -8470,6 +8593,7 @@ struct ZoneSharedGroup using CompanyLeveRulePtr = std::shared_ptr< CompanyLeveRule >; using CompleteJournalPtr = std::shared_ptr< CompleteJournal >; using CompleteJournalCategoryPtr = std::shared_ptr< CompleteJournalCategory >; + using CompletionPtr = std::shared_ptr< Completion >; using ConditionPtr = std::shared_ptr< Condition >; using ConfigKeyPtr = std::shared_ptr< ConfigKey >; using ContentCloseCyclePtr = std::shared_ptr< ContentCloseCycle >; @@ -8493,6 +8617,7 @@ struct ZoneSharedGroup using CraftActionPtr = std::shared_ptr< CraftAction >; using CraftLevePtr = std::shared_ptr< CraftLeve >; using CraftLevelDifferencePtr = std::shared_ptr< CraftLevelDifference >; + using CraftLeveTalkPtr = std::shared_ptr< CraftLeveTalk >; using CraftTypePtr = std::shared_ptr< CraftType >; using CreditPtr = std::shared_ptr< Credit >; using CreditBackImagePtr = std::shared_ptr< CreditBackImage >; @@ -8500,9 +8625,9 @@ struct ZoneSharedGroup using CreditListPtr = std::shared_ptr< CreditList >; using CreditListTextPtr = std::shared_ptr< CreditListText >; using CustomTalkPtr = std::shared_ptr< CustomTalk >; - using CustomTalkDynamicIconPtr = std::shared_ptr< CustomTalkDynamicIcon >; using CustomTalkNestHandlersPtr = std::shared_ptr< CustomTalkNestHandlers >; using CutscenePtr = std::shared_ptr< Cutscene >; + using CutSceneIncompQuestPtr = std::shared_ptr< CutSceneIncompQuest >; using CutsceneMotionPtr = std::shared_ptr< CutsceneMotion >; using CutsceneWorkIndexPtr = std::shared_ptr< CutsceneWorkIndex >; using CutScreenImagePtr = std::shared_ptr< CutScreenImage >; @@ -8563,6 +8688,7 @@ struct ZoneSharedGroup using EurekaMagiciteItemTypePtr = std::shared_ptr< EurekaMagiciteItemType >; using EurekaSphereElementAdjustPtr = std::shared_ptr< EurekaSphereElementAdjust >; using EventActionPtr = std::shared_ptr< EventAction >; + using EventCustomIconTypePtr = std::shared_ptr< EventCustomIconType >; using EventIconPriorityPtr = std::shared_ptr< EventIconPriority >; using EventIconTypePtr = std::shared_ptr< EventIconType >; using EventItemPtr = std::shared_ptr< EventItem >; @@ -8570,6 +8696,7 @@ struct ZoneSharedGroup using EventItemHelpPtr = std::shared_ptr< EventItemHelp >; using EventItemTimelinePtr = std::shared_ptr< EventItemTimeline >; using EventSystemDefinePtr = std::shared_ptr< EventSystemDefine >; + using ExportedGatheringPointPtr = std::shared_ptr< ExportedGatheringPoint >; using ExportedSGPtr = std::shared_ptr< ExportedSG >; using ExVersionPtr = std::shared_ptr< ExVersion >; using FatePtr = std::shared_ptr< Fate >; @@ -8619,6 +8746,7 @@ struct ZoneSharedGroup using GatheringSubCategoryPtr = std::shared_ptr< GatheringSubCategory >; using GatheringTypePtr = std::shared_ptr< GatheringType >; using GcArmyCaptureTacticsPtr = std::shared_ptr< GcArmyCaptureTactics >; + using GcArmyEquipPresetPtr = std::shared_ptr< GcArmyEquipPreset >; using GcArmyExpeditionPtr = std::shared_ptr< GcArmyExpedition >; using GcArmyExpeditionMemberBonusPtr = std::shared_ptr< GcArmyExpeditionMemberBonus >; using GcArmyExpeditionTypePtr = std::shared_ptr< GcArmyExpeditionType >; @@ -8661,6 +8789,7 @@ struct ZoneSharedGroup using GuideTitlePtr = std::shared_ptr< GuideTitle >; using GuildleveAssignmentPtr = std::shared_ptr< GuildleveAssignment >; using GuildleveAssignmentCategoryPtr = std::shared_ptr< GuildleveAssignmentCategory >; + using GuildleveAssignmentTalkPtr = std::shared_ptr< GuildleveAssignmentTalk >; using GuildOrderPtr = std::shared_ptr< GuildOrder >; using GuildOrderGuidePtr = std::shared_ptr< GuildOrderGuide >; using GuildOrderOfficerPtr = std::shared_ptr< GuildOrderOfficer >; @@ -8726,6 +8855,7 @@ struct ZoneSharedGroup using ItemSortCategoryPtr = std::shared_ptr< ItemSortCategory >; using ItemSpecialBonusPtr = std::shared_ptr< ItemSpecialBonus >; using ItemUICategoryPtr = std::shared_ptr< ItemUICategory >; + using JinglePtr = std::shared_ptr< Jingle >; using JobHudManualPtr = std::shared_ptr< JobHudManual >; using JobHudManualPriorityPtr = std::shared_ptr< JobHudManualPriority >; using JournalCategoryPtr = std::shared_ptr< JournalCategory >; @@ -8752,12 +8882,11 @@ struct ZoneSharedGroup using MainCommandCategoryPtr = std::shared_ptr< MainCommandCategory >; using ManeuversArmorPtr = std::shared_ptr< ManeuversArmor >; using MapPtr = std::shared_ptr< Map >; + using MapConditionPtr = std::shared_ptr< MapCondition >; 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 MateriaJoinRatePtr = std::shared_ptr< MateriaJoinRate >; using MateriaJoinRateGatherCraftPtr = std::shared_ptr< MateriaJoinRateGatherCraft >; @@ -8814,9 +8943,11 @@ struct ZoneSharedGroup using PartyContentTextDataPtr = std::shared_ptr< PartyContentTextData >; using PatchMarkPtr = std::shared_ptr< PatchMark >; using PerformPtr = std::shared_ptr< Perform >; + using PerformGroupPtr = std::shared_ptr< PerformGroup >; using PerformTransientPtr = std::shared_ptr< PerformTransient >; using PetPtr = std::shared_ptr< Pet >; using PetActionPtr = std::shared_ptr< PetAction >; + using PetMiragePtr = std::shared_ptr< PetMirage >; using PhysicsGroupPtr = std::shared_ptr< PhysicsGroup >; using PhysicsWindPtr = std::shared_ptr< PhysicsWind >; using PicturePtr = std::shared_ptr< Picture >; @@ -8828,7 +8959,6 @@ struct ZoneSharedGroup using PublicContentPtr = std::shared_ptr< PublicContent >; using PublicContentCutscenePtr = std::shared_ptr< PublicContentCutscene >; using PublicContentTextDataPtr = std::shared_ptr< PublicContentTextData >; - using PurifyPtr = std::shared_ptr< Purify >; using PvPActionPtr = std::shared_ptr< PvPAction >; using PvPActionSortPtr = std::shared_ptr< PvPActionSort >; using PvPRankPtr = std::shared_ptr< PvPRank >; @@ -8868,6 +8998,7 @@ struct ZoneSharedGroup using RelicNoteCategoryPtr = std::shared_ptr< RelicNoteCategory >; using ResidentPtr = std::shared_ptr< Resident >; using ResistanceWeaponAdjustPtr = std::shared_ptr< ResistanceWeaponAdjust >; + using RetainerFortuneRewardRangePtr = std::shared_ptr< RetainerFortuneRewardRange >; using RetainerTaskPtr = std::shared_ptr< RetainerTask >; using RetainerTaskLvRangePtr = std::shared_ptr< RetainerTaskLvRange >; using RetainerTaskNormalPtr = std::shared_ptr< RetainerTaskNormal >; @@ -8932,11 +9063,14 @@ struct ZoneSharedGroup using TripleTriadCardResidentPtr = std::shared_ptr< TripleTriadCardResident >; using TripleTriadCardTypePtr = std::shared_ptr< TripleTriadCardType >; using TripleTriadCompetitionPtr = std::shared_ptr< TripleTriadCompetition >; + using TripleTriadResidentPtr = std::shared_ptr< TripleTriadResident >; 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 UDS_EventPtr = std::shared_ptr< UDS_Event >; + using UDS_PropertyPtr = std::shared_ptr< UDS_Property >; using UIColorPtr = std::shared_ptr< UIColor >; using VaseFlowerPtr = std::shared_ptr< VaseFlower >; using VFXPtr = std::shared_ptr< VFX >; @@ -8967,6 +9101,7 @@ struct ZoneSharedGroup std::set< uint32_t > m_AchievementCategoryIdList; std::set< uint32_t > m_AchievementHideConditionIdList; std::set< uint32_t > m_AchievementKindIdList; + std::set< uint32_t > m_AchievementTargetIdList; std::set< uint32_t > m_ActionIdList; std::set< uint32_t > m_ActionCastTimelineIdList; std::set< uint32_t > m_ActionCastVFXIdList; @@ -9013,6 +9148,8 @@ struct ZoneSharedGroup std::set< uint32_t > m_AOZBossIdList; std::set< uint32_t > m_AOZContentIdList; std::set< uint32_t > m_AOZContentBriefingBNpcIdList; + std::set< uint32_t > m_AOZReportIdList; + std::set< uint32_t > m_AOZScoreIdList; std::set< uint32_t > m_AquariumFishIdList; std::set< uint32_t > m_AquariumWaterIdList; std::set< uint32_t > m_ArrayEventHandlerIdList; @@ -9093,6 +9230,7 @@ struct ZoneSharedGroup std::set< uint32_t > m_CompanyLeveRuleIdList; std::set< uint32_t > m_CompleteJournalIdList; std::set< uint32_t > m_CompleteJournalCategoryIdList; + std::set< uint32_t > m_CompletionIdList; std::set< uint32_t > m_ConditionIdList; std::set< uint32_t > m_ConfigKeyIdList; std::set< uint32_t > m_ContentCloseCycleIdList; @@ -9116,6 +9254,7 @@ struct ZoneSharedGroup std::set< uint32_t > m_CraftActionIdList; std::set< uint32_t > m_CraftLeveIdList; std::set< uint32_t > m_CraftLevelDifferenceIdList; + std::set< uint32_t > m_CraftLeveTalkIdList; std::set< uint32_t > m_CraftTypeIdList; std::set< uint32_t > m_CreditIdList; std::set< uint32_t > m_CreditBackImageIdList; @@ -9123,9 +9262,9 @@ struct ZoneSharedGroup std::set< uint32_t > m_CreditListIdList; std::set< uint32_t > m_CreditListTextIdList; std::set< uint32_t > m_CustomTalkIdList; - std::set< uint32_t > m_CustomTalkDynamicIconIdList; std::set< uint32_t > m_CustomTalkNestHandlersIdList; std::set< uint32_t > m_CutsceneIdList; + std::set< uint32_t > m_CutSceneIncompQuestIdList; std::set< uint32_t > m_CutsceneMotionIdList; std::set< uint32_t > m_CutsceneWorkIndexIdList; std::set< uint32_t > m_CutScreenImageIdList; @@ -9186,6 +9325,7 @@ struct ZoneSharedGroup std::set< uint32_t > m_EurekaMagiciteItemTypeIdList; std::set< uint32_t > m_EurekaSphereElementAdjustIdList; std::set< uint32_t > m_EventActionIdList; + std::set< uint32_t > m_EventCustomIconTypeIdList; std::set< uint32_t > m_EventIconPriorityIdList; std::set< uint32_t > m_EventIconTypeIdList; std::set< uint32_t > m_EventItemIdList; @@ -9193,6 +9333,7 @@ struct ZoneSharedGroup std::set< uint32_t > m_EventItemHelpIdList; std::set< uint32_t > m_EventItemTimelineIdList; std::set< uint32_t > m_EventSystemDefineIdList; + std::set< uint32_t > m_ExportedGatheringPointIdList; std::set< uint32_t > m_ExportedSGIdList; std::set< uint32_t > m_ExVersionIdList; std::set< uint32_t > m_FateIdList; @@ -9242,6 +9383,7 @@ struct ZoneSharedGroup std::set< uint32_t > m_GatheringSubCategoryIdList; std::set< uint32_t > m_GatheringTypeIdList; std::set< uint32_t > m_GcArmyCaptureTacticsIdList; + std::set< uint32_t > m_GcArmyEquipPresetIdList; std::set< uint32_t > m_GcArmyExpeditionIdList; std::set< uint32_t > m_GcArmyExpeditionMemberBonusIdList; std::set< uint32_t > m_GcArmyExpeditionTypeIdList; @@ -9284,6 +9426,7 @@ struct ZoneSharedGroup std::set< uint32_t > m_GuideTitleIdList; std::set< uint32_t > m_GuildleveAssignmentIdList; std::set< uint32_t > m_GuildleveAssignmentCategoryIdList; + std::set< uint32_t > m_GuildleveAssignmentTalkIdList; std::set< uint32_t > m_GuildOrderIdList; std::set< uint32_t > m_GuildOrderGuideIdList; std::set< uint32_t > m_GuildOrderOfficerIdList; @@ -9349,6 +9492,7 @@ struct ZoneSharedGroup std::set< uint32_t > m_ItemSortCategoryIdList; std::set< uint32_t > m_ItemSpecialBonusIdList; std::set< uint32_t > m_ItemUICategoryIdList; + std::set< uint32_t > m_JingleIdList; std::set< uint32_t > m_JobHudManualIdList; std::set< uint32_t > m_JobHudManualPriorityIdList; std::set< uint32_t > m_JournalCategoryIdList; @@ -9375,12 +9519,11 @@ struct ZoneSharedGroup std::set< uint32_t > m_MainCommandCategoryIdList; std::set< uint32_t > m_ManeuversArmorIdList; std::set< uint32_t > m_MapIdList; + std::set< uint32_t > m_MapConditionIdList; std::set< uint32_t > m_MapMarkerIdList; std::set< uint32_t > m_MapMarkerRegionIdList; std::set< uint32_t > m_MapSymbolIdList; std::set< uint32_t > m_MarkerIdList; - std::set< uint32_t > m_MasterpieceSupplyDutyIdList; - std::set< uint32_t > m_MasterpieceSupplyMultiplierIdList; std::set< uint32_t > m_MateriaIdList; std::set< uint32_t > m_MateriaJoinRateIdList; std::set< uint32_t > m_MateriaJoinRateGatherCraftIdList; @@ -9437,9 +9580,11 @@ struct ZoneSharedGroup std::set< uint32_t > m_PartyContentTextDataIdList; std::set< uint32_t > m_PatchMarkIdList; std::set< uint32_t > m_PerformIdList; + std::set< uint32_t > m_PerformGroupIdList; std::set< uint32_t > m_PerformTransientIdList; std::set< uint32_t > m_PetIdList; std::set< uint32_t > m_PetActionIdList; + std::set< uint32_t > m_PetMirageIdList; std::set< uint32_t > m_PhysicsGroupIdList; std::set< uint32_t > m_PhysicsWindIdList; std::set< uint32_t > m_PictureIdList; @@ -9451,7 +9596,6 @@ struct ZoneSharedGroup std::set< uint32_t > m_PublicContentIdList; std::set< uint32_t > m_PublicContentCutsceneIdList; std::set< uint32_t > m_PublicContentTextDataIdList; - std::set< uint32_t > m_PurifyIdList; std::set< uint32_t > m_PvPActionIdList; std::set< uint32_t > m_PvPActionSortIdList; std::set< uint32_t > m_PvPRankIdList; @@ -9491,6 +9635,7 @@ struct ZoneSharedGroup std::set< uint32_t > m_RelicNoteCategoryIdList; std::set< uint32_t > m_ResidentIdList; std::set< uint32_t > m_ResistanceWeaponAdjustIdList; + std::set< uint32_t > m_RetainerFortuneRewardRangeIdList; std::set< uint32_t > m_RetainerTaskIdList; std::set< uint32_t > m_RetainerTaskLvRangeIdList; std::set< uint32_t > m_RetainerTaskNormalIdList; @@ -9555,11 +9700,14 @@ struct ZoneSharedGroup std::set< uint32_t > m_TripleTriadCardResidentIdList; std::set< uint32_t > m_TripleTriadCardTypeIdList; std::set< uint32_t > m_TripleTriadCompetitionIdList; + std::set< uint32_t > m_TripleTriadResidentIdList; std::set< uint32_t > m_TripleTriadRuleIdList; std::set< uint32_t > m_TutorialIdList; std::set< uint32_t > m_TutorialDPSIdList; std::set< uint32_t > m_TutorialHealerIdList; std::set< uint32_t > m_TutorialTankIdList; + std::set< uint32_t > m_UDS_EventIdList; + std::set< uint32_t > m_UDS_PropertyIdList; std::set< uint32_t > m_UIColorIdList; std::set< uint32_t > m_VaseFlowerIdList; std::set< uint32_t > m_VFXIdList; @@ -9610,6 +9758,12 @@ const std::set< uint32_t >& getAchievementKindIdList() loadIdList( m_AchievementKindDat, m_AchievementKindIdList ); return m_AchievementKindIdList; } +const std::set< uint32_t >& getAchievementTargetIdList() +{ + if( m_AchievementTargetIdList.size() == 0 ) + loadIdList( m_AchievementTargetDat, m_AchievementTargetIdList ); + return m_AchievementTargetIdList; +} const std::set< uint32_t >& getActionIdList() { if( m_ActionIdList.size() == 0 ) @@ -9886,6 +10040,18 @@ const std::set< uint32_t >& getAOZContentBriefingBNpcIdList() loadIdList( m_AOZContentBriefingBNpcDat, m_AOZContentBriefingBNpcIdList ); return m_AOZContentBriefingBNpcIdList; } +const std::set< uint32_t >& getAOZReportIdList() +{ + if( m_AOZReportIdList.size() == 0 ) + loadIdList( m_AOZReportDat, m_AOZReportIdList ); + return m_AOZReportIdList; +} +const std::set< uint32_t >& getAOZScoreIdList() +{ + if( m_AOZScoreIdList.size() == 0 ) + loadIdList( m_AOZScoreDat, m_AOZScoreIdList ); + return m_AOZScoreIdList; +} const std::set< uint32_t >& getAquariumFishIdList() { if( m_AquariumFishIdList.size() == 0 ) @@ -10366,6 +10532,12 @@ const std::set< uint32_t >& getCompleteJournalCategoryIdList() loadIdList( m_CompleteJournalCategoryDat, m_CompleteJournalCategoryIdList ); return m_CompleteJournalCategoryIdList; } +const std::set< uint32_t >& getCompletionIdList() +{ + if( m_CompletionIdList.size() == 0 ) + loadIdList( m_CompletionDat, m_CompletionIdList ); + return m_CompletionIdList; +} const std::set< uint32_t >& getConditionIdList() { if( m_ConditionIdList.size() == 0 ) @@ -10504,6 +10676,12 @@ const std::set< uint32_t >& getCraftLevelDifferenceIdList() loadIdList( m_CraftLevelDifferenceDat, m_CraftLevelDifferenceIdList ); return m_CraftLevelDifferenceIdList; } +const std::set< uint32_t >& getCraftLeveTalkIdList() +{ + if( m_CraftLeveTalkIdList.size() == 0 ) + loadIdList( m_CraftLeveTalkDat, m_CraftLeveTalkIdList ); + return m_CraftLeveTalkIdList; +} const std::set< uint32_t >& getCraftTypeIdList() { if( m_CraftTypeIdList.size() == 0 ) @@ -10546,12 +10724,6 @@ const std::set< uint32_t >& getCustomTalkIdList() loadIdList( m_CustomTalkDat, m_CustomTalkIdList ); return m_CustomTalkIdList; } -const std::set< uint32_t >& getCustomTalkDynamicIconIdList() -{ - if( m_CustomTalkDynamicIconIdList.size() == 0 ) - loadIdList( m_CustomTalkDynamicIconDat, m_CustomTalkDynamicIconIdList ); - return m_CustomTalkDynamicIconIdList; -} const std::set< uint32_t >& getCustomTalkNestHandlersIdList() { if( m_CustomTalkNestHandlersIdList.size() == 0 ) @@ -10564,6 +10736,12 @@ const std::set< uint32_t >& getCutsceneIdList() loadIdList( m_CutsceneDat, m_CutsceneIdList ); return m_CutsceneIdList; } +const std::set< uint32_t >& getCutSceneIncompQuestIdList() +{ + if( m_CutSceneIncompQuestIdList.size() == 0 ) + loadIdList( m_CutSceneIncompQuestDat, m_CutSceneIncompQuestIdList ); + return m_CutSceneIncompQuestIdList; +} const std::set< uint32_t >& getCutsceneMotionIdList() { if( m_CutsceneMotionIdList.size() == 0 ) @@ -10924,6 +11102,12 @@ const std::set< uint32_t >& getEventActionIdList() loadIdList( m_EventActionDat, m_EventActionIdList ); return m_EventActionIdList; } +const std::set< uint32_t >& getEventCustomIconTypeIdList() +{ + if( m_EventCustomIconTypeIdList.size() == 0 ) + loadIdList( m_EventCustomIconTypeDat, m_EventCustomIconTypeIdList ); + return m_EventCustomIconTypeIdList; +} const std::set< uint32_t >& getEventIconPriorityIdList() { if( m_EventIconPriorityIdList.size() == 0 ) @@ -10966,6 +11150,12 @@ const std::set< uint32_t >& getEventSystemDefineIdList() loadIdList( m_EventSystemDefineDat, m_EventSystemDefineIdList ); return m_EventSystemDefineIdList; } +const std::set< uint32_t >& getExportedGatheringPointIdList() +{ + if( m_ExportedGatheringPointIdList.size() == 0 ) + loadIdList( m_ExportedGatheringPointDat, m_ExportedGatheringPointIdList ); + return m_ExportedGatheringPointIdList; +} const std::set< uint32_t >& getExportedSGIdList() { if( m_ExportedSGIdList.size() == 0 ) @@ -11260,6 +11450,12 @@ const std::set< uint32_t >& getGcArmyCaptureTacticsIdList() loadIdList( m_GcArmyCaptureTacticsDat, m_GcArmyCaptureTacticsIdList ); return m_GcArmyCaptureTacticsIdList; } +const std::set< uint32_t >& getGcArmyEquipPresetIdList() +{ + if( m_GcArmyEquipPresetIdList.size() == 0 ) + loadIdList( m_GcArmyEquipPresetDat, m_GcArmyEquipPresetIdList ); + return m_GcArmyEquipPresetIdList; +} const std::set< uint32_t >& getGcArmyExpeditionIdList() { if( m_GcArmyExpeditionIdList.size() == 0 ) @@ -11512,6 +11708,12 @@ const std::set< uint32_t >& getGuildleveAssignmentCategoryIdList() loadIdList( m_GuildleveAssignmentCategoryDat, m_GuildleveAssignmentCategoryIdList ); return m_GuildleveAssignmentCategoryIdList; } +const std::set< uint32_t >& getGuildleveAssignmentTalkIdList() +{ + if( m_GuildleveAssignmentTalkIdList.size() == 0 ) + loadIdList( m_GuildleveAssignmentTalkDat, m_GuildleveAssignmentTalkIdList ); + return m_GuildleveAssignmentTalkIdList; +} const std::set< uint32_t >& getGuildOrderIdList() { if( m_GuildOrderIdList.size() == 0 ) @@ -11902,6 +12104,12 @@ const std::set< uint32_t >& getItemUICategoryIdList() loadIdList( m_ItemUICategoryDat, m_ItemUICategoryIdList ); return m_ItemUICategoryIdList; } +const std::set< uint32_t >& getJingleIdList() +{ + if( m_JingleIdList.size() == 0 ) + loadIdList( m_JingleDat, m_JingleIdList ); + return m_JingleIdList; +} const std::set< uint32_t >& getJobHudManualIdList() { if( m_JobHudManualIdList.size() == 0 ) @@ -12058,6 +12266,12 @@ const std::set< uint32_t >& getMapIdList() loadIdList( m_MapDat, m_MapIdList ); return m_MapIdList; } +const std::set< uint32_t >& getMapConditionIdList() +{ + if( m_MapConditionIdList.size() == 0 ) + loadIdList( m_MapConditionDat, m_MapConditionIdList ); + return m_MapConditionIdList; +} const std::set< uint32_t >& getMapMarkerIdList() { if( m_MapMarkerIdList.size() == 0 ) @@ -12082,18 +12296,6 @@ const std::set< uint32_t >& getMarkerIdList() loadIdList( m_MarkerDat, m_MarkerIdList ); return m_MarkerIdList; } -const std::set< uint32_t >& getMasterpieceSupplyDutyIdList() -{ - if( m_MasterpieceSupplyDutyIdList.size() == 0 ) - loadIdList( m_MasterpieceSupplyDutyDat, m_MasterpieceSupplyDutyIdList ); - return m_MasterpieceSupplyDutyIdList; -} -const std::set< uint32_t >& getMasterpieceSupplyMultiplierIdList() -{ - if( m_MasterpieceSupplyMultiplierIdList.size() == 0 ) - loadIdList( m_MasterpieceSupplyMultiplierDat, m_MasterpieceSupplyMultiplierIdList ); - return m_MasterpieceSupplyMultiplierIdList; -} const std::set< uint32_t >& getMateriaIdList() { if( m_MateriaIdList.size() == 0 ) @@ -12430,6 +12632,12 @@ const std::set< uint32_t >& getPerformIdList() loadIdList( m_PerformDat, m_PerformIdList ); return m_PerformIdList; } +const std::set< uint32_t >& getPerformGroupIdList() +{ + if( m_PerformGroupIdList.size() == 0 ) + loadIdList( m_PerformGroupDat, m_PerformGroupIdList ); + return m_PerformGroupIdList; +} const std::set< uint32_t >& getPerformTransientIdList() { if( m_PerformTransientIdList.size() == 0 ) @@ -12448,6 +12656,12 @@ const std::set< uint32_t >& getPetActionIdList() loadIdList( m_PetActionDat, m_PetActionIdList ); return m_PetActionIdList; } +const std::set< uint32_t >& getPetMirageIdList() +{ + if( m_PetMirageIdList.size() == 0 ) + loadIdList( m_PetMirageDat, m_PetMirageIdList ); + return m_PetMirageIdList; +} const std::set< uint32_t >& getPhysicsGroupIdList() { if( m_PhysicsGroupIdList.size() == 0 ) @@ -12514,12 +12728,6 @@ const std::set< uint32_t >& getPublicContentTextDataIdList() loadIdList( m_PublicContentTextDataDat, m_PublicContentTextDataIdList ); return m_PublicContentTextDataIdList; } -const std::set< uint32_t >& getPurifyIdList() -{ - if( m_PurifyIdList.size() == 0 ) - loadIdList( m_PurifyDat, m_PurifyIdList ); - return m_PurifyIdList; -} const std::set< uint32_t >& getPvPActionIdList() { if( m_PvPActionIdList.size() == 0 ) @@ -12754,6 +12962,12 @@ const std::set< uint32_t >& getResistanceWeaponAdjustIdList() loadIdList( m_ResistanceWeaponAdjustDat, m_ResistanceWeaponAdjustIdList ); return m_ResistanceWeaponAdjustIdList; } +const std::set< uint32_t >& getRetainerFortuneRewardRangeIdList() +{ + if( m_RetainerFortuneRewardRangeIdList.size() == 0 ) + loadIdList( m_RetainerFortuneRewardRangeDat, m_RetainerFortuneRewardRangeIdList ); + return m_RetainerFortuneRewardRangeIdList; +} const std::set< uint32_t >& getRetainerTaskIdList() { if( m_RetainerTaskIdList.size() == 0 ) @@ -13138,6 +13352,12 @@ const std::set< uint32_t >& getTripleTriadCompetitionIdList() loadIdList( m_TripleTriadCompetitionDat, m_TripleTriadCompetitionIdList ); return m_TripleTriadCompetitionIdList; } +const std::set< uint32_t >& getTripleTriadResidentIdList() +{ + if( m_TripleTriadResidentIdList.size() == 0 ) + loadIdList( m_TripleTriadResidentDat, m_TripleTriadResidentIdList ); + return m_TripleTriadResidentIdList; +} const std::set< uint32_t >& getTripleTriadRuleIdList() { if( m_TripleTriadRuleIdList.size() == 0 ) @@ -13168,6 +13388,18 @@ const std::set< uint32_t >& getTutorialTankIdList() loadIdList( m_TutorialTankDat, m_TutorialTankIdList ); return m_TutorialTankIdList; } +const std::set< uint32_t >& getUDS_EventIdList() +{ + if( m_UDS_EventIdList.size() == 0 ) + loadIdList( m_UDS_EventDat, m_UDS_EventIdList ); + return m_UDS_EventIdList; +} +const std::set< uint32_t >& getUDS_PropertyIdList() +{ + if( m_UDS_PropertyIdList.size() == 0 ) + loadIdList( m_UDS_PropertyDat, m_UDS_PropertyIdList ); + return m_UDS_PropertyIdList; +} const std::set< uint32_t >& getUIColorIdList() { if( m_UIColorIdList.size() == 0 ) diff --git a/src/common/Network/PacketDef/Ipcs.h b/src/common/Network/PacketDef/Ipcs.h index 3bc671e5..ceb78f56 100644 --- a/src/common/Network/PacketDef/Ipcs.h +++ b/src/common/Network/PacketDef/Ipcs.h @@ -43,67 +43,67 @@ namespace Sapphire::Network::Packets */ enum ServerZoneIpcType : uint16_t { - Ping = 0x0183, // updated 5.45 hotfix - Init = 0x01EA, // updated 5.45 hotfix + Ping = 0x0289, // updated 5.55 hotfix + Init = 0x0203, // updated 5.55 hotfix - ActorFreeSpawn = 0x0185, // updated 5.45 hotfix - InitZone = 0x0233, // updated 5.45 hotfix + ActorFreeSpawn = 0x01C5, // updated 5.55 hotfix + InitZone = 0x021C, // updated 5.55 hotfix - EffectResult = 0x01D7, // updated 5.45 hotfix - ActorControl = 0x00C2, // updated 5.45 hotfix - ActorControlSelf = 0x03D5, // updated 5.45 hotfix - ActorControlTarget = 0x0171, // updated 5.45 hotfix + EffectResult = 0x01E9, // updated 5.55 hotfix + ActorControl = 0x01C8, // updated 5.55 hotfix + ActorControlSelf = 0x035A, // updated 5.55 hotfix + ActorControlTarget = 0x0338, // updated 5.55 hotfix /*! * @brief Used when resting */ - UpdateHpMpTp = 0x019B, // updated 5.45 hotfix + UpdateHpMpTp = 0x0077, // updated 5.55 hotfix /////////////////////////////////////////////////// ChatBanned = 0xF06B, - Playtime = 0x0302, // updated 5.45 hotfix - Logout = 0x012A, // updated 5.45 hotfix - CFNotify = 0x026E, // updated 5.45 hotfix + Playtime = 0x0348, // updated 5.55 hotfix + Logout = 0x0292, // updated 5.55 hotfix + CFNotify = 0x00DC, // updated 5.55 hotfix CFMemberStatus = 0x0079, - CFDutyInfo = 0x0145, // updated 5.45 hotfix + CFDutyInfo = 0x02A3, // updated 5.55 hotfix CFPlayerInNeed = 0xF07F, - CFPreferredRole = 0x012E, // updated 5.45 hotfix - CFCancel = 0x0312, // updated 5.45 hotfix + CFPreferredRole = 0x02B6, // updated 5.55 hotfix + CFCancel = 0x0262, // updated 5.55 hotfix SocialRequestError = 0xF0AD, - CFRegistered = 0x01FB, // updated 5.45 hotfix - SocialRequestResponse = 0x03A5, // updated 5.45 hotfix - SocialMessage = 0x030C, // updated 5.45 hotfix - SocialMessage2 = 0x00BB, // updated 5.45 hotfix + CFRegistered = 0x0114, // updated 5.55 hotfix + SocialRequestResponse = 0x033C, // updated 5.55 hotfix + SocialMessage = 0x0304, // updated 5.55 hotfix + SocialMessage2 = 0x01B4, // updated 5.55 hotfix CancelAllianceForming = 0x00C6, // updated 4.2 LogMessage = 0x00D0, - Chat = 0x01BA, // updated 5.45 hotfix + Chat = 0x0384, // updated 5.55 hotfix PartyChat = 0x0065, WorldVisitList = 0xF0FE, // added 4.5 - SocialList = 0x0315, // updated 5.45 hotfix + SocialList = 0x00DD, // updated 5.55 hotfix - ExamineSearchInfo = 0x035F, // updated 5.45 hotfix - UpdateSearchInfo = 0x0310, // updated 5.45 hotfix - InitSearchInfo = 0x01ED, // updated 5.45 hotfix + ExamineSearchInfo = 0x022A, // updated 5.55 hotfix + UpdateSearchInfo = 0x03DF, // updated 5.55 hotfix + InitSearchInfo = 0x00F8, // updated 5.55 hotfix ExamineSearchComment = 0x0102, // updated 4.1 - ServerNoticeShort = 0x03B4, // updated 5.45 hotfix - ServerNotice = 0x0354, // updated 5.45 hotfix - SetOnlineStatus = 0x0166, // updated 5.45 hotfix + ServerNoticeShort = 0x032D, // updated 5.55 hotfix + ServerNotice = 0x02CA, // updated 5.55 hotfix + SetOnlineStatus = 0x03A9, // updated 5.55 hotfix CountdownInitiate = 0x0237, // updated 5.25 CountdownCancel = 0x00D9, // updated 5.18 PlayerAddedToBlacklist = 0x033F, // updated 5.1 PlayerRemovedFromBlacklist = 0x0385, // updated 5.1 - BlackList = 0x02BD, // updated 5.45 hotfix + BlackList = 0x0093, // updated 5.55 hotfix - LinkshellList = 0x021A, // updated 5.45 hotfix + LinkshellList = 0x0160, // updated 5.55 hotfix MailDeleteRequest = 0xF12B, // updated 5.0 @@ -114,87 +114,87 @@ namespace Sapphire::Network::Packets MarketTaxRates = 0x01F8, // updated 5.35 hotfix - MarketBoardSearchResult = 0x01D6, // updated 5.45 hotfix - MarketBoardItemListingCount = 0x00C0, // updated 5.45 hotfix - MarketBoardItemListingHistory = 0x01C3, // updated 5.45 hotfix - MarketBoardItemListing = 0x016B, // updated 5.45 hotfix + MarketBoardSearchResult = 0x039D, // updated 5.55 hotfix + MarketBoardItemListingCount = 0x0277, // updated 5.55 hotfix + MarketBoardItemListingHistory = 0x0320, // updated 5.55 hotfix + MarketBoardItemListing = 0x026B, // updated 5.55 hotfix CharaFreeCompanyTag = 0x013B, // updated 4.5 FreeCompanyBoardMsg = 0x013C, // updated 4.5 - FreeCompanyInfo = 0x03D0, // updated 5.45 hotfix + FreeCompanyInfo = 0x0332, // updated 5.55 hotfix ExamineFreeCompanyInfo = 0xF13E, // updated 4.5 FreeCompanyUpdateShortMessage = 0xF157, // added 5.0 - StatusEffectList = 0x0243, // updated 5.45 hotfix + StatusEffectList = 0x018A, // updated 5.55 hotfix EurekaStatusEffectList = 0x0167, // updated 5.18 BossStatusEffectList = 0x0312, // added 5.1 - Effect = 0x027F, // updated 5.45 hotfix - AoeEffect8 = 0x009B, // updated 5.45 hotfix - AoeEffect16 = 0x028C, // updated 5.45 hotfix - AoeEffect24 = 0x02AD, // updated 5.45 hotfix - AoeEffect32 = 0x00A7, // updated 5.45 hotfix - PersistantEffect = 0x0244, // updated 5.45 hotfix + Effect = 0x0283, // updated 5.55 hotfix + AoeEffect8 = 0x025B, // updated 5.55 hotfix + AoeEffect16 = 0x015D, // updated 5.55 hotfix + AoeEffect24 = 0x0091, // updated 5.55 hotfix + AoeEffect32 = 0x0169, // updated 5.55 hotfix + PersistantEffect = 0x035E, // updated 5.55 hotfix - GCAffiliation = 0x0155, // updated 5.45 hotfix + GCAffiliation = 0x0258, // updated 5.55 hotfix - PlayerSpawn = 0x01AB, // updated 5.45 hotfix - NpcSpawn = 0x02C9, // updated 5.45 hotfix + PlayerSpawn = 0x02C1, // updated 5.55 hotfix + NpcSpawn = 0x00F1, // updated 5.55 hotfix NpcSpawn2 = 0x01CB, // ( Bigger statuseffectlist? ) updated 5.3 - ActorMove = 0x006B, // updated 5.45 hotfix + ActorMove = 0x009D, // updated 5.55 hotfix - ActorSetPos = 0x00C6, // updated 5.45 hotfix + ActorSetPos = 0x0266, // updated 5.55 hotfix - ActorCast = 0x034C, // updated 5.45 hotfix + ActorCast = 0x00A9, // updated 5.55 hotfix SomeCustomiseChangePacketProbably = 0x00CD, // added 5.18 - PartyList = 0x00F5, // updated 5.45 hotfix - PartyMessage = 0x01BC, // updated 5.45 hotfix - HateRank = 0x0217, // updated 5.45 hotfix - HateList = 0x00E5, // updated 5.45 hotfix - ObjectSpawn = 0x0336, // updated 5.45 hotfix - ObjectDespawn = 0x02D0, // updated 5.45 hotfix - UpdateClassInfo = 0x0179, // updated 5.45 hotfix + PartyList = 0x01B7, // updated 5.55 hotfix + PartyMessage = 0x01C1, // updated 5.55 hotfix + HateRank = 0x006E, // updated 5.55 hotfix + HateList = 0x01F1, // updated 5.55 hotfix + ObjectSpawn = 0x00FE, // updated 5.55 hotfix + ObjectDespawn = 0x0201, // updated 5.55 hotfix + UpdateClassInfo = 0x0065, // updated 5.55 hotfix SilentSetClassJob = 0xF18E, // updated 5.0 - seems to be the case, not sure if it's actually used for anything - PlayerSetup = 0x01E9, // updated 5.45 hotfix - PlayerStats = 0x01CC, // updated 5.45 hotfix - ActorOwner = 0x0153, // updated 5.45 hotfix - PlayerStateFlags = 0x02DC, // updated 5.45 hotfix - PlayerClassInfo = 0x02F0, // updated 5.45 hotfix - CharaVisualEffect = 0x026A, // updated 5.45 hotfix + PlayerSetup = 0x01E7, // updated 5.55 hotfix + PlayerStats = 0x012E, // updated 5.55 hotfix + ActorOwner = 0x00EB, // updated 5.55 hotfix + PlayerStateFlags = 0x0190, // updated 5.55 hotfix + PlayerClassInfo = 0x022B, // updated 5.55 hotfix + CharaVisualEffect = 0x033A, // updated 5.55 hotfix - ModelEquip = 0x024A, // updated 5.45 hotfix - Examine = 0x0261, // updated 5.45 hotfix - CharaNameReq = 0x0380, // updated 5.45 hotfix + ModelEquip = 0x0264, // updated 5.55 hotfix + Examine = 0x027C, // updated 5.55 hotfix + CharaNameReq = 0x02EC, // updated 5.55 hotfix // nb: see #565 on github UpdateRetainerItemSalePrice = 0xF19F, // updated 5.0 RetainerSaleHistory = 0x020E, // updated 5.21 hotfix - RetainerInformation = 0x026B, // updated 5.45 hotfix + RetainerInformation = 0x02DE, // updated 5.55 hotfix SetLevelSync = 0x1186, // not updated for 4.4, not sure what it is anymore - ItemInfo = 0x0175, // updated 5.45 hotfix - ContainerInfo = 0x0193, // updated 5.45 hotfix - InventoryTransactionFinish = 0x00BD, // updated 5.45 hotfix - InventoryTransaction = 0x02EE, // updated 5.45 hotfix - CurrencyCrystalInfo = 0x0363, // updated 5.45 hotfix + ItemInfo = 0x02D3, // updated 5.55 hotfix + ContainerInfo = 0x00CF, // updated 5.55 hotfix + InventoryTransactionFinish = 0x02EE, // updated 5.55 hotfix + InventoryTransaction = 0x02FA, // updated 5.55 hotfix + CurrencyCrystalInfo = 0x0166, // updated 5.55 hotfix - InventoryActionAck = 0x02FA, // updated 5.45 hotfix - UpdateInventorySlot = 0x017D, // updated 5.45 hotfix + InventoryActionAck = 0x027D, // updated 5.55 hotfix + UpdateInventorySlot = 0x0073, // updated 5.55 hotfix - HuntingLogEntry = 0x0232, // updated 5.45 hotfix + HuntingLogEntry = 0x0080, // updated 5.55 hotfix - EventPlay = 0x0276, // updated 5.45 hotfix - EventPlay4 = 0x028D, // updated 5.45 hotfix - EventPlay8 = 0x0318, // updated 5.45 hotfix - EventPlay16 = 0x020D, // updated 5.45 hotfix - EventPlay32 = 0x03B5, // updated 5.45 hotfix - EventPlay64 = 0x039E, // updated 5.45 hotfix - EventPlay128 = 0x02F4, // updated 5.45 hotfix - EventPlay255 = 0x009D, // updated 5.45 hotfix + EventPlay = 0x0369, // updated 5.55 hotfix + EventPlay4 = 0x0247, // updated 5.55 hotfix + EventPlay8 = 0x0227, // updated 5.55 hotfix + EventPlay16 = 0x00C5, // updated 5.55 hotfix + EventPlay32 = 0x0184, // updated 5.55 hotfix + EventPlay64 = 0x011A, // updated 5.55 hotfix + EventPlay128 = 0x01B3, // updated 5.55 hotfix + EventPlay255 = 0x0240, // updated 5.55 hotfix - EventYield = 0x0268, // updated 5.45 hotfix + EventYield = 0x02CB, // updated 5.55 hotfix //EventYield4 = 0x0000, //EventYield8 = 0x0000, //EventYield16 = 0x0000, @@ -203,89 +203,89 @@ namespace Sapphire::Network::Packets //EventYield128 = 0x0000, //EventYield255 = 0x0000, - EventStart = 0x02DE, // updated 5.45 hotfix - EventFinish = 0x01A3, // updated 5.45 hotfix + EventStart = 0x0145, // updated 5.55 hotfix + EventFinish = 0x0174, // updated 5.55 hotfix EventLinkshell = 0x1169, - QuestActiveList = 0x015A, // updated 5.45 hotfix - QuestUpdate = 0x037B, // updated 5.45 hotfix - QuestCompleteList = 0x0287, // updated 5.45 hotfix + QuestActiveList = 0x0381, // updated 5.55 hotfix + QuestUpdate = 0x031B, // updated 5.55 hotfix + QuestCompleteList = 0x031A, // updated 5.55 hotfix - QuestFinish = 0x0066, // updated 5.45 hotfix + QuestFinish = 0x00E0, // updated 5.55 hotfix MSQTrackerComplete = 0xF1D6, // updated 5.0 MSQTrackerProgress = 0xF1CD, // updated 4.5 ? this actually looks like the two opcodes have been combined, see #474 - QuestMessage = 0x017B, // updated 5.45 hotfix + QuestMessage = 0x036E, // updated 5.55 hotfix - QuestTracker = 0x01E8, // updated 5.45 hotfix + QuestTracker = 0x0294, // updated 5.55 hotfix - Mount = 0x0122, // updated 5.45 hotfix + Mount = 0x016B, // updated 5.55 hotfix - DirectorVars = 0x0252, // updated 5.45 hotfix + DirectorVars = 0x0391, // updated 5.55 hotfix SomeDirectorUnk1 = 0x0084, // updated 5.18 SomeDirectorUnk2 = 0xF0C1, // updated 5.18 - SomeDirectorUnk4 = 0x0071, // updated 5.45 hotfix + SomeDirectorUnk4 = 0x0101, // updated 5.55 hotfix SomeDirectorUnk8 = 0x028A, // updated 5.18 SomeDirectorUnk16 = 0x028C, // updated 5.18 - DirectorPopUp = 0xF162, // updated 5.18 - display dialogue pop-ups in duties and FATEs, for example, Teraflare's countdown + DirectorPopUp = 0xF162, // updated 5.18 (could be 0x02C2 in 5.55, needs confirmation - display dialogue pop-ups in duties and FATEs, for example, Teraflare's countdown DirectorPopUp4 = 0x0214, // updated 5.18 DirectorPopUp8 = 0x00F8, // updated 5.18 CFAvailableContents = 0xF1FD, // updated 4.2 - WeatherChange = 0x0167, // updated 5.45 hotfix - PlayerTitleList = 0x00F3, // updated 5.45 hotfix - Discovery = 0x0247, // updated 5.45 hotfix + WeatherChange = 0x0386, // updated 5.55 hotfix + PlayerTitleList = 0x0181, // updated 5.55 hotfix + Discovery = 0x019E, // updated 5.55 hotfix - EorzeaTimeOffset = 0x00C5, // updated 5.45 hotfix + EorzeaTimeOffset = 0x01AE, // updated 5.55 hotfix - EquipDisplayFlags = 0x0316, // updated 5.45 hotfix + EquipDisplayFlags = 0x01A3, // updated 5.55 hotfix MiniCactpotInit = 0x0286, // added 5.31 - ShopMessage = 0x02FC, // updated 5.45 hotfix - LootMessage = 0x03B8, // updated 5.45 hotfix - ResultDialog = 0x0296, // updated 5.45 hotfix - DesynthResult = 0x0323, // updated 5.45 hotfix + ShopMessage = 0x0162, // updated 5.55 hotfix + LootMessage = 0x0299, // updated 5.55 hotfix + ResultDialog = 0x025D, // updated 5.55 hotfix + DesynthResult = 0x0323, // updated 5.55 hotfix /// Housing ////////////////////////////////////// - LandSetInitialize = 0x03E2, // updated 5.45 hotfix - LandUpdate = 0x027E, // updated 5.45 hotfix - YardObjectSpawn = 0x010E, // updated 5.45 hotfix - HousingIndoorInitialize = 0x01A9, // updated 5.45 hotfix - LandPriceUpdate = 0x0379, // updated 5.45 hotfix - LandInfoSign = 0x0398, // updated 5.45 hotfix - LandRename = 0x00F6, // updated 5.45 hotfix - HousingEstateGreeting = 0x037D, // updated 5.45 hotfix - HousingUpdateLandFlagsSlot = 0x03AF, // updated 5.45 hotfix - HousingLandFlags = 0x033B, // updated 5.45 hotfix - HousingShowEstateGuestAccess = 0x01B3, // updated 5.45 hotfix + LandSetInitialize = 0x01E4, // updated 5.55 hotfix + LandUpdate = 0x012B, // updated 5.55 hotfix + YardObjectSpawn = 0x0249, // updated 5.55 hotfix + HousingIndoorInitialize = 0x0133, // updated 5.55 hotfix + LandPriceUpdate = 0x00AA, // updated 5.55 hotfix + LandInfoSign = 0x023D, // updated 5.55 hotfix + LandRename = 0x0158, // updated 5.55 hotfix + HousingEstateGreeting = 0x018D, // updated 5.55 hotfix + HousingUpdateLandFlagsSlot = 0x03C8, // updated 5.55 hotfix + HousingLandFlags = 0x037E, // updated 5.55 hotfix + HousingShowEstateGuestAccess = 0x01F8, // updated 5.55 hotfix - HousingObjectInitialize = 0x00B5, // updated 5.45 hotfix - HousingInternalObjectSpawn = 0x00BC, // updated 5.45 hotfix + HousingObjectInitialize = 0x0331, // updated 5.55 hotfix + HousingInternalObjectSpawn = 0x0092, // updated 5.55 hotfix - HousingWardInfo = 0x015E, // updated 5.45 hotfix - HousingObjectMove = 0x03E6, // updated 5.45 hotfix + HousingWardInfo = 0x0279, // updated 5.55 hotfix + HousingObjectMove = 0x0239, // updated 5.55 hotfix - SharedEstateSettingsResponse = 0x03A4, // updated 5.45 hotfix + SharedEstateSettingsResponse = 0x0263, // updated 5.55 hotfix - LandUpdateHouseName = 0x0215, // updated 5.45 hotfix + LandUpdateHouseName = 0x01D6, // updated 5.55 hotfix - LandSetMap = 0x0103, // updated 5.45 hotfix + LandSetMap = 0x01D3, // updated 5.55 hotfix ////////////////////////////////////////////////// DuelChallenge = 0x0277, // 4.2; this is responsible for opening the ui - PerformNote = 0x0248, // updated 5.45 hotfix + PerformNote = 0x038B, // updated 5.55 hotfix - PrepareZoning = 0x01EE, // updated 5.45 hotfix - ActorGauge = 0x018E, // updated 5.45 hotfix - DutyGauge = 0x00D2, // updated 5.45 hotfix + PrepareZoning = 0x00A4, // updated 5.55 hotfix + ActorGauge = 0x03B1, // updated 5.55 hotfix + DutyGauge = 0x01D3, // updated 5.55 hotfix // daily quest info -> without them sent, login will take longer... - DailyQuests = 0x02C4, // updated 5.45 hotfix - DailyQuestRepeatFlags = 0x024D, // updated 5.45 hotfix + DailyQuests = 0x0371, // updated 5.55 hotfix + DailyQuestRepeatFlags = 0x021F, // updated 5.55 hotfix /// Doman Mahjong ////////////////////////////////////// MahjongOpenGui = 0x02A4, // only available in mahjong instance @@ -294,20 +294,20 @@ namespace Sapphire::Network::Packets MahjongEndRoundTsumo = 0x02BF, // called tsumo MahjongEndRoundRon = 0x2C0, // called ron or double ron (waiting for action must be flagged from discard packet to call) MahjongTileDiscard = 0x02C1, // giri (discarding a tile.) chi(1)/pon(2)/kan(4)/ron(8) flags etc.. - MahjongPlayersInfo = 0x02C2, // actor id, name, rating and stuff.. + MahjongPlayersInfo = 0xF2C2, // actor id, name, rating and stuff.. // 2C3 and 2C4 are currently unknown MahjongEndRoundDraw = 0x02C5, // self explanatory MahjongEndGame = 0x02C6, // finished oorasu(all-last) round; shows a result screen. /// Airship & Submarine ////////////////////////////////////// - AirshipExplorationResult = 0x0131, // updated 5.45 hotfix - AirshipStatus = 0x0253, // updated 5.45 hotfix - AirshipStatusList = 0x0391, // updated 5.45 hotfix - AirshipTimers = 0x0206, // updated 5.45 hotfix - SubmarineExplorationResult = 0x00EB, // updated 5.45 hotfix - SubmarineProgressionStatus = 0x0333, // updated 5.45 hotfix - SubmarineStatusList = 0x01F2, // updated 5.45 hotfix - SubmarineTimers = 0x013B, // updated 5.45 hotfix + AirshipExplorationResult = 0x007C, // updated 5.55 hotfix + AirshipStatus = 0x00AB, // updated 5.55 hotfix + AirshipStatusList = 0x027B, // updated 5.55 hotfix + AirshipTimers = 0x02A5, // updated 5.55 hotfix + SubmarineExplorationResult = 0x0099, // updated 5.55 hotfix + SubmarineProgressionStatus = 0x0081, // updated 5.55 hotfix + SubmarineStatusList = 0x0072, // updated 5.55 hotfix + SubmarineTimers = 0x037A, // updated 5.55 hotfix }; /** @@ -315,43 +315,42 @@ namespace Sapphire::Network::Packets */ enum ClientZoneIpcType : uint16_t { - PingHandler = 0x0183, // updated 5.45 hotfix - InitHandler = 0x01EA, // updated 5.45 hotfix + PingHandler = 0x03AD, // updated 5.55 hotfix + InitHandler = 0x03DA, // updated 5.55 hotfix - FinishLoadingHandler = 0x023F, // updated 5.45 hotfix + FinishLoadingHandler = 0x0203, // updated 5.55 hotfix - CFCommenceHandler = 0x0118, // updated 5.35 hotfix + CFCommenceHandler = 0xF118, // updated 5.35 hotfix CFCancelHandler = 0x0332, // updated 5.35 hotfix CFRegisterDuty = 0x033C, // updated 5.45 hotfix CFRegisterRoulette = 0x0121, // updated 5.45 hotfix - PlayTimeHandler = 0x0096, // updated 5.45 hotfix - LogoutHandler = 0x0312, // updated 5.45 hotfix - CancelLogout = 0x0307, // updated 5.45 hotfix + PlayTimeHandler = 0x0365, // updated 5.55 hotfix + LogoutHandler = 0x039B, // updated 5.55 hotfix + CancelLogout = 0x010F, // updated 5.55 hotfix + CFDutyInfoHandler = 0xF078, // updated 4.2 - CFDutyInfoHandler = 0x0078, // updated 4.2 + SocialReqSendHandler = 0x028E, // updated 5.55 hotfix + SocialResponseHandler = 0x0373, // updated 5.55 hotfix + CreateCrossWorldLS = 0x028D, // updated 5.55 hotfix - SocialReqSendHandler = 0x0288, // updated 5.45 hotfix - SocialResponseHandler = 0x029B, // updated 5.45 hotfix - CreateCrossWorldLS = 0x00AF, // updated 4.3 - - ChatHandler = 0x00A4, // updated 5.45 hotfix + ChatHandler = 0x01B8, // updated 5.55 hotfix PartyChatHandler = 0x0065, - PartySetLeaderHandler = 0x02EF, // updated 5.45 hotfix - LeavePartyHandler = 0x017E, // updated 5.45 hotfix - KickPartyMemberHandler = 0x0070, // updated 5.45 hotfix + PartySetLeaderHandler = 0x0142, // updated 5.55 hotfix + LeavePartyHandler = 0x026C, // updated 5.55 hotfix + KickPartyMemberHandler = 0x0379, // updated 5.55 hotfix DisbandPartyHandler = 0x037A, // updated 5.45 hotfix - SocialListHandler = 0x02B0, // updated 5.45 hotfix - SetSearchInfoHandler = 0x0111, // updated 5.45 hotfix - ReqSearchInfoHandler = 0x03AC, // updated 5.45 hotfix + SocialListHandler = 0x00F2, // updated 5.55 hotfix + SetSearchInfoHandler = 0x009C, // updated 5.55 hotfix + ReqSearchInfoHandler = 0x00B1, // updated 5.55 hotfix ReqExamineSearchCommentHandler = 0x00E7, // updated 5.0 ReqRemovePlayerFromBlacklist = 0x00F1, // updated 5.0 - BlackListHandler = 0x02CD, // updated 5.45 hotfix + BlackListHandler = 0x03DE, // updated 5.55 hotfix PlayerSearchHandler = 0x00F4, // updated 5.0 - LinkshellListHandler = 0x0258, // updated 5.45 hotfix + LinkshellListHandler = 0x0291, // updated 5.55 hotfix MarketBoardRequestItemListingInfo = 0x0102, // updated 4.5 MarketBoardRequestItemListings = 0x0103, // updated 4.5 @@ -370,55 +369,55 @@ namespace Sapphire::Network::Packets ReqCountdownInitiate = 0x025F, // updated 5.35 hotfix ReqCountdownCancel = 0x0244, // updated 5.25 - ZoneLineHandler = 0x00BA, // updated 5.45 hotfix - ClientTrigger = 0x0146, // updated 5.45 hotfix + ZoneLineHandler = 0x01C2, // updated 5.55 hotfix + ClientTrigger = 0x0337, // updated 5.55 hotfix DiscoveryHandler = 0x00E3, // updated 5.35 hotfix - PlaceFieldMarkerPreset = 0x01D3, // updated 5.45 hotfix - PlaceFieldMarker = 0x0392, // updated 5.45 hotfix - SkillHandler = 0x0388, // updated 5.45 hotfix - GMCommand1 = 0x01E0, // updated 5.45 hotfix - GMCommand2 = 0x0114, // updated 5.45 hotfix - AoESkillHandler = 0x03A0, // updated 5.45 hotfix + PlaceFieldMarkerPreset = 0xF10C, // updated 5.55 hotfix + PlaceFieldMarker = 0xF2E2, // updated 5.55 hotfix + SkillHandler = 0x02A2, // updated 5.55 hotfix + GMCommand1 = 0x01F0, // updated 5.55 hotfix + GMCommand2 = 0x0068, // updated 5.55 hotfix + AoESkillHandler = 0x02F6, // updated 5.55 hotfix - UpdatePositionHandler = 0x031A, // updated 5.45 hotfix + UpdatePositionHandler = 0x024B, // updated 5.55 hotfix - InventoryModifyHandler = 0x0110, // updated 5.45 hotfix + InventoryModifyHandler = 0x01D7, // updated 5.55 hotfix InventoryEquipRecommendedItems = 0x0186, // updated 5.45 hotfix - ReqPlaceHousingItem = 0x0360, // updated 5.45 hotfix - BuildPresetHandler = 0x01D7, // updated 5.45 hotfix + ReqPlaceHousingItem = 0x023E, // updated 5.55 hotfix + BuildPresetHandler = 0x0374, // updated 5.55 hotfix - TalkEventHandler = 0x00C2, // updated 5.45 hotfix - EmoteEventHandler = 0x03D5, // updated 5.45 hotfix - WithinRangeEventHandler = 0x0171, // updated 5.45 hotfix - OutOfRangeEventHandler = 0x019B, // updated 5.45 hotfix - EnterTeriEventHandler = 0x027F, // updated 5.45 hotfix - ShopEventHandler = 0x03D4, // updated 5.45 hotfix - EventYieldHandler = 0x0230, // updated 5.45 hotfix - ReturnEventHandler = 0x02AD, // updated 5.45 hotfix - TradeReturnEventHandler = 0x00A7, // updated 5.45 hotfix - TradeMultipleReturnEventHander = 0x035C, // updated 5.35 hotfix + TalkEventHandler = 0x01E9, // updated 5.55 hotfix + EmoteEventHandler = 0xF35A, // updated 5.55 hotfix + WithinRangeEventHandler = 0x035A, // updated 5.55 hotfix + OutOfRangeEventHandler = 0x0338, // updated 5.55 hotfix + EnterTeriEventHandler = 0x0077, // updated 5.55 hotfix + ShopEventHandler = 0x0168, // updated 5.55 hotfix + EventYieldHandler = 0x02A0, // updated 5.55 hotfix + ReturnEventHandler = 0x015D, // updated 5.55 hotfix + TradeReturnEventHandler = 0x0091, // updated 5.55 hotfix + TradeReturnEventHandler2 = 0x0169, // updated 5.55 hotfix LinkshellEventHandler = 0x016B, // updated 4.5 LinkshellEventHandler1 = 0x016C, // updated 4.5 - ReqEquipDisplayFlagsChange = 0x03B0, // updated 5.45 hotfix + ReqEquipDisplayFlagsChange = 0x032B, // updated 5.55 hotfix - LandRenameHandler = 0x0187, // updated 5.45 hotfix - HousingUpdateHouseGreeting = 0x0367, // updated 5.45 hotfix - HousingUpdateObjectPosition = 0x0265, // updated 5.45 hotfix - HousingEditExterior = 0x0297, // updated 5.45 hotfix + LandRenameHandler = 0x0206, // updated 5.55 hotfix + HousingUpdateHouseGreeting = 0x0330, // updated 5.55 hotfix + HousingUpdateObjectPosition = 0x03A5, // updated 5.55 hotfix + HousingEditAppearance = 0x00D7, // updated 5.55 hotfix - SetSharedEstateSettings = 0x0146, // updated 5.45 hotfix + SetSharedEstateSettings = 0x03DC, // updated 5.55 hotfix - UpdatePositionInstance = 0x034E, // updated 5.45 hotfix + UpdatePositionInstance = 0x009D, // updated 5.55 hotfix - PerformNoteHandler = 0x0336, // updated 5.45 hotfix + PerformNoteHandler = 0x01F1, // updated 5.55 hotfix - WorldInteractionHandler = 0x02E4, // updated 5.45 hotfix - Dive = 0x00F1, // updated 5.45 hotfix + WorldInteractionHandler = 0x0343, // updated 5.55 hotfix + Dive = 0x021C, // updated 5.55 hotfix }; //////////////////////////////////////////////////////////////////////////////// diff --git a/src/common/Network/PacketDef/Zone/ClientZoneDef.h b/src/common/Network/PacketDef/Zone/ClientZoneDef.h index 678a20f2..175069c3 100644 --- a/src/common/Network/PacketDef/Zone/ClientZoneDef.h +++ b/src/common/Network/PacketDef/Zone/ClientZoneDef.h @@ -427,7 +427,7 @@ struct FFXIVIpcDive : }; struct FFXIVIpcHousingEditExterior : - FFXIVIpcBasePacket< HousingEditExterior > + FFXIVIpcBasePacket< HousingEditAppearance > { uint16_t landId; uint8_t unknown[6]; diff --git a/src/common/Network/PacketDef/Zone/ServerZoneDef.h b/src/common/Network/PacketDef/Zone/ServerZoneDef.h index 74126f05..bd1049e2 100644 --- a/src/common/Network/PacketDef/Zone/ServerZoneDef.h +++ b/src/common/Network/PacketDef/Zone/ServerZoneDef.h @@ -680,6 +680,7 @@ namespace Sapphire::Network::Packets::Server uint16_t unk; // == 0 uint16_t modelChara; uint16_t rotation; + uint16_t currentMount; uint16_t activeMinion; uint8_t spawnIndex; uint8_t state; @@ -693,24 +694,20 @@ namespace Sapphire::Network::Packets::Server uint8_t classJob; uint8_t u26d; uint16_t u27a; - uint8_t currentMount; uint8_t mountHead; uint8_t mountBody; uint8_t mountFeet; uint8_t mountColor; uint8_t scale; - - //uint32_t elementalLevel; one of these two field changed to 16bit - //uint32_t element; uint8_t elementData[6]; - + uint8_t unknown5_5[3]; Common::StatusEffect effect[30]; Common::FFXIVARR_POSITION3 pos; uint32_t models[10]; char name[32]; uint8_t look[26]; char fcTag[6]; - uint32_t unk30; + uint32_t unk30[2]; }; /** @@ -753,9 +750,10 @@ namespace Sapphire::Network::Packets::Server uint32_t displayFlags; uint16_t fateID; uint16_t mPCurr; - uint16_t unknown1; // 0 - uint16_t unknown2; // 0 or pretty big numbers > 30000 + uint16_t unknown1; + uint16_t unknown2; uint16_t modelChara; + uint16_t currentMount; uint16_t rotation; uint16_t activeMinion; uint8_t spawnIndex; @@ -770,14 +768,13 @@ namespace Sapphire::Network::Packets::Server uint8_t classJob; uint8_t u26d; uint16_t u27a; - uint8_t currentMount; uint8_t mountHead; uint8_t mountBody; uint8_t mountFeet; uint8_t mountColor; uint8_t scale; - uint16_t elementalLevel; // Eureka - uint16_t element; // Eureka + uint8_t elemental[6]; + uint8_t unknown5_5[3]; Common::StatusEffect effect[30]; Common::FFXIVARR_POSITION3 pos; uint32_t models[10]; @@ -789,7 +786,7 @@ namespace Sapphire::Network::Packets::Server uint8_t bNPCPartSlot; uint8_t unk32; uint16_t unk33; - uint32_t unk34; + uint32_t unk34[2]; }; /** @@ -1041,12 +1038,12 @@ namespace Sapphire::Network::Packets::Server unsigned char mountGuideMask[22]; unsigned char u19_2; */ - unsigned char unknown5_3a[176]; + unsigned char unknown5_55a[178]; unsigned char companionName[21]; unsigned char companionDefRank; unsigned char companionAttRank; unsigned char companionHealRank; - unsigned char mountGuideMask[27]; + unsigned char mountGuideMask[29]; //== char name[32]; unsigned char unknownOword[16]; @@ -1055,11 +1052,10 @@ namespace Sapphire::Network::Packets::Server unsigned char aetheryte[21]; unsigned char discovery[445]; unsigned char howto[34]; - unsigned char minions[53]; + unsigned char minions[55]; unsigned char chocoboTaxiMask[10]; - unsigned char watchedCutscenes[135]; - unsigned char companionBardingMask[10]; - unsigned char unknown5_45a; // companionBardingMask[11]? + unsigned char watchedCutscenes[137]; + unsigned char companionBardingMask[11]; unsigned char companionEquippedHead; unsigned char companionEquippedBody; unsigned char companionEquippedLegs; @@ -1092,12 +1088,12 @@ namespace Sapphire::Network::Packets::Server unsigned char aetherCurrentMask[22]; unsigned char u10[3]; */ - unsigned char unknown5_45c[294]; + unsigned char unknown5_55b[295]; //== - unsigned char orchestrionMask[40]; // this field may already be extended, if it is, the beginning bytes are at the end of unknown5_45c + unsigned char orchestrionMask[40]; // this field may already be extended, if it is, the beginning bytes are at the end of unknown5_55b unsigned char hallOfNoviceCompletion[3]; unsigned char animaCompletion[11]; - unsigned char unknown5_3e[33]; + unsigned char unknown5_55c[35]; unsigned char unlockedRaids[28]; unsigned char unlockedDungeons[18]; unsigned char unlockedGuildhests[10]; @@ -1117,7 +1113,7 @@ namespace Sapphire::Network::Packets::Server unsigned int exploratoryMissionNextTimestamp; unsigned char pvpLevel; */ - unsigned char unknown5_45d[8]; + unsigned char unknown5_55d[9]; //== }; diff --git a/src/scripts/quest/subquest/gridania/SubFst041.cpp b/src/scripts/quest/subquest/gridania/SubFst041.cpp index 4cede8e6..a96a19bc 100644 --- a/src/scripts/quest/subquest/gridania/SubFst041.cpp +++ b/src/scripts/quest/subquest/gridania/SubFst041.cpp @@ -132,7 +132,7 @@ private: { if( result.param2 == 1 ) { - if( player.giveQuestRewards( getId(), 0 ) ) + if( player.giveQuestRewards( getId(), result.param3 ) ) { player.setQuestUI8BH( getId(), 0 ); player.finishQuest( getId() ); diff --git a/src/world/Actor/Player.cpp b/src/world/Actor/Player.cpp index aa882b45..9c10ebb8 100644 --- a/src/world/Actor/Player.cpp +++ b/src/world/Actor/Player.cpp @@ -1591,7 +1591,7 @@ uint16_t Sapphire::Entity::Player::getCurrentCompanion() const return m_companionId; } -uint8_t Sapphire::Entity::Player::getCurrentMount() const +uint16_t Sapphire::Entity::Player::getCurrentMount() const { return m_mount; } diff --git a/src/world/Actor/Player.h b/src/world/Actor/Player.h index 8dbe9afe..81d5a599 100644 --- a/src/world/Actor/Player.h +++ b/src/world/Actor/Player.h @@ -584,7 +584,7 @@ namespace Sapphire::Entity uint16_t getCurrentCompanion() const; /*! get the current mount */ - uint8_t getCurrentMount() const; + uint16_t getCurrentMount() const; /*! set current persistent emote */ void setPersistentEmote( uint32_t emoteId ); @@ -1067,8 +1067,8 @@ namespace Sapphire::Entity uint16_t m_activeTitle; uint8_t m_titleList[48]; uint8_t m_howTo[34]; - uint8_t m_minions[40]; - uint8_t m_mountGuide[27]; + uint8_t m_minions[55]; + uint8_t m_mountGuide[29]; uint8_t m_homePoint; uint8_t m_startTown; uint16_t m_townWarpFstFlags; @@ -1076,8 +1076,8 @@ namespace Sapphire::Entity uint8_t m_discovery[445]; uint32_t m_playTime; - uint16_t m_classArray[28]; - uint32_t m_expArray[28]; + uint16_t m_classArray[ Common::CLASSJOB_SLOTS ]; + uint32_t m_expArray[ Common::CLASSJOB_SLOTS ]; uint8_t m_aetheryte[21]; uint8_t m_unlocks[64]; uint8_t m_orchestrion[40]; diff --git a/src/world/Actor/PlayerSql.cpp b/src/world/Actor/PlayerSql.cpp index 6c145cbb..1ec21bac 100644 --- a/src/world/Actor/PlayerSql.cpp +++ b/src/world/Actor/PlayerSql.cpp @@ -186,6 +186,9 @@ bool Sapphire::Entity::Player::load( uint32_t charId, World::SessionPtr pSession auto titleList = res->getBlobVector( "TitleList" ); memcpy( reinterpret_cast< char* >( m_titleList ), titleList.data(), titleList.size() ); + auto minions = res->getBlobVector( "Minions" ); + memcpy( reinterpret_cast< char* >( m_minions ), minions.data(), minions.size() ); + auto mountGuide = res->getBlobVector( "Mounts" ); memcpy( reinterpret_cast< char* >( m_mountGuide ), mountGuide.data(), mountGuide.size() ); diff --git a/src/world/Manager/DebugCommandMgr.cpp b/src/world/Manager/DebugCommandMgr.cpp index 2fea49fa..85aeeed9 100644 --- a/src/world/Manager/DebugCommandMgr.cpp +++ b/src/world/Manager/DebugCommandMgr.cpp @@ -226,22 +226,14 @@ void Sapphire::World::Manager::DebugCommandMgr::set( char* data, Entity::Player& if( player.getLevelForClass( static_cast< Common::ClassJob > ( id ) ) == 0 ) { player.setLevelForClass( 1, static_cast< Common::ClassJob > ( id ) ); - player.setClassJob( static_cast< Common::ClassJob > ( id ) ); - player.sendModel(); - player.sendItemLevel(); - player.calculateStats(); - player.sendStats(); - player.sendStatusEffectUpdate(); - player.sendStatusUpdate(); } - else - player.setClassJob( static_cast< Common::ClassJob > ( id ) ); - player.sendModel(); - player.sendItemLevel(); - player.calculateStats(); - player.sendStats(); - player.sendStatusEffectUpdate(); - player.sendStatusUpdate(); + player.setClassJob( static_cast< Common::ClassJob > ( id ) ); + player.sendModel(); + player.sendItemLevel(); + player.calculateStats(); + player.sendStats(); + player.sendStatusEffectUpdate(); + player.sendStatusUpdate(); } else if( subCommand == "cfpenalty" ) { diff --git a/src/world/Network/GameConnection.cpp b/src/world/Network/GameConnection.cpp index 95ac30c4..21f83edf 100644 --- a/src/world/Network/GameConnection.cpp +++ b/src/world/Network/GameConnection.cpp @@ -90,7 +90,7 @@ Sapphire::Network::GameConnection::GameConnection( Sapphire::Network::HivePtr pH setZoneHandler( ClientZoneIpcType::ReqPlaceHousingItem, "ReqPlaceHousingItem", &GameConnection::reqPlaceHousingItem ); setZoneHandler( ClientZoneIpcType::HousingUpdateObjectPosition, "HousingUpdateObjectPosition", &GameConnection::reqMoveHousingItem ); - setZoneHandler( ClientZoneIpcType::HousingEditExterior, "HousingEditExterior", &GameConnection::housingEditExterior ); + setZoneHandler( ClientZoneIpcType::HousingEditAppearance, "HousingEditAppearance", &GameConnection::housingEditExterior ); setZoneHandler( ClientZoneIpcType::TalkEventHandler, "EventHandlerTalk", &GameConnection::eventHandlerTalk ); setZoneHandler( ClientZoneIpcType::EmoteEventHandler, "EventHandlerEmote", &GameConnection::eventHandlerEmote ); @@ -101,10 +101,10 @@ Sapphire::Network::GameConnection::GameConnection( Sapphire::Network::HivePtr pH setZoneHandler( ClientZoneIpcType::EnterTeriEventHandler, "EventHandlerEnterTeri", &GameConnection::eventHandlerEnterTerritory ); - setZoneHandler( ClientZoneIpcType::ReturnEventHandler, "EventHandlerReturn", &GameConnection::eventHandlerReturn ); - setZoneHandler( ClientZoneIpcType::TradeReturnEventHandler, "EventHandlerReturn", + setZoneHandler( ClientZoneIpcType::ReturnEventHandler, "ReturnEventHandler", &GameConnection::eventHandlerReturn ); + setZoneHandler( ClientZoneIpcType::TradeReturnEventHandler, "TradeReturnEventHandler", &GameConnection::eventHandlerReturn ); - setZoneHandler( ClientZoneIpcType::TradeMultipleReturnEventHander, "EventHandlerReturn", &GameConnection::eventHandlerReturn ); + setZoneHandler( ClientZoneIpcType::TradeReturnEventHandler2, "TradeReturnEventHandler2", &GameConnection::eventHandlerReturn ); setZoneHandler( ClientZoneIpcType::ShopEventHandler, "ShopEventHandler", &GameConnection::eventHandlerShop ); diff --git a/src/world/Network/PacketWrappers/PlayerSetupPacket.h b/src/world/Network/PacketWrappers/PlayerSetupPacket.h index 4cd52a8a..dc176dce 100644 --- a/src/world/Network/PacketWrappers/PlayerSetupPacket.h +++ b/src/world/Network/PacketWrappers/PlayerSetupPacket.h @@ -53,7 +53,7 @@ namespace Sapphire::Network::Packets::Server memcpy( m_data.aetheryte, player.getAetheryteArray(), sizeof( m_data.aetheryte ) ); // Set the class levels and exp. - for( uint8_t i = 0; i < 25; i++ ) + for( uint8_t i = 0; i < Common::CLASSJOB_SLOTS; i++ ) { m_data.levels[ i ] = player.getClassArray()[ i ]; m_data.exp[ i ] = player.getExpArray()[ i ]; From ca663de5ed03cf91abbd9872c036738816138bd0 Mon Sep 17 00:00:00 2001 From: collett Date: Tue, 27 Jul 2021 21:08:23 +0900 Subject: [PATCH 15/43] update to 5.58, part of the opcodes are from github.com/Taezen Co-authored-by: Taezen --- src/common/Common.h | 11 +- src/common/CommonGen.h | 1508 ++++++++++++++------------- src/common/Exd/ExdDataGenerated.cpp | 95 +- src/common/Exd/ExdDataGenerated.h | 120 ++- src/common/Network/PacketDef/Ipcs.h | 412 ++++---- 5 files changed, 1183 insertions(+), 963 deletions(-) diff --git a/src/common/Common.h b/src/common/Common.h index 4e154989..749ef112 100644 --- a/src/common/Common.h +++ b/src/common/Common.h @@ -6,6 +6,7 @@ #include "CommonGen.h" #include "Vector3.h" +#include "Network/PacketDef/Ipcs.h" // +--------------------------------------------------------------------------- // The following enumerations are structures to require their type be included. @@ -51,11 +52,11 @@ namespace Sapphire::Common enum InventoryOperation : uint16_t { - Discard = 0x01DE, - Move = 0x01DF, - Swap = 0x01E0, - Split = 0x01E1, - Merge = 0x01E3, + Discard = Network::Packets::ClientZoneIpcType::InventoryModifyHandler + 7, + Move = Network::Packets::ClientZoneIpcType::InventoryModifyHandler + 8, + Swap = Network::Packets::ClientZoneIpcType::InventoryModifyHandler + 9, + Split = Network::Packets::ClientZoneIpcType::InventoryModifyHandler + 10, + Merge = Network::Packets::ClientZoneIpcType::InventoryModifyHandler + 12 }; enum ClientLanguage : uint8_t diff --git a/src/common/CommonGen.h b/src/common/CommonGen.h index a0777232..98ad9d71 100644 --- a/src/common/CommonGen.h +++ b/src/common/CommonGen.h @@ -4,753 +4,801 @@ #include /* This file has been automatically generated. - Changes will be lost upon regeneration. - To change the content edit tools/exd_common_gen */ +Changes will be lost upon regeneration. +To change the content edit tools/exd_common_gen */ namespace Sapphire::Common { -/////////////////////////////////////////////////////////// -//ActionCategory.exd -enum class ActionCategory : uint8_t -{ - None = 0, - Autoattack = 1, - Spell = 2, - Weaponskill = 3, - Ability = 4, - Item = 5, - DoLAbility = 6, - DoHAbility = 7, - Event = 8, - LimitBreak = 9, - System = 10, - Artillery = 11, - Mount = 12, - Glamour = 13, - ItemManipulation = 14, - AdrenalineRush = 15, -}; + /////////////////////////////////////////////////////////// + //ActionCategory.exd + enum class ActionCategory : uint8_t + { + None = 0, + Autoattack = 1, + Spell = 2, + Weaponskill = 3, + Ability = 4, + Item = 5, + DoLAbility = 6, + DoHAbility = 7, + Event = 8, + LimitBreak = 9, + System = 10, + Artillery = 11, + Mount = 12, + Special = 13, + ItemManipulation = 14, + AdrenalineRush = 15, + //1 = 16, + }; -/////////////////////////////////////////////////////////// -//BaseParam.exd -enum class BaseParam : uint8_t -{ - None = 0, - Strength = 1, - Dexterity = 2, - Vitality = 3, - Intelligence = 4, - Mind = 5, - Piety = 6, - HP = 7, - MP = 8, - TP = 9, - GP = 10, - CP = 11, - PhysicalDamage = 12, - MagicDamage = 13, - Delay = 14, - AdditionalEffect = 15, - AttackSpeed = 16, - BlockRate = 17, - BlockStrength = 18, - Tenacity = 19, - AttackPower = 20, - Defense = 21, - DirectHitRate = 22, - Evasion = 23, - MagicDefense = 24, - CriticalHitPower = 25, - CriticalHitResilience = 26, - CriticalHit = 27, - CriticalHitEvasion = 28, - SlashingResistance = 29, - PiercingResistance = 30, - BluntResistance = 31, - ProjectileResistance = 32, - AttackMagicPotency = 33, - HealingMagicPotency = 34, - EnhancementMagicPotency = 35, - ElementalBonus = 36, - FireResistance = 37, - IceResistance = 38, - WindResistance = 39, - EarthResistance = 40, - LightningResistance = 41, - WaterResistance = 42, - MagicResistance = 43, - Determination = 44, - SkillSpeed = 45, - SpellSpeed = 46, - Haste = 47, - Morale = 48, - Enmity = 49, - EnmityReduction = 50, - CarefulDesynthesis = 51, - EXPBonus = 52, - Regen = 53, - Refresh = 54, - MainAttribute = 55, - SecondaryAttribute = 56, - SlowResistance = 57, - PetrificationResistance = 58, - ParalysisResistance = 59, - SilenceResistance = 60, - BlindResistance = 61, - PoisonResistance = 62, - StunResistance = 63, - SleepResistance = 64, - BindResistance = 65, - HeavyResistance = 66, - DoomResistance = 67, - ReducedDurabilityLoss = 68, - IncreasedSpiritbondGain = 69, - Craftsmanship = 70, - Control = 71, - Gathering = 72, - Perception = 73, -}; + /////////////////////////////////////////////////////////// + //BaseParam.exd + enum class BaseParam : uint8_t + { + None = 0, + Strength = 1, + Dexterity = 2, + Vitality = 3, + Intelligence = 4, + Mind = 5, + Piety = 6, + HP = 7, + MP = 8, + TP = 9, + GP = 10, + CP = 11, + PhysicalDamage = 12, + MagicDamage = 13, + Delay = 14, + AdditionalEffect = 15, + AttackSpeed = 16, + BlockRate = 17, + BlockStrength = 18, + Tenacity = 19, + AttackPower = 20, + Defense = 21, + DirectHitRate = 22, + Evasion = 23, + MagicDefense = 24, + CriticalHitPower = 25, + CriticalHitResilience = 26, + CriticalHit = 27, + CriticalHitEvasion = 28, + SlashingResistance = 29, + PiercingResistance = 30, + BluntResistance = 31, + ProjectileResistance = 32, + AttackMagicPotency = 33, + HealingMagicPotency = 34, + EnhancementMagicPotency = 35, + ElementalBonus = 36, + FireResistance = 37, + IceResistance = 38, + WindResistance = 39, + EarthResistance = 40, + LightningResistance = 41, + WaterResistance = 42, + MagicResistance = 43, + Determination = 44, + SkillSpeed = 45, + SpellSpeed = 46, + Haste = 47, + Morale = 48, + Enmity = 49, + EnmityReduction = 50, + DesynthesisSkillGain = 51, + EXPBonus = 52, + Regen = 53, + Refresh = 54, + MainAttribute = 55, + SecondaryAttribute = 56, + SlowResistance = 57, + PetrificationResistance = 58, + ParalysisResistance = 59, + SilenceResistance = 60, + BlindResistance = 61, + PoisonResistance = 62, + StunResistance = 63, + SleepResistance = 64, + BindResistance = 65, + HeavyResistance = 66, + DoomResistance = 67, + ReducedDurabilityLoss = 68, + IncreasedSpiritbondGain = 69, + Craftsmanship = 70, + Control = 71, + Gathering = 72, + Perception = 73, + }; -/////////////////////////////////////////////////////////// -//BeastReputationRank.exd -enum class BeastReputationRank : uint8_t -{ - None = 0, - Neutral = 1, - Recognized = 2, - Friendly = 3, - Trusted = 4, - Respected = 5, - Honored = 6, - Sworn = 7, - Allied = 8, -}; + /////////////////////////////////////////////////////////// + //BeastReputationRank.exd + enum class BeastReputationRank : uint8_t + { + None = 0, + Neutral = 1, + Recognized = 2, + Friendly = 3, + Trusted = 4, + Respected = 5, + Honored = 6, + Sworn = 7, + Allied = 8, + }; -/////////////////////////////////////////////////////////// -//BeastTribe.exd -enum class BeastTribe : uint8_t -{ -}; + /////////////////////////////////////////////////////////// + //BeastTribe.exd + enum class BeastTribe : uint8_t + { + /* = 0, + 1 = 1, + 2 = 2, + 3 = 3, + 4 = 4, + 5 = 5, + 6 = 6, + 7 = 7, + 8 = 8, + 9 = 9, + 10 = 10, + 11 = 11, + 12 = 12, + 13 = 13, + 14 = 14,*/ + }; -/////////////////////////////////////////////////////////// -//ClassJob.exd -enum class ClassJob : uint8_t -{ - Adventurer = 0, - Gladiator = 1, - Pugilist = 2, - Marauder = 3, - Lancer = 4, - Archer = 5, - Conjurer = 6, - Thaumaturge = 7, - Carpenter = 8, - Blacksmith = 9, - Armorer = 10, - Goldsmith = 11, - Leatherworker = 12, - Weaver = 13, - Alchemist = 14, - Culinarian = 15, - Miner = 16, - Botanist = 17, - Fisher = 18, - Paladin = 19, - Monk = 20, - Warrior = 21, - Dragoon = 22, - Bard = 23, - Whitemage = 24, - Blackmage = 25, - Arcanist = 26, - Summoner = 27, - Scholar = 28, - Rogue = 29, - Ninja = 30, - Machinist = 31, - Darkknight = 32, - Astrologian = 33, - Samurai = 34, - Redmage = 35, - Bluemage = 36, - Gunbreaker = 37, - Dancer = 38, -}; + /////////////////////////////////////////////////////////// + //ClassJob.exd + enum class ClassJob : uint8_t + { + Adventurer = 0, + Gladiator = 1, + Pugilist = 2, + Marauder = 3, + Lancer = 4, + Archer = 5, + Conjurer = 6, + Thaumaturge = 7, + Carpenter = 8, + Blacksmith = 9, + Armorer = 10, + Goldsmith = 11, + Leatherworker = 12, + Weaver = 13, + Alchemist = 14, + Culinarian = 15, + Miner = 16, + Botanist = 17, + Fisher = 18, + Paladin = 19, + Monk = 20, + Warrior = 21, + Dragoon = 22, + Bard = 23, + Whitemage = 24, + Blackmage = 25, + Arcanist = 26, + Summoner = 27, + Scholar = 28, + Rogue = 29, + Ninja = 30, + Machinist = 31, + Darkknight = 32, + Astrologian = 33, + Samurai = 34, + Redmage = 35, + Bluemage = 36, + Gunbreaker = 37, + Dancer = 38, + // = 39, + //1 = 40, + }; -/////////////////////////////////////////////////////////// -//ContentType.exd -enum class ContentType : uint8_t -{ - None = 0, - DutyRoulette = 1, - Dungeons = 2, - Guildhests = 3, - Trials = 4, - Raids = 5, - PvP = 6, - QuestBattles = 7, - FATEs = 8, - TreasureHunt = 9, - Levequests = 10, - GrandCompany = 11, - Companions = 12, - BeastTribeQuests = 13, - OverallCompletion = 14, - PlayerCommendation = 15, - DisciplesoftheLand = 16, - DisciplesoftheHand = 17, - RetainerVentures = 18, - GoldSaucer = 19, - DeepDungeons = 21, - WondrousTails = 24, - CustomDeliveries = 25, - Eureka = 26, - UltimateRaids = 28, -}; + /////////////////////////////////////////////////////////// + //ContentType.exd + enum class ContentType : uint8_t + { + None = 0, + DutyRoulette = 1, + Dungeons = 2, + Guildhests = 3, + Trials = 4, + Raids = 5, + PvP = 6, + QuestBattles = 7, + FATEs = 8, + TreasureHunt = 9, + Levequests = 10, + GrandCompany = 11, + Companions = 12, + BeastTribeQuests = 13, + OverallCompletion = 14, + PlayerCommendation = 15, + DisciplesoftheLand = 16, + DisciplesoftheHand = 17, + RetainerVentures = 18, + GoldSaucer = 19, + //1 = 20, + DeepDungeons = 21, + //2 = 22, + //3 = 23, + WondrousTails = 24, + CustomDeliveries = 25, + Eureka = 26, + //4 = 27, + UltimateRaids = 28, + //5 = 29, + }; -/////////////////////////////////////////////////////////// -//EmoteCategory.exd -enum class EmoteCategory : uint8_t -{ - None = 0, - General = 1, - Special = 2, - Expressions = 3, -}; + /////////////////////////////////////////////////////////// + //EmoteCategory.exd + enum class EmoteCategory : uint8_t + { + None = 0, + General = 1, + Special = 2, + Expressions = 3, + //1 = 4, + }; -/////////////////////////////////////////////////////////// -//ExVersion.exd -enum class ExVersion : uint8_t -{ - ARealmReborn = 0, - Heavensward = 1, - Stormblood = 2, - Shadowbringers = 3, -}; + /////////////////////////////////////////////////////////// + //ExVersion.exd + enum class ExVersion : uint8_t + { + ARealmReborn = 0, + Heavensward = 1, + Stormblood = 2, + Shadowbringers = 3, + }; -/////////////////////////////////////////////////////////// -//GrandCompany.exd -enum class GrandCompany : uint8_t -{ - None = 0, - Maelstrom = 1, - OrderoftheTwinAdder = 2, - ImmortalFlames = 3, -}; + /////////////////////////////////////////////////////////// + //GrandCompany.exd + enum class GrandCompany : uint8_t + { + None = 0, + Maelstrom = 1, + OrderoftheTwinAdder = 2, + ImmortalFlames = 3, + }; -/////////////////////////////////////////////////////////// -//GuardianDeity.exd -enum class GuardianDeity : uint8_t -{ - None = 0, - HalonetheFury = 1, - MenphinatheLover = 2, - ThaliaktheScholar = 3, - NymeiatheSpinner = 4, - LlymlaentheNavigator = 5, - OschontheWanderer = 6, - ByregottheBuilder = 7, - RhalgrtheDestroyer = 8, - AzeymatheWarden = 9, - NaldthaltheTraders = 10, - NophicatheMatron = 11, - AlthyktheKeeper = 12, -}; + /////////////////////////////////////////////////////////// + //GuardianDeity.exd + enum class GuardianDeity : uint8_t + { + None = 0, + HalonetheFury = 1, + MenphinatheLover = 2, + ThaliaktheScholar = 3, + NymeiatheSpinner = 4, + LlymlaentheNavigator = 5, + OschontheWanderer = 6, + ByregottheBuilder = 7, + RhalgrtheDestroyer = 8, + AzeymatheWarden = 9, + NaldthaltheTraders = 10, + NophicatheMatron = 11, + AlthyktheKeeper = 12, + }; -/////////////////////////////////////////////////////////// -//ItemUICategory.exd -enum class ItemUICategory : uint8_t -{ - None = 0, - PugilistsArm = 1, - GladiatorsArm = 2, - MaraudersArm = 3, - ArchersArm = 4, - LancersArm = 5, - OnehandedThaumaturgesArm = 6, - TwohandedThaumaturgesArm = 7, - OnehandedConjurersArm = 8, - TwohandedConjurersArm = 9, - ArcanistsGrimoire = 10, - Shield = 11, - CarpentersPrimaryTool = 12, - CarpentersSecondaryTool = 13, - BlacksmithsPrimaryTool = 14, - BlacksmithsSecondaryTool = 15, - ArmorersPrimaryTool = 16, - ArmorersSecondaryTool = 17, - GoldsmithsPrimaryTool = 18, - GoldsmithsSecondaryTool = 19, - LeatherworkersPrimaryTool = 20, - LeatherworkersSecondaryTool = 21, - WeaversPrimaryTool = 22, - WeaversSecondaryTool = 23, - AlchemistsPrimaryTool = 24, - AlchemistsSecondaryTool = 25, - CulinariansPrimaryTool = 26, - CulinariansSecondaryTool = 27, - MinersPrimaryTool = 28, - MinersSecondaryTool = 29, - BotanistsPrimaryTool = 30, - BotanistsSecondaryTool = 31, - FishersPrimaryTool = 32, - FishingTackle = 33, - Head = 34, - Body = 35, - Legs = 36, - Hands = 37, - Feet = 38, - Waist = 39, - Necklace = 40, - Earrings = 41, - Bracelets = 42, - Ring = 43, - Medicine = 44, - Ingredient = 45, - Meal = 46, - Seafood = 47, - Stone = 48, - Metal = 49, - Lumber = 50, - Cloth = 51, - Leather = 52, - Bone = 53, - Reagent = 54, - Dye = 55, - Part = 56, - Furnishing = 57, - Materia = 58, - Crystal = 59, - Catalyst = 60, - Miscellany = 61, - SoulCrystal = 62, - Other = 63, - ConstructionPermit = 64, - Roof = 65, - ExteriorWall = 66, - Window = 67, - Door = 68, - RoofDecoration = 69, - ExteriorWallDecoration = 70, - Placard = 71, - Fence = 72, - InteriorWall = 73, - Flooring = 74, - CeilingLight = 75, - OutdoorFurnishing = 76, - Table = 77, - Tabletop = 78, - Wallmounted = 79, - Rug = 80, - Minion = 81, - Gardening = 82, - Demimateria = 83, - RoguesArm = 84, - SeasonalMiscellany = 85, - TripleTriadCard = 86, - DarkKnightsArm = 87, - MachinistsArm = 88, - AstrologiansArm = 89, - AirshipHull = 90, - AirshipRigging = 91, - AirshipAftcastle = 92, - AirshipForecastle = 93, - OrchestrionRoll = 94, - Painting = 95, - SamuraisArm = 96, - RedMagesArm = 97, - ScholarsArm = 98, - FishersSecondaryTool = 99, - Currency = 100, - SubmersibleHull = 101, - SubmersibleStern = 102, - SubmersibleBow = 103, - SubmersibleBridge = 104, - BlueMagesArm = 105, - GunbreakersArm = 106, - DancersArm = 107, -}; + /////////////////////////////////////////////////////////// + //ItemUICategory.exd + enum class ItemUICategory : uint8_t + { + None = 0, + PugilistsArm = 1, + GladiatorsArm = 2, + MaraudersArm = 3, + ArchersArm = 4, + LancersArm = 5, + OnehandedThaumaturgesArm = 6, + TwohandedThaumaturgesArm = 7, + OnehandedConjurersArm = 8, + TwohandedConjurersArm = 9, + ArcanistsGrimoire = 10, + Shield = 11, + CarpentersPrimaryTool = 12, + CarpentersSecondaryTool = 13, + BlacksmithsPrimaryTool = 14, + BlacksmithsSecondaryTool = 15, + ArmorersPrimaryTool = 16, + ArmorersSecondaryTool = 17, + GoldsmithsPrimaryTool = 18, + GoldsmithsSecondaryTool = 19, + LeatherworkersPrimaryTool = 20, + LeatherworkersSecondaryTool = 21, + WeaversPrimaryTool = 22, + WeaversSecondaryTool = 23, + AlchemistsPrimaryTool = 24, + AlchemistsSecondaryTool = 25, + CulinariansPrimaryTool = 26, + CulinariansSecondaryTool = 27, + MinersPrimaryTool = 28, + MinersSecondaryTool = 29, + BotanistsPrimaryTool = 30, + BotanistsSecondaryTool = 31, + FishersPrimaryTool = 32, + FishingTackle = 33, + Head = 34, + Body = 35, + Legs = 36, + Hands = 37, + Feet = 38, + Waist = 39, + Necklace = 40, + Earrings = 41, + Bracelets = 42, + Ring = 43, + Medicine = 44, + Ingredient = 45, + Meal = 46, + Seafood = 47, + Stone = 48, + Metal = 49, + Lumber = 50, + Cloth = 51, + Leather = 52, + Bone = 53, + Reagent = 54, + Dye = 55, + Part = 56, + Furnishing = 57, + Materia = 58, + Crystal = 59, + Catalyst = 60, + Miscellany = 61, + SoulCrystal = 62, + Other = 63, + ConstructionPermit = 64, + Roof = 65, + ExteriorWall = 66, + Window = 67, + Door = 68, + RoofDecoration = 69, + ExteriorWallDecoration = 70, + Placard = 71, + Fence = 72, + InteriorWall = 73, + Flooring = 74, + CeilingLight = 75, + OutdoorFurnishing = 76, + Table = 77, + Tabletop = 78, + Wallmounted = 79, + Rug = 80, + Minion = 81, + Gardening = 82, + Demimateria = 83, + RoguesArm = 84, + SeasonalMiscellany = 85, + TripleTriadCard = 86, + DarkKnightsArm = 87, + MachinistsArm = 88, + AstrologiansArm = 89, + AirshipHull = 90, + AirshipRigging = 91, + AirshipAftcastle = 92, + AirshipForecastle = 93, + OrchestrionRoll = 94, + Painting = 95, + SamuraisArm = 96, + RedMagesArm = 97, + ScholarsArm = 98, + FishersSecondaryTool = 99, + Currency = 100, + SubmersibleHull = 101, + SubmersibleStern = 102, + SubmersibleBow = 103, + SubmersibleBridge = 104, + BlueMagesArm = 105, + GunbreakersArm = 106, + DancersArm = 107, + }; -/////////////////////////////////////////////////////////// -//ItemSearchCategory.exd -enum class ItemSearchCategory : uint8_t -{ - None = 0, - PrimaryArms = 1, - PrimaryTools = 2, - PrimaryTools1 = 3, - Armor = 4, - Accessories = 5, - Medicines = 6, - Materials = 7, - Other = 8, - PugilistsArms = 9, - GladiatorsArms = 10, - MaraudersArms = 11, - ArchersArms = 12, - LancersArms = 13, - ThaumaturgesArms = 14, - ConjurersArms = 15, - ArcanistsArms = 16, - Shields = 17, - DancersArms = 18, - CarpentersTools = 19, - BlacksmithsTools = 20, - ArmorersTools = 21, - GoldsmithsTools = 22, - LeatherworkersTools = 23, - WeaversTools = 24, - AlchemistsTools = 25, - CulinariansTools = 26, - MinersTools = 27, - BotanistsTools = 28, - FishersTools = 29, - FishingTackle = 30, - Head = 31, - Undershirts = 32, - Body = 33, - Undergarments = 34, - Legs = 35, - Hands = 36, - Feet = 37, - Waist = 38, - Necklaces = 39, - Earrings = 40, - Bracelets = 41, - Rings = 42, - Medicine = 43, - Ingredients = 44, - Meals = 45, - Seafood = 46, - Stone = 47, - Metal = 48, - Lumber = 49, - Cloth = 50, - Leather = 51, - Bone = 52, - Reagents = 53, - Dyes = 54, - WeaponParts = 55, - Furnishings = 56, - Materia = 57, - Crystals = 58, - Catalysts = 59, - Miscellany = 60, - SoulCrystals = 61, - Arrows = 62, - QuestItems = 63, - Other1 = 64, - ExteriorFixtures = 65, - InteriorFixtures = 66, - OutdoorFurnishings = 67, - ChairsandBeds = 68, - Tables = 69, - Tabletop = 70, - Wallmounted = 71, - Rugs = 72, - RoguesArms = 73, - SeasonalMiscellany = 74, - Minions = 75, - DarkKnightsArms = 76, - MachinistsArms = 77, - AstrologiansArms = 78, - AirshipSubmersibleComponents = 79, - OrchestrionComponents = 80, - GardeningItems = 81, - Paintings = 82, - SamuraisArms = 83, - RedMagesArms = 84, - ScholarsArms = 85, - GunbreakersArms = 86, - ThrowingWeapons = 87, -}; + /////////////////////////////////////////////////////////// + //ItemSearchCategory.exd + enum class ItemSearchCategory : uint8_t + { + None = 0, + PrimaryArms = 1, + PrimaryTools = 2, + PrimaryTools1 = 3, + Armor = 4, + Accessories = 5, + Medicines = 6, + Materials = 7, + Other = 8, + PugilistsArms = 9, + GladiatorsArms = 10, + MaraudersArms = 11, + ArchersArms = 12, + LancersArms = 13, + ThaumaturgesArms = 14, + ConjurersArms = 15, + ArcanistsArms = 16, + Shields = 17, + DancersArms = 18, + CarpentersTools = 19, + BlacksmithsTools = 20, + ArmorersTools = 21, + GoldsmithsTools = 22, + LeatherworkersTools = 23, + WeaversTools = 24, + AlchemistsTools = 25, + CulinariansTools = 26, + MinersTools = 27, + BotanistsTools = 28, + FishersTools = 29, + FishingTackle = 30, + Head = 31, + Undershirts = 32, + Body = 33, + Undergarments = 34, + Legs = 35, + Hands = 36, + Feet = 37, + Waist = 38, + Necklaces = 39, + Earrings = 40, + Bracelets = 41, + Rings = 42, + Medicine = 43, + Ingredients = 44, + Meals = 45, + Seafood = 46, + Stone = 47, + Metal = 48, + Lumber = 49, + Cloth = 50, + Leather = 51, + Bone = 52, + Reagents = 53, + Dyes = 54, + WeaponParts = 55, + Furnishings = 56, + Materia = 57, + Crystals = 58, + Catalysts = 59, + Miscellany = 60, + SoulCrystals = 61, + Arrows = 62, + QuestItems = 63, + Other1 = 64, + ExteriorFixtures = 65, + InteriorFixtures = 66, + OutdoorFurnishings = 67, + ChairsandBeds = 68, + Tables = 69, + Tabletop = 70, + Wallmounted = 71, + Rugs = 72, + RoguesArms = 73, + SeasonalMiscellany = 74, + Minions = 75, + DarkKnightsArms = 76, + MachinistsArms = 77, + AstrologiansArms = 78, + AirshipSubmersibleComponents = 79, + OrchestrionComponents = 80, + GardeningItems = 81, + Paintings = 82, + SamuraisArms = 83, + RedMagesArms = 84, + ScholarsArms = 85, + GunbreakersArms = 86, + DancersArms1 = 87, + /*1 = 88, + 2 = 89, + 3 = 90, + 4 = 91, + 5 = 92, + 6 = 93, + 7 = 94, + 8 = 95, + 9 = 96, + 10 = 97, + 11 = 98, + 12 = 99, + 13 = 100,*/ + }; -/////////////////////////////////////////////////////////// -//OnlineStatus.exd -enum class OnlineStatus : uint8_t -{ - Producer = 1, - GameMaster = 2, - GameMaster1 = 3, - GameMaster2 = 4, - Disconnected = 5, - WaitingforFriendListApproval = 6, - WaitingforLinkshellApproval = 7, - WaitingforFreeCompanyApproval = 8, - NotFound = 9, - Offline = 10, - Mentor = 11, - Busy = 12, - PvP = 13, - PlayingTripleTriad = 14, - ViewingCutscene = 15, - UsingaChocoboPorter = 16, - AwayfromKeyboard = 17, - CameraMode = 18, - LookingforRepairs = 19, - LookingtoRepair = 20, - LookingtoMeldMateria = 21, - Roleplaying = 22, - LookingforParty = 23, - SwordforHire = 24, - WaitingforDutyFinder = 25, - RecruitingPartyMembers = 26, - Mentor1 = 27, - PvEMentor = 28, - TradeMentor = 29, - PvPMentor = 30, - Returner = 31, - NewAdventurer = 32, - AllianceLeader = 33, - AlliancePartyLeader = 34, - AlliancePartyMember = 35, - PartyLeader = 36, - PartyMember = 37, - PartyLeaderCrossworld = 38, - PartyMemberCrossworld = 39, - AnotherWorld = 40, - SharingDuty = 41, - SimilarDuty = 42, - InDuty = 43, - TrialAdventurer = 44, - FreeCompany = 45, - GrandCompany = 46, - Online = 47, -}; + /////////////////////////////////////////////////////////// + //OnlineStatus.exd + enum class OnlineStatus : uint8_t + { + Producer = 1, + GameMaster = 2, + GameMaster1 = 3, + GameMaster2 = 4, + Disconnected = 5, + WaitingforFriendListApproval = 6, + WaitingforLinkshellApproval = 7, + WaitingforFreeCompanyApproval = 8, + NotFound = 9, + Offline = 10, + Mentor = 11, + Busy = 12, + PvP = 13, + PlayingTripleTriad = 14, + ViewingCutscene = 15, + UsingaChocoboPorter = 16, + AwayfromKeyboard = 17, + CameraMode = 18, + LookingforRepairs = 19, + LookingtoRepair = 20, + LookingtoMeldMateria = 21, + Roleplaying = 22, + LookingforParty = 23, + SwordforHire = 24, + WaitingforDutyFinder = 25, + RecruitingPartyMembers = 26, + Mentor1 = 27, + PvEMentor = 28, + TradeMentor = 29, + PvPMentor = 30, + Returner = 31, + NewAdventurer = 32, + AllianceLeader = 33, + AlliancePartyLeader = 34, + AlliancePartyMember = 35, + PartyLeader = 36, + PartyMember = 37, + PartyLeaderCrossworld = 38, + PartyMemberCrossworld = 39, + AnotherWorld = 40, + SharingDuty = 41, + SimilarDuty = 42, + InDuty = 43, + TrialAdventurer = 44, + FreeCompany = 45, + GrandCompany = 46, + Online = 47, + }; -/////////////////////////////////////////////////////////// -//Race.exd -enum class Race : uint8_t -{ - None = 0, - Hyur = 1, - Elezen = 2, - Lalafell = 3, - Miqote = 4, - Roegadyn = 5, - AuRa = 6, - Hrothgar = 7, - Viera = 8, -}; + /////////////////////////////////////////////////////////// + //Race.exd + enum class Race : uint8_t + { + None = 0, + Hyur = 1, + Elezen = 2, + Lalafell = 3, + Miqote = 4, + Roegadyn = 5, + AuRa = 6, + Hrothgar = 7, + Viera = 8, + }; -/////////////////////////////////////////////////////////// -//Tribe.exd -enum class Tribe : uint8_t -{ - None = 0, - Midlander = 1, - Highlander = 2, - Wildwood = 3, - Duskwight = 4, - Plainsfolk = 5, - Dunesfolk = 6, - SeekeroftheSun = 7, - KeeperoftheMoon = 8, - SeaWolf = 9, - Hellsguard = 10, - Raen = 11, - Xaela = 12, - Helions = 13, - TheLost = 14, - Rava = 15, - Veena = 16, -}; + /////////////////////////////////////////////////////////// + //Tribe.exd + enum class Tribe : uint8_t + { + None = 0, + Midlander = 1, + Highlander = 2, + Wildwood = 3, + Duskwight = 4, + Plainsfolk = 5, + Dunesfolk = 6, + SeekeroftheSun = 7, + KeeperoftheMoon = 8, + SeaWolf = 9, + Hellsguard = 10, + Raen = 11, + Xaela = 12, + Helions = 13, + TheLost = 14, + Rava = 15, + Veena = 16, + }; -/////////////////////////////////////////////////////////// -//Town.exd -enum class Town : uint8_t -{ - Nowheresville = 0, - LimsaLominsa = 1, - Gridania = 2, - Uldah = 3, - Ishgard = 4, - Kugane = 7, - TheCrystarium = 10, -}; + /////////////////////////////////////////////////////////// + //Town.exd + enum class Town : uint8_t + { + Nowheresville = 0, + LimsaLominsa = 1, + Gridania = 2, + Uldah = 3, + Ishgard = 4, + // = 5, + //1 = 6, + Kugane = 7, + //2 = 8, + //3 = 9, + Crystarium = 10, + //4 = 11, + }; -/////////////////////////////////////////////////////////// -//Weather.exd -enum class Weather : uint8_t -{ - None = 0, - ClearSkies = 1, - FairSkies = 2, - Clouds = 3, - Fog = 4, - Wind = 5, - Gales = 6, - Rain = 7, - Showers = 8, - Thunder = 9, - Thunderstorms = 10, - DustStorms = 11, - Sandstorms = 12, - HotSpells = 13, - HeatWaves = 14, - Snow = 15, - Blizzards = 16, - Gloom = 17, - Auroras = 18, - Darkness = 19, - Tension = 20, - Clouds1 = 21, - StormClouds = 22, - RoughSeas = 23, - RoughSeas1 = 24, - Louring = 25, - HeatWaves1 = 26, - Gloom1 = 27, - Gales1 = 28, - Eruptions = 29, - FairSkies1 = 30, - FairSkies2 = 31, - FairSkies3 = 32, - FairSkies4 = 33, - FairSkies5 = 34, - Irradiance = 35, - CoreRadiation = 36, - CoreRadiation1 = 37, - CoreRadiation2 = 38, - CoreRadiation3 = 39, - ShelfClouds = 40, - ShelfClouds1 = 41, - ShelfClouds2 = 42, - ShelfClouds3 = 43, - Oppression = 44, - Oppression1 = 45, - Oppression2 = 46, - Oppression3 = 47, - Oppression4 = 48, - UmbralWind = 49, - UmbralStatic = 50, - Smoke = 51, - FairSkies6 = 52, - RoyalLevin = 53, - Hyperelectricity = 54, - RoyalLevin1 = 55, - Oppression5 = 56, - Thunder1 = 57, - Thunder2 = 58, - CutScene = 59, - Multiplicity = 60, - Multiplicity1 = 61, - Rain1 = 62, - FairSkies7 = 63, - Rain2 = 64, - FairSkies8 = 65, - Dragonstorms = 66, - Dragonstorms1 = 67, - Subterrain = 68, - Concordance = 69, - Concordance1 = 70, - BeyondTime = 71, - BeyondTime1 = 72, - BeyondTime2 = 73, - DemonicInfinity = 74, - DemonicInfinity1 = 75, - DemonicInfinity2 = 76, - DimensionalDisruption = 77, - DimensionalDisruption1 = 78, - DimensionalDisruption2 = 79, - Revelstorms = 80, - Revelstorms1 = 81, - EternalBliss = 82, - EternalBliss1 = 83, - Wyrmstorms = 84, - Wyrmstorms1 = 85, - Revelstorms2 = 86, - Quicklevin = 87, - Thunder3 = 88, - DimensionalDisruption3 = 89, - FairSkies9 = 90, - ClearSkies1 = 91, - WhiteCyclones = 92, - WhiteCyclones1 = 93, - WhiteCyclones2 = 94, - Ultimania = 95, - WhiteCyclones3 = 96, - Moonlight = 97, - Moonlight1 = 98, - Moonlight2 = 99, - Moonlight3 = 100, - RedMoon = 101, - Scarlet = 102, - Scarlet1 = 103, - Scarlet2 = 104, - FairSkies10 = 105, - FairSkies11 = 106, - FairSkies12 = 107, - FairSkies13 = 108, - Flames = 109, - Tsunamis = 110, - Cyclones = 111, - Geostorms = 112, - TrueBlue = 113, - TrueBlue1 = 114, - TrueBlue2 = 115, - UmbralTurbulence = 116, - TrueBlue3 = 117, - EverlastingLight = 118, - Gales2 = 119, - Termination = 120, - Termination1 = 121, - Dreams = 122, - Dreams1 = 123, - Dreams2 = 124, - Brilliance = 125, - Brilliance1 = 126, - Termination2 = 127, - Termination3 = 128, - EverlastingLight1 = 129, - Eruptions1 = 130, - Termination4 = 131, - FairSkies14 = 132, - UmbralFlare = 133, - UmbralDuststorm = 134, - UmbralLevin = 135, - UmbralTempest = 136, - Starshower = 137, - Delirium = 138, - Clouds2 = 139, - Clouds3 = 140, - Irradiance1 = 141, - Irradiance2 = 142, - StormClouds1 = 143, - Firestorm = 144, - SpectralCurrent = 145, - Climactic = 147, -}; - -/////////////////////////////////////////////////////////// -//HousingAppeal.exd -enum class HousingAppeal : uint8_t -{ - None = 0, - Emporium = 1, - Boutique = 2, - DesignerHome = 3, - MessageBook = 4, - Tavern = 5, - Eatery = 6, - ImmersiveExperience = 7, - Cafe = 8, - Aquarium = 9, - Sanctum = 10, - Venue = 11, - Florist = 12, - Library = 14, - PhotoStudio = 15, - HauntedHouse = 16, - Atelier = 17, - Bathhouse = 18, - Garden = 19, - FarEastern = 20, - VisitorsWelcome = 21, - Bakery = 22, - UnderRenovation = 23, - ConcertHall = 24, -}; + /////////////////////////////////////////////////////////// + //Weather.exd + enum class Weather : uint8_t + { + None = 0, + ClearSkies = 1, + FairSkies = 2, + Clouds = 3, + Fog = 4, + Wind = 5, + Gales = 6, + Rain = 7, + Showers = 8, + Thunder = 9, + Thunderstorms = 10, + DustStorms = 11, + Sandstorms = 12, + HotSpells = 13, + HeatWaves = 14, + Snow = 15, + Blizzards = 16, + Gloom = 17, + Auroras = 18, + Darkness = 19, + Tension = 20, + Clouds1 = 21, + StormClouds = 22, + RoughSeas = 23, + RoughSeas1 = 24, + Louring = 25, + HeatWaves1 = 26, + Gloom1 = 27, + Gales1 = 28, + Eruptions = 29, + FairSkies1 = 30, + FairSkies2 = 31, + FairSkies3 = 32, + FairSkies4 = 33, + FairSkies5 = 34, + Irradiance = 35, + CoreRadiation = 36, + CoreRadiation1 = 37, + CoreRadiation2 = 38, + CoreRadiation3 = 39, + ShelfClouds = 40, + ShelfClouds1 = 41, + ShelfClouds2 = 42, + ShelfClouds3 = 43, + Oppression = 44, + Oppression1 = 45, + Oppression2 = 46, + Oppression3 = 47, + Oppression4 = 48, + UmbralWind = 49, + UmbralStatic = 50, + Smoke = 51, + FairSkies6 = 52, + RoyalLevin = 53, + Hyperelectricity = 54, + RoyalLevin1 = 55, + Oppression5 = 56, + Thunder1 = 57, + Thunder2 = 58, + CutScene = 59, + Multiplicity = 60, + Multiplicity1 = 61, + Rain1 = 62, + FairSkies7 = 63, + Rain2 = 64, + FairSkies8 = 65, + Dragonstorms = 66, + Dragonstorms1 = 67, + Subterrain = 68, + Concordance = 69, + Concordance1 = 70, + BeyondTime = 71, + BeyondTime1 = 72, + BeyondTime2 = 73, + DemonicInfinity = 74, + DemonicInfinity1 = 75, + DemonicInfinity2 = 76, + DimensionalDisruption = 77, + DimensionalDisruption1 = 78, + DimensionalDisruption2 = 79, + Revelstorms = 80, + Revelstorms1 = 81, + EternalBliss = 82, + EternalBliss1 = 83, + Wyrmstorms = 84, + Wyrmstorms1 = 85, + Revelstorms2 = 86, + Quicklevin = 87, + Thunder3 = 88, + DimensionalDisruption3 = 89, + FairSkies9 = 90, + ClearSkies1 = 91, + WhiteCyclones = 92, + WhiteCyclones1 = 93, + WhiteCyclones2 = 94, + Ultimania = 95, + WhiteCyclones3 = 96, + Moonlight = 97, + Moonlight1 = 98, + Moonlight2 = 99, + Moonlight3 = 100, + RedMoon = 101, + Scarlet = 102, + Scarlet1 = 103, + Scarlet2 = 104, + FairSkies10 = 105, + FairSkies11 = 106, + FairSkies12 = 107, + FairSkies13 = 108, + Flames = 109, + Tsunamis = 110, + Cyclones = 111, + Geostorms = 112, + TrueBlue = 113, + TrueBlue1 = 114, + TrueBlue2 = 115, + UmbralTurbulence = 116, + TrueBlue3 = 117, + EverlastingLight = 118, + Gales2 = 119, + Termination = 120, + Termination1 = 121, + Dreams = 122, + Dreams1 = 123, + Dreams2 = 124, + Brilliance = 125, + Brilliance1 = 126, + Termination2 = 127, + Termination3 = 128, + EverlastingLight1 = 129, + Eruptions1 = 130, + Termination4 = 131, + FairSkies14 = 132, + UmbralFlare = 133, + UmbralDuststorm = 134, + UmbralLevin = 135, + UmbralTempest = 136, + Starshower = 137, + Delirium = 138, + Clouds2 = 139, + Clouds3 = 140, + Irradiance1 = 141, + Irradiance2 = 142, + StormClouds1 = 143, + Firestorm = 144, + SpectralCurrent = 145, + //1 = 146, + Climactic = 147, + //2 = 148, + //3 = 149, + //4 = 150, + //5 = 151, + //6 = 152, + //7 = 153, + }; + /////////////////////////////////////////////////////////// + //HousingAppeal.exd + enum class HousingAppeal : uint8_t + { + None = 0, + Emporium = 1, + Boutique = 2, + DesignerHome = 3, + MessageBook = 4, + Tavern = 5, + Eatery = 6, + ImmersiveExperience = 7, + Cafe = 8, + Aquarium = 9, + Sanctum = 10, + Venue = 11, + Florist = 12, + // = 13, + Library = 14, + PhotoStudio = 15, + HauntedHouse = 16, + Atelier = 17, + Bathhouse = 18, + Garden = 19, + FarEastern = 20, + VisitorsWelcome = 21, + Bakery = 22, + UnderRenovation = 23, + ConcertHall = 24, + }; } -#endif - +#endif \ No newline at end of file diff --git a/src/common/Exd/ExdDataGenerated.cpp b/src/common/Exd/ExdDataGenerated.cpp index 4f04717e..130023d6 100644 --- a/src/common/Exd/ExdDataGenerated.cpp +++ b/src/common/Exd/ExdDataGenerated.cpp @@ -23,7 +23,7 @@ Sapphire::Data::Achievement::Achievement( uint32_t row_id, Sapphire::Data::ExdDa data.push_back( exdData->getField< int32_t >( row, 21 ) ); data.push_back( exdData->getField< int32_t >( row, 22 ) ); order = exdData->getField< uint16_t >( row, 23 ); - achievementHideCondition = exdData->getField< uint8_t >( row, 24 ); + achievementHideCondition = exdData->getField< uint8_t >( row, 25 ); } Sapphire::Data::AchievementCategory::AchievementCategory( uint32_t row_id, Sapphire::Data::ExdDataGenerated* exdData ) @@ -2120,17 +2120,18 @@ Sapphire::Data::ContentFinderCondition::ContentFinderCondition( uint32_t row_id, sortKey = exdData->getField< uint16_t >( row, 42 ); image = exdData->getField< uint32_t >( row, 43 ); icon = exdData->getField< uint32_t >( row, 44 ); - levelingRoulette = exdData->getField< bool >( row, 46 ); - level506070Roulette = exdData->getField< bool >( row, 48 ); - mSQRoulette = exdData->getField< bool >( row, 49 ); - guildHestRoulette = exdData->getField< bool >( row, 50 ); - expertRoulette = exdData->getField< bool >( row, 51 ); - trialRoulette = exdData->getField< bool >( row, 52 ); - dailyFrontlineChallenge = exdData->getField< bool >( row, 53 ); - level80Roulette = exdData->getField< bool >( row, 54 ); - mentorRoulette = exdData->getField< bool >( row, 55 ); - allianceRoulette = exdData->getField< bool >( row, 61 ); - normalRaidRoulette = exdData->getField< bool >( row, 63 ); + level506070Roulette = exdData->getField< bool >( row, 46 ); + levelingRoulette = exdData->getField< bool >( row, 47 ); + mSQRoulette = exdData->getField< bool >( row, 48 ); + guildHestRoulette = exdData->getField< bool >( row, 49 ); + expertRoulette = exdData->getField< bool >( row, 50 ); + trialRoulette = exdData->getField< bool >( row, 51 ); + dailyFrontlineChallenge = exdData->getField< bool >( row, 52 ); + level80Roulette = exdData->getField< bool >( row, 53 ); + mentorRoulette = exdData->getField< bool >( row, 54 ); + allianceRoulette = exdData->getField< bool >( row, 60 ); + feastTeamRoulette = exdData->getField< bool >( row, 61 ); + normalRaidRoulette = exdData->getField< bool >( row, 62 ); } Sapphire::Data::ContentFinderConditionTransient::ContentFinderConditionTransient( uint32_t row_id, Sapphire::Data::ExdDataGenerated* exdData ) @@ -2158,10 +2159,10 @@ Sapphire::Data::ContentGaugeColor::ContentGaugeColor( uint32_t row_id, Sapphire: Sapphire::Data::ContentMemberType::ContentMemberType( uint32_t row_id, Sapphire::Data::ExdDataGenerated* exdData ) { auto row = exdData->m_ContentMemberTypeDat.get_row( row_id ); - tanksPerParty = exdData->getField< uint8_t >( row, 9 ); - healersPerParty = exdData->getField< uint8_t >( row, 10 ); - meleesPerParty = exdData->getField< uint8_t >( row, 11 ); - rangedPerParty = exdData->getField< uint8_t >( row, 12 ); + tanksPerParty = exdData->getField< uint8_t >( row, 10 ); + healersPerParty = exdData->getField< uint8_t >( row, 11 ); + meleesPerParty = exdData->getField< uint8_t >( row, 12 ); + rangedPerParty = exdData->getField< uint8_t >( row, 13 ); } Sapphire::Data::ContentNpcTalk::ContentNpcTalk( uint32_t row_id, Sapphire::Data::ExdDataGenerated* exdData ) @@ -2846,7 +2847,7 @@ Sapphire::Data::DynamicEventEnemyType::DynamicEventEnemyType( uint32_t row_id, S Sapphire::Data::DynamicEventSingleBattle::DynamicEventSingleBattle( uint32_t row_id, Sapphire::Data::ExdDataGenerated* exdData ) { auto row = exdData->m_DynamicEventSingleBattleDat.get_row( row_id ); - actionIcon = exdData->getField< int32_t >( row, 0 ); + bNpcName = exdData->getField< int32_t >( row, 0 ); icon = exdData->getField< uint32_t >( row, 1 ); text = exdData->getField< std::string >( row, 2 ); } @@ -3575,7 +3576,9 @@ Sapphire::Data::FieldMarker::FieldMarker( uint32_t row_id, Sapphire::Data::ExdDa { auto row = exdData->m_FieldMarkerDat.get_row( row_id ); vFX = exdData->getField< int32_t >( row, 0 ); - icon = exdData->getField< uint16_t >( row, 1 ); + uiIcon = exdData->getField< uint16_t >( row, 1 ); + mapIcon = exdData->getField< uint16_t >( row, 2 ); + name = exdData->getField< std::string >( row, 3 ); } Sapphire::Data::FishingRecordType::FishingRecordType( uint32_t row_id, Sapphire::Data::ExdDataGenerated* exdData ) @@ -6219,6 +6222,7 @@ Sapphire::Data::Item::Item( uint32_t row_id, Sapphire::Data::ExdDataGenerated* e materiaSlotCount = exdData->getField< uint8_t >( row, 86 ); isAdvancedMeldingPermitted = exdData->getField< bool >( row, 87 ); isPvP = exdData->getField< bool >( row, 88 ); + subStatCategory = exdData->getField< uint8_t >( row, 89 ); isGlamourous = exdData->getField< bool >( row, 90 ); for( int i = 0; i < 6; ++i ) { @@ -6464,7 +6468,7 @@ Sapphire::Data::Leve::Leve( uint32_t row_id, Sapphire::Data::ExdDataGenerated* e description = exdData->getField< std::string >( row, 1 ); leveClient = exdData->getField< int32_t >( row, 2 ); leveAssignmentType = exdData->getField< uint8_t >( row, 3 ); - town = exdData->getField< int32_t >( row, 4 ); + town = exdData->getField< int32_t >( row, 5 ); classJobLevel = exdData->getField< uint16_t >( row, 6 ); timeLimit = exdData->getField< uint8_t >( row, 7 ); allowanceCost = exdData->getField< uint8_t >( row, 8 ); @@ -8993,6 +8997,13 @@ Sapphire::Data::Quest::Quest( uint32_t row_id, Sapphire::Data::ExdDataGenerated* sortKey = exdData->getField< uint16_t >( row, 1514 ); } +Sapphire::Data::QuestAcceptAdditionCondition::QuestAcceptAdditionCondition( uint32_t row_id, Sapphire::Data::ExdDataGenerated* exdData ) +{ + auto row = exdData->m_QuestAcceptAdditionConditionDat.get_row( row_id ); + requirement0 = exdData->getField< uint32_t >( row, 0 ); + requirement1 = exdData->getField< uint32_t >( row, 1 ); +} + Sapphire::Data::QuestBattle::QuestBattle( uint32_t row_id, Sapphire::Data::ExdDataGenerated* exdData ) { auto row = exdData->m_QuestBattleDat.get_row( row_id ); @@ -9437,6 +9448,8 @@ Sapphire::Data::QuestClassJobSupply::QuestClassJobSupply( uint32_t row_id, uint3 classJobCategory = exdData->getField< uint8_t >( row, 0 ); eNpcResident = exdData->getField< uint32_t >( row, 2 ); item = exdData->getField< uint32_t >( row, 3 ); + amountRequired = exdData->getField< uint8_t >( row, 4 ); + itemHQ = exdData->getField< bool >( row, 5 ); } Sapphire::Data::QuestDerivedClass::QuestDerivedClass( uint32_t row_id, Sapphire::Data::ExdDataGenerated* exdData ) @@ -9445,6 +9458,17 @@ Sapphire::Data::QuestDerivedClass::QuestDerivedClass( uint32_t row_id, Sapphire: classJob = exdData->getField< uint8_t >( row, 0 ); } +Sapphire::Data::QuestEffect::QuestEffect( uint32_t row_id, Sapphire::Data::ExdDataGenerated* exdData ) +{ + auto row = exdData->m_QuestEffectDat.get_row( row_id ); +} + +Sapphire::Data::QuestEffectDefine::QuestEffectDefine( uint32_t row_id, uint32_t subRow, Sapphire::Data::ExdDataGenerated* exdData ) +{ + auto row = exdData->m_QuestEffectDefineDat.get_row( row_id, subRow ); + effect = exdData->getField< uint16_t >( row, 0 ); +} + Sapphire::Data::QuestRedo::QuestRedo( uint32_t row_id, Sapphire::Data::ExdDataGenerated* exdData ) { auto row = exdData->m_QuestRedoDat.get_row( row_id ); @@ -9588,6 +9612,9 @@ Sapphire::Data::RacingChocoboNameInfo::RacingChocoboNameInfo( uint32_t row_id, S { auto row = exdData->m_RacingChocoboNameInfoDat.get_row( row_id ); racingChocoboNameCategory = exdData->getField< uint8_t >( row, 0 ); + name.push_back( exdData->getField< uint16_t >( row, 5 ) ); + name.push_back( exdData->getField< uint16_t >( row, 6 ) ); + name.push_back( exdData->getField< uint16_t >( row, 7 ) ); } Sapphire::Data::RacingChocoboParam::RacingChocoboParam( uint32_t row_id, Sapphire::Data::ExdDataGenerated* exdData ) @@ -9672,6 +9699,7 @@ Sapphire::Data::RecipeLookup::RecipeLookup( uint32_t row_id, Sapphire::Data::Exd Sapphire::Data::RecipeNotebookList::RecipeNotebookList( uint32_t row_id, Sapphire::Data::ExdDataGenerated* exdData ) { auto row = exdData->m_RecipeNotebookListDat.get_row( row_id ); + count = exdData->getField< uint8_t >( row, 0 ); recipe.push_back( exdData->getField< int32_t >( row, 1 ) ); recipe.push_back( exdData->getField< int32_t >( row, 2 ) ); recipe.push_back( exdData->getField< int32_t >( row, 3 ) ); @@ -10018,6 +10046,13 @@ Sapphire::Data::RideShooting::RideShooting( uint32_t row_id, Sapphire::Data::Exd eNpcScale.push_back( exdData->getField< uint8_t >( row, 37 ) ); } +Sapphire::Data::RideShootingTargetType::RideShootingTargetType( uint32_t row_id, Sapphire::Data::ExdDataGenerated* exdData ) +{ + auto row = exdData->m_RideShootingTargetTypeDat.get_row( row_id ); + eObj = exdData->getField< uint32_t >( row, 0 ); + score = exdData->getField< int16_t >( row, 1 ); +} + Sapphire::Data::RideShootingTextData::RideShootingTextData( uint32_t row_id, Sapphire::Data::ExdDataGenerated* exdData ) { auto row = exdData->m_RideShootingTextDataDat.get_row( row_id ); @@ -10410,6 +10445,7 @@ Sapphire::Data::Stain::Stain( uint32_t row_id, Sapphire::Data::ExdDataGenerated* auto row = exdData->m_StainDat.get_row( row_id ); color = exdData->getField< uint32_t >( row, 0 ); shade = exdData->getField< uint8_t >( row, 1 ); + subOrder = exdData->getField< uint8_t >( row, 2 ); name = exdData->getField< std::string >( row, 3 ); } @@ -10420,6 +10456,13 @@ Sapphire::Data::StainTransient::StainTransient( uint32_t row_id, Sapphire::Data: item2 = exdData->getField< uint32_t >( row, 1 ); } +Sapphire::Data::StanceChange::StanceChange( uint32_t row_id, Sapphire::Data::ExdDataGenerated* exdData ) +{ + auto row = exdData->m_StanceChangeDat.get_row( row_id ); + action.push_back( exdData->getField< uint16_t >( row, 1 ) ); + action.push_back( exdData->getField< uint16_t >( row, 2 ) ); +} + Sapphire::Data::Status::Status( uint32_t row_id, Sapphire::Data::ExdDataGenerated* exdData ) { auto row = exdData->m_StatusDat.get_row( row_id ); @@ -12399,6 +12442,7 @@ Sapphire::Data::TerritoryType::TerritoryType( uint32_t row_id, Sapphire::Data::E loadingImage = exdData->getField< uint8_t >( row, 7 ); exclusiveType = exdData->getField< uint8_t >( row, 8 ); territoryIntendedUse = exdData->getField< uint8_t >( row, 9 ); + contentFinderCondition = exdData->getField< uint16_t >( row, 10 ); weatherRate = exdData->getField< uint8_t >( row, 12 ); pCSearch = exdData->getField< bool >( row, 15 ); stealth = exdData->getField< bool >( row, 16 ); @@ -12431,6 +12475,13 @@ Sapphire::Data::TextCommand::TextCommand( uint32_t row_id, Sapphire::Data::ExdDa description = exdData->getField< std::string >( row, 7 ); alias = exdData->getField< std::string >( row, 8 ); shortAlias = exdData->getField< std::string >( row, 9 ); + param = exdData->getField< uint16_t >( row, 10 ); +} + +Sapphire::Data::TextCommandParam::TextCommandParam( uint32_t row_id, Sapphire::Data::ExdDataGenerated* exdData ) +{ + auto row = exdData->m_TextCommandParamDat.get_row( row_id ); + param = exdData->getField< std::string >( row, 0 ); } Sapphire::Data::Title::Title( uint32_t row_id, Sapphire::Data::ExdDataGenerated* exdData ) @@ -13509,11 +13560,14 @@ bool Sapphire::Data::ExdDataGenerated::init( const std::string& path ) m_PvPSelectTraitDat = setupDatAccess( "PvPSelectTrait", xiv::exd::Language::en ); m_PvPTraitDat = setupDatAccess( "PvPTrait", xiv::exd::Language::none ); m_QuestDat = setupDatAccess( "Quest", xiv::exd::Language::en ); + m_QuestAcceptAdditionConditionDat = setupDatAccess( "QuestAcceptAdditionCondition", xiv::exd::Language::none ); m_QuestBattleDat = setupDatAccess( "QuestBattle", xiv::exd::Language::none ); m_QuestChapterDat = setupDatAccess( "QuestChapter", xiv::exd::Language::none ); m_QuestClassJobRewardDat = setupDatAccess( "QuestClassJobReward", xiv::exd::Language::none ); m_QuestClassJobSupplyDat = setupDatAccess( "QuestClassJobSupply", xiv::exd::Language::none ); m_QuestDerivedClassDat = setupDatAccess( "QuestDerivedClass", xiv::exd::Language::none ); + m_QuestEffectDat = setupDatAccess( "QuestEffect", xiv::exd::Language::none ); + m_QuestEffectDefineDat = setupDatAccess( "QuestEffectDefine", xiv::exd::Language::none ); m_QuestRedoDat = setupDatAccess( "QuestRedo", xiv::exd::Language::none ); m_QuestRedoChapterUIDat = setupDatAccess( "QuestRedoChapterUI", xiv::exd::Language::en ); m_QuestRedoChapterUICategoryDat = setupDatAccess( "QuestRedoChapterUICategory", xiv::exd::Language::en ); @@ -13549,6 +13603,7 @@ bool Sapphire::Data::ExdDataGenerated::init( const std::string& path ) m_RetainerTaskParameterDat = setupDatAccess( "RetainerTaskParameter", xiv::exd::Language::none ); m_RetainerTaskRandomDat = setupDatAccess( "RetainerTaskRandom", xiv::exd::Language::en ); m_RideShootingDat = setupDatAccess( "RideShooting", xiv::exd::Language::none ); + m_RideShootingTargetTypeDat = setupDatAccess( "RideShootingTargetType", xiv::exd::Language::none ); m_RideShootingTextDataDat = setupDatAccess( "RideShootingTextData", xiv::exd::Language::en ); m_RPParameterDat = setupDatAccess( "RPParameter", xiv::exd::Language::none ); m_SatisfactionArbitrationDat = setupDatAccess( "SatisfactionArbitration", xiv::exd::Language::none ); @@ -13574,6 +13629,7 @@ bool Sapphire::Data::ExdDataGenerated::init( const std::string& path ) m_SpecialShopItemCategoryDat = setupDatAccess( "SpecialShopItemCategory", xiv::exd::Language::en ); m_StainDat = setupDatAccess( "Stain", xiv::exd::Language::en ); m_StainTransientDat = setupDatAccess( "StainTransient", xiv::exd::Language::none ); + m_StanceChangeDat = setupDatAccess( "StanceChange", xiv::exd::Language::none ); m_StatusDat = setupDatAccess( "Status", xiv::exd::Language::en ); m_StatusHitEffectDat = setupDatAccess( "StatusHitEffect", xiv::exd::Language::none ); m_StatusLoopVFXDat = setupDatAccess( "StatusLoopVFX", xiv::exd::Language::none ); @@ -13587,6 +13643,7 @@ bool Sapphire::Data::ExdDataGenerated::init( const std::string& path ) m_TerritoryTypeDat = setupDatAccess( "TerritoryType", xiv::exd::Language::none ); m_TerritoryTypeTransientDat = setupDatAccess( "TerritoryTypeTransient", xiv::exd::Language::none ); m_TextCommandDat = setupDatAccess( "TextCommand", xiv::exd::Language::en ); + m_TextCommandParamDat = setupDatAccess( "TextCommandParam", xiv::exd::Language::en ); m_TitleDat = setupDatAccess( "Title", xiv::exd::Language::en ); m_TomestonesDat = setupDatAccess( "Tomestones", xiv::exd::Language::none ); m_TomestonesItemDat = setupDatAccess( "TomestonesItem", xiv::exd::Language::none ); diff --git a/src/common/Exd/ExdDataGenerated.h b/src/common/Exd/ExdDataGenerated.h index f4b3e7fa..b670239f 100644 --- a/src/common/Exd/ExdDataGenerated.h +++ b/src/common/Exd/ExdDataGenerated.h @@ -527,11 +527,14 @@ struct PvPRank; struct PvPSelectTrait; struct PvPTrait; struct Quest; +struct QuestAcceptAdditionCondition; struct QuestBattle; struct QuestChapter; struct QuestClassJobReward; struct QuestClassJobSupply; struct QuestDerivedClass; +struct QuestEffect; +struct QuestEffectDefine; struct QuestRedo; struct QuestRedoChapterUI; struct QuestRedoChapterUICategory; @@ -567,6 +570,7 @@ struct RetainerTaskNormal; struct RetainerTaskParameter; struct RetainerTaskRandom; struct RideShooting; +struct RideShootingTargetType; struct RideShootingTextData; struct RPParameter; struct SatisfactionArbitration; @@ -592,6 +596,7 @@ struct SpecialShop; struct SpecialShopItemCategory; struct Stain; struct StainTransient; +struct StanceChange; struct Status; struct StatusHitEffect; struct StatusLoopVFX; @@ -605,6 +610,7 @@ struct SwitchTalkVariation; struct TerritoryType; struct TerritoryTypeTransient; struct TextCommand; +struct TextCommandParam; struct Title; struct Tomestones; struct TomestonesItem; @@ -2393,8 +2399,8 @@ struct ContentFinderCondition uint16_t sortKey; uint32_t image; uint32_t icon; - bool levelingRoulette; bool level506070Roulette; + bool levelingRoulette; bool mSQRoulette; bool guildHestRoulette; bool expertRoulette; @@ -2403,6 +2409,7 @@ struct ContentFinderCondition bool level80Roulette; bool mentorRoulette; bool allianceRoulette; + bool feastTeamRoulette; bool normalRaidRoulette; ContentFinderCondition( uint32_t row_id, Sapphire::Data::ExdDataGenerated* exdData ); @@ -3049,7 +3056,7 @@ struct DynamicEventEnemyType struct DynamicEventSingleBattle { - int32_t actionIcon; + int32_t bNpcName; uint32_t icon; std::string text; @@ -3662,7 +3669,9 @@ struct Festival struct FieldMarker { int32_t vFX; - uint16_t icon; + uint16_t uiIcon; + uint16_t mapIcon; + std::string name; FieldMarker( uint32_t row_id, Sapphire::Data::ExdDataGenerated* exdData ); }; @@ -4955,6 +4964,7 @@ struct Item uint8_t materiaSlotCount; bool isAdvancedMeldingPermitted; bool isPvP; + uint8_t subStatCategory; bool isGlamourous; struct @@ -6407,6 +6417,14 @@ struct Quest Quest( uint32_t row_id, Sapphire::Data::ExdDataGenerated* exdData ); }; +struct QuestAcceptAdditionCondition +{ + uint32_t requirement0; + uint32_t requirement1; + + QuestAcceptAdditionCondition( uint32_t row_id, Sapphire::Data::ExdDataGenerated* exdData ); +}; + struct QuestBattle { int32_t quest; @@ -6443,6 +6461,8 @@ struct QuestClassJobSupply uint8_t classJobCategory; uint32_t eNpcResident; uint32_t item; + uint8_t amountRequired; + bool itemHQ; QuestClassJobSupply( uint32_t row_id, uint32_t subRow, Sapphire::Data::ExdDataGenerated* exdData ); }; @@ -6454,6 +6474,19 @@ struct QuestDerivedClass QuestDerivedClass( uint32_t row_id, Sapphire::Data::ExdDataGenerated* exdData ); }; +struct QuestEffect +{ + + QuestEffect( uint32_t row_id, Sapphire::Data::ExdDataGenerated* exdData ); +}; + +struct QuestEffectDefine +{ + uint16_t effect; + + QuestEffectDefine( uint32_t row_id, uint32_t subRow, Sapphire::Data::ExdDataGenerated* exdData ); +}; + struct QuestRedo { uint32_t finalQuest; @@ -6577,6 +6610,7 @@ struct RacingChocoboNameCategory struct RacingChocoboNameInfo { uint8_t racingChocoboNameCategory; + std::vector< uint16_t > name; RacingChocoboNameInfo( uint32_t row_id, Sapphire::Data::ExdDataGenerated* exdData ); }; @@ -6667,6 +6701,7 @@ struct RecipeLookup struct RecipeNotebookList { + uint8_t count; std::vector< int32_t > recipe; RecipeNotebookList( uint32_t row_id, Sapphire::Data::ExdDataGenerated* exdData ); @@ -6840,6 +6875,14 @@ struct RideShooting RideShooting( uint32_t row_id, Sapphire::Data::ExdDataGenerated* exdData ); }; +struct RideShootingTargetType +{ + uint32_t eObj; + int16_t score; + + RideShootingTargetType( uint32_t row_id, Sapphire::Data::ExdDataGenerated* exdData ); +}; + struct RideShootingTextData { std::string string; @@ -7067,6 +7110,7 @@ struct Stain { uint32_t color; uint8_t shade; + uint8_t subOrder; std::string name; Stain( uint32_t row_id, Sapphire::Data::ExdDataGenerated* exdData ); @@ -7080,6 +7124,13 @@ struct StainTransient StainTransient( uint32_t row_id, Sapphire::Data::ExdDataGenerated* exdData ); }; +struct StanceChange +{ + std::vector< uint16_t > action; + + StanceChange( uint32_t row_id, Sapphire::Data::ExdDataGenerated* exdData ); +}; + struct Status { std::string name; @@ -7227,6 +7278,7 @@ struct TerritoryType uint8_t loadingImage; uint8_t exclusiveType; uint8_t territoryIntendedUse; + uint16_t contentFinderCondition; uint8_t weatherRate; bool pCSearch; bool stealth; @@ -7261,10 +7313,18 @@ struct TextCommand std::string description; std::string alias; std::string shortAlias; + uint16_t param; TextCommand( uint32_t row_id, Sapphire::Data::ExdDataGenerated* exdData ); }; +struct TextCommandParam +{ + std::string param; + + TextCommandParam( uint32_t row_id, Sapphire::Data::ExdDataGenerated* exdData ); +}; + struct Title { std::string masculine; @@ -8328,11 +8388,14 @@ struct ZoneSharedGroup xiv::exd::Exd m_PvPSelectTraitDat; xiv::exd::Exd m_PvPTraitDat; xiv::exd::Exd m_QuestDat; + xiv::exd::Exd m_QuestAcceptAdditionConditionDat; xiv::exd::Exd m_QuestBattleDat; xiv::exd::Exd m_QuestChapterDat; xiv::exd::Exd m_QuestClassJobRewardDat; xiv::exd::Exd m_QuestClassJobSupplyDat; xiv::exd::Exd m_QuestDerivedClassDat; + xiv::exd::Exd m_QuestEffectDat; + xiv::exd::Exd m_QuestEffectDefineDat; xiv::exd::Exd m_QuestRedoDat; xiv::exd::Exd m_QuestRedoChapterUIDat; xiv::exd::Exd m_QuestRedoChapterUICategoryDat; @@ -8368,6 +8431,7 @@ struct ZoneSharedGroup xiv::exd::Exd m_RetainerTaskParameterDat; xiv::exd::Exd m_RetainerTaskRandomDat; xiv::exd::Exd m_RideShootingDat; + xiv::exd::Exd m_RideShootingTargetTypeDat; xiv::exd::Exd m_RideShootingTextDataDat; xiv::exd::Exd m_RPParameterDat; xiv::exd::Exd m_SatisfactionArbitrationDat; @@ -8393,6 +8457,7 @@ struct ZoneSharedGroup xiv::exd::Exd m_SpecialShopItemCategoryDat; xiv::exd::Exd m_StainDat; xiv::exd::Exd m_StainTransientDat; + xiv::exd::Exd m_StanceChangeDat; xiv::exd::Exd m_StatusDat; xiv::exd::Exd m_StatusHitEffectDat; xiv::exd::Exd m_StatusLoopVFXDat; @@ -8406,6 +8471,7 @@ struct ZoneSharedGroup xiv::exd::Exd m_TerritoryTypeDat; xiv::exd::Exd m_TerritoryTypeTransientDat; xiv::exd::Exd m_TextCommandDat; + xiv::exd::Exd m_TextCommandParamDat; xiv::exd::Exd m_TitleDat; xiv::exd::Exd m_TomestonesDat; xiv::exd::Exd m_TomestonesItemDat; @@ -8965,11 +9031,14 @@ struct ZoneSharedGroup using PvPSelectTraitPtr = std::shared_ptr< PvPSelectTrait >; using PvPTraitPtr = std::shared_ptr< PvPTrait >; using QuestPtr = std::shared_ptr< Quest >; + using QuestAcceptAdditionConditionPtr = std::shared_ptr< QuestAcceptAdditionCondition >; using QuestBattlePtr = std::shared_ptr< QuestBattle >; using QuestChapterPtr = std::shared_ptr< QuestChapter >; using QuestClassJobRewardPtr = std::shared_ptr< QuestClassJobReward >; using QuestClassJobSupplyPtr = std::shared_ptr< QuestClassJobSupply >; using QuestDerivedClassPtr = std::shared_ptr< QuestDerivedClass >; + using QuestEffectPtr = std::shared_ptr< QuestEffect >; + using QuestEffectDefinePtr = std::shared_ptr< QuestEffectDefine >; using QuestRedoPtr = std::shared_ptr< QuestRedo >; using QuestRedoChapterUIPtr = std::shared_ptr< QuestRedoChapterUI >; using QuestRedoChapterUICategoryPtr = std::shared_ptr< QuestRedoChapterUICategory >; @@ -9005,6 +9074,7 @@ struct ZoneSharedGroup using RetainerTaskParameterPtr = std::shared_ptr< RetainerTaskParameter >; using RetainerTaskRandomPtr = std::shared_ptr< RetainerTaskRandom >; using RideShootingPtr = std::shared_ptr< RideShooting >; + using RideShootingTargetTypePtr = std::shared_ptr< RideShootingTargetType >; using RideShootingTextDataPtr = std::shared_ptr< RideShootingTextData >; using RPParameterPtr = std::shared_ptr< RPParameter >; using SatisfactionArbitrationPtr = std::shared_ptr< SatisfactionArbitration >; @@ -9030,6 +9100,7 @@ struct ZoneSharedGroup using SpecialShopItemCategoryPtr = std::shared_ptr< SpecialShopItemCategory >; using StainPtr = std::shared_ptr< Stain >; using StainTransientPtr = std::shared_ptr< StainTransient >; + using StanceChangePtr = std::shared_ptr< StanceChange >; using StatusPtr = std::shared_ptr< Status >; using StatusHitEffectPtr = std::shared_ptr< StatusHitEffect >; using StatusLoopVFXPtr = std::shared_ptr< StatusLoopVFX >; @@ -9043,6 +9114,7 @@ struct ZoneSharedGroup using TerritoryTypePtr = std::shared_ptr< TerritoryType >; using TerritoryTypeTransientPtr = std::shared_ptr< TerritoryTypeTransient >; using TextCommandPtr = std::shared_ptr< TextCommand >; + using TextCommandParamPtr = std::shared_ptr< TextCommandParam >; using TitlePtr = std::shared_ptr< Title >; using TomestonesPtr = std::shared_ptr< Tomestones >; using TomestonesItemPtr = std::shared_ptr< TomestonesItem >; @@ -9602,11 +9674,14 @@ struct ZoneSharedGroup std::set< uint32_t > m_PvPSelectTraitIdList; std::set< uint32_t > m_PvPTraitIdList; std::set< uint32_t > m_QuestIdList; + std::set< uint32_t > m_QuestAcceptAdditionConditionIdList; std::set< uint32_t > m_QuestBattleIdList; std::set< uint32_t > m_QuestChapterIdList; std::set< uint32_t > m_QuestClassJobRewardIdList; std::set< uint32_t > m_QuestClassJobSupplyIdList; std::set< uint32_t > m_QuestDerivedClassIdList; + std::set< uint32_t > m_QuestEffectIdList; + std::set< uint32_t > m_QuestEffectDefineIdList; std::set< uint32_t > m_QuestRedoIdList; std::set< uint32_t > m_QuestRedoChapterUIIdList; std::set< uint32_t > m_QuestRedoChapterUICategoryIdList; @@ -9642,6 +9717,7 @@ struct ZoneSharedGroup std::set< uint32_t > m_RetainerTaskParameterIdList; std::set< uint32_t > m_RetainerTaskRandomIdList; std::set< uint32_t > m_RideShootingIdList; + std::set< uint32_t > m_RideShootingTargetTypeIdList; std::set< uint32_t > m_RideShootingTextDataIdList; std::set< uint32_t > m_RPParameterIdList; std::set< uint32_t > m_SatisfactionArbitrationIdList; @@ -9667,6 +9743,7 @@ struct ZoneSharedGroup std::set< uint32_t > m_SpecialShopItemCategoryIdList; std::set< uint32_t > m_StainIdList; std::set< uint32_t > m_StainTransientIdList; + std::set< uint32_t > m_StanceChangeIdList; std::set< uint32_t > m_StatusIdList; std::set< uint32_t > m_StatusHitEffectIdList; std::set< uint32_t > m_StatusLoopVFXIdList; @@ -9680,6 +9757,7 @@ struct ZoneSharedGroup std::set< uint32_t > m_TerritoryTypeIdList; std::set< uint32_t > m_TerritoryTypeTransientIdList; std::set< uint32_t > m_TextCommandIdList; + std::set< uint32_t > m_TextCommandParamIdList; std::set< uint32_t > m_TitleIdList; std::set< uint32_t > m_TomestonesIdList; std::set< uint32_t > m_TomestonesItemIdList; @@ -12764,6 +12842,12 @@ const std::set< uint32_t >& getQuestIdList() loadIdList( m_QuestDat, m_QuestIdList ); return m_QuestIdList; } +const std::set< uint32_t >& getQuestAcceptAdditionConditionIdList() +{ + if( m_QuestAcceptAdditionConditionIdList.size() == 0 ) + loadIdList( m_QuestAcceptAdditionConditionDat, m_QuestAcceptAdditionConditionIdList ); + return m_QuestAcceptAdditionConditionIdList; +} const std::set< uint32_t >& getQuestBattleIdList() { if( m_QuestBattleIdList.size() == 0 ) @@ -12794,6 +12878,18 @@ const std::set< uint32_t >& getQuestDerivedClassIdList() loadIdList( m_QuestDerivedClassDat, m_QuestDerivedClassIdList ); return m_QuestDerivedClassIdList; } +const std::set< uint32_t >& getQuestEffectIdList() +{ + if( m_QuestEffectIdList.size() == 0 ) + loadIdList( m_QuestEffectDat, m_QuestEffectIdList ); + return m_QuestEffectIdList; +} +const std::set< uint32_t >& getQuestEffectDefineIdList() +{ + if( m_QuestEffectDefineIdList.size() == 0 ) + loadIdList( m_QuestEffectDefineDat, m_QuestEffectDefineIdList ); + return m_QuestEffectDefineIdList; +} const std::set< uint32_t >& getQuestRedoIdList() { if( m_QuestRedoIdList.size() == 0 ) @@ -13004,6 +13100,12 @@ const std::set< uint32_t >& getRideShootingIdList() loadIdList( m_RideShootingDat, m_RideShootingIdList ); return m_RideShootingIdList; } +const std::set< uint32_t >& getRideShootingTargetTypeIdList() +{ + if( m_RideShootingTargetTypeIdList.size() == 0 ) + loadIdList( m_RideShootingTargetTypeDat, m_RideShootingTargetTypeIdList ); + return m_RideShootingTargetTypeIdList; +} const std::set< uint32_t >& getRideShootingTextDataIdList() { if( m_RideShootingTextDataIdList.size() == 0 ) @@ -13154,6 +13256,12 @@ const std::set< uint32_t >& getStainTransientIdList() loadIdList( m_StainTransientDat, m_StainTransientIdList ); return m_StainTransientIdList; } +const std::set< uint32_t >& getStanceChangeIdList() +{ + if( m_StanceChangeIdList.size() == 0 ) + loadIdList( m_StanceChangeDat, m_StanceChangeIdList ); + return m_StanceChangeIdList; +} const std::set< uint32_t >& getStatusIdList() { if( m_StatusIdList.size() == 0 ) @@ -13232,6 +13340,12 @@ const std::set< uint32_t >& getTextCommandIdList() loadIdList( m_TextCommandDat, m_TextCommandIdList ); return m_TextCommandIdList; } +const std::set< uint32_t >& getTextCommandParamIdList() +{ + if( m_TextCommandParamIdList.size() == 0 ) + loadIdList( m_TextCommandParamDat, m_TextCommandParamIdList ); + return m_TextCommandParamIdList; +} const std::set< uint32_t >& getTitleIdList() { if( m_TitleIdList.size() == 0 ) diff --git a/src/common/Network/PacketDef/Ipcs.h b/src/common/Network/PacketDef/Ipcs.h index ceb78f56..9b469ddc 100644 --- a/src/common/Network/PacketDef/Ipcs.h +++ b/src/common/Network/PacketDef/Ipcs.h @@ -43,67 +43,67 @@ namespace Sapphire::Network::Packets */ enum ServerZoneIpcType : uint16_t { - Ping = 0x0289, // updated 5.55 hotfix - Init = 0x0203, // updated 5.55 hotfix + Ping = 0x02CB, // updated 5.58 + Init = 0x02A8, // updated 5.58 - ActorFreeSpawn = 0x01C5, // updated 5.55 hotfix - InitZone = 0x021C, // updated 5.55 hotfix + ActorFreeSpawn = 0x0210, // updated 5.58 + InitZone = 0x0100, // updated 5.58 - EffectResult = 0x01E9, // updated 5.55 hotfix - ActorControl = 0x01C8, // updated 5.55 hotfix - ActorControlSelf = 0x035A, // updated 5.55 hotfix - ActorControlTarget = 0x0338, // updated 5.55 hotfix + EffectResult = 0x0151, // updated 5.58 + ActorControl = 0x0264, // updated 5.58 + ActorControlSelf = 0x0314, // updated 5.58 + ActorControlTarget = 0x00FC, // updated 5.58 /*! * @brief Used when resting */ - UpdateHpMpTp = 0x0077, // updated 5.55 hotfix + UpdateHpMpTp = 0x039B, // updated 5.58 /////////////////////////////////////////////////// ChatBanned = 0xF06B, - Playtime = 0x0348, // updated 5.55 hotfix - Logout = 0x0292, // updated 5.55 hotfix - CFNotify = 0x00DC, // updated 5.55 hotfix + Playtime = 0x02BE, // updated 5.58 + Logout = 0x0297, // updated 5.58 + CFNotify = 0x01AC, // updated 5.58 CFMemberStatus = 0x0079, - CFDutyInfo = 0x02A3, // updated 5.55 hotfix + CFDutyInfo = 0x0083, // updated 5.58 CFPlayerInNeed = 0xF07F, - CFPreferredRole = 0x02B6, // updated 5.55 hotfix - CFCancel = 0x0262, // updated 5.55 hotfix + CFPreferredRole = 0x02FB, // updated 5.58 + CFCancel = 0x0135, // updated 5.58 SocialRequestError = 0xF0AD, - CFRegistered = 0x0114, // updated 5.55 hotfix - SocialRequestResponse = 0x033C, // updated 5.55 hotfix - SocialMessage = 0x0304, // updated 5.55 hotfix - SocialMessage2 = 0x01B4, // updated 5.55 hotfix - CancelAllianceForming = 0x00C6, // updated 4.2 + CFRegistered = 0x037E, // updated 5.58 + SocialRequestResponse = 0x0254, // updated 5.58 + SocialMessage = 0x02F2, // updated 5.58 + SocialMessage2 = 0x017A, // updated 5.58 + CancelAllianceForming = 0xF0C6, // updated 4.2 - LogMessage = 0x00D0, + LogMessage = 0x020F, // updated 5.58 - Chat = 0x0384, // updated 5.55 hotfix + Chat = 0x0220, // updated 5.58 PartyChat = 0x0065, WorldVisitList = 0xF0FE, // added 4.5 - SocialList = 0x00DD, // updated 5.55 hotfix + SocialList = 0x0396, // updated 5.58 - ExamineSearchInfo = 0x022A, // updated 5.55 hotfix - UpdateSearchInfo = 0x03DF, // updated 5.55 hotfix - InitSearchInfo = 0x00F8, // updated 5.55 hotfix - ExamineSearchComment = 0x0102, // updated 4.1 + ExamineSearchInfo = 0x031F, // updated 5.58 + UpdateSearchInfo = 0x0219, // updated 5.58 + InitSearchInfo = 0x01A0, // updated 5.58 + ExamineSearchComment = 0x0315, // updated 5.58 - ServerNoticeShort = 0x032D, // updated 5.55 hotfix - ServerNotice = 0x02CA, // updated 5.55 hotfix - SetOnlineStatus = 0x03A9, // updated 5.55 hotfix + ServerNoticeShort = 0x0211, // updated 5.58 + ServerNotice = 0x03B9, // updated 5.58 + SetOnlineStatus = 0x0163, // updated 5.58 - CountdownInitiate = 0x0237, // updated 5.25 - CountdownCancel = 0x00D9, // updated 5.18 + CountdownInitiate = 0x01F9, // updated 5.58 + CountdownCancel = 0x0206, // updated 5.58 - PlayerAddedToBlacklist = 0x033F, // updated 5.1 - PlayerRemovedFromBlacklist = 0x0385, // updated 5.1 - BlackList = 0x0093, // updated 5.55 hotfix + PlayerAddedToBlacklist = 0x01FE, // updated 5.58 + PlayerRemovedFromBlacklist = 0x02D6, // updated 5.58 + BlackList = 0x028A, // updated 5.58 - LinkshellList = 0x0160, // updated 5.55 hotfix + LinkshellList = 0x02DD, // updated 5.58 MailDeleteRequest = 0xF12B, // updated 5.0 @@ -114,85 +114,85 @@ namespace Sapphire::Network::Packets MarketTaxRates = 0x01F8, // updated 5.35 hotfix - MarketBoardSearchResult = 0x039D, // updated 5.55 hotfix - MarketBoardItemListingCount = 0x0277, // updated 5.55 hotfix - MarketBoardItemListingHistory = 0x0320, // updated 5.55 hotfix - MarketBoardItemListing = 0x026B, // updated 5.55 hotfix + MarketBoardSearchResult = 0x0355, // updated 5.58 + MarketBoardItemListingCount = 0x0275, // updated 5.58 + MarketBoardItemListingHistory = 0x0112, // updated 5.58 + MarketBoardItemListing = 0x00F5, // updated 5.58 CharaFreeCompanyTag = 0x013B, // updated 4.5 - FreeCompanyBoardMsg = 0x013C, // updated 4.5 - FreeCompanyInfo = 0x0332, // updated 5.55 hotfix - ExamineFreeCompanyInfo = 0xF13E, // updated 4.5 + FreeCompanyBoardMsg = 0x028D, // updated 5.58 + FreeCompanyInfo = 0x0346, // updated 5.58 + ExamineFreeCompanyInfo = 0x00B7, // updated 5.58 FreeCompanyUpdateShortMessage = 0xF157, // added 5.0 - StatusEffectList = 0x018A, // updated 5.55 hotfix + StatusEffectList = 0x01C5, // updated 5.58 EurekaStatusEffectList = 0x0167, // updated 5.18 BossStatusEffectList = 0x0312, // added 5.1 - Effect = 0x0283, // updated 5.55 hotfix - AoeEffect8 = 0x025B, // updated 5.55 hotfix - AoeEffect16 = 0x015D, // updated 5.55 hotfix - AoeEffect24 = 0x0091, // updated 5.55 hotfix - AoeEffect32 = 0x0169, // updated 5.55 hotfix - PersistantEffect = 0x035E, // updated 5.55 hotfix + Effect = 0x0102, // updated 5.58 + AoeEffect8 = 0x0345, // updated 5.58 + AoeEffect16 = 0x02B6, // updated 5.58 + AoeEffect24 = 0x0298, // updated 5.58 + AoeEffect32 = 0x03A4, // updated 5.58 + PersistantEffect = 0x008D, // updated 5.58 - GCAffiliation = 0x0258, // updated 5.55 hotfix + GCAffiliation = 0x02B1, // updated 5.58 - PlayerSpawn = 0x02C1, // updated 5.55 hotfix - NpcSpawn = 0x00F1, // updated 5.55 hotfix + PlayerSpawn = 0x0249, // updated 5.58 + NpcSpawn = 0x014B, // updated 5.58 NpcSpawn2 = 0x01CB, // ( Bigger statuseffectlist? ) updated 5.3 - ActorMove = 0x009D, // updated 5.55 hotfix + ActorMove = 0x023D, // updated 5.58 - ActorSetPos = 0x0266, // updated 5.55 hotfix + ActorSetPos = 0x0280, // updated 5.58 - ActorCast = 0x00A9, // updated 5.55 hotfix + ActorCast = 0x02A7, // updated 5.58 SomeCustomiseChangePacketProbably = 0x00CD, // added 5.18 - PartyList = 0x01B7, // updated 5.55 hotfix - PartyMessage = 0x01C1, // updated 5.55 hotfix - HateRank = 0x006E, // updated 5.55 hotfix - HateList = 0x01F1, // updated 5.55 hotfix - ObjectSpawn = 0x00FE, // updated 5.55 hotfix - ObjectDespawn = 0x0201, // updated 5.55 hotfix - UpdateClassInfo = 0x0065, // updated 5.55 hotfix + PartyList = 0x02BD, // updated 5.58 + PartyMessage = 0x0318, // updated 5.58 + HateRank = 0x02C0, // updated 5.58 + HateList = 0x01B4, // updated 5.58 + ObjectSpawn = 0x0104, // updated 5.58 + ObjectDespawn = 0x030D, // updated 5.58 + UpdateClassInfo = 0x0198, // updated 5.58 SilentSetClassJob = 0xF18E, // updated 5.0 - seems to be the case, not sure if it's actually used for anything - PlayerSetup = 0x01E7, // updated 5.55 hotfix - PlayerStats = 0x012E, // updated 5.55 hotfix - ActorOwner = 0x00EB, // updated 5.55 hotfix - PlayerStateFlags = 0x0190, // updated 5.55 hotfix - PlayerClassInfo = 0x022B, // updated 5.55 hotfix - CharaVisualEffect = 0x033A, // updated 5.55 hotfix + PlayerSetup = 0x0296, // updated 5.58 + PlayerStats = 0x00D5, // updated 5.58 + ActorOwner = 0x00AE, // updated 5.58 + PlayerStateFlags = 0x022A, // updated 5.58 + PlayerClassInfo = 0x02DF, // updated 5.58 + CharaVisualEffect = 0x0134, // updated 5.58 - ModelEquip = 0x0264, // updated 5.55 hotfix - Examine = 0x027C, // updated 5.55 hotfix - CharaNameReq = 0x02EC, // updated 5.55 hotfix + ModelEquip = 0x0312, // updated 5.58 + Examine = 0x00D3, // updated 5.58 + CharaNameReq = 0x031C, // updated 5.58 // nb: see #565 on github UpdateRetainerItemSalePrice = 0xF19F, // updated 5.0 - RetainerSaleHistory = 0x020E, // updated 5.21 hotfix - RetainerInformation = 0x02DE, // updated 5.55 hotfix + RetainerSaleHistory = 0x01D3, // updated 5.58 + RetainerInformation = 0x0069, // updated 5.58 SetLevelSync = 0x1186, // not updated for 4.4, not sure what it is anymore - ItemInfo = 0x02D3, // updated 5.55 hotfix - ContainerInfo = 0x00CF, // updated 5.55 hotfix - InventoryTransactionFinish = 0x02EE, // updated 5.55 hotfix - InventoryTransaction = 0x02FA, // updated 5.55 hotfix - CurrencyCrystalInfo = 0x0166, // updated 5.55 hotfix + ItemInfo = 0x00A7, // updated 5.58 + ContainerInfo = 0x0208, // updated 5.58 + InventoryTransactionFinish = 0x01A3, // updated 5.58 + InventoryTransaction = 0x03AC, // updated 5.58 + CurrencyCrystalInfo = 0x0394, // updated 5.58 - InventoryActionAck = 0x027D, // updated 5.55 hotfix - UpdateInventorySlot = 0x0073, // updated 5.55 hotfix + InventoryActionAck = 0x0305, // updated 5.58 + UpdateInventorySlot = 0x0200, // updated 5.58 - HuntingLogEntry = 0x0080, // updated 5.55 hotfix + HuntingLogEntry = 0x00C5, // updated 5.58 - EventPlay = 0x0369, // updated 5.55 hotfix - EventPlay4 = 0x0247, // updated 5.55 hotfix - EventPlay8 = 0x0227, // updated 5.55 hotfix - EventPlay16 = 0x00C5, // updated 5.55 hotfix - EventPlay32 = 0x0184, // updated 5.55 hotfix - EventPlay64 = 0x011A, // updated 5.55 hotfix - EventPlay128 = 0x01B3, // updated 5.55 hotfix - EventPlay255 = 0x0240, // updated 5.55 hotfix + EventPlay = 0x01EF, // updated 5.58 + EventPlay4 = 0x021C, // updated 5.58 + EventPlay8 = 0x0337, // updated 5.58 + EventPlay16 = 0x0319, // updated 5.58 + EventPlay32 = 0x01E2, // updated 5.58 + EventPlay64 = 0x02FD, // updated 5.58 + EventPlay128 = 0x026E, // updated 5.58 + EventPlay255 = 0x039E, // updated 5.58 EventYield = 0x02CB, // updated 5.55 hotfix //EventYield4 = 0x0000, @@ -203,89 +203,89 @@ namespace Sapphire::Network::Packets //EventYield128 = 0x0000, //EventYield255 = 0x0000, - EventStart = 0x0145, // updated 5.55 hotfix - EventFinish = 0x0174, // updated 5.55 hotfix + EventStart = 0x01CC, // updated 5.58 + EventFinish = 0x0180, // updated 5.58 EventLinkshell = 0x1169, - QuestActiveList = 0x0381, // updated 5.55 hotfix - QuestUpdate = 0x031B, // updated 5.55 hotfix - QuestCompleteList = 0x031A, // updated 5.55 hotfix + QuestActiveList = 0x035D, // updated 5.58 + QuestUpdate = 0x029A, // updated 5.58 + QuestCompleteList = 0x03C5, // updated 5.58 - QuestFinish = 0x00E0, // updated 5.55 hotfix - MSQTrackerComplete = 0xF1D6, // updated 5.0 + QuestFinish = 0x0274, // updated 5.58 + MSQTrackerComplete = 0x01C1, // updated 5.58 MSQTrackerProgress = 0xF1CD, // updated 4.5 ? this actually looks like the two opcodes have been combined, see #474 QuestMessage = 0x036E, // updated 5.55 hotfix - QuestTracker = 0x0294, // updated 5.55 hotfix + QuestTracker = 0x038E, // updated 5.58 - Mount = 0x016B, // updated 5.55 hotfix + Mount = 0x03C2, // updated 5.58 - DirectorVars = 0x0391, // updated 5.55 hotfix + DirectorVars = 0x01ED, // updated 5.58 SomeDirectorUnk1 = 0x0084, // updated 5.18 SomeDirectorUnk2 = 0xF0C1, // updated 5.18 - SomeDirectorUnk4 = 0x0101, // updated 5.55 hotfix + SomeDirectorUnk4 = 0x01BD, // updated 5.58 SomeDirectorUnk8 = 0x028A, // updated 5.18 SomeDirectorUnk16 = 0x028C, // updated 5.18 - DirectorPopUp = 0xF162, // updated 5.18 (could be 0x02C2 in 5.55, needs confirmation - display dialogue pop-ups in duties and FATEs, for example, Teraflare's countdown - DirectorPopUp4 = 0x0214, // updated 5.18 - DirectorPopUp8 = 0x00F8, // updated 5.18 + DirectorPopUp = 0x02E3, // updated 5.58 + DirectorPopUp4 = 0x01DC, // updated 5.58 + DirectorPopUp8 = 0x011D, // updated 5.58 CFAvailableContents = 0xF1FD, // updated 4.2 - WeatherChange = 0x0386, // updated 5.55 hotfix - PlayerTitleList = 0x0181, // updated 5.55 hotfix - Discovery = 0x019E, // updated 5.55 hotfix + WeatherChange = 0x01B1, // updated 5.58 + PlayerTitleList = 0x02B4, // updated 5.58 + Discovery = 0x00B8, // updated 5.58 - EorzeaTimeOffset = 0x01AE, // updated 5.55 hotfix + EorzeaTimeOffset = 0x03D9, // updated 5.58 - EquipDisplayFlags = 0x01A3, // updated 5.55 hotfix + EquipDisplayFlags = 0x0199, // updated 5.58 MiniCactpotInit = 0x0286, // added 5.31 ShopMessage = 0x0162, // updated 5.55 hotfix - LootMessage = 0x0299, // updated 5.55 hotfix - ResultDialog = 0x025D, // updated 5.55 hotfix - DesynthResult = 0x0323, // updated 5.55 hotfix + LootMessage = 0x038C, // updated 5.58 + ResultDialog = 0x00DF, // updated 5.58 + DesynthResult = 0x038F, // updated 5.58 /// Housing ////////////////////////////////////// - LandSetInitialize = 0x01E4, // updated 5.55 hotfix - LandUpdate = 0x012B, // updated 5.55 hotfix - YardObjectSpawn = 0x0249, // updated 5.55 hotfix - HousingIndoorInitialize = 0x0133, // updated 5.55 hotfix - LandPriceUpdate = 0x00AA, // updated 5.55 hotfix - LandInfoSign = 0x023D, // updated 5.55 hotfix - LandRename = 0x0158, // updated 5.55 hotfix - HousingEstateGreeting = 0x018D, // updated 5.55 hotfix - HousingUpdateLandFlagsSlot = 0x03C8, // updated 5.55 hotfix - HousingLandFlags = 0x037E, // updated 5.55 hotfix - HousingShowEstateGuestAccess = 0x01F8, // updated 5.55 hotfix + LandSetInitialize = 0x03E3, // updated 5.58 + LandUpdate = 0x029E, // updated 5.58 + YardObjectSpawn = 0x0367, // updated 5.58 + HousingIndoorInitialize = 0x02A6, // updated 5.58 + LandPriceUpdate = 0x0143, // updated 5.58 + LandInfoSign = 0x0269, // updated 5.58 + LandRename = 0x0107, // updated 5.58 + HousingEstateGreeting = 0x0340, // updated 5.58 + HousingUpdateLandFlagsSlot = 0x02D2, // updated 5.58 + HousingLandFlags = 0x0156, // updated 5.58 + HousingShowEstateGuestAccess = 0x015C, // updated 5.58 - HousingObjectInitialize = 0x0331, // updated 5.55 hotfix - HousingInternalObjectSpawn = 0x0092, // updated 5.55 hotfix + HousingObjectInitialize = 0x0245, // updated 5.58 + HousingInternalObjectSpawn = 0x0194, // updated 5.58 - HousingWardInfo = 0x0279, // updated 5.55 hotfix - HousingObjectMove = 0x0239, // updated 5.55 hotfix + HousingWardInfo = 0x00A4, // updated 5.58 + HousingObjectMove = 0x01AE, // updated 5.58 - SharedEstateSettingsResponse = 0x0263, // updated 5.55 hotfix + SharedEstateSettingsResponse = 0x0378, // updated 5.58 - LandUpdateHouseName = 0x01D6, // updated 5.55 hotfix + LandUpdateHouseName = 0x034B, // updated 5.58 - LandSetMap = 0x01D3, // updated 5.55 hotfix + LandSetMap = 0x02F6, // updated 5.58 ////////////////////////////////////////////////// DuelChallenge = 0x0277, // 4.2; this is responsible for opening the ui - PerformNote = 0x038B, // updated 5.55 hotfix + PerformNote = 0x00BE, // updated 5.58 - PrepareZoning = 0x00A4, // updated 5.55 hotfix - ActorGauge = 0x03B1, // updated 5.55 hotfix - DutyGauge = 0x01D3, // updated 5.55 hotfix + PrepareZoning = 0x0171, // updated 5.58 + ActorGauge = 0x0335, // updated 5.58 + DutyGauge = 0x02F6, // updated 5.58 // daily quest info -> without them sent, login will take longer... - DailyQuests = 0x0371, // updated 5.55 hotfix - DailyQuestRepeatFlags = 0x021F, // updated 5.55 hotfix + DailyQuests = 0x0331, // updated 5.58 + DailyQuestRepeatFlags = 0x01D1, // updated 5.58 /// Doman Mahjong ////////////////////////////////////// MahjongOpenGui = 0x02A4, // only available in mahjong instance @@ -300,14 +300,14 @@ namespace Sapphire::Network::Packets MahjongEndGame = 0x02C6, // finished oorasu(all-last) round; shows a result screen. /// Airship & Submarine ////////////////////////////////////// - AirshipExplorationResult = 0x007C, // updated 5.55 hotfix - AirshipStatus = 0x00AB, // updated 5.55 hotfix - AirshipStatusList = 0x027B, // updated 5.55 hotfix - AirshipTimers = 0x02A5, // updated 5.55 hotfix - SubmarineExplorationResult = 0x0099, // updated 5.55 hotfix - SubmarineProgressionStatus = 0x0081, // updated 5.55 hotfix - SubmarineStatusList = 0x0072, // updated 5.55 hotfix - SubmarineTimers = 0x037A, // updated 5.55 hotfix + AirshipExplorationResult = 0x036C, // updated 5.58 + AirshipStatus = 0x021F, // updated 5.58 + AirshipStatusList = 0x0073, // updated 5.58 + AirshipTimers = 0x0250, // updated 5.58 + SubmarineExplorationResult = 0x01D0, // updated 5.58 + SubmarineProgressionStatus = 0x0377, // updated 5.58 + SubmarineStatusList = 0x0338, // updated 5.58 + SubmarineTimers = 0x0292, // updated 5.58 }; /** @@ -315,109 +315,109 @@ namespace Sapphire::Network::Packets */ enum ClientZoneIpcType : uint16_t { - PingHandler = 0x03AD, // updated 5.55 hotfix - InitHandler = 0x03DA, // updated 5.55 hotfix + PingHandler = 0x03A3, // updated 5.58 + InitHandler = 0x03B3, // updated 5.58 - FinishLoadingHandler = 0x0203, // updated 5.55 hotfix + FinishLoadingHandler = 0x0217, // updated 5.58 CFCommenceHandler = 0xF118, // updated 5.35 hotfix - CFCancelHandler = 0x0332, // updated 5.35 hotfix - CFRegisterDuty = 0x033C, // updated 5.45 hotfix - CFRegisterRoulette = 0x0121, // updated 5.45 hotfix - PlayTimeHandler = 0x0365, // updated 5.55 hotfix - LogoutHandler = 0x039B, // updated 5.55 hotfix - CancelLogout = 0x010F, // updated 5.55 hotfix + CFCancelHandler = 0x00A9, // updated 5.58 + CFRegisterDuty = 0x036A, // updated 5.58 + CFRegisterRoulette = 0x038C, // updated 5.58 + PlayTimeHandler = 0x01A8, // updated 5.58 + LogoutHandler = 0x02A5, // updated 5.58 + CancelLogout = 0x03CC, // updated 5.58 CFDutyInfoHandler = 0xF078, // updated 4.2 - SocialReqSendHandler = 0x028E, // updated 5.55 hotfix - SocialResponseHandler = 0x0373, // updated 5.55 hotfix - CreateCrossWorldLS = 0x028D, // updated 5.55 hotfix + SocialReqSendHandler = 0x0366, // updated 5.58 + SocialResponseHandler = 0x0311, // updated 5.58 + CreateCrossWorldLS = 0x0125, // updated 5.58 - ChatHandler = 0x01B8, // updated 5.55 hotfix + ChatHandler = 0x02F4, // updated 5.58 PartyChatHandler = 0x0065, - PartySetLeaderHandler = 0x0142, // updated 5.55 hotfix - LeavePartyHandler = 0x026C, // updated 5.55 hotfix - KickPartyMemberHandler = 0x0379, // updated 5.55 hotfix - DisbandPartyHandler = 0x037A, // updated 5.45 hotfix + PartySetLeaderHandler = 0x03C2, // updated 5.58 + LeavePartyHandler = 0x028A, // updated 5.58 + KickPartyMemberHandler = 0x01D1, // updated 5.58 + DisbandPartyHandler = 0x032B, // updated 5.58 - SocialListHandler = 0x00F2, // updated 5.55 hotfix - SetSearchInfoHandler = 0x009C, // updated 5.55 hotfix - ReqSearchInfoHandler = 0x00B1, // updated 5.55 hotfix + SocialListHandler = 0x006E, // updated 5.58 + SetSearchInfoHandler = 0x010A, // updated 5.58 + ReqSearchInfoHandler = 0x0255, // updated 5.58 ReqExamineSearchCommentHandler = 0x00E7, // updated 5.0 - ReqRemovePlayerFromBlacklist = 0x00F1, // updated 5.0 - BlackListHandler = 0x03DE, // updated 5.55 hotfix - PlayerSearchHandler = 0x00F4, // updated 5.0 + ReqRemovePlayerFromBlacklist = 0x015A, // updated 5.58 + BlackListHandler = 0x02C5, // updated 5.58 + PlayerSearchHandler = 0x0259, // updated 5.58 - LinkshellListHandler = 0x0291, // updated 5.55 hotfix + LinkshellListHandler = 0x01F0, // updated 5.58 - MarketBoardRequestItemListingInfo = 0x0102, // updated 4.5 - MarketBoardRequestItemListings = 0x0103, // updated 4.5 - MarketBoardSearch = 0x0107, // updated 4.5 + MarketBoardRequestItemListingInfo = 0x02D3, // updated 5.58 + MarketBoardRequestItemListings = 0x00AD, // updated 5.58 + MarketBoardSearch = 0x00D6, // updated 5.58 - ReqExamineFcInfo = 0x0113, // updated 4.1 + ReqExamineFcInfo = 0x0359, // updated 5.58 - FcInfoReqHandler = 0x011A, // updated 4.2 + FcInfoReqHandler = 0x0078, // updated 5.58 FreeCompanyUpdateShortMessageHandler = 0x0123, // added 5.0 - ReqMarketWishList = 0x012C, // updated 4.3 + ReqMarketWishList = 0x0364, // updated 5.58 ReqJoinNoviceNetwork = 0x0129, // updated 4.2 - ReqCountdownInitiate = 0x025F, // updated 5.35 hotfix - ReqCountdownCancel = 0x0244, // updated 5.25 + ReqCountdownInitiate = 0x020E, // updated 5.58 + ReqCountdownCancel = 0x03BE, // updated 5.58 - ZoneLineHandler = 0x01C2, // updated 5.55 hotfix - ClientTrigger = 0x0337, // updated 5.55 hotfix - DiscoveryHandler = 0x00E3, // updated 5.35 hotfix + ZoneLineHandler = 0x00B0, // updated 5.58 + ClientTrigger = 0x008B, // updated 5.58 + DiscoveryHandler = 0x01B4, // updated 5.58 - PlaceFieldMarkerPreset = 0xF10C, // updated 5.55 hotfix - PlaceFieldMarker = 0xF2E2, // updated 5.55 hotfix - SkillHandler = 0x02A2, // updated 5.55 hotfix - GMCommand1 = 0x01F0, // updated 5.55 hotfix - GMCommand2 = 0x0068, // updated 5.55 hotfix - AoESkillHandler = 0x02F6, // updated 5.55 hotfix + PlaceFieldMarkerPreset = 0x03B0, // updated 5.58 + PlaceFieldMarker = 0x011A, // updated 5.58 + SkillHandler = 0x0175, // updated 5.58 + GMCommand1 = 0x0353, // updated 5.58 + GMCommand2 = 0x03E7, // updated 5.58 + AoESkillHandler = 0x021D, // updated 5.58 - UpdatePositionHandler = 0x024B, // updated 5.55 hotfix + UpdatePositionHandler = 0x0212, // updated 5.58 - InventoryModifyHandler = 0x01D7, // updated 5.55 hotfix + InventoryModifyHandler = 0x014A, // updated 5.58 - InventoryEquipRecommendedItems = 0x0186, // updated 5.45 hotfix + InventoryEquipRecommendedItems = 0x01D7, // updated 5.58 - ReqPlaceHousingItem = 0x023E, // updated 5.55 hotfix - BuildPresetHandler = 0x0374, // updated 5.55 hotfix + ReqPlaceHousingItem = 0x0354, // updated 5.58 + BuildPresetHandler = 0x00DC, // updated 5.58 - TalkEventHandler = 0x01E9, // updated 5.55 hotfix + TalkEventHandler = 0x012D, // updated 5.58 EmoteEventHandler = 0xF35A, // updated 5.55 hotfix - WithinRangeEventHandler = 0x035A, // updated 5.55 hotfix - OutOfRangeEventHandler = 0x0338, // updated 5.55 hotfix - EnterTeriEventHandler = 0x0077, // updated 5.55 hotfix - ShopEventHandler = 0x0168, // updated 5.55 hotfix + WithinRangeEventHandler = 0x022C, // updated 5.58 + OutOfRangeEventHandler = 0x0294, // updated 5.58 + EnterTeriEventHandler = 0x00C1, // updated 5.58 + ShopEventHandler = 0x02B8, // updated 5.58 EventYieldHandler = 0x02A0, // updated 5.55 hotfix - ReturnEventHandler = 0x015D, // updated 5.55 hotfix - TradeReturnEventHandler = 0x0091, // updated 5.55 hotfix + ReturnEventHandler = 0x0333, // updated 5.58 + TradeReturnEventHandler = 0x0179, // updated 5.58 TradeReturnEventHandler2 = 0x0169, // updated 5.55 hotfix LinkshellEventHandler = 0x016B, // updated 4.5 LinkshellEventHandler1 = 0x016C, // updated 4.5 - ReqEquipDisplayFlagsChange = 0x032B, // updated 5.55 hotfix + ReqEquipDisplayFlagsChange = 0x01AD, // updated 5.58 - LandRenameHandler = 0x0206, // updated 5.55 hotfix - HousingUpdateHouseGreeting = 0x0330, // updated 5.55 hotfix - HousingUpdateObjectPosition = 0x03A5, // updated 5.55 hotfix + LandRenameHandler = 0x0083, // updated 5.58 + HousingUpdateHouseGreeting = 0x031A, // updated 5.58 + HousingUpdateObjectPosition = 0x010E, // updated 5.58 HousingEditAppearance = 0x00D7, // updated 5.55 hotfix - SetSharedEstateSettings = 0x03DC, // updated 5.55 hotfix + SetSharedEstateSettings = 0x0342, // updated 5.58 - UpdatePositionInstance = 0x009D, // updated 5.55 hotfix + UpdatePositionInstance = 0x01A3, // updated 5.58 - PerformNoteHandler = 0x01F1, // updated 5.55 hotfix + PerformNoteHandler = 0x015E, // updated 5.58 - WorldInteractionHandler = 0x0343, // updated 5.55 hotfix - Dive = 0x021C, // updated 5.55 hotfix + WorldInteractionHandler = 0x03CE, // updated 5.58 + Dive = 0x034C, // updated 5.58 }; //////////////////////////////////////////////////////////////////////////////// From b014b9265dbdf8c56efc1f2a1b09e8ba4f1a75b8 Mon Sep 17 00:00:00 2001 From: collett Date: Thu, 29 Jul 2021 02:01:02 +0900 Subject: [PATCH 16/43] housing edit interior --- src/common/Network/PacketDef/Ipcs.h | 11 ++++--- .../Network/PacketDef/Zone/ClientZoneDef.h | 10 +++++- src/world/Manager/HousingMgr.cpp | 32 ++++++++++--------- src/world/Manager/HousingMgr.h | 2 +- src/world/Network/GameConnection.cpp | 3 +- src/world/Network/GameConnection.h | 2 ++ src/world/Network/Handlers/PacketHandlers.cpp | 26 ++++++++++++++- 7 files changed, 62 insertions(+), 24 deletions(-) diff --git a/src/common/Network/PacketDef/Ipcs.h b/src/common/Network/PacketDef/Ipcs.h index 9b469ddc..a0b26779 100644 --- a/src/common/Network/PacketDef/Ipcs.h +++ b/src/common/Network/PacketDef/Ipcs.h @@ -194,7 +194,7 @@ namespace Sapphire::Network::Packets EventPlay128 = 0x026E, // updated 5.58 EventPlay255 = 0x039E, // updated 5.58 - EventYield = 0x02CB, // updated 5.55 hotfix + EventYield = 0x0123, // updated 5.58 //EventYield4 = 0x0000, //EventYield8 = 0x0000, //EventYield16 = 0x0000, @@ -216,7 +216,7 @@ namespace Sapphire::Network::Packets MSQTrackerComplete = 0x01C1, // updated 5.58 MSQTrackerProgress = 0xF1CD, // updated 4.5 ? this actually looks like the two opcodes have been combined, see #474 - QuestMessage = 0x036E, // updated 5.55 hotfix + QuestMessage = 0x0128, // updated 5.58 QuestTracker = 0x038E, // updated 5.58 @@ -243,7 +243,7 @@ namespace Sapphire::Network::Packets EquipDisplayFlags = 0x0199, // updated 5.58 MiniCactpotInit = 0x0286, // added 5.31 - ShopMessage = 0x0162, // updated 5.55 hotfix + ShopMessage = 0x00D0, // updated 5.58 LootMessage = 0x038C, // updated 5.58 ResultDialog = 0x00DF, // updated 5.58 DesynthResult = 0x038F, // updated 5.58 @@ -395,7 +395,7 @@ namespace Sapphire::Network::Packets OutOfRangeEventHandler = 0x0294, // updated 5.58 EnterTeriEventHandler = 0x00C1, // updated 5.58 ShopEventHandler = 0x02B8, // updated 5.58 - EventYieldHandler = 0x02A0, // updated 5.55 hotfix + EventYieldHandler = 0x03A2, // updated 5.58 ReturnEventHandler = 0x0333, // updated 5.58 TradeReturnEventHandler = 0x0179, // updated 5.58 TradeReturnEventHandler2 = 0x0169, // updated 5.55 hotfix @@ -408,7 +408,8 @@ namespace Sapphire::Network::Packets LandRenameHandler = 0x0083, // updated 5.58 HousingUpdateHouseGreeting = 0x031A, // updated 5.58 HousingUpdateObjectPosition = 0x010E, // updated 5.58 - HousingEditAppearance = 0x00D7, // updated 5.55 hotfix + HousingEditExterior = 0x0324, // updated 5.58 + HousingEditInterior = 0x02F7, // updated 5.58 SetSharedEstateSettings = 0x0342, // updated 5.58 diff --git a/src/common/Network/PacketDef/Zone/ClientZoneDef.h b/src/common/Network/PacketDef/Zone/ClientZoneDef.h index 175069c3..45840848 100644 --- a/src/common/Network/PacketDef/Zone/ClientZoneDef.h +++ b/src/common/Network/PacketDef/Zone/ClientZoneDef.h @@ -427,7 +427,7 @@ struct FFXIVIpcDive : }; struct FFXIVIpcHousingEditExterior : - FFXIVIpcBasePacket< HousingEditAppearance > + FFXIVIpcBasePacket< HousingEditExterior > { uint16_t landId; uint8_t unknown[6]; @@ -438,6 +438,14 @@ struct FFXIVIpcHousingEditExterior : uint16_t padding; }; +struct FFXIVIpcHousingEditInterior : + FFXIVIpcBasePacket< HousingEditInterior > +{ + uint64_t unknown; + uint16_t container[10]; + uint16_t slot[10]; +}; + } #endif //_CORE_NETWORK_PACKETS_ZONE_CLIENT_IPC_H diff --git a/src/world/Manager/HousingMgr.cpp b/src/world/Manager/HousingMgr.cpp index ae4228eb..077058c6 100644 --- a/src/world/Manager/HousingMgr.cpp +++ b/src/world/Manager/HousingMgr.cpp @@ -1632,24 +1632,23 @@ Sapphire::Inventory::HousingItemPtr Sapphire::World::Manager::HousingMgr::getHou return Inventory::make_HousingItem( tmpItem->getUId(), tmpItem->getId() ); } -void Sapphire::World::Manager::HousingMgr::editExterior( Sapphire::Entity::Player& player, uint16_t plot, std::vector< uint16_t > containerList, std::vector< uint8_t> slotList, uint8_t removeFlag ) +void Sapphire::World::Manager::HousingMgr::editAppearance( bool isInterior, Sapphire::Entity::Player& player, const Common::LandIdent& landIdent, std::vector< uint16_t > containerList, std::vector< uint8_t> slotList, uint8_t removeFlag ) { - auto terri = std::dynamic_pointer_cast< HousingZone >( player.getCurrentTerritory() ); - if( !terri ) - return; + auto landSetId = toLandSetId( static_cast< uint16_t >( landIdent.territoryTypeId ), static_cast< uint8_t >( landIdent.wardNum ) ); + auto terri = getHousingZoneByLandSetId( landSetId ); - auto land = terri->getLand( static_cast< uint8_t >( plot ) ); + auto land = terri->getLand( static_cast< uint8_t >( landIdent.landId ) ); if( !land ) return; if( !hasPermission( player, *land, 0 ) ) return; - auto& exteriorAppearenceContainer = getEstateInventory( land->getLandIdent() )[ InventoryType::HousingExteriorAppearance ]; + auto& housingContainer = getEstateInventory( landIdent )[ isInterior ? InventoryType::HousingInteriorAppearance : InventoryType::HousingExteriorAppearance ]; auto& invMgr = Service< InventoryMgr >::ref(); - for( int i = 0; i < 9; i++ ) + for( int i = 0; i < ( isInterior ? 10 : 9 ); i++ ) { auto container = containerList.at( i ); auto slot = slotList.at( i ); @@ -1660,11 +1659,11 @@ void Sapphire::World::Manager::HousingMgr::editExterior( Sapphire::Entity::Playe auto removed = ( ( removeFlag >> ( i - 5 ) ) & 1 ) > 0; if( removed ) { - auto oldItem = exteriorAppearenceContainer->getItem( i ); + auto oldItem = housingContainer->getItem( i ); if( oldItem ) { - exteriorAppearenceContainer->removeItem( i ); - invMgr.removeItemFromHousingContainer( land->getLandIdent(), exteriorAppearenceContainer->getId(), i ); + housingContainer->removeItem( i ); + invMgr.removeItemFromHousingContainer( land->getLandIdent(), housingContainer->getId(), i ); player.addItem( oldItem, false, false, false ); } } @@ -1674,16 +1673,19 @@ void Sapphire::World::Manager::HousingMgr::editExterior( Sapphire::Entity::Playe auto item = getHousingItemFromPlayer( player, static_cast< Sapphire::Common::InventoryType >( container ), slot ); if( item ) { - auto oldItem = exteriorAppearenceContainer->getItem( i ); - exteriorAppearenceContainer->setItem( i, item ); + auto oldItem = housingContainer->getItem( i ); + housingContainer->setItem( i, item ); if( oldItem ) { player.insertInventoryItem( static_cast< Sapphire::Common::InventoryType >( container ), slot, oldItem ); } } } - invMgr.sendInventoryContainer( player, exteriorAppearenceContainer ); - invMgr.saveHousingContainer( land->getLandIdent(), exteriorAppearenceContainer ); + invMgr.sendInventoryContainer( player, housingContainer ); + invMgr.saveHousingContainer( land->getLandIdent(), housingContainer ); updateHouseModels( land->getHouse() ); - std::dynamic_pointer_cast< HousingZone >( player.getCurrentTerritory() )->sendLandUpdate( plot ); + if( !isInterior ) + { + terri->sendLandUpdate( landIdent.landId ); + } } \ No newline at end of file diff --git a/src/world/Manager/HousingMgr.h b/src/world/Manager/HousingMgr.h index 17dff202..99143325 100644 --- a/src/world/Manager/HousingMgr.h +++ b/src/world/Manager/HousingMgr.h @@ -181,7 +181,7 @@ namespace Sapphire::World::Manager bool hasPermission( Entity::Player& player, Land& land, uint32_t permission ); - void editExterior( Sapphire::Entity::Player& player, uint16_t plot, std::vector< uint16_t > containerList, std::vector< uint8_t > slotList, uint8_t removeFlag ); + void editAppearance( bool isInterior, Sapphire::Entity::Player& player, const Common::LandIdent& landIdent, std::vector< uint16_t > containerList, std::vector< uint8_t > slotList, uint8_t removeFlag ); private: diff --git a/src/world/Network/GameConnection.cpp b/src/world/Network/GameConnection.cpp index 21f83edf..7e360ada 100644 --- a/src/world/Network/GameConnection.cpp +++ b/src/world/Network/GameConnection.cpp @@ -90,7 +90,8 @@ Sapphire::Network::GameConnection::GameConnection( Sapphire::Network::HivePtr pH setZoneHandler( ClientZoneIpcType::ReqPlaceHousingItem, "ReqPlaceHousingItem", &GameConnection::reqPlaceHousingItem ); setZoneHandler( ClientZoneIpcType::HousingUpdateObjectPosition, "HousingUpdateObjectPosition", &GameConnection::reqMoveHousingItem ); - setZoneHandler( ClientZoneIpcType::HousingEditAppearance, "HousingEditAppearance", &GameConnection::housingEditExterior ); + setZoneHandler( ClientZoneIpcType::HousingEditExterior, "HousingEditExterior", &GameConnection::housingEditExterior ); + setZoneHandler( ClientZoneIpcType::HousingEditInterior, "HousingEditInterior", &GameConnection::housingEditInterior ); setZoneHandler( ClientZoneIpcType::TalkEventHandler, "EventHandlerTalk", &GameConnection::eventHandlerTalk ); setZoneHandler( ClientZoneIpcType::EmoteEventHandler, "EventHandlerEmote", &GameConnection::eventHandlerEmote ); diff --git a/src/world/Network/GameConnection.h b/src/world/Network/GameConnection.h index 84c9a1c0..0e1da4cb 100644 --- a/src/world/Network/GameConnection.h +++ b/src/world/Network/GameConnection.h @@ -183,6 +183,8 @@ namespace Sapphire::Network DECLARE_HANDLER( housingEditExterior ); + DECLARE_HANDLER( housingEditInterior ); + DECLARE_HANDLER( marketBoardSearch ); DECLARE_HANDLER( marketBoardRequestItemInfo ); diff --git a/src/world/Network/Handlers/PacketHandlers.cpp b/src/world/Network/Handlers/PacketHandlers.cpp index db311736..86387a2a 100644 --- a/src/world/Network/Handlers/PacketHandlers.cpp +++ b/src/world/Network/Handlers/PacketHandlers.cpp @@ -21,6 +21,7 @@ #include "Territory/Territory.h" #include "Territory/HousingZone.h" +#include "Territory/Housing/HousingInteriorTerritory.h" #include "Territory/Land.h" #include "Territory/ZonePosition.h" #include "Territory/House.h" @@ -695,6 +696,9 @@ void Sapphire::Network::GameConnection::housingEditExterior( const Packets::FFXI { auto& housingMgr = Common::Service< HousingMgr >::ref(); const auto packet = ZoneChannelPacket< Client::FFXIVIpcHousingEditExterior >( inPacket ); + auto terri = std::dynamic_pointer_cast< HousingZone >( player.getCurrentTerritory() ); + if( !terri ) + return; std::vector< uint16_t > containerList; std::vector< uint8_t > slotList; @@ -705,7 +709,27 @@ void Sapphire::Network::GameConnection::housingEditExterior( const Packets::FFXI slotList.push_back( container != 0x270F ? static_cast< uint8_t >( packet.data().slot[i] ) : 0xFF ); } - housingMgr.editExterior( player, packet.data().landId, containerList, slotList, packet.data().removeFlag ); + housingMgr.editAppearance( false, player, terri->getLand( packet.data().landId )->getLandIdent(), containerList, slotList, packet.data().removeFlag ); +} + +void Sapphire::Network::GameConnection::housingEditInterior( const Packets::FFXIVARR_PACKET_RAW& inPacket, Entity::Player& player ) +{ + auto& housingMgr = Common::Service< HousingMgr >::ref(); + const auto packet = ZoneChannelPacket< Client::FFXIVIpcHousingEditInterior >( inPacket ); + auto terri = std::dynamic_pointer_cast< World::Territory::Housing::HousingInteriorTerritory >( player.getCurrentTerritory() ); + if( !terri ) + return; + + std::vector< uint16_t > containerList; + std::vector< uint8_t > slotList; + for( int i = 0; i < 10; i++ ) + { + auto container = packet.data().container[i]; + containerList.push_back( container ); + slotList.push_back( container != 0x270F ? static_cast< uint8_t >( packet.data().slot[i] ) : 0xFF ); + } + + housingMgr.editAppearance( true, player, terri->getLandIdent(), containerList, slotList, 0 ); } void Sapphire::Network::GameConnection::marketBoardSearch( const Packets::FFXIVARR_PACKET_RAW& inPacket, From 602f175912ce4b418e458a55a1e4935bf49a34db Mon Sep 17 00:00:00 2001 From: collett Date: Thu, 29 Jul 2021 16:38:23 +0900 Subject: [PATCH 17/43] remove reference from LandIdent param --- src/world/Manager/HousingMgr.cpp | 2 +- src/world/Manager/HousingMgr.h | 2 +- 2 files changed, 2 insertions(+), 2 deletions(-) diff --git a/src/world/Manager/HousingMgr.cpp b/src/world/Manager/HousingMgr.cpp index 077058c6..efe369b8 100644 --- a/src/world/Manager/HousingMgr.cpp +++ b/src/world/Manager/HousingMgr.cpp @@ -1632,7 +1632,7 @@ Sapphire::Inventory::HousingItemPtr Sapphire::World::Manager::HousingMgr::getHou return Inventory::make_HousingItem( tmpItem->getUId(), tmpItem->getId() ); } -void Sapphire::World::Manager::HousingMgr::editAppearance( bool isInterior, Sapphire::Entity::Player& player, const Common::LandIdent& landIdent, std::vector< uint16_t > containerList, std::vector< uint8_t> slotList, uint8_t removeFlag ) +void Sapphire::World::Manager::HousingMgr::editAppearance( bool isInterior, Sapphire::Entity::Player& player, Common::LandIdent landIdent, std::vector< uint16_t > containerList, std::vector< uint8_t> slotList, uint8_t removeFlag ) { auto landSetId = toLandSetId( static_cast< uint16_t >( landIdent.territoryTypeId ), static_cast< uint8_t >( landIdent.wardNum ) ); auto terri = getHousingZoneByLandSetId( landSetId ); diff --git a/src/world/Manager/HousingMgr.h b/src/world/Manager/HousingMgr.h index 99143325..143f0e10 100644 --- a/src/world/Manager/HousingMgr.h +++ b/src/world/Manager/HousingMgr.h @@ -181,7 +181,7 @@ namespace Sapphire::World::Manager bool hasPermission( Entity::Player& player, Land& land, uint32_t permission ); - void editAppearance( bool isInterior, Sapphire::Entity::Player& player, const Common::LandIdent& landIdent, std::vector< uint16_t > containerList, std::vector< uint8_t > slotList, uint8_t removeFlag ); + void editAppearance( bool isInterior, Sapphire::Entity::Player& player, Common::LandIdent landIdent, std::vector< uint16_t > containerList, std::vector< uint8_t > slotList, uint8_t removeFlag ); private: From 245d7095663f2075aed287fc0e75477d2c445d0d Mon Sep 17 00:00:00 2001 From: collett Date: Thu, 29 Jul 2021 16:42:31 +0900 Subject: [PATCH 18/43] minor update --- src/world/Manager/HousingMgr.cpp | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/src/world/Manager/HousingMgr.cpp b/src/world/Manager/HousingMgr.cpp index efe369b8..a8317f0c 100644 --- a/src/world/Manager/HousingMgr.cpp +++ b/src/world/Manager/HousingMgr.cpp @@ -1663,7 +1663,7 @@ void Sapphire::World::Manager::HousingMgr::editAppearance( bool isInterior, Sapp if( oldItem ) { housingContainer->removeItem( i ); - invMgr.removeItemFromHousingContainer( land->getLandIdent(), housingContainer->getId(), i ); + invMgr.removeItemFromHousingContainer( landIdent, housingContainer->getId(), i ); player.addItem( oldItem, false, false, false ); } } @@ -1682,7 +1682,7 @@ void Sapphire::World::Manager::HousingMgr::editAppearance( bool isInterior, Sapp } } invMgr.sendInventoryContainer( player, housingContainer ); - invMgr.saveHousingContainer( land->getLandIdent(), housingContainer ); + invMgr.saveHousingContainer( landIdent, housingContainer ); updateHouseModels( land->getHouse() ); if( !isInterior ) { From 46aa33cffa5d4286255051854258804e37b9ee6b Mon Sep 17 00:00:00 2001 From: collett Date: Thu, 29 Jul 2021 16:54:24 +0900 Subject: [PATCH 19/43] keep the const --- src/world/Manager/HousingMgr.cpp | 2 +- src/world/Manager/HousingMgr.h | 2 +- 2 files changed, 2 insertions(+), 2 deletions(-) diff --git a/src/world/Manager/HousingMgr.cpp b/src/world/Manager/HousingMgr.cpp index a8317f0c..3e98a7f7 100644 --- a/src/world/Manager/HousingMgr.cpp +++ b/src/world/Manager/HousingMgr.cpp @@ -1632,7 +1632,7 @@ Sapphire::Inventory::HousingItemPtr Sapphire::World::Manager::HousingMgr::getHou return Inventory::make_HousingItem( tmpItem->getUId(), tmpItem->getId() ); } -void Sapphire::World::Manager::HousingMgr::editAppearance( bool isInterior, Sapphire::Entity::Player& player, Common::LandIdent landIdent, std::vector< uint16_t > containerList, std::vector< uint8_t> slotList, uint8_t removeFlag ) +void Sapphire::World::Manager::HousingMgr::editAppearance( bool isInterior, Sapphire::Entity::Player& player, const Common::LandIdent landIdent, std::vector< uint16_t > containerList, std::vector< uint8_t> slotList, uint8_t removeFlag ) { auto landSetId = toLandSetId( static_cast< uint16_t >( landIdent.territoryTypeId ), static_cast< uint8_t >( landIdent.wardNum ) ); auto terri = getHousingZoneByLandSetId( landSetId ); diff --git a/src/world/Manager/HousingMgr.h b/src/world/Manager/HousingMgr.h index 143f0e10..1984a16c 100644 --- a/src/world/Manager/HousingMgr.h +++ b/src/world/Manager/HousingMgr.h @@ -181,7 +181,7 @@ namespace Sapphire::World::Manager bool hasPermission( Entity::Player& player, Land& land, uint32_t permission ); - void editAppearance( bool isInterior, Sapphire::Entity::Player& player, Common::LandIdent landIdent, std::vector< uint16_t > containerList, std::vector< uint8_t > slotList, uint8_t removeFlag ); + void editAppearance( bool isInterior, Sapphire::Entity::Player& player, const Common::LandIdent landIdent, std::vector< uint16_t > containerList, std::vector< uint8_t > slotList, uint8_t removeFlag ); private: From 99279db982d3a1ff5daba100084548db07c156ef Mon Sep 17 00:00:00 2001 From: liam Date: Fri, 30 Jul 2021 20:05:06 -0400 Subject: [PATCH 20/43] include vector --- deps/datReader/ExdData.h | 1 + deps/datReader/GameData.h | 1 + 2 files changed, 2 insertions(+) diff --git a/deps/datReader/ExdData.h b/deps/datReader/ExdData.h index 15092d6e..c7c61626 100644 --- a/deps/datReader/ExdData.h +++ b/deps/datReader/ExdData.h @@ -6,6 +6,7 @@ #include #include +#include namespace xiv { diff --git a/deps/datReader/GameData.h b/deps/datReader/GameData.h index 53b7f021..da6b059a 100644 --- a/deps/datReader/GameData.h +++ b/deps/datReader/GameData.h @@ -6,6 +6,7 @@ #include #include +#include namespace xiv::dat { From b1e430cf39dcba35011625e5933c5a2587e87601 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?=E3=82=B3=E3=83=AC=E3=83=83=E3=83=88?= <59412435+collett8192@users.noreply.github.com> Date: Tue, 10 Aug 2021 15:55:10 +0900 Subject: [PATCH 21/43] CF register fix. (#719) * CF register fix. * typo --- src/common/Network/PacketDef/Ipcs.h | 2 +- .../Network/PacketDef/Zone/ClientZoneDef.h | 6 ++ src/world/Actor/Player.cpp | 8 +- src/world/Actor/Player.h | 3 +- src/world/Network/GameConnection.cpp | 2 +- src/world/Network/Handlers/CFHandlers.cpp | 88 ++++++++++--------- 6 files changed, 62 insertions(+), 47 deletions(-) diff --git a/src/common/Network/PacketDef/Ipcs.h b/src/common/Network/PacketDef/Ipcs.h index a0b26779..c33cfad6 100644 --- a/src/common/Network/PacketDef/Ipcs.h +++ b/src/common/Network/PacketDef/Ipcs.h @@ -320,7 +320,7 @@ namespace Sapphire::Network::Packets FinishLoadingHandler = 0x0217, // updated 5.58 - CFCommenceHandler = 0xF118, // updated 5.35 hotfix + CFCommenceHandler = 0x02A3, // updated 5.58 CFCancelHandler = 0x00A9, // updated 5.58 CFRegisterDuty = 0x036A, // updated 5.58 diff --git a/src/common/Network/PacketDef/Zone/ClientZoneDef.h b/src/common/Network/PacketDef/Zone/ClientZoneDef.h index 45840848..0d67ea61 100644 --- a/src/common/Network/PacketDef/Zone/ClientZoneDef.h +++ b/src/common/Network/PacketDef/Zone/ClientZoneDef.h @@ -446,6 +446,12 @@ struct FFXIVIpcHousingEditInterior : uint16_t slot[10]; }; +struct FFXIVIpcCFCommenceHandler : + FFXIVIpcBasePacket< CFCommenceHandler > +{ + uint64_t param; +}; + } #endif //_CORE_NETWORK_PACKETS_ZONE_CLIENT_IPC_H diff --git a/src/world/Actor/Player.cpp b/src/world/Actor/Player.cpp index 9c10ebb8..7f089e92 100644 --- a/src/world/Actor/Player.cpp +++ b/src/world/Actor/Player.cpp @@ -81,7 +81,8 @@ Sapphire::Entity::Player::Player() : m_directorInitialized( false ), m_onEnterEventDone( false ), m_falling( false ), - m_pQueuedAction( nullptr ) + m_pQueuedAction( nullptr ), + m_cfNotifiedContent( 0 ) { m_id = 0; m_currentStance = Stance::Passive; @@ -239,13 +240,16 @@ uint64_t Sapphire::Entity::Player::getOnlineStatusMask() const return m_onlineStatus; } -void Sapphire::Entity::Player::prepareZoning( uint16_t targetZone, bool fadeOut, uint8_t fadeOutTime, uint16_t animation ) +void Sapphire::Entity::Player::prepareZoning( uint16_t targetZone, bool fadeOut, uint8_t fadeOutTime, uint16_t animation, uint8_t param4, uint8_t param7, uint8_t unknown ) { auto preparePacket = makeZonePacket< FFXIVIpcPrepareZoning >( getId() ); preparePacket->data().targetZone = targetZone; preparePacket->data().fadeOutTime = fadeOutTime; preparePacket->data().animation = animation; preparePacket->data().fadeOut = static_cast< uint8_t >( fadeOut ? 1 : 0 ); + preparePacket->data().param4 = param4; + preparePacket->data().param7 = param7; + preparePacket->data().unknown = unknown; queuePacket( preparePacket ); } diff --git a/src/world/Actor/Player.h b/src/world/Actor/Player.h index 81d5a599..0b95ab24 100644 --- a/src/world/Actor/Player.h +++ b/src/world/Actor/Player.h @@ -547,7 +547,7 @@ namespace Sapphire::Entity void dyeItemFromDyeingInfo(); /*! prepares zoning / fades out the screen */ - void prepareZoning( uint16_t targetZone, bool fadeOut, uint8_t fadeOutTime = 0, uint16_t animation = 0 ); + void prepareZoning( uint16_t targetZone, bool fadeOut, uint8_t fadeOutTime = 0, uint16_t animation = 0, uint8_t param4 = 0, uint8_t param7 = 0, uint8_t unknown = 0 ); /*! get player's title list (available titles) */ uint8_t* getTitleList(); @@ -1005,6 +1005,7 @@ namespace Sapphire::Entity uint64_t m_lastMoveTime; uint8_t m_lastMoveflag; bool m_falling; + uint16_t m_cfNotifiedContent; std::vector< ShopBuyBackEntry >& getBuyBackListForShop( uint32_t shopId ); void addBuyBackItemForShop( uint32_t shopId, const ShopBuyBackEntry& entry ); diff --git a/src/world/Network/GameConnection.cpp b/src/world/Network/GameConnection.cpp index 7e360ada..17907571 100644 --- a/src/world/Network/GameConnection.cpp +++ b/src/world/Network/GameConnection.cpp @@ -120,7 +120,7 @@ Sapphire::Network::GameConnection::GameConnection( Sapphire::Network::HivePtr pH setZoneHandler( ClientZoneIpcType::CFRegisterDuty, "CFRegisterDuty", &GameConnection::cfRegisterDuty ); setZoneHandler( ClientZoneIpcType::CFRegisterRoulette, "CFRegisterRoulette", &GameConnection::cfRegisterRoulette ); setZoneHandler( ClientZoneIpcType::CFCommenceHandler, "CFDutyAccepted", &GameConnection::cfDutyAccepted ); - setZoneHandler( ClientZoneIpcType::CFCancelHandler, "CFCancel", &GameConnection::cfCancel ); + //setZoneHandler( ClientZoneIpcType::CFCancelHandler, "CFCancel", &GameConnection::cfCancel ); setZoneHandler( ClientZoneIpcType::ReqEquipDisplayFlagsChange, "ReqEquipDisplayFlagsChange", &GameConnection::reqEquipDisplayFlagsHandler ); diff --git a/src/world/Network/Handlers/CFHandlers.cpp b/src/world/Network/Handlers/CFHandlers.cpp index 0cc3a39f..08e53124 100644 --- a/src/world/Network/Handlers/CFHandlers.cpp +++ b/src/world/Network/Handlers/CFHandlers.cpp @@ -12,6 +12,7 @@ #include "Network/GameConnection.h" #include "Network/PacketWrappers/ServerNoticePacket.h" #include "Network/PacketWrappers/PlayerStateFlagsPacket.h" +#include "Network/PacketDef/Zone/ClientZoneDef.h" #include "Session.h" @@ -43,9 +44,6 @@ void Sapphire::Network::GameConnection::cfRegisterDuty( const Packets::FFXIVARR_ Entity::Player& player ) { Packets::FFXIVARR_PACKET_RAW copy = inPacket; - auto& teriMgr = Common::Service< TerritoryMgr >::ref(); - auto& exdData = Common::Service< Data::ExdDataGenerated >::ref(); - std::vector< uint16_t > selectedContent; for( uint32_t offset = 0x1E; offset <= 0x26; offset += 0x2 ) @@ -54,70 +52,76 @@ void Sapphire::Network::GameConnection::cfRegisterDuty( const Packets::FFXIVARR_ if( id == 0 ) break; - player.sendDebug( "got contentId#{0}", id ); + player.sendDebug( "got contentFinderConditionId#{0}", id ); selectedContent.push_back( id ); } // todo: rand bias problem, will do for now tho auto index = static_cast< uint32_t >( std::rand() ) % selectedContent.size(); - auto contentId = selectedContent.at( index ); + auto contentFinderConditionId = selectedContent.at( index ); - player.sendDebug( "Duty register request for contentid#{0}", contentId ); - - // let's cancel it because otherwise you can't register it again - /* - auto cfCancelPacket = makeZonePacket< FFXIVIpcCFNotify >( player.getId() ); - cfCancelPacket->data().state1 = 3; - cfCancelPacket->data().state2 = 1; // Your registration is withdrawn. - queueOutPacket( cfCancelPacket ); - */ - auto packet = makeZonePacket< FFXIVIpcCFCancel >( player.getId() ); - packet->data().cancelReason = 890; - queueOutPacket( packet ); - - auto cfCondition = exdData.get< Sapphire::Data::ContentFinderCondition >( contentId ); - if( !cfCondition ) - return; - - auto instance = teriMgr.createInstanceContent( cfCondition->content ); - if( !instance ) - return; - - auto pInstance = instance->getAsInstanceContent(); - pInstance->bindPlayer( player.getId() ); - - player.sendDebug( "Created instance with id#", instance->getGuId() ); - - player.setInstance( instance ); + player.sendDebug( "Duty register request for contentFinderConditionId#{0}", contentFinderConditionId ); + player.m_cfNotifiedContent = contentFinderConditionId; + auto notify = makeZonePacket< FFXIVIpcCFNotify >( player.getId() ); + notify->data().state1 = 8195; + notify->data().param3 = 1; + notify->data().param4 = contentFinderConditionId; + player.queuePacket( notify ); } void Sapphire::Network::GameConnection::cfRegisterRoulette( const Packets::FFXIVARR_PACKET_RAW& inPacket, Entity::Player& player ) { - /* - auto cfCancelPacket = makeZonePacket< FFXIVIpcCFNotify >( player.getId() ); - cfCancelPacket->data().state1 = 3; - cfCancelPacket->data().state2 = 1; // Your registration is withdrawn. - queueOutPacket( cfCancelPacket ); - */ auto packet = makeZonePacket< FFXIVIpcCFCancel >( player.getId() ); packet->data().cancelReason = 890; queueOutPacket( packet ); - player.sendDebug( "Roulette register" ); + player.sendDebug( "Roulette register not implemented." ); } void Sapphire::Network::GameConnection::cfDutyAccepted( const Packets::FFXIVARR_PACKET_RAW& inPacket, Entity::Player& player ) { - player.sendDebug( "TODO: Duty accept" ); -} + const auto packetIn = ZoneChannelPacket< Client::FFXIVIpcCFCommenceHandler >( inPacket ); + if( packetIn.data().param == 0 ) + { + // accept + if( player.m_cfNotifiedContent > 0 ) + { + auto& teriMgr = Common::Service< TerritoryMgr >::ref(); + auto instance = teriMgr.createInstanceContent( player.m_cfNotifiedContent ); + if( !instance ) + return; + + player.m_cfNotifiedContent = 0; + auto pInstance = instance->getAsInstanceContent(); + pInstance->bindPlayer( player.getId() ); + + player.sendDebug( "Created instance with id#{}", instance->getGuId() ); + + player.prepareZoning( pInstance->getTerritoryTypeId(), true, 1, 0, 0, 1, 9 ); + + auto sourceZoneGuId = player.getCurrentTerritory()->getGuId(); + player.setInstance( instance ); + } + } + else + { + // cancel + player.m_cfNotifiedContent = 0; + auto packet = makeZonePacket< FFXIVIpcCFCancel >( player.getId() ); + packet->data().cancelReason = 890; + queueOutPacket( packet ); + } +} +/* void Sapphire::Network::GameConnection::cfCancel( const Packets::FFXIVARR_PACKET_RAW& inPacket, Entity::Player& player ) { auto packet = makeZonePacket< FFXIVIpcCFCancel >( player.getId() ); packet->data().cancelReason = 890; queueOutPacket( packet ); -} \ No newline at end of file +} +*/ \ No newline at end of file From 23b7b052a1fdbb21c25055bb622d1eca821df94e Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?=E3=82=B3=E3=83=AC=E3=83=83=E3=83=88?= <59412435+collett8192@users.noreply.github.com> Date: Mon, 16 Aug 2021 17:18:29 +0900 Subject: [PATCH 22/43] PublicContent support. (#720) * PublicContent support. * update code --- src/common/Common.h | 3 - src/common/Network/CommonActorControl.h | 3 + src/common/Network/PacketDef/Ipcs.h | 16 +- .../Network/PacketDef/Zone/ClientZoneDef.h | 18 ++ .../Network/PacketDef/Zone/ServerZoneDef.h | 53 +++- src/common/Util/UtilMath.cpp | 5 + src/common/Util/UtilMath.h | 2 + src/scripts/common/CmnDefCutSceneReplay.cpp | 2 +- .../common/eobj/HousingEstateEntrance.cpp | 2 +- src/world/Actor/Actor.cpp | 11 +- src/world/Actor/Actor.h | 2 + src/world/Actor/EventObject.h | 2 +- src/world/Actor/Player.cpp | 38 ++- src/world/Actor/Player.h | 6 +- src/world/Actor/PlayerEvent.cpp | 27 ++ src/world/Event/Director.cpp | 20 +- src/world/Event/Director.h | 12 +- src/world/Event/EventHandler.h | 1 + src/world/ForwardsZone.h | 1 + src/world/Manager/DebugCommandMgr.cpp | 155 +++++++++- src/world/Manager/DebugCommandMgr.h | 1 + src/world/Manager/EventMgr.cpp | 7 + src/world/Manager/TerritoryMgr.cpp | 81 +++++- src/world/Manager/TerritoryMgr.h | 9 +- src/world/Network/GameConnection.cpp | 2 + src/world/Network/GameConnection.h | 2 + src/world/Network/Handlers/CFHandlers.cpp | 1 - .../Network/Handlers/ClientTriggerHandler.cpp | 5 + src/world/Network/Handlers/EventHandlers.cpp | 48 ++++ src/world/Network/Handlers/PacketHandlers.cpp | 19 +- .../PacketWrappers/ActorControlSelfPacket.h | 7 +- .../PacketWrappers/PlayerSpawnPacket.h | 6 + src/world/Script/NativeScriptApi.cpp | 30 ++ src/world/Script/NativeScriptApi.h | 19 ++ src/world/Script/ScriptMgr.cpp | 78 ++++- src/world/Script/ScriptMgr.h | 12 + src/world/Territory/InstanceContent.cpp | 8 +- src/world/Territory/InstanceContent.h | 2 +- src/world/Territory/PublicContent.cpp | 271 ++++++++++++++++++ src/world/Territory/PublicContent.h | 72 +++++ src/world/Territory/QuestBattle.cpp | 6 +- src/world/Territory/QuestBattle.h | 2 +- src/world/Territory/Territory.cpp | 26 ++ src/world/Territory/Territory.h | 8 + 44 files changed, 1037 insertions(+), 64 deletions(-) create mode 100644 src/world/Territory/PublicContent.cpp create mode 100644 src/world/Territory/PublicContent.h diff --git a/src/common/Common.h b/src/common/Common.h index 749ef112..8f9c258b 100644 --- a/src/common/Common.h +++ b/src/common/Common.h @@ -1248,9 +1248,6 @@ namespace Sapphire::Common GetGil = 9, // p1: gil EmptyCoffer = 11, // seems like no param }; - - using PlayerStateFlagList = std::vector< PlayerStateFlag >; - } #endif diff --git a/src/common/Network/CommonActorControl.h b/src/common/Network/CommonActorControl.h index 6ead8897..27657d42 100644 --- a/src/common/Network/CommonActorControl.h +++ b/src/common/Network/CommonActorControl.h @@ -111,6 +111,8 @@ namespace Sapphire::Network::ActorControl ScreenFadeOut = 0xAA, + CeremonyDecoration = 0xB9, + ZoneIn = 0xC8, ZoneInDefaultPos = 0xC9, @@ -364,6 +366,7 @@ namespace Sapphire::Network::ActorControl TitleList = 0x12F, UpdatedSeenHowTos = 0x133, + CutscenePlayed = 0x134, // param1 = cutscene id AllotAttribute = 0x135, ClearFieldMarkers = 0x13A, diff --git a/src/common/Network/PacketDef/Ipcs.h b/src/common/Network/PacketDef/Ipcs.h index c33cfad6..7bce247e 100644 --- a/src/common/Network/PacketDef/Ipcs.h +++ b/src/common/Network/PacketDef/Ipcs.h @@ -194,14 +194,7 @@ namespace Sapphire::Network::Packets EventPlay128 = 0x026E, // updated 5.58 EventPlay255 = 0x039E, // updated 5.58 - EventYield = 0x0123, // updated 5.58 - //EventYield4 = 0x0000, - //EventYield8 = 0x0000, - //EventYield16 = 0x0000, - //EventYield32 = 0x0000, - //EventYield64 = 0x0000, - //EventYield128 = 0x0000, - //EventYield255 = 0x0000, + EventContinue = 0x0123, // updated 5.58 EventStart = 0x01CC, // updated 5.58 EventFinish = 0x0180, // updated 5.58 @@ -274,6 +267,8 @@ namespace Sapphire::Network::Packets LandSetMap = 0x02F6, // updated 5.58 + CeremonySetActorAppearance = 0x00EB, // updated 5.58 + ////////////////////////////////////////////////// DuelChallenge = 0x0277, // 4.2; this is responsible for opening the ui @@ -390,7 +385,7 @@ namespace Sapphire::Network::Packets BuildPresetHandler = 0x00DC, // updated 5.58 TalkEventHandler = 0x012D, // updated 5.58 - EmoteEventHandler = 0xF35A, // updated 5.55 hotfix + EmoteEventHandler = 0x039E, // updated 5.58 WithinRangeEventHandler = 0x022C, // updated 5.58 OutOfRangeEventHandler = 0x0294, // updated 5.58 EnterTeriEventHandler = 0x00C1, // updated 5.58 @@ -398,7 +393,8 @@ namespace Sapphire::Network::Packets EventYieldHandler = 0x03A2, // updated 5.58 ReturnEventHandler = 0x0333, // updated 5.58 TradeReturnEventHandler = 0x0179, // updated 5.58 - TradeReturnEventHandler2 = 0x0169, // updated 5.55 hotfix + TradeReturnEventHandler2 = 0x02E1, // updated 5.58 + EventYield16Handler = 0x03D7, // updated 5.58 LinkshellEventHandler = 0x016B, // updated 4.5 LinkshellEventHandler1 = 0x016C, // updated 4.5 diff --git a/src/common/Network/PacketDef/Zone/ClientZoneDef.h b/src/common/Network/PacketDef/Zone/ClientZoneDef.h index 0d67ea61..903abf90 100644 --- a/src/common/Network/PacketDef/Zone/ClientZoneDef.h +++ b/src/common/Network/PacketDef/Zone/ClientZoneDef.h @@ -446,6 +446,24 @@ struct FFXIVIpcHousingEditInterior : uint16_t slot[10]; }; +struct FFXIVIpcEventYieldHandler : + FFXIVIpcBasePacket< EventYieldHandler > +{ + uint32_t eventId; + uint16_t scene; + uint16_t padding; + uint64_t unknown; +}; + +struct FFXIVIpcEventYield16Handler : + FFXIVIpcBasePacket< EventYield16Handler > +{ + uint32_t eventId; + uint16_t scene; + uint16_t padding; + uint32_t params[16]; +}; + struct FFXIVIpcCFCommenceHandler : FFXIVIpcBasePacket< CFCommenceHandler > { diff --git a/src/common/Network/PacketDef/Zone/ServerZoneDef.h b/src/common/Network/PacketDef/Zone/ServerZoneDef.h index bd1049e2..c0899b1e 100644 --- a/src/common/Network/PacketDef/Zone/ServerZoneDef.h +++ b/src/common/Network/PacketDef/Zone/ServerZoneDef.h @@ -1439,6 +1439,20 @@ namespace Sapphire::Network::Packets::Server uint8_t unknown[8]; }; + struct FFXIVIpcEventPlay16 : FFXIVIpcBasePacket< EventPlay16 > + { + uint64_t actorId; + uint32_t eventId; + uint16_t scene; + uint16_t padding; + uint32_t flags; + uint32_t param3; + uint8_t paramSize; + uint8_t padding1[3]; + uint32_t param[16]; + uint32_t padding2; + }; + template< int ArgCount > struct FFXIVIpcEventPlayN { @@ -1835,7 +1849,7 @@ namespace Sapphire::Network::Packets::Server uint32_t bNPCName; uint32_t textId; uint32_t popupTimeMs; - uint32_t pad3[4]; + uint32_t param[6]; }; @@ -2238,6 +2252,43 @@ namespace Sapphire::Network::Packets::Server char memberName[32]; uint8_t padding[3]; }; + + struct FFXIVIpcEventContinue : FFXIVIpcBasePacket< EventContinue > + { + uint32_t eventId; + uint16_t scene; + uint16_t unknown; + uint64_t unknown2; + }; + + struct FFXIVDirectorUnk4 : FFXIVIpcBasePacket< SomeDirectorUnk4 > + { + uint32_t param[4]; + uint64_t unknown; + }; + + struct FFXIVCeremonySetActorAppearance : FFXIVIpcBasePacket< CeremonySetActorAppearance > + { + uint8_t u1; + uint8_t questBL; + uint16_t padding1; + uint32_t u3; + struct + { + uint64_t mainWeaponModel; + uint64_t secWeaponModel; + uint64_t craftToolModel; + uint32_t c_u6; + uint32_t c_u7; + uint32_t charId; + uint16_t u4; + uint16_t guardianDeity; + uint32_t u5; + uint32_t models[10]; + uint8_t look[26]; + uint16_t padding3; + } actors[2]; + }; } #endif /*_CORE_NETWORK_PACKETS_SERVER_IPC_H*/ diff --git a/src/common/Util/UtilMath.cpp b/src/common/Util/UtilMath.cpp index ae61e171..d81a2f62 100644 --- a/src/common/Util/UtilMath.cpp +++ b/src/common/Util/UtilMath.cpp @@ -76,4 +76,9 @@ uint16_t Util::floatToUInt16Rot( float val ) uint8_t Util::floatToUInt8Rot( float val ) { return static_cast< uint8_t >( 0x80 * ( ( val + PI ) ) / PI ); +} + +float Util::floatFromUInt16Rot( uint16_t rot ) +{ + return rot / 32768.0f * PI - PI; } \ No newline at end of file diff --git a/src/common/Util/UtilMath.h b/src/common/Util/UtilMath.h index c35ef6be..1168d71b 100644 --- a/src/common/Util/UtilMath.h +++ b/src/common/Util/UtilMath.h @@ -25,6 +25,8 @@ namespace Sapphire::Common::Util uint16_t floatToUInt16Rot( float val ); + float floatFromUInt16Rot( uint16_t rot ); + uint8_t floatToUInt8Rot( float val ); template < typename T > diff --git a/src/scripts/common/CmnDefCutSceneReplay.cpp b/src/scripts/common/CmnDefCutSceneReplay.cpp index 2ccfab69..11c9b80b 100644 --- a/src/scripts/common/CmnDefCutSceneReplay.cpp +++ b/src/scripts/common/CmnDefCutSceneReplay.cpp @@ -32,7 +32,7 @@ public: // todo: this is fucked }; - player.playScene( getId(), 1, 0xFB2EC8F8, 0, 1, returnScene, callback ); + player.playScene( getId(), 1, FADE_OUT | CONDITION_CUTSCENE | HIDE_UI, 0, 1, returnScene, callback ); } void onTalk( uint32_t eventId, Entity::Player& player, uint64_t actorId ) override diff --git a/src/scripts/common/eobj/HousingEstateEntrance.cpp b/src/scripts/common/eobj/HousingEstateEntrance.cpp index 2abc371b..bb280288 100644 --- a/src/scripts/common/eobj/HousingEstateEntrance.cpp +++ b/src/scripts/common/eobj/HousingEstateEntrance.cpp @@ -78,7 +78,7 @@ public: return; } - player.setInstance( internalZone, pos ); + player.setInstance( internalZone, pos, player.getRot() ); } ); } }; diff --git a/src/world/Actor/Actor.cpp b/src/world/Actor/Actor.cpp index efaf0e51..43ba0900 100644 --- a/src/world/Actor/Actor.cpp +++ b/src/world/Actor/Actor.cpp @@ -351,7 +351,7 @@ Sapphire::InstanceContentPtr Sapphire::Entity::Actor::getCurrentInstance() const return nullptr; } -/*! \return QuestBattlePtr to the current instance, nullptr if not an instance or not set */ +/*! \return QuestBattlePtr to the current instance, nullptr if not a quest battle or not set */ Sapphire::QuestBattlePtr Sapphire::Entity::Actor::getCurrentQuestBattle() const { if( m_pCurrentTerritory ) @@ -360,6 +360,15 @@ Sapphire::QuestBattlePtr Sapphire::Entity::Actor::getCurrentQuestBattle() const return nullptr; } +/*! \return PublicContentPtr to the current instance, nullptr if not a public content or not set */ +Sapphire::PublicContentPtr Sapphire::Entity::Actor::getCurrentPublicContent() const +{ + if( m_pCurrentTerritory ) + return m_pCurrentTerritory->getAsPublicContent(); + + return nullptr; +} + /*! Get the current cell of a region the actor is in diff --git a/src/world/Actor/Actor.h b/src/world/Actor/Actor.h index 80bd066e..cf8f7479 100644 --- a/src/world/Actor/Actor.h +++ b/src/world/Actor/Actor.h @@ -130,6 +130,8 @@ namespace Sapphire::Entity QuestBattlePtr getCurrentQuestBattle() const; + PublicContentPtr getCurrentPublicContent() const; + // get the current cell of a region the actor is in Cell* getCellPtr(); diff --git a/src/world/Actor/EventObject.h b/src/world/Actor/EventObject.h index f2ae6d05..c497bf1f 100644 --- a/src/world/Actor/EventObject.h +++ b/src/world/Actor/EventObject.h @@ -13,7 +13,7 @@ namespace Sapphire::Entity Common::FFXIVARR_POSITION3 pos, float rotation, const std::string& givenName = "none" ); using OnTalkEventHandler = std::function< void( Entity::Player&, Entity::EventObjectPtr, - TerritoryPtr, uint64_t ) >; + TerritoryPtr, uint32_t, uint64_t ) >; uint32_t getGimmickId() const; diff --git a/src/world/Actor/Player.cpp b/src/world/Actor/Player.cpp index 7f089e92..a71184a5 100644 --- a/src/world/Actor/Player.cpp +++ b/src/world/Actor/Player.cpp @@ -23,6 +23,8 @@ #include "Territory/Territory.h" #include "Territory/ZonePosition.h" #include "Territory/InstanceContent.h" +#include "Territory/QuestBattle.h" +#include "Territory/PublicContent.h" #include "Territory/InstanceObjectCache.h" #include "Territory/Land.h" @@ -472,7 +474,7 @@ bool Sapphire::Entity::Player::setInstance( TerritoryPtr instance ) return teriMgr.movePlayer( instance, getAsPlayer() ); } -bool Sapphire::Entity::Player::setInstance( TerritoryPtr instance, Common::FFXIVARR_POSITION3 pos ) +bool Sapphire::Entity::Player::setInstance( TerritoryPtr instance, Common::FFXIVARR_POSITION3 pos, float rot ) { m_onEnterEventDone = false; if( !instance ) @@ -490,11 +492,17 @@ bool Sapphire::Entity::Player::setInstance( TerritoryPtr instance, Common::FFXIV m_prevTerritoryId = getTerritoryId(); } + m_pos = pos; + m_rot = rot; if( teriMgr.movePlayer( instance, getAsPlayer() ) ) { - m_pos = pos; return true; } + else + { + m_pos = m_prevPos; + m_rot= m_prevRot; + } return false; } @@ -503,8 +511,18 @@ bool Sapphire::Entity::Player::exitInstance() { auto& teriMgr = Common::Service< TerritoryMgr >::ref(); - auto pZone = getCurrentTerritory(); - auto pInstance = pZone->getAsInstanceContent(); + auto d = getCurrentTerritory()->getAsDirector(); + if( d && d->getContentFinderConditionId() > 0 ) + { + auto p = makeZonePacket< FFXIVDirectorUnk4 >( getId() ); + p->data().param[0] = d->getDirectorId(); + p->data().param[1] = 1534; + p->data().param[2] = 1; + p->data().param[3] = d->getContentFinderConditionId(); + queuePacket( p ); + + prepareZoning( 0, 1, 1, 0, 0, 1, 9 ); + } resetHp(); resetMp(); @@ -1755,14 +1773,14 @@ void Sapphire::Entity::Player::sendZonePackets() //setStateFlag( PlayerStateFlag::BetweenAreas ); //setStateFlag( PlayerStateFlag::BetweenAreas1 ); - if( isActionLearned( static_cast< uint8_t >( Common::UnlockEntry::HuntingLog ) ) ) - sendHuntingLog(); - sendStats(); // only initialize the UI if the player in fact just logged in. if( isLogin() ) { + if( isActionLearned( static_cast< uint8_t >( Common::UnlockEntry::HuntingLog ) ) ) + sendHuntingLog(); + auto contentFinderList = makeZonePacket< FFXIVIpcCFAvailableContents >( getId() ); for( auto i = 0; i < sizeof( contentFinderList->data().contents ); i++ ) @@ -1812,6 +1830,12 @@ void Sapphire::Entity::Player::sendZonePackets() initZonePacket->data().pos.x = getPos().x; initZonePacket->data().pos.y = getPos().y; initZonePacket->data().pos.z = getPos().z; + if( auto d = getCurrentTerritory()->getAsDirector() ) + { + initZonePacket->data().contentfinderConditionId = d->getContentFinderConditionId(); + initZonePacket->data().bitmask = 0xFF; + initZonePacket->data().bitmask1 = 0x2A; + } queuePacket( initZonePacket ); getCurrentTerritory()->onPlayerZoneIn( *this ); diff --git a/src/world/Actor/Player.h b/src/world/Actor/Player.h index 0b95ab24..63f41eb6 100644 --- a/src/world/Actor/Player.h +++ b/src/world/Actor/Player.h @@ -111,6 +111,8 @@ namespace Sapphire::Entity void playSceneChain( uint32_t eventId, uint32_t scene, uint32_t flags, Event::EventHandler::SceneChainCallback sceneChainCallback ); + void playScene16( uint32_t eventId, uint32_t scene, uint32_t flags, uint32_t param3, std::vector< uint32_t > paramList, Event::EventHandler::SceneReturnCallback eventReturnCallback ); + /*! setup the event and return a ptr to it */ Event::EventHandlerPtr bootstrapSceneEvent( uint32_t eventId, uint32_t flags ); @@ -490,7 +492,7 @@ namespace Sapphire::Entity bool setInstance( TerritoryPtr instance ); /*! sets the players instance & initiates zoning process */ - bool setInstance( Sapphire::TerritoryPtr instance, Sapphire::Common::FFXIVARR_POSITION3 pos ); + bool setInstance( Sapphire::TerritoryPtr instance, Sapphire::Common::FFXIVARR_POSITION3 pos, float rot ); /*! returns the player to their position before zoning into an instance */ bool exitInstance(); @@ -992,6 +994,8 @@ namespace Sapphire::Entity ////////////////////////////////////////////////////////////////////////////////////////////////////// + void setPosAndNotifyClient( float x, float y, float z, float rot ); + Common::HuntingLogEntry& getHuntingLogEntry( uint8_t index ); void sendHuntingLog(); diff --git a/src/world/Actor/PlayerEvent.cpp b/src/world/Actor/PlayerEvent.cpp index 12f8c626..eb9659e0 100644 --- a/src/world/Actor/PlayerEvent.cpp +++ b/src/world/Actor/PlayerEvent.cpp @@ -323,6 +323,33 @@ void Sapphire::Entity::Player::eventFinish( uint32_t eventId, uint32_t freePlaye unsetStateFlag( PlayerStateFlag::InNpcEvent ); } +void Sapphire::Entity::Player::playScene16( uint32_t eventId, uint32_t scene, uint32_t flags, uint32_t param3, std::vector< uint32_t > paramList, Event::EventHandler::SceneReturnCallback eventReturnCallback ) +{ + auto pEvent = bootstrapSceneEvent( eventId, flags ); + if( !pEvent ) + return; + + pEvent->setPlayedScene( true ); + pEvent->setEventReturnCallback( eventReturnCallback ); + pEvent->setSceneChainCallback( nullptr ); + auto eventPlay16 = makeZonePacket< FFXIVIpcEventPlay16 >( getId() ); + eventPlay16->data().actorId = pEvent->getActorId(); + eventPlay16->data().eventId = pEvent->getId(); + eventPlay16->data().scene = scene; + eventPlay16->data().flags = flags; + eventPlay16->data().param3 = param3; + eventPlay16->data().paramSize = paramList.size(); + int i = 0; + for( auto p : paramList ) + { + assert( i < 16 ); + eventPlay16->data().param[ i ] = paramList.at( i ); + i++; + } + + queuePacket( eventPlay16 ); +} + void Sapphire::Entity::Player::eventActionStart( uint32_t eventId, uint32_t action, World::Action::ActionCallback finishCallback, diff --git a/src/world/Event/Director.cpp b/src/world/Event/Director.cpp index 864bf0e3..5bde5992 100644 --- a/src/world/Event/Director.cpp +++ b/src/world/Event/Director.cpp @@ -16,9 +16,10 @@ using namespace Sapphire::Network::Packets; using namespace Sapphire::Network::Packets::Server; using namespace Sapphire::Network::ActorControl; -Sapphire::Event::Director::Director( Sapphire::Event::Director::DirectorType type, uint16_t contentId ) : +Sapphire::Event::Director::Director( Sapphire::Event::Director::DirectorType type, uint16_t contentId, uint16_t contentFinderConditionId ) : m_contentId( contentId ), m_type( type ), + m_contentFinderConditionId( contentFinderConditionId ), m_directorId( ( static_cast< uint32_t >( type ) << 16 ) | contentId ), m_sequence( 1 ), m_branch( 0 ), @@ -37,6 +38,11 @@ uint16_t Sapphire::Event::Director::getContentId() const return m_contentId; } +uint16_t Sapphire::Event::Director::getContentFinderConditionId() const +{ + return m_contentFinderConditionId; +} + uint8_t Sapphire::Event::Director::getSequence() const { return m_sequence; @@ -52,14 +58,18 @@ void Sapphire::Event::Director::sendDirectorVars( Sapphire::Entity::Player& play auto varPacket = makeZonePacket< FFXIVIpcDirectorVars >( player.getId() ); varPacket->data().m_directorId = getDirectorId(); varPacket->data().m_sequence = getSequence(); - varPacket->data().m_branch = 0; + varPacket->data().m_branch = getBranch(); memcpy( varPacket->data().m_unionData, m_unionData.arrData, sizeof( varPacket->data().m_unionData ) ); player.queuePacket( varPacket ); + player.sendDebug( "DirectorVar#{}: {:02X}{:02X}{:02X}{:02X}{:02X}{:02X}{:02X}{:02X}{:02X}{:02X} seq{}, b{}", getDirectorId(), + m_unionData.ui8.UI8A, m_unionData.ui8.UI8B, m_unionData.ui8.UI8C, m_unionData.ui8.UI8D, m_unionData.ui8.UI8E, + m_unionData.ui8.UI8F, m_unionData.ui8.UI8G, m_unionData.ui8.UI8H, m_unionData.ui8.UI8I, m_unionData.ui8.UI8J, + getSequence(), getBranch() ); } void Sapphire::Event::Director::sendDirectorInit( Sapphire::Entity::Player& player ) const { - Logger::debug( "DirectorID#{}, QuestBattleID#{}", m_directorId, m_contentId ); + Logger::debug( "DirectorID#{}, ContentId#{}, ContentFinderConditionId#{}", m_directorId, m_contentId, m_contentFinderConditionId ); player.queuePacket( makeActorControlSelf( player.getId(), DirectorInit, m_directorId, m_contentId ) ); } @@ -183,12 +193,12 @@ void Sapphire::Event::Director::setDirectorSequence( uint8_t value ) m_sequence = value; } -void Sapphire::Event::Director::setCustomVar( uint32_t varId, uint32_t value ) +void Sapphire::Event::Director::setCustomVar( uint32_t varId, uint64_t value ) { m_customVarMap[ varId ] = value; } -uint32_t Sapphire::Event::Director::getCustomVar( uint32_t varId ) +uint64_t Sapphire::Event::Director::getCustomVar( uint32_t varId ) { auto it = m_customVarMap.find( varId ); if( it != m_customVarMap.end() ) diff --git a/src/world/Event/Director.h b/src/world/Event/Director.h index 38970984..3bc9efaa 100644 --- a/src/world/Event/Director.h +++ b/src/world/Event/Director.h @@ -42,12 +42,14 @@ namespace Sapphire::Event DutyFailed }; - Director( DirectorType type, uint16_t contentId ); + Director( DirectorType type, uint16_t contentId, uint16_t contentFinderConditionId = 0 ); uint32_t getDirectorId() const; uint16_t getContentId() const; + uint16_t getContentFinderConditionId() const; + DirectorType getType() const; uint8_t getSequence() const; @@ -104,8 +106,8 @@ namespace Sapphire::Event void setDirectorBranch( uint8_t value ); - void setCustomVar( uint32_t varId, uint32_t value ); - uint32_t getCustomVar( uint32_t varId ); + void setCustomVar( uint32_t varId, uint64_t value ); + uint64_t getCustomVar( uint32_t varId ); private: /*! Id of the content of the director */ @@ -114,6 +116,8 @@ namespace Sapphire::Event /*! DirectorType | ContentId */ uint32_t m_directorId; + uint16_t m_contentFinderConditionId; + /*! currect sequence */ uint8_t m_sequence; @@ -183,7 +187,7 @@ namespace Sapphire::Event uint32_t m_elapsedTime; - std::unordered_map< uint32_t, uint32_t > m_customVarMap; + std::unordered_map< uint32_t, uint64_t > m_customVarMap; }; diff --git a/src/world/Event/EventHandler.h b/src/world/Event/EventHandler.h index 9bec90a4..4afc4480 100644 --- a/src/world/Event/EventHandler.h +++ b/src/world/Event/EventHandler.h @@ -79,6 +79,7 @@ namespace Sapphire::Event Adventure = 0x0021, DailyQuestSupply = 0x0022, ICDirector = 0x8003, + PublicContentDirector = 0x8004, QuestBattleDirector = 0x8006, }; diff --git a/src/world/ForwardsZone.h b/src/world/ForwardsZone.h index 13b6b489..4592c320 100644 --- a/src/world/ForwardsZone.h +++ b/src/world/ForwardsZone.h @@ -24,6 +24,7 @@ TYPE_FORWARD( HousingZone ); TYPE_FORWARD( House ); TYPE_FORWARD( InstanceContent ); TYPE_FORWARD( QuestBattle ); +TYPE_FORWARD( PublicContent ); TYPE_FORWARD( Item ); TYPE_FORWARD( ItemContainer ); TYPE_FORWARD( ZonePosition ); diff --git a/src/world/Manager/DebugCommandMgr.cpp b/src/world/Manager/DebugCommandMgr.cpp index 85aeeed9..5daafd7f 100644 --- a/src/world/Manager/DebugCommandMgr.cpp +++ b/src/world/Manager/DebugCommandMgr.cpp @@ -32,6 +32,7 @@ #include "Territory/HousingZone.h" #include "Territory/InstanceContent.h" #include "Territory/QuestBattle.h" +#include "Territory/PublicContent.h" #include "Manager/TerritoryMgr.h" #include "Event/EventDefs.h" @@ -60,6 +61,8 @@ Sapphire::World::Manager::DebugCommandMgr::DebugCommandMgr() registerCommand( "script", &DebugCommandMgr::script, "Server script utilities.", 1 ); registerCommand( "instance", &DebugCommandMgr::instance, "Instance utilities", 1 ); registerCommand( "questbattle", &DebugCommandMgr::questBattle, "Quest battle utilities", 1 ); + registerCommand( "pc", &DebugCommandMgr::pc, "Public content utilities", 1 ); + registerCommand( "publiccontent", &DebugCommandMgr::pc, "Public content utilities", 1 ); registerCommand( "qb", &DebugCommandMgr::questBattle, "Quest battle utilities", 1 ); registerCommand( "housing", &DebugCommandMgr::housing, "Housing utilities", 1 ); } @@ -583,9 +586,23 @@ void Sapphire::World::Manager::DebugCommandMgr::get( char* data, Entity::Player& int16_t map_id = exdData.get< Sapphire::Data::TerritoryType >( player.getCurrentTerritory()->getTerritoryTypeId() )->map; - player.sendNotice( "Pos:\n {0}\n {1}\n {2}\n {3}\n MapId: {4}\n ZoneId:{5}", + player.sendNotice( "Pos: x: {0}, y: {1}, z: {2}, r: {3}\n MapId: {4}, ZoneId:{5}, Weather:{6}, Festival:{7}, {8}", player.getPos().x, player.getPos().y, player.getPos().z, - player.getRot(), map_id, player.getCurrentTerritory()->getTerritoryTypeId() ); + player.getRot(), map_id, player.getCurrentTerritory()->getTerritoryTypeId(), + static_cast< uint8_t >( player.getCurrentTerritory()->getCurrentWeather() ), player.getCurrentTerritory()->getCurrentFestival().first, + player.getCurrentTerritory()->getCurrentFestival().second ); + if( auto instance = player.getCurrentInstance() ) + { + player.sendNotice( "Instance info:\nContentId: {}, DirectorId: {}\nSequence: {}, Branch: {}, BGM: {}", + instance->getInstanceContentId(), instance->getDirectorId(), instance->getSequence(), + instance->getBranch(), instance->getCurrentBGM() ); + } + else if( auto instance = player.getCurrentPublicContent() ) + { + player.sendNotice( "Public content info:\nContentId: {}, DirectorId: {}\nSequence: {}, Branch: {}", + instance->getContentId(), instance->getDirectorId(), instance->getSequence(), + instance->getBranch() ); + } } else { @@ -1282,3 +1299,137 @@ void Sapphire::World::Manager::DebugCommandMgr::housing( char* data, Entity::Pla player.sendDebug( "Unknown sub command." ); } } + +void Sapphire::World::Manager::DebugCommandMgr::pc( char* data, Entity::Player& player, std::shared_ptr< DebugCommand > command ) +{ + auto& terriMgr = Common::Service< TerritoryMgr >::ref(); + std::string cmd( data ), params, subCommand; + auto cmdPos = cmd.find_first_of( ' ' ); + + if( cmdPos != std::string::npos ) + { + params = cmd.substr( cmdPos + 1 ); + + auto p = params.find_first_of( ' ' ); + + if( p != std::string::npos ) + { + subCommand = params.substr( 0, p ); + params = params.substr( subCommand.length() + 1 ); + } + else + subCommand = params; + } + + if( subCommand == "create" || subCommand == "cr" ) + { + uint32_t contentFinderConditionId; + sscanf( params.c_str(), "%d", &contentFinderConditionId ); + + auto instance = terriMgr.createPublicContent( contentFinderConditionId ); + if( instance ) + player.sendDebug( "Created instance with id#{0} -> {1}", instance->getGuId(), instance->getName() ); + else + player.sendDebug( "Failed to create instance with id#{0}", contentFinderConditionId ); + } + else if ( subCommand == "create2" || subCommand == "cr2" ) + { + uint16_t contentId, terriId; + sscanf( params.c_str(), "%hu %hu", &contentId, &terriId ); + + auto instance = terriMgr.createPublicContent( contentId, terriId ); + if( instance ) + player.sendDebug( "Created instance with id#{0} -> {1}", instance->getGuId(), instance->getName() ); + else + player.sendDebug( "Failed to create instance with id#{0}, territory#{1}. Server console output may contain additional info.", contentId, terriId ); + } + else if( subCommand == "remove" || subCommand == "rm" ) + { + uint32_t terriId; + sscanf( params.c_str(), "%d", &terriId ); + + if( terriMgr.removeTerritoryInstance( terriId ) ) + player.sendDebug( "Removed instance with id#{0}", terriId ); + else + player.sendDebug( "Failed to remove instance with id#{0}", terriId ); + } + else if( subCommand == "return" || subCommand == "ret" ) + { + player.exitInstance(); + } + else if( subCommand == "set" ) + { + uint32_t index; + uint32_t value; + sscanf( params.c_str(), "%d %d", &index, &value ); + + + auto instance = std::dynamic_pointer_cast< PublicContent >( player.getCurrentTerritory() ); + if( !instance ) + return; + + instance->setVar( static_cast< uint8_t >( index ), static_cast< uint8_t >( value ) ); + } + else if( subCommand == "seq" ) + { + uint8_t seq; + + sscanf( params.c_str(), "%hhu", &seq ); + + auto instance = std::dynamic_pointer_cast< PublicContent >( player.getCurrentTerritory() ); + if( !instance ) + return; + + instance->setSequence( seq ); + } + else if( subCommand == "branch" ) + { + uint8_t branch; + + sscanf( params.c_str(), "%hhu", &branch ); + + auto instance = std::dynamic_pointer_cast< PublicContent >( player.getCurrentTerritory() ); + if( !instance ) + return; + + instance->setBranch( branch ); + } + else if( subCommand == "objstate" ) + { + char objName[128]; + uint8_t state; + + sscanf( params.c_str(), "%s %hhu", objName, &state ); + + auto instance = std::dynamic_pointer_cast< PublicContent >( player.getCurrentTerritory() ); + if( !instance ) + return; + + auto obj = instance->getEObjByName( objName ); + if( !obj ) + return; + + obj->setState( state ); + } + else if( subCommand == "objflag" ) + { + char objName[256]; + uint32_t state1; + uint32_t state2; + + sscanf( params.c_str(), "%s %i %i", objName, &state1, &state2 ); + + auto instance = std::dynamic_pointer_cast< PublicContent >( player.getCurrentTerritory() ); + if( !instance ) + return; + + auto obj = instance->getEObjByName( objName ); + if( !obj ) + { + player.sendDebug( "No eobj found." ); + return; + } + + obj->setAnimationFlag( state1, state2 ); + } +} diff --git a/src/world/Manager/DebugCommandMgr.h b/src/world/Manager/DebugCommandMgr.h index 25921312..2607f6ab 100644 --- a/src/world/Manager/DebugCommandMgr.h +++ b/src/world/Manager/DebugCommandMgr.h @@ -53,6 +53,7 @@ namespace Sapphire::World::Manager void instance( char* data, Entity::Player& player, std::shared_ptr< DebugCommand > command ); void questBattle( char* data, Entity::Player& player, std::shared_ptr< DebugCommand > command ); + void pc( char* data, Entity::Player& player, std::shared_ptr< DebugCommand > command ); void housing( char* data, Entity::Player& player, std::shared_ptr< DebugCommand > command) ; diff --git a/src/world/Manager/EventMgr.cpp b/src/world/Manager/EventMgr.cpp index 00505a41..bc417c11 100644 --- a/src/world/Manager/EventMgr.cpp +++ b/src/world/Manager/EventMgr.cpp @@ -74,6 +74,13 @@ std::string Sapphire::World::Manager::EventMgr::getEventName( uint32_t eventId ) name[ 0 ] = toupper( name[ 0 ] ); return name; } + case Event::EventHandler::EventHandlerType::PublicContentDirector: + { + auto pcInfo = exdData.get< Sapphire::Data::PublicContent >( eventId & 0x0000FFFF ); + if( !pcInfo ) + return "unknown"; + return pcInfo->name; + } case Event::EventHandler::EventHandlerType::Warp: diff --git a/src/world/Manager/TerritoryMgr.cpp b/src/world/Manager/TerritoryMgr.cpp index 50711549..825af480 100644 --- a/src/world/Manager/TerritoryMgr.cpp +++ b/src/world/Manager/TerritoryMgr.cpp @@ -13,6 +13,7 @@ #include "Territory/ZonePosition.h" #include "Territory/InstanceContent.h" #include "Territory/QuestBattle.h" +#include "Territory/PublicContent.h" #include "TerritoryMgr.h" #include "HousingMgr.h" @@ -316,7 +317,7 @@ Sapphire::TerritoryPtr Sapphire::World::Manager::TerritoryMgr::createQuestBattle Logger::debug( "Starting instance for QuestBattle id: {0} ({1})", questBattleId, pQuestInfo->name ); auto pZone = make_QuestBattle( pQuestBattleInfo, pContentFinderCondition->territoryType, getNextInstanceId(), - pTeri->name, pQuestInfo->name, questBattleId ); + pTeri->name, pQuestInfo->name, questBattleId, contentFinderConditionId ); pZone->init(); m_questBattleIdToInstanceMap[ questBattleId ][ pZone->getGuId() ] = pZone; @@ -350,7 +351,7 @@ Sapphire::TerritoryPtr Sapphire::World::Manager::TerritoryMgr::createInstanceCon Logger::debug( "Starting instance for InstanceContent id: {0} ({1})", instanceContentId, pContentFinderCondition->name ); auto pZone = make_InstanceContent( pInstanceContent, pContentFinderCondition->territoryType, getNextInstanceId(), - pTeri->name, pContentFinderCondition->name, instanceContentId ); + pTeri->name, pContentFinderCondition->name, instanceContentId, contentFinderConditionId ); pZone->init(); m_instanceContentIdToInstanceMap[ instanceContentId ][ pZone->getGuId() ] = pZone; @@ -360,6 +361,68 @@ Sapphire::TerritoryPtr Sapphire::World::Manager::TerritoryMgr::createInstanceCon return pZone; } +Sapphire::TerritoryPtr Sapphire::World::Manager::TerritoryMgr::createPublicContent( uint32_t contentFinderConditionId ) +{ + auto& exdData = Common::Service< Data::ExdDataGenerated >::ref(); + + auto pContentFinderCondition = exdData.get< Sapphire::Data::ContentFinderCondition >( contentFinderConditionId ); + if( !pContentFinderCondition ) + return nullptr; + auto contentId = pContentFinderCondition->content; + + auto pPublicContent = exdData.get< Sapphire::Data::PublicContent >( contentId ); + if( !pPublicContent ) + return nullptr; + + auto pTeri = getTerritoryDetail( pContentFinderCondition->territoryType ); + + if( !pTeri || pContentFinderCondition->name.empty() ) + return nullptr; + + Logger::debug( "Starting instance for PublicContent id: {0} ({1})", contentId, pContentFinderCondition->name ); + + auto pZone = make_PublicContent( pPublicContent, pContentFinderCondition->territoryType, getNextInstanceId(), + pTeri->name, pContentFinderCondition->name, contentId, contentFinderConditionId ); + pZone->init(); + + m_publicContentIdToInstanceMap[ contentId ][ pZone->getGuId() ] = pZone; + m_guIdToTerritoryPtrMap[ pZone->getGuId() ] = pZone; + m_instanceZoneSet.insert( pZone ); + + return pZone; +} + +Sapphire::TerritoryPtr Sapphire::World::Manager::TerritoryMgr::createPublicContent( uint16_t contentId, uint16_t territoryId ) +{ + auto& exdData = Common::Service< Data::ExdDataGenerated >::ref(); + + auto pPublicContent = exdData.get< Sapphire::Data::PublicContent >( contentId ); + if( !pPublicContent ) + return nullptr; + + if( pPublicContent->contentFinderCondition > 0 ) + { + Logger::warn( "the public content {} has a ContentFinderCondition value of {}, create the instance using it instead.", contentId, pPublicContent->contentFinderCondition ); + return nullptr; + } + + auto pTeri = getTerritoryDetail( territoryId ); + + if( !pTeri ) + return nullptr; + + Logger::debug( "Starting instance for PublicContent id: {0} ({1})", contentId, pPublicContent->name ); + + auto pZone = make_PublicContent( pPublicContent, territoryId, getNextInstanceId(), pTeri->name, pPublicContent->name, contentId, 0 ); + pZone->init(); + + m_publicContentIdToInstanceMap[ contentId ][ pZone->getGuId() ] = pZone; + m_guIdToTerritoryPtrMap[ pZone->getGuId() ] = pZone; + m_instanceZoneSet.insert( pZone ); + + return pZone; +} + Sapphire::TerritoryPtr Sapphire::World::Manager::TerritoryMgr::findOrCreateHousingInterior( const Common::LandIdent landIdent ) { // check if zone already spawned first @@ -444,11 +507,21 @@ bool Sapphire::World::Manager::TerritoryMgr::removeTerritoryInstance( uint32_t g m_instanceZoneSet.erase( pZone ); m_territorySet.erase( pZone ); - if( isInstanceContentTerritory( pZone->getTerritoryTypeId() ) ) + if( pZone->getAsInstanceContent() ) { auto instance = std::dynamic_pointer_cast< InstanceContent >( pZone ); m_instanceContentIdToInstanceMap[ instance->getInstanceContentId() ].erase( pZone->getGuId() ); } + else if( pZone->getAsPublicContent() ) + { + auto instance = std::dynamic_pointer_cast< PublicContent >( pZone ); + m_publicContentIdToInstanceMap[ instance->getContentId() ].erase( pZone->getGuId() ); + } + else if( pZone->getAsQuestBattle() ) + { + auto instance = std::dynamic_pointer_cast< QuestBattle >( pZone ); + m_questBattleIdToInstanceMap[ instance->getQuestBattleId() ].erase( pZone->getGuId() ); + } else m_territoryTypeIdToInstanceGuidMap[ pZone->getTerritoryTypeId() ].erase( pZone->getGuId() ); @@ -616,7 +689,7 @@ bool Sapphire::World::Manager::TerritoryMgr::movePlayer( TerritoryPtr pZone, Sap if( pHousing ) pPlayer->setTerritoryId( pHousing->getLandSetId() ); } - else if( isInstanceContentTerritory( pZone->getTerritoryTypeId() ) ) + else if( pZone->getAsInstanceContent() || pZone->getAsQuestBattle() || pZone->getAsPublicContent() ) { pPlayer->setTerritoryId( pZone->getGuId() ); } diff --git a/src/world/Manager/TerritoryMgr.h b/src/world/Manager/TerritoryMgr.h index 9401a6a9..ff9dd285 100644 --- a/src/world/Manager/TerritoryMgr.h +++ b/src/world/Manager/TerritoryMgr.h @@ -118,6 +118,9 @@ namespace Sapphire::World::Manager TerritoryPtr createQuestBattle( uint32_t contentFinderConditionId ); + TerritoryPtr createPublicContent( uint32_t contentFinderConditionId ); + TerritoryPtr createPublicContent( uint16_t contentId, uint16_t territoryId ); + void createAndJoinQuestBattle( Entity::Player& player, uint16_t contentFinderConditionId ); TerritoryPtr findOrCreateHousingInterior( const Common::LandIdent landIdent ); @@ -179,6 +182,7 @@ namespace Sapphire::World::Manager using InstanceContentIdToInstanceMap = std::unordered_map< uint16_t, InstanceIdToTerritoryPtrMap >; using QuestBattleIdToInstanceMap = std::unordered_map< uint16_t, InstanceIdToTerritoryPtrMap >; using QuestBattleIdToContentFinderCondMap = std::unordered_map< uint16_t, uint16_t >; + using PublicContentIdToInstanceMap = std::unordered_map< uint16_t, InstanceIdToTerritoryPtrMap >; using PlayerIdToInstanceIdMap = std::unordered_map< uint32_t, uint32_t >; using PositionMap = std::unordered_map< int32_t, ZonePositionPtr >; using InstanceIdList = std::vector< uint32_t >; @@ -196,9 +200,12 @@ namespace Sapphire::World::Manager /*! map holding actual instances of InstanceContent */ InstanceContentIdToInstanceMap m_instanceContentIdToInstanceMap; - /*! map holding actual instances of InstanceContent */ + /*! map holding actual instances of QuestBattle */ QuestBattleIdToInstanceMap m_questBattleIdToInstanceMap; + /*! map holding actual instances of PublicContent */ + PublicContentIdToInstanceMap m_publicContentIdToInstanceMap; + /*! flat map for easier lookup of instances by guid */ InstanceIdToTerritoryPtrMap m_guIdToTerritoryPtrMap; diff --git a/src/world/Network/GameConnection.cpp b/src/world/Network/GameConnection.cpp index 17907571..7309004d 100644 --- a/src/world/Network/GameConnection.cpp +++ b/src/world/Network/GameConnection.cpp @@ -106,6 +106,8 @@ Sapphire::Network::GameConnection::GameConnection( Sapphire::Network::HivePtr pH setZoneHandler( ClientZoneIpcType::TradeReturnEventHandler, "TradeReturnEventHandler", &GameConnection::eventHandlerReturn ); setZoneHandler( ClientZoneIpcType::TradeReturnEventHandler2, "TradeReturnEventHandler2", &GameConnection::eventHandlerReturn ); + setZoneHandler( ClientZoneIpcType::EventYieldHandler, "EventYieldHandler", &GameConnection::eventYieldHandler ); + setZoneHandler( ClientZoneIpcType::EventYield16Handler, "EventYield16Handler", &GameConnection::eventYieldHandler ); setZoneHandler( ClientZoneIpcType::ShopEventHandler, "ShopEventHandler", &GameConnection::eventHandlerShop ); diff --git a/src/world/Network/GameConnection.h b/src/world/Network/GameConnection.h index 0e1da4cb..92e1d661 100644 --- a/src/world/Network/GameConnection.h +++ b/src/world/Network/GameConnection.h @@ -194,6 +194,8 @@ namespace Sapphire::Network DECLARE_HANDLER( worldInteractionhandler ); DECLARE_HANDLER( diveHandler ); + + DECLARE_HANDLER( eventYieldHandler ); }; } diff --git a/src/world/Network/Handlers/CFHandlers.cpp b/src/world/Network/Handlers/CFHandlers.cpp index 08e53124..9778d37c 100644 --- a/src/world/Network/Handlers/CFHandlers.cpp +++ b/src/world/Network/Handlers/CFHandlers.cpp @@ -103,7 +103,6 @@ void Sapphire::Network::GameConnection::cfDutyAccepted( const Packets::FFXIVARR_ player.prepareZoning( pInstance->getTerritoryTypeId(), true, 1, 0, 0, 1, 9 ); - auto sourceZoneGuId = player.getCurrentTerritory()->getGuId(); player.setInstance( instance ); } } diff --git a/src/world/Network/Handlers/ClientTriggerHandler.cpp b/src/world/Network/Handlers/ClientTriggerHandler.cpp index 3cd9517d..c2bedc37 100644 --- a/src/world/Network/Handlers/ClientTriggerHandler.cpp +++ b/src/world/Network/Handlers/ClientTriggerHandler.cpp @@ -494,6 +494,11 @@ void Sapphire::Network::GameConnection::clientTriggerHandler( const Packets::FFX player.sendDebug( "event battle p1: {0}, p11: {1}, p12: {2}, p2: {3}, p3: {4}, p4: {5}, p5: {6}", param1, param11, param12, param2, param3, param4, param5 ); break; } + case ClientTriggerType::CutscenePlayed: + { + player.sendDebug( "cutscene: {}", param1 ); + break; + } case ClientTriggerType::OpenPerformInstrumentUI: { //param11 = instrument, 0 = end diff --git a/src/world/Network/Handlers/EventHandlers.cpp b/src/world/Network/Handlers/EventHandlers.cpp index 929bc90b..d869c62a 100644 --- a/src/world/Network/Handlers/EventHandlers.cpp +++ b/src/world/Network/Handlers/EventHandlers.cpp @@ -23,6 +23,7 @@ #include "Territory/InstanceContent.h" #include "Territory/QuestBattle.h" +#include "Territory/PublicContent.h" #include "Session.h" @@ -59,6 +60,14 @@ void Sapphire::Network::GameConnection::eventHandlerTalk( const Packets::FFXIVAR { instance->onTalk( player, eventId, actorId ); } + else if( auto instance = player.getCurrentQuestBattle() ) + { + instance->onTalk( player, eventId, actorId ); + } + else if( auto instance = player.getCurrentPublicContent() ) + { + instance->onTalk( player, eventId, actorId ); + } else if( !scriptMgr.onTalk( player, actorId, eventId ) && eventType == Event::EventHandler::EventHandlerType::Quest ) { @@ -180,6 +189,11 @@ void Sapphire::Network::GameConnection::eventHandlerEnterTerritory( const Packet player.eventStart( player.getId(), eventId, Event::EventHandler::EnterTerritory, 1, player.getZoneId() ); instance->onEnterTerritory( player, eventId, param1, param2 ); } + else if( auto instance = player.getCurrentPublicContent() ) + { + player.eventStart( player.getId(), eventId, Event::EventHandler::EnterTerritory, 1, player.getZoneId() ); + instance->onEnterTerritory( player, eventId, param1, param2 ); + } else { player.eventStart( player.getId(), eventId, Event::EventHandler::EnterTerritory, 0, player.getZoneId() ); @@ -273,5 +287,39 @@ void Sapphire::Network::GameConnection::eventHandlerShop( const Packets::FFXIVAR scriptMgr.onTalk( player, player.getId(), eventId ); } +void Sapphire::Network::GameConnection::eventYieldHandler( const Packets::FFXIVARR_PACKET_RAW& inPacket, Entity::Player& player ) +{ + auto& scriptMgr = Common::Service< Scripting::ScriptMgr >::ref(); + auto& eventMgr = Common::Service< World::Manager::EventMgr >::ref(); + auto opcode = *reinterpret_cast< const uint16_t* >( &inPacket.data[ 2 ] ); + auto eventId = *reinterpret_cast< const uint32_t* >( &inPacket.data[ 0x10 + 0 ] ); + auto scene = *reinterpret_cast< const uint16_t* >( &inPacket.data[ 0x10 + 4 ] ); + auto pParam = reinterpret_cast< const uint32_t* >( &inPacket.data[ 0x10 + 8 ] ); + + std::vector< uint32_t > param; + + switch( opcode ) + { + case EventYield16Handler: + { + for( int i = 0; i < 16; i++ ) + { + param.push_back( pParam[ i ] ); + } + break; + } + } + + std::string eventName = "onEventYield"; + std::string objName = eventMgr.getEventName( eventId ); + player.sendDebug( "Calling: {0}.{1} - {2} scene: {3}", objName, eventName, eventId, scene ); + + scriptMgr.onEventYield( player, eventId, scene, param ); + + auto response = makeZonePacket< FFXIVIpcEventContinue >( player.getId() ); + response->data().eventId = eventId; + response->data().scene = scene; + player.queuePacket( response ); +} diff --git a/src/world/Network/Handlers/PacketHandlers.cpp b/src/world/Network/Handlers/PacketHandlers.cpp index 86387a2a..1daf63f7 100644 --- a/src/world/Network/Handlers/PacketHandlers.cpp +++ b/src/world/Network/Handlers/PacketHandlers.cpp @@ -387,15 +387,18 @@ void Sapphire::Network::GameConnection::pingHandler( const Packets::FFXIVARR_PAC void Sapphire::Network::GameConnection::finishLoadingHandler( const Packets::FFXIVARR_PACKET_RAW& inPacket, Entity::Player& player ) { - player.sendQuestInfo(); + if( player.isLogin() ) + { + player.sendQuestInfo(); - // TODO: load and save this data instead of hardcoding - auto gcPacket = makeZonePacket< FFXIVGCAffiliation >( player.getId() ); - gcPacket->data().gcId = player.getGc(); - gcPacket->data().gcRank[ 0 ] = player.getGcRankArray()[ 0 ]; - gcPacket->data().gcRank[ 1 ] = player.getGcRankArray()[ 1 ]; - gcPacket->data().gcRank[ 2 ] = player.getGcRankArray()[ 2 ]; - player.queuePacket( gcPacket ); + // TODO: load and save this data instead of hardcoding + auto gcPacket = makeZonePacket< FFXIVGCAffiliation >( player.getId() ); + gcPacket->data().gcId = player.getGc(); + gcPacket->data().gcRank[ 0 ] = player.getGcRankArray()[ 0 ]; + gcPacket->data().gcRank[ 1 ] = player.getGcRankArray()[ 1 ]; + gcPacket->data().gcRank[ 2 ] = player.getGcRankArray()[ 2 ]; + player.queuePacket( gcPacket ); + } player.getCurrentTerritory()->onFinishLoading( player ); diff --git a/src/world/Network/PacketWrappers/ActorControlSelfPacket.h b/src/world/Network/PacketWrappers/ActorControlSelfPacket.h index bfd343a5..0ce5b4fc 100644 --- a/src/world/Network/PacketWrappers/ActorControlSelfPacket.h +++ b/src/world/Network/PacketWrappers/ActorControlSelfPacket.h @@ -22,15 +22,15 @@ namespace Sapphire::Network::Packets::Server uint32_t param3 = 0, uint32_t param4 = 0, uint32_t param5 = 0, - uint32_t padding1 = 0 ) : + uint32_t param6 = 0 ) : ZoneChannelPacket< FFXIVIpcActorControlSelf >( actorId, actorId ) { - initialize( category, param1, param2, param3, param4, param5 ); + initialize( category, param1, param2, param3, param4, param5, param6 ); }; private: void initialize( uint16_t category, uint32_t param1, uint32_t param2, uint32_t param3, uint32_t param4, - uint32_t param5 ) + uint32_t param5, uint32_t param6 ) { m_data.padding = 0; m_data.category = category; @@ -39,6 +39,7 @@ namespace Sapphire::Network::Packets::Server m_data.param3 = param3; m_data.param4 = param4; m_data.param5 = param5; + m_data.param6 = param6; }; }; diff --git a/src/world/Network/PacketWrappers/PlayerSpawnPacket.h b/src/world/Network/PacketWrappers/PlayerSpawnPacket.h index 7ddbe23d..9e8df9e0 100644 --- a/src/world/Network/PacketWrappers/PlayerSpawnPacket.h +++ b/src/world/Network/PacketWrappers/PlayerSpawnPacket.h @@ -8,6 +8,8 @@ #include "Forwards.h" #include "Inventory/Item.h" #include "StatusEffect/StatusEffect.h" +#include "Territory/Territory.h" +#include "Event/Director.h" namespace Sapphire::Network::Packets::Server { @@ -143,6 +145,10 @@ namespace Sapphire::Network::Packets::Server m_data.effect[ effect.first ].param = effect.second->getParam(); } + if( auto d = player.getCurrentTerritory()->getAsDirector() ) + { + m_data.directorId = d->getDirectorId(); + } }; }; diff --git a/src/world/Script/NativeScriptApi.cpp b/src/world/Script/NativeScriptApi.cpp index b8945223..5238af65 100644 --- a/src/world/Script/NativeScriptApi.cpp +++ b/src/world/Script/NativeScriptApi.cpp @@ -134,6 +134,10 @@ namespace Sapphire::ScriptAPI { } + void EventScript::onEventYield( Sapphire::Entity::Player& player, uint16_t scene, std::vector< uint32_t > param ) + { + } + /////////////////////////////////////////////////////////////////// EventObjectScript::EventObjectScript( uint32_t eobjId ) : @@ -216,5 +220,31 @@ namespace Sapphire::ScriptAPI { } + PublicContentScript::PublicContentScript( uint32_t contentId ) : + ScriptObject( uint32_t{ 0x8004 } << 16 | contentId, typeid( PublicContentScript ).hash_code() ) + { + } + + void PublicContentScript::onInit( PublicContent& instance ) + { + } + + void PublicContentScript::onUpdate( PublicContent& instance, uint64_t tickCount ) + { + } + + void PublicContentScript::onPlayerZoneIn( PublicContent& instance, Entity::Player& player ) + { + } + + void PublicContentScript::onLeaveTerritory( PublicContent& instance, Entity::Player& player ) + { + } + + void PublicContentScript::onEnterTerritory( PublicContent& instance, Entity::Player& player, uint32_t eventId, + uint16_t param1, uint16_t param2 ) + { + } + } diff --git a/src/world/Script/NativeScriptApi.h b/src/world/Script/NativeScriptApi.h index aad02c5a..f1ea4ba7 100644 --- a/src/world/Script/NativeScriptApi.h +++ b/src/world/Script/NativeScriptApi.h @@ -166,6 +166,8 @@ namespace Sapphire::ScriptAPI uint32_t catalogId ); virtual void onEObjHit( Sapphire::Entity::Player& player, uint64_t actorId, uint32_t actionId ); + + virtual void onEventYield( Sapphire::Entity::Player& player, uint16_t scene, std::vector< uint32_t > param ); }; /*! @@ -237,6 +239,23 @@ namespace Sapphire::ScriptAPI uint16_t param1, uint16_t param2 ); }; + class PublicContentScript : public ScriptObject + { + public: + explicit PublicContentScript( uint32_t contentId ); + + virtual void onInit( Sapphire::PublicContent& instance ); + + virtual void onUpdate( Sapphire::PublicContent& instance, uint64_t tickCount ); + + virtual void onPlayerZoneIn( Sapphire::PublicContent& instance, Sapphire::Entity::Player& player ); + + virtual void onLeaveTerritory( Sapphire::PublicContent& instance, Sapphire::Entity::Player& player ); + + virtual void onEnterTerritory( Sapphire::PublicContent& instance, Sapphire::Entity::Player& player, uint32_t eventId, + uint16_t param1, uint16_t param2 ); + }; + } #endif diff --git a/src/world/Script/ScriptMgr.cpp b/src/world/Script/ScriptMgr.cpp index e9f9a2a5..718c72be 100644 --- a/src/world/Script/ScriptMgr.cpp +++ b/src/world/Script/ScriptMgr.cpp @@ -7,6 +7,7 @@ #include "Territory/Territory.h" #include "Territory/InstanceContent.h" #include "Territory/QuestBattle.h" +#include "Territory/PublicContent.h" #include "Actor/Player.h" #include "Actor/EventObject.h" #include "ServerMgr.h" @@ -530,8 +531,7 @@ Sapphire::Scripting::NativeScriptMgr& Sapphire::Scripting::ScriptMgr::getNativeS return *m_nativeScriptMgr; } -bool -Sapphire::Scripting::ScriptMgr::onDutyComplete( Sapphire::QuestBattlePtr instance, Sapphire::Entity::Player& player ) +bool Sapphire::Scripting::ScriptMgr::onDutyComplete( Sapphire::QuestBattlePtr instance, Sapphire::Entity::Player& player ) { auto script = m_nativeScriptMgr->getScript< Sapphire::ScriptAPI::QuestBattleScript >( instance->getDirectorId() ); if( script ) @@ -542,3 +542,77 @@ Sapphire::Scripting::ScriptMgr::onDutyComplete( Sapphire::QuestBattlePtr instanc return false; } + +bool Sapphire::Scripting::ScriptMgr::onEventYield( Sapphire::Entity::Player& player, uint32_t eventId, uint16_t scene, std::vector< uint32_t > param ) +{ + auto script = m_nativeScriptMgr->getScript< Sapphire::ScriptAPI::EventScript >( eventId ); + if( script ) + { + script->onEventYield( player, scene, param ); + return true; + } + + return false; +} + +bool Sapphire::Scripting::ScriptMgr::onPublicContentInit( PublicContentPtr instance ) +{ + auto script = m_nativeScriptMgr->getScript< Sapphire::ScriptAPI::PublicContentScript >( instance->getDirectorId() ); + if( script ) + { + script->onInit( *instance ); + return true; + } + + return false; +} + +bool Sapphire::Scripting::ScriptMgr::onPublicContentUpdate( PublicContentPtr instance, uint64_t tickCount ) +{ + auto script = m_nativeScriptMgr->getScript< Sapphire::ScriptAPI::PublicContentScript >( instance->getDirectorId() ); + + if( script ) + { + script->onUpdate( *instance, tickCount ); + return true; + } + + return false; +} + +bool Sapphire::Scripting::ScriptMgr::onPublicContentPlayerZoneIn( PublicContentPtr instance, Entity::Player& player ) +{ + auto script = m_nativeScriptMgr->getScript< Sapphire::ScriptAPI::PublicContentScript >( instance->getDirectorId() ); + if( script ) + { + script->onPlayerZoneIn( *instance, player ); + return true; + } + + return false; +} + +bool Sapphire::Scripting::ScriptMgr::onPublicContentLeaveTerritory( PublicContentPtr instance, Entity::Player& player ) +{ + auto script = m_nativeScriptMgr->getScript< Sapphire::ScriptAPI::PublicContentScript >( instance->getDirectorId() ); + if( script ) + { + script->onLeaveTerritory( *instance, player ); + return true; + } + + return false; +} + +bool Sapphire::Scripting::ScriptMgr::onPublicContentEnterTerritory( PublicContentPtr instance, Entity::Player& player, + uint32_t eventId, uint16_t param1, uint16_t param2 ) +{ + auto script = m_nativeScriptMgr->getScript< Sapphire::ScriptAPI::PublicContentScript >( instance->getDirectorId() ); + if( script ) + { + script->onEnterTerritory( *instance, player, eventId, param1, param2 ); + return true; + } + + return false; +} \ No newline at end of file diff --git a/src/world/Script/ScriptMgr.h b/src/world/Script/ScriptMgr.h index ea9b5d80..b0a5cb5f 100644 --- a/src/world/Script/ScriptMgr.h +++ b/src/world/Script/ScriptMgr.h @@ -112,6 +112,18 @@ namespace Sapphire::Scripting bool onDutyComplete( QuestBattlePtr instance, Entity::Player& player ); + bool onEventYield( Entity::Player& player, uint32_t eventId, uint16_t scene, std::vector< uint32_t > param ); + + bool onPublicContentInit( PublicContentPtr instance ); + + bool onPublicContentUpdate( PublicContentPtr instance, uint64_t tickCount ); + + bool onPublicContentPlayerZoneIn( PublicContentPtr instance, Entity::Player& player ); + + bool onPublicContentLeaveTerritory( PublicContentPtr instance, Entity::Player& player ); + + bool onPublicContentEnterTerritory( PublicContentPtr instance, Entity::Player& player, uint32_t eventId, uint16_t param1, uint16_t param2 ); + bool loadDir( const std::string& dirname, std::set< std::string >& files, const std::string& ext ); NativeScriptMgr& getNativeScriptHandler(); diff --git a/src/world/Territory/InstanceContent.cpp b/src/world/Territory/InstanceContent.cpp index 2bdd3bf8..ad9e08fb 100644 --- a/src/world/Territory/InstanceContent.cpp +++ b/src/world/Territory/InstanceContent.cpp @@ -32,9 +32,9 @@ Sapphire::InstanceContent::InstanceContent( std::shared_ptr< Sapphire::Data::Ins uint32_t guId, const std::string& internalName, const std::string& contentName, - uint32_t instanceContentId ) : + uint32_t instanceContentId, uint16_t contentFinderConditionId ) : Territory( static_cast< uint16_t >( territoryType ), guId, internalName, contentName ), - Director( Event::Director::InstanceContent, instanceContentId ), + Director( Event::Director::InstanceContent, instanceContentId, contentFinderConditionId ), m_instanceConfiguration( pInstanceConfiguration ), m_instanceContentId( instanceContentId ), m_state( Created ), @@ -310,6 +310,8 @@ void Sapphire::InstanceContent::onRegisterEObj( Entity::EventObjectPtr object ) m_eventObjectMap[ object->getName() ] = object; if( object->getObjectId() == 2000182 ) // start m_pEntranceEObj = object; + if( m_pEntranceEObj == nullptr && object->getName() == "Entrance" ) + m_pEntranceEObj = object; auto& exdData = Common::Service< Data::ExdDataGenerated >::ref(); auto objData = exdData.get< Sapphire::Data::EObj >( object->getObjectId() ); @@ -375,7 +377,7 @@ void Sapphire::InstanceContent::onTalk( Sapphire::Entity::Player& player, uint32 return; if( auto onTalk = it->second->getOnTalkHandler() ) - onTalk( player, it->second, getAsInstanceContent(), actorId ); + onTalk( player, it->second, getAsInstanceContent(), eventId, actorId ); else player.sendDebug( "No onTalk handler found for interactable eobj with EObjID#{0}, eventId#{1} ", it->second->getObjectId(), eventId ); diff --git a/src/world/Territory/InstanceContent.h b/src/world/Territory/InstanceContent.h index 37af2446..cc8600a4 100644 --- a/src/world/Territory/InstanceContent.h +++ b/src/world/Territory/InstanceContent.h @@ -28,7 +28,7 @@ namespace Sapphire uint32_t guId, const std::string& internalName, const std::string& contentName, - uint32_t instanceContentId ); + uint32_t instanceContentId, uint16_t contentFinderConditionId = 0 ); virtual ~InstanceContent(); diff --git a/src/world/Territory/PublicContent.cpp b/src/world/Territory/PublicContent.cpp new file mode 100644 index 00000000..a74f15dd --- /dev/null +++ b/src/world/Territory/PublicContent.cpp @@ -0,0 +1,271 @@ +#include +#include +#include +#include +#include +#include +#include + +#include "Actor/Player.h" +#include "Actor/EventObject.h" +#include "Event/Director.h" +#include "Event/EventDefs.h" +#include "Event/EventHandler.h" +#include "Script/ScriptMgr.h" + +#include "Network/PacketWrappers/ActorControlPacket.h" +#include "Network/PacketWrappers/ActorControlSelfPacket.h" + +#include "PublicContent.h" + +using namespace Sapphire::Common; +using namespace Sapphire::Network::Packets; +using namespace Sapphire::Network::Packets::Server; +using namespace Sapphire::Network::ActorControl; + +Sapphire::PublicContent::PublicContent( std::shared_ptr< Sapphire::Data::PublicContent > pConfiguration, + uint16_t territoryType, + uint32_t guId, + const std::string& internalName, + const std::string& contentName, + uint32_t contentId, uint16_t contentFinderConditionId ) : + Territory( static_cast< uint16_t >( territoryType ), guId, internalName, contentName ), + Director( Event::Director::PublicContent, contentId, contentFinderConditionId ), + m_Configuration( pConfiguration ), + m_ContentId( contentId ) +{ + +} + +bool Sapphire::PublicContent::init() +{ + if( !Territory::init() ) + return false; + + auto& scriptMgr = Common::Service< Scripting::ScriptMgr >::ref(); + scriptMgr.onPublicContentInit( getAsPublicContent() ); + + return true; +} + + +Sapphire::PublicContent::~PublicContent() +{ + +} + +uint32_t Sapphire::PublicContent::getContentId() const +{ + return m_ContentId; +} + +Sapphire::Data::ExdDataGenerated::PublicContentPtr Sapphire::PublicContent::getConfiguration() const +{ + return m_Configuration; +} + +void Sapphire::PublicContent::onPlayerZoneIn( Entity::Player& player ) +{ + Logger::debug( "PublicContent::onPlayerZoneIn: Territory#{0}|{1}, Entity#{2}", getGuId(), getTerritoryTypeId(), player.getId() ); + sendDirectorInit( player ); + + auto& scriptMgr = Common::Service< Scripting::ScriptMgr >::ref(); + scriptMgr.onPublicContentPlayerZoneIn( getAsPublicContent(), player ); +} + +void Sapphire::PublicContent::onLeaveTerritory( Entity::Player& player ) +{ + Logger::debug( "PublicContent::onLeaveTerritory: Territory#{0}|{1}, Entity#{2}", getGuId(), getTerritoryTypeId(), player.getId() ); + clearDirector( player ); + + auto& scriptMgr = Common::Service< Scripting::ScriptMgr >::ref(); + scriptMgr.onPublicContentLeaveTerritory( getAsPublicContent(), player ); +} + +void Sapphire::PublicContent::onUpdate( uint64_t tickCount ) +{ + updateBNpcs( tickCount ); + auto& scriptMgr = Common::Service< Scripting::ScriptMgr >::ref(); + scriptMgr.onPublicContentUpdate( getAsPublicContent(), tickCount ); +} + +void Sapphire::PublicContent::onFinishLoading( Entity::Player& player ) +{ + sendDirectorInit( player ); +} + +void Sapphire::PublicContent::onInitDirector( Entity::Player& player ) +{ + sendDirectorVars( player ); + player.setDirectorInitialized( true ); +} + +void Sapphire::PublicContent::onDirectorSync( Entity::Player& player ) +{ + player.queuePacket( makeActorControlSelf( player.getId(), DirectorUpdate, 0x00110001, 0x80000000, 1 ) ); +} + +void Sapphire::PublicContent::onBeforePlayerZoneIn( Sapphire::Entity::Player& player ) +{ + /*if( m_pEntranceEObj != nullptr ) + { + player.setRot( PI ); + player.setPos( m_pEntranceEObj->getPos() ); + } + else + { + player.setRot( PI ); + player.setPos( { 0.f, 0.f, 0.f } ); + }*/ + player.resetObjSpawnIndex(); +} + +void Sapphire::PublicContent::onEnterTerritory( Entity::Player& player, uint32_t eventId, uint16_t param1, uint16_t param2 ) +{ + auto& scriptMgr = Common::Service< Scripting::ScriptMgr >::ref(); + scriptMgr.onPublicContentEnterTerritory( getAsPublicContent(), player, eventId, param1, param2 ); +} + +void Sapphire::PublicContent::onRegisterEObj( Entity::EventObjectPtr object ) +{ + if( object->getName() != "none" ) + m_eventObjectMap[ object->getName() ] = object; + if( object->getObjectId() == 2000182 ) // start + m_pEntranceEObj = object; + if( m_pEntranceEObj == nullptr && object->getName() == "Entrance" ) + m_pEntranceEObj = object; + + auto& exdData = Common::Service< Data::ExdDataGenerated >::ref(); + auto objData = exdData.get< Sapphire::Data::EObj >( object->getObjectId() ); + if( objData ) + m_eventIdToObjectMap[ objData->data ] = object; + else + Logger::error( "PublicContent::onRegisterEObj Territory " + + m_internalName + ": No EObj data found for EObj with ID: " + + std::to_string( object->getObjectId() ) ); +} + +Sapphire::Entity::EventObjectPtr Sapphire::PublicContent::getEObjByName( const std::string& name ) +{ + auto it = m_eventObjectMap.find( name ); + if( it == m_eventObjectMap.end() ) + return nullptr; + + return it->second; +} + +void Sapphire::PublicContent::clearDirector( Entity::Player& player ) +{ + sendDirectorClear( player ); + player.setDirectorInitialized( false ); +} + +void Sapphire::PublicContent::onTalk( Sapphire::Entity::Player& player, uint32_t eventId, uint64_t actorId ) +{ + auto it = m_eventIdToObjectMap.find( eventId ); + if( it == m_eventIdToObjectMap.end() ) + return; + + if( auto onTalk = it->second->getOnTalkHandler() ) + onTalk( player, it->second, getAsPublicContent(), eventId, actorId ); + else + player.sendDebug( "No onTalk handler found for interactable eobj with EObjID#{0}, eventId#{1} ", + it->second->getObjectId(), eventId ); +} + +void Sapphire::PublicContent::setVar( uint8_t index, uint8_t value ) +{ + if( index > 19 ) + return; + + switch( index ) + { + case 0: + setDirectorUI8AL( value ); + break; + case 1: + setDirectorUI8AH( value ); + break; + case 2: + setDirectorUI8BL( value ); + break; + case 3: + setDirectorUI8BH( value ); + break; + case 4: + setDirectorUI8CL( value ); + break; + case 5: + setDirectorUI8CH( value ); + break; + case 6: + setDirectorUI8DL( value ); + break; + case 7: + setDirectorUI8DH( value ); + break; + case 8: + setDirectorUI8EL( value ); + break; + case 9: + setDirectorUI8EH( value ); + break; + case 10: + setDirectorUI8FL( value ); + break; + case 11: + setDirectorUI8FH( value ); + break; + case 12: + setDirectorUI8GL( value ); + break; + case 13: + setDirectorUI8GH( value ); + break; + case 14: + setDirectorUI8HL( value ); + break; + case 15: + setDirectorUI8HH( value ); + break; + case 16: + setDirectorUI8IL( value ); + break; + case 17: + setDirectorUI8IH( value ); + break; + case 18: + setDirectorUI8JL( value ); + break; + case 19: + setDirectorUI8JH( value ); + break; + + } + + // todo: genericise this? + for( const auto& playerIt : m_playerMap ) + { + sendDirectorVars( *playerIt.second ); + } +} + +void Sapphire::PublicContent::setSequence( uint8_t value ) +{ + setDirectorSequence( value ); + + for( const auto& playerIt : m_playerMap ) + { + sendDirectorVars( *playerIt.second ); + } +} + +void Sapphire::PublicContent::setBranch( uint8_t value ) +{ + setDirectorBranch( value ); + + for( const auto& playerIt : m_playerMap ) + { + sendDirectorVars( *playerIt.second ); + } +} \ No newline at end of file diff --git a/src/world/Territory/PublicContent.h b/src/world/Territory/PublicContent.h new file mode 100644 index 00000000..e765cf3a --- /dev/null +++ b/src/world/Territory/PublicContent.h @@ -0,0 +1,72 @@ +#ifndef SAPPHIRE_PUBLICCONTENT_H +#define SAPPHIRE_PUBLICCONTENT_H + +#include "Territory.h" +#include "Event/Director.h" +#include "Forwards.h" + +namespace Sapphire::Data +{ + struct PublicContent; +} + +namespace Sapphire +{ + class PublicContent : public Event::Director, public Territory + { + public: + PublicContent( std::shared_ptr< Sapphire::Data::PublicContent > pConfiguration, + uint16_t territoryType, + uint32_t guId, + const std::string& internalName, + const std::string& contentName, + uint32_t contentId, uint16_t contentFinderConditionId = 0 ); + + virtual ~PublicContent(); + + bool init() override; + + void onBeforePlayerZoneIn( Entity::Player& player ) override; + + void onPlayerZoneIn( Entity::Player& player ) override; + + void onLeaveTerritory( Entity::Player& player ) override; + + void onUpdate( uint64_t tickCount ) override; + + void onFinishLoading( Entity::Player& player ) override; + + void onInitDirector( Entity::Player& player ) override; + + void onDirectorSync( Entity::Player& player ) override; + + void onEnterTerritory( Entity::Player& player, uint32_t eventId, uint16_t param1, uint16_t param2 ) override; + + void onRegisterEObj( Entity::EventObjectPtr object ) override; + + std::shared_ptr< Sapphire::Data::PublicContent > getConfiguration() const; + + uint32_t getContentId() const; + + Entity::EventObjectPtr getEObjByName( const std::string& name ); + + void clearDirector( Entity::Player& player ); + + void onTalk( Entity::Player& player, uint32_t eventId, uint64_t actorId ); + + void setSequence( uint8_t value ); + + void setBranch( uint8_t value ); + + void setVar( uint8_t index, uint8_t value ); + + private: + std::shared_ptr< Sapphire::Data::PublicContent > m_Configuration; + uint32_t m_ContentId; + Entity::EventObjectPtr m_pEntranceEObj; + std::map< std::string, Entity::EventObjectPtr > m_eventObjectMap; + std::unordered_map< uint32_t, Entity::EventObjectPtr > m_eventIdToObjectMap; + }; + +} +#endif //SAPPHIRE_PUBLICCONTENT_H diff --git a/src/world/Territory/QuestBattle.cpp b/src/world/Territory/QuestBattle.cpp index 7db97014..5db5aeec 100644 --- a/src/world/Territory/QuestBattle.cpp +++ b/src/world/Territory/QuestBattle.cpp @@ -34,9 +34,9 @@ Sapphire::QuestBattle::QuestBattle( std::shared_ptr< Sapphire::Data::QuestBattle uint32_t guId, const std::string& internalName, const std::string& contentName, - uint32_t questBattleId ) : + uint32_t questBattleId, uint16_t contentFinderConditionId ) : Territory( static_cast< uint16_t >( territoryType ), guId, internalName, contentName ), - Director( Event::Director::QuestBattle, questBattleId ), + Director( Event::Director::QuestBattle, questBattleId, contentFinderConditionId ), m_pBattleDetails( pBattleDetails ), m_questBattleId( questBattleId ), m_state( Created ), @@ -330,7 +330,7 @@ void Sapphire::QuestBattle::onTalk( Sapphire::Entity::Player& player, uint32_t e return; if( auto onTalkHandler = it->second->getOnTalkHandler() ) - onTalkHandler( player, it->second, getAsQuestBattle(), actorId ); + onTalkHandler( player, it->second, getAsQuestBattle(), eventId, actorId ); else player.sendDebug( "No onTalk handler found for interactable eobj with EObjID#{0}, eventId#{1} ", it->second->getObjectId(), eventId ); diff --git a/src/world/Territory/QuestBattle.h b/src/world/Territory/QuestBattle.h index 899a6c6a..4009b62a 100644 --- a/src/world/Territory/QuestBattle.h +++ b/src/world/Territory/QuestBattle.h @@ -20,7 +20,7 @@ namespace Sapphire uint32_t guId, const std::string& internalName, const std::string& contentName, - uint32_t questBattleId ); + uint32_t questBattleId, uint16_t contentFinderConditionId = 0 ); virtual ~QuestBattle() = default; diff --git a/src/world/Territory/Territory.cpp b/src/world/Territory/Territory.cpp index a2e71d4d..fe14175b 100644 --- a/src/world/Territory/Territory.cpp +++ b/src/world/Territory/Territory.cpp @@ -19,6 +19,7 @@ #include "Territory.h" #include "InstanceContent.h" #include "QuestBattle.h" +#include "PublicContent.h" #include "Manager/TerritoryMgr.h" #include "Navi/NaviProvider.h" @@ -780,6 +781,11 @@ Sapphire::Entity::EventObjectPtr Sapphire::Territory::getEObj( uint32_t objId ) return obj->second; } +Sapphire::Event::DirectorPtr Sapphire::Territory::getAsDirector() +{ + return std::dynamic_pointer_cast< Event::Director, Territory >( shared_from_this() ); +} + Sapphire::InstanceContentPtr Sapphire::Territory::getAsInstanceContent() { return std::dynamic_pointer_cast< InstanceContent, Territory >( shared_from_this() ); @@ -790,6 +796,11 @@ Sapphire::QuestBattlePtr Sapphire::Territory::getAsQuestBattle() return std::dynamic_pointer_cast< QuestBattle, Territory >( shared_from_this() ); } +Sapphire::PublicContentPtr Sapphire::Territory::getAsPublicContent() +{ + return std::dynamic_pointer_cast< PublicContent, Territory >( shared_from_this() ); +} + uint32_t Sapphire::Territory::getNextEObjId() { return ++m_nextEObjId; @@ -1043,4 +1054,19 @@ void Sapphire::Territory::processEffectResults( uint64_t tickCount ) it = m_effectResults.erase( it ); } +} + +Sapphire::Entity::PlayerPtr Sapphire::Territory::getPlayer( uint32_t charId ) +{ + return m_playerMap[ charId ]; +} + +void Sapphire::Territory::foreachPlayer( std::function< void( Sapphire::Entity::PlayerPtr player ) > callback ) +{ + if( !callback ) + return; + for( auto entry : m_playerMap ) + { + callback( entry.second ); + } } \ No newline at end of file diff --git a/src/world/Territory/Territory.h b/src/world/Territory/Territory.h index 47aa51ae..23b1f505 100644 --- a/src/world/Territory/Territory.h +++ b/src/world/Territory/Territory.h @@ -166,10 +166,14 @@ namespace Sapphire Entity::EventObjectPtr getEObj( uint32_t objId ); + Event::DirectorPtr getAsDirector(); + InstanceContentPtr getAsInstanceContent(); QuestBattlePtr getAsQuestBattle(); + PublicContentPtr getAsPublicContent(); + void updateSpawnPoints(); uint32_t getNextEffectSequence(); @@ -179,6 +183,10 @@ namespace Sapphire void addEffectResult( World::Action::EffectResultPtr result ); void processEffectResults( uint64_t tickCount ); + + Entity::PlayerPtr getPlayer( uint32_t charId ); + + void foreachPlayer( std::function< void( Entity::PlayerPtr player ) > callback ); }; } From 475f5609820c76ac6c7733cd5875048c9494eea0 Mon Sep 17 00:00:00 2001 From: Taezen <86413840+Taezen@users.noreply.github.com> Date: Mon, 30 Aug 2021 09:56:37 +0200 Subject: [PATCH 23/43] Eorzean time fix --- src/common/Util/Util.cpp | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/common/Util/Util.cpp b/src/common/Util/Util.cpp index 2be5d946..5aa64bf6 100644 --- a/src/common/Util/Util.cpp +++ b/src/common/Util/Util.cpp @@ -129,7 +129,7 @@ uint32_t Util::getTimeSeconds() uint64_t Util::getEorzeanTimeStamp() { - return static_cast< uint64_t >( getTimeSeconds() * 20.571428571428573f ); + return static_cast< uint64_t >( getTimeSeconds() * 20.571428571428573 ); } void Util::valueToFlagByteIndexValue( uint32_t inVal, uint8_t& outVal, uint16_t& outIndex ) From e8c7c831971b3e116eba781f1b2602f7341c49f7 Mon Sep 17 00:00:00 2001 From: Taezen <86413840+Taezen@users.noreply.github.com> Date: Mon, 30 Aug 2021 10:16:05 +0200 Subject: [PATCH 24/43] Map support --- src/common/Network/CommonActorControl.h | 14 +- src/common/Network/PacketDef/Ipcs.h | 8 + .../Network/PacketDef/Zone/ServerZoneDef.h | 60 +- src/world/Actor/Player.cpp | 16 +- src/world/Actor/Player.h | 7 +- src/world/Actor/PlayerInventory.cpp | 5 + src/world/Actor/PlayerQuest.cpp | 19 +- src/world/Event/EventHandler.h | 2 + src/world/Manager/MapMgr.cpp | 889 ++++++++++++++++++ src/world/Manager/MapMgr.h | 132 +++ src/world/ServerMgr.cpp | 5 + 11 files changed, 1148 insertions(+), 9 deletions(-) create mode 100644 src/world/Manager/MapMgr.cpp create mode 100644 src/world/Manager/MapMgr.h diff --git a/src/common/Network/CommonActorControl.h b/src/common/Network/CommonActorControl.h index 27657d42..c713148c 100644 --- a/src/common/Network/CommonActorControl.h +++ b/src/common/Network/CommonActorControl.h @@ -215,7 +215,19 @@ namespace Sapphire::Network::ActorControl SetFavorite = 0x1FC, LearnTeleport = 0x1FD, - OpenRecommendationGuide = 0x200, + /*! + * param1 = event type bitmask + * 1 = Quest + * 2 = GuildLeveAssignment + * 4 = GuildOrderGuide + * 8 = TripleTriad + * 16 = CustomTalk + * 32 = PreHandler + */ + BeginMapUpdate = 0x1FF, + FinishMapUpdate = 0x200, + + //OpenRecommendationGuide = 0x200, ArmoryErrorMsg = 0x201, AchievementPopup = 0x203, diff --git a/src/common/Network/PacketDef/Ipcs.h b/src/common/Network/PacketDef/Ipcs.h index 7bce247e..6d61cc27 100644 --- a/src/common/Network/PacketDef/Ipcs.h +++ b/src/common/Network/PacketDef/Ipcs.h @@ -282,6 +282,14 @@ namespace Sapphire::Network::Packets DailyQuests = 0x0331, // updated 5.58 DailyQuestRepeatFlags = 0x01D1, // updated 5.58 + MapUpdate = 0x03A2, // updated 5.58 + MapUpdate4 = 0x0284, // updated 5.58 + MapUpdate8 = 0x01BC, // updated 5.58 + MapUpdate16 = 0x02D1, // updated 5.58 + MapUpdate32 = 0x00DB, // updated 5.58 + MapUpdate64 = 0x0368, // updated 5.58 + MapUpdate128 = 0x0349, // updated 5.58 + /// Doman Mahjong ////////////////////////////////////// MahjongOpenGui = 0x02A4, // only available in mahjong instance MahjongNextRound = 0x02BD, // initial hands(baipai), # of riichi(wat), winds, honba, score and stuff diff --git a/src/common/Network/PacketDef/Zone/ServerZoneDef.h b/src/common/Network/PacketDef/Zone/ServerZoneDef.h index c0899b1e..6a0652a6 100644 --- a/src/common/Network/PacketDef/Zone/ServerZoneDef.h +++ b/src/common/Network/PacketDef/Zone/ServerZoneDef.h @@ -928,12 +928,12 @@ namespace Sapphire::Network::Packets::Server uint8_t unknown5; uint32_t unknown8; - uint16_t festivalId; - uint16_t additionalFestivalId; uint32_t unknown9; uint32_t unknown10; + uint32_t festivalId; uint32_t unknown11; - uint32_t unknown12[4]; + uint32_t unknown12[3]; + uint32_t additionalFestivalId; uint32_t unknown13[3]; Common::FFXIVARR_POSITION3 pos; uint32_t unknown14[3]; @@ -2289,6 +2289,60 @@ namespace Sapphire::Network::Packets::Server uint16_t padding3; } actors[2]; }; + + //For quests this is only used for pre-accepted ones. Accepted quests are getting handled by the client. + template< int ArgCount > + struct FFXIVIpcMapUpdateN + { + uint8_t entryCount; + uint8_t padding[ 3 ]; + uint32_t iconIds[ ArgCount ]; + uint32_t levelIds[ ArgCount ]; + uint32_t eventIds[ ArgCount ]; // possible event ids for this: Quest, GuildLeveAssignment, GuildOrderGuide, TripleTriad, CustomTalk, PreHandler + uint8_t additionalData[ ArgCount ]; // use unknown + }; + + struct FFXIVIpcMapUpdate : + FFXIVIpcBasePacket< MapUpdate >, + FFXIVIpcMapUpdateN< 2 > + { + }; + + struct FFXIVIpcMapUpdate4 : + FFXIVIpcBasePacket< MapUpdate4 >, + FFXIVIpcMapUpdateN< 4 > + { + }; + + struct FFXIVIpcMapUpdate8 : + FFXIVIpcBasePacket< MapUpdate8 >, + FFXIVIpcMapUpdateN< 8 > + { + }; + + struct FFXIVIpcMapUpdate16 : + FFXIVIpcBasePacket< MapUpdate16 >, + FFXIVIpcMapUpdateN< 16 > + { + }; + + struct FFXIVIpcMapUpdate32 : + FFXIVIpcBasePacket< MapUpdate32 >, + FFXIVIpcMapUpdateN< 32 > + { + }; + + struct FFXIVIpcMapUpdate64 : + FFXIVIpcBasePacket< MapUpdate64 >, + FFXIVIpcMapUpdateN< 64 > + { + }; + + struct FFXIVIpcMapUpdate128 : + FFXIVIpcBasePacket< MapUpdate128 >, + FFXIVIpcMapUpdateN< 128 > + { + }; } #endif /*_CORE_NETWORK_PACKETS_SERVER_IPC_H*/ diff --git a/src/world/Actor/Player.cpp b/src/world/Actor/Player.cpp index a71184a5..d358aa1c 100644 --- a/src/world/Actor/Player.cpp +++ b/src/world/Actor/Player.cpp @@ -19,6 +19,7 @@ #include "Manager/HousingMgr.h" #include "Manager/TerritoryMgr.h" #include "Manager/RNGMgr.h" +#include "Manager/MapMgr.h" #include "Territory/Territory.h" #include "Territory/ZonePosition.h" @@ -730,7 +731,7 @@ void Sapphire::Entity::Player::learnSong( uint8_t songId, uint32_t itemId ) queuePacket( makeActorControlSelf( getId(), ToggleOrchestrionUnlock, songId, 1, itemId ) ); } -bool Sapphire::Entity::Player::isActionLearned( uint8_t actionId ) const +bool Sapphire::Entity::Player::isActionLearned( uint16_t actionId ) const { uint16_t index; uint8_t value; @@ -1286,6 +1287,17 @@ const uint8_t* Sapphire::Entity::Player::getMountGuideBitmask() const return m_mountGuide; } +const bool Sapphire::Entity::Player::hasMount( int16_t mountId ) const +{ + auto& exdData = Common::Service< Data::ExdDataGenerated >::ref(); + auto mount = exdData.get< Data::Mount >( mountId ); + + if( mount->order == -1 || mount->modelChara == 0 ) + return false; + + return m_mountGuide[ mount->order / 8 ] & ( 1 << ( mount->order % 8 ) ); +} + uint64_t Sapphire::Entity::Player::getContentId() const { return m_contentId; @@ -1890,6 +1902,8 @@ Sapphire::Entity::Player::sendZoneInPackets( uint32_t param1, uint32_t param2 = setZoningType( Common::ZoneingType::None ); unsetStateFlag( PlayerStateFlag::BetweenAreas ); + + Common::Service< MapMgr >::ref().updateAll( *this ); } void Sapphire::Entity::Player::finishZoning() diff --git a/src/world/Actor/Player.h b/src/world/Actor/Player.h index 63f41eb6..fbb2aedb 100644 --- a/src/world/Actor/Player.h +++ b/src/world/Actor/Player.h @@ -194,6 +194,8 @@ namespace Sapphire::Entity /*! remove a given quest */ void removeQuest( uint16_t questId ); + bool isQuestCompleted( uint16_t questId ); + /*! add a quest to the completed quests mask */ void updateQuestsCompleted( uint32_t questId ); @@ -644,7 +646,7 @@ namespace Sapphire::Entity void learnSong( uint8_t songId, uint32_t itemId ); /*! check if an action is already unlocked in the bitmask. */ - bool isActionLearned( uint8_t actionId ) const; + bool isActionLearned( uint16_t actionId ) const; /*! return a const pointer to the unlock bitmask array */ const uint8_t* getUnlockBitmask() const; @@ -655,6 +657,8 @@ namespace Sapphire::Entity /*! return a const pointer to the mount guide bitmask array */ const uint8_t* getMountGuideBitmask() const; + const bool hasMount( int16_t mountId ) const; + bool checkAction() override; bool hasQueuedAction() const; @@ -950,6 +954,7 @@ namespace Sapphire::Entity uint16_t calculateEquippedGearItemLevel(); ItemPtr getEquippedWeapon(); + ItemPtr getEquippedSecondaryWeapon(); /*! return the current amount of currency of type */ uint32_t getCurrency( Common::CurrencyType type ); diff --git a/src/world/Actor/PlayerInventory.cpp b/src/world/Actor/PlayerInventory.cpp index 2d4763fc..f342ea00 100644 --- a/src/world/Actor/PlayerInventory.cpp +++ b/src/world/Actor/PlayerInventory.cpp @@ -939,6 +939,11 @@ Sapphire::ItemPtr Sapphire::Entity::Player::getEquippedWeapon() return m_storageMap[ GearSet0 ]->getItem( GearSetSlot::MainHand ); } +Sapphire::ItemPtr Sapphire::Entity::Player::getEquippedSecondaryWeapon() +{ + return m_storageMap[ InventoryType::GearSet0 ]->getItem( GearSetSlot::OffHand ); +} + uint8_t Sapphire::Entity::Player::getFreeSlotsInBags() { uint8_t slots = 0; diff --git a/src/world/Actor/PlayerQuest.cpp b/src/world/Actor/PlayerQuest.cpp index 6eaafc91..e99d27f9 100644 --- a/src/world/Actor/PlayerQuest.cpp +++ b/src/world/Actor/PlayerQuest.cpp @@ -7,6 +7,8 @@ #include "Network/GameConnection.h" #include "Network/PacketWrappers/QuestMessagePacket.h" +#include "Manager/MapMgr.h" + #include "Session.h" using namespace Sapphire::Common; @@ -42,6 +44,11 @@ void Sapphire::Entity::Player::removeQuest( uint16_t questId ) if( ( idx != -1 ) && ( m_activeQuests[ idx ] != nullptr ) ) { + std::shared_ptr< QuestActive > pQuest = m_activeQuests[ idx ]; + m_activeQuests[ idx ].reset(); + + Common::Service< World::Manager::MapMgr >::ref().updateQuests( *this ); + auto questUpdatePacket = makeZonePacket< FFXIVIpcQuestUpdate >( getId() ); questUpdatePacket->data().slot = static_cast< uint8_t >( idx ); questUpdatePacket->data().questInfo.c.questId = 0; @@ -54,9 +61,6 @@ void Sapphire::Entity::Player::removeQuest( uint16_t questId ) m_questTracking[ ii ] = -1; } - std::shared_ptr< QuestActive > pQuest = m_activeQuests[ idx ]; - m_activeQuests[ idx ].reset(); - m_questIdToQuestIdx.erase( questId ); m_questIdxToQuestId.erase( idx ); @@ -916,6 +920,8 @@ void Sapphire::Entity::Player::updateQuest( uint16_t questId, uint8_t sequence ) m_questIdToQuestIdx[ questId ] = idx; m_questIdxToQuestId[ idx ] = questId; + Common::Service< World::Manager::MapMgr >::ref().updateQuests( *this ); + auto questUpdatePacket = makeZonePacket< FFXIVIpcQuestUpdate >( getId() ); questUpdatePacket->data().slot = idx; questUpdatePacket->data().questInfo = *pNewQuest; @@ -1013,6 +1019,11 @@ Sapphire::Entity::Player::sendQuestMessage( uint32_t questId, int8_t msgId, uint } +bool Sapphire::Entity::Player::isQuestCompleted( uint16_t questId ) +{ + return ( m_questCompleteFlags[ questId / 8 ] & ( 0x80 >> ( questId % 8 ) ) ); +} + void Sapphire::Entity::Player::updateQuestsCompleted( uint32_t questId ) { uint16_t index = questId / 8; @@ -1032,6 +1043,8 @@ void Sapphire::Entity::Player::removeQuestsCompleted( uint32_t questId ) m_questCompleteFlags[ index ] ^= value; + Common::Service< World::Manager::MapMgr >::ref().updateQuests( *this ); + } bool Sapphire::Entity::Player::giveQuestRewards( uint32_t questId, uint32_t optionalChoice ) diff --git a/src/world/Event/EventHandler.h b/src/world/Event/EventHandler.h index 4afc4480..cec7d9a2 100644 --- a/src/world/Event/EventHandler.h +++ b/src/world/Event/EventHandler.h @@ -78,6 +78,8 @@ namespace Sapphire::Event FcTalk = 0x001F, Adventure = 0x0021, DailyQuestSupply = 0x0022, + TripleTriad = 0x0023, + PreHandler = 0x0036, ICDirector = 0x8003, PublicContentDirector = 0x8004, QuestBattleDirector = 0x8006, diff --git a/src/world/Manager/MapMgr.cpp b/src/world/Manager/MapMgr.cpp new file mode 100644 index 00000000..8e81c1e6 --- /dev/null +++ b/src/world/Manager/MapMgr.cpp @@ -0,0 +1,889 @@ +#include +#include + +#include +#include + +#include + +#include +#include +#include +#include + +#include +#include + +#include +#include + +#include "MapMgr.h" +#include "TerritoryMgr.h" + +#include "ServerMgr.h" + +using namespace Sapphire::Event; +using namespace Sapphire::Network::Packets; +using namespace Sapphire::Network::Packets::Server; + +Sapphire::World::Manager::MapMgr::MapMgr() +{ + auto& exdData = Common::Service< Data::ExdDataGenerated >::ref(); + + size_t count = 0; + + for( auto quest : exdData.m_QuestDat.get_rows() ) + { + if( exdData.getField< std::string >( quest.second, 1 ).empty() ) // id + continue; + + auto& questData = m_questData[ quest.first ]; + + questData.previousQuestJoin = exdData.getField< uint8_t >( quest.second, 8 ); + questData.previousQuestKeys[ 0 ] = exdData.getField< uint32_t >( quest.second, 9 ); + questData.previousQuest0Sequence = exdData.getField< uint8_t >( quest.second, 10 ); + questData.previousQuestKeys[ 1 ] = exdData.getField< uint32_t >( quest.second, 11 ); + questData.previousQuestKeys[ 2 ] = exdData.getField< uint32_t >( quest.second, 12 ); + + questData.questLockJoin = exdData.getField< uint8_t >( quest.second, 13 ); + questData.questLockKeys[ 0 ] = exdData.getField< uint32_t >( quest.second, 14 ); + questData.questLockKeys[ 1 ] = exdData.getField< uint32_t >( quest.second, 15 ); + + questData.classJobRequirements[ 0 ].classJobLevel = exdData.getField< uint16_t >( quest.second, 4 ); + auto classJobsCategory = exdData.get< Data::ClassJobCategory >( exdData.getField< uint8_t >( quest.second, 3 ) ); + for( int32_t i = 0; i <= Common::CLASSJOB_TOTAL; i++ ) + questData.classJobRequirements[ 0 ].classJobCategoryMask.set( i, ( &classJobsCategory->aDV )[ i ] ); + + questData.classJobRequirements[ 1 ].classJobLevel = exdData.getField< uint16_t >( quest.second, 7 ); + classJobsCategory = exdData.get< Data::ClassJobCategory >( exdData.getField< uint8_t >( quest.second, 6 ) ); + for( int32_t i = 0; i <= Common::CLASSJOB_TOTAL; i++ ) + questData.classJobRequirements[ 1 ].classJobCategoryMask.set( i, ( &classJobsCategory->aDV )[ i ] ); + + questData.column18 = exdData.getField< uint8_t >( quest.second, 18 ); + + questData.classJobUnlock = exdData.getField< uint8_t >( quest.second, 19 ); + + questData.requiredGC = exdData.getField< uint8_t >( quest.second, 20 ); + questData.requiredGCRank = exdData.getField< uint8_t >( quest.second, 21 ); + + questData.startTown = exdData.getField< uint8_t >( quest.second, 17 ); + + questData.header = exdData.getField< uint16_t >( quest.second, 16 ); + + questData.instanceContentJoin = exdData.getField< uint8_t >( quest.second, 22 ); + questData.instanceContent[ 0 ] = exdData.getField< uint32_t >( quest.second, 23 ); + questData.instanceContent[ 1 ] = exdData.getField< uint32_t >( quest.second, 24 ); + questData.instanceContent[ 2 ] = exdData.getField< uint32_t >( quest.second, 25 ); + + questData.festival = exdData.getField< uint8_t >( quest.second, 26 ); + questData.festivalBegin = exdData.getField< uint8_t >( quest.second, 27 ); + questData.festivalEnd = exdData.getField< uint8_t >( quest.second, 28 ); + questData.bellStart = exdData.getField< uint16_t >( quest.second, 29 ); + questData.bellEnd = exdData.getField< uint16_t >( quest.second, 30 ); + + questData.repeatIntervalType = exdData.getField< uint8_t >( quest.second, 44 ); + questData.questRepeatFlag = exdData.getField< uint8_t >( quest.second, 45 ); + + questData.beastTribe = exdData.getField< uint8_t >( quest.second, 31 ); + questData.beastReputationRank = exdData.getField< uint8_t >( quest.second, 32 ); + questData.beastReputationValue = exdData.getField< uint16_t >( quest.second, 33 ); + + questData.mount = exdData.getField< int32_t >( quest.second, 36 ); + + questData.satisfactionNpc = exdData.getField< uint8_t >( quest.second, 34 ); + questData.satisfactionRank = exdData.getField< uint8_t >( quest.second, 35 ); + + questData.issuer = exdData.getField< uint32_t >( quest.second, 39 ); + + questData.deliveryQuest = exdData.getField< uint8_t >( quest.second, 38 ); + + questData.expansion = exdData.getField< uint8_t >( quest.second, 2 ); + + questData.type = exdData.getField< uint8_t >(quest.second, 47); + + questData.isRepeatable = exdData.getField< bool >( quest.second, 43 ); + questData.isHouseRequired = exdData.getField< bool >( quest.second, 37 ); + + questData.iconValid = exdData.get< Data::EventIconType >( exdData.getField< uint8_t >( quest.second, 1512 ) )->mapIconAvailable + 1 + questData.isRepeatable; + questData.iconInvalid = exdData.get< Data::EventIconType >( exdData.getField< uint8_t >( quest.second, 1512 ) )->mapIconInvalid + 1 + questData.isRepeatable; + + uint32_t issuerLevelId = exdData.getField< uint32_t >( quest.second, 40 ); + if( issuerLevelId != 0 ) + { + if( count++ % 100 == 0 ) + std::cout << "."; + + auto level = exdData.get< Data::Level >( issuerLevelId ); + auto territory = level->territory; + + if( territory == 0 ) + territory = exdData.get< Data::Map >( level->map )->territoryType; + + EventData eventData; + eventData.iconId = questData.iconValid; + eventData.levelId = issuerLevelId; + eventData.actorId = questData.issuer; + + m_mapData[ territory ].emplace( quest.first, eventData ); + } + } + + auto& serverMgr = Common::Service< World::ServerMgr >::ref(); + auto m_gameData = new xiv::dat::GameData( serverMgr.getConfig().global.general.dataPath ); + + std::set< std::string > bgSet; + + for( auto territoryTypeId : exdData.getTerritoryTypeIdList() ) + { + auto territoryType = exdData.get< Data::TerritoryType >( territoryTypeId ); + if( territoryType->bg.empty() ) + continue; + + if( bgSet.find( territoryType->bg ) != bgSet.end() ) + continue; + else + bgSet.insert( territoryType->bg ); + + std::string planeventLgbPath( "bg/" + territoryType->bg.substr( 0, territoryType->bg.rfind( '/' ) ) + "/planevent.lgb" ); + auto planeventFile = m_gameData->getFile( planeventLgbPath ); + auto planeventData = planeventFile->access_data_sections().at( 0 ); + LGB_FILE planeventLgb( &planeventData[ 0 ], "planevent" ); + + for( const auto& group : planeventLgb.groups ) + { + for( const auto& pEntry : group.entries ) + { + if( pEntry->getType() == LgbEntryType::EventNpc ) + { + auto pNpc = reinterpret_cast< LGB_ENPC_ENTRY* >( pEntry.get() ); + + auto eNpcData = exdData.get< Data::ENpcBase >( pNpc->data.enpcId )->eNpcData; + + for( auto npcData : eNpcData ) + { + if( npcData == 0 ) + continue; // Some npcs have data gaps, so we have to iterate through the entire array + + if( count++ % 1000 == 0 ) + std::cout << "."; + + EventData eventData; + eventData.levelId = pNpc->data.instanceId; + eventData.actorId = pNpc->data.enpcId; + + auto eventHandlerType = static_cast< EventHandler::EventHandlerType >( npcData >> 16 ); + + switch( eventHandlerType ) + { + case EventHandler::EventHandlerType::GuildLeveAssignment: + { + eventData.iconId = exdData.get< Data::EventIconType >( 5 )->mapIconAvailable + 1; + + m_mapData[ territoryTypeId ].insert( std::make_pair( npcData, eventData ) ); + break; + } + + case EventHandler::EventHandlerType::CustomTalk: + { + // Include only the beginner arena icon yet. There a few other ones, that aren't referenced in the game files (Some examples are: The Triple Triad Tournament npc which has multiple icons and the ocean fishing icon) + if( npcData == 721223 ) + { + auto customTalk = exdData.get< Data::CustomTalk >( npcData ); + + eventData.iconId = customTalk->iconMap; + + m_mapData[ territoryTypeId ].insert( std::make_pair( npcData, eventData ) ); + } + break; + } + + case EventHandler::EventHandlerType::GuildOrderGuide: + { + eventData.iconId = exdData.get< Data::EventIconType >( 6 )->mapIconAvailable + 1; + + m_mapData[ territoryTypeId ].insert( std::make_pair( npcData, eventData ) ); + break; + } + + case EventHandler::EventHandlerType::TripleTriad: + { + eventData.iconId = exdData.get< Data::EventIconType >( 7 )->mapIconAvailable + 1; + + m_mapData[ territoryTypeId ].insert( std::make_pair( npcData, eventData ) ); + break; + } + + case EventHandler::EventHandlerType::PreHandler: + { + //I think this is used in Bozja and Zadnor, need evidence + //m_mapData[ territoryTypeId ].insert( std::make_pair( eventData, 0 ) ); + break; + } + } + } + } + } + } + } + std::cout << "\n"; +} + +void Sapphire::World::Manager::MapMgr::updateAll( Entity::Player& player ) +{ + auto& mapData = m_mapData[ player.getTerritoryTypeId() ]; + std::multimap< uint32_t, EventData, less > newMapData; + + for( auto eventData : mapData ) + { + switch( static_cast< EventHandler::EventHandlerType >( eventData.first >> 16 ) ) + { + case EventHandler::EventHandlerType::Quest: + { + if( isQuestAvailable( player, eventData ) ) + newMapData.insert( eventData ); + + break; + } + + case EventHandler::EventHandlerType::GuildLeveAssignment: + { + auto& exdData = Common::Service< Data::ExdDataGenerated >::ref(); + auto guildLeve = exdData.get< Data::GuildleveAssignment >( eventData.first ); + + if( player.isActionLearned( 5 ) ) + { + if( player.isQuestCompleted( guildLeve->quest[ 0 ] ) ) + { + if( eventData.first >= 393239 && eventData.first <= 393247 ) + { + if( player.getGc() != 0 ) + newMapData.insert( eventData ); + } + else + { + newMapData.insert( eventData ); + } + } + else if( eventData.first == 393217 || eventData.first == 393223 || eventData.first == 393225 ) // Leve npc locations: Bentbranch / Horizon / Swiftperch + { + if( player.isQuestCompleted( 220 ) || player.isQuestCompleted( 687 ) || player.isQuestCompleted( 693 ) ) + newMapData.insert( eventData ); + } + } + + break; + } + + case EventHandler::EventHandlerType::CustomTalk: + { + newMapData.insert( eventData ); + + break; + } + + case EventHandler::EventHandlerType::GuildOrderGuide: + { + if( player.isActionLearned( 7 ) ) + newMapData.insert( eventData ); + + break; + } + + case EventHandler::EventHandlerType::TripleTriad: + { + if( eventData.first == 2293771 ) // Triple Triad Master npc for now only + newMapData.insert( eventData ); + + break; + } + } + } + + sendPackets( player, newMapData, All ); +} + +void Sapphire::World::Manager::MapMgr::updateQuests( Entity::Player& player ) +{ + auto& mapData = m_mapData[ player.getTerritoryTypeId() ]; + std::multimap< uint32_t, EventData, less > newMapData; + + for( auto& eventData : mapData ) + { + if( ( eventData.first >> 16 ) == static_cast< uint16_t >( EventHandler::EventHandlerType::Quest ) ) + { + if( isQuestAvailable( player, eventData ) ) + newMapData.insert( eventData ); + } + } + + sendPackets( player, newMapData, Quest );; +} + +bool Sapphire::World::Manager::MapMgr::isQuestAvailable( Entity::Player& player, std::pair< const uint32_t, EventData >& eventData ) +{ + auto& exdData = Common::Service< Data::ExdDataGenerated >::ref(); + + auto& quest = m_questData[ eventData.first ]; + + if( ( player.isQuestCompleted( eventData.first ) && ( !quest.isRepeatable && eventData.first != 67114 ) ) || player.hasQuest( eventData.first ) || + ( quest.repeatIntervalType == 1 && quest.questRepeatFlag == 0 ) ) // Don't show daily beast tribe quests on the map yet. + return false; + + if( quest.classJobUnlock ) + { + if( quest.column18 == 3 ) + if( static_cast< uint8_t >( player.getClass() ) != quest.classJobUnlock ) + return false; + else if( quest.column18 == 4 ) + if ( static_cast< uint8_t >( player.getClass() ) == quest.classJobUnlock ) + return false; + else + return false; + } + + // Was this really ever used? + if( quest.startTown ) + { + if( quest.startTown != player.getStartTown() ) + return false; + } + + if( Common::CURRENT_EXPANSION_ID < quest.expansion ) + return false; + + if( quest.mount ) + { + if( !player.hasMount( quest.mount ) ) + return false; + } + + if( eventData.first == 65968 ) // Quest: A Legend for a Legend + { + uint16_t requiredMounts[] = { 28, 29, 30, 31, 40, 43 }; + + for( int32_t i = 0; i < 6; i++ ) + { + if( !player.hasMount( requiredMounts[ i ] ) ) + return false; + } + } + else if( eventData.first == 67086 ) // Quest: Fiery Wings, Fiery Hearts + { + uint16_t requiredMounts[] = { 75, 76, 77, 78, 90, 98, 104 }; + + for( int32_t i = 0; i < 6; i++ ) + { + if( !player.hasMount( requiredMounts[ i ] ) ) + return false; + } + } + else if( eventData.first == 68736 ) // Quest: A Lone Wolf No More + { + uint16_t requiredMounts[] = { 115, 116, 133, 144, 158, 172, 182 }; + + for( int32_t i = 0; i < 6; i++ ) + { + if( !player.hasMount( requiredMounts[ i ] ) ) + return false; + } + } + + if( quest.requiredGC || quest.requiredGCRank ) + { + if( quest.requiredGC != player.getGc() ) + return false; + + if( quest.requiredGCRank > player.getGcRankArray()[ player.getGc() - 1 ] ) + eventData.second.iconId = quest.iconInvalid; + } + + if( quest.header != 0 ) + { + if ( !player.isActionLearned( quest.header ) ) + return false; + } + + //Required previous quests for ARR relic + if( eventData.first == 66971 ) // Quest: Up in Arms + { + for( int32_t i = 0; i <= Common::CLASSJOB_TOTAL; i++ ) + { + auto classJob = exdData.get< Data::ClassJob >( i ); + + if( player.isQuestCompleted( classJob->relicQuest ) ) + break; + + if( i == Common::CLASSJOB_TOTAL ) + return false; + } + } + else if( eventData.first == 65897 ) // Quest: His Dark Materia + { + // Quests in the following order: A Ponze of Flesh, Labor of Love, Method in His Malice, A Treasured Mother + if( !player.isQuestCompleted( 357 ) || !player.isQuestCompleted( 358 ) || !player.isQuestCompleted( 359 ) || !player.isQuestCompleted( 360 ) ) + return false; + } + + if( quest.previousQuestJoin == 1 ) + { + for( int32_t i = 0; i < 3; i++ ) + { + if( quest.previousQuestKeys[ i ] == 0 ) + continue; + + if( !player.isQuestCompleted( quest.previousQuestKeys[ i ] ) ) + { + if( i == 0 && quest.previousQuest0Sequence != 0 ) + { + if( player.getQuestSeq( quest.previousQuestKeys[ i ] ) < quest.previousQuest0Sequence ) + return false; + } + else + { + return false; + } + } + } + } + else if( quest.previousQuestJoin == 2 ) + { + for( int32_t i = 0; i < 3; i++ ) + { + if( quest.previousQuestKeys[ i ] == 0 ) + continue; + + if( player.isQuestCompleted( quest.previousQuestKeys[ i ] ) ) + break; + + if( i == 2 ) + return false; + } + } + + if( quest.questLockJoin == 1 ) + { + for( int32_t i = 0; i < 2; i++ ) + { + if( quest.questLockKeys[ i ] == 0 ) + continue; + + if( !player.isQuestCompleted( quest.questLockKeys[ i ] ) && !player.hasQuest( quest.questLockKeys[ i ] ) ) + break; + + if( i == 1 ) + return false; + } + } + else if( quest.questLockJoin == 2 ) + { + for( int32_t i = 0; i < 2; i++ ) + { + if( quest.questLockKeys[ i ] == 0 ) + continue; + + if( player.isQuestCompleted( quest.questLockKeys[ i ] ) || player.hasQuest( quest.questLockKeys[ i ] ) ) + return false; + } + } + + if( quest.instanceContentJoin == 1 ) + { + for( int32_t i = 0; i < 3; i++ ) + { + if( quest.instanceContent[ i ] == 0 ) + continue; + + eventData.second.iconId = quest.iconInvalid; + } + } + else if( quest.instanceContentJoin == 2 ) + { + for( int32_t i = 0; i < 3; i++ ) + { + if( quest.instanceContent[ i ] == 0 ) + continue; + + eventData.second.iconId = quest.iconInvalid; + } + } + + if( quest.festival ) + { + auto& territoryMgr = Common::Service< Manager::TerritoryMgr >::ref(); + auto& festival = territoryMgr.getCurrentFestival(); + + if( quest.festival != festival.first && quest.festival != festival.second ) + return false; + + // Don't show festivals with begin state other than 0 yet + if( quest.festivalBegin != 0 ) + return false; + } + + if( quest.bellStart || quest.bellEnd ) + { + uint64_t curEorzeaTime = Util::getEorzeanTimeStamp(); + uint32_t convTime = 100 * (curEorzeaTime / 3600 % 24) + curEorzeaTime / 60 % 60; + + if( quest.bellStart <= quest.bellEnd ) + { + if( convTime < quest.bellStart || convTime >= quest.bellEnd ) + eventData.second.iconId = quest.iconInvalid; + } + else + { + if( convTime < quest.bellStart && convTime >= quest.bellEnd ) + eventData.second.iconId = quest.iconInvalid; + } + } + + if( !quest.classJobRequirements[0].classJobCategoryMask.test( static_cast< uint8_t >( player.getClass() ) ) ) + eventData.second.iconId = quest.iconInvalid; + + if( player.getQuestSeq( eventData.first ) || ( quest.type & 1 ) == 0 ) + { + for( int32_t i = 1; i <= Common::CLASSJOB_TOTAL; i++ ) + { + if( quest.classJobRequirements[0].classJobCategoryMask.test( i ) ) + { + if( player.getLevelForClass( static_cast< Common::ClassJob >( i ) ) >= quest.classJobRequirements[0].classJobLevel ) + break; + } + + if( i == Common::CLASSJOB_TOTAL ) + return false; + } + } + else + { + if( player.getLevel() < quest.classJobRequirements[0].classJobLevel ) + return false; + } + + if( quest.classJobRequirements[1].classJobCategoryMask.any() ) + { + for( int32_t i = 1; i <= Common::CLASSJOB_TOTAL; i++ ) + { + if( quest.classJobRequirements[1].classJobCategoryMask.test( i ) ) + { + if( player.getLevelForClass( static_cast< Common::ClassJob >( i ) ) >= quest.classJobRequirements[1].classJobLevel ) + break; + } + + if( i == Common::CLASSJOB_TOTAL ) + return false; + } + } + + for( int32_t i = 0; i <= Common::CLASSJOB_TOTAL; i++ ) + { + auto classJob = exdData.get< Data::ClassJob >( i ); + + if( classJob->relicQuest == eventData.first ) + { + for( int32_t j = 0; i <= Common::CLASSJOB_TOTAL; i++ ) + { + classJob = exdData.get< Data::ClassJob >( i ); + + if( player.hasQuest( classJob->relicQuest ) ) + return false; + } + + break; + } + } + + if( quest.beastTribe ) + return false; + + if( quest.satisfactionNpc ) + return false; + + auto isRelicEquipped = [ &player, &eventData ]( uint32_t* mainWeaponId, uint32_t secondaryWeaponId ) + { + for( int32_t i = 0; i < 10; i++ ) + { + if( i == 0 ) + { + if( player.getEquippedSecondaryWeapon() == nullptr ) + { + if( player.getEquippedWeapon()->getId() == mainWeaponId[ i ] && secondaryWeaponId == 0 ) + return true; + } + else if( player.getEquippedWeapon()->getId() == mainWeaponId[ i ] && player.getEquippedSecondaryWeapon()->getId() == secondaryWeaponId ) + { + return true; + } + } + else + { + if( player.getEquippedWeapon()->getId() == mainWeaponId[ i ] ) + return true; + } + } + + return false; + }; + + switch( eventData.first ) + { + case 65742: // Quest: Mmmmmm, Soulglazed Relics + { + uint32_t relicItemIds[] = { 7863, 7864, 7865, 7866, 7867, 9253, 7868, 7869, 7870, 7871 }; + + if( !isRelicEquipped( relicItemIds, 7872 ) ) + eventData.second.iconId = quest.iconInvalid; + + break; + } + + case 65892: // Quest: Wherefore Art Thou, Zodiac + case 65897: // Quest: His Dark Materia + { + uint32_t relicItemIds[] = { 8649, 8650, 8651, 8652, 8653, 9254, 8654, 8655, 8656, 8657 }; + + if( !isRelicEquipped( relicItemIds, 8658 ) ) + eventData.second.iconId = quest.iconInvalid; + + break; + } + + case 66096: // Quest: Rise and Shine + { + uint32_t relicItemIds[] = { 9491, 9492, 9493, 9494, 9495, 9501, 9496, 9497, 9498, 9499 }; + + if( !isRelicEquipped( relicItemIds, 9500 ) ) + eventData.second.iconId = quest.iconInvalid; + + break; + } + + case 66097: // Quest: The Vital Title + { + uint32_t relicItemIds[] = { 10054, 10055, 10056, 10057, 10058, 10064, 10059, 10060, 10061, 10062 }; + + if( !isRelicEquipped( relicItemIds, 10063 ) ) + eventData.second.iconId = quest.iconInvalid; + + break; + } + + case 66971: // Quest: Up in Arms + { + uint32_t relicItemIds[] = { 6257, 6258, 6259, 6260, 6261, 9250, 6262, 6263, 6264, 6265 }; + + if( !isRelicEquipped( relicItemIds, 0 ) ) + eventData.second.iconId = quest.iconInvalid; + + break; + } + + case 66972: // Quest: Trials of the Braves + { + uint32_t relicItemIds[] = { 7824, 7825, 7826, 7827, 7828, 9251, 7829, 7830, 7831, 7832 }; + + if( !isRelicEquipped( relicItemIds, 7833 ) ) + eventData.second.iconId = quest.iconInvalid; + + break; + } + + case 66998: // Quest: Celestial Radiance + case 67000: // Quest: Star Light, Star Bright + { + uint32_t relicItemIds[] = { 7834, 7835, 7836, 7837, 7838, 9252, 7839, 7840, 7841, 7842 }; + + if( !isRelicEquipped( relicItemIds, 7843 ) ) + eventData.second.iconId = quest.iconInvalid; + + break; + } + + case 67823: // Quest: The Vital Title + { + uint32_t relicItemIds[] = { 12124, 12133, 12142, 12151, 12160, 12169, 12178, 12187, 12196 }; + + if( !isRelicEquipped( relicItemIds, 12213 ) ) + eventData.second.iconId = quest.iconInvalid; + + break; + } + } + + if( eventData.first >= 67001 && eventData.first <= 67003 ) // Quest: Call of the Wild + { + // Quests in the following order: Martial Perfection / Feathers and Folly / Like Clutchfather, Like Son / Revenge of the Furred / Spread Your Wings and Soar + if( !player.isQuestCompleted( 1221 ) || !player.isQuestCompleted( 1256 ) || !player.isQuestCompleted( 1378 ) || !player.isQuestCompleted( 1324 ) || !player.isQuestCompleted( 1493 ) ) + return false; + } + else if( eventData.first == 67918 ) // Quest: When Good Dragons Go Bad + { + // Quests in the following order: The Nest of Honor / A Symbiotic Friendship / The Zenith of Craftsmanship / Heavensward + if( !player.isQuestCompleted( 2225 ) || !player.isQuestCompleted( 2260 ) || !player.isQuestCompleted( 2327 ) || !player.isQuestCompleted( 1669 ) ) + return false; + } + + if( eventData.first >= 66968 && eventData.first <= 66970 ) // Quest: An Ill-conceived Venture + return false; + + if( quest.isHouseRequired ) + return false; + + if( quest.deliveryQuest ) + return false; + + if( eventData.first == 67114 ) // Quest: The Ties That Bind + return false; + + if( eventData.first == 66112 ) // Quest: Like Sire Like Fledgling + { + if( !( player.getHowToArray()[ 198 / 8 ] & ( 1 << ( 198 % 8 ) ) ) ) + return false; + } + + if( player.getQuestSeq( eventData.first ) == 0 ) + { + auto questAccept = exdData.get< Data::QuestAcceptAdditionCondition >( eventData.first ); + + if( questAccept ) + { + for( int32_t i = 0; i < 2; i++ ) + { + if( ( &questAccept->requirement0 )[ i ] >= 65536 ) + { + if( !player.isActionLearned( 245 ) && !player.isQuestCompleted( ( &questAccept->requirement0 )[ i ] ) ) + return false; + } + else + { + if( !player.isActionLearned( ( &questAccept->requirement0 )[ i ] ) ) + return false; + } + } + } + } + + // Quests in the following order: Open and Inviting / The Adventurer with All the Cards + if( eventData.first == 69566 || eventData.first == 69617 ) + return false; + + return true; +} + +bool Sapphire::World::Manager::MapMgr::isTripleTriadAvailable( Entity::Player& player, std::pair< const uint32_t, EventData >& eventData ) +{ + auto& exdData = Common::Service< Data::ExdDataGenerated >::ref(); + auto tripleTriad = exdData.get< Data::TripleTriad >( eventData.first ); + + if( tripleTriad->previousQuestJoin == 1 ) + { + for( int32_t i = 0; i < 3; i++ ) + { + if( tripleTriad->previousQuest[ i ] == 0 ) + continue; + + if( !player.isQuestCompleted( tripleTriad->previousQuest[ i ] ) ) + return false; + } + } + else if( tripleTriad->previousQuestJoin == 2 ) + { + for( int32_t i = 0; i < 3; i++ ) + { + if( tripleTriad->previousQuest[ i ] == 0 ) + continue; + + if( player.isQuestCompleted( tripleTriad->previousQuest[ i ] ) ) + break; + + if( i == 2 ) + return false; + } + } + + return true; +} + +void Sapphire::World::Manager::MapMgr::fillPacket( std::multimap< uint32_t, EventData, less >& mapData, uint32_t* iconIds, uint32_t* levelIds, uint32_t* eventIds ) +{ + int32_t i = 0; + for( auto& eventData : mapData ) + { + iconIds[ i ] = eventData.second.iconId; + levelIds[ i ] = eventData.second.levelId; + eventIds[ i ] = eventData.first; + + i++; + } +} + +void Sapphire::World::Manager::MapMgr::sendPackets( Entity::Player& player, std::multimap< uint32_t, EventData, less >& mapData, UpdateMode updateMode ) +{ + player.queuePacket( makeActorControlSelf( player.getId(), Network::ActorControl::BeginMapUpdate, updateMode ) ); + + if( mapData.size() <= 2 ) + { + auto mapUpdatePacket = makeZonePacket< FFXIVIpcMapUpdate >( player.getId() ); + mapUpdatePacket->data().entryCount = mapData.size(); + + fillPacket( mapData, mapUpdatePacket->data().iconIds, mapUpdatePacket->data().levelIds, mapUpdatePacket->data().eventIds ); + + player.queuePacket( mapUpdatePacket ); + } + else if( mapData.size() <= 4 ) + { + auto mapUpdatePacket = makeZonePacket< FFXIVIpcMapUpdate4 >( player.getId() ); + mapUpdatePacket->data().entryCount = mapData.size(); + + fillPacket( mapData, mapUpdatePacket->data().iconIds, mapUpdatePacket->data().levelIds, mapUpdatePacket->data().eventIds ); + + player.queuePacket( mapUpdatePacket ); + } + else if( mapData.size() <= 8 ) + { + auto mapUpdatePacket = makeZonePacket< FFXIVIpcMapUpdate8 >( player.getId() ); + mapUpdatePacket->data().entryCount = mapData.size(); + + fillPacket( mapData, mapUpdatePacket->data().iconIds, mapUpdatePacket->data().levelIds, mapUpdatePacket->data().eventIds ); + + player.queuePacket( mapUpdatePacket ); + } + else if( mapData.size() <= 16 ) + { + auto mapUpdatePacket = makeZonePacket< FFXIVIpcMapUpdate16 >( player.getId() ); + mapUpdatePacket->data().entryCount = mapData.size(); + + fillPacket( mapData, mapUpdatePacket->data().iconIds, mapUpdatePacket->data().levelIds, mapUpdatePacket->data().eventIds ); + + player.queuePacket( mapUpdatePacket ); + } + else if( mapData.size() <= 32 ) + { + auto mapUpdatePacket = makeZonePacket< FFXIVIpcMapUpdate32 >( player.getId() ); + mapUpdatePacket->data().entryCount = mapData.size(); + + fillPacket( mapData, mapUpdatePacket->data().iconIds, mapUpdatePacket->data().levelIds, mapUpdatePacket->data().eventIds ); + + player.queuePacket( mapUpdatePacket ); + } + else if( mapData.size() <= 64 ) + { + auto mapUpdatePacket = makeZonePacket< FFXIVIpcMapUpdate64 >( player.getId() ); + mapUpdatePacket->data().entryCount = mapData.size(); + + fillPacket( mapData, mapUpdatePacket->data().iconIds, mapUpdatePacket->data().levelIds, mapUpdatePacket->data().eventIds ); + + player.queuePacket( mapUpdatePacket ); + } + else if( mapData.size() <= 128 ) + { + auto mapUpdatePacket = makeZonePacket< FFXIVIpcMapUpdate128 >( player.getId() ); + mapUpdatePacket->data().entryCount = mapData.size(); + + fillPacket( mapData, mapUpdatePacket->data().iconIds, mapUpdatePacket->data().levelIds, mapUpdatePacket->data().eventIds ); + + player.queuePacket( mapUpdatePacket ); + } + + player.queuePacket( makeActorControlSelf( player.getId(), Network::ActorControl::FinishMapUpdate ) ); +} diff --git a/src/world/Manager/MapMgr.h b/src/world/Manager/MapMgr.h new file mode 100644 index 00000000..a3315486 --- /dev/null +++ b/src/world/Manager/MapMgr.h @@ -0,0 +1,132 @@ +#ifndef SAPPHIRE_MAPMGR_H +#define SAPPHIRE_MAPMGR_H + +#include "ForwardsZone.h" + +#include +#include + +namespace Sapphire::World::Manager +{ + + class MapMgr + { + public: + enum UpdateMode : uint8_t + { + Quest = 1, + GuildLeveAssignment = 2, + GuildOrderGuide = 4, + TripleTriad = 8, + CustomTalk = 16, + PreHandler = 32, + + All = 0x3F + }; + + MapMgr(); + + void updateAll( Entity::Player& player ); + void updateQuests( Entity::Player& player ); + + private: + struct EventData + { + uint32_t iconId; + uint32_t levelId; + uint32_t actorId; + }; + + struct QuestData + { + uint8_t previousQuestJoin; // 1 = requires all previous quest, 2 = requires any previous quest + uint32_t previousQuestKeys[3]; + uint8_t previousQuest0Sequence; + + uint8_t questLockJoin; // 1 = only locks when all previous quests are done, 2 = locks when any previous quest is done + uint32_t questLockKeys[2]; + + struct + { + std::bitset< Common::CLASSJOB_TOTAL + 1 > classJobCategoryMask; + uint16_t classJobLevel; + } classJobRequirements[2]; + + uint8_t column18; + uint8_t classJobUnlock; + + uint8_t requiredGC; + uint8_t requiredGCRank; + + uint8_t startTown; + + uint16_t header; + + uint8_t instanceContentJoin; // 1 = requires all needed instances to be completed, 2 = requires any needed instance to be completed + uint32_t instanceContent[3]; + + uint8_t festival; + uint8_t festivalBegin; + uint8_t festivalEnd; + uint16_t bellStart; + uint16_t bellEnd; + + uint8_t repeatIntervalType; + uint8_t questRepeatFlag; + + uint8_t beastTribe; + uint8_t beastReputationRank; + uint16_t beastReputationValue; + + int32_t mount; + + uint8_t satisfactionNpc; + uint8_t satisfactionRank; + + uint32_t issuer; + + uint8_t deliveryQuest; + + uint8_t expansion; + + uint8_t type; + + bool isRepeatable; + bool isHouseRequired; + + uint32_t iconValid; + uint32_t iconInvalid; + }; + + struct less + { + constexpr bool operator()( const uint32_t& _Left, const uint32_t& _Right ) const + { + const uint16_t left = _Left; + const uint16_t right = _Right; + + if( left == right ) + { + const uint16_t typeLeft = _Left >> 16; + const uint16_t typeRight = _Right >> 16; + + return typeLeft < typeRight; + } + + return left < right; + } + }; + + std::map< uint16_t, std::multimap< uint32_t, EventData, less > > m_mapData; + std::map< uint32_t, QuestData > m_questData; + + bool isQuestAvailable( Entity::Player& player, std::pair< const uint32_t, EventData >& eventData ); + bool isTripleTriadAvailable( Entity::Player& player, std::pair< const uint32_t, EventData >& eventData ); + + void fillPacket( std::multimap< uint32_t, EventData, less >& mapData, uint32_t* iconIds, uint32_t* levelIds, uint32_t* eventIds ); + void sendPackets( Entity::Player& player, std::multimap< uint32_t, EventData, less >& mapData, UpdateMode updateMode ); + }; + +} + +#endif // SAPPHIRE_MAPMGR_H \ No newline at end of file diff --git a/src/world/ServerMgr.cpp b/src/world/ServerMgr.cpp index 4d539b59..4033f7c2 100644 --- a/src/world/ServerMgr.cpp +++ b/src/world/ServerMgr.cpp @@ -41,6 +41,7 @@ #include "Manager/RNGMgr.h" #include "Manager/NaviMgr.h" #include "Manager/ActionMgr.h" +#include "Manager/MapMgr.h" #include "Territory/InstanceObjectCache.h" @@ -173,6 +174,10 @@ void Sapphire::World::ServerMgr::run( int32_t argc, char* argv[] ) auto pInstanceObjCache = std::make_shared< Sapphire::InstanceObjectCache >(); Common::Service< Sapphire::InstanceObjectCache >::set( pInstanceObjCache ); + Logger::info( "MapMgr: Caching map data" ); + auto pMapMgr = std::make_shared< Manager::MapMgr >(); + Common::Service< Manager::MapMgr >::set( pMapMgr ); + auto pActionMgr = std::make_shared< Manager::ActionMgr >(); Common::Service< Manager::ActionMgr >::set( pActionMgr ); From f4d84e0a17fa6740ced5dc4b61c204c178219764 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?=E3=82=B3=E3=83=AC=E3=83=83=E3=83=88?= <59412435+collett8192@users.noreply.github.com> Date: Wed, 1 Sep 2021 15:50:45 +0900 Subject: [PATCH 25/43] fix /sit rotation on other client (#722) --- src/world/Network/Handlers/PacketHandlers.cpp | 3 +-- 1 file changed, 1 insertion(+), 2 deletions(-) diff --git a/src/world/Network/Handlers/PacketHandlers.cpp b/src/world/Network/Handlers/PacketHandlers.cpp index 1daf63f7..c51d9335 100644 --- a/src/world/Network/Handlers/PacketHandlers.cpp +++ b/src/world/Network/Handlers/PacketHandlers.cpp @@ -790,12 +790,12 @@ void Sapphire::Network::GameConnection::worldInteractionhandler( const Packets:: break; player.setPos( packet.data().position ); + player.setRot( Util::floatFromUInt16Rot( param4 ) ); if( emote == 0x32 && player.hasInRangeActor() ) { auto setpos = makeZonePacket< FFXIVIpcActorSetPos >( player.getId() ); setpos->data().r16 = param4; setpos->data().waitForLoad = 18; - setpos->data().unknown1 = 1; setpos->data().x = packet.data().position.x; setpos->data().y = packet.data().position.y; setpos->data().z = packet.data().position.z; @@ -825,7 +825,6 @@ void Sapphire::Network::GameConnection::worldInteractionhandler( const Packets:: auto setpos = makeZonePacket< FFXIVIpcActorSetPos >( player.getId() ); setpos->data().r16 = param2; setpos->data().waitForLoad = 18; - setpos->data().unknown1 = 2; setpos->data().x = packet.data().position.x; setpos->data().y = packet.data().position.y; setpos->data().z = packet.data().position.z; From 55247a41f6cc11e518fe220c3b157069ef57d7f5 Mon Sep 17 00:00:00 2001 From: Taezen <86413840+Taezen@users.noreply.github.com> Date: Mon, 6 Sep 2021 11:17:59 +0200 Subject: [PATCH 26/43] minor changes for the map implementation --- src/common/Network/PacketDef/Zone/ServerZoneDef.h | 1 - src/world/Actor/Player.cpp | 4 ++-- src/world/Actor/Player.h | 4 ++-- src/world/Manager/MapMgr.cpp | 13 ++++++------- src/world/Manager/MapMgr.h | 2 +- 5 files changed, 11 insertions(+), 13 deletions(-) diff --git a/src/common/Network/PacketDef/Zone/ServerZoneDef.h b/src/common/Network/PacketDef/Zone/ServerZoneDef.h index 6a0652a6..84794646 100644 --- a/src/common/Network/PacketDef/Zone/ServerZoneDef.h +++ b/src/common/Network/PacketDef/Zone/ServerZoneDef.h @@ -931,7 +931,6 @@ namespace Sapphire::Network::Packets::Server uint32_t unknown9; uint32_t unknown10; uint32_t festivalId; - uint32_t unknown11; uint32_t unknown12[3]; uint32_t additionalFestivalId; uint32_t unknown13[3]; diff --git a/src/world/Actor/Player.cpp b/src/world/Actor/Player.cpp index d358aa1c..1ef07103 100644 --- a/src/world/Actor/Player.cpp +++ b/src/world/Actor/Player.cpp @@ -731,7 +731,7 @@ void Sapphire::Entity::Player::learnSong( uint8_t songId, uint32_t itemId ) queuePacket( makeActorControlSelf( getId(), ToggleOrchestrionUnlock, songId, 1, itemId ) ); } -bool Sapphire::Entity::Player::isActionLearned( uint16_t actionId ) const +bool Sapphire::Entity::Player::isActionLearned( uint32_t actionId ) const { uint16_t index; uint8_t value; @@ -1287,7 +1287,7 @@ const uint8_t* Sapphire::Entity::Player::getMountGuideBitmask() const return m_mountGuide; } -const bool Sapphire::Entity::Player::hasMount( int16_t mountId ) const +const bool Sapphire::Entity::Player::hasMount( uint32_t mountId ) const { auto& exdData = Common::Service< Data::ExdDataGenerated >::ref(); auto mount = exdData.get< Data::Mount >( mountId ); diff --git a/src/world/Actor/Player.h b/src/world/Actor/Player.h index fbb2aedb..3aa474de 100644 --- a/src/world/Actor/Player.h +++ b/src/world/Actor/Player.h @@ -646,7 +646,7 @@ namespace Sapphire::Entity void learnSong( uint8_t songId, uint32_t itemId ); /*! check if an action is already unlocked in the bitmask. */ - bool isActionLearned( uint16_t actionId ) const; + bool isActionLearned( uint32_t actionId ) const; /*! return a const pointer to the unlock bitmask array */ const uint8_t* getUnlockBitmask() const; @@ -657,7 +657,7 @@ namespace Sapphire::Entity /*! return a const pointer to the mount guide bitmask array */ const uint8_t* getMountGuideBitmask() const; - const bool hasMount( int16_t mountId ) const; + const bool hasMount( uint32_t mountId ) const; bool checkAction() override; diff --git a/src/world/Manager/MapMgr.cpp b/src/world/Manager/MapMgr.cpp index 8e81c1e6..f204020f 100644 --- a/src/world/Manager/MapMgr.cpp +++ b/src/world/Manager/MapMgr.cpp @@ -59,8 +59,7 @@ Sapphire::World::Manager::MapMgr::MapMgr() for( int32_t i = 0; i <= Common::CLASSJOB_TOTAL; i++ ) questData.classJobRequirements[ 1 ].classJobCategoryMask.set( i, ( &classJobsCategory->aDV )[ i ] ); - questData.column18 = exdData.getField< uint8_t >( quest.second, 18 ); - + questData.classJobUnlockFlag = exdData.getField< uint8_t >( quest.second, 18 ); questData.classJobUnlock = exdData.getField< uint8_t >( quest.second, 19 ); questData.requiredGC = exdData.getField< uint8_t >( quest.second, 20 ); @@ -331,10 +330,10 @@ bool Sapphire::World::Manager::MapMgr::isQuestAvailable( Entity::Player& player, if( quest.classJobUnlock ) { - if( quest.column18 == 3 ) + if( quest.classJobUnlockFlag == 3 ) if( static_cast< uint8_t >( player.getClass() ) != quest.classJobUnlock ) return false; - else if( quest.column18 == 4 ) + else if( quest.classJobUnlockFlag == 4 ) if ( static_cast< uint8_t >( player.getClass() ) == quest.classJobUnlock ) return false; else @@ -359,7 +358,7 @@ bool Sapphire::World::Manager::MapMgr::isQuestAvailable( Entity::Player& player, if( eventData.first == 65968 ) // Quest: A Legend for a Legend { - uint16_t requiredMounts[] = { 28, 29, 30, 31, 40, 43 }; + uint32_t requiredMounts[] = { 28, 29, 30, 31, 40, 43 }; for( int32_t i = 0; i < 6; i++ ) { @@ -369,7 +368,7 @@ bool Sapphire::World::Manager::MapMgr::isQuestAvailable( Entity::Player& player, } else if( eventData.first == 67086 ) // Quest: Fiery Wings, Fiery Hearts { - uint16_t requiredMounts[] = { 75, 76, 77, 78, 90, 98, 104 }; + uint32_t requiredMounts[] = { 75, 76, 77, 78, 90, 98, 104 }; for( int32_t i = 0; i < 6; i++ ) { @@ -379,7 +378,7 @@ bool Sapphire::World::Manager::MapMgr::isQuestAvailable( Entity::Player& player, } else if( eventData.first == 68736 ) // Quest: A Lone Wolf No More { - uint16_t requiredMounts[] = { 115, 116, 133, 144, 158, 172, 182 }; + uint32_t requiredMounts[] = { 115, 116, 133, 144, 158, 172, 182 }; for( int32_t i = 0; i < 6; i++ ) { diff --git a/src/world/Manager/MapMgr.h b/src/world/Manager/MapMgr.h index a3315486..92e4eb8f 100644 --- a/src/world/Manager/MapMgr.h +++ b/src/world/Manager/MapMgr.h @@ -52,7 +52,7 @@ namespace Sapphire::World::Manager uint16_t classJobLevel; } classJobRequirements[2]; - uint8_t column18; + uint8_t classJobUnlockFlag; uint8_t classJobUnlock; uint8_t requiredGC; From 774d16667df9d3858663748dbf9536dddaf51536 Mon Sep 17 00:00:00 2001 From: Taezen <86413840+Taezen@users.noreply.github.com> Date: Tue, 7 Sep 2021 16:50:13 +0200 Subject: [PATCH 27/43] little map manager rework --- src/common/Exd/ExdDataGenerated.cpp | 13 +- src/common/Exd/ExdDataGenerated.h | 11 +- src/world/Event/EventHandler.h | 7 + src/world/Manager/MapMgr.cpp | 929 ++++++++------------ src/world/Manager/MapMgr.h | 95 +- src/world/Script/NativeScriptApi.cpp | 6 +- src/world/Script/NativeScriptApi.h | 3 + src/world/ServerMgr.cpp | 2 +- src/world/Territory/InstanceObjectCache.cpp | 63 +- src/world/Territory/InstanceObjectCache.h | 24 + 10 files changed, 501 insertions(+), 652 deletions(-) diff --git a/src/common/Exd/ExdDataGenerated.cpp b/src/common/Exd/ExdDataGenerated.cpp index 130023d6..b6f845ca 100644 --- a/src/common/Exd/ExdDataGenerated.cpp +++ b/src/common/Exd/ExdDataGenerated.cpp @@ -4582,9 +4582,11 @@ Sapphire::Data::GuildleveAssignment::GuildleveAssignment( uint32_t row_id, Sapph { auto row = exdData->m_GuildleveAssignmentDat.get_row( row_id ); type = exdData->getField< std::string >( row, 0 ); + typeId = exdData->getField< uint8_t >( row, 1 ); assignmentTalk = exdData->getField< uint32_t >( row, 2 ); quest.push_back( exdData->getField< uint32_t >( row, 3 ) ); quest.push_back( exdData->getField< uint32_t >( row, 4 ) ); + grandCompanyRank = exdData->getField< uint8_t >( row, 10 ); } Sapphire::Data::GuildleveAssignmentCategory::GuildleveAssignmentCategory( uint32_t row_id, Sapphire::Data::ExdDataGenerated* exdData ) @@ -7669,13 +7671,16 @@ Sapphire::Data::Quest::Quest( uint32_t row_id, Sapphire::Data::ExdDataGenerated* classJobCategory1 = exdData->getField< uint8_t >( row, 6 ); classJobLevel1 = exdData->getField< uint16_t >( row, 7 ); previousQuestJoin = exdData->getField< uint8_t >( row, 8 ); - previousQuest0 = exdData->getField< uint32_t >( row, 9 ); - previousQuest1 = exdData->getField< uint32_t >( row, 11 ); - previousQuest2 = exdData->getField< uint32_t >( row, 12 ); + previousQuest.push_back( exdData->getField< uint32_t >( row, 9 ) ); + previousQuest0Sequence = exdData->getField< uint8_t >( row, 10 ); + previousQuest.push_back( exdData->getField< uint32_t >( row, 11 ) ); + previousQuest.push_back( exdData->getField< uint32_t >( row, 12 ) ); questLockJoin = exdData->getField< uint8_t >( row, 13 ); questLock.push_back( exdData->getField< uint32_t >( row, 14 ) ); questLock.push_back( exdData->getField< uint32_t >( row, 15 ) ); header = exdData->getField< uint16_t >( row, 16 ); + startTown = exdData->getField< uint8_t >( row, 17 ); + classJobUnlockFlag = exdData->getField< uint8_t >( row, 18 ); classJobUnlock = exdData->getField< uint8_t >( row, 19 ); grandCompany = exdData->getField< uint8_t >( row, 20 ); grandCompanyRank = exdData->getField< uint8_t >( row, 21 ); @@ -7691,6 +7696,8 @@ Sapphire::Data::Quest::Quest( uint32_t row_id, Sapphire::Data::ExdDataGenerated* beastTribe = exdData->getField< uint8_t >( row, 31 ); beastReputationRank = exdData->getField< uint8_t >( row, 32 ); beastReputationValue = exdData->getField< uint16_t >( row, 33 ); + satisfactionNpc = exdData->getField< uint8_t >( row, 34 ); + satisfactionLevel = exdData->getField< uint8_t >( row, 35 ); mountRequired = exdData->getField< int32_t >( row, 36 ); isHouseRequired = exdData->getField< bool >( row, 37 ); deliveryQuest = exdData->getField< uint8_t >( row, 38 ); diff --git a/src/common/Exd/ExdDataGenerated.h b/src/common/Exd/ExdDataGenerated.h index b670239f..7f890fdd 100644 --- a/src/common/Exd/ExdDataGenerated.h +++ b/src/common/Exd/ExdDataGenerated.h @@ -4366,8 +4366,10 @@ struct GuideTitle struct GuildleveAssignment { std::string type; + uint8_t typeId; uint32_t assignmentTalk; std::vector< uint32_t > quest; + uint8_t grandCompanyRank; GuildleveAssignment( uint32_t row_id, Sapphire::Data::ExdDataGenerated* exdData ); }; @@ -6324,12 +6326,13 @@ struct Quest uint8_t classJobCategory1; uint16_t classJobLevel1; uint8_t previousQuestJoin; - uint32_t previousQuest0; - uint32_t previousQuest1; - uint32_t previousQuest2; + std::vector< uint32_t > previousQuest; + uint8_t previousQuest0Sequence; uint8_t questLockJoin; std::vector< uint32_t > questLock; uint16_t header; + uint8_t startTown; + uint8_t classJobUnlockFlag; uint8_t classJobUnlock; uint8_t grandCompany; uint8_t grandCompanyRank; @@ -6343,6 +6346,8 @@ struct Quest uint8_t beastTribe; uint8_t beastReputationRank; uint16_t beastReputationValue; + uint8_t satisfactionNpc; + uint8_t satisfactionLevel; int32_t mountRequired; bool isHouseRequired; uint8_t deliveryQuest; diff --git a/src/world/Event/EventHandler.h b/src/world/Event/EventHandler.h index cec7d9a2..86c0856a 100644 --- a/src/world/Event/EventHandler.h +++ b/src/world/Event/EventHandler.h @@ -85,6 +85,13 @@ namespace Sapphire::Event QuestBattleDirector = 0x8006, }; + enum class EventState : uint8_t + { + Invisible, + Available, + Locked + }; + using SceneReturnCallback = std::function< void( Entity::Player&, const SceneResult& ) >; using SceneChainCallback = std::function< void( Entity::Player& ) >; using EventFinishCallback = std::function< void( Entity::Player&, uint64_t ) >; diff --git a/src/world/Manager/MapMgr.cpp b/src/world/Manager/MapMgr.cpp index f204020f..29ae7684 100644 --- a/src/world/Manager/MapMgr.cpp +++ b/src/world/Manager/MapMgr.cpp @@ -1,27 +1,27 @@ #include #include -#include #include #include #include -#include #include #include -#include #include #include -#include + +#include