Beispiel #1
0
 public override ResolvedLootItemList GetLootEntries()
 {
     if (this is IGOLootableEntry)
     {
         return(LootMgr.GetEntries(LootEntryType.GameObject, ((IGOLootableEntry)this).LootId));
     }
     return(null);
 }
        public override void Apply()
        {
            Character casterChar = m_cast.CasterChar;

            casterChar.Emote(EmoteType.SimpleTalk);
            LootMgr.CreateAndSendObjectLoot(m_cast.TargetItem, casterChar, LootEntryType.Disenchanting,
                                            false);
        }
Beispiel #3
0
        public override void Apply()
        {
            var caster = m_cast.CasterChar;

            caster.Emote(EmoteType.SimpleTalk);
            LootMgr.CreateAndSendObjectLoot(m_cast.TargetItem, caster, LootEntryType.Disenchanting, false);
            //m_cast.CasterChar.Inventory.AddAllUnchecked(loot, slots);
        }
Beispiel #4
0
        protected override void Apply(WorldObject target)
        {
            var caster = m_cast.CasterChar;
            var unit   = (Unit)target;

            caster.Emote(EmoteType.SimpleTalk);
            LootMgr.CreateAndSendObjectLoot(target, caster, LootEntryType.Skinning, false);
            unit.UnitFlags &= ~UnitFlags.Skinnable;
        }
Beispiel #5
0
 public override bool Use(Character user)
 {
     if (this.m_go.Entry.IsConsumable)
     {
         this.m_go.State = GameObjectState.Disabled;
     }
     if (this.m_go.Loot == null)
     {
         LootMgr.CreateAndSendObjectLoot((ILootable)this.m_go, user, LootEntryType.GameObject,
                                         user.Map.IsHeroic);
     }
     return(true);
 }
Beispiel #6
0
 /// <summary>
 /// Loot a container's contents
 /// </summary>
 public static void Loot(ILockable lockable, Character user)
 {
     if (lockable is Item)
     {
         LootMgr.CreateAndSendObjectLoot(lockable, user, LootEntryType.Item, user.Map.IsHeroic);
     }
     else if (lockable is GameObject)
     {
         ((GameObject)lockable).Handler.Use(user);
     }
     else
     {
         log.Error("{0} tried to loot invalid object: " + lockable, user);
     }
 }
Beispiel #7
0
        public override void Apply()
        {
            var caster = m_cast.CasterChar;
            var item   = m_cast.TargetItem;
            var loot   = LootMgr.CreateAndSendObjectLoot(item, caster, LootEntryType, false);

            if (loot != null)
            {
                loot.OnLootFinish = () => {
                    if (item.IsInWorld)
                    {
                        item.Amount -= Effect.MinValue;                                 // effect has always a constant value
                    }
                };
            }
        }
Beispiel #8
0
 public override void Process(CmdTrigger <RealmServerCmdArgs> trigger)
 {
     if (LootMgr.Loaded)
     {
         trigger.Reply("Loot has already been loaded.");
     }
     else
     {
         RealmServer.IOQueue.AddMessage(() =>
         {
             trigger.Reply("Loading Loot...");
             LootMgr.LoadAll();
             trigger.Reply("Done.");
         });
     }
 }
Beispiel #9
0
        public override bool Use(Character user)
        {
            if (m_go.Entry.IsConsumable)
            {
                m_go.State = GameObjectState.Disabled;
            }

            if (m_go.Loot != null)
            {
                //LootHandler.SendLootResponse(user, m_go.Loot);
            }
            else
            {
                LootMgr.CreateAndSendObjectLoot(m_go, user, LootEntryType.GameObject, user.Map.IsHeroic);
            }
            return(true);
        }
Beispiel #10
0
        public void TestLootGenerator()
        {
            GameNPC mob = new GameNPC();

            mob.Level = 6;
            mob.Name  = "impling";

            for (int i = 0; i < 15; i++)
            {
                Console.WriteLine("Loot " + i);
                ItemTemplate[] loot = LootMgr.GetLoot(mob, null);
                foreach (ItemTemplate item in loot)
                {
                    Console.WriteLine(mob.Name + " drops " + item.Name);
                }
            }

            Console.WriteLine("Drops finished");
        }
        public override void Apply()
        {
            Character  casterChar        = this.m_cast.CasterChar;
            Item       item              = this.m_cast.TargetItem;
            ObjectLoot andSendObjectLoot =
                LootMgr.CreateAndSendObjectLoot((ILootable)item, casterChar, this.LootEntryType, false);

            if (andSendObjectLoot == null)
            {
                return;
            }
            andSendObjectLoot.OnLootFinish = (Action)(() =>
            {
                if (!item.IsInWorld)
                {
                    return;
                }
                item.Amount -= this.Effect.MinValue;
            });
        }
Beispiel #12
0
        public void TestRolling()
        {
            Setup.EnsureBasicSetup();
            ItemMgr.InitMisc();

            // create group
            var group = GroupTest.CreateGroup(3);

            group.LootMethod = LootMethod.NeedBeforeGreed;

            var leaderMember = group.Leader;
            var leader       = (TestCharacter)leaderMember.Character;

            // create corpse
            var npc = Setup.NPCPool.CreateDummy();

            npc.EnsureInWorld();
            npc.FirstAttacker = leader;
            npc.Health        = 0;

            // create loot
            var loot = npc.Loot = new NPCLoot(npc, 0, new[] {
                new ItemStackTemplate(new ItemTemplate
                {
                    ItemId      = ItemId.Shortsword,
                    Id          = (uint)ItemId.Shortsword,
                    DefaultName = "Test Item1",
                    MaxAmount   = 3,
                    Quality     = ItemQuality.Artifact
                })
            });
            var lootItem = loot.Items[0];

            foreach (var member in group)
            {
                // let them all be next to the corpse
                ((TestCharacter)member.Character).EnsureXDistance(npc, 0.5f, true);
            }

            leader.Map.AddMessageAndWait(() => {
                var looters = LootMgr.FindLooters(npc, leader);
                Assert.AreEqual(group.CharacterCount, looters.Count);

                // initialize the Loot
                loot.Initialize(leader, looters, npc.MapId);
            });

            Assert.IsNotNull(lootItem.RollProgress);

            // everyone should now get the n/g box
            var i = 0;

            foreach (var member in group)
            {
                var chr = ((TestCharacter)member.Character);

                var rollStart = chr.FakeClient.DequeueSMSG(RealmServerOpCode.SMSG_LOOT_START_ROLL);
                Assert.IsNotNull(rollStart);

                Assert.AreEqual(npc.EntityId, rollStart["Looted"].Value);
                Assert.AreEqual(lootItem.Index, rollStart["ItemIndex"].Value);
                Assert.AreEqual(lootItem.Template.ItemId, rollStart["ItemTemplate"].Value);
                i++;
            }

            // let everyone roll
            var packet = new RealmPacketOut(RealmServerOpCode.CMSG_LOOT_ROLL);

            packet.Write(npc.EntityId);
            packet.Write(lootItem.Index);
            packet.Write((byte)LootRollType.Need);                      // need always before greed
            leader.FakeClient.ReceiveCMSG(packet, true);

            Assert.AreEqual(lootItem.RollProgress.HighestParticipant, leader);

            packet = new RealmPacketOut(RealmServerOpCode.CMSG_LOOT_ROLL);
            packet.Write(npc.EntityId);
            packet.Write(lootItem.Index);
            packet.Write((byte)LootRollType.Greed);
            ((TestCharacter)leaderMember.Next.Character).FakeClient.ReceiveCMSG(packet, true);

            Assert.AreEqual(lootItem.RollProgress.HighestParticipant, leader);
            Assert.AreEqual(1, lootItem.RollProgress.RemainingParticipants.Count);                              // one left

            packet = new RealmPacketOut(RealmServerOpCode.CMSG_LOOT_ROLL);
            packet.Write(npc.EntityId);
            packet.Write(lootItem.Index);
            packet.Write((byte)LootRollType.Greed);
            ((TestCharacter)leaderMember.Next.Next.Character).FakeClient.ReceiveCMSG(packet, true);

            // everyone rolled, item should have been given to the winner
            Assert.IsNull(lootItem.RollProgress);
            Assert.IsTrue(lootItem.Taken);
            Assert.IsTrue(leader.Inventory.Contains(lootItem.Template.Id, (int)lootItem.Amount, true));

            // since that was the only item: Loot should be unset and the corpse should now decay
            Assert.IsNull(npc.Loot);
            Assert.IsTrue(npc.IsDecaying);

            // TODO: Take money
            // TODO: Be not able to take items that are being rolled for
        }
Beispiel #13
0
 /// <summary>
 /// Lets the given user try to loot this object.
 /// Called on Chests automatically when using Chest-GOs.
 /// </summary>
 public bool TryLoot(Character chr)
 {
     return(LootMgr.TryLoot(this, chr));
 }
Beispiel #14
0
            public virtual void LoadAll(CmdTrigger <RealmServerCmdArgs> trigger, bool force)
            {
                var start = DateTime.Now;

                try
                {
                    if (ItemMgr.Loaded)
                    {
                        trigger.Reply("Item definitions have already been loaded.");
                    }
                    else
                    {
                        trigger.Reply("Loading Items...");
                        ItemMgr.LoadAll();
                        trigger.Reply("Done.");
                    }
                }
                catch (Exception ex)
                {
                    FailNotify(trigger, ex);
                }

                try
                {
                    if (NPCMgr.Loaded)
                    {
                        trigger.Reply("NPC definitions have already been loaded.");
                    }
                    else
                    {
                        trigger.Reply("Loading NPCs...");
                        NPCMgr.LoadNPCDefs(force);
                        trigger.Reply("Done.");
                    }
                }
                catch (Exception ex)
                {
                    FailNotify(trigger, ex);
                }

                try
                {
                    if (GOMgr.Loaded)
                    {
                        trigger.Reply("GO definitions have already been loaded.");
                    }
                    else
                    {
                        trigger.Reply("Loading GOs...");
                        GOMgr.LoadAll();
                        trigger.Reply("Done.");
                    }
                }
                catch (Exception ex)
                {
                    FailNotify(trigger, ex);
                }

                try
                {
                    if (QuestMgr.Loaded)
                    {
                        trigger.Reply("Quest definitions have already been loaded.");
                    }
                    else
                    {
                        trigger.Reply("Loading Quests...");
                        QuestMgr.LoadAll();
                        trigger.Reply("Done.");
                    }
                }
                catch (Exception ex)
                {
                    FailNotify(trigger, ex);
                }

                try
                {
                    if (LootMgr.Loaded)
                    {
                        trigger.Reply("Loot has already been loaded.");
                    }
                    else
                    {
                        trigger.Reply("Loading Loot...");
                        LootMgr.LoadAll();
                        trigger.Reply("Done.");
                    }
                }
                catch (Exception ex)
                {
                    FailNotify(trigger, ex);
                }

                trigger.Reply("All done - Loading took: " + (DateTime.Now - start));
                GC.Collect(2, GCCollectionMode.Optimized);

                if (Map.AutoSpawnMaps)
                {
                    MapCommand.MapSpawnCommand.SpawnAllMaps(trigger);
                }
            }
Beispiel #15
0
        /// <summary>
        /// Decides whether player can jump to the target point.
        /// All messages with reasons must be sent here.
        /// Can change destination too.
        /// </summary>
        /// <param name="targetPoint">The jump destination</param>
        /// <param name="player">The jumping player</param>
        /// <returns>True if allowed</returns>
        public bool IsAllowedToJump(ZonePoint targetPoint, GamePlayer player)
        {
            //Handles zoning INTO an instance.
            GameLocation          loc = null;
            AdventureWingInstance previousInstance = null;

            // Do we have a group ?
            if (player.Group != null)
            {
                //Check if there is an instance dedicated to this group
                foreach (Region region in WorldMgr.GetAllRegions())
                {
                    if (region is AdventureWingInstance && ((AdventureWingInstance)region).Group != null && ((AdventureWingInstance)region).Group == player.Group)
                    {
                        // Our group has an instance !
                        previousInstance = (AdventureWingInstance)region;
                        break;
                    }
                    else if (region is AdventureWingInstance && ((AdventureWingInstance)region).Player != null && ((AdventureWingInstance)region).Player == player.Group.Leader)
                    {
                        // Our leader has an instance !
                        previousInstance       = (AdventureWingInstance)region;
                        previousInstance.Group = player.Group;
                        break;
                    }
                }
            }
            else
            {
                // I am solo !
                //Check if there is an instance dedicated to me
                foreach (Region region in WorldMgr.GetAllRegions())
                {
                    if (region is AdventureWingInstance && ((AdventureWingInstance)region).Player != null && ((AdventureWingInstance)region).Player == player)
                    {
                        // I have an Instance !
                        previousInstance       = (AdventureWingInstance)region;
                        previousInstance.Group = player.Group;
                        break;
                    }
                }
            }


            if (previousInstance != null)
            {
                // We should check if we can go in !
                if (previousInstance.Skin != targetPoint.TargetRegion)
                {
                    //we're trying to enter in an other instance and we still have one !
                    //check if previous one is empty
                    if (previousInstance.NumPlayers > 0)
                    {
                        //We can't jump !
                        player.Out.SendMessage("You have another instance (" + previousInstance.Description + ") running with people in it !", eChatType.CT_System, eChatLoc.CL_SystemWindow);
                        return(false);
                    }
                    else
                    {
                        log.Warn("Player : " + player.Name + " requested new Instance, destroying instance " + previousInstance.Description + ", ID: " + previousInstance.ID + ", type=" + previousInstance.GetType().ToString() + ".");
                        WorldMgr.RemoveInstance(previousInstance);
                        previousInstance = null;
                    }
                }
            }

            if (previousInstance == null)
            {
                // I have no instance to go to, create one !
                previousInstance = (AdventureWingInstance)WorldMgr.CreateInstance(targetPoint.TargetRegion, typeof(AdventureWingInstance));
                if (targetPoint.SourceRegion != 0 && targetPoint.SourceRegion == player.CurrentRegionID)
                {
                    //source loc seems legit...
                    previousInstance.SourceEntrance = new GameLocation("source", targetPoint.SourceRegion, targetPoint.SourceX, targetPoint.SourceY, targetPoint.SourceZ);
                }

                if (player.Group != null)
                {
                    previousInstance.Group  = player.Group;
                    previousInstance.Player = player.Group.Leader;
                }
                else
                {
                    previousInstance.Group  = null;
                    previousInstance.Player = player;
                }

                //get region data
                long mobs       = 0;
                long merchants  = 0;
                long items      = 0;
                long bindpoints = 0;

                previousInstance.LoadFromDatabase(previousInstance.RegionData.Mobs, ref mobs, ref merchants, ref items, ref bindpoints);

                if (log.IsInfoEnabled)
                {
                    log.Info("Total Mobs: " + mobs);
                    log.Info("Total Merchants: " + merchants);
                    log.Info("Total Items: " + items);
                }

                //Attach Loot Generator
                LootMgr.RegisterLootGenerator(new LootGeneratorAurulite(), null, null, null, previousInstance.ID);

                // Player created new instance
                // Destroy all other instance that should be...
                List <Region> to_delete = new List <Region>();
                foreach (Region region in WorldMgr.GetAllRegions())
                {
                    if (region is AdventureWingInstance && (AdventureWingInstance)region != previousInstance)
                    {
                        AdventureWingInstance to_clean = (AdventureWingInstance)region;

                        // Won't clean up populated Instance
                        if (to_clean.NumPlayers == 0)
                        {
                            if (to_clean.Group != null && player.Group != null && to_clean.Group == player.Group)
                            {
                                // Got another instance for the same group... Destroy it !
                                to_delete.Add(to_clean);
                            }
                            else if (to_clean.Player != null && (to_clean.Player == player || (player.Group != null && player.Group.Leader == to_clean.Player)))
                            {
                                // Got another instance for the same player... Destroy it !
                                to_delete.Add(to_clean);
                            }
                            else if (to_clean.Group == null && to_clean.Player == null)
                            {
                                //nobody owns this instance anymore
                                to_delete.Add(to_clean);
                            }
                        }
                    }
                }

                //enumerate to_delete
                foreach (Region region in to_delete)
                {
                    log.Warn("Player : " + player.Name + " has provoked an instance cleanup - " + region.Description + ", ID: " + region.ID + ", type=" + region.GetType().ToString() + ".");
                    WorldMgr.RemoveInstance((BaseInstance)region);
                }
            }


            //get loc of instance
            if (previousInstance != null)
            {
                loc = new GameLocation(previousInstance.Description + " (instance)", previousInstance.ID, targetPoint.TargetX, targetPoint.TargetY, targetPoint.TargetZ, targetPoint.TargetHeading);
            }


            if (loc != null)
            {
                // Move Player, changing target destination is failing !!
                player.MoveTo(loc);
                return(false);
            }

            player.Out.SendMessage("Something went Wrong when creating Instance !", eChatType.CT_System, eChatLoc.CL_SystemWindow);
            return(false);
        }
Beispiel #16
0
 public ResolvedLootItemList GetPickPocketLoot()
 {
     return(LootMgr.GetEntries(LootEntryType.PickPocketing, PickPocketLootId));
 }
Beispiel #17
0
 public ResolvedLootItemList GetSkinningLoot()
 {
     return(LootMgr.GetEntries(LootEntryType.Skinning, SkinLootId));
 }
Beispiel #18
0
 public override ResolvedLootItemList GetLootEntries()
 {
     return(LootMgr.GetEntries(LootEntryType.NPCCorpse, LootId));
 }
Beispiel #19
0
        protected override void OnDeath()
        {
            m_brain.IsRunning = false;

            // hand out experience
            bool heroic;

            if (m_Map != null)
            {
                m_Map.OnNPCDied(this);
                heroic = m_Map.IsHeroic;
            }
            else
            {
                heroic = false;
            }

            var looter = m_FirstAttacker;

            if (!HasPlayerMaster)               // not player-owned NPC
            {
                var playerLooter = looter != null ? looter.PlayerOwner : null;
                if (playerLooter != null &&
                    LootMgr.GetOrCreateLoot(this, playerLooter, LootEntryType.NPCCorpse, heroic) != null)
                {
                    // NPCs don't have Corpse objects -> Spawning NPC Corpses will cause client to crash
                    //RemainingDecayDelay = m_entry.DefaultDecayDelay * 10;
                    EnterLootableState();
                }
                else
                {
                    // no loot
                    EnterFinalState();
                }
            }

            // notify events
            m_entry.NotifyDied(this);

            UnitFlags |= UnitFlags.SelectableNotAttackable;

            // send off the tamer
            if (m_currentTamer != null)
            {
                PetHandler.SendTameFailure(m_currentTamer, TameFailReason.TargetDead);
                CurrentTamer.SpellCast.Cancel(SpellFailedReason.Ok);
            }

            // reset spawn timer
            if (m_spawnPoint != null)
            {
                m_spawnPoint.SignalSpawnlingDied(this);
            }

            if (m_master != null)
            {
                // notify master
                if (m_master.IsInWorld)
                {
                    m_master.OnMinionDied(this);
                }
                else
                {
                    Delete();
                }
            }
        }