コード例 #1
0
ファイル: Asda2LootMgr.cs プロジェクト: uvbs/Asda2-Server
        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);
        }
コード例 #2
0
        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);
        }
コード例 #3
0
ファイル: Asda2LootMgr.cs プロジェクト: uvbs/Asda2-Server
        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);
        }
コード例 #4
0
ファイル: Asda2LootMgr.cs プロジェクト: uvbs/Asda2-Server
        /// <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);
        }
コード例 #5
0
        public static IList <Asda2LooterEntry> FindLooters(IAsda2Lootable lootable, Character initialLooter)
        {
            var looters = new List <Asda2LooterEntry>();

            FindLooters(lootable, initialLooter, looters);
            return(looters);
        }
コード例 #6
0
        /// <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);
        }
コード例 #7
0
ファイル: Asda2Loot.cs プロジェクト: uvbs/Asda2-Server
 protected Asda2Loot(IAsda2Lootable looted, uint money, Asda2LootItem[] items)
     : this()
 {
     this.Money    = money;
     this.Items    = items;
     this.Lootable = looted;
 }
コード例 #8
0
 protected virtual void OnDispose()
 {
     if (Lootable != null)
     {
         Lootable.OnFinishedLooting();
         Lootable = null;
     }
 }
コード例 #9
0
ファイル: Asda2Loot.cs プロジェクト: uvbs/Asda2-Server
 protected virtual void OnDispose()
 {
     if (this.Lootable == null)
     {
         return;
     }
     this.Lootable.OnFinishedLooting();
     this.Lootable = (IAsda2Lootable)null;
 }
コード例 #10
0
        /// <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;
        }
コード例 #11
0
 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);
         }
     }
 }
コード例 #12
0
        /// <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);
            }
        }
コード例 #13
0
        /// <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);
        }
コード例 #14
0
ファイル: Asda2LootMgr.cs プロジェクト: uvbs/Asda2-Server
        /// <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);
        }
コード例 #15
0
        /// <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);
        }
コード例 #16
0
ファイル: Asda2LootMgr.cs プロジェクト: uvbs/Asda2-Server
        /// <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);
        }
コード例 #17
0
ファイル: Asda2LootMgr.cs プロジェクト: uvbs/Asda2-Server
        /// <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);
        }
コード例 #18
0
        /// <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);
            }
        }
コード例 #19
0
ファイル: Asda2ObjectLoot.cs プロジェクト: uvbs/Asda2-Server
 public Asda2ObjectLoot(IAsda2Lootable looted, uint money, Asda2LootItem[] items)
     : base(looted, money, items)
 {
 }
コード例 #20
0
ファイル: Asda2LootMgr.cs プロジェクト: uvbs/Asda2-Server
 public static List <Asda2LootItemEntry> GetEntries(this IAsda2Lootable lootable, Asda2LootEntryType type)
 {
     return(Asda2LootMgr.GetEntries(type, lootable.GetLootId(type)));
 }