1
Fork 0
mirror of https://github.com/SapphireServer/Sapphire.git synced 2025-04-29 15:47:46 +00:00
sapphire/src/world/Manager/HousingMgr.h

209 lines
6.7 KiB
C
Raw Normal View History

2018-11-10 19:00:13 +01:00
#ifndef SAPPHIRE_HOUSINGMGR_H
#define SAPPHIRE_HOUSINGMGR_H
#include "Forwards.h"
#include "Territory/HousingZone.h"
2018-11-10 19:00:13 +01:00
#include <set>
#include <unordered_map>
#include <array>
2018-11-10 19:00:13 +01:00
namespace Sapphire::Data
2018-11-10 19:00:13 +01:00
{
using HousingZonePtr = std::shared_ptr< HousingZone >;
}
2018-11-10 19:00:13 +01:00
namespace Sapphire::World::Manager
{
2018-11-10 19:00:13 +01:00
class HousingMgr
{
public:
2018-12-22 11:33:21 +11:00
/*!
* @brief Structure that is generated and filled on world launch. Used to store housing data during init
* so we don't need to query them individually.
*/
2018-12-22 11:33:21 +11:00
struct LandCacheEntry
{
// land table
uint64_t m_landSetId;
uint16_t m_landId;
2018-12-22 11:33:21 +11:00
Common::LandType m_type;
2018-12-22 11:33:21 +11:00
uint8_t m_size;
uint8_t m_status;
uint64_t m_currentPrice;
2018-12-22 11:33:21 +11:00
uint64_t m_updateTime;
uint64_t m_ownerId;
uint64_t m_houseId;
// house table
std::string m_estateWelcome;
std::string m_estateComment;
std::string m_estateName;
2018-12-22 11:33:21 +11:00
uint64_t m_buildTime;
uint64_t m_endorsements;
uint16_t m_maxPlacedExternalItems;
uint16_t m_maxPlacedInternalItems;
2018-12-22 11:33:21 +11:00
};
/*!
* @brief Maps land id to a list of cached entries
*/
using LandSetLandCacheMap = std::unordered_map< uint64_t, std::vector< LandCacheEntry > >;
/*!
* @brief Maps container IDs to their relevant ItemContainerPtr
*/
using ContainerIdToContainerMap = std::unordered_map< uint16_t, ItemContainerPtr >;
/*!
* @brief Maps land idents to a container containing ItemContainerPtrs
*/
using LandIdentToInventoryContainerMap = std::unordered_map< uint64_t, ContainerIdToContainerMap >;
2018-11-10 19:00:13 +01:00
HousingMgr();
virtual ~HousingMgr();
bool init();
uint32_t toLandSetId( uint16_t territoryTypeId, uint8_t wardId ) const;
Sapphire::Data::HousingZonePtr getHousingZoneByLandSetId( uint32_t id );
Sapphire::LandPtr getLandByOwnerId( uint32_t id );
2018-11-10 19:00:13 +01:00
2018-12-05 16:55:14 +11:00
void sendLandSignOwned( Entity::Player& player, const Common::LandIdent ident );
void sendLandSignFree( Entity::Player& player, const Common::LandIdent ident );
2018-11-19 09:40:44 +01:00
LandPurchaseResult purchaseLand( Entity::Player& player, uint8_t plot, uint8_t state );
/*!
* @brief Converts param1 of a client trigger into a Common::LandIndent
*/
Common::LandIdent clientTriggerParamsToLandIdent( uint32_t param11, uint32_t param12, bool use16bits = true ) const;
2018-12-05 16:55:14 +11:00
void sendWardLandInfo( Entity::Player& player, uint8_t wardId, uint16_t territoryTypeId );
2018-11-17 01:16:44 +01:00
bool relinquishLand( Entity::Player& player, uint8_t plot );
2018-11-24 15:17:18 +11:00
void buildPresetEstate( Entity::Player& player, uint8_t plotNum, uint32_t presetItem );
2018-12-05 16:55:14 +11:00
void requestEstateRename( Entity::Player& player, const Common::LandIdent ident );
2018-11-28 21:59:28 +11:00
2018-12-05 16:55:14 +11:00
void requestEstateEditGreeting( Entity::Player& player, const Common::LandIdent ident );
void updateEstateGreeting( Entity::Player& player, const Common::LandIdent ident, const std::string& greeting );
2018-12-05 16:55:14 +11:00
void requestEstateEditGuestAccess( Entity::Player& player, const Common::LandIdent ident );
2018-11-29 00:19:37 +11:00
void sendEstateGreeting( Entity::Player& player, const Common::LandIdent ident );
/*!
* @brief Updates the cached models on a house from the relevant apperance inventories.
* Does not send the subsequent update to clients.
*
* @param house The house to update the models for
*/
void updateHouseModels( HousePtr house );
/*!
* @brief Sends the house inventory for the specified type to a player.
*
2018-12-22 11:33:21 +11:00
* This enforces permissions on the inventory too so random players can't request an estates items
*/
2018-12-22 11:33:21 +11:00
void sendEstateInventory( Entity::Player& player, uint16_t inventoryType, uint8_t plotNum );
/*!
* @brief Get the land & house data that was cached on world startup.
* @return
*/
2018-12-22 17:25:30 +11:00
const LandSetLandCacheMap& getLandCacheMap();
2018-12-22 11:33:21 +11:00
/*!
* @brief Get all loaded inventories for housing estates
* @return
*/
2018-12-22 17:25:30 +11:00
LandIdentToInventoryContainerMap& getEstateInventories();
/*!
* @brief Get an estate inventory for a specific estate
* @param ident LandIdent for the specified estate
* @return A map containing container ids to ItemContainerPtr
*/
2018-12-22 17:25:30 +11:00
ContainerIdToContainerMap& getEstateInventory( uint64_t ident );
/*!
* @brief Get an estate inventory for a specific estate
* @param ident LandIdent for the specified estate
* @return A map containing container ids to ItemContainerPtr
*/
2018-12-22 17:25:30 +11:00
ContainerIdToContainerMap& getEstateInventory( Common::LandIdent ident );
/**
* @brief Sets up inventories and spawns the base items for the house appearance
* @param land The house to update
*/
bool initHouseModels( Entity::Player& player, LandPtr land, uint32_t presetCatalogId );
2018-12-26 18:11:18 +11:00
void reqPlaceHousingItem( Entity::Player& player, uint16_t landId, uint16_t containerId, uint16_t slotId,
Common::FFXIVARR_POSITION3 pos, float rotation );
private:
2018-12-26 18:11:18 +11:00
bool placeExternalItem( Entity::Player& player, Inventory::HousingItemPtr item, Common::LandIdent ident );
/*!
* @brief Creates a house and saves the minimum amount required to persist a house through restarts.
*
* Any other changes will be covered by the usual saving logic and can be safely ignored here.
*
* @param house The house to create in the house table
*/
2018-12-23 20:54:21 +11:00
void createHouse( HousePtr house ) const;
/*!
* @brief Gets the next available house id
* @return The next available house id
*/
uint64_t getNextHouseId();
/*!
* @brief Loads all the land entries from the database and caches them to speed up housing territory init
*/
void initLandCache();
/*!
* @brief Loads all the inventories for every estate on the world and sets up their containers
* @return True if it was successful
*/
bool loadEstateInventories();
/*!
* @brief Gets the additionalData field from item.exd for an item
* @param catalogId The item id to lookup in item.exd
* @return The additionalData field from item.exd
*/
uint32_t getItemAdditionalData( uint32_t catalogId );
/*!
* @brief Checks whether an estate inventory contains items that are placed and have a world position
*
* Eg, any item inside the 'placed' items container _should_ have a world position and can be spawned.
*
* @param type The inventory type that contains items
* @return true if contains items that would have a world position
*/
bool isPlacedItemsInventory( Common::InventoryType type );
2018-12-22 11:33:21 +11:00
LandSetLandCacheMap m_landCache;
LandIdentToInventoryContainerMap m_estateInventories;
std::array< std::pair< Common::InventoryType, Common::InventoryType >, 8 > m_containerMap;
2018-11-10 19:00:13 +01:00
};
}
#endif // SAPPHIRE_HOUSINGMGR_H