Exemple #1
0
        public static void WriteMissingItemIds()
        {
            Tools.StartRealm();

            var items = new Dictionary <uint, Spell>(500);

            foreach (var spell in SpellHandler.ById)
            {
                if (spell != null)
                {
                    spell.ForeachEffect(effect => {
                        if (effect.EffectType == SpellEffectType.CreateItem && effect.ItemId != 0)
                        {
                            if (ItemMgr.GetTemplate(effect.ItemId) == null)
                            {
                                items[effect.ItemId] = spell;
                            }
                        }
                    });
                }
            }

            using (var writer = new StreamWriter(ToolConfig.OutputDir + "MissingSpellItems.txt", false))
            {
                foreach (var pair in items)
                {
                    writer.WriteLine("{0} ({1})", pair.Key, pair.Value);
                }
            }
        }
Exemple #2
0
        public Item EnsureItem(ItemId item, int amount)
        {
            Setup.EnsureBasicSetup();
            ItemMgr.LoadAll();

            return(EnsureItem(ItemMgr.GetTemplate(item), amount));
        }
Exemple #3
0
        /// <summary>Loads the quest templates.</summary>
        /// <returns></returns>
        public static bool LoadAll()
        {
            if (!QuestMgr.Loaded)
            {
                QuestMgr.Templates = new QuestTemplate[30000];
                ContentMgr.Load <QuestTemplate>();
                ContentMgr.Load <QuestPOI>();
                ContentMgr.Load <QuestPOIPoints>();
                QuestMgr.CreateQuestRelationGraph();
                QuestMgr.EnsureCharacterQuestsLoaded();
                QuestMgr.AddSpellCastObjectives();
                if (ItemMgr.Loaded)
                {
                    ItemMgr.EnsureItemQuestRelations();
                }
                foreach (QuestTemplate template1 in QuestMgr.Templates)
                {
                    if (template1 != null)
                    {
                        ItemTemplate template2 = ItemMgr.GetTemplate(template1.SrcItemId);
                        if (template2 != null && template1.SrcItemId != (Asda2ItemId)0 &&
                            !template1.Starters.Contains((IQuestHolderEntry)template2))
                        {
                            template1.ProvidedItems.Add(new Asda2ItemStackDescription(template1.SrcItemId, 1));
                        }
                    }
                }

                QuestMgr.Loaded = true;
                QuestMgr.log.Debug("{0} Quests loaded.", QuestMgr._questCount);
            }

            return(true);
        }
Exemple #4
0
        protected override void Remove(bool cancelled)
        {
            var procFlags = m_aura.Spell.ProcTriggerFlags;
            var owner     = m_aura.Auras.Owner;

            if (!owner.IsAlive &&
                (!procFlags.HasFlag(ProcTriggerFlags.KilledTargetThatYieldsExperienceOrHonor) || owner.YieldsXpOrHonor))
            {
                var item = ItemMgr.GetTemplate(SpellEffect.ItemId);
                if (item == null)
                {
                    log.Warn("Spell {0} referred to invalid Item: {1} ({2})", m_aura.Spell,
                             (ItemId)SpellEffect.ItemId, SpellEffect.ItemId);
                }
                else
                {
                    var caster = m_aura.CasterUnit;
                    if (caster != null && (caster = caster.Master as Character) != null)
                    {
                        var amount = Math.Max(1, EffectValue);
                        ((Character)caster).Inventory.TryAdd(item, ref amount);
                    }
                }
            }
        }
Exemple #5
0
        public override void Convert(byte[] rawData)
        {
            var raceClassGender = GetUInt32(rawData, 1);
            var race            = (RaceId)(raceClassGender & 0xFF);
            var clss            = (ClassId)((raceClassGender & 0xFF00) >> 8);
            var gender          = (GenderType)((raceClassGender & 0xFF0000) >> 16);

            var archetype = ArchetypeMgr.GetArchetype(race, clss);

            if (archetype == null)
            {
                return;
            }

            var items = archetype.GetInitialItems(gender);

            for (var i = 2; i <= 25; i++)
            {
                var itemId = GetInt32(rawData, i);
                if (itemId > 0)
                {
                    var templ = ItemMgr.GetTemplate((ItemId)itemId);
                    if (templ == null)
                    {
                        LogManager.GetCurrentClassLogger().Warn("Missing initial Item in DB: " + itemId + " (" + (uint)itemId + ")");
                    }
                    else
                    {
                        if (templ.IsStackable)
                        {
                            var index = items.FindIndex(stack => stack.Template.Id == itemId);
                            if (index > -1)
                            {
                                items[index] = new ItemStack
                                {
                                    Template = templ,
                                    Amount   = items[index].Amount + 1
                                };
                            }
                            else
                            {
                                items.Add(new ItemStack
                                {
                                    Template = templ,
                                    Amount   = templ.IsAmmo ? templ.MaxAmount : 1
                                });
                            }
                        }
                        else
                        {
                            items.Add(new ItemStack
                            {
                                Template = templ,
                                Amount   = 1
                            });
                        }
                    }
                }
            }
        }
Exemple #6
0
        public override SpellFailedReason InitializeTarget(WorldObject target)
        {
            var templId = Effect.ItemId;

            templ  = ItemMgr.GetTemplate(templId);
            amount = CalcEffectValue();

            if (templ == null)
            {
                log.Warn("Spell {0} referred to invalid Item {1}", Effect.Spell, templId);
                return(SpellFailedReason.ItemNotFound);
            }

            // find a free slot
            // TODO: Add & use HoldFreeSlotCheck instead, so slot won't get occupied
            InventoryError error;

            slotId = ((Character)target).Inventory.FindFreeSlotCheck(templ, amount, out error);
            if (error != InventoryError.OK)
            {
                ItemHandler.SendInventoryError((Character)target, error);
                return(SpellFailedReason.DontReport);
            }

            return(SpellFailedReason.Ok);
        }
        public void FinalizeDataHolder()
        {
            Template = ItemMgr.GetTemplate(ItemId);
            if (Template == null)
            {
                ContentMgr.OnInvalidDBData("{0} has invalid ItemId: {1} ({2})", this, ItemId, (int)ItemId);
            }
            else
            {
                var list = NPCMgr.GetOrCreateVendorList(VendorId);

                // set defaults
                if (StockAmount < 0)
                {
                    StockAmount = Template.StockAmount;
                }
                if (StockRefillDelay < 0)
                {
                    StockRefillDelay = Template.StockRefillDelay;
                }

                remainingStackAmount = StockAmount;
                list.Add(this);
            }
        }
Exemple #8
0
            public override void Process(CmdTrigger <RealmServerCmdArgs> trigger)
            {
                var mods  = trigger.Text.NextModifiers();
                var entry = trigger.Text.NextEnum(ItemId.None);
                var templ = ItemMgr.GetTemplate(entry);

                if (templ == null)
                {
                    trigger.Reply("Invalid ItemId.");
                    return;
                }

                if (templ.IsCharter)
                {
                    trigger.Reply("Charters cannot be added by command.");
                    return;
                }

                var amount    = trigger.Text.NextInt(1);
                var stacks    = trigger.Text.NextUInt(1);
                var ensure    = mods.Contains("e");
                var autoEquip = mods.Contains("a");

                for (var i = 0; i < stacks; i++)
                {
                    if (!AddItem((Character)trigger.Args.Target, templ, amount, autoEquip, ensure))
                    {
                        break;
                    }
                }
                //trigger.Reply("{0}/{1} stacks of {2} created{3}", x, stacks, templ, err == InventoryError.OK ? "." : ": " + err);
            }
Exemple #9
0
        public override void Convert(byte[] rawData)
        {
            uint       uint32    = DBCRecordConverter.GetUInt32(rawData, 1);
            RaceId     race      = (RaceId)((int)uint32 & (int)byte.MaxValue);
            ClassId    clssId    = (ClassId)((uint32 & 65280U) >> 8);
            GenderType gender    = (GenderType)((uint32 & 16711680U) >> 16);
            Archetype  archetype = ArchetypeMgr.GetArchetype(race, clssId);

            if (archetype == null)
            {
                return;
            }
            List <ItemStack> initialItems = archetype.GetInitialItems(gender);

            for (int field = 2; field <= 25; ++field)
            {
                int itemId = DBCRecordConverter.GetInt32(rawData, field);
                if (itemId > 0)
                {
                    ItemTemplate template = ItemMgr.GetTemplate((Asda2ItemId)itemId);
                    if (template == null)
                    {
                        LogManager.GetCurrentClassLogger()
                        .Warn("Missing initial Item in DB: " + (object)itemId + " (" + (object)(uint)itemId +
                              ")");
                    }
                    else if (template.IsStackable)
                    {
                        int index = initialItems.FindIndex((Predicate <ItemStack>)(stack =>
                                                                                   (long)stack.Template.Id == (long)itemId));
                        if (index > -1)
                        {
                            initialItems[index] = new ItemStack()
                            {
                                Template = template,
                                Amount   = initialItems[index].Amount + 1
                            }
                        }
                        ;
                        else
                        {
                            initialItems.Add(new ItemStack()
                            {
                                Template = template,
                                Amount   = template.IsAmmo ? template.MaxAmount : 1
                            });
                        }
                    }
                    else
                    {
                        initialItems.Add(new ItemStack()
                        {
                            Template = template,
                            Amount   = 1
                        });
                    }
                }
            }
        }
Exemple #10
0
        public static Item CreateItem(uint templateId, Character owner, int amount)
        {
            ItemTemplate template = ItemMgr.GetTemplate(templateId);

            if (template != null)
            {
                return(CreateItem(template, owner, amount));
            }
            return(null);
        }
Exemple #11
0
        public ItemRecord AddItem(Asda2ItemId item)
        {
            ItemTemplate template = ItemMgr.GetTemplate(item);

            if (template == null)
            {
                return(null);
            }
            return(AddItem(template));
        }
Exemple #12
0
        public static void HandleItemSingleQuery(RealmClient client, RealmPacketIn packet)
        {
            uint itemId = packet.ReadUInt32();

            ItemTemplate item = ItemMgr.GetTemplate(itemId);

            if (item == null)
            {
                return;
            }

            SendItemQueryResponse(client, item);
        }
Exemple #13
0
            public override void Process(CmdTrigger <RealmServerCmdArgs> trigger)
            {
                var text = trigger.Text;
                var mod  = text.NextModifiers();

                var items = new List <ItemRecord>();
                var cod   = 0u;
                var money = 0u;

                if (mod.Contains("i"))
                {
                    var itemId   = trigger.Text.NextEnum(ItemId.None);
                    var template = ItemMgr.GetTemplate(itemId);
                    if (template == null)
                    {
                        trigger.Reply("Invalid ItemId.");
                        return;
                    }
                    var item = ItemRecord.CreateRecord(template);
                    items.Add(item);
                    item.SaveLater();
                }

                if (mod.Contains("c"))
                {
                    cod = text.NextUInt();
                }

                var recipientName = trigger.Text.NextWord();

                if (recipientName.Length == 0)
                {
                    trigger.Reply("Could not send mail - Unknown Recipient: " + recipientName);
                    return;
                }
                var subject = trigger.Text.NextWord(",");
                var msg     = trigger.Text.Remainder;

                var err = MailMgr.SendMail(recipientName, subject, msg, MailStationary.GM, items, money, cod, trigger.Args.User);

                if (err == MailError.OK)
                {
                    trigger.Reply("Done.");
                }
                else
                {
                    trigger.Reply("Could not send mail: " + err);
                }
            }
Exemple #14
0
            public override void Process(CmdTrigger <RealmServerCmdArgs> trigger)
            {
                StringStream      text           = trigger.Text;
                string            str            = text.NextModifiers();
                List <ItemRecord> itemRecordList = new List <ItemRecord>();
                uint cod   = 0;
                uint money = 0;

                if (str.Contains("i"))
                {
                    ItemTemplate template = ItemMgr.GetTemplate(trigger.Text.NextEnum(Asda2ItemId.None));
                    if (template == null)
                    {
                        trigger.Reply("Invalid ItemId.");
                        return;
                    }

                    ItemRecord record = ItemRecord.CreateRecord(template);
                    itemRecordList.Add(record);
                    record.SaveLater();
                }

                if (str.Contains("c"))
                {
                    cod = text.NextUInt();
                }
                string recipientName = trigger.Text.NextWord();

                if (recipientName.Length == 0)
                {
                    trigger.Reply("Could not send mail - Unknown Recipient: " + recipientName);
                }
                else
                {
                    string    subject   = trigger.Text.NextWord(",");
                    string    remainder = trigger.Text.Remainder;
                    MailError mailError = MailMgr.SendMail(recipientName, subject, remainder, MailStationary.GM,
                                                           itemRecordList, money, cod, trigger.Args.User);
                    if (mailError == MailError.OK)
                    {
                        trigger.Reply("Done.");
                    }
                    else
                    {
                        trigger.Reply("Could not send mail: " + mailError);
                    }
                }
            }
Exemple #15
0
 /// <summary>
 ///   Sets this NPC's equipment to the given entry
 /// </summary>
 public void SetEquipment(NPCEquipmentEntry equipment)
 {
     for (var i = 0; i < equipment.ItemIds.Length; i++)
     {
         var itemId = equipment.ItemIds[i];
         if (itemId != 0)
         {
             var item = ItemMgr.GetTemplate(itemId);
             if (item != null)
             {
                 SheathType = item.SheathType; // TODO: How to use the sheath type of all items?
             }
             SetUInt32(UnitFields.VIRTUAL_ITEM_SLOT_ID + i, (uint)itemId);
         }
     }
 }
Exemple #16
0
        /// <summary>
        /// Loads the quest templates.
        /// </summary>
        /// <returns></returns>
        public static bool LoadAll()
        {
            if (!Loaded)
            {
                new DBCReader <QuestXpConverter>(RealmServerConfiguration.GetDBCFile(WCellConstants.DBC_QUESTXP));
                new DBCReader <QuestRewRepConverter>(RealmServerConfiguration.GetDBCFile(WCellConstants.DBC_QUESTFACTIONREWARD));
                new DBCReader <QuestHonorInfoConverter>(RealmServerConfiguration.GetDBCFile(WCellConstants.DBC_TEAMCONTRIBUTIONPOINTS));
                Templates = new QuestTemplate[30000];

                ContentMgr.Load <QuestTemplate>();
                ContentMgr.Load <QuestPOI>();
                ContentMgr.Load <QuestPOIPoints>();
                CreateQuestRelationGraph();

                EnsureCharacterQuestsLoaded();
                AddSpellCastObjectives();

                // add Item quest starters & add collect quests to corresponding items
                if (ItemMgr.Loaded)
                {
                    ItemMgr.EnsureItemQuestRelations();
                }

                // add items to list of provided items
                foreach (var qTempl in Templates)
                {
                    if (qTempl != null)
                    {
                        var itemTempl = ItemMgr.GetTemplate(qTempl.SrcItemId);
                        if (itemTempl != null && qTempl.SrcItemId != 0 && !qTempl.Starters.Contains(itemTempl))
                        {
                            qTempl.ProvidedItems.Add(new ItemStackDescription(qTempl.SrcItemId, 1));
                        }
                    }
                }

                Loaded = true;

                log.Debug("{0} Quests loaded.", _questCount);
            }
            return(true);
        }
Exemple #17
0
 public void FinalizeDataHolder()
 {
     Template = ItemMgr.GetTemplate(ItemId);
     if (Template == null)
     {
         ContentMgr.OnInvalidDBData("{0} has invalid ItemId: {1} ({2})", (object)this, (object)ItemId,
                                    (object)(int)ItemId);
     }
     else
     {
         List <VendorItemEntry> vendorList = NPCMgr.GetOrCreateVendorList(VendorId);
         if (StockAmount < 0)
         {
             StockAmount = Template.StockAmount;
         }
         if (StockRefillDelay < 0U)
         {
             StockRefillDelay = Template.StockRefillDelay;
         }
         remainingStackAmount = StockAmount;
         vendorList.Add(this);
     }
 }
Exemple #18
0
        public void TestInspect()
        {
            Setup.EnsureItemsLoaded();

            var swordTempl = ItemMgr.GetTemplate(ItemId.Shortsword);

            if (swordTempl.EquipmentSlots == null)
            {
                swordTempl.EquipmentSlots = new[] { EquipmentSlot.MainHand };
                swordTempl.IsWeapon       = true;
            }

            var chr1         = Setup.AllianceCharacterPool.Create();
            var learntTalent = chr1.Talents.Trees[0].Talents[10];
            var learntRank   = 2;

            chr1.EnsureInWorldAndLiving();
            chr1.Talents.Owner.Level = 50;
            chr1.Talents.Set(learntTalent, learntRank);

            var chr2 = Setup.AllianceCharacterPool.Create();

            chr2.EnsureLiving();
            chr2.EnsureXDistance(chr1, 1.0f, true);

            var client2 = chr2.FakeClient;

            chr1.Inventory.TryAdd(swordTempl, InventorySlot.MainHand);
            var sword = chr1.Inventory[InventorySlot.MainHand];

            Assert.IsNotNull(sword, "Dummy Sword was not added to MainHand slot.");

            Thread.Sleep(Map.CharacterUpdateEnvironmentTicks * Map.DefaultUpdateDelay);
            chr1.Map.WaitTicks(2);
            client2.PurgeUpdatePackets();

            PacketUtil.GetUpdatePackets = true;

            var packet = new RealmPacketOut(RealmServerOpCode.CMSG_INSPECT);

            packet.Write(chr1.EntityId);
            client2.ReceiveCMSG(packet, true);

            Thread.Sleep(Map.CharacterUpdateEnvironmentTicks * Map.DefaultUpdateDelay);
            chr1.Map.WaitTicks(2);

            // Expected response: 1. send creation of all items to the new observer + 2. Send all talents
            var swordCreations = client2.GetUpdateBlocks(sword.EntityId, UpdateType.Create);

            Assert.IsNotNull(swordCreations);
            Assert.AreEqual(1, swordCreations.Count);


            var talentInfo = client2.DequeueSMSGInfo(RealmServerOpCode.SMSG_INSPECT_TALENT);

            Assert.AreEqual(chr1.Talents.GetFreeTalentPointsForLevel(chr1.Level), (int)talentInfo.Parser.ParsedPacket["FreePoints"].UIntValue);

            var talentParser = talentInfo.Parser.Packet;
            var bytes        = talentParser.ReadBytes(((int)learntTalent.Index / 8) + 1);
            var arr          = new BitArray(bytes);

            Assert.AreEqual(true, arr[(int)(learntTalent.Index + learntRank - 1)]);
        }
Exemple #19
0
        public static void HandlePetitionBuy(IRealmClient client, RealmPacketIn packet)
        {
            var chr = client.ActiveCharacter;

            var petitionerId = packet.ReadEntityId();
            var petitioner   = chr.Map.GetObject(petitionerId) as NPC;

            //var petitionId = packet.ReadInt32();
            //var petitionCreator = packet.ReadEntityId();
            //packet.SkipBytes(4 + 8);
            packet.Position += 4 + 8;
            var name = packet.ReadCString().Trim();

            //var bodytext = packet.ReadCString().Trim();
            //var minSignatures = packet.ReadInt32();
            //var maxSignatures = packet.ReadInt32();
            //var deadline = packet.ReadInt32();
            //var issueDate = packet.ReadInt32();
            //var allowedGuildId = packet.ReadInt32();
            //var allowedClassMask = packet.ReadInt32();
            //var allowedRaceMask = packet.ReadInt32();
            //var allowedGender = packet.ReadInt32(); // wow is sexist... :(
            //var allowedMinLevel = packet.ReadInt32();
            //var allowedMaxLevel = packet.ReadInt32();
            //packet.SkipBytes(4 * 10);
            //packet.Position += (7 * 8) + 2 + 1 + 8;
            packet.Position += 4 * 10;
            var choice = packet.ReadInt32();

            //var petitionType = packet.ReadInt32();
            //packet.SkipBytes(4);
            packet.Position += 4;

            if (petitioner != null && petitioner.IsPetitioner && petitioner.CheckVendorInteraction(chr))
            {
                ItemId       itemId = 0;
                uint         cost   = 0;
                PetitionType type   = PetitionType.None;

                if (petitioner.IsGuildPetitioner)
                {
                    if (chr.IsInGuild)
                    {
                        GuildHandler.SendResult(chr, GuildCommandId.CREATE, name, GuildResult.ALREADY_IN_GUILD);
                        return;
                    }
                    if (!GuildMgr.IsValidGuildName(name))
                    {
                        GuildHandler.SendResult(chr, GuildCommandId.CREATE, name, GuildResult.NAME_INVALID);
                        return;
                    }
                    else if (GuildMgr.DoesGuildExist(name))
                    {
                        GuildHandler.SendResult(chr, GuildCommandId.CREATE, name, GuildResult.NAME_EXISTS);
                        return;
                    }
                    itemId = PetitionerEntry.GuildPetitionEntry.ItemId;
                    cost   = GuildMgr.GuildCharterCost;
                    type   = PetitionType.Guild;
                }
                else if (petitioner.IsArenaPetitioner)
                {
                    switch (choice)
                    {
                    case 1:
                        itemId = PetitionerEntry.ArenaPetition2v2Entry.ItemId;
                        cost   = PetitionerEntry.ArenaPetition2v2Entry.Cost;
                        type   = PetitionType.Arena2vs2;
                        break;

                    case 2:
                        itemId = PetitionerEntry.ArenaPetition3v3Entry.ItemId;
                        cost   = PetitionerEntry.ArenaPetition3v3Entry.Cost;
                        type   = PetitionType.Arena3vs3;
                        break;

                    case 3:
                        itemId = PetitionerEntry.ArenaPetition5v5Entry.ItemId;
                        cost   = PetitionerEntry.ArenaPetition5v5Entry.Cost;
                        type   = PetitionType.Arena5vs5;
                        break;

                    default:
                        return;
                    }
                    if (!ArenaMgr.IsValidArenaTeamName(name))
                    {
                        ArenaTeamHandler.SendResult(chr, ArenaTeamCommandId.CREATE, name, string.Empty, ArenaTeamResult.NAME_INVALID);
                        return;
                    }
                    else if (ArenaMgr.DoesArenaTeamExist(name))
                    {
                        ArenaTeamHandler.SendResult(chr, ArenaTeamCommandId.CREATE, name, string.Empty, ArenaTeamResult.NAME_EXISTS);
                        return;
                    }
                }
                if (itemId != 0 && cost != 0 && type != PetitionType.None)
                {
                    var templ = ItemMgr.GetTemplate(itemId);
                    if (templ == null)
                    {
                        SendBuyError(chr, petitioner, itemId, BuyItemError.CantFindItem);
                    }
                    else if (chr.Money < cost)
                    {
                        SendBuyError(chr, petitioner, itemId, BuyItemError.NotEnoughMoney);
                    }
                    else if (!PetitionRecord.CanBuyPetition(chr.EntityId.Low))
                    {
                        chr.SendSystemMessage("You can't buy another petition !");
                    }
                    else
                    {
                        var slotId = chr.Inventory.FindFreeSlot(templ, 1);
                        if (slotId.Container == null)
                        {
                            SendBuyError(chr, petitioner, itemId, BuyItemError.CantCarryAnymore);
                        }
                        else
                        {
                            var item = slotId.Container.AddUnchecked(slotId.Slot, templ, 1, true) as PetitionCharter;
                            item.Petition = new PetitionRecord(name, chr.EntityId.Low, item.EntityId.Low, type);
                            item.Petition.Create();

                            chr.Money -= cost;

                            item.SetEnchantId(EnchantSlot.Permanent, item.EntityId.Low);
                        }
                    }
                }
            }
        }
Exemple #20
0
 private static Item AddItem(Character chr, ItemId itemId, ref int amount)
 {
     chr.Inventory.TryAdd(ItemMgr.GetTemplate(itemId), ref amount);
     return(chr.Inventory.GetItemByItemId(itemId));
 }