Core/Players: Implemented secondary stat diminishing

Port From (https://github.com/TrinityCore/TrinityCore/commit/cb47605235a49bb2c6065b2e6de69b657a9c905f)
This commit is contained in:
hondacrx
2021-02-09 13:28:06 -05:00
parent 9a14cfe807
commit 926035b704
9 changed files with 114 additions and 7 deletions
+20
View File
@@ -2152,4 +2152,24 @@ namespace Framework.Constants
None = 0, None = 0,
Disabled = 0x1 Disabled = 0x1
} }
public enum GlobalCurve
{
CritDiminishing = 0,
MasteryDiminishing = 1,
HasteDiminishing = 2,
SpeedDiminishing = 3,
AvoidanceDiminishing = 4,
VersatilityDoneDiminishing = 5,
LifestealDiminishing = 6,
DodgeDiminishing = 7,
BlockDiminishing = 8,
ParryDiminishing = 9,
VersatilityTakenDiminishing = 11,
ContentTuningPvpItemLevelHealthScaling = 13,
ContentTuningPvpLevelDamageScaling = 14,
ContentTuningPvpItemLevelDamageScaling = 15,
}
} }
@@ -461,6 +461,9 @@ namespace Framework.Database
// GemProperties.db2 // GemProperties.db2
PrepareStatement(HotfixStatements.SEL_GEM_PROPERTIES, "SELECT ID, EnchantId, Type FROM gem_properties"); PrepareStatement(HotfixStatements.SEL_GEM_PROPERTIES, "SELECT ID, EnchantId, Type FROM gem_properties");
// GlobalCurve.db2
PrepareStatement(HotfixStatements.SEL_GLOBAL_CURVE, "SELECT ID, CurveID, Type FROM global_curve");
// GlyphBindableSpell.db2 // GlyphBindableSpell.db2
PrepareStatement(HotfixStatements.SEL_GLYPH_BINDABLE_SPELL, "SELECT ID, SpellID, GlyphPropertiesID FROM glyph_bindable_spell"); PrepareStatement(HotfixStatements.SEL_GLYPH_BINDABLE_SPELL, "SELECT ID, SpellID, GlyphPropertiesID FROM glyph_bindable_spell");
@@ -1379,6 +1382,8 @@ namespace Framework.Database
SEL_GEM_PROPERTIES, SEL_GEM_PROPERTIES,
SEL_GLOBAL_CURVE,
SEL_GLYPH_BINDABLE_SPELL, SEL_GLYPH_BINDABLE_SPELL,
SEL_GLYPH_PROPERTIES, SEL_GLYPH_PROPERTIES,
+2
View File
@@ -150,6 +150,7 @@ namespace Game.DataStorage
GarrSiteLevelStorage = ReadDB2<GarrSiteLevelRecord>("GarrSiteLevel.db2", HotfixStatements.SEL_GARR_SITE_LEVEL); GarrSiteLevelStorage = ReadDB2<GarrSiteLevelRecord>("GarrSiteLevel.db2", HotfixStatements.SEL_GARR_SITE_LEVEL);
GarrSiteLevelPlotInstStorage = ReadDB2<GarrSiteLevelPlotInstRecord>("GarrSiteLevelPlotInst.db2", HotfixStatements.SEL_GARR_SITE_LEVEL_PLOT_INST); GarrSiteLevelPlotInstStorage = ReadDB2<GarrSiteLevelPlotInstRecord>("GarrSiteLevelPlotInst.db2", HotfixStatements.SEL_GARR_SITE_LEVEL_PLOT_INST);
GemPropertiesStorage = ReadDB2<GemPropertiesRecord>("GemProperties.db2", HotfixStatements.SEL_GEM_PROPERTIES); GemPropertiesStorage = ReadDB2<GemPropertiesRecord>("GemProperties.db2", HotfixStatements.SEL_GEM_PROPERTIES);
GlobalCurveStorage = ReadDB2<GlobalCurveRecord>("GlobalCurve.db2", HotfixStatements.SEL_GLOBAL_CURVE);
GlyphBindableSpellStorage = ReadDB2<GlyphBindableSpellRecord>("GlyphBindableSpell.db2", HotfixStatements.SEL_GLYPH_BINDABLE_SPELL); GlyphBindableSpellStorage = ReadDB2<GlyphBindableSpellRecord>("GlyphBindableSpell.db2", HotfixStatements.SEL_GLYPH_BINDABLE_SPELL);
GlyphPropertiesStorage = ReadDB2<GlyphPropertiesRecord>("GlyphProperties.db2", HotfixStatements.SEL_GLYPH_PROPERTIES); GlyphPropertiesStorage = ReadDB2<GlyphPropertiesRecord>("GlyphProperties.db2", HotfixStatements.SEL_GLYPH_PROPERTIES);
GlyphRequiredSpecStorage = ReadDB2<GlyphRequiredSpecRecord>("GlyphRequiredSpec.db2", HotfixStatements.SEL_GLYPH_REQUIRED_SPEC); GlyphRequiredSpecStorage = ReadDB2<GlyphRequiredSpecRecord>("GlyphRequiredSpec.db2", HotfixStatements.SEL_GLYPH_REQUIRED_SPEC);
@@ -508,6 +509,7 @@ namespace Game.DataStorage
public static DB6Storage<GarrSiteLevelRecord> GarrSiteLevelStorage; public static DB6Storage<GarrSiteLevelRecord> GarrSiteLevelStorage;
public static DB6Storage<GarrSiteLevelPlotInstRecord> GarrSiteLevelPlotInstStorage; public static DB6Storage<GarrSiteLevelPlotInstRecord> GarrSiteLevelPlotInstStorage;
public static DB6Storage<GemPropertiesRecord> GemPropertiesStorage; public static DB6Storage<GemPropertiesRecord> GemPropertiesStorage;
public static DB6Storage<GlobalCurveRecord> GlobalCurveStorage;
public static DB6Storage<GlyphBindableSpellRecord> GlyphBindableSpellStorage; public static DB6Storage<GlyphBindableSpellRecord> GlyphBindableSpellStorage;
public static DB6Storage<GlyphPropertiesRecord> GlyphPropertiesStorage; public static DB6Storage<GlyphPropertiesRecord> GlyphPropertiesStorage;
public static DB6Storage<GlyphRequiredSpecRecord> GlyphRequiredSpecStorage; public static DB6Storage<GlyphRequiredSpecRecord> GlyphRequiredSpecStorage;
+11 -2
View File
@@ -1370,9 +1370,13 @@ namespace Game.DataStorage
return _factionTeams.LookupByKey(faction); return _factionTeams.LookupByKey(faction);
} }
public HeirloomRecord GetHeirloomByItemId(uint itemId) public uint GetGlobalCurveId(GlobalCurve globalCurveType)
{ {
return _heirlooms.LookupByKey(itemId); foreach (var globalCurveEntry in CliDB.GlobalCurveStorage.Values)
if (globalCurveEntry.Type == globalCurveType)
return globalCurveEntry.CurveID;
return 0;
} }
public List<uint> GetGlyphBindableSpells(uint glyphPropertiesId) public List<uint> GetGlyphBindableSpells(uint glyphPropertiesId)
@@ -1385,6 +1389,11 @@ namespace Game.DataStorage
return _glyphRequiredSpecs.LookupByKey(glyphPropertiesId); return _glyphRequiredSpecs.LookupByKey(glyphPropertiesId);
} }
public HeirloomRecord GetHeirloomByItemId(uint itemId)
{
return _heirlooms.LookupByKey(itemId);
}
public List<ItemBonusRecord> GetItemBonusList(uint bonusListId) public List<ItemBonusRecord> GetItemBonusList(uint bonusListId)
{ {
return _itemBonusLists.LookupByKey(bonusListId); return _itemBonusLists.LookupByKey(bonusListId);
+1 -1
View File
@@ -21,7 +21,7 @@ using System;
namespace Game.DataStorage namespace Game.DataStorage
{ {
public class AchievementRecord public sealed class AchievementRecord
{ {
public string Description; public string Description;
public string Title; public string Title;
@@ -222,6 +222,13 @@ namespace Game.DataStorage
public SocketColor Type; public SocketColor Type;
} }
public sealed class GlobalCurveRecord
{
public uint Id;
public uint CurveID;
public GlobalCurve Type;
}
public sealed class GlyphBindableSpellRecord public sealed class GlyphBindableSpellRecord
{ {
public uint Id; public uint Id;
+54 -1
View File
@@ -107,7 +107,7 @@ namespace Game.Entities
} }
public float GetRatingBonusValue(CombatRating cr) public float GetRatingBonusValue(CombatRating cr)
{ {
float baseResult = m_activePlayerData.CombatRatings[(int)cr] * GetRatingMultiplier(cr); float baseResult = ApplyRatingDiminishing(cr, m_activePlayerData.CombatRatings[(int)cr] * GetRatingMultiplier(cr));
if (cr != CombatRating.ResiliencePlayerDamage) if (cr != CombatRating.ResiliencePlayerDamage)
return baseResult; return baseResult;
return (float)(1.0f - Math.Pow(0.99f, baseResult)) * 100.0f; return (float)(1.0f - Math.Pow(0.99f, baseResult)) * 100.0f;
@@ -167,6 +167,59 @@ namespace Game.Entities
*/ */
} }
float ApplyRatingDiminishing(CombatRating cr, float bonusValue)
{
uint diminishingCurveId = 0;
switch (cr)
{
case CombatRating.Dodge:
diminishingCurveId = Global.DB2Mgr.GetGlobalCurveId(GlobalCurve.DodgeDiminishing);
break;
case CombatRating.Parry:
diminishingCurveId = Global.DB2Mgr.GetGlobalCurveId(GlobalCurve.ParryDiminishing);
break;
case CombatRating.Block:
diminishingCurveId = Global.DB2Mgr.GetGlobalCurveId(GlobalCurve.BlockDiminishing);
break;
case CombatRating.CritMelee:
case CombatRating.CritRanged:
case CombatRating.CritSpell:
diminishingCurveId = Global.DB2Mgr.GetGlobalCurveId(GlobalCurve.CritDiminishing);
break;
case CombatRating.Speed:
diminishingCurveId = Global.DB2Mgr.GetGlobalCurveId(GlobalCurve.SpeedDiminishing);
break;
case CombatRating.Lifesteal:
diminishingCurveId = Global.DB2Mgr.GetGlobalCurveId(GlobalCurve.LifestealDiminishing);
break;
case CombatRating.HasteMelee:
case CombatRating.HasteRanged:
case CombatRating.HasteSpell:
diminishingCurveId = Global.DB2Mgr.GetGlobalCurveId(GlobalCurve.HasteDiminishing);
break;
case CombatRating.Avoidance:
diminishingCurveId = Global.DB2Mgr.GetGlobalCurveId(GlobalCurve.AvoidanceDiminishing);
break;
case CombatRating.Mastery:
diminishingCurveId = Global.DB2Mgr.GetGlobalCurveId(GlobalCurve.MasteryDiminishing);
break;
case CombatRating.VersatilityDamageDone:
case CombatRating.VersatilityHealingDone:
diminishingCurveId = Global.DB2Mgr.GetGlobalCurveId(GlobalCurve.VersatilityDoneDiminishing);
break;
case CombatRating.VersatilityDamageTaken:
diminishingCurveId = Global.DB2Mgr.GetGlobalCurveId(GlobalCurve.VersatilityTakenDiminishing);
break;
default:
break;
}
if (diminishingCurveId != 0)
return Global.DB2Mgr.GetCurveValueAt(diminishingCurveId, bonusValue);
return bonusValue;
}
public float GetExpertiseDodgeOrParryReduction(WeaponAttackType attType) public float GetExpertiseDodgeOrParryReduction(WeaponAttackType attType)
{ {
float baseExpertise = 7.5f; float baseExpertise = 7.5f;
+2 -2
View File
@@ -1368,8 +1368,8 @@ namespace Game.Entities
{ {
// explicit affected values // explicit affected values
float multiplier = GetRatingMultiplier(cr); float multiplier = GetRatingMultiplier(cr);
float oldVal = oldRating * multiplier; float oldVal = ApplyRatingDiminishing(cr, oldRating * multiplier);
float newVal = amount * multiplier; float newVal = ApplyRatingDiminishing(cr, amount * multiplier);
switch (cr) switch (cr)
{ {
case CombatRating.HasteMelee: case CombatRating.HasteMelee:
@@ -0,0 +1,11 @@
--
-- Table structure for table `global_curve`
--
DROP TABLE IF EXISTS `global_curve`;
CREATE TABLE `global_curve` (
`ID` int(10) unsigned NOT NULL DEFAULT '0',
`CurveID` int(11) NOT NULL DEFAULT '0',
`Type` int(11) NOT NULL DEFAULT '0',
`VerifiedBuild` int(11) NOT NULL DEFAULT '0',
PRIMARY KEY (`ID`,`VerifiedBuild`)
) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4 COLLATE=utf8mb4_unicode_ci;