mirror of
https://github.com/EQEmu/Server.git
synced 2026-02-18 14:52:25 +00:00
Merge pull request #159 from KayenEQ/Development
Additional functionality for damage shield and skill damage taken effects via npc_spell_effects table.
This commit is contained in:
commit
64784be57e
@ -1,5 +1,13 @@
|
||||
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.
|
||||
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.
|
||||
There's a bug with something in gcc 4.6.3 (maybe other versions) on x86 that this is attempting to combat.
|
||||
|
||||
@ -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;
|
||||
}
|
||||
|
||||
|
||||
@ -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
|
||||
|
||||
@ -840,7 +841,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);
|
||||
|
||||
@ -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;
|
||||
}
|
||||
|
||||
@ -2621,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) {
|
||||
|
||||
|
||||
@ -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
|
||||
|
||||
};
|
||||
|
||||
@ -347,6 +349,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%
|
||||
|
||||
@ -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];
|
||||
|
||||
@ -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; }
|
||||
@ -609,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; }
|
||||
@ -960,6 +961,7 @@ protected:
|
||||
bodyType orig_bodytype;
|
||||
uint16 deity;
|
||||
uint8 level;
|
||||
uint8 orig_level;
|
||||
uint32 npctype_id;
|
||||
float x_pos;
|
||||
float y_pos;
|
||||
|
||||
@ -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())
|
||||
|
||||
Loading…
x
Reference in New Issue
Block a user