mirror of
https://github.com/mod-playerbots/azerothcore-wotlk.git
synced 2026-02-04 11:33:48 +00:00
feat(Core/Script): Hooks for custom arena teams/types (#3508)
This commit is contained in:
@@ -13,7 +13,7 @@
|
||||
#include "Player.h"
|
||||
#include "WorldSession.h"
|
||||
#include "Opcodes.h"
|
||||
#include <Config.h>
|
||||
#include "ScriptMgr.h"
|
||||
|
||||
ArenaTeam::ArenaTeam()
|
||||
: TeamId(0), Type(0), TeamName(), CaptainGuid(0), BackgroundColor(0), EmblemStyle(0), EmblemColor(0),
|
||||
@@ -473,7 +473,7 @@ void ArenaTeam::NotifyStatsChanged()
|
||||
void ArenaTeam::Inspect(WorldSession* session, uint64 guid)
|
||||
{
|
||||
ArenaTeamMember* member = GetMember(guid);
|
||||
if (!member)
|
||||
if (!member || GetSlot() >= MAX_ARENA_SLOT)
|
||||
return;
|
||||
|
||||
WorldPacket data(MSG_INSPECT_ARENA_TEAMS, 8 + 1 + 4 * 6);
|
||||
@@ -495,7 +495,7 @@ void ArenaTeamMember::ModifyPersonalRating(Player* player, int32 mod, uint32 typ
|
||||
else
|
||||
PersonalRating += mod;
|
||||
|
||||
if (player)
|
||||
if (player && ArenaTeam::GetSlotByType(type) < 3)
|
||||
{
|
||||
player->SetArenaTeamInfoField(ArenaTeam::GetSlotByType(type), ARENA_TEAM_PERSONAL_RATING, PersonalRating);
|
||||
player->UpdateAchievementCriteria(ACHIEVEMENT_CRITERIA_TYPE_HIGHEST_PERSONAL_RATING, PersonalRating, type);
|
||||
@@ -579,17 +579,28 @@ void ArenaTeam::MassInviteToEvent(WorldSession* session)
|
||||
|
||||
uint8 ArenaTeam::GetSlotByType(uint32 type)
|
||||
{
|
||||
uint8 slot = 0xFF;
|
||||
switch (type)
|
||||
{
|
||||
case ARENA_TEAM_2v2:
|
||||
return 0;
|
||||
slot = 0;
|
||||
break;
|
||||
case ARENA_TEAM_3v3:
|
||||
return 1;
|
||||
slot = 1;
|
||||
break;
|
||||
case ARENA_TEAM_5v5:
|
||||
return 2;
|
||||
slot = 2;
|
||||
break;
|
||||
default:
|
||||
break;
|
||||
}
|
||||
//Get the changed slot type
|
||||
sScriptMgr->OnGetSlotByType(type, slot);
|
||||
|
||||
if (slot != 0xFF)
|
||||
{
|
||||
return slot;
|
||||
}
|
||||
sLog->outError("FATAL: Unknown arena team type %u for some arena team", type);
|
||||
return 0xFF;
|
||||
}
|
||||
@@ -626,6 +637,8 @@ uint32 ArenaTeam::GetPoints(uint32 memberRating)
|
||||
else if (Type == ARENA_TEAM_3v3)
|
||||
points *= 0.88f;
|
||||
|
||||
sScriptMgr->OnGetArenaPoints(this, points);
|
||||
|
||||
points *= sWorld->getRate(RATE_ARENA_POINTS);
|
||||
|
||||
return (uint32) points;
|
||||
|
||||
@@ -51,7 +51,30 @@ ArenaTeam* ArenaTeamMgr::GetArenaTeamByName(const std::string& arenaTeamName) co
|
||||
std::string teamName = itr->second->GetName();
|
||||
std::transform(teamName.begin(), teamName.end(), teamName.begin(), ::toupper);
|
||||
if (search == teamName)
|
||||
{
|
||||
return itr->second;
|
||||
}
|
||||
}
|
||||
return nullptr;
|
||||
}
|
||||
|
||||
|
||||
ArenaTeam* ArenaTeamMgr::GetArenaTeamByName(std::string const& arenaTeamName, const uint32 type) const
|
||||
{
|
||||
std::string search = arenaTeamName;
|
||||
std::transform(search.begin(), search.end(), search.begin(), ::toupper);
|
||||
for (auto itr = ArenaTeamStore.begin(); itr != ArenaTeamStore.end(); ++itr)
|
||||
{
|
||||
if (itr->second->GetType() != type)
|
||||
{
|
||||
continue;
|
||||
}
|
||||
std::string teamName = itr->second->GetName();
|
||||
std::transform(teamName.begin(), teamName.end(), teamName.begin(), ::toupper);
|
||||
if (search == teamName)
|
||||
{
|
||||
return itr->second;
|
||||
}
|
||||
}
|
||||
return nullptr;
|
||||
}
|
||||
@@ -59,9 +82,25 @@ ArenaTeam* ArenaTeamMgr::GetArenaTeamByName(const std::string& arenaTeamName) co
|
||||
ArenaTeam* ArenaTeamMgr::GetArenaTeamByCaptain(uint64 guid) const
|
||||
{
|
||||
for (ArenaTeamContainer::const_iterator itr = ArenaTeamStore.begin(); itr != ArenaTeamStore.end(); ++itr)
|
||||
{
|
||||
if (itr->second->GetCaptain() == guid)
|
||||
{
|
||||
return itr->second;
|
||||
}
|
||||
}
|
||||
return nullptr;
|
||||
}
|
||||
|
||||
|
||||
ArenaTeam* ArenaTeamMgr::GetArenaTeamByCaptain(uint64 guid, const uint32 type) const
|
||||
{
|
||||
for (ArenaTeamContainer::const_iterator itr = ArenaTeamStore.begin(); itr != ArenaTeamStore.end(); ++itr)
|
||||
{
|
||||
if (itr->second->GetCaptain() == guid && itr->second->GetType() == type)
|
||||
{
|
||||
return itr->second;
|
||||
}
|
||||
}
|
||||
return nullptr;
|
||||
}
|
||||
|
||||
|
||||
@@ -22,6 +22,8 @@ public:
|
||||
ArenaTeam* GetArenaTeamById(uint32 arenaTeamId) const;
|
||||
ArenaTeam* GetArenaTeamByName(std::string const& arenaTeamName) const;
|
||||
ArenaTeam* GetArenaTeamByCaptain(uint64 guid) const;
|
||||
ArenaTeam* GetArenaTeamByName(std::string const& arenaTeamName, const uint32 type) const;
|
||||
ArenaTeam* GetArenaTeamByCaptain(uint64 guid, const uint32 type) const;
|
||||
|
||||
void LoadArenaTeams();
|
||||
void AddArenaTeam(ArenaTeam* arenaTeam);
|
||||
|
||||
@@ -482,7 +482,7 @@ Battleground* BattlegroundMgr::CreateNewBattleground(BattlegroundTypeId original
|
||||
maxPlayersPerTeam = 5;
|
||||
break;
|
||||
}
|
||||
|
||||
sScriptMgr->OnSetArenaMaxPlayersPerTeam(arenaType, maxPlayersPerTeam);
|
||||
bg->SetMaxPlayersPerTeam(maxPlayersPerTeam);
|
||||
}
|
||||
|
||||
@@ -748,19 +748,23 @@ bool BattlegroundMgr::IsArenaType(BattlegroundTypeId bgTypeId)
|
||||
|
||||
BattlegroundQueueTypeId BattlegroundMgr::BGQueueTypeId(BattlegroundTypeId bgTypeId, uint8 arenaType)
|
||||
{
|
||||
if (arenaType)
|
||||
{
|
||||
switch (arenaType)
|
||||
{
|
||||
if (arenaType) {
|
||||
uint32 queueTypeID = BATTLEGROUND_QUEUE_NONE;
|
||||
switch (arenaType) {
|
||||
case ARENA_TYPE_2v2:
|
||||
return BATTLEGROUND_QUEUE_2v2;
|
||||
queueTypeID = BATTLEGROUND_QUEUE_2v2;
|
||||
break;
|
||||
case ARENA_TYPE_3v3:
|
||||
return BATTLEGROUND_QUEUE_3v3;
|
||||
queueTypeID = BATTLEGROUND_QUEUE_3v3;
|
||||
break;
|
||||
case ARENA_TYPE_5v5:
|
||||
return BATTLEGROUND_QUEUE_5v5;
|
||||
queueTypeID = BATTLEGROUND_QUEUE_5v5;
|
||||
break;
|
||||
default:
|
||||
return BATTLEGROUND_QUEUE_NONE;
|
||||
break;
|
||||
}
|
||||
sScriptMgr->OnArenaTypeIDToQueueID(bgTypeId, arenaType, queueTypeID);
|
||||
return BattlegroundQueueTypeId(queueTypeID);
|
||||
}
|
||||
|
||||
if (BattlegroundMgr::bgToQueue.find(bgTypeId) == BattlegroundMgr::bgToQueue.end())
|
||||
@@ -783,17 +787,23 @@ BattlegroundTypeId BattlegroundMgr::BGTemplateId(BattlegroundQueueTypeId bgQueue
|
||||
|
||||
uint8 BattlegroundMgr::BGArenaType(BattlegroundQueueTypeId bgQueueTypeId)
|
||||
{
|
||||
uint8 arenaType = 0;
|
||||
switch (bgQueueTypeId)
|
||||
{
|
||||
case BATTLEGROUND_QUEUE_2v2:
|
||||
return ARENA_TYPE_2v2;
|
||||
arenaType = ARENA_TYPE_2v2;
|
||||
break;
|
||||
case BATTLEGROUND_QUEUE_3v3:
|
||||
return ARENA_TYPE_3v3;
|
||||
arenaType = ARENA_TYPE_3v3;
|
||||
break;
|
||||
case BATTLEGROUND_QUEUE_5v5:
|
||||
return ARENA_TYPE_5v5;
|
||||
arenaType = ARENA_TYPE_5v5;
|
||||
break;
|
||||
default:
|
||||
return 0;
|
||||
break;
|
||||
}
|
||||
sScriptMgr->OnArenaQueueIdToArenaType(bgQueueTypeId, arenaType);
|
||||
return arenaType;
|
||||
}
|
||||
|
||||
void BattlegroundMgr::ToggleTesting()
|
||||
|
||||
Reference in New Issue
Block a user