mirror of
https://gitcode.com/GitHub_Trending/az/azerothcore-wotlk.git
synced 2026-07-11 03:13:10 +00:00
Merge branch 'PVP1v1' of git@gitlab.com:azerothshard/azerothcore.git
This commit is contained in:
@@ -6,22 +6,22 @@
|
||||
#include "World.h"
|
||||
|
||||
/* [TODO] fix and re-enable */
|
||||
// AzthPlayer::AzthPlayer(Player *origin) {
|
||||
// playerQuestRate = sWorld->getRate(RATE_XP_QUEST);
|
||||
// player = origin;
|
||||
// }
|
||||
//
|
||||
AzthPlayer::AzthPlayer(Player *origin) {
|
||||
playerQuestRate = sWorld->getRate(RATE_XP_QUEST);
|
||||
player = origin;
|
||||
}
|
||||
|
||||
// void AzthPlayer::SetPlayerQuestRate(float rate) {
|
||||
// playerQuestRate = rate;
|
||||
// }
|
||||
//
|
||||
// uint32 AzthPlayer::getArena1v1Info(uint8 type) {
|
||||
// return arena1v1Info[type];
|
||||
// }
|
||||
//
|
||||
// void AzthPlayer::setArena1v1Info(uint8 type, uint32 value) {
|
||||
// arena1v1Info[type] = value;
|
||||
// }
|
||||
|
||||
uint32 AzthPlayer::getArena1v1Info(uint8 type) {
|
||||
return arena1v1Info[type];
|
||||
}
|
||||
|
||||
void AzthPlayer::setArena1v1Info(uint8 type, uint32 value) {
|
||||
arena1v1Info[type] = value;
|
||||
}
|
||||
//
|
||||
// float AzthPlayer::GetPlayerQuestRate() {
|
||||
// return playerQuestRate;
|
||||
|
||||
@@ -6,11 +6,11 @@
|
||||
#include "Player.h"
|
||||
|
||||
/* [TODO] fix and re-enable */
|
||||
// class AzthPlayer {
|
||||
// public:
|
||||
// explicit AzthPlayer(Player *origin);
|
||||
// ~AzthPlayer();
|
||||
//
|
||||
class AzthPlayer {
|
||||
public:
|
||||
explicit AzthPlayer(Player *origin);
|
||||
~AzthPlayer();
|
||||
|
||||
// void SetPlayerQuestRate(float rate);
|
||||
//
|
||||
// /**
|
||||
@@ -30,15 +30,15 @@
|
||||
// bool setFactionForRace(uint8 race);
|
||||
// uint32 getOriginalTeam();
|
||||
//
|
||||
// uint32 getArena1v1Info(uint8 type);
|
||||
// void setArena1v1Info(uint8 type, uint32 value);
|
||||
uint32 getArena1v1Info(uint8 type);
|
||||
void setArena1v1Info(uint8 type, uint32 value);
|
||||
//
|
||||
// private:
|
||||
// Player *player;
|
||||
// uint32 arena1v1Info[7]; // ARENA_TEAM_END
|
||||
private:
|
||||
Player *player;
|
||||
uint32 arena1v1Info[7]; // ARENA_TEAM_END
|
||||
//
|
||||
// float playerQuestRate, maxQuestRate;
|
||||
// };
|
||||
float playerQuestRate, maxQuestRate;
|
||||
};
|
||||
|
||||
#endif /* AZTHPLAYER_H */
|
||||
|
||||
|
||||
@@ -15,233 +15,237 @@
|
||||
#define ARENA_1V1_COST 40 * 10000 // costs for create a team: 40 gold
|
||||
|
||||
/* [TODO] fix and re-enable */
|
||||
// class npc_1v1arena : public CreatureScript {
|
||||
// public:
|
||||
//
|
||||
// npc_1v1arena() : CreatureScript("npc_1v1arena") {
|
||||
// }
|
||||
//
|
||||
// bool JoinQueueArena(Player* player, Creature* me) {
|
||||
// if (ARENA_1V1_MIN_LEVEL > player->getLevel())
|
||||
// return false;
|
||||
//
|
||||
// uint64 guid = player->GetGUID();
|
||||
// uint8 arenaslot = ArenaTeam::GetSlotByType(ARENA_TEAM_1V1);
|
||||
// uint8 arenatype = ARENA_TYPE_1v1;
|
||||
// uint32 arenaRating = 0;
|
||||
// uint32 matchmakerRating = 0;
|
||||
// bool isRated = true;
|
||||
//
|
||||
// // ignore if we already in BG or BG queue
|
||||
// if (player->InBattleground())
|
||||
// return false;
|
||||
//
|
||||
// //check existance
|
||||
// Battleground* bg = sBattlegroundMgr->GetBattlegroundTemplate(BATTLEGROUND_AA);
|
||||
// if (!bg) {
|
||||
// //TC_LOG_ERROR(LOG_FILTER_NETWORKIO, "Battleground: template bg (all arenas) not found");
|
||||
// return false;
|
||||
// }
|
||||
//
|
||||
// if (DisableMgr::IsDisabledFor(DISABLE_TYPE_BATTLEGROUND, BATTLEGROUND_AA, NULL)) {
|
||||
// ChatHandler(player->GetSession()).PSendSysMessage(LANG_ARENA_DISABLED);
|
||||
// return false;
|
||||
// }
|
||||
//
|
||||
// BattlegroundTypeId bgTypeId = bg->GetTypeID();
|
||||
// BattlegroundQueueTypeId bgQueueTypeId = BattlegroundMgr::BGQueueTypeId(bgTypeId, arenatype);
|
||||
// PvPDifficultyEntry const* bracketEntry = GetBattlegroundBracketByLevel(bg->GetMapId(), player->getLevel());
|
||||
// if (!bracketEntry)
|
||||
// return false;
|
||||
//
|
||||
// GroupJoinBattlegroundResult err = ERR_GROUP_JOIN_BATTLEGROUND_FAIL;
|
||||
//
|
||||
// // check if already in queue
|
||||
// if (player->GetBattlegroundQueueIndex(bgQueueTypeId) < PLAYER_MAX_BATTLEGROUND_QUEUES)
|
||||
// //player is already in this queue
|
||||
// return false;
|
||||
// // check if has free queue slots
|
||||
// if (!player->HasFreeBattlegroundQueueId())
|
||||
// return false;
|
||||
//
|
||||
// uint32 ateamId = 0;
|
||||
//
|
||||
// ateamId = player->GetArenaTeamId(arenaslot);
|
||||
// ArenaTeam* at = sArenaTeamMgr->GetArenaTeamById(ateamId);
|
||||
// if (!at) {
|
||||
// player->GetSession()->SendNotInArenaTeamPacket(arenatype);
|
||||
// return false;
|
||||
// }
|
||||
// // get the team rating for queueing
|
||||
// arenaRating = at->GetRating();
|
||||
// matchmakerRating = arenaRating;
|
||||
// // the arenateam id must match for everyone in the group
|
||||
//
|
||||
// if (arenaRating <= 0)
|
||||
// arenaRating = 1;
|
||||
//
|
||||
// BattlegroundQueue &bgQueue = sBattlegroundMgr->GetBattlegroundQueue(bgQueueTypeId);
|
||||
// bg->SetRated(isRated);
|
||||
//
|
||||
// GroupQueueInfo* ginfo = bgQueue.AddGroup(player, NULL, bgTypeId, bracketEntry, arenatype, isRated, false, arenaRating, matchmakerRating, ateamId);
|
||||
// uint32 avgTime = bgQueue.GetAverageQueueWaitTime(ginfo, bracketEntry->GetBracketId());
|
||||
// uint32 queueSlot = player->AddBattlegroundQueueId(bgQueueTypeId);
|
||||
//
|
||||
// WorldPacket data;
|
||||
// // send status packet (in queue)
|
||||
// sBattlegroundMgr->BuildBattlegroundStatusPacket(&data, bg, queueSlot, STATUS_WAIT_QUEUE, avgTime, 0, arenatype, 0);
|
||||
// player->GetSession()->SendPacket(&data);
|
||||
//
|
||||
// sBattlegroundMgr->ScheduleQueueUpdate(matchmakerRating, arenatype, bgQueueTypeId, bgTypeId, bracketEntry->GetBracketId());
|
||||
//
|
||||
// return true;
|
||||
// }
|
||||
//
|
||||
// bool CreateArenateam(Player* player, Creature* me) {
|
||||
// uint8 slot = ArenaTeam::GetSlotByType(ARENA_TEAM_1V1);
|
||||
//
|
||||
// // Check if player is already in an arena team
|
||||
// if (player->GetArenaTeamId(slot)) {
|
||||
// player->GetSession()->SendArenaTeamCommandResult(ERR_ARENA_TEAM_CREATE_S, player->GetName(), "", ERR_ALREADY_IN_ARENA_TEAM);
|
||||
// return false;
|
||||
// }
|
||||
//
|
||||
//
|
||||
// // Teamname = playername
|
||||
// // if teamname exist, we have to choose another name (playername number)
|
||||
// int i = 1;
|
||||
// std::stringstream teamName;
|
||||
// teamName << player->GetName();
|
||||
// do {
|
||||
// if (sArenaTeamMgr->GetArenaTeamByName(teamName.str()) != NULL) // teamname exist, so choose another name
|
||||
// {
|
||||
// teamName.str(std::string());
|
||||
// teamName << player->GetName() << i;
|
||||
// } else
|
||||
// break;
|
||||
//
|
||||
// i++;
|
||||
// } while (i < 100); // should never happen
|
||||
//
|
||||
// // Create arena team
|
||||
// ArenaTeam* arenaTeam = new ArenaTeam();
|
||||
//
|
||||
// if (!arenaTeam->Create(player->GetGUID(), ARENA_TEAM_1V1, teamName.str(), 0, 0, 0, 0, 0)) {
|
||||
// delete arenaTeam;
|
||||
// return false;
|
||||
// }
|
||||
//
|
||||
// // Register arena team
|
||||
// sArenaTeamMgr->AddArenaTeam(arenaTeam);
|
||||
//
|
||||
// ChatHandler(player->GetSession()).SendSysMessage("1v1 Arenateam successful created!");
|
||||
//
|
||||
// return true;
|
||||
// }
|
||||
//
|
||||
// bool OnGossipHello(Player* player, Creature* me) {
|
||||
// if (player->GetArenaTeamId(ArenaTeam::GetSlotByType(ARENA_TEAM_1V1)) == NULL)
|
||||
// player->ADD_GOSSIP_ITEM_EXTENDED(GOSSIP_ICON_CHAT, "|TInterface/ICONS/Achievement_Arena_2v2_7:30|t Create 1v1 Rated Arena Team", GOSSIP_SENDER_MAIN, 1, "Create 1v1 arena team?", ARENA_1V1_COST, false);
|
||||
// else {
|
||||
// if (player->InBattlegroundQueueForBattlegroundQueueType(BATTLEGROUND_QUEUE_1v1))
|
||||
// player->ADD_GOSSIP_ITEM(GOSSIP_ICON_CHAT, "|TInterface/ICONS/Achievement_Arena_2v2_7:30|t Leave 1v1 Arena", GOSSIP_SENDER_MAIN, 3);
|
||||
// else {
|
||||
// player->ADD_GOSSIP_ITEM(GOSSIP_ICON_CHAT, "|TInterface/ICONS/Achievement_Arena_3v3_5:30|t Join 1v1 Rated Arena", GOSSIP_SENDER_MAIN, 2);
|
||||
// player->ADD_GOSSIP_ITEM_EXTENDED(GOSSIP_ICON_CHAT, "|TInterface/ICONS/Achievement_Arena_2v2_7:30|t Disband Arena team", GOSSIP_SENDER_MAIN, 5, "Are you sure?", 0, false);
|
||||
// }
|
||||
//
|
||||
// player->ADD_GOSSIP_ITEM(GOSSIP_ICON_CHAT, "|TInterface/ICONS/INV_Misc_Coin_01:30|t Show statistics", GOSSIP_SENDER_MAIN, 4);
|
||||
// }
|
||||
//
|
||||
// player->ADD_GOSSIP_ITEM(GOSSIP_ICON_CHAT, "|TInterface/ICONS/INV_Misc_Coin_03:30|t How to Use NPC?", GOSSIP_SENDER_MAIN, 8);
|
||||
// player->SEND_GOSSIP_MENU(68, me->GetGUID());
|
||||
// return true;
|
||||
// }
|
||||
//
|
||||
// bool OnGossipSelect(Player* player, Creature* me, uint32 /*uiSender*/, uint32 uiAction) {
|
||||
// player->PlayerTalkClass->ClearMenus();
|
||||
//
|
||||
// switch (uiAction) {
|
||||
// case 1: // Create new Arenateam
|
||||
// {
|
||||
// if (ARENA_1V1_MIN_LEVEL <= player->getLevel()) {
|
||||
// if (player->GetMoney() >= ARENA_1V1_COST && CreateArenateam(player, me))
|
||||
// player->ModifyMoney(-(int32) ARENA_1V1_COST);
|
||||
// } else {
|
||||
// ChatHandler(player->GetSession()).PSendSysMessage("You need level %u+ to create an 1v1 Arena Team.", ARENA_1V1_MIN_LEVEL);
|
||||
// }
|
||||
//
|
||||
// player->CLOSE_GOSSIP_MENU();
|
||||
// return true;
|
||||
// }
|
||||
// break;
|
||||
//
|
||||
// case 2: // Join Queue Arena
|
||||
// {
|
||||
// if (JoinQueueArena(player, me) == false)
|
||||
// ChatHandler(player->GetSession()).SendSysMessage("Something went wrong while join queue.");
|
||||
// player->CLOSE_GOSSIP_MENU();
|
||||
// return true;
|
||||
// }
|
||||
// break;
|
||||
//
|
||||
// case 3: // Leave Queue
|
||||
// {
|
||||
// WorldPacket Data;
|
||||
// Data << (uint8) 0x1 << (uint8) 0x0 << (uint32) BATTLEGROUND_AA << (uint16) 0x0 << (uint8) 0x0;
|
||||
// player->GetSession()->HandleBattleFieldPortOpcode(Data);
|
||||
// player->CLOSE_GOSSIP_MENU();
|
||||
// return true;
|
||||
// }
|
||||
// break;
|
||||
//
|
||||
// case 4: // get statistics
|
||||
// {
|
||||
// ArenaTeam* at = sArenaTeamMgr->GetArenaTeamById(player->GetArenaTeamId(ArenaTeam::GetSlotByType(ARENA_TEAM_1V1)));
|
||||
// if (at) {
|
||||
// std::stringstream s;
|
||||
// s << "Rating: " << at->GetStats().Rating;
|
||||
// s << "\nRank: " << at->GetStats().Rank;
|
||||
// s << "\nSeason Games: " << at->GetStats().SeasonGames;
|
||||
// s << "\nSeason Wins: " << at->GetStats().SeasonWins;
|
||||
// s << "\nWeek Games: " << at->GetStats().WeekGames;
|
||||
// s << "\nWeek Wins: " << at->GetStats().WeekWins;
|
||||
//
|
||||
// ChatHandler(player->GetSession()).PSendSysMessage(s.str().c_str());
|
||||
// }
|
||||
// }
|
||||
// break;
|
||||
//
|
||||
//
|
||||
// case 5: // Disband arenateam
|
||||
// {
|
||||
// WorldPacket Data;
|
||||
// Data << (uint32) player->GetArenaTeamId(ArenaTeam::GetSlotByType(ARENA_TEAM_1V1));
|
||||
// player->GetSession()->HandleArenaTeamLeaveOpcode(Data);
|
||||
// ChatHandler(player->GetSession()).PSendSysMessage("Arena team deleted!");
|
||||
// player->CLOSE_GOSSIP_MENU();
|
||||
// return true;
|
||||
// }
|
||||
// break;
|
||||
//
|
||||
// case 8: // Script Info
|
||||
// {
|
||||
// player->ADD_GOSSIP_ITEM(GOSSIP_ICON_CHAT, "Click on Create new 1v1 Arena team", GOSSIP_SENDER_MAIN, uiAction);
|
||||
// player->ADD_GOSSIP_ITEM(GOSSIP_ICON_CHAT, "Join 1v1 Arena and ready!", GOSSIP_SENDER_MAIN, uiAction);
|
||||
// player->ADD_GOSSIP_ITEM(GOSSIP_ICON_CHAT, "Enjoy!", GOSSIP_SENDER_MAIN, uiAction);
|
||||
// player->ADD_GOSSIP_ITEM(GOSSIP_ICON_CHAT, "<- Back", GOSSIP_SENDER_MAIN, 7);
|
||||
// player->SEND_GOSSIP_MENU(68, me->GetGUID());
|
||||
// return true;
|
||||
// }
|
||||
// break;
|
||||
//
|
||||
// }
|
||||
//
|
||||
// OnGossipHello(player, me);
|
||||
// return true;
|
||||
// }
|
||||
// };
|
||||
//
|
||||
// void AddSC_npc_1v1arena() {
|
||||
// new npc_1v1arena();
|
||||
// }
|
||||
class npc_1v1arena : public CreatureScript {
|
||||
public:
|
||||
|
||||
npc_1v1arena() : CreatureScript("npc_1v1arena") {
|
||||
}
|
||||
|
||||
bool JoinQueueArena(Player* player, Creature* me) {
|
||||
if (ARENA_1V1_MIN_LEVEL > player->getLevel())
|
||||
return false;
|
||||
|
||||
uint64 guid = player->GetGUID();
|
||||
uint8 arenaslot = ArenaTeam::GetSlotByType(ARENA_TEAM_1v1);
|
||||
uint8 arenatype = ARENA_TYPE_1v1;
|
||||
uint32 arenaRating = 0;
|
||||
uint32 matchmakerRating = 0;
|
||||
bool isRated = true;
|
||||
|
||||
// ignore if we already in BG or BG queue
|
||||
if (player->InBattleground())
|
||||
return false;
|
||||
|
||||
//check existance
|
||||
Battleground* bg = sBattlegroundMgr->GetBattlegroundTemplate(BATTLEGROUND_AA);
|
||||
if (!bg) {
|
||||
//TC_LOG_ERROR(LOG_FILTER_NETWORKIO, "Battleground: template bg (all arenas) not found");
|
||||
return false;
|
||||
}
|
||||
|
||||
if (DisableMgr::IsDisabledFor(DISABLE_TYPE_BATTLEGROUND, BATTLEGROUND_AA, NULL)) {
|
||||
ChatHandler(player->GetSession()).PSendSysMessage(LANG_ARENA_DISABLED);
|
||||
return false;
|
||||
}
|
||||
|
||||
BattlegroundTypeId bgTypeId = bg->GetBgTypeID();
|
||||
BattlegroundQueueTypeId bgQueueTypeId = BattlegroundMgr::BGQueueTypeId(bgTypeId, arenatype);
|
||||
PvPDifficultyEntry const* bracketEntry = GetBattlegroundBracketByLevel(bg->GetMapId(), player->getLevel());
|
||||
if (!bracketEntry)
|
||||
return false;
|
||||
|
||||
GroupJoinBattlegroundResult err = ERR_GROUP_JOIN_BATTLEGROUND_FAIL;
|
||||
|
||||
// check if already in queue
|
||||
if (player->GetBattlegroundQueueIndex(bgQueueTypeId) < PLAYER_MAX_BATTLEGROUND_QUEUES)
|
||||
//player is already in this queue
|
||||
return false;
|
||||
// check if has free queue slots
|
||||
if (!player->HasFreeBattlegroundQueueId())
|
||||
return false;
|
||||
|
||||
uint32 ateamId = 0;
|
||||
|
||||
ateamId = player->GetArenaTeamId(arenaslot);
|
||||
ArenaTeam* at = sArenaTeamMgr->GetArenaTeamById(ateamId);
|
||||
if (!at) {
|
||||
player->GetSession()->SendNotInArenaTeamPacket(arenatype);
|
||||
return false;
|
||||
}
|
||||
// get the team rating for queueing
|
||||
arenaRating = at->GetRating();
|
||||
matchmakerRating = arenaRating;
|
||||
// the arenateam id must match for everyone in the group
|
||||
|
||||
if (arenaRating <= 0)
|
||||
arenaRating = 1;
|
||||
|
||||
BattlegroundQueue &bgQueue = sBattlegroundMgr->GetBattlegroundQueue(bgQueueTypeId);
|
||||
bg->SetRated(isRated);
|
||||
|
||||
bgQueue.SetBgTypeIdAndArenaType(bgTypeId, arenatype);
|
||||
GroupQueueInfo* ginfo = bgQueue.AddGroup(player, NULL, bracketEntry, isRated, false, arenaRating, matchmakerRating, ateamId);
|
||||
// manca BattlegroundTypeId BgTypeId - uint8 ArenaType
|
||||
|
||||
uint32 avgTime = bgQueue.GetAverageQueueWaitTime(ginfo);
|
||||
uint32 queueSlot = player->AddBattlegroundQueueId(bgQueueTypeId);
|
||||
|
||||
WorldPacket data;
|
||||
// send status packet (in queue)
|
||||
//[AZTH]
|
||||
sBattlegroundMgr->BuildBattlegroundStatusPacket(&data, bg, queueSlot, STATUS_WAIT_QUEUE, avgTime, 0, arenatype, player->GetBgTeamId(), 0);
|
||||
//[/AZTH]
|
||||
player->GetSession()->SendPacket(&data);
|
||||
|
||||
sBattlegroundMgr->ScheduleArenaQueueUpdate(matchmakerRating, bgQueueTypeId, bracketEntry->GetBracketId());
|
||||
return true;
|
||||
}
|
||||
|
||||
bool CreateArenateam(Player* player, Creature* me) {
|
||||
uint8 slot = ArenaTeam::GetSlotByType(ARENA_TEAM_1v1);
|
||||
|
||||
// Check if player is already in an arena team
|
||||
if (player->GetArenaTeamId(slot)) {
|
||||
player->GetSession()->SendArenaTeamCommandResult(ERR_ARENA_TEAM_CREATE_S, player->GetName(), "", ERR_ALREADY_IN_ARENA_TEAM);
|
||||
return false;
|
||||
}
|
||||
|
||||
|
||||
// Teamname = playername
|
||||
// if teamname exist, we have to choose another name (playername number)
|
||||
int i = 1;
|
||||
std::stringstream teamName;
|
||||
teamName << player->GetName();
|
||||
do {
|
||||
if (sArenaTeamMgr->GetArenaTeamByName(teamName.str()) != NULL) // teamname exist, so choose another name
|
||||
{
|
||||
teamName.str(std::string());
|
||||
teamName << player->GetName() << i;
|
||||
} else
|
||||
break;
|
||||
|
||||
i++;
|
||||
} while (i < 100); // should never happen
|
||||
|
||||
// Create arena team
|
||||
ArenaTeam* arenaTeam = new ArenaTeam();
|
||||
|
||||
if (!arenaTeam->Create(player->GetGUID(), ARENA_TEAM_1v1, teamName.str(), 0, 0, 0, 0, 0)) {
|
||||
delete arenaTeam;
|
||||
return false;
|
||||
}
|
||||
|
||||
// Register arena team
|
||||
sArenaTeamMgr->AddArenaTeam(arenaTeam);
|
||||
|
||||
ChatHandler(player->GetSession()).SendSysMessage("1v1 Arenateam successful created!");
|
||||
|
||||
return true;
|
||||
}
|
||||
|
||||
bool OnGossipHello(Player* player, Creature* me) {
|
||||
if (player->GetArenaTeamId(ArenaTeam::GetSlotByType(ARENA_TEAM_1v1)) == NULL)
|
||||
player->ADD_GOSSIP_ITEM_EXTENDED(GOSSIP_ICON_CHAT, "|TInterface/ICONS/Achievement_Arena_2v2_7:30|t Create 1v1 Rated Arena Team", GOSSIP_SENDER_MAIN, 1, "Create 1v1 arena team?", ARENA_1V1_COST, false);
|
||||
else {
|
||||
if (player->InBattlegroundQueueForBattlegroundQueueType(BATTLEGROUND_QUEUE_1v1))
|
||||
player->ADD_GOSSIP_ITEM(GOSSIP_ICON_CHAT, "|TInterface/ICONS/Achievement_Arena_2v2_7:30|t Leave 1v1 Arena", GOSSIP_SENDER_MAIN, 3);
|
||||
else {
|
||||
player->ADD_GOSSIP_ITEM(GOSSIP_ICON_CHAT, "|TInterface/ICONS/Achievement_Arena_3v3_5:30|t Join 1v1 Rated Arena", GOSSIP_SENDER_MAIN, 2);
|
||||
player->ADD_GOSSIP_ITEM_EXTENDED(GOSSIP_ICON_CHAT, "|TInterface/ICONS/Achievement_Arena_2v2_7:30|t Disband Arena team", GOSSIP_SENDER_MAIN, 5, "Are you sure?", 0, false);
|
||||
}
|
||||
|
||||
player->ADD_GOSSIP_ITEM(GOSSIP_ICON_CHAT, "|TInterface/ICONS/INV_Misc_Coin_01:30|t Show statistics", GOSSIP_SENDER_MAIN, 4);
|
||||
}
|
||||
|
||||
player->ADD_GOSSIP_ITEM(GOSSIP_ICON_CHAT, "|TInterface/ICONS/INV_Misc_Coin_03:30|t How to Use NPC?", GOSSIP_SENDER_MAIN, 8);
|
||||
player->SEND_GOSSIP_MENU(68, me->GetGUID());
|
||||
return true;
|
||||
}
|
||||
|
||||
bool OnGossipSelect(Player* player, Creature* me, uint32 /*uiSender*/, uint32 uiAction) {
|
||||
player->PlayerTalkClass->ClearMenus();
|
||||
|
||||
switch (uiAction) {
|
||||
case 1: // Create new Arenateam
|
||||
{
|
||||
if (ARENA_1V1_MIN_LEVEL <= player->getLevel()) {
|
||||
if (player->GetMoney() >= ARENA_1V1_COST && CreateArenateam(player, me))
|
||||
player->ModifyMoney(-(int32) ARENA_1V1_COST);
|
||||
} else {
|
||||
ChatHandler(player->GetSession()).PSendSysMessage("You need level %u+ to create an 1v1 Arena Team.", ARENA_1V1_MIN_LEVEL);
|
||||
}
|
||||
|
||||
player->CLOSE_GOSSIP_MENU();
|
||||
return true;
|
||||
}
|
||||
break;
|
||||
|
||||
case 2: // Join Queue Arena
|
||||
{
|
||||
if (JoinQueueArena(player, me) == false)
|
||||
ChatHandler(player->GetSession()).SendSysMessage("Something went wrong while join queue.");
|
||||
player->CLOSE_GOSSIP_MENU();
|
||||
return true;
|
||||
}
|
||||
break;
|
||||
|
||||
case 3: // Leave Queue
|
||||
{
|
||||
WorldPacket Data;
|
||||
Data << (uint8) 0x1 << (uint8) 0x0 << (uint32) BATTLEGROUND_AA << (uint16) 0x0 << (uint8) 0x0;
|
||||
player->GetSession()->HandleBattleFieldPortOpcode(Data);
|
||||
player->CLOSE_GOSSIP_MENU();
|
||||
return true;
|
||||
}
|
||||
break;
|
||||
|
||||
case 4: // get statistics
|
||||
{
|
||||
ArenaTeam* at = sArenaTeamMgr->GetArenaTeamById(player->GetArenaTeamId(ArenaTeam::GetSlotByType(ARENA_TEAM_1v1)));
|
||||
if (at) {
|
||||
std::stringstream s;
|
||||
s << "Rating: " << at->GetStats().Rating;
|
||||
s << "\nRank: " << at->GetStats().Rank;
|
||||
s << "\nSeason Games: " << at->GetStats().SeasonGames;
|
||||
s << "\nSeason Wins: " << at->GetStats().SeasonWins;
|
||||
s << "\nWeek Games: " << at->GetStats().WeekGames;
|
||||
s << "\nWeek Wins: " << at->GetStats().WeekWins;
|
||||
|
||||
ChatHandler(player->GetSession()).PSendSysMessage(s.str().c_str());
|
||||
}
|
||||
}
|
||||
break;
|
||||
|
||||
|
||||
case 5: // Disband arenateam
|
||||
{
|
||||
WorldPacket Data;
|
||||
Data << (uint32) player->GetArenaTeamId(ArenaTeam::GetSlotByType(ARENA_TEAM_1v1));
|
||||
player->GetSession()->HandleArenaTeamLeaveOpcode(Data);
|
||||
ChatHandler(player->GetSession()).PSendSysMessage("Arena team deleted!");
|
||||
player->CLOSE_GOSSIP_MENU();
|
||||
return true;
|
||||
}
|
||||
break;
|
||||
|
||||
case 8: // Script Info
|
||||
{
|
||||
player->ADD_GOSSIP_ITEM(GOSSIP_ICON_CHAT, "Click on Create new 1v1 Arena team", GOSSIP_SENDER_MAIN, uiAction);
|
||||
player->ADD_GOSSIP_ITEM(GOSSIP_ICON_CHAT, "Join 1v1 Arena and ready!", GOSSIP_SENDER_MAIN, uiAction);
|
||||
player->ADD_GOSSIP_ITEM(GOSSIP_ICON_CHAT, "Enjoy!", GOSSIP_SENDER_MAIN, uiAction);
|
||||
player->ADD_GOSSIP_ITEM(GOSSIP_ICON_CHAT, "<- Back", GOSSIP_SENDER_MAIN, 7);
|
||||
player->SEND_GOSSIP_MENU(68, me->GetGUID());
|
||||
return true;
|
||||
}
|
||||
break;
|
||||
|
||||
}
|
||||
|
||||
OnGossipHello(player, me);
|
||||
return true;
|
||||
}
|
||||
};
|
||||
|
||||
void AddSC_npc_1v1arena() {
|
||||
new npc_1v1arena();
|
||||
}
|
||||
|
||||
@@ -25,6 +25,7 @@
|
||||
#include "Player.h"
|
||||
#include "WorldSession.h"
|
||||
#include "Opcodes.h"
|
||||
#include <Config.h>
|
||||
|
||||
ArenaTeam::ArenaTeam()
|
||||
: TeamId(0), Type(0), TeamName(), CaptainGuid(0), BackgroundColor(0), EmblemStyle(0), EmblemColor(0),
|
||||
@@ -552,6 +553,9 @@ uint8 ArenaTeam::GetSlotByType(uint32 type)
|
||||
case ARENA_TEAM_2v2: return 0;
|
||||
case ARENA_TEAM_3v3: return 1;
|
||||
case ARENA_TEAM_5v5: return 2;
|
||||
//[AZTH]
|
||||
case ARENA_TEAM_1v1: return 3;
|
||||
//[/AZTH]
|
||||
default:
|
||||
break;
|
||||
}
|
||||
@@ -590,6 +594,12 @@ uint32 ArenaTeam::GetPoints(uint32 memberRating)
|
||||
points *= 0.76f;
|
||||
else if (Type == ARENA_TEAM_3v3)
|
||||
points *= 0.88f;
|
||||
//[AZTH]
|
||||
else if (Type == ARENA_TEAM_1v1) // Custom 1v1 Arena Rated
|
||||
points *= sConfigMgr->GetFloatDefault("Azth.Rate.Arena1v1", 0.20f);
|
||||
//[/AZTH]
|
||||
|
||||
points *= sWorld->getRate(RATE_ARENA_POINTS);
|
||||
|
||||
return (uint32) points;
|
||||
}
|
||||
|
||||
@@ -81,6 +81,9 @@ ERR_ARENA_TEAM_LEVEL_TOO_LOW_I
|
||||
|
||||
enum ArenaTeamTypes
|
||||
{
|
||||
//[AZTH]
|
||||
ARENA_TEAM_1v1 = 1, // Custom 1v1 Arena Rated
|
||||
//[/AZTH]
|
||||
ARENA_TEAM_2v2 = 2,
|
||||
ARENA_TEAM_3v3 = 3,
|
||||
ARENA_TEAM_5v5 = 5
|
||||
|
||||
@@ -456,6 +456,13 @@ inline void Battleground::_ProcessJoin(uint32 diff)
|
||||
// First start warning - 2 or 1 minute
|
||||
SendMessageToAll(StartMessageIds[BG_STARTING_EVENT_FIRST], CHAT_MSG_BG_SYSTEM_NEUTRAL);
|
||||
}
|
||||
|
||||
//[AZTH]
|
||||
// 1v1 Arena - Start arena after 15s, when all players are in arena
|
||||
if (GetArenaType() == ARENA_TEAM_1v1 && GetStartDelayTime() > StartDelayTimes[BG_STARTING_EVENT_THIRD] && (m_PlayersCount[0] + m_PlayersCount[1]) == 2)
|
||||
SetStartDelayTime(StartDelayTimes[BG_STARTING_EVENT_THIRD]);
|
||||
//[/AZTH]
|
||||
|
||||
// After 1 minute or 30 seconds, warning is signaled
|
||||
else if (GetStartDelayTime() <= StartDelayTimes[BG_STARTING_EVENT_SECOND] && !(m_Events & BG_STARTING_EVENT_2))
|
||||
{
|
||||
|
||||
@@ -213,6 +213,9 @@ enum ScoreType
|
||||
|
||||
enum ArenaType
|
||||
{
|
||||
//[AZTH]
|
||||
ARENA_TYPE_1v1 = 1,
|
||||
//[/AZTH]
|
||||
ARENA_TYPE_2v2 = 2,
|
||||
ARENA_TYPE_3v3 = 3,
|
||||
ARENA_TYPE_5v5 = 5
|
||||
|
||||
@@ -116,7 +116,9 @@ void BattlegroundMgr::Update(uint32 diff)
|
||||
if (m_NextPeriodicQueueUpdateTime < diff)
|
||||
{
|
||||
// for rated arenas
|
||||
for (uint32 qtype = BATTLEGROUND_QUEUE_2v2; qtype <= BATTLEGROUND_QUEUE_5v5; ++qtype)
|
||||
//[AZTH]
|
||||
for (uint32 qtype = BATTLEGROUND_QUEUE_2v2; qtype <= BATTLEGROUND_QUEUE_1v1; ++qtype)
|
||||
//[/AZTH]
|
||||
for (uint32 bracket = BG_BRACKET_ID_FIRST; bracket < MAX_BATTLEGROUND_BRACKETS; ++bracket)
|
||||
m_BattlegroundQueues[qtype].BattlegroundQueueUpdate(BattlegroundBracketId(bracket), 0x03, true, 0); // pussywizard: 0 for rated means looking for opponents for every team
|
||||
|
||||
@@ -494,6 +496,11 @@ Battleground* BattlegroundMgr::CreateNewBattleground(BattlegroundTypeId bgTypeId
|
||||
uint32 maxPlayersPerTeam = 0;
|
||||
switch (arenaType)
|
||||
{
|
||||
//[AZTH]
|
||||
case ARENA_TYPE_1v1:
|
||||
maxPlayersPerTeam = 1;
|
||||
break;
|
||||
//[/AZTH]
|
||||
case ARENA_TYPE_2v2:
|
||||
maxPlayersPerTeam = 2;
|
||||
break;
|
||||
@@ -817,6 +824,10 @@ BattlegroundQueueTypeId BattlegroundMgr::BGQueueTypeId(BattlegroundTypeId bgType
|
||||
case BATTLEGROUND_RV:
|
||||
switch (arenaType)
|
||||
{
|
||||
//[AZTH]
|
||||
case ARENA_TYPE_1v1:
|
||||
return BATTLEGROUND_QUEUE_1v1;
|
||||
//[/AZTH]
|
||||
case ARENA_TYPE_2v2:
|
||||
return BATTLEGROUND_QUEUE_2v2;
|
||||
case ARENA_TYPE_3v3:
|
||||
@@ -849,6 +860,9 @@ BattlegroundTypeId BattlegroundMgr::BGTemplateId(BattlegroundQueueTypeId bgQueue
|
||||
return BATTLEGROUND_IC;
|
||||
case BATTLEGROUND_QUEUE_RB:
|
||||
return BATTLEGROUND_RB;
|
||||
//[AZTH]
|
||||
case BATTLEGROUND_QUEUE_1v1:
|
||||
//[/AZTH]
|
||||
case BATTLEGROUND_QUEUE_2v2:
|
||||
case BATTLEGROUND_QUEUE_3v3:
|
||||
case BATTLEGROUND_QUEUE_5v5:
|
||||
@@ -862,6 +876,10 @@ uint8 BattlegroundMgr::BGArenaType(BattlegroundQueueTypeId bgQueueTypeId)
|
||||
{
|
||||
switch (bgQueueTypeId)
|
||||
{
|
||||
//[AZTH]
|
||||
case BATTLEGROUND_QUEUE_1v1:
|
||||
return ARENA_TYPE_1v1;
|
||||
//[/AZTH]
|
||||
case BATTLEGROUND_QUEUE_2v2:
|
||||
return ARENA_TYPE_2v2;
|
||||
case BATTLEGROUND_QUEUE_3v3:
|
||||
|
||||
@@ -679,6 +679,9 @@ Player::Player(WorldSession* session): Unit(true), m_mover(this)
|
||||
#pragma warning(default:4355)
|
||||
#endif
|
||||
|
||||
//[AZTH] initialization
|
||||
azthPlayer = new AzthPlayer(this);
|
||||
|
||||
m_speakTime = 0;
|
||||
m_speakCount = 0;
|
||||
|
||||
@@ -17164,7 +17167,7 @@ void Player::_LoadArenaTeamInfo()
|
||||
{
|
||||
memset((void*)&m_uint32Values[PLAYER_FIELD_ARENA_TEAM_INFO_1_1], 0, sizeof(uint32) * MAX_ARENA_SLOT * ARENA_TEAM_END);
|
||||
|
||||
for (uint8 slot = 0; slot <= 2; ++slot)
|
||||
for (uint8 slot = 0; slot <= 3 /*[AZTH] 1v1 slot*/; ++slot)
|
||||
if (uint32 arenaTeamId = Player::GetArenaTeamIdFromStorage(GetGUIDLow(), slot))
|
||||
{
|
||||
ArenaTeam* arenaTeam = sArenaTeamMgr->GetArenaTeamById(arenaTeamId);
|
||||
|
||||
@@ -18,7 +18,10 @@
|
||||
|
||||
#ifndef _PLAYER_H
|
||||
#define _PLAYER_H
|
||||
|
||||
//[AZTH]
|
||||
#include "ArenaTeam.h"
|
||||
#include "AzthPlayer.h"
|
||||
//[/AZTH]
|
||||
#include "DBCStores.h"
|
||||
#include "GroupReference.h"
|
||||
#include "MapReference.h"
|
||||
@@ -1091,12 +1094,16 @@ private:
|
||||
class Player : public Unit, public GridObject<Player>
|
||||
{
|
||||
friend class WorldSession;
|
||||
friend class AzthPlayer; // [AZTH] make AzthPlayer friendly to Player, allowing private access
|
||||
friend void Item::AddToUpdateQueueOf(Player* player);
|
||||
friend void Item::RemoveFromUpdateQueueOf(Player* player);
|
||||
public:
|
||||
explicit Player(WorldSession* session);
|
||||
~Player();
|
||||
|
||||
// [AZTH] Custom variables
|
||||
AzthPlayer *azthPlayer;
|
||||
|
||||
void CleanupsBeforeDelete(bool finalCleanup = true);
|
||||
|
||||
void AddToWorld();
|
||||
@@ -1882,13 +1889,27 @@ class Player : public Unit, public GridObject<Player>
|
||||
SetArenaTeamInfoField(slot, ARENA_TEAM_ID, ArenaTeamId);
|
||||
SetArenaTeamInfoField(slot, ARENA_TEAM_TYPE, type);
|
||||
}
|
||||
|
||||
void SetArenaTeamInfoField(uint8 slot, ArenaTeamInfoType type, uint32 value)
|
||||
{
|
||||
// [AZTH] avoid higher slots to be set in datafield
|
||||
if (slot >= ArenaTeam::GetSlotByType(ARENA_TEAM_1v1)) {
|
||||
azthPlayer->setArena1v1Info(type, value);
|
||||
return;
|
||||
}
|
||||
// [/AZTH]
|
||||
SetUInt32Value(PLAYER_FIELD_ARENA_TEAM_INFO_1_1 + (slot * ARENA_TEAM_END) + type, value);
|
||||
}
|
||||
|
||||
uint32 GetArenaPersonalRating(uint8 slot) const {
|
||||
// [AZTH]
|
||||
if (slot == ArenaTeam::GetSlotByType(ARENA_TEAM_1v1))
|
||||
return azthPlayer->getArena1v1Info(ARENA_TEAM_PERSONAL_RATING);
|
||||
// [/AZTH]
|
||||
return GetUInt32Value(PLAYER_FIELD_ARENA_TEAM_INFO_1_1 + (slot * ARENA_TEAM_END) + ARENA_TEAM_PERSONAL_RATING);
|
||||
}
|
||||
static void LeaveAllArenaTeams(uint64 guid);
|
||||
uint32 GetArenaTeamId(uint8 slot) const { return GetUInt32Value(PLAYER_FIELD_ARENA_TEAM_INFO_1_1 + (slot * ARENA_TEAM_END) + ARENA_TEAM_ID); }
|
||||
uint32 GetArenaPersonalRating(uint8 slot) const { return GetUInt32Value(PLAYER_FIELD_ARENA_TEAM_INFO_1_1 + (slot * ARENA_TEAM_END) + ARENA_TEAM_PERSONAL_RATING); }
|
||||
void SetArenaTeamIdInvited(uint32 ArenaTeamId) { m_ArenaTeamIdInvited = ArenaTeamId; }
|
||||
uint32 GetArenaTeamIdInvited() { return m_ArenaTeamIdInvited; }
|
||||
|
||||
|
||||
@@ -3454,6 +3454,9 @@ enum BattlegroundQueueTypeId
|
||||
BATTLEGROUND_QUEUE_2v2 = 8,
|
||||
BATTLEGROUND_QUEUE_3v3 = 9,
|
||||
BATTLEGROUND_QUEUE_5v5 = 10,
|
||||
//[AZTH]
|
||||
BATTLEGROUND_QUEUE_1v1 = 11,
|
||||
//[/AZTH]
|
||||
MAX_BATTLEGROUND_QUEUE_TYPES
|
||||
};
|
||||
|
||||
|
||||
@@ -1242,6 +1242,10 @@ void AddBattlegroundScripts()
|
||||
#ifdef SCRIPTS
|
||||
/* This is where custom scripts' loading functions should be declared. */
|
||||
|
||||
//[AZTH]
|
||||
|
||||
//[/AZTH]
|
||||
|
||||
#endif
|
||||
|
||||
void AddCustomScripts()
|
||||
|
||||
@@ -349,6 +349,7 @@ enum Rates
|
||||
RATE_DROP_ITEM_REFERENCED_AMOUNT,
|
||||
RATE_DROP_MONEY,
|
||||
RATE_XP_KILL,
|
||||
// Manca RATE_XP_BG_KILL -> enum = 20
|
||||
RATE_XP_QUEST,
|
||||
RATE_XP_EXPLORE,
|
||||
RATE_REPAIRCOST,
|
||||
@@ -380,6 +381,7 @@ enum Rates
|
||||
RATE_AUCTION_DEPOSIT,
|
||||
RATE_AUCTION_CUT,
|
||||
RATE_HONOR,
|
||||
RATE_ARENA_POINTS,
|
||||
RATE_TALENT,
|
||||
RATE_CORPSE_DECAY_LOOTED,
|
||||
RATE_INSTANCE_RESET_TIME,
|
||||
|
||||
Reference in New Issue
Block a user