diff --git a/modules/azerothshard/src/server/game/AzthPlayer.cpp b/modules/azerothshard/src/server/game/AzthPlayer.cpp index e926f4d807..cea0c58f18 100644 --- a/modules/azerothshard/src/server/game/AzthPlayer.cpp +++ b/modules/azerothshard/src/server/game/AzthPlayer.cpp @@ -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; diff --git a/modules/azerothshard/src/server/game/AzthPlayer.h b/modules/azerothshard/src/server/game/AzthPlayer.h index ff8d4fe031..8ed19a4f76 100644 --- a/modules/azerothshard/src/server/game/AzthPlayer.h +++ b/modules/azerothshard/src/server/game/AzthPlayer.h @@ -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 */ diff --git a/modules/azerothshard/src/server/plugins/1v1.cpp b/modules/azerothshard/src/server/plugins/1v1.cpp index 50ab599e78..6ec43adf79 100644 --- a/modules/azerothshard/src/server/plugins/1v1.cpp +++ b/modules/azerothshard/src/server/plugins/1v1.cpp @@ -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(); + } diff --git a/src/server/game/Battlegrounds/ArenaTeam.cpp b/src/server/game/Battlegrounds/ArenaTeam.cpp index 1448ef2d0b..aa447d37fd 100644 --- a/src/server/game/Battlegrounds/ArenaTeam.cpp +++ b/src/server/game/Battlegrounds/ArenaTeam.cpp @@ -25,6 +25,7 @@ #include "Player.h" #include "WorldSession.h" #include "Opcodes.h" +#include 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; } diff --git a/src/server/game/Battlegrounds/ArenaTeam.h b/src/server/game/Battlegrounds/ArenaTeam.h index dc9594d21c..4f01d36ee2 100644 --- a/src/server/game/Battlegrounds/ArenaTeam.h +++ b/src/server/game/Battlegrounds/ArenaTeam.h @@ -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 diff --git a/src/server/game/Battlegrounds/Battleground.cpp b/src/server/game/Battlegrounds/Battleground.cpp index eab769cb94..86fd73e80f 100644 --- a/src/server/game/Battlegrounds/Battleground.cpp +++ b/src/server/game/Battlegrounds/Battleground.cpp @@ -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)) { diff --git a/src/server/game/Battlegrounds/Battleground.h b/src/server/game/Battlegrounds/Battleground.h index 4fe1499565..a8ba440580 100644 --- a/src/server/game/Battlegrounds/Battleground.h +++ b/src/server/game/Battlegrounds/Battleground.h @@ -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 diff --git a/src/server/game/Battlegrounds/BattlegroundMgr.cpp b/src/server/game/Battlegrounds/BattlegroundMgr.cpp index 0a419463c1..4613a5243b 100644 --- a/src/server/game/Battlegrounds/BattlegroundMgr.cpp +++ b/src/server/game/Battlegrounds/BattlegroundMgr.cpp @@ -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: diff --git a/src/server/game/Entities/Player/Player.cpp b/src/server/game/Entities/Player/Player.cpp index 2bfdc00749..cdce764f5a 100644 --- a/src/server/game/Entities/Player/Player.cpp +++ b/src/server/game/Entities/Player/Player.cpp @@ -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); diff --git a/src/server/game/Entities/Player/Player.h b/src/server/game/Entities/Player/Player.h index c293dd4da1..e6f952bd3d 100644 --- a/src/server/game/Entities/Player/Player.h +++ b/src/server/game/Entities/Player/Player.h @@ -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 { 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 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; } diff --git a/src/server/game/Miscellaneous/SharedDefines.h b/src/server/game/Miscellaneous/SharedDefines.h index 1ee56c1db3..697215c085 100644 --- a/src/server/game/Miscellaneous/SharedDefines.h +++ b/src/server/game/Miscellaneous/SharedDefines.h @@ -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 }; diff --git a/src/server/game/Scripting/ScriptLoader.cpp b/src/server/game/Scripting/ScriptLoader.cpp index 00d981ceee..dd375715f3 100644 --- a/src/server/game/Scripting/ScriptLoader.cpp +++ b/src/server/game/Scripting/ScriptLoader.cpp @@ -1246,6 +1246,10 @@ void AddBattlegroundScripts() #ifdef SCRIPTS /* This is where custom scripts' loading functions should be declared. */ +//[AZTH] + +//[/AZTH] + #endif void AddCustomScripts() diff --git a/src/server/game/World/World.h b/src/server/game/World/World.h index 06064dae3a..1306f96fdf 100644 --- a/src/server/game/World/World.h +++ b/src/server/game/World/World.h @@ -347,6 +347,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, @@ -378,6 +379,7 @@ enum Rates RATE_AUCTION_DEPOSIT, RATE_AUCTION_CUT, RATE_HONOR, + RATE_ARENA_POINTS, RATE_TALENT, RATE_CORPSE_DECAY_LOOTED, RATE_INSTANCE_RESET_TIME,