public LootRollProgress(Loot loot, LootItem lootItem, ICollection<LooterEntry> looters) { m_loot = loot; m_lootItem = lootItem; m_RemainingParticipants = new List<LooterEntry>(looters.Count); foreach (var looter in looters) { if (looter.Owner.PassOnLoot) continue; m_RemainingParticipants.Add(looter); } m_rolls = new SortedDictionary<LootRollEntry, LooterEntry>(); }
/// <summary> /// Returns whether this Looter is entitled to loot anything from the given loot /// </summary> public bool MayLoot(Loot loot) { if (m_owner == null) { return false; } if (((loot.Looters.Count == 0 || loot.Looters.Contains(this))) || // we are one of the initial looters OR: m_owner.GodMode || (loot.Group != null && m_owner.Group == loot.Group && ( // we are part of the group AND: (loot.FreelyAvailableCount > 0) || // there are freely available items or m_owner.GroupMember == loot.Group.MasterLooter))) // this is the MasterLooter { return true; } return false; }
/// <summary> /// Releases the current loot and (maybe) makes it available to everyone else. /// </summary> public void Release() { if (m_loot != null) { if (m_owner != null) { LootHandler.SendLootReleaseResponse(m_owner, m_loot); } m_loot.RemoveLooter(this); if (m_loot.Looters.Count == 0) { // last looter released m_loot.IsReleased = true; } Loot = null; } }
/// <summary> /// Performs application-defined tasks associated with freeing, releasing, or resetting unmanaged resources. /// </summary> /// <filterpriority>2</filterpriority> public void Dispose() { m_lootItem.RollProgress = null; m_loot = null; m_lootItem = null; }
public static void SendMasterList(Character looter, Loot loot) { using (var packet = new RealmPacketOut(RealmServerOpCode.SMSG_LOOT_MASTER_LIST)) { looter.Client.Send(packet); } }
/// <summary> /// Requires loot to already be generated /// </summary> /// <param name="lootable"></param> public void TryLoot(ILootable lootable) { Release(); // make sure that the Character is not still looting something else var loot = lootable.Loot; if (loot == null) { LootHandler.SendLootFail(m_owner, lootable); // TODO: Kneel and unkneel? } else if (MayLoot(loot)) { // we are either already a looter or become a new one m_owner.CancelAllActions(); Loot = loot; LootHandler.SendLootResponse(m_owner, loot); } else { LootHandler.SendLootFail(m_owner, lootable); } }
public static void SendAllPassed(Character looter, Loot loot, LootItem item) { using (var packet = new RealmPacketOut(RealmServerOpCode.SMSG_LOOT_ALL_PASSED)) { //packet.Write(item.); looter.Client.Send(packet); } }
public static void SendRollWon(Character looter, Loot loot, LootItem item, LootRollEntry entry) { using (var packet = new RealmPacketOut(RealmServerOpCode.SMSG_LOOT_ROLL_WON)) { packet.Write(loot.Lootable.EntityId); packet.Write(item.Index); packet.Write(looter.EntityId); packet.Write(item.Template.Id); packet.Write(item.Template.RandomSuffixFactor); packet.Write((int)(item.Template.RandomSuffixFactor > 0 ? -item.Template.RandomSuffixId : item.Template.RandomPropertiesId)); packet.Write(looter.EntityId); packet.Write(entry.Number); packet.Write((int)entry.Type); foreach (var looterEntry in loot.Looters) { if (looterEntry.Owner != null) { looterEntry.Owner.Client.Send(packet); } } } }
// TODO: Still unimplemented packets public static void SendItemNotify(Character looter, Loot loot) { using (var packet = new RealmPacketOut(RealmServerOpCode.SMSG_LOOT_ITEM_NOTIFY)) { // guid, byte, byte, int, string looter.Client.Send(packet); } }
public static void SendStartRoll(Loot loot, LootItem item, IEnumerable<LooterEntry> looters, MapId mapid) { using (var packet = new RealmPacketOut(RealmServerOpCode.SMSG_LOOT_START_ROLL)) { packet.Write(loot.Lootable.EntityId); packet.WriteUInt((uint)mapid); // TODO: actually use this packet.Write(item.Index); packet.Write(item.Template.Id); packet.Write(item.Template.RandomSuffixFactor); packet.Write((int)(item.Template.RandomSuffixFactor > 0 ? -item.Template.RandomSuffixId : item.Template.RandomPropertiesId)); packet.Write(LootMgr.DefaultLootRollTimeout); packet.Write((byte)0x0F); // since 3.3: loot roll mask foreach (var looter in looters) { if (looter.Owner != null) { looter.Owner.Client.Send(packet); } } } }
public static void SendClearMoney(Loot loot) { using (var packet = new RealmPacketOut(RealmServerOpCode.SMSG_LOOT_CLEAR_MONEY)) { foreach (var looterEntry in loot.Looters) { if (looterEntry.Owner != null) { looterEntry.Owner.Client.Send(packet); } } } }
public static void SendLootReleaseResponse(Character looter, Loot loot) { using (var packet = new RealmPacketOut(RealmServerOpCode.SMSG_LOOT_RELEASE_RESPONSE)) { packet.Write(looter.EntityId); packet.WriteByte(1); looter.Client.Send(packet); } }
public static void SendLootResponse(Character looter, Loot loot) { using (var packet = new RealmPacketOut(RealmServerOpCode.SMSG_LOOT_RESPONSE, 14 + (loot.RemainingCount * 22))) { var looterEntry = looter.LooterEntry; packet.Write(loot.Lootable.EntityId); packet.Write((byte)loot.ResponseType); packet.Write(loot.IsMoneyLooted ? 0 : loot.Money); var countPos = packet.Position; var count = 0; packet.Position++; for (var i = 0; i < loot.Items.Length; i++) { var item = loot.Items[i]; var templ = item.Template; var looters = item.MultiLooters; if (!item.Taken && ((looters == null && templ.CheckLootConstraints(looter)) || (looters != null && looters.Contains(looterEntry)))) { packet.Write((byte)i); packet.Write(templ.Id); packet.Write(item.Amount); packet.Write(templ.DisplayId); packet.Write(templ.RandomSuffixFactor); packet.Write(templ.RandomSuffixFactor > 0 ? -(int)templ.RandomSuffixId : (int)templ.RandomPropertiesId); packet.Write((byte)item.Decision); count++; } } packet.Position = countPos; packet.Write((byte)count); looter.Client.Send(packet); } }