From d9da17cd352bb968f02d82fe8c0fa14d1f0962cc Mon Sep 17 00:00:00 2001 From: Mordred Date: Sun, 28 Jan 2018 13:49:51 +0100 Subject: [PATCH] Begin of InstanceContent implementation --- src/servers/sapphire_zone/Event/Director.h | 30 ++++++++++++++++--- src/servers/sapphire_zone/Forwards.h | 1 + .../sapphire_zone/Zone/InstanceContent.cpp | 1 + .../sapphire_zone/Zone/InstanceContent.h | 22 ++++++++++++++ .../sapphire_zone/Zone/TerritoryMgr.cpp | 19 ++++++++++-- src/servers/sapphire_zone/Zone/TerritoryMgr.h | 28 ++++++++++------- 6 files changed, 84 insertions(+), 17 deletions(-) create mode 100644 src/servers/sapphire_zone/Zone/InstanceContent.cpp create mode 100644 src/servers/sapphire_zone/Zone/InstanceContent.h diff --git a/src/servers/sapphire_zone/Event/Director.h b/src/servers/sapphire_zone/Event/Director.h index 233e6061..8a3c0245 100644 --- a/src/servers/sapphire_zone/Event/Director.h +++ b/src/servers/sapphire_zone/Event/Director.h @@ -16,9 +16,26 @@ namespace Event { class Director { + +public: + enum DirectorType + { + InstanceContent = 0x8003, // used for dungeons/raids + CompanyLeve = 0x8007, + QuestBattle = 0x8006, + GatheringLeve = 0x8002, + BattleLeve = 0x8001, + GoldSaucer = 0x800A, + Fate = 0x801A, + DpsChallange = 0x800D + }; + private: - /*! Id of the director */ - uint32_t m_id; + /*! Id of the content of the director */ + uint16_t m_id; + + /*! DirectorType | ContentId */ + uint32_t m_directorId; /*! currect sequence */ uint8_t m_sequence; @@ -29,9 +46,14 @@ private: /*! raw storage for flags/vars */ uint8_t m_unionData[10]; -public: - uint8_t getId() const; + /*! 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/Forwards.h b/src/servers/sapphire_zone/Forwards.h index 40fcc5c0..92b2d475 100644 --- a/src/servers/sapphire_zone/Forwards.h +++ b/src/servers/sapphire_zone/Forwards.h @@ -36,6 +36,7 @@ namespace Core namespace Event { + TYPE_FORWARD( Director ); TYPE_FORWARD( EventHandler ); } diff --git a/src/servers/sapphire_zone/Zone/InstanceContent.cpp b/src/servers/sapphire_zone/Zone/InstanceContent.cpp new file mode 100644 index 00000000..d85019c4 --- /dev/null +++ b/src/servers/sapphire_zone/Zone/InstanceContent.cpp @@ -0,0 +1 @@ +#include "InstanceContent.h" diff --git a/src/servers/sapphire_zone/Zone/InstanceContent.h b/src/servers/sapphire_zone/Zone/InstanceContent.h new file mode 100644 index 00000000..85df9280 --- /dev/null +++ b/src/servers/sapphire_zone/Zone/InstanceContent.h @@ -0,0 +1,22 @@ +#ifndef SAPPHIRE_INSTANCECONTENT_H +#define SAPPHIRE_INSTANCECONTENT_H + +#include "Zone.h" +#include "Forwards.h" + +namespace Core +{ + +class InstanceContent : public Zone +{ +public: + InstanceContent( uint32_t instanceContentId, uint32_t guid ); + virtual ~InstanceContent(); + +private: + DirectorPtr m_pDirector; + +}; + +} +#endif //SAPPHIRE_INSTANCECONTENT_H diff --git a/src/servers/sapphire_zone/Zone/TerritoryMgr.cpp b/src/servers/sapphire_zone/Zone/TerritoryMgr.cpp index 1c9c3b59..205c39d4 100644 --- a/src/servers/sapphire_zone/Zone/TerritoryMgr.cpp +++ b/src/servers/sapphire_zone/Zone/TerritoryMgr.cpp @@ -120,7 +120,7 @@ bool Core::TerritoryMgr::createDefaultTerritories() InstanceIdToZonePtrMap instanceMap; instanceMap[guid] = pZone; - + m_instanceIdToZonePtrMap[guid] = pZone; m_territoryInstanceMap[territoryId] = instanceMap; } @@ -179,8 +179,6 @@ Core::ZonePtr Core::TerritoryMgr::getZoneByTerriId( uint32_t territoryId ) const // TODO: actually select the proper one return zoneMap->second.begin()->second; - - return nullptr; } void Core::TerritoryMgr::updateTerritoryInstances( uint32_t currentTime ) @@ -190,7 +188,22 @@ void Core::TerritoryMgr::updateTerritoryInstances( uint32_t currentTime ) for( auto zone : zoneMap.second ) zone.second->runZoneLogic( currentTime ); } +} +Core::TerritoryMgr::InstanceIdList Core::TerritoryMgr::getInstanceContentIdList( uint16_t instanceContentId ) const +{ + std::vector< uint32_t > idList; + auto zoneMap = m_instanceContentToInstanceMap.find( instanceContentId ); + if( zoneMap == m_instanceContentToInstanceMap.end() ) + return idList; + + for( auto& entry : zoneMap->second ) + { + idList.push_back( entry.first ); + } + + return idList; } + diff --git a/src/servers/sapphire_zone/Zone/TerritoryMgr.h b/src/servers/sapphire_zone/Zone/TerritoryMgr.h index f0f12be1..0fbd716c 100644 --- a/src/servers/sapphire_zone/Zone/TerritoryMgr.h +++ b/src/servers/sapphire_zone/Zone/TerritoryMgr.h @@ -87,18 +87,15 @@ namespace Core /*! removes instance by instanceId, return true if successful */ bool removeTerritoryInstance( uint32_t territoryTypeId ); + /*! returns a ZonePtr to the instance or nullptr if not found */ + ZonePtr getTerritoryZonePtr( uint32_t instanceId ) const; + /*! returns the cached detail of a territory, nullptr if not found */ Data::TerritoryTypePtr getTerritoryDetail( uint32_t territoryTypeId ) const; /*! loop for processing territory logic, iterating all existing instances */ void updateTerritoryInstances( uint32_t currentTime ); - /*! pushes a new instances onto the handling map */ - bool addInstance( ZonePtr pInstance ); - - /*! returns a ZonePtr to the instance or nullptr if not found */ - ZonePtr getInstance( uint32_t instanceId ) const; - /*! returns a ZonePositionPtr if found, else nullptr */ ZonePositionPtr getTerritoryPosition( uint32_t territoryPositionId ) const; @@ -110,22 +107,33 @@ namespace Core using TerritoryTypeDetailCache = std::unordered_map< uint16_t, Data::TerritoryTypePtr >; using InstanceIdToZonePtrMap = std::unordered_map< uint32_t, ZonePtr >; using TerritoryIdToInstanceMap = std::unordered_map< uint16_t, InstanceIdToZonePtrMap >; + using InstanceContentIdToInstanceMap = std::unordered_map< uint16_t, InstanceIdToZonePtrMap >; + using PlayerIdToInstanceIdMap = std::unordered_map< uint32_t, uint32_t >; using PositionMap = std::unordered_map< int32_t, ZonePositionPtr >; + using InstanceIdList = std::vector< uint32_t >; /*! map holding details for territory templates */ TerritoryTypeDetailCache m_territoryTypeDetailCacheMap; - /*! map holding actual instances of territories */ + /*! map holding actual instances of default territories */ TerritoryIdToInstanceMap m_territoryInstanceMap; + /*! map holding actual instances of InstanceContent */ + InstanceContentIdToInstanceMap m_instanceContentToInstanceMap; + + /*! flat map for easier lookup of instances by guid */ + InstanceIdToZonePtrMap m_instanceIdToZonePtrMap; + /*! map holding positions for zonelines */ PositionMap m_territoryPositionMap; - /*! internal counter for instanceIds - TODO: it should be ensured that this does not overflow if the server runs for a loooong time - ( as if that will ever happen ;) ) */ + /*! internal counter for instanceIds */ uint32_t m_lastInstanceId; + public: + /*! returns a list of instanceContent InstanceIds currently active */ + InstanceIdList getInstanceContentIdList( uint16_t instanceContentId ) const; + }; }