bool SoulStoneResurrection(uint32 i, Aura* a, bool apply) { Unit* u_target = a->GetTarget(); if (!u_target->IsPlayer()) return true; Player* p_target = TO_PLAYER(u_target); uint32 soulstone = a->GetSpellProto()->EffectMiscValue[0]; if (apply) { p_target->SetSoulStone(soulstone); p_target->SetSoulStoneReceiver((uint32)a->m_casterGuid); } else if (p_target->isAlive()) { p_target->SetSoulStone(0); p_target->SetSoulStoneReceiver(0); } return true; }
// Protecting Our Own bool ProtectingOurOwn(uint32 i, Spell* pSpell) { if(pSpell->u_caster == NULL || !pSpell->u_caster->IsPlayer()) return true; Player* plr = TO_PLAYER(pSpell->u_caster); QuestLogEntry *qle = plr->GetQuestLogForEntry(10488); if(qle == NULL) return true; if ( qle->GetMobCount( 0 ) < qle->GetQuest()->required_mobcount[0] ) { uint32 NewCount = qle->GetMobCount( 0 ) + 1; qle->SetMobCount( 0, NewCount ); qle->SendUpdateAddKill( 0 ); qle->UpdatePlayerFields(); } return true; }
bool RuneOfDistortion(uint32 i, Spell * pSpell) { if ( pSpell == NULL || pSpell->p_caster == NULL ) return true; Player * plr = TO_PLAYER(pSpell->u_caster); if( plr == NULL ) return true; Creature * pCreature = sEAS.SpawnCreature(plr, 32162, plr->GetPositionX(), plr->GetPositionY(), plr->GetPositionZ(),0, 0); pCreature->Despawn(5*60*1000, 0); QuestLogEntry *qle = plr->GetQuestLogForEntry(13312); if(qle == NULL) { qle = plr->GetQuestLogForEntry(13337); if(qle == NULL) return true; } return true; }
bool PoweringOurDefenses(uint32 i, Spell* pSpell) { if(pSpell->u_caster->IsPlayer() == false) return true; Player * plr = TO_PLAYER(pSpell->u_caster); QuestLogEntry *qle = plr->GetQuestLogForEntry( 8490 ); if( qle == NULL ) return true; // Angelis : Need to script the scourge attack if( qle && qle->GetMobCount(0) < qle->GetQuest()->required_mobcount[0] ) { qle->SetMobCount(0, qle->GetMobCount(0)+1); qle->SendUpdateAddKill(0); qle->UpdatePlayerFields(); } return true; }
bool RodofPurification(uint32 i, Spell * pSpell) { Player * pPlayer = TO_PLAYER(pSpell->u_caster); if(!pPlayer) return true; if(!pSpell->u_caster->IsPlayer()) return true; QuestLogEntry *qle = pPlayer->GetQuestLogForEntry(10839); if(qle == NULL) return true; GameObject * Darkstone = pPlayer->GetMapMgr()->GetInterface()->GetGameObjectNearestCoords(-2512, 5418, 0, 185191); if(Darkstone != NULL) { if(pPlayer->CalcDistance(pPlayer, Darkstone) < 15) qle->SendQuestComplete(); } return true; }
bool OrbOfMurlocControl(uint32 i, Spell* pSpell) { if(pSpell->m_caster->IsPlayer() == false) return true; Player* pPlayer = TO_PLAYER( pSpell->u_caster ); QuestLogEntry *pQuest = pPlayer->GetQuestLogForEntry(11541); if(pQuest == NULL) return true; Creature* pTarget; for(ObjectSet::iterator itr = pSpell->m_caster->GetInRangeSetBegin(); itr != pSpell->m_caster->GetInRangeSetEnd(); ++itr) { if( (*itr)->IsUnit() && TO_UNIT(*itr)->IsCreature() ) pTarget = TO_CREATURE(*itr); else continue; if( pSpell->m_caster->CalcDistance(pTarget) > 5 ) continue; if( pTarget->GetEntry() == 25084) { if(pQuest->GetMobCount(0) < pQuest->GetQuest()->required_mobcount[0]) { pQuest->SetMobCount(0, pQuest->GetMobCount(0) + 1); pQuest->SendUpdateAddKill(0); Creature* FreedGreengill = sEAS.SpawnCreature(pPlayer, 25085, pTarget->GetPositionX(), pTarget->GetPositionY(), pTarget->GetPositionZ(), pTarget->GetOrientation(), 0); FreedGreengill->Despawn(6*60*1000, 0); pTarget->Despawn(0, 6*60*1000); pQuest->UpdatePlayerFields(); return true; } } } return true; }
/// Spell Target Handling for type 33: Party members of totem, inside given range void Spell::SpellTargetNearbyPartyMembers(uint32 i, uint32 j) { // this implementation is wrong.... this one is for totems if( u_caster != NULL ) { if( u_caster->GetTypeId()==TYPEID_UNIT) { if( TO_CREATURE( u_caster )->IsTotem() ) { float r = GetDBCCastTime(i); r *= r; Player* p = TO_PLAYER( TO_CREATURE(u_caster)->GetSummonOwner()); if( p == NULL) return; if(IsInrange(m_caster->GetPositionX(),m_caster->GetPositionY(),m_caster->GetPositionZ(),p,r)) _AddTargetForced(p->GetGUID(), i); SubGroup * pGroup = p->GetGroup() ? p->GetGroup()->GetSubGroup(p->GetSubGroup()) : 0; if(pGroup) { p->GetGroup()->Lock(); for(GroupMembersSet::iterator itr = pGroup->GetGroupMembersBegin(); itr != pGroup->GetGroupMembersEnd(); itr++) { if(!(*itr)->m_loggedInPlayer || p == (*itr)->m_loggedInPlayer) continue; if(IsInrange(m_caster->GetPositionX(),m_caster->GetPositionY(),m_caster->GetPositionZ(),(*itr)->m_loggedInPlayer,r)) _AddTargetForced((*itr)->m_loggedInPlayer->GetGUID(), i); } p->GetGroup()->Unlock(); } } } } }
bool BlackwhelpNet(uint32 i, Spell * pSpell) { Player * pPlayer = TO_PLAYER(pSpell->u_caster); if(!pPlayer) return true; if(!pSpell->u_caster->IsPlayer()) return true; QuestLogEntry *qle = pPlayer->GetQuestLogForEntry(10747); if(qle == NULL) return true; Creature * whelp = TO_CREATURE(pSpell->GetUnitTarget()); if(!whelp) return true; whelp->Despawn(1000, 6*60*1000); sEAS.AddItem(31130, pPlayer); return true; }
bool TheCleansingMustBeStopped(uint32 i, Spell * pSpell) { Player * pPlayer = TO_PLAYER(pSpell->u_caster); if(!pPlayer) return true; if(!pSpell->u_caster->IsPlayer()) return true; QuestLogEntry *qle = pPlayer->GetQuestLogForEntry(9370); if(qle == NULL) return true; Creature * draenei1 = sEAS.SpawnCreature(pPlayer, 16994, pPlayer->GetPositionX()+RandomFloat(5.0f), pPlayer->GetPositionY()+RandomFloat(5.0f), pPlayer->GetPositionZ(), pPlayer->GetOrientation(), 0); draenei1->Despawn(6*60*1000, 0); Creature * draenei2 = sEAS.SpawnCreature(pPlayer, 16994, pPlayer->GetPositionX()-RandomFloat(5.0f), pPlayer->GetPositionY()+RandomFloat(5.0f), pPlayer->GetPositionZ(), pPlayer->GetOrientation(), 0); draenei1->Despawn(6*60*1000, 0); Creature * draenei3 = sEAS.SpawnCreature(pPlayer, 16994, pPlayer->GetPositionX()+RandomFloat(5.0f), pPlayer->GetPositionY()-RandomFloat(5.0f), pPlayer->GetPositionZ(), pPlayer->GetOrientation(), 0); draenei1->Despawn(6*60*1000, 0); return true; }
bool HealingTheLake(uint32 i, SpellPointer pSpell) { if ( pSpell == NULL || pSpell->u_caster == NULL || !pSpell->u_caster->IsPlayer() ) return true; PlayerPointer pPlayer = TO_PLAYER( pSpell->u_caster ); QuestLogEntry *pQuest = pPlayer->GetQuestLogForEntry( 9294 ); if ( pQuest == NULL ) return true; if ( pQuest->GetMobCount( 0 ) < pQuest->GetQuest()->required_mobcount[0] ) { pQuest->SetMobCount( 0, pQuest->GetMobCount( 0 ) + 1 ); pQuest->SendUpdateAddKill( 0 ); pQuest->UpdatePlayerFields(); return true; } return true; }
bool ADireSituation(uint32 i, Spell * pSpell) { Player * pPlayer = TO_PLAYER(pSpell->u_caster); if(!pPlayer) return true; if(!pSpell->u_caster->IsPlayer()) return true; QuestLogEntry *qle = pPlayer->GetQuestLogForEntry(10506); if(qle == NULL) return true; if(qle->GetMobCount(0) < qle->GetQuest()->required_mobcount[0]) { qle->SetMobCount(0, qle->GetMobCount(0)+1); qle->SendUpdateAddKill(0); qle->UpdatePlayerFields(); } return true; }
void OnLoad() { if(!_unit->IsSummon()) return; Unit* summoner = TO< Summon* >(_unit)->GetOwner(); if(summoner != NULL) { if(summoner->IsPlayer()) { Player* p = TO_PLAYER(summoner); if(p->HasQuest(11608)) { GameObject* pSinkhole = p->GetMapMgr()->GetInterface()->GetGameObjectNearestCoords(p->GetPositionX(), p->GetPositionY(), p->GetPositionZ(), 300171); if(pSinkhole != NULL) { _unit->CastSpell(_unit, 45502, true); float posX = pSinkhole->GetPositionX(); if(posX == 2657.13f) sEAS.KillMobForQuest(p, 11608, 0); if(posX == 2716.02f) sEAS.KillMobForQuest(p, 11608, 1); if(posX == 2877.96f) sEAS.KillMobForQuest(p, 11608, 2); if(posX == 2962.16f) sEAS.KillMobForQuest(p, 11608, 3); } } } } _unit->Despawn(500, 0); }
bool YennikuRelease(uint32 i, Spell * pSpell) { Player * pPlayer = TO_PLAYER(pSpell->u_caster); if(!pPlayer) return true; if(!pSpell->u_caster->IsPlayer()) return true; QuestLogEntry *qle = pPlayer->GetQuestLogForEntry(592); if(qle == NULL) return true; Creature * yenniku = TO_CREATURE(pSpell->GetUnitTarget()); if(!yenniku) return true; yenniku->SetFaction(29); yenniku->GetAIInterface()->WipeTargetList(); yenniku->Despawn(30*1000, 60*1000); return true; }
bool MagnetoCollector(uint32 i, Spell * pSpell) { Player * pPlayer = TO_PLAYER(pSpell->u_caster); if(!pPlayer) return true; if(!pSpell->u_caster->IsPlayer()) return true; QuestLogEntry *qle = pPlayer->GetQuestLogForEntry(10584); if(qle == NULL) return true; Creature * magneto = TO_CREATURE(pSpell->GetUnitTarget()); if(!magneto) return true; Creature * auramagneto = sEAS.SpawnCreature(pPlayer, 21731, magneto->GetPositionX(), magneto->GetPositionY(), magneto->GetPositionZ(), magneto->GetOrientation(), 0); magneto->Despawn(1, 0); auramagneto->Despawn(4*60*1000, 0); return true; }
bool WaitingToResurrect(uint32 i, Aura* a, bool apply) { Unit* u_target = a->GetTarget(); if(!u_target->IsPlayer()) return true; Player* p_target = TO_PLAYER(u_target); if(apply) // already applied in opcode handler return true; uint64 crtguid = p_target->m_areaSpiritHealer_guid; Creature* pCreature = p_target->IsInWorld() ? p_target->GetMapMgr()->GetCreature(GET_LOWGUID_PART(crtguid)) : NULL; if(pCreature == NULL || p_target->m_bg == NULL) return true; p_target->m_bg->RemovePlayerFromResurrect(p_target, pCreature); return true; }
bool DouseEternalFlame(uint32 i, Spell* pSpell) { if (pSpell->u_caster == NULL || !pSpell->u_caster->IsPlayer()) return true; Player* plr = TO_PLAYER(pSpell->u_caster); QuestLogEntry *qle = plr->GetQuestLogForEntry(9737); if(qle == NULL) return true; GameObject* Flame = plr->GetMapMgr()->GetInterface()->GetGameObjectNearestCoords(3678, -3640, 139, 182068); if(Flame != NULL) { if(plr->CalcDistance(plr, Flame) < 30) if(qle->GetMobCount(0) < qle->GetQuest()->required_mobcount[0]) { qle->SetMobCount(0, qle->GetMobCount(0)+1); qle->SendUpdateAddKill(0); qle->UpdatePlayerFields(); } } return true; }
void AIUpdate() { // Let's see if we are netted Aura* a = _unit->FindAura(38177); if (a != nullptr) { Unit* Caster = a->GetUnitCaster(); if (!Caster) return; if (Caster->IsPlayer()) { QuestLogEntry* qle = TO_PLAYER(Caster)->GetQuestLogForEntry(10747); if (qle != nullptr) { // casting the spell that will create the item for the player _unit->CastSpell(Caster, 38178, true); _unit->Despawn(1000, 360000); } } } }
bool ForceofNeltharakuSpell(uint32 i, SpellPointer pSpell) // Becoming a Shadoweave Tailor { if(pSpell->u_caster->IsPlayer() == false) return true; PlayerPointer pPlayer= TO_PLAYER(pSpell->u_caster); UnitPointer pUnit = TO_UNIT(pPlayer->GetMapMgr()->GetCreature(GET_LOWGUID_PART(pPlayer->GetSelection()))); if(pUnit == NULLUNIT) return true; if(!pUnit->IsCreature()) return true; CreaturePointer pTarget = TO_CREATURE(pUnit); QuestLogEntry *pQuest = pPlayer->GetQuestLogForEntry(10854); if(pQuest == NULL) return true; if(pTarget->GetEntry() == 21722 && pPlayer->CalcDistance(pUnit)<30) { if ( pQuest && pQuest->GetMobCount(0) < pQuest->GetQuest()->required_mobcount[0] ) { pTarget->CastSpell(pPlayer, dbcSpell.LookupEntry(38775), true); pQuest->SetMobCount(0, pQuest->GetMobCount(0)+1); pQuest->SendUpdateAddKill(0); pQuest->UpdatePlayerFields(); if ( pTarget->GetScript() != NULL ) { MoonScriptCreatureAI *pDrakeAI = static_cast<MoonScriptCreatureAI*>(pTarget->GetScript()); pDrakeAI->SetCanMove(true); pDrakeAI->SetWaypointToMove(0); } } } return true; }
void OnDied(UnitPointer mKiller) { if(mKiller->IsPlayer()) { PlayerPointer mPlayer = TO_PLAYER(mKiller); if(mPlayer == NULL || mPlayer->GetMapMgr() == NULL || mPlayer->GetMapMgr()->GetInterface() == NULL) return; CreaturePointer beka1 = sEAS.SpawnCreature(mPlayer, 1516, -13770.5, -6.79, 42.8, 5.7 , 0); beka1->GetAIInterface()->MoveTo(-13727.8, -26.2, 46.15, 4.07); beka1->Despawn(10*60*1000, 0); } else { PlayerPointer mPlayer = _unit->GetMapMgr()->GetInterface()->GetPlayerNearestCoords(_unit->GetPositionX(), _unit->GetPositionY(), _unit->GetPositionZ()); if(mPlayer) { if(mPlayer == NULL || mPlayer->GetMapMgr() == NULL || mPlayer->GetMapMgr()->GetInterface() == NULL) return; CreaturePointer beka1 = sEAS.SpawnCreature(mPlayer, 1516, -13770.5, -6.79, 42.8, 5.7 , 0); beka1->GetAIInterface()->MoveTo(-13727.8, -26.2, 46.15, 4.07); beka1->Despawn(10*60*1000, 0); } } }
/// Spell Target Handling for type 18: All Party Members around the Caster in given range NOT RAID void Spell::SpellTargetAllPartyMembersRangeNR(uint32 i, uint32 j) { Player* p = p_caster; if( p == NULL ) { if( TO_CREATURE( u_caster)->IsTotem() ) p = TO_PLAYER( TO_CREATURE(u_caster)->GetSummonOwner()); else if( u_caster->IsPet() && TO_PET( u_caster )->GetPetOwner() ) p = TO_PET( u_caster )->GetPetOwner(); } if( p == NULL ) return; float r = GetDBCCastTime(i); r *= r; if( IsInrange( m_caster->GetPositionX(), m_caster->GetPositionY(), m_caster->GetPositionZ(), p, r ) ) _AddTargetForced(p->GetGUID(), i); SubGroup* subgroup = p->GetGroup() ? p->GetGroup()->GetSubGroup( p->GetSubGroup() ) : 0; if( subgroup != NULL ) { p->GetGroup()->Lock(); for(GroupMembersSet::iterator itr = subgroup->GetGroupMembersBegin(); itr != subgroup->GetGroupMembersEnd(); itr++) { if(!(*itr)->m_loggedInPlayer || m_caster == (*itr)->m_loggedInPlayer) continue; if(IsInrange(m_caster->GetPositionX(),m_caster->GetPositionY(),m_caster->GetPositionZ(),(*itr)->m_loggedInPlayer,r)) _AddTargetForced( (*itr)->m_loggedInPlayer->GetGUID(), i ); } p->GetGroup()->Unlock(); } }
bool WelcomingtheWolfSpirit(uint32 i, Spell * pSpell) { Player * pPlayer = TO_PLAYER(pSpell->u_caster); if(!pPlayer) return true; if(!pSpell->u_caster->IsPlayer()) return true; QuestLogEntry *qle = pPlayer->GetQuestLogForEntry(10791); if(qle == NULL) return true; Creature * spiritwolf = sEAS.SpawnCreature(pPlayer, 19616, pPlayer->GetPositionX()+2, pPlayer->GetPositionY()+3, pPlayer->GetPositionZ(), pPlayer->GetOrientation(), 0); spiritwolf->Despawn(5*60*1000, 0); if(qle->GetMobCount(0) < qle->GetQuest()->required_mobcount[0]) { qle->SetMobCount(0, qle->GetMobCount(0)+1); qle->SendUpdateAddKill(0); qle->UpdatePlayerFields(); } return true; }
void OnDied(Unit* mKiller) { if(mKiller->IsPlayer()) { Player * plr = TO_PLAYER(mKiller); if(plr->HasQuest(10896)) { if(Rand(90)) { switch(_unit->GetEntry()) { case 22307: min = 4; max = 11; break; case 22095: min = 2; max = 5; break; } finall = min + RandomUInt(max - min); float SSX = _unit->GetPositionX(); float SSY = _unit->GetPositionY(); float SSZ = _unit->GetPositionZ(); float SSO = _unit->GetOrientation(); for(uint8 i = 0; i < finall; i++) { Creature * NewCreature = _unit->GetMapMgr()->GetInterface()->SpawnCreature(22419, SSX + RandomFloat(3.0f), SSY + RandomFloat(3.0f), SSZ, SSO + RandomFloat(1.0f), true, false, 0, 0); if ( NewCreature != NULL ) NewCreature->Despawn(120000, 0); } } } } }
void OnDied(Unit* mKiller) { if(!mKiller->IsPlayer()) return; Player* pPlayer = TO_PLAYER(mKiller); QuestLogEntry* pQuest = pPlayer->GetQuestLogForEntry(10502); if(pQuest == NULL) { pQuest = pPlayer->GetQuestLogForEntry(10505); if(pQuest == NULL) { return; } } if(pQuest->GetMobCount(0) < pQuest->GetQuest()->required_mobcount[0]) { uint32 NewCount = pQuest->GetMobCount(0) + 1; pQuest->SetMobCount(0, NewCount); pQuest->SendUpdateAddKill(0); pQuest->UpdatePlayerFields(); } }
//Ruthless Cunning bool RuthlessCunning(uint32 i, Spell* pSpell) { if(!pSpell->u_caster->IsPlayer()) return true; Player* plr = TO_PLAYER(pSpell->u_caster); if( plr == NULL ) return true; Creature* kilsorrow = plr->GetMapMgr()->GetInterface()->GetCreatureNearestCoords(plr->GetPositionX(), plr->GetPositionY() , plr->GetPositionZ()); if( kilsorrow == NULL || kilsorrow->isAlive() ) return true; QuestLogEntry *qle = plr->GetQuestLogForEntry(9927); if(qle && qle->GetMobCount(0) < qle->GetQuest()->required_mobcount[0]) { kilsorrow->Despawn(0, 60000); qle->SetMobCount(0, qle->GetMobCount(0)+1); qle->SendUpdateAddKill(0); qle->UpdatePlayerFields(); }; return true; }
bool ChatHandler::HandleStartCommand(const char* args, WorldSession *m_session) { Player* m_plyr = TO_PLAYER(getSelectedChar(m_session, false)); if( m_plyr == NULL) return false; uint32 raceid = m_plyr->getRace(); uint32 classid = m_plyr->getClass(); std::string argument = args; //No arguments given, get race from selected player if(m_plyr && args && strlen(args) < 2) { switch (raceid) { case 1: argument = "human"; break; case 2: argument = "orc"; break; case 3: argument = "dwarf"; break; case 4: argument = "nightelf"; break; case 5: argument = "undead"; break; case 6: argument = "tauren"; break; case 7: argument = "gnome"; break; case 8: argument = "troll"; break; case 10:argument = "bloodelf"; break; case 11:argument = "draenei"; break; default: { RedSystemMessage(m_session, "Could not extract race from slected character."); return true; } } } //Optional argument else if(m_plyr && args && strlen(args) > 2) { ASCENT_TOLOWER(argument); // Teleport to specific race if(argument == "human") raceid = 1; else if(argument == "orc") raceid = 2; else if(argument == "dwarf") raceid = 3; else if(argument == "nightelf") raceid = 4; else if(argument == "undead") raceid = 5; else if(argument == "tauren") raceid = 6; else if(argument == "gnome") raceid = 7; else if(argument == "troll") raceid = 8; else if(argument == "bloodelf") raceid = 10; else if(argument == "draenei") raceid = 11; else if(argument == "deathknight") classid = 6; else { RedSystemMessage(m_session, "Invalid start location! Valid locations are: human, dwarf, gnome, nightelf, draenei, orc, troll, tauren, undead, bloodelf"); return true; } } else return false; //GetPlayerCreateInfo PlayerCreateInfo *info = NULL; info = objmgr.GetPlayerCreateInfo(raceid, classid); if(info == NULL) { RedSystemMessage(m_session, "Internal error: Could not find create info."); return true; } GreenSystemMessage(m_session, "Telporting %s to %s starting location.", m_plyr->GetName(), argument.c_str()); m_session->GetPlayer()->SafeTeleport(info->mapId, 0, LocationVector(info->positionX, info->positionY, info->positionZ)); return true; }
void HonorHandler::OnPlayerKilled(Player* pPlayer, Player* pVictim) { if(pVictim->m_honorless) return; if(pPlayer->m_bg) { if(pVictim->m_bgTeam == pPlayer->m_bgTeam) return; // patch 2.4, players killed >50 times in battlegrounds won't be worth honor for the rest of that bg if(pVictim->m_bgScore.Deaths >= 50) return; } else { if(pPlayer->GetTeam() == pVictim->GetTeam()) return; } // Calculate points int32 Points = 0; if(pPlayer != pVictim) Points = CalculateHonorPointsForKill(pPlayer->getLevel(), pVictim->getLevel()); if(Points > 0) { if(pPlayer->m_bg) { // hackfix for battlegrounds (since the groups there are disabled, we need to do this manually) vector<Player*> toadd; uint32 t = pPlayer->m_bgTeam; toadd.reserve(15); // shouldn't have more than this pPlayer->m_bg->Lock(); set<Player*> * s = &pPlayer->m_bg->m_players[t]; for(set<Player*>::iterator itr = s->begin(); itr != s->end(); ++itr) { // Also check that the player is in range, and the player is alive. if((*itr) == pPlayer || ((*itr)->isAlive() && (*itr)->isInRange(pPlayer, 100.0f))) toadd.push_back(*itr); } if(toadd.size() > 0) { uint32 pts = Points / (uint32)toadd.size(); for(vector<Player*>::iterator vtr = toadd.begin(); vtr != toadd.end(); ++vtr) { AddHonorPointsToPlayer(*vtr, pts); (*vtr)->m_killsToday++; (*vtr)->m_killsLifetime++; pPlayer->m_bg->HookOnHK(*vtr); if(pVictim) { // Send PVP credit WorldPacket data(SMSG_PVP_CREDIT, 12); uint32 pvppoints = pts * 10; data << pvppoints << pVictim->GetGUID() << uint32(pVictim->GetPVPRank()); (*vtr)->GetSession()->SendPacket(&data); } } } pPlayer->m_bg->Unlock(); } else { set<Player*> contributors; // First loop: Get all the people in the attackermap. pVictim->UpdateOppFactionSet(); for(std::set<Object*>::iterator itr = pVictim->GetInRangeOppFactsSetBegin(); itr != pVictim->GetInRangeOppFactsSetEnd(); itr++) { if(!(*itr)->IsPlayer()) continue; bool added = false; Player* plr = TO_PLAYER(*itr); if(pVictim->CombatStatus.m_attackers.find(plr->GetGUID()) != pVictim->CombatStatus.m_attackers.end()) { added = true; contributors.insert(plr); } if(added && plr->GetGroup()) { Group* pGroup = plr->GetGroup(); uint32 groups = pGroup->GetSubGroupCount(); for(uint32 i = 0; i < groups; i++) { SubGroup* sg = pGroup->GetSubGroup(i); if(!sg) continue; for(GroupMembersSet::iterator itr2 = sg->GetGroupMembersBegin(); itr2 != sg->GetGroupMembersEnd(); itr2++) { PlayerInfo* pi = (*itr2); Player* gm = objmgr.GetPlayer(pi->guid); if(!gm) continue; if(gm->isInRange(pVictim, 100.0f)) contributors.insert(gm); } } } } for(set<Player*>::iterator itr = contributors.begin(); itr != contributors.end(); itr++) { Player* pAffectedPlayer = (*itr); if(!pAffectedPlayer) continue; pAffectedPlayer->m_killsToday++; pAffectedPlayer->m_killsLifetime++; if(pAffectedPlayer->m_bg) pAffectedPlayer->m_bg->HookOnHK(pAffectedPlayer); int32 contributorpts = Points / (int32)contributors.size(); AddHonorPointsToPlayer(pAffectedPlayer, contributorpts); sHookInterface.OnHonorableKill(pAffectedPlayer, pVictim); WorldPacket data(SMSG_PVP_CREDIT, 12); uint32 pvppoints = contributorpts * 10; // Why *10? data << pvppoints << pVictim->GetGUID() << uint32(pVictim->GetPVPRank()); pAffectedPlayer->GetSession()->SendPacket(&data); int PvPToken = 0; Config.OptionalConfig.GetInt("Extra", "PvPToken", &PvPToken); if(PvPToken > 0) { int PvPTokenID = 0; Config.OptionalConfig.GetInt("Extra", "PvPTokenID", &PvPTokenID); if(PvPTokenID > 0) { Item* PvPTokenItem = objmgr.CreateItem(PvPTokenID, pAffectedPlayer); if(PvPTokenItem) { PvPTokenItem->SoulBind(); pAffectedPlayer->GetItemInterface()->AddItemToFreeSlot(PvPTokenItem); } } } if(pAffectedPlayer->GetZoneId() == 3518) { // Add Halaa Battle Token SpellEntry* pvp_token_spell = dbcSpell.LookupEntry(pAffectedPlayer->IsTeamHorde() ? 33004 : 33005); pAffectedPlayer->CastSpell(pAffectedPlayer, pvp_token_spell, true); } // If we are in Hellfire Peninsula <http://www.wowwiki.com/Hellfire_Peninsula#World_PvP_-_Hellfire_Fortifications> if(pAffectedPlayer->GetZoneId() == 3483) { // Hellfire Horde Controlled Towers /*if(pAffectedPlayer->GetMapMgr()->GetWorldState(2478) != 3 && pAffectedPlayer->GetTeam() == 1) return; // Hellfire Alliance Controlled Towers if(pAffectedPlayer->GetMapMgr()->GetWorldState(2476) != 3 && pAffectedPlayer->GetTeam() == 0) return; */ // Add Mark of Thrallmar/Honor Hold SpellEntry* pvp_token_spell = dbcSpell.LookupEntry(pAffectedPlayer->IsTeamHorde() ? 32158 : 32155); pAffectedPlayer->CastSpell(pAffectedPlayer, pvp_token_spell, true); } } } } }
/// Spell Target Handling for type 45: Chain,!!only for healing!! for chain lightning =6 void Spell::SpellTargetChainTargeting(uint32 i, uint32 j) { if( !m_caster->IsInWorld() ) return; //if selected target is party member, then jumps on party Unit* firstTarget; bool PartyOnly = false; float range = GetMaxRange(dbcSpellRange.LookupEntry(m_spellInfo->rangeIndex));//this is probably wrong, //this is cast distance, not searching distance range *= range; firstTarget = m_caster->GetMapMgr()->GetPlayer((uint32)m_targets.m_unitTarget); if( firstTarget && p_caster != NULL ) { if( p_caster->InGroup() ) if( p_caster->GetSubGroup() == TO_PLAYER( firstTarget )->GetSubGroup() ) PartyOnly=true; } else { firstTarget = m_caster->GetMapMgr()->GetUnit(m_targets.m_unitTarget); if(!firstTarget) return; } uint32 jumps=m_spellInfo->EffectChainTarget[i]; if(m_spellInfo->SpellGroupType && u_caster) { SM_FIValue(u_caster->SM[SMT_ADDITIONAL_TARGET][0],(int32*)&jumps,m_spellInfo->SpellGroupType); } _AddTargetForced(firstTarget->GetGUID(), i); if(!jumps) return; jumps--; if(PartyOnly) { GroupMembersSet::iterator itr; SubGroup * pGroup = p_caster->GetGroup() ? p_caster->GetGroup()->GetSubGroup(p_caster->GetSubGroup()) : 0; if(pGroup) { p_caster->GetGroup()->Lock(); for(itr = pGroup->GetGroupMembersBegin(); itr != pGroup->GetGroupMembersEnd(); itr++) { if(!(*itr)->m_loggedInPlayer || (*itr)->m_loggedInPlayer == u_caster || (*itr)->m_loggedInPlayer->GetUInt32Value(UNIT_FIELD_HEALTH) == (*itr)->m_loggedInPlayer->GetUInt32Value(UNIT_FIELD_MAXHEALTH)) continue; if(IsInrange(u_caster->GetPositionX(),u_caster->GetPositionY(),u_caster->GetPositionZ(),(*itr)->m_loggedInPlayer, range)) { _AddTargetForced((*itr)->m_loggedInPlayer->GetGUID(), i); if(!--jumps) { p_caster->GetGroup()->Unlock(); return; } } } p_caster->GetGroup()->Unlock(); } }//find nearby friendly target else { unordered_set<Object*>::iterator itr; for( itr = firstTarget->GetInRangeSetBegin(); itr != firstTarget->GetInRangeSetEnd(); ++itr ) { if( !(*itr)->IsUnit() || !TO_UNIT(*itr)->isAlive()) continue; if(IsInrange(firstTarget->GetPositionX(),firstTarget->GetPositionY(),firstTarget->GetPositionZ(),*itr, range)) { if(!isAttackable(u_caster,TO_UNIT(*itr)) && (*itr)->GetUInt32Value(UNIT_FIELD_HEALTH) != (*itr)->GetUInt32Value(UNIT_FIELD_MAXHEALTH)) { _AddTargetForced((*itr)->GetGUID(), i); if(!--jumps) return; } } } } }
// A Lesson in Fear bool PlantForsakenBanner(uint32 i, Spell * pSpell) { if(pSpell->u_caster->IsPlayer() == false) return true; Player * pPlayer = TO_PLAYER(pSpell->u_caster); if( pPlayer == NULL ) return true; QuestLogEntry *pQuest = pPlayer->GetQuestLogForEntry(11282); if( pQuest == NULL ) return true; Creature * target = TO_CREATURE(pSpell->GetUnitTarget()); if (target == NULL) return true; float X = target->GetPositionX(); float Y = target->GetPositionY(); float Z = target->GetPositionZ(); uint32 cit = target->GetEntry(); switch(cit) { case 24161: { if( pQuest->GetMobCount( 0 ) < pQuest->GetQuest()->required_mobcount[ 0 ] ) { uint32 newcount = pQuest->GetMobCount( 0 ) + 1; pQuest->SetMobCount( 0, newcount ); pQuest->SendUpdateAddKill( 0 ); pQuest->UpdatePlayerFields(); target->Despawn(0, 3*60*1000); } } break; case 24016: { if( pQuest->GetMobCount( 0 ) < pQuest->GetQuest()->required_mobcount[ 1 ] ) { uint32 newcount = pQuest->GetMobCount( 0 ) + 1; pQuest->SetMobCount( 0, newcount ); pQuest->SendUpdateAddKill( 0 ); pQuest->UpdatePlayerFields(); target->Despawn(0, 3*60*1000); } } break; case 24162: { if( pQuest->GetMobCount( 0 ) < pQuest->GetQuest()->required_mobcount[ 2 ] ) { uint32 newcount = pQuest->GetMobCount( 0 ) + 1; pQuest->SetMobCount( 0, newcount ); pQuest->SendUpdateAddKill( 0 ); pQuest->UpdatePlayerFields(); target->Despawn(0, 3*60*1000); } } break; } return true; }
bool isHostile(Object* objA, Object* objB) // B is hostile for A? { bool hostile = false; // can't attack self.. this causes problems with buffs if we dont have it :p if(!objA || !objB || (objA == objB)) return false; // can't attack corpses neither... if(objA->GetTypeId() == TYPEID_CORPSE || objB->GetTypeId() == TYPEID_CORPSE) return false; if( objA->m_faction == NULL || objB->m_faction == NULL || objA->m_factionDBC == NULL || objB->m_factionDBC == NULL ) return true; uint32 faction = objB->m_faction->Mask; uint32 host = objA->m_faction->HostileMask; if(faction & host) hostile = true; // check friend/enemy list for(uint32 i = 0; i < 4; i++) { if(objA->m_faction->EnemyFactions[i] == objB->m_faction->Faction) { hostile = true; break; } if(objA->m_faction->FriendlyFactions[i] == objB->m_faction->Faction) { hostile = false; break; } } // PvP Flag System Checks // We check this after the normal isHostile test, that way if we're // on the opposite team we'll already know :p Player* player_objA = GetPlayerFromObject(objA); Player* player_objB = GetPlayerFromObject(objB); // BG or PVP? if( player_objA && player_objB ) { if( player_objA->m_bg != NULL ) { if( player_objA->m_bgTeam != player_objB->m_bgTeam ) return true; } if( hostile && player_objA->IsPvPFlagged()&& player_objB->IsPvPFlagged() ) return true; else return false; } // Reputation System Checks if(player_objA && !player_objB) // PvE { if(objB->m_factionDBC->RepListId >= 0) hostile = player_objA->IsHostileBasedOnReputation( objB->m_factionDBC ); } if(player_objB && !player_objA) // PvE { if(objA->m_factionDBC->RepListId >= 0) hostile = player_objB->IsHostileBasedOnReputation( objA->m_factionDBC ); } if( objA->IsPlayer() && objB->IsPlayer() && TO_PLAYER(objA)->m_bg != NULL ) { if( TO_PLAYER(objA)->m_bgTeam != TO_PLAYER(objB)->m_bgTeam ) return true; } return hostile; }
void Pet::CreateAsSummon(uint32 entry, CreatureInfo *ci, Creature* created_from_creature, Unit* owner, SpellEntry* created_by_spell, uint32 type, uint32 expiretime) { if(ci == NULL) return; SetIsPet(true); m_OwnerGuid = owner->GetGUID(); m_Owner = TO_PLAYER(owner); m_OwnerGuid = m_Owner->GetGUID(); creature_info = ci; myFamily = dbcCreatureFamily.LookupEntry(creature_info->Family); //m_name = objmgr.GetCreatureFamilyName(myFamily->ID); if( myFamily->name == NULL ) m_name = "Pet"; else m_name.assign( myFamily->name ); // Create ourself Create(m_name.c_str(), owner->GetMapId(), owner->GetPositionX(), owner->GetPositionY(), owner->GetPositionZ(), owner->GetOrientation()); SetUInt32Value(OBJECT_FIELD_ENTRY, entry); SetFloatValue(UNIT_MOD_CAST_SPEED, 1.0f); // better set this one // Fields common to both lock summons and pets uint32 level = (m_Owner->GetUInt32Value( UNIT_FIELD_LEVEL ) - 5); if( type & 0x2 && created_from_creature != NULL && created_from_creature->getLevel() > level) { level = created_from_creature->getLevel(); } SetUInt32Value(UNIT_FIELD_LEVEL, level); SetUInt32Value(UNIT_FIELD_DISPLAYID, ci->Male_DisplayID); SetUInt32Value(UNIT_FIELD_NATIVEDISPLAYID, ci->Male_DisplayID); SetSummonedByGUID(owner->GetGUID()); SetCreatedByGUID(owner->GetGUID()); if(type & 0x1 && created_by_spell != NULL) SetUInt64Value(UNIT_CREATED_BY_SPELL, created_by_spell->Id); if(type & 0x1 || created_from_creature == NULL) { Summon = true; SetUInt32Value(UNIT_FIELD_BYTES_0, 2048 | (0 << 24)); SetUInt32Value(UNIT_FIELD_FLAGS, UNIT_FLAG_PLAYER_CONTROLLED); SetUInt32Value(UNIT_FIELD_BASEATTACKTIME, 2000); SetUInt32Value(UNIT_FIELD_RANGEDATTACKTIME, 2000); SetFloatValue(UNIT_FIELD_BOUNDINGRADIUS, 0.5f); SetFloatValue(UNIT_FIELD_COMBATREACH, 0.75f); SetUInt32Value(UNIT_FIELD_BYTES_2, (0x01 | (0x2 << 24))); SetUInt32Value(UNIT_FIELD_PETNUMBER, GetUIdFromGUID()); SetPowerType(POWER_TYPE_MANA); if(entry == WATER_ELEMENTAL) m_name = "Water Elemental"; else if( entry == 19668) m_name = "Shadowfiend"; else m_name = sWorld.GenerateName(); } else { SetUInt32Value(UNIT_FIELD_BYTES_0, 2048 | (0 << 24)); SetUInt32Value(UNIT_FIELD_BASEATTACKTIME, 2000); SetUInt32Value(UNIT_FIELD_RANGEDATTACKTIME, 2000); // Supalosa: 2.00 normalized attack speed // hacks D: allow correct creation of hunter pets via gm command if(created_from_creature == this) { SetFloatValue(UNIT_FIELD_BOUNDINGRADIUS, 0.5f); SetFloatValue(UNIT_FIELD_COMBATREACH, 0.75f); } else { SetFloatValue(UNIT_FIELD_BOUNDINGRADIUS, created_from_creature->GetFloatValue(UNIT_FIELD_BOUNDINGRADIUS)); SetFloatValue(UNIT_FIELD_COMBATREACH, created_from_creature->GetFloatValue(UNIT_FIELD_COMBATREACH)); } // These need to be checked. SetUInt32Value(UNIT_FIELD_FLAGS, UNIT_FLAG_PLAYER_CONTROLLED | UNIT_FLAG_COMBAT); // why combat ?? SetHappiness(PET_HAPPINESS_UPDATE_VALUE >> 1); // happiness SetUInt32Value(UNIT_FIELD_MAXPOWER5, 1000000); SetUInt32Value(UNIT_FIELD_PETEXPERIENCE, 0); SetUInt32Value(UNIT_FIELD_PETNEXTLEVELEXP, GetNextLevelXP(getLevel())); SetUInt32Value(UNIT_FIELD_BYTES_1, 0); // Focus SetUInt32Value(UNIT_FIELD_POWER3, 100); SetUInt32Value(UNIT_FIELD_MAXPOWER3, 100); // 0x3 -> Enable pet rename. SetUInt32Value(UNIT_FIELD_BYTES_2, 1 | (0x3 << 16)); // Change the power type to FOCUS SetPowerType(POWER_TYPE_FOCUS); // create our spells SetDefaultSpells(); InitTalentsForLevel(true); } // Apply stats. ApplyStatsForLevel(); BaseDamage[0]=GetFloatValue(UNIT_FIELD_MINDAMAGE); BaseDamage[1]=GetFloatValue(UNIT_FIELD_MAXDAMAGE); BaseOffhandDamage[0]=GetFloatValue(UNIT_FIELD_MINOFFHANDDAMAGE); BaseOffhandDamage[1]=GetFloatValue(UNIT_FIELD_MAXOFFHANDDAMAGE); BaseRangedDamage[0]=GetFloatValue(UNIT_FIELD_MINRANGEDDAMAGE); BaseRangedDamage[1]=GetFloatValue(UNIT_FIELD_MAXRANGEDDAMAGE); SetUInt32Value(UNIT_FIELD_FACTIONTEMPLATE, owner->GetUInt32Value(UNIT_FIELD_FACTIONTEMPLATE)); m_PartySpellsUpdateTimer = 0; m_PetNumber = TO_PLAYER(owner)->GeneratePetNumber(); SetUInt32Value(UNIT_FIELD_PETNUMBER, GetUIdFromGUID()); m_ExpireTime = expiretime; bExpires = m_ExpireTime > 0 ? true : false; if(!bExpires) { // Create PlayerPet struct (Rest done by UpdatePetInfo) PlayerPet *pp = new PlayerPet; pp->number = m_PetNumber; pp->stablestate = STABLE_STATE_ACTIVE; TO_PLAYER(owner)->AddPlayerPet(pp, pp->number); } //maybe we should use speed from the template we created the creature ? m_base_runSpeed = m_runSpeed = owner->m_base_runSpeed; //should we be able to keep up with master ? m_base_walkSpeed = m_walkSpeed = owner->m_base_walkSpeed; //should we be able to keep up with master ? InitializeMe(true); }