From 54da27424f1130658ebbdab347298576a1a12306 Mon Sep 17 00:00:00 2001 From: "Michael Cook (mackal)" Date: Sun, 14 Apr 2019 00:18:23 -0400 Subject: [PATCH] Implement Foraging AA Currently this SPA is only checked for AA bonuses since a non-permanent bonus doesn't make sense. Plus I'm not sure the client is aware of it in spells/gear --- common/spdat.h | 2 +- zone/bonuses.cpp | 13 +++++++++++-- zone/client.cpp | 5 ++++- zone/common.h | 1 + 4 files changed, 17 insertions(+), 4 deletions(-) diff --git a/common/spdat.h b/common/spdat.h index 877d37823..2616ba717 100644 --- a/common/spdat.h +++ b/common/spdat.h @@ -590,7 +590,7 @@ typedef enum { #define SE_CorruptionCounter 369 // implemented #define SE_ResistCorruption 370 // implemented #define SE_AttackSpeed4 371 // implemented - stackable slow effect 'Inhibit Melee' -#define SE_ForageSkill 372 // *not implemented[AA] Will increase the skill cap for those that have the Forage skill and grant the skill and raise the cap to those that do not. +#define SE_ForageSkill 372 // implemented[AA] Will increase the skill cap for those that have the Forage skill and grant the skill and raise the cap to those that do not. #define SE_CastOnFadeEffectAlways 373 // implemented - Triggers if fades after natural duration OR from rune/numhits fades. #define SE_ApplyEffect 374 // implemented #define SE_DotCritDmgIncrease 375 // implemented - Increase damage of DoT critical amount diff --git a/zone/bonuses.cpp b/zone/bonuses.cpp index c7d5cf2a8..9b7354190 100644 --- a/zone/bonuses.cpp +++ b/zone/bonuses.cpp @@ -1472,6 +1472,17 @@ void Mob::ApplyAABonuses(const AA::Rank &rank, StatBonuses *newbon) newbon->trap_slots += base1; break; + case SE_ForageSkill: + newbon->GrantForage += base1; + // we need to grant a skill point here + // I'd rather not do this here, but whatever, probably fine + if (IsClient()) { + auto client = CastToClient(); + if (client->GetRawSkill(EQEmu::skills::SkillType::SkillForage) == 0) + client->SetSkill(EQEmu::skills::SkillType::SkillForage, 1); + } + break; + // to do case SE_PetDiscipline: break; @@ -1479,8 +1490,6 @@ void Mob::ApplyAABonuses(const AA::Rank &rank, StatBonuses *newbon) break; case SE_BandolierSlots: break; - case SE_ForageSkill: - break; case SE_SecondaryForte: break; case SE_ExtendedShielding: diff --git a/zone/client.cpp b/zone/client.cpp index e713ce6e4..86b402f44 100644 --- a/zone/client.cpp +++ b/zone/client.cpp @@ -2604,9 +2604,12 @@ uint16 Client::GetMaxSkillAfterSpecializationRules(EQEmu::skills::SkillType skil } } - + Result += spellbonuses.RaiseSkillCap[skillid] + itembonuses.RaiseSkillCap[skillid] + aabonuses.RaiseSkillCap[skillid]; + if (skillid == EQEmu::skills::SkillType::SkillForage) + Result += aabonuses.GrantForage; + return Result; } diff --git a/zone/common.h b/zone/common.h index 6d78dc46f..62f1d9771 100644 --- a/zone/common.h +++ b/zone/common.h @@ -558,6 +558,7 @@ struct StatBonuses { int16 FeignedCastOnChance; // Percent Value bool PetCommands[PET_MAXCOMMANDS]; // SPA 267 int FeignedMinionChance; // SPA 281 base1 = chance, just like normal FD + int GrantForage; // affects max skill of forage as well as granting non-forage classes forage int aura_slots; int trap_slots; bool hunger; // Song of Sustenance -- min caps to 3500