Advertisement
BlackMetalz

Untitled

Jan 13th, 2017
111
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
text 12.97 KB | None | 0 0
  1. diff --git a/src/server/game/DataStores/DBCEnums.h b/src/server/game/DataStores/DBCEnums.h
  2. index ddea959..50c455f 100644
  3. --- a/src/server/game/DataStores/DBCEnums.h
  4. +++ b/src/server/game/DataStores/DBCEnums.h
  5. @@ -461,6 +461,17 @@ enum MountFlags
  6. MOUNT_FLAG_CAN_SWIM = 0x8 // client checks MOVEMENTFLAG_SWIMMING
  7. };
  8.  
  9. +enum SpellProcsPerMinuteModType
  10. +{
  11. + SPELL_PPM_MOD_HASTE = 1,
  12. + SPELL_PPM_MOD_CRIT = 2,
  13. + SPELL_PPM_MOD_CLASS = 3,
  14. + SPELL_PPM_MOD_SPEC = 4,
  15. + SPELL_PPM_MOD_RACE = 5,
  16. + SPELL_PPM_MOD_ITEM_LEVEL = 6,
  17. + SPELL_PPM_MOD_BATTLEGROUND = 7
  18. +};
  19. +
  20. enum TotemCategoryType
  21. {
  22. TOTEM_CATEGORY_TYPE_KNIFE = 1,
  23. diff --git a/src/server/game/DataStores/DBCStores.cpp b/src/server/game/DataStores/DBCStores.cpp
  24. index 84ae300..2126a11 100644
  25. --- a/src/server/game/DataStores/DBCStores.cpp
  26. +++ b/src/server/game/DataStores/DBCStores.cpp
  27. @@ -214,6 +214,9 @@ DBCStorage <SpellEquippedItemsEntry> sSpellEquippedItemsStore(SpellEquippedItems
  28. DBCStorage <SpellClassOptionsEntry> sSpellClassOptionsStore(SpellClassOptionsEntryfmt);
  29. DBCStorage <SpellCooldownsEntry> sSpellCooldownsStore(SpellCooldownsEntryfmt);
  30. DBCStorage <SpellAuraOptionsEntry> sSpellAuraOptionsStore(SpellAuraOptionsEntryfmt);
  31. +DBCStorage <SpellProcsPerMinuteEntry> sSpellProcsPerMinuteStore(SpellProcsPerMinuteEntryfmt);
  32. +DBCStorage <SpellProcsPerMinuteModEntry> sSpellProcsPerMinuteModStore(SpellProcsPerMinuteModEntryfmt);
  33. +std::map<uint32, std::vector<SpellProcsPerMinuteModEntry const*>> sSpellProcsPerMinuteMods;
  34. DBCStorage <SpellAuraRestrictionsEntry> sSpellAuraRestrictionsStore(SpellAuraRestrictionsEntryfmt);
  35. DBCStorage <SpellCastingRequirementsEntry> sSpellCastingRequirementsStore(SpellCastingRequirementsEntryfmt);
  36.  
  37. @@ -590,6 +593,16 @@ void LoadDBCStores(const std::string& dataPath)
  38. LoadDBC(availableDbcLocales, bad_dbc_files, sSpellClassOptionsStore, dbcPath,"SpellClassOptions.dbc"); // 17399
  39. LoadDBC(availableDbcLocales, bad_dbc_files, sSpellCooldownsStore, dbcPath,"SpellCooldowns.dbc"); // 17399
  40. LoadDBC(availableDbcLocales, bad_dbc_files, sSpellAuraOptionsStore, dbcPath,"SpellAuraOptions.dbc"); // 17399
  41. + LoadDBC(availableDbcLocales, bad_dbc_files, sSpellProcsPerMinuteStore, dbcPath, "SpellProcsPerMinute.dbc"); // 17399
  42. + LoadDBC(availableDbcLocales, bad_dbc_files, sSpellProcsPerMinuteModStore, dbcPath, "SpellProcsPerMinuteMod.dbc"); // 17399
  43. +
  44. + for (uint32 i = 0; i < sSpellProcsPerMinuteModStore.GetNumRows(); ++i)
  45. + {
  46. + if (SpellProcsPerMinuteModEntry* ppmMod = sSpellProcsPerMinuteModStore.LookupEntry(i))
  47. + sSpellProcsPerMinuteMods[ppmMod->SpellProcsPerMinuteID].push_back(ppmMod);
  48. + }
  49. +
  50. +
  51. LoadDBC(availableDbcLocales, bad_dbc_files, sSpellAuraRestrictionsStore, dbcPath,"SpellAuraRestrictions.dbc"); // 17399
  52. LoadDBC(availableDbcLocales, bad_dbc_files, sSpellCastingRequirementsStore, dbcPath,"SpellCastingRequirements.dbc"); // 17399
  53. LoadDBC(availableDbcLocales, bad_dbc_files, sSpellCategoriesStore, dbcPath,"SpellCategories.dbc"); // 17399
  54. @@ -1241,3 +1254,12 @@ uint32 GetPowerIndexByClass(uint32 powerType, uint32 classId)
  55. {
  56. return PowersByClass[classId][powerType];
  57. }
  58. +
  59. +std::vector<SpellProcsPerMinuteModEntry const*> GetSpellProcsPerMinuteMods(uint32 spellprocsPerMinuteId)
  60. +{
  61. + auto itr = sSpellProcsPerMinuteMods.find(spellprocsPerMinuteId);
  62. + if (itr != sSpellProcsPerMinuteMods.end())
  63. + return itr->second;
  64. +
  65. + return std::vector<SpellProcsPerMinuteModEntry const*>();
  66. +}
  67. \ No newline at end of file
  68. diff --git a/src/server/game/DataStores/DBCStores.h b/src/server/game/DataStores/DBCStores.h
  69. index e5d467f..c49b623 100644
  70. --- a/src/server/game/DataStores/DBCStores.h
  71. +++ b/src/server/game/DataStores/DBCStores.h
  72. @@ -32,6 +32,7 @@ char const* GetPetName(uint32 petfamily, uint32 dbclang);
  73. SpellEffectEntry const* GetSpellEffectEntry(uint32 spellId, uint32 effect, uint32 difficulty);
  74. SpellEffectScalingEntry const* GetSpellEffectScalingEntry(uint32 effectId);
  75. SpellTotemsEntry const* GetSpellTotemEntry(uint32 spellId, uint8 totem);
  76. +std::vector<SpellProcsPerMinuteModEntry const*> GetSpellProcsPerMinuteMods(uint32 spellprocsPerMinuteId);
  77.  
  78. int32 GetAreaFlagByAreaID(uint32 area_id); // -1 if not found
  79. AreaTableEntry const* GetAreaEntryByAreaID(uint32 area_id);
  80. @@ -205,6 +206,9 @@ extern DBCStorage <SpellShapeshiftEntry> sSpellShapeshiftStore;
  81. extern DBCStorage <SpellShapeshiftFormEntry> sSpellShapeshiftFormStore;
  82. extern DBCStorage <SpellEntry> sSpellStore;
  83. extern DBCStorage <SpellAuraOptionsEntry> sSpellAuraOptionsStore;
  84. +extern DBCStorage <SpellProcsPerMinuteEntry> sSpellProcsPerMinuteStore;
  85. +extern DBCStorage <SpellProcsPerMinuteModEntry> sSpellProcsPerMinuteModStore;
  86. +extern std::map<uint32, std::vector<SpellProcsPerMinuteModEntry const*>> sSpellProcsPerMinuteMods;
  87. extern DBCStorage <SpellAuraRestrictionsEntry> sSpellAuraRestrictionsStore;
  88. extern DBCStorage <SpellCastingRequirementsEntry> sSpellCastingRequirementsStore;
  89. extern DBCStorage <SpellCategoriesEntry> sSpellCategoriesStore;
  90. diff --git a/src/server/game/DataStores/DBCStructure.h b/src/server/game/DataStores/DBCStructure.h
  91. index aa35cc2..99a934c 100644
  92. --- a/src/server/game/DataStores/DBCStructure.h
  93. +++ b/src/server/game/DataStores/DBCStructure.h
  94. @@ -2465,7 +2465,7 @@ struct SpellAuraOptionsEntry
  95. {
  96. uint32 Id; // 0
  97. // uint32 SpellId; // 1
  98. -// uint32 Unk; // 2
  99. +// uint32 DifficultyID; // 2
  100. uint32 StackAmount; // 3
  101. uint32 procChance; // 4
  102. uint32 procCharges; // 5
  103. @@ -2474,6 +2474,24 @@ struct SpellAuraOptionsEntry
  104. uint32 spellProcsPerMinuteId; // 8
  105. };
  106.  
  107. +// SpellProcsPerMinute.dbc
  108. +struct SpellProcsPerMinuteEntry
  109. +{
  110. + uint32 Id; // 0 m_ID
  111. + float ProcsPerMinute; // 1 m_procsPerMinute
  112. + uint32 Flags; // 2
  113. +};
  114. +
  115. +// SpellProcsPerMinute.dbc
  116. +struct SpellProcsPerMinuteModEntry
  117. +{
  118. + uint32 Id; // 0
  119. + uint32 Type; // 1
  120. + uint32 Param; // 2
  121. + float Coeff; // 3
  122. + uint32 SpellProcsPerMinuteID; // 4
  123. +};
  124. +
  125. // SpellAuraRestrictions.dbc/
  126. // @author Selenium: 5.4 valid
  127. struct SpellAuraRestrictionsEntry
  128. diff --git a/src/server/game/DataStores/DBCfmt.h b/src/server/game/DataStores/DBCfmt.h
  129. index bb6077f..e0512a0 100644
  130. --- a/src/server/game/DataStores/DBCfmt.h
  131. +++ b/src/server/game/DataStores/DBCfmt.h
  132. @@ -154,6 +154,8 @@ const char SpellPowerEntryfmt[] = "niiiiiiiiffif";
  133. const char SpellInterruptsEntryfmt[] = "dxxixixi";
  134. const char SpellEquippedItemsEntryfmt[] = "dxxiii";
  135. const char SpellAuraOptionsEntryfmt[] = "nxxiiiiii";
  136. +const char SpellProcsPerMinuteEntryfmt[] = "nfi";
  137. +const char SpellProcsPerMinuteModEntryfmt[] = "niifi";
  138. const char SpellAuraRestrictionsEntryfmt[] = "dxxiiiiiiii";
  139. const char SpellCastingRequirementsEntryfmt[] = "dixxixi";
  140. const char SpellClassOptionsEntryfmt[] = "dxiiiii";
  141. diff --git a/src/server/game/Spells/SpellInfo.cpp b/src/server/game/Spells/SpellInfo.cpp
  142. index 0326af5..8092d44 100644
  143. --- a/src/server/game/Spells/SpellInfo.cpp
  144. +++ b/src/server/game/Spells/SpellInfo.cpp
  145. @@ -936,10 +936,14 @@ SpellInfo::SpellInfo(SpellEntry const* spellEntry, uint32 difficulty)
  146.  
  147. // SpellAuraOptionsEntry
  148. SpellAuraOptionsEntry const* _options = GetSpellAuraOptions();
  149. + SpellProcsPerMinuteEntry const* _ppm = _options ? sSpellProcsPerMinuteStore.LookupEntry(_options->spellProcsPerMinuteId) : nullptr;
  150. ProcFlags = _options ? _options->procFlags : 0;
  151. ProcChance = _options ? _options->procChance : 0;
  152. ProcCharges = _options ? _options->procCharges : 0;
  153. StackAmount = _options ? _options->StackAmount : 0;
  154. + ProcsPerMinute = _ppm ? _ppm->ProcsPerMinute : 0.0f;
  155. + if (_options)
  156. + ProcPPMMods = GetSpellProcsPerMinuteMods(_options->spellProcsPerMinuteId);
  157.  
  158. // SpellAuraRestrictionsEntry
  159. SpellAuraRestrictionsEntry const* _aura = GetSpellAuraRestrictions();
  160. @@ -2609,6 +2613,125 @@ uint32 SpellInfo::CalcPowerCost(Unit const* caster, SpellSchoolMask schoolMask,
  161. return powerCost;
  162. }
  163.  
  164. +inline float CalcPPMHasteMod(SpellProcsPerMinuteModEntry const* mod, Unit* caster)
  165. +{
  166. + float haste = caster->GetFloatValue(UNIT_MOD_HASTE);
  167. + float rangedHaste = caster->GetFloatValue(UNIT_FIELD_MOD_RANGED_HASTE);
  168. + float spellHaste = caster->GetFloatValue(UNIT_MOD_CAST_HASTE);
  169. + float regenHaste = caster->GetFloatValue(UNIT_MOD_HASTE_REGEN);
  170. +
  171. + switch (mod->Param)
  172. + {
  173. + case 1:
  174. + return (1.0f / haste - 1.0f) * mod->Coeff;
  175. + case 2:
  176. + return (1.0f / rangedHaste - 1.0f) * mod->Coeff;
  177. + case 3:
  178. + return (1.0f / spellHaste - 1.0f) * mod->Coeff;
  179. + case 4:
  180. + return (1.0f / regenHaste - 1.0f) * mod->Coeff;
  181. + case 5:
  182. + return (1.0f / std::min(std::min(std::min(haste, rangedHaste), spellHaste), regenHaste) - 1.0f) * mod->Coeff;
  183. + default:
  184. + break;
  185. + }
  186. +
  187. + return 0.0f;
  188. +}
  189. +
  190. +inline float CalcPPMCritMod(SpellProcsPerMinuteModEntry const* mod, Unit* caster)
  191. +{
  192. + if (caster->GetTypeId() != TYPEID_PLAYER)
  193. + return 0.0f;
  194. +
  195. + float crit = caster->GetFloatValue(PLAYER_CRIT_PERCENTAGE);
  196. + float rangedCrit = caster->GetFloatValue(PLAYER_RANGED_CRIT_PERCENTAGE);
  197. + float spellCrit = caster->GetFloatValue(PLAYER_SPELL_CRIT_PERCENTAGE1);
  198. +
  199. + switch (mod->Param)
  200. + {
  201. + case 1:
  202. + return crit * mod->Coeff * 0.01f;
  203. + case 2:
  204. + return rangedCrit * mod->Coeff * 0.01f;
  205. + case 3:
  206. + return spellCrit * mod->Coeff * 0.01f;
  207. + case 4:
  208. + return std::min(std::min(crit, rangedCrit), spellCrit) * mod->Coeff * 0.01f;
  209. + default:
  210. + break;
  211. + }
  212. +
  213. + return 0.0f;
  214. +}
  215. +
  216. +inline float CalcPPMItemLevelMod(SpellProcsPerMinuteModEntry const* mod, int32 itemLevel)
  217. +{
  218. + if (uint32(itemLevel) == mod->Param)
  219. + return 0.0f;
  220. +
  221. + float itemLevelPoints = GetRandomPropertyPoints(itemLevel, ITEM_QUALITY_RARE, INVTYPE_CHEST, 0);
  222. + float basePoints = GetRandomPropertyPoints(mod->Param, ITEM_QUALITY_RARE, INVTYPE_CHEST, 0);
  223. + if (itemLevelPoints == basePoints)
  224. + return 0.0f;
  225. +
  226. + return ((itemLevelPoints / basePoints) - 1.0f) * mod->Coeff;
  227. +}
  228. +
  229. +float SpellInfo::CalcProcPPM(float ppm, Unit* caster, int32 itemLevel) const
  230. +{
  231. + for (SpellProcsPerMinuteModEntry const* mod : ProcPPMMods)
  232. + {
  233. + switch (mod->Type)
  234. + {
  235. + case SPELL_PPM_MOD_HASTE:
  236. + {
  237. + ppm *= 1.0f + CalcPPMHasteMod(mod, caster);
  238. + break;
  239. + }
  240. + case SPELL_PPM_MOD_CRIT:
  241. + {
  242. + ppm *= 1.0f + CalcPPMCritMod(mod, caster);
  243. + break;
  244. + }
  245. + case SPELL_PPM_MOD_CLASS:
  246. + {
  247. + if (caster->getClassMask() & mod->Param)
  248. + ppm *= 1.0f + mod->Coeff;
  249. + break;
  250. + }
  251. + case SPELL_PPM_MOD_SPEC:
  252. + {
  253. + if (Player* plrCaster = caster->ToPlayer())
  254. + if (plrCaster->GetSpecializationId() == mod->Param)
  255. + ppm *= 1.0f + mod->Coeff;
  256. + break;
  257. + }
  258. + case SPELL_PPM_MOD_RACE:
  259. + {
  260. + if (caster->getRaceMask() & mod->Param)
  261. + ppm *= 1.0f + mod->Coeff;
  262. + break;
  263. + }
  264. + case SPELL_PPM_MOD_ITEM_LEVEL:
  265. + {
  266. + ppm *= 1.0f + CalcPPMItemLevelMod(mod, itemLevel);
  267. + break;
  268. + }
  269. + case SPELL_PPM_MOD_BATTLEGROUND:
  270. + {
  271. + if (caster->GetMap()->IsBattlegroundOrArena())
  272. + ppm *= 1.0f + mod->Coeff;
  273. + break;
  274. + }
  275. + default:
  276. + break;
  277. + }
  278. + }
  279. +
  280. + return ppm;
  281. +}
  282. +
  283. bool SpellInfo::IsRanked() const
  284. {
  285. return ChainEntry != NULL;
  286. diff --git a/src/server/game/Spells/SpellInfo.h b/src/server/game/Spells/SpellInfo.h
  287. index f58a3ea..786279c 100644
  288. --- a/src/server/game/Spells/SpellInfo.h
  289. +++ b/src/server/game/Spells/SpellInfo.h
  290. @@ -348,6 +348,8 @@ public:
  291. SpellRangeEntry const* RangeEntry;
  292. float Speed;
  293. uint32 StackAmount;
  294. + float ProcsPerMinute;
  295. + std::vector<SpellProcsPerMinuteModEntry const*> ProcPPMMods;
  296. uint32 Totem[2];
  297. int32 Reagent[MAX_SPELL_REAGENTS];
  298. uint32 ReagentCount[MAX_SPELL_REAGENTS];
  299. @@ -518,6 +520,8 @@ public:
  300.  
  301. uint32 CalcPowerCost(Unit const* caster, SpellSchoolMask schoolMask, SpellPowerEntry const* spellPower, bool takeMods = true) const;
  302.  
  303. + float CalcProcPPM(float ppm, Unit* caster, int32 itemLevel) const;
  304. +
  305. bool IsRanked() const;
  306. uint8 GetRank() const;
  307. SpellInfo const* GetFirstRankSpell() const;
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement