From 216113e14b9605e568a970d38d68b90a7747012d Mon Sep 17 00:00:00 2001 From: KayenEQ Date: Fri, 13 Jun 2014 05:32:41 -0400 Subject: [PATCH 1/3] Additional functionality for damage shield and skill damage taken effects va the npc_spell_effects table. See change log and wiki. --- changelog.txt | 5 +++++ common/spdat.cpp | 5 ++++- common/spdat.h | 2 +- zone/bonuses.cpp | 32 ++++++++++++++++++++++++++------ 4 files changed, 36 insertions(+), 8 deletions(-) diff --git a/changelog.txt b/changelog.txt index e717b8cf8..68e2d4593 100644 --- a/changelog.txt +++ b/changelog.txt @@ -1,5 +1,10 @@ EQEMu Changelog (Started on Sept 24, 2003 15:50) ------------------------------------------------------- +== 06/13/2014 == +Kayen: For table 'npc_spell_effects_entries' setting se_max for damage shield effects (59) will now determine the DS Type (ie burning) +Setting se_max to 1 for SkillDamageTaken effects (127) will allow for stackable mitigation/weakness same as quest function ModSkillDmgTaken. + + == 06/8/2014 == KLS: Changed lua API: eq.get_globals(client, npc) has been removed. Use eq.get_globals(npc, client) instead. There's a bug with something in gcc 4.6.3 (maybe other versions) on x86 that this is attempting to combat. diff --git a/common/spdat.cpp b/common/spdat.cpp index 9bf01d413..013a917f1 100644 --- a/common/spdat.cpp +++ b/common/spdat.cpp @@ -818,7 +818,7 @@ int GetSpellEffectDescNum(uint16 spell_id) return -1; } -DmgShieldType GetDamageShieldType(uint16 spell_id) +DmgShieldType GetDamageShieldType(uint16 spell_id, int32 DSType) { // If we have a DamageShieldType for this spell from the damageshieldtypes table, return that, // else, make a guess, based on the resist type. Default return value is DS_THORNS @@ -841,6 +841,9 @@ DmgShieldType GetDamageShieldType(uint16 spell_id) } } + else if (DSType) + return (DmgShieldType) DSType; + return DS_THORNS; } diff --git a/common/spdat.h b/common/spdat.h index c7452426d..87f51c07a 100644 --- a/common/spdat.h +++ b/common/spdat.h @@ -840,7 +840,7 @@ uint32 GetPartialMagicRuneAmount(uint32 spell_id); int CalcPetHp(int levelb, int classb, int STA = 75); const char *GetRandPetName(); int GetSpellEffectDescNum(uint16 spell_id); -DmgShieldType GetDamageShieldType(uint16 spell_id); +DmgShieldType GetDamageShieldType(uint16 spell_id, int32 DSType = 0); bool DetrimentalSpellAllowsRest(uint16 spell_id); uint32 GetNimbusEffect(uint16 spell_id); int32 GetFuriousBash(uint16 spell_id); diff --git a/zone/bonuses.cpp b/zone/bonuses.cpp index 4699bfef1..bef19ae39 100644 --- a/zone/bonuses.cpp +++ b/zone/bonuses.cpp @@ -1627,7 +1627,12 @@ void Mob::ApplySpellsBonuses(uint16 spell_id, uint8 casterlevel, StatBonuses* ne { newbon->DamageShield += effect_value; newbon->DamageShieldSpellID = spell_id; - newbon->DamageShieldType = GetDamageShieldType(spell_id); + //When using npc_spells_effects MAX value can be set to determine DS Type + if (IsAISpellEffect && max) + newbon->DamageShieldType = GetDamageShieldType(spell_id, max); + else + newbon->DamageShieldType = GetDamageShieldType(spell_id); + break; } @@ -1635,7 +1640,11 @@ void Mob::ApplySpellsBonuses(uint16 spell_id, uint8 casterlevel, StatBonuses* ne { newbon->ReverseDamageShield += effect_value; newbon->ReverseDamageShieldSpellID = spell_id; - newbon->ReverseDamageShieldType = GetDamageShieldType(spell_id); + + if (IsAISpellEffect && max) + newbon->ReverseDamageShieldType = GetDamageShieldType(spell_id, max); + else + newbon->ReverseDamageShieldType = GetDamageShieldType(spell_id); break; } @@ -1999,10 +2008,21 @@ void Mob::ApplySpellsBonuses(uint16 spell_id, uint8 casterlevel, StatBonuses* ne case SE_SkillDamageTaken: { - if(base2 == -1) - newbon->SkillDmgTaken[HIGHEST_SKILL+1] += effect_value; - else - newbon->SkillDmgTaken[base2] += effect_value; + //When using npc_spells_effects if MAX value set, use stackable quest based modifier. + if (IsAISpellEffect && max){ + if(base2 == -1) + SkillDmgTaken_Mod[HIGHEST_SKILL+1] = effect_value; + else + SkillDmgTaken_Mod[base2] = effect_value; + } + else { + + if(base2 == -1) + newbon->SkillDmgTaken[HIGHEST_SKILL+1] += effect_value; + else + newbon->SkillDmgTaken[base2] += effect_value; + + } break; } From 5137b84ba8b5f28506f429f09c2478713df72d41 Mon Sep 17 00:00:00 2001 From: KayenEQ Date: Fri, 13 Jun 2014 14:51:26 -0400 Subject: [PATCH 2/3] Implemented SE_AlterNPCLevel --- changelog.txt | 2 +- common/spdat.h | 3 ++- zone/bonuses.cpp | 20 ++++++++++++++++++++ zone/common.h | 1 + zone/mob.cpp | 3 ++- zone/mob.h | 2 ++ zone/spell_effects.cpp | 7 +++++++ 7 files changed, 35 insertions(+), 3 deletions(-) diff --git a/changelog.txt b/changelog.txt index 68e2d4593..5ab1c3c67 100644 --- a/changelog.txt +++ b/changelog.txt @@ -3,7 +3,7 @@ EQEMu Changelog (Started on Sept 24, 2003 15:50) == 06/13/2014 == Kayen: For table 'npc_spell_effects_entries' setting se_max for damage shield effects (59) will now determine the DS Type (ie burning) Setting se_max to 1 for SkillDamageTaken effects (127) will allow for stackable mitigation/weakness same as quest function ModSkillDmgTaken. - +Kayen: Implemented SE_AlterNPCLevel (not currently used on live). Will +/- to NPC level. When fade will revert back to original level. == 06/8/2014 == KLS: Changed lua API: eq.get_globals(client, npc) has been removed. Use eq.get_globals(npc, client) instead. diff --git a/common/spdat.h b/common/spdat.h index 87f51c07a..ada9e3249 100644 --- a/common/spdat.h +++ b/common/spdat.h @@ -254,7 +254,7 @@ typedef enum { #define SE_Translocate 104 // implemented #define SE_AntiGate 105 // implemented - Translocational Anchor #define SE_SummonBSTPet 106 // implemented -//#define SE_AlterNPCLevel 107 // not used +#define SE_AlterNPCLevel 107 // implemented - not used on live #define SE_Familiar 108 // implemented #define SE_SummonItemIntoBag 109 // implemented - summons stuff into container //#define SE_IncreaseArchery 110 // not used @@ -606,6 +606,7 @@ typedef enum { //#define SE_AddHateOverTimePct 456 // not used //#define SE_ResourceTap 457 // not used //#define SE_FactionModPct 458 // not used +//#define SE_DamageModifier2 459 // *not implemented - Modifies melee damage by skill type // LAST diff --git a/zone/bonuses.cpp b/zone/bonuses.cpp index bef19ae39..d699cdde2 100644 --- a/zone/bonuses.cpp +++ b/zone/bonuses.cpp @@ -2641,6 +2641,26 @@ void Mob::ApplySpellsBonuses(uint16 spell_id, uint8 casterlevel, StatBonuses* ne newbon->Screech = effect_value; break; + case SE_AlterNPCLevel: + + if (IsNPC()){ + if (!newbon->AlterNPCLevel + || ((effect_value < 0) && (newbon->AlterNPCLevel > effect_value)) + || ((effect_value > 0) && (newbon->AlterNPCLevel < effect_value))) { + + int16 tmp_lv = GetOrigLevel() + effect_value; + if (tmp_lv < 1) + tmp_lv = 1; + else if (tmp_lv > 255) + tmp_lv = 255; + if ((GetLevel() != tmp_lv)){ + newbon->AlterNPCLevel = effect_value; + SetLevel(tmp_lv); + } + } + } + break; + //Special custom cases for loading effects on to NPC from 'npc_spels_effects' table if (IsAISpellEffect) { diff --git a/zone/common.h b/zone/common.h index d2737e4a5..aed6d16c9 100644 --- a/zone/common.h +++ b/zone/common.h @@ -347,6 +347,7 @@ struct StatBonuses { uint16 MeleeRune[2]; // 0 = rune value 1 = buff slot bool NegateIfCombat; // Bool Drop buff if cast or melee int8 Screech; // -1 = Will be blocked if another Screech is +(1) + int16 AlterNPCLevel; // amount of lvls +/- // AAs int8 Packrat; //weight reduction for items, 1 point = 10% diff --git a/zone/mob.cpp b/zone/mob.cpp index c2cf34650..d5ff23a7d 100644 --- a/zone/mob.cpp +++ b/zone/mob.cpp @@ -146,6 +146,7 @@ Mob::Mob(const char* in_name, orig_bodytype = in_bodytype; deity = in_deity; level = in_level; + orig_level = in_level; npctype_id = in_npctype_id; size = in_size; base_size = size; @@ -3415,7 +3416,7 @@ int32 Mob::GetVulnerability(Mob* caster, uint32 spell_id, uint32 ticsremaining) int16 Mob::GetSkillDmgTaken(const SkillUseTypes skill_used) { int skilldmg_mod = 0; - + // All skill dmg mod + Skill specific skilldmg_mod += itembonuses.SkillDmgTaken[HIGHEST_SKILL+1] + spellbonuses.SkillDmgTaken[HIGHEST_SKILL+1] + itembonuses.SkillDmgTaken[skill_used] + spellbonuses.SkillDmgTaken[skill_used]; diff --git a/zone/mob.h b/zone/mob.h index 1df559d16..d004bab4a 100644 --- a/zone/mob.h +++ b/zone/mob.h @@ -318,6 +318,7 @@ public: inline uint32 GetArmorTint(uint8 i) const { return armor_tint[(i < _MaterialCount) ? i : 0]; } inline uint8 GetClass() const { return class_; } inline uint8 GetLevel() const { return level; } + inline uint8 GetOrigLevel() const { return orig_level; } inline const char* GetName() const { return name; } inline const char* GetOrigName() const { return orig_name; } inline const char* GetLastName() const { return lastname; } @@ -960,6 +961,7 @@ protected: bodyType orig_bodytype; uint16 deity; uint8 level; + uint8 orig_level; uint32 npctype_id; float x_pos; float y_pos; diff --git a/zone/spell_effects.cpp b/zone/spell_effects.cpp index 8731dfaab..4e10160ed 100644 --- a/zone/spell_effects.cpp +++ b/zone/spell_effects.cpp @@ -3833,6 +3833,13 @@ void Mob::BuffFadeBySlot(int slot, bool iRecalcBonuses) break; } + case SE_AlterNPCLevel: + { + if (IsNPC()) + SetLevel(GetOrigLevel()); + break; + } + case SE_MovementSpeed: { if(IsClient()) From f0e8d88178e0cd6ed610230db8876be65be9e2ca Mon Sep 17 00:00:00 2001 From: KayenEQ Date: Fri, 13 Jun 2014 17:46:34 -0400 Subject: [PATCH 3/3] Implemented 'special_abilities' 38 ALLOW_BENEFICIAL (Allows an NPC to recieve player buffs/heals) Implemented 'special_abilities' 39 DISABLE_MELEE (Prevents NPC from auto attacking, will still aggro) --- changelog.txt | 3 +++ zone/common.h | 4 +++- zone/mob.h | 4 ++-- 3 files changed, 8 insertions(+), 3 deletions(-) diff --git a/changelog.txt b/changelog.txt index 5ab1c3c67..eabbad6fd 100644 --- a/changelog.txt +++ b/changelog.txt @@ -4,6 +4,9 @@ EQEMu Changelog (Started on Sept 24, 2003 15:50) Kayen: For table 'npc_spell_effects_entries' setting se_max for damage shield effects (59) will now determine the DS Type (ie burning) Setting se_max to 1 for SkillDamageTaken effects (127) will allow for stackable mitigation/weakness same as quest function ModSkillDmgTaken. Kayen: Implemented SE_AlterNPCLevel (not currently used on live). Will +/- to NPC level. When fade will revert back to original level. +Kayen: Implemented 'special_abilities' 38 ALLOW_BENEFICIAL (Allows an NPC to recieve player buffs/heals) +Kayen: Implemented 'special_abilities' 39 DISABLE_MELEE (Prevents NPC from auto attacking, will still aggro) +Note: These two special abilities were previously implemented and still remain as quest functions. (SetDisableMelee() and SetAllowBeneficial()) == 06/8/2014 == KLS: Changed lua API: eq.get_globals(client, npc) has been removed. Use eq.get_globals(npc, client) instead. diff --git a/zone/common.h b/zone/common.h index aed6d16c9..d5f516f63 100644 --- a/zone/common.h +++ b/zone/common.h @@ -125,7 +125,9 @@ enum { NO_HARM_FROM_CLIENT = 35, ALWAYS_FLEE = 36, FLEE_PERCENT = 37, - MAX_SPECIAL_ATTACK = 38 + ALLOW_BENEFICIAL = 38, + DISABLE_MELEE = 39, + MAX_SPECIAL_ATTACK = 40 }; diff --git a/zone/mob.h b/zone/mob.h index d004bab4a..c3de2b576 100644 --- a/zone/mob.h +++ b/zone/mob.h @@ -610,9 +610,9 @@ public: int16 GetModVulnerability(const uint8 resist); void SetAllowBeneficial(bool value) { m_AllowBeneficial = value; } - bool GetAllowBeneficial() { return m_AllowBeneficial; } + bool GetAllowBeneficial() { if (m_AllowBeneficial || GetSpecialAbility(ALLOW_BENEFICIAL)){return true;} return false; } void SetDisableMelee(bool value) { m_DisableMelee = value; } - bool IsMeleeDisabled() { return m_DisableMelee; } + bool IsMeleeDisabled() { if (m_DisableMelee || GetSpecialAbility(DISABLE_MELEE)){return true;} return false; } bool IsOffHandAtk() const { return offhand; } inline void OffHandAtk(bool val) { offhand = val; }