[Feature] Additive Spell Focus from Worn slot with Limit Checks (#4208)

* [Feature] Additive Spell Focus from Worn slot with limits

New rule (UseAdditiveFocusFromWornSlotWithLimits) allows you place to focus effects in worn slots which will apply the focus additively and perform normal limit checks on those focus. This differs from regular focus behavior that only takes highest value.

This is a new version of an old rule "UseAdditiveFocusFromWornSlot"
which allowed similar behavior but ignored focus limits. Thus hindering its full potential for itemization.

* Update spell_effects.cpp

---------

Co-authored-by: Kinglykrab <kinglykrab@gmail.com>
This commit is contained in:
KayenEQ
2024-03-30 13:23:02 -04:00
committed by GitHub
parent e19f72f021
commit cd89926435
4 changed files with 54 additions and 5 deletions
+4 -1
View File
@@ -2090,7 +2090,10 @@ void Mob::ApplySpellsBonuses(uint16 spell_id, uint8 casterlevel, StatBonuses *ne
if (focus)
{
if (WornType){
if (RuleB(Spells, UseAdditiveFocusFromWornSlot)) {
if (RuleB(Spells, UseAdditiveFocusFromWornSlotWithLimits)) {
new_bonus->FocusEffectsWornWithLimits[focus] = spells[spell_id].effect_id[i];
}
else if (RuleB(Spells, UseAdditiveFocusFromWornSlot)) {
new_bonus->FocusEffectsWorn[focus] += spells[spell_id].base_value[i];
}
}
+2 -1
View File
@@ -445,7 +445,8 @@ struct StatBonuses {
int32 SongRange; // increases range of beneficial bard songs
uint32 HPToManaConvert; // Uses HP to cast spells at specific conversion
int32 FocusEffects[HIGHEST_FOCUS+1]; // Stores the focus effectid for each focustype you have.
int16 FocusEffectsWorn[HIGHEST_FOCUS+1]; // Optional to allow focus effects to be applied additively from worn slot
int16 FocusEffectsWorn[HIGHEST_FOCUS+1]; // Optional to allow focus effects to be applied additively from worn slot, limits do not apply
int32 FocusEffectsWornWithLimits[HIGHEST_FOCUS + 1];// Optional to allow focus effects to be applied additively from worn slot, limits apply
bool NegateEffects; // Check if you contain a buff with negate effect. (only spellbonuses)
int32 SkillDamageAmount2[EQ::skills::HIGHEST_SKILL + 2]; // Adds skill specific damage
uint32 NegateAttacks[3]; // 0 = bool HasEffect 1 = Buff Slot 2 = Max damage absorbed per hit
+46 -2
View File
@@ -6801,9 +6801,53 @@ int64 Mob::GetFocusEffect(focusType type, uint16 spell_id, Mob *caster, bool fro
//Summon Spells that require reagents are typically imbue type spells, enchant metal, sacrifice and shouldn't be affected
//by reagent conservation for obvious reasons.
//Non-Live like feature to allow for an additive focus bonus to be applied from foci that are placed in worn slot. (No limit checks)
int32 worneffect_bonus = 0;
if (RuleB(Spells, UseAdditiveFocusFromWornSlot)) {
//Non-Live like feature to allow for an additive focus bonus to be applied from foci that are placed in worn slot. (Limit Checks)
if (RuleB(Spells, UseAdditiveFocusFromWornSlotWithLimits)) {
//Check if item focus effect exists for the mob.
if (itembonuses.FocusEffectsWornWithLimits[type]) {
const EQ::ItemData* temporary_item = nullptr;
const EQ::ItemData* used_item = nullptr;
//item focus
for (int x = EQ::invslot::EQUIPMENT_BEGIN; x <= EQ::invslot::EQUIPMENT_END; x++) {
temporary_item = nullptr;
EQ::ItemInstance* ins = GetInv().GetItem(x);
if (!ins) {
continue;
}
temporary_item = ins->GetItem();
if (temporary_item && IsValidSpell(temporary_item->Worn.Effect)) {
if (rand_effectiveness) {
worneffect_bonus += CalcFocusEffect(type, temporary_item->Worn.Effect, spell_id, true);
}
else {
worneffect_bonus += CalcFocusEffect(type, temporary_item->Worn.Effect, spell_id);
}
}
for (int y = EQ::invaug::SOCKET_BEGIN; y <= EQ::invaug::SOCKET_END; ++y) {
EQ::ItemInstance* aug = nullptr;
aug = ins->GetAugment(y);
if (aug) {
const EQ::ItemData* temporary_item_augment = aug->GetItem();
if (temporary_item_augment && IsValidSpell(temporary_item_augment->Worn.Effect)) {
if (rand_effectiveness) {
worneffect_bonus += CalcFocusEffect(type, temporary_item_augment->Worn.Effect, spell_id, true);
}
else {
worneffect_bonus += CalcFocusEffect(type, temporary_item_augment->Worn.Effect, spell_id);
}
}
}
}
}
}
}
//Non-Live like feature to allow for an additive focus bonus to be applied from foci that are placed in worn slot. (No limit checks)
else if (RuleB(Spells, UseAdditiveFocusFromWornSlot)) {
worneffect_bonus = itembonuses.FocusEffectsWorn[type];
}