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); }
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); }
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; }
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); }
/// <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); } }
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 } }; } }
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."); }); } }
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); }
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; }); }
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 }
/// <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)); }
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); } }
/// <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); }
public ResolvedLootItemList GetPickPocketLoot() { return(LootMgr.GetEntries(LootEntryType.PickPocketing, PickPocketLootId)); }
public ResolvedLootItemList GetSkinningLoot() { return(LootMgr.GetEntries(LootEntryType.Skinning, SkinLootId)); }
public override ResolvedLootItemList GetLootEntries() { return(LootMgr.GetEntries(LootEntryType.NPCCorpse, LootId)); }
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(); } } }