1
Fork 0
mirror of https://github.com/SapphireServer/Sapphire.git synced 2025-04-30 08:07:46 +00:00
sapphire/src/servers/sapphire_zone/Manager/TerritoryMgr.h

206 lines
7 KiB
C
Raw Normal View History

2018-01-27 23:52:49 +01:00
#ifndef SAPPHIRE_TERRITORYMGR_H
#define SAPPHIRE_TERRITORYMGR_H
#include "ForwardsZone.h"
#include <set>
#include <unordered_map>
2018-01-27 23:52:49 +01:00
namespace Sapphire::Data
{
// TODO: this should actually not be here but should be generated in exdData aswell
struct PlaceName;
struct TerritoryType;
struct InstanceContent;
using PlaceNamePtr = std::shared_ptr< PlaceName >;
using TerritoryTypePtr = std::shared_ptr< TerritoryType >;
using InstanceContentPtr = std::shared_ptr< InstanceContent >;
}
namespace Sapphire::World::Manager
{
2018-11-30 23:57:06 +01:00
/*!
\class TerritoryMgr_c
\brief A class managing zones
2018-11-30 23:57:06 +01:00
This class manages persistent and temporary instances alike.
2018-01-27 23:52:49 +01:00
2018-11-30 23:57:06 +01:00
*/
class TerritoryMgr
{
2018-11-30 23:57:06 +01:00
public:
enum TerritoryIntendedUse : uint8_t //TODO: Add the rest of the territory types and have better names for them
{
Town = 0,
OpenWorld = 1,
Inn = 2,
Dungeon = 3,
JailArea = 5,
OpeningArea = 6,
BeforeTrialDung = 7,
AllianceRaid = 8,
OpenWorldInstanceBattle = 9,
Trial = 10,
HousingArea = 13,
HousingPrivateArea = 14,
MSQPrivateArea = 15,
Raids = 16,
RaidFights = 17,
ChocoboTutorial = 21,
Wedding = 22,
BeginnerTutorial = 27,
FreeCompanyGarrison = 30,
PalaceOfTheDead = 31,
TreasureMapInstance = 33,
EventTrial = 36,
TheFeastArea = 37,
PrivateEventArea = 40,
//Eureka = 41, // wat
};
TerritoryMgr();
/*! initializes the territoryMgr */
bool init();
bool createDefaultTerritories();
2018-11-30 23:57:06 +01:00
bool createHousingTerritories();
/*! caches TerritoryType details into m_territoryTypeMap */
void loadTerritoryTypeDetailCache();
2018-11-30 23:57:06 +01:00
/*! List of positions for zonelines */
void loadTerritoryPositionMap();
2018-11-30 23:57:06 +01:00
/*! returns true if the given territoryTypeId is in fact a valid zone
based on informations in the dats ( checks if an entry in the dats exists trhough cache ) */
bool isValidTerritory( uint32_t territoryTypeId ) const;
2018-11-30 23:57:06 +01:00
/*! returns the next available instanceId */
uint32_t getNextInstanceId();
2018-01-27 23:52:49 +01:00
2018-11-30 23:57:06 +01:00
/*! returns true if the territoryType in question is not a persistant zone */
bool isInstanceContentTerritory( uint32_t territoryTypeId ) const;
2018-01-27 23:52:49 +01:00
2018-11-30 23:57:06 +01:00
/*! returns true if the territoryType in question is not a private zone */
bool isPrivateTerritory( uint32_t territoryTypeId ) const;
2018-07-15 23:59:15 +02:00
2018-11-30 23:57:06 +01:00
/*! returns true if the territoryType is a default non-instanced zone */
bool isDefaultTerritory( uint32_t territoryTypeId ) const;
2018-01-27 23:52:49 +01:00
2018-11-30 23:57:06 +01:00
/*! returns true if the territoryType is a housing zone */
bool isHousingTerritory( uint32_t territoryTypeId ) const;
2018-01-27 23:52:49 +01:00
2018-11-30 23:57:06 +01:00
/*! creates a new instance for a given territoryTypeId */
ZonePtr createTerritoryInstance( uint32_t territoryTypeId );
2018-01-27 23:52:49 +01:00
2018-11-30 23:57:06 +01:00
ZonePtr createInstanceContent( uint32_t contentFinderConditionId );
2018-01-27 23:52:49 +01:00
2018-12-01 18:18:29 +11:00
ZonePtr findOrCreateHousingInterior( const Common::LandIdent landIdent );
2018-01-27 23:52:49 +01:00
2018-11-30 23:57:06 +01:00
/*! removes instance by instanceId, return true if successful */
bool removeTerritoryInstance( uint32_t territoryTypeId );
2018-01-27 23:52:49 +01:00
2018-11-30 23:57:06 +01:00
/*! returns a ZonePtr to the instance or nullptr if not found */
ZonePtr getInstanceZonePtr( uint32_t instanceId ) const;
2018-01-27 23:52:49 +01:00
2018-11-30 23:57:06 +01:00
/*! returns the cached detail of a territory, nullptr if not found */
Data::TerritoryTypePtr getTerritoryDetail( uint32_t territoryTypeId ) const;
2018-11-30 23:57:06 +01:00
/*! loop for processing territory logic, iterating all existing instances */
void updateTerritoryInstances( uint32_t currentTime );
2018-07-15 23:59:15 +02:00
2018-11-30 23:57:06 +01:00
/*! returns a ZonePositionPtr if found, else nullptr */
ZonePositionPtr getTerritoryPosition( uint32_t territoryPositionId ) const;
2018-01-27 23:52:49 +01:00
2018-11-30 23:57:06 +01:00
/*! returns a default Zone by territoryTypeId
TODO: Mind multiple instances?! */
ZonePtr getZoneByTerritoryTypeId( uint32_t territoryTypeId ) const;
2018-11-30 23:57:06 +01:00
/*! returns a Zone by landSetId */
ZonePtr getZoneByLandSetId( uint32_t landSetId ) const;
2018-01-27 23:52:49 +01:00
2018-11-30 23:57:06 +01:00
bool movePlayer( uint32_t territoryTypeId, Entity::PlayerPtr pPlayer );
2018-11-30 23:57:06 +01:00
bool movePlayer( ZonePtr, Entity::PlayerPtr pPlayer );
2018-11-30 23:57:06 +01:00
/*! returns an instancePtr if the player is still bound to an isntance */
ZonePtr getLinkedInstance( uint32_t playerId ) const;
2018-01-27 23:52:49 +01:00
2018-11-30 23:57:06 +01:00
/*!
* @brief Sets the current festival for every zone
* @param festivalId A valid festival id from festival.exd
* @param additionalFestival A valid festival id from festival.exd, this is shown in addition to the first festival
*/
void setCurrentFestival( uint16_t festivalId, uint16_t additionalFestival = 0 );
2018-01-27 23:52:49 +01:00
2018-11-30 23:57:06 +01:00
/*!
* @brief Disables the current festival(s) in every zone
*/
void disableCurrentFestival();
2018-01-27 23:52:49 +01:00
2018-11-30 23:57:06 +01:00
/*!
* @brief Gets the current festival set on the server
* @return a pair with the 2 festivals currently active
*/
const std::pair< uint16_t, uint16_t >& getCurrentFestival() const;
2018-01-27 23:52:49 +01:00
2018-11-30 23:57:06 +01:00
private:
using TerritoryTypeDetailCache = std::unordered_map< uint16_t, Data::TerritoryTypePtr >;
using InstanceIdToZonePtrMap = std::unordered_map< uint32_t, ZonePtr >;
using LandSetIdToZonePtrMap = std::unordered_map< uint32_t, ZonePtr >;
using TerritoryTypeIdToInstanceMap = 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 >;
2018-12-01 18:18:29 +11:00
using LandIdentToZonePtrMap = std::unordered_map< uint64_t, ZonePtr >;
2018-11-30 23:57:06 +01:00
/*! map holding details for territory templates */
TerritoryTypeDetailCache m_territoryTypeDetailCacheMap;
2018-11-30 23:57:06 +01:00
/*! map holding actual instances of default territories */
TerritoryTypeIdToInstanceMap m_territoryTypeIdToInstanceGuidMap;
2018-03-20 20:30:05 +11:00
2018-11-30 23:57:06 +01:00
/*! map holding actual instances of default territories */
LandSetIdToZonePtrMap m_landSetIdToZonePtrMap;
2018-01-27 23:52:49 +01:00
2018-11-30 23:57:06 +01:00
/*! map holding actual instances of InstanceContent */
InstanceContentIdToInstanceMap m_instanceContentToInstanceMap;
2018-01-27 23:52:49 +01:00
2018-11-30 23:57:06 +01:00
/*! flat map for easier lookup of instances by guid */
InstanceIdToZonePtrMap m_instanceIdToZonePtrMap;
2018-01-27 23:52:49 +01:00
2018-11-30 23:57:06 +01:00
/*! map holding positions for zonelines */
PositionMap m_territoryPositionMap;
2018-11-30 23:57:06 +01:00
/*! map storing playerIds to instanceIds, used for instanceContent */
PlayerIdToInstanceIdMap m_playerIdToInstanceMap;
2018-12-01 18:18:29 +11:00
/*! map for storing landident to zones, used for internal housing zones */
LandIdentToZonePtrMap m_landIdentToZonePtrMap;
2018-11-30 23:57:06 +01:00
/*! internal counter for instanceIds */
uint32_t m_lastInstanceId;
2018-11-30 23:57:06 +01:00
/*! set of ZonePtrs for quick iteration*/
std::set< ZonePtr > m_zoneSet;
2018-01-27 23:52:49 +01:00
2018-11-30 23:57:06 +01:00
/*! set of ZonePtrs for quick iteration*/
std::set< ZonePtr > m_instanceZoneSet;
2018-11-30 23:57:06 +01:00
/*! current festival(s) to set for public zones from festival.exd */
std::pair< uint16_t, uint16_t > m_currentFestival;
2018-01-27 23:52:49 +01:00
2018-11-30 23:57:06 +01:00
public:
/*! returns a list of instanceContent InstanceIds currently active */
InstanceIdList getInstanceContentIdList( uint16_t instanceContentId ) const;
2018-11-30 23:57:06 +01:00
};
2018-01-27 23:52:49 +01:00
}
#endif // SAPPHIRE_TERRITORYMGR_H