/// <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); } }
/// <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)); }
/// <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)); } }
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); } }
/// <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); } }