From ed30225c194d09f2da9ee9e12f172e9a2c21ae77 Mon Sep 17 00:00:00 2001 From: Mordred Date: Sun, 4 Feb 2018 15:39:38 +0100 Subject: [PATCH 01/48] Npc spawn packet fixed --- .../Network/PacketDef/Zone/ServerZoneDef.h | 45 +++++++++---------- 1 file changed, 21 insertions(+), 24 deletions(-) diff --git a/src/common/Network/PacketDef/Zone/ServerZoneDef.h b/src/common/Network/PacketDef/Zone/ServerZoneDef.h index ead2d3cb..16ea8098 100644 --- a/src/common/Network/PacketDef/Zone/ServerZoneDef.h +++ b/src/common/Network/PacketDef/Zone/ServerZoneDef.h @@ -416,20 +416,21 @@ struct FFXIVIpcNpcSpawn : FFXIVIpcBasePacket { uint16_t title; uint16_t u1b; - uint16_t u2a; - uint16_t u2b; - - uint8_t pose; + uint8_t u2b; + uint8_t u2ab; + uint8_t gmRank; uint8_t u3b; + + uint8_t u3a; + uint8_t onlineStatus; uint8_t u3c; - uint8_t u3d; + uint8_t pose; uint32_t u4; uint64_t targetId; uint32_t u6; uint32_t u7; - uint64_t mainWeaponModel; uint64_t secWeaponModel; uint64_t craftToolModel; @@ -440,44 +441,40 @@ struct FFXIVIpcNpcSpawn : FFXIVIpcBasePacket uint32_t bNPCName; uint32_t u18; uint32_t u19; - uint32_t u20; - uint32_t u21; + uint32_t directorId; + uint32_t ownerId; uint32_t u22; - - uint32_t hPCurr; uint32_t hPMax; + uint32_t hPCurr; uint32_t displayFlags; uint16_t fateID; uint16_t mPCurr; uint16_t tPCurr; uint16_t mPMax; - - uint16_t unk21a; + uint16_t tPMax; uint16_t modelChara; uint16_t rotation; - uint16_t unk22b; + uint16_t activeMinion; uint8_t spawnIndex; - uint8_t state; // ActorState - uint8_t u24a; - uint8_t type; // 1 for player, 2 for NPC, else furniture; - uint8_t subtype; // 4 for players, 2 for pet, 3 for companion, 5 for mob, 7 for minion - uint8_t u25b; + uint8_t state; + uint8_t persistantEmote; + uint8_t type; + uint8_t subtype; + uint8_t voice; uint16_t u25c; - - uint8_t enemyType; // 0 for friendly, anything else is an enemy + uint8_t enemyType; uint8_t level; uint8_t classJob; uint8_t u26d; - uint16_t u27a; - uint8_t currentMount; uint8_t mountHead; uint8_t mountBody; uint8_t mountFeet; - uint16_t mountColor; - + uint8_t mountColor; + uint8_t scale; uint32_t u29b; + uint32_t u30b; Common::StatusEffect effect[30]; Common::FFXIVARR_POSITION3 pos; uint32_t models[10]; From 46ce423466bf71fc3b9e21bd51ad191f26d66ed5 Mon Sep 17 00:00:00 2001 From: Adam Date: Mon, 5 Feb 2018 01:55:10 +1100 Subject: [PATCH 02/48] cf spawns instances and zones you into them --- .../Network/Handlers/CFHandlers.cpp | 37 ++++++++++++++----- 1 file changed, 27 insertions(+), 10 deletions(-) diff --git a/src/servers/sapphire_zone/Network/Handlers/CFHandlers.cpp b/src/servers/sapphire_zone/Network/Handlers/CFHandlers.cpp index f9f6fb8d..62f4da87 100644 --- a/src/servers/sapphire_zone/Network/Handlers/CFHandlers.cpp +++ b/src/servers/sapphire_zone/Network/Handlers/CFHandlers.cpp @@ -14,8 +14,13 @@ #include "Actor/Player.h" #include "Forwards.h" +#include +#include "Zone/TerritoryMgr.h" +#include "Zone/Zone.h" extern Core::Logger g_log; +extern Core::Data::ExdDataGenerated g_exdDataGen; +extern Core::TerritoryMgr g_territoryMgr; using namespace Core::Common; using namespace Core::Network::Packets; @@ -46,24 +51,36 @@ void Core::Network::GameConnection::cfRegisterDuty( const Packets::GamePacket& i Entity::Player& player) { // TODO use for loop for this - auto contentId1 = inPacket.getValAt< uint16_t >( 46 ); - auto contentId2 = inPacket.getValAt< uint16_t >( 48 ); - auto contentId3 = inPacket.getValAt< uint16_t >( 50 ); - auto contentId4 = inPacket.getValAt< uint16_t >( 52 ); - auto contentId5 = inPacket.getValAt< uint16_t >( 54 ); + auto contentId1 = inPacket.getValAt< uint16_t >( 0x2E ); + auto contentId2 = inPacket.getValAt< uint16_t >( 0x30 ); + auto contentId3 = inPacket.getValAt< uint16_t >( 0x32 ); + auto contentId4 = inPacket.getValAt< uint16_t >( 0x34 ); + auto contentId5 = inPacket.getValAt< uint16_t >( 0x36 ); player.sendDebug("Duty register request"); - player.sendDebug("ContentId1" + std::to_string(contentId1)); - player.sendDebug("ContentId2" + std::to_string(contentId2)); - player.sendDebug("ContentId3" + std::to_string(contentId3)); - player.sendDebug("ContentId4" + std::to_string(contentId4)); - player.sendDebug("ContentId5" + std::to_string(contentId5)); + player.sendDebug("ContentId1: " + std::to_string(contentId1)); + player.sendDebug("ContentId2: " + std::to_string(contentId2)); + player.sendDebug("ContentId3: " + std::to_string(contentId3)); + player.sendDebug("ContentId4: " + std::to_string(contentId4)); + player.sendDebug("ContentId5: " + std::to_string(contentId5)); // let's cancel it because otherwise you can't register it again ZoneChannelPacket< FFXIVIpcCFNotify > cfCancelPacket( player.getId() ); cfCancelPacket.data().state1 = 3; cfCancelPacket.data().state2 = 1; // Your registration is withdrawn. queueOutPacket( cfCancelPacket ); + + auto cfCondition = g_exdDataGen.getContentFinderCondition( contentId1 ); + if( !cfCondition ) + return; + + auto instance = g_territoryMgr.createInstanceContent( cfCondition->instanceContent ); + if( !instance ) + return; + + player.sendDebug( "Created instance with id: " + std::to_string( instance->getGuId() ) ); + + player.setInstance( instance ); } void Core::Network::GameConnection::cfRegisterRoulette( const Packets::GamePacket& inPacket, From c36dec91d5b46da04669a607113746761958fa96 Mon Sep 17 00:00:00 2001 From: Mordred Date: Sun, 4 Feb 2018 17:46:46 +0100 Subject: [PATCH 03/48] Reconnecting during an instance now possible --- src/servers/sapphire_zone/Actor/Player.cpp | 11 ---- src/servers/sapphire_zone/Actor/PlayerSql.cpp | 50 ++++++++++++++----- .../sapphire_zone/Zone/TerritoryMgr.cpp | 33 ++++++------ src/servers/sapphire_zone/Zone/TerritoryMgr.h | 7 ++- 4 files changed, 57 insertions(+), 44 deletions(-) diff --git a/src/servers/sapphire_zone/Actor/Player.cpp b/src/servers/sapphire_zone/Actor/Player.cpp index 5319f4d3..0af3d7a5 100644 --- a/src/servers/sapphire_zone/Actor/Player.cpp +++ b/src/servers/sapphire_zone/Actor/Player.cpp @@ -356,17 +356,6 @@ void Core::Entity::Player::returnToHomepoint() void Core::Entity::Player::setZone( uint32_t zoneId ) { - if( !g_territoryMgr.movePlayer( zoneId, getAsPlayer() ) ) - { - // todo: this will require proper handling, for now just return the player to their previous area - m_pos = m_prevPos; - m_rot = m_prevRot; - m_zoneId = m_prevZoneId; - - if( !g_territoryMgr.movePlayer( m_zoneId, getAsPlayer() ) ) - return; - } - sendZonePackets(); } diff --git a/src/servers/sapphire_zone/Actor/PlayerSql.cpp b/src/servers/sapphire_zone/Actor/PlayerSql.cpp index fbf2f60c..22e13f54 100644 --- a/src/servers/sapphire_zone/Actor/PlayerSql.cpp +++ b/src/servers/sapphire_zone/Actor/PlayerSql.cpp @@ -60,7 +60,40 @@ bool Core::Entity::Player::load( uint32_t charId, SessionPtr pSession ) m_prevZoneId = res->getUInt( "OTerritoryId" ); m_prevZoneType = res->getUInt( "OTerritoryType" ); - ZonePtr pCurrZone = g_territoryMgr.getZoneByTerriId( zoneId ); + // Position + m_pos.x = res->getFloat( "PosX" ); + m_pos.y = res->getFloat( "PosY" ); + m_pos.z = res->getFloat( "PosZ" ); + setRotation( res->getFloat( "PosR" ) ); + + m_prevPos.x = res->getFloat( "OPosX" ); + m_prevPos.y = res->getFloat( "OPosY" ); + m_prevPos.z = res->getFloat( "OPosZ" ); + m_prevRot = res->getFloat( "OPosR" ); + + ZonePtr pCurrZone = nullptr; + + // if the zone is an instanceContent zone, we need to actually find the instance + if( g_territoryMgr.isInstanceContentTerritory( zoneId ) ) + { + // try to find an instance actually linked to this player + pCurrZone = g_territoryMgr.getLinkedInstance( m_id ); + // if none found, revert to previous zone and position + if( !pCurrZone ) + { + zoneId = m_prevZoneId; + m_pos.x = m_prevPos.x; + m_pos.y = m_prevPos.y; + m_pos.z = m_prevPos.z; + setRotation( m_prevRot ); + pCurrZone = g_territoryMgr.getZoneByTerriId( zoneId ); + } + } + else + { + pCurrZone = g_territoryMgr.getZoneByTerriId( zoneId ); + } + m_zoneId = zoneId; // TODO: logic for instances needs to be added here @@ -86,20 +119,8 @@ bool Core::Entity::Player::load( uint32_t charId, SessionPtr pSession ) m_mp = res->getUInt( "Mp" ); m_tp = 0; - // Position - - m_pos.x = res->getFloat( "PosX" ); - m_pos.y = res->getFloat( "PosY" ); - m_pos.z = res->getFloat( "PosZ" ); - setRotation( res->getFloat( "PosR" ) ); - - m_prevPos.x = res->getFloat( "OPosX" ); - m_prevPos.y = res->getFloat( "OPosY" ); - m_prevPos.z = res->getFloat( "OPosZ" ); - m_prevRot = res->getFloat( "OPosR" ); // Model - auto custom = res->getBlobVector( "Customize" ); memcpy( reinterpret_cast< char* >( m_customize ), custom.data(), custom.size() ); @@ -219,6 +240,9 @@ bool Core::Entity::Player::load( uint32_t charId, SessionPtr pSession ) if( !m_playerIdToSpawnIdMap.empty() ) m_playerIdToSpawnIdMap.clear(); + if( !g_territoryMgr.movePlayer( pCurrZone, getAsPlayer() ) ) + return false; + return true; } diff --git a/src/servers/sapphire_zone/Zone/TerritoryMgr.cpp b/src/servers/sapphire_zone/Zone/TerritoryMgr.cpp index eab7bddb..13421e94 100644 --- a/src/servers/sapphire_zone/Zone/TerritoryMgr.cpp +++ b/src/servers/sapphire_zone/Zone/TerritoryMgr.cpp @@ -302,25 +302,7 @@ Core::TerritoryMgr::InstanceIdList Core::TerritoryMgr::getInstanceContentIdList( bool Core::TerritoryMgr::movePlayer( uint32_t territoryId, Core::Entity::PlayerPtr pPlayer ) { auto pZone = getZoneByTerriId( territoryId ); - - if( !pZone ) - { - g_log.error( "Zone " + std::to_string( territoryId ) + " not found on this server." ); - return false; - } - - pPlayer->setTerritoryId( territoryId ); - - // mark character as zoning in progress - pPlayer->setLoadingComplete( false ); - - if( pPlayer->getLastPing() != 0 ) - pPlayer->getCurrentZone()->removeActor( pPlayer ); - - pPlayer->setCurrentZone( pZone ); - pZone->pushActor( pPlayer ); - - return true; + return movePlayer( pZone, pPlayer ); } bool Core::TerritoryMgr::movePlayer( ZonePtr pZone, Core::Entity::PlayerPtr pPlayer ) @@ -342,8 +324,21 @@ bool Core::TerritoryMgr::movePlayer( ZonePtr pZone, Core::Entity::PlayerPtr pPla pPlayer->setCurrentZone( pZone ); pZone->pushActor( pPlayer ); + // map player to instanceId so it can be tracked. + m_playerIdToInstanceMap[pPlayer->getId()] = pZone->getGuId(); + return true; } +Core::ZonePtr Core::TerritoryMgr::getLinkedInstance( uint32_t playerId ) const +{ + auto it = m_playerIdToInstanceMap.find( playerId ); + if( it != m_playerIdToInstanceMap.end() ) + { + return getInstanceZonePtr( it->second ); + } + return nullptr; +} + diff --git a/src/servers/sapphire_zone/Zone/TerritoryMgr.h b/src/servers/sapphire_zone/Zone/TerritoryMgr.h index 1984faca..b7cdcf3c 100644 --- a/src/servers/sapphire_zone/Zone/TerritoryMgr.h +++ b/src/servers/sapphire_zone/Zone/TerritoryMgr.h @@ -109,10 +109,12 @@ namespace Core TODO: Mind multiple instances?! */ ZonePtr getZoneByTerriId( uint32_t territoryId ) const; - bool movePlayer( uint32_t territoryId, Entity::PlayerPtr pPlayer ); bool movePlayer( ZonePtr, Entity::PlayerPtr pPlayer ); + /*! returns an instancePtr if the player is still bound to an isntance */ + ZonePtr getLinkedInstance( uint32_t playerId ) const; + private: using TerritoryTypeDetailCache = std::unordered_map< uint16_t, Data::TerritoryTypePtr >; using InstanceIdToZonePtrMap = std::unordered_map< uint32_t, ZonePtr >; @@ -137,6 +139,9 @@ namespace Core /*! map holding positions for zonelines */ PositionMap m_territoryPositionMap; + /*! map storing playerIds to instanceIds, used for instanceContent */ + PlayerIdToInstanceIdMap m_playerIdToInstanceMap; + /*! internal counter for instanceIds */ uint32_t m_lastInstanceId; From 48c4f681f11e3612086ae4ab9fd22de2b23cc9b3 Mon Sep 17 00:00:00 2001 From: Mordred Date: Sun, 4 Feb 2018 18:04:30 +0100 Subject: [PATCH 04/48] Added Director relevant types to actor control enum --- src/common/Common.h | 7 ++++++- 1 file changed, 6 insertions(+), 1 deletion(-) diff --git a/src/common/Common.h b/src/common/Common.h index 17b20358..7c998725 100644 --- a/src/common/Common.h +++ b/src/common/Common.h @@ -517,9 +517,14 @@ namespace Common { SetOwnerId = 0x59, ItemRepairMsg = 0x5C, + DirectorInit = 0x64, + DirectorClear = 0x65, + LeveStartAnim = 0x66, LeveStartError = 0x67, - PlayerNameGrayout = 0x6A, + DirectorEObjMod = 0x6A, + + DirectorUpdate = 0x6D, ItemObtainMsg = 0x75, DutyQuestScreenMsg = 0x7B, From 21a39a09eb45220528fa2bd169e89ee20b76a558 Mon Sep 17 00:00:00 2001 From: Mordred Date: Sun, 4 Feb 2018 18:53:19 +0100 Subject: [PATCH 05/48] Disabled betweenarea state flags until we fix it --- src/common/Common.h | 2 +- src/servers/sapphire_zone/Actor/Player.cpp | 15 +++++++++++++-- .../Network/Handlers/PacketHandlers.cpp | 2 +- src/servers/sapphire_zone/Zone/InstanceContent.h | 4 ++-- 4 files changed, 17 insertions(+), 6 deletions(-) diff --git a/src/common/Common.h b/src/common/Common.h index 7c998725..040a296d 100644 --- a/src/common/Common.h +++ b/src/common/Common.h @@ -523,7 +523,7 @@ namespace Common { LeveStartAnim = 0x66, LeveStartError = 0x67, DirectorEObjMod = 0x6A, - + DirectorUpdate = 0x6D, ItemObtainMsg = 0x75, diff --git a/src/servers/sapphire_zone/Actor/Player.cpp b/src/servers/sapphire_zone/Actor/Player.cpp index 0af3d7a5..2ef2eab3 100644 --- a/src/servers/sapphire_zone/Actor/Player.cpp +++ b/src/servers/sapphire_zone/Actor/Player.cpp @@ -356,6 +356,17 @@ void Core::Entity::Player::returnToHomepoint() void Core::Entity::Player::setZone( uint32_t zoneId ) { + if( !g_territoryMgr.movePlayer( zoneId, getAsPlayer() ) ) + { + // todo: this will require proper handling, for now just return the player to their previous area + m_pos = m_prevPos; + m_rot = m_prevRot; + m_zoneId = m_prevZoneId; + + if( !g_territoryMgr.movePlayer( m_zoneId, getAsPlayer() ) ) + return; + } + sendZonePackets(); } @@ -1570,8 +1581,8 @@ void Player::sendZonePackets() } // set flags, will be reset automatically by zoning ( only on client side though ) - setStateFlag( PlayerStateFlag::BetweenAreas ); - setStateFlag( PlayerStateFlag::BetweenAreas1 ); + //setStateFlag( PlayerStateFlag::BetweenAreas ); + //setStateFlag( PlayerStateFlag::BetweenAreas1 ); sendStats(); diff --git a/src/servers/sapphire_zone/Network/Handlers/PacketHandlers.cpp b/src/servers/sapphire_zone/Network/Handlers/PacketHandlers.cpp index 31495441..cedb239e 100644 --- a/src/servers/sapphire_zone/Network/Handlers/PacketHandlers.cpp +++ b/src/servers/sapphire_zone/Network/Handlers/PacketHandlers.cpp @@ -373,7 +373,7 @@ void Core::Network::GameConnection::initHandler( const Packets::GamePacket& inPa // init handler means this is a login procedure player.setIsLogin( true ); - player.setZone( player.getZoneId() ); + player.sendZonePackets(); } diff --git a/src/servers/sapphire_zone/Zone/InstanceContent.h b/src/servers/sapphire_zone/Zone/InstanceContent.h index da52f5e0..70c8ccd7 100644 --- a/src/servers/sapphire_zone/Zone/InstanceContent.h +++ b/src/servers/sapphire_zone/Zone/InstanceContent.h @@ -25,13 +25,13 @@ public: uint32_t instanceContentId ); virtual ~InstanceContent(); - boost::shared_ptr< Core::Data::InstanceContent > getInstanceContentInfo() const; + Core::Data::ExdDataGenerated::InstanceContentPtr getInstanceContentInfo() const; uint32_t getInstanceContentId() const; private: Event::DirectorPtr m_pDirector; - boost::shared_ptr< Core::Data::InstanceContent > m_instanceContentInfo; + Core::Data::ExdDataGenerated::InstanceContentPtr m_instanceContentInfo; uint32_t m_instanceContentId; InstanceContentState m_state; From 01ba6ad8586658b5eacef2efbf11423ada8b79b0 Mon Sep 17 00:00:00 2001 From: Tahir Akhlaq Date: Sun, 4 Feb 2018 20:09:55 +0000 Subject: [PATCH 06/48] added option to dump all level.exd entries for all instances in pcb_reader --- src/tools/pcb_reader/lgb.h | 36 ++++++++++------ src/tools/pcb_reader/main.cpp | 80 +++++++++++++++++++++++++++-------- 2 files changed, 85 insertions(+), 31 deletions(-) diff --git a/src/tools/pcb_reader/lgb.h b/src/tools/pcb_reader/lgb.h index 94fbfa20..e29d517c 100644 --- a/src/tools/pcb_reader/lgb.h +++ b/src/tools/pcb_reader/lgb.h @@ -70,23 +70,26 @@ struct LGB_ENTRY_HEADER vec3 scale; }; -class LGB_MODEL_ENTRY +class LGB_ENTRY { public: char* m_buf; uint32_t m_offset; + LGB_ENTRY_HEADER header; - LGB_MODEL_ENTRY() + LGB_ENTRY() { m_buf = nullptr; m_offset = 0; + memset( &header, 0, sizeof( header ) ); }; - LGB_MODEL_ENTRY( char* buf, uint32_t offset ) + LGB_ENTRY( char* buf, uint32_t offset ) { m_buf = buf; m_offset = offset; + header = *reinterpret_cast< LGB_ENTRY_HEADER* >( buf + offset ); }; - virtual ~LGB_MODEL_ENTRY() {}; + virtual ~LGB_ENTRY() {}; }; @@ -102,7 +105,7 @@ struct LGB_BGPARTS_HEADER : public LGB_ENTRY_HEADER uint32_t unknown9; }; -class LGB_BGPARTS_ENTRY : public LGB_MODEL_ENTRY +class LGB_BGPARTS_ENTRY : public LGB_ENTRY { public: LGB_BGPARTS_HEADER header; @@ -110,7 +113,7 @@ public: std::string modelFileName; std::string collisionFileName; LGB_BGPARTS_ENTRY() {}; - LGB_BGPARTS_ENTRY( char* buf, uint32_t offset ) + LGB_BGPARTS_ENTRY( char* buf, uint32_t offset ) : LGB_ENTRY( buf, offset ) { header = *reinterpret_cast( buf + offset ); name = std::string( buf + offset + header.nameOffset ); @@ -125,14 +128,14 @@ struct LGB_GIMMICK_HEADER : public LGB_ENTRY_HEADER char unknownBytes[100]; }; -class LGB_GIMMICK_ENTRY : public LGB_MODEL_ENTRY +class LGB_GIMMICK_ENTRY : public LGB_ENTRY { public: LGB_GIMMICK_HEADER header; std::string name; std::string gimmickFileName; - LGB_GIMMICK_ENTRY( char* buf, uint32_t offset ) + LGB_GIMMICK_ENTRY( char* buf, uint32_t offset ) : LGB_ENTRY( buf, offset ) { header = *reinterpret_cast( buf + offset ); name = std::string( buf + offset + header.nameOffset ); @@ -147,13 +150,13 @@ struct LGB_ENPC_HEADER : public LGB_ENTRY_HEADER uint8_t unknown1[0x24]; }; -class LGB_ENPC_ENTRY : public LGB_MODEL_ENTRY +class LGB_ENPC_ENTRY : public LGB_ENTRY { public: LGB_ENPC_HEADER header; std::string name; - LGB_ENPC_ENTRY( char* buf, uint32_t offset ) + LGB_ENPC_ENTRY( char* buf, uint32_t offset ) : LGB_ENTRY( buf, offset ) { header = *reinterpret_cast< LGB_ENPC_HEADER* >( buf + offset ); name = std::string( buf + offset + header.nameOffset ); @@ -167,13 +170,13 @@ struct LGB_EOBJ_HEADER : public LGB_ENTRY_HEADER uint8_t unknown1[0x10]; }; -class LGB_EOBJ_ENTRY : public LGB_MODEL_ENTRY +class LGB_EOBJ_ENTRY : public LGB_ENTRY { public: LGB_EOBJ_HEADER header; std::string name; - LGB_EOBJ_ENTRY( char* buf, uint32_t offset ) + LGB_EOBJ_ENTRY( char* buf, uint32_t offset ) : LGB_ENTRY( buf, offset ) { header = *reinterpret_cast< LGB_EOBJ_HEADER* >( buf + offset ); //std::cout << "\t " << header.eobjId << " " << name << " unknown: " << header.unknown << "\n"; @@ -203,7 +206,7 @@ struct LGB_GROUP LGB_FILE* parent; LGB_GROUP_HEADER header; std::string name; - std::vector< std::shared_ptr< LGB_MODEL_ENTRY > > entries; + std::vector< std::shared_ptr< LGB_ENTRY > > entries; LGB_GROUP( char* buf, LGB_FILE* parentStruct, uint32_t offset ) { @@ -236,12 +239,17 @@ struct LGB_GROUP { entries.push_back( std::make_shared< LGB_EOBJ_ENTRY >( buf, entryOffset ) ); } + else if( type == LgbEntryType::MapRange ) + { + entries.push_back( std::make_shared< LGB_EOBJ_ENTRY >( buf, entryOffset ) ); + } /* else { - //entries[i] = nullptr; + entries[i] = nullptr; } */ + } catch( std::exception& e ) { diff --git a/src/tools/pcb_reader/main.cpp b/src/tools/pcb_reader/main.cpp index 2a5d5c61..fb9b5326 100644 --- a/src/tools/pcb_reader/main.cpp +++ b/src/tools/pcb_reader/main.cpp @@ -23,6 +23,8 @@ std::string gamePath("C:\\Program Files (x86)\\SquareEnix\\FINAL FANTASY XIV - A Realm Reborn\\game\\sqpack\\ffxiv"); std::unordered_map< uint32_t, std::string > eobjNameMap; +std::unordered_map< uint16_t, std::string > zoneNameMap; + xiv::dat::GameData* data1 = nullptr; xiv::exd::ExdData* eData = nullptr; @@ -103,8 +105,8 @@ int parseBlockEntry( char* data, std::vector& entries, int gOff void dumpLevelExdEntries( uint32_t zoneId, const std::string& name = std::string() ) { - auto& cat = eData->get_category( "Level" ); - auto exd = static_cast< xiv::exd::Exd >( cat.get_data_ln( xiv::exd::Language::none ) ); + static auto& cat = eData->get_category( "Level" ); + static auto exd = static_cast< xiv::exd::Exd >( cat.get_data_ln( xiv::exd::Language::none ) ); std::string fileName( name + "_" + std::to_string( zoneId ) + "_Level" + ".csv" ); std::ofstream outfile( fileName, std::ios::trunc ); @@ -113,8 +115,8 @@ void dumpLevelExdEntries( uint32_t zoneId, const std::string& name = std::string { outfile.close(); outfile.open( fileName, std::ios::app ); - - for( auto& row : exd.get_rows() ) + static auto rows = exd.get_rows(); + for( auto& row : rows ) { auto id = row.first; auto& fields = row.second; @@ -144,6 +146,8 @@ std::string zoneNameToPath( const std::string& name ) { std::string path; uint32_t id; + bool found = false; + #ifdef STANDALONE auto inFile = std::ifstream( "territorytype.exh.csv" ); if( inFile.good() ) @@ -153,22 +157,22 @@ std::string zoneNameToPath( const std::string& name ) while( std::getline( inFile, line ) ) { std::smatch match; - if( std::regex_match( line, match, re ) ) + if( std::regex_match( line, match, re ) { - if( name == match[2].str() ) + if( !found && name == match[2].str() ) { id = match[1].str(); path = match[3].str(); - break; + found = true; } + zoneNameMap[std::stoul( match[1].str() )] = match[2].str(); } } inFile.close(); } #else - xiv::dat::GameData dat( gamePath ); - xiv::exd::ExdData eData( dat ); - auto& cat = eData.get_category( "TerritoryType" ); + + auto& cat = eData->get_category( "TerritoryType" ); auto exd = static_cast< xiv::exd::Exd >( cat.get_data_ln( xiv::exd::Language::none ) ); for( auto& row : exd.get_rows() ) { @@ -177,16 +181,17 @@ std::string zoneNameToPath( const std::string& name ) if( teriName.empty() ) continue; auto teriPath = *boost::get< std::string >( &fields.at( static_cast< size_t >( TerritoryTypeExdIndexes::Path ) ) ); - id = row.first; - if( boost::iequals( name, teriName ) ) + if( !found && boost::iequals( name, teriName ) ) { path = teriPath; - break; + found = true; + id = row.first; } + zoneNameMap[row.first] = teriName; } #endif - if( !path.empty() ) + if( found ) { //path = path.substr( path.find_first_of( "/" ) + 1, path.size() - path.find_first_of( "/" )); //path = std::string( "ffxiv/" ) + path; @@ -217,13 +222,43 @@ void loadEobjNames() void writeEobjEntry( std::ofstream& out, LGB_EOBJ_ENTRY* pEobj, const std::string& name ) { + static std::string mapRangeStr( "\"MapRange\", " ); + static std::string eobjStr( "\"EObj\", " ); + std::string outStr( - std::to_string( pEobj->header.eobjId ) + ", \"" + name + "\", " + + std::to_string( pEobj->header.eobjId ) + ", \"" + name + "\", " + std::string( pEobj->header.type == LgbEntryType::MapRange ? mapRangeStr : eobjStr ) + std::to_string( pEobj->header.translation.x ) + ", " + std::to_string( pEobj->header.translation.y ) + ", " + std::to_string( pEobj->header.translation.z ) + "\n" ); out.write( outStr.c_str(), outStr.size() ); } +void dumpAllInstanceContentEntries() +{ + + auto& catInstance = eData->get_category( "InstanceContent" ); + auto exdInstance = static_cast< xiv::exd::Exd >( catInstance.get_data_ln( xiv::exd::Language::en ) ); + + if( zoneNameMap.size() == 0 ) + { + zoneNameToPath( "f1d1" ); + } + + for( auto& row : exdInstance.get_rows() ) + { + auto id = row.first; + auto& fields = row.second; + + auto name = *boost::get< std::string >( &fields.at( 3 ) ); + if( name.empty() ) + continue; + auto teri = *boost::get< uint32_t >( &fields.at( 7 ) ); + auto i = 0; + while( ( i = name.find( ' ' ) ) != std::string::npos ) + name = name.replace( name.begin() + i, name.begin() + i + 1, { '_' } ); + dumpLevelExdEntries( teri, name ); + } +} + void readFileToBuffer( const std::string& path, std::vector< char >& buf ) { auto inFile = std::ifstream( path, std::ios::binary ); @@ -286,13 +321,15 @@ int main( int argc, char* argv[] ) readFileToBuffer( listPcbPath, section1 ); } #endif + if( argc > 3 && argv[3] == "--instanceDump" ) + dumpAllInstanceContentEntries(); std::vector< std::string > stringList; uint32_t offset1 = 0x20; loadEobjNames(); - std::string eobjFileName( zoneName + "eobj.csv" ); + std::string eobjFileName( zoneName + "_eobj.csv" ); std::ofstream eobjOut( eobjFileName, std::ios::trunc ); if( !eobjOut.good() ) throw std::string( "Unable to create " + zoneName + "_eobj.csv for eobj entries. Run as admin or check there isnt already a handle on the file." ).c_str(); @@ -300,6 +337,9 @@ int main( int argc, char* argv[] ) eobjOut.close(); eobjOut.open( eobjFileName, std::ios::app ); + if( !eobjOut.good() ) + throw std::string( "Unable to create " + zoneName + "_eobj.csv for eobj entries. Run as admin or check there isnt already a handle on the file." ).c_str(); + for( ; ; ) { @@ -351,7 +391,7 @@ int main( int argc, char* argv[] ) { if( fileName.find( '.' ) == std::string::npos ) return false; - else if( fileName.substr(fileName.find_last_of('.')) != ".pcb" ) + else if( fileName.substr( fileName.find_last_of( '.' ) ) != ".pcb" ) throw std::runtime_error( "Not a PCB file." ); char* dataSection = nullptr; @@ -591,6 +631,12 @@ int main( int argc, char* argv[] ) } } + if( pEntry->header.type == LgbEntryType::EventObject || pEntry->header.type == LgbEntryType::EventNpc || + pEntry->header.type == LgbEntryType::MapRange ) + { + std::cout << "HEADER SHIT " << std::to_string( ( int )pEntry->header.type ) << "\n"; + } + if( pEventObj ) { fileName = pEventObj->name.empty() ? eobjNameMap[pEventObj->header.eobjId] : pEventObj->name; From 7a75b40ce67fae521a6d15e2557bb8a06766ca22 Mon Sep 17 00:00:00 2001 From: Mordred Date: Sun, 4 Feb 2018 23:35:16 +0100 Subject: [PATCH 07/48] Added events to zone for inheritance handling --- .../sapphire_zone/Action/ActionCollision.cpp | 4 +- src/servers/sapphire_zone/Actor/Actor.cpp | 8 +++- src/servers/sapphire_zone/Actor/Actor.h | 2 +- src/servers/sapphire_zone/Actor/Player.cpp | 1 - .../sapphire_zone/Zone/InstanceContent.cpp | 29 ++++++++++++- .../sapphire_zone/Zone/InstanceContent.h | 4 ++ .../sapphire_zone/Zone/TerritoryMgr.cpp | 4 +- src/servers/sapphire_zone/Zone/Zone.cpp | 43 ++++++++++++++----- src/servers/sapphire_zone/Zone/Zone.h | 8 ++-- 9 files changed, 81 insertions(+), 22 deletions(-) diff --git a/src/servers/sapphire_zone/Action/ActionCollision.cpp b/src/servers/sapphire_zone/Action/ActionCollision.cpp index f2d0b68f..3ec83c9a 100644 --- a/src/servers/sapphire_zone/Action/ActionCollision.cpp +++ b/src/servers/sapphire_zone/Action/ActionCollision.cpp @@ -32,7 +32,7 @@ bool ActionCollision::isActorApplicable( ActorPtr actorPtr, TargetFilter targetF case TargetFilter::Allies: { // todo: implement ally NPCs - actorApplicable = !actorPtr->isMob(); + actorApplicable = !actorPtr->isBNpc(); break; } case TargetFilter::Party: @@ -43,7 +43,7 @@ bool ActionCollision::isActorApplicable( ActorPtr actorPtr, TargetFilter targetF } case TargetFilter::Enemies: { - actorApplicable = actorPtr->isMob(); + actorApplicable = actorPtr->isBNpc(); break; } } diff --git a/src/servers/sapphire_zone/Actor/Actor.cpp b/src/servers/sapphire_zone/Actor/Actor.cpp index 3342a6e0..9e981dac 100644 --- a/src/servers/sapphire_zone/Actor/Actor.cpp +++ b/src/servers/sapphire_zone/Actor/Actor.cpp @@ -68,7 +68,7 @@ bool Core::Entity::Actor::isPlayer() const } /*! \return true if the actor is of type mob */ -bool Core::Entity::Actor::isMob() const +bool Core::Entity::Actor::isBNpc() const { return m_objKind == ObjKind::BattleNpc; } @@ -416,18 +416,24 @@ void Core::Entity::Actor::sendStatusUpdate( bool toSelf ) /*! \return pointer to this instance as PlayerPtr */ Core::Entity::PlayerPtr Core::Entity::Actor::getAsPlayer() { + if( !isPlayer() ) + return nullptr; return boost::dynamic_pointer_cast< Entity::Player, Entity::Actor >( shared_from_this() ); } /*! \return pointer to this instance as BattleNpcPtr */ Core::Entity::BattleNpcPtr Core::Entity::Actor::getAsBattleNpc() { + if( !isBNpc() ) + return nullptr; return boost::reinterpret_pointer_cast< Entity::BattleNpc, Entity::Actor >( shared_from_this() ); } /*! \return pointer to this instance as EventNpcPtr */ Core::Entity::EventNpcPtr Core::Entity::Actor::getAsEventNpc() { + if( !isEventNpc() ) + return nullptr; return boost::reinterpret_pointer_cast< Entity::EventNpc, Entity::Actor >( shared_from_this() ); } diff --git a/src/servers/sapphire_zone/Actor/Actor.h b/src/servers/sapphire_zone/Actor/Actor.h index 08ff963b..d6dada1f 100644 --- a/src/servers/sapphire_zone/Actor/Actor.h +++ b/src/servers/sapphire_zone/Actor/Actor.h @@ -215,7 +215,7 @@ public: bool isPlayer() const; - bool isMob() const; + bool isBNpc() const; bool isEventNpc() const; diff --git a/src/servers/sapphire_zone/Actor/Player.cpp b/src/servers/sapphire_zone/Actor/Player.cpp index 2ef2eab3..00a9c840 100644 --- a/src/servers/sapphire_zone/Actor/Player.cpp +++ b/src/servers/sapphire_zone/Actor/Player.cpp @@ -90,7 +90,6 @@ Core::Entity::Player::Player() : Core::Entity::Player::~Player() { - g_log.debug( "PlayerObj destroyed" ); } // TODO: add a proper calculation based on race / job / level / gear diff --git a/src/servers/sapphire_zone/Zone/InstanceContent.cpp b/src/servers/sapphire_zone/Zone/InstanceContent.cpp index 0512eecb..23eae2db 100644 --- a/src/servers/sapphire_zone/Zone/InstanceContent.cpp +++ b/src/servers/sapphire_zone/Zone/InstanceContent.cpp @@ -1,5 +1,13 @@ #include "InstanceContent.h" +#include +#include +#include + +#include "Actor/Player.h" + +extern Core::Logger g_log; + Core::InstanceContent::InstanceContent( boost::shared_ptr< Core::Data::InstanceContent > pInstanceContent, uint32_t guId, const std::string& internalName, @@ -23,7 +31,26 @@ uint32_t Core::InstanceContent::getInstanceContentId() const return m_instanceContentId; } -boost::shared_ptr< Core::Data::InstanceContent > Core::InstanceContent::getInstanceContentInfo() const +Core::Data::ExdDataGenerated::InstanceContentPtr Core::InstanceContent::getInstanceContentInfo() const { return m_instanceContentInfo; } + +void Core::InstanceContent::onEnterTerritory( Entity::PlayerPtr pPlayer ) +{ + g_log.debug( "InstanceContent::onEnterTerritory: Zone#" + std::to_string( getGuId() ) + "|" + + std::to_string( getInstanceContentId() ) + + + ", Entity#" + std::to_string( pPlayer->getId() ) ); +} + +void Core::InstanceContent::onLeaveTerritory( Entity::PlayerPtr pPlayer ) +{ + g_log.debug( "InstanceContent::onLeaveTerritory: Zone#" + std::to_string( getGuId() ) + "|" + + std::to_string( getInstanceContentId() ) + + + ", Entity#" + std::to_string( pPlayer->getId() ) ); +} + +void Core::InstanceContent::onUpdate( uint32_t currTime ) +{ + +} diff --git a/src/servers/sapphire_zone/Zone/InstanceContent.h b/src/servers/sapphire_zone/Zone/InstanceContent.h index 70c8ccd7..504b5a72 100644 --- a/src/servers/sapphire_zone/Zone/InstanceContent.h +++ b/src/servers/sapphire_zone/Zone/InstanceContent.h @@ -25,6 +25,10 @@ public: uint32_t instanceContentId ); virtual ~InstanceContent(); + void onEnterTerritory( Entity::PlayerPtr pPlayer ) override; + void onLeaveTerritory( Entity::PlayerPtr pPlayer ) override; + void onUpdate( uint32_t currTime ) override; + Core::Data::ExdDataGenerated::InstanceContentPtr getInstanceContentInfo() const; uint32_t getInstanceContentId() const; diff --git a/src/servers/sapphire_zone/Zone/TerritoryMgr.cpp b/src/servers/sapphire_zone/Zone/TerritoryMgr.cpp index 13421e94..2f7bbd81 100644 --- a/src/servers/sapphire_zone/Zone/TerritoryMgr.cpp +++ b/src/servers/sapphire_zone/Zone/TerritoryMgr.cpp @@ -275,12 +275,12 @@ void Core::TerritoryMgr::updateTerritoryInstances( uint32_t currentTime ) { for( auto& zone : m_zoneSet ) { - zone->runZoneLogic( currentTime ); + zone->update( currentTime ); } for( auto& zone : m_instanceZoneSet ) { - zone->runZoneLogic( currentTime ); + zone->update( currentTime ); } } diff --git a/src/servers/sapphire_zone/Zone/Zone.cpp b/src/servers/sapphire_zone/Zone/Zone.cpp index 4a4c8642..72e66d9c 100644 --- a/src/servers/sapphire_zone/Zone/Zone.cpp +++ b/src/servers/sapphire_zone/Zone/Zone.cpp @@ -304,7 +304,6 @@ void Zone::pushActor( Entity::ActorPtr pActor ) if( pActor->isPlayer() ) { - g_log.debug( "[Zone:" + m_internalName + "] Adding player [" + std::to_string( pActor->getId() ) + "]" ); auto pPlayer = pActor->getAsPlayer(); auto pSession = g_serverZone.getSession( pPlayer->getId() ); @@ -313,8 +312,10 @@ void Zone::pushActor( Entity::ActorPtr pActor ) m_playerMap[pPlayer->getId()] = pPlayer; updateCellActivity( cx, cy, 2 ); + onEnterTerritory( pPlayer ); + } - else if( pActor->isMob() ) + else if( pActor->isBNpc() ) { Entity::BattleNpcPtr pBNpc = pActor->getAsBattleNpc(); @@ -329,6 +330,7 @@ void Zone::pushActor( Entity::ActorPtr pActor ) pENpc->setPosition( pENpc->getPos() ); } + } void Zone::removeActor( Entity::ActorPtr pActor ) @@ -343,7 +345,6 @@ void Zone::removeActor( Entity::ActorPtr pActor ) if( pActor->isPlayer() ) { - g_log.debug( "[Zone:" + m_internalName + "] Removing player [" + std::to_string( pActor->getId() ) + "]" ); // If it's a player and he's inside boundaries - update his nearby cells if( pActor->getPos().x <= _maxX && pActor->getPos().x >= _minX && pActor->getPos().z <= _maxY && pActor->getPos().z >= _minY ) @@ -354,8 +355,10 @@ void Zone::removeActor( Entity::ActorPtr pActor ) } m_playerMap.erase( pActor->getId() ); + onLeaveTerritory( pActor->getAsPlayer() ); + } - else if( pActor->isMob() ) + else if( pActor->isBNpc() ) m_BattleNpcMap.erase( pActor->getId() ); // remove from lists of other actors @@ -502,7 +505,7 @@ void Zone::updateBnpcs( int64_t tickCount ) } } -bool Zone::runZoneLogic( uint32_t currTime ) +bool Zone::update( uint32_t currTime ) { int64_t tickCount = Util::getTimeMs(); @@ -523,12 +526,11 @@ bool Zone::runZoneLogic( uint32_t currTime ) } // this session is not linked to this area anymore, remove it from zone session list - if( ( !pSession->getPlayer()->getCurrentZone() ) || ( pSession->getPlayer()->getCurrentZone() != shared_from_this() ) ) + if( ( !pSession->getPlayer()->getCurrentZone() ) + || ( pSession->getPlayer()->getCurrentZone() != shared_from_this() ) ) { - g_log.debug( "[Zone:" + m_internalName + "] removing session " + std::to_string( pSession->getId() ) ); - - if( pSession->getPlayer()->getCell() ) - removeActor( pSession->getPlayer() ); + // if( pSession->getPlayer()->getCell() ) + // removeActor( pSession->getPlayer() ); it = m_sessionSet.erase( it ); continue; @@ -550,6 +552,8 @@ bool Zone::runZoneLogic( uint32_t currTime ) updateBnpcs( tickCount ); + onUpdate( currTime ); + return true; } @@ -792,7 +796,7 @@ void Zone::updateInRangeSet( Entity::ActorPtr pActor, Cell* pCell ) } } - else if( ( pActor->isMob() || pActor->isEventNpc() ) && pCurAct->isPlayer() && pActor->isAlive() ) + else if( ( pActor->isBNpc() || pActor->isEventNpc() ) && pCurAct->isPlayer() && pActor->isAlive() ) { auto pPlayer = pCurAct->getAsPlayer(); if( pPlayer->isLoadingComplete() ) @@ -811,4 +815,21 @@ void Zone::updateInRangeSet( Entity::ActorPtr pActor, Cell* pCell ) } } +void Zone::onEnterTerritory( Entity::PlayerPtr pPlayer ) +{ + g_log.debug( "Zone::onEnterTerritory: Zone#" + std::to_string( getGuId() ) + "|" + std::to_string( getTerritoryId() ) + + + ", Entity#" + std::to_string( pPlayer->getId() ) ); +} + +void Zone::onLeaveTerritory( Entity::PlayerPtr pPlayer ) +{ + g_log.debug( "Zone::onLeaveTerritory: Zone#" + std::to_string( getGuId() ) + "|" + std::to_string( getTerritoryId() ) + + + ", Entity#" + std::to_string( pPlayer->getId() ) ); +} + +void Zone::onUpdate( uint32_t currTime ) +{ + +} + } diff --git a/src/servers/sapphire_zone/Zone/Zone.h b/src/servers/sapphire_zone/Zone/Zone.h index e9dd22ca..ee2e3b89 100644 --- a/src/servers/sapphire_zone/Zone/Zone.h +++ b/src/servers/sapphire_zone/Zone/Zone.h @@ -79,6 +79,10 @@ public: CellCache* getCellCacheAndCreate( uint32_t cellx, uint32_t celly ); virtual void loadCellCache(); + virtual uint32_t getTerritoryId(); + virtual void onEnterTerritory( Entity::PlayerPtr pPlayer ); + virtual void onLeaveTerritory( Entity::PlayerPtr pPlayer ); + virtual void onUpdate( uint32_t currTime ); uint8_t getNextWeather(); @@ -96,8 +100,6 @@ public: void queueOutPacketForRange( Entity::Player& sourcePlayer, uint32_t range, Network::Packets::GamePacketPtr pPacketEntry ); - virtual uint32_t getTerritoryId(); - Common::RegionType getType() const; uint16_t getGuId() const; @@ -112,7 +114,7 @@ public: bool checkWeather(); void updateBnpcs( int64_t tickCount ); - bool runZoneLogic( uint32_t currTime ); + bool update( uint32_t currTime ); }; From 38448f6ddd9437560df688d1f5a1135cfff30f4c Mon Sep 17 00:00:00 2001 From: Tahir Akhlaq Date: Sun, 4 Feb 2018 22:19:08 +0000 Subject: [PATCH 08/48] fixed eobj export, added option to dump all instanced zones --- src/tools/pcb_reader/lgb.h | 39 +++++++++-- src/tools/pcb_reader/main.cpp | 126 ++++++++++++++++++++++++---------- src/tools/pcb_reader/sgb.h | 5 +- 3 files changed, 127 insertions(+), 43 deletions(-) diff --git a/src/tools/pcb_reader/lgb.h b/src/tools/pcb_reader/lgb.h index e29d517c..7a9b7bdc 100644 --- a/src/tools/pcb_reader/lgb.h +++ b/src/tools/pcb_reader/lgb.h @@ -13,6 +13,9 @@ #include "vec3.h" #include "sgb.h" +// garbage to skip model loading +extern bool ignoreModels; + // all credit to // https://github.com/ufx/SaintCoinach/blob/master/SaintCoinach/Graphics/Lgb/ // this is simply their work ported to c++ since we dont c# @@ -89,6 +92,10 @@ public: m_offset = offset; header = *reinterpret_cast< LGB_ENTRY_HEADER* >( buf + offset ); }; + const LgbEntryType getType() const + { + return header.type; + }; virtual ~LGB_ENTRY() {}; }; @@ -184,6 +191,26 @@ public: }; }; +struct LGB_MAPRANGE_HEADER : public LGB_ENTRY_HEADER +{ + uint32_t type; + uint32_t unknown2; + uint8_t unknown3[0x10]; +}; + +struct LGB_MAPRANGE_ENTRY : public LGB_ENTRY +{ +public: + LGB_MAPRANGE_HEADER header; + std::string name; + + LGB_MAPRANGE_ENTRY( char* buf, uint32_t offset ) : LGB_ENTRY( buf, offset ) + { + header = *reinterpret_cast< LGB_MAPRANGE_HEADER* >( buf + offset ); + name = std::string( buf + offset + header.nameOffset ); + }; +}; + struct LGB_GROUP_HEADER { uint32_t unknown; @@ -223,11 +250,12 @@ struct LGB_GROUP try { const auto type = *reinterpret_cast( buf + entryOffset ); - if( type == LgbEntryType::BgParts ) + // garbage to skip model loading + if( !ignoreModels && type == LgbEntryType::BgParts ) { entries.push_back( std::make_shared< LGB_BGPARTS_ENTRY >( buf, entryOffset ) ); } - else if( type == LgbEntryType::Gimmick ) + else if( !ignoreModels && type == LgbEntryType::Gimmick ) { entries.push_back( std::make_shared< LGB_GIMMICK_ENTRY >( buf, entryOffset ) ); } @@ -241,7 +269,7 @@ struct LGB_GROUP } else if( type == LgbEntryType::MapRange ) { - entries.push_back( std::make_shared< LGB_EOBJ_ENTRY >( buf, entryOffset ) ); + entries.push_back( std::make_shared< LGB_MAPRANGE_ENTRY >( buf, entryOffset ) ); } /* else @@ -249,7 +277,7 @@ struct LGB_GROUP entries[i] = nullptr; } */ - + } catch( std::exception& e ) { @@ -276,8 +304,9 @@ struct LGB_FILE { LGB_FILE_HEADER header; std::vector< LGB_GROUP > groups; + std::string name; - LGB_FILE( char* buf ) + LGB_FILE( char* buf, const std::string& name ) { header = *reinterpret_cast< LGB_FILE_HEADER* >( buf ); if( strncmp( &header.magic[0], "LGB1", 4 ) != 0 || strncmp( &header.magic2[0], "LGP1", 4 ) != 0 ) diff --git a/src/tools/pcb_reader/main.cpp b/src/tools/pcb_reader/main.cpp index fb9b5326..c6704856 100644 --- a/src/tools/pcb_reader/main.cpp +++ b/src/tools/pcb_reader/main.cpp @@ -6,6 +6,8 @@ #include #include #include +#include +#include #include "pcb.h" #include "lgb.h" @@ -21,9 +23,15 @@ #include #endif -std::string gamePath("C:\\Program Files (x86)\\SquareEnix\\FINAL FANTASY XIV - A Realm Reborn\\game\\sqpack\\ffxiv"); +// garbage to ignore models +bool ignoreModels = false; + +std::string gamePath( "C:\\Program Files (x86)\\SquareEnix\\FINAL FANTASY XIV - A Realm Reborn\\game\\sqpack\\ffxiv" ); std::unordered_map< uint32_t, std::string > eobjNameMap; std::unordered_map< uint16_t, std::string > zoneNameMap; +uint32_t zoneId; + +std::set< std::string > zoneDumpList; xiv::dat::GameData* data1 = nullptr; xiv::exd::ExdData* eData = nullptr; @@ -145,7 +153,6 @@ void dumpLevelExdEntries( uint32_t zoneId, const std::string& name = std::string std::string zoneNameToPath( const std::string& name ) { std::string path; - uint32_t id; bool found = false; #ifdef STANDALONE @@ -159,13 +166,14 @@ std::string zoneNameToPath( const std::string& name ) std::smatch match; if( std::regex_match( line, match, re ) { + auto tmpId = std::stoul( match[1].str() ); if( !found && name == match[2].str() ) { - id = match[1].str(); + zoneId = tmpId; path = match[3].str(); found = true; } - zoneNameMap[std::stoul( match[1].str() )] = match[2].str(); + zoneNameMap[tmpId] = match[2].str(); } } inFile.close(); @@ -185,7 +193,7 @@ std::string zoneNameToPath( const std::string& name ) { path = teriPath; found = true; - id = row.first; + zoneId = row.first; } zoneNameMap[row.first] = teriName; } @@ -203,7 +211,7 @@ std::string zoneNameToPath( const std::string& name ) throw std::runtime_error( "Unable to find path for " + name + ".\n\tPlease double check spelling or open 0a0000.win32.index with FFXIV Explorer and extract territorytype.exh as CSV\n\tand copy territorytype.exh.csv into pcb_reader.exe directory if using standalone" ); } - dumpLevelExdEntries( id, name ); + return path; } @@ -220,21 +228,38 @@ void loadEobjNames() } } -void writeEobjEntry( std::ofstream& out, LGB_EOBJ_ENTRY* pEobj, const std::string& name ) +void writeEobjEntry( std::ofstream& out, LGB_ENTRY* pObj ) { static std::string mapRangeStr( "\"MapRange\", " ); static std::string eobjStr( "\"EObj\", " ); + uint32_t id; + std::string name; + std::string typeStr; + + if( pObj->getType() == LgbEntryType::EventObject ) + { + auto pEobj = reinterpret_cast< LGB_EOBJ_ENTRY* >( pObj ); + id = pEobj->header.eobjId; + name = eobjNameMap[id]; + typeStr = eobjStr; + } + else if( pObj->getType() == LgbEntryType::MapRange ) + { + auto pMapRange = reinterpret_cast< LGB_MAPRANGE_ENTRY* >( pObj ); + id = pMapRange->header.unknown; + typeStr = mapRangeStr; + } + std::string outStr( - std::to_string( pEobj->header.eobjId ) + ", \"" + name + "\", " + std::string( pEobj->header.type == LgbEntryType::MapRange ? mapRangeStr : eobjStr ) + - std::to_string( pEobj->header.translation.x ) + ", " + std::to_string( pEobj->header.translation.y ) + ", " + std::to_string( pEobj->header.translation.z ) + "\n" + std::to_string( id ) + ", " + typeStr + "\"" + name + "\", " + + std::to_string( pObj->header.translation.x ) + ", " + std::to_string( pObj->header.translation.y ) + ", " + std::to_string( pObj->header.translation.z ) + "\n" ); out.write( outStr.c_str(), outStr.size() ); } -void dumpAllInstanceContentEntries() +void loadAllInstanceContentEntries() { - auto& catInstance = eData->get_category( "InstanceContent" ); auto exdInstance = static_cast< xiv::exd::Exd >( catInstance.get_data_ln( xiv::exd::Language::en ) ); @@ -255,7 +280,7 @@ void dumpAllInstanceContentEntries() auto i = 0; while( ( i = name.find( ' ' ) ) != std::string::npos ) name = name.replace( name.begin() + i, name.begin() + i + 1, { '_' } ); - dumpLevelExdEntries( teri, name ); + zoneDumpList.emplace( zoneNameMap[teri] ); } } @@ -280,22 +305,47 @@ void readFileToBuffer( const std::string& path, std::vector< char >& buf ) int main( int argc, char* argv[] ) { auto startTime = std::chrono::system_clock::now(); + auto entryStartTime = std::chrono::system_clock::now(); + std::vector< std::string > argVec( argv + 1, argv + argc ); // todo: support expansions std::string zoneName = "r1f1"; + bool dumpInstances = ignoreModels = std::remove_if( argVec.begin(), argVec.end(), []( auto arg ){ return arg == "--instance-dump"; } ) != argVec.end(); + if( argc > 1 ) { zoneName = argv[1]; if( argc > 2 ) { - gamePath = argv[2]; + std::string tmpPath( argv[2] ); + if( !( tmpPath.empty() || tmpPath.find( '/' ) == std::string::npos ) ) + gamePath = argv[2]; } } initExd( gamePath ); + if( dumpInstances ) + { + loadAllInstanceContentEntries(); + } + else + { + zoneDumpList.emplace( zoneName ); + } + +LABEL_DUMP: + entryStartTime = std::chrono::system_clock::now(); + zoneName = *zoneDumpList.begin(); try { const auto& zonePath = zoneNameToPath( zoneName ); + + if( zonePath.find( "ex1/" ) != std::string::npos || zonePath.find( "ex2" ) != std::string::npos ) + { + std::cout << "[Error] Expansions are currently not supported " << zonePath << "\n"; + goto LABEL_NEXT_ZONE_ENTRY; + } + std::string listPcbPath( zonePath + "/collision/list.pcb" ); std::string bgLgbPath( zonePath + "/level/bg.lgb" ); std::string planmapLgbPath( zonePath + "/level/planmap.lgb" ); @@ -321,14 +371,13 @@ int main( int argc, char* argv[] ) readFileToBuffer( listPcbPath, section1 ); } #endif - if( argc > 3 && argv[3] == "--instanceDump" ) - dumpAllInstanceContentEntries(); std::vector< std::string > stringList; uint32_t offset1 = 0x20; loadEobjNames(); + dumpLevelExdEntries( zoneId, zoneName ); std::string eobjFileName( zoneName + "_eobj.csv" ); std::ofstream eobjOut( eobjFileName, std::ios::trunc ); if( !eobjOut.good() ) @@ -357,20 +406,20 @@ int main( int argc, char* argv[] ) } } - LGB_FILE bgLgb( §ion[0] ); - LGB_FILE planmapLgb( §ion2[0] ); + LGB_FILE bgLgb( §ion[0], "bg" ); + LGB_FILE planmapLgb( §ion2[0], "planmap" ); std::vector< LGB_FILE > lgbList { bgLgb, planmapLgb }; uint32_t max_index = 0; // dont bother if we cant write to a file - auto fp_out = fopen( ( zoneName + ".obj" ).c_str(), "w" ); + auto fp_out = ignoreModels ? ( FILE* )nullptr : fopen( ( zoneName + ".obj" ).c_str(), "w" ); if( fp_out ) { fprintf( fp_out, "\n" ); fclose( fp_out ); } - else + else if( !ignoreModels ) { std::string errorMessage( "Cannot create " + zoneName + ".obj\n" + " Check no programs have a handle to file and run as admin.\n" ); @@ -379,14 +428,15 @@ int main( int argc, char* argv[] ) return 0; } - fp_out = fopen( ( zoneName + ".obj" ).c_str(), "ab+" ); - if( fp_out ) + if( ignoreModels || ( fp_out = fopen( ( zoneName + ".obj" ).c_str(), "ab+" ) ) ) { std::map< std::string, PCB_FILE > pcbFiles; std::map< std::string, SGB_FILE > sgbFiles; std::map< std::string, uint32_t > objCount; auto loadPcbFile = [&]( const std::string& fileName ) -> bool { + if( ignoreModels ) + return false; try { if( fileName.find( '.' ) == std::string::npos ) @@ -474,6 +524,8 @@ int main( int argc, char* argv[] ) const vec3* translation = nullptr, const SGB_MODEL_ENTRY* pSgbEntry = nullptr) { + if( ignoreModels ) + return; char name2[0x100]; memset( name2, 0, 0x100 ); sprintf( &name2[0], "%s_%u", &name[0], objCount[name]++ ); @@ -556,14 +608,14 @@ int main( int argc, char* argv[] ) loadPcbFile( fileName ); pushVerts( pcbFiles[fileName], fileName ); } - std::cout << "[Info] " << "Writing obj file " << "\n"; - std::cout << "[Info] " << bgLgb.groups.size() << " groups " << "\n"; + + std::cout << "[Info] " << ( ignoreModels ? "Dumping MapRange and EObj" : "Writing obj file " ) << "\n"; uint32_t totalGroups = 0; uint32_t totalGroupEntries = 0; for( const auto& lgb : lgbList ) { - for( const auto& group : bgLgb.groups ) + for( const auto& group : lgb.groups ) { //std::cout << "\t" << group.name << " Size " << group.header.entryCount << "\n"; totalGroups++; @@ -571,7 +623,6 @@ int main( int argc, char* argv[] ) { auto pGimmick = dynamic_cast< LGB_GIMMICK_ENTRY* >( pEntry.get() ); auto pBgParts = dynamic_cast< LGB_BGPARTS_ENTRY* >( pEntry.get() ); - auto pEventObj = dynamic_cast< LGB_EOBJ_ENTRY* >( pEntry.get() ); std::string fileName( "" ); fileName.resize( 256 ); @@ -631,26 +682,19 @@ int main( int argc, char* argv[] ) } } - if( pEntry->header.type == LgbEntryType::EventObject || pEntry->header.type == LgbEntryType::EventNpc || - pEntry->header.type == LgbEntryType::MapRange ) + if( pEntry->getType() == LgbEntryType::EventObject || pEntry->getType() == LgbEntryType::MapRange ) { - std::cout << "HEADER SHIT " << std::to_string( ( int )pEntry->header.type ) << "\n"; - } - - if( pEventObj ) - { - fileName = pEventObj->name.empty() ? eobjNameMap[pEventObj->header.eobjId] : pEventObj->name; - writeEobjEntry( eobjOut, pEventObj, fileName ); + writeEobjEntry( eobjOut, pEntry.get() ); //writeOutput( fileName, &pEventObj->header.scale, &pEventObj->header.rotation, &pEventObj->header.translation ); } } } } - std::cout << "\n[Info] " << "Loaded " << pcbFiles.size() << " PCB Files \n"; + std::cout << "[Info] " << "Loaded " << pcbFiles.size() << " PCB Files \n"; std::cout << "[Info] " << "Total Groups " << totalGroups << " Total entries " << totalGroupEntries << "\n"; } - std::cout << "[Success] " << "Finished exporting " << zoneName << " in " << - std::chrono::duration_cast< std::chrono::seconds >( std::chrono::system_clock::now() - startTime ).count() << " seconds\n"; + std::cout << "[Success] " << "Exported " << zoneName << " in " << + std::chrono::duration_cast< std::chrono::seconds >( std::chrono::system_clock::now() - entryStartTime ).count() << " seconds\n"; } catch( std::exception& e ) { @@ -659,6 +703,14 @@ int main( int argc, char* argv[] ) std::cout << std::endl; std::cout << "[Info] " << "Usage: pcb_reader2 territory \"path/to/game/sqpack/ffxiv\" " << std::endl; } + std::cout << "\n\n\n"; + LABEL_NEXT_ZONE_ENTRY: + zoneDumpList.erase( zoneName ); + if( !zoneDumpList.empty() ) + goto LABEL_DUMP; + + std::cout << "\n\n\n[Success] Finished all tasks in " << + std::chrono::duration_cast< std::chrono::seconds >( std::chrono::system_clock::now() - startTime ).count() << " seconds\n"; if( eData ) delete eData; diff --git a/src/tools/pcb_reader/sgb.h b/src/tools/pcb_reader/sgb.h index edd6899a..2aa675aa 100644 --- a/src/tools/pcb_reader/sgb.h +++ b/src/tools/pcb_reader/sgb.h @@ -11,6 +11,9 @@ #include "vec3.h" +// garbage to skip model loading +extern bool ignoreModels; + // // ported from https://github.com/ufx/SaintCoinach/blob/master/SaintCoinach/Graphics/Sgb/SgbDataType.cs @@ -132,7 +135,7 @@ struct SGB_GROUP if( entryOffset > fileSize ) throw std::runtime_error( "SGB_GROUP entry offset was larger than SGB file size!" ); auto type = *reinterpret_cast< uint32_t* >( buf + entryOffset ); - if( type == SgbGroupEntryType::Model ) + if( type == SgbGroupEntryType::Model && !ignoreModels ) { entries.push_back( std::make_shared< SGB_MODEL_ENTRY >( buf, entryOffset ) ); } From 9b1940d0a55557319177314740e656e00bf481fd Mon Sep 17 00:00:00 2001 From: Mordred Date: Sun, 4 Feb 2018 23:58:45 +0100 Subject: [PATCH 09/48] Call onEnter event after zone init packet have been sent --- src/servers/sapphire_zone/Actor/Player.cpp | 2 ++ src/servers/sapphire_zone/Zone/Zone.cpp | 3 --- 2 files changed, 2 insertions(+), 3 deletions(-) diff --git a/src/servers/sapphire_zone/Actor/Player.cpp b/src/servers/sapphire_zone/Actor/Player.cpp index 00a9c840..1cddcf49 100644 --- a/src/servers/sapphire_zone/Actor/Player.cpp +++ b/src/servers/sapphire_zone/Actor/Player.cpp @@ -1633,5 +1633,7 @@ void Player::sendZonePackets() if( getLastPing() == 0 ) sendQuestInfo(); + getCurrentZone()->onEnterTerritory( getAsPlayer() ); + m_bMarkedForZoning = false; } diff --git a/src/servers/sapphire_zone/Zone/Zone.cpp b/src/servers/sapphire_zone/Zone/Zone.cpp index 72e66d9c..249af19f 100644 --- a/src/servers/sapphire_zone/Zone/Zone.cpp +++ b/src/servers/sapphire_zone/Zone/Zone.cpp @@ -311,9 +311,6 @@ void Zone::pushActor( Entity::ActorPtr pActor ) m_sessionSet.insert( pSession ); m_playerMap[pPlayer->getId()] = pPlayer; updateCellActivity( cx, cy, 2 ); - - onEnterTerritory( pPlayer ); - } else if( pActor->isBNpc() ) { From 78606873aebca50bb2d5419624e3069b0591b76c Mon Sep 17 00:00:00 2001 From: Mordred Date: Tue, 6 Feb 2018 00:01:23 +0100 Subject: [PATCH 10/48] Basic director handling for instances, just the bare minimum so far --- src/common/Common.h | 6 --- src/common/Network/PacketDef/Ipcs.h | 2 +- src/servers/sapphire_zone/Event/Director.cpp | 20 +++++++ src/servers/sapphire_zone/Event/Director.h | 15 +++--- .../Network/Handlers/ActionHandler.cpp | 5 ++ .../sapphire_zone/Zone/InstanceContent.cpp | 29 +++++++++- .../sapphire_zone/Zone/InstanceContent.h | 6 ++- src/servers/sapphire_zone/Zone/Zone.cpp | 54 +++++++++---------- src/servers/sapphire_zone/Zone/Zone.h | 17 ++---- 9 files changed, 95 insertions(+), 59 deletions(-) diff --git a/src/common/Common.h b/src/common/Common.h index 040a296d..15fb9800 100644 --- a/src/common/Common.h +++ b/src/common/Common.h @@ -156,12 +156,6 @@ namespace Common { uint32_t sourceActorId; }; - enum RegionType : uint8_t - { - normal, - instance, - }; - enum CharaLook : uint8_t { Race = 0x00, diff --git a/src/common/Network/PacketDef/Ipcs.h b/src/common/Network/PacketDef/Ipcs.h index c505904a..69e49cfe 100644 --- a/src/common/Network/PacketDef/Ipcs.h +++ b/src/common/Network/PacketDef/Ipcs.h @@ -150,7 +150,7 @@ namespace Packets { EquipDisplayFlags = 0x01FA, // updated 4.2 - CFAvailableContents = 0x01CF, + CFAvailableContents = 0x01FD, // updated 4.2 PrepareZoning = 0x027C, // updated 4.2 ActorGauge = 0x027D, // updated 4.2 diff --git a/src/servers/sapphire_zone/Event/Director.cpp b/src/servers/sapphire_zone/Event/Director.cpp index 79e7142b..f479e502 100644 --- a/src/servers/sapphire_zone/Event/Director.cpp +++ b/src/servers/sapphire_zone/Event/Director.cpp @@ -1 +1,21 @@ #include "Director.h" + +Core::Event::Director::Director( Core::Event::Director::DirectorType type, uint16_t contentId ) : + m_contentId( contentId ), + m_type( type ), + m_directorId( ( static_cast< uint32_t >( type ) << 16 ) | contentId ), + m_sequence( 0 ), + m_branch( 0 ) +{ + +} + +uint32_t Core::Event::Director::getDirectorId() const +{ + return m_directorId; +} + +uint16_t Core::Event::Director::getContentId() const +{ + return m_contentId; +} diff --git a/src/servers/sapphire_zone/Event/Director.h b/src/servers/sapphire_zone/Event/Director.h index 8a3c0245..c570acb6 100644 --- a/src/servers/sapphire_zone/Event/Director.h +++ b/src/servers/sapphire_zone/Event/Director.h @@ -30,9 +30,17 @@ public: DpsChallange = 0x800D }; + Director( DirectorType type, uint16_t contentId ); + + uint32_t getDirectorId() const; + uint16_t getContentId() const; + DirectorType getType() const; + uint8_t getSequence() const; + uint8_t getBranch() const; + private: /*! Id of the content of the director */ - uint16_t m_id; + uint16_t m_contentId; /*! DirectorType | ContentId */ uint32_t m_directorId; @@ -49,11 +57,6 @@ private: /*! type of the director */ DirectorType m_type; - uint32_t getDirectorId() const; - uint16_t getContentId() const; - DirectorType getType() const; - uint8_t getSequence() const; - uint8_t getBranch() const; }; diff --git a/src/servers/sapphire_zone/Network/Handlers/ActionHandler.cpp b/src/servers/sapphire_zone/Network/Handlers/ActionHandler.cpp index c8bbc0f9..7bbfa403 100644 --- a/src/servers/sapphire_zone/Network/Handlers/ActionHandler.cpp +++ b/src/servers/sapphire_zone/Network/Handlers/ActionHandler.cpp @@ -229,6 +229,11 @@ void Core::Network::GameConnection::actionHandler( const Packets::GamePacket& in { break; } + case 0x321: // Director init finish + { + player.getCurrentZone()->onInitDirector( player.getAsPlayer() ); + break; + } default: { g_log.debug( "[" + std::to_string( m_pSession->getId() ) + "] Unhandled action: " + diff --git a/src/servers/sapphire_zone/Zone/InstanceContent.cpp b/src/servers/sapphire_zone/Zone/InstanceContent.cpp index 23eae2db..e6b9a7e2 100644 --- a/src/servers/sapphire_zone/Zone/InstanceContent.cpp +++ b/src/servers/sapphire_zone/Zone/InstanceContent.cpp @@ -1,24 +1,33 @@ #include "InstanceContent.h" +#include #include #include #include +#include #include "Actor/Player.h" +#include "Network/PacketWrappers/ActorControlPacket142.h" +#include "Network/PacketWrappers/ActorControlPacket143.h" + extern Core::Logger g_log; +using namespace Core::Common; +using namespace Core::Network::Packets; +using namespace Core::Network::Packets::Server; + Core::InstanceContent::InstanceContent( boost::shared_ptr< Core::Data::InstanceContent > pInstanceContent, uint32_t guId, const std::string& internalName, const std::string& contentName, uint32_t instanceContentId ) - : Zone( pInstanceContent->territoryType, guId, internalName, contentName ), + : Zone( static_cast< uint16_t >( pInstanceContent->territoryType ), guId, internalName, contentName ), + Director( Event::Director::InstanceContent, instanceContentId ), m_instanceContentInfo( pInstanceContent ), m_instanceContentId( instanceContentId ), m_state( Created ) { - } Core::InstanceContent::~InstanceContent() @@ -41,6 +50,10 @@ void Core::InstanceContent::onEnterTerritory( Entity::PlayerPtr pPlayer ) g_log.debug( "InstanceContent::onEnterTerritory: Zone#" + std::to_string( getGuId() ) + "|" + std::to_string( getInstanceContentId() ) + + ", Entity#" + std::to_string( pPlayer->getId() ) ); + + pPlayer->queuePacket(ActorControlPacket143( pPlayer->getId(), DirectorInit, getDirectorId(), + getInstanceContentId() ) ); + pPlayer->setStateFlag( PlayerStateFlag::BoundByDuty ); } void Core::InstanceContent::onLeaveTerritory( Entity::PlayerPtr pPlayer ) @@ -48,9 +61,21 @@ void Core::InstanceContent::onLeaveTerritory( Entity::PlayerPtr pPlayer ) g_log.debug( "InstanceContent::onLeaveTerritory: Zone#" + std::to_string( getGuId() ) + "|" + std::to_string( getInstanceContentId() ) + + ", Entity#" + std::to_string( pPlayer->getId() ) ); + pPlayer->queuePacket(ActorControlPacket143( pPlayer->getId(), DirectorClear, getDirectorId() ) ); + pPlayer->unsetStateFlag( PlayerStateFlag::BoundByDuty ); } void Core::InstanceContent::onUpdate( uint32_t currTime ) { } + +void Core::InstanceContent::onFinishLoading( Entity::PlayerPtr pPlayer ) +{ + +} + +void Core::InstanceContent::onInitDirector( Entity::PlayerPtr pPlayer ) +{ + +} diff --git a/src/servers/sapphire_zone/Zone/InstanceContent.h b/src/servers/sapphire_zone/Zone/InstanceContent.h index 504b5a72..1c1705e6 100644 --- a/src/servers/sapphire_zone/Zone/InstanceContent.h +++ b/src/servers/sapphire_zone/Zone/InstanceContent.h @@ -2,13 +2,14 @@ #define SAPPHIRE_INSTANCECONTENT_H #include "Zone.h" +#include "Event/Director.h" #include "Forwards.h" #include namespace Core { -class InstanceContent : public Zone +class InstanceContent : public Zone, Event::Director { public: enum InstanceContentState @@ -27,8 +28,11 @@ public: void onEnterTerritory( Entity::PlayerPtr pPlayer ) override; void onLeaveTerritory( Entity::PlayerPtr pPlayer ) override; + void onFinishLoading( Entity::PlayerPtr pPlayer ) override; + void onInitDirector( Entity::PlayerPtr pPlayer ) override; void onUpdate( uint32_t currTime ) override; + Core::Data::ExdDataGenerated::InstanceContentPtr getInstanceContentInfo() const; uint32_t getInstanceContentId() const; diff --git a/src/servers/sapphire_zone/Zone/Zone.cpp b/src/servers/sapphire_zone/Zone/Zone.cpp index 249af19f..bb79c84c 100644 --- a/src/servers/sapphire_zone/Zone/Zone.cpp +++ b/src/servers/sapphire_zone/Zone/Zone.cpp @@ -41,20 +41,18 @@ namespace Core { /** * \brief */ -Zone::Zone() - : m_territoryId( 0 ) - , m_guId( 0 ) - , m_type( Common::RegionType::normal ) - , m_currentWeather( static_cast< uint8_t >( Common::Weather::FairSkies ) ) - , m_weatherOverride( 0 ) - , m_lastMobUpdate( 0 ) - , m_currentFestivalId( 0 ) +Zone::Zone() : + m_territoryId( 0 ), + m_guId( 0 ), + m_currentWeather( static_cast< uint8_t >( Common::Weather::FairSkies ) ), + m_weatherOverride( 0 ), + m_lastMobUpdate( 0 ), + m_currentFestivalId( 0 ) { } -Zone::Zone( uint16_t territoryId, uint32_t guId, const std::string& internalName, const std::string& placeName ) - : m_type( Common::RegionType::normal ) - , m_currentWeather( static_cast< uint8_t >( Common::Weather::FairSkies ) ) +Zone::Zone( uint16_t territoryId, uint32_t guId, const std::string& internalName, const std::string& placeName ) : + m_currentWeather( static_cast< uint8_t >( Common::Weather::FairSkies ) ) { m_guId = guId; @@ -104,11 +102,6 @@ bool Zone::init() return true; } -bool Zone::isPrivateZone() const -{ - return m_bPrivate; -} - void Zone::setWeatherOverride( uint8_t weather ) { m_weatherOverride = weather; @@ -179,7 +172,7 @@ void Zone::loadCellCache() "Look," "Models," "type " - "FROM battlenpc WHERE ZoneId = " + std::to_string(getTerritoryId() ) + ";" ); + "FROM battlenpc WHERE ZoneId = " + std::to_string( getTerritoryId() ) + ";" ); std::vector< Entity::BattleNpcPtr > cache; @@ -395,26 +388,16 @@ void Zone::queueOutPacketForRange( Entity::Player& sourcePlayer, uint32_t range, } } -uint32_t Zone::getTerritoryId() +uint32_t Zone::getTerritoryId() const { return m_territoryId; } -Common::RegionType Zone::getType() const -{ - return m_type; -} - -uint16_t Zone::getGuId() const +uint32_t Zone::getGuId() const { return m_guId; } -bool Zone::isInstance() const -{ - return m_type == Common::RegionType::instance; -} - const std::string& Zone::getName() const { return m_placeName; @@ -774,8 +757,9 @@ void Zone::updateInRangeSet( Entity::ActorPtr pActor, Cell* pCell ) if( !pOwnPlayer->isLoadingComplete() ) continue; + // this is a hack to limit actor spawn in one packetset count++; - if( count > 15 ) + if( count > 12 ) break; pActor->addInRangeActor( pCurAct ); @@ -829,4 +813,14 @@ void Zone::onUpdate( uint32_t currTime ) } +void Zone::onFinishLoading( Entity::PlayerPtr pPlayer ) +{ + +} + +void Zone::onInitDirector( Entity::PlayerPtr pPlayer ) +{ + +} + } diff --git a/src/servers/sapphire_zone/Zone/Zone.h b/src/servers/sapphire_zone/Zone/Zone.h index ee2e3b89..1310a5bc 100644 --- a/src/servers/sapphire_zone/Zone/Zone.h +++ b/src/servers/sapphire_zone/Zone/Zone.h @@ -32,8 +32,6 @@ protected: std::string m_placeName; std::string m_internalName; - bool m_bPrivate; - std::unordered_map< int32_t, Entity::PlayerPtr > m_playerMap; std::unordered_map< int32_t, Entity::BattleNpcPtr > m_BattleNpcMap; std::unordered_map< int32_t, Entity::EventNpcPtr > m_EventNpcMap; @@ -44,8 +42,6 @@ protected: CellCache** m_pCellCache[_sizeX]; - Common::RegionType m_type; - uint8_t m_currentWeather; uint8_t m_weatherOverride; @@ -64,8 +60,6 @@ public: bool init(); - bool isPrivateZone() const; - /*! overrides the zone's weather, set to 0 to unlock */ void setWeatherOverride( uint8_t weather ); @@ -79,8 +73,10 @@ public: CellCache* getCellCacheAndCreate( uint32_t cellx, uint32_t celly ); virtual void loadCellCache(); - virtual uint32_t getTerritoryId(); + virtual uint32_t getTerritoryId() const; virtual void onEnterTerritory( Entity::PlayerPtr pPlayer ); + virtual void onFinishLoading( Entity::PlayerPtr pPlayer ); + virtual void onInitDirector( Entity::PlayerPtr pPlayer ); virtual void onLeaveTerritory( Entity::PlayerPtr pPlayer ); virtual void onUpdate( uint32_t currTime ); @@ -100,14 +96,9 @@ public: void queueOutPacketForRange( Entity::Player& sourcePlayer, uint32_t range, Network::Packets::GamePacketPtr pPacketEntry ); - Common::RegionType getType() const; - - uint16_t getGuId() const; - - bool isInstance() const; + uint32_t getGuId() const; const std::string& getName() const; - const std::string& getInternalName() const; std::size_t getPopCount() const; From c5692bbe05e329e6be65400a3af38221c5ac5c92 Mon Sep 17 00:00:00 2001 From: Mordred Date: Tue, 6 Feb 2018 00:03:08 +0100 Subject: [PATCH 11/48] Style fix --- src/servers/sapphire_zone/Zone/InstanceContent.cpp | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/src/servers/sapphire_zone/Zone/InstanceContent.cpp b/src/servers/sapphire_zone/Zone/InstanceContent.cpp index e6b9a7e2..be9af4e4 100644 --- a/src/servers/sapphire_zone/Zone/InstanceContent.cpp +++ b/src/servers/sapphire_zone/Zone/InstanceContent.cpp @@ -51,7 +51,7 @@ void Core::InstanceContent::onEnterTerritory( Entity::PlayerPtr pPlayer ) + std::to_string( getInstanceContentId() ) + + ", Entity#" + std::to_string( pPlayer->getId() ) ); - pPlayer->queuePacket(ActorControlPacket143( pPlayer->getId(), DirectorInit, getDirectorId(), + pPlayer->queuePacket( ActorControlPacket143( pPlayer->getId(), DirectorInit, getDirectorId(), getInstanceContentId() ) ); pPlayer->setStateFlag( PlayerStateFlag::BoundByDuty ); } @@ -61,7 +61,7 @@ void Core::InstanceContent::onLeaveTerritory( Entity::PlayerPtr pPlayer ) g_log.debug( "InstanceContent::onLeaveTerritory: Zone#" + std::to_string( getGuId() ) + "|" + std::to_string( getInstanceContentId() ) + + ", Entity#" + std::to_string( pPlayer->getId() ) ); - pPlayer->queuePacket(ActorControlPacket143( pPlayer->getId(), DirectorClear, getDirectorId() ) ); + pPlayer->queuePacket( ActorControlPacket143( pPlayer->getId(), DirectorClear, getDirectorId() ) ); pPlayer->unsetStateFlag( PlayerStateFlag::BoundByDuty ); } From 4e1c82c2be86577f96eae1aada104e3c71502432 Mon Sep 17 00:00:00 2001 From: Mordred Date: Wed, 7 Feb 2018 00:00:48 +0100 Subject: [PATCH 12/48] More preparational director logic, state inside can be modified with !instance --- src/common/Network/PacketDef/Ipcs.h | 2 + .../Network/PacketDef/Zone/ServerZoneDef.h | 17 ++ src/servers/sapphire_zone/Actor/Player.cpp | 13 +- src/servers/sapphire_zone/Actor/Player.h | 5 + .../DebugCommand/DebugCommandHandler.cpp | 15 ++ src/servers/sapphire_zone/Event/Director.cpp | 155 +++++++++++++++++- src/servers/sapphire_zone/Event/Director.h | 95 ++++++++++- .../Network/Handlers/PacketHandlers.cpp | 2 + .../sapphire_zone/Zone/InstanceContent.cpp | 140 +++++++++++++++- .../sapphire_zone/Zone/InstanceContent.h | 5 +- 10 files changed, 436 insertions(+), 13 deletions(-) diff --git a/src/common/Network/PacketDef/Ipcs.h b/src/common/Network/PacketDef/Ipcs.h index 69e49cfe..037818ca 100644 --- a/src/common/Network/PacketDef/Ipcs.h +++ b/src/common/Network/PacketDef/Ipcs.h @@ -142,6 +142,8 @@ namespace Packets { Mount = 0x01CD, // updated 4.2 + DirectorVars = 0x01CF, // updated 4.2 + WeatherChange = 0x01EA, // updated 4.2 PlayerTitleList = 0x01EB, // updated 4.2 Discovery = 0x01EC, // updated 4.2 diff --git a/src/common/Network/PacketDef/Zone/ServerZoneDef.h b/src/common/Network/PacketDef/Zone/ServerZoneDef.h index 16ea8098..29bf329a 100644 --- a/src/common/Network/PacketDef/Zone/ServerZoneDef.h +++ b/src/common/Network/PacketDef/Zone/ServerZoneDef.h @@ -1273,6 +1273,23 @@ struct FFXIVIpcMount : FFXIVIpcBasePacket uint32_t id; }; +/** +* Structural representation of the packet sent by the server +* to mount a player +*/ +struct FFXIVIpcDirectorVars : FFXIVIpcBasePacket +{ + /*! DirectorType | ContentId */ + uint32_t m_directorId; + /*! currect sequence */ + uint8_t m_sequence; + /*! current branch */ + uint8_t m_branch; + /*! raw storage for flags/vars */ + uint8_t m_unionData[10]; +}; + + struct FFXIVIpcActorGauge : FFXIVIpcBasePacket { uint8_t classJobId; diff --git a/src/servers/sapphire_zone/Actor/Player.cpp b/src/servers/sapphire_zone/Actor/Player.cpp index 1cddcf49..058623f0 100644 --- a/src/servers/sapphire_zone/Actor/Player.cpp +++ b/src/servers/sapphire_zone/Actor/Player.cpp @@ -70,7 +70,8 @@ Core::Entity::Player::Player() : m_zoningType( Common::ZoneingType::None ), m_bAutoattack( false ), m_markedForRemoval( false ), - m_mount( 0 ) + m_mount( 0 ), + m_directorInitialized( false ) { m_id = 0; m_objKind = ObjKind::Player; @@ -1637,3 +1638,13 @@ void Player::sendZonePackets() m_bMarkedForZoning = false; } + +void Player::setDirectorInitialized( bool isInitialized ) +{ + m_directorInitialized = isInitialized; +} + +bool Player::isDirectorInitialized() const +{ + return m_directorInitialized; +} diff --git a/src/servers/sapphire_zone/Actor/Player.h b/src/servers/sapphire_zone/Actor/Player.h index 8cfe770a..5f917994 100644 --- a/src/servers/sapphire_zone/Actor/Player.h +++ b/src/servers/sapphire_zone/Actor/Player.h @@ -499,6 +499,9 @@ public: void sendUrgent( const std::string& message ); void sendDebug( const std::string& message ); + bool isDirectorInitialized() const; + void setDirectorInitialized( bool isInitialized ); + // Player Battle Handling ////////////////////////////////////////////////////////////////////////////////////////////////////// void onMobAggro( BattleNpcPtr pBNpc ); @@ -566,6 +569,8 @@ private: bool m_markedForRemoval; + bool m_directorInitialized; + private: Common::FFXIVARR_POSITION3 m_prevPos; diff --git a/src/servers/sapphire_zone/DebugCommand/DebugCommandHandler.cpp b/src/servers/sapphire_zone/DebugCommand/DebugCommandHandler.cpp index 121c9a25..76de7471 100644 --- a/src/servers/sapphire_zone/DebugCommand/DebugCommandHandler.cpp +++ b/src/servers/sapphire_zone/DebugCommand/DebugCommandHandler.cpp @@ -26,6 +26,7 @@ #include "Actor/EventNpc.h" #include "Zone/Zone.h" +#include "Zone/InstanceContent.h" #include "ServerZone.h" @@ -753,6 +754,20 @@ void Core::DebugCommandHandler::instance( char* data, Entity::Player &player, bo { player.exitInstance(); } + else if( subCommand == "set" ) + { + uint32_t instanceId; + uint32_t index; + uint32_t value; + sscanf( params.c_str(), "%d %d %d", &instanceId, &index, &value ); + + auto pInstance = g_territoryMgr.getInstanceZonePtr( instanceId ); + if( !pInstance ) + return; + auto instance = boost::dynamic_pointer_cast< InstanceContent >( pInstance ); + + instance->setVar( static_cast< uint8_t >( index ), static_cast< uint8_t >( value ) ); + } else if( subCommand == "festival" ) { uint32_t festivalId; diff --git a/src/servers/sapphire_zone/Event/Director.cpp b/src/servers/sapphire_zone/Event/Director.cpp index f479e502..fb9444ac 100644 --- a/src/servers/sapphire_zone/Event/Director.cpp +++ b/src/servers/sapphire_zone/Event/Director.cpp @@ -1,13 +1,27 @@ #include "Director.h" +#include +#include + +#include "Actor/Player.h" + +#include "Network/PacketWrappers/ActorControlPacket142.h" +#include "Network/PacketWrappers/ActorControlPacket143.h" + + +using namespace Core::Common; +using namespace Core::Network::Packets; +using namespace Core::Network::Packets::Server; + Core::Event::Director::Director( Core::Event::Director::DirectorType type, uint16_t contentId ) : m_contentId( contentId ), m_type( type ), m_directorId( ( static_cast< uint32_t >( type ) << 16 ) | contentId ), - m_sequence( 0 ), - m_branch( 0 ) + m_sequence( 1 ), + m_branch( 0 ), + m_elapsedTime( 0 ) { - + memset( m_unionData.arrData, 0, sizeof( m_unionData ) ); } uint32_t Core::Event::Director::getDirectorId() const @@ -19,3 +33,138 @@ uint16_t Core::Event::Director::getContentId() const { return m_contentId; } + +uint8_t Core::Event::Director::getSequence() const +{ + return m_sequence; +} + +void Core::Event::Director::sendDirectorClear( Core::Entity::PlayerPtr pPlayer ) const +{ + pPlayer->queuePacket( ActorControlPacket143( pPlayer->getId(), DirectorClear, m_directorId ) ); +} + +void Core::Event::Director::sendDirectorVars( Core::Entity::PlayerPtr pPlayer ) const +{ + ZoneChannelPacket< FFXIVIpcDirectorVars > varPacket( pPlayer->getId() ); + varPacket.data().m_directorId = getDirectorId(); + varPacket.data().m_sequence = getSequence(); + varPacket.data().m_branch = 0; + memcpy( varPacket.data().m_unionData, m_unionData.arrData, sizeof( varPacket.data().m_unionData ) ); + pPlayer->queuePacket( varPacket ); +} + +void Core::Event::Director::sendDirectorInit( Core::Entity::PlayerPtr pPlayer ) const +{ + pPlayer->queuePacket( ActorControlPacket143( pPlayer->getId(), DirectorInit, m_directorId, m_contentId ) ); +} + +Core::Event::Director::DirectorType Core::Event::Director::getType() const +{ + return m_type; +} + +uint8_t Core::Event::Director::getBranch() const +{ + return m_branch; +} + +void Core::Event::Director::setDirectorUI8AL( uint8_t value ) +{ + m_unionData.ui8lh.UI8AL = value; +} + +void Core::Event::Director::setDirectorUI8AH( uint8_t value ) +{ + m_unionData.ui8lh.UI8AH = value; +} + +void Core::Event::Director::setDirectorUI8BL( uint8_t value ) +{ + m_unionData.ui8lh.UI8BL = value; +} + +void Core::Event::Director::setDirectorUI8BH( uint8_t value ) +{ + m_unionData.ui8lh.UI8BH = value; +} + +void Core::Event::Director::setDirectorUI8CL( uint8_t value ) +{ + m_unionData.ui8lh.UI8CL = value; +} + +void Core::Event::Director::setDirectorUI8CH( uint8_t value ) +{ + m_unionData.ui8lh.UI8CH = value; +} + +void Core::Event::Director::setDirectorUI8DL( uint8_t value ) +{ + m_unionData.ui8lh.UI8DL = value; +} + +void Core::Event::Director::setDirectorUI8DH( uint8_t value ) +{ + m_unionData.ui8lh.UI8DH = value; +} + +void Core::Event::Director::setDirectorUI8EL( uint8_t value ) +{ + m_unionData.ui8lh.UI8EL = value; +} + +void Core::Event::Director::setDirectorUI8EH( uint8_t value ) +{ + m_unionData.ui8lh.UI8EH = value; +} + +void Core::Event::Director::setDirectorUI8FL( uint8_t value ) +{ + m_unionData.ui8lh.UI8FL = value; +} + +void Core::Event::Director::setDirectorUI8FH( uint8_t value ) +{ + m_unionData.ui8lh.UI8FH = value; +} + +void Core::Event::Director::setDirectorUI8GL( uint8_t value ) +{ + m_unionData.ui8lh.UI8GL = value; +} + +void Core::Event::Director::setDirectorUI8GH( uint8_t value ) +{ + m_unionData.ui8lh.UI8GH = value; +} + +void Core::Event::Director::setDirectorUI8HL( uint8_t value ) +{ + m_unionData.ui8lh.UI8HL = value; +} + +void Core::Event::Director::setDirectorUI8HH( uint8_t value ) +{ + m_unionData.ui8lh.UI8HH = value; +} + +void Core::Event::Director::setDirectorUI8IL( uint8_t value ) +{ + m_unionData.ui8lh.UI8IL = value; +} + +void Core::Event::Director::setDirectorUI8IH( uint8_t value ) +{ + m_unionData.ui8lh.UI8IH = value; +} + +void Core::Event::Director::setDirectorUI8JL( uint8_t value ) +{ + m_unionData.ui8lh.UI8JL = value; +} + +void Core::Event::Director::setDirectorUI8JH( uint8_t value ) +{ + m_unionData.ui8lh.UI8JH = value; +} diff --git a/src/servers/sapphire_zone/Event/Director.h b/src/servers/sapphire_zone/Event/Director.h index c570acb6..74a7a84f 100644 --- a/src/servers/sapphire_zone/Event/Director.h +++ b/src/servers/sapphire_zone/Event/Director.h @@ -38,6 +38,40 @@ public: uint8_t getSequence() const; uint8_t getBranch() const; + void sendDirectorInit( Entity::PlayerPtr pPlayer ) const; + void sendDirectorClear( Entity::PlayerPtr pPlayer ) const; + void sendDirectorVars( Entity::PlayerPtr pPlayer ) const; + + void setDirectorUI8AL( uint8_t value ); + void setDirectorUI8AH( uint8_t value ); + + void setDirectorUI8BL( uint8_t value ); + void setDirectorUI8BH( uint8_t value ); + + void setDirectorUI8CL( uint8_t value ); + void setDirectorUI8CH( uint8_t value ); + + void setDirectorUI8DL( uint8_t value ); + void setDirectorUI8DH( uint8_t value ); + + void setDirectorUI8EL( uint8_t value ); + void setDirectorUI8EH( uint8_t value ); + + void setDirectorUI8FL( uint8_t value ); + void setDirectorUI8FH( uint8_t value ); + + void setDirectorUI8GL( uint8_t value ); + void setDirectorUI8GH( uint8_t value ); + + void setDirectorUI8HL( uint8_t value ); + void setDirectorUI8HH( uint8_t value ); + + void setDirectorUI8IL( uint8_t value ); + void setDirectorUI8IH( uint8_t value ); + + void setDirectorUI8JL( uint8_t value ); + void setDirectorUI8JH( uint8_t value ); + private: /*! Id of the content of the director */ uint16_t m_contentId; @@ -51,12 +85,69 @@ private: /*! current branch */ uint8_t m_branch; - /*! raw storage for flags/vars */ - uint8_t m_unionData[10]; + union + { + struct UI8LH + { + uint8_t UI8AL : 4; + uint8_t UI8AH : 4; + uint8_t UI8BL : 4; + uint8_t UI8BH : 4; + uint8_t UI8CL : 4; + uint8_t UI8CH : 4; + uint8_t UI8DL : 4; + uint8_t UI8DH : 4; + uint8_t UI8EL : 4; + uint8_t UI8EH : 4; + uint8_t UI8FL : 4; + uint8_t UI8FH : 4; + uint8_t UI8GL : 4; + uint8_t UI8GH : 4; + uint8_t UI8HL : 4; + uint8_t UI8HH : 4; + uint8_t UI8IL : 4; + uint8_t UI8IH : 4; + uint8_t UI8JL : 4; + uint8_t UI8JH : 4; + } ui8lh; + + struct UI8 + { + uint8_t UI8A; + uint8_t UI8B; + uint8_t UI8C; + uint8_t UI8D; + uint8_t UI8E; + uint8_t UI8F; + uint8_t UI8G; + uint8_t UI8H; + uint8_t UI8I; + uint8_t UI8J; + } ui8; + + struct FLAGS + { + uint8_t flags80; + uint8_t flags72; + uint8_t flags64; + uint8_t flags56; + uint8_t flags48; + uint8_t flags40; + uint8_t flags32; + uint8_t flags24; + uint8_t flags16; + uint8_t flags8; + } flags; + + /*! raw storage for flags/vars */ + uint8_t arrData[10]; + } m_unionData; /*! type of the director */ DirectorType m_type; + uint32_t m_elapsedTime; + }; diff --git a/src/servers/sapphire_zone/Network/Handlers/PacketHandlers.cpp b/src/servers/sapphire_zone/Network/Handlers/PacketHandlers.cpp index cedb239e..b2425d69 100644 --- a/src/servers/sapphire_zone/Network/Handlers/PacketHandlers.cpp +++ b/src/servers/sapphire_zone/Network/Handlers/PacketHandlers.cpp @@ -406,6 +406,8 @@ void Core::Network::GameConnection::pingHandler( const Packets::GamePacket& inPa void Core::Network::GameConnection::finishLoadingHandler( const Packets::GamePacket& inPacket, Entity::Player& player ) { + player.getCurrentZone()->onFinishLoading( player.getAsPlayer() ); + // player is done zoning player.setLoadingComplete( true ); diff --git a/src/servers/sapphire_zone/Zone/InstanceContent.cpp b/src/servers/sapphire_zone/Zone/InstanceContent.cpp index be9af4e4..48f8fac9 100644 --- a/src/servers/sapphire_zone/Zone/InstanceContent.cpp +++ b/src/servers/sapphire_zone/Zone/InstanceContent.cpp @@ -4,7 +4,10 @@ #include #include #include -#include +#include +#include + +#include "Event/Director.h" #include "Actor/Player.h" @@ -51,9 +54,14 @@ void Core::InstanceContent::onEnterTerritory( Entity::PlayerPtr pPlayer ) + std::to_string( getInstanceContentId() ) + + ", Entity#" + std::to_string( pPlayer->getId() ) ); - pPlayer->queuePacket( ActorControlPacket143( pPlayer->getId(), DirectorInit, getDirectorId(), - getInstanceContentId() ) ); + // mark player as "bound by duty" pPlayer->setStateFlag( PlayerStateFlag::BoundByDuty ); + + // if the instance was not started yet, director init is sent on enter event. + // else it will be sent on finish loading. + if( m_state == Created ) + sendDirectorInit( pPlayer ); + } void Core::InstanceContent::onLeaveTerritory( Entity::PlayerPtr pPlayer ) @@ -61,21 +69,141 @@ void Core::InstanceContent::onLeaveTerritory( Entity::PlayerPtr pPlayer ) g_log.debug( "InstanceContent::onLeaveTerritory: Zone#" + std::to_string( getGuId() ) + "|" + std::to_string( getInstanceContentId() ) + + ", Entity#" + std::to_string( pPlayer->getId() ) ); - pPlayer->queuePacket( ActorControlPacket143( pPlayer->getId(), DirectorClear, getDirectorId() ) ); + sendDirectorClear( pPlayer ); + + pPlayer->setDirectorInitialized( false ); + // remove "bound by duty" state pPlayer->unsetStateFlag( PlayerStateFlag::BoundByDuty ); } void Core::InstanceContent::onUpdate( uint32_t currTime ) { + switch( m_state ) + { + case Created: + { + // temporary handling for instance state progression + if( m_playerMap.size() < 1 ) + return; + + for( const auto &playerIt : m_playerMap ) + { + if( !playerIt.second->isLoadingComplete() || !playerIt.second->isDirectorInitialized() ) + return; + } + + for( const auto &playerIt : m_playerMap ) + { + auto pPlayer = playerIt.second; + pPlayer->queuePacket( + ActorControlPacket143( pPlayer->getId(), DirectorUpdate, + getDirectorId(), 0x40000001, m_instanceContentInfo->timeLimitmin * 60u ) ); + } + + m_state = DutyInProgress; + break; + } + + + case DutyReset: + break; + + case DutyInProgress: + { + break; + } + + + case DutyFinished: + break; + } } void Core::InstanceContent::onFinishLoading( Entity::PlayerPtr pPlayer ) { - + if( m_state != Created ) + sendDirectorInit( pPlayer ); } void Core::InstanceContent::onInitDirector( Entity::PlayerPtr pPlayer ) { - + sendDirectorVars( pPlayer ); + pPlayer->setDirectorInitialized( true ); +} + +void Core::InstanceContent::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; + + } + + for( const auto &playerIt : m_playerMap ) + { + sendDirectorVars( playerIt.second ); + } } diff --git a/src/servers/sapphire_zone/Zone/InstanceContent.h b/src/servers/sapphire_zone/Zone/InstanceContent.h index 1c1705e6..49bfedf7 100644 --- a/src/servers/sapphire_zone/Zone/InstanceContent.h +++ b/src/servers/sapphire_zone/Zone/InstanceContent.h @@ -15,7 +15,8 @@ public: enum InstanceContentState { Created, - DutyStarted, + DutyReset, + DutyInProgress, DutyFinished }; @@ -32,6 +33,8 @@ public: void onInitDirector( Entity::PlayerPtr pPlayer ) override; void onUpdate( uint32_t currTime ) override; + void setVar( uint8_t index, uint8_t value ); + Core::Data::ExdDataGenerated::InstanceContentPtr getInstanceContentInfo() const; From b74083c06cb5586ed752f2fbf5038b2889dadbfb Mon Sep 17 00:00:00 2001 From: Adam Date: Wed, 7 Feb 2018 13:33:02 +1100 Subject: [PATCH 13/48] update generated exd data --- src/common/Exd/ExdDataGenerated.cpp | 87 ++++++++++++++++ src/common/Exd/ExdDataGenerated.h | 75 +++++++++++++- src/tools/exd_struct_gen/ex.json | 152 +++++++++++++++++++++++++++- 3 files changed, 311 insertions(+), 3 deletions(-) diff --git a/src/common/Exd/ExdDataGenerated.cpp b/src/common/Exd/ExdDataGenerated.cpp index a35c11a4..c6f953ec 100644 --- a/src/common/Exd/ExdDataGenerated.cpp +++ b/src/common/Exd/ExdDataGenerated.cpp @@ -413,9 +413,16 @@ Core::Data::BeastTribe::BeastTribe( uint32_t row_id, Core::Data::ExdDataGenerated* exdData ) { auto row = exdData->m_BeastTribeDat.get_row( row_id ); + minLevel = exdData->getField< uint8_t >( row, 0 ); + maxLevel = exdData->getField< uint8_t >( row, 1 ); beastRankBonus = exdData->getField< uint8_t >( row, 2 ); iconReputation = exdData->getField< uint32_t >( row, 3 ); icon = exdData->getField< uint32_t >( row, 4 ); + maxRank = exdData->getField< uint8_t >( row, 5 ); + alliedBeastTribeQuest = exdData->getField< uint32_t >( row, 6 ); + expansion = exdData->getField< uint8_t >( row, 7 ); + currencyItem = exdData->getField< uint32_t >( row, 8 ); + displayOrder = exdData->getField< uint8_t >( row, 9 ); name = exdData->getField< std::string >( row, 10 ); nameRelation = exdData->getField< std::string >( row, 18 ); } @@ -1973,6 +1980,11 @@ { auto row = exdData->m_GilShopItemDat.get_row( row_id ); 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 ) ); + stateRequired = exdData->getField< uint16_t >( row, 7 ); + patch = exdData->getField< uint16_t >( row, 8 ); } Core::Data::GoldSaucerTextData::GoldSaucerTextData( uint32_t row_id, Core::Data::ExdDataGenerated* exdData ) @@ -2519,6 +2531,7 @@ flyingCondition = exdData->getField< uint8_t >( row, 10 ); isFlying = exdData->getField< uint8_t >( row, 14 ); rideBGM = exdData->getField< uint16_t >( row, 17 ); + order = exdData->getField< int8_t >( row, 29 ); icon = exdData->getField< uint16_t >( row, 30 ); } @@ -2572,6 +2585,7 @@ Core::Data::OnlineStatus::OnlineStatus( uint32_t row_id, Core::Data::ExdDataGenerated* exdData ) { auto row = exdData->m_OnlineStatusDat.get_row( row_id ); + priority = exdData->getField< uint8_t >( row, 2 ); name = exdData->getField< std::string >( row, 3 ); icon = exdData->getField< uint32_t >( row, 4 ); } @@ -3016,6 +3030,20 @@ name = exdData->getField< std::string >( row, 1 ); } + Core::Data::QuickChat::QuickChat( uint32_t row_id, Core::Data::ExdDataGenerated* exdData ) + { + auto row = exdData->m_QuickChatDat.get_row( row_id ); + nameAction = exdData->getField< std::string >( row, 0 ); + icon1 = exdData->getField< int32_t >( row, 1 ); + quickChatTransient = exdData->getField< int8_t >( row, 3 ); + } + + Core::Data::QuickChatTransient::QuickChatTransient( uint32_t row_id, Core::Data::ExdDataGenerated* exdData ) + { + auto row = exdData->m_QuickChatTransientDat.get_row( row_id ); + textOutput = exdData->getField< std::string >( row, 0 ); + } + Core::Data::Race::Race( uint32_t row_id, Core::Data::ExdDataGenerated* exdData ) { auto row = exdData->m_RaceDat.get_row( row_id ); @@ -3672,6 +3700,17 @@ description = exdData->getField< std::string >( row, 0 ); } + Core::Data::TreasureHuntRank::TreasureHuntRank( uint32_t row_id, Core::Data::ExdDataGenerated* exdData ) + { + auto row = exdData->m_TreasureHuntRankDat.get_row( row_id ); + icon = exdData->getField< uint32_t >( row, 1 ); + itemName = exdData->getField< int32_t >( row, 2 ); + keyItemName = exdData->getField< int32_t >( row, 3 ); + instanceMap = exdData->getField< int32_t >( row, 4 ); + maxPartySize = exdData->getField< uint8_t >( row, 5 ); + minPartySize = exdData->getField< uint8_t >( row, 6 ); + } + Core::Data::Tribe::Tribe( uint32_t row_id, Core::Data::ExdDataGenerated* exdData ) { auto row = exdData->m_TribeDat.get_row( row_id ); @@ -4121,6 +4160,8 @@ bool Core::Data::ExdDataGenerated::init( const std::string& path ) m_PlaceNameDat = setupDatAccess( "PlaceName", xiv::exd::Language::en ); m_QuestDat = setupDatAccess( "Quest", xiv::exd::Language::en ); m_QuestRewardOtherDat = setupDatAccess( "QuestRewardOther", xiv::exd::Language::en ); + m_QuickChatDat = setupDatAccess( "QuickChat", xiv::exd::Language::en ); + m_QuickChatTransientDat = setupDatAccess( "QuickChatTransient", xiv::exd::Language::en ); m_RaceDat = setupDatAccess( "Race", xiv::exd::Language::en ); m_RacingChocoboItemDat = setupDatAccess( "RacingChocoboItem", xiv::exd::Language::none ); m_RacingChocoboNameDat = setupDatAccess( "RacingChocoboName", xiv::exd::Language::en ); @@ -4164,6 +4205,7 @@ bool Core::Data::ExdDataGenerated::init( const std::string& path ) m_TraitDat = setupDatAccess( "Trait", xiv::exd::Language::en ); m_TraitRecastDat = setupDatAccess( "TraitRecast", xiv::exd::Language::none ); m_TraitTransientDat = setupDatAccess( "TraitTransient", xiv::exd::Language::en ); + m_TreasureHuntRankDat = setupDatAccess( "TreasureHuntRank", xiv::exd::Language::none ); m_TribeDat = setupDatAccess( "Tribe", xiv::exd::Language::en ); m_TripleTriadDat = setupDatAccess( "TripleTriad", xiv::exd::Language::none ); m_TripleTriadCardDat = setupDatAccess( "TripleTriadCard", xiv::exd::Language::en ); @@ -7721,6 +7763,36 @@ Core::Data::ExdDataGenerated::QuestRewardOtherPtr } return nullptr; } +Core::Data::ExdDataGenerated::QuickChatPtr + Core::Data::ExdDataGenerated::getQuickChat( uint32_t QuickChatId ) +{ + try + { + auto row = m_QuickChatDat.get_row( QuickChatId ); + auto info = boost::make_shared< QuickChat >( QuickChatId, this ); + return info; + } + catch( ... ) + { + return nullptr; + } + return nullptr; +} +Core::Data::ExdDataGenerated::QuickChatTransientPtr + Core::Data::ExdDataGenerated::getQuickChatTransient( uint32_t QuickChatTransientId ) +{ + try + { + auto row = m_QuickChatTransientDat.get_row( QuickChatTransientId ); + auto info = boost::make_shared< QuickChatTransient >( QuickChatTransientId, this ); + return info; + } + catch( ... ) + { + return nullptr; + } + return nullptr; +} Core::Data::ExdDataGenerated::RacePtr Core::Data::ExdDataGenerated::getRace( uint32_t RaceId ) { @@ -8366,6 +8438,21 @@ Core::Data::ExdDataGenerated::TraitTransientPtr } return nullptr; } +Core::Data::ExdDataGenerated::TreasureHuntRankPtr + Core::Data::ExdDataGenerated::getTreasureHuntRank( uint32_t TreasureHuntRankId ) +{ + try + { + auto row = m_TreasureHuntRankDat.get_row( TreasureHuntRankId ); + auto info = boost::make_shared< TreasureHuntRank >( TreasureHuntRankId, this ); + return info; + } + catch( ... ) + { + return nullptr; + } + return nullptr; +} Core::Data::ExdDataGenerated::TribePtr Core::Data::ExdDataGenerated::getTribe( uint32_t TribeId ) { diff --git a/src/common/Exd/ExdDataGenerated.h b/src/common/Exd/ExdDataGenerated.h index c6f7ffd9..3e121380 100644 --- a/src/common/Exd/ExdDataGenerated.h +++ b/src/common/Exd/ExdDataGenerated.h @@ -252,6 +252,8 @@ struct Picture; struct PlaceName; struct Quest; struct QuestRewardOther; +struct QuickChat; +struct QuickChatTransient; struct Race; struct RacingChocoboItem; struct RacingChocoboName; @@ -295,6 +297,7 @@ struct Town; struct Trait; struct TraitRecast; struct TraitTransient; +struct TreasureHuntRank; struct Tribe; struct TripleTriad; struct TripleTriadCard; @@ -693,9 +696,16 @@ struct BeastReputationRank struct BeastTribe { + uint8_t minLevel; + uint8_t maxLevel; uint8_t beastRankBonus; uint32_t iconReputation; uint32_t icon; + uint8_t maxRank; + uint32_t alliedBeastTribeQuest; + uint8_t expansion; + uint32_t currencyItem; + uint8_t displayOrder; std::string name; std::string nameRelation; @@ -1536,7 +1546,7 @@ struct EventAction { std::string name; uint16_t icon; - uint16_t castTime; + uint8_t castTime; EventAction( uint32_t row_id, Core::Data::ExdDataGenerated* exdData ); }; @@ -1996,6 +2006,9 @@ struct GilShop struct GilShopItem { int32_t item; + std::vector< int32_t > rowRequired; + uint16_t stateRequired; + uint16_t patch; GilShopItem( uint32_t row_id, Core::Data::ExdDataGenerated* exdData ); }; @@ -2552,6 +2565,7 @@ struct Mount uint8_t flyingCondition; uint8_t isFlying; uint16_t rideBGM; + int8_t order; uint16_t icon; Mount( uint32_t row_id, Core::Data::ExdDataGenerated* exdData ); @@ -2604,6 +2618,7 @@ struct Omen struct OnlineStatus { + uint8_t priority; std::string name; uint32_t icon; @@ -2753,6 +2768,22 @@ struct QuestRewardOther QuestRewardOther( uint32_t row_id, Core::Data::ExdDataGenerated* exdData ); }; +struct QuickChat +{ + std::string nameAction; + int32_t icon1; + int8_t quickChatTransient; + + QuickChat( uint32_t row_id, Core::Data::ExdDataGenerated* exdData ); +}; + +struct QuickChatTransient +{ + std::string textOutput; + + QuickChatTransient( uint32_t row_id, Core::Data::ExdDataGenerated* exdData ); +}; + struct Race { std::string masculine; @@ -3187,6 +3218,18 @@ struct TraitTransient TraitTransient( uint32_t row_id, Core::Data::ExdDataGenerated* exdData ); }; +struct TreasureHuntRank +{ + uint32_t icon; + int32_t itemName; + int32_t keyItemName; + int32_t instanceMap; + uint8_t maxPartySize; + uint8_t minPartySize; + + TreasureHuntRank( uint32_t row_id, Core::Data::ExdDataGenerated* exdData ); +}; + struct Tribe { std::string masculine; @@ -3631,6 +3674,8 @@ struct WorldDCGroupType xiv::exd::Exd m_PlaceNameDat; xiv::exd::Exd m_QuestDat; xiv::exd::Exd m_QuestRewardOtherDat; + xiv::exd::Exd m_QuickChatDat; + xiv::exd::Exd m_QuickChatTransientDat; xiv::exd::Exd m_RaceDat; xiv::exd::Exd m_RacingChocoboItemDat; xiv::exd::Exd m_RacingChocoboNameDat; @@ -3674,6 +3719,7 @@ struct WorldDCGroupType xiv::exd::Exd m_TraitDat; xiv::exd::Exd m_TraitRecastDat; xiv::exd::Exd m_TraitTransientDat; + xiv::exd::Exd m_TreasureHuntRankDat; xiv::exd::Exd m_TribeDat; xiv::exd::Exd m_TripleTriadDat; xiv::exd::Exd m_TripleTriadCardDat; @@ -4166,6 +4212,10 @@ struct WorldDCGroupType QuestPtr getQuest( uint32_t QuestId ); using QuestRewardOtherPtr = boost::shared_ptr< QuestRewardOther >; QuestRewardOtherPtr getQuestRewardOther( uint32_t QuestRewardOtherId ); + using QuickChatPtr = boost::shared_ptr< QuickChat >; + QuickChatPtr getQuickChat( uint32_t QuickChatId ); + using QuickChatTransientPtr = boost::shared_ptr< QuickChatTransient >; + QuickChatTransientPtr getQuickChatTransient( uint32_t QuickChatTransientId ); using RacePtr = boost::shared_ptr< Race >; RacePtr getRace( uint32_t RaceId ); using RacingChocoboItemPtr = boost::shared_ptr< RacingChocoboItem >; @@ -4252,6 +4302,8 @@ struct WorldDCGroupType TraitRecastPtr getTraitRecast( uint32_t TraitRecastId ); using TraitTransientPtr = boost::shared_ptr< TraitTransient >; TraitTransientPtr getTraitTransient( uint32_t TraitTransientId ); + using TreasureHuntRankPtr = boost::shared_ptr< TreasureHuntRank >; + TreasureHuntRankPtr getTreasureHuntRank( uint32_t TreasureHuntRankId ); using TribePtr = boost::shared_ptr< Tribe >; TribePtr getTribe( uint32_t TribeId ); using TripleTriadPtr = boost::shared_ptr< TripleTriad >; @@ -4529,6 +4581,8 @@ struct WorldDCGroupType std::set< uint32_t > m_PlaceNameIdList; std::set< uint32_t > m_QuestIdList; std::set< uint32_t > m_QuestRewardOtherIdList; + std::set< uint32_t > m_QuickChatIdList; + std::set< uint32_t > m_QuickChatTransientIdList; std::set< uint32_t > m_RaceIdList; std::set< uint32_t > m_RacingChocoboItemIdList; std::set< uint32_t > m_RacingChocoboNameIdList; @@ -4572,6 +4626,7 @@ struct WorldDCGroupType std::set< uint32_t > m_TraitIdList; std::set< uint32_t > m_TraitRecastIdList; std::set< uint32_t > m_TraitTransientIdList; + std::set< uint32_t > m_TreasureHuntRankIdList; std::set< uint32_t > m_TribeIdList; std::set< uint32_t > m_TripleTriadIdList; std::set< uint32_t > m_TripleTriadCardIdList; @@ -6004,6 +6059,18 @@ const std::set< uint32_t >& getQuestRewardOtherIdList() loadIdList( m_QuestRewardOtherDat, m_QuestRewardOtherIdList ); return m_QuestRewardOtherIdList; } +const std::set< uint32_t >& getQuickChatIdList() +{ + if( m_QuickChatIdList.size() == 0 ) + loadIdList( m_QuickChatDat, m_QuickChatIdList ); + return m_QuickChatIdList; +} +const std::set< uint32_t >& getQuickChatTransientIdList() +{ + if( m_QuickChatTransientIdList.size() == 0 ) + loadIdList( m_QuickChatTransientDat, m_QuickChatTransientIdList ); + return m_QuickChatTransientIdList; +} const std::set< uint32_t >& getRaceIdList() { if( m_RaceIdList.size() == 0 ) @@ -6262,6 +6329,12 @@ const std::set< uint32_t >& getTraitTransientIdList() loadIdList( m_TraitTransientDat, m_TraitTransientIdList ); return m_TraitTransientIdList; } +const std::set< uint32_t >& getTreasureHuntRankIdList() +{ + if( m_TreasureHuntRankIdList.size() == 0 ) + loadIdList( m_TreasureHuntRankDat, m_TreasureHuntRankIdList ); + return m_TreasureHuntRankIdList; +} const std::set< uint32_t >& getTribeIdList() { if( m_TribeIdList.size() == 0 ) diff --git a/src/tools/exd_struct_gen/ex.json b/src/tools/exd_struct_gen/ex.json index 6ab5db0e..ed23d89a 100644 --- a/src/tools/exd_struct_gen/ex.json +++ b/src/tools/exd_struct_gen/ex.json @@ -1027,6 +1027,13 @@ "sheet": "BeastTribe", "defaultColumn": "Name", "definitions": [ + { + "name": "MinLevel" + }, + { + "index": 1, + "name": "MaxLevel" + }, { "index": 2, "name": "BeastRankBonus", @@ -1049,6 +1056,34 @@ "type": "icon" } }, + { + "index": 5, + "name": "MaxRank" + }, + { + "index": 6, + "name": "AlliedBeastTribeQuest", + "converter": { + "type": "link", + "target": "Quest" + } + }, + { + "index": 7, + "name": "Expansion" + }, + { + "index": 8, + "name": "CurrencyItem", + "converter": { + "type": "link", + "target": "Item" + } + }, + { + "index": 9, + "name": "DisplayOrder" + }, { "index": 10, "name": "Name" @@ -3596,7 +3631,7 @@ } }, { - "index": 3, + "index": 2, "name": "CastTime" } ] @@ -4846,6 +4881,29 @@ "type": "link", "target": "Item" } + }, + { + "type": "repeat", + "count": 3, + "index": 3, + "definition": { + "name": "Row{Required}", + "converter": { + "type": "multiref", + "targets": [ + "Quest", + "Achievement" + ] + } + } + }, + { + "index": 7, + "name": "State{Required}" + }, + { + "index": 8, + "name": "Patch" } ] }, @@ -6662,6 +6720,10 @@ "target": "BGM" } }, + { + "index": 29, + "name": "Order" + }, { "index": 30, "name": "Icon", @@ -6852,6 +6914,10 @@ "sheet": "OnlineStatus", "defaultColumn": "Name", "definitions": [ + { + "index": 2, + "name": "Priority" + }, { "index": 3, "name": "Name" @@ -7461,6 +7527,42 @@ } ] }, + { + "sheet": "QuickChat", + "defaultColumn": "Text", + "definitions": [ + { + "index": 0, + "name": "Name{Action}" + }, + { + "index": 1, + "name": "Icon1", + "converter": { + "type": "icon", + "target": "Action" + } + }, + { + "index": 3, + "name": "QuickChatTransient", + "converter": { + "type": "link", + "target": "QuickChatTransient" + } + } + ] + }, + { + "sheet": "QuickChatTransient", + "defaultColumn": "Text{Output}", + "definitions": [ + { + "index": 0, + "name": "Text{Output}" + } + ] + }, { "sheet": "Race", "defaultColumn": "Feminine", @@ -8971,6 +9073,52 @@ } ] }, + { + "sheet": "TreasureHuntRank", + "defaultColumn": "Name", + "definitions": [ + { + "index": 1, + "name": "Icon", + "converter": { + "type": "icon", + "target": "Item" + } + }, + { + "index": 2, + "name": "ItemName", + "converter": { + "type": "link", + "target": "Item" + } + }, + { + "index": 3, + "name": "KeyItemName", + "converter": { + "type": "link", + "target": "EventItem" + } + }, + { + "index": 4, + "name": "InstanceMap", + "converter": { + "type": "link", + "target": "EventItem" + } + }, + { + "index": 5, + "name": "MaxPartySize" + }, + { + "index": 6, + "name": "MinPartySize" + } + ] + }, { "sheet": "Tribe", "defaultColumn": "Feminine", @@ -9518,4 +9666,4 @@ ] } ] -} \ No newline at end of file +} From 7528db3b8300db28d30d942f42fc530028ff3eba Mon Sep 17 00:00:00 2001 From: Adam Date: Wed, 7 Feb 2018 14:27:52 +1100 Subject: [PATCH 14/48] remove exddata from sapphire_zone --- src/servers/sapphire_zone/Action/ActionCollision.cpp | 1 - src/servers/sapphire_zone/Action/ActionMount.cpp | 2 -- src/servers/sapphire_zone/Actor/Actor.cpp | 1 - src/servers/sapphire_zone/Actor/EventNpc.cpp | 2 -- src/servers/sapphire_zone/Actor/PlayerInventory.cpp | 1 - .../sapphire_zone/Network/Handlers/GMCommandHandlers.cpp | 2 -- src/servers/sapphire_zone/Network/Handlers/InventoryHandler.cpp | 2 -- src/servers/sapphire_zone/Network/Handlers/PacketHandlers.cpp | 2 -- src/servers/sapphire_zone/StatusEffect/StatusEffect.cpp | 1 - src/servers/sapphire_zone/Zone/TerritoryMgr.cpp | 1 - src/servers/sapphire_zone/Zone/TerritoryMgr.h | 2 +- 11 files changed, 1 insertion(+), 16 deletions(-) diff --git a/src/servers/sapphire_zone/Action/ActionCollision.cpp b/src/servers/sapphire_zone/Action/ActionCollision.cpp index 3ec83c9a..322e0da2 100644 --- a/src/servers/sapphire_zone/Action/ActionCollision.cpp +++ b/src/servers/sapphire_zone/Action/ActionCollision.cpp @@ -1,5 +1,4 @@ #include -#include #include #include "ActionCollision.h" diff --git a/src/servers/sapphire_zone/Action/ActionMount.cpp b/src/servers/sapphire_zone/Action/ActionMount.cpp index 5e5a4846..13dcc05d 100644 --- a/src/servers/sapphire_zone/Action/ActionMount.cpp +++ b/src/servers/sapphire_zone/Action/ActionMount.cpp @@ -3,7 +3,6 @@ #include #include #include -#include #include #include "Network/PacketWrappers/ActorControlPacket142.h" @@ -17,7 +16,6 @@ using namespace Core::Network; using namespace Core::Network::Packets; using namespace Core::Network::Packets::Server; -extern Core::Data::ExdData g_exdData; extern Core::Logger g_log; extern Core::Scripting::ScriptManager g_scriptMgr; diff --git a/src/servers/sapphire_zone/Actor/Actor.cpp b/src/servers/sapphire_zone/Actor/Actor.cpp index 9e981dac..657f7947 100644 --- a/src/servers/sapphire_zone/Actor/Actor.cpp +++ b/src/servers/sapphire_zone/Actor/Actor.cpp @@ -1,7 +1,6 @@ #include #include #include -#include #include #include diff --git a/src/servers/sapphire_zone/Actor/EventNpc.cpp b/src/servers/sapphire_zone/Actor/EventNpc.cpp index 5b1e4bc4..bb01d069 100644 --- a/src/servers/sapphire_zone/Actor/EventNpc.cpp +++ b/src/servers/sapphire_zone/Actor/EventNpc.cpp @@ -5,7 +5,6 @@ #include #include -#include #include #include @@ -21,7 +20,6 @@ using namespace Core::Network::Packets; using namespace Core::Network::Packets::Server; extern Core::Logger g_log; -extern Core::Data::ExdData g_exdData; uint32_t Core::Entity::EventNpc::m_nextID = 1249241694; diff --git a/src/servers/sapphire_zone/Actor/PlayerInventory.cpp b/src/servers/sapphire_zone/Actor/PlayerInventory.cpp index e20dfa88..2f18f857 100644 --- a/src/servers/sapphire_zone/Actor/PlayerInventory.cpp +++ b/src/servers/sapphire_zone/Actor/PlayerInventory.cpp @@ -1,5 +1,4 @@ #include -#include #include #include diff --git a/src/servers/sapphire_zone/Network/Handlers/GMCommandHandlers.cpp b/src/servers/sapphire_zone/Network/Handlers/GMCommandHandlers.cpp index d3226c3a..9ba5c2b9 100644 --- a/src/servers/sapphire_zone/Network/Handlers/GMCommandHandlers.cpp +++ b/src/servers/sapphire_zone/Network/Handlers/GMCommandHandlers.cpp @@ -2,7 +2,6 @@ #include #include #include -#include #include #include @@ -38,7 +37,6 @@ extern Core::Logger g_log; extern Core::ServerZone g_serverZone; extern Core::TerritoryMgr g_territoryMgr; -extern Core::Data::ExdData g_exdData; extern Core::DebugCommandHandler g_gameCommandMgr; using namespace Core::Common; diff --git a/src/servers/sapphire_zone/Network/Handlers/InventoryHandler.cpp b/src/servers/sapphire_zone/Network/Handlers/InventoryHandler.cpp index 752ca776..9a44832f 100644 --- a/src/servers/sapphire_zone/Network/Handlers/InventoryHandler.cpp +++ b/src/servers/sapphire_zone/Network/Handlers/InventoryHandler.cpp @@ -2,7 +2,6 @@ #include #include #include -#include #include #include @@ -26,7 +25,6 @@ extern Core::Logger g_log; extern Core::ServerZone g_serverZone; -extern Core::Data::ExdData g_exdData; extern Core::DebugCommandHandler g_gameCommandMgr; using namespace Core::Common; diff --git a/src/servers/sapphire_zone/Network/Handlers/PacketHandlers.cpp b/src/servers/sapphire_zone/Network/Handlers/PacketHandlers.cpp index b2425d69..7cd1de23 100644 --- a/src/servers/sapphire_zone/Network/Handlers/PacketHandlers.cpp +++ b/src/servers/sapphire_zone/Network/Handlers/PacketHandlers.cpp @@ -2,7 +2,6 @@ #include #include #include -#include #include #include #include @@ -41,7 +40,6 @@ extern Core::Logger g_log; extern Core::ServerZone g_serverZone; extern Core::TerritoryMgr g_territoryMgr; -extern Core::Data::ExdData g_exdData; extern Core::DebugCommandHandler g_gameCommandMgr; using namespace Core::Common; diff --git a/src/servers/sapphire_zone/StatusEffect/StatusEffect.cpp b/src/servers/sapphire_zone/StatusEffect/StatusEffect.cpp index 7d986249..e4ae715a 100644 --- a/src/servers/sapphire_zone/StatusEffect/StatusEffect.cpp +++ b/src/servers/sapphire_zone/StatusEffect/StatusEffect.cpp @@ -2,7 +2,6 @@ #include #include #include -#include #include #include diff --git a/src/servers/sapphire_zone/Zone/TerritoryMgr.cpp b/src/servers/sapphire_zone/Zone/TerritoryMgr.cpp index 2f7bbd81..5c27c224 100644 --- a/src/servers/sapphire_zone/Zone/TerritoryMgr.cpp +++ b/src/servers/sapphire_zone/Zone/TerritoryMgr.cpp @@ -11,7 +11,6 @@ #include "InstanceContent.h" extern Core::Logger g_log; -extern Core::Data::ExdData g_exdData; extern Core::Data::ExdDataGenerated g_exdDataGen; Core::TerritoryMgr::TerritoryMgr() : diff --git a/src/servers/sapphire_zone/Zone/TerritoryMgr.h b/src/servers/sapphire_zone/Zone/TerritoryMgr.h index b7cdcf3c..52561fa9 100644 --- a/src/servers/sapphire_zone/Zone/TerritoryMgr.h +++ b/src/servers/sapphire_zone/Zone/TerritoryMgr.h @@ -1,7 +1,7 @@ #ifndef SAPPHIRE_TERRITORYMGR_H #define SAPPHIRE_TERRITORYMGR_H -#include +#include #include "Forwards.h" #include From bb97e1160b835d974f1c5835c2e6b00a9b4a82e1 Mon Sep 17 00:00:00 2001 From: Tahir Akhlaq Date: Wed, 7 Feb 2018 22:13:20 +0000 Subject: [PATCH 15/48] added instancecontent.csv dump to pcb_reader --- src/tools/pcb_reader/lgb.h | 5 +-- src/tools/pcb_reader/main.cpp | 66 +++++++++++++++++++++++++---------- 2 files changed, 50 insertions(+), 21 deletions(-) diff --git a/src/tools/pcb_reader/lgb.h b/src/tools/pcb_reader/lgb.h index 7a9b7bdc..5ae8cd2b 100644 --- a/src/tools/pcb_reader/lgb.h +++ b/src/tools/pcb_reader/lgb.h @@ -194,8 +194,9 @@ public: struct LGB_MAPRANGE_HEADER : public LGB_ENTRY_HEADER { uint32_t type; - uint32_t unknown2; - uint8_t unknown3[0x10]; + uint16_t unknown2; + uint16_t unknown3; + uint8_t unknown4[0x10]; }; struct LGB_MAPRANGE_ENTRY : public LGB_ENTRY diff --git a/src/tools/pcb_reader/main.cpp b/src/tools/pcb_reader/main.cpp index c6704856..81a789ed 100644 --- a/src/tools/pcb_reader/main.cpp +++ b/src/tools/pcb_reader/main.cpp @@ -29,6 +29,7 @@ bool ignoreModels = false; std::string gamePath( "C:\\Program Files (x86)\\SquareEnix\\FINAL FANTASY XIV - A Realm Reborn\\game\\sqpack\\ffxiv" ); std::unordered_map< uint32_t, std::string > eobjNameMap; std::unordered_map< uint16_t, std::string > zoneNameMap; +std::unordered_map< uint16_t, std::vector< std::pair< uint16_t, std::string > > > zoneInstanceMap; uint32_t zoneId; std::set< std::string > zoneDumpList; @@ -234,6 +235,7 @@ void writeEobjEntry( std::ofstream& out, LGB_ENTRY* pObj ) static std::string eobjStr( "\"EObj\", " ); uint32_t id; + uint32_t unknown = 0, unknown2 = 0; std::string name; std::string typeStr; @@ -241,6 +243,7 @@ void writeEobjEntry( std::ofstream& out, LGB_ENTRY* pObj ) { auto pEobj = reinterpret_cast< LGB_EOBJ_ENTRY* >( pObj ); id = pEobj->header.eobjId; + unknown = pEobj->header.unknown; name = eobjNameMap[id]; typeStr = eobjStr; } @@ -248,11 +251,13 @@ void writeEobjEntry( std::ofstream& out, LGB_ENTRY* pObj ) { auto pMapRange = reinterpret_cast< LGB_MAPRANGE_ENTRY* >( pObj ); id = pMapRange->header.unknown; + unknown = pMapRange->header.unknown2; + unknown2 = pMapRange->header.unknown3; typeStr = mapRangeStr; } std::string outStr( - std::to_string( id ) + ", " + typeStr + "\"" + name + "\", " + + std::to_string( id ) + ", " + typeStr + "\"" + name + "\", " + std::to_string( unknown ) + ", " + std::to_string( unknown2 ) + ", " + std::to_string( pObj->header.translation.x ) + ", " + std::to_string( pObj->header.translation.y ) + ", " + std::to_string( pObj->header.translation.z ) + "\n" ); out.write( outStr.c_str(), outStr.size() ); @@ -268,6 +273,18 @@ void loadAllInstanceContentEntries() zoneNameToPath( "f1d1" ); } + std::ofstream out( "instancecontent.csv", std::ios::trunc ); + if( out.good() ) + { + out.close(); + } + out.open( "instancecontent.csv", std::ios::app ); + if( !out.good() ) + { + throw std::runtime_error( "Unable to create instancecontent.csv!" ); + } + std::cout << "[Info] Writing instancecontent.csv\n"; + for( auto& row : exdInstance.get_rows() ) { auto id = row.first; @@ -276,12 +293,18 @@ void loadAllInstanceContentEntries() auto name = *boost::get< std::string >( &fields.at( 3 ) ); if( name.empty() ) continue; - auto teri = *boost::get< uint32_t >( &fields.at( 7 ) ); + auto teri = *boost::get< uint32_t >( &fields.at( 9 ) ); auto i = 0; while( ( i = name.find( ' ' ) ) != std::string::npos ) name = name.replace( name.begin() + i, name.begin() + i + 1, { '_' } ); + std::string outStr( + std::to_string( id ) + ", \"" + name + "\", \"" + zoneNameMap[teri] + "\"," + std::to_string( teri ) + "\n" + ); + out.write( outStr.c_str(), outStr.size() ); + //zoneInstanceMap[zoneId].push_back( std::make_pair( id, name ) ); zoneDumpList.emplace( zoneNameMap[teri] ); } + out.close(); } void readFileToBuffer( const std::string& path, std::vector< char >& buf ) @@ -389,23 +412,25 @@ LABEL_DUMP: if( !eobjOut.good() ) throw std::string( "Unable to create " + zoneName + "_eobj.csv for eobj entries. Run as admin or check there isnt already a handle on the file." ).c_str(); - for( ; ; ) + if( !ignoreModels ) { - - uint16_t trId = *(uint16_t*)§ion1[offset1]; - - char someString[200]; - sprintf( someString, "%str%04d.pcb", collisionFilePath.c_str(), trId ); - stringList.push_back( std::string( someString ) ); - //std::cout << someString << "\n"; - offset1 += 0x20; - - if( offset1 >= section1.size() ) + for( ; ; ) { - break; + + uint16_t trId = *(uint16_t*)§ion1[offset1]; + + char someString[200]; + sprintf( someString, "%str%04d.pcb", collisionFilePath.c_str(), trId ); + stringList.push_back( std::string( someString ) ); + //std::cout << someString << "\n"; + offset1 += 0x20; + + if( offset1 >= section1.size() ) + { + break; + } } } - LGB_FILE bgLgb( §ion[0], "bg" ); LGB_FILE planmapLgb( §ion2[0], "planmap" ); @@ -603,10 +628,13 @@ LABEL_DUMP: } }; - for( const auto& fileName : stringList ) + if( !ignoreModels ) { - loadPcbFile( fileName ); - pushVerts( pcbFiles[fileName], fileName ); + for( const auto& fileName : stringList ) + { + loadPcbFile( fileName ); + pushVerts( pcbFiles[fileName], fileName ); + } } std::cout << "[Info] " << ( ignoreModels ? "Dumping MapRange and EObj" : "Writing obj file " ) << "\n"; @@ -685,7 +713,7 @@ LABEL_DUMP: if( pEntry->getType() == LgbEntryType::EventObject || pEntry->getType() == LgbEntryType::MapRange ) { writeEobjEntry( eobjOut, pEntry.get() ); - //writeOutput( fileName, &pEventObj->header.scale, &pEventObj->header.rotation, &pEventObj->header.translation ); + writeOutput( fileName, &pEntry->header.scale, &pEntry->header.rotation, &pEntry->header.translation ); } } } From c4991c8c52035fd346f313e99063c11c68b7e239 Mon Sep 17 00:00:00 2001 From: Adam Date: Thu, 8 Feb 2018 19:41:27 +1100 Subject: [PATCH 16/48] persist effect packet opcode --- src/common/Network/PacketDef/Ipcs.h | 1 + 1 file changed, 1 insertion(+) diff --git a/src/common/Network/PacketDef/Ipcs.h b/src/common/Network/PacketDef/Ipcs.h index 037818ca..f2bd0e15 100644 --- a/src/common/Network/PacketDef/Ipcs.h +++ b/src/common/Network/PacketDef/Ipcs.h @@ -93,6 +93,7 @@ namespace Packets { SetCharacterFCInfo = 0x0114, // updated 4.2 StatusEffectList = 0x0125, // updated 4.2 Effect = 0x0128, // updated 4.2 + PersistantEffect = 0x013B, // updated 4.2 GCAffiliation = 0xCCFC, // OUTDATED From 10f6e431489ed9f26b83871fb2ab3b38ac2969fe Mon Sep 17 00:00:00 2001 From: Adam Date: Thu, 8 Feb 2018 20:29:39 +1100 Subject: [PATCH 17/48] fix pcb_reader ignoring windows paths in arguments --- src/tools/pcb_reader/main.cpp | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/tools/pcb_reader/main.cpp b/src/tools/pcb_reader/main.cpp index c6704856..83d66887 100644 --- a/src/tools/pcb_reader/main.cpp +++ b/src/tools/pcb_reader/main.cpp @@ -318,7 +318,7 @@ int main( int argc, char* argv[] ) if( argc > 2 ) { std::string tmpPath( argv[2] ); - if( !( tmpPath.empty() || tmpPath.find( '/' ) == std::string::npos ) ) + if( !tmpPath.empty() ) gamePath = argv[2]; } } From 89f995376eae7e6f6794dcff3299e86f61a6ba42 Mon Sep 17 00:00:00 2001 From: Adam Date: Thu, 8 Feb 2018 23:28:30 +1100 Subject: [PATCH 18/48] pcb_reader dumps hierachyId now spawning objects has never been more fun! --- src/tools/pcb_reader/lgb.h | 3 ++- src/tools/pcb_reader/main.cpp | 5 ++++- 2 files changed, 6 insertions(+), 2 deletions(-) diff --git a/src/tools/pcb_reader/lgb.h b/src/tools/pcb_reader/lgb.h index 7a9b7bdc..c90572b3 100644 --- a/src/tools/pcb_reader/lgb.h +++ b/src/tools/pcb_reader/lgb.h @@ -174,7 +174,8 @@ public: struct LGB_EOBJ_HEADER : public LGB_ENTRY_HEADER { uint32_t eobjId; - uint8_t unknown1[0x10]; + uint32_t levelHierachyId; + uint8_t unknown1[0xC]; }; class LGB_EOBJ_ENTRY : public LGB_ENTRY diff --git a/src/tools/pcb_reader/main.cpp b/src/tools/pcb_reader/main.cpp index 83d66887..7b639d07 100644 --- a/src/tools/pcb_reader/main.cpp +++ b/src/tools/pcb_reader/main.cpp @@ -236,6 +236,7 @@ void writeEobjEntry( std::ofstream& out, LGB_ENTRY* pObj ) uint32_t id; std::string name; std::string typeStr; + uint32_t eobjlevelHierachyId = 0; if( pObj->getType() == LgbEntryType::EventObject ) { @@ -243,6 +244,7 @@ void writeEobjEntry( std::ofstream& out, LGB_ENTRY* pObj ) id = pEobj->header.eobjId; name = eobjNameMap[id]; typeStr = eobjStr; + eobjlevelHierachyId = pEobj->header.levelHierachyId; } else if( pObj->getType() == LgbEntryType::MapRange ) { @@ -253,7 +255,8 @@ void writeEobjEntry( std::ofstream& out, LGB_ENTRY* pObj ) std::string outStr( std::to_string( id ) + ", " + typeStr + "\"" + name + "\", " + - std::to_string( pObj->header.translation.x ) + ", " + std::to_string( pObj->header.translation.y ) + ", " + std::to_string( pObj->header.translation.z ) + "\n" + std::to_string( pObj->header.translation.x ) + ", " + std::to_string( pObj->header.translation.y ) + ", " + std::to_string( pObj->header.translation.z ) + + ", " + std::to_string( eobjlevelHierachyId ) + "\n" ); out.write( outStr.c_str(), outStr.size() ); } From bf404f7371c177de435cd637918d3c4bc8afa254 Mon Sep 17 00:00:00 2001 From: Adam Date: Thu, 8 Feb 2018 23:28:52 +1100 Subject: [PATCH 19/48] restructure script folder hierachy to remove unnecessary build targets --- .../Script/Scripts/{aetheryte => common}/Aethernet.cpp | 0 .../Script/Scripts/{aetheryte => common}/Aetheryte.cpp | 0 .../Script/Scripts/{CmnDef => common}/CmnDefCutSceneReplay.cpp | 0 .../Script/Scripts/{CmnDef => common}/CmnDefInnBed.cpp | 0 .../Script/Scripts/{CmnDef => common}/CmnDefLinkShell.cpp | 0 .../Script/Scripts/{CmnDef => common}/HouFurOrchestrion.cpp | 0 .../Script/Scripts/{ => quest}/opening/OpeningGridania.cpp | 2 +- .../Script/Scripts/{ => quest}/opening/OpeningLimsa.cpp | 2 +- .../Script/Scripts/{ => quest}/opening/OpeningUldah.cpp | 2 +- src/servers/sapphire_zone/Zone/InstanceContent.cpp | 1 + src/servers/sapphire_zone/Zone/InstanceContent.h | 2 ++ 11 files changed, 6 insertions(+), 3 deletions(-) rename src/servers/sapphire_zone/Script/Scripts/{aetheryte => common}/Aethernet.cpp (100%) rename src/servers/sapphire_zone/Script/Scripts/{aetheryte => common}/Aetheryte.cpp (100%) rename src/servers/sapphire_zone/Script/Scripts/{CmnDef => common}/CmnDefCutSceneReplay.cpp (100%) rename src/servers/sapphire_zone/Script/Scripts/{CmnDef => common}/CmnDefInnBed.cpp (100%) rename src/servers/sapphire_zone/Script/Scripts/{CmnDef => common}/CmnDefLinkShell.cpp (100%) rename src/servers/sapphire_zone/Script/Scripts/{CmnDef => common}/HouFurOrchestrion.cpp (100%) rename src/servers/sapphire_zone/Script/Scripts/{ => quest}/opening/OpeningGridania.cpp (99%) rename src/servers/sapphire_zone/Script/Scripts/{ => quest}/opening/OpeningLimsa.cpp (99%) rename src/servers/sapphire_zone/Script/Scripts/{ => quest}/opening/OpeningUldah.cpp (99%) diff --git a/src/servers/sapphire_zone/Script/Scripts/aetheryte/Aethernet.cpp b/src/servers/sapphire_zone/Script/Scripts/common/Aethernet.cpp similarity index 100% rename from src/servers/sapphire_zone/Script/Scripts/aetheryte/Aethernet.cpp rename to src/servers/sapphire_zone/Script/Scripts/common/Aethernet.cpp diff --git a/src/servers/sapphire_zone/Script/Scripts/aetheryte/Aetheryte.cpp b/src/servers/sapphire_zone/Script/Scripts/common/Aetheryte.cpp similarity index 100% rename from src/servers/sapphire_zone/Script/Scripts/aetheryte/Aetheryte.cpp rename to src/servers/sapphire_zone/Script/Scripts/common/Aetheryte.cpp diff --git a/src/servers/sapphire_zone/Script/Scripts/CmnDef/CmnDefCutSceneReplay.cpp b/src/servers/sapphire_zone/Script/Scripts/common/CmnDefCutSceneReplay.cpp similarity index 100% rename from src/servers/sapphire_zone/Script/Scripts/CmnDef/CmnDefCutSceneReplay.cpp rename to src/servers/sapphire_zone/Script/Scripts/common/CmnDefCutSceneReplay.cpp diff --git a/src/servers/sapphire_zone/Script/Scripts/CmnDef/CmnDefInnBed.cpp b/src/servers/sapphire_zone/Script/Scripts/common/CmnDefInnBed.cpp similarity index 100% rename from src/servers/sapphire_zone/Script/Scripts/CmnDef/CmnDefInnBed.cpp rename to src/servers/sapphire_zone/Script/Scripts/common/CmnDefInnBed.cpp diff --git a/src/servers/sapphire_zone/Script/Scripts/CmnDef/CmnDefLinkShell.cpp b/src/servers/sapphire_zone/Script/Scripts/common/CmnDefLinkShell.cpp similarity index 100% rename from src/servers/sapphire_zone/Script/Scripts/CmnDef/CmnDefLinkShell.cpp rename to src/servers/sapphire_zone/Script/Scripts/common/CmnDefLinkShell.cpp diff --git a/src/servers/sapphire_zone/Script/Scripts/CmnDef/HouFurOrchestrion.cpp b/src/servers/sapphire_zone/Script/Scripts/common/HouFurOrchestrion.cpp similarity index 100% rename from src/servers/sapphire_zone/Script/Scripts/CmnDef/HouFurOrchestrion.cpp rename to src/servers/sapphire_zone/Script/Scripts/common/HouFurOrchestrion.cpp diff --git a/src/servers/sapphire_zone/Script/Scripts/opening/OpeningGridania.cpp b/src/servers/sapphire_zone/Script/Scripts/quest/opening/OpeningGridania.cpp similarity index 99% rename from src/servers/sapphire_zone/Script/Scripts/opening/OpeningGridania.cpp rename to src/servers/sapphire_zone/Script/Scripts/quest/opening/OpeningGridania.cpp index 9f6d6f0a..1541561c 100644 --- a/src/servers/sapphire_zone/Script/Scripts/opening/OpeningGridania.cpp +++ b/src/servers/sapphire_zone/Script/Scripts/quest/opening/OpeningGridania.cpp @@ -1,4 +1,4 @@ -#include "../ScriptObject.h" +#include class OpeningGridania : public EventScript { diff --git a/src/servers/sapphire_zone/Script/Scripts/opening/OpeningLimsa.cpp b/src/servers/sapphire_zone/Script/Scripts/quest/opening/OpeningLimsa.cpp similarity index 99% rename from src/servers/sapphire_zone/Script/Scripts/opening/OpeningLimsa.cpp rename to src/servers/sapphire_zone/Script/Scripts/quest/opening/OpeningLimsa.cpp index a40ea482..f30a2aed 100644 --- a/src/servers/sapphire_zone/Script/Scripts/opening/OpeningLimsa.cpp +++ b/src/servers/sapphire_zone/Script/Scripts/quest/opening/OpeningLimsa.cpp @@ -1,4 +1,4 @@ -#include "../ScriptObject.h" +#include // Opening Script: OpeningLimsaLominsa // Quest Name: OpeningLimsaLominsa diff --git a/src/servers/sapphire_zone/Script/Scripts/opening/OpeningUldah.cpp b/src/servers/sapphire_zone/Script/Scripts/quest/opening/OpeningUldah.cpp similarity index 99% rename from src/servers/sapphire_zone/Script/Scripts/opening/OpeningUldah.cpp rename to src/servers/sapphire_zone/Script/Scripts/quest/opening/OpeningUldah.cpp index fdd1c5d2..c780782e 100644 --- a/src/servers/sapphire_zone/Script/Scripts/opening/OpeningUldah.cpp +++ b/src/servers/sapphire_zone/Script/Scripts/quest/opening/OpeningUldah.cpp @@ -1,4 +1,4 @@ -#include "../ScriptObject.h" +#include class OpeningUldah : public EventScript { diff --git a/src/servers/sapphire_zone/Zone/InstanceContent.cpp b/src/servers/sapphire_zone/Zone/InstanceContent.cpp index 48f8fac9..6e9d689f 100644 --- a/src/servers/sapphire_zone/Zone/InstanceContent.cpp +++ b/src/servers/sapphire_zone/Zone/InstanceContent.cpp @@ -31,6 +31,7 @@ Core::InstanceContent::InstanceContent( boost::shared_ptr< Core::Data::InstanceC m_instanceContentId( instanceContentId ), m_state( Created ) { + m_instanceExpireTime = Util::getTimeSeconds() + ( m_instanceContentInfo->timeLimitmin * 60u ); } Core::InstanceContent::~InstanceContent() diff --git a/src/servers/sapphire_zone/Zone/InstanceContent.h b/src/servers/sapphire_zone/Zone/InstanceContent.h index 49bfedf7..23d873f7 100644 --- a/src/servers/sapphire_zone/Zone/InstanceContent.h +++ b/src/servers/sapphire_zone/Zone/InstanceContent.h @@ -46,6 +46,8 @@ private: uint32_t m_instanceContentId; InstanceContentState m_state; + int64_t m_instanceExpireTime; + }; } From 1e7c2adefbf9442d1b4d4a718af10718dc30ecf3 Mon Sep 17 00:00:00 2001 From: Adam Date: Fri, 9 Feb 2018 00:04:46 +1100 Subject: [PATCH 20/48] fix instance expire time --- src/servers/sapphire_zone/Zone/InstanceContent.cpp | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/servers/sapphire_zone/Zone/InstanceContent.cpp b/src/servers/sapphire_zone/Zone/InstanceContent.cpp index 6e9d689f..d88e88f2 100644 --- a/src/servers/sapphire_zone/Zone/InstanceContent.cpp +++ b/src/servers/sapphire_zone/Zone/InstanceContent.cpp @@ -31,7 +31,6 @@ Core::InstanceContent::InstanceContent( boost::shared_ptr< Core::Data::InstanceC m_instanceContentId( instanceContentId ), m_state( Created ) { - m_instanceExpireTime = Util::getTimeSeconds() + ( m_instanceContentInfo->timeLimitmin * 60u ); } Core::InstanceContent::~InstanceContent() @@ -103,6 +102,7 @@ void Core::InstanceContent::onUpdate( uint32_t currTime ) } m_state = DutyInProgress; + m_instanceExpireTime = Util::getTimeSeconds() + ( m_instanceContentInfo->timeLimitmin * 60u ); break; } From 979059401673b0b83ce6b83a641b89fe4d1352ea Mon Sep 17 00:00:00 2001 From: goaaats Date: Thu, 8 Feb 2018 15:05:29 +0100 Subject: [PATCH 21/48] Implement correct handling for private areas --- src/servers/sapphire_zone/Actor/Actor.cpp | 5 +++++ src/servers/sapphire_zone/Actor/Player.cpp | 3 +++ .../sapphire_zone/Network/PacketWrappers/PlayerSpawnPacket.h | 2 -- src/servers/sapphire_zone/Zone/TerritoryMgr.cpp | 3 ++- src/servers/sapphire_zone/Zone/Zone.cpp | 4 ++++ 5 files changed, 14 insertions(+), 3 deletions(-) diff --git a/src/servers/sapphire_zone/Actor/Actor.cpp b/src/servers/sapphire_zone/Actor/Actor.cpp index 657f7947..227657cf 100644 --- a/src/servers/sapphire_zone/Actor/Actor.cpp +++ b/src/servers/sapphire_zone/Actor/Actor.cpp @@ -22,9 +22,11 @@ #include "Math/CalcBattle.h" #include "Actor.h" #include "Player.h" +#include "Zone/TerritoryMgr.h" extern Core::ServerZone g_serverZone; extern Core::Data::ExdDataGenerated g_exdDataGen; +extern Core::TerritoryMgr g_territoryMgr; using namespace Core::Common; using namespace Core::Network::Packets; @@ -510,6 +512,9 @@ void Core::Entity::Actor::sendToInRangeSet( Network::Packets::GamePacketPtr pPac pSession->getZoneConnection()->queueOutPacket( pPacket ); } + if( g_territoryMgr.isPrivateTerritory( getCurrentZone()->getTerritoryId() ) ) + return; + if( m_inRangePlayers.empty() ) return; diff --git a/src/servers/sapphire_zone/Actor/Player.cpp b/src/servers/sapphire_zone/Actor/Player.cpp index 058623f0..ca71b217 100644 --- a/src/servers/sapphire_zone/Actor/Player.cpp +++ b/src/servers/sapphire_zone/Actor/Player.cpp @@ -825,6 +825,9 @@ void Core::Entity::Player::setLookAt( uint8_t index, uint8_t value ) // spawn this player for pTarget void Core::Entity::Player::spawn( Entity::PlayerPtr pTarget ) { + if( g_territoryMgr.isPrivateTerritory( getCurrentZone()->getTerritoryId() ) && pTarget->getId() != getId() ) + return; + g_log.debug( "[" + std::to_string( pTarget->getId() ) + "] Spawning " + getName() + " for " + pTarget->getName() ); diff --git a/src/servers/sapphire_zone/Network/PacketWrappers/PlayerSpawnPacket.h b/src/servers/sapphire_zone/Network/PacketWrappers/PlayerSpawnPacket.h index 61ad14fd..9c367aa9 100644 --- a/src/servers/sapphire_zone/Network/PacketWrappers/PlayerSpawnPacket.h +++ b/src/servers/sapphire_zone/Network/PacketWrappers/PlayerSpawnPacket.h @@ -32,8 +32,6 @@ namespace Server { void initialize( Entity::Player& player, Entity::Player& target ) { // todo: figure out unkown offsets - // TODO: temporary gm rank - //m_data.gmRank = 0xff; m_data.classJob = static_cast< uint8_t >( player.getClass() ); //m_data.status = static_cast< uint8_t >( pPlayer->getStatus() ); diff --git a/src/servers/sapphire_zone/Zone/TerritoryMgr.cpp b/src/servers/sapphire_zone/Zone/TerritoryMgr.cpp index 5c27c224..9c85b02f 100644 --- a/src/servers/sapphire_zone/Zone/TerritoryMgr.cpp +++ b/src/servers/sapphire_zone/Zone/TerritoryMgr.cpp @@ -116,7 +116,8 @@ bool Core::TerritoryMgr::createDefaultTerritories() "\t" + std::to_string( guid ) + "\t" + std::to_string( territoryInfo->territoryIntendedUse ) + "\t" + territoryInfo->name + - "\t" + pPlaceName->name ); + "\t" + pPlaceName->name + + "\t" + ( isPrivateTerritory( territoryId ) ? "PRIVATE" : "PUBLIC" ) ); ZonePtr pZone( new Zone( territoryId, guid, territoryInfo->name, pPlaceName->name ) ); pZone->init(); diff --git a/src/servers/sapphire_zone/Zone/Zone.cpp b/src/servers/sapphire_zone/Zone/Zone.cpp index bb79c84c..45868d8e 100644 --- a/src/servers/sapphire_zone/Zone/Zone.cpp +++ b/src/servers/sapphire_zone/Zone/Zone.cpp @@ -35,6 +35,7 @@ extern Core::Logger g_log; extern Core::ServerZone g_serverZone; extern Core::Data::ExdDataGenerated g_exdDataGen; extern Core::Scripting::ScriptManager g_scriptMgr; +extern Core::TerritoryMgr g_territoryMgr; namespace Core { @@ -369,6 +370,9 @@ void Zone::removeActor( Entity::ActorPtr pActor ) void Zone::queueOutPacketForRange( Entity::Player& sourcePlayer, uint32_t range, Network::Packets::GamePacketPtr pPacketEntry ) { + if( g_territoryMgr.isPrivateTerritory( getTerritoryId() ) ) + return; + for( auto it = m_playerMap.begin(); it != m_playerMap.end(); ++it ) { float distance = Math::Util::distance( sourcePlayer.getPos().x, From cb787b44f57bbf6c702039000f758dc22bd8b435 Mon Sep 17 00:00:00 2001 From: goaaats Date: Thu, 8 Feb 2018 15:25:59 +0100 Subject: [PATCH 22/48] Handle via inRangeSet --- src/servers/sapphire_zone/Actor/Actor.cpp | 3 --- src/servers/sapphire_zone/Actor/Player.cpp | 3 --- src/servers/sapphire_zone/Zone/Zone.cpp | 3 +++ 3 files changed, 3 insertions(+), 6 deletions(-) diff --git a/src/servers/sapphire_zone/Actor/Actor.cpp b/src/servers/sapphire_zone/Actor/Actor.cpp index 227657cf..a87e9c9b 100644 --- a/src/servers/sapphire_zone/Actor/Actor.cpp +++ b/src/servers/sapphire_zone/Actor/Actor.cpp @@ -512,9 +512,6 @@ void Core::Entity::Actor::sendToInRangeSet( Network::Packets::GamePacketPtr pPac pSession->getZoneConnection()->queueOutPacket( pPacket ); } - if( g_territoryMgr.isPrivateTerritory( getCurrentZone()->getTerritoryId() ) ) - return; - if( m_inRangePlayers.empty() ) return; diff --git a/src/servers/sapphire_zone/Actor/Player.cpp b/src/servers/sapphire_zone/Actor/Player.cpp index ca71b217..058623f0 100644 --- a/src/servers/sapphire_zone/Actor/Player.cpp +++ b/src/servers/sapphire_zone/Actor/Player.cpp @@ -825,9 +825,6 @@ void Core::Entity::Player::setLookAt( uint8_t index, uint8_t value ) // spawn this player for pTarget void Core::Entity::Player::spawn( Entity::PlayerPtr pTarget ) { - if( g_territoryMgr.isPrivateTerritory( getCurrentZone()->getTerritoryId() ) && pTarget->getId() != getId() ) - return; - g_log.debug( "[" + std::to_string( pTarget->getId() ) + "] Spawning " + getName() + " for " + pTarget->getName() ); diff --git a/src/servers/sapphire_zone/Zone/Zone.cpp b/src/servers/sapphire_zone/Zone/Zone.cpp index 45868d8e..ce9afa56 100644 --- a/src/servers/sapphire_zone/Zone/Zone.cpp +++ b/src/servers/sapphire_zone/Zone/Zone.cpp @@ -725,6 +725,9 @@ void Zone::updateInRangeSet( Entity::ActorPtr pActor, Cell* pCell ) if( pCell == nullptr ) return; + if( g_territoryMgr.isPrivateTerritory( getTerritoryId() ) ) + return; + Entity::ActorPtr pCurAct; auto iter = pCell->m_actors.begin(); From abf1194a7ae2b6568c936b9690cfb9256f834ee5 Mon Sep 17 00:00:00 2001 From: Mordred <30826167+SapphireMordred@users.noreply.github.com> Date: Thu, 8 Feb 2018 15:29:46 +0100 Subject: [PATCH 23/48] comment added --- src/servers/sapphire_zone/Zone/Zone.cpp | 1 + 1 file changed, 1 insertion(+) diff --git a/src/servers/sapphire_zone/Zone/Zone.cpp b/src/servers/sapphire_zone/Zone/Zone.cpp index ce9afa56..7e67c7ca 100644 --- a/src/servers/sapphire_zone/Zone/Zone.cpp +++ b/src/servers/sapphire_zone/Zone/Zone.cpp @@ -725,6 +725,7 @@ void Zone::updateInRangeSet( Entity::ActorPtr pActor, Cell* pCell ) if( pCell == nullptr ) return; + // TODO: make sure gms can overwrite this. Potentially temporary solution if( g_territoryMgr.isPrivateTerritory( getTerritoryId() ) ) return; From d3bdd8856a6df8f436a4682606674244d8004f9a Mon Sep 17 00:00:00 2001 From: Adam Date: Fri, 9 Feb 2018 02:34:43 +1100 Subject: [PATCH 24/48] instance scripting stuff --- src/servers/sapphire_zone/Forwards.h | 1 + .../sapphire_zone/Script/NativeScriptApi.h | 22 ++++++++++++---- .../sapphire_zone/Script/ScriptManager.cpp | 26 ++++++++++++++++++- .../sapphire_zone/Script/ScriptManager.h | 2 ++ .../Script/Scripts/CMakeLists.txt | 2 +- .../Script/Scripts/ScriptLoader.cpp.in | 3 --- .../Scripts/instances/trials/TheNavel.cpp | 19 ++++++++++++++ .../sapphire_zone/Zone/InstanceContent.cpp | 5 ++++ 8 files changed, 70 insertions(+), 10 deletions(-) create mode 100644 src/servers/sapphire_zone/Script/Scripts/instances/trials/TheNavel.cpp diff --git a/src/servers/sapphire_zone/Forwards.h b/src/servers/sapphire_zone/Forwards.h index 54bfaa1a..8038a008 100644 --- a/src/servers/sapphire_zone/Forwards.h +++ b/src/servers/sapphire_zone/Forwards.h @@ -13,6 +13,7 @@ namespace Core { TYPE_FORWARD( Cell ); TYPE_FORWARD( Zone ); + TYPE_FORWARD( InstanceContent ); TYPE_FORWARD( Item ); TYPE_FORWARD( ItemContainer ); TYPE_FORWARD( Inventory ); diff --git a/src/servers/sapphire_zone/Script/NativeScriptApi.h b/src/servers/sapphire_zone/Script/NativeScriptApi.h index 72c0fac6..893dc6cd 100644 --- a/src/servers/sapphire_zone/Script/NativeScriptApi.h +++ b/src/servers/sapphire_zone/Script/NativeScriptApi.h @@ -8,6 +8,7 @@ #include #include #include +#include #ifdef _MSC_VER #define EXPORT __declspec( dllexport ) @@ -48,7 +49,7 @@ public: class StatusEffectScript : public ScriptObject { public: - StatusEffectScript( uint32_t effectId ) : + explicit StatusEffectScript( uint32_t effectId ) : ScriptObject( effectId, typeid( StatusEffectScript ).hash_code() ) { } @@ -66,7 +67,7 @@ public: class ActionScript : public ScriptObject { public: - ActionScript( uint32_t abilityId ) : + explicit ActionScript( uint32_t abilityId ) : ScriptObject( abilityId, typeid( ActionScript ).hash_code() ) { } @@ -79,7 +80,7 @@ public: class EventScript : public ScriptObject { public: - EventScript( uint32_t questId ) : + explicit EventScript( uint32_t questId ) : ScriptObject( questId, typeid( EventScript ).hash_code() ) { } @@ -97,7 +98,7 @@ public: class BattleNpcScript : public ScriptObject { public: - BattleNpcScript( uint32_t npcId ) : + explicit BattleNpcScript( uint32_t npcId ) : ScriptObject( npcId, typeid( BattleNpcScript ).hash_code() ) { } }; @@ -105,11 +106,22 @@ public: class ZoneScript : public ScriptObject { public: - ZoneScript( uint32_t zoneId ) : + explicit ZoneScript( uint32_t zoneId ) : ScriptObject( zoneId, typeid( ZoneScript ).hash_code() ) { } virtual void onZoneInit() { } }; +class InstanceContentScript : public ScriptObject +{ +public: + explicit InstanceContentScript( uint32_t instanceContentId ) : + ScriptObject( instanceContentId, typeid( InstanceContentScript ).hash_code() ) + { } + + virtual void onInit( InstanceContent& instance ) { } + virtual void onUpdate( InstanceContent& instance, uint32_t currTime ) { } +}; + #endif \ No newline at end of file diff --git a/src/servers/sapphire_zone/Script/ScriptManager.cpp b/src/servers/sapphire_zone/Script/ScriptManager.cpp index 2467fa07..d6024b81 100644 --- a/src/servers/sapphire_zone/Script/ScriptManager.cpp +++ b/src/servers/sapphire_zone/Script/ScriptManager.cpp @@ -332,7 +332,7 @@ bool Core::Scripting::ScriptManager::onStatusTimeOut( Entity::ActorPtr pActor, u bool Core::Scripting::ScriptManager::onZoneInit( ZonePtr pZone ) { - auto script = m_nativeScriptManager->getScript< ZoneScript >(pZone->getTerritoryId() ); + auto script = m_nativeScriptManager->getScript< ZoneScript >( pZone->getTerritoryId() ); if( script ) { script->onZoneInit(); @@ -342,6 +342,30 @@ bool Core::Scripting::ScriptManager::onZoneInit( ZonePtr pZone ) return false; } +bool Core::Scripting::ScriptManager::onInstanceInit( InstanceContent& instance ) +{ + auto script = m_nativeScriptManager->getScript< InstanceContentScript >( instance.getInstanceContentId() ); + if( script ) + { + script->onInit( instance ); + return true; + } + + return false; +} + +bool Core::Scripting::ScriptManager::onInstanceUpdate( InstanceContent& instance, uint32_t currTime ) +{ + auto script = m_nativeScriptManager->getScript< InstanceContentScript >( instance.getInstanceContentId() ); + if( script ) + { + script->onUpdate( instance, currTime ); + return true; + } + + return false; +} + Scripting::NativeScriptManager& Core::Scripting::ScriptManager::getNativeScriptHandler() { return *m_nativeScriptManager; diff --git a/src/servers/sapphire_zone/Script/ScriptManager.h b/src/servers/sapphire_zone/Script/ScriptManager.h index 958412a0..634afefb 100644 --- a/src/servers/sapphire_zone/Script/ScriptManager.h +++ b/src/servers/sapphire_zone/Script/ScriptManager.h @@ -59,6 +59,8 @@ namespace Core bool onEventHandlerReturn( Entity::Player& player, uint32_t eventId, uint16_t subEvent, uint16_t param1, uint16_t param2, uint16_t param3 ); bool onEventHandlerTradeReturn( Entity::Player& player, uint32_t eventId, uint16_t subEvent, uint16_t param, uint32_t catalogId ); + bool onInstanceInit( InstanceContent& instance ); + bool onInstanceUpdate( InstanceContent& instance, uint32_t currTime ); void loadDir( const std::string& dirname, std::set &files, const std::string& ext ); diff --git a/src/servers/sapphire_zone/Script/Scripts/CMakeLists.txt b/src/servers/sapphire_zone/Script/Scripts/CMakeLists.txt index aeaa0094..5b1dedf1 100644 --- a/src/servers/sapphire_zone/Script/Scripts/CMakeLists.txt +++ b/src/servers/sapphire_zone/Script/Scripts/CMakeLists.txt @@ -39,7 +39,7 @@ foreach(_scriptDir ${children}) endforeach() add_library("script_${_name}" MODULE "${SCRIPT_FILES}" "${SCRIPT_INCLUDE_FILES}" "${_scriptDir}/ScriptLoader.cpp") - target_link_libraries("script_${_name}" sapphire_zone) + target_link_libraries("script_${_name}" sapphire_zone ${Boost_LIBRARIES}) if(MSVC) set_target_properties("script_${_name}" PROPERTIES diff --git a/src/servers/sapphire_zone/Script/Scripts/ScriptLoader.cpp.in b/src/servers/sapphire_zone/Script/Scripts/ScriptLoader.cpp.in index 4530fb82..739b32af 100644 --- a/src/servers/sapphire_zone/Script/Scripts/ScriptLoader.cpp.in +++ b/src/servers/sapphire_zone/Script/Scripts/ScriptLoader.cpp.in @@ -1,8 +1,5 @@ -#include #include