mirror of
https://github.com/EQEmu/Server.git
synced 2025-12-12 05:21:29 +00:00
[Spells] Update to SPA 130 and SPA 131 focus calculation, focus code improvements (#1486)
[Spells] Update to SPA 130 and SPA 131 focus calculation, focus code improvements #use instead of PR 1483
This commit is contained in:
parent
e71b11fcba
commit
0e7cfe96ef
@ -837,6 +837,8 @@ public:
|
||||
inline void SetSpellPowerDistanceMod(int16 value) { SpellPowerDistanceMod = value; };
|
||||
int32 GetSpellStat(uint32 spell_id, const char *identifier, uint8 slot = 0);
|
||||
bool HarmonySpellLevelCheck(int32 spell_id, Mob* target = nullptr);
|
||||
bool CanFocusUseRandomEffectivenessByType(focusType type);
|
||||
int GetFocusRandomEffectivenessValue(int focus_base, int focus_base2, bool best_focus = 0);
|
||||
|
||||
void CastSpellOnLand(Mob* caster, int32 spell_id);
|
||||
void FocusProcLimitProcess();
|
||||
|
||||
@ -5462,44 +5462,13 @@ int32 Mob::CalcFocusEffect(focusType type, uint16 focus_id, uint16 spell_id, boo
|
||||
// handle effects
|
||||
case SE_ImprovedDamage:
|
||||
if (type == focusImprovedDamage) {
|
||||
// This is used to determine which focus should be used for the random calculation
|
||||
if (best_focus) {
|
||||
// If the spell contains a value in the base2 field then that is the max value
|
||||
if (focus_spell.base2[i] != 0) {
|
||||
value = focus_spell.base2[i];
|
||||
}
|
||||
// If the spell does not contain a base2 value, then its a straight non random
|
||||
// value
|
||||
else {
|
||||
value = focus_spell.base[i];
|
||||
}
|
||||
}
|
||||
// Actual focus calculation starts here
|
||||
else if (focus_spell.base2[i] == 0 || focus_spell.base[i] == focus_spell.base2[i]) {
|
||||
value = focus_spell.base[i];
|
||||
}
|
||||
else {
|
||||
value = zone->random.Int(focus_spell.base[i], focus_spell.base2[i]);
|
||||
}
|
||||
value = GetFocusRandomEffectivenessValue(focus_spell.base[i], focus_spell.base2[i], best_focus);
|
||||
}
|
||||
break;
|
||||
|
||||
case SE_ImprovedDamage2:
|
||||
if (type == focusImprovedDamage2) {
|
||||
if (best_focus) {
|
||||
if (focus_spell.base2[i] != 0) {
|
||||
value = focus_spell.base2[i];
|
||||
}
|
||||
else {
|
||||
value = focus_spell.base[i];
|
||||
}
|
||||
}
|
||||
else if (focus_spell.base2[i] == 0 || focus_spell.base[i] == focus_spell.base2[i]) {
|
||||
value = focus_spell.base[i];
|
||||
}
|
||||
else {
|
||||
value = zone->random.Int(focus_spell.base[i], focus_spell.base2[i]);
|
||||
}
|
||||
value = GetFocusRandomEffectivenessValue(focus_spell.base[i], focus_spell.base2[i], best_focus);
|
||||
}
|
||||
break;
|
||||
|
||||
@ -5511,39 +5480,13 @@ int32 Mob::CalcFocusEffect(focusType type, uint16 focus_id, uint16 spell_id, boo
|
||||
|
||||
case SE_ImprovedHeal:
|
||||
if (type == focusImprovedHeal) {
|
||||
if (best_focus) {
|
||||
if (focus_spell.base2[i] != 0) {
|
||||
value = focus_spell.base2[i];
|
||||
}
|
||||
else {
|
||||
value = focus_spell.base[i];
|
||||
}
|
||||
}
|
||||
else if (focus_spell.base2[i] == 0 || focus_spell.base[i] == focus_spell.base2[i]) {
|
||||
value = focus_spell.base[i];
|
||||
}
|
||||
else {
|
||||
value = zone->random.Int(focus_spell.base[i], focus_spell.base2[i]);
|
||||
}
|
||||
value = GetFocusRandomEffectivenessValue(focus_spell.base[i], focus_spell.base2[i], best_focus);
|
||||
}
|
||||
break;
|
||||
|
||||
case SE_ReduceManaCost:
|
||||
if (type == focusManaCost) {
|
||||
if (best_focus) {
|
||||
if (focus_spell.base2[i] != 0) {
|
||||
value = focus_spell.base2[i];
|
||||
}
|
||||
else {
|
||||
value = focus_spell.base[i];
|
||||
}
|
||||
}
|
||||
else if (focus_spell.base2[i] == 0 || focus_spell.base[i] == focus_spell.base2[i]) {
|
||||
value = focus_spell.base[i];
|
||||
}
|
||||
else {
|
||||
value = zone->random.Int(focus_spell.base[i], focus_spell.base2[i]);
|
||||
}
|
||||
value = GetFocusRandomEffectivenessValue(focus_spell.base[i], focus_spell.base2[i], best_focus);
|
||||
}
|
||||
break;
|
||||
|
||||
@ -5590,8 +5533,8 @@ int32 Mob::CalcFocusEffect(focusType type, uint16 focus_id, uint16 spell_id, boo
|
||||
break;
|
||||
|
||||
case SE_ReduceReagentCost:
|
||||
if (type == focusReagentCost && focus_spell.base[i] > value) {
|
||||
value = focus_spell.base[i];
|
||||
if (type == focusReagentCost) {
|
||||
value = GetFocusRandomEffectivenessValue(focus_spell.base[i], focus_spell.base2[i], best_focus);
|
||||
}
|
||||
break;
|
||||
|
||||
@ -5603,20 +5546,7 @@ int32 Mob::CalcFocusEffect(focusType type, uint16 focus_id, uint16 spell_id, boo
|
||||
|
||||
case SE_SpellResistReduction:
|
||||
if (type == focusResistRate) {
|
||||
if (best_focus) {
|
||||
if (focus_spell.base2[i] != 0) {
|
||||
value = focus_spell.base2[i];
|
||||
}
|
||||
else {
|
||||
value = focus_spell.base[i];
|
||||
}
|
||||
}
|
||||
else if (focus_spell.base2[i] == 0 || focus_spell.base[i] == focus_spell.base2[i]) {
|
||||
value = focus_spell.base[i];
|
||||
}
|
||||
else {
|
||||
value = zone->random.Int(focus_spell.base[i], focus_spell.base2[i]);
|
||||
}
|
||||
value = GetFocusRandomEffectivenessValue(focus_spell.base[i], focus_spell.base2[i], best_focus);
|
||||
}
|
||||
break;
|
||||
|
||||
@ -5628,21 +5558,7 @@ int32 Mob::CalcFocusEffect(focusType type, uint16 focus_id, uint16 spell_id, boo
|
||||
|
||||
case SE_SpellHateMod:
|
||||
if (type == focusSpellHateMod) {
|
||||
if (value != 0) {
|
||||
if (value > 0) {
|
||||
if (focus_spell.base[i] > value) {
|
||||
value = focus_spell.base[i];
|
||||
}
|
||||
}
|
||||
else {
|
||||
if (focus_spell.base[i] < value) {
|
||||
value = focus_spell.base[i];
|
||||
}
|
||||
}
|
||||
}
|
||||
else {
|
||||
value = focus_spell.base[i];
|
||||
}
|
||||
value = GetFocusRandomEffectivenessValue(focus_spell.base[i], focus_spell.base2[i], best_focus);
|
||||
}
|
||||
break;
|
||||
|
||||
@ -5679,39 +5595,13 @@ int32 Mob::CalcFocusEffect(focusType type, uint16 focus_id, uint16 spell_id, boo
|
||||
|
||||
case SE_FcSpellVulnerability:
|
||||
if (type == focusSpellVulnerability) {
|
||||
if (best_focus) {
|
||||
if (focus_spell.base2[i] != 0) {
|
||||
value = focus_spell.base2[i]; //max damage
|
||||
}
|
||||
else {
|
||||
value = focus_spell.base[i];
|
||||
} //min damage
|
||||
}
|
||||
else if (focus_spell.base2[i] == 0 || focus_spell.base[i] == focus_spell.base2[i]) {
|
||||
value = focus_spell.base[i]; //If no max damage set, then default to min damage
|
||||
}
|
||||
else {
|
||||
value = zone->random.Int(focus_spell.base[i], focus_spell.base2[i]); //else random for value
|
||||
}
|
||||
value = GetFocusRandomEffectivenessValue(focus_spell.base[i], focus_spell.base2[i], best_focus);
|
||||
}
|
||||
break;
|
||||
|
||||
case SE_Fc_Spell_Damage_Pct_IncomingPC:
|
||||
if (type == focusFcSpellDamagePctIncomingPC) {
|
||||
if (best_focus) {
|
||||
if (focus_spell.base2[i] != 0) {
|
||||
value = focus_spell.base2[i]; //max damage
|
||||
}
|
||||
else {
|
||||
value = focus_spell.base[i];
|
||||
} //min damage
|
||||
}
|
||||
else if (focus_spell.base2[i] == 0 || focus_spell.base[i] == focus_spell.base2[i]) {
|
||||
value = focus_spell.base[i]; //If no max damage set, then default to min damage
|
||||
}
|
||||
else {
|
||||
value = zone->random.Int(focus_spell.base[i], focus_spell.base2[i]); //else random for value
|
||||
}
|
||||
value = GetFocusRandomEffectivenessValue(focus_spell.base[i], focus_spell.base2[i], best_focus);
|
||||
}
|
||||
break;
|
||||
|
||||
@ -6122,7 +6012,7 @@ int32 Client::GetFocusEffect(focusType type, uint16 spell_id)
|
||||
|
||||
//Improved Healing, Damage & Mana Reduction are handled differently in that some are random percentages
|
||||
//In these cases we need to find the most powerful effect, so that each piece of gear wont get its own chance
|
||||
if (RuleB(Spells, LiveLikeFocusEffects) && (type == focusManaCost || type == focusImprovedHeal || type == focusImprovedDamage || type == focusImprovedDamage2 || type == focusResistRate)) {
|
||||
if (RuleB(Spells, LiveLikeFocusEffects) && CanFocusUseRandomEffectivenessByType(type)) {
|
||||
rand_effectiveness = true;
|
||||
}
|
||||
|
||||
@ -7889,3 +7779,42 @@ bool Mob::HarmonySpellLevelCheck(int32 spell_id, Mob *target)
|
||||
}
|
||||
return true;
|
||||
}
|
||||
|
||||
bool Mob::CanFocusUseRandomEffectivenessByType(focusType type)
|
||||
{
|
||||
switch (type) {
|
||||
case focusImprovedDamage:
|
||||
case focusImprovedDamage2:
|
||||
case focusImprovedHeal:
|
||||
case focusManaCost:
|
||||
case focusResistRate:
|
||||
case focusFcDamagePctCrit:
|
||||
case focusReagentCost:
|
||||
case focusSpellHateMod:
|
||||
case focusSpellVulnerability:
|
||||
case focusFcSpellDamagePctIncomingPC:
|
||||
return true;
|
||||
}
|
||||
|
||||
return false;
|
||||
}
|
||||
|
||||
int Mob::GetFocusRandomEffectivenessValue(int focus_base, int focus_base2, bool best_focus)
|
||||
{
|
||||
int value = 0;
|
||||
// This is used to determine which focus should be used for the random calculation
|
||||
if (best_focus) {
|
||||
// If the spell does not contain a base2 value, then its a straight non random
|
||||
value = focus_base;
|
||||
// If the spell contains a value in the base2 field then that is the max value
|
||||
if (focus_base2 != 0) {
|
||||
value = focus_base2;
|
||||
}
|
||||
return value;
|
||||
}
|
||||
else if (focus_base2 == 0 || focus_base == focus_base2) { // Actual focus calculation starts here
|
||||
return focus_base;
|
||||
}
|
||||
|
||||
return zone->random.Int(focus_base, focus_base2);
|
||||
}
|
||||
|
||||
Loading…
x
Reference in New Issue
Block a user