/// <summary>
        /// psl packet
        /// </summary>
        /// <param name="pslPacket"></param>
        public void Psl(PslPacket pslPacket)
        {
            Mate mate = Session.Character.Mates.FirstOrDefault(x => x.IsTeamMember && x.MateType == MateType.Partner);

            if (mate == null)
            {
                return;
            }
            if (pslPacket.Type == 0)
            {
                if (mate.IsUsingSp)
                {
                    mate.IsUsingSp = false;
                    mate.SpSkills  = null;
                    Session.Character.MapInstance.Broadcast(mate.GenerateCMode(-1));
                    Session.SendPacket(mate.GenerateCond());
                    Session.SendPacket(mate.GeneratePski());
                    Session.SendPacket(mate.GenerateScPacket());
                    Session.Character.MapInstance.Broadcast(mate.GenerateOut());
                    Session.Character.MapInstance.Broadcast(mate.GenerateIn());
                    Session.SendPacket(Session.Character.GeneratePinit());
                    //psd 30
                }
                else
                {
                    Session.SendPacket("delay 5000 3 #psl^1 ");
                    Session.CurrentMapInstance?.Broadcast(UserInterfaceHelper.Instance.GenerateGuri(2, 2, mate.MateTransportId), mate.PositionX, mate.PositionY);
                }
            }
            else
            {
                if (mate.SpInstance == null)
                {
                    return;
                }
                mate.IsUsingSp = true;
                //TODO: update pet skills
                mate.SpSkills = new NpcMonsterSkill[3];
                Session.SendPacket(mate.GenerateCond());
                Session.Character.MapInstance.Broadcast(mate.GenerateCMode(mate.SpInstance.Item.Morph));
                Session.SendPacket(mate.GeneratePski());
                Session.SendPacket(mate.GenerateScPacket());
                Session.Character.MapInstance.Broadcast(mate.GenerateOut());
                Session.Character.MapInstance.Broadcast(mate.GenerateIn());
                Session.SendPacket(Session.Character.GeneratePinit());
                Session.Character.MapInstance.Broadcast(mate.GenerateEff(196));
            }
        }
        private void ExecuteHandler(ClientSession session)
        {
            Mate mate = session.Character.Mates.Find(x => x.IsTeamMember && x.MateType == MateType.Partner);

            if (mate == null)
            {
                return;
            }

            if (Type == 0)
            {
                if (mate.SpInstance == null)
                {
                    session.SendPacket(UserInterfaceHelper.GenerateMsg(Language.Instance.GetMessageFromKey("NEED_WEAR_PARTNER_SP"), 0));
                    return;
                }

                var currentRunningSeconds  = (DateTime.UtcNow - Process.GetCurrentProcess().StartTime.AddHours(-2).AddSeconds(-50)).TotalSeconds;
                var timeSpanSinceLastUsage = currentRunningSeconds - mate.LastSp;

                if (timeSpanSinceLastUsage < mate.SpCooldown)
                {
                    session.SendPacket(UserInterfaceHelper.GenerateMsg(string.Format(Language.Instance.GetMessageFromKey("PARTNER_SP_IN_COOLDOWN"), mate.SpCooldown - (int)Math.Round(timeSpanSinceLastUsage, 0)), 0));
                    return;
                }

                if (mate.IsUsingSp)
                {
                    mate.RemoveSp();
                }
                else
                {
                    session.SendPacket("pdelay 5000 3 #psl^1 ");
                    session.CurrentMapInstance?.Broadcast(UserInterfaceHelper.GenerateGuri(2, 2, mate.MateTransportId), mate.PositionX, mate.PositionY);
                }
            }
            else
            {
                if (mate.SpInstance == null)
                {
                    session.SendPacket(UserInterfaceHelper.GenerateMsg(Language.Instance.GetMessageFromKey("NEED_WEAR_PARTNER_SP"), 0));
                    return;
                }

                mate.IsUsingSp = true;
                session.SendPacket(mate.GenerateCond());
                session.Character.MapInstance.Broadcast(mate.GenerateCMode(mate.SpInstance.Item.Morph));
                session.SendPacket(mate.GenerateScPacket());
                session.Character.MapInstance.Broadcast(mate.GenerateOut());
                session.Character.MapInstance.Broadcast(mate.GenerateIn());
                session.SendPacket(session.Character.GeneratePinit());
                session.Character.MapInstance.Broadcast(StaticPacketHelper.GenerateEff(UserType.Npc, mate.MateTransportId, 196));
                session.SendPacket(mate.GeneratePski());
                MateHelper.Instance.AddPartnerBuffs(session, mate);
            }
        }
Пример #3
0
        public static void RemoveSp(this Mate e, bool isBackToMiniland = false)
        {
            if (e.Owner?.Session == null || e.Owner.MapInstance == null)
            {
                return;
            }

            e.IsUsingSp = false;

            e.Owner.Session.SendPacket(e.GenerateScPacket());

            if (!e.IsTeamMember)
            {
                return;
            }

            e.Owner.MapInstance.Broadcast(e.GenerateCMode(-1));
            e.GenerateDpski();
            e.Owner.Session.SendPacket(e.GenerateCond());
            e.Owner.MapInstance.Broadcast(e.GenerateOut());

            if (!isBackToMiniland)
            {
                bool isAct4 = ServerManager.Instance.ChannelId == 51;

                Parallel.ForEach(e.Owner.MapInstance.Sessions.Where(s => s.Character != null), s =>
                {
                    if (!isAct4 || e.Owner.Faction == s.Character.Faction)
                    {
                        s.SendPacket(e.GenerateIn(false, isAct4));
                    }
                    else
                    {
                        s.SendPacket(e.GenerateIn(true, isAct4, s.Account.Authority));
                    }
                });
            }

            e.Owner.Session.SendPacket(e.Owner.GeneratePinit());
        }
Пример #4
0
        private void ExecuteHandler(ClientSession session)
        {
            Mate partnerInTeam = session.Character.Mates.FirstOrDefault(s => s.IsTeamMember && s.MateType == MateType.Partner);

            if (partnerInTeam == null || PetId != partnerInTeam.PartnerSlot)
            {
                session.SendPacket(UserInterfaceHelper.GenerateModal(Language.Instance.GetMessageFromKey("PARTNER_NOT_IN_TEAM"), 1));
                return;
            }

            if (partnerInTeam.SpInstance == null)
            {
                session.SendPacket(UserInterfaceHelper.GenerateModal(Language.Instance.GetMessageFromKey("PARTNER_DOESNT_WEAR_SP"), 1));
                return;
            }

            if (partnerInTeam.SpInstance.FirstPartnerSkill > 0 && SkillSlot == 0 ||
                partnerInTeam.SpInstance.SecondPartnerSkill > 0 && SkillSlot == 1 ||
                partnerInTeam.SpInstance.ThirdPartnerSkill > 0 && SkillSlot == 2)
            {
                session.SendPacket(UserInterfaceHelper.GenerateModal(Language.Instance.GetMessageFromKey("PARTNER_ALREADY_HAS_SKILL"), 1));
                return;
            }

            if (partnerInTeam.IsUsingSp)
            {
                session.SendPacket(UserInterfaceHelper.GenerateModal(Language.Instance.GetMessageFromKey("MUST_REMOVE_PARTNER_SP"), 1));
                return;
            }

            if (partnerInTeam.SpInstance.Agility < 100 && session.Account.Authority < AuthorityType.GameMaster)
            {
                session.SendPacket(UserInterfaceHelper.GenerateModal(Language.Instance.GetMessageFromKey("NOT_ENOUGH_AGILITY"), 1));
                return;
            }

            var skillList = ServerManager.Instance.PartnerSkills.FirstOrDefault(s => s.PartnerVnum == partnerInTeam.SpInstance.ItemVNum);

            if (skillList == null)
            {
                return;
            }

            switch (Option)
            {
            case 0:
                session.SendPacket($"pdelay 3000 12 #ps_op^{PetId}^{SkillSlot}^1");
                session.CurrentMapInstance?.Broadcast(UserInterfaceHelper.GenerateGuri(2, 2, partnerInTeam.MateTransportId), partnerInTeam.PositionX, partnerInTeam.PositionY);
                break;

            default:

                switch (SkillSlot)
                {
                case 0:
                    partnerInTeam.SpInstance.FirstPartnerSkill     = skillList.FirstSkill;
                    partnerInTeam.SpInstance.FirstPartnerSkillRank = (PartnerSkillRankType)ServerManager.RandomNumber <byte>(1, 8);
                    break;

                case 1:
                    partnerInTeam.SpInstance.SecondPartnerSkill     = skillList.SecondSkill;
                    partnerInTeam.SpInstance.SecondPartnerSkillRank = (PartnerSkillRankType)ServerManager.RandomNumber <byte>(1, 8);
                    break;

                case 2:
                    partnerInTeam.SpInstance.ThirdPartnerSkill     = skillList.ThirdSkill;
                    partnerInTeam.SpInstance.ThirdPartnerSkillRank = (PartnerSkillRankType)ServerManager.RandomNumber <byte>(1, 8);
                    break;
                }

                partnerInTeam.SpInstance.Agility = 0;
                session.SendPacket(partnerInTeam.GenerateScPacket());
                session.SendPacket(partnerInTeam.GeneratePski());
                session.SendPacket(UserInterfaceHelper.GenerateModal(Language.Instance.GetMessageFromKey("PARTNER_LEARNT_SKILL"), 1));
                break;
            }
        }
Пример #5
0
        public override void Use(ClientSession session, ref ItemInstance inv, byte option = 0,
                                 string[] packetsplit = null)
        {
            switch (Effect)
            {
            default:
                bool delay = false;
                if (option == 255)
                {
                    delay  = true;
                    option = 0;
                }

                Mate mate = null;
                if (option != 0)
                {
                    if (session.Character.Mates.Count(s => s.MateType == MateType.Partner) == 1 && option == 2)
                    {
                        option = 1;
                    }
                    mate = session.Character.Mates.FirstOrDefault(s =>
                                                                  s.MateType == MateType.Partner && s.PetId == (option - 1));
                }

                short slot      = inv.Slot;
                var   equipment = InventoryType.Wear;
                switch (option)
                {
                case 1:
                    equipment = InventoryType.FirstPartnerInventory;
                    break;

                case 2:
                    equipment = InventoryType.SecondPartnerInventory;
                    break;

                case 3:
                    equipment = InventoryType.ThirdPartnerInventory;
                    break;
                }

                InventoryType itemToWearType = inv.Type;

                if (inv == null)
                {
                    return;
                }

                if (ItemValidTime > 0 && !inv.IsBound)
                {
                    inv.ItemDeleteTime = DateTime.Now.AddSeconds(ItemValidTime);
                }

                if (!inv.IsBound)
                {
                    switch (inv.Item.Effect)
                    {
                    case 790:         // Tarot
                    case 932:         // Attack amulet
                    case 933:         // defense amulet
                        inv.BoundCharacterId = session.Character.CharacterId;
                        break;
                    }

                    if (!delay &&
                        (EquipmentSlot == EquipmentType.Fairy && (MaxElementRate == 70 || MaxElementRate == 80) ||
                         EquipmentSlot == EquipmentType.CostumeHat || EquipmentSlot == EquipmentType.CostumeSuit ||
                         EquipmentSlot == EquipmentType.WeaponSkin))
                    {
                        session.SendPacket(
                            $"qna #u_i^1^{session.Character.CharacterId}^{(byte)itemToWearType}^{slot}^1 {Language.Instance.GetMessageFromKey("ASK_BIND")}");
                        return;
                    }

                    if (delay)
                    {
                        inv.BoundCharacterId = session.Character.CharacterId;
                    }
                }

                double timeSpanSinceLastSpUsage =
                    (DateTime.Now - Process.GetCurrentProcess().StartTime.AddSeconds(-50)).TotalSeconds -
                    session.Character.LastSp;

                if (EquipmentSlot == EquipmentType.Sp && inv.Rare == -2)
                {
                    session.SendPacket(
                        UserInterfaceHelper.Instance.GenerateMsg(
                            Language.Instance.GetMessageFromKey("CANT_EQUIP_DESTROYED_SP"), 0));
                    return;
                }

                if (option == 0)
                {
                    if (EquipmentSlot == EquipmentType.Sp &&
                        timeSpanSinceLastSpUsage <= session.Character.SpCooldown &&
                        session.Character.Inventory.LoadBySlotAndType <SpecialistInstance>((byte)EquipmentType.Sp,
                                                                                           InventoryType.Specialist) != null)
                    {
                        session.SendPacket(UserInterfaceHelper.Instance.GenerateMsg(
                                               string.Format(Language.Instance.GetMessageFromKey("SP_INLOADING"),
                                                             session.Character.SpCooldown - (int)Math.Round(timeSpanSinceLastSpUsage)), 0));
                        return;
                    }

                    if (ItemType != ItemType.Weapon && ItemType != ItemType.Armor && ItemType != ItemType.Fashion &&
                        ItemType != ItemType.Jewelery && ItemType != ItemType.Specialist ||
                        LevelMinimum > (IsHeroic ? session.Character.HeroLevel : session.Character.Level) ||
                        Sex != 0 && Sex != ((byte)session.Character.Gender + 1) ||
                        ItemType != ItemType.Jewelery && EquipmentSlot != EquipmentType.Boots &&
                        EquipmentSlot != EquipmentType.Gloves && (Class >> (byte)session.Character.Class & 1) != 1)
                    {
                        session.SendPacket(
                            session.Character.GenerateSay(Language.Instance.GetMessageFromKey("BAD_EQUIPMENT"),
                                                          10));
                        return;
                    }

                    if (session.Character.UseSp)
                    {
                        var sp =
                            session.Character.Inventory.LoadBySlotAndType <SpecialistInstance>(
                                (byte)EquipmentType.Sp, equipment);

                        if (sp != null && sp.Item.Element != 0 && EquipmentSlot == EquipmentType.Fairy &&
                            Element != sp.Item.Element && Element != sp.Item.SecondaryElement)
                        {
                            session.SendPacket(
                                UserInterfaceHelper.Instance.GenerateMsg(
                                    Language.Instance.GetMessageFromKey("BAD_FAIRY"), 0));
                            return;
                        }
                    }

                    if (ItemType == ItemType.Weapon || ItemType == ItemType.Armor)
                    {
                        if (inv.BoundCharacterId.HasValue &&
                            inv.BoundCharacterId.Value != session.Character.CharacterId)
                        {
                            session.SendPacket(
                                session.Character.GenerateSay(Language.Instance.GetMessageFromKey("BAD_EQUIPMENT"),
                                                              10));
                            return;
                        }
                    }

                    if (session.Character.UseSp && EquipmentSlot == EquipmentType.Sp)
                    {
                        session.SendPacket(
                            session.Character.GenerateSay(Language.Instance.GetMessageFromKey("SP_BLOCKED"), 10));
                        return;
                    }

                    if (session.Character.JobLevel < LevelJobMinimum)
                    {
                        session.SendPacket(
                            session.Character.GenerateSay(Language.Instance.GetMessageFromKey("LOW_JOB_LVL"), 10));
                        return;
                    }
                }
                else if (mate != null)
                {
                    if (mate.Level < LevelMinimum)
                    {
                        session.SendPacket(
                            session.Character.GenerateSay(Language.Instance.GetMessageFromKey("BAD_EQUIPMENT"),
                                                          10));
                        return;
                    }

                    switch (EquipmentSlot)
                    {
                    case EquipmentType.Armor:
                        if (ItemSubType == 4)
                        {
                            if (MateHelper.Instance.CanWearItem(inv.ItemVNum, mate.Monster.NpcMonsterVNum, session))
                            {
                                mate.ArmorInstance = inv;
                            }
                            else
                            {
                                goto default;
                            }
                            break;
                        }
                        else
                        {
                            goto default;
                        }

                    case EquipmentType.MainWeapon:
                        if (ItemSubType == 12)
                        {
                            if (MateHelper.Instance.CanWearItem(inv.ItemVNum, mate.Monster.NpcMonsterVNum, session))
                            {
                                mate.WeaponInstance = inv;
                            }
                            else
                            {
                                goto default;
                            }
                            break;
                        }
                        else
                        {
                            goto default;
                        }

                    case EquipmentType.Gloves:
                        mate.GlovesInstance = inv;
                        break;

                    case EquipmentType.Boots:
                        mate.BootsInstance = inv;
                        break;

                    case EquipmentType.Sp:
                        if (ItemSubType == 4)
                        {
                            if (MateHelper.Instance.CanWearItem(inv.ItemVNum, mate.Monster.NpcMonsterVNum, session))
                            {
                                mate.SpInstance = (SpecialistInstance)inv;
                            }
                            else
                            {
                                goto default;
                            }
                            break;
                        }
                        else
                        {
                            goto default;
                        }

                    default:
                        session.SendPacket(
                            session.Character.GenerateSay(Language.Instance.GetMessageFromKey("BAD_EQUIPMENT"),
                                                          10));
                        return;
                    }
                }

                ItemInstance currentlyEquippedItem =
                    session.Character.Inventory.LoadBySlotAndType((short)EquipmentSlot, equipment);

                if (currentlyEquippedItem == null)
                {
                    // move from equipment to wear
                    session.Character.Inventory.MoveInInventory(inv.Slot, itemToWearType, equipment);
                    session.SendPacket(UserInterfaceHelper.Instance.GenerateInventoryRemove(itemToWearType, slot));
                }
                else
                {
                    // move from wear to equipment and back
                    session.Character.Inventory.MoveInInventory(currentlyEquippedItem.Slot, equipment,
                                                                itemToWearType, inv.Slot);
                    session.SendPacket(currentlyEquippedItem.GenerateInventoryAdd());
                    session.Character.BattleEntity.StaticBcards.RemoveWhere(
                        o => o.ItemVNum != currentlyEquippedItem.ItemVNum, out ConcurrentBag <BCard> eqBcards);
                    session.Character.BattleEntity.StaticBcards = eqBcards;
                }

                if (inv.Item.ItemType != ItemType.Fashion)
                {
                    inv.Item.BCards.ForEach(s => session.Character.BattleEntity.StaticBcards.Add(s));
                }

                if (inv is WearableInstance wearableInstance)
                {
                    var specialistInstance =
                        session.Character.Inventory.LoadBySlotAndType <SpecialistInstance>((byte)EquipmentType.Sp,
                                                                                           InventoryType.Wear);

                    if (wearableInstance.EquipmentOptions != null)
                    {
                        switch (wearableInstance.Item.ItemType)
                        {
                        case ItemType.Armor:
                        case ItemType.Weapon:
                        case ItemType.Jewelery:
                        case ItemType.Fashion:
                            switch (wearableInstance.Slot)
                            {
                            case (byte)EquipmentType.CostumeHat:
                                session.Character.BattleEntity.CostumeHatBcards.Clear();

                                foreach (BCard bc in wearableInstance.Item.BCards)
                                {
                                    session.Character.BattleEntity.CostumeHatBcards.Add(bc);
                                }
                                break;

                            case (byte)EquipmentType.CostumeSuit:
                                session.Character.BattleEntity.CostumeSuitBcards.Clear();

                                foreach (BCard bc in wearableInstance.Item.BCards)
                                {
                                    session.Character.BattleEntity.CostumeSuitBcards.Add(bc);
                                }
                                break;

                            case (byte)EquipmentType.Armor:
                                session.Character.Inventory.Armor = wearableInstance;
                                session.Character.ShellOptionArmor.Clear();

                                foreach (EquipmentOptionDTO dto in DaoFactory.EquipmentOptionDao.GetOptionsByWearableInstanceId(inv.Id))
                                {
                                    session.Character.ShellOptionArmor.Add(dto);
                                }
                                EquipmentOptionHelper.Instance
                                .ShellToBCards(wearableInstance.EquipmentOptions,
                                               wearableInstance.ItemVNum)
                                .ForEach(s => session.Character.BattleEntity.StaticBcards.Add(s));
                                break;

                            case (byte)EquipmentType.MainWeapon:
                                session.Character.ShellOptionsMain.Clear();

                                foreach (EquipmentOptionDTO dto in DaoFactory.EquipmentOptionDao.GetOptionsByWearableInstanceId(inv.Id))
                                {
                                    session.Character.ShellOptionsMain.Add(dto);
                                }
                                session.Character.Inventory.PrimaryWeapon = wearableInstance;
                                EquipmentOptionHelper.Instance
                                .ShellToBCards(wearableInstance.EquipmentOptions,
                                               wearableInstance.ItemVNum)
                                .ForEach(s => session.Character.BattleEntity.StaticBcards.Add(s));
                                specialistInstance?.RestorePoints(session, specialistInstance);
                                break;

                            case (byte)EquipmentType.SecondaryWeapon:
                                session.Character.ShellOptionsSecondary.Clear();

                                foreach (EquipmentOptionDTO dto in DaoFactory.EquipmentOptionDao.GetOptionsByWearableInstanceId(inv.Id))
                                {
                                    session.Character.ShellOptionsSecondary.Add(dto);
                                }
                                session.Character.Inventory.SecondaryWeapon = wearableInstance;
                                EquipmentOptionHelper.Instance
                                .ShellToBCards(wearableInstance.EquipmentOptions,
                                               wearableInstance.ItemVNum)
                                .ForEach(s => session.Character.BattleEntity.StaticBcards.Add(s));
                                specialistInstance?.RestorePoints(session, specialistInstance);
                                break;

                            case (byte)EquipmentType.Ring:
                            case (byte)EquipmentType.Necklace:
                            case (byte)EquipmentType.Bracelet:
                                EquipmentOptionHelper.Instance
                                .CellonToBCards(wearableInstance.EquipmentOptions,
                                                wearableInstance.ItemVNum)
                                .ForEach(s => session.Character.BattleEntity.StaticBcards.Add(s));
                                session.Character.BattleEntity.CellonOptions.Clear();
                                WearableInstance ring     = session.Character.Inventory.LoadBySlotAndType <WearableInstance>((byte)EquipmentType.Ring, InventoryType.Wear);
                                WearableInstance bracelet = session.Character.Inventory.LoadBySlotAndType <WearableInstance>((byte)EquipmentType.Bracelet, InventoryType.Wear);
                                WearableInstance necklace = session.Character.Inventory.LoadBySlotAndType <WearableInstance>((byte)EquipmentType.Necklace, InventoryType.Wear);
                                if (ring?.EquipmentOptions != null)
                                {
                                    session.Character.BattleEntity.CellonOptions.AddRange(ring?.EquipmentOptions);
                                }

                                if (bracelet?.EquipmentOptions != null)
                                {
                                    session.Character.BattleEntity.CellonOptions.AddRange(bracelet?.EquipmentOptions);
                                }

                                if (necklace?.EquipmentOptions != null)
                                {
                                    session.Character.BattleEntity.CellonOptions.AddRange(necklace?.EquipmentOptions);
                                }
                                break;
                            }

                            break;
                        }
                    }
                }

                if (option == 0)
                {
                    session.SendPacket(session.Character.GenerateStatChar());
                    session.CurrentMapInstance?.Broadcast(session.Character.GenerateEq());
                    session.SendPacket(session.Character.GenerateEquipment());
                    session.CurrentMapInstance?.Broadcast(session.Character.GeneratePairy());

                    switch (EquipmentSlot)
                    {
                    case EquipmentType.Fairy:
                        var fairy =
                            session.Character.Inventory.LoadBySlotAndType <WearableInstance>(
                                (byte)EquipmentType.Fairy, equipment);
                        session.SendPacket(session.Character.GenerateSay(
                                               string.Format(Language.Instance.GetMessageFromKey("FAIRYSTATS"), fairy.XP,
                                                             CharacterHelper.LoadFairyXpData(fairy.ElementRate + fairy.Item.ElementRate)),
                                               10));
                        break;

                    case EquipmentType.Amulet:
                        session.SendPacket(session.Character.GenerateEff(39));
                        break;
                    }
                }
                else if (mate != null)
                {
                    session.SendPacket(mate.GenerateScPacket());
                }

                break;
            }
        }
        private void ExecuteHandler(ClientSession session)
        {
            InventoryType equipment;
            Mate          mate = null;

            if (Type >= 1 && Type <= 12)
            {
                // Partner inventories
                equipment = (InventoryType)(Type + 12);
                mate      = session.Character.Mates.FirstOrDefault(s => s.PartnerSlot == (Type - 1) && s.MateType == MateType.Partner);
            }
            else
            {
                equipment = InventoryType.Wear;
            }


            if (session.HasCurrentMapInstance &&
                session.CurrentMapInstance.UserShops.FirstOrDefault(mapshop =>
                                                                    mapshop.Value.OwnerId.Equals(session.Character.CharacterId)).Value == null &&
                (session.Character.ExchangeInfo == null ||
                 (session.Character.ExchangeInfo?.ExchangeList).Count == 0))
            {
                ItemInstance inventory =
                    session.Character.Inventory.LoadBySlotAndType(InventorySlot, equipment);
                if (inventory != null)
                {
                    double currentRunningSeconds =
                        (DateTime.UtcNow - Process.GetCurrentProcess().StartTime.AddHours(-2).AddSeconds(-50)).TotalSeconds;
                    double timeSpanSinceLastSpUsage = currentRunningSeconds - session.Character.LastSp;
                    if (Type == 0)
                    {
                        if (InventorySlot == (byte)EquipmentType.Sp && session.Character.UseSp)
                        {
                            if (session.Character.IsVehicled)
                            {
                                session.SendPacket(
                                    UserInterfaceHelper.GenerateMsg(
                                        Language.Instance.GetMessageFromKey("REMOVE_VEHICLE"), 0));
                                return;
                            }

                            if (session.Character.LastSkillUse.AddSeconds(2) > DateTime.UtcNow)
                            {
                                return;
                            }

                            session.Character.LastSp =
                                (DateTime.UtcNow - Process.GetCurrentProcess().StartTime.AddHours(-2).AddSeconds(-50)).TotalSeconds;
                            session.RemoveSp(inventory.ItemVNum);
                        }
                        else if (InventorySlot == (byte)EquipmentType.Sp &&
                                 !session.Character.UseSp &&
                                 timeSpanSinceLastSpUsage <= session.Character.SpCooldown)
                        {
                            session.SendPacket(UserInterfaceHelper.GenerateMsg(
                                                   string.Format(Language.Instance.GetMessageFromKey("SP_INLOADING"),
                                                                 session.Character.SpCooldown - (int)Math.Round(timeSpanSinceLastSpUsage, 0)),
                                                   0));
                            return;
                        }
                        else if (InventorySlot == (byte)EquipmentType.Fairy &&
                                 session.Character.IsUsingFairyBooster)
                        {
                            session.SendPacket(UserInterfaceHelper.GenerateMsg(
                                                   Language.Instance.GetMessageFromKey("REMOVE_FAIRY_WHILE_USING_BOOSTER"), 0));
                            return;
                        }

                        session.Character.EquipmentBCards.RemoveAll(o => o.ItemVNum == inventory.ItemVNum);
                    }

                    ItemInstance inv = session.Character.Inventory.MoveInInventory(InventorySlot,
                                                                                   equipment, InventoryType.Equipment);

                    if (inv == null)
                    {
                        session.SendPacket(
                            UserInterfaceHelper.GenerateMsg(Language.Instance.GetMessageFromKey("NOT_ENOUGH_PLACE"),
                                                            0));
                        return;
                    }

                    if (inv.Slot != -1)
                    {
                        session.SendPacket(inventory.GenerateInventoryAdd());
                    }

                    if (Type == 0)
                    {
                        session.SendPacket(session.Character.GenerateStatChar());
                        session.CurrentMapInstance?.Broadcast(session.Character.GenerateEq());
                        session.SendPacket(session.Character.GenerateEquipment());
                        session.CurrentMapInstance?.Broadcast(session.Character.GeneratePairy());
                    }
                    else if (mate != null)
                    {
                        switch (inv.Item.EquipmentSlot)
                        {
                        case EquipmentType.Armor:
                            mate.ArmorInstance = null;
                            break;

                        case EquipmentType.MainWeapon:
                            mate.WeaponInstance = null;
                            break;

                        case EquipmentType.Gloves:
                            mate.GlovesInstance = null;
                            break;

                        case EquipmentType.Boots:
                            mate.BootsInstance = null;
                            break;

                        case EquipmentType.Sp:
                            mate.SpInstance = null;
                            mate.RemoveSp();
                            break;
                        }
                        session.SendPacket(mate.GenerateScPacket());
                    }
                }
            }
        }