diff --git a/common/spdat.h b/common/spdat.h index a469be2e7..8288c0895 100644 --- a/common/spdat.h +++ b/common/spdat.h @@ -617,8 +617,8 @@ typedef enum { //#define SE_Fc_Damage_%2 461 // //#define SE_Fc_Damage_Amt2 462 // //#define SE_Shield_Target 463 // -//#define SE_PC_Pet_Rampage 464 // -//#define SE_PC_Pet_AE_Rampage 465 // +#define SE_PC_Pet_Rampage 464 // Base1 % chance to do rampage for base2 % of damage each melee round +#define SE_PC_Pet_AE_Rampage 465 // Base1 % chance to do aerampage for base2 % of damage each melee round //#define SE_PC_Pet_Flurry_Chance 466 // //#define SE_DS_Mitigation_Amount 467 // //#define SE_DS_Mitigation_Percentage 468 // diff --git a/zone/bonuses.cpp b/zone/bonuses.cpp index 155dfc4ae..18a69637f 100644 --- a/zone/bonuses.cpp +++ b/zone/bonuses.cpp @@ -1417,6 +1417,13 @@ void Mob::ApplyAABonuses(const AA::Rank &rank, StatBonuses *newbon) case SE_IncreaseExtTargetWindow: newbon->extra_xtargets += base1; break; + + case SE_PC_Pet_Rampage: { + newbon->PC_Pet_Rampage[0] += base1; //Chance to rampage + if (newbon->PC_Pet_Rampage[1] < base2) + newbon->PC_Pet_Rampage[1] = base2; //Damage modifer - take highest + break; + } // to do case SE_PetDiscipline: break; @@ -3120,6 +3127,13 @@ void Mob::ApplySpellsBonuses(uint16 spell_id, uint8 casterlevel, StatBonuses *ne break; } + case SE_PC_Pet_Rampage: { + new_bonus->PC_Pet_Rampage[0] += effect_value; //Chance to rampage + if (new_bonus->PC_Pet_Rampage[1] < base2) + new_bonus->PC_Pet_Rampage[1] = base2; //Damage modifer - take highest + 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 7901d511e..c59156c7b 100644 --- a/zone/common.h +++ b/zone/common.h @@ -405,6 +405,7 @@ struct StatBonuses { bool LimitToSkill[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 // AAs int8 Packrat; //weight reduction for items, 1 point = 10% diff --git a/zone/mob_ai.cpp b/zone/mob_ai.cpp index 4be97897a..f54113f93 100644 --- a/zone/mob_ai.cpp +++ b/zone/mob_ai.cpp @@ -1139,16 +1139,12 @@ void Mob::AI_Process() { } } - if (IsPet() || (IsNPC() && CastToNPC()->GetSwarmOwner())) { + if (IsPet() || IsTempPet()) { Mob *owner = nullptr; - - if (IsPet()) - owner = GetOwner(); - else - owner = entity_list.GetMobID(CastToNPC()->GetSwarmOwner()); + owner = GetOwner(); if (owner) { - int16 flurry_chance = owner->aabonuses.PetFlurry + + int16 flurry_chance = owner->aabonuses.PetFlurry + owner->spellbonuses.PetFlurry + owner->itembonuses.PetFlurry; if (flurry_chance && zone->random.Roll(flurry_chance)) @@ -1156,6 +1152,19 @@ void Mob::AI_Process() { } } + if ((IsPet() || IsTempPet()) && IsPetOwnerClient()){ + if (spellbonuses.PC_Pet_Rampage[0] || itembonuses.PC_Pet_Rampage[0] || aabonuses.PC_Pet_Rampage[0]){ + int chance = spellbonuses.PC_Pet_Rampage[0] + itembonuses.PC_Pet_Rampage[0] + aabonuses.PC_Pet_Rampage[0]; + int dmg_mod = spellbonuses.PC_Pet_Rampage[1] + itembonuses.PC_Pet_Rampage[1] + aabonuses.PC_Pet_Rampage[1]; + Shout("CHance %i", chance); + if(zone->random.Roll(chance)) { + ExtraAttackOptions opts; + opts.damage_percent = dmg_mod / 100.0f; + Rampage(&opts); + } + } + } + if (GetSpecialAbility(SPECATK_RAMPAGE) && !specialed) { int rampage_chance = GetSpecialAbilityParam(SPECATK_RAMPAGE, 0); @@ -1245,6 +1254,7 @@ void Mob::AI_Process() { //now special attacks (kick, etc) if(IsNPC()) CastToNPC()->DoClassAttacks(target); + } AI_EngagedCastCheck(); } //end is within combat rangepet