Exemple #1
0
        public static bool Handle(Entities.GameClient client, UseSpellPacket usespell)
        {
            if (!client.Equipments.Contains(Enums.ItemLocation.Steed))
            {
                return(false);
            }

            if (client.ContainsFlag1(Enums.Effect1.Riding))
            {
                client.RemoveFlag1(Enums.Effect1.Riding);
            }
            else if (client.Stamina < 100)
            {
                return(false);
            }
            else
            {
                client.AddStatusEffect1(Enums.Effect1.Riding);
            }

            using (var vigor = new Packets.SteedVigorPacket())
            {
                vigor.Type   = 2;
                vigor.Amount = 9001;
                client.Send(vigor);
            }

            usespell.AddTarget(client.EntityUID, 0);
            return(true);
        }
Exemple #2
0
        /// <summary>
        /// Gets the physical damage (PVP).
        /// </summary>
        /// <param name="attacker">The attacker.</param>
        /// <param name="attacked">The attacked.</param>
        /// <returns>Returns the damage.</returns>
        private static double GetPhysicalDamage_PVP(Entities.GameClient attacker, Entities.GameClient attacked)
        {
            double damage = ProjectX_V3_Lib.ThreadSafe.RandomGenerator.Generator.Next(attacker.MinAttack, attacker.MaxAttack);

            damage *= 1 + attacker.DragonGemPercentage;
            damage -= attacked.Defense;

            if (attacked.ContainsFlag1(Enums.Effect1.Shield))
            {
                damage *= 0.5;
            }
            if (attacker.ContainsFlag1(Enums.Effect1.Stig))
            {
                damage *= 1.75;
            }

            double damage_perc = damage;

            damage_perc = (damage / 100) * attacked.TortoiseGemPercentage;
            damage     -= damage_perc;
            damage_perc = (damage / 100) * attacked.Bless;
            damage     -= damage_perc;

            return(damage);
        }
Exemple #3
0
        /// <summary>
        /// Gets the physical magic damage. (MVP)
        /// </summary>
        /// <param name="attacker">The attacker.</param>
        /// <param name="attacked">The attacked.</param>
        /// <param name="spell">The spell.</param>
        /// <returns>Returns the damage.</returns>
        private static double GetPhysicalMagicDamage_MVP(Entities.Monster attacker, Entities.GameClient attacked, Data.Spell spell)
        {
            double damage = (double)ProjectX_V3_Lib.ThreadSafe.RandomGenerator.Generator.Next((int)attacker.MaxAttack, (int)attacker.MaxAttack * 2);

            damage -= attacked.Defense;
            damage *= 0.65;
            // penetration extra damage
            if (spell.SpellID == 1290 && damage > 0)
            {
                double hunperc = (double)((damage / 100) * 26.6);
                damage += (hunperc * spell.Level);
            }

            if (attacked.ContainsFlag1(Enums.Effect1.Shield))
            {
                damage *= 0.5;
            }
            //	damage += spell.Power;
            //damage *= 1 + attacker.PhoenixGemPercentage;
            //	damage -= attacked.Defense;
            //	double damage_perc = damage;
            //	damage_perc = (damage / 100) * attacked.TortoiseGemPercentage;
            //	damage -= damage_perc;
            //	damage_perc = (damage / 100) * attacked.Bless;
            //	damage -= damage_perc;

            return(damage);
        }
Exemple #4
0
        /// <summary>
        /// Gets the ranged damage. (PVP)
        /// </summary>
        /// <param name="attacker">The attacker.</param>
        /// <param name="attacked">The attacked.</param>
        /// <returns>Returns the damage.</returns>
        private static double GetRangedDamage_PVM(Entities.GameClient attacker, Entities.Monster attacked)
        {
            double damage = ProjectX_V3_Lib.ThreadSafe.RandomGenerator.Generator.Next(attacker.MinAttack, attacker.MaxAttack);

            damage *= 1 - (attacked.Dodge * 0.01);
            damage *= 0.45;

            if (attacker.ContainsFlag1(Enums.Effect1.Stig))
            {
                damage *= 1.75;
            }

            damage *= 1 + attacker.DragonGemPercentage;
            //double damage_perc = damage;
            //damage_perc = (damage / 100) * attacked.TortoiseGemPercentage;
            //damage -= damage_perc;
            //damage_perc = (damage / 100) * attacked.Bless;
            //damage -= damage_perc;

            return(damage);
        }
Exemple #5
0
        /// <summary>
        /// Handling the Jump action from GeneralDataPacket.
        /// </summary>
        /// <param name="client">The client.</param>
        /// <param name="General">The GeneralDataPacket.</param>
        public static void Handle(Entities.GameClient client, GeneralDataPacket General)
        {
            if (!client.Alive)
            {
                return;
            }
            if (client.ContainsFlag1(Enums.Effect1.IceBlock))
            {
                return;
            }

            if (client.Booth != null)
            {
                client.Booth.CancelBooth();
                client.Pullback();
            }

            client.Action       = Enums.ActionType.None;
            client.AttackPacket = null;

            ushort JumpX = General.Data1Low;
            ushort JumpY = General.Data1High;

            if (Core.Screen.GetDistance(client.X, client.Y, JumpX, JumpY) > 28)
            {
                client.Pullback();
                return;
            }

            if (!client.Map.ValidCoord(JumpX, JumpY))
            {
                client.Pullback();
                return;
            }

            /*DateTime time = new ProjectX_V3_Lib.Time.SystemTime(General.Timestamp);
             * if (client.LastMovement > time)
             * {
             *      client.Pullback(); // speedhack
             *      return;
             * }*/
            if (!(DateTime.Now >= client.LastMovement.AddMilliseconds(400)) && client.LastMoveJump)
            {
                client.Pullback();                 // speedhack
                return;
            }

            if (client.Battle != null)
            {
                if (!client.Battle.EnterArea(client))
                {
                    client.Pullback();
                    return;
                }
                else if (!client.Battle.LeaveArea(client))
                {
                    client.Pullback();
                    return;
                }
            }

            if (Calculations.BasicCalculations.ChanceSuccess(50))
            {
                client.Stamina += 7;
            }

            client.LastMoveJump = true;
            client.LastMovement = DateTime.Now;
            client.LastX        = client.X;
            client.LastY        = client.Y;
            client.X            = JumpX;
            client.Y            = JumpY;
            client.SendToScreen(General, true);
            Data.AdvancedSkill.SkillInArea(client, client.X, client.Y);
        }
Exemple #6
0
        /// <summary>
        /// Handles the movement packet.
        /// </summary>
        /// <param name="client">The client.</param>
        /// <param name="packet">The packet.</param>
        public static void Handle(Entities.GameClient client, DataPacket packet)
        {
            if (client.ContainsFlag1(Enums.Effect1.IceBlock))
            {
                return;
            }

            client.Action       = Enums.ActionType.None;
            client.AttackPacket = null;
            client.LastMoveJump = false;
            using (var move = new MovementPacket(packet))
            {
                if (move.EntityUID != client.EntityUID)
                {
                    return;
                }

                int NewX = 0, NewY = 0;
                int NewDir = 0;

                switch (move.WalkMode)
                {
                case Enums.WalkMode.Run:
                case Enums.WalkMode.Walk:
                {
                    NewDir = (int)move.Direction % 8;
                    NewX   = client.X + DeltaX[NewDir];
                    NewY   = client.Y + DeltaY[NewDir];
                    break;
                }

                case Enums.WalkMode.Mount:
                {
                    NewDir = (int)move.Direction % 24;
                    NewX   = client.X + DeltaMountX[NewDir];
                    NewY   = client.Y + DeltaMountY[NewDir];
                    break;
                }
                }

                if (client.Map.ValidCoord(NewX, NewY))
                {
                    client.LastX = client.X;
                    client.LastY = client.LastY;

                    client.LastMovement = DateTime.Now;
                    client.X            = (ushort)NewX;
                    client.Y            = (ushort)NewY;
                    client.Direction    = (byte)NewDir;
                    client.SendToScreen(move, true);

                    if (client.Battle != null)
                    {
                        if (!client.Battle.EnterArea(client))
                        {
                            client.X = client.LastX;
                            client.Y = client.LastY;
                            client.Pullback();
                            return;
                        }
                        else if (!client.Battle.LeaveArea(client))
                        {
                            client.X = client.LastX;
                            client.Y = client.LastY;
                            client.Pullback();
                            return;
                        }
                    }

                    Data.AdvancedSkill.SkillInArea(client, client.X, client.Y);
                }
            }
        }
Exemple #7
0
        /// <summary>
        /// Handling the combat of the interact packet.
        /// </summary>
        /// <param name="client">The client.</param>
        /// <param name="interact">The interact packet.</param>
        public static void Handle(Entities.GameClient client, InteractionPacket interact)
        {
            if (interact == null)
            {
                return;
            }

            if (!client.Alive)
            {
                return;
            }

            if (client.Paralyzed)
            {
                return;
            }

            if (!client.CanAttack)
            {
                return;
            }

            if (!(DateTime.Now >= client.LoginProtection.AddSeconds(10)))
            {
                using (var fmsg = Packets.Message.MessageCore.CreateSystem2(client.Name, Core.MessageConst.REST))
                    client.Send(fmsg);
                return;
            }
            if (!(DateTime.Now >= client.ReviveProtection.AddSeconds(5)))
            {
                using (var fmsg = Packets.Message.MessageCore.CreateSystem2(client.Name, Core.MessageConst.REST))
                    client.Send(fmsg);
                return;
            }

            if (!(DateTime.Now >= client.LastAttack.AddMilliseconds(Core.TimeIntervals.AttackInterval)) && client.AttackPacket == null)
            {
                using (var fmsg = Packets.Message.MessageCore.CreateSystem2(client.Name, Core.MessageConst.REST))
                    client.Send(fmsg);
                return;
            }

            if (client.Battle != null)
            {
                if (!client.Battle.HandleBeginAttack(client))
                {
                    using (var fmsg = Packets.Message.MessageCore.CreateSystem2(client.Name, Core.MessageConst.REST))
                        client.Send(fmsg);
                    return;
                }
            }
            client.LastAttack = DateTime.Now;
            //client.AutoAttacking = false;
            switch (interact.Action)
            {
            case Enums.InteractAction.MagicAttack:
            {
                #region TemporaryDecryption
                if (!interact.UnPacked)
                {
                    interact.UnPacked = true;

                    byte[] packet  = interact.Copy();
                    ushort SkillId = Convert.ToUInt16(((long)packet[24] & 0xFF) | (((long)packet[25] & 0xFF) << 8));
                    SkillId ^= (ushort)0x915d;
                    SkillId ^= (ushort)client.EntityUID;
                    SkillId  = (ushort)(SkillId << 0x3 | SkillId >> 0xd);
                    SkillId -= 0xeb42;

                    uint Target = ((uint)packet[12] & 0xFF) | (((uint)packet[13] & 0xFF) << 8) | (((uint)packet[14] & 0xFF) << 16) | (((uint)packet[15] & 0xFF) << 24);
                    Target = ((((Target & 0xffffe000) >> 13) | ((Target & 0x1fff) << 19)) ^ 0x5F2D2463 ^ client.EntityUID) - 0x746F4AE6;

                    ushort TargetX = 0;
                    ushort TargetY = 0;
                    long   xx      = (packet[16] & 0xFF) | ((packet[17] & 0xFF) << 8);
                    long   yy      = (packet[18] & 0xFF) | ((packet[19] & 0xFF) << 8);
                    xx      = xx ^ (client.EntityUID & 0xffff) ^ 0x2ed6;
                    xx      = ((xx << 1) | ((xx & 0x8000) >> 15)) & 0xffff;
                    xx     |= 0xffff0000;
                    xx     -= 0xffff22ee;
                    yy      = yy ^ (client.EntityUID & 0xffff) ^ 0xb99b;
                    yy      = ((yy << 5) | ((yy & 0xF800) >> 11)) & 0xffff;
                    yy     |= 0xffff0000;
                    yy     -= 0xffff8922;
                    TargetX = Convert.ToUInt16(xx);
                    TargetY = Convert.ToUInt16(yy);

                    interact.TargetUID = Target;
                    interact.MagicType = SkillId;
                    interact.X         = TargetX;
                    interact.Y         = TargetY;
                }
                #endregion

                if (client.ContainsFlag1(Enums.Effect1.Riding) && interact.MagicType != 7001)
                {
                    if (client.Stamina >= 100)
                    {
                        client.Stamina = 0;
                        client.RemoveFlag1(Enums.Effect1.Riding);
                    }
                    return;
                }

                Magic.Handle(client, interact);
                break;
            }

            case Enums.InteractAction.Attack:
                if (client.ContainsFlag1(Enums.Effect1.Riding))
                {
                    if (client.Stamina >= 100)
                    {
                        client.Stamina = 0;
                        client.RemoveFlag1(Enums.Effect1.Riding);
                    }
                    return;
                }
                Physical.Handle(client, interact);
                break;

            case Enums.InteractAction.Shoot:
                if (client.ContainsFlag1(Enums.Effect1.Riding))
                {
                    if (client.Stamina >= 100)
                    {
                        client.Stamina = 0;
                        client.RemoveFlag1(Enums.Effect1.Riding);
                    }
                    return;
                }
                Ranged.Handle(client, interact);
                break;
            }
        }
Exemple #8
0
        /// <summary>
        /// Processing damage.
        /// </summary>
        /// <param name="attacker">The attacker.</param>
        /// <param name="attacked">The attacked.</param>
        /// <param name="damage">The damage.</param>
        public static void ProcessDamage(Entities.IEntity attacker, Entities.IEntity attacked, ref uint damage, bool kill_damage = true)
        {
            // Removed dura, bugged atm. the dura works, although client doesn't update proper etc. CBA to fix it as I never intended to use it
            // Although you can go ahead and fix it yourself if you want, I may do it if I ever feel like it
            // The dura lose is commented out below.
            #region ATTACKER : GAMECLIENT
            if (attacker is Entities.GameClient)
            {
                Entities.GameClient attackerclient = attacker as Entities.GameClient;
                attackerclient.LoseAttackDura(damage);

                #region ATTACKED : GAMECLIENT
                if (attacked is Entities.GameClient)
                {
                    Entities.GameClient attackedclient = attacked as Entities.GameClient;
                    // tournament check, damage = 1 + return
                    if (attackerclient.Battle != null)
                    {
                        if (!attackerclient.Battle.HandleAttack(attackerclient, attackedclient, ref damage))
                        {
                            damage = 0;
                            return;
                        }
                    }
                    else
                    {
                        if (attacked.Map.GotKillCons() && !attackedclient.ContainsFlag1(Enums.Effect1.BlueName) && !attackedclient.ContainsFlag1(Enums.Effect1.RedName) && !attackedclient.ContainsFlag1(Enums.Effect1.BlackName))
                        {
                            attackerclient.AddStatusEffect1(Enums.Effect1.BlueName, 20000);
                        }

                        attackedclient.LoseDefenseDura(damage);
                    }
                }
                #endregion
                #region ATTACKED : MONSTER
                if (attacked is Entities.Monster)
                {
                    Entities.Monster attackedmob = attacked as Entities.Monster;

                    if (((byte)attackedmob.Behaviour) >= 3)
                    {
                        attackerclient.AddStatusEffect1(Enums.Effect1.BlueName, 20000);
                    }
                    if (damage > 0)
                    {
                        ulong exp = (ulong)ProjectX_V3_Lib.ThreadSafe.RandomGenerator.Generator.Next((int)(damage / 2), (int)damage);
                        if (attacked.Level > (attacker.Level + 10))
                        {
                            exp *= 2;
                        }
                        else if (attacker.Level > (attacked.Level + 10))
                        {
                            exp = (ulong)ProjectX_V3_Lib.ThreadSafe.RandomGenerator.Generator.Next(1, (int)attackedmob.Level);
                        }
                        attackerclient.AddExp(exp);
                    }
                }
                #endregion
                //if (Calculations.Battle.LoseDuraAttak())
                //attackerclient.LoseAttackDura(damage);
            }
            #endregion
            #region ATTACKER : MONSTER

            #region ATTACKED : GAMECLIENT
            if (attacked is Entities.GameClient)
            {
                Entities.GameClient attackedclient = attacked as Entities.GameClient;

                attackedclient.LoseDefenseDura(damage);
            }
            #endregion

            #endregion

            if (kill_damage)
            {
                HitDamage(attacker, attacked, damage);
            }
        }
        /// <summary>
        /// Equips a new item.
        /// </summary>
        /// <param name="item">The item to equip.</param>
        /// <param name="pos">The position to equip the item at.</param>
        /// <param name="unequip">Boolean defining whether to unequip an existing item at the position.</param>
        /// <returns>Returns true if the item was equipped.</returns>
        public bool Equip(ItemInfo item, Enums.ItemLocation pos, bool unequip = true, bool force_equip = false)
        {
            if (!force_equip)
            {
                #region Sex check
                if (item.Sex == Enums.Sex.Female && Owner.Sex != Enums.Sex.Female)
                {
                    using (var fmsg = Packets.Message.MessageCore.CreateSystem2(Owner.Name, Core.MessageConst.ITEM_FEMALE))
                        Owner.Send(fmsg);

                    return(false);
                }
                #endregion

                #region Job Check
//			if (item.Profession != Enums.Class.Unknown && Core.Kernel.GetBaseClass(item.Profession) != Enums.Class.Unknown)
//			{
//				Enums.Class promoteclass = Core.Kernel.GetBaseClass(Owner.Class);
//				if (promoteclass != Core.Kernel.GetBaseClass(item.Profession))
//				{
//					using (var fmsg = Packets.Message.MessageCore.CreateSystem2(Owner.Name, string.Format(Core.MessageConst.ITEM_JOB_INVALID, Core.Kernel.GetBaseClass(item.Profession).ToString())))
//						Owner.Send(fmsg);
//
//					return false;
//				}
//				else if (!Core.Kernel.AboveFirstPromotion(Owner.Class))
//				{
//					using (var fmsg = Packets.Message.MessageCore.CreateSystem2(Owner.Name, string.Format(Core.MessageConst.ITEM_JOB_INVALID, Core.Kernel.GetBaseClass(item.Profession).ToString())))
//						Owner.Send(fmsg);
//
//					return false;
//				}
//			}
                #endregion

                #region Level Check
                if (Owner.Level < item.RequiredLevel)
                {
                    using (var fmsg = Packets.Message.MessageCore.CreateSystem2(Owner.Name, Core.MessageConst.LEVEL_LOW))
                        Owner.Send(fmsg);

                    return(false);
                }
                #endregion

                #region Stats Check
                if (Owner.Strength < item.RequiredStrength ||
                    Owner.Agility < item.RequiredAgility ||
                    Owner.Vitality < item.RequiredVitality ||
                    Owner.Spirit < item.RequiredSpirit)
                {
                    using (var fmsg = Packets.Message.MessageCore.CreateSystem2(Owner.Name, Core.MessageConst.STATS_LOW))
                        Owner.Send(fmsg);

                    return(false);
                }
                #endregion

                #region Prof Check
//			if (Owner.Level < item.RequiredProf)
//			{
//				using (var fmsg = Packets.Message.MessageCore.CreateSystem2(Owner.Name, Core.MessageConst.LEVEL_LOW))
//					Owner.Send(fmsg);
//
//				return false;
//			}
                #endregion
            }

            if (!force_equip)
            {
                switch (pos)
                {
                    #region Head
                case Enums.ItemLocation.Head:
                {
                    if (item.ItemType != Enums.ItemType.Head)
                    {
                        using (var fmsg = Packets.Message.MessageCore.CreateSystem2(Owner.Name, Core.MessageConst.INVALID_ITEM_TYPE))
                            Owner.Send(fmsg);
                        return(false);
                    }
                    break;
                }

                    #endregion
                    #region Necklace
                case Enums.ItemLocation.Necklace:
                {
                    if (item.ItemType != Enums.ItemType.Necklace)
                    {
                        using (var fmsg = Packets.Message.MessageCore.CreateSystem2(Owner.Name, Core.MessageConst.INVALID_ITEM_TYPE))
                            Owner.Send(fmsg);
                        return(false);
                    }
                    break;
                }

                    #endregion
                    #region Ring
                case Enums.ItemLocation.Ring:
                {
                    if (item.ItemType != Enums.ItemType.Ring)
                    {
                        using (var fmsg = Packets.Message.MessageCore.CreateSystem2(Owner.Name, Core.MessageConst.INVALID_ITEM_TYPE))
                            Owner.Send(fmsg);
                        return(false);
                    }
                    break;
                }

                    #endregion
                    #region Armor
                case Enums.ItemLocation.Armor:
                {
                    if (item.ItemType != Enums.ItemType.Armor)
                    {
                        using (var fmsg = Packets.Message.MessageCore.CreateSystem2(Owner.Name, Core.MessageConst.INVALID_ITEM_TYPE))
                            Owner.Send(fmsg);
                        return(false);
                    }
                    break;
                }

                    #endregion
                    #region Boots
                case Enums.ItemLocation.Boots:
                {
                    if (item.ItemType != Enums.ItemType.Boots)
                    {
                        using (var fmsg = Packets.Message.MessageCore.CreateSystem2(Owner.Name, Core.MessageConst.INVALID_ITEM_TYPE))
                            Owner.Send(fmsg);
                        return(false);
                    }
                    break;
                }

                    #endregion
                    #region Bottle
                case Enums.ItemLocation.Bottle:
                {
                    if (item.ItemType != Enums.ItemType.Bottle)
                    {
                        using (var fmsg = Packets.Message.MessageCore.CreateSystem2(Owner.Name, Core.MessageConst.INVALID_ITEM_TYPE))
                            Owner.Send(fmsg);
                        return(false);
                    }
                    break;
                }

                    #endregion
                    #region Garment
                case Enums.ItemLocation.Garment:
                {
                    if (MaskedGarment != null)
                    {
                        return(false);
                    }

                    if (item.ItemType != Enums.ItemType.Garment)
                    {
                        using (var fmsg = Packets.Message.MessageCore.CreateSystem2(Owner.Name, Core.MessageConst.INVALID_ITEM_TYPE))
                            Owner.Send(fmsg);
                        return(false);
                    }
                    break;
                }

                    #endregion
                    #region Steed
                case Enums.ItemLocation.Steed:
                {
                    if (Owner.ContainsFlag1(Enums.Effect1.Riding))
                    {
                        return(false);
                    }

                    if (item.ItemType != Enums.ItemType.Steed)
                    {
                        using (var fmsg = Packets.Message.MessageCore.CreateSystem2(Owner.Name, Core.MessageConst.INVALID_ITEM_TYPE))
                            Owner.Send(fmsg);
                        return(false);
                    }
                    break;
                }

                    #endregion
                    #region SteedArmor
                case Enums.ItemLocation.SteedArmor:
                {
                    if (Owner.ContainsFlag1(Enums.Effect1.Riding))
                    {
                        return(false);
                    }

                    if (item.ItemType != Enums.ItemType.SteedArmor)
                    {
                        using (var fmsg = Packets.Message.MessageCore.CreateSystem2(Owner.Name, Core.MessageConst.INVALID_ITEM_TYPE))
                            Owner.Send(fmsg);
                        return(false);
                    }
                    break;
                }

                    #endregion
                    #region Fan
                case Enums.ItemLocation.Fan:
                {
                    return(false);

                    /*if (item.ItemType != Enums.ItemType.Fan)
                     * {
                     * using (var fmsg = Packets.Message.MessageCore.CreateSystem2(Owner.Name, Core.MessageConst.INVALID_ITEM_TYPE))
                     *      Owner.Send(fmsg);
                     * return false;
                     * }
                     * break;*/
                }

                    #endregion
                    #region Tower
                case Enums.ItemLocation.Tower:
                {
                    return(false);

                    /*if (item.ItemType != Enums.ItemType.Tower)
                     * {
                     * using (var fmsg = Packets.Message.MessageCore.CreateSystem2(Owner.Name, Core.MessageConst.INVALID_ITEM_TYPE))
                     *      Owner.Send(fmsg);
                     * return false;
                     * }
                     * break;*/
                }

                    #endregion
                    #region Right
                case Enums.ItemLocation.WeaponR:
                {
                    if (MaskedRightHand != null)
                    {
                        return(false);
                    }

                    if (item.ItemType != Enums.ItemType.OneHand && item.ItemType != Enums.ItemType.TwoHand &&
                        item.ItemType != Enums.ItemType.Bow)
                    {
                        using (var fmsg = Packets.Message.MessageCore.CreateSystem2(Owner.Name, Core.MessageConst.INVALID_ITEM_TYPE))
                            Owner.Send(fmsg);
                        return(false);
                    }

                    if (Contains(Enums.ItemLocation.WeaponL) && item.ItemType == Enums.ItemType.TwoHand)
                    {
                        using (var fmsg = Packets.Message.MessageCore.CreateSystem2(Owner.Name, Core.MessageConst.TWO_HAND_EQUIP_FAIL))
                            Owner.Send(fmsg);
                        return(false);
                    }
                    break;
                }

                    #endregion
                    #region Left
                case Enums.ItemLocation.WeaponL:
                {
                    if (MaskedLeftHand != null)
                    {
                        return(false);
                    }

                    if (item.ItemType != Enums.ItemType.OneHand && item.ItemType != Enums.ItemType.Shield && item.ItemType != Enums.ItemType.Arrow)
                    {
                        using (var fmsg = Packets.Message.MessageCore.CreateSystem2(Owner.Name, Core.MessageConst.INVALID_ITEM_TYPE))
                            Owner.Send(fmsg);
                        return(false);
                    }

                    if (item.ItemType == Enums.ItemType.Shield || item.ItemType == Enums.ItemType.Arrow)
                    {
                        if (!Contains(Enums.ItemLocation.WeaponR))
                        {
                            using (var fmsg = Packets.Message.MessageCore.CreateSystem2(Owner.Name, Core.MessageConst.INVALID_ITEM_TYPE))
                                Owner.Send(fmsg);
                            return(false);
                        }
                    }

                    if (!Contains(Enums.ItemLocation.WeaponR) && item.ItemType != Enums.ItemType.Shield && item.ItemType != Enums.ItemType.Arrow)
                    {
                        pos = Enums.ItemLocation.WeaponR;
                    }
                    break;
                }
                    #endregion

                    #region default
                default:
                {
                    using (var fmsg = Packets.Message.MessageCore.CreateSystem2(Owner.Name, Core.MessageConst.INVALID_ITEM_POS))
                        Owner.Send(fmsg);
                    return(false);
                }
                    #endregion
                }
            }
            if (Contains(pos))
            {
                if (unequip)
                {
                    if (!Unequip(pos))
                    {
                        return(false);
                    }
                }
                else if (!force_equip)
                {
                    ItemInfo ritem;
                    if (!EquipmentItems.TryRemove(pos, out ritem))
                    {
                        return(false);
                    }
                }
            }

            item.Location = pos;
            if (Owner.Inventory.ContainsByUID(item.UID) && !force_equip)
            {
                if (Owner.Inventory.RemoveItemByUID(item.UID) != null)
                {
                    item.SendPacket(Owner, 1);
                    if (EquipmentItems.TryAdd(pos, item))
                    {
                        if (Owner.LoggedIn)
                        {
                            Database.CharacterDatabase.SaveEquipment(Owner, item, pos);

                            Owner.BaseEntity.CalculateBaseStats();

                            using (var equippack = new Packets.ItemPacket())
                            {
                                equippack.UID      = item.UID;
                                equippack.Action   = Enums.ItemAction.Equip;
                                equippack.Data1Low = (ushort)pos;
                                Owner.Send(equippack);
                            }
                            SendGears();
                        }
                        return(true);
                    }
                }
            }
            else if (!force_equip)
            {
                item.SendPacket(Owner, 1);
                if (EquipmentItems.TryAdd(pos, item))
                {
                    if (Owner.LoggedIn)
                    {
                        Database.CharacterDatabase.SaveEquipment(Owner, item, pos);

                        Owner.BaseEntity.CalculateBaseStats();

                        using (var equippack = new Packets.ItemPacket())
                        {
                            equippack.UID      = item.UID;
                            equippack.Action   = Enums.ItemAction.Equip;
                            equippack.Data1Low = (ushort)pos;
                            Owner.Send(equippack);
                        }
                        SendGears();
                    }
                    return(true);
                }
            }
            else
            {
                item.SendPacket(Owner, 1);
                if (Owner.LoggedIn)
                {
                    Database.CharacterDatabase.SaveEquipment(Owner, item, pos);

                    Owner.BaseEntity.CalculateBaseStats();

                    using (var equippack = new Packets.ItemPacket())
                    {
                        equippack.UID      = item.UID;
                        equippack.Action   = Enums.ItemAction.Equip;
                        equippack.Data1Low = (ushort)pos;
                        Owner.Send(equippack);
                    }
                    SendGears();
                }
            }
            return(false);
        }