diff --git a/src/servers/sapphire_zone/Actor/GameObject.cpp b/src/servers/sapphire_zone/Actor/GameObject.cpp index 44ade97c..d3fda65e 100644 --- a/src/servers/sapphire_zone/Actor/GameObject.cpp +++ b/src/servers/sapphire_zone/Actor/GameObject.cpp @@ -5,3 +5,55 @@ Core::Entity::GameObject::GameObject( ObjKind type ) : { } + +uint32_t Core::Entity::GameObject::getId() const +{ + return m_id; +} + +Core::Entity::GameObject::ObjKind Core::Entity::GameObject::getObjKind() const +{ + return m_objKind; +} + +Core::Common::FFXIVARR_POSITION3& Core::Entity::GameObject::getPos() +{ + return m_pos; +} + +void Core::Entity::GameObject::setPos( float x, float y, float z ) +{ + m_pos.x = x; + m_pos.y = y; + m_pos.z = z; +} + +void Core::Entity::GameObject::setPos( const Core::Common::FFXIVARR_POSITION3& pos ) +{ + m_pos = pos; +} + +float Core::Entity::GameObject::getRot() const +{ + return m_rot; +} + +void Core::Entity::GameObject::setRot( float rot ) +{ + m_rot = rot; +} + +bool Core::Entity::GameObject::isPlayer() const +{ + return m_objKind == ObjKind::Player; +} + +bool Core::Entity::GameObject::isBNpc() const +{ + return m_objKind == ObjKind::BattleNpc; +} + +bool Core::Entity::GameObject::isENpc() const +{ + return m_objKind == ObjKind::EventNpc; +} \ No newline at end of file diff --git a/src/servers/sapphire_zone/Actor/GameObject.h b/src/servers/sapphire_zone/Actor/GameObject.h index fe1efe03..89cb020a 100644 --- a/src/servers/sapphire_zone/Actor/GameObject.h +++ b/src/servers/sapphire_zone/Actor/GameObject.h @@ -50,8 +50,8 @@ namespace Core { ObjKind m_objKind; public: - GameObject( ObjKind type ); - virtual ~GameObject() {}; + explicit GameObject( ObjKind type ); + //virtual ~GameObject() {}; uint32_t getId() const; diff --git a/src/servers/sapphire_zone/Actor/InstanceObject.cpp b/src/servers/sapphire_zone/Actor/InstanceObject.cpp new file mode 100644 index 00000000..4e7a474f --- /dev/null +++ b/src/servers/sapphire_zone/Actor/InstanceObject.cpp @@ -0,0 +1,47 @@ +#include "InstanceObject.h" +#include "Zone/InstanceContent.h" + +Core::Entity::InstanceObject::InstanceObject( uint32_t objectId, uint32_t hierachyId ) : + Core::Entity::GameObject( ObjKind::EventObj ), + m_hierachyId( hierachyId ) +{ + m_id = objectId; +} + +Core::Entity::InstanceObject::InstanceObject( uint32_t objectId, uint32_t hierachyId, Common::FFXIVARR_POSITION3 pos ) + : InstanceObject( objectId, hierachyId ) +{ + +} + +uint32_t Core::Entity::InstanceObject::getHierachyId() const +{ + return m_hierachyId; +} + +void Core::Entity::InstanceObject::setHierachyId( uint32_t hierachyId ) +{ + m_hierachyId = hierachyId; +} + +uint8_t Core::Entity::InstanceObject::getState() const +{ + return m_state; +} + +void Core::Entity::InstanceObject::setState( uint8_t state ) +{ + m_state = state; + + m_parentInstance->updateInstanceObj( InstanceObjectPtr( this ) ); +} + +void Core::Entity::InstanceObject::setParentInstance( Core::InstanceContentPtr instance ) +{ + m_parentInstance = instance; +} + +Core::InstanceContentPtr Core::Entity::InstanceObject::getParentInstance() const +{ + return m_parentInstance; +} \ No newline at end of file diff --git a/src/servers/sapphire_zone/Actor/InstanceObject.h b/src/servers/sapphire_zone/Actor/InstanceObject.h new file mode 100644 index 00000000..03ed1f47 --- /dev/null +++ b/src/servers/sapphire_zone/Actor/InstanceObject.h @@ -0,0 +1,33 @@ +#ifndef SAPPHIRE_INSTANCEOBJECT_H +#define SAPPHIRE_INSTANCEOBJECT_H + +#include "GameObject.h" + +namespace Core +{ +namespace Entity +{ + class InstanceObject : public GameObject + { + public: + InstanceObject( uint32_t objectId, uint32_t hierachyId ); + InstanceObject( uint32_t objectId, uint32_t hierachyId, Common::FFXIVARR_POSITION3 pos ); + + uint32_t getHierachyId() const; + void setHierachyId( uint32_t hierachyId ); + + uint8_t getState() const; + void setState( uint8_t state ); + + InstanceContentPtr getParentInstance() const; + void setParentInstance( InstanceContentPtr instance ); + + protected: + uint32_t m_hierachyId; + uint8_t m_state; + InstanceContentPtr m_parentInstance; + }; +} +} + +#endif //SAPPHIRE_INSTANCEOBJECT_H diff --git a/src/servers/sapphire_zone/Forwards.h b/src/servers/sapphire_zone/Forwards.h index 8038a008..936a458d 100644 --- a/src/servers/sapphire_zone/Forwards.h +++ b/src/servers/sapphire_zone/Forwards.h @@ -34,6 +34,7 @@ namespace Core TYPE_FORWARD( BattleNpc ); TYPE_FORWARD( EventNpc ); TYPE_FORWARD( BattleNpcTemplate ); + TYPE_FORWARD( InstanceObject ); } namespace Event diff --git a/src/servers/sapphire_zone/Script/Scripts/instances/trials/TheNavel.cpp b/src/servers/sapphire_zone/Script/Scripts/instances/trials/TheNavel.cpp index 593a184a..66b381c4 100644 --- a/src/servers/sapphire_zone/Script/Scripts/instances/trials/TheNavel.cpp +++ b/src/servers/sapphire_zone/Script/Scripts/instances/trials/TheNavel.cpp @@ -9,11 +9,19 @@ public: void onInit( InstanceContent& instance ) override { + auto exit = new Entity::InstanceObject( EXIT_OBJECT, 0, { 0, 0, -10 } ); + instance.registerInstanceObj( Entity::InstanceObjectPtr( exit ) ); + auto start = new Entity::InstanceObject( START_CIRCLE, 4236868, { 0, 0, 24 } ); + instance.registerInstanceObj( Entity::InstanceObjectPtr( start ) ); } void onUpdate( InstanceContent& instance, uint32_t currTime ) override { } + +private: + static constexpr auto EXIT_OBJECT = 2000139; + static constexpr auto START_CIRCLE = 2000182; }; \ No newline at end of file diff --git a/src/servers/sapphire_zone/Zone/InstanceContent.cpp b/src/servers/sapphire_zone/Zone/InstanceContent.cpp index c753081b..7f5a5906 100644 --- a/src/servers/sapphire_zone/Zone/InstanceContent.cpp +++ b/src/servers/sapphire_zone/Zone/InstanceContent.cpp @@ -213,3 +213,33 @@ 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; +} + +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& playerId : m_playerMap ) + { + // send that packet with le data + } +} \ 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 23d873f7..ed0df739 100644 --- a/src/servers/sapphire_zone/Zone/InstanceContent.h +++ b/src/servers/sapphire_zone/Zone/InstanceContent.h @@ -5,6 +5,7 @@ #include "Event/Director.h" #include "Forwards.h" #include +#include "Actor/InstanceObject.h" namespace Core { @@ -35,6 +36,9 @@ 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; @@ -48,6 +52,7 @@ private: int64_t m_instanceExpireTime; + std::unordered_map< uint32_t, Core::Entity::InstanceObjectPtr > m_instanceObjects; }; }