Index: game/Player.cpp =================================================================== --- game/Player.cpp (revision 5609) +++ game/Player.cpp (working copy) @@ -14742,6 +14742,148 @@ data << uint32(0x8e8b) << uint64(0); // if count = 3 GetSession()->SendPacket(&data); + + + // Check for Master's dummy spells + if(pet->isControlled() && (pet->getPetType() == HUNTER_PET || cinfo && cinfo->type == CREATURE_TYPE_DEMON && getClass() == CLASS_WARLOCK)) + { + for(PetSpellMap::iterator itr = pet->m_spells.begin();itr != pet->m_spells.end();itr++) + { + if(itr->second->state == PETSPELL_REMOVED) + continue; + ++addlist; + } + + + Unit::AuraList const& dummyList = GetAurasByType(SPELL_AURA_DUMMY); + for(Unit::AuraList::const_iterator itr = dummyList.begin();itr!=dummyList.end();++itr) + { + uint32 MD = 0; + + switch((*itr)->GetSpellProto()->Id) + { + // Spirit Bond + case 19578: + pet->CastSpell(pet, 19579, true); + break; + case 20895: + pet->CastSpell(pet, 24529, true); + break; + // Stalker's Ally + case 28757: + pet->CastSpell(pet, 28758, true); + break; + // Master Demonologist + case 23785: + { + switch(pet->GetEntry()) + { + case 416: MD = 23759; break; // imp + case 1860: MD = 23760; break; // voidwalker + case 1863: MD = 23761; break; // succubus + case 417: MD = 23762; break; // felhunter + case 17252: MD = 35702; break; // felguard + default: break; + } + if(MD) pet->CastSpell(pet, MD, true); + break; + } + case 23822: + { + switch(pet->GetEntry()) + { + case 416: MD = 23826; break; // imp + case 1860: MD = 23841; break; // voidwalker + case 1863: MD = 23833; break; // succubus + case 417: MD = 23837; break; // felhunter + case 17252: MD = 35703; break; // felguard + default: break; + } + if(MD) pet->CastSpell(pet, MD, true); + break; + } + case 23823: + { + switch(pet->GetEntry()) + { + case 416: MD = 23827; break; // imp + case 1860: MD = 23842; break; // voidwalker + case 1863: MD = 23834; break; // succubus + case 417: MD = 23838; break; // felhunter + case 17252: MD = 35704; break; // felguard + default: break; + } + if(MD) pet->CastSpell(pet, MD, true); + break; + } + case 23824: + { + switch(pet->GetEntry()) + { + case 416: MD = 23828; break; // imp + case 1860: MD = 23842; break; // voidwalker + case 1863: MD = 23835; break; // succubus + case 417: MD = 23839; break; // felhunter + case 17252: MD = 35705; break; // felguard + default: break; + } + if(MD) pet->CastSpell(pet, MD, true); + break; + } + case 23825: + { + switch(pet->GetEntry()) + { + case 416: MD = 23829; break; // imp + case 1860: MD = 23844; break; // voidwalker + case 1863: MD = 23836; break; // succubus + case 417: MD = 23840; break; // felhunter + case 17252: MD = 35706; break; // felguard + default: break; + } + if(MD) pet->CastSpell(pet, MD, true); + break; + } + // Focused Fire + case 35029: + pet->CastSpell(pet, 35060, true); + break; + case 35030: + pet->CastSpell(pet, 35061, true); + break; + // Demonic Knowledge + case 35691: + case 35692: + case 35693: + { + int32 DemonKnowledgeBasePoints0 = (*itr)->GetModifier()->m_amount; + DemonKnowledgeBasePoints0 = int32( DemonKnowledgeBasePoints0 * (pet->GetStat(STAT_STAMINA) + pet->GetStat(STAT_INTELLECT)) / 100.0f ); + pet->CastCustomSpell(pet,35696,&DemonKnowledgeBasePoints0, NULL, NULL, true ); + break; + } + default: break; + } + } + // Focused Fire is has SPELL_AURA_ADD_FLAT_MODIFIER :-/ + Unit::AuraList const& flatModList = GetAurasByType(SPELL_AURA_ADD_FLAT_MODIFIER); + for(Unit::AuraList::const_iterator itr = flatModList.begin();itr!=flatModList.end();++itr) + { + switch((*itr)->GetSpellProto()->Id) + { + // Focused Fire + case 35029: + pet->CastSpell(pet, 35060, true); + break; + case 35030: + pet->CastSpell(pet, 35061, true); + break; + default: break; + } + } + // done + + + } } } Index: game/Player.h =================================================================== --- game/Player.h (revision 5609) +++ game/Player.h (working copy) @@ -83,6 +83,13 @@ Spell const* lastAffected; }; +enum PetLink +{ + PETLINK_NONE = 0, + PETLINK_BOTH = 1, + PETLINK_MASTER = 2, +}; + typedef HM_NAMESPACE::hash_map PlayerSpellMap; typedef std::list SpellModList; Index: game/SpellAuras.cpp =================================================================== --- game/SpellAuras.cpp (revision 5609) +++ game/SpellAuras.cpp (working copy) @@ -307,7 +307,8 @@ m_procCharges(0), m_spellmod(NULL), m_spellId(spellproto->Id), m_effIndex(eff), m_caster_guid(0), m_target(target), m_timeCla(1000), m_castItemGuid(castItem?castItem->GetGUID():0), m_auraSlot(MAX_AURAS), m_positive(false), m_permanent(false), m_isPeriodic(false), m_isTrigger(false), m_isAreaAura(false), m_isPersistent(false), -m_periodicTimer(0), m_PeriodicEventId(0), m_updated(false), m_removeOnDeath(false),m_fearMoveAngle(0), m_isRemovedOnShapeLost(true) +m_periodicTimer(0), m_PeriodicEventId(0), m_updated(false), m_removeOnDeath(false),m_fearMoveAngle(0), m_isRemovedOnShapeLost(true), +m_PetLink(PETLINK_NONE) { assert(target); @@ -415,6 +416,11 @@ m_radius = GetSpellRadius(sSpellRadiusStore.LookupEntry(GetSpellProto()->EffectRadiusIndex[m_effIndex])); if(Player* modOwner = caster_ptr->GetSpellModOwner()) modOwner->ApplySpellMod(GetSpellProto()->Id, SPELLMOD_RADIUS, m_radius); + + if (spellproto->Effect[eff] == 119) + m_PetLink = PETLINK_BOTH; + else if (spellproto->Effect[eff] == 143) + m_PetLink = PETLINK_MASTER; } AreaAura::~AreaAura() @@ -605,7 +611,7 @@ pGroup = ((Player*)owner)->GetGroup(); } - if(pGroup) + if(pGroup && m_PetLink == PETLINK_NONE) { for(GroupReference *itr = pGroup->GetFirstMember(); itr != NULL; itr = itr->next()) { @@ -733,6 +739,10 @@ { AuraType aura = m_modifier.m_auraname; + // Master Type of Auras will add effects only on Master + if (m_target && m_PetLink == PETLINK_MASTER && m_target->GetTypeId() != TYPEID_PLAYER) + return; + if(auraCastSpell(m_caster,spell_id,true,NULL); return; } + case 19028: // Soul Link + { + if (!unitTarget) + return; + + // Pet will cast aura + unitTarget->CastSpell(unitTarget,25228,true,NULL); + return; + } + } //All IconID Check in there @@ -4955,17 +4965,17 @@ void Spell::EffectApplyPetAura(uint32 i) { - //spell aura for both pet and owner, think the pet has the aura and applies it to owner - EffectApplyAura(i); + if(!unitTarget) + return; + if(!unitTarget->isAlive()) + return; - Unit* owner = unitTarget->GetCharmerOrOwner(); - if(owner) - { - unitTarget = owner; - EffectApplyAura(i); - } + // use area aura + AreaAura* Aur = new AreaAura(m_spellInfo, i, &m_currentBasePoints[i], unitTarget, m_caster); + unitTarget->AddAura(Aur); } + void Spell::EffectSummonDemon(uint32 i) { float px = m_targets.m_destX; Index: game/Unit.cpp =================================================================== --- game/Unit.cpp (revision 5609) +++ game/Unit.cpp (working copy) @@ -4154,7 +4154,7 @@ } //float radius = GetRadius(sSpellRadiusStore.LookupEntry((*i).second->GetSpellProto()->EffectRadiusIndex[(*i).second->GetEffIndex()])); - if(pGroup && pGroupOf) + if(pGroup && pGroupOf && (*i).second->GetPetLink() == PETLINK_NONE) { for(GroupReference *itr = pGroup->GetFirstMember(); itr != NULL; itr = itr->next()) {