Example #1
0
        /// <summary>
        /// Changes the commander's weapon to the specified weapon template
        /// </summary>
        public void MinionGetWeapon(CommanderPet.eWeaponType weaponType)
        {
            ItemTemplate itemTemp = CommanderPet.GetWeaponTemplate(weaponType);

            if (itemTemp == null)
            {
                return;
            }

            InventoryItem weapon;

            weapon = GameInventoryItem.Create(itemTemp);
            if (weapon != null)
            {
                if (Inventory == null)
                {
                    Inventory = new GameNPCInventory(new GameNpcInventoryTemplate());
                }
                else
                {
                    Inventory.RemoveItem(Inventory.GetItem((eInventorySlot)weapon.Item_Type));
                }

                Inventory.AddItem((eInventorySlot)weapon.Item_Type, weapon);
                SwitchWeapon((eActiveWeaponSlot)weapon.Hand);
            }
        }
Example #2
0
        /// <summary>
        /// Exchange special currency for merchant currency type
        /// </summary>
        /// <param name="source"></param>
        /// <param name="item"></param>
        /// <returns></returns>
        public override bool ReceiveItem(GameLiving source, InventoryItem item)
        {
            if (source is GamePlayer player && item != null && m_currencyValues != null &&
                m_currencyValues.TryGetValue(item.Id_nb, out int receiveCost) &&
                m_currencyValues.TryGetValue(MoneyKey, out int giveCost))
            {
                int giveCount = item.Count * receiveCost / giveCost;

                if (giveCount > 0)
                {
                    // Create and give new item to player
                    InventoryItem newItem = GameInventoryItem.Create(m_itemTemplate);
                    newItem.OwnerID = player.InternalID;
                    newItem.Count   = giveCount;

                    if (!player.Inventory.AddTemplate(newItem, newItem.Count, eInventorySlot.FirstBackpack, eInventorySlot.LastBackpack))
                    {
                        player.CreateItemOnTheGround(newItem);
                    }

                    // Remove received items
                    InventoryItem playerItem = player.Inventory.GetItem((eInventorySlot)item.SlotPosition);
                    playerItem.Count -= giveCount * giveCost;

                    if (playerItem.Count < 1)
                    {
                        player.Inventory.RemoveItem(item);
                    }

                    return(true);
                }
            }

            return(base.ReceiveItem(source, item));
        }
Example #3
0
 /// <summary>
 /// Creates a Guard Inventory from an Inventory Template
 /// </summary>
 /// <param name="template"></param>
 public GameNPCInventory(GameNpcInventoryTemplate template)
 {
     foreach (InventoryItem item in template.AllItems)
     {
         AddItem((eInventorySlot)item.SlotPosition, GameInventoryItem.Create <InventoryItem>(item));
     }
 }
Example #4
0
        /// <summary>
        /// Load or reload all items into the market cache
        /// </summary>
        public static bool Initialize()
        {
            log.Info("Building Market Cache ....");
            try
            {
                m_itemCache = new Dictionary <string, InventoryItem>();

                var filterBySlot = DB.Column("SlotPosition").IsGreaterOrEqualTo((int)eInventorySlot.Consignment_First).And(DB.Column("SlotPosition").IsLessOrEqualTo((int)eInventorySlot.Consignment_Last));
                var list         = DOLDB <InventoryItem> .SelectObjects(filterBySlot.And(DB.Column("OwnerLot").IsGreatherThan(0)));

                foreach (InventoryItem item in list)
                {
                    GameInventoryItem playerItem = GameInventoryItem.Create(item);
                    m_itemCache.Add(item.ObjectId, playerItem);
                }

                log.Info("Market Cache initialized with " + m_itemCache.Count + " items.");
            }
            catch
            {
                return(false);
            }

            return(true);
        }
Example #5
0
        /// <summary>
        /// Load or reload all items into the market cache
        /// </summary>
        public static bool Initialize()
        {
            log.Info("Building Market Cache ....");
            try
            {
                m_itemCache = new Dictionary <string, InventoryItem>();
                string query = "(`SlotPosition` >= " + (int)eInventorySlot.Consignment_First + " AND `SlotPosition` <= " + (int)eInventorySlot.Consignment_Last + " AND OwnerLot > 0)";

                IList <InventoryItem> list = GameServer.Database.SelectObjects <InventoryItem>(query);

                foreach (InventoryItem item in list)
                {
                    GameInventoryItem playerItem = GameInventoryItem.Create(item);
                    m_itemCache.Add(item.ObjectId, playerItem);
                }

                log.Info("Market Cache initialized with " + m_itemCache.Count + " items.");
            }
            catch
            {
                return(false);
            }

            return(true);
        }
Example #6
0
        public SummonWarcrystalSpellHandler(GameLiving caster, Spell spell, SpellLine line)
            : base(caster, spell, line)
        {
            string ammo = "";

            switch (Util.Random(1, 2))
            {
            case 1:
                ammo = "mystic_ammo_heat";
                break;

            case 2:
                ammo = "mystic_ammo_cold";
                break;
            }
            ItemTemplate template = GameServer.Database.FindObjectByKey <ItemTemplate>(ammo);

            if (template != null)
            {
                items.Add(GameInventoryItem.Create <ItemTemplate>(template));
                foreach (InventoryItem item in items)
                {
                    if (item.IsStackable)
                    {
                        item.Count  = 1;
                        item.Weight = item.Count * item.Weight;
                    }
                }
            }
        }
Example #7
0
        public void GenerateROG(GamePlayer player, eObjectType objectType, eSlot slot)
        {
            player.RemoveBountyPoints(2000);
            GameNPC mob = new GameNPC();

            mob.Name            = "Unique Object";
            mob.CurrentRegionID = 1;
            mob.Level           = (byte)(player.Level);
            if (mob.Level > 50)
            {
                mob.Level = 51;
            }

            LootList   lootlist = new LootList();
            ItemUnique item     = null;

            item             = new ItemUnique();
            item.Object_Type = (int)objectType;
            item.Item_Type   = (int)slot;

            mob.Level           = 60;
            mob.Name            = "TOA Mob";
            mob.CurrentRegionID = 30;
            mob.Z = 9999;
            lootlist.AddFixed(LootGeneratorUniqueObject.GenerateUniqueItem(mob, player, item), 1);
            foreach (ItemUnique unique in lootlist.GetLoot())
            {
                unique.Price = 0;
                GameServer.Database.AddObject(unique);
                InventoryItem invitem = GameInventoryItem.Create <ItemUnique>(unique);
                player.Inventory.AddItem(eInventorySlot.FirstEmptyBackpack, invitem);
                player.Out.SendMessage("Generated: " + unique.Name, eChatType.CT_System, eChatLoc.CL_SystemWindow);
            }
        }
Example #8
0
        public override void Die(GameObject killer)
        {
            GamePlayer player = killer as GamePlayer;

            if (player != null)
            {
                if (Util.Chance(40))
                {
                    #region rog_stuff

                    GameNPC mob = new GameNPC();
                    mob.Name            = "Unique Object";
                    mob.CurrentRegionID = 1;
                    mob.Level           = (byte)(player.Level);
                    if (mob.Level > 50)
                    {
                        mob.Level = 51;
                    }

                    mob.Level           = 60;
                    mob.Name            = "TOA Mob";
                    mob.CurrentRegionID = 30;
                    mob.Z = 9999;

                    ItemUnique unique = LootGeneratorUniqueObject.GenerateUniqueItem(mob, player, null);
                    GameServer.Database.AddObject(unique);
                    InventoryItem item = GameInventoryItem.Create <ItemUnique>(unique);
                    player.Inventory.AddItem(eInventorySlot.FirstEmptyBackpack, item);

                    #endregion
                }
            }
            base.Die(killer);
        }
Example #9
0
        /// <summary>
        /// Create an InventoryItem of given Name and Level
        /// </summary>
        /// <param name="ItemName">Name for the object</param>
        /// <param name="ItemLevel">Level to give to the object</param>
        /// <param name="Model">Model for the object</param>
        /// <returns>InventoryItem of given Name and Level</returns>
        public static InventoryItem GenerateItem(string ItemName, int ItemLevel, int Model)
        {
            ItemUnique TaskItems = new ItemUnique();

            TaskItems.Name    = ItemName;
            TaskItems.Level   = ItemLevel;
            TaskItems.DPS_AF  = 0;
            TaskItems.SPD_ABS = 0;
            TaskItems.Hand    = 0;
            //TaskItems.Type_Damage = 0;
            TaskItems.Object_Type = 0;
            TaskItems.Item_Type   = 1;
            TaskItems.Weight      = 1;
            TaskItems.Model       = Model;
            TaskItems.Price       = 0;
            TaskItems.Color       = 0;
            TaskItems.IsDropable  = true;
            TaskItems.IsPickable  = true;
            //TaskItems.IsStackable = false;
            TaskItems.Quality       = 80 + ItemLevel;
            TaskItems.MaxCondition  = 90;
            TaskItems.MaxDurability = 1000;
            GameServer.Database.AddObject(TaskItems);
            InventoryItem InvTaskItems = GameInventoryItem.Create(TaskItems);

            return(InvTaskItems);
        }
Example #10
0
        public override void Execute(GameLiving living)
        {
            if (CheckPreconditions(living, DEAD | SITTING | MEZZED | STUNNED))
            {
                return;
            }
            GamePlayer   player            = living as GamePlayer;
            ItemTemplate arrow_summoning_1 = GameServer.Database.FindObjectByKey <ItemTemplate>("arrow_summoning1");
            ItemTemplate arrow_summoning_2 = GameServer.Database.FindObjectByKey <ItemTemplate>("arrow_summoning2");
            ItemTemplate arrow_summoning_3 = GameServer.Database.FindObjectByKey <ItemTemplate>("arrow_summoning3");

            // what are these used for? - tolakram
            WorldInventoryItem as1 = WorldInventoryItem.CreateFromTemplate(arrow_summoning_1);
            WorldInventoryItem as2 = WorldInventoryItem.CreateFromTemplate(arrow_summoning_2);
            WorldInventoryItem as3 = WorldInventoryItem.CreateFromTemplate(arrow_summoning_3);

            if (!player.Inventory.AddTemplate(GameInventoryItem.Create(arrow_summoning_1), 10, eInventorySlot.FirstBackpack, eInventorySlot.LastBackpack))
            {
                player.Out.SendMessage("You do not have enough inventory space to place this item!", eChatType.CT_System, eChatLoc.CL_SystemWindow);
            }
            else if (!player.Inventory.AddTemplate(GameInventoryItem.Create(arrow_summoning_2), 10, eInventorySlot.FirstBackpack, eInventorySlot.LastBackpack))
            {
                player.Out.SendMessage("You do not have enough inventory space to place this item!", eChatType.CT_System, eChatLoc.CL_SystemWindow);
            }
            else if (!player.Inventory.AddTemplate(GameInventoryItem.Create(arrow_summoning_3), 10, eInventorySlot.FirstBackpack, eInventorySlot.LastBackpack))
            {
                player.Out.SendMessage("You do not have enough inventory space to place this item!", eChatType.CT_System, eChatLoc.CL_SystemWindow);
            }

            GameEventMgr.AddHandler(player, GamePlayerEvent.Quit, new DOLEventHandler(PlayerQuit));
            DisableSkill(living);
        }
        /// <summary>
        /// Creates a copy of the GameNpcInventoryTemplate.
        /// </summary>
        /// <returns>Open copy of this template</returns>
        public GameNpcInventoryTemplate CloneTemplate()
        {
            lock (m_items)
            {
                var clone = new GameNpcInventoryTemplate();
                clone.m_changedSlots   = new List <eInventorySlot>(m_changedSlots);
                clone.m_changesCounter = m_changesCounter;

                foreach (var de in m_items)
                {
                    InventoryItem oldItem = de.Value;

                    InventoryItem item = new GameInventoryItem();
                    item.Template       = new ItemTemplate();
                    item.Template.Id_nb = oldItem.Id_nb;
                    item.Model          = oldItem.Model;
                    item.Color          = oldItem.Color;
                    item.Effect         = oldItem.Effect;
                    item.Extension      = oldItem.Extension;
                    item.Emblem         = oldItem.Emblem;
                    item.SlotPosition   = oldItem.SlotPosition;
                    clone.m_items.Add(de.Key, item);
                }

                clone.m_isClosed = false;

                return(clone);
            }
        }
Example #12
0
        /// <summary>
        /// Load or reload all items into the market cache
        /// </summary>
        public static bool Initialize()
        {
            log.Info("Building Market Cache ....");
            try
            {
                m_itemCache = new Dictionary <string, InventoryItem>();

                IList <InventoryItem> list = GameServer.Database.SelectObjects <InventoryItem>("`SlotPosition` >= @SlotPositionFirst AND `SlotPosition` <= @SlotPositionLast AND `OwnerLot` > @OwnerLot",
                                                                                               new[] { new QueryParameter("@SlotPositionFirst", (int)eInventorySlot.Consignment_First), new QueryParameter("@SlotPositionLast", (int)eInventorySlot.Consignment_Last), new QueryParameter("@OwnerLot", 0) });

                foreach (InventoryItem item in list)
                {
                    GameInventoryItem playerItem = GameInventoryItem.Create(item);
                    m_itemCache.Add(item.ObjectId, playerItem);
                }

                log.Info("Market Cache initialized with " + m_itemCache.Count + " items.");
            }
            catch
            {
                return(false);
            }

            return(true);
        }
Example #13
0
        protected static bool GiveItem(GameLiving source, GamePlayer player, ItemTemplate itemTemplate, bool canDrop)
        {
            InventoryItem item = null;

            if (itemTemplate is ItemUnique)
            {
                GameServer.Database.AddObject(itemTemplate as ItemUnique);
                item = GameInventoryItem.Create <ItemUnique>(itemTemplate as ItemUnique);
            }
            else
            {
                item = GameInventoryItem.Create <ItemTemplate>(itemTemplate);
            }

            if (!player.ReceiveItem(source, item))
            {
                if (canDrop)
                {
                    player.CreateItemOnTheGround(item);
                    player.Out.SendMessage(String.Format("Your backpack is full, {0} is dropped on the ground.", itemTemplate.Name), eChatType.CT_Important, eChatLoc.CL_PopupWindow);
                }
                else
                {
                    player.Out.SendMessage("Your backpack is full!", eChatType.CT_Important, eChatLoc.CL_PopupWindow);
                    return(false);
                }
            }

            return(true);
        }
        public void SetModel(GamePlayer player, int number)
        {
            InventoryItem item = player.TempProperties.getProperty <InventoryItem>(TempProperty);

            player.TempProperties.removeProperty(TempProperty);

            if (item == null || item.OwnerID != player.InternalID || item.OwnerID == null)
            {
                return;
            }

            player.Inventory.RemoveItem(item);

            ItemUnique unique = new ItemUnique(item.Template);

            unique.Model = number;
            GameServer.Database.AddObject(unique);

            InventoryItem newInventoryItem = GameInventoryItem.Create <ItemUnique>(unique);

            player.Inventory.AddItem(eInventorySlot.FirstEmptyBackpack, newInventoryItem);
            player.Out.SendInventoryItemsUpdate(new InventoryItem[] { newInventoryItem });
            player.RemoveBountyPoints(300);
            player.SaveIntoDatabase();
        }
Example #15
0
        public void SetProc(GamePlayer player, int proc)
        {
            InventoryItem item = player.TempProperties.getProperty <InventoryItem>(TempProperty);

            player.TempProperties.removeProperty(TempProperty);

            if (item == null || item.OwnerID != player.InternalID || item.OwnerID == null)
            {
                return;
            }

            player.Inventory.RemoveItem(item);

            ItemUnique unique = new ItemUnique(item.Template);

            unique.ProcSpellID = proc;
            GameServer.Database.AddObject(unique);

            player.RemoveBountyPoints(300);

            InventoryItem newInventoryItem = GameInventoryItem.Create <ItemUnique>(unique);

            player.Inventory.AddItem(eInventorySlot.FirstEmptyBackpack, newInventoryItem);
            player.Out.SendInventoryItemsUpdate(new InventoryItem[] { newInventoryItem });
            SendReply(player, "My work upon " + item.Name + " is complete.\n Farewell " + player.Name + ".");
        }
        /// <summary>
        /// Player receives this item (added to players inventory)
        /// </summary>
        /// <param name="player"></param>
        public override void OnReceive(GamePlayer player)
        {
            // for guild banners we don't actually add it to inventory but instead register
            // if it is rescued by a friendly player or taken by the enemy

            player.Inventory.RemoveItem(this);

            int    trophyModel = 0;
            eRealm realm       = eRealm.None;

            switch (Model)
            {
            case 3223:
                trophyModel = 3359;
                realm       = eRealm.Albion;
                break;

            case 3224:
                trophyModel = 3361;
                realm       = eRealm.Midgard;
                break;

            case 3225:
                trophyModel = 3360;
                realm       = eRealm.Hibernia;
                break;
            }

            // if picked up by an enemy then turn this into a trophy
            if (realm != player.Realm)
            {
                ItemUnique template = new ItemUnique(Template);
                template.ClassType        = "";
                template.Model            = trophyModel;
                template.IsDropable       = true;
                template.IsIndestructible = false;

                GameServer.Database.AddObject(template);
                GameInventoryItem trophy = new GameInventoryItem(template);
                player.Inventory.AddItem(eInventorySlot.FirstEmptyBackpack, trophy);
                OwnerGuild.SendMessageToGuildMembers(player.Name + " of " + GlobalConstants.RealmToName(player.Realm) + " has captured your guild banner!", eChatType.CT_Guild, eChatLoc.CL_SystemWindow);
                OwnerGuild.GuildBannerLostTime = DateTime.Now;
            }
            else
            {
                m_status = eStatus.Recovered;

                // A friendly player has picked up the banner.
                if (OwnerGuild != null)
                {
                    OwnerGuild.SendMessageToGuildMembers(player.Name + " has recovered your guild banner!", eChatType.CT_Guild, eChatLoc.CL_SystemWindow);
                }

                if (SummonPlayer != null)
                {
                    SummonPlayer.GuildBanner = null;
                }
            }
        }
Example #17
0
        public override void Perform(DOLEvent e, object sender, EventArgs args)
        {
            GamePlayer    player        = BehaviourUtils.GuessGamePlayerFromNotify(e, sender, args);
            InventoryItem inventoryItem = GameInventoryItem.Create(P as ItemTemplate);

            player.CreateItemOnTheGround(inventoryItem);
            player.Out.SendMessage(LanguageMgr.GetTranslation(player.Client.Account.Language, "Behaviour.DropItemAction.DropsFrontYou", inventoryItem.Name), eChatType.CT_Loot, eChatLoc.CL_SystemWindow);
        }
Example #18
0
 public bool CanEquipItem(GameInventoryItem item)
 {
     return(player.IsGameAdmin ||
            player.Stats.Defense.Level >= item.Item.RequiredDefenseLevel &&
            player.Stats.Attack.Level >= item.Item.RequiredAttackLevel &&
            player.Stats.Ranged.Level >= item.Item.RequiredRangedLevel &&
            player.Stats.Magic.Level >= item.Item.RequiredMagicLevel &&
            player.Stats.Slayer.Level >= item.Item.RequiredSlayerLevel);
 }
Example #19
0
        public override void OnPlayerBuy(GamePlayer player, int item_slot, int number)
        {
            //Get the template
            int pagenumber = item_slot / MerchantTradeItems.MAX_ITEM_IN_TRADEWINDOWS;
            int slotnumber = item_slot % MerchantTradeItems.MAX_ITEM_IN_TRADEWINDOWS;

            ItemTemplate template = this.TradeItems.GetItem(pagenumber, (eMerchantWindowSlot)slotnumber);

            if (template == null)
            {
                return;
            }

            //Calculate the amout of items
            int amountToBuy = number;

            if (template.PackSize > 0)
            {
                amountToBuy *= template.PackSize;
            }

            if (amountToBuy <= 0)
            {
                return;
            }

            //Calculate the value of items
            long totalValue = number * template.Price;

            lock (player.Inventory)
            {
                if (player.BountyPoints < totalValue)
                {
                    player.Out.SendMessage(LanguageMgr.GetTranslation(player.Client.Account.Language, "GameMerchant.OnPlayerBuy.YouNeedBP", totalValue), eChatType.CT_System, eChatLoc.CL_SystemWindow);
                    return;
                }
                if (!player.Inventory.AddTemplate(GameInventoryItem.Create(template), amountToBuy, eInventorySlot.FirstBackpack, eInventorySlot.LastBackpack))
                {
                    player.Out.SendMessage(LanguageMgr.GetTranslation(player.Client.Account.Language, "GameMerchant.OnPlayerBuy.NotInventorySpace"), eChatType.CT_System, eChatLoc.CL_SystemWindow);
                    return;
                }
                InventoryLogging.LogInventoryAction(this, player, eInventoryActionType.Merchant, template, amountToBuy);
                //Generate the buy message
                string message;
                if (number > 1)
                {
                    message = LanguageMgr.GetTranslation(player.Client.Account.Language, "GameMerchant.OnPlayerBuy.BoughtPiecesBP", totalValue, template.GetName(1, false));
                }
                else
                {
                    message = LanguageMgr.GetTranslation(player.Client.Account.Language, "GameMerchant.OnPlayerBuy.BoughtBP", template.GetName(1, false), totalValue);
                }
                player.BountyPoints -= totalValue;
                player.Out.SendUpdatePoints();
                player.Out.SendMessage(message, eChatType.CT_Merchant, eChatLoc.CL_SystemWindow);
            }
        }
        /// <summary>
        /// Adds item to template reusing iventory  item instances from other templates.
        /// </summary>
        /// <param name="slot">The equipment slot</param>
        /// <param name="model">The equipment model</param>
        /// <param name="color">The equipment color</param>
        /// <param name="effect">The equipment effect</param>
        /// <param name="extension">The equipment extension</param>
        /// <returns>true if added</returns>
        public bool AddNPCEquipment(eInventorySlot slot, int model, int color, int effect, int extension, int emblem = 0)
        {
            lock (m_items)
            {
                lock (m_usedInventoryItems.SyncRoot)
                {
                    if (m_isClosed)
                    {
                        return(false);
                    }

                    slot = GetValidInventorySlot(slot);
                    if (slot == eInventorySlot.Invalid)
                    {
                        return(false);
                    }

                    // Changed to support randomization of slots - if we try to load a weapon in the same spot with a different model,
                    // let's make it random 50% chance to either overwrite the item or leave it be
                    if (m_items.ContainsKey(slot))
                    {
                        // 50% chance to keep the item we have
                        if (Util.Chance(50))
                        {
                            return(false);
                        }

                        // Let's remove the old item!
                        m_items.Remove(slot);
                    }

                    string        itemID = string.Format("{0}:{1},{2},{3}", slot, model, color, effect, extension);
                    InventoryItem item   = null;

                    if (!m_usedInventoryItems.ContainsKey(itemID))
                    {
                        item                = new GameInventoryItem();
                        item.Template       = new ItemTemplate();
                        item.Template.Id_nb = itemID;
                        item.Model          = model;
                        item.Color          = color;
                        item.Effect         = effect;
                        item.Extension      = (byte)extension;
                        item.Emblem         = emblem;
                        item.SlotPosition   = (int)slot;
                    }
                    else
                    {
                        return(false);
                    }

                    m_items.Add(slot, item);
                }
            }

            return(true);
        }
        /// <summary>
        /// Apply effect on target or do spell action if non duration spell
        /// </summary>
        /// <param name="target">target that gets the effect</param>
        /// <param name="effectiveness">factor from 0..1 (0%-100%)</param>
        public override void ApplyEffectOnTarget(GameLiving target, double effectiveness)
        {
            if (Caster?.ControlledBrain == null)
            {
                return;
            }

            GameNPC temppet = Caster.ControlledBrain.Body;

            // Lets let NPC's able to cast minions.  Here we make sure that the Caster is a GameNPC
            // and that m_controlledNpc is initialized (since we aren't thread safe).
            if (temppet == null)
            {
                if (Caster is GameNPC npc)
                {
                    temppet = npc;

                    // We'll give default NPCs 2 minions!
                    if (temppet.ControlledNpcList == null)
                    {
                        temppet.InitControlledBrainArray(2);
                    }
                }
                else
                {
                    return;
                }
            }

            base.ApplyEffectOnTarget(target, effectiveness);

            if (m_pet.Brain is BDArcherBrain)
            {
                if (!(GameServer.Database.FindObjectByKey <ItemTemplate>("BD_Archer_Distance_bow") is ItemTemplate temp))
                {
                    log.Error("Unable to find Bonedancer Archer's Bow");
                }
                else
                {
                    if (m_pet.Inventory == null)
                    {
                        m_pet.Inventory = new GameNPCInventory(new GameNpcInventoryTemplate());
                    }
                    else
                    {
                        m_pet.Inventory.RemoveItem(m_pet.Inventory.GetItem(eInventorySlot.DistanceWeapon));
                    }

                    m_pet.Inventory.AddItem(eInventorySlot.DistanceWeapon, GameInventoryItem.Create(temp));
                }

                m_pet.BroadcastLivingEquipmentUpdate();
            }
Example #22
0
        public void SetBonus(string propertyName, InventoryItem item, GamePlayer player)
        {
            Console.WriteLine("1");
            eProperty prop = strToProperty(propertyName);

            if (prop == eProperty.MaxSpeed)
            {
                return;
            }
            Console.WriteLine("2");
            ItemUnique unique = new ItemUnique(item.Template);

            player.Inventory.RemoveItem(item);
            player.TempProperties.removeProperty(CRAFT_ITEM);

            int bonusVal = prop >= eProperty.Resist_First && prop <= eProperty.Resist_Last ? 5 : 20;

            if (unique.Bonus1Type == 0)
            {
                unique.Bonus1Type = (int)prop;
                unique.Bonus1     = 20;
            }
            else if (unique.Bonus2Type == 0)
            {
                unique.Bonus2Type = (int)prop;
                unique.Bonus2     = 20;
            }
            else if (unique.Bonus3Type == 0)
            {
                unique.Bonus3Type = (int)prop;
                unique.Bonus3     = 20;
            }
            else if (unique.Bonus4Type == 0)
            {
                unique.Bonus4Type = (int)prop;
                unique.Bonus4     = 20;
            }
            else if (unique.Bonus5Type == 0)
            {
                unique.Bonus5Type = (int)prop;
                unique.Bonus5     = 20;
            }
            Console.WriteLine("3");
            GameServer.Database.AddObject(unique);
            InventoryItem newInventoryItem = GameInventoryItem.Create <ItemUnique>(unique);

            player.Inventory.AddItem(eInventorySlot.FirstEmptyBackpack, newInventoryItem);
            SendReply(player, "I have now imbued your " + unique.Name + " with the power of " + propertyName + "!");
            player.Out.SendInventoryItemsUpdate(new InventoryItem[] { newInventoryItem });
        }
Example #23
0
        /// <summary>
        /// Add a gift to the player
        /// </summary>
        /// <param name="template">the template ID of the item</param>
        /// <param name="player">the player to give it to</param>
        /// <returns>true if succesful</returns>
        public virtual bool addGift(String template, GamePlayer player)
        {
            ItemTemplate temp = GameServer.Database.FindObjectByKey <ItemTemplate>(template);

            if (temp != null)
            {
                if (!player.Inventory.AddTemplate(GameInventoryItem.Create(temp), 1, eInventorySlot.FirstBackpack, eInventorySlot.LastBackpack))
                {
                    player.Out.SendMessage(LanguageMgr.GetTranslation(player.Client.Account.Language, "GameTrainer.AddGift.NotEnoughSpace"), eChatType.CT_System, eChatLoc.CL_SystemWindow);
                    return(false);
                }
                InventoryLogging.LogInventoryAction(this, player, eInventoryActionType.Other, temp);
            }
            return(true);
        }
        /// <summary>
        /// Move an item from the inventory object to a player's backpack (uses client slots)
        /// </summary>
        public static IDictionary <int, InventoryItem> MoveItemFromObject(this IGameInventoryObject thisObject, GamePlayer player, eInventorySlot fromClientSlot, eInventorySlot toClientSlot)
        {
            // We will only allow moving to the backpack.

            if (toClientSlot < eInventorySlot.FirstBackpack || toClientSlot > eInventorySlot.LastBackpack)
            {
                return(null);
            }

            lock (thisObject.LockObject())
            {
                Dictionary <int, InventoryItem> inventory = thisObject.GetClientInventory(player);

                if (inventory.ContainsKey((int)fromClientSlot) == false)
                {
                    ChatUtil.SendErrorMessage(player, "Item not found in slot " + (int)fromClientSlot);
                    return(null);
                }

                InventoryItem fromItem = inventory[(int)fromClientSlot];
                InventoryItem toItem   = player.Inventory.GetItem(toClientSlot);

                // if there is an item in the players target inventory slot then move it to the object
                if (toItem != null)
                {
                    player.Inventory.RemoveTradeItem(toItem);
                    toItem.SlotPosition = fromItem.SlotPosition;
                    toItem.OwnerID      = thisObject.GetOwner(player);
                    thisObject.OnAddItem(player, toItem);
                    GameServer.Database.SaveObject(toItem);
                }

                thisObject.OnRemoveItem(player, fromItem);

                // Create the GameInventoryItem from this InventoryItem.  This simply wraps the InventoryItem,
                // which is still updated when this item is moved around
                InventoryItem objectItem = GameInventoryItem.Create <InventoryItem>(fromItem);

                player.Inventory.AddTradeItem(toClientSlot, objectItem);

                var updateItems = new Dictionary <int, InventoryItem>(1);
                updateItems.Add((int)fromClientSlot, toItem);

                return(updateItems);
            }
        }
Example #25
0
        /// <summary>
        /// Loads the GameRelic from Database
        /// </summary>
        /// <param name="obj">The DBRelic-object for this relic</param>
        public override void LoadFromDatabase(DataObject obj)
        {
            InternalID      = obj.ObjectId;
            m_dbRelic       = obj as DBRelic;
            CurrentRegionID = (ushort)m_dbRelic.Region;
            X               = m_dbRelic.X;
            Y               = m_dbRelic.Y;
            Z               = m_dbRelic.Z;
            Heading         = (ushort)m_dbRelic.Heading;
            m_relicType     = (eRelicType)m_dbRelic.relicType;
            Realm           = (eRealm)m_dbRelic.Realm;
            m_originalRealm = (eRealm)m_dbRelic.OriginalRealm;
            m_lastRealm     = (eRealm)m_dbRelic.LastRealm;


            //get constant values
            MiniTemp template = GetRelicTemplate(m_originalRealm, m_relicType);

            m_name   = template.Name;
            m_model  = template.Model;
            template = null;

            //set still empty fields
            Emblem = 0;
            Level  = 99;

            //generate itemtemplate for inventoryitem
            ItemTemplate m_itemTemp;

            m_itemTemp             = new ItemTemplate();
            m_itemTemp.Name        = Name;
            m_itemTemp.Object_Type = (int)eObjectType.Magical;
            m_itemTemp.Model       = Model;
            m_itemTemp.IsDropable  = true;
            m_itemTemp.IsPickable  = false;
            m_itemTemp.Level       = 99;
            m_itemTemp.Quality     = 100;
            m_itemTemp.Price       = 0;
            m_itemTemp.PackSize    = 1;
            m_itemTemp.AllowAdd    = false;
            m_itemTemp.Weight      = 1000;
            m_itemTemp.Id_nb       = "GameRelic";
            m_itemTemp.IsTradable  = false;
            m_itemTemp.ClassType   = "DOL.GS.GameInventoryRelic";
            m_item = GameInventoryItem.Create <ItemTemplate>(m_itemTemp);
        }
            public void OnCommand(GameClient client, string[] args)
            {
                try
                {
                    for (int x = 0; x < 8; x++)
                    {
                        GeneratedUniqueItem item = null;

                        if (args.Length > 1)
                        {
                            if (Convert.ToString(args[1]).ToUpper() == "TOA")
                            {
                                item = new GeneratedUniqueItem(true, client.Player.Realm, 51);
                                item.GenerateItemQuality(GameObject.GetConLevel(client.Player.Level, 60));
                            }
                            else if (Convert.ToString(args[1]).ToUpper() == "L51")
                            {
                                item = new GeneratedUniqueItem(client.Player.Realm, 51);
                                item.GenerateItemQuality(GameObject.GetConLevel(client.Player.Level, 50));
                            }
                            else
                            {
                                if (args.Length > 2)
                                {
                                    item = new GeneratedUniqueItem(client.Player.Realm, client.Player.Level, (eObjectType)Convert.ToInt32(args[1]), (eInventorySlot)Convert.ToInt32(args[2]));
                                }
                                else
                                {
                                    item = new GeneratedUniqueItem(client.Player.Realm, client.Player.Level, (eObjectType)Convert.ToInt32(args[1]));
                                }
                            }
                        }

                        item.AllowAdd = true;
                        GameServer.Database.AddObject(item);
                        InventoryItem invitem = GameInventoryItem.Create <ItemUnique>(item);
                        client.Player.Inventory.AddItem(eInventorySlot.FirstEmptyBackpack, invitem);
                        client.Player.Out.SendMessage("Generated: " + item.Name, eChatType.CT_System, eChatLoc.CL_SystemWindow);
                    }
                }
                catch (Exception)
                {
                    DisplaySyntax(client);
                }
            }
Example #27
0
        public override void Perform(DOLEvent e, object sender, EventArgs args)
        {
            GamePlayer player = BehaviourUtils.GuessGamePlayerFromNotify(e, sender, args);

            ItemTemplate oldItem = P;
            ItemTemplate newItem = Q;

            // TODO: what about stacked items???
            if (player.Inventory.RemoveTemplate(oldItem.Id_nb, 1, eInventorySlot.FirstBackpack, eInventorySlot.LastBackpack))
            {
                InventoryLogging.LogInventoryAction(player, NPC, eInventoryActionType.Quest, oldItem, 1);
                InventoryItem inventoryItem = GameInventoryItem.Create(newItem);
                if (player.Inventory.AddItem(eInventorySlot.FirstEmptyBackpack, inventoryItem))
                {
                    InventoryLogging.LogInventoryAction(NPC, player, eInventoryActionType.Quest, newItem, 1);
                }
            }
        }
Example #28
0
        public EssenceFlareSpellHandler(GameLiving caster, Spell spell, SpellLine line)
            : base(caster, spell, line)
        {
            ItemTemplate template = GameServer.Database.FindObjectByKey <ItemTemplate>("Meschgift");

            if (template != null)
            {
                items.Add(GameInventoryItem.Create(template));
                foreach (InventoryItem item in items)
                {
                    if (item.IsStackable)
                    {
                        item.Count  = 1;
                        item.Weight = item.Count * item.Weight;
                    }
                }
            }
        }
Example #29
0
        public SummonWoodSpellHandler(GameLiving caster, Spell spell, SpellLine line)
            : base(caster, spell, line)
        {
            ItemTemplate template = GameServer.Database.FindObjectByKey <ItemTemplate>("mysticwood_wooden_boards");

            if (template != null)
            {
                items.Add(GameInventoryItem.Create <ItemTemplate>(template));
                foreach (InventoryItem item in items)
                {
                    if (item.IsStackable)
                    {
                        item.Count  = 1;
                        item.Weight = item.Count * item.Weight;
                    }
                }
            }
        }
Example #30
0
        public void InventoryFromIT()
        {
            InventoryTestCreation();
            Console.WriteLine("Creation of Ghost Inventory entry based on ItemTemplate");

            InventoryItem ii = GameInventoryItem.Create(itemt);

            player.Inventory.AddItem(eInventorySlot.FirstBackpack, ii);
            Assert.IsNotNull(ii, "ii-t #1 : " + ii.Template.Id_nb + " created & added to " + ii.OwnerID);
            var iicheck = GameServer.Database.FindObjectByKey <InventoryItem>(ii.ObjectId);

            Assert.IsNotNull(iicheck, "ii-t #2 : saved in db " + ii.Template.Id_nb + " to " + ii.OwnerID);
            GameServer.Database.DeleteObject(ii);
            iicheck = GameServer.Database.FindObjectByKey <InventoryItem>(ii.ObjectId);
            Assert.IsNull(iicheck, "ii-t #3 : deleted from db " + ii.Template.Id_nb + " to " + ii.OwnerID);
            var itcheck = GameServer.Database.FindObjectByKey <ItemTemplate>(itemt.Id_nb);

            Assert.IsNotNull(itcheck, "ii-t #4 : not deleted from db " + itemt.Id_nb);
        }
Example #31
0
		/// <summary>
		/// Player receives this item (added to players inventory)
		/// </summary>
		/// <param name="player"></param>
		public override void OnReceive(GamePlayer player)
		{
			// for guild banners we don't actually add it to inventory but instead register
			// if it is rescued by a friendly player or taken by the enemy

			player.Inventory.RemoveItem(this);

			int trophyModel = 0;
			eRealm realm = eRealm.None;

			switch (Model)
			{
				case 3223:
					trophyModel = 3359;
					realm = eRealm.Albion;
					break;
				case 3224:
					trophyModel = 3361;
					realm = eRealm.Midgard;
					break;
				case 3225:
					trophyModel = 3360;
					realm = eRealm.Hibernia;
					break;
			}

			// if picked up by an enemy then turn this into a trophy
			if (realm != player.Realm)
			{
				ItemUnique template = new ItemUnique(Template);
				template.ClassType = "";
				template.Model = trophyModel;
				template.IsDropable = true;
				template.IsIndestructible = false;

				GameServer.Database.AddObject(template);
				GameInventoryItem trophy = new GameInventoryItem(template);
                player.Inventory.AddItem(eInventorySlot.FirstEmptyBackpack, trophy);
				OwnerGuild.SendMessageToGuildMembers(player.Name + " of " + GlobalConstants.RealmToName(player.Realm) + " has captured your guild banner!", eChatType.CT_Guild, eChatLoc.CL_SystemWindow);
				OwnerGuild.GuildBannerLostTime = DateTime.Now;
			}
			else
			{
				m_status = eStatus.Recovered;

				// A friendly player has picked up the banner.
				if (OwnerGuild != null)
				{
					OwnerGuild.SendMessageToGuildMembers(player.Name + " has recovered your guild banner!", eChatType.CT_Guild, eChatLoc.CL_SystemWindow);
				}

				if (SummonPlayer != null)
				{
					SummonPlayer.GuildBanner = null;
				}
			}
		}
        /// <summary>
        /// Loads the inventory from the DataBase
        /// </summary>
        /// <param name="inventoryID">The inventory ID</param>
        /// <returns>success</returns>
        public override bool LoadFromDatabase(string inventoryID)
        {
            lock (m_items)
            {
                try
                {
                    m_items.Clear();

                    // We only want to cache items in the players personal inventory and personal vault.
                    // If we cache ALL items them all vault code must make sure to update cache, which is not ideal
                    // in addition, a player with a housing vault may still have an item in cache that may have been
                    // removed by another player with the appropriate house permission.  - Tolakram
                    var items = GameServer.Database.SelectObjects<InventoryItem>("OwnerID = '" + GameServer.Database.Escape(inventoryID) +
                                                                                 "' AND (SlotPosition <= " + (int)eInventorySlot.LastVault +
                                                                                 " OR (SlotPosition >= 500 AND SlotPosition < 600))");

                    foreach (InventoryItem item in items)
                    {
                        try
                        {
                            var itemSlot = (eInventorySlot)item.SlotPosition;

                            if (item.CanUseEvery > 0)
                            {
                                item.SetCooldown();
                            }

                            if (GetValidInventorySlot((eInventorySlot)item.SlotPosition) == eInventorySlot.Invalid)
                            {
                                if (Log.IsErrorEnabled)
                                    Log.Error("Tried to load an item in invalid slot, ignored. Item id=" + item.ObjectId);

                                continue;
                            }

                            if (m_items.ContainsKey(itemSlot))
                            {
                                if (Log.IsErrorEnabled)
                                {
                                    Log.ErrorFormat("Error loading {0}'s ({1}) inventory!\nDuplicate item {2} found in slot {3}; Skipping!",
                                                    m_player.Name, inventoryID, item.Name, itemSlot);
                                }

                                continue;
                            }

                            // Depending on whether or not the item is an artifact we will
                            // create different types of inventory items. That way we can speed
                            // up item type checks and implement item delve information in
                            // a natural way, i.e. through inheritance.

                            // Tolakram - Leaving this functionality as is for now.  InventoryArtifact now inherits from
                            // GameInventoryItem and utilizes the new Delve system.  No need to set ClassType for all artifacts when
                            // this code works fine as is.

                            if (ArtifactMgr.IsArtifact(item))
                            {
                                m_items.Add(itemSlot, new InventoryArtifact(item));
                            }
                            else
                            {
                                GameInventoryItem playerItem = GameInventoryItem.Create<InventoryItem>(item);

                                if (playerItem.CheckValid(m_player))
                                {
                                    m_items.Add(itemSlot, playerItem as InventoryItem);
                                }
                                else
                                {
                                    Log.ErrorFormat("Item '{0}', ClassType '{1}' failed valid test for player '{2}'!", item.Name, item.ClassType, m_player.Name);
                                    GameInventoryItem invalidItem = new GameInventoryItem();
                                    invalidItem.Name = "Invalid Item";
                                    invalidItem.OwnerID = item.OwnerID;
                                    invalidItem.SlotPosition = item.SlotPosition;
                                    invalidItem.AllowAdd = false;
                                    m_items.Add(itemSlot, invalidItem);
                                }
                            }

                            if (Log.IsWarnEnabled)
                            {
                                // bows don't use damage type - no warning needed
                                if (GlobalConstants.IsWeapon(item.Object_Type)
                                    && item.Type_Damage == 0
                                    && item.Object_Type != (int)eObjectType.CompositeBow
                                    && item.Object_Type != (int)eObjectType.Crossbow
                                    && item.Object_Type != (int)eObjectType.Longbow
                                    && item.Object_Type != (int)eObjectType.Fired
                                    && item.Object_Type != (int)eObjectType.RecurvedBow)
                                {
                                    Log.Warn(m_player.Name + ": weapon with damage type 0 is loaded \"" + item.Name + "\" (" + item.ObjectId + ")");
                                }
                            }
                        }
                        catch (Exception ex)
                        {
                            Log.Error("Error loading player inventory (" + inventoryID + "), Inventory_ID: " +
                                      item.ObjectId +
                                      " (" + (item.ITemplate_Id == null ? "" : item.ITemplate_Id) +
                                      ", " + (item.UTemplate_Id == null ? "" : item.UTemplate_Id) +
                                      "), slot: " + item.SlotPosition, ex);
                        }
                    }

                    // notify handlers that the item was just equipped
                    foreach (eInventorySlot slot in EQUIP_SLOTS)
                    {
                        // skip weapons. only active weapons should fire equip event, done in player.SwitchWeapon
                        if (slot >= eInventorySlot.RightHandWeapon && slot <= eInventorySlot.DistanceWeapon)
                            continue;

                        InventoryItem item;

                        if (m_items.TryGetValue(slot, out item))
                        {
                            m_player.Notify(PlayerInventoryEvent.ItemEquipped, this, new ItemEquippedArgs(item, slot));
                        }
                    }

                    return true;
                }
                catch (Exception e)
                {
                    if (Log.IsErrorEnabled)
                        Log.Error("Error loading player inventory (" + inventoryID + ").  Load aborted!", e);

                    return false;
                }
            }
        }
Example #33
0
        // WHRIA
        public bool AddNPCEquipment_ex(eInventorySlot slot, int model, int color, int effect, int extension, string id_nb, int emblem = 0)
        {
            lock (m_items)
            {
                lock (m_usedInventoryItems.SyncRoot)
                {
                    if (m_isClosed)
                        return false;
                    slot = GetValidInventorySlot(slot);
                    if (slot == eInventorySlot.Invalid)
                        return false;
                    //Changed to support randomization of slots - if we try to load a weapon in the same spot with a different model,
                    //let's make it random 50% chance to either overwrite the item or leave it be
                    if (m_items.ContainsKey(slot))
                    {
                        //50% chance to keep the item we have
                        if (Util.Chance(50))
                            return false;
                        //Let's remove the old item!
                        m_items.Remove(slot);
                    }
                    string itemID = string.Format("{0}:{1},{2},{3},{4},{5}", slot, model, color, effect, extension, id_nb);

                    InventoryItem item = null;

                    if (!m_usedInventoryItems.ContainsKey(itemID))
                    {
                        item = new GameInventoryItem();

                        if (id_nb != "" && id_nb != null)
                        {
                            item.Template = GameServer.Database.FindObjectByKey<ItemTemplate>(id_nb);
                            if (item.Template == null)
                                item.Template = GameServer.Database.FindObjectByKey<ItemUnique>(id_nb);
                            if (item.Template == null)
                            {
                                log.Error("cannot find itemtemplate/npcequipment" + id_nb);
                                return false;
                            }
                            item = GameInventoryItem.Create<ItemTemplate>(item.Template);
                            item.SlotPosition = (int)slot;
//                            item.Id_nb = "";
//                            item.Template.Id_nb = itemID;
//                            item.ITemplate_Id = "";
//                            item.UTemplate_Id = "";
                        }
                        else
                        {
                            item.Template = new ItemTemplate();
                            item.Template.Id_nb = itemID;
                            item.Model = model;
                            item.Color = color;
                            item.Effect = effect;
                            item.Extension = (byte)extension;
                            item.Emblem = emblem;
                            item.SlotPosition = (int)slot;
                        }
                    }
                    else
                        return false;

                    m_items.Add(slot, item);
                }
            }
            return true;
        }
Example #34
0
		public void OnCommand(GameClient client, string[] args)
		{
			if (args.Length < 2)
			{
				DisplaySyntax(client);
				return;
			}

			try
			{
				switch (args[1].ToLower())
				{
					#region Blank
					case "blank":
						{
							ItemTemplate newTemplate = new ItemTemplate();
							newTemplate.Name = "(blank item)";
							newTemplate.Id_nb = InventoryItem.BLANK_ITEM;
							GameInventoryItem item = new GameInventoryItem(newTemplate);
							if (client.Player.Inventory.AddItem(eInventorySlot.FirstEmptyBackpack, item))
							{
								client.Out.SendMessage(LanguageMgr.GetTranslation(client, "GMCommands.Item.Blank.ItemCreated"), eChatType.CT_System, eChatLoc.CL_SystemWindow);
								InventoryLogging.LogInventoryAction(client.Player, client.Player, eInventoryActionType.Other, item.Template, item.Count);
							}
							else
							{
								client.Out.SendMessage(LanguageMgr.GetTranslation(client, "GMCommands.Item.Blank.CreationError"), eChatType.CT_System, eChatLoc.CL_SystemWindow);
							}
							break;
						}
					#endregion Blank
					#region Scroll
					case "scroll":
						{
							WorldInventoryItem scroll = ArtifactMgr.CreateScroll(args[2], Convert.ToInt16(args[3]));
							if (scroll == null)
							{
								client.Out.SendMessage(LanguageMgr.GetTranslation(client, "GMCommands.Item.Scroll.NotFound", args[3], args[2]), eChatType.CT_SpellResisted, eChatLoc.CL_SystemWindow);
								return;
							}
							if (client.Player.Inventory.AddItem(eInventorySlot.FirstEmptyBackpack, scroll.Item))
							{
								client.Out.SendMessage(LanguageMgr.GetTranslation(client, "GMCommands.Item.Scroll.Created", scroll.Item.Name), eChatType.CT_System, eChatLoc.CL_SystemWindow);
								InventoryLogging.LogInventoryAction(client.Player, client.Player, eInventoryActionType.Other, scroll.Item.Template, scroll.Item.Count);
							}
							break;
						}
					#endregion Scroll
					#region Create
					case "create":
						{
							ItemTemplate template = GameServer.Database.FindObjectByKey<ItemTemplate>(args[2]);
							if (template == null)
							{
								client.Out.SendMessage(LanguageMgr.GetTranslation(client, "GMCommands.Item.Create.NotFound", args[2]), eChatType.CT_System, eChatLoc.CL_SystemWindow);
								return;
							}
							else
							{
								int count = 1;
								if (args.Length >= 4)
								{
									try
									{
										count = Convert.ToInt32(args[3]);
										if (count < 1)
											count = 1;
									}
									catch (Exception)
									{
									}
								}

								InventoryItem item = GameInventoryItem.Create<ItemTemplate>(template);
								if (item.IsStackable)
								{
									item.Count = count;
								}
								if (client.Player.Inventory.AddItem(eInventorySlot.FirstEmptyBackpack, item))
								{
									client.Out.SendMessage(LanguageMgr.GetTranslation(client, "GMCommands.Item.Create.Created", item.Level, item.GetName(0, false), count), eChatType.CT_System, eChatLoc.CL_SystemWindow);
									InventoryLogging.LogInventoryAction(client.Player, client.Player, eInventoryActionType.Other, item.Template, item.Count);
								}
							}
							break;
						}
					#endregion Create
					#region Count
					case "count":
						{
							int slot = (int)eInventorySlot.LastBackpack;

							if (args.Length >= 4)
							{
								slot = Convert.ToInt32(args[3]);
							}

							InventoryItem item = client.Player.Inventory.GetItem((eInventorySlot)slot);

							if (item == null)
							{
								client.Out.SendMessage(LanguageMgr.GetTranslation(client, "GMCommands.Item.Count.NoItemInSlot", slot), eChatType.CT_System, eChatLoc.CL_SystemWindow);
								return;
							}
							if (!item.IsStackable)
							{
								client.Out.SendMessage(LanguageMgr.GetTranslation(client, "GMCommands.Item.Count.NotStackable", item.GetName(0, true)), eChatType.CT_System, eChatLoc.CL_SystemWindow);
								return;
							}
							if (Convert.ToInt32(args[2]) < 1)
							{
								item.Count = 1;
							}
							else
							{
								item.Count = Convert.ToInt32(args[2]);
							}

							client.Out.SendInventoryItemsUpdate(new InventoryItem[] { item });
							client.Player.UpdateEncumberance();
							break;
						}
					#endregion Count
					#region MaxCount
					case "maxcount":
						{
							int slot = (int)eInventorySlot.LastBackpack;

							if (args.Length >= 4)
							{
								slot = Convert.ToInt32(args[3]);
							}

							InventoryItem item = client.Player.Inventory.GetItem((eInventorySlot)slot);

							if (item == null)
							{
								client.Out.SendMessage(LanguageMgr.GetTranslation(client, "GMCommands.Item.Count.NoItemInSlot", slot), eChatType.CT_System, eChatLoc.CL_SystemWindow);
								return;
							}
							item.MaxCount = Convert.ToInt32(args[2]);
							if (item.MaxCount < 1)
								item.MaxCount = 1;
							break;
						}
					#endregion MaxCount
					#region PackSize
					case "packsize":
						{
							int slot = (int)eInventorySlot.LastBackpack;

							if (args.Length >= 4)
							{
								slot = Convert.ToInt32(args[3]);
							}

							InventoryItem item = client.Player.Inventory.GetItem((eInventorySlot)slot);

							if (item == null)
							{
								client.Out.SendMessage(LanguageMgr.GetTranslation(client, "GMCommands.Item.Count.NoItemInSlot", slot), eChatType.CT_System, eChatLoc.CL_SystemWindow);
								return;
							}
							item.PackSize = Convert.ToInt32(args[2]);
							if (item.PackSize < 1)
								item.PackSize = 1;
							break;
						}
					#endregion PackSize
					#region Info
					case "info":
						{
							ItemTemplate obj = GameServer.Database.FindObjectByKey<ItemTemplate>(args[2]);
							if (obj == null)
							{
								client.Out.SendMessage(LanguageMgr.GetTranslation(client, "GMCommands.Item.Info.ItemTemplateUnknown", args[2]), eChatType.CT_System, eChatLoc.CL_SystemWindow);
								return;
							}
							GameInventoryItem invItem = GameInventoryItem.Create<ItemTemplate>(obj);
							var objectInfo = new List<string>();
							invItem.WriteTechnicalInfo(objectInfo);
							client.Out.SendCustomTextWindow(LanguageMgr.GetTranslation(client, "GMCommands.Item.Info.Informations", obj.Id_nb), objectInfo);
							break;
						}
					#endregion Info
					#region Model
					case "model":
						{
							int slot = (int)eInventorySlot.LastBackpack;
							if (args.Length >= 4)
							{
								try
								{
									slot = Convert.ToInt32(args[3]);
								}
								catch
								{
									slot = (int)eInventorySlot.LastBackpack;
								}
							}
							InventoryItem item = client.Player.Inventory.GetItem((eInventorySlot)slot);
							if (item == null)
							{
								client.Out.SendMessage(LanguageMgr.GetTranslation(client, "GMCommands.Item.Count.NoItemInSlot", slot), eChatType.CT_System, eChatLoc.CL_SystemWindow);
								return;
							}
							item.Model = Convert.ToUInt16(args[2]);
							client.Out.SendInventoryItemsUpdate(new InventoryItem[] { item });
							if (item.SlotPosition < (int)eInventorySlot.FirstBackpack)
								client.Player.UpdateEquipmentAppearance();
							break;
						}
					#endregion Model
					#region Extension
					case "extension":
						{
							int slot = (int)eInventorySlot.LastBackpack;
							if (args.Length >= 4)
							{
								try
								{
									slot = Convert.ToInt32(args[3]);
								}
								catch
								{
									slot = (int)eInventorySlot.LastBackpack;
								}
							}
							InventoryItem item = client.Player.Inventory.GetItem((eInventorySlot)slot);
							if (item == null)
							{
								client.Out.SendMessage(LanguageMgr.GetTranslation(client, "GMCommands.Item.Count.NoItemInSlot", slot), eChatType.CT_System, eChatLoc.CL_SystemWindow);
								return;
							}
							item.Extension = Convert.ToByte(args[2]);

							if (item.Template is ItemUnique || (item.Template is ItemTemplate && (item.Template as ItemTemplate).AllowUpdate))
							{
								item.Template.Extension = item.Extension;
							}

							client.Out.SendInventoryItemsUpdate(new InventoryItem[] { item });
							if (item.SlotPosition < (int)eInventorySlot.FirstBackpack)
								client.Player.UpdateEquipmentAppearance();
							break;
						}
					#endregion Extension
					#region Color
					case "color":
						{
							int slot = (int)eInventorySlot.LastBackpack;
							if (args.Length >= 4)
							{
								try
								{
									slot = Convert.ToInt32(args[3]);
								}
								catch
								{
									slot = (int)eInventorySlot.LastBackpack;
								}
							}
							InventoryItem item = client.Player.Inventory.GetItem((eInventorySlot)slot);
							if (item == null)
							{
								client.Out.SendMessage(LanguageMgr.GetTranslation(client, "GMCommands.Item.Count.NoItemInSlot", slot), eChatType.CT_System, eChatLoc.CL_SystemWindow);
								return;
							}
							item.Color = Convert.ToUInt16(args[2]);

							if (item.Template is ItemUnique || (item.Template is ItemTemplate && (item.Template as ItemTemplate).AllowUpdate))
							{
								item.Template.Color = item.Color;
							}

							client.Out.SendInventoryItemsUpdate(new InventoryItem[] { item });
							if (item.SlotPosition < (int)eInventorySlot.FirstBackpack)
								client.Player.UpdateEquipmentAppearance();
							break;
						}
					#endregion Color
					#region Effect
					case "effect":
						{
							int slot = (int)eInventorySlot.LastBackpack;
							if (args.Length >= 4)
							{
								try
								{
									slot = Convert.ToInt32(args[3]);
								}
								catch
								{
									slot = (int)eInventorySlot.LastBackpack;
								}
							}
							InventoryItem item = client.Player.Inventory.GetItem((eInventorySlot)slot);
							if (item == null)
							{
								client.Out.SendMessage(LanguageMgr.GetTranslation(client, "GMCommands.Item.Count.NoItemInSlot", slot), eChatType.CT_System, eChatLoc.CL_SystemWindow);
								return;
							}
							item.Effect = Convert.ToUInt16(args[2]);
							client.Out.SendInventoryItemsUpdate(new InventoryItem[] { item });
							if (item.SlotPosition < (int)eInventorySlot.FirstBackpack)
								client.Player.UpdateEquipmentAppearance();
							break;
						}
					#endregion Effect
					#region Type
					case "type":
						{
							int slot = (int)eInventorySlot.LastBackpack;
							if (args.Length >= 4)
							{
								try
								{
									slot = Convert.ToInt32(args[3]);
								}
								catch
								{
									slot = (int)eInventorySlot.LastBackpack;
								}
							}
							InventoryItem item = client.Player.Inventory.GetItem((eInventorySlot)slot);
							if (item == null)
							{
								client.Out.SendMessage(LanguageMgr.GetTranslation(client, "GMCommands.Item.Count.NoItemInSlot", slot), eChatType.CT_System, eChatLoc.CL_SystemWindow);
								return;
							}
							item.Item_Type = Convert.ToInt32(args[2]);
							client.Out.SendInventoryItemsUpdate(new InventoryItem[] { item });
							break;
						}
					#endregion Type
					#region Object
					case "object":
						{
							int slot = (int)eInventorySlot.LastBackpack;
							if (args.Length >= 4)
							{
								try
								{
									slot = Convert.ToInt32(args[3]);
								}
								catch
								{
									slot = (int)eInventorySlot.LastBackpack;
								}
							}
							InventoryItem item = client.Player.Inventory.GetItem((eInventorySlot)slot);
							if (item == null)
							{
								client.Out.SendMessage(LanguageMgr.GetTranslation(client, "GMCommands.Item.Count.NoItemInSlot", slot), eChatType.CT_System, eChatLoc.CL_SystemWindow);
								return;
							}
							item.Object_Type = Convert.ToInt32(args[2]);
							client.Out.SendInventoryItemsUpdate(new InventoryItem[] { item });
							break;
						}
					#endregion Object
					#region Hand
					case "hand":
						{
							int slot = (int)eInventorySlot.LastBackpack;
							if (args.Length >= 4)
							{
								try
								{
									slot = Convert.ToInt32(args[3]);
								}
								catch
								{
									slot = (int)eInventorySlot.LastBackpack;
								}
							}
							InventoryItem item = client.Player.Inventory.GetItem((eInventorySlot)slot);
							if (item == null)
							{
								client.Out.SendMessage(LanguageMgr.GetTranslation(client, "GMCommands.Item.Count.NoItemInSlot", slot), eChatType.CT_System, eChatLoc.CL_SystemWindow);
								return;
							}
							item.Hand = Convert.ToInt32(args[2]);
							client.Out.SendInventoryItemsUpdate(new InventoryItem[] { item });
							break;
						}
					#endregion Hand
					#region DamageType
					case "damagetype":
						{
							int slot = (int)eInventorySlot.LastBackpack;
							if (args.Length >= 4)
							{
								try
								{
									slot = Convert.ToInt32(args[3]);
								}
								catch
								{
									slot = (int)eInventorySlot.LastBackpack;
								}
							}
							InventoryItem item = client.Player.Inventory.GetItem((eInventorySlot)slot);
							if (item == null)
							{
								client.Out.SendMessage(LanguageMgr.GetTranslation(client, "GMCommands.Item.Count.NoItemInSlot", slot), eChatType.CT_System, eChatLoc.CL_SystemWindow);
								return;
							}
							item.Type_Damage = Convert.ToInt32(args[2]);
							client.Out.SendInventoryItemsUpdate(new InventoryItem[] { item });
							break;
						}
					#endregion DamageType
					#region Name
					case "name":
						{
							string name = args[2];
							int slot = (int)eInventorySlot.LastBackpack;

							if (int.TryParse(args[args.Length - 1], out slot))
							{
								name = string.Join(" ", args, 2, args.Length - 3);
							}
							else
							{
								name = string.Join(" ", args, 2, args.Length - 2);
								slot = (int)eInventorySlot.LastBackpack;
							}

							InventoryItem item = client.Player.Inventory.GetItem((eInventorySlot)slot);
							if (item == null)
							{
								client.Out.SendMessage(LanguageMgr.GetTranslation(client, "GMCommands.Item.Count.NoItemInSlot", slot), eChatType.CT_System, eChatLoc.CL_SystemWindow);
								return;
							}

							item.Name = name;
							client.Out.SendInventoryItemsUpdate(new InventoryItem[] { item });
							break;
						}
					#endregion Name
					#region Description
					case "description":
						{
							string desc = args[2];
							int slot = (int)eInventorySlot.LastBackpack;

							if (int.TryParse(args[args.Length - 1], out slot))
							{
								desc = string.Join(" ", args, 2, args.Length - 3);
							}
							else
							{
								desc = string.Join(" ", args, 2, args.Length - 2);
								slot = (int)eInventorySlot.LastBackpack;
							}

							InventoryItem item = client.Player.Inventory.GetItem((eInventorySlot)slot);
							if (item == null)
							{
								client.Out.SendMessage(LanguageMgr.GetTranslation(client, "GMCommands.Item.Count.NoItemInSlot", slot), eChatType.CT_System, eChatLoc.CL_SystemWindow);
								return;
							}

							item.Description = desc;
							client.Out.SendInventoryItemsUpdate(new InventoryItem[] { item });
							break;
						}
					#endregion Name
					#region CrafterName
					case "craftername":
						{
							int slot = (int)eInventorySlot.LastBackpack;
							if (args.Length >= 4)
							{
								try
								{
									slot = Convert.ToInt32(args[3]);
								}
								catch
								{
									slot = (int)eInventorySlot.LastBackpack;
								}
							}
							InventoryItem item = client.Player.Inventory.GetItem((eInventorySlot)slot);
							if (item == null)
							{
								client.Out.SendMessage(LanguageMgr.GetTranslation(client, "GMCommands.Item.Count.NoItemInSlot", slot), eChatType.CT_System, eChatLoc.CL_SystemWindow);
								return;
							}
							item.IsCrafted = true;
							item.Creator = args[2];
							client.Out.SendInventoryItemsUpdate(new InventoryItem[] { item });
							break;
						}
					#endregion CrafterName
					#region Emblem
					case "emblem":
						{
							int slot = (int)eInventorySlot.LastBackpack;
							if (args.Length >= 4)
							{
								try
								{
									slot = Convert.ToInt32(args[3]);
								}
								catch
								{
									slot = (int)eInventorySlot.LastBackpack;
								}
							}
							InventoryItem item = client.Player.Inventory.GetItem((eInventorySlot)slot);
							if (item == null)
							{
								client.Out.SendMessage(LanguageMgr.GetTranslation(client, "GMCommands.Item.Count.NoItemInSlot", slot), eChatType.CT_System, eChatLoc.CL_SystemWindow);
								return;
							}
							item.Emblem = Convert.ToInt32(args[2]);

							if (item.Template is ItemUnique || (item.Template is ItemTemplate && (item.Template as ItemTemplate).AllowUpdate))
							{
								item.Template.Emblem = item.Emblem;
							}

							client.Out.SendInventoryItemsUpdate(new InventoryItem[] { item });
							if (item.SlotPosition < (int)eInventorySlot.FirstBackpack)
								client.Player.UpdateEquipmentAppearance();
							break;
						}
					#endregion Emblem
					#region Level
					case "level":
						{
							int slot = (int)eInventorySlot.LastBackpack;
							if (args.Length >= 4)
							{
								try
								{
									slot = Convert.ToInt32(args[3]);
								}
								catch
								{
									slot = (int)eInventorySlot.LastBackpack;
								}
							}
							InventoryItem item = client.Player.Inventory.GetItem((eInventorySlot)slot);
							if (item == null)
							{
								client.Out.SendMessage(LanguageMgr.GetTranslation(client, "GMCommands.Item.Count.NoItemInSlot", slot), eChatType.CT_System, eChatLoc.CL_SystemWindow);
								return;
							}
							item.Level = Convert.ToUInt16(args[2]);
							client.Out.SendInventoryItemsUpdate(new InventoryItem[] { item });
							break;
						}
					#endregion Level
					#region Price
					case "price":
						{
							int slot = (int)eInventorySlot.LastBackpack;
							if (args.Length >= 7)
							{
								try
								{
									slot = Convert.ToInt32(args[6]);
								}
								catch
								{
									slot = (int)eInventorySlot.LastBackpack;
								}
							}
							InventoryItem item = client.Player.Inventory.GetItem((eInventorySlot)slot);
							if (item == null)
							{
								client.Out.SendMessage(LanguageMgr.GetTranslation(client, "GMCommands.Item.Count.NoItemInSlot", slot), eChatType.CT_System, eChatLoc.CL_SystemWindow);
								return;
							}
							item.Price = Money.GetMoney(0, (int)(Convert.ToInt16(args[2]) % 1000), (int)(Convert.ToInt16(args[3]) % 1000), (int)(Convert.ToByte(args[4]) % 100), (int)(Convert.ToByte(args[5]) % 100));
							client.Out.SendInventoryItemsUpdate(new InventoryItem[] { item });
							break;
						}
					#endregion Price
					#region Condition
					case "condition":
						{
							int slot = (int)eInventorySlot.LastBackpack;
							if (args.Length >= 5)
							{
								try
								{
									slot = Convert.ToInt32(args[4]);
								}
								catch
								{
									slot = (int)eInventorySlot.LastBackpack;
								}
							}
							InventoryItem item = client.Player.Inventory.GetItem((eInventorySlot)slot);
							if (item == null)
							{
								client.Out.SendMessage(LanguageMgr.GetTranslation(client, "GMCommands.Item.Count.NoItemInSlot", slot), eChatType.CT_System, eChatLoc.CL_SystemWindow);
								return;
							}
							int con = Convert.ToInt32(args[2]);
							int maxcon = Convert.ToInt32(args[3]);
							item.Condition = con;
							item.MaxCondition = maxcon;
							if (item.Template is ItemUnique || (item.Template is ItemTemplate && (item.Template as ItemTemplate).AllowUpdate))
							{
								item.Template.Condition = item.Condition;
							}
							client.Out.SendInventoryItemsUpdate(new InventoryItem[] { item });
							break;
						}
					#endregion Condition
					#region Durability
					case "durability":
						{
							int slot = (int)eInventorySlot.LastBackpack;
							if (args.Length >= 5)
							{
								try
								{
									slot = Convert.ToInt32(args[4]);
								}
								catch
								{
									slot = (int)eInventorySlot.LastBackpack;
								}
							}
							InventoryItem item = client.Player.Inventory.GetItem((eInventorySlot)slot);
							if (item == null)
							{
								client.Out.SendMessage(LanguageMgr.GetTranslation(client, "GMCommands.Item.Count.NoItemInSlot", slot), eChatType.CT_System, eChatLoc.CL_SystemWindow);
								return;
							}
							int Dur = Convert.ToInt32(args[2]);
							int MaxDur = Convert.ToInt32(args[3]);
							item.Durability = Dur;
							if (item.Template is ItemUnique || (item.Template is ItemTemplate && (item.Template as ItemTemplate).AllowUpdate))
							{
								item.Template.Durability = item.Durability;
							}
							item.MaxDurability = MaxDur;
							client.Out.SendInventoryItemsUpdate(new InventoryItem[] { item });
							break;
						}
					#endregion Durability
					#region Quality
					case "quality":
						{
							int slot = (int)eInventorySlot.LastBackpack;
							if (args.Length >= 4)
							{
								try
								{
									slot = Convert.ToInt32(args[3]);
								}
								catch
								{
									slot = (int)eInventorySlot.LastBackpack;
								}
							}
							InventoryItem item = client.Player.Inventory.GetItem((eInventorySlot)slot);
							if (item == null)
							{
								client.Out.SendMessage(LanguageMgr.GetTranslation(client, "GMCommands.Item.Count.NoItemInSlot", slot), eChatType.CT_System, eChatLoc.CL_SystemWindow);
								return;
							}
							int Qua = Convert.ToInt32(args[2]);
							item.Quality = Qua;
							client.Out.SendInventoryItemsUpdate(new InventoryItem[] { item });
							break;
						}
					#endregion Quality
					#region Bonus
					case "bonus":
						{
							int slot = (int)eInventorySlot.LastBackpack;
							if (args.Length >= 4)
							{
								try
								{
									slot = Convert.ToInt32(args[3]);
								}
								catch
								{
									slot = (int)eInventorySlot.LastBackpack;
								}
							}
							InventoryItem item = client.Player.Inventory.GetItem((eInventorySlot)slot);
							if (item == null)
							{
								client.Out.SendMessage(LanguageMgr.GetTranslation(client, "GMCommands.Item.Count.NoItemInSlot", slot), eChatType.CT_System, eChatLoc.CL_SystemWindow);
								return;
							}
							int Bonus = Convert.ToInt32(args[2]);
							item.Bonus = Bonus;
							client.Out.SendInventoryItemsUpdate(new InventoryItem[] { item });
							break;
						}
					#endregion Bonus
					#region mBonus
					case "mbonus":
						{
							int slot = (int)eInventorySlot.LastBackpack;
							int num = 0;
							int bonusType = 0;
							int bonusValue = 0;
							if (args.Length >= 6)
							{
								try
								{
									slot = Convert.ToInt32(args[5]);
								}
								catch
								{
									slot = (int)eInventorySlot.LastBackpack;
								}
							}
							InventoryItem item = client.Player.Inventory.GetItem((eInventorySlot)slot);
							if (item == null)
							{
								client.Out.SendMessage(LanguageMgr.GetTranslation(client, "GMCommands.Item.Count.NoItemInSlot", slot), eChatType.CT_System, eChatLoc.CL_SystemWindow);
								return;
							}
							try
							{
								num = Convert.ToInt32(args[2]);
							}
							catch
							{
								client.Out.SendMessage(LanguageMgr.GetTranslation(client, "GMCommands.Item.mBonus.NonSetBonusNumber"), eChatType.CT_System, eChatLoc.CL_SystemWindow);
							}
							try
							{
								bonusType = Convert.ToInt32(args[3]);
								if (bonusType < 0 || bonusType >= (int)eProperty.MaxProperty)
								{
									client.Out.SendMessage(LanguageMgr.GetTranslation(client, "GMCommands.Item.mBonus.TypeShouldBeInRange", (int)(eProperty.MaxProperty - 1)), eChatType.CT_System, eChatLoc.CL_SystemWindow);
									break;
								}
							}
							catch
							{
								client.Out.SendMessage(LanguageMgr.GetTranslation(client, "GMCommands.Item.mBonus.NonSetBonusType"), eChatType.CT_System, eChatLoc.CL_SystemWindow);
							}
							try
							{
								bonusValue = Convert.ToInt32(args[4]);
								switch (num)
								{
									case 0:
										{
											item.ExtraBonus = bonusValue;
											item.ExtraBonusType = bonusType;
											break;
										}
									case 1:
										{
											item.Bonus1 = bonusValue;
											item.Bonus1Type = bonusType;
											break;
										}
									case 2:
										{
											item.Bonus2 = bonusValue;
											item.Bonus2Type = bonusType;
											break;
										}
									case 3:
										{
											item.Bonus3 = bonusValue;
											item.Bonus3Type = bonusType;
											break;
										}
									case 4:
										{
											item.Bonus4 = bonusValue;
											item.Bonus4Type = bonusType;
											break;
										}
									case 5:
										{
											item.Bonus5 = bonusValue;
											item.Bonus5Type = bonusType;
											break;
										}
									case 6:
										{
											item.Bonus6 = bonusValue;
											item.Bonus6Type = bonusType;
											break;
										}
									case 7:
										{
											item.Bonus7 = bonusValue;
											item.Bonus7Type = bonusType;
											break;
										}
									case 8:
										{
											item.Bonus8 = bonusValue;
											item.Bonus8Type = bonusType;
											break;
										}
									case 9:
										{
											item.Bonus9 = bonusValue;
											item.Bonus9Type = bonusType;
											break;
										}
									case 10:
										{
											item.Bonus10 = bonusValue;
											item.Bonus10Type = bonusType;
											break;
										}
									default:
										client.Out.SendMessage(LanguageMgr.GetTranslation(client, "GMCommands.Item.mBonus.UnknownBonusNumber", num), eChatType.CT_System, eChatLoc.CL_SystemWindow);
										return;
								}
								if (item.SlotPosition < (int)eInventorySlot.FirstBackpack)
								{
									client.Out.SendCharStatsUpdate();
									client.Out.SendCharResistsUpdate();
								}
							}
							catch
							{
								client.Out.SendMessage(LanguageMgr.GetTranslation(client, "GMCommands.Item.mBonus.NotSetBonusValue"), eChatType.CT_System, eChatLoc.CL_SystemWindow);
							}
							break;
						}
					#endregion mBonus
					#region Weight
					case "weight":
						{
							int slot = (int)eInventorySlot.LastBackpack;
							if (args.Length >= 4)
							{
								try
								{
									slot = Convert.ToInt32(args[3]);
								}
								catch
								{
									slot = (int)eInventorySlot.LastBackpack;
								}
							}
							InventoryItem item = client.Player.Inventory.GetItem((eInventorySlot)slot);
							if (item == null)
							{
								client.Out.SendMessage(LanguageMgr.GetTranslation(client, "GMCommands.Item.Count.NoItemInSlot", slot), eChatType.CT_System, eChatLoc.CL_SystemWindow);
								return;
							}
							item.Weight = Convert.ToInt32(args[2]);
							client.Out.SendInventoryItemsUpdate(new InventoryItem[] { item });
							break;
						}
					#endregion Weight
					#region DPS_AF - DPS - AF
					case "dps_af":
					case "dps":
					case "af":
						{
							int slot = (int)eInventorySlot.LastBackpack;
							if (args.Length >= 4)
							{
								try
								{
									slot = Convert.ToInt32(args[3]);
								}
								catch
								{
									slot = (int)eInventorySlot.LastBackpack;
								}
							}
							InventoryItem item = client.Player.Inventory.GetItem((eInventorySlot)slot);
							if (item == null)
							{
								client.Out.SendMessage(LanguageMgr.GetTranslation(client, "GMCommands.Item.Count.NoItemInSlot", slot), eChatType.CT_System, eChatLoc.CL_SystemWindow);
								return;
							}
							item.DPS_AF = Convert.ToByte(args[2]);
							client.Out.SendInventoryItemsUpdate(new InventoryItem[] { item });
							break;
						}
					#endregion DPS_AF - DPS - AF
					#region SPD_ABS - SPD - ABS
					case "spd_abs":
					case "spd":
					case "abs":
						{
							int slot = (int)eInventorySlot.LastBackpack;
							if (args.Length >= 4)
							{
								try
								{
									slot = Convert.ToInt32(args[3]);
								}
								catch
								{
									slot = (int)eInventorySlot.LastBackpack;
								}
							}
							InventoryItem item = client.Player.Inventory.GetItem((eInventorySlot)slot);
							if (item == null)
							{
								client.Out.SendMessage(LanguageMgr.GetTranslation(client, "GMCommands.Item.Count.NoItemInSlot", slot), eChatType.CT_System, eChatLoc.CL_SystemWindow);
								return;
							}
							item.SPD_ABS = Convert.ToByte(args[2]);
							client.Out.SendInventoryItemsUpdate(new InventoryItem[] { item });
							break;
						}
					#endregion SPD_ABS - SPD - ABS
					#region IsDropable
					case "isdropable":
						{
							int slot = (int)eInventorySlot.LastBackpack;
							if (args.Length >= 4)
							{
								try
								{
									slot = Convert.ToInt32(args[3]);
								}
								catch
								{
									slot = (int)eInventorySlot.LastBackpack;
								}
							}
							InventoryItem item = client.Player.Inventory.GetItem((eInventorySlot)slot);
							if (item == null)
							{
								client.Out.SendMessage(LanguageMgr.GetTranslation(client, "GMCommands.Item.Count.NoItemInSlot", slot), eChatType.CT_System, eChatLoc.CL_SystemWindow);
								return;
							}
							item.IsDropable = Convert.ToBoolean(args[2]);
							break;
						}
					#endregion IsDropable
					#region IsPickable
					case "ispickable":
						{
							int slot = (int)eInventorySlot.LastBackpack;
							if (args.Length >= 4)
							{
								try
								{
									slot = Convert.ToInt32(args[3]);
								}
								catch
								{
									slot = (int)eInventorySlot.LastBackpack;
								}
							}
							InventoryItem item = client.Player.Inventory.GetItem((eInventorySlot)slot);
							if (item == null)
							{
								client.Out.SendMessage(LanguageMgr.GetTranslation(client, "GMCommands.Item.Count.NoItemInSlot", slot), eChatType.CT_System, eChatLoc.CL_SystemWindow);
								return;
							}
							item.IsPickable = Convert.ToBoolean(args[2]);
							break;
						}
					#endregion IsPickable
					#region IsNotLosingDur
					case "isnotlosingdur":
						{
							int slot = (int)eInventorySlot.LastBackpack;
							if (args.Length >= 4)
							{
								try
								{
									slot = Convert.ToInt32(args[3]);
								}
								catch
								{
									slot = (int)eInventorySlot.LastBackpack;
								}
							}
							InventoryItem item = client.Player.Inventory.GetItem((eInventorySlot)slot);
							if (item == null)
							{
								client.Out.SendMessage(LanguageMgr.GetTranslation(client, "GMCommands.Item.Count.NoItemInSlot", slot), eChatType.CT_System, eChatLoc.CL_SystemWindow);
								return;
							}
							item.IsNotLosingDur = Convert.ToBoolean(args[2]);
							break;
						}
					#endregion IsNotLosingDur
					#region IsIndestructible
					case "isindestructible":
						{
							int slot = (int)eInventorySlot.LastBackpack;
							if (args.Length >= 4)
							{
								try
								{
									slot = Convert.ToInt32(args[3]);
								}
								catch
								{
									slot = (int)eInventorySlot.LastBackpack;
								}
							}
							InventoryItem item = client.Player.Inventory.GetItem((eInventorySlot)slot);
							if (item == null)
							{
								client.Out.SendMessage(LanguageMgr.GetTranslation(client, "GMCommands.Item.Count.NoItemInSlot", slot), eChatType.CT_System, eChatLoc.CL_SystemWindow);
								return;
							}
							item.IsIndestructible = Convert.ToBoolean(args[2]);
							break;
						}
					#endregion IsIndestructible
					#region IsTradable
					case "istradable":
						{
							int slot = (int)eInventorySlot.LastBackpack;
							if (args.Length >= 4)
							{
								try
								{
									slot = Convert.ToInt32(args[3]);
								}
								catch
								{
									slot = (int)eInventorySlot.LastBackpack;
								}
							}
							InventoryItem item = client.Player.Inventory.GetItem((eInventorySlot)slot);
							if (item == null)
							{
								client.Out.SendMessage(LanguageMgr.GetTranslation(client, "GMCommands.Item.Count.NoItemInSlot", slot), eChatType.CT_System, eChatLoc.CL_SystemWindow);
								return;
							}
							item.IsTradable = Convert.ToBoolean(args[2]);
							break;
						}
					#endregion IsTradable
					#region CanDropAsLoot
					case "candropasloot":
						{
							int slot = (int)eInventorySlot.LastBackpack;
							if (args.Length >= 4)
							{
								try
								{
									slot = Convert.ToInt32(args[3]);
								}
								catch
								{
									slot = (int)eInventorySlot.LastBackpack;
								}
							}
							InventoryItem item = client.Player.Inventory.GetItem((eInventorySlot)slot);
							if (item == null)
							{
								client.Out.SendMessage(LanguageMgr.GetTranslation(client, "GMCommands.Item.Count.NoItemInSlot", slot), eChatType.CT_System, eChatLoc.CL_SystemWindow);
								return;
							}
							item.CanDropAsLoot = Convert.ToBoolean(args[2]);
							break;
						}
					#endregion CanDropAsLoot
					#region Spell
					case "spell":
						{
							int slot = (int)eInventorySlot.LastBackpack;
							if (args.Length >= 6)
							{
								try
								{
									slot = Convert.ToInt32(args[5]);
								}
								catch
								{
									slot = (int)eInventorySlot.LastBackpack;
								}
							}
							InventoryItem item = client.Player.Inventory.GetItem((eInventorySlot)slot);
							if (item == null)
							{
								client.Out.SendMessage(LanguageMgr.GetTranslation(client, "GMCommands.Item.Count.NoItemInSlot", slot), eChatType.CT_System, eChatLoc.CL_SystemWindow);
								return;
							}
							int Charges = Convert.ToInt32(args[2]);
							int MaxCharges = Convert.ToInt32(args[3]);
							int SpellID = Convert.ToInt32(args[4]);
							item.Charges = Charges;
							item.MaxCharges = MaxCharges;
							if (item.Template is ItemUnique || (item.Template is ItemTemplate && (item.Template as ItemTemplate).AllowUpdate))
							{
								item.Template.Charges = item.Charges;
								item.Template.MaxCharges = item.MaxCharges;
							}
							item.SpellID = SpellID;
							client.Out.SendInventoryItemsUpdate(new InventoryItem[] { item });
							break;
						}
					#endregion Spell
					#region Spell1
					case "spell1":
						{
							int slot = (int)eInventorySlot.LastBackpack;
							if (args.Length >= 6)
							{
								try
								{
									slot = Convert.ToInt32(args[5]);
								}
								catch
								{
									slot = (int)eInventorySlot.LastBackpack;
								}
							}
							InventoryItem item = client.Player.Inventory.GetItem((eInventorySlot)slot);
							if (item == null)
							{
								client.Out.SendMessage(LanguageMgr.GetTranslation(client, "GMCommands.Item.Count.NoItemInSlot", slot), eChatType.CT_System, eChatLoc.CL_SystemWindow);
								return;
							}
							int Charges = Convert.ToInt32(args[2]);
							int MaxCharges = Convert.ToInt32(args[3]);
							int SpellID1 = Convert.ToInt32(args[4]);
							item.Charges1 = Charges;
							item.MaxCharges1 = MaxCharges;
							if (item.Template is ItemUnique || (item.Template is ItemTemplate && (item.Template as ItemTemplate).AllowUpdate))
							{
								item.Template.Charges1 = item.Charges1;
								item.Template.MaxCharges1 = item.MaxCharges1;
							}
							item.SpellID1 = SpellID1;
							client.Out.SendInventoryItemsUpdate(new InventoryItem[] { item });
							break;
						}
					#endregion Spell1
					#region Proc
					case "proc":
						{
							int slot = (int)eInventorySlot.LastBackpack;
							if (args.Length >= 4)
							{
								try
								{
									slot = Convert.ToInt32(args[3]);
								}
								catch
								{
									slot = (int)eInventorySlot.LastBackpack;
								}
							}
							InventoryItem item = client.Player.Inventory.GetItem((eInventorySlot)slot);
							if (item == null)
							{
								client.Out.SendMessage(LanguageMgr.GetTranslation(client, "GMCommands.Item.Count.NoItemInSlot", slot), eChatType.CT_System, eChatLoc.CL_SystemWindow);
								return;
							}
							item.ProcSpellID = Convert.ToInt32(args[2]);
							client.Out.SendInventoryItemsUpdate(new InventoryItem[] { item });
							break;
						}
					#endregion Proc
					#region Proc1
					case "proc1":
						{
							int slot = (int)eInventorySlot.LastBackpack;
							if (args.Length >= 4)
							{
								try
								{
									slot = Convert.ToInt32(args[3]);
								}
								catch
								{
									slot = (int)eInventorySlot.LastBackpack;
								}
							}
							InventoryItem item = client.Player.Inventory.GetItem((eInventorySlot)slot);
							if (item == null)
							{
								client.Out.SendMessage(LanguageMgr.GetTranslation(client, "GMCommands.Item.Count.NoItemInSlot", slot), eChatType.CT_System, eChatLoc.CL_SystemWindow);
								return;
							}
							item.ProcSpellID1 = Convert.ToInt32(args[2]);
							client.Out.SendInventoryItemsUpdate(new InventoryItem[] { item });
							break;
						}
					#endregion Proc1
					#region ProcChance
					case "procchance":
						{
							int slot = (int)eInventorySlot.LastBackpack;
							if (args.Length >= 4)
							{
								try
								{
									slot = Convert.ToInt32(args[3]);
								}
								catch
								{
									slot = (int)eInventorySlot.LastBackpack;
								}
							}
							InventoryItem item = client.Player.Inventory.GetItem((eInventorySlot)slot);
							if (item == null)
							{
								client.Out.SendMessage(LanguageMgr.GetTranslation(client, "GMCommands.Item.Count.NoItemInSlot", slot), eChatType.CT_System, eChatLoc.CL_SystemWindow);
								return;
							}
							item.ProcChance = Convert.ToByte(args[2]);
							client.Out.SendInventoryItemsUpdate(new InventoryItem[] { item });
							break;
						}
					#endregion ProcChance
					#region Poison
					case "poison":
						{
							int slot = (int)eInventorySlot.LastBackpack;
							if (args.Length >= 6)
							{
								try
								{
									slot = Convert.ToInt32(args[5]);
								}
								catch
								{
									slot = (int)eInventorySlot.LastBackpack;
								}
							}
							InventoryItem item = client.Player.Inventory.GetItem((eInventorySlot)slot);
							if (item == null)
							{
								client.Out.SendMessage(LanguageMgr.GetTranslation(client, "GMCommands.Item.Count.NoItemInSlot", slot), eChatType.CT_System, eChatLoc.CL_SystemWindow);
								return;
							}
							int Charges = Convert.ToInt32(args[2]);
							int MaxCharges = Convert.ToInt32(args[3]);
							int SpellID = Convert.ToInt32(args[4]);
							item.PoisonCharges = Charges;
							item.PoisonMaxCharges = MaxCharges;
							if (item.Template is ItemUnique || (item.Template is ItemTemplate && (item.Template as ItemTemplate).AllowUpdate))
							{
								item.Template.PoisonCharges = item.PoisonCharges;
								item.Template.PoisonMaxCharges = item.PoisonMaxCharges;
							}
							item.PoisonSpellID = SpellID;
							client.Out.SendInventoryItemsUpdate(new InventoryItem[] { item });
							break;
						}
					#endregion Poison
					#region Realm
					case "realm":
						{
							int slot = (int)eInventorySlot.LastBackpack;
							if (args.Length >= 4)
							{
								try
								{
									slot = Convert.ToInt32(args[3]);
								}
								catch
								{
									slot = (int)eInventorySlot.LastBackpack;
								}
							}
							InventoryItem item = client.Player.Inventory.GetItem((eInventorySlot)slot);
							if (item == null)
							{
								client.Out.SendMessage(LanguageMgr.GetTranslation(client, "GMCommands.Item.Count.NoItemInSlot", slot), eChatType.CT_System, eChatLoc.CL_SystemWindow);
								return;
							}
							item.Realm = int.Parse(args[2]);
							break;
						}
					#endregion Realm
					#region Level Required
					case "levelrequired":
						{
							int slot = (int)eInventorySlot.LastBackpack;
							if (args.Length >= 4)
							{
								try
								{
									slot = Convert.ToInt32(args[3]);
								}
								catch
								{
									slot = (int)eInventorySlot.LastBackpack;
								}
							}
							InventoryItem item = client.Player.Inventory.GetItem((eInventorySlot)slot);
							if (item == null)
							{
								client.Out.SendMessage(LanguageMgr.GetTranslation(client, "GMCommands.Item.Count.NoItemInSlot", slot), eChatType.CT_System, eChatLoc.CL_SystemWindow);
								return;
							}
							int setting = Convert.ToInt32(args[2]);
							item.LevelRequirement = setting;
							client.Out.SendInventoryItemsUpdate(new InventoryItem[] { item });
							break;
						}
					#endregion Level Required
					#region Bonus Level
					case "bonuslevel":
						{
							int slot = (int)eInventorySlot.LastBackpack;
							if (args.Length >= 4)
							{
								try
								{
									slot = Convert.ToInt32(args[3]);
								}
								catch
								{
									slot = (int)eInventorySlot.LastBackpack;
								}
							}
							InventoryItem item = client.Player.Inventory.GetItem((eInventorySlot)slot);
							if (item == null)
							{
								client.Out.SendMessage(LanguageMgr.GetTranslation(client, "GMCommands.Item.Count.NoItemInSlot", slot), eChatType.CT_System, eChatLoc.CL_SystemWindow);
								return;
							}
							int setting = Convert.ToInt32(args[2]);
							item.BonusLevel = setting;
							client.Out.SendInventoryItemsUpdate(new InventoryItem[] { item });
							break;
						}
					#endregion Bonus Level
					#region ClassType
					case "classtype":
						{
							string classType = args[2];
							int slot = (int)eInventorySlot.LastBackpack;

							if (int.TryParse(args[args.Length - 1], out slot) == false)
							{
								slot = (int)eInventorySlot.LastBackpack;
							}

							InventoryItem item = client.Player.Inventory.GetItem((eInventorySlot)slot);
							if (item == null)
							{
								client.Out.SendMessage(LanguageMgr.GetTranslation(client, "GMCommands.Item.Count.NoItemInSlot", slot), eChatType.CT_System, eChatLoc.CL_SystemWindow);
								return;
							}

							item.ClassType = classType;
							client.Out.SendInventoryItemsUpdate(new InventoryItem[] { item });
							break;
						}
					#endregion ClassType
					#region PackageID
					case "packageid":
						{
							string packageID = args[2];
							int slot = (int)eInventorySlot.LastBackpack;

							if (int.TryParse(args[args.Length - 1], out slot) == false)
							{
								slot = (int)eInventorySlot.LastBackpack;
							}

							InventoryItem item = client.Player.Inventory.GetItem((eInventorySlot)slot);
							if (item == null)
							{
								client.Out.SendMessage(LanguageMgr.GetTranslation(client, "GMCommands.Item.Count.NoItemInSlot", slot), eChatType.CT_System, eChatLoc.CL_SystemWindow);
								return;
							}

							item.PackageID = packageID;
							client.Out.SendInventoryItemsUpdate(new InventoryItem[] { item });
							break;
						}
					#endregion PackageID
					#region Flags
					case "flags":
						{
							int flags = Convert.ToInt32(args[2]);
							int slot = (int)eInventorySlot.LastBackpack;

							if (args.Length == 4)
							{
								slot = Convert.ToInt32(args[3]);
							}

							InventoryItem item = client.Player.Inventory.GetItem((eInventorySlot)slot);
							if (item == null)
							{
								client.Out.SendMessage(LanguageMgr.GetTranslation(client, "GMCommands.Item.Count.NoItemInSlot", slot), eChatType.CT_System, eChatLoc.CL_SystemWindow);
								return;
							}

							item.Flags = flags;
							client.Out.SendInventoryItemsUpdate(new InventoryItem[] { item });
							break;
						}
					#endregion Flags
					#region Salvage
					case "salvageid":
						{
							int salvageID = Convert.ToInt32(args[2]);
							int slot = (int)eInventorySlot.LastBackpack;

							if (args.Length == 4)
							{
								slot = Convert.ToInt32(args[3]);
							}

							InventoryItem item = client.Player.Inventory.GetItem((eInventorySlot)slot);
							if (item == null)
							{
								client.Out.SendMessage(LanguageMgr.GetTranslation(client, "GMCommands.Item.Count.NoItemInSlot", slot), eChatType.CT_System, eChatLoc.CL_SystemWindow);
								return;
							}

							item.SalvageYieldID = salvageID;
							client.Out.SendInventoryItemsUpdate(new InventoryItem[] { item });
							break;
						}
					case "salvageinfo":
						{
							int slot = (int)eInventorySlot.LastBackpack;

							if (args.Length == 3)
							{
								slot = Convert.ToInt32(args[2]);
							}

							InventoryItem item = client.Player.Inventory.GetItem((eInventorySlot)slot);
							if (item == null)
							{
								client.Out.SendMessage(LanguageMgr.GetTranslation(client, "GMCommands.Item.Count.NoItemInSlot", slot), eChatType.CT_System, eChatLoc.CL_SystemWindow);
								return;
							}

							List<string> list = new List<string>();

							SalvageYield salvageYield = null;
							bool calculated = true;
							string sql = "";

							int salvageLevel = CraftingMgr.GetItemCraftLevel(item) / 100;
							if (salvageLevel > 9) salvageLevel = 9; // max 9

							if (item.SalvageYieldID == 0)
							{
								sql = "ObjectType=" + item.Object_Type + " AND SalvageLevel=" + salvageLevel;
							}
							else
							{
								sql = "ID=" + item.SalvageYieldID;
								calculated = false;
							}

							if (ServerProperties.Properties.USE_SALVAGE_PER_REALM)
							{
								// Some items use realm, some do not, so allow a find of either a set realm, or 0
								sql += " AND (Realm=" + item.Realm + " OR Realm=0)";
							}

							salvageYield = GameServer.Database.SelectObject<SalvageYield>(sql);
							SalvageYield yield = null;

							if (salvageYield != null)
							{
								yield = salvageYield.Clone() as SalvageYield;
							}

							if (yield == null || yield.PackageID == SalvageYield.LEGACY_SALVAGE_ID)
							{
								if (calculated == false)
								{
									list.Add("SalvageYield ID " + item.SalvageYieldID + " specified but not found!");
								}
								else if (ServerProperties.Properties.USE_NEW_SALVAGE)
								{
									list.Add("Calculated Values (USE_NEW_SALVAGE = True)");
								}
								else
								{
									list.Add("Calculated Values (USE_NEW_SALVAGE = False)");
								}
							}
							else
							{
								list.Add("Using SalvageYield ID: " + yield.ID);
							}

							list.Add(" ");

							ItemTemplate material = GameServer.Database.FindObjectByKey<ItemTemplate>(yield.MaterialId_nb);
							string materialName = yield.MaterialId_nb;

							if (material != null)
							{
								materialName = material.Name + " (" + materialName + ")";
							}
							else
							{
								materialName = "Not Found! (" + materialName + ")";
							}

							if (calculated == false)
							{
								if (yield != null)
								{
									list.Add("SalvageYield ID: " + yield.ID);
									list.Add("       Material: " + materialName);
									list.Add("          Count: " + yield.Count);
									list.Add("          Realm: " + (yield.Realm == 0 ? "Any" : GlobalConstants.RealmToName((eRealm)yield.Realm)));
									list.Add("      PackageID: " + yield.PackageID);
								}
							}
							else
							{
								list.Add("SalvageYield ID: " + yield.ID);
								list.Add("     ObjectType: " + yield.ObjectType);
								list.Add("   SalvageLevel: " + yield.SalvageLevel);
								list.Add("       Material: " + materialName);
								list.Add("          Count: " + Salvage.GetMaterialYield(client.Player, item, yield, material));
								list.Add("          Realm: " + (yield.Realm == 0 ? "Any" : GlobalConstants.RealmToName((eRealm)yield.Realm)));
								list.Add("      PackageID: " + yield.PackageID);
							}

							client.Out.SendCustomTextWindow("Salvage info for " + item.Name, list);
							break;
						}
					#endregion Flags
					#region Update
					case "update":
					case "updatetemplate":
						{
							int slot = (int)eInventorySlot.LastBackpack;
							if (args.Length == 3)
							{
								slot = Convert.ToInt32(args[2]);
							}

							InventoryItem item = client.Player.Inventory.GetItem((eInventorySlot)slot);
							if (item == null)
							{
								client.Out.SendMessage(LanguageMgr.GetTranslation(client, "GMCommands.Item.Count.NoItemInSlot", slot), eChatType.CT_System, eChatLoc.CL_SystemWindow);
								return;
							}

							if (item.Template is ItemUnique)
							{
								DisplayMessage(client, "This command is only applicable for items based on an ItemTemplate");
							}
							else
							{
								(item.Template as ItemTemplate).AllowUpdate = true;
								client.Out.SendMessage("** When this item is saved all changes will also be made to the source ItemTemplate: " + item.Template.Id_nb, eChatType.CT_Staff, eChatLoc.CL_SystemWindow);
								DisplayMessage(client, "** When this item is saved all changes will also be made to the source ItemTemplate: " + item.Template.Id_nb);
							}
							break;
						}
					#endregion Update
					#region SaveUnique
					case "saveunique":
						{
							int slot = (int)eInventorySlot.LastBackpack;
							string idnb = string.Empty;
							if (args.Length >= 4)
							{
								try
								{
									slot = Convert.ToInt32(args[3]);
								}
								catch
								{
									slot = (int)eInventorySlot.LastBackpack;
								}
								if (slot > (int)eInventorySlot.LastBackpack)
								{
									slot = (int)eInventorySlot.LastBackpack;
								}
								if (slot < 0)
								{
									slot = 0;
								}

								idnb = args[2];
							}
							else if (args.Length >= 3)
							{
								idnb = args[2];
							}
							else if (args.Length < 2)
							{
								DisplaySyntax(client);
								return;
							}

							InventoryItem item = client.Player.Inventory.GetItem((eInventorySlot)slot);
							if (item == null)
							{
								client.Out.SendMessage(LanguageMgr.GetTranslation(client, "GMCommands.Item.Count.NoItemInSlot", slot), eChatType.CT_System, eChatLoc.CL_SystemWindow);
								return;
							}

							if (item.Template is ItemUnique)
							{
								ItemUnique itemUnique = item.Template as ItemUnique;
								Log.Debug("update ItemUnique " + item.Template.Id_nb);
								GameServer.Database.SaveObject(itemUnique);
								client.Out.SendMessage(string.Format("ItemUnique {0} updated!", itemUnique.Id_nb), eChatType.CT_System, eChatLoc.CL_SystemWindow);
							}
							else
							{
								DisplayMessage(client, "This is not an ItemUnique.  To create a new ItemUnique use addunique");
								return;
							}
						}
						break;
					#endregion SaveUnique
					#region Save / AddUnique
					case "save":
					case "addunique":
						{
							int slot = (int)eInventorySlot.LastBackpack;
							string idnb = string.Empty;
							if (args.Length >= 4)
							{
								try
								{
									slot = Convert.ToInt32(args[3]);
								}
								catch
								{
									slot = (int)eInventorySlot.LastBackpack;
								}
								if (slot > (int)eInventorySlot.LastBackpack)
								{
									slot = (int)eInventorySlot.LastBackpack;
								}
								if (slot < 0)
								{
									slot = 0;
								}

								idnb = args[2];
							}
							else if (args.Length >= 3)
							{
								idnb = args[2];
							}
							else if (args.Length < 2)
							{
								DisplaySyntax(client);
								return;
							}

							InventoryItem item = client.Player.Inventory.GetItem((eInventorySlot)slot);
							if (item == null)
							{
								client.Out.SendMessage(LanguageMgr.GetTranslation(client, "GMCommands.Item.Count.NoItemInSlot", slot), eChatType.CT_System, eChatLoc.CL_SystemWindow);
								return;
							}

							// if a blank item was created then AllowAdd will be false here
							if (idnb == string.Empty && (item.AllowAdd == false || item.Id_nb == InventoryItem.BLANK_ITEM || args[1].ToLower() == "addunique"))
							{
								DisplayMessage(client, "You need to provide a new id_nb for this item.");
								return;
							}
							else if (idnb == string.Empty)
							{
								if (args[1].ToLower() == "save" && item.Template is ItemUnique)
								{
									DisplayMessage(client, "You need to provide a new id_nb to save this ItemUnique as an ItemTemplate.  Use saveunique to save this ItemUnique.");
									return;
								}

								idnb = item.Id_nb;
							}

							ItemTemplate temp = null;
							if (args[1].ToLower() == "save")
							{
								// if the item is allready in the database
								temp = GameServer.Database.FindObjectByKey<ItemTemplate>(idnb);
							}

							// save the new item
							if (temp == null)
							{
								if (args[1].ToLower() == "save")
								{
									try
									{
										client.Player.Inventory.RemoveItem(item);
										ItemTemplate itemTemplate = new ItemTemplate(item.Template);
										itemTemplate.Id_nb = idnb;
										GameServer.Database.AddObject(itemTemplate);
										Log.Debug("Added New Item Template: " + itemTemplate.Id_nb);
										DisplayMessage(client, "Added New Item Template: " + itemTemplate.Id_nb);
										GameInventoryItem newItem = GameInventoryItem.Create<ItemTemplate>(itemTemplate);
										if (client.Player.Inventory.AddItem((eInventorySlot)slot, newItem))
											InventoryLogging.LogInventoryAction(client.Player, client.Player, eInventoryActionType.Other, newItem.Template, newItem.Count);
									}
									catch (Exception ex)
									{
										DisplayMessage(client, "Error adding template: " + ex.Message);
										return;
									}
								}
								else //addunique
								{
									try
									{
										client.Player.Inventory.RemoveItem(item);
										ItemUnique unique = new ItemUnique(item.Template);
										unique.Id_nb = idnb;
										GameServer.Database.AddObject(unique);
										Log.Debug("Added New ItemUnique: " + unique.Id_nb + " (" + unique.ObjectId + ")");
										DisplayMessage(client, "Added New ItemUnique: " + unique.Id_nb + " (" + unique.ObjectId + ")");
										GameInventoryItem newItem = GameInventoryItem.Create<ItemUnique>(unique);
										if (client.Player.Inventory.AddItem((eInventorySlot)slot, newItem))
											InventoryLogging.LogInventoryAction(client.Player, client.Player, eInventoryActionType.Other, newItem.Template, newItem.Count);
									}
									catch (Exception ex)
									{
										DisplayMessage(client, "Error adding unique: " + ex.Message);
										return;
									}
								}
							}
							else // update the item
							{
								item.Template.Dirty = true;
								GameServer.Database.SaveObject(item.Template);
								GameServer.Database.UpdateInCache<ItemTemplate>(item.Template.Id_nb);
								DisplayMessage(client, "Updated Inventory Item: " + item.Id_nb);

								if (item.Template is ItemTemplate && (item.Template as ItemTemplate).AllowUpdate)
								{
									Log.Debug("Updated ItemTemplate: " + item.Template.Id_nb);
									DisplayMessage(client, "++ Source ItemTemplate Updated!");
								}
							}

						}
						break;
					#endregion Save / AddUnique
					#region FindID
					case "findid":
						{
							string name = string.Join(" ", args, 2, args.Length - 2);
							if (name != "")
							{
								var items = GameServer.Database.SelectObjects<ItemTemplate>("id_nb like '%" + GameServer.Database.Escape(name) + "%'");
								DisplayMessage(client, LanguageMgr.GetTranslation(client, "GMCommands.Item.FindID.MatchingIDsForX", name, items.Count), new object[] { });
								foreach (ItemTemplate item in items)
								{
									DisplayMessage(client, item.Id_nb + " (" + item.Name + ")", new object[] { });
								}
							}
							break;
						}
					#endregion FindID
					#region FindName
					case "findname":
						{
							string name = string.Join(" ", args, 2, args.Length - 2);
							if (name != "")
							{
								var items = GameServer.Database.SelectObjects<ItemTemplate>("name like '%" + GameServer.Database.Escape(name) + "%'");
								DisplayMessage(client, LanguageMgr.GetTranslation(client, "GMCommands.Item.FindName.MatchingNamesForX", name, items.Count), new object[] { });
								foreach (ItemTemplate item in items)
								{
									DisplayMessage(client, item.Name + "  (" + item.Id_nb + ")", new object[] { });
								}
							}
							break;
						}
					#endregion FindName
					#region Load
					case "load":
						{
							if (GameServer.Database.UpdateInCache<ItemTemplate>(args[2]))
							{
								Log.DebugFormat("Item {0} updated or added to ItemTemplate cache.", args[2]);
								DisplayMessage(client, "Item {0} updated or added to ItemTemplate cache.", args[2]);
							}
							else
							{
								Log.DebugFormat("Item {0} not found.", args[2]);
								DisplayMessage(client, "Item {0} not found.", args[2]);
							}
							break;
						}
					#endregion Load
					#region LoadPackage
					case "loadpackage":
						{
							if (args[2] != "")
							{
								if (args[2] == "**all**") args[2] = String.Empty;

								var packageItems = GameServer.Database.SelectObjects<ItemTemplate>("PackageID = '" + args[2] + "'") as ItemTemplate[];

								if (packageItems != null)
								{
									int count = 0;

									foreach (ItemTemplate item in packageItems)
									{
										if (GameServer.Database.UpdateInCache<ItemTemplate>(item.Id_nb))
										{
											count++;
										}
									}

									Log.DebugFormat("{0} items updated or added to the ItemTemplate cache.", count);
									DisplayMessage(client, "{0} items updated or added to the ItemTemplate cache.", count);
								}
								else
								{
									DisplayMessage(client, "No items found for package {0}.", args[2]);
								}
							}
							break;
						}
					#endregion LoadPackage
					#region LoadArtifacts
					case "loadartifacts":
						{
							DisplayMessage(client, "{0} Artifacts re-loaded.", DOL.GS.ArtifactMgr.LoadArtifacts());
						}
						break;
					#endregion LoadArtifacts
					#region LoadSpells
					case "loadspells":
						{
							int slot = (int)eInventorySlot.LastBackpack;
							if (args.Length >= 4)
							{
								try
								{
									slot = Convert.ToInt32(args[3]);
								}
								catch
								{
									slot = (int)eInventorySlot.LastBackpack;
								}
							}
							InventoryItem item = client.Player.Inventory.GetItem((eInventorySlot)slot);
							if (item == null)
							{
								client.Out.SendMessage(LanguageMgr.GetTranslation(client, "GMCommands.Item.Count.NoItemInSlot", slot), eChatType.CT_System, eChatLoc.CL_SystemWindow);
								return;
							}

							LoadSpell(client, item.SpellID);
							LoadSpell(client, item.SpellID1);
							LoadSpell(client, item.ProcSpellID);
							LoadSpell(client, item.ProcSpellID1);
							break;
						}
					#endregion LoadSpells
				}
			}
			catch
			{
				DisplaySyntax(client);
			}
		}
		/// <summary>
		/// Creates a copy of the GameNpcInventoryTemplate.
		/// </summary>
		/// <returns>Open copy of this template</returns>
		public GameNpcInventoryTemplate CloneTemplate()
		{
			lock (m_items)
			{
				var clone = new GameNpcInventoryTemplate();
				clone.m_changedSlots = new List<eInventorySlot>(m_changedSlots);
				clone.m_changesCounter = m_changesCounter;

				foreach (var de in m_items)
				{
					InventoryItem oldItem = de.Value;

					InventoryItem item = new GameInventoryItem();
					item.Template = new ItemTemplate();
					item.Template.Id_nb = oldItem.Id_nb;
					item.Model = oldItem.Model;
					item.Color = oldItem.Color;
					item.Effect = oldItem.Effect;
					item.Extension = oldItem.Extension;
					item.SlotPosition = oldItem.SlotPosition;
					clone.m_items.Add(de.Key, item);
				}

				clone.m_isClosed = false;

				return clone;
			}
		}
		/// <summary>
		/// Adds item to template reusing iventory  item instances from other templates.
		/// </summary>
		/// <param name="slot">The equipment slot</param>
		/// <param name="model">The equipment model</param>
		/// <param name="color">The equipment color</param>
		/// <param name="effect">The equipment effect</param>
		/// <param name="extension">The equipment extension</param>
		/// <returns>true if added</returns>
		public bool AddNPCEquipment(eInventorySlot slot, int model, int color, int effect, int extension)
		{
			lock (m_items)
			{
				lock (m_usedInventoryItems.SyncRoot)
				{
					if (m_isClosed)
						return false;
					slot = GetValidInventorySlot(slot);
					if (slot == eInventorySlot.Invalid)
						return false;
					//Changed to support randomization of slots - if we try to load a weapon in the same spot with a different model,
					//let's make it random 50% chance to either overwrite the item or leave it be
					if (m_items.ContainsKey(slot))
					{
						//50% chance to keep the item we have
						if (Util.Chance(50))
							return false;
						//Let's remove the old item!
						m_items.Remove(slot);
					}
					string itemID = string.Format("{0}:{1},{2},{3}", slot, model, color, effect, extension);
					InventoryItem item = null;

					if (!m_usedInventoryItems.ContainsKey(itemID))
					{
						item = new GameInventoryItem();
						item.Template = new ItemTemplate();
						item.Template.Id_nb = itemID;
						item.Model = model;
						item.Color = color;
						item.Effect = effect;
						item.Extension = (byte)extension;
						item.SlotPosition = (int)slot;
					}
					else
						return false;

					m_items.Add(slot, item);
				}
			}
			return true;
		}