public static IList <Asda2LooterEntry> FindLooters(IAsda2Lootable lootable, Character initialLooter) { List <Asda2LooterEntry> asda2LooterEntryList = new List <Asda2LooterEntry>(); Asda2LootMgr.FindLooters(lootable, initialLooter, (IList <Asda2LooterEntry>)asda2LooterEntryList); return((IList <Asda2LooterEntry>)asda2LooterEntryList); }
public static void FindLooters(IAsda2Lootable lootable, Character initialLooter, IList <Asda2LooterEntry> looters) { if (lootable.UseGroupLoot) { var groupMember = initialLooter.GroupMember; if (groupMember != null) { var group = groupMember.Group; var method = group.LootMethod; var usesRoundRobin = method == LootMethod.RoundRobin; if (usesRoundRobin) { var member = group.GetNextRoundRobinMember(); if (member != null) { looters.Add(member.Character.LooterEntry); } } else { group.GetNearbyLooters(lootable, initialLooter, looters); } return; } } looters.Add(initialLooter.LooterEntry); }
public static void FindLooters(IAsda2Lootable lootable, Character initialLooter, IList <Asda2LooterEntry> looters) { if (lootable.UseGroupLoot) { GroupMember groupMember = initialLooter.GroupMember; if (groupMember != null) { Group group = groupMember.Group; if (group.LootMethod == LootMethod.RoundRobin) { GroupMember roundRobinMember = group.GetNextRoundRobinMember(); if (roundRobinMember == null) { return; } looters.Add(roundRobinMember.Character.LooterEntry); return; } group.GetNearbyLooters(lootable, (WorldObject)initialLooter, (ICollection <Asda2LooterEntry>)looters); return; } } looters.Add(initialLooter.LooterEntry); }
/// <summary> /// Whether the given lootable contains quest items for the given Character when looting with the given type /// </summary> public static bool ContainsQuestItemsFor(this IAsda2Lootable lootable, Character chr, Asda2LootEntryType type) { Asda2Loot loot = lootable.Loot; if (loot != null) { return(((IEnumerable <Asda2LootItem>)loot.Items).Any <Asda2LootItem>((Func <Asda2LootItem, bool>)(item => { if (item.Template.HasQuestRequirements) { return item.Template.CheckQuestConstraints(chr); } return false; }))); } List <Asda2LootItemEntry> entries = lootable.GetEntries(type); if (entries != null) { return(entries.Any <Asda2LootItemEntry>((Func <Asda2LootItemEntry, bool>)(entry => { if (entry.ItemTemplate.HasQuestRequirements) { return entry.ItemTemplate.CheckQuestConstraints(chr); } return false; }))); } return(false); }
public static IList <Asda2LooterEntry> FindLooters(IAsda2Lootable lootable, Character initialLooter) { var looters = new List <Asda2LooterEntry>(); FindLooters(lootable, initialLooter, looters); return(looters); }
/// <summary> /// Generates loot for Items and GOs. /// </summary> /// <param name="lootable">The Object or Unit that is being looted</param> /// <returns>The object's loot or null if there is nothing to get or the given Character can't access the loot.</returns> public static Asda2ObjectLoot CreateAndSendObjectLoot(IAsda2Lootable lootable, Character initialLooter, Asda2LootEntryType type) { var oldLoot = initialLooter.LooterEntry.Loot; if (oldLoot != null) { oldLoot.ForceDispose(); } var looters = FindLooters(lootable, initialLooter); var loot = CreateLoot <Asda2ObjectLoot>(lootable, initialLooter, type, 0); // TODO: pass mapid if (loot != null) { initialLooter.LooterEntry.Loot = loot; loot.Initialize(initialLooter, looters, 0); // TODO: pass mapid //LootHandler.SendLootResponse(initialLooter, loot); } else { //lootable.OnFinishedLooting(); // empty Item -> Don't do anything } return(loot); }
protected Asda2Loot(IAsda2Lootable looted, uint money, Asda2LootItem[] items) : this() { this.Money = money; this.Items = items; this.Lootable = looted; }
protected virtual void OnDispose() { if (Lootable != null) { Lootable.OnFinishedLooting(); Lootable = null; } }
protected virtual void OnDispose() { if (this.Lootable == null) { return; } this.Lootable.OnFinishedLooting(); this.Lootable = (IAsda2Lootable)null; }
/// <summary>Requires loot to already be generated</summary> /// <param name="lootable"></param> public void TryLoot(IAsda2Lootable lootable) { this.Release(); Asda2Loot loot = lootable.Loot; if (loot == null || !this.MayLoot(loot)) { return; } this.m_owner.CancelAllActions(); this.Loot = loot; }
public void GetNearbyLooters(IAsda2Lootable lootable, WorldObject initialLooter, ICollection <Asda2LooterEntry> looters) { foreach (Character objectsInRadiu in (!(lootable is WorldObject) ? initialLooter : (WorldObject)lootable) .GetObjectsInRadius(Asda2LootMgr.LootRadius, ObjectTypes.Player, false, 0)) { GroupMember groupMember; if (objectsInRadiu.IsAlive && (objectsInRadiu == initialLooter || (groupMember = objectsInRadiu.GroupMember) != null && groupMember.Group == this)) { looters.Add(objectsInRadiu.LooterEntry); } } }
/// <summary> /// Creates a new Loot object and returns it or null, if there is nothing to be looted. /// </summary> /// <typeparam name="T"><see cref="ObjectLoot"/> or <see cref="NPCLoot"/></typeparam> /// <param name="lootable"></param> /// <param name="initialLooter"></param> /// <param name="type"></param> /// <returns></returns> public static T CreateLoot <T>(IAsda2Lootable lootable, Character initialLooter, Asda2LootEntryType type, MapId mapid) where T : Asda2Loot, new() { var looters = FindLooters(lootable, initialLooter); var dropChanceBoost = 0f; var goldAmountBoost = 0f; foreach (var asda2LootItemEntry in looters) { dropChanceBoost += asda2LootItemEntry.Owner.Asda2DropChance - 1; goldAmountBoost += goldAmountBoost + asda2LootItemEntry.Owner.Asda2GoldAmountBoost - 1; } var items = CreateLootItems(lootable.GetLootId(type), type, looters, dropChanceBoost); var money = lootable.LootMoney * (DefaultMoneyDropFactor + goldAmountBoost); if (items.Length == 0 && money == 0) { if (lootable is GameObject) { // TODO: Don't mark GO as lootable if it has nothing to loot money = 1; } } if (items.Length > 0 || money > 0) { var loot = new T { Lootable = lootable, Money = (uint)(money > UInt32.MaxValue ? 1 : money), Items = items }; foreach (var asda2LootItem in items) { asda2LootItem.Loot = loot; } loot.Initialize(initialLooter, looters, mapid); return(loot); } else { //var loot = new T { Lootable = lootable, Money = 1, Items = LootItem.EmptyArray }; //loot.Initialize(initialLooter, looters); //return loot; return(null); } }
/// <summary> /// Whether the given lootable contains quest items for the given Character when looting with the given type /// </summary> public static bool ContainsQuestItemsFor(this IAsda2Lootable lootable, Character chr, Asda2LootEntryType type) { var loot = lootable.Loot; if (loot != null) { // loot has already been created return(loot.Items.Any(item => item.Template.HasQuestRequirements && item.Template.CheckQuestConstraints(chr))); } // no loot yet -> check what happens if we create any var entries = lootable.GetEntries(type); if (entries != null) { return(entries.Any(entry => entry.ItemTemplate.HasQuestRequirements && entry.ItemTemplate.CheckQuestConstraints(chr))); } return(false); }
/// <summary> /// Generates normal loot (usually for dead mob-corpses). /// Returns null, if the loot is empty. /// </summary> /// <param name="lootable">The Object or Unit that is being looted</param> public static Asda2Loot GetOrCreateLoot(IAsda2Lootable lootable, Character triggerChar, Asda2LootEntryType type) { Asda2Loot loot = lootable.Loot; if (loot != null) { if (loot.IsMoneyLooted && loot.RemainingCount == 0) { return((Asda2Loot)null); } loot.Looters.Clear(); } else { lootable.Loot = loot = (Asda2Loot)Asda2LootMgr.CreateLoot <Asda2NPCLoot>(lootable, triggerChar, type, MapId.Silaris); } return(loot); }
/// <summary> /// Generates normal loot (usually for dead mob-corpses). /// Returns null, if the loot is empty. /// </summary> /// <param name="lootable">The Object or Unit that is being looted</param> public static Asda2Loot GetOrCreateLoot(IAsda2Lootable lootable, Character triggerChar, Asda2LootEntryType type) { var loot = lootable.Loot; if (loot != null) { // apparently mob got killed a 2nd time if (loot.IsMoneyLooted && loot.RemainingCount == 0) { // already looted empty return(null); } loot.Looters.Clear(); } else { lootable.Loot = loot = CreateLoot <Asda2NPCLoot>(lootable, triggerChar, type, 0); // TODO: pass mapid } return(loot); }
/// <summary>Generates loot for Items and GOs.</summary> /// <param name="lootable">The Object or Unit that is being looted</param> /// <returns>The object's loot or null if there is nothing to get or the given Character can't access the loot.</returns> public static Asda2ObjectLoot CreateAndSendObjectLoot(IAsda2Lootable lootable, Character initialLooter, Asda2LootEntryType type) { Asda2Loot loot1 = initialLooter.LooterEntry.Loot; if (loot1 != null) { loot1.ForceDispose(); } IList <Asda2LooterEntry> looters = Asda2LootMgr.FindLooters(lootable, initialLooter); Asda2ObjectLoot loot2 = Asda2LootMgr.CreateLoot <Asda2ObjectLoot>(lootable, initialLooter, type, MapId.Silaris); if (loot2 != null) { initialLooter.LooterEntry.Loot = (Asda2Loot)loot2; loot2.Initialize(initialLooter, looters, MapId.Silaris); } return(loot2); }
/// <summary> /// Creates a new Loot object and returns it or null, if there is nothing to be looted. /// </summary> /// <typeparam name="T"><see cref="T:WCell.RealmServer.Looting.ObjectLoot" /> or <see cref="T:WCell.RealmServer.Looting.NPCLoot" /></typeparam> /// <param name="lootable"></param> /// <param name="initialLooter"></param> /// <param name="type"></param> /// <returns></returns> public static T CreateLoot <T>(IAsda2Lootable lootable, Character initialLooter, Asda2LootEntryType type, MapId mapid) where T : Asda2Loot, new() { IList <Asda2LooterEntry> looters = Asda2LootMgr.FindLooters(lootable, initialLooter); float dropChanceBoost = 0.0f; float num1 = 0.0f; foreach (Asda2LooterEntry asda2LooterEntry in (IEnumerable <Asda2LooterEntry>)looters) { dropChanceBoost += asda2LooterEntry.Owner.Asda2DropChance - 1f; num1 += (float)((double)num1 + (double)asda2LooterEntry.Owner.Asda2GoldAmountBoost - 1.0); } Asda2LootItem[] lootItems = Asda2LootMgr.CreateLootItems(lootable.GetLootId(type), type, looters, dropChanceBoost); float num2 = (float)lootable.LootMoney * ((float)Asda2LootMgr.DefaultMoneyDropFactor + num1); if (lootItems.Length == 0 && (double)num2 == 0.0 && lootable is GameObject) { num2 = 1f; } if (lootItems.Length <= 0 && (double)num2 <= 0.0) { return(default(T)); } T instance = Activator.CreateInstance <T>(); instance.Lootable = lootable; instance.Money = (double)num2 > 4294967296.0 ? 1U : (uint)num2; instance.Items = lootItems; T obj = instance; foreach (Asda2LootItem asda2LootItem in lootItems) { asda2LootItem.Loot = (Asda2Loot)obj; } obj.Initialize(initialLooter, looters, mapid); return(obj); }
/// <summary> /// Requires loot to already be generated /// </summary> /// <param name="lootable"></param> public void TryLoot(IAsda2Lootable 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 Asda2ObjectLoot(IAsda2Lootable looted, uint money, Asda2LootItem[] items) : base(looted, money, items) { }
public static List <Asda2LootItemEntry> GetEntries(this IAsda2Lootable lootable, Asda2LootEntryType type) { return(Asda2LootMgr.GetEntries(type, lootable.GetLootId(type))); }