#ifndef __EQEMU_ZONE_COMMON_H #define __EQEMU_ZONE_COMMON_H #include "../common/types.h" #include "../common/spdat.h" #define HIGHEST_RESIST 9 //Max resist type value #define MAX_SPELL_PROJECTILE 10 //Max amount of spell projectiles that can be active by a single mob. /* macros for IsAttackAllowed, IsBeneficialAllowed */ #define _CLIENT(x) (x && x->IsClient() && !x->CastToClient()->IsBecomeNPC()) #define _NPC(x) (x && x->IsNPC() && !x->CastToMob()->GetOwnerID()) #define _BECOMENPC(x) (x && x->IsClient() && x->CastToClient()->IsBecomeNPC()) #define _CLIENTCORPSE(x) (x && x->IsCorpse() && x->CastToCorpse()->IsPlayerCorpse() && !x->CastToCorpse()->IsBecomeNPCCorpse()) #define _NPCCORPSE(x) (x && x->IsCorpse() && (x->CastToCorpse()->IsNPCCorpse() || x->CastToCorpse()->IsBecomeNPCCorpse())) #define _CLIENTPET(x) (x && x->CastToMob()->GetOwner() && x->CastToMob()->GetOwner()->IsClient()) #define _NPCPET(x) (x && x->IsNPC() && x->CastToMob()->GetOwner() && x->CastToMob()->GetOwner()->IsNPC()) #define _BECOMENPCPET(x) (x && x->CastToMob()->GetOwner() && x->CastToMob()->GetOwner()->IsClient() && x->CastToMob()->GetOwner()->CastToClient()->IsBecomeNPC()) //LOS Parameters: #define HEAD_POSITION 0.9f //ratio of GetSize() where NPCs see from #define SEE_POSITION 0.5f //ratio of GetSize() where NPCs try to see for LOS #define CHECK_LOS_STEP 1.0f #define ARCHETYPE_HYBRID 1 #define ARCHETYPE_CASTER 2 #define ARCHETYPE_MELEE 3 #define CON_GREEN 2 #define CON_LIGHTBLUE 18 #define CON_BLUE 4 #define CON_WHITE 10 #define CON_WHITE_TITANIUM 20 #define CON_YELLOW 15 #define CON_RED 13 #define CON_GRAY 6 #define DMG_BLOCKED -1 #define DMG_PARRIED -2 #define DMG_RIPOSTED -3 #define DMG_DODGED -4 #define DMG_INVULNERABLE -5 #define DMG_RUNE -6 //Spell specialization parameters, not sure of a better place for them #define SPECIALIZE_FIZZLE 11 //% fizzle chance reduce at 200 specialized #define SPECIALIZE_MANA_REDUCE 12 //% mana cost reduction at 200 specialized //these are large right now because the x,y,z coords of the zone //lines do not make a lot of sense //Maximum distance from a zone point given that the request didnt //know what zone that the line was for #define ZONEPOINT_NOZONE_RANGE 40000.0f //Maximum distance from a zone point if zone was specified #define ZONEPOINT_ZONE_RANGE 40000.0f // Defines based on the RoF2 Client #define PET_HEALTHREPORT 0 // 0x00 - /pet health or Pet Window #define PET_LEADER 1 // 0x01 - /pet leader or Pet Window #define PET_ATTACK 2 // 0x02 - /pet attack or Pet Window #define PET_QATTACK 3 // 0x03 - /pet qattack or Pet Window #define PET_FOLLOWME 4 // 0x04 - /pet follow or Pet Window #define PET_GUARDHERE 5 // 0x05 - /pet guard or Pet Window #define PET_SIT 6 // 0x06 - /pet sit or Pet Window #define PET_SITDOWN 7 // 0x07 - /pet sit on #define PET_STANDUP 8 // 0x08 - /pet sit off #define PET_STOP 9 // 0x09 - /pet stop or Pet Window - Not implemented #define PET_STOP_ON 10 // 0x0a - /pet stop on - Not implemented #define PET_STOP_OFF 11 // 0x0b - /pet stop off - Not implemented #define PET_TAUNT 12 // 0x0c - /pet taunt or Pet Window #define PET_TAUNT_ON 13 // 0x0d - /pet taunt on #define PET_TAUNT_OFF 14 // 0x0e - /pet taunt off #define PET_HOLD 15 // 0x0f - /pet hold or Pet Window, won't add to hate list unless attacking #define PET_HOLD_ON 16 // 0x10 - /pet hold on #define PET_HOLD_OFF 17 // 0x11 - /pet hold off #define PET_GHOLD 18 // 0x12 - /pet ghold, will never add to hate list unless told to #define PET_GHOLD_ON 19 // 0x13 - /pet ghold on #define PET_GHOLD_OFF 20 // 0x14 - /pet ghold off #define PET_SPELLHOLD 21 // 0x15 - /pet no cast or /pet spellhold or Pet Window #define PET_SPELLHOLD_ON 22 // 0x16 - /pet spellhold on #define PET_SPELLHOLD_OFF 23 // 0x17 - /pet spellhold off #define PET_FOCUS 24 // 0x18 - /pet focus or Pet Window #define PET_FOCUS_ON 25 // 0x19 - /pet focus on #define PET_FOCUS_OFF 26 // 0x1a - /pet focus off #define PET_FEIGN 27 // 0x1b - /pet feign #define PET_BACKOFF 28 // 0x1c - /pet back off #define PET_GETLOST 29 // 0x1d - /pet get lost #define PET_GUARDME 30 // 0x1e - Same as /pet follow, but different message in older clients - define not from client /pet target in modern clients but doesn't send packet #define PET_REGROUP 31 // 0x1f - /pet regroup, acts like classic hold. Stops attack and moves back to guard/you but doesn't clear hate list #define PET_REGROUP_ON 32 // 0x20 - /pet regroup on, turns on regroup #define PET_REGROUP_OFF 33 // 0x21 - /pet regroup off, turns off regroup #define PET_MAXCOMMANDS PET_REGROUP_OFF + 1 // can change the state of these buttons with a packet #define PET_BUTTON_SIT 0 #define PET_BUTTON_STOP 1 #define PET_BUTTON_REGROUP 2 #define PET_BUTTON_FOLLOW 3 #define PET_BUTTON_GUARD 4 #define PET_BUTTON_TAUNT 5 #define PET_BUTTON_HOLD 6 #define PET_BUTTON_GHOLD 7 #define PET_BUTTON_FOCUS 8 #define PET_BUTTON_SPELLHOLD 9 #define AURA_HARDCAP 2 #define WEAPON_STANCE_TYPE_MAX 2 #define SHIELD_ABILITY_RECAST_TIME 180 typedef enum { //focus types focusSpellHaste = 1, //@Fc, SPA: 127, SE_IncreaseSpellHaste, On Caster, cast time mod pct, base: pct focusSpellDuration, //@Fc, SPA: 128, SE_IncreaseSpellDuration, On Caster, spell duration mod pct, base: pct focusRange, //@Fc, SPA: 129, SE_IncreaseRange, On Caster, spell range mod pct, base: pct focusReagentCost, //@Fc, SPA: 131, SE_ReduceReagentCost, On Caster, do not consume reagent pct chance, base: min pct, limit: max pct focusManaCost, //@Fc, SPA: 132, SE_ReduceManaCost, On Caster, reduce mana cost by pct, base: min pct, limt: max pct focusImprovedHeal, //@Fc, SPA: 125, SE_ImprovedHeal, On Caster, spell healing mod pct, base: min pct, limit: max pct focusImprovedDamage, //@Fc, SPA: 124, SE_ImprovedDamage, On Caster, spell damage mod pct, base: min pct, limit: max pct focusImprovedDamage2, //@Fc, SPA: 461, SE_ImprovedDamage2, On Caster, spell damage mod pct, base: min pct, limit: max pct focusFcDamagePctCrit, //@Fc, SPA: 302, SE_FcDamagePctCrit, On Caster, spell damage mod pct, base: min pct, limit: max pct focusPetPower, //@Fc, SPA: 167, SE_PetPowerIncrease, On Caster, pet power mod, base: value focusResistRate, //@Fc, SPA: 126, SE_SpellResistReduction, On Caster, casted spell resist mod pct, base: min pct, limit: max pct focusSpellHateMod, //@Fc, SPA: 130, SE_SpellHateMod, On Caster, spell hate mod pct, base: min pct, limit: max pct focusTriggerOnCast, //@Fc, SPA: 339, SE_TriggerOnCast, On Caster, cast on spell use, base: chance pct limit: spellid focusSpellVulnerability, //@Fc, SPA: 296, SE_FcSpellVulnerability, On Target, spell damage taken mod pct, base: min pct, limit: max pct focusFcSpellDamagePctIncomingPC, //@Fc, SPA: 483, SE_Fc_Spell_Damage_Pct_IncomingPC, On Target, spell damage taken mod pct, base: min pct, limit: max pct focusTwincast, //@Fc, SPA: 399, SE_FcTwincast, On Caster, chance cast spell twice, base: chance pct focusSympatheticProc, //@Fc, SPA: 383, SE_SympatheticProc, On Caster, cast on spell use, base: variable proc chance on cast time, limit: spellid focusFcDamageAmt, //@Fc, SPA: 286, SE_FcDamageAmt, On Caster, spell damage mod flat amt, base: amt focusFcDamageAmt2, //@Fc, SPA: 462, SE_FcDamageAmt2, On Caster, spell damage mod flat amt, base: amt focusFcDamageAmtCrit, //@Fc, SPA: 303, SE_FFcDamageAmtCrit, On Caster, spell damage mod flat amt, base: amt focusSpellDurByTic, //@Fc, SPA: 287, SE_SpellDurationIncByTic, On Caster, spell buff duration mod, base: tics focusSwarmPetDuration, //@Fc, SPA: 398, SE_SwarmPetDuration, On Caster, swarm pet duration mod, base: milliseconds focusReduceRecastTime, //@Fc, SPA: 310, SE_ReduceReuseTimer, On Caster, disc reuse time mod, base: milliseconds focusBlockNextSpell, //@Fc, SPA: 335, SE_BlockNextSpellFocus, On Caster, chance to block next spell, base: chance focusFcHealPctIncoming, //@Fc, SPA: 393, SE_FcHealPctIncoming, On Target, heal received mod pct, base: pct focusFcDamageAmtIncoming, //@Fc, SPA: 297, SE_FcDamageAmtIncoming, On Target, damage taken flat amt, base: amt focusFcSpellDamageAmtIncomingPC, //@Fc, SPA: 484, SE_Fc_Spell_Damage_Amt_IncomingPC, On Target, damage taken flat amt, base: amt focusFcCastSpellOnLand, //@Fc, SPA: 481, SE_Fc_Cast_Spell_On_Land, On Target, cast spell if hit by spell, base: chance pct, limit: spellid focusFcHealAmtIncoming, //@Fc, SPA: 394, SE_FcHealAmtIncoming, On Target, heal received mod flat amt, base: amt focusFcBaseEffects, //@Fc, SPA: 413, SE_FcBaseEffects, On Caster, base spell effectiveness mod pct, base: pct focusIncreaseNumHits, //@Fc, SPA: 421, SE_FcIncreaseNumHits, On Caster, numhits mod flat amt, base: amt focusFcLimitUse, //@Fc, SPA: 420, SE_FcLimitUse, On Caster, numhits mod pct, base: pct focusFcMute, //@Fc, SPA: 357, SE_FcMute, On Caster, prevents spell casting, base: chance pct focusFcTimerRefresh, //@Fc, SPA: 389, SE_FcTimerRefresh, On Caster, reset spell recast timer, base: 1 focusFcTimerLockout, //@Fc, SPA: 390, SE_FcTimerLockout, On Caster, set a spell to be on recast timer, base: recast duration milliseconds focusFcStunTimeMod, //@Fc, SPA: 133, SE_FcStunTimeMod, On Caster, stun time mod pct, base: chance pct focusFcResistIncoming, //@Fc, SPA: 510, SE_Fc_Resist_Incoming, On Target, resist modifier, base: amt focusFcAmplifyMod, //@Fc, SPA: 507, SE_Fc_Amplify_Mod, On Caster, damage-heal-dot mod pct, base: pct focusFcAmplifyAmt, //@Fc, SPA: 508, SE_Fc_Amplify_Amt, On Caster, damage-heal-dot mod flat amt, base: amt focusFcCastTimeMod2, //@Fc, SPA: 500, SE_Fc_CastTimeMod2, On Caster, cast time mod pct, base: pct focusFcCastTimeAmt, //@Fc, SPA: 501, SE_Fc_CastTimeAmt, On Caster, cast time mod flat amt, base: milliseconds focusFcHealPctCritIncoming, //@Fc, SPA: 395, SE_FcHealPctCritIncoming, On Target, spell healing mod pct, base: pct focusFcHealAmt, //@Fc, SPA: 392, SE_FcHealAmt, On Caster, spell healing mod flat amt, base: amt focusFcHealAmtCrit, //@Fc, SPA: 396, SE_FcHealAmtCrit, On Caster, spell healing mod flat amt, base: amt } focusType; //Any new FocusType needs to be added to the Mob::IsFocus function #define HIGHEST_FOCUS focusFcHealAmtCrit //Should always be last focusType in enum enum { SPECATK_SUMMON = 1, SPECATK_ENRAGE = 2, SPECATK_RAMPAGE = 3, SPECATK_AREA_RAMPAGE = 4, SPECATK_FLURRY = 5, SPECATK_TRIPLE = 6, SPECATK_QUAD = 7, SPECATK_INNATE_DW = 8, SPECATK_BANE = 9, SPECATK_MAGICAL = 10, SPECATK_RANGED_ATK = 11, UNSLOWABLE = 12, UNMEZABLE = 13, UNCHARMABLE = 14, UNSTUNABLE = 15, UNSNAREABLE = 16, UNFEARABLE = 17, UNDISPELLABLE = 18, IMMUNE_MELEE = 19, IMMUNE_MAGIC = 20, IMMUNE_FLEEING = 21, IMMUNE_MELEE_EXCEPT_BANE = 22, IMMUNE_MELEE_NONMAGICAL = 23, IMMUNE_AGGRO = 24, IMMUNE_AGGRO_ON = 25, IMMUNE_CASTING_FROM_RANGE = 26, IMMUNE_FEIGN_DEATH = 27, IMMUNE_TAUNT = 28, NPC_TUNNELVISION = 29, NPC_NO_BUFFHEAL_FRIENDS = 30, IMMUNE_PACIFY = 31, LEASH = 32, TETHER = 33, DESTRUCTIBLE_OBJECT = 34, NO_HARM_FROM_CLIENT = 35, ALWAYS_FLEE = 36, FLEE_PERCENT = 37, ALLOW_BENEFICIAL = 38, DISABLE_MELEE = 39, NPC_CHASE_DISTANCE = 40, ALLOW_TO_TANK = 41, IGNORE_ROOT_AGGRO_RULES = 42, CASTING_RESIST_DIFF = 43, COUNTER_AVOID_DAMAGE = 44, PROX_AGGRO = 45, IMMUNE_RANGED_ATTACKS = 46, IMMUNE_DAMAGE_CLIENT = 47, IMMUNE_DAMAGE_NPC = 48, IMMUNE_AGGRO_CLIENT = 49, IMMUNE_AGGRO_NPC = 50, MAX_SPECIAL_ATTACK = 51 }; typedef enum { //fear states fearStateNotFeared = 0, fearStateRunning, //I am running, hoping to find a grid at my WP fearStateRunningForever, //can run straight until spell ends fearStateGrid, //I am allready on a fear grid fearStateStuck //I cannot move somehow... } FearState; // This is actually FlyMode, from MQ2 enum GravityBehavior { Ground, Flying, Levitating, Water, Floating, // boat LevitateWhileRunning }; struct TradeEntity; class Trade; enum TradeState { TradeNone, Trading, TradeAccepted, TradeCompleting }; enum class NumHit { // Numhits type IncomingHitAttempts = 1, // Attempted incoming melee attacks (hit or miss) on YOU. OutgoingHitAttempts = 2, // Attempted outgoing melee attacks (hit or miss) on YOUR TARGET. IncomingSpells = 3, // Incoming detrimental spells OutgoingSpells = 4, // Outgoing detrimental spells OutgoingHitSuccess = 5, // Successful outgoing melee attack HIT on YOUR TARGET. IncomingHitSuccess = 6, // Successful incoming melee attack HIT on YOU. MatchingSpells = 7, // Any casted spell matching/triggering a focus effect. IncomingDamage = 8, // Successful incoming spell or melee dmg attack on YOU ReflectSpell = 9, // Incoming Reflected spells. DefensiveSpellProcs = 10, // Defensive buff procs OffensiveSpellProcs = 11 // Offensive buff procs }; enum class PlayerState : uint32 { None = 0, Open = 1, WeaponSheathed = 2, Aggressive = 4, ForcedAggressive = 8, InstrumentEquipped = 16, Stunned = 32, PrimaryWeaponEquipped = 64, SecondaryWeaponEquipped = 128 }; enum class LootResponse : uint8 { SomeoneElse = 0, Normal = 1, NotAtThisTime = 2, Normal2 = 3, // acts exactly the same as Normal, maybe group vs ungroup? No idea Hostiles = 4, TooFar = 5, LootAll = 6 // SoD+ }; enum class LootRequestType : uint8 { Forbidden = 0, GMPeek, GMAllowed, Self, AllowedPVE, AllowedPVPAll, AllowedPVPSingle, // can make this 'AllowedPVPVariable' and allow values between 1 and EQ::invtype::POSSESSIONS_SIZE AllowedPVPDefined, }; namespace Journal { enum class SpeakMode : uint8 { Raw = 0, // this just uses the raw message Say = 1, // prints with "%1 says,%2 '%3'" if in another language else "%1 says '%2'" Shout = 2, // prints with "%1 shouts,%2 '%3'" if in another language else "%1 shouts '%2'" EmoteAlt = 3, // prints "%2", this should just be the same as raw ... Emote = 4, // prints "%1 %2" if message doesn't start with "\" or "@", else "%1%2" Group = 5 // prints "%1 tells the group,%2 '%3'" }; enum class Mode : uint8 { None = 0, Log1 = 1, // 1 and 2 log to journal Log2 = 2, // our current code uses 2 }; struct Options { SpeakMode speak_mode; Mode journal_mode; int8 language; uint32 message_type; uint32 target_spawn_id; // who the message is talking to (limits journaling) }; }; //this is our internal representation of the BUFF struct, can put whatever we want in it struct Buffs_Struct { uint16 spellid; uint8 casterlevel; uint16 casterid; // Maybe change this to a pointer sometime, but gotta make sure it's 0'd when it no longer points to anything char caster_name[64]; int32 ticsremaining; uint32 counters; uint32 numhits; //the number of physical hits this buff can take before it fades away, lots of druid armor spells take advantage of this mixed with powerful effects uint32 melee_rune; uint32 magic_rune; uint32 dot_rune; int32 caston_x; int32 caston_y; int32 caston_z; int32 ExtraDIChance; int16 RootBreakChance; //Not saved to dbase uint32 instrument_mod; int16 focusproclimit_time; //timer to limit number of procs from focus effects int16 focusproclimit_procamt; //amount of procs that can be cast before timer limiter is set bool persistant_buff; bool client; //True if the caster is a client bool UpdateClient; }; struct StatBonuses { int32 AC; int32 HP; int32 HPRegen; int32 MaxHP; int32 ManaRegen; int32 EnduranceRegen; int32 Mana; int32 Endurance; int32 ATK; //would it be worth it to create a Stat_Struct? int32 STR; int32 STRCapMod; int32 HeroicSTR; int32 STA; int32 STACapMod; int32 HeroicSTA; int32 DEX; int32 DEXCapMod; int32 HeroicDEX; int32 AGI; int32 AGICapMod; int32 HeroicAGI; int32 INT; int32 INTCapMod; int32 HeroicINT; int32 WIS; int32 WISCapMod; int32 HeroicWIS; int32 CHA; int32 CHACapMod; int32 HeroicCHA; int32 MR; int32 MRCapMod; int32 HeroicMR; int32 FR; int32 FRCapMod; int32 HeroicFR; int32 CR; int32 CRCapMod; int32 HeroicCR; int32 PR; int32 PRCapMod; int32 HeroicPR; int32 DR; int32 DRCapMod; int32 HeroicDR; int32 Corrup; int32 CorrupCapMod; int32 HeroicCorrup; uint16 DamageShieldSpellID; int DamageShield; // this is damage done to mobs that attack this DmgShieldType DamageShieldType; int SpellDamageShield; int SpellShield; int ReverseDamageShield; // this is damage done to the mob when it attacks uint16 ReverseDamageShieldSpellID; DmgShieldType ReverseDamageShieldType; int movementspeed; int32 haste; int32 hastetype2; int32 hastetype3; int32 inhibitmelee; float AggroRange; // when calculate just replace original value with this float AssistRange; int32 skillmod[EQ::skills::HIGHEST_SKILL + 1]; int32 skillmodmax[EQ::skills::HIGHEST_SKILL + 1]; int effective_casting_level; int adjusted_casting_skill; // SPA 112 for fizzles int reflect_chance; // chance to reflect incoming spell uint32 singingMod; uint32 Amplification; // stacks with singingMod uint32 brassMod; uint32 percussionMod; uint32 windMod; uint32 stringedMod; uint32 songModCap; int8 hatemod; int32 EnduranceReduction; int32 StrikeThrough; // PoP: Strike Through % int32 MeleeMitigation; //i = Shielding int32 MeleeMitigationEffect; //i = Spell Effect Melee Mitigation int32 CriticalHitChance[EQ::skills::HIGHEST_SKILL + 2]; //i int32 CriticalSpellChance; //i int32 SpellCritDmgIncrease; //i int32 SpellCritDmgIncNoStack; // increase int32 DotCritDmgIncrease; //i int32 CriticalHealChance; //i int32 CriticalHealOverTime; //i int32 CriticalDoTChance; //i int32 CrippBlowChance; // int32 AvoidMeleeChance; //AvoidMeleeChance/10 == % chance i = Avoidance (item mod) int32 AvoidMeleeChanceEffect; //AvoidMeleeChance Spell Effect int32 RiposteChance; //i int32 DodgeChance; //i int32 ParryChance; //i int32 DualWieldChance; //i int32 DoubleAttackChance; //i int32 TripleAttackChance; //i int32 DoubleRangedAttack; //i int32 ResistSpellChance; //i int32 ResistFearChance; //i bool Fearless; //i bool IsFeared; //i bool IsBlind; //i int32 StunResist; //i int32 MeleeSkillCheck; //i uint8 MeleeSkillCheckSkill; int32 HitChance; //HitChance/15 == % increase i = Accuracy (Item: Accuracy) int32 HitChanceEffect[EQ::skills::HIGHEST_SKILL + 2]; //Spell effect Chance to Hit, straight percent increase int32 DamageModifier[EQ::skills::HIGHEST_SKILL + 2]; //i int32 DamageModifier2[EQ::skills::HIGHEST_SKILL + 2]; //i int32 DamageModifier3[EQ::skills::HIGHEST_SKILL + 2]; //i int32 MinDamageModifier[EQ::skills::HIGHEST_SKILL + 2]; //i int32 ProcChance; // ProcChance/10 == % increase i = CombatEffects int32 ProcChanceSPA; // ProcChance from spell effects int32 ExtraAttackChance[2]; // base chance(w/ 2H weapon)=0, amt of extra attacks=1 int32 ExtraAttackChancePrimary[2]; // base chance=0, , amt of extra attacks=1 int32 ExtraAttackChanceSecondary[2]; // base chance=0, , amt of extra attacks=1 int32 DoubleMeleeRound[2]; // base chance=0, damage mod=1 int32 DoTShielding; int32 DivineSaveChance[2]; // Second Chance (base1 = chance, base2 = spell on trigger) uint32 DeathSave[4]; // Death Pact [0](value = 1 partial 2 = full) [1]=slot [2]=LvLimit [3]=HealAmt int32 FlurryChance; int32 Accuracy[EQ::skills::HIGHEST_SKILL + 2]; //Accuracy/15 == % increase [Spell Effect: Accuracy) int32 HundredHands; //extra haste, stacks with all other haste i int32 MeleeLifetap; //i int32 Vampirism; //i int32 HealRate; // Spell effect that influences effectiveness of heals int32 MaxHPChange; // Spell Effect int16 SkillDmgTaken[EQ::skills::HIGHEST_SKILL + 2]; // All Skills + -1 int32 HealAmt; // Item Effect int32 SpellDmg; // Item Effect int32 Clairvoyance; // Item Effect int32 DSMitigation; // Item Effect int32 DSMitigationOffHand; // Lowers damage shield from off hand attacks. uint32 SpellTriggers[MAX_SPELL_TRIGGER]; // Innate/Spell/Item Spells that trigger when you cast uint32 SpellOnKill[MAX_SPELL_TRIGGER*3]; // Chance to proc after killing a mob uint32 SpellOnDeath[MAX_SPELL_TRIGGER*2]; // Chance to have effect cast when you die int32 CritDmgMod[EQ::skills::HIGHEST_SKILL + 2]; // All Skills + -1 int32 CritDmgModNoStack[EQ::skills::HIGHEST_SKILL + 2];// Critical melee damage modifier by percent, does not stack. int32 SkillReuseTime[EQ::skills::HIGHEST_SKILL + 1]; // Reduces skill timers int32 SkillDamageAmount[EQ::skills::HIGHEST_SKILL + 2]; // All Skills + -1 int32 TwoHandBluntBlock; // chance to block when wielding two hand blunt weapon uint32 ItemManaRegenCap; // Increases the amount of mana you have can over the cap(aa effect) int32 GravityEffect; // Indictor of spell effect bool AntiGate; // spell effect that prevents gating bool MagicWeapon; // spell effect that makes weapon magical int32 IncreaseBlockChance; // overall block chance modifier uint32 PersistantCasting; // chance to continue casting through a stun int XPRateMod; //i int HPPercCap[2]; //Spell effect that limits you to being healed/regening beyond a % of your max int ManaPercCap[2]; // ^^ 0 = % Cap 1 = Flat Amount Cap int EndPercCap[2]; // ^^ bool ImmuneToFlee; // Bypass the fleeing flag uint32 VoiceGraft; // Stores the ID of the mob with which to talk through int32 SpellProcChance; // chance to proc from sympathetic spell effects int32 CharmBreakChance; // chance to break charm int32 SongRange; // increases range of beneficial bard songs uint32 HPToManaConvert; // Uses HP to cast spells at specific conversion uint8 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 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 uint32 MitigateMeleeRune[4]; // 0 = Mitigation value 1 = Buff Slot 2 = Max mitigation per hit 3 = Rune Amt uint32 MeleeThresholdGuard[3]; // 0 = Mitigation value 1 = Buff Slot 2 = Min damage to trigger. uint32 SpellThresholdGuard[3]; // 0 = Mitigation value 1 = Buff Slot 2 = Min damage to trigger. uint32 MitigateSpellRune[4]; // 0 = Mitigation value 1 = Buff Slot 2 = Max mitigation per spell 3 = Rune Amt uint32 MitigateDotRune[4]; // 0 = Mitigation value 1 = Buff Slot 2 = Max mitigation per tick 3 = Rune Amt bool TriggerMeleeThreshold; // Has Melee Threshhold bool TriggerSpellThreshold; // Has Spell Threshhold uint32 ManaAbsorbPercentDamage; // 0 = Mitigation value int32 EnduranceAbsorbPercentDamage[2]; // 0 = Mitigation value 1 = Percent Endurance drain per HP lost int32 ShieldBlock; // Chance to Shield Block int32 BlockBehind; // Chance to Block Behind (with our without shield) bool CriticalRegenDecay; // increase critical regen chance, decays based on spell level cast bool CriticalHealDecay; // increase critical heal chance, decays based on spell level cast bool CriticalDotDecay; // increase critical dot chance, decays based on spell level cast bool DivineAura; // invulnerability bool DistanceRemoval; // Check if Cancle if Moved effect is present int32 ImprovedTaunt[3]; // 0 = Max Level 1 = Aggro modifier 2 = buff slot int8 Root[2]; // The lowest buff slot a root can be found. [0] = Bool if has root [1] = buff slot int32 FrenziedDevastation; // base1= AArank(used) base2= chance increase spell criticals + all DD spells 2x mana. uint32 AbsorbMagicAtt[2]; // 0 = magic rune value 1 = buff slot uint32 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) int32 AlterNPCLevel; // amount of lvls +/- int32 AStacker[2]; // For buff stack blocking 0=Exists 1=Effect_value int32 BStacker[2]; // For buff stack blocking 0=Exists 1=Effect_value int32 CStacker[2]; // For buff stack blocking 0=Exists 1=Effect_value int32 DStacker[2]; // For buff stack blocking 0=Exists 1=Effect_value bool BerserkSPA; // berserk effect int32 Metabolism; // Food/drink consumption rates. bool Sanctuary; // Sanctuary effect, lowers place on hate list until cast on others. int32 FactionModPct; // Modifies amount of faction gained. bool LimitToSkill[EQ::skills::HIGHEST_SKILL + 2]; // Determines if we need to search for a skill proc. uint32 SkillProc[MAX_SKILL_PROCS]; // Max number of spells containing skill_procs. uint32 SkillProcSuccess[MAX_SKILL_PROCS]; // Max number of spells containing skill_procs_success. uint32 PC_Pet_Rampage[2]; // 0= % chance to rampage, 1=damage modifier uint32 PC_Pet_AE_Rampage[2]; // 0= % chance to AE rampage, 1=damage modifier uint32 PC_Pet_Flurry; // Percent chance flurry from double attack int32 Attack_Accuracy_Max_Percent; // Increase ATK accuracy by percent. int32 AC_Mitigation_Max_Percent; // Increase AC mitigation by percent int32 AC_Avoidance_Max_Percent; // Increase AC avoidance by percent int32 Damage_Taken_Position_Mod[2]; // base = percent melee damage reduction base2 0=back 1=front. [0]Back[1]Front int32 Melee_Damage_Position_Mod[2]; // base = percent melee damage increase base2 0=back 1=front. [0]Back[1]Front int32 Damage_Taken_Position_Amt[2]; // base = flat amt melee damage reduction base2 0=back 1=front. [0]Back[1]Front int32 Melee_Damage_Position_Amt[2]; // base = flat amt melee damage increase base2 0=back 1=front. [0]Back[1]Front int32 Double_Backstab_Front; // base = percent chance to double back stab front int32 DS_Mitigation_Amount; // base = flat amt DS mitigation. Negative value to reduce int32 DS_Mitigation_Percentage; // base = percent amt of DS mitigation. Negative value to reduce int32 Pet_Crit_Melee_Damage_Pct_Owner; // base = percent mod for pet critcal damage from owner int32 Pet_Add_Atk; // base = Pet ATK bonus from owner int32 ItemEnduranceRegenCap; // modify endurance regen cap int32 WeaponStance[WEAPON_STANCE_TYPE_MAX +1];// base = trigger spell id, base2 = 0 is 2h, 1 is shield, 2 is dual wield, [0]spid 2h, [1]spid shield, [2]spid DW bool ZoneSuspendMinion; // base 1 allows suspended minions to zone bool CompleteHealBuffBlocker; // Use in SPA 101 to prevent recast of complete heal from this effect till blocker buff is removed. // AAs uint16 SecondaryForte; // allow a second skill to be specialized with a cap of this value. int32 ShieldDuration; // extends duration of /shield ability int32 ExtendedShielding; // extends range of /shield ability int8 Packrat; // weight reduction for items, 1 point = 10% uint8 BuffSlotIncrease; // Increases number of available buff slots uint32 DelayDeath; // how far below 0 hp you can go int8 BaseMovementSpeed; // Adjust base run speed, does not stack with other movement bonuses. uint8 IncreaseRunSpeedCap; // Increase max run speed above cap. int32 DoubleSpecialAttack; // Chance to to perform a double special attack (ie flying kick 2x) int32 SkillAttackProc[3]; // [0] chance to proc [2] spell on [1] skill usage uint8 FrontalStunResist; // Chance to resist a frontal stun int32 BindWound; // Increase amount of HP by percent. int32 MaxBindWound; // Increase max amount of HP you can bind wound. int32 ChannelChanceSpells; // Modify chance to channel a spell. int32 ChannelChanceItems; // Modify chance to channel a items. uint8 SeeInvis; // See Invs. uint8 TripleBackstab; // Chance to triple backstab bool FrontalBackstabMinDmg; // Allow frontal backstabs for min damage uint8 FrontalBackstabChance; // Chance to backstab from the front for full damage uint8 ConsumeProjectile; // Chance to not consume arrow. uint8 ForageAdditionalItems; // Chance to forage another item. uint8 SalvageChance; // Chance to salvage a tradeskill components on fail. uint32 ArcheryDamageModifier; // Increase Archery Damage by percent bool SecondaryDmgInc; // Allow off hand weapon to recieve damage bonus. uint32 GiveDoubleAttack; // Allow classes to double attack with a specified chance. int32 SlayUndead[2]; // Allow classes to do extra damage verse undead.(base1 = rate, base2 = damage mod) int32 PetCriticalHit; // Allow pets to critical hit with % value. int32 PetAvoidance; // Pet avoidance chance. int32 CombatStability; // Melee damage mitigation. int32 DoubleRiposte; // Chance to double riposte int32 GiveDoubleRiposte[3]; // 0=Regular Chance, 1=Skill Attack Chance, 2=Skill uint32 RaiseSkillCap[EQ::skills::HIGHEST_SKILL + 1]; // Raise a specific skill cap (base1= value, base2=skill) int32 Ambidexterity; // Increase chance to duel wield by adding bonus 'skill'. int32 PetMaxHP; // Increase the max hp of your pet. int32 PetFlurry; // Chance for pet to flurry. uint8 MasteryofPast; // Can not fizzle spells below this level specified in value. bool GivePetGroupTarget; // All pets to recieve group buffs. (Pet Affinity) int32 RootBreakChance; // Chance root will break; int32 UnfailingDivinity; // Improves chance that DI will fire + increase partial heal. int32 ItemHPRegenCap; // Increase item regen cap. int32 SEResist[MAX_RESISTABLE_EFFECTS*2]; // Resist chance by specific spell effects. int32 OffhandRiposteFail; // chance for opponent to fail riposte with offhand attack. int32 ItemATKCap; // Raise item attack cap int32 FinishingBlow[2]; // Chance to do a finishing blow for specified damage amount. uint32 FinishingBlowLvl[2]; // Sets max level an NPC can be affected by FB. (base1 = lv, base2= ???) int32 ShieldEquipDmgMod; // Increases weapon's base damage by base1 % when shield is equipped (indirectly increasing hate) bool TriggerOnCastRequirement; // Triggers off various different conditions defined as emum SpellRestrictions int8 StunBashChance; // chance to stun with bash. int8 IncreaseChanceMemwipe; // increases chance to memory wipe int8 CriticalMend; // chance critical monk mend int32 ImprovedReclaimEnergy; // Modifies amount of mana returned from reclaim energy uint32 HeadShot[2]; // Headshot AA (Massive dmg vs humaniod w/ archery) 0= ? 1= Dmg uint8 HSLevel[2]; // Max Level Headshot will be effective at. and chance mod uint32 Assassinate[2]; // Assassinate AA (Massive dmg vs humaniod w/ assassinate) 0= ? 1= Dmg uint8 AssassinateLevel[2]; // Max Level Assassinate will be effective at. int32 PetMeleeMitigation; // Add AC to owner's pet. bool IllusionPersistence; // Causes illusions not to fade. uint16 extra_xtargets; // extra xtarget entries bool ShroudofStealth; // rogue improved invisiblity uint16 ReduceFallDamage; // reduce fall damage by percent int32 ReduceTradeskillFail[EQ::skills::HIGHEST_SKILL + 1]; // Reduces chance for trade skills to fail by percent. uint8 TradeSkillMastery; // Allow number of tradeskills to exceed 200 skill. int16 NoBreakAESneak; // Percent value 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 }; // StatBonus Indexes namespace SBIndex { constexpr uint16 BUFFSTACKER_EXISTS = 0; // SPA 446-449 constexpr uint16 BUFFSTACKER_VALUE = 1; // SPA 446-449 constexpr uint16 EXTRA_ATTACK_CHANCE = 0; // SPA 266,498,499 constexpr uint16 EXTRA_ATTACK_NUM_ATKS = 1; // SPA 266,498,499 constexpr uint16 DIVINE_SAVE_CHANCE = 0; // SPA 232 constexpr uint16 DIVINE_SAVE_SPELL_TRIGGER_ID = 1; // SPA 232 constexpr uint16 DEATH_SAVE_TYPE = 0; // SPA 150 constexpr uint16 DEATH_SAVE_BUFFSLOT = 1; // SPA 150 constexpr uint16 DEATH_SAVE_MIN_LEVEL_FOR_HEAL = 2; // SPA 150 constexpr uint16 DEATH_SAVE_HEAL_AMT = 3; // SPA 150 constexpr uint16 RESOURCE_PERCENT_CAP = 0; // SPA 408-410 constexpr uint16 RESOURCE_AMOUNT_CAP = 1; // SPA 408-419 constexpr uint16 NEGATE_ATK_EXISTS = 0; // SPA 163 constexpr uint16 NEGATE_ATK_BUFFSLOT = 1; // SPA 163 constexpr uint16 NEGATE_ATK_MAX_DMG_ABSORB_PER_HIT = 2; // SPA 163 constexpr uint16 MITIGATION_RUNE_PERCENT = 0; // SPA 161,162,450 constexpr uint16 MITIGATION_RUNE_BUFFSLOT = 1; // SPA 161,162,450 constexpr uint16 MITIGATION_RUNE_MAX_DMG_ABSORB_PER_HIT = 2; // SPA 161,162,450 constexpr uint16 MITIGATION_RUNE_MAX_HP_AMT = 3; // SPA 161,162,450 constexpr uint16 THRESHOLDGUARD_MITIGATION_PERCENT = 0; // SPA 451,452 constexpr uint16 THRESHOLDGUARD_BUFFSLOT = 1; // SPA 451,452 constexpr uint16 THRESHOLDGUARD_MIN_DMG_TO_TRIGGER = 2; // SPA 451,452 constexpr uint16 ENDURANCE_ABSORD_MITIGIATION = 0; // SPA 521 constexpr uint16 ENDURANCE_ABSORD_DRAIN_PER_HP = 1; // SPA 521 constexpr uint16 IMPROVED_TAUNT_MAX_LVL = 0; // SPA 444 constexpr uint16 IMPROVED_TAUNT_AGGRO_MOD = 1; // SPA 444 constexpr uint16 IMPROVED_TAUNT_BUFFSLOT = 2; // SPA 444 constexpr uint16 ROOT_EXISTS = 0; // SPA 99 constexpr uint16 ROOT_BUFFSLOT = 1; // SPA 99 constexpr uint16 RUNE_AMOUNT = 0; // SPA 55 constexpr uint16 RUNE_BUFFSLOT = 1; // SPA 78 constexpr uint16 POSITION_BACK = 0; // SPA 503-506 constexpr uint16 POSITION_FRONT = 1; // SPA 503-506 constexpr uint16 PET_RAMPAGE_CHANCE = 0; // SPA 464,465 constexpr uint16 PET_RAMPAGE_DMG_MOD = 1; // SPA 465,465 constexpr uint16 SKILLPROC_CHANCE = 0; // SPA 427 constexpr uint16 SKILLPROC_SKILL = 1; // SPA 427 constexpr uint16 SKILLPROC_SPELL_ID = 2; // SPA 427 constexpr uint16 SLAYUNDEAD_RATE_MOD = 0; // SPA 219 constexpr uint16 SLAYUNDEAD_DMG_MOD = 1; // SPA 219 constexpr uint16 DOUBLE_RIPOSTE_CHANCE = 0; // SPA 223 constexpr uint16 DOUBLE_RIPOSTE_SKILL_ATK_CHANCE = 1; // SPA 223 constexpr uint16 DOUBLE_RIPOSTE_SKILL = 2; // SPA 223 constexpr uint16 FINISHING_EFFECT_PROC_CHANCE = 0; // SPA 278, 439, 217 constexpr uint16 FINISHING_EFFECT_DMG = 1; // SPA 278, 439, 217 constexpr uint16 FINISHING_EFFECT_LEVEL_MAX = 0; // SPA 440, 345, 346 constexpr uint16 FINISHING_EFFECT_LEVEL_CHANCE_BONUS = 1; // SPA 440, 345, 346 constexpr uint16 DOUBLE_MELEE_ROUND_CHANCE = 0; // SPA 471 constexpr uint16 DOUBLE_MELEE_ROUND_DMG_BONUS = 1; // SPA 471 }; typedef struct { uint16 spellID; uint16 chance; uint16 base_spellID; int level_override; } tProc; struct WeaponStance_Struct { bool enabled; bool spellbonus_enabled; bool itembonus_enabled; bool aabonus_enabled; int spellbonus_buff_spell_id; int itembonus_buff_spell_id; int aabonus_buff_spell_id; }; constexpr uint16 WEAPON_STANCE_TYPE_2H = 0; constexpr uint16 WEAPON_STANCE_TYPE_SHIELD = 1; constexpr uint16 WEAPON_STANCE_TYPE_DUAL_WIELD = 2; typedef struct { uint16 increment; uint16 hit_increment; uint16 target_id; int32 wpn_dmg; float origin_x; float origin_y; float origin_z; float tlast_x; float tlast_y; uint32 ranged_id; uint32 ammo_id; int ammo_slot; uint8 skill; float speed_mod; } tProjatk; //eventually turn this into a typedef and //make DoAnim take it instead of int, to enforce its use. enum { //type arguments to DoAnim animKick = 1, anim1HPiercing = 2, //might be piercing? anim2HSlashing = 3, anim2HWeapon = 4, anim1HWeapon = 5, animDualWield = 6, animTailRake = 7, //slam & Dpunch too animHand2Hand = 8, animShootBow = 9, animRoundKick = 11, animSwarmAttack = 20, //dunno about this one.. animFlyingKick = 45, animTigerClaw = 46, animEagleStrike = 47, }; enum { SKILLUP_UNKNOWN = 0, SKILLUP_SUCCESS = 1, SKILLUP_FAILURE = 2 }; enum { GridCircular, GridRandom10, GridRandom, GridPatrol, GridOneWayRepop, GridRand5LoS, GridOneWayDepop, GridCenterPoint, GridRandomCenterPoint, GridRandomPath }; typedef enum { petFamiliar, //only listens to /pet get lost petAnimation, //does not listen to any commands petOther, petCharmed, petNPCFollow, petTargetLock, //remain active as long something is on the hatelist. Don't listen to any commands petNone = 0xFF // not a pet } PetType; typedef enum { SingleTarget, // causes effect to spell_target AETarget, // causes effect in aerange of target + target AECaster, // causes effect in aerange of 'this' GroupSpell, // causes effect to caster + target's group CAHateList, // causes effect to all people on caster's hate list within some range DirectionalAE, Beam, TargetRing, CastActUnknown } CastAction_type; struct MercType { uint32 Type; uint32 ClientVersion; }; struct MercData { uint32 MercTemplateID; uint32 MercType; // From dbstr_us.txt - Apprentice (330000100), Journeyman (330000200), Master (330000300) uint32 MercSubType; // From dbstr_us.txt - 330020105^23^Race: Guktan
Type: Healer
Confidence: High
Proficiency: Apprentice, Tier V... uint32 CostFormula; // To determine cost to client uint32 ClientVersion; // Only send valid mercs per expansion uint32 NPCID; }; namespace EQ { class ItemInstance; } class Mob; // All data associated with a single trade class Trade { public: Trade(Mob* in_owner); virtual ~Trade(); void Reset(); void SetTradeCash(uint32 in_pp, uint32 in_gp, uint32 in_sp, uint32 in_cp); // Initiate a trade with another mob // Also puts other mob into trader mode with this mob void Start(uint32 mob_id, bool initiate_with=true); // Mob the owner is trading with Mob* With(); // Add item from cursor slot to trade bucket (automatically does bag data too) void AddEntity(uint16 trade_slot_id, uint32 stack_size); // Audit trade void LogTrade(); void DumpTrade(); public: // Object state TradeState state; int32 pp; int32 gp; int32 sp; int32 cp; private: // Send item data for trade item to other person involved in trade void SendItemData(const EQ::ItemInstance* inst, int16 dest_slot_id); uint32 with_id; Mob* owner; }; struct ExtraAttackOptions { ExtraAttackOptions() : damage_percent(1.0f), damage_flat(0), armor_pen_percent(0.0f), armor_pen_flat(0), crit_percent(1.0f), crit_flat(0.0f), hate_percent(1.0f), hate_flat(0), hit_chance(0), melee_damage_bonus_flat(0), skilldmgtaken_bonus_flat(0) { } float damage_percent; int damage_flat; float armor_pen_percent; int armor_pen_flat; float crit_percent; float crit_flat; float hate_percent; int hate_flat; int hit_chance; int melee_damage_bonus_flat; int skilldmgtaken_bonus_flat; }; struct DamageTable { int32 max_extra; // max extra damage int32 chance; // chance not to apply? int32 minusfactor; // difficulty of rolling }; struct DamageHitInfo { //uint16 attacker; // id //uint16 defender; // id int base_damage; int min_damage; int damage_done; int offense; int tohit; int hand; EQ::skills::SkillType skill; }; struct ExpeditionInvite { uint32_t expedition_id; std::string inviter_name; std::string swap_remove_name; }; #endif