void SendNotInArenaTeamPacket(ArenaTypes type) { ArenaError arenaError = new ArenaError(); arenaError.ErrorType = ArenaErrorType.NoTeam; arenaError.TeamSize = (byte)type; // team type (2=2v2, 3=3v3, 5=5v5), can be used for custom types... SendPacket(arenaError); }
public BattlegroundQueueTypeId BGQueueTypeId(BattlegroundTypeId bgTypeId, ArenaTypes arenaType) { switch (bgTypeId) { case BattlegroundTypeId.AB: return(BattlegroundQueueTypeId.AB); case BattlegroundTypeId.AV: return(BattlegroundQueueTypeId.AV); case BattlegroundTypeId.EY: return(BattlegroundQueueTypeId.EY); case BattlegroundTypeId.IC: return(BattlegroundQueueTypeId.IC); case BattlegroundTypeId.TP: return(BattlegroundQueueTypeId.TP); case BattlegroundTypeId.BFG: return(BattlegroundQueueTypeId.BFG); case BattlegroundTypeId.RB: return(BattlegroundQueueTypeId.RB); case BattlegroundTypeId.SA: return(BattlegroundQueueTypeId.SA); case BattlegroundTypeId.WS: return(BattlegroundQueueTypeId.WS); case BattlegroundTypeId.AA: case BattlegroundTypeId.BE: case BattlegroundTypeId.DS: case BattlegroundTypeId.NA: case BattlegroundTypeId.RL: case BattlegroundTypeId.RV: switch (arenaType) { case ArenaTypes.Team2v2: return(BattlegroundQueueTypeId.Arena2v2); case ArenaTypes.Team3v3: return(BattlegroundQueueTypeId.Arena3v3); case ArenaTypes.Team5v5: return(BattlegroundQueueTypeId.Arena5v5); default: return(BattlegroundQueueTypeId.None); } default: return(BattlegroundQueueTypeId.None); } }
public void ScheduleQueueUpdate(uint arenaMatchmakerRating, ArenaTypes arenaType, BattlegroundQueueTypeId bgQueueTypeId, BattlegroundTypeId bgTypeId, BattlegroundBracketId bracket_id) { //we will use only 1 number created of bgTypeId and bracket_id ulong scheduleId = ((ulong)arenaMatchmakerRating << 32) | ((uint)arenaType << 24) | ((uint)bgQueueTypeId << 16) | ((uint)bgTypeId << 8) | (uint)bracket_id; if (!m_QueueUpdateScheduler.Contains(scheduleId)) { m_QueueUpdateScheduler.Add(scheduleId); } }
// create a new Battleground that will really be used to play public Battleground CreateNewBattleground(BattlegroundTypeId originalBgTypeId, PvpDifficultyRecord bracketEntry, ArenaTypes arenaType, bool isRated) { BattlegroundTypeId bgTypeId = GetRandomBG(originalBgTypeId); // get the template BG Battleground bg_template = GetBattlegroundTemplate(bgTypeId); if (bg_template == null) { Log.outError(LogFilter.Battleground, "Battleground: CreateNewBattleground - bg template not found for {0}", bgTypeId); return(null); } if (bgTypeId == BattlegroundTypeId.RB || bgTypeId == BattlegroundTypeId.AA) { return(null); } // create a copy of the BG template Battleground bg = bg_template.GetCopy(); bool isRandom = bgTypeId != originalBgTypeId && !bg.isArena(); bg.SetBracket(bracketEntry); bg.SetInstanceID(Global.MapMgr.GenerateInstanceId()); bg.SetClientInstanceID(CreateClientVisibleInstanceId(isRandom ? BattlegroundTypeId.RB : bgTypeId, bracketEntry.GetBracketId())); bg.Reset(); // reset the new bg (set status to status_wait_queue from status_none) bg.SetStatus(BattlegroundStatus.WaitJoin); // start the joining of the bg bg.SetArenaType(arenaType); bg.SetTypeID(originalBgTypeId); bg.SetRandomTypeID(bgTypeId); bg.SetRated(isRated); bg.SetRandom(isRandom); bg.SetQueueId((ulong)bgTypeId | 0x1F10000000000000); // Set up correct min/max player counts for scoreboards if (bg.isArena()) { uint maxPlayersPerTeam = 0; switch (arenaType) { case ArenaTypes.Team2v2: maxPlayersPerTeam = 2; break; case ArenaTypes.Team3v3: maxPlayersPerTeam = 3; break; case ArenaTypes.Team5v5: maxPlayersPerTeam = 5; break; } bg.SetMaxPlayersPerTeam(maxPlayersPerTeam); bg.SetMaxPlayers(maxPlayersPerTeam * 2); } return(bg); }
public void BuildBattlegroundStatusFailed(out BattlefieldStatusFailed battlefieldStatus, Battleground bg, Player pPlayer, uint ticketId, ArenaTypes arenaType, GroupJoinBattlegroundResult result, ObjectGuid errorGuid = default(ObjectGuid)) { battlefieldStatus = new BattlefieldStatusFailed(); battlefieldStatus.Ticket.RequesterGuid = pPlayer.GetGUID(); battlefieldStatus.Ticket.Id = ticketId; battlefieldStatus.Ticket.Type = RideType.Battlegrounds; battlefieldStatus.Ticket.Time = (int)pPlayer.GetBattlegroundQueueJoinTime(BGQueueTypeId(bg.GetTypeID(), arenaType)); battlefieldStatus.QueueID = bg.GetQueueId(); battlefieldStatus.Reason = (int)result; if (!errorGuid.IsEmpty() && (result == GroupJoinBattlegroundResult.NotInBattleground || result == GroupJoinBattlegroundResult.JoinTimedOut)) { battlefieldStatus.ClientID = errorGuid; } }
public void BuildBattlegroundStatusQueued(out BattlefieldStatusQueued battlefieldStatus, Battleground bg, Player player, uint ticketId, uint joinTime, uint avgWaitTime, ArenaTypes arenaType, bool asGroup) { battlefieldStatus = new BattlefieldStatusQueued(); BuildBattlegroundStatusHeader(ref battlefieldStatus.Hdr, bg, player, ticketId, joinTime, arenaType); battlefieldStatus.AverageWaitTime = avgWaitTime; battlefieldStatus.AsGroup = asGroup; battlefieldStatus.SuspendedQueue = false; battlefieldStatus.EligibleForMatchmaking = true; battlefieldStatus.WaitTime = Time.GetMSTimeDiffToNow(joinTime); }
public void BuildBattlegroundStatusActive(out BattlefieldStatusActive battlefieldStatus, Battleground bg, Player player, uint ticketId, uint joinTime, ArenaTypes arenaType) { battlefieldStatus = new BattlefieldStatusActive(); BuildBattlegroundStatusHeader(ref battlefieldStatus.Hdr, bg, player, ticketId, joinTime, arenaType); battlefieldStatus.ShutdownTimer = bg.GetRemainingTime(); battlefieldStatus.ArenaFaction = (byte)(player.GetBGTeam() == Team.Horde ? TeamId.Horde : TeamId.Alliance); battlefieldStatus.LeftEarly = false; battlefieldStatus.StartTimer = bg.GetElapsedTime(); battlefieldStatus.Mapid = bg.GetMapId(); }
public void BuildBattlegroundStatusNeedConfirmation(out BattlefieldStatusNeedConfirmation battlefieldStatus, Battleground bg, Player player, uint ticketId, uint joinTime, uint timeout, ArenaTypes arenaType) { battlefieldStatus = new BattlefieldStatusNeedConfirmation(); BuildBattlegroundStatusHeader(ref battlefieldStatus.Hdr, bg, player, ticketId, joinTime, arenaType); battlefieldStatus.Mapid = bg.GetMapId(); battlefieldStatus.Timeout = timeout; battlefieldStatus.Role = 0; }
void BuildBattlegroundStatusHeader(ref BattlefieldStatusHeader header, Battleground bg, Player player, uint ticketId, uint joinTime, ArenaTypes arenaType) { header.Ticket = new RideTicket(); header.Ticket.RequesterGuid = player.GetGUID(); header.Ticket.Id = ticketId; header.Ticket.Type = RideType.Battlegrounds; header.Ticket.Time = (int)joinTime; header.QueueID = bg.GetQueueId(); header.RangeMin = (byte)bg.GetMinLevel(); header.RangeMax = (byte)bg.GetMaxLevel(); header.TeamSize = (byte)(bg.isArena() ? arenaType : 0); header.InstanceID = bg.GetClientInstanceID(); header.RegisteredMatch = bg.isRated(); header.TournamentRules = false; }
// create a new Battleground that will really be used to play public Battleground CreateNewBattleground(BattlegroundTypeId originalBgTypeId, PvpDifficultyRecord bracketEntry, ArenaTypes arenaType, bool isRated) { BattlegroundTypeId bgTypeId = GetRandomBG(originalBgTypeId); // get the template BG Battleground bg_template = GetBattlegroundTemplate(bgTypeId); if (bg_template == null) { Log.outError(LogFilter.Battleground, "Battleground: CreateNewBattleground - bg template not found for {0}", bgTypeId); return(null); } if (bgTypeId == BattlegroundTypeId.RB || bgTypeId == BattlegroundTypeId.AA) { return(null); } // create a copy of the BG template Battleground bg = bg_template.GetCopy(); bool isRandom = bgTypeId != originalBgTypeId && !bg.IsArena(); bg.SetBracket(bracketEntry); bg.SetInstanceID(Global.MapMgr.GenerateInstanceId()); bg.SetClientInstanceID(CreateClientVisibleInstanceId(isRandom ? BattlegroundTypeId.RB : bgTypeId, bracketEntry.GetBracketId())); bg.Reset(); // reset the new bg (set status to status_wait_queue from status_none) bg.SetStatus(BattlegroundStatus.WaitJoin); // start the joining of the bg bg.SetArenaType(arenaType); bg.SetRandomTypeID(bgTypeId); bg.SetRated(isRated); bg.SetRandom(isRandom); return(bg); }
void HandleBattlemasterJoinArena(BattlemasterJoinArena packet) { // ignore if we already in BG or BG queue if (GetPlayer().InBattleground()) { return; } ArenaTypes arenatype = (ArenaTypes)ArenaTeam.GetTypeBySlot(packet.TeamSizeIndex); //check existence Battleground bg = Global.BattlegroundMgr.GetBattlegroundTemplate(BattlegroundTypeId.AA); if (!bg) { Log.outError(LogFilter.Network, "Battleground: template bg (all arenas) not found"); return; } if (Global.DisableMgr.IsDisabledFor(DisableType.Battleground, (uint)BattlegroundTypeId.AA, null)) { GetPlayer().SendSysMessage(CypherStrings.ArenaDisabled); return; } BattlegroundTypeId bgTypeId = bg.GetTypeID(); BattlegroundQueueTypeId bgQueueTypeId = Global.BattlegroundMgr.BGQueueTypeId(bgTypeId, arenatype); PVPDifficultyRecord bracketEntry = Global.DB2Mgr.GetBattlegroundBracketByLevel(bg.GetMapId(), GetPlayer().getLevel()); if (bracketEntry == null) { return; } Group grp = GetPlayer().GetGroup(); // no group found, error if (!grp) { return; } if (grp.GetLeaderGUID() != GetPlayer().GetGUID()) { return; } uint ateamId = GetPlayer().GetArenaTeamId(packet.TeamSizeIndex); // check real arenateam existence only here (if it was moved to group.CanJoin .. () then we would ahve to get it twice) ArenaTeam at = Global.ArenaTeamMgr.GetArenaTeamById(ateamId); if (at == null) { GetPlayer().GetSession().SendNotInArenaTeamPacket(arenatype); return; } // get the team rating for queuing uint arenaRating = at.GetRating(); uint matchmakerRating = at.GetAverageMMR(grp); // the arenateam id must match for everyone in the group if (arenaRating <= 0) { arenaRating = 1; } BattlegroundQueue bgQueue = Global.BattlegroundMgr.GetBattlegroundQueue(bgQueueTypeId); uint avgTime = 0; GroupQueueInfo ginfo = null; ObjectGuid errorGuid; var err = grp.CanJoinBattlegroundQueue(bg, bgQueueTypeId, (uint)arenatype, (uint)arenatype, true, packet.TeamSizeIndex, out errorGuid); if (err == 0) { Log.outDebug(LogFilter.Battleground, "Battleground: arena team id {0}, leader {1} queued with matchmaker rating {2} for type {3}", GetPlayer().GetArenaTeamId(packet.TeamSizeIndex), GetPlayer().GetName(), matchmakerRating, arenatype); ginfo = bgQueue.AddGroup(GetPlayer(), grp, bgTypeId, bracketEntry, arenatype, true, false, arenaRating, matchmakerRating, ateamId); avgTime = bgQueue.GetAverageQueueWaitTime(ginfo, bracketEntry.GetBracketId()); } for (GroupReference refe = grp.GetFirstMember(); refe != null; refe = refe.next()) { Player member = refe.GetSource(); if (!member) { continue; } if (err != 0) { BattlefieldStatusFailed battlefieldStatus; Global.BattlegroundMgr.BuildBattlegroundStatusFailed(out battlefieldStatus, bg, GetPlayer(), 0, arenatype, err, errorGuid); member.SendPacket(battlefieldStatus); continue; } // add to queue uint queueSlot = member.AddBattlegroundQueueId(bgQueueTypeId); BattlefieldStatusQueued battlefieldStatusQueued; Global.BattlegroundMgr.BuildBattlegroundStatusQueued(out battlefieldStatusQueued, bg, member, queueSlot, ginfo.JoinTime, avgTime, arenatype, true); member.SendPacket(battlefieldStatusQueued); Log.outDebug(LogFilter.Battleground, "Battleground: player joined queue for arena as group bg queue type {0} bg type {1}: GUID {2}, NAME {3}", bgQueueTypeId, bgTypeId, member.GetGUID().ToString(), member.GetName()); } Global.BattlegroundMgr.ScheduleQueueUpdate(matchmakerRating, arenatype, bgQueueTypeId, bgTypeId, bracketEntry.GetBracketId()); }
void HandleRequestBattlefieldStatus(RequestBattlefieldStatus packet) { // we must update all queues here Battleground bg = null; for (byte i = 0; i < SharedConst.MaxPlayerBGQueues; ++i) { BattlegroundQueueTypeId bgQueueTypeId = GetPlayer().GetBattlegroundQueueTypeId(i); if (bgQueueTypeId == 0) { continue; } BattlegroundTypeId bgTypeId = Global.BattlegroundMgr.BGTemplateId(bgQueueTypeId); ArenaTypes arenaType = Global.BattlegroundMgr.BGArenaType(bgQueueTypeId); if (bgTypeId == GetPlayer().GetBattlegroundTypeId()) { bg = GetPlayer().GetBattleground(); //i cannot check any variable from player class because player class doesn't know if player is in 2v2 / 3v3 or 5v5 arena //so i must use bg pointer to get that information if (bg && bg.GetArenaType() == arenaType) { BattlefieldStatusActive battlefieldStatus; Global.BattlegroundMgr.BuildBattlegroundStatusActive(out battlefieldStatus, bg, GetPlayer(), i, GetPlayer().GetBattlegroundQueueJoinTime(bgQueueTypeId), arenaType); SendPacket(battlefieldStatus); continue; } } //we are sending update to player about queue - he can be invited there! //get GroupQueueInfo for queue status BattlegroundQueue bgQueue = Global.BattlegroundMgr.GetBattlegroundQueue(bgQueueTypeId); GroupQueueInfo ginfo; if (!bgQueue.GetPlayerGroupInfoData(GetPlayer().GetGUID(), out ginfo)) { continue; } if (ginfo.IsInvitedToBGInstanceGUID != 0) { bg = Global.BattlegroundMgr.GetBattleground(ginfo.IsInvitedToBGInstanceGUID, bgTypeId); if (!bg) { continue; } BattlefieldStatusNeedConfirmation battlefieldStatus; Global.BattlegroundMgr.BuildBattlegroundStatusNeedConfirmation(out battlefieldStatus, bg, GetPlayer(), i, GetPlayer().GetBattlegroundQueueJoinTime(bgQueueTypeId), Time.GetMSTimeDiff(Time.GetMSTime(), ginfo.RemoveInviteTime), arenaType); SendPacket(battlefieldStatus); } else { bg = Global.BattlegroundMgr.GetBattlegroundTemplate(bgTypeId); if (!bg) { continue; } // expected bracket entry PVPDifficultyRecord bracketEntry = Global.DB2Mgr.GetBattlegroundBracketByLevel(bg.GetMapId(), GetPlayer().getLevel()); if (bracketEntry == null) { continue; } uint avgTime = bgQueue.GetAverageQueueWaitTime(ginfo, bracketEntry.GetBracketId()); BattlefieldStatusQueued battlefieldStatus; Global.BattlegroundMgr.BuildBattlegroundStatusQueued(out battlefieldStatus, bg, GetPlayer(), i, GetPlayer().GetBattlegroundQueueJoinTime(bgQueueTypeId), avgTime, arenaType, ginfo.Players.Count > 1); SendPacket(battlefieldStatus); } } }
public achievement_arena_kills(string name, ArenaTypes arenaType) : base(name) { _arenaType = arenaType; }
public BattlegroundQueueTypeId BGQueueTypeId(ushort battlemasterListId, BattlegroundQueueIdType type, bool rated, ArenaTypes teamSize) { return(new BattlegroundQueueTypeId(battlemasterListId, (byte)type, rated, (byte)teamSize)); }