mirror of
https://github.com/EQEmu/Server.git
synced 2025-12-11 16:51:29 +00:00
* [Rules] Convert IDLE_WHEN_EMPTY to a rule # Notes - Converts `IDLE_WHEN_EMPTY` to `Zone:ZonesIdleWhenEmpty` so that we can change this on the fly or on a zone-by-zone basis instead of having to recompile to do this. - Especially helpful for those using release binaries that do not compile their own source. * Convert to zone column. * Update ruletypes.h * Update ruletypes.h * Update entity.cpp * Update entity.cpp * Rename. * Update database_update_manifest.cpp * Update base_zone_repository.h * Update zone.cpp * seconds_before_idle * Update database_update_manifest.cpp * Getter/Setters/Private * Update base_zone_repository.h * IsIdle()/SetIsIdle() * Update entity.cpp
1378 lines
27 KiB
C++
1378 lines
27 KiB
C++
/**
|
|
* EQEmulator: Everquest Server Emulator
|
|
* Copyright (C) 2001-2020 EQEmulator Development Team (https://github.com/EQEmu/Server)
|
|
*
|
|
* This program is free software; you can redistribute it and/or modify
|
|
* it under the terms of the GNU General Public License as published by
|
|
* the Free Software Foundation; version 2 of the License.
|
|
*
|
|
* This program is distributed in the hope that it will be useful,
|
|
* but WITHOUT ANY WARRANTY except by those people which sell it, which
|
|
* are required to give you total support for your newly bought product;
|
|
* without even the implied warranty of MERCHANTABILITY or FITNESS FOR
|
|
* A PARTICULAR PURPOSE. See the GNU General Public License for more details.
|
|
*
|
|
* You should have received a copy of the GNU General Public License
|
|
* along with this program; if not, write to the Free Software
|
|
* Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA
|
|
*
|
|
*/
|
|
|
|
#define DEFAULT_MINIMUM_CLIP 50.0f
|
|
#define DEFAULT_MAXIMUM_CLIP 175.0f
|
|
#define DEFAULT_ZONE_FAST_REGEN 180
|
|
#define DEFAULT_ZONE_GRAVITY 0.4f
|
|
#define DEFAULT_ZONE_MIN_MAX_EXPANSION -1
|
|
#define DEFAULT_ZONE_MAX_AGGRO_DISTANCE 600
|
|
#define DEFAULT_ZONE_MAX_MOVEMENT_UPDATE_RANGE 600
|
|
#define DEFAULT_ZONE_RUNSPEED 0.4f
|
|
#define DEFAULT_ZONE_SHUTDOWN_DELAY 3600000
|
|
#define DEFAULT_ZONE_TYPE 1
|
|
#define FOG_SLOT_ONE 1
|
|
#define FOG_SLOT_TWO 2
|
|
#define FOG_SLOT_THREE 3
|
|
#define FOG_SLOT_FOUR 4
|
|
#define RAIN_SLOT_ONE 1
|
|
#define RAIN_SLOT_TWO 2
|
|
#define RAIN_SLOT_THREE 3
|
|
#define RAIN_SLOT_FOUR 4
|
|
#define SNOW_SLOT_ONE 1
|
|
#define SNOW_SLOT_TWO 2
|
|
#define SNOW_SLOT_THREE 3
|
|
#define SNOW_SLOT_FOUR 4
|
|
|
|
#include "zone_store.h"
|
|
#include "../common/content/world_content_service.h"
|
|
#include "stacktrace/backward.hpp"
|
|
|
|
ZoneStore::ZoneStore() = default;
|
|
ZoneStore::~ZoneStore() = default;
|
|
|
|
// cache record of zones for fast successive retrieval
|
|
void ZoneStore::LoadZones(Database &db)
|
|
{
|
|
m_zones = ZoneRepository::All(db);
|
|
|
|
LogInfo("Loaded [{}] zones", m_zones.size());
|
|
}
|
|
|
|
/**
|
|
* @param in_zone_name
|
|
* @return
|
|
*/
|
|
uint32 ZoneStore::GetZoneID(const char *in_zone_name)
|
|
{
|
|
if (in_zone_name == nullptr) {
|
|
return 0;
|
|
}
|
|
|
|
std::string zone_name = Strings::ToLower(in_zone_name);
|
|
|
|
return GetZoneID(zone_name);
|
|
}
|
|
|
|
/**
|
|
* @param zone_name
|
|
* @return
|
|
*/
|
|
uint32 ZoneStore::GetZoneID(std::string zone_name)
|
|
{
|
|
for (auto &z: m_zones) {
|
|
if (z.short_name == zone_name) {
|
|
return z.zoneidnumber;
|
|
}
|
|
}
|
|
|
|
LogInfo("Failed to get zone_name [{}]", zone_name);
|
|
|
|
return 0;
|
|
}
|
|
|
|
/**
|
|
* @param zone_id
|
|
* @param error_unknown
|
|
* @return
|
|
*/
|
|
const char *ZoneStore::GetZoneName(uint32 zone_id, bool error_unknown)
|
|
{
|
|
for (auto &z: m_zones) {
|
|
if (z.zoneidnumber == zone_id) {
|
|
return z.short_name.c_str();
|
|
}
|
|
}
|
|
|
|
if (error_unknown) {
|
|
return "UNKNOWN";
|
|
}
|
|
|
|
return nullptr;
|
|
}
|
|
|
|
/**
|
|
* @param zone_id
|
|
* @param error_unknown
|
|
* @return
|
|
*/
|
|
const char *ZoneStore::GetZoneLongName(uint32 zone_id, bool error_unknown)
|
|
{
|
|
for (auto &z: m_zones) {
|
|
if (z.zoneidnumber == zone_id) {
|
|
return z.long_name.c_str();
|
|
}
|
|
}
|
|
|
|
if (error_unknown) {
|
|
return "UNKNOWN";
|
|
}
|
|
|
|
return nullptr;
|
|
}
|
|
|
|
/**
|
|
* @param zone_id
|
|
* @return
|
|
*/
|
|
std::string ZoneStore::GetZoneName(uint32 zone_id)
|
|
{
|
|
for (auto &z: m_zones) {
|
|
if (z.zoneidnumber == zone_id) {
|
|
return z.short_name;
|
|
}
|
|
}
|
|
|
|
LogInfo("Failed to get zone long name by zone_id [{}]", zone_id);
|
|
|
|
return {};
|
|
}
|
|
|
|
/**
|
|
* @param zone_id
|
|
* @return
|
|
*/
|
|
std::string ZoneStore::GetZoneLongName(uint32 zone_id)
|
|
{
|
|
for (auto &z: m_zones) {
|
|
if (z.zoneidnumber == zone_id) {
|
|
return z.long_name;
|
|
}
|
|
}
|
|
|
|
LogInfo("Failed to get zone long name by zone_id [{}]", zone_id);
|
|
|
|
return {};
|
|
}
|
|
|
|
/**
|
|
* @param zone_id
|
|
* @param version
|
|
* @return
|
|
*/
|
|
ZoneRepository::Zone *ZoneStore::GetZone(uint32 zone_id, int version)
|
|
{
|
|
for (auto &z: m_zones) {
|
|
if (z.zoneidnumber == zone_id && z.version == version) {
|
|
return &z;
|
|
}
|
|
}
|
|
|
|
LogInfo("Failed to get zone by zone_id [{}] version [{}]", zone_id, version);
|
|
|
|
return nullptr;
|
|
}
|
|
|
|
/**
|
|
* @param in_zone_name
|
|
* @return
|
|
*/
|
|
ZoneRepository::Zone *ZoneStore::GetZone(const char *in_zone_name)
|
|
{
|
|
for (auto &z: m_zones) {
|
|
if (z.short_name == in_zone_name) {
|
|
return &z;
|
|
}
|
|
}
|
|
|
|
LogInfo("Failed to get zone by zone_name [{}]", in_zone_name);
|
|
|
|
return nullptr;
|
|
}
|
|
|
|
ZoneRepository::Zone *ZoneStore::GetZone(const std::string& in_zone_name)
|
|
{
|
|
for (auto &z: m_zones) {
|
|
if (z.short_name == in_zone_name) {
|
|
return &z;
|
|
}
|
|
}
|
|
|
|
return nullptr;
|
|
}
|
|
|
|
const std::vector<ZoneRepository::Zone> &ZoneStore::GetZones() const
|
|
{
|
|
return m_zones;
|
|
}
|
|
|
|
// gets zone data by using explicit version and falling back to version 0 if not found
|
|
ZoneRepository::Zone *ZoneStore::GetZoneWithFallback(uint32 zone_id, int version)
|
|
{
|
|
for (auto &z: m_zones) {
|
|
if (z.zoneidnumber == zone_id && z.version == version) {
|
|
return &z;
|
|
}
|
|
}
|
|
|
|
// second pass, default to version 0 if specific doesn't exist
|
|
for (auto &z: m_zones) {
|
|
if (z.zoneidnumber == zone_id && z.version == 0) {
|
|
return &z;
|
|
}
|
|
}
|
|
|
|
LogInfo("Failed to get zone by zone_id [{}] version [{}]", zone_id, version);
|
|
|
|
return nullptr;
|
|
}
|
|
|
|
glm::vec4 ZoneStore::GetZoneSafeCoordinates(uint32 zone_id, int version)
|
|
{
|
|
for (auto &z: m_zones) {
|
|
if (z.zoneidnumber == zone_id && z.version == version) {
|
|
return glm::vec4(z.safe_x, z.safe_y, z.safe_z, z.safe_heading);
|
|
}
|
|
}
|
|
|
|
for (auto &z: m_zones) {
|
|
if (z.zoneidnumber == zone_id && z.version == 0) {
|
|
return glm::vec4(z.safe_x, z.safe_y, z.safe_z, z.safe_heading);
|
|
}
|
|
}
|
|
|
|
return glm::vec4(0.f);
|
|
}
|
|
|
|
float ZoneStore::GetZoneGraveyardID(uint32 zone_id, int version)
|
|
{
|
|
for (auto &z: m_zones) {
|
|
if (z.zoneidnumber == zone_id && z.version == version) {
|
|
return z.graveyard_id;
|
|
}
|
|
}
|
|
|
|
for (auto &z: m_zones) {
|
|
if (z.zoneidnumber == zone_id && z.version == 0) {
|
|
return z.graveyard_id;
|
|
}
|
|
}
|
|
|
|
return 0;
|
|
}
|
|
|
|
uint8 ZoneStore::GetZoneMinimumLevel(uint32 zone_id, int version)
|
|
{
|
|
for (auto &z: m_zones) {
|
|
if (z.zoneidnumber == zone_id && z.version == version) {
|
|
return z.min_level;
|
|
}
|
|
}
|
|
|
|
for (auto &z: m_zones) {
|
|
if (z.zoneidnumber == zone_id && z.version == 0) {
|
|
return z.min_level;
|
|
}
|
|
}
|
|
|
|
return 0;
|
|
}
|
|
|
|
uint8 ZoneStore::GetZoneMaximumLevel(uint32 zone_id, int version)
|
|
{
|
|
for (auto &z: m_zones) {
|
|
if (z.zoneidnumber == zone_id && z.version == version) {
|
|
return z.max_level;
|
|
}
|
|
}
|
|
|
|
for (auto &z: m_zones) {
|
|
if (z.zoneidnumber == zone_id && z.version == 0) {
|
|
return z.max_level;
|
|
}
|
|
}
|
|
|
|
return UINT8_MAX;
|
|
}
|
|
|
|
uint8 ZoneStore::GetZoneMinimumStatus(uint32 zone_id, int version)
|
|
{
|
|
for (auto &z: m_zones) {
|
|
if (z.zoneidnumber == zone_id && z.version == version) {
|
|
return z.min_status;
|
|
}
|
|
}
|
|
|
|
for (auto &z: m_zones) {
|
|
if (z.zoneidnumber == zone_id && z.version == 0) {
|
|
return z.min_status;
|
|
}
|
|
}
|
|
|
|
return 0;
|
|
}
|
|
|
|
int ZoneStore::GetZoneTimeZone(uint32 zone_id, int version)
|
|
{
|
|
for (auto &z: m_zones) {
|
|
if (z.zoneidnumber == zone_id && z.version == version) {
|
|
return z.min_status;
|
|
}
|
|
}
|
|
|
|
for (auto &z: m_zones) {
|
|
if (z.zoneidnumber == zone_id && z.version == 0) {
|
|
return z.min_status;
|
|
}
|
|
}
|
|
|
|
return 0;
|
|
}
|
|
|
|
int ZoneStore::GetZoneMaximumPlayers(uint32 zone_id, int version)
|
|
{
|
|
for (auto &z: m_zones) {
|
|
if (z.zoneidnumber == zone_id && z.version == version) {
|
|
return z.maxclients;
|
|
}
|
|
}
|
|
|
|
for (auto &z: m_zones) {
|
|
if (z.zoneidnumber == zone_id && z.version == 0) {
|
|
return z.maxclients;
|
|
}
|
|
}
|
|
|
|
return 0;
|
|
}
|
|
|
|
uint32 ZoneStore::GetZoneRuleSet(uint32 zone_id, int version)
|
|
{
|
|
for (auto &z: m_zones) {
|
|
if (z.zoneidnumber == zone_id && z.version == version) {
|
|
return z.ruleset;
|
|
}
|
|
}
|
|
|
|
for (auto &z: m_zones) {
|
|
if (z.zoneidnumber == zone_id && z.version == 0) {
|
|
return z.ruleset;
|
|
}
|
|
}
|
|
|
|
return 0;
|
|
}
|
|
|
|
const std::string ZoneStore::GetZoneNote(uint32 zone_id, int version)
|
|
{
|
|
for (auto &z: m_zones) {
|
|
if (z.zoneidnumber == zone_id && z.version == version) {
|
|
return z.note;
|
|
}
|
|
}
|
|
|
|
for (auto &z: m_zones) {
|
|
if (z.zoneidnumber == zone_id && z.version == 0) {
|
|
return z.note;
|
|
}
|
|
}
|
|
|
|
return "";
|
|
}
|
|
|
|
float ZoneStore::GetZoneUnderworld(uint32 zone_id, int version)
|
|
{
|
|
for (auto &z: m_zones) {
|
|
if (z.zoneidnumber == zone_id && z.version == version) {
|
|
return z.underworld;
|
|
}
|
|
}
|
|
|
|
for (auto &z: m_zones) {
|
|
if (z.zoneidnumber == zone_id && z.version == 0) {
|
|
return z.underworld;
|
|
}
|
|
}
|
|
|
|
return 0.0f;
|
|
}
|
|
|
|
float ZoneStore::GetZoneMinimumClip(uint32 zone_id, int version)
|
|
{
|
|
for (auto &z: m_zones) {
|
|
if (z.zoneidnumber == zone_id && z.version == version) {
|
|
return z.minclip;
|
|
}
|
|
}
|
|
|
|
for (auto &z: m_zones) {
|
|
if (z.zoneidnumber == zone_id && z.version == 0) {
|
|
return z.minclip;
|
|
}
|
|
}
|
|
|
|
return DEFAULT_MINIMUM_CLIP;
|
|
}
|
|
|
|
float ZoneStore::GetZoneMaximumClip(uint32 zone_id, int version)
|
|
{
|
|
for (auto &z: m_zones) {
|
|
if (z.zoneidnumber == zone_id && z.version == version) {
|
|
return z.maxclip;
|
|
}
|
|
}
|
|
|
|
for (auto &z: m_zones) {
|
|
if (z.zoneidnumber == zone_id && z.version == 0) {
|
|
return z.maxclip;
|
|
}
|
|
}
|
|
|
|
return DEFAULT_MAXIMUM_CLIP;
|
|
}
|
|
|
|
float ZoneStore::GetZoneFogMinimumClip(uint32 zone_id, uint8 slot, int version)
|
|
{
|
|
for (auto &z: m_zones) {
|
|
if (z.zoneidnumber == zone_id && z.version == version) {
|
|
switch (slot) {
|
|
case FOG_SLOT_ONE:
|
|
return z.fog_minclip1;
|
|
case FOG_SLOT_TWO:
|
|
return z.fog_minclip2;
|
|
case FOG_SLOT_THREE:
|
|
return z.fog_minclip3;
|
|
case FOG_SLOT_FOUR:
|
|
return z.fog_minclip4;
|
|
default:
|
|
return z.fog_minclip;
|
|
}
|
|
}
|
|
}
|
|
|
|
for (auto &z: m_zones) {
|
|
if (z.zoneidnumber == zone_id && z.version == 0) {
|
|
switch (slot) {
|
|
case FOG_SLOT_ONE:
|
|
return z.fog_minclip1;
|
|
case FOG_SLOT_TWO:
|
|
return z.fog_minclip2;
|
|
case FOG_SLOT_THREE:
|
|
return z.fog_minclip3;
|
|
case FOG_SLOT_FOUR:
|
|
return z.fog_minclip4;
|
|
default:
|
|
return z.fog_minclip;
|
|
}
|
|
}
|
|
}
|
|
|
|
return DEFAULT_MINIMUM_CLIP;
|
|
}
|
|
|
|
float ZoneStore::GetZoneFogMaximumClip(uint32 zone_id, uint8 slot, int version)
|
|
{
|
|
for (auto &z: m_zones) {
|
|
if (z.zoneidnumber == zone_id && z.version == version) {
|
|
switch (slot) {
|
|
case FOG_SLOT_ONE:
|
|
return z.fog_maxclip1;
|
|
case FOG_SLOT_TWO:
|
|
return z.fog_maxclip2;
|
|
case FOG_SLOT_THREE:
|
|
return z.fog_maxclip3;
|
|
case FOG_SLOT_FOUR:
|
|
return z.fog_maxclip4;
|
|
default:
|
|
return z.fog_maxclip;
|
|
}
|
|
}
|
|
}
|
|
|
|
for (auto &z: m_zones) {
|
|
if (z.zoneidnumber == zone_id && z.version == 0) {
|
|
switch (slot) {
|
|
case FOG_SLOT_ONE:
|
|
return z.fog_maxclip1;
|
|
case FOG_SLOT_TWO:
|
|
return z.fog_maxclip2;
|
|
case FOG_SLOT_THREE:
|
|
return z.fog_maxclip3;
|
|
case FOG_SLOT_FOUR:
|
|
return z.fog_maxclip4;
|
|
default:
|
|
return z.fog_maxclip;
|
|
}
|
|
}
|
|
}
|
|
|
|
return DEFAULT_MAXIMUM_CLIP;
|
|
}
|
|
|
|
uint8 ZoneStore::GetZoneFogRed(uint32 zone_id, uint8 slot, int version)
|
|
{
|
|
for (auto &z: m_zones) {
|
|
if (z.zoneidnumber == zone_id && z.version == version) {
|
|
switch (slot) {
|
|
case FOG_SLOT_ONE:
|
|
return z.fog_red1;
|
|
case FOG_SLOT_TWO:
|
|
return z.fog_red2;
|
|
case FOG_SLOT_THREE:
|
|
return z.fog_red3;
|
|
case FOG_SLOT_FOUR:
|
|
return z.fog_red4;
|
|
default:
|
|
return z.fog_red;
|
|
}
|
|
}
|
|
}
|
|
|
|
for (auto &z: m_zones) {
|
|
if (z.zoneidnumber == zone_id && z.version == 0) {
|
|
switch (slot) {
|
|
case FOG_SLOT_ONE:
|
|
return z.fog_red1;
|
|
case FOG_SLOT_TWO:
|
|
return z.fog_red2;
|
|
case FOG_SLOT_THREE:
|
|
return z.fog_red3;
|
|
case FOG_SLOT_FOUR:
|
|
return z.fog_red4;
|
|
default:
|
|
return z.fog_red;
|
|
}
|
|
}
|
|
}
|
|
|
|
return 0;
|
|
}
|
|
|
|
uint8 ZoneStore::GetZoneFogGreen(uint32 zone_id, uint8 slot, int version)
|
|
{
|
|
for (auto &z: m_zones) {
|
|
if (z.zoneidnumber == zone_id && z.version == version) {
|
|
switch (slot) {
|
|
case FOG_SLOT_ONE:
|
|
return z.fog_green1;
|
|
case FOG_SLOT_TWO:
|
|
return z.fog_green2;
|
|
case FOG_SLOT_THREE:
|
|
return z.fog_green3;
|
|
case FOG_SLOT_FOUR:
|
|
return z.fog_green4;
|
|
default:
|
|
return z.fog_green;
|
|
}
|
|
}
|
|
}
|
|
|
|
for (auto &z: m_zones) {
|
|
if (z.zoneidnumber == zone_id && z.version == 0) {
|
|
switch (slot) {
|
|
case FOG_SLOT_ONE:
|
|
return z.fog_green1;
|
|
case FOG_SLOT_TWO:
|
|
return z.fog_green2;
|
|
case FOG_SLOT_THREE:
|
|
return z.fog_green3;
|
|
case FOG_SLOT_FOUR:
|
|
return z.fog_green4;
|
|
default:
|
|
return z.fog_green;
|
|
}
|
|
}
|
|
}
|
|
|
|
return 0;
|
|
}
|
|
|
|
uint8 ZoneStore::GetZoneFogBlue(uint32 zone_id, uint8 slot, int version)
|
|
{
|
|
for (auto &z: m_zones) {
|
|
if (z.zoneidnumber == zone_id && z.version == version) {
|
|
switch (slot) {
|
|
case FOG_SLOT_ONE:
|
|
return z.fog_blue1;
|
|
case FOG_SLOT_TWO:
|
|
return z.fog_blue2;
|
|
case FOG_SLOT_THREE:
|
|
return z.fog_blue3;
|
|
case FOG_SLOT_FOUR:
|
|
return z.fog_blue4;
|
|
default:
|
|
return z.fog_blue;
|
|
}
|
|
}
|
|
}
|
|
|
|
for (auto &z: m_zones) {
|
|
if (z.zoneidnumber == zone_id && z.version == 0) {
|
|
switch (slot) {
|
|
case FOG_SLOT_ONE:
|
|
return z.fog_blue1;
|
|
case FOG_SLOT_TWO:
|
|
return z.fog_blue2;
|
|
case FOG_SLOT_THREE:
|
|
return z.fog_blue3;
|
|
case FOG_SLOT_FOUR:
|
|
return z.fog_blue4;
|
|
default:
|
|
return z.fog_blue;
|
|
}
|
|
}
|
|
}
|
|
|
|
return 0;
|
|
}
|
|
|
|
uint8 ZoneStore::GetZoneSky(uint32 zone_id, int version)
|
|
{
|
|
for (auto &z: m_zones) {
|
|
if (z.zoneidnumber == zone_id && z.version == version) {
|
|
return z.sky;
|
|
}
|
|
}
|
|
|
|
for (auto &z: m_zones) {
|
|
if (z.zoneidnumber == zone_id && z.version == 0) {
|
|
return z.sky;
|
|
}
|
|
}
|
|
|
|
return 0;
|
|
}
|
|
|
|
uint8 ZoneStore::GetZoneZType(uint32 zone_id, int version)
|
|
{
|
|
for (auto &z: m_zones) {
|
|
if (z.zoneidnumber == zone_id && z.version == version) {
|
|
return z.ztype;
|
|
}
|
|
}
|
|
|
|
for (auto &z: m_zones) {
|
|
if (z.zoneidnumber == zone_id && z.version == 0) {
|
|
return z.ztype;
|
|
}
|
|
}
|
|
|
|
return 0;
|
|
}
|
|
|
|
float ZoneStore::GetZoneExperienceMultiplier(uint32 zone_id, int version)
|
|
{
|
|
for (auto &z: m_zones) {
|
|
if (z.zoneidnumber == zone_id && z.version == version) {
|
|
return z.zone_exp_multiplier;
|
|
}
|
|
}
|
|
|
|
for (auto &z: m_zones) {
|
|
if (z.zoneidnumber == zone_id && z.version == 0) {
|
|
return z.zone_exp_multiplier;
|
|
}
|
|
}
|
|
|
|
return 1.0f;
|
|
}
|
|
|
|
float ZoneStore::GetZoneWalkSpeed(uint32 zone_id, int version)
|
|
{
|
|
for (auto &z: m_zones) {
|
|
if (z.zoneidnumber == zone_id && z.version == version) {
|
|
return z.walkspeed;
|
|
}
|
|
}
|
|
|
|
for (auto &z: m_zones) {
|
|
if (z.zoneidnumber == zone_id && z.version == 0) {
|
|
return z.walkspeed;
|
|
}
|
|
}
|
|
|
|
return DEFAULT_ZONE_RUNSPEED;
|
|
}
|
|
|
|
uint8 ZoneStore::GetZoneTimeType(uint32 zone_id, int version)
|
|
{
|
|
for (auto &z: m_zones) {
|
|
if (z.zoneidnumber == zone_id && z.version == version) {
|
|
return z.time_type;
|
|
}
|
|
}
|
|
|
|
for (auto &z: m_zones) {
|
|
if (z.zoneidnumber == zone_id && z.version == 0) {
|
|
return z.time_type;
|
|
}
|
|
}
|
|
|
|
return 0;
|
|
}
|
|
|
|
float ZoneStore::GetZoneFogDensity(uint32 zone_id, int version)
|
|
{
|
|
for (auto &z: m_zones) {
|
|
if (z.zoneidnumber == zone_id && z.version == version) {
|
|
return z.fog_density;
|
|
}
|
|
}
|
|
|
|
for (auto &z: m_zones) {
|
|
if (z.zoneidnumber == zone_id && z.version == 0) {
|
|
return z.fog_density;
|
|
}
|
|
}
|
|
|
|
return 0.0f;
|
|
}
|
|
|
|
const std::string ZoneStore::GetZoneFlagNeeded(uint32 zone_id, int version)
|
|
{
|
|
for (auto &z: m_zones) {
|
|
if (z.zoneidnumber == zone_id && z.version == version) {
|
|
return z.flag_needed;
|
|
}
|
|
}
|
|
|
|
for (auto &z: m_zones) {
|
|
if (z.zoneidnumber == zone_id && z.version == 0) {
|
|
return z.flag_needed;
|
|
}
|
|
}
|
|
|
|
return "";
|
|
}
|
|
|
|
int8 ZoneStore::GetZoneCanBind(uint32 zone_id, int version)
|
|
{
|
|
for (auto &z: m_zones) {
|
|
if (z.zoneidnumber == zone_id && z.version == version) {
|
|
return z.canbind;
|
|
}
|
|
}
|
|
|
|
for (auto &z: m_zones) {
|
|
if (z.zoneidnumber == zone_id && z.version == 0) {
|
|
return z.canbind;
|
|
}
|
|
}
|
|
|
|
return 0;
|
|
}
|
|
|
|
int8 ZoneStore::GetZoneCanCombat(uint32 zone_id, int version)
|
|
{
|
|
for (auto &z: m_zones) {
|
|
if (z.zoneidnumber == zone_id && z.version == version) {
|
|
return z.cancombat;
|
|
}
|
|
}
|
|
|
|
for (auto &z: m_zones) {
|
|
if (z.zoneidnumber == zone_id && z.version == 0) {
|
|
return z.cancombat;
|
|
}
|
|
}
|
|
|
|
return 0;
|
|
}
|
|
|
|
int8 ZoneStore::GetZoneCanLevitate(uint32 zone_id, int version)
|
|
{
|
|
for (auto &z: m_zones) {
|
|
if (z.zoneidnumber == zone_id && z.version == version) {
|
|
return z.canlevitate;
|
|
}
|
|
}
|
|
|
|
for (auto &z: m_zones) {
|
|
if (z.zoneidnumber == zone_id && z.version == 0) {
|
|
return z.canlevitate;
|
|
}
|
|
}
|
|
|
|
return 0;
|
|
}
|
|
|
|
int8 ZoneStore::GetZoneCastOutdoor(uint32 zone_id, int version)
|
|
{
|
|
for (auto &z: m_zones) {
|
|
if (z.zoneidnumber == zone_id && z.version == version) {
|
|
return z.castoutdoor;
|
|
}
|
|
}
|
|
|
|
for (auto &z: m_zones) {
|
|
if (z.zoneidnumber == zone_id && z.version == 0) {
|
|
return z.castoutdoor;
|
|
}
|
|
}
|
|
|
|
return 0;
|
|
}
|
|
|
|
uint8 ZoneStore::GetZoneHotzone(uint32 zone_id, int version)
|
|
{
|
|
for (auto &z: m_zones) {
|
|
if (z.zoneidnumber == zone_id && z.version == version) {
|
|
return z.hotzone;
|
|
}
|
|
}
|
|
|
|
for (auto &z: m_zones) {
|
|
if (z.zoneidnumber == zone_id && z.version == 0) {
|
|
return z.hotzone;
|
|
}
|
|
}
|
|
|
|
return 0;
|
|
}
|
|
|
|
uint8 ZoneStore::GetZoneInstanceType(uint32 zone_id, int version)
|
|
{
|
|
for (auto &z: m_zones) {
|
|
if (z.zoneidnumber == zone_id && z.version == version) {
|
|
return z.insttype;
|
|
}
|
|
}
|
|
|
|
for (auto &z: m_zones) {
|
|
if (z.zoneidnumber == zone_id && z.version == 0) {
|
|
return z.insttype;
|
|
}
|
|
}
|
|
|
|
return 0;
|
|
}
|
|
|
|
uint64 ZoneStore::GetZoneShutdownDelay(uint32 zone_id, int version)
|
|
{
|
|
for (auto &z: m_zones) {
|
|
if (z.zoneidnumber == zone_id && z.version == version) {
|
|
return z.shutdowndelay;
|
|
}
|
|
}
|
|
|
|
for (auto &z: m_zones) {
|
|
if (z.zoneidnumber == zone_id && z.version == 0) {
|
|
return z.shutdowndelay;
|
|
}
|
|
}
|
|
|
|
return DEFAULT_ZONE_SHUTDOWN_DELAY;
|
|
}
|
|
|
|
int8 ZoneStore::GetZonePEQZone(uint32 zone_id, int version)
|
|
{
|
|
for (auto &z: m_zones) {
|
|
if (z.zoneidnumber == zone_id && z.version == version) {
|
|
return z.peqzone;
|
|
}
|
|
}
|
|
|
|
for (auto &z: m_zones) {
|
|
if (z.zoneidnumber == zone_id && z.version == 0) {
|
|
return z.peqzone;
|
|
}
|
|
}
|
|
|
|
return 0;
|
|
}
|
|
|
|
int8 ZoneStore::GetZoneExpansion(uint32 zone_id, int version)
|
|
{
|
|
for (auto &z: m_zones) {
|
|
if (z.zoneidnumber == zone_id && z.version == version) {
|
|
return z.expansion;
|
|
}
|
|
}
|
|
|
|
for (auto &z: m_zones) {
|
|
if (z.zoneidnumber == zone_id && z.version == 0) {
|
|
return z.expansion;
|
|
}
|
|
}
|
|
|
|
return 0;
|
|
}
|
|
|
|
int8 ZoneStore::GetZoneBypassExpansionCheck(uint32 zone_id, int version)
|
|
{
|
|
for (auto &z: m_zones) {
|
|
if (z.zoneidnumber == zone_id && z.version == version) {
|
|
return z.bypass_expansion_check;
|
|
}
|
|
}
|
|
|
|
for (auto &z: m_zones) {
|
|
if (z.zoneidnumber == zone_id && z.version == 0) {
|
|
return z.bypass_expansion_check;
|
|
}
|
|
}
|
|
|
|
return 0;
|
|
}
|
|
|
|
uint8 ZoneStore::GetZoneSuspendBuffs(uint32 zone_id, int version)
|
|
{
|
|
for (auto &z: m_zones) {
|
|
if (z.zoneidnumber == zone_id && z.version == version) {
|
|
return z.suspendbuffs;
|
|
}
|
|
}
|
|
|
|
for (auto &z: m_zones) {
|
|
if (z.zoneidnumber == zone_id && z.version == 0) {
|
|
return z.suspendbuffs;
|
|
}
|
|
}
|
|
|
|
return 0;
|
|
}
|
|
|
|
int ZoneStore::GetZoneRainChance(uint32 zone_id, uint8 slot, int version)
|
|
{
|
|
for (auto &z: m_zones) {
|
|
if (z.zoneidnumber == zone_id && z.version == version) {
|
|
switch (slot) {
|
|
case RAIN_SLOT_TWO:
|
|
return z.rain_chance2;
|
|
case RAIN_SLOT_THREE:
|
|
return z.rain_chance3;
|
|
case RAIN_SLOT_FOUR:
|
|
return z.rain_chance4;
|
|
case RAIN_SLOT_ONE:
|
|
default:
|
|
return z.rain_chance1;
|
|
}
|
|
}
|
|
}
|
|
|
|
for (auto &z: m_zones) {
|
|
if (z.zoneidnumber == zone_id && z.version == 0) {
|
|
switch (slot) {
|
|
case RAIN_SLOT_TWO:
|
|
return z.rain_chance2;
|
|
case RAIN_SLOT_THREE:
|
|
return z.rain_chance3;
|
|
case RAIN_SLOT_FOUR:
|
|
return z.rain_chance4;
|
|
case RAIN_SLOT_ONE:
|
|
default:
|
|
return z.rain_chance1;
|
|
}
|
|
}
|
|
}
|
|
|
|
return 0;
|
|
}
|
|
|
|
int ZoneStore::GetZoneRainDuration(uint32 zone_id, uint8 slot, int version)
|
|
{
|
|
for (auto &z: m_zones) {
|
|
if (z.zoneidnumber == zone_id && z.version == version) {
|
|
switch (slot) {
|
|
case RAIN_SLOT_TWO:
|
|
return z.rain_duration2;
|
|
case RAIN_SLOT_THREE:
|
|
return z.rain_duration3;
|
|
case RAIN_SLOT_FOUR:
|
|
return z.rain_duration4;
|
|
case RAIN_SLOT_ONE:
|
|
default:
|
|
return z.rain_duration1;
|
|
}
|
|
}
|
|
}
|
|
|
|
for (auto &z: m_zones) {
|
|
if (z.zoneidnumber == zone_id && z.version == 0) {
|
|
switch (slot) {
|
|
case RAIN_SLOT_TWO:
|
|
return z.rain_duration2;
|
|
case RAIN_SLOT_THREE:
|
|
return z.rain_duration3;
|
|
case RAIN_SLOT_FOUR:
|
|
return z.rain_duration4;
|
|
case RAIN_SLOT_ONE:
|
|
default:
|
|
return z.rain_duration1;
|
|
}
|
|
}
|
|
}
|
|
|
|
return 0;
|
|
}
|
|
|
|
int ZoneStore::GetZoneSnowChance(uint32 zone_id, uint8 slot, int version)
|
|
{
|
|
for (auto &z: m_zones) {
|
|
if (z.zoneidnumber == zone_id && z.version == version) {
|
|
switch (slot) {
|
|
case SNOW_SLOT_TWO:
|
|
return z.snow_chance2;
|
|
case SNOW_SLOT_THREE:
|
|
return z.snow_chance3;
|
|
case SNOW_SLOT_FOUR:
|
|
return z.snow_chance4;
|
|
case SNOW_SLOT_ONE:
|
|
default:
|
|
return z.snow_chance1;
|
|
}
|
|
}
|
|
}
|
|
|
|
for (auto &z: m_zones) {
|
|
if (z.zoneidnumber == zone_id && z.version == 0) {
|
|
switch (slot) {
|
|
case SNOW_SLOT_TWO:
|
|
return z.snow_chance2;
|
|
case SNOW_SLOT_THREE:
|
|
return z.snow_chance3;
|
|
case SNOW_SLOT_FOUR:
|
|
return z.snow_chance4;
|
|
case SNOW_SLOT_ONE:
|
|
default:
|
|
return z.snow_chance1;
|
|
}
|
|
}
|
|
}
|
|
|
|
return 0;
|
|
}
|
|
|
|
int ZoneStore::GetZoneSnowDuration(uint32 zone_id, uint8 slot, int version)
|
|
{
|
|
for (auto &z: m_zones) {
|
|
if (z.zoneidnumber == zone_id && z.version == version) {
|
|
switch (slot) {
|
|
case SNOW_SLOT_TWO:
|
|
return z.snow_duration2;
|
|
case SNOW_SLOT_THREE:
|
|
return z.snow_duration3;
|
|
case SNOW_SLOT_FOUR:
|
|
return z.snow_duration4;
|
|
case SNOW_SLOT_ONE:
|
|
default:
|
|
return z.snow_duration1;
|
|
}
|
|
}
|
|
}
|
|
|
|
for (auto &z: m_zones) {
|
|
if (z.zoneidnumber == zone_id && z.version == 0) {
|
|
switch (slot) {
|
|
case SNOW_SLOT_TWO:
|
|
return z.snow_duration2;
|
|
case SNOW_SLOT_THREE:
|
|
return z.snow_duration3;
|
|
case SNOW_SLOT_FOUR:
|
|
return z.snow_duration4;
|
|
case SNOW_SLOT_ONE:
|
|
default:
|
|
return z.snow_duration1;
|
|
}
|
|
}
|
|
}
|
|
|
|
return 0;
|
|
}
|
|
|
|
float ZoneStore::GetZoneGravity(uint32 zone_id, int version)
|
|
{
|
|
for (auto &z: m_zones) {
|
|
if (z.zoneidnumber == zone_id && z.version == version) {
|
|
return z.gravity;
|
|
}
|
|
}
|
|
|
|
for (auto &z: m_zones) {
|
|
if (z.zoneidnumber == zone_id && z.version == 0) {
|
|
return z.gravity;
|
|
}
|
|
}
|
|
|
|
return DEFAULT_ZONE_GRAVITY;
|
|
}
|
|
|
|
int ZoneStore::GetZoneType(uint32 zone_id, int version)
|
|
{
|
|
for (auto &z: m_zones) {
|
|
if (z.zoneidnumber == zone_id && z.version == version) {
|
|
return z.type;
|
|
}
|
|
}
|
|
|
|
for (auto &z: m_zones) {
|
|
if (z.zoneidnumber == zone_id && z.version == 0) {
|
|
return z.type;
|
|
}
|
|
}
|
|
|
|
return DEFAULT_ZONE_TYPE;
|
|
}
|
|
|
|
int8 ZoneStore::GetZoneSkyLock(uint32 zone_id, int version)
|
|
{
|
|
for (auto &z: m_zones) {
|
|
if (z.zoneidnumber == zone_id && z.version == version) {
|
|
return z.skylock;
|
|
}
|
|
}
|
|
|
|
for (auto &z: m_zones) {
|
|
if (z.zoneidnumber == zone_id && z.version == 0) {
|
|
return z.skylock;
|
|
}
|
|
}
|
|
|
|
return 0;
|
|
}
|
|
|
|
int ZoneStore::GetZoneFastRegenHP(uint32 zone_id, int version)
|
|
{
|
|
for (auto &z: m_zones) {
|
|
if (z.zoneidnumber == zone_id && z.version == version) {
|
|
return z.fast_regen_hp;
|
|
}
|
|
}
|
|
|
|
for (auto &z: m_zones) {
|
|
if (z.zoneidnumber == zone_id && z.version == 0) {
|
|
return z.fast_regen_hp;
|
|
}
|
|
}
|
|
|
|
return DEFAULT_ZONE_FAST_REGEN;
|
|
}
|
|
|
|
int ZoneStore::GetZoneFastRegenMana(uint32 zone_id, int version)
|
|
{
|
|
for (auto &z: m_zones) {
|
|
if (z.zoneidnumber == zone_id && z.version == version) {
|
|
return z.fast_regen_mana;
|
|
}
|
|
}
|
|
|
|
for (auto &z: m_zones) {
|
|
if (z.zoneidnumber == zone_id && z.version == 0) {
|
|
return z.fast_regen_mana;
|
|
}
|
|
}
|
|
|
|
return DEFAULT_ZONE_FAST_REGEN;
|
|
}
|
|
|
|
int ZoneStore::GetZoneFastRegenEndurance(uint32 zone_id, int version)
|
|
{
|
|
for (auto &z: m_zones) {
|
|
if (z.zoneidnumber == zone_id && z.version == version) {
|
|
return z.fast_regen_endurance;
|
|
}
|
|
}
|
|
|
|
for (auto &z: m_zones) {
|
|
if (z.zoneidnumber == zone_id && z.version == 0) {
|
|
return z.fast_regen_endurance;
|
|
}
|
|
}
|
|
|
|
return DEFAULT_ZONE_FAST_REGEN;
|
|
}
|
|
|
|
int ZoneStore::GetZoneNPCMaximumAggroDistance(uint32 zone_id, int version)
|
|
{
|
|
for (auto &z: m_zones) {
|
|
if (z.zoneidnumber == zone_id && z.version == version) {
|
|
return z.npc_max_aggro_dist;
|
|
}
|
|
}
|
|
|
|
for (auto &z: m_zones) {
|
|
if (z.zoneidnumber == zone_id && z.version == 0) {
|
|
return z.npc_max_aggro_dist;
|
|
}
|
|
}
|
|
|
|
return DEFAULT_ZONE_MAX_AGGRO_DISTANCE;
|
|
}
|
|
|
|
uint32 ZoneStore::GetZoneMaximumMovementUpdateRange(uint32 zone_id, int version)
|
|
{
|
|
for (auto &z: m_zones) {
|
|
if (z.zoneidnumber == zone_id && z.version == version) {
|
|
return z.max_movement_update_range;
|
|
}
|
|
}
|
|
|
|
for (auto &z: m_zones) {
|
|
if (z.zoneidnumber == zone_id && z.version == 0) {
|
|
return z.max_movement_update_range;
|
|
}
|
|
}
|
|
|
|
return DEFAULT_ZONE_MAX_MOVEMENT_UPDATE_RANGE;
|
|
}
|
|
|
|
int8 ZoneStore::GetZoneMinimumExpansion(uint32 zone_id, int version)
|
|
{
|
|
for (auto &z: m_zones) {
|
|
if (z.zoneidnumber == zone_id && z.version == version) {
|
|
return z.min_expansion;
|
|
}
|
|
}
|
|
|
|
for (auto &z: m_zones) {
|
|
if (z.zoneidnumber == zone_id && z.version == 0) {
|
|
return z.min_expansion;
|
|
}
|
|
}
|
|
|
|
return DEFAULT_ZONE_MIN_MAX_EXPANSION;
|
|
}
|
|
|
|
int8 ZoneStore::GetZoneMaximumExpansion(uint32 zone_id, int version)
|
|
{
|
|
for (auto &z: m_zones) {
|
|
if (z.zoneidnumber == zone_id && z.version == version) {
|
|
return z.max_expansion;
|
|
}
|
|
}
|
|
|
|
for (auto &z: m_zones) {
|
|
if (z.zoneidnumber == zone_id && z.version == 0) {
|
|
return z.max_expansion;
|
|
}
|
|
}
|
|
|
|
return DEFAULT_ZONE_MIN_MAX_EXPANSION;
|
|
}
|
|
|
|
const std::string ZoneStore::GetZoneContentFlags(uint32 zone_id, int version)
|
|
{
|
|
for (auto &z: m_zones) {
|
|
if (z.zoneidnumber == zone_id && z.version == version) {
|
|
return z.content_flags;
|
|
}
|
|
}
|
|
|
|
for (auto &z: m_zones) {
|
|
if (z.zoneidnumber == zone_id && z.version == 0) {
|
|
return z.content_flags;
|
|
}
|
|
};
|
|
|
|
return "";
|
|
}
|
|
|
|
const std::string ZoneStore::GetZoneContentFlagsDisabled(uint32 zone_id, int version)
|
|
{
|
|
for (auto &z: m_zones) {
|
|
if (z.zoneidnumber == zone_id && z.version == version) {
|
|
return z.content_flags_disabled;
|
|
}
|
|
}
|
|
|
|
for (auto &z: m_zones) {
|
|
if (z.zoneidnumber == zone_id && z.version == 0) {
|
|
return z.content_flags_disabled;
|
|
}
|
|
}
|
|
|
|
return "";
|
|
}
|
|
|
|
int ZoneStore::GetZoneUnderworldTeleportIndex(uint32 zone_id, int version)
|
|
{
|
|
for (auto &z: m_zones) {
|
|
if (z.zoneidnumber == zone_id && z.version == version) {
|
|
return z.underworld_teleport_index;
|
|
}
|
|
}
|
|
|
|
for (auto &z: m_zones) {
|
|
if (z.zoneidnumber == zone_id && z.version == 0) {
|
|
return z.underworld_teleport_index;
|
|
}
|
|
}
|
|
|
|
return 0;
|
|
}
|
|
|
|
int ZoneStore::GetZoneLavaDamage(uint32 zone_id, int version)
|
|
{
|
|
for (auto &z: m_zones) {
|
|
if (z.zoneidnumber == zone_id && z.version == version) {
|
|
return z.lava_damage;
|
|
}
|
|
}
|
|
|
|
for (auto &z: m_zones) {
|
|
if (z.zoneidnumber == zone_id && z.version == 0) {
|
|
return z.lava_damage;
|
|
}
|
|
}
|
|
|
|
return 0;
|
|
}
|
|
|
|
int ZoneStore::GetZoneMinimumLavaDamage(uint32 zone_id, int version)
|
|
{
|
|
for (auto &z: m_zones) {
|
|
if (z.zoneidnumber == zone_id && z.version == version) {
|
|
return z.min_lava_damage;
|
|
}
|
|
}
|
|
|
|
for (auto &z: m_zones) {
|
|
if (z.zoneidnumber == zone_id && z.version == 0) {
|
|
return z.min_lava_damage;
|
|
}
|
|
}
|
|
|
|
return 0;
|
|
}
|
|
|
|
uint8 ZoneStore::GetZoneIdleWhenEmpty(uint32 zone_id, int version)
|
|
{
|
|
for (auto &z: m_zones) {
|
|
if (z.zoneidnumber == zone_id && z.version == version) {
|
|
return z.idle_when_empty;
|
|
}
|
|
}
|
|
|
|
for (auto &z: m_zones) {
|
|
if (z.zoneidnumber == zone_id && z.version == 0) {
|
|
return z.idle_when_empty;
|
|
}
|
|
}
|
|
|
|
return 1;
|
|
}
|
|
|
|
uint32 ZoneStore::GetZoneSecondsBeforeIdle(uint32 zone_id, int version)
|
|
{
|
|
for (auto &z: m_zones) {
|
|
if (z.zoneidnumber == zone_id && z.version == version) {
|
|
return z.seconds_before_idle;
|
|
}
|
|
}
|
|
|
|
for (auto &z: m_zones) {
|
|
if (z.zoneidnumber == zone_id && z.version == 0) {
|
|
return z.seconds_before_idle;
|
|
}
|
|
}
|
|
|
|
return 60;
|
|
}
|