eqemu-server/zone/npc_scale_manager.h
Alex King 2a20c69c69
[Scaling] Add support for zone ID and instance version to NPC Scaling (#2968)
* [Scaling] Add support for zone ID and instance version to NPC Scaling

# Notes
- Adds `zone_id` and `instance_version` to `npc_scale_global_base` table to allow for zone and version-specific scaling.
- Defaults back to `zone_id` of `0` and `instance_version` of `0` for global scaling.
- Scaling load precedence is as follows:
- `zone_id` of current zone and `instance_version` of current instance
- `zone_id` of current zone and `instance_version` of `0`
- `zone_id` of `0` and `instance_version` of `0`

* Remove debug comment.

* Use zone not NPC.

* SQL
2023-02-24 20:17:07 -06:00

118 lines
2.8 KiB
C++

/**
* EQEmulator: Everquest Server Emulator
* Copyright (C) 2001-2018 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
*
*/
#ifndef EQEMU_NPC_SCALE_MANAGER_H
#define EQEMU_NPC_SCALE_MANAGER_H
#include "npc.h"
#include "zone.h"
extern Zone* zone;
class NpcScaleManager {
public:
struct global_npc_scale {
int8 type;
uint8 level;
uint32 zone_id;
uint16 instance_version;
int ac;
int64 hp;
int accuracy;
int slow_mitigation;
int attack;
int strength;
int stamina;
int dexterity;
int agility;
int intelligence;
int wisdom;
int charisma;
int magic_resist;
int cold_resist;
int fire_resist;
int poison_resist;
int disease_resist;
int corruption_resist;
int physical_resist;
int min_dmg;
int max_dmg;
int64 hp_regen_rate;
int attack_delay;
int spell_scale;
int heal_scale;
std::string special_abilities;
};
std::vector<std::string> scaling_stats = {
"ac",
"max_hp",
"accuracy",
"slow_mitigation",
"atk",
"str",
"sta",
"dex",
"agi",
"int",
"wis",
"cha",
"mr",
"cr",
"fr",
"pr",
"dr",
"cr",
"pr",
"min_hit",
"max_hit",
"hp_regen",
"attack_delay",
"spell_scale",
"heal_scale",
"special_abilities"
};
void ScaleNPC(NPC* npc, bool always_scale = false, bool override_special_abilities = false);
void ResetNPCScaling(NPC* npc);
bool IsAutoScaled(NPC* npc);
bool LoadScaleData();
global_npc_scale GetGlobalScaleDataForTypeLevel(
int8 npc_type,
uint8 npc_level,
uint32 zone_id,
uint16 instance_version
);
std::map<std::tuple<int8, uint8, uint32, uint16>, global_npc_scale> npc_global_base_scaling_data;
int8 GetNPCScalingType(NPC * &npc);
std::string GetNPCScalingTypeName(NPC * &npc);
bool ApplyGlobalBaseScalingToNPCStatically(NPC * &npc);
bool ApplyGlobalBaseScalingToNPCDynamically(NPC * &npc);
uint32 GetClassLevelDamageMod(uint32 level, uint32 npc_class);
};
extern NpcScaleManager *npc_scale_manager;
#endif //EQEMU_NPC_SCALE_MANAGER_H