Open urwifemykids opened 2 weeks ago
Note to self: create a branch and change target branch
Sorry for my ignorance but im not sure what your saying hahaah
Is the original faction ever restored ?
It doesnt... I forgot about that meh
imho this must be merged into main project.
enum MiscCrossFactionPVE { ZONE_ICECROWN_CITADEL = 4812, ICC_MAP_ID = 631, ZONE_TRIAL_OF_THE_CHAMPION = 4723, TOCHAMPION_MAP_ID = 650, ZONE_TRIAL_OF_THE_CRUSADER = 4722, TOCRUSADER_MAP_ID = 649, ZONE_PIT_OF_SARON = 4813, POS_MAP_ID = 658, ZONE_HALLS_OF_REFLECTION = 4820, HOR_MAP_ID = 668, ZONE_FORGE_OF_SOULS = 4809, FOS_MAP_ID = 632, ZONE_HALLS_OF_STONE = 4264, HOS_MAP_ID = 599, ZONE_THE_NEXUS = 4265, TN_MAP_ID = 576, ZONE_WARSONG_GULCH = 3277, WSG_MAP_ID = 489, ZONE_ARATHI_BASIN = 3358, AB_MAP_ID = 529 };
class CfPlayerScript : public PlayerScript { public: CfPlayerScript() : PlayerScript("CfPlayerScript") {}
// Called when a player enters the world (logs in or teleports)
void OnLogin(Player* player, bool firstLogin) override
{
HandleFactionChange(player, player->GetMapId());
}
// Called when a player changes zones
void OnUpdateZone(Player* player, uint32 newZone, uint32 /*newArea*/) override
{
HandleFactionChange(player, newZone);
}
private: // Store the original faction in a map std::unordered_map<uint64, uint32> originalFactionMap;
void HandleFactionChange(Player* player, uint32 zoneOrMapId)
{
static const std::set<uint32> zoneSet = {
ICC_MAP_ID, TOCHAMPION_MAP_ID, TOCRUSADER_MAP_ID, POS_MAP_ID,
HOR_MAP_ID, FOS_MAP_ID, HOS_MAP_ID, TN_MAP_ID, WSG_MAP_ID, AB_MAP_ID
};
if (zoneSet.count(zoneOrMapId))
{
// Change faction to match the group leader
if (Group* group = player->GetGroup())
{
if (Player* leader = ObjectAccessor::FindPlayer(group->GetLeaderGUID()))
{
if (originalFactionMap.find(player->GetGUID()) == originalFactionMap.end())
{
// Store the original faction
originalFactionMap[player->GetGUID()] = player->GetFaction();
}
player->SetFaction(leader->GetFaction());
}
}
}
else
{
// Restore player's original faction
auto it = originalFactionMap.find(player->GetGUID());
if (it != originalFactionMap.end())
{
player->SetFaction(it->second);
originalFactionMap.erase(it); // Clean up the map after restoring
}
}
}
};
void AddSC_cfpve() { new CfPlayerScript(); }
This is the best I can do for now, if someone wants to help i will accept it, just trying to contribute the best I can, I have added the function to reset faction
You added the same file twice.
Guys, seeing that it has BG areas such as Warsong Gulch and Arathi Basin, would this be suitable for a Crossfaction Battlegrounds?
Target Branch(es): 335
Issues Addressed: This update addresses issues related to PVE content when cross-faction configurations are enabled. Specifically, it resolves problems encountered when cross-faction groups participate in dungeons or raids with faction-specific mechanics or creature flags.
Example: In the Icecrown Citadel (ICC) raid, the first player to enter the raid determines the faction alignment for the raid. This can lead to complications such as:
The Gunship Battle becoming problematic, as the enemy faction won't be able to use the cannons. Mobs that should be friendly becoming enemies and vice versa. This script ensures that all players have a hidden faction mask that matches the raid leader’s faction. This change prevents faction-related issues during PVE encounters. The script can be extended to handle additional PVE encounters or battlegrounds, which is useful if using NPC bots.
Tests Performed: The script has been tested and functions as intended.