Skip to content

Commit

Permalink
refactor: implement properly how to get player team id via hook, repl…
Browse files Browse the repository at this point in the history
…ace magic numbers (#55)

* chore: remove dead code

* refactor: implement properly how to get player team id via hook, replace magic numbers
  • Loading branch information
Helias committed Sep 11, 2024
1 parent 0f1ff52 commit aef4b03
Showing 1 changed file with 34 additions and 45 deletions.
79 changes: 34 additions & 45 deletions src/npc_arena1v1.cpp
Original file line number Diff line number Diff line change
Expand Up @@ -32,6 +32,16 @@ uint32 ARENA_SLOT_1V1 = 3;
//Config
std::vector<uint32> forbiddenTalents;

enum npcActions {
NPC_ARENA_1V1_ACTION_CREATE_ARENA_TEAM = 1,
NPC_ARENA_1V1_ACTION_JOIN_QUEUE_ARENA_RATED = 2,
NPC_ARENA_1V1_ACTION_LEAVE_QUEUE = 3,
NPC_ARENA_1V1_ACTION_GET_STATISTICS = 4,
NPC_ARENA_1V1_ACTION_DISBAND_ARENA_TEAM = 5,
NPC_ARENA_1V1_ACTION_JOIN_QUEUE_ARENA_UNRATED = 20
};


bool teamExistForPlayerGuid(Player* player)
{
QueryResult queryPlayerTeam = CharacterDatabase.Query("SELECT * FROM `arena_team` WHERE `captainGuid`={} AND `type`=1", player->GetGUID().GetCounter());
Expand All @@ -40,14 +50,6 @@ bool teamExistForPlayerGuid(Player* player)
return false;
}

uint32 playerArenaTeam(Player* player)
{
QueryResult queryPlayerTeam = CharacterDatabase.Query("SELECT `arenaTeamId` FROM `arena_team` WHERE `captainGuid`={} AND `type`=1", player->GetGUID().GetCounter());
if (queryPlayerTeam)
return (*queryPlayerTeam)[0].Get<int32>();
return 0;
}

void deleteTeamArenaForPlayer(Player* player)
{
QueryResult queryPlayerTeam = CharacterDatabase.Query("SELECT `arenaTeamId` FROM `arena_team` WHERE `captainGuid`={} AND `type`=1", player->GetGUID().GetCounter());
Expand Down Expand Up @@ -95,37 +97,24 @@ class playerscript_1v1arena : public PlayerScript
ChatHandler(pPlayer->GetSession()).SendSysMessage("This server is running the |cff4CFF00Arena 1v1 |rmodule.");
}

void GetCustomGetArenaTeamId(const Player* player, uint8 slot, uint32& id) const override
void OnGetMaxPersonalArenaRatingRequirement(const Player* player, uint32 minslot, uint32& maxArenaRating) const override
{
if (slot == sConfigMgr->GetOption<uint32>("Arena1v1.ArenaSlotID", 3))
if (sConfigMgr->GetOption<bool>("Arena1v1.VendorRating", false) && minslot < (uint32)sConfigMgr->GetOption<uint32>("Arena1v1.ArenaSlotID", 3))
{
if (ArenaTeam* at = sArenaTeamMgr->GetArenaTeamByCaptain(player->GetGUID(), ARENA_TEAM_1V1))
{
id = at->GetId();
maxArenaRating = std::max(at->GetRating(), maxArenaRating);
}
}
}

void GetCustomArenaPersonalRating(const Player* player, uint8 slot, uint32& rating) const override
void OnGetArenaTeamId(Player* player, uint8 slot, uint32& result) override
{
if (slot == sConfigMgr->GetOption<uint32>("Arena1v1.ArenaSlotID", 3))
{
if (ArenaTeam* at = sArenaTeamMgr->GetArenaTeamByCaptain(player->GetGUID(), ARENA_TEAM_1V1))
{
rating = at->GetRating();
}
}
}
if (!player)
return;

void OnGetMaxPersonalArenaRatingRequirement(const Player* player, uint32 minslot, uint32& maxArenaRating) const override
{
if (sConfigMgr->GetOption<bool>("Arena1v1.VendorRating", false) && minslot < (uint32)sConfigMgr->GetOption<uint32>("Arena1v1.ArenaSlotID", 3))
{
if (ArenaTeam* at = sArenaTeamMgr->GetArenaTeamByCaptain(player->GetGUID(), ARENA_TEAM_1V1))
{
maxArenaRating = std::max(at->GetRating(), maxArenaRating);
}
}
if (slot == ARENA_SLOT_1V1)
result = player->GetArenaTeamIdFromDB(player->GetGUID(), ARENA_TYPE_1V1);
}
};

Expand All @@ -147,26 +136,26 @@ class npc_1v1arena : public CreatureScript

if (player->InBattlegroundQueueForBattlegroundQueueType(bgQueueTypeId))
{
AddGossipItemFor(player, GOSSIP_ICON_CHAT, "Queue leave 1v1 Arena", GOSSIP_SENDER_MAIN, 3, "Are you sure?", 0, false);
AddGossipItemFor(player, GOSSIP_ICON_CHAT, "Queue leave 1v1 Arena", GOSSIP_SENDER_MAIN, NPC_ARENA_1V1_ACTION_LEAVE_QUEUE, "Are you sure?", 0, false);
}
else
{
AddGossipItemFor(player, GOSSIP_ICON_CHAT, "Queue enter 1v1 Arena (UnRated)", GOSSIP_SENDER_MAIN, 20);
AddGossipItemFor(player, GOSSIP_ICON_CHAT, "Queue enter 1v1 Arena (UnRated)", GOSSIP_SENDER_MAIN, NPC_ARENA_1V1_ACTION_JOIN_QUEUE_ARENA_UNRATED);
}

if (!teamExistForPlayerGuid(player))
{
AddGossipItemFor(player, GOSSIP_ICON_CHAT, "Create new 1v1 Arena Team", GOSSIP_SENDER_MAIN, 1, "Are you sure?", sConfigMgr->GetOption<uint32>("Arena1v1.Costs", 400000), false);
AddGossipItemFor(player, GOSSIP_ICON_CHAT, "Create new 1v1 Arena Team", GOSSIP_SENDER_MAIN, NPC_ARENA_1V1_ACTION_CREATE_ARENA_TEAM, "Are you sure?", sConfigMgr->GetOption<uint32>("Arena1v1.Costs", 400000), false);
}
else
{
if (!player->InBattlegroundQueueForBattlegroundQueueType(bgQueueTypeId))
{
AddGossipItemFor(player, GOSSIP_ICON_CHAT, "Queue enter 1v1 Arena (Rated)", GOSSIP_SENDER_MAIN, 2);
AddGossipItemFor(player, GOSSIP_ICON_CHAT, "Arenateam Clear", GOSSIP_SENDER_MAIN, 5, "Are you sure?", 0, false);
AddGossipItemFor(player, GOSSIP_ICON_CHAT, "Queue enter 1v1 Arena (Rated)", GOSSIP_SENDER_MAIN, NPC_ARENA_1V1_ACTION_JOIN_QUEUE_ARENA_RATED);
AddGossipItemFor(player, GOSSIP_ICON_CHAT, "Arenateam Clear", GOSSIP_SENDER_MAIN, NPC_ARENA_1V1_ACTION_DISBAND_ARENA_TEAM, "Are you sure?", 0, false);
}

AddGossipItemFor(player, GOSSIP_ICON_CHAT, "Shows your statistics", GOSSIP_SENDER_MAIN, 4);
AddGossipItemFor(player, GOSSIP_ICON_CHAT, "Shows your statistics", GOSSIP_SENDER_MAIN, NPC_ARENA_1V1_ACTION_GET_STATISTICS);
}

SendGossipMenuFor(player, 68, creature);
Expand All @@ -184,7 +173,7 @@ class npc_1v1arena : public CreatureScript

switch (action)
{
case 1: // Create new Arenateam
case NPC_ARENA_1V1_ACTION_CREATE_ARENA_TEAM:
{
if (sConfigMgr->GetOption<uint32>("Arena1v1.MinLevel", 80) <= player->GetLevel())
{
Expand All @@ -200,7 +189,7 @@ class npc_1v1arena : public CreatureScript
}
break;

case 2: // Join Queue Arena (rated)
case NPC_ARENA_1V1_ACTION_JOIN_QUEUE_ARENA_RATED:
{
if (Arena1v1CheckTalents(player) && !JoinQueueArena(player, creature, true))
handler.SendSysMessage("Something went wrong when joining the queue.");
Expand All @@ -210,7 +199,7 @@ class npc_1v1arena : public CreatureScript
}
break;

case 20: // Join Queue Arena (unrated)
case NPC_ARENA_1V1_ACTION_JOIN_QUEUE_ARENA_UNRATED:
{
if (Arena1v1CheckTalents(player) && !JoinQueueArena(player, creature, false))
handler.SendSysMessage("Something went wrong when joining the queue.");
Expand All @@ -220,7 +209,7 @@ class npc_1v1arena : public CreatureScript
}
break;

case 3: // Leave Queue
case NPC_ARENA_1V1_ACTION_LEAVE_QUEUE:
{
uint8 arenaType = ARENA_TYPE_1V1;

Expand All @@ -235,9 +224,9 @@ class npc_1v1arena : public CreatureScript
}
break;

case 4: // get statistics
case NPC_ARENA_1V1_ACTION_GET_STATISTICS:
{
ArenaTeam* at = sArenaTeamMgr->GetArenaTeamById(playerArenaTeam(player));
ArenaTeam* at = sArenaTeamMgr->GetArenaTeamById(player->GetArenaTeamId(ARENA_SLOT_1V1));
if (at)
{
std::stringstream s;
Expand All @@ -254,10 +243,10 @@ class npc_1v1arena : public CreatureScript
}
break;

case 5: // Disband arenateam
case NPC_ARENA_1V1_ACTION_DISBAND_ARENA_TEAM:
{
WorldPacket Data;
Data << playerArenaTeam(player);
Data << player->GetArenaTeamId(ARENA_SLOT_1V1);
player->GetSession()->HandleArenaTeamLeaveOpcode(Data);
handler.SendSysMessage("Arenateam deleted!");
CloseGossipMenuFor(player);
Expand Down Expand Up @@ -315,7 +304,7 @@ class npc_1v1arena : public CreatureScript

if (isRated)
{
ateamId = playerArenaTeam(player);
ateamId = player->GetArenaTeamId(ARENA_SLOT_1V1);
ArenaTeam* at = sArenaTeamMgr->GetArenaTeamById(ateamId);
if (!at)
{
Expand Down Expand Up @@ -373,7 +362,7 @@ class npc_1v1arena : public CreatureScript
}

// This disaster is the result of changing the MAX_ARENA_SLOT from 3 to 4.
sArenaTeamMgr->RemoveArenaTeam(playerArenaTeam(player));
sArenaTeamMgr->RemoveArenaTeam(player->GetArenaTeamId(ARENA_SLOT_1V1));
deleteTeamArenaForPlayer(player);

// Create arena team
Expand Down

0 comments on commit aef4b03

Please sign in to comment.