From 2f6bc9e1ebc1a398e6500cbd920b93a1fd2a22eb Mon Sep 17 00:00:00 2001 From: Adam Date: Sat, 10 Feb 2018 14:03:59 +1100 Subject: [PATCH 1/6] instane obj spawning --- src/common/Network/PacketDef/Ipcs.h | 1 + .../Network/PacketDef/Zone/ServerZoneDef.h | 22 +++++++++++ src/servers/sapphire_zone/Actor/Actor.h | 1 + .../sapphire_zone/Actor/InstanceObject.cpp | 5 ++- .../DebugCommand/DebugCommandHandler.cpp | 39 +++++++++++++++++++ .../sapphire_zone/Zone/InstanceContent.cpp | 20 +++++++++- 6 files changed, 85 insertions(+), 3 deletions(-) diff --git a/src/common/Network/PacketDef/Ipcs.h b/src/common/Network/PacketDef/Ipcs.h index f2bd0e15..1f235cad 100644 --- a/src/common/Network/PacketDef/Ipcs.h +++ b/src/common/Network/PacketDef/Ipcs.h @@ -103,6 +103,7 @@ namespace Packets { ActorSetPos = 0x0160, // updated 4.2 ActorCast = 0x0162, // updated 4.2 HateList = 0x0165, // updated 4.2 + ObjectControl = 0x0167, // updated 4.2 UpdateClassInfo = 0x0169, // updated 4.2 InitUI = 0x016B, // updated 4.2 diff --git a/src/common/Network/PacketDef/Zone/ServerZoneDef.h b/src/common/Network/PacketDef/Zone/ServerZoneDef.h index 29bf329a..330f727d 100644 --- a/src/common/Network/PacketDef/Zone/ServerZoneDef.h +++ b/src/common/Network/PacketDef/Zone/ServerZoneDef.h @@ -1316,6 +1316,28 @@ struct FFXIVIpcMSQTrackerComplete : FFXIVIpcBasePacket uint64_t padding4; // last 4 bytes is uint32_t but who cares }; +struct FFXIVIpcObjectControl : FFXIVIpcBasePacket +{ + uint8_t count; + uint8_t objKind; + uint8_t unknown2; + uint8_t state; + uint32_t objId; + uint32_t actorId; + uint32_t levelId; + uint32_t unknown10; + uint32_t someActorId14; + uint32_t hierachyId; + uint32_t unknown1C; + uint32_t unknown20; + uint32_t unknown24; + uint32_t unknown28; + uint32_t unknown2c; + Common::FFXIVARR_POSITION3 position; + int16_t rotation; + int16_t unknown; +}; + } /* Server */ } /* Packets */ diff --git a/src/servers/sapphire_zone/Actor/Actor.h b/src/servers/sapphire_zone/Actor/Actor.h index d6dada1f..881508e6 100644 --- a/src/servers/sapphire_zone/Actor/Actor.h +++ b/src/servers/sapphire_zone/Actor/Actor.h @@ -37,6 +37,7 @@ public: Housing = 0x0C, Cutscene = 0x0D, CardStand = 0x0E, + Exit = 0x0F, }; enum Stance : uint8_t diff --git a/src/servers/sapphire_zone/Actor/InstanceObject.cpp b/src/servers/sapphire_zone/Actor/InstanceObject.cpp index 4e7a474f..cf6ae9ad 100644 --- a/src/servers/sapphire_zone/Actor/InstanceObject.cpp +++ b/src/servers/sapphire_zone/Actor/InstanceObject.cpp @@ -3,7 +3,8 @@ Core::Entity::InstanceObject::InstanceObject( uint32_t objectId, uint32_t hierachyId ) : Core::Entity::GameObject( ObjKind::EventObj ), - m_hierachyId( hierachyId ) + m_hierachyId( hierachyId ), + m_state( 0 ) { m_id = objectId; } @@ -33,7 +34,7 @@ void Core::Entity::InstanceObject::setState( uint8_t state ) { m_state = state; - m_parentInstance->updateInstanceObj( InstanceObjectPtr( this ) ); + //m_parentInstance->updateInstanceObj( InstanceObjectPtr( this ) ); } void Core::Entity::InstanceObject::setParentInstance( Core::InstanceContentPtr instance ) diff --git a/src/servers/sapphire_zone/DebugCommand/DebugCommandHandler.cpp b/src/servers/sapphire_zone/DebugCommand/DebugCommandHandler.cpp index 76de7471..10e7e84c 100644 --- a/src/servers/sapphire_zone/DebugCommand/DebugCommandHandler.cpp +++ b/src/servers/sapphire_zone/DebugCommand/DebugCommandHandler.cpp @@ -768,6 +768,45 @@ void Core::DebugCommandHandler::instance( char* data, Entity::Player &player, bo instance->setVar( static_cast< uint8_t >( index ), static_cast< uint8_t >( value ) ); } + else if( subCommand == "objupdate" ) + { + uint32_t instanceId; + uint32_t objId; + + sscanf( params.c_str(), "%d %d", &instanceId, &objId ); + + auto pInstance = g_territoryMgr.getInstanceZonePtr( instanceId ); + if( !pInstance ) + return; + + auto instance = boost::dynamic_pointer_cast< InstanceContent >( pInstance ); + + auto obj = instance->getInstanceObject( objId ); + if( !obj ) + return; + + instance->updateInstanceObj( obj ); + } + else if( subCommand == "objstate" ) + { + uint32_t instanceId; + uint32_t objId; + uint32_t state; + + sscanf( params.c_str(), "%d %d %d", &instanceId, &objId, &state ); + + auto pInstance = g_territoryMgr.getInstanceZonePtr( instanceId ); + if( !pInstance ) + return; + + auto instance = boost::dynamic_pointer_cast< InstanceContent >( pInstance ); + + auto obj = instance->getInstanceObject( objId ); + if( !obj ) + return; + + obj->setState( state ); + } else if( subCommand == "festival" ) { uint32_t festivalId; diff --git a/src/servers/sapphire_zone/Zone/InstanceContent.cpp b/src/servers/sapphire_zone/Zone/InstanceContent.cpp index 7f5a5906..f8375f40 100644 --- a/src/servers/sapphire_zone/Zone/InstanceContent.cpp +++ b/src/servers/sapphire_zone/Zone/InstanceContent.cpp @@ -222,6 +222,8 @@ void Core::InstanceContent::registerInstanceObj( Core::Entity::InstanceObjectPtr object->setParentInstance( InstanceContentPtr( this ) ); m_instanceObjects[object->getId()] = object; + + g_log.debug("Registered instance eobj: " + std::to_string( object->getId() ) ); } Core::Entity::InstanceObjectPtr Core::InstanceContent::getInstanceObject( uint32_t objId ) @@ -238,8 +240,24 @@ void Core::InstanceContent::updateInstanceObj( Core::Entity::InstanceObjectPtr o if( !object ) return; - for( const auto& playerId : m_playerMap ) + for( const auto& playerIt : m_playerMap ) { // send that packet with le data + ZoneChannelPacket< FFXIVIpcObjectControl > eobjStatePacket( playerIt.second->getId() ); + eobjStatePacket.data().objKind = object->getObjKind(); + eobjStatePacket.data().state = object->getState(); + eobjStatePacket.data().objId = object->getId(); + eobjStatePacket.data().hierachyId = object->getHierachyId(); + eobjStatePacket.data().position = object->getPos(); + + // ???? + //eobjStatePacket.data().levelId = 4236873; + //eobjStatePacket.data().unknown2 = 5; + //eobjStatePacket.data().unknown1C = 1065353216; + //eobjStatePacket.data().unknown20 = 2147423605; + //eobjStatePacket.data().actorId = 1074105831; + //eobjStatePacket.data().unknown = 1; + + playerIt.second->queuePacket( eobjStatePacket ); } } \ No newline at end of file From cc3ceeebd53bfe6d39a49b980a97760848b97b33 Mon Sep 17 00:00:00 2001 From: Adam Date: Sat, 10 Feb 2018 15:45:06 +1100 Subject: [PATCH 2/6] fix indentation --- src/common/Network/PacketDef/Ipcs.h | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/common/Network/PacketDef/Ipcs.h b/src/common/Network/PacketDef/Ipcs.h index 1f235cad..75c783c5 100644 --- a/src/common/Network/PacketDef/Ipcs.h +++ b/src/common/Network/PacketDef/Ipcs.h @@ -103,7 +103,7 @@ namespace Packets { ActorSetPos = 0x0160, // updated 4.2 ActorCast = 0x0162, // updated 4.2 HateList = 0x0165, // updated 4.2 - ObjectControl = 0x0167, // updated 4.2 + ObjectControl = 0x0167, // updated 4.2 UpdateClassInfo = 0x0169, // updated 4.2 InitUI = 0x016B, // updated 4.2 From 69a0af66e5911602bf63a1ccc53c1bcb3d6ee664 Mon Sep 17 00:00:00 2001 From: Adam Date: Sat, 10 Feb 2018 17:56:03 +1100 Subject: [PATCH 3/6] [huge brain image] --- src/servers/sapphire_lobby/Forwards.h | 1 + 1 file changed, 1 insertion(+) diff --git a/src/servers/sapphire_lobby/Forwards.h b/src/servers/sapphire_lobby/Forwards.h index d4b91cce..8771e953 100644 --- a/src/servers/sapphire_lobby/Forwards.h +++ b/src/servers/sapphire_lobby/Forwards.h @@ -2,6 +2,7 @@ #define _FORWARDS_H #include +#include #include #define TYPE_FORWARD( x ) \ From 3d1555209ebaf3abafbd53cffa45da5dfe0743b6 Mon Sep 17 00:00:00 2001 From: Adam Date: Sat, 10 Feb 2018 21:51:02 +1100 Subject: [PATCH 4/6] rename objectcontrol -> objectspawn --- src/common/Network/PacketDef/Ipcs.h | 2 +- src/common/Network/PacketDef/Zone/ServerZoneDef.h | 2 +- src/servers/sapphire_zone/Zone/InstanceContent.cpp | 4 ++-- 3 files changed, 4 insertions(+), 4 deletions(-) diff --git a/src/common/Network/PacketDef/Ipcs.h b/src/common/Network/PacketDef/Ipcs.h index 75c783c5..d0d8052e 100644 --- a/src/common/Network/PacketDef/Ipcs.h +++ b/src/common/Network/PacketDef/Ipcs.h @@ -103,7 +103,7 @@ namespace Packets { ActorSetPos = 0x0160, // updated 4.2 ActorCast = 0x0162, // updated 4.2 HateList = 0x0165, // updated 4.2 - ObjectControl = 0x0167, // updated 4.2 + ObjectSpawn = 0x0167, // updated 4.2 UpdateClassInfo = 0x0169, // updated 4.2 InitUI = 0x016B, // updated 4.2 diff --git a/src/common/Network/PacketDef/Zone/ServerZoneDef.h b/src/common/Network/PacketDef/Zone/ServerZoneDef.h index 330f727d..aba88ad3 100644 --- a/src/common/Network/PacketDef/Zone/ServerZoneDef.h +++ b/src/common/Network/PacketDef/Zone/ServerZoneDef.h @@ -1316,7 +1316,7 @@ struct FFXIVIpcMSQTrackerComplete : FFXIVIpcBasePacket uint64_t padding4; // last 4 bytes is uint32_t but who cares }; -struct FFXIVIpcObjectControl : FFXIVIpcBasePacket +struct FFXIVIpcObjectSpawn : FFXIVIpcBasePacket { uint8_t count; uint8_t objKind; diff --git a/src/servers/sapphire_zone/Zone/InstanceContent.cpp b/src/servers/sapphire_zone/Zone/InstanceContent.cpp index d5c3f94e..777138db 100644 --- a/src/servers/sapphire_zone/Zone/InstanceContent.cpp +++ b/src/servers/sapphire_zone/Zone/InstanceContent.cpp @@ -223,7 +223,7 @@ void Core::InstanceContent::registerInstanceObj( Core::Entity::InstanceObjectPtr m_instanceObjects[object->getId()] = object; - g_log.debug("Registered instance eobj: " + std::to_string( object->getId() ) ); + g_log.debug( "Registered instance eobj: " + std::to_string( object->getId() ) ); } Core::Entity::InstanceObjectPtr Core::InstanceContent::getInstanceObject( uint32_t objId ) @@ -243,7 +243,7 @@ void Core::InstanceContent::updateInstanceObj( Core::Entity::InstanceObjectPtr o for( const auto& playerIt : m_playerMap ) { // send that packet with le data - ZoneChannelPacket< FFXIVIpcObjectControl > eobjStatePacket( playerIt.second->getId() ); + ZoneChannelPacket< FFXIVIpcObjectSpawn > eobjStatePacket( playerIt.second->getId() ); eobjStatePacket.data().objKind = object->getObjKind(); eobjStatePacket.data().state = object->getState(); eobjStatePacket.data().objId = object->getId(); From 31a9ed45a624bf12ff809b32977e7c0ab11d4bc4 Mon Sep 17 00:00:00 2001 From: Adam Date: Sat, 10 Feb 2018 21:53:16 +1100 Subject: [PATCH 5/6] move instance objects to zone from instancecontent --- .../sapphire_zone/Zone/InstanceContent.cpp | 50 ------------------- .../sapphire_zone/Zone/InstanceContent.h | 7 --- src/servers/sapphire_zone/Zone/Zone.cpp | 48 ++++++++++++++++++ src/servers/sapphire_zone/Zone/Zone.h | 9 ++++ 4 files changed, 57 insertions(+), 57 deletions(-) diff --git a/src/servers/sapphire_zone/Zone/InstanceContent.cpp b/src/servers/sapphire_zone/Zone/InstanceContent.cpp index 777138db..c4fc6514 100644 --- a/src/servers/sapphire_zone/Zone/InstanceContent.cpp +++ b/src/servers/sapphire_zone/Zone/InstanceContent.cpp @@ -4,8 +4,6 @@ #include #include #include -#include -#include #include "Event/Director.h" #include "Script/ScriptManager.h" @@ -212,52 +210,4 @@ void Core::InstanceContent::setVar( uint8_t index, uint8_t value ) { sendDirectorVars( *playerIt.second ); } -} - -void Core::InstanceContent::registerInstanceObj( Core::Entity::InstanceObjectPtr object ) -{ - if( !object ) - return; - - object->setParentInstance( InstanceContentPtr( this ) ); - - m_instanceObjects[object->getId()] = object; - - g_log.debug( "Registered instance eobj: " + std::to_string( object->getId() ) ); -} - -Core::Entity::InstanceObjectPtr Core::InstanceContent::getInstanceObject( uint32_t objId ) -{ - auto obj = m_instanceObjects.find( objId ); - if( obj == m_instanceObjects.end() ) - return nullptr; - - return obj->second; -} - -void Core::InstanceContent::updateInstanceObj( Core::Entity::InstanceObjectPtr object ) -{ - if( !object ) - return; - - for( const auto& playerIt : m_playerMap ) - { - // send that packet with le data - ZoneChannelPacket< FFXIVIpcObjectSpawn > eobjStatePacket( playerIt.second->getId() ); - eobjStatePacket.data().objKind = object->getObjKind(); - eobjStatePacket.data().state = object->getState(); - eobjStatePacket.data().objId = object->getId(); - eobjStatePacket.data().hierachyId = object->getHierachyId(); - eobjStatePacket.data().position = object->getPos(); - - // ???? - //eobjStatePacket.data().levelId = 4236873; - //eobjStatePacket.data().unknown2 = 5; - //eobjStatePacket.data().unknown1C = 1065353216; - //eobjStatePacket.data().unknown20 = 2147423605; - //eobjStatePacket.data().actorId = 1074105831; - //eobjStatePacket.data().unknown = 1; - - playerIt.second->queuePacket( eobjStatePacket ); - } } \ No newline at end of file diff --git a/src/servers/sapphire_zone/Zone/InstanceContent.h b/src/servers/sapphire_zone/Zone/InstanceContent.h index 72b7b958..318b82c7 100644 --- a/src/servers/sapphire_zone/Zone/InstanceContent.h +++ b/src/servers/sapphire_zone/Zone/InstanceContent.h @@ -5,7 +5,6 @@ #include "Event/Director.h" #include "Forwards.h" #include -#include "Actor/InstanceObject.h" namespace Core { @@ -36,10 +35,6 @@ public: void setVar( uint8_t index, uint8_t value ); - void registerInstanceObj( Entity::InstanceObjectPtr object ); - Entity::InstanceObjectPtr getInstanceObject( uint32_t objId ); - void updateInstanceObj( Entity::InstanceObjectPtr object ); - Core::Data::ExdDataGenerated::InstanceContentPtr getInstanceContentInfo() const; uint32_t getInstanceContentId() const; @@ -51,8 +46,6 @@ private: InstanceContentState m_state; int64_t m_instanceExpireTime; - - std::unordered_map< uint32_t, Core::Entity::InstanceObjectPtr > m_instanceObjects; }; } diff --git a/src/servers/sapphire_zone/Zone/Zone.cpp b/src/servers/sapphire_zone/Zone/Zone.cpp index 11a5f2ac..7e60d488 100644 --- a/src/servers/sapphire_zone/Zone/Zone.cpp +++ b/src/servers/sapphire_zone/Zone/Zone.cpp @@ -831,3 +831,51 @@ void Zone::onInitDirector( Entity::Player& player ) } } + +void Core::Zone::registerInstanceObj( Core::Entity::InstanceObjectPtr object ) +{ + if( !object ) + return; + + //object->setParentInstance( InstanceContentPtr( this ) ); + + m_instanceObjects[object->getId()] = object; + + g_log.debug( "Registered instance eobj: " + std::to_string( object->getId() ) ); +} + +Core::Entity::InstanceObjectPtr Core::Zone::getInstanceObject( uint32_t objId ) +{ + auto obj = m_instanceObjects.find( objId ); + if( obj == m_instanceObjects.end() ) + return nullptr; + + return obj->second; +} + +void Core::Zone::updateInstanceObj( Core::Entity::InstanceObjectPtr object ) +{ + if( !object ) + return; + + for( const auto& playerIt : m_playerMap ) + { + // send that packet with le data + Network::Packets::ZoneChannelPacket< Network::Packets::Server::FFXIVIpcObjectSpawn > eobjStatePacket( playerIt.second->getId() ); + eobjStatePacket.data().objKind = object->getObjKind(); + eobjStatePacket.data().state = object->getState(); + eobjStatePacket.data().objId = object->getId(); + eobjStatePacket.data().hierachyId = object->getHierachyId(); + eobjStatePacket.data().position = object->getPos(); + + // ???? + //eobjStatePacket.data().levelId = 4236873; + //eobjStatePacket.data().unknown2 = 5; + //eobjStatePacket.data().unknown1C = 1065353216; + //eobjStatePacket.data().unknown20 = 2147423605; + //eobjStatePacket.data().actorId = 1074105831; + //eobjStatePacket.data().unknown = 1; + + playerIt.second->queuePacket( eobjStatePacket ); + } +} diff --git a/src/servers/sapphire_zone/Zone/Zone.h b/src/servers/sapphire_zone/Zone/Zone.h index 68f11ee0..a898a802 100644 --- a/src/servers/sapphire_zone/Zone/Zone.h +++ b/src/servers/sapphire_zone/Zone/Zone.h @@ -6,6 +6,7 @@ #include "Cell.h" #include "CellHandler.h" +#include "Actor/InstanceObject.h" #include "Forwards.h" @@ -52,6 +53,8 @@ protected: std::map< uint8_t, int32_t> m_weatherRateMap; + std::unordered_map< uint32_t, Core::Entity::InstanceObjectPtr > m_instanceObjects; + public: Zone(); @@ -107,6 +110,12 @@ public: bool update( uint32_t currTime ); + void registerInstanceObj( Entity::InstanceObjectPtr object ); + Entity::InstanceObjectPtr getInstanceObject( uint32_t objId ); + void updateInstanceObj( Entity::InstanceObjectPtr object ); + + InstanceContentPtr getAsInstanceContent(); + }; } From 8280700e815507eb6cc4e7cf346e002d7206904f Mon Sep 17 00:00:00 2001 From: Adam Date: Sat, 10 Feb 2018 22:35:02 +1100 Subject: [PATCH 6/6] huhuhu --- .../DebugCommand/DebugCommandHandler.cpp | 20 +++++++------------ 1 file changed, 7 insertions(+), 13 deletions(-) diff --git a/src/servers/sapphire_zone/DebugCommand/DebugCommandHandler.cpp b/src/servers/sapphire_zone/DebugCommand/DebugCommandHandler.cpp index 1f3cd889..f7ec1bef 100644 --- a/src/servers/sapphire_zone/DebugCommand/DebugCommandHandler.cpp +++ b/src/servers/sapphire_zone/DebugCommand/DebugCommandHandler.cpp @@ -770,17 +770,14 @@ void Core::DebugCommandHandler::instance( char* data, Entity::Player &player, bo } else if( subCommand == "objupdate" ) { - uint32_t instanceId; uint32_t objId; - sscanf( params.c_str(), "%d %d", &instanceId, &objId ); + sscanf( params.c_str(), "%d", &objId ); - auto pInstance = g_territoryMgr.getInstanceZonePtr( instanceId ); - if( !pInstance ) + auto instance = boost::dynamic_pointer_cast< InstanceContent >( player.getCurrentZone() ); + if( !instance ) return; - auto instance = boost::dynamic_pointer_cast< InstanceContent >( pInstance ); - auto obj = instance->getInstanceObject( objId ); if( !obj ) return; @@ -789,18 +786,15 @@ void Core::DebugCommandHandler::instance( char* data, Entity::Player &player, bo } else if( subCommand == "objstate" ) { - uint32_t instanceId; uint32_t objId; - uint32_t state; + uint8_t state; - sscanf( params.c_str(), "%d %d %d", &instanceId, &objId, &state ); + sscanf( params.c_str(), "%d %hhu", &objId, &state ); - auto pInstance = g_territoryMgr.getInstanceZonePtr( instanceId ); - if( !pInstance ) + auto instance = boost::dynamic_pointer_cast< InstanceContent >( player.getCurrentZone() ); + if( !instance ) return; - auto instance = boost::dynamic_pointer_cast< InstanceContent >( pInstance ); - auto obj = instance->getInstanceObject( objId ); if( !obj ) return;