コード例 #1
0
        /// <summary>
        /// Iterates over all online Characters in this team
        /// </summary>
        /// <param name="callback"></param>
        public void ForeachCharacter(Action <Character> callback)
        {
            _battleground.EnsureContext();

            foreach (var member in _members)
            {
                callback(member);
            }
        }
コード例 #2
0
        /// <summary>
        /// Removes the given amount of Characters from this Queue and adds them
        /// to the given <see cref="T:WCell.RealmServer.Battlegrounds.Battleground" />
        /// </summary>
        /// <param name="amount"></param>
        /// <param name="bg"></param>
        /// <returns>The amount of dequeued Characters</returns>
        internal int DequeueCharacters(int amount, Battleground bg)
        {
            bg.EnsureContext();
            LinkedListNode <BattlegroundRelation> first = this.PendingRequests.First;

            if (first == null)
            {
                return(0);
            }
            if (!this._parentQueue.RequiresLocking)
            {
                return(this.Dequeue(amount, bg, first));
            }
            lock (this.PendingRequests)
                return(this.Dequeue(amount, bg, first));
        }
コード例 #3
0
        /// <summary>
        /// Removes the given amount of Characters from this Queue and adds them
        /// to the given <see cref="Battleground"/>
        /// </summary>
        /// <param name="amount"></param>
        /// <param name="bg"></param>
        /// <returns>The amount of dequeued Characters</returns>
        internal int DequeueCharacters(int amount, Battleground bg)
        {
            bg.EnsureContext();

            var node = PendingRequests.First;

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

            if (_parentQueue.RequiresLocking)
            {
                lock (PendingRequests)
                {
                    return(Dequeue(amount, bg, node));
                }
            }
            else
            {
                return(Dequeue(amount, bg, node));
            }
        }
コード例 #4
0
ファイル: BattlegroundHandler.cs プロジェクト: ray2006/WCell
        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);
            }
        }
コード例 #5
0
		/// <summary>
		/// Removes the given amount of Characters from this Queue and adds them
		/// to the given <see cref="Battleground"/>
		/// </summary>
		/// <param name="amount"></param>
		/// <param name="bg"></param>
		/// <returns>The amount of dequeued Characters</returns>
		internal int DequeueCharacters(int amount, Battleground bg)
		{
			bg.EnsureContext();

			var node = PendingRequests.First;
			if (node == null)
			{
				return 0;
			}

			if (_parentQueue.RequiresLocking)
			{
				lock (PendingRequests)
				{
					return Dequeue(amount, bg, node);
				}
			}
			else
			{
				return Dequeue(amount, bg, node);
			}
		}