Advertisement
Not a member of Pastebin yet?
Sign Up,
it unlocks many cool features!
- diff --git a/src/server/game/DataStores/DBCEnums.h b/src/server/game/DataStores/DBCEnums.h
- index ddea959..50c455f 100644
- --- a/src/server/game/DataStores/DBCEnums.h
- +++ b/src/server/game/DataStores/DBCEnums.h
- @@ -461,6 +461,17 @@ enum MountFlags
- MOUNT_FLAG_CAN_SWIM = 0x8 // client checks MOVEMENTFLAG_SWIMMING
- };
- +enum SpellProcsPerMinuteModType
- +{
- + SPELL_PPM_MOD_HASTE = 1,
- + SPELL_PPM_MOD_CRIT = 2,
- + SPELL_PPM_MOD_CLASS = 3,
- + SPELL_PPM_MOD_SPEC = 4,
- + SPELL_PPM_MOD_RACE = 5,
- + SPELL_PPM_MOD_ITEM_LEVEL = 6,
- + SPELL_PPM_MOD_BATTLEGROUND = 7
- +};
- +
- enum TotemCategoryType
- {
- TOTEM_CATEGORY_TYPE_KNIFE = 1,
- diff --git a/src/server/game/DataStores/DBCStores.cpp b/src/server/game/DataStores/DBCStores.cpp
- index 84ae300..2126a11 100644
- --- a/src/server/game/DataStores/DBCStores.cpp
- +++ b/src/server/game/DataStores/DBCStores.cpp
- @@ -214,6 +214,9 @@ DBCStorage <SpellEquippedItemsEntry> sSpellEquippedItemsStore(SpellEquippedItems
- DBCStorage <SpellClassOptionsEntry> sSpellClassOptionsStore(SpellClassOptionsEntryfmt);
- DBCStorage <SpellCooldownsEntry> sSpellCooldownsStore(SpellCooldownsEntryfmt);
- DBCStorage <SpellAuraOptionsEntry> sSpellAuraOptionsStore(SpellAuraOptionsEntryfmt);
- +DBCStorage <SpellProcsPerMinuteEntry> sSpellProcsPerMinuteStore(SpellProcsPerMinuteEntryfmt);
- +DBCStorage <SpellProcsPerMinuteModEntry> sSpellProcsPerMinuteModStore(SpellProcsPerMinuteModEntryfmt);
- +std::map<uint32, std::vector<SpellProcsPerMinuteModEntry const*>> sSpellProcsPerMinuteMods;
- DBCStorage <SpellAuraRestrictionsEntry> sSpellAuraRestrictionsStore(SpellAuraRestrictionsEntryfmt);
- DBCStorage <SpellCastingRequirementsEntry> sSpellCastingRequirementsStore(SpellCastingRequirementsEntryfmt);
- @@ -590,6 +593,16 @@ void LoadDBCStores(const std::string& dataPath)
- LoadDBC(availableDbcLocales, bad_dbc_files, sSpellClassOptionsStore, dbcPath,"SpellClassOptions.dbc"); // 17399
- LoadDBC(availableDbcLocales, bad_dbc_files, sSpellCooldownsStore, dbcPath,"SpellCooldowns.dbc"); // 17399
- LoadDBC(availableDbcLocales, bad_dbc_files, sSpellAuraOptionsStore, dbcPath,"SpellAuraOptions.dbc"); // 17399
- + LoadDBC(availableDbcLocales, bad_dbc_files, sSpellProcsPerMinuteStore, dbcPath, "SpellProcsPerMinute.dbc"); // 17399
- + LoadDBC(availableDbcLocales, bad_dbc_files, sSpellProcsPerMinuteModStore, dbcPath, "SpellProcsPerMinuteMod.dbc"); // 17399
- +
- + for (uint32 i = 0; i < sSpellProcsPerMinuteModStore.GetNumRows(); ++i)
- + {
- + if (SpellProcsPerMinuteModEntry* ppmMod = sSpellProcsPerMinuteModStore.LookupEntry(i))
- + sSpellProcsPerMinuteMods[ppmMod->SpellProcsPerMinuteID].push_back(ppmMod);
- + }
- +
- +
- LoadDBC(availableDbcLocales, bad_dbc_files, sSpellAuraRestrictionsStore, dbcPath,"SpellAuraRestrictions.dbc"); // 17399
- LoadDBC(availableDbcLocales, bad_dbc_files, sSpellCastingRequirementsStore, dbcPath,"SpellCastingRequirements.dbc"); // 17399
- LoadDBC(availableDbcLocales, bad_dbc_files, sSpellCategoriesStore, dbcPath,"SpellCategories.dbc"); // 17399
- @@ -1241,3 +1254,12 @@ uint32 GetPowerIndexByClass(uint32 powerType, uint32 classId)
- {
- return PowersByClass[classId][powerType];
- }
- +
- +std::vector<SpellProcsPerMinuteModEntry const*> GetSpellProcsPerMinuteMods(uint32 spellprocsPerMinuteId)
- +{
- + auto itr = sSpellProcsPerMinuteMods.find(spellprocsPerMinuteId);
- + if (itr != sSpellProcsPerMinuteMods.end())
- + return itr->second;
- +
- + return std::vector<SpellProcsPerMinuteModEntry const*>();
- +}
- \ No newline at end of file
- diff --git a/src/server/game/DataStores/DBCStores.h b/src/server/game/DataStores/DBCStores.h
- index e5d467f..c49b623 100644
- --- a/src/server/game/DataStores/DBCStores.h
- +++ b/src/server/game/DataStores/DBCStores.h
- @@ -32,6 +32,7 @@ char const* GetPetName(uint32 petfamily, uint32 dbclang);
- SpellEffectEntry const* GetSpellEffectEntry(uint32 spellId, uint32 effect, uint32 difficulty);
- SpellEffectScalingEntry const* GetSpellEffectScalingEntry(uint32 effectId);
- SpellTotemsEntry const* GetSpellTotemEntry(uint32 spellId, uint8 totem);
- +std::vector<SpellProcsPerMinuteModEntry const*> GetSpellProcsPerMinuteMods(uint32 spellprocsPerMinuteId);
- int32 GetAreaFlagByAreaID(uint32 area_id); // -1 if not found
- AreaTableEntry const* GetAreaEntryByAreaID(uint32 area_id);
- @@ -205,6 +206,9 @@ extern DBCStorage <SpellShapeshiftEntry> sSpellShapeshiftStore;
- extern DBCStorage <SpellShapeshiftFormEntry> sSpellShapeshiftFormStore;
- extern DBCStorage <SpellEntry> sSpellStore;
- extern DBCStorage <SpellAuraOptionsEntry> sSpellAuraOptionsStore;
- +extern DBCStorage <SpellProcsPerMinuteEntry> sSpellProcsPerMinuteStore;
- +extern DBCStorage <SpellProcsPerMinuteModEntry> sSpellProcsPerMinuteModStore;
- +extern std::map<uint32, std::vector<SpellProcsPerMinuteModEntry const*>> sSpellProcsPerMinuteMods;
- extern DBCStorage <SpellAuraRestrictionsEntry> sSpellAuraRestrictionsStore;
- extern DBCStorage <SpellCastingRequirementsEntry> sSpellCastingRequirementsStore;
- extern DBCStorage <SpellCategoriesEntry> sSpellCategoriesStore;
- diff --git a/src/server/game/DataStores/DBCStructure.h b/src/server/game/DataStores/DBCStructure.h
- index aa35cc2..99a934c 100644
- --- a/src/server/game/DataStores/DBCStructure.h
- +++ b/src/server/game/DataStores/DBCStructure.h
- @@ -2465,7 +2465,7 @@ struct SpellAuraOptionsEntry
- {
- uint32 Id; // 0
- // uint32 SpellId; // 1
- -// uint32 Unk; // 2
- +// uint32 DifficultyID; // 2
- uint32 StackAmount; // 3
- uint32 procChance; // 4
- uint32 procCharges; // 5
- @@ -2474,6 +2474,24 @@ struct SpellAuraOptionsEntry
- uint32 spellProcsPerMinuteId; // 8
- };
- +// SpellProcsPerMinute.dbc
- +struct SpellProcsPerMinuteEntry
- +{
- + uint32 Id; // 0 m_ID
- + float ProcsPerMinute; // 1 m_procsPerMinute
- + uint32 Flags; // 2
- +};
- +
- +// SpellProcsPerMinute.dbc
- +struct SpellProcsPerMinuteModEntry
- +{
- + uint32 Id; // 0
- + uint32 Type; // 1
- + uint32 Param; // 2
- + float Coeff; // 3
- + uint32 SpellProcsPerMinuteID; // 4
- +};
- +
- // SpellAuraRestrictions.dbc/
- // @author Selenium: 5.4 valid
- struct SpellAuraRestrictionsEntry
- diff --git a/src/server/game/DataStores/DBCfmt.h b/src/server/game/DataStores/DBCfmt.h
- index bb6077f..e0512a0 100644
- --- a/src/server/game/DataStores/DBCfmt.h
- +++ b/src/server/game/DataStores/DBCfmt.h
- @@ -154,6 +154,8 @@ const char SpellPowerEntryfmt[] = "niiiiiiiiffif";
- const char SpellInterruptsEntryfmt[] = "dxxixixi";
- const char SpellEquippedItemsEntryfmt[] = "dxxiii";
- const char SpellAuraOptionsEntryfmt[] = "nxxiiiiii";
- +const char SpellProcsPerMinuteEntryfmt[] = "nfi";
- +const char SpellProcsPerMinuteModEntryfmt[] = "niifi";
- const char SpellAuraRestrictionsEntryfmt[] = "dxxiiiiiiii";
- const char SpellCastingRequirementsEntryfmt[] = "dixxixi";
- const char SpellClassOptionsEntryfmt[] = "dxiiiii";
- diff --git a/src/server/game/Spells/SpellInfo.cpp b/src/server/game/Spells/SpellInfo.cpp
- index 0326af5..8092d44 100644
- --- a/src/server/game/Spells/SpellInfo.cpp
- +++ b/src/server/game/Spells/SpellInfo.cpp
- @@ -936,10 +936,14 @@ SpellInfo::SpellInfo(SpellEntry const* spellEntry, uint32 difficulty)
- // SpellAuraOptionsEntry
- SpellAuraOptionsEntry const* _options = GetSpellAuraOptions();
- + SpellProcsPerMinuteEntry const* _ppm = _options ? sSpellProcsPerMinuteStore.LookupEntry(_options->spellProcsPerMinuteId) : nullptr;
- ProcFlags = _options ? _options->procFlags : 0;
- ProcChance = _options ? _options->procChance : 0;
- ProcCharges = _options ? _options->procCharges : 0;
- StackAmount = _options ? _options->StackAmount : 0;
- + ProcsPerMinute = _ppm ? _ppm->ProcsPerMinute : 0.0f;
- + if (_options)
- + ProcPPMMods = GetSpellProcsPerMinuteMods(_options->spellProcsPerMinuteId);
- // SpellAuraRestrictionsEntry
- SpellAuraRestrictionsEntry const* _aura = GetSpellAuraRestrictions();
- @@ -2609,6 +2613,125 @@ uint32 SpellInfo::CalcPowerCost(Unit const* caster, SpellSchoolMask schoolMask,
- return powerCost;
- }
- +inline float CalcPPMHasteMod(SpellProcsPerMinuteModEntry const* mod, Unit* caster)
- +{
- + float haste = caster->GetFloatValue(UNIT_MOD_HASTE);
- + float rangedHaste = caster->GetFloatValue(UNIT_FIELD_MOD_RANGED_HASTE);
- + float spellHaste = caster->GetFloatValue(UNIT_MOD_CAST_HASTE);
- + float regenHaste = caster->GetFloatValue(UNIT_MOD_HASTE_REGEN);
- +
- + switch (mod->Param)
- + {
- + case 1:
- + return (1.0f / haste - 1.0f) * mod->Coeff;
- + case 2:
- + return (1.0f / rangedHaste - 1.0f) * mod->Coeff;
- + case 3:
- + return (1.0f / spellHaste - 1.0f) * mod->Coeff;
- + case 4:
- + return (1.0f / regenHaste - 1.0f) * mod->Coeff;
- + case 5:
- + return (1.0f / std::min(std::min(std::min(haste, rangedHaste), spellHaste), regenHaste) - 1.0f) * mod->Coeff;
- + default:
- + break;
- + }
- +
- + return 0.0f;
- +}
- +
- +inline float CalcPPMCritMod(SpellProcsPerMinuteModEntry const* mod, Unit* caster)
- +{
- + if (caster->GetTypeId() != TYPEID_PLAYER)
- + return 0.0f;
- +
- + float crit = caster->GetFloatValue(PLAYER_CRIT_PERCENTAGE);
- + float rangedCrit = caster->GetFloatValue(PLAYER_RANGED_CRIT_PERCENTAGE);
- + float spellCrit = caster->GetFloatValue(PLAYER_SPELL_CRIT_PERCENTAGE1);
- +
- + switch (mod->Param)
- + {
- + case 1:
- + return crit * mod->Coeff * 0.01f;
- + case 2:
- + return rangedCrit * mod->Coeff * 0.01f;
- + case 3:
- + return spellCrit * mod->Coeff * 0.01f;
- + case 4:
- + return std::min(std::min(crit, rangedCrit), spellCrit) * mod->Coeff * 0.01f;
- + default:
- + break;
- + }
- +
- + return 0.0f;
- +}
- +
- +inline float CalcPPMItemLevelMod(SpellProcsPerMinuteModEntry const* mod, int32 itemLevel)
- +{
- + if (uint32(itemLevel) == mod->Param)
- + return 0.0f;
- +
- + float itemLevelPoints = GetRandomPropertyPoints(itemLevel, ITEM_QUALITY_RARE, INVTYPE_CHEST, 0);
- + float basePoints = GetRandomPropertyPoints(mod->Param, ITEM_QUALITY_RARE, INVTYPE_CHEST, 0);
- + if (itemLevelPoints == basePoints)
- + return 0.0f;
- +
- + return ((itemLevelPoints / basePoints) - 1.0f) * mod->Coeff;
- +}
- +
- +float SpellInfo::CalcProcPPM(float ppm, Unit* caster, int32 itemLevel) const
- +{
- + for (SpellProcsPerMinuteModEntry const* mod : ProcPPMMods)
- + {
- + switch (mod->Type)
- + {
- + case SPELL_PPM_MOD_HASTE:
- + {
- + ppm *= 1.0f + CalcPPMHasteMod(mod, caster);
- + break;
- + }
- + case SPELL_PPM_MOD_CRIT:
- + {
- + ppm *= 1.0f + CalcPPMCritMod(mod, caster);
- + break;
- + }
- + case SPELL_PPM_MOD_CLASS:
- + {
- + if (caster->getClassMask() & mod->Param)
- + ppm *= 1.0f + mod->Coeff;
- + break;
- + }
- + case SPELL_PPM_MOD_SPEC:
- + {
- + if (Player* plrCaster = caster->ToPlayer())
- + if (plrCaster->GetSpecializationId() == mod->Param)
- + ppm *= 1.0f + mod->Coeff;
- + break;
- + }
- + case SPELL_PPM_MOD_RACE:
- + {
- + if (caster->getRaceMask() & mod->Param)
- + ppm *= 1.0f + mod->Coeff;
- + break;
- + }
- + case SPELL_PPM_MOD_ITEM_LEVEL:
- + {
- + ppm *= 1.0f + CalcPPMItemLevelMod(mod, itemLevel);
- + break;
- + }
- + case SPELL_PPM_MOD_BATTLEGROUND:
- + {
- + if (caster->GetMap()->IsBattlegroundOrArena())
- + ppm *= 1.0f + mod->Coeff;
- + break;
- + }
- + default:
- + break;
- + }
- + }
- +
- + return ppm;
- +}
- +
- bool SpellInfo::IsRanked() const
- {
- return ChainEntry != NULL;
- diff --git a/src/server/game/Spells/SpellInfo.h b/src/server/game/Spells/SpellInfo.h
- index f58a3ea..786279c 100644
- --- a/src/server/game/Spells/SpellInfo.h
- +++ b/src/server/game/Spells/SpellInfo.h
- @@ -348,6 +348,8 @@ public:
- SpellRangeEntry const* RangeEntry;
- float Speed;
- uint32 StackAmount;
- + float ProcsPerMinute;
- + std::vector<SpellProcsPerMinuteModEntry const*> ProcPPMMods;
- uint32 Totem[2];
- int32 Reagent[MAX_SPELL_REAGENTS];
- uint32 ReagentCount[MAX_SPELL_REAGENTS];
- @@ -518,6 +520,8 @@ public:
- uint32 CalcPowerCost(Unit const* caster, SpellSchoolMask schoolMask, SpellPowerEntry const* spellPower, bool takeMods = true) const;
- + float CalcProcPPM(float ppm, Unit* caster, int32 itemLevel) const;
- +
- bool IsRanked() const;
- uint8 GetRank() const;
- SpellInfo const* GetFirstRankSpell() const;
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement