void HonorHandler::OnPlayerKilledUnit(Player *pPlayer, Unit* pVictim) { if(!pVictim) pVictim = pPlayer; if(!pVictim) return; if(pVictim && !pVictim->IsPlayer()) return; // Calculate points int32 Points = CalculateHonorPointsForKill(pPlayer, pVictim); if(Points > 0) { pPlayer->m_killsToday++; pPlayer->m_killsLifetime++; AddHonorPointsToPlayer(pPlayer, Points); // Send PVP credit WorldPacket data(SMSG_PVP_CREDIT, 12); uint32 pvppoints = Points * 10; data << pvppoints << pVictim->GetGUID() << uint32(static_cast<Player*>(pVictim)->GetPVPRank()); pPlayer->GetSession()->SendPacket(&data); } }
void HonorHandler::OnPlayerKilledUnit( Player *pPlayer, Unit* pVictim ) { if( pVictim == NULL || pPlayer == NULL ) return; if( pPlayer->GetTypeId() != TYPEID_PLAYER || !pVictim->IsUnit() ) return; if( !pVictim->IsPlayer() || static_cast< Player* >( pVictim )->m_honorless ) return; if( pVictim->IsPlayer() ) { if( pPlayer->m_bg ) { if( static_cast< Player* >( 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( static_cast<Player*>(pVictim)->m_bgScore.Deaths >= 50 ) return; } else { if( pPlayer->GetTeam() == static_cast< Player* >( pVictim )->GetTeam() ) return; } } // Calculate points int32 Points = 0; if(pVictim->IsPlayer() && 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(static_cast< Player* >(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 = (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); if(pVictim->IsPlayer()) { sHookInterface.OnHonorableKill(pAffectedPlayer, (Player*)pVictim); WorldPacket data(SMSG_PVP_CREDIT, 12); uint32 pvppoints = contributorpts * 10; // Why *10? data << pvppoints << pVictim->GetGUID() << uint32(static_cast< Player* >(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->GetTeam()? 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->GetTeam()? 32158 : 32155); pAffectedPlayer->CastSpell(pAffectedPlayer, pvp_token_spell, true); } } } } }
void HonorHandler::OnPlayerKilledUnit( PlayerPointer pPlayer, UnitPointer pVictim ) { if( pVictim == NULL || pPlayer == NULL || !pVictim->IsPlayer() || !pPlayer->IsPlayer() ) return; if( TO_PLAYER( pVictim )->m_honorless ) return; if( pVictim->IsPlayer() ) { if( pPlayer->m_bg ) { if( TO_PLAYER( 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( TO_PLAYER(pVictim)->m_bgScore.Deaths >= 50 ) return; } else { if( pPlayer->GetTeam() == TO_PLAYER( pVictim )->GetTeam() ) return; } } // Calculate points int32 Points = CalculateHonorPointsForKill(pPlayer, pVictim); if( Points > 0 ) { if( pPlayer->m_bg ) { // hackfix for battlegrounds (since the gorups there are disabled, we need to do this manually) vector<PlayerPointer > toadd; uint32 t = pPlayer->m_bgTeam; toadd.reserve(15); // shouldnt have more than this pPlayer->m_bg->Lock(); set<PlayerPointer > * s = &pPlayer->m_bg->m_players[t]; for(set<PlayerPointer >::iterator itr = s->begin(); itr != s->end(); ++itr) { if((*itr) == pPlayer || (*itr)->isInRange(pPlayer,40.0f)) toadd.push_back(*itr); } if( toadd.size() > 0 ) { uint32 pts = Points / (uint32)toadd.size(); for(vector<PlayerPointer >::iterator vtr = toadd.begin(); vtr != toadd.end(); ++vtr) { AddHonorPointsToPlayer(*vtr, pts); (*vtr)->GetAchievementInterface()->HandleAchievementCriteriaHonorableKill(); (*vtr)->GetAchievementInterface()->HandleAchievementCriteriaHonorableKillClass( pVictim->getClass() ); (*vtr)->GetAchievementInterface()->HandleAchievementCriteriaHonorableKillRace( pVictim->getRace() ); (*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(TO_PLAYER(pVictim)->GetPVPRank()); (*vtr)->GetSession()->SendPacket(&data); } } } pPlayer->m_bg->Unlock(); } else if(pPlayer->GetGroup()) { Group *pGroup = pPlayer->GetGroup(); PlayerPointer gPlayer = NULLPLR; int32 GroupPoints; pGroup->Lock(); GroupPoints = (Points / (pGroup->MemberCount() ? pGroup->MemberCount() : 1)); GroupMembersSet::iterator gitr; for(uint32 k = 0; k < pGroup->GetSubGroupCount(); k++) { for(gitr = pGroup->GetSubGroup(k)->GetGroupMembersBegin(); gitr != pGroup->GetSubGroup(k)->GetGroupMembersEnd(); ++gitr) { gPlayer = (*gitr)->m_loggedInPlayer; if(gPlayer && (gPlayer == pPlayer || gPlayer->isInRange(pPlayer,100.0f))) // visible range { gPlayer->GetAchievementInterface()->HandleAchievementCriteriaHonorableKill(); gPlayer->GetAchievementInterface()->HandleAchievementCriteriaHonorableKillClass( pVictim->getClass() ); gPlayer->GetAchievementInterface()->HandleAchievementCriteriaHonorableKillRace( pVictim->getRace() ); gPlayer->m_killsToday++; gPlayer->m_killsLifetime++; if(gPlayer->m_bg) gPlayer->m_bg->HookOnHK(gPlayer); sHookInterface.OnHonorableKill(gPlayer, TO_PLAYER(pVictim)); AddHonorPointsToPlayer(gPlayer, GroupPoints); if(pVictim) { // Send PVP credit WorldPacket data(SMSG_PVP_CREDIT, 12); uint32 pvppoints = GroupPoints * 10; data << pvppoints << pVictim->GetGUID() << uint32(TO_PLAYER(pVictim)->GetPVPRank()); gPlayer->GetSession()->SendPacket(&data); } //patch by emsy // If we are in Halaa if(pPlayer->GetZoneId() == 3518) { // Add Halaa Battle Token SpellEntry * pvp_token_spell = dbcSpell.LookupEntry(gPlayer->GetTeam()? 33004 : 33005); gPlayer->CastSpell(gPlayer, pvp_token_spell, true); } // If we are in Hellfire Peninsula if(pPlayer->GetZoneId() == 3483) { // Add Mark of Thrallmar/Honor Hold SpellEntry * pvp_token_spell = dbcSpell.LookupEntry(gPlayer->GetTeam()? 32158 : 32155); gPlayer->CastSpell(gPlayer, pvp_token_spell, true); } } } } pGroup->Unlock(); } else { pPlayer->GetAchievementInterface()->HandleAchievementCriteriaHonorableKill(); pPlayer->GetAchievementInterface()->HandleAchievementCriteriaHonorableKillClass( pVictim->getClass() ); pPlayer->GetAchievementInterface()->HandleAchievementCriteriaHonorableKillRace( pVictim->getRace() ); pPlayer->m_killsToday++; pPlayer->m_killsLifetime++; AddHonorPointsToPlayer(pPlayer, Points); if(pPlayer->m_bg) pPlayer->m_bg->HookOnHK(pPlayer); sHookInterface.OnHonorableKill(pPlayer, TO_PLAYER(pVictim)); if(pVictim) { // Send PVP credit WorldPacket data(SMSG_PVP_CREDIT, 12); uint32 pvppoints = Points * 10; data << pvppoints << pVictim->GetGUID() << uint32(TO_PLAYER(pVictim)->GetPVPRank()); pPlayer->GetSession()->SendPacket(&data); } //patch by emsy // If we are in Halaa if(pPlayer->GetZoneId() == 3518) { // Add Halaa Battle Token SpellEntry * halaa_spell = dbcSpell.LookupEntry(pPlayer->GetTeam()? 33004 : 33005); pPlayer->CastSpell(pPlayer, halaa_spell, true); } } } }