From 9ab406c175f7f6a8035fbdfa7cd6535e9b145c2f Mon Sep 17 00:00:00 2001 From: mik1893 Date: Thu, 21 Jul 2016 19:39:49 +0100 Subject: [PATCH] Core/CrossFaction: riscrittura crossfaction eliminando collegamenti diretti su player - modulo a se stante, utilizza solo scripts --- .../src/server/game/AzthPlayer.cpp | 63 ------------------- .../azerothshard/src/server/game/AzthPlayer.h | 10 --- .../plugins/CrossFaction/CrossFaction.cpp | 57 +++++++++++++++-- src/server/game/Entities/Player/Player.cpp | 10 +-- src/server/game/Entities/Player/Player.h | 4 +- .../game/Handlers/BattleGroundHandler.cpp | 2 +- src/server/game/Scripting/ScriptMgr.cpp | 5 ++ src/server/game/Scripting/ScriptMgr.h | 4 ++ src/server/shared/Logging/Log.h | 1 + 9 files changed, 72 insertions(+), 84 deletions(-) diff --git a/modules/azerothshard/src/server/game/AzthPlayer.cpp b/modules/azerothshard/src/server/game/AzthPlayer.cpp index 2a20565b9f..628e1792e4 100644 --- a/modules/azerothshard/src/server/game/AzthPlayer.cpp +++ b/modules/azerothshard/src/server/game/AzthPlayer.cpp @@ -25,66 +25,3 @@ void AzthPlayer::setArena1v1Info(uint8 type, uint32 value) { float AzthPlayer::GetPlayerQuestRate() { return playerQuestRate; } - -uint32 AzthPlayer::getOriginalTeam() { - return player->TeamIdForRace(player->getRace()); -} - -bool AzthPlayer::setFactionForRace(uint8 race) { - - bool disable = true; - - CrossFaction *cf = sCrossFaction; - - // Check disables - if (cf->isMapEnabled(player->GetMapId()) && cf->isZoneEnabled(player->GetZoneId()) && cf->isAreaEnabled(player->GetAreaId())) - disable = false; - else - { - player->Whisper("Quest'area ha il crossfaction disabilitato", LANG_UNIVERSAL, player->GetGUID()); - sLog->outError("Crossfaction disabled for player %s", player->GetName().c_str()); - return false; - } - - if (player->InBattleground()) { - if (Battleground * bg = player->GetBattleground()) { - player->m_team = player->GetBgTeamId(); - - player->setFaction(player->m_team == TEAM_ALLIANCE ? 1 : 2); - - //sLog->outError("Team %d , faction %d, bgteam %d", player->m_team,player->getFaction(), player->m_bgData.bgTeamId); - - return true; - } - } - - uint64 leaderGuid = player->GetGroup() ? player->GetGroup()->GetLeaderGUID() : player->GetGUID(); - if (leaderGuid != player->GetGUID()) { - Player* leader = ObjectAccessor::FindPlayer(leaderGuid); - - if (leader) { - player->m_team = leader->GetTeamId(); - player->setFaction(leader->getFaction()); - } else { - // Query informations from the DB - PreparedStatement* stmt = CharacterDatabase.GetPreparedStatement(CHAR_SEL_CHAR_PINFO); - stmt->setUInt32(0, GUID_LOPART(leaderGuid)); - PreparedQueryResult result = CharacterDatabase.Query(stmt); - - if (!result) - return false; - - Field* fields = result->Fetch(); - uint8 raceid = fields[4].GetUInt8(); - - player->m_team = Player::TeamIdForRace(raceid); - - ChrRacesEntry const* rEntry = sChrRacesStore.LookupEntry(raceid); - player->setFaction(rEntry ? rEntry->FactionID : 0); - } - - return true; - } - - return false; -} diff --git a/modules/azerothshard/src/server/game/AzthPlayer.h b/modules/azerothshard/src/server/game/AzthPlayer.h index 1147cf4a8b..f32539a11e 100644 --- a/modules/azerothshard/src/server/game/AzthPlayer.h +++ b/modules/azerothshard/src/server/game/AzthPlayer.h @@ -23,16 +23,6 @@ class AzthPlayer { */ float GetPlayerQuestRate(); - /** - - Get Player team considering CrossFactionGroups: If player is in a group returns group leader's team - - @param Unit race (Unused, kept for compatibility) - @returns Group leader team if player is in a group, -1 for default - */ - bool setFactionForRace(uint8 race); - uint32 getOriginalTeam(); - uint32 getArena1v1Info(uint8 type); void setArena1v1Info(uint8 type, uint32 value); diff --git a/modules/azerothshard/src/server/plugins/CrossFaction/CrossFaction.cpp b/modules/azerothshard/src/server/plugins/CrossFaction/CrossFaction.cpp index 2e14517cf0..4597cc6998 100644 --- a/modules/azerothshard/src/server/plugins/CrossFaction/CrossFaction.cpp +++ b/modules/azerothshard/src/server/plugins/CrossFaction/CrossFaction.cpp @@ -1,5 +1,5 @@ // Copyright (c) 2016 AzerothCore -// Author: mik1893 +// Author: mik1893 - kepler - yehonal // // This software is provided 'as-is', without any express or implied // warranty. In no event will the authors be held liable for any damages @@ -7,15 +7,59 @@ #include "CrossFaction.h" - // Crossfaction class functionalities void CrossFaction::UpdatePlayerTeam(Group* group, uint64 guid, bool reset /* = false */) { Player* player = ObjectAccessor::FindPlayer(guid); + if (player) { - player->setFactionForRace(player->getRace()); - } + bool disable = true; + + // Per prima cosa, controllo i disable + if (isMapEnabled(player->GetMapId()) && isZoneEnabled(player->GetZoneId()) && isAreaEnabled(player->GetAreaId())) + disable = false; + else + { + // messaggio al player in caso di crossfaction disabilitato in una specifica area, cosi lo sa prima di lamentarsi e scassarmi la minchia + player->Whisper("Quest'area ha il crossfaction disabilitato", LANG_UNIVERSAL, player->GetGUID()); + sLog->outDebug(LOG_FILTER_CROSSFACTION, "Crossfaction: disabled for player %s", player->GetName().c_str()); + } + + // se non e' un reset forzato oppure na zona disabilitata, eseguo la routine di cambio + if (!reset && !disable) + { + // Se sono in battleground applico la fazione relativa al battleground + if (player->InBattleground()) + { + if (Battleground * bg = player->GetBattleground()) + { + player->setTeamId(player->GetBgTeamId()); + player->setFaction(player->GetTeamId() == TEAM_ALLIANCE ? 1 : 2); + sLog->outDebug(LOG_FILTER_CROSSFACTION, "Crossfaction: Battleground team id set for player %s", player->GetName().c_str()); + return; + } + } + + // Se sono in un nomrale gruppo, applico la fazione relativa al leader + uint64 leaderGuid = group ? group->GetLeaderGUID() : player->GetGUID(); + if (leaderGuid != player->GetGUID()) + if (Player* leader = ObjectAccessor::FindPlayer(leaderGuid)) + { + player->setTeamId(leader->GetTeamId()); + player->setFaction(leader->getFaction()); + return; + } + } + + // TUTTI GLI ALTRI CASI: RESET DELLA FAZIONE ALL ORIGINALE + // Se reset forzato oppure zona disabilitata, va messa la fazione originale del player, qualunque cosa succeda. + // LA RAZZA NON VIENE MAI MODIFICATA UNA VOLTA LOGGATI - SI PUO USARE PER TORNARE AL PUNTO DI PARTENZA + + player->setTeamId(player->GetTeamId(true)); + ChrRacesEntry const* rEntry = sChrRacesStore.LookupEntry(player->getRace()); + player->setFaction(rEntry ? rEntry->FactionID : 0); + sLog->outDebug(LOG_FILTER_CROSSFACTION, "Crossfaction: reset done for player %s", player->GetName().c_str()); } void CrossFaction::LoadConfig(bool reload) @@ -127,6 +171,11 @@ public: { sCrossFaction->UpdatePlayerTeam(player->GetGroup(), player->GetGUID()); } + + void OnUpdateFaction(Player *player) override + { + sCrossFaction->UpdatePlayerTeam(player->GetGroup(), player->GetGUID()); + } }; class CrossFactionWorld : public WorldScript diff --git a/src/server/game/Entities/Player/Player.cpp b/src/server/game/Entities/Player/Player.cpp index 92e9d4344f..e3f54d9242 100644 --- a/src/server/game/Entities/Player/Player.cpp +++ b/src/server/game/Entities/Player/Player.cpp @@ -6935,10 +6935,10 @@ void Player::setFactionForRace(uint8 race) { m_team = TeamIdForRace(race); - // [AZTH] Kepler: Inject AzthPlayer's team function to get team from group leader in CrossFactionGroups - if (azthPlayer->setFactionForRace(race)) + sScriptMgr->OnPlayerUpdateFaction(this); + + if (GetTeamId(true) != GetTeamId()) return; - // [/AZTH] ChrRacesEntry const* rEntry = sChrRacesStore.LookupEntry(race); setFaction(rEntry ? rEntry->FactionID : 0); @@ -12228,10 +12228,10 @@ InventoryResult Player::CanUseItem(ItemTemplate const* proto) const if (proto) { - if ((proto->Flags2 & ITEM_FLAGS_EXTRA_HORDE_ONLY) && /*[AZTH]*/ azthPlayer->getOriginalTeam() != TEAM_HORDE) + if ((proto->Flags2 & ITEM_FLAGS_EXTRA_HORDE_ONLY) && GetTeamId(true) != TEAM_HORDE) return EQUIP_ERR_YOU_CAN_NEVER_USE_THAT_ITEM; - if ((proto->Flags2 & ITEM_FLAGS_EXTRA_ALLIANCE_ONLY) && /*[AZTH]*/ azthPlayer->getOriginalTeam() != TEAM_ALLIANCE) + if ((proto->Flags2 & ITEM_FLAGS_EXTRA_ALLIANCE_ONLY) && GetTeamId(true) != TEAM_ALLIANCE) return EQUIP_ERR_YOU_CAN_NEVER_USE_THAT_ITEM; if ((proto->AllowableClass & getClassMask()) == 0 || (proto->AllowableRace & getRaceMask()) == 0) diff --git a/src/server/game/Entities/Player/Player.h b/src/server/game/Entities/Player/Player.h index 9162e03388..618462c951 100644 --- a/src/server/game/Entities/Player/Player.h +++ b/src/server/game/Entities/Player/Player.h @@ -2126,8 +2126,10 @@ class Player : public Unit, public GridObject void CheckAreaExploreAndOutdoor(void); static TeamId TeamIdForRace(uint8 race); - TeamId GetTeamId() const { return m_team; } + TeamId GetTeamId(bool original = false) const { return original ? m_team : TeamIdForRace(getRace()); }; + void setFactionForRace(uint8 race); + void setTeamId(TeamId teamid) { m_team = teamid; }; void InitDisplayIds(); diff --git a/src/server/game/Handlers/BattleGroundHandler.cpp b/src/server/game/Handlers/BattleGroundHandler.cpp index 84610cdeae..94fc651562 100644 --- a/src/server/game/Handlers/BattleGroundHandler.cpp +++ b/src/server/game/Handlers/BattleGroundHandler.cpp @@ -437,7 +437,7 @@ void WorldSession::HandleBattleFieldPortOpcode(WorldPacket &recvData) //[AZTH] TeamId teamId = ginfo.teamId; if (bgTypeId == BATTLEGROUND_RB) { - teamId = _player->azthPlayer->getOriginalTeam() == TEAM_ALLIANCE ? TEAM_HORDE : TEAM_ALLIANCE; + teamId = _player->GetTeamId(true) == TEAM_ALLIANCE ? TEAM_HORDE : TEAM_ALLIANCE; } //[/AZTH] // remove player from all bg queues diff --git a/src/server/game/Scripting/ScriptMgr.cpp b/src/server/game/Scripting/ScriptMgr.cpp index e6be69d1a8..1def3f7ba4 100644 --- a/src/server/game/Scripting/ScriptMgr.cpp +++ b/src/server/game/Scripting/ScriptMgr.cpp @@ -1183,6 +1183,11 @@ void ScriptMgr::OnPlayerUpdateZone(Player* player, uint32 newZone, uint32 newAre FOREACH_SCRIPT(PlayerScript)->OnUpdateZone(player, newZone, newArea); } +void ScriptMgr::OnPlayerUpdateFaction(Player* player) +{ + FOREACH_SCRIPT(PlayerScript)->OnUpdateFaction(player); +} + // [AZTH] all custom PlayerScript functions void ScriptMgr::OnPlayerRemoveFromBattleground(Player* player, Battleground* bg) { diff --git a/src/server/game/Scripting/ScriptMgr.h b/src/server/game/Scripting/ScriptMgr.h index 0467824608..04fc8b487d 100644 --- a/src/server/game/Scripting/ScriptMgr.h +++ b/src/server/game/Scripting/ScriptMgr.h @@ -710,6 +710,9 @@ class PlayerScript : public ScriptObject // Called when a player changes to a new map (after moving to new map) virtual void OnMapChanged(Player* /*player*/) { } + // Called when a player switches to a new zone + virtual void OnUpdateFaction(Player* /*player*/) { } + //[AZTH] // Called when a player is removed from battleground virtual void OnPlayerRemoveFromBattleground(Player* /*player*/, Battleground* /*bg*/) { } @@ -985,6 +988,7 @@ class ScriptMgr void OnPlayerDelete(uint64 guid); void OnPlayerBindToInstance(Player* player, Difficulty difficulty, uint32 mapid, bool permanent); void OnPlayerUpdateZone(Player* player, uint32 newZone, uint32 newArea); + void OnPlayerUpdateFaction(Player* player); // [AZTH] all custom PlayerScript functions void OnPlayerRemoveFromBattleground(Player* player, Battleground* bg); void OnAchievementComplete(Player *player, AchievementEntry const* achievement); diff --git a/src/server/shared/Logging/Log.h b/src/server/shared/Logging/Log.h index 9e360553a7..22755bbabb 100644 --- a/src/server/shared/Logging/Log.h +++ b/src/server/shared/Logging/Log.h @@ -54,6 +54,7 @@ enum DebugLogFilters LOG_FILTER_BATTLEFIELD = 0x01000000, // Battlefield related LOG_FILTER_TRANSMOG = 0x02000000, // Transmog debug LOG_FILTER_GUILDHOUSE = 0x04000000, // Guildhouse debug + LOG_FILTER_CROSSFACTION = 0x04000000, // CrossFaction }; enum LogTypes