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