diff options
-rw-r--r-- | sql/updates/world/master/2023_12_28_05_world.sql | 2 | ||||
-rw-r--r-- | src/server/game/Entities/Creature/Creature.cpp | 129 | ||||
-rw-r--r-- | src/server/game/Entities/Creature/Creature.h | 11 | ||||
-rw-r--r-- | src/server/game/Entities/Creature/CreatureData.h | 2 | ||||
-rw-r--r-- | src/server/game/Entities/Pet/Pet.cpp | 2 | ||||
-rw-r--r-- | src/server/game/Entities/Unit/StatSystem.cpp | 2 | ||||
-rw-r--r-- | src/server/game/Entities/Unit/Unit.cpp | 2 | ||||
-rw-r--r-- | src/server/game/Globals/ObjectMgr.cpp | 4 | ||||
-rw-r--r-- | src/server/game/Miscellaneous/Formulas.h | 2 | ||||
-rw-r--r-- | src/server/game/Miscellaneous/SharedDefines.h | 18 | ||||
-rw-r--r-- | src/server/game/Spells/SpellEffects.cpp | 2 | ||||
-rw-r--r-- | src/server/game/World/World.cpp | 75 | ||||
-rw-r--r-- | src/server/game/World/World.h | 42 | ||||
-rw-r--r-- | src/server/worldserver/worldserver.conf.dist | 163 |
14 files changed, 258 insertions, 198 deletions
diff --git a/sql/updates/world/master/2023_12_28_05_world.sql b/sql/updates/world/master/2023_12_28_05_world.sql new file mode 100644 index 00000000000..43c067d7162 --- /dev/null +++ b/sql/updates/world/master/2023_12_28_05_world.sql @@ -0,0 +1,2 @@ +ALTER TABLE `creature_template` + CHANGE COLUMN `rank` `Classification` TINYINT(3) UNSIGNED NOT NULL DEFAULT '0' AFTER `scale`; diff --git a/src/server/game/Entities/Creature/Creature.cpp b/src/server/game/Entities/Creature/Creature.cpp index 884d48f6f7e..48be8874ff8 100644 --- a/src/server/game/Entities/Creature/Creature.cpp +++ b/src/server/game/Entities/Creature/Creature.cpp @@ -192,7 +192,7 @@ WorldPacket CreatureTemplate::BuildQueryData(LocaleConstant loc, Difficulty diff stats.CreatureType = type; stats.CreatureFamily = family; - stats.Classification = rank; + stats.Classification = uint32(Classification); for (uint32 i = 0; i < MAX_KILL_CREDIT; ++i) stats.ProxyCreatureID[i] = KillCredit[i]; @@ -1114,19 +1114,25 @@ bool Creature::Create(ObjectGuid::LowType guidlow, Map* map, uint32 entry, Posit if (cinfo->flags_extra & CREATURE_FLAG_EXTRA_DUNGEON_BOSS && map->IsDungeon()) m_respawnDelay = 0; // special value, prevents respawn for dungeon bosses unless overridden - switch (cinfo->rank) + switch (GetCreatureClassification()) { - case CREATURE_ELITE_RARE: - m_corpseDelay = sWorld->getIntConfig(CONFIG_CORPSE_DECAY_RARE); - break; - case CREATURE_ELITE_ELITE: + case CreatureClassifications::Elite: m_corpseDelay = sWorld->getIntConfig(CONFIG_CORPSE_DECAY_ELITE); break; - case CREATURE_ELITE_RAREELITE: + case CreatureClassifications::RareElite: m_corpseDelay = sWorld->getIntConfig(CONFIG_CORPSE_DECAY_RAREELITE); break; - case CREATURE_ELITE_WORLDBOSS: - m_corpseDelay = sWorld->getIntConfig(CONFIG_CORPSE_DECAY_WORLDBOSS); + case CreatureClassifications::Obsolete: + m_corpseDelay = sWorld->getIntConfig(CONFIG_CORPSE_DECAY_OBSOLETE); + break; + case CreatureClassifications::Rare: + m_corpseDelay = sWorld->getIntConfig(CONFIG_CORPSE_DECAY_RARE); + break; + case CreatureClassifications::Trivial: + m_corpseDelay = sWorld->getIntConfig(CONFIG_CORPSE_DECAY_TRIVIAL); + break; + case CreatureClassifications::MinusMob: + m_corpseDelay = sWorld->getIntConfig(CONFIG_CORPSE_DECAY_MINUSMOB); break; default: m_corpseDelay = sWorld->getIntConfig(CONFIG_CORPSE_DECAY_NORMAL); @@ -1574,12 +1580,12 @@ void Creature::SelectLevel() void Creature::UpdateLevelDependantStats() { CreatureTemplate const* cInfo = GetCreatureTemplate(); - uint32 rank = IsPet() ? 0 : cInfo->rank; + CreatureClassifications classification = IsPet() ? CreatureClassifications::Normal : cInfo->Classification; uint8 level = GetLevel(); CreatureBaseStats const* stats = sObjectMgr->GetCreatureBaseStats(level, cInfo->unit_class); // health - float healthmod = _GetHealthMod(rank); + float healthmod = GetHealthMod(classification); uint32 basehp = GetMaxHealthByLevel(level); uint32 health = uint32(basehp * healthmod); @@ -1641,22 +1647,26 @@ void Creature::SelectWildBattlePetLevel() } } -float Creature::_GetHealthMod(int32 Rank) +float Creature::GetHealthMod(CreatureClassifications classification) { - switch (Rank) // define rates for each elite rank + switch (classification) { - case CREATURE_ELITE_NORMAL: - return sWorld->getRate(RATE_CREATURE_NORMAL_HP); - case CREATURE_ELITE_ELITE: - return sWorld->getRate(RATE_CREATURE_ELITE_ELITE_HP); - case CREATURE_ELITE_RAREELITE: - return sWorld->getRate(RATE_CREATURE_ELITE_RAREELITE_HP); - case CREATURE_ELITE_WORLDBOSS: - return sWorld->getRate(RATE_CREATURE_ELITE_WORLDBOSS_HP); - case CREATURE_ELITE_RARE: - return sWorld->getRate(RATE_CREATURE_ELITE_RARE_HP); + case CreatureClassifications::Normal: + return sWorld->getRate(RATE_CREATURE_HP_NORMAL); + case CreatureClassifications::Elite: + return sWorld->getRate(RATE_CREATURE_HP_ELITE); + case CreatureClassifications::RareElite: + return sWorld->getRate(RATE_CREATURE_HP_RAREELITE); + case CreatureClassifications::Obsolete: + return sWorld->getRate(RATE_CREATURE_HP_OBSOLETE); + case CreatureClassifications::Rare: + return sWorld->getRate(RATE_CREATURE_HP_RARE); + case CreatureClassifications::Trivial: + return sWorld->getRate(RATE_CREATURE_HP_TRIVIAL); + case CreatureClassifications::MinusMob: + return sWorld->getRate(RATE_CREATURE_HP_MINUSMOB); default: - return sWorld->getRate(RATE_CREATURE_ELITE_ELITE_HP); + return sWorld->getRate(RATE_CREATURE_HP_ELITE); } } @@ -1666,41 +1676,49 @@ void Creature::LowerPlayerDamageReq(uint64 unDamage) m_PlayerDamageReq > unDamage ? m_PlayerDamageReq -= unDamage : m_PlayerDamageReq = 0; } -float Creature::_GetDamageMod(int32 Rank) -{ - switch (Rank) // define rates for each elite rank - { - case CREATURE_ELITE_NORMAL: - return sWorld->getRate(RATE_CREATURE_NORMAL_DAMAGE); - case CREATURE_ELITE_ELITE: - return sWorld->getRate(RATE_CREATURE_ELITE_ELITE_DAMAGE); - case CREATURE_ELITE_RAREELITE: - return sWorld->getRate(RATE_CREATURE_ELITE_RAREELITE_DAMAGE); - case CREATURE_ELITE_WORLDBOSS: - return sWorld->getRate(RATE_CREATURE_ELITE_WORLDBOSS_DAMAGE); - case CREATURE_ELITE_RARE: - return sWorld->getRate(RATE_CREATURE_ELITE_RARE_DAMAGE); +float Creature::GetDamageMod(CreatureClassifications classification) +{ + switch (classification) + { + case CreatureClassifications::Normal: + return sWorld->getRate(RATE_CREATURE_DAMAGE_NORMAL); + case CreatureClassifications::Elite: + return sWorld->getRate(RATE_CREATURE_DAMAGE_ELITE); + case CreatureClassifications::RareElite: + return sWorld->getRate(RATE_CREATURE_DAMAGE_RAREELITE); + case CreatureClassifications::Obsolete: + return sWorld->getRate(RATE_CREATURE_DAMAGE_OBSOLETE); + case CreatureClassifications::Rare: + return sWorld->getRate(RATE_CREATURE_DAMAGE_RARE); + case CreatureClassifications::Trivial: + return sWorld->getRate(RATE_CREATURE_DAMAGE_TRIVIAL); + case CreatureClassifications::MinusMob: + return sWorld->getRate(RATE_CREATURE_DAMAGE_MINUSMOB); default: - return sWorld->getRate(RATE_CREATURE_ELITE_ELITE_DAMAGE); + return sWorld->getRate(RATE_CREATURE_DAMAGE_ELITE); } } -float Creature::GetSpellDamageMod(int32 Rank) const +float Creature::GetSpellDamageMod(CreatureClassifications classification) const { - switch (Rank) // define rates for each elite rank + switch (classification) { - case CREATURE_ELITE_NORMAL: - return sWorld->getRate(RATE_CREATURE_NORMAL_SPELLDAMAGE); - case CREATURE_ELITE_ELITE: - return sWorld->getRate(RATE_CREATURE_ELITE_ELITE_SPELLDAMAGE); - case CREATURE_ELITE_RAREELITE: - return sWorld->getRate(RATE_CREATURE_ELITE_RAREELITE_SPELLDAMAGE); - case CREATURE_ELITE_WORLDBOSS: - return sWorld->getRate(RATE_CREATURE_ELITE_WORLDBOSS_SPELLDAMAGE); - case CREATURE_ELITE_RARE: - return sWorld->getRate(RATE_CREATURE_ELITE_RARE_SPELLDAMAGE); + case CreatureClassifications::Normal: + return sWorld->getRate(RATE_CREATURE_SPELLDAMAGE_NORMAL); + case CreatureClassifications::Elite: + return sWorld->getRate(RATE_CREATURE_SPELLDAMAGE_ELITE); + case CreatureClassifications::RareElite: + return sWorld->getRate(RATE_CREATURE_SPELLDAMAGE_RAREELITE); + case CreatureClassifications::Obsolete: + return sWorld->getRate(RATE_CREATURE_SPELLDAMAGE_OBSOLETE); + case CreatureClassifications::Rare: + return sWorld->getRate(RATE_CREATURE_SPELLDAMAGE_RARE); + case CreatureClassifications::Trivial: + return sWorld->getRate(RATE_CREATURE_SPELLDAMAGE_TRIVIAL); + case CreatureClassifications::MinusMob: + return sWorld->getRate(RATE_CREATURE_SPELLDAMAGE_MINUSMOB); default: - return sWorld->getRate(RATE_CREATURE_ELITE_ELITE_SPELLDAMAGE); + return sWorld->getRate(RATE_CREATURE_SPELLDAMAGE_ELITE); } } @@ -1948,7 +1966,7 @@ void Creature::SetSpawnHealth() curhealth = m_creatureData->curhealth; if (curhealth) { - curhealth = uint32(curhealth*_GetHealthMod(GetCreatureTemplate()->rank)); + curhealth = uint32(curhealth*GetHealthMod(GetCreatureTemplate()->Classification)); if (curhealth < 1) curhealth = 1; } @@ -2444,13 +2462,12 @@ bool Creature::IsImmunedToSpellEffect(SpellInfo const* spellInfo, SpellEffectInf return Unit::IsImmunedToSpellEffect(spellInfo, spellEffectInfo, caster, requireImmunityPurgesEffectAttribute); } -bool Creature::isElite() const +bool Creature::IsElite() const { if (IsPet()) return false; - uint32 rank = GetCreatureTemplate()->rank; - return rank != CREATURE_ELITE_NORMAL && rank != CREATURE_ELITE_RARE; + return HasClassification(CreatureClassifications::Elite) || HasClassification(CreatureClassifications::RareElite); } bool Creature::isWorldBoss() const diff --git a/src/server/game/Entities/Creature/Creature.h b/src/server/game/Entities/Creature/Creature.h index 46aa837a386..8c77b6dd3eb 100644 --- a/src/server/game/Entities/Creature/Creature.h +++ b/src/server/game/Entities/Creature/Creature.h @@ -129,6 +129,9 @@ class TC_GAME_API Creature : public Unit, public GridObject<Creature>, public Ma MovementGeneratorType GetDefaultMovementType() const override { return m_defaultMovementType; } void SetDefaultMovementType(MovementGeneratorType mgt) { m_defaultMovementType = mgt; } + CreatureClassifications GetCreatureClassification() const { return GetCreatureTemplate()->Classification; } + bool HasClassification(CreatureClassifications classification) const { return GetCreatureTemplate()->Classification == classification; } + bool IsDungeonBoss() const { return (GetCreatureTemplate()->flags_extra & CREATURE_FLAG_EXTRA_DUNGEON_BOSS) != 0; } bool IsAffectedByDiminishingReturns() const override { return Unit::IsAffectedByDiminishingReturns() || (GetCreatureTemplate()->flags_extra & CREATURE_FLAG_EXTRA_ALL_DIMINISH) != 0; } @@ -157,7 +160,7 @@ class TC_GAME_API Creature : public Unit, public GridObject<Creature>, public Ma bool CanCreatureAttack(Unit const* victim, bool force = true) const; void LoadTemplateImmunities(); bool IsImmunedToSpellEffect(SpellInfo const* spellInfo, SpellEffectInfo const& spellEffectInfo, WorldObject const* caster, bool requireImmunityPurgesEffectAttribute = false) const override; - bool isElite() const; + bool IsElite() const; bool isWorldBoss() const; bool HasScalableLevels() const; @@ -208,7 +211,7 @@ class TC_GAME_API Creature : public Unit, public GridObject<Creature>, public Ma uint8 GetCurrentEquipmentId() const { return m_equipmentId; } void SetCurrentEquipmentId(uint8 id) { m_equipmentId = id; } - float GetSpellDamageMod(int32 Rank) const; + float GetSpellDamageMod(CreatureClassifications classification) const; VendorItemData const* GetVendorItems() const; uint32 GetVendorItemCurrentCount(VendorItem const* vItem); @@ -366,7 +369,7 @@ class TC_GAME_API Creature : public Unit, public GridObject<Creature>, public Ma void SetRespawnCompatibilityMode(bool mode = true) { m_respawnCompatibilityMode = mode; } bool GetRespawnCompatibilityMode() { return m_respawnCompatibilityMode; } - static float _GetDamageMod(int32 Rank); + static float GetDamageMod(CreatureClassifications classification); float m_SightDistance, m_CombatDistance; @@ -436,7 +439,7 @@ class TC_GAME_API Creature : public Unit, public GridObject<Creature>, public Ma // vendor items VendorItemCounts m_vendorItemCounts; - static float _GetHealthMod(int32 Rank); + static float GetHealthMod(CreatureClassifications classification); GuidUnorderedSet m_tapList; bool m_dontClearTapListOnEvade; diff --git a/src/server/game/Entities/Creature/CreatureData.h b/src/server/game/Entities/Creature/CreatureData.h index 31961aa04c9..1f706e5c8d2 100644 --- a/src/server/game/Entities/Creature/CreatureData.h +++ b/src/server/game/Entities/Creature/CreatureData.h @@ -518,7 +518,7 @@ struct TC_GAME_API CreatureTemplate float speed_walk; float speed_run; float scale; - uint32 rank; + CreatureClassifications Classification; uint32 dmgschool; uint32 BaseAttackTime; uint32 RangeAttackTime; diff --git a/src/server/game/Entities/Pet/Pet.cpp b/src/server/game/Entities/Pet/Pet.cpp index 067b2f6b74f..35da121270d 100644 --- a/src/server/game/Entities/Pet/Pet.cpp +++ b/src/server/game/Entities/Pet/Pet.cpp @@ -908,7 +908,7 @@ bool Guardian::InitStatsForLevel(uint8 petlevel) ApplyLevelScaling(); CreatureDifficulty const* creatureDifficulty = GetCreatureDifficulty(); - SetCreateHealth(std::max(sDB2Manager.EvaluateExpectedStat(ExpectedStatType::CreatureHealth, petlevel, creatureDifficulty->GetHealthScalingExpansion(), m_unitData->ContentTuningID, Classes(cinfo->unit_class), 0) * creatureDifficulty->HealthModifier * _GetHealthMod(cinfo->rank), 1.0f)); + SetCreateHealth(std::max(sDB2Manager.EvaluateExpectedStat(ExpectedStatType::CreatureHealth, petlevel, creatureDifficulty->GetHealthScalingExpansion(), m_unitData->ContentTuningID, Classes(cinfo->unit_class), 0) * creatureDifficulty->HealthModifier * GetHealthMod(cinfo->Classification), 1.0f)); SetCreateMana(stats->BaseMana); SetCreateStat(STAT_STRENGTH, 22); SetCreateStat(STAT_AGILITY, 22); diff --git a/src/server/game/Entities/Unit/StatSystem.cpp b/src/server/game/Entities/Unit/StatSystem.cpp index 3373462cba6..5f97bb49a7c 100644 --- a/src/server/game/Entities/Unit/StatSystem.cpp +++ b/src/server/game/Entities/Unit/StatSystem.cpp @@ -1034,7 +1034,7 @@ void Creature::CalculateMinMaxDamage(WeaponAttackType attType, bool normalized, float basePct = GetPctModifierValue(unitMod, BASE_PCT) * attackSpeedMulti; float totalValue = GetFlatModifierValue(unitMod, TOTAL_VALUE); float totalPct = addTotalPct ? GetPctModifierValue(unitMod, TOTAL_PCT) : 1.0f; - float dmgMultiplier = GetCreatureDifficulty()->DamageModifier; // = DamageModifier * _GetDamageMod(rank); + float dmgMultiplier = GetCreatureDifficulty()->DamageModifier; // = DamageModifier * GetDamageMod(rank); minDamage = ((weaponMinDamage + baseValue) * dmgMultiplier * basePct + totalValue) * totalPct; maxDamage = ((weaponMaxDamage + baseValue) * dmgMultiplier * basePct + totalValue) * totalPct; diff --git a/src/server/game/Entities/Unit/Unit.cpp b/src/server/game/Entities/Unit/Unit.cpp index a6742b85860..c805ba9025e 100644 --- a/src/server/game/Entities/Unit/Unit.cpp +++ b/src/server/game/Entities/Unit/Unit.cpp @@ -6635,7 +6635,7 @@ float Unit::SpellDamagePctDone(Unit* victim, SpellInfo const* spellProto, Damage // Pet damage? if (GetTypeId() == TYPEID_UNIT && !IsPet()) - DoneTotalMod *= ToCreature()->GetSpellDamageMod(ToCreature()->GetCreatureTemplate()->rank); + DoneTotalMod *= ToCreature()->GetSpellDamageMod(ToCreature()->GetCreatureTemplate()->Classification); // Versatility if (Player* modOwner = GetSpellModOwner()) diff --git a/src/server/game/Globals/ObjectMgr.cpp b/src/server/game/Globals/ObjectMgr.cpp index 27456a6e6d3..f75ea583546 100644 --- a/src/server/game/Globals/ObjectMgr.cpp +++ b/src/server/game/Globals/ObjectMgr.cpp @@ -427,7 +427,7 @@ void ObjectMgr::LoadCreatureTemplate(Field* fields) creatureTemplate.speed_walk = fields[12].GetFloat(); creatureTemplate.speed_run = fields[13].GetFloat(); creatureTemplate.scale = fields[14].GetFloat(); - creatureTemplate.rank = uint32(fields[15].GetUInt8()); + creatureTemplate.Classification = CreatureClassifications(fields[15].GetUInt8()); creatureTemplate.dmgschool = uint32(fields[16].GetInt8()); creatureTemplate.BaseAttackTime = fields[17].GetUInt32(); creatureTemplate.RangeAttackTime = fields[18].GetUInt32(); @@ -973,7 +973,7 @@ void ObjectMgr::LoadCreatureTemplateDifficulty() CreatureStaticFlags6(fields[23].GetUInt32()), CreatureStaticFlags7(fields[24].GetUInt32()), CreatureStaticFlags8(fields[25].GetUInt32())); // TODO: Check if this still applies - creatureDifficulty.DamageModifier *= Creature::_GetDamageMod(itr->second.rank); + creatureDifficulty.DamageModifier *= Creature::GetDamageMod(itr->second.Classification); if (creatureDifficulty.HealthScalingExpansion < EXPANSION_LEVEL_CURRENT || creatureDifficulty.HealthScalingExpansion >= MAX_EXPANSIONS) { diff --git a/src/server/game/Miscellaneous/Formulas.h b/src/server/game/Miscellaneous/Formulas.h index 6630602b026..6a1f5d1540a 100644 --- a/src/server/game/Miscellaneous/Formulas.h +++ b/src/server/game/Miscellaneous/Formulas.h @@ -191,7 +191,7 @@ namespace Trinity if ((uint32(creature->GetCreatureDifficulty()->GetHealthScalingExpansion()) < GetExpansionForLevel(player->GetLevel()))) gain = uint32(round(gain / 10.0f)); - if (creature->isElite()) + if (creature->IsElite()) { // Elites in instances have a 2.75x XP bonus instead of the regular 2x world bonus. if (u->GetMap()->IsDungeon()) diff --git a/src/server/game/Miscellaneous/SharedDefines.h b/src/server/game/Miscellaneous/SharedDefines.h index 71dd99198c4..8573ddc7527 100644 --- a/src/server/game/Miscellaneous/SharedDefines.h +++ b/src/server/game/Miscellaneous/SharedDefines.h @@ -4727,15 +4727,15 @@ enum CreatureTypeFlags2 CREATURE_TYPE_FLAG_2_UNK8 = 0x00000080 }; -enum CreatureEliteType -{ - CREATURE_ELITE_NORMAL = 0, - CREATURE_ELITE_ELITE = 1, - CREATURE_ELITE_RAREELITE = 2, - CREATURE_ELITE_WORLDBOSS = 3, - CREATURE_ELITE_RARE = 4, - CREATURE_ELITE_TRIVIAL = 5, // found in 2.2.3 for 2 mobs - CREATURE_WEAK = 6 +enum class CreatureClassifications : uint32 +{ + Normal = 0, + Elite = 1, + RareElite = 2, + Obsolete = 3, + Rare = 4, + Trivial = 5, + MinusMob = 6 }; // Holidays.dbc (9.0.2.37176) diff --git a/src/server/game/Spells/SpellEffects.cpp b/src/server/game/Spells/SpellEffects.cpp index 1895edd06b1..3a538372a0b 100644 --- a/src/server/game/Spells/SpellEffects.cpp +++ b/src/server/game/Spells/SpellEffects.cpp @@ -3832,7 +3832,7 @@ void Spell::EffectSkinning() if (uint32 pureSkillValue = player->GetPureSkillValue(skinningSkill)) { // Double chances for elites - player->UpdateGatherSkill(skinningSkill, pureSkillValue, reqValue, creature->isElite() ? 2 : 1); + player->UpdateGatherSkill(skinningSkill, pureSkillValue, reqValue, creature->IsElite() ? 2 : 1); } } } diff --git a/src/server/game/World/World.cpp b/src/server/game/World/World.cpp index 2b1a74ffeac..7fdb816ffbc 100644 --- a/src/server/game/World/World.cpp +++ b/src/server/game/World/World.cpp @@ -659,36 +659,42 @@ void World::LoadConfigSettings(bool reload) TC_LOG_ERROR("server.loading", "Rate.RepairCost ({}) must be >=0. Using 0.0 instead.", rate_values[RATE_REPAIRCOST]); rate_values[RATE_REPAIRCOST] = 0.0f; } - rate_values[RATE_REPUTATION_GAIN] = sConfigMgr->GetFloatDefault("Rate.Reputation.Gain", 1.0f); - rate_values[RATE_REPUTATION_LOWLEVEL_KILL] = sConfigMgr->GetFloatDefault("Rate.Reputation.LowLevel.Kill", 1.0f); - rate_values[RATE_REPUTATION_LOWLEVEL_QUEST] = sConfigMgr->GetFloatDefault("Rate.Reputation.LowLevel.Quest", 1.0f); + rate_values[RATE_REPUTATION_GAIN] = sConfigMgr->GetFloatDefault("Rate.Reputation.Gain", 1.0f); + rate_values[RATE_REPUTATION_LOWLEVEL_KILL] = sConfigMgr->GetFloatDefault("Rate.Reputation.LowLevel.Kill", 1.0f); + rate_values[RATE_REPUTATION_LOWLEVEL_QUEST] = sConfigMgr->GetFloatDefault("Rate.Reputation.LowLevel.Quest", 1.0f); rate_values[RATE_REPUTATION_RECRUIT_A_FRIEND_BONUS] = sConfigMgr->GetFloatDefault("Rate.Reputation.RecruitAFriendBonus", 0.1f); - rate_values[RATE_CREATURE_NORMAL_DAMAGE] = sConfigMgr->GetFloatDefault("Rate.Creature.Normal.Damage", 1.0f); - rate_values[RATE_CREATURE_ELITE_ELITE_DAMAGE] = sConfigMgr->GetFloatDefault("Rate.Creature.Elite.Elite.Damage", 1.0f); - rate_values[RATE_CREATURE_ELITE_RAREELITE_DAMAGE] = sConfigMgr->GetFloatDefault("Rate.Creature.Elite.RAREELITE.Damage", 1.0f); - rate_values[RATE_CREATURE_ELITE_WORLDBOSS_DAMAGE] = sConfigMgr->GetFloatDefault("Rate.Creature.Elite.WORLDBOSS.Damage", 1.0f); - rate_values[RATE_CREATURE_ELITE_RARE_DAMAGE] = sConfigMgr->GetFloatDefault("Rate.Creature.Elite.RARE.Damage", 1.0f); - rate_values[RATE_CREATURE_NORMAL_HP] = sConfigMgr->GetFloatDefault("Rate.Creature.Normal.HP", 1.0f); - rate_values[RATE_CREATURE_ELITE_ELITE_HP] = sConfigMgr->GetFloatDefault("Rate.Creature.Elite.Elite.HP", 1.0f); - rate_values[RATE_CREATURE_ELITE_RAREELITE_HP] = sConfigMgr->GetFloatDefault("Rate.Creature.Elite.RAREELITE.HP", 1.0f); - rate_values[RATE_CREATURE_ELITE_WORLDBOSS_HP] = sConfigMgr->GetFloatDefault("Rate.Creature.Elite.WORLDBOSS.HP", 1.0f); - rate_values[RATE_CREATURE_ELITE_RARE_HP] = sConfigMgr->GetFloatDefault("Rate.Creature.Elite.RARE.HP", 1.0f); - rate_values[RATE_CREATURE_NORMAL_SPELLDAMAGE] = sConfigMgr->GetFloatDefault("Rate.Creature.Normal.SpellDamage", 1.0f); - rate_values[RATE_CREATURE_ELITE_ELITE_SPELLDAMAGE] = sConfigMgr->GetFloatDefault("Rate.Creature.Elite.Elite.SpellDamage", 1.0f); - rate_values[RATE_CREATURE_ELITE_RAREELITE_SPELLDAMAGE] = sConfigMgr->GetFloatDefault("Rate.Creature.Elite.RAREELITE.SpellDamage", 1.0f); - rate_values[RATE_CREATURE_ELITE_WORLDBOSS_SPELLDAMAGE] = sConfigMgr->GetFloatDefault("Rate.Creature.Elite.WORLDBOSS.SpellDamage", 1.0f); - rate_values[RATE_CREATURE_ELITE_RARE_SPELLDAMAGE] = sConfigMgr->GetFloatDefault("Rate.Creature.Elite.RARE.SpellDamage", 1.0f); - rate_values[RATE_CREATURE_AGGRO] = sConfigMgr->GetFloatDefault("Rate.Creature.Aggro", 1.0f); - rate_values[RATE_REST_INGAME] = sConfigMgr->GetFloatDefault("Rate.Rest.InGame", 1.0f); - rate_values[RATE_REST_OFFLINE_IN_TAVERN_OR_CITY] = sConfigMgr->GetFloatDefault("Rate.Rest.Offline.InTavernOrCity", 1.0f); - rate_values[RATE_REST_OFFLINE_IN_WILDERNESS] = sConfigMgr->GetFloatDefault("Rate.Rest.Offline.InWilderness", 1.0f); - rate_values[RATE_DAMAGE_FALL] = sConfigMgr->GetFloatDefault("Rate.Damage.Fall", 1.0f); - rate_values[RATE_AUCTION_TIME] = sConfigMgr->GetFloatDefault("Rate.Auction.Time", 1.0f); - rate_values[RATE_AUCTION_DEPOSIT] = sConfigMgr->GetFloatDefault("Rate.Auction.Deposit", 1.0f); - rate_values[RATE_AUCTION_CUT] = sConfigMgr->GetFloatDefault("Rate.Auction.Cut", 1.0f); - rate_values[RATE_HONOR] = sConfigMgr->GetFloatDefault("Rate.Honor", 1.0f); - rate_values[RATE_INSTANCE_RESET_TIME] = sConfigMgr->GetFloatDefault("Rate.InstanceResetTime", 1.0f); - rate_values[RATE_TALENT] = sConfigMgr->GetFloatDefault("Rate.Talent", 1.0f); + rate_values[RATE_CREATURE_HP_NORMAL] = sConfigMgr->GetFloatDefault("Rate.Creature.HP.Normal", 1.0f); + rate_values[RATE_CREATURE_HP_ELITE] = sConfigMgr->GetFloatDefault("Rate.Creature.HP.Elite", 1.0f); + rate_values[RATE_CREATURE_HP_RAREELITE] = sConfigMgr->GetFloatDefault("Rate.Creature.HP.RareElite", 1.0f); + rate_values[RATE_CREATURE_HP_OBSOLETE] = sConfigMgr->GetFloatDefault("Rate.Creature.HP.Obsolete", 1.0f); + rate_values[RATE_CREATURE_HP_RARE] = sConfigMgr->GetFloatDefault("Rate.Creature.HP.Rare", 1.0f); + rate_values[RATE_CREATURE_HP_TRIVIAL] = sConfigMgr->GetFloatDefault("Rate.Creature.HP.Trivial", 1.0f); + rate_values[RATE_CREATURE_HP_MINUSMOB] = sConfigMgr->GetFloatDefault("Rate.Creature.HP.MinusMob", 1.0f); + rate_values[RATE_CREATURE_DAMAGE_NORMAL] = sConfigMgr->GetFloatDefault("Rate.Creature.Damage.Normal", 1.0f); + rate_values[RATE_CREATURE_DAMAGE_ELITE] = sConfigMgr->GetFloatDefault("Rate.Creature.Damage.Elite", 1.0f); + rate_values[RATE_CREATURE_DAMAGE_RAREELITE] = sConfigMgr->GetFloatDefault("Rate.Creature.Damage.RareElite", 1.0f); + rate_values[RATE_CREATURE_DAMAGE_OBSOLETE] = sConfigMgr->GetFloatDefault("Rate.Creature.Damage.Obsolete", 1.0f); + rate_values[RATE_CREATURE_DAMAGE_RARE] = sConfigMgr->GetFloatDefault("Rate.Creature.Damage.Rare", 1.0f); + rate_values[RATE_CREATURE_DAMAGE_TRIVIAL] = sConfigMgr->GetFloatDefault("Rate.Creature.Damage.Trivial", 1.0f); + rate_values[RATE_CREATURE_DAMAGE_MINUSMOB] = sConfigMgr->GetFloatDefault("Rate.Creature.Damage.MinusMob", 1.0f); + rate_values[RATE_CREATURE_SPELLDAMAGE_NORMAL] = sConfigMgr->GetFloatDefault("Rate.Creature.SpellDamage.Normal", 1.0f); + rate_values[RATE_CREATURE_SPELLDAMAGE_ELITE] = sConfigMgr->GetFloatDefault("Rate.Creature.SpellDamage.Elite", 1.0f); + rate_values[RATE_CREATURE_SPELLDAMAGE_RAREELITE] = sConfigMgr->GetFloatDefault("Rate.Creature.SpellDamage.RareElite", 1.0f); + rate_values[RATE_CREATURE_SPELLDAMAGE_OBSOLETE] = sConfigMgr->GetFloatDefault("Rate.Creature.SpellDamage.Obsolete", 1.0f); + rate_values[RATE_CREATURE_SPELLDAMAGE_RARE] = sConfigMgr->GetFloatDefault("Rate.Creature.SpellDamage.Rare", 1.0f); + rate_values[RATE_CREATURE_SPELLDAMAGE_TRIVIAL] = sConfigMgr->GetFloatDefault("Rate.Creature.SpellDamage.Trivial", 1.0f); + rate_values[RATE_CREATURE_SPELLDAMAGE_MINUSMOB] = sConfigMgr->GetFloatDefault("Rate.Creature.SpellDamage.MinusMob", 1.0f); + rate_values[RATE_CREATURE_AGGRO] = sConfigMgr->GetFloatDefault("Rate.Creature.Aggro", 1.0f); + rate_values[RATE_REST_INGAME] = sConfigMgr->GetFloatDefault("Rate.Rest.InGame", 1.0f); + rate_values[RATE_REST_OFFLINE_IN_TAVERN_OR_CITY] = sConfigMgr->GetFloatDefault("Rate.Rest.Offline.InTavernOrCity", 1.0f); + rate_values[RATE_REST_OFFLINE_IN_WILDERNESS] = sConfigMgr->GetFloatDefault("Rate.Rest.Offline.InWilderness", 1.0f); + rate_values[RATE_DAMAGE_FALL] = sConfigMgr->GetFloatDefault("Rate.Damage.Fall", 1.0f); + rate_values[RATE_AUCTION_TIME] = sConfigMgr->GetFloatDefault("Rate.Auction.Time", 1.0f); + rate_values[RATE_AUCTION_DEPOSIT] = sConfigMgr->GetFloatDefault("Rate.Auction.Deposit", 1.0f); + rate_values[RATE_AUCTION_CUT] = sConfigMgr->GetFloatDefault("Rate.Auction.Cut", 1.0f); + rate_values[RATE_HONOR] = sConfigMgr->GetFloatDefault("Rate.Honor", 1.0f); + rate_values[RATE_INSTANCE_RESET_TIME] = sConfigMgr->GetFloatDefault("Rate.InstanceResetTime", 1.0f); + rate_values[RATE_TALENT] = sConfigMgr->GetFloatDefault("Rate.Talent", 1.0f); if (rate_values[RATE_TALENT] < 0.0f) { TC_LOG_ERROR("server.loading", "Rate.Talent ({}) must be > 0. Using 1 instead.", rate_values[RATE_TALENT]); @@ -1291,11 +1297,12 @@ void World::LoadConfigSettings(bool reload) m_int_configs[CONFIG_CHAT_STRICT_LINK_CHECKING_SEVERITY] = sConfigMgr->GetIntDefault("ChatStrictLinkChecking.Severity", 0); m_int_configs[CONFIG_CHAT_STRICT_LINK_CHECKING_KICK] = sConfigMgr->GetIntDefault("ChatStrictLinkChecking.Kick", 0); - m_int_configs[CONFIG_CORPSE_DECAY_NORMAL] = sConfigMgr->GetIntDefault("Corpse.Decay.NORMAL", 60); - m_int_configs[CONFIG_CORPSE_DECAY_RARE] = sConfigMgr->GetIntDefault("Corpse.Decay.RARE", 300); - m_int_configs[CONFIG_CORPSE_DECAY_ELITE] = sConfigMgr->GetIntDefault("Corpse.Decay.ELITE", 300); - m_int_configs[CONFIG_CORPSE_DECAY_RAREELITE] = sConfigMgr->GetIntDefault("Corpse.Decay.RAREELITE", 300); - m_int_configs[CONFIG_CORPSE_DECAY_WORLDBOSS] = sConfigMgr->GetIntDefault("Corpse.Decay.WORLDBOSS", 3600); + m_int_configs[CONFIG_CORPSE_DECAY_NORMAL] = sConfigMgr->GetIntDefault("Corpse.Decay.Normal", 60); + m_int_configs[CONFIG_CORPSE_DECAY_ELITE] = sConfigMgr->GetIntDefault("Corpse.Decay.Elite", 300); + m_int_configs[CONFIG_CORPSE_DECAY_RAREELITE] = sConfigMgr->GetIntDefault("Corpse.Decay.RareElite", 300); + m_int_configs[CONFIG_CORPSE_DECAY_OBSOLETE] = sConfigMgr->GetIntDefault("Corpse.Decay.Obsolete", 3600); + m_int_configs[CONFIG_CORPSE_DECAY_TRIVIAL] = sConfigMgr->GetIntDefault("Corpse.Decay.Trivial", 300); + m_int_configs[CONFIG_CORPSE_DECAY_MINUSMOB] = sConfigMgr->GetIntDefault("Corpse.Decay.MinusMob", 150); m_int_configs[CONFIG_DEATH_SICKNESS_LEVEL] = sConfigMgr->GetIntDefault ("Death.SicknessLevel", 11); m_bool_configs[CONFIG_DEATH_CORPSE_RECLAIM_DELAY_PVP] = sConfigMgr->GetBoolDefault("Death.CorpseReclaimDelay.PvP", true); diff --git a/src/server/game/World/World.h b/src/server/game/World/World.h index e71cccbf1cf..14fcb7e8966 100644 --- a/src/server/game/World/World.h +++ b/src/server/game/World/World.h @@ -326,10 +326,12 @@ enum WorldIntConfigs CONFIG_AUCTION_LEVEL_REQ, CONFIG_MAIL_LEVEL_REQ, CONFIG_CORPSE_DECAY_NORMAL, - CONFIG_CORPSE_DECAY_RARE, CONFIG_CORPSE_DECAY_ELITE, CONFIG_CORPSE_DECAY_RAREELITE, - CONFIG_CORPSE_DECAY_WORLDBOSS, + CONFIG_CORPSE_DECAY_OBSOLETE, + CONFIG_CORPSE_DECAY_RARE, + CONFIG_CORPSE_DECAY_TRIVIAL, + CONFIG_CORPSE_DECAY_MINUSMOB, CONFIG_DEATH_SICKNESS_LEVEL, CONFIG_INSTANT_LOGOUT, CONFIG_DISABLE_BREATHING, @@ -486,21 +488,27 @@ enum Rates RATE_REPUTATION_LOWLEVEL_KILL, RATE_REPUTATION_LOWLEVEL_QUEST, RATE_REPUTATION_RECRUIT_A_FRIEND_BONUS, - RATE_CREATURE_NORMAL_HP, - RATE_CREATURE_ELITE_ELITE_HP, - RATE_CREATURE_ELITE_RAREELITE_HP, - RATE_CREATURE_ELITE_WORLDBOSS_HP, - RATE_CREATURE_ELITE_RARE_HP, - RATE_CREATURE_NORMAL_DAMAGE, - RATE_CREATURE_ELITE_ELITE_DAMAGE, - RATE_CREATURE_ELITE_RAREELITE_DAMAGE, - RATE_CREATURE_ELITE_WORLDBOSS_DAMAGE, - RATE_CREATURE_ELITE_RARE_DAMAGE, - RATE_CREATURE_NORMAL_SPELLDAMAGE, - RATE_CREATURE_ELITE_ELITE_SPELLDAMAGE, - RATE_CREATURE_ELITE_RAREELITE_SPELLDAMAGE, - RATE_CREATURE_ELITE_WORLDBOSS_SPELLDAMAGE, - RATE_CREATURE_ELITE_RARE_SPELLDAMAGE, + RATE_CREATURE_HP_NORMAL, + RATE_CREATURE_HP_ELITE, + RATE_CREATURE_HP_RAREELITE, + RATE_CREATURE_HP_OBSOLETE, + RATE_CREATURE_HP_RARE, + RATE_CREATURE_HP_TRIVIAL, + RATE_CREATURE_HP_MINUSMOB, + RATE_CREATURE_DAMAGE_NORMAL, + RATE_CREATURE_DAMAGE_ELITE, + RATE_CREATURE_DAMAGE_RAREELITE, + RATE_CREATURE_DAMAGE_OBSOLETE, + RATE_CREATURE_DAMAGE_RARE, + RATE_CREATURE_DAMAGE_TRIVIAL, + RATE_CREATURE_DAMAGE_MINUSMOB, + RATE_CREATURE_SPELLDAMAGE_NORMAL, + RATE_CREATURE_SPELLDAMAGE_ELITE, + RATE_CREATURE_SPELLDAMAGE_RAREELITE, + RATE_CREATURE_SPELLDAMAGE_OBSOLETE, + RATE_CREATURE_SPELLDAMAGE_RARE, + RATE_CREATURE_SPELLDAMAGE_TRIVIAL, + RATE_CREATURE_SPELLDAMAGE_MINUSMOB, RATE_CREATURE_AGGRO, RATE_REST_INGAME, RATE_REST_OFFLINE_IN_TAVERN_OR_CITY, diff --git a/src/server/worldserver/worldserver.conf.dist b/src/server/worldserver/worldserver.conf.dist index 20ad5bef124..d239a0857b5 100644 --- a/src/server/worldserver/worldserver.conf.dist +++ b/src/server/worldserver/worldserver.conf.dist @@ -1787,23 +1787,29 @@ CreatureFamilyFleeDelay = 7000 WorldBossLevelDiff = 3 # -# Corpse.Decay.NORMAL -# Corpse.Decay.RARE -# Corpse.Decay.ELITE -# Corpse.Decay.RAREELITE -# Corpse.Decay.WORLDBOSS +# Corpse.Decay.Normal +# Corpse.Decay.Elite +# Corpse.Decay.RareElite +# Corpse.Decay.Obsolete +# Corpse.Decay.Rare +# Corpse.Decay.Trivial +# Corpse.Decay.MinusMob # Description: Time (in seconds) until creature corpse will decay if not looted or skinned. -# Default: 300 - (5 Minutes, Corpse.Decay.NORMAL) -# 300 - (5 Minutes, Corpse.Decay.RARE) -# 300 - (5 Minutes, Corpse.Decay.ELITE) -# 300 - (5 Minutes, Corpse.Decay.RAREELITE) -# 3600 - (1 Hour, Corpse.Decay.WORLDBOSS) - -Corpse.Decay.NORMAL = 300 -Corpse.Decay.RARE = 300 -Corpse.Decay.ELITE = 300 -Corpse.Decay.RAREELITE = 300 -Corpse.Decay.WORLDBOSS = 3600 +# Default: 300 - (5 Minutes, Corpse.Decay.Normal) +# 300 - (5 Minutes, Corpse.Decay.Elite) +# 300 - (5 Minutes, Corpse.Decay.RareElite) +# 3600 - (1 Hour, Corpse.Decay.Obsolete) +# 300 - (5 Minutes, Corpse.Decay.Rare) +# 300 - (5 Minutes, Corpse.Decay.Trivial) +# 150 - (2.5 Minutes, Corpse.Decay.MinusMob) + +Corpse.Decay.Normal = 300 +Corpse.Decay.Elite = 300 +Corpse.Decay.RareElite = 300 +Corpse.Decay.Obsolete = 3600 +Corpse.Decay.Rare = 300 +Corpse.Decay.Trivial = 300 +Corpse.Decay.MinusMob = 150 # # Rate.Corpse.Decay.Looted @@ -1814,62 +1820,79 @@ Corpse.Decay.WORLDBOSS = 3600 Rate.Corpse.Decay.Looted = 0.5 # -# Rate.Creature.Normal.Damage -# Rate.Creature.Elite.Elite.Damage -# Rate.Creature.Elite.RARE.Damage -# Rate.Creature.Elite.RAREELITE.Damage -# Rate.Creature.Elite.WORLDBOSS.Damage +# Rate.Creature.Damage.Normal +# Rate.Creature.Damage.Elite +# Rate.Creature.Damage.RareElite +# Rate.Creature.Damage.Obsolete +# Rate.Creature.Damage.Rare +# Rate.Creature.Damage.Trivial +# Rate.Creature.Damage.MinusMob # Description: Multiplier for creature melee damage. -# Default: 1 - (Rate.Creature.Normal.Damage) -# 1 - (Rate.Creature.Elite.Elite.Damage) -# 1 - (Rate.Creature.Elite.RARE.Damage) -# 1 - (Rate.Creature.Elite.RAREELITE.Damage) -# 1 - (Rate.Creature.Elite.WORLDBOSS.Damage) -# - -Rate.Creature.Normal.Damage = 1 -Rate.Creature.Elite.Elite.Damage = 1 -Rate.Creature.Elite.RARE.Damage = 1 -Rate.Creature.Elite.RAREELITE.Damage = 1 -Rate.Creature.Elite.WORLDBOSS.Damage = 1 - -# -# Rate.Creature.Normal.SpellDamage -# Rate.Creature.Elite.Elite.SpellDamage -# Rate.Creature.Elite.RARE.SpellDamage -# Rate.Creature.Elite.RAREELITE.SpellDamage -# Rate.Creature.Elite.WORLDBOSS.SpellDamage +# Default: 1 - (Rate.Creature.Damage.Normal) +# 1 - (Rate.Creature.Damage.Elite) +# 1 - (Rate.Creature.Damage.RareElite) +# 1 - (Rate.Creature.Damage.Obsolete) +# 1 - (Rate.Creature.Damage.Rare) +# 1 - (Rate.Creature.Damage.Trivial) +# 1 - (Rate.Creature.Damage.MinusMob) + +Rate.Creature.Damage.Normal = 1 +Rate.Creature.Damage.Elite = 1 +Rate.Creature.Damage.RareElite = 1 +Rate.Creature.Damage.Obsolete = 1 +Rate.Creature.Damage.Rare = 1 +Rate.Creature.Damage.Trivial = 1 +Rate.Creature.Damage.MinusMob = 1 + +# +# Rate.Creature.SpellDamage.Normal +# Rate.Creature.SpellDamage.Elite +# Rate.Creature.SpellDamage.RareElite +# Rate.Creature.SpellDamage.Obsolete +# Rate.Creature.SpellDamage.Rare +# Rate.Creature.SpellDamage.Trivial +# Rate.Creature.SpellDamage.MinusMob +# Description: Multiplier for creature spell damage. +# Default: 1 - (Rate.Creature.SpellDamage.Normal) +# 1 - (Rate.Creature.SpellDamage.Elite) +# 1 - (Rate.Creature.SpellDamage.RareElite) +# 1 - (Rate.Creature.SpellDamage.Obsolete) +# 1 - (Rate.Creature.SpellDamage.Rare) +# 1 - (Rate.Creature.SpellDamage.Trivial) +# 1 - (Rate.Creature.SpellDamage.MinusMob) + +Rate.Creature.SpellDamage.Normal = 1 +Rate.Creature.SpellDamage.Elite = 1 +Rate.Creature.SpellDamage.RareElite = 1 +Rate.Creature.SpellDamage.Obsolete = 1 +Rate.Creature.SpellDamage.Rare = 1 +Rate.Creature.SpellDamage.Trivial = 1 +Rate.Creature.SpellDamage.MinusMob = 1 + +# +# Rate.Creature.HP.Normal +# Rate.Creature.HP.Elite +# Rate.Creature.HP.RareElite +# Rate.Creature.HP.Obsolete +# Rate.Creature.HP.Rare +# Rate.Creature.HP.Trivial +# Rate.Creature.HP.MinusMob # Description: Multiplier for creature spell damage. -# Default: 1 - (Rate.Creature.Normal.SpellDamage) -# 1 - (Rate.Creature.Elite.Elite.SpellDamage) -# 1 - (Rate.Creature.Elite.RARE.SpellDamage) -# 1 - (Rate.Creature.Elite.RAREELITE.SpellDamage) -# 1 - (Rate.Creature.Elite.WORLDBOSS.SpellDamage) - -Rate.Creature.Normal.SpellDamage = 1 -Rate.Creature.Elite.Elite.SpellDamage = 1 -Rate.Creature.Elite.RARE.SpellDamage = 1 -Rate.Creature.Elite.RAREELITE.SpellDamage = 1 -Rate.Creature.Elite.WORLDBOSS.SpellDamage = 1 - -# -# Rate.Creature.Normal.HP -# Rate.Creature.Elite.Elite.HP -# Rate.Creature.Elite.RARE.HP -# Rate.Creature.Elite.RAREELITE.HP -# Rate.Creature.Elite.WORLDBOSS.HP -# Description: Multiplier for creature health. -# Default: 1 - (Rate.Creature.Normal.HP) -# 1 - (Rate.Creature.Elite.Elite.HP) -# 1 - (Rate.Creature.Elite.RARE.HP) -# 1 - (Rate.Creature.Elite.RAREELITE.HP) -# 1 - (Rate.Creature.Elite.WORLDBOSS.HP) - -Rate.Creature.Normal.HP = 1 -Rate.Creature.Elite.Elite.HP = 1 -Rate.Creature.Elite.RARE.HP = 1 -Rate.Creature.Elite.RAREELITE.HP = 1 -Rate.Creature.Elite.WORLDBOSS.HP = 1 +# Default: 1 - (Rate.Creature.HP.Normal) +# 1 - (Rate.Creature.HP.Elite) +# 1 - (Rate.Creature.HP.RareElite) +# 1 - (Rate.Creature.HP.Obsolete) +# 1 - (Rate.Creature.HP.Rare) +# 1 - (Rate.Creature.HP.Trivial) +# 1 - (Rate.Creature.HP.MinusMob) + +Rate.Creature.HP.Normal = 1 +Rate.Creature.HP.Elite = 1 +Rate.Creature.HP.RareElite = 1 +Rate.Creature.HP.Obsolete = 1 +Rate.Creature.HP.Rare = 1 +Rate.Creature.HP.Trivial = 1 +Rate.Creature.HP.MinusMob = 1 # # Creature.PickPocketRefillDelay |