Esempio n. 1
0
        public static void SendStatusActive(Character chr, Battleground bg, int queueIndex)
        {
            BattlegroundStatus battlegroundStatus = BattlegroundStatus.Active;
            BattlegroundSide   battlegroundSide   = chr.FactionGroup.GetBattlegroundSide();

            using (RealmPacketOut packet = new RealmPacketOut(RealmServerOpCode.SMSG_BATTLEFIELD_STATUS))
            {
                packet.Write(queueIndex);
                BattlegroundId id = bg.Template.Id;
                packet.Write((byte)0);
                packet.Write((byte)1);
                packet.Write((uint)id);
                packet.Write((ushort)8080);
                packet.Write((byte)0);
                packet.Write((byte)0);
                packet.Write(bg.InstanceId);
                packet.Write((byte)0);
                packet.Write((int)battlegroundStatus);
                packet.Write((int)bg.Id);
                packet.Write(bg.RemainingShutdownDelay);
                packet.Write(bg.RuntimeMillis);
                packet.Write((byte)battlegroundSide);
                chr.Send(packet, false);
            }
        }
Esempio n. 2
0
        public static void SendPvpData(IPacketReceiver reciever, BattlegroundSide side, Battleground bg)
        {
            bg.EnsureContext();
            using (RealmPacketOut packet =
                       new RealmPacketOut(RealmServerOpCode.MSG_PVP_LOG_DATA, 10 + bg.PlayerCount * 40))
            {
                BattlegroundTeam winner = bg.Winner;
                packet.Write(bg.IsArena);
                if (bg.IsArena)
                {
                    for (int index = 0; index < 2; ++index)
                    {
                        packet.Write(0);
                        packet.Write(3999);
                        packet.Write(0);
                    }

                    packet.WriteCString(string.Empty);
                    packet.WriteCString(string.Empty);
                }

                bool flag = bg.Winner != null;
                packet.Write(flag);
                if (flag)
                {
                    packet.Write((byte)bg.Winner.Side);
                }
                List <Character>         characters = bg.Characters;
                List <BattlegroundStats> listStats  = new List <BattlegroundStats>(characters.Count);
                characters.ForEach(chr => listStats.Add(chr.Battlegrounds.Stats));
                packet.Write(listStats.Count);
                for (int index = 0; index < listStats.Count; ++index)
                {
                    Character character = characters[index];
                    if (character.IsInBattleground)
                    {
                        BattlegroundStats stats = character.Battlegrounds.Stats;
                        packet.Write(character.EntityId);
                        packet.Write(stats.KillingBlows);
                        if (bg.IsArena)
                        {
                            packet.Write(winner != null && character.Battlegrounds.Team == winner);
                        }
                        else
                        {
                            packet.Write(stats.HonorableKills);
                            packet.Write(stats.Deaths);
                            packet.Write(stats.BonusHonor);
                        }

                        packet.Write(stats.TotalDamage);
                        packet.Write(stats.TotalHealing);
                        packet.Write(stats.SpecialStatCount);
                        stats.WriteSpecialStats(packet);
                    }
                }

                reciever.Send(packet, false);
            }
        }
Esempio n. 3
0
        protected void DoTryJoin(Character chr, bool asGroup, BattlegroundSide side)
        {
            EnsureContext();

            // if the character isn't in game, they can't join.
            if (!chr.IsInWorld)
            {
                return;
            }

            // can't join if the battleground isn't open
            if (!IsOpen)
            {
                return;
            }

            var team      = GetTeam(side);
            var teamQueue = _instanceQueue.GetTeamQueue(side);

            var chrs = teamQueue.GetCharacterSet(chr, asGroup);

            if (chrs != null)
            {
                team.Enqueue(chrs);
            }
        }
Esempio n. 4
0
 public static FactionGroup GetFactionGroup(this BattlegroundSide side)
 {
     if (side == BattlegroundSide.Horde)
     {
         return(FactionGroup.Horde);
     }
     return(FactionGroup.Alliance);
 }
        /// <summary>Enqueues the given Character(s) for the given side</summary>
        public BattlegroundRelation Enqueue(ICharacterSet chrs, BattlegroundSide side)
        {
            BattlegroundTeamQueue teamQueue = this.GetTeamQueue(side);
            BattlegroundRelation  request   = new BattlegroundRelation(teamQueue, chrs);

            teamQueue.Enqueue(request);
            return(request);
        }
        /// <summary>
        /// Enqueues the given Character(s) for the given side
        /// </summary>
        public BattlegroundRelation Enqueue(ICharacterSet chrs, BattlegroundSide side)
        {
            var queue   = GetTeamQueue(side);
            var request = new BattlegroundRelation(queue, chrs);

            queue.Enqueue(request);

            return(request);
        }
Esempio n. 7
0
 /// <summary>
 /// Removes up to the given amount of players from the Queues
 /// and adds them to the Battleground.
 /// </summary>
 /// <param name="amount"></param>
 /// <remarks>Map-Context required. Cannot be used once the Battleground is over.</remarks>
 /// <returns>The amount of remaining players</returns>
 public int ProcessPendingPlayers(BattlegroundSide side, int amount)
 {
     this.EnsureContext();
     if (this._instanceQueue == null)
     {
         return(0);
     }
     amount -= this._instanceQueue.GetTeamQueue(side).DequeueCharacters(amount, this);
     if (amount > 0)
     {
         amount -= this._parentQueue.GetTeamQueue(side).DequeueCharacters(amount, this);
     }
     return(amount);
 }
Esempio n. 8
0
        protected void DoTryJoin(Character chr, bool asGroup, BattlegroundSide side)
        {
            this.EnsureContext();
            if (!chr.IsInWorld || !this.IsOpen)
            {
                return;
            }
            BattlegroundTeam team         = this.GetTeam(side);
            ICharacterSet    characterSet = this._instanceQueue.GetTeamQueue(side).GetCharacterSet(chr, asGroup);

            if (characterSet == null)
            {
                return;
            }
            team.Enqueue(characterSet);
        }
Esempio n. 9
0
		public BattlegroundTeam(BattlegroundTeamQueue queue, BattlegroundSide side, Battleground battleground)
		{
			Queue = queue;
			Side = side;
			_battleground = battleground;

			var templ = battleground.Template;
			if (side == BattlegroundSide.Alliance)
			{
				_startPosition = templ.AllianceStartPosition;
				_startOrientation = templ.AllianceStartOrientation;
			}
			else
			{
				_startPosition = templ.HordeStartPosition;
				_startOrientation = templ.HordeStartOrientation;
			}
		}
Esempio n. 10
0
        public BattlegroundTeam(BattlegroundTeamQueue queue, BattlegroundSide side, Battleground battleground)
        {
            this.Queue         = queue;
            this.Side          = side;
            this._battleground = battleground;
            BattlegroundTemplate template = battleground.Template;

            if (side == BattlegroundSide.Alliance)
            {
                this._startPosition    = template.AllianceStartPosition;
                this._startOrientation = template.AllianceStartOrientation;
            }
            else
            {
                this._startPosition    = template.HordeStartPosition;
                this._startOrientation = template.HordeStartOrientation;
            }
        }
Esempio n. 11
0
        public BattlegroundTeam(BattlegroundTeamQueue queue, BattlegroundSide side, Battleground battleground)
        {
            Queue         = queue;
            Side          = side;
            _battleground = battleground;

            var templ = battleground.Template;

            if (side == BattlegroundSide.Alliance)
            {
                _startPosition    = templ.AllianceStartPosition;
                _startOrientation = templ.AllianceStartOrientation;
            }
            else
            {
                _startPosition    = templ.HordeStartPosition;
                _startOrientation = templ.HordeStartOrientation;
            }
        }
Esempio n. 12
0
        /// <summary>Is called when a Character logs back in</summary>
        protected internal virtual bool LogBackIn(Character chr)
        {
            BattlegroundSide battlegroundTeam = chr.Record.BattlegroundTeam;
            BattlegroundTeam team             = this.GetTeam(battlegroundTeam);

            if (battlegroundTeam != BattlegroundSide.End && !team.IsFull)
            {
                BattlegroundTeamQueue queue = team.Queue;
                int queueIndex =
                    chr.Battlegrounds.AddRelation(new BattlegroundRelation(queue, (ICharacterSet)chr, false));
                chr.Battlegrounds.Invitation = new BattlegroundInvitation(team, queueIndex);
            }
            else if (!chr.Role.IsStaff)
            {
                this.TeleportOutside(chr);
                return(false);
            }

            return(true);
        }
Esempio n. 13
0
 /// <summary>
 /// Tries to enqueue the given character or his whole group for the given battleground.
 /// </summary>
 /// <param name="chr">the character who enqueued</param>
 /// <param name="asGroup">whether or not to enqueue the character or his/her group</param>
 public void TryEnqueue(Character chr, bool asGroup, uint instanceId, BattlegroundSide side)
 {
     // specific instance given
     if (instanceId != 0)
     {
         var queue = GetQueue(chr);
         if (queue != null)
         {
             var bg = queue.GetBattleground(instanceId);
             if (bg != null && bg.HasQueue)
             {
                 bg.TryJoin(chr, asGroup, side);
             }
         }
     }
     else
     {
         var teamQueue = GetQueue(chr).GetTeamQueue(side);
         teamQueue.Enqueue(chr, asGroup);
     }
 }
Esempio n. 14
0
 /// <summary>
 /// Tries to enqueue the given character or his whole group for the given battleground.
 /// </summary>
 /// <param name="chr">the character who enqueued</param>
 /// <param name="asGroup">whether or not to enqueue the character or his/her group</param>
 public void TryEnqueue(Character chr, bool asGroup, uint instanceId, BattlegroundSide side)
 {
     if (instanceId != 0U)
     {
         GlobalBattlegroundQueue queue = this.GetQueue(chr);
         if (queue == null)
         {
             return;
         }
         Battleground battleground = queue.GetBattleground(instanceId);
         if (battleground == null || !battleground.HasQueue)
         {
             return;
         }
         battleground.TryJoin(chr, asGroup, side);
     }
     else
     {
         this.GetQueue(chr).GetTeamQueue(side).Enqueue(chr, asGroup);
     }
 }
Esempio n. 15
0
        /// <summary>
        /// Removes up to the given amount of players from the Queues
        /// and adds them to the Battleground.
        /// </summary>
        /// <param name="amount"></param>
        /// <remarks>Map-Context required. Cannot be used once the Battleground is over.</remarks>
        /// <returns>The amount of remaining players</returns>
        public int ProcessPendingPlayers(BattlegroundSide side, int amount)
        {
            EnsureContext();

            if (_instanceQueue == null)
            {
                return(0);
            }

            // dequeue from the instance queue first
            amount -= _instanceQueue.GetTeamQueue(side).DequeueCharacters(amount, this);

            if (amount > 0)
            {
                // we have slots left, try to pull from the global queue
                amount -= _parentQueue.GetTeamQueue(side).DequeueCharacters(amount, this);
            }

            // return the number of player slots that didn't get filled
            return(amount);
        }
Esempio n. 16
0
        public static void SendPvpData(IPacketReceiver reciever, BattlegroundSide side, Battleground bg)
        {
            bg.EnsureContext();

            using (var packet = new RealmPacketOut(RealmServerOpCode.MSG_PVP_LOG_DATA, 10 + bg.PlayerCount * 40))
            {
            	var winner = bg.Winner;

                packet.Write(bg.IsArena);
                if (bg.IsArena)
                {
                    // TODO: Arena
                    for (var i = 0; i < 2; i++)
                    {
                        packet.Write(0); // old rating
                        packet.Write(3999); // new rating (3000 + diff)
                        packet.Write(0); // matchmaking value (lvl group/rank?)
                    }

                    packet.WriteCString(string.Empty); // arena team names
                    packet.WriteCString(string.Empty);
                }

                var isFinished = bg.Winner != null;
                packet.Write(isFinished);
                if (isFinished)
                {
                    packet.Write((byte)bg.Winner.Side);
                }

				var chrs = bg.Characters;

				var chrCount = 0;
            	var chrCountPos = packet.Position;
            	packet.Position += 4;
                for (var i = 0; i < chrCount; i++)
                {
                	var chr = chrs[i];
					if (!chr.IsInBattleground)
					{
						continue;
					}

                	var stats = chr.Battlegrounds.Stats;

                	++chrCount;
                    packet.Write(chr.EntityId); // player guid
					packet.Write(stats.KillingBlows);

                    if (bg.IsArena)
					{
                        packet.Write(winner != null && chr.Battlegrounds.Team == winner); // is on the winning team
                    }
                    else
                    {
						packet.Write(stats.HonorableKills);
						packet.Write(stats.Deaths);
						packet.Write(stats.BonusHonor);
                    }

					packet.Write(stats.TotalDamage);
					packet.Write(stats.TotalHealing);

                    packet.Write(stats.SpecialStatCount);

                	stats.WriteSpecialStats(packet);
                }

            	packet.Position = chrCountPos;
            	packet.Write(chrCount);

                reciever.Send(packet);
            }
        }
Esempio n. 17
0
 protected BattlegroundTeamQueue(BattlegroundQueue parentQueue, BattlegroundSide side)
 {
     this._parentQueue = parentQueue;
     this.m_Side       = side;
 }
Esempio n. 18
0
		protected BattlegroundTeamQueue(BattlegroundQueue parentQueue, BattlegroundSide side)
		{
			_parentQueue = parentQueue;
			m_Side = side;
		}
Esempio n. 19
0
 public static BattlegroundSide GetOppositeSide(this BattlegroundSide side)
 {
     return(side == BattlegroundSide.Alliance ? BattlegroundSide.Horde : BattlegroundSide.Alliance);
 }
Esempio n. 20
0
		protected void DoTryJoin(Character chr, bool asGroup, BattlegroundSide side)
		{
			EnsureContext();

			// if the character isn't in game, they can't join.
			if (!chr.IsInWorld)
				return;

			// can't join if the battleground isn't open
			if (!IsOpen)
				return;

			var team = GetTeam(side);
			var teamQueue = _instanceQueue.GetTeamQueue(side);

			var chrs = teamQueue.GetCharacterSet(chr, asGroup);
			if (chrs != null)
			{
				team.Enqueue(chrs);
			}
		}
Esempio n. 21
0
		/// <summary>
		/// Returns the <see cref="BattlegroundTeam"/> of the given side
		/// </summary>
		/// <param name="side"></param>
		/// <returns></returns>
		public BattlegroundTeam GetTeam(BattlegroundSide side)
		{
			return _teams[(int)side];
		}
Esempio n. 22
0
		/// <summary>
		/// TODO: Spawn the side's flag
		/// Finalizes a capture (Flag changes colour (de/respawns, casts spells, etc)
		/// </summary>
		public void Capture()
		{
			var stats = (ArathiStats)Capturer.Battlegrounds.Stats;
			stats.BasesAssaulted++;

			if (Capturer.Battlegrounds.Team.Side == BattlegroundSide.Horde)
			{
				Instance.HordeBaseCount++;
				BaseOwner = BattlegroundSide.Horde;
			}
			else
			{
				Instance.AllianceBaseCount++;
				BaseOwner = BattlegroundSide.Alliance;
			}

			// It takes a few minutes before a captured flag begins to give score.
			StartScoreTimer.Start(ScoreDelayMillis, 0);

			var evt = BaseCaptured;
			if (evt != null)
			{
				evt(Capturer);
			}
		}
Esempio n. 23
0
 /// <summary>
 /// Enqueues a single Character to the global Queue of this Template
 /// </summary>
 /// <param name="chr"></param>
 /// <returns></returns>
 public BattlegroundRelation EnqueueCharacter(Character chr, BattlegroundSide side)
 {
     return(this.GetQueue(chr).Enqueue((ICharacterSet)chr, side));
 }
Esempio n. 24
0
 public BattlegroundTeamQueue GetTeamQueue(BattlegroundSide side)
 {
     return(TeamQueues[(int)side]);
 }
Esempio n. 25
0
 protected abstract BattlegroundTeamQueue CreateTeamQueue(BattlegroundSide side);
Esempio n. 26
0
		public BattlegroundTeamQueue GetTeamQueue(BattlegroundSide side)
		{
			return TeamQueues[(int)side];
		}
Esempio n. 27
0
		protected abstract BattlegroundTeamQueue CreateTeamQueue(BattlegroundSide side);
Esempio n. 28
0
        public static void SendPvpData(IPacketReceiver reciever, BattlegroundSide side, Battleground bg)
        {
            bg.EnsureContext();

            using (var packet = new RealmPacketOut(RealmServerOpCode.MSG_PVP_LOG_DATA, 10 + bg.PlayerCount * 40))
            {
                var winner = bg.Winner;

                packet.Write(bg.IsArena);
                if (bg.IsArena)
                {
                    // TODO: Arena
                    for (var i = 0; i < 2; i++)
                    {
                        packet.Write(0);    // old rating
                        packet.Write(3999); // new rating (3000 + diff)
                        packet.Write(0);    // matchmaking value (lvl group/rank?)
                    }

                    packet.WriteCString(string.Empty); // arena team names
                    packet.WriteCString(string.Empty);
                }

                var isFinished = bg.Winner != null;
                packet.Write(isFinished);
                if (isFinished)
                {
                    packet.Write((byte)bg.Winner.Side);
                }

                var chrs = bg.Characters;
                List <BattlegroundStats> listStats = new List <BattlegroundStats>(chrs.Count);
                chrs.ForEach(chr => listStats.Add(chr.Battlegrounds.Stats));
                packet.Write(listStats.Count);

                for (var i = 0; i < listStats.Count; i++)
                {
                    var chr = chrs[i];
                    if (!chr.IsInBattleground)
                    {
                        continue;
                    }

                    var stats = chr.Battlegrounds.Stats;

                    packet.Write(chr.EntityId); // player guid
                    packet.Write(stats.KillingBlows);

                    if (bg.IsArena)
                    {
                        packet.Write(winner != null && chr.Battlegrounds.Team == winner); // is on the winning team
                    }
                    else
                    {
                        packet.Write(stats.HonorableKills);
                        packet.Write(stats.Deaths);
                        packet.Write(stats.BonusHonor);
                    }

                    packet.Write(stats.TotalDamage);
                    packet.Write(stats.TotalHealing);

                    packet.Write(stats.SpecialStatCount);

                    stats.WriteSpecialStats(packet);
                }

                reciever.Send(packet);
            }
        }
Esempio n. 29
0
 /// <summary>
 /// Tries to enqueue the given Character or -if specified- his/her entire Group
 /// </summary>
 /// <param name="chr"></param>
 /// <param name="asGroup"></param>
 public void TryEnqueue(Character chr, bool asGroup, BattlegroundSide side)
 {
     this.TryEnqueue(chr, asGroup, 0U, side);
 }
Esempio n. 30
0
 /// <summary>
 /// Returns the <see cref="BattlegroundTeam"/> of the given side
 /// </summary>
 /// <param name="side"></param>
 /// <returns></returns>
 public BattlegroundTeam GetTeam(BattlegroundSide side)
 {
     return(_teams[(int)side]);
 }
		protected override BattlegroundTeamQueue CreateTeamQueue(BattlegroundSide side)
		{
			return new InstanceBGTeamQueue(this, side);
		}
Esempio n. 32
0
 /// <summary>
 /// Adds the given Character (or optionally his/her Group) to the Queue of this Battleground if possible.
 /// Make sure that HasQueue is true before calling this method.
 /// </summary>
 /// <param name="chr"></param>
 /// <param name="asGroup"></param>
 public void TryJoin(Character chr, bool asGroup, BattlegroundSide side)
 {
     ExecuteInContext(() => DoTryJoin(chr, asGroup, side));
 }
Esempio n. 33
0
 public GlobalBGTeamQueue(GlobalBattlegroundQueue parentQueue, BattlegroundSide side)
     : base(parentQueue, side)
 {
 }
 protected override BattlegroundTeamQueue CreateTeamQueue(BattlegroundSide side)
 {
     return(new InstanceBGTeamQueue(this, side));
 }
Esempio n. 35
0
		/// <summary>
		/// Adds the given Character (or optionally his/her Group) to the Queue of this Battleground if possible.
		/// Make sure that HasQueue is true before calling this method.
		/// </summary>
		/// <param name="chr"></param>
		/// <param name="asGroup"></param>
		public void TryJoin(Character chr, bool asGroup, BattlegroundSide side)
		{
			ExecuteInContext(() => DoTryJoin(chr, asGroup, side));
		}
Esempio n. 36
0
 protected override BattlegroundTeamQueue CreateTeamQueue(BattlegroundSide side)
 {
     return((BattlegroundTeamQueue) new GlobalBGTeamQueue(this, side));
 }
Esempio n. 37
0
		/// <summary>
		/// Removes up to the given amount of players from the Queues
		/// and adds them to the Battleground.
		/// </summary>
		/// <param name="amount"></param>
		/// <remarks>Map-Context required. Cannot be used once the Battleground is over.</remarks>
		/// <returns>The amount of remaining players</returns>
		public int ProcessPendingPlayers(BattlegroundSide side, int amount)
		{
			EnsureContext();

			if (_instanceQueue == null)
				return 0;

			// dequeue from the instance queue first
			amount -= _instanceQueue.GetTeamQueue(side).DequeueCharacters(amount, this);

			if (amount > 0)
			{
				// we have slots left, try to pull from the global queue
				amount -= _parentQueue.GetTeamQueue(side).DequeueCharacters(amount, this);
			}

			// return the number of player slots that didn't get filled
			return amount;
		}
Esempio n. 38
0
 public AVFaction GetFaction(BattlegroundSide side)
 {
     return Factions[(int)side];
 }
Esempio n. 39
0
 public InstanceBGTeamQueue(InstanceBattlegroundQueue parentQueue, BattlegroundSide side)
     : base(parentQueue, side)
 {
 }
Esempio n. 40
0
		/// <summary>
		/// Enqueues a single Character to the global Queue of this Template
		/// </summary>
		/// <param name="chr"></param>
		/// <returns></returns>
		public BattlegroundRelation EnqueueCharacter(Character chr, BattlegroundSide side)
		{
			return GetQueue(chr).Enqueue(chr, side);
		}
Esempio n. 41
0
		public InstanceBGTeamQueue(InstanceBattlegroundQueue parentQueue, BattlegroundSide side)
			: base(parentQueue, side)
		{
		}
Esempio n. 42
0
		/// <summary>
		/// Tries to enqueue the given Character or -if specified- his/her entire Group
		/// </summary>
		/// <param name="chr"></param>
		/// <param name="asGroup"></param>
		public void TryEnqueue(Character chr, bool asGroup, BattlegroundSide side)
		{
			TryEnqueue(chr, asGroup, 0u, side);
		}
Esempio n. 43
0
 public GlobalBGTeamQueue(GlobalBattlegroundQueue parentQueue, BattlegroundSide side)
     : base(parentQueue, side)
 {
 }
Esempio n. 44
0
		/// <summary>
		/// Tries to enqueue the given character or his whole group for the given battleground.
		/// </summary>
		/// <param name="chr">the character who enqueued</param>
		/// <param name="asGroup">whether or not to enqueue the character or his/her group</param>
		public void TryEnqueue(Character chr, bool asGroup, uint instanceId, BattlegroundSide side)
		{
			// specific instance given
			if (instanceId != 0)
			{
				var queue = GetQueue(chr);
				if (queue != null)
				{
					var bg = queue.GetBattleground(instanceId);
					if (bg != null && bg.HasQueue)
					{
						bg.TryJoin(chr, asGroup, side);
					}
				}
			}
			else
			{
				var teamQueue = GetQueue(chr).GetTeamQueue(side);
				teamQueue.Enqueue(chr, asGroup);
			}
		}
Esempio n. 45
0
 public AVFaction GetFaction(BattlegroundSide side)
 {
     return(Factions[(int)side]);
 }
Esempio n. 46
0
 /// <summary>
 /// Adds the given Character (or optionally his/her Group) to the Queue of this Battleground if possible.
 /// Make sure that HasQueue is true before calling this method.
 /// </summary>
 /// <param name="chr"></param>
 /// <param name="asGroup"></param>
 public void TryJoin(Character chr, bool asGroup, BattlegroundSide side)
 {
     this.ExecuteInContext((Action)(() => this.DoTryJoin(chr, asGroup, side)));
 }