TrinityCore / TrinityCoreCustomChanges

TrinityCore 3.3.5a custom patches, read wiki to get diffs
https://github.com/TrinityCore/TrinityCoreCustomChanges/wiki
GNU General Public License v2.0
72 stars 59 forks source link

added cfpve.cpp #143

Open urwifemykids opened 2 weeks ago

urwifemykids commented 2 weeks ago

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.

jackpoz commented 2 weeks ago

Note to self: create a branch and change target branch

urwifemykids commented 2 weeks ago

Sorry for my ignorance but im not sure what your saying hahaah

jackpoz commented 2 weeks ago

Is the original faction ever restored ?

urwifemykids commented 2 weeks ago

It doesnt... I forgot about that meh

Aokromes commented 2 weeks ago

imho this must be merged into main project.

urwifemykids commented 2 weeks ago

include "ScriptMgr.h"

include "Player.h"

include "Group.h"

include "ObjectAccessor.h"

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(); }

urwifemykids commented 2 weeks ago

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

jackpoz commented 2 weeks ago

You added the same file twice.

d3athbl0w commented 2 days ago

Guys, seeing that it has BG areas such as Warsong Gulch and Arathi Basin, would this be suitable for a Crossfaction Battlegrounds?