TrinityCoreCustomChanges icon indicating copy to clipboard operation
TrinityCoreCustomChanges copied to clipboard

added cfpve.cpp

Open urwifemykids opened this issue 1 year ago • 10 comments

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.

urwifemykids avatar Sep 14 '24 20:09 urwifemykids

Note to self: create a branch and change target branch

jackpoz avatar Sep 14 '24 20:09 jackpoz

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

urwifemykids avatar Sep 14 '24 20:09 urwifemykids

Is the original faction ever restored ?

jackpoz avatar Sep 14 '24 20:09 jackpoz

It doesnt... I forgot about that meh

urwifemykids avatar Sep 14 '24 20:09 urwifemykids

imho this must be merged into main project.

Aokromes avatar Sep 14 '24 20:09 Aokromes

#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 avatar Sep 14 '24 20:09 urwifemykids

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

urwifemykids avatar Sep 14 '24 21:09 urwifemykids

You added the same file twice.

jackpoz avatar Sep 16 '24 17:09 jackpoz

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

d3athbl0w avatar Oct 02 '24 06:10 d3athbl0w

You can simply just do this to restore to player's original faction without storing it player->RestoreFaction();

You also need to consider pet's faction

// set
if (Pet* pet = player->GetPet())
    pet->SetFaction(leader->GetFaction());
// restore
if (Pet* pet = player->GetPet())
    pet->SetFaction(player->GetFaction());

If I were you, I will use GetTeamIdInInstance() to play with faction setup instead

ckegg avatar Oct 21 '24 03:10 ckegg