示例#1
0
        public void Shopping(string packet)
        {
            Logger.Debug(packet, Session.SessionId);
            // n_inv 2 1834 0 100 0.13.13.0.0.330 0.14.15.0.0.2299 0.18.120.0.0.3795 0.19.107.0.0.3795 0.20.94.0.0.3795 0.37.95.0.0.5643 0.38.97.0.0.11340 0.39.99.0.0.18564 0.48.108.0.0.5643 0.49.110.0.0.11340 0.50.112.0.0.18564 0.59.121.0.0.5643 0.60.123.0.0.11340 0.61.125.0.0.18564
            string[] packetsplit = packet.Split(' ');
            byte     type, typeshop = 0;
            int      NpcId;

            if (!int.TryParse(packetsplit[5], out NpcId) || !byte.TryParse(packetsplit[2], out type))
            {
                return;
            }
            if (Session.Character.IsShopping)
            {
                return;
            }
            MapNpc     mapnpc = Session.CurrentMap.Npcs.FirstOrDefault(n => n.MapNpcId.Equals(NpcId));
            NpcMonster npc    = ServerManager.GetNpc(mapnpc.NpcVNum);

            if (mapnpc?.Shop == null)
            {
                return;
            }

            string shoplist = String.Empty;

            foreach (ShopItem item in mapnpc.Shop.ShopItems.Where(s => s.Type.Equals(type)))
            {
                Item iteminfo = ServerManager.GetItem(item.ItemVNum);
                typeshop = 100;
                double percent = 1;
                if (Session.Character.GetDignityIco() == 3)
                {
                    percent  = 1.1;
                    typeshop = 110;
                }
                else if (Session.Character.GetDignityIco() == 4)
                {
                    percent  = 1.2;
                    typeshop = 120;
                }
                else if (Session.Character.GetDignityIco() == 5)
                {
                    percent  = 1.5;
                    typeshop = 150;
                }
                else if
                (Session.Character.GetDignityIco() == 6)
                {
                    percent  = 1.5;
                    typeshop = 150;
                }
                else if (Session.CurrentMap.MapTypes.Any(s => s.MapTypeId == (short)MapTypeEnum.Act4))
                {
                    percent *= 1.5;
                    typeshop = 150;
                }
                if (Session.CurrentMap.MapTypes.Any(s => s.MapTypeId == (short)MapTypeEnum.Act4 && Session.Character.GetDignityIco() == 3))
                {
                    percent  = 1.6;
                    typeshop = 160;
                }
                else if (Session.CurrentMap.MapTypes.Any(s => s.MapTypeId == (short)MapTypeEnum.Act4 && Session.Character.GetDignityIco() == 4))
                {
                    percent  = 1.7;
                    typeshop = 170;
                }
                else if (Session.CurrentMap.MapTypes.Any(s => s.MapTypeId == (short)MapTypeEnum.Act4 && Session.Character.GetDignityIco() == 5))
                {
                    percent  = 2;
                    typeshop = 200;
                }
                else if
                (Session.CurrentMap.MapTypes.Any(s => s.MapTypeId == (short)MapTypeEnum.Act4 && Session.Character.GetDignityIco() == 6))
                {
                    percent  = 2;
                    typeshop = 200;
                }
                if (iteminfo.ReputPrice > 0 && iteminfo.Type == 0)
                {
                    shoplist += $" {(byte)iteminfo.Type}.{item.Slot}.{item.ItemVNum}.{item.Rare}.{(iteminfo.IsColored ? item.Color : item.Upgrade)}.{iteminfo.ReputPrice}";
                }
                else if (iteminfo.ReputPrice > 0 && iteminfo.Type != 0)
                {
                    shoplist += $" {(byte)iteminfo.Type}.{item.Slot}.{item.ItemVNum}.{-1}.{iteminfo.ReputPrice}";
                }
                else if (iteminfo.Type != 0)
                {
                    shoplist += $" {(byte)iteminfo.Type}.{item.Slot}.{item.ItemVNum}.{-1}.{iteminfo.Price * percent}";
                }
                else
                {
                    shoplist += $" {(byte)iteminfo.Type}.{item.Slot}.{item.ItemVNum}.{item.Rare}.{(iteminfo.IsColored ? item.Color : item.Upgrade)}.{iteminfo.Price * percent}";
                }
            }

            foreach (ShopSkill skill in mapnpc.Shop.ShopSkills.Where(s => s.Type.Equals(type)))
            {
                Skill skillinfo = ServerManager.GetSkill(skill.SkillVNum);

                if (skill.Type != 0)
                {
                    typeshop = 1;
                    if (skillinfo.Class == Session.Character.Class)
                    {
                        shoplist += $" {skillinfo.SkillVNum}";
                    }
                }
                else
                {
                    shoplist += $" {skillinfo.SkillVNum}";
                }
            }

            Session.SendPacket($"n_inv 2 {mapnpc.MapNpcId} 0 {typeshop}{shoplist}");
        }
示例#2
0
    private void NpcLoading()
    {
        Data_Base.Connection();
        string sqlQuery = "SELECT bestiary.id, bestiary.map_id, bestiary.bestiary_name, bestiary.point_dungeon_id, bestiary.icon_image_id, bestiary.image_id, " +
                          "bestiary.fight_type_id, bestiary.phys_damage_min, bestiary.phys_damage_max, bestiary.damage_bonus, bestiary.magic_damage_min, bestiary.magic_damage_max, " +
                          "bestiary.magic_damage_bonus, bestiary.penetration, bestiary.phys_def, bestiary.mag_def, " +
                          "bestiary.health, bestiary.accuracy, bestiary.evasion, bestiary.crit_chance, bestiary.initiative, " +
                          "bestiary.ability_id, bestiary.first_ability_proc_chance_d, bestiary.first_ability_proc_chance, bestiary.first_ability_cooldown, " +
                          "bestiary.first_ability_id, bestiary.second_ability_proc_chance_d, bestiary.second_ability_proc_chance, " +
                          "bestiary.second_ability_cooldown, bestiary.second_ability_id, bestiary.third_ability_proc_chance_d, " +
                          "bestiary.third_ability_proc_chance, bestiary.third_ability_cooldown, bestiary.third_ability_id " +
                          "FROM bestiary";

        sql_data = Data_Base.SQL_Query(sqlQuery);
        while (sql_data.Read())
        {
            NpcMonster npcMonster = new NpcMonster();
            sql_num               = 2;
            npcMonster.Name       = sql_data.GetString(sql_num);
            sql_num               = 7;
            npcMonster.PhysMinDmg = sql_data.GetInt32(sql_num);
            sql_num++;
            npcMonster.PhysMaxDmg = sql_data.GetInt32(sql_num);
            sql_num++;
            npcMonster.BonusPhysAttack = sql_data.GetInt32(sql_num);
            sql_num++;
            npcMonster.MagMinDmg = sql_data.GetInt32(sql_num);
            sql_num++;
            npcMonster.MagMaxDmg = sql_data.GetInt32(sql_num);
            sql_num++;
            npcMonster.BonusMagAttack = sql_data.GetInt32(sql_num);
            sql_num++;
            npcMonster.PenetrationPercent = sql_data.GetInt32(sql_num);
            sql_num++;
            npcMonster.PhysArmorPercent = sql_data.GetInt32(sql_num);
            sql_num++;
            npcMonster.MaxMagDef = sql_data.GetInt32(sql_num);
            sql_num++;
            npcMonster.CurrentHp = sql_data.GetInt32(sql_num);
            sql_num++;
            npcMonster.AccuracyPercent = sql_data.GetInt32(sql_num);
            sql_num++;
            npcMonster.EvasionPercent = sql_data.GetInt32(sql_num);
            sql_num++;
            npcMonster.CritChancePercent = sql_data.GetInt32(sql_num);
            sql_num++;
            npcMonster.Initiative = sql_data.GetInt32(sql_num);
            sql_num += 5;
            int skillId = sql_data.GetInt32(sql_num);
            if (skillId != 0)
            {
                npcMonster.AddActiveOrPassiveSkill(skillId);
            }
            sql_num += 4;
            skillId  = sql_data.GetInt32(sql_num);
            if (skillId != 0)
            {
                npcMonster.AddActiveOrPassiveSkill(skillId);
            }
            sql_num += 4;
            skillId  = sql_data.GetInt32(sql_num);
            if (skillId != 0)
            {
                npcMonster.AddActiveOrPassiveSkill(skillId);
            }
            BattleMechanics.NpcData.Add(npcMonster.Name, npcMonster);
        }
        sql_data.Close();
        sql_data = null;
        End_loading();
    }
示例#3
0
        public override void Use(ClientSession session, ref ItemInstance inv, byte option = 0,
                                 string[] packetsplit = null)
        {
            if (session == null)
            {
                return;
            }

            switch (Effect)
            {
            case 0:
            case 999:
                if (option == 0)
                {
                    if (packetsplit != null && packetsplit.Length == 9)
                    {
                        var box =
                            session.Character.Inventory.LoadBySlotAndType <BoxInstance>(inv.Slot,
                                                                                        InventoryType.Equipment);
                        if (box != null)
                        {
                            if (box.Item.ItemSubType == 3)
                            {
                                session.SendPacket(
                                    $"qna #guri^300^8023^{inv.Slot} {Language.Instance.GetMessageFromKey("ASK_OPEN_BOX")}");
                            }
                            else if (box.HoldingVNum == 0)
                            {
                                session.SendPacket(
                                    $"qna #guri^300^8023^{inv.Slot}^{packetsplit[3]} {Language.Instance.GetMessageFromKey("ASK_STORE_PET")}");
                            }
                            else
                            {
                                session.SendPacket(
                                    $"qna #guri^300^8023^{inv.Slot} {Language.Instance.GetMessageFromKey("ASK_RELEASE_PET")}");
                            }
                        }
                    }
                }
                else
                {
                    //u_i 2 2000000 0 21 0 0
                    var box =
                        session.Character.Inventory.LoadBySlotAndType <BoxInstance>(inv.Slot,
                                                                                    InventoryType.Equipment);
                    if (box != null)
                    {
                        if (box.Item.ItemSubType == 3)
                        {
                            List <RollGeneratedItemDTO> roll = box.Item.RollGeneratedItems.Where(s =>
                                                                                                 s.MinimumOriginalItemRare <= box.Rare && s.MaximumOriginalItemRare >= box.Rare &&
                                                                                                 s.OriginalItemDesign == box.Design).ToList();
                            int probabilities          = roll.Sum(s => s.Probability);
                            int rnd                    = ServerManager.Instance.RandomNumber(0, probabilities);
                            int currentrnd             = 0;
                            List <ItemInstance> newInv = null;
                            foreach (RollGeneratedItemDTO rollitem in roll)
                            {
                                Item createdItem = ServerManager.Instance.GetItem(rollitem.ItemGeneratedVNum);
                                if (newInv != null)
                                {
                                    continue;
                                }

                                currentrnd += rollitem.Probability;
                                if (currentrnd < rnd)
                                {
                                    continue;
                                }

                                if (createdItem.ItemType == ItemType.Shell)
                                {
                                    rollitem.ItemGeneratedUpgrade = (byte)ServerManager.Instance.RandomNumber();
                                    if (rollitem.ItemGeneratedUpgrade >= 95)
                                    {
                                        rollitem.ItemGeneratedUpgrade =
                                            (byte)ServerManager.Instance.RandomNumber(80, 91);
                                    }
                                    else
                                    {
                                        rollitem.ItemGeneratedUpgrade =
                                            (byte)ServerManager.Instance.RandomNumber(70, 80);
                                    }
                                }

                                newInv = session.Character.Inventory.AddNewToInventory(rollitem.ItemGeneratedVNum,
                                                                                       (ushort)rollitem.ItemGeneratedAmount, rare: box.Rare,
                                                                                       upgrade: rollitem.ItemGeneratedUpgrade);
                                if (!newInv.Any())
                                {
                                    continue;
                                }

                                short slot = inv.Slot;
                                if (slot == -1)
                                {
                                    continue;
                                }

                                session.SendPacket(session.Character.GenerateSay(
                                                       $"{Language.Instance.GetMessageFromKey("ITEM_ACQUIRED")}: {newInv.FirstOrDefault()?.Item.Name ?? ""} x {rollitem.ItemGeneratedAmount})",
                                                       12));
                                session.SendPacket(
                                    $"rdi {rollitem.ItemGeneratedVNum} {rollitem.ItemGeneratedAmount}");
                                newInv.ForEach(s => session.SendPacket(s?.GenerateInventoryAdd()));
                                session.Character.Inventory.RemoveItemAmountFromInventory(1, box.Id);
                            }
                        }
                        else if (box.HoldingVNum == 0)
                        {
                            if (packetsplit != null && packetsplit.Length == 1)
                            {
                                if (int.TryParse(packetsplit[0], out int petId))
                                {
                                    Mate mate = session.Character.Mates.FirstOrDefault(s =>
                                                                                       s.MateTransportId == petId);
                                    if (mate == null)
                                    {
                                        return;
                                    }

                                    box.MateType    = mate.MateType;
                                    box.HoldingVNum = mate.NpcMonsterVNum;
                                    box.SpLevel     = mate.Level;
                                    box.SpDamage    = mate.Attack;
                                    box.SpDefence   = mate.Defence;
                                    session.Character.Mates.Remove(mate);
                                    session.SendPacket(
                                        UserInterfaceHelper.Instance.GenerateInfo(
                                            Language.Instance.GetMessageFromKey("PET_STORED")));
                                    session.SendPacket(UserInterfaceHelper.Instance.GeneratePClear());
                                    session.SendPackets(session.Character.GenerateScP());
                                    session.SendPackets(session.Character.GenerateScN());
                                    session.CurrentMapInstance?.Broadcast(mate.GenerateOut());
                                }
                            }
                        }
                        else
                        {
                            NpcMonster heldMonster = ServerManager.Instance.GetNpc(box.HoldingVNum);

                            if (heldMonster != null)
                            {
                                var mate = new Mate(session.Character, heldMonster,
                                                    (byte)(box.SpLevel == 0 ? 1 : box.SpLevel), box.MateType)
                                {
                                    Attack  = box.SpDamage,
                                    Defence = box.SpDefence
                                };
                                if (session.Character.AddPet(mate))
                                {
                                    session.Character.Inventory.RemoveItemAmountFromInventory(1, inv.Id);
                                    session.SendPacket(
                                        UserInterfaceHelper.Instance.GenerateInfo(
                                            Language.Instance.GetMessageFromKey("PET_LEAVE_BEAD")));
                                }
                            }
                        }
                    }
                }

                break;

            case 1:
                if (option == 0)
                {
                    session.SendPacket(
                        $"qna #guri^300^8023^{inv.Slot} {Language.Instance.GetMessageFromKey("ASK_RELEASE_PET")}");
                }
                else
                {
                    NpcMonster heldMonster = ServerManager.Instance.GetNpc((short)EffectValue);
                    if (session.CurrentMapInstance == session.Character.Miniland && heldMonster != null)
                    {
                        var mate = new Mate(session.Character, heldMonster, LevelMinimum,
                                            ItemSubType == 1 ? MateType.Partner : MateType.Pet);
                        if (session.Character.AddPet(mate))
                        {
                            session.Character.Inventory.RemoveItemAmountFromInventory(1, inv.Id);
                            session.SendPacket(
                                UserInterfaceHelper.Instance.GenerateInfo(
                                    Language.Instance.GetMessageFromKey("PET_LEAVE_BEAD")));
                        }
                    }
                }

                break;

            case 6969:
                if (EffectValue == 1 || EffectValue == 2)
                {
                    var box =
                        session.Character.Inventory.LoadBySlotAndType <BoxInstance>(inv.Slot,
                                                                                    InventoryType.Equipment);
                    if (box != null)
                    {
                        if (box.HoldingVNum == 0)
                        {
                            session.SendPacket($"wopen 44 {inv.Slot} 1");
                        }
                        else
                        {
                            List <ItemInstance> newInv =
                                session.Character.Inventory.AddNewToInventory(box.HoldingVNum);
                            if (newInv.Any())
                            {
                                ItemInstance itemInstance = newInv.First();
                                var          specialist   =
                                    session.Character.Inventory.LoadBySlotAndType <SpecialistInstance>(
                                        itemInstance.Slot, itemInstance.Type);
                                if (specialist != null)
                                {
                                    specialist.SkillRank1    = box.SkillRank1;
                                    specialist.SkillRank2    = box.SkillRank2;
                                    specialist.SkillRank3    = box.SkillRank3;
                                    specialist.PartnerSkill1 = box.PartnerSkill1;
                                    specialist.PartnerSkill2 = box.PartnerSkill2;
                                    specialist.PartnerSkill3 = box.PartnerSkill3;
                                }

                                short slot = inv.Slot;
                                if (slot != -1)
                                {
                                    if (specialist != null)
                                    {
                                        session.SendPacket(session.Character.GenerateSay(
                                                               $"{Language.Instance.GetMessageFromKey("ITEM_ACQUIRED")}: {specialist.Item.Name}",
                                                               12));
                                        newInv.ForEach(s => session.SendPacket(specialist.GenerateInventoryAdd()));
                                    }

                                    session.Character.Inventory.RemoveItemAmountFromInventory(1, box.Id);
                                }
                            }
                            else
                            {
                                session.SendPacket(
                                    UserInterfaceHelper.Instance.GenerateMsg(
                                        Language.Instance.GetMessageFromKey("NOT_ENOUGH_PLACE"), 0));
                            }
                        }
                    }
                }
                break;

            case 69:
                if (EffectValue == 1 || EffectValue == 2)
                {
                    var box =
                        session.Character.Inventory.LoadBySlotAndType <BoxInstance>(inv.Slot,
                                                                                    InventoryType.Equipment);
                    if (box != null)
                    {
                        if (box.HoldingVNum == 0)
                        {
                            session.SendPacket($"wopen 44 {inv.Slot} 0");
                        }
                        else
                        {
                            List <ItemInstance> newInv =
                                session.Character.Inventory.AddNewToInventory(box.HoldingVNum);
                            if (newInv.Any())
                            {
                                ItemInstance itemInstance = newInv.First();
                                var          specialist   =
                                    session.Character.Inventory.LoadBySlotAndType <SpecialistInstance>(
                                        itemInstance.Slot, itemInstance.Type);
                                if (specialist != null)
                                {
                                    specialist.SlDamage       = box.SlDamage;
                                    specialist.SlDefence      = box.SlDefence;
                                    specialist.SlElement      = box.SlElement;
                                    specialist.SlHP           = box.SlHP;
                                    specialist.SpDamage       = box.SpDamage;
                                    specialist.SpDark         = box.SpDark;
                                    specialist.SpDefence      = box.SpDefence;
                                    specialist.SpElement      = box.SpElement;
                                    specialist.SpFire         = box.SpFire;
                                    specialist.SpHP           = box.SpHP;
                                    specialist.SpLevel        = box.SpLevel;
                                    specialist.SpLight        = box.SpLight;
                                    specialist.SpStoneUpgrade = box.SpStoneUpgrade;
                                    specialist.SpWater        = box.SpWater;
                                    specialist.Upgrade        = box.Upgrade;
                                    specialist.XP             = box.XP;
                                }

                                short slot = inv.Slot;
                                if (slot != -1)
                                {
                                    if (specialist != null)
                                    {
                                        session.SendPacket(session.Character.GenerateSay(
                                                               $"{Language.Instance.GetMessageFromKey("ITEM_ACQUIRED")}: {specialist.Item.Name} + {specialist.Upgrade}",
                                                               12));
                                        newInv.ForEach(s => session.SendPacket(specialist.GenerateInventoryAdd()));
                                    }

                                    session.Character.Inventory.RemoveItemAmountFromInventory(1, box.Id);
                                }
                            }
                            else
                            {
                                session.SendPacket(
                                    UserInterfaceHelper.Instance.GenerateMsg(
                                        Language.Instance.GetMessageFromKey("NOT_ENOUGH_PLACE"), 0));
                            }
                        }
                    }
                }

                if (EffectValue == 3)
                {
                    var box =
                        session.Character.Inventory.LoadBySlotAndType <BoxInstance>(inv.Slot,
                                                                                    InventoryType.Equipment);
                    if (box != null)
                    {
                        if (box.HoldingVNum == 0)
                        {
                            session.SendPacket($"guri 26 0 {inv.Slot}");
                        }
                        else
                        {
                            List <ItemInstance> newInv =
                                session.Character.Inventory.AddNewToInventory(box.HoldingVNum);
                            if (newInv.Any())
                            {
                                ItemInstance itemInstance = newInv.First();
                                var          fairy        =
                                    session.Character.Inventory.LoadBySlotAndType <WearableInstance>(
                                        itemInstance.Slot, itemInstance.Type);
                                if (fairy != null)
                                {
                                    fairy.ElementRate = box.ElementRate;
                                }

                                short slot = inv.Slot;
                                if (slot != -1)
                                {
                                    if (fairy != null)
                                    {
                                        session.SendPacket(session.Character.GenerateSay(
                                                               $"{Language.Instance.GetMessageFromKey("ITEM_ACQUIRED")}: {fairy.Item.Name} ({fairy.ElementRate}%)",
                                                               12));
                                        newInv.ForEach(s => session.SendPacket(fairy.GenerateInventoryAdd()));
                                    }

                                    session.Character.Inventory.RemoveItemAmountFromInventory(1, box.Id);
                                }
                            }
                            else
                            {
                                session.SendPacket(
                                    UserInterfaceHelper.Instance.GenerateMsg(
                                        Language.Instance.GetMessageFromKey("NOT_ENOUGH_PLACE"), 0));
                            }
                        }
                    }
                }

                if (EffectValue == 4)
                {
                    var box =
                        session.Character.Inventory.LoadBySlotAndType <BoxInstance>(inv.Slot,
                                                                                    InventoryType.Equipment);
                    if (box != null)
                    {
                        if (box.HoldingVNum == 0)
                        {
                            session.SendPacket($"guri 24 0 {inv.Slot}");
                        }
                        else
                        {
                            List <ItemInstance> newInv =
                                session.Character.Inventory.AddNewToInventory(box.HoldingVNum);
                            if (newInv.Any())
                            {
                                short slot = inv.Slot;
                                if (slot != -1)
                                {
                                    session.SendPacket(session.Character.GenerateSay(
                                                           $"{Language.Instance.GetMessageFromKey("ITEM_ACQUIRED")}: {newInv.First().Item.Name} x 1)",
                                                           12));
                                    newInv.ForEach(s => session.SendPacket(s.GenerateInventoryAdd()));
                                    session.Character.Inventory.RemoveItemAmountFromInventory(1, box.Id);
                                }
                            }
                            else
                            {
                                session.SendPacket(
                                    UserInterfaceHelper.Instance.GenerateMsg(
                                        Language.Instance.GetMessageFromKey("NOT_ENOUGH_PLACE"), 0));
                            }
                        }
                    }
                }

                break;

            default:
                Logger.Log.Warn(string.Format(Language.Instance.GetMessageFromKey("NO_HANDLER_ITEM"), GetType()));
                break;
            }
        }
 public void AddSkillbyID()
 {
     NpcMonster npc = BattleMechanics.NpcList[BattleMechanics.SelectedNpc];
 }
    //public static void NpcSkillFailure() //если не пробили броню игрока, то отменяем эффект скилов
    //{
    //if (eKickEffect)
    //{
    //    eKickEffect = false;
    //    LogText.text += "\n\rЭффект Монстра \"Пинок\" испарился, потому что броня не была пробита.\n\r";
    //}
    //}


    /*option:
     * 1 - бьёт игрок и вешает дебафф на монстра
     * 2 - бьёт монстр и вешает дебафф на игрока
     *
     * chance(шанс ранения)
     */
    public static void WoundChance(NpcMonster npc, int option, int chance)//генератор шанса ранения
    {
        if ((option == 1 && npc.DebuffCount == 10) || (option == 2 && PlayerStats.DebuffCount == 10))
        {
            LogText.text += "\n\r5. Наложено максимальное количество дебаффов ";
            if (option == 1)
            {
                LogText.text += "на Монстре";
            }
            if (option == 2)
            {
                LogText.text += "на Герое";
            }
            LogText.text += ".\n\r";
            return;
        }
        if (PlayerStats.pBoneBreaker && option == 1)
        {
            chance       += 10;
            LogText.text += " + 10% от пассивки = " + chance + "%";
        }
        if (!npc.Chiropractor)
        {
            LogText.text += ".\n\r";
        }

        //int woundRndmChance = Random.Range(1, 101);
        //if (npc.Chiropractor && option == 2)
        //{
        //    woundRndmChance = 51;
        //    npc.Chiropractor = false;
        //}
        //woundRndmChance = 55; //для теста скила
        //int additionalChance = 0;
        //switch (chance)
        //{
        //    case 5: //при малом пробитии
        //        //LogText.text += "5%";
        //        additionalChance = -5;
        //        break;
        //    case 10: //при обычном ударе или крите с малого пробития
        //        //LogText.text += "10%";
        //        break;
        //    case 15: //при малом пробитии + пассивка
        //        additionalChance = 5;
        //        break;
        //    case 20: //при крите или обычном ударе + пассивка
        //        //LogText.text += "20%";
        //        additionalChance = 10;
        //        break;
        //    //case 25: //если шанс +5%, то при крите с пассивкой
        //    //    additionalChance = 15;
        //    //    break;
        //    case 30: //крит + пассивка
        //        additionalChance = 20;
        //        break;
        //}

        LogText.text += "5. Повреждение частей тела. ";
        bool woundSuccess = ChanceCalculation(chance);

        if (woundSuccess)
        {
            LogText.text += "Ранение прошло. Далее вычисляем, что будем ранить. ";
            if (option == 1)
            {
                if (npc.Scrapper)
                {
                    LogText.text += "У Монстра активна пассивка \"Драчун\". Штрафы превращаются в бонусы.\n\r";
                }



                int randomPart = Random.Range(1, 76);
                while ((npc.DebuffDmg > 0 && randomPart >= 1 && randomPart <= 50) ||
                       (npc.DebuffAcc > 0 && randomPart >= 51 && randomPart <= 60) ||
                       (npc.DebuffEva > 0 && randomPart >= 61 && randomPart <= 75))
                {
                    randomPart = Random.Range(1, 76);
                }
                if (randomPart >= 1 && randomPart <= 50) //руки, лапы и т. д.
                {
                    if (npc.Scrapper)
                    {
                        npc.DebuffDmg = -0.3f;
                        LogText.text += "Герой хотел повредить руки, лапы или что у них там. Не судьба. +30% урона.\n\r";
                    }
                    else
                    {
                        npc.DebuffDmg = 0.3f;
                        LogText.text += "Герой повредил Монстру руки, лапы, или что у них там. -30% урона.\n\r";
                    }
                }

                if (randomPart >= 51 && randomPart <= 60) //голова
                {
                    if (npc.Scrapper)
                    {
                        npc.DebuffDmg = -0.3f;
                        LogText.text += "Герой хотел повредить голову. Не судьба. +30% точности физических атак и +30% урона от магии.\n\r";
                    }
                    else
                    {
                        npc.DebuffAcc = 0.3f;
                        LogText.text += "Герой повредил Монстру голову. -30% точности физических атак и -30% урона от магии.\n\r";
                    }
                }

                if (randomPart >= 61 && randomPart <= 75) //ноги
                {
                    if (npc.Scrapper)
                    {
                        npc.DebuffDmg = -0.3f;
                        LogText.text +=
                            "Герой хотел повредить ногу. Не судьба. +30% уворота.\n\r";
                    }
                    else
                    {
                        npc.DebuffEva = 0.3f;
                        LogText.text += "Герой повредил Монстру ноги. -30% уворота.\n\r";
                    }
                }
                if (!npc.Scrapper)
                {
                    npc.DebuffCount++;
                    LogText.text += "Теперь у Монстра " + npc.DebuffCount + " дебаффa.\n\r";
                }
            }
            else
            {
                int randomPart = Random.Range(1, 76);
                while ((PlayerStats.DebuffRHandPhysDmg > 0 && randomPart >= 1 && randomPart <= 15) ||
                       (PlayerStats.DebuffLDmg && randomPart >= 16 && randomPart <= 30) ||
                       (PlayerStats.DebuffHeadAccPercent > 0 && randomPart >= 31 && randomPart <= 35) ||
                       (PlayerStats.DebuffEvaPercent > 0 && randomPart >= 61 && randomPart <= 75))
                {
                    randomPart = Random.Range(1, 76);
                }
                if (randomPart >= 1 && randomPart <= 10) //правая рука (10%)
                {
                    //float accDebuffPercent = 0.15f; //процент дебаффа
                    PlayerStats.DebuffRHandAccPercent = 15; //дебафф в цифрах
                    PlayerStats.AccuracyPercent      -= PlayerStats.DebuffRHandPhysDmg;
                    if (PlayerStats.AccuracyPercent < 0)
                    {
                        PlayerStats.DebuffRHandAccPercent += PlayerStats.AccuracyPercent; //
                        PlayerStats.AccuracyPercent        = 0;
                    }
                    float dmgDebuffPercent        = 0.15f;
                    int   rightWeaponMinDmgDebuff = Mathf.RoundToInt(PlayerStats.MaxRightWeaponMinDmg * dmgDebuffPercent);
                    int   rightWeaponMaxDmgDebuff = Mathf.RoundToInt(PlayerStats.MaxRightWeaponMaxDmg * dmgDebuffPercent);;
                    PlayerStats.RightWeaponMinDmg -= rightWeaponMinDmgDebuff;
                    PlayerStats.RightWeaponMaxDmg -= rightWeaponMaxDmgDebuff;
                    //PlayerStats.DebuffRHandPhysDmg = Mathf.RoundToInt(PlayerStats.AccuracyPercent * dmgDebuffPercent);
                    LogText.text += "Герою повредили правую руку. -15% урона и 15% точности от правой руки.\n\r";
                }

                if (randomPart >= 11 && randomPart <= 20) //левая рука (10%)
                {
                    //PlayerEquipmentStats.LeftWeaponMinDmg = 0;
                    //PlayerEquipmentStats.LeftShieldBonus = 0;
                    PlayerStats.DebuffLDmg = true;
                    LogText.text          +=
                        "Герою повредили левую руку. Если в левой руке было оружие или щит, оно становится недееспособным.\n\r";
                }

                if (randomPart >= 21 && randomPart <= 25) //голова (5%)
                {
                    PlayerStats.DebuffHeadAccPercent = 20;
                    PlayerStats.AccuracyPercent     -= PlayerStats.DebuffHeadAccPercent;
                    if (PlayerStats.AccuracyPercent < 0)
                    {
                        PlayerStats.DebuffHeadAccPercent += PlayerStats.AccuracyPercent; //
                        PlayerStats.AccuracyPercent       = 0;
                    }
                    //место для магии
                    LogText.text += "Герою повредили голову. -20% точности оружия и -20% урона от магии.\n\r";
                }

                if (randomPart >= 26 && randomPart <= 40) //корпус (15%)
                {
                    //PlayerStats.DebuffEvaPercent = 0.3f;
                    float hpDebuffPercent = 0.15f;
                    int   hpDebuffAmount  = Mathf.RoundToInt(PlayerStats.MaxHp * hpDebuffPercent);
                    PlayerStats.MaxHp -= hpDebuffAmount;
                    LogText.text      += "Герою повредили корпус. -15% здоровья.\n\r";
                }

                if (randomPart >= 41 && randomPart <= 55) //ноги (15%)
                {
                    PlayerStats.DebuffEvaPercent = 20;
                    PlayerStats.EvasionPercent  -= PlayerStats.DebuffEvaPercent;
                    if (PlayerStats.EvasionPercent < 0)
                    {
                        PlayerStats.DebuffEvaPercent += PlayerStats.EvasionPercent; //
                        PlayerStats.EvasionPercent    = 0;
                    }
                    LogText.text += "Герою повредили ноги. -20% уворота.\n\r";
                }
                PlayerStats.DebuffCount++;
                LogText.text += "Теперь у Героя " + PlayerStats.DebuffCount + " дебаффа.\n\r";
            }
        }
        else
        {
            LogText.text += "Ранение не прошло.\n\r";
        }
    }
示例#6
0
        /// <summary>
        ///  guri packet
        /// </summary>
        /// <param name="guriPacket"></param>
        public void Guri(GuriPacket guriPacket)
        {
            if (guriPacket == null)
            {
                return;
            }
            if (guriPacket.Type == 10 && guriPacket.Data >= 973 && guriPacket.Data <= 999 && !Session.Character.EmoticonsBlocked)
            {
                if (guriPacket.User != null && Convert.ToInt64(guriPacket.User.Value) == Session.Character.CharacterId)
                {
                    Session.CurrentMapInstance?.Broadcast(Session, Session.Character.GenerateEff(guriPacket.Data + 4099), ReceiverType.AllNoEmoBlocked);
                }
                else
                {
                    Mate mate = Session.Character.Mates.FirstOrDefault(s => guriPacket.User != null && s.MateTransportId == Convert.ToInt32(guriPacket.User.Value));
                    if (mate != null)
                    {
                        Session.CurrentMapInstance?.Broadcast(Session, mate.GenerateEff(guriPacket.Data + 4099), ReceiverType.AllNoEmoBlocked);
                    }
                }
            }
            else
            {
                switch (guriPacket.Type)
                {
                // SHELL IDENTIFYING
                case 204:
                    if (guriPacket.User == null)
                    {
                        // WRONG PACKET
                        return;
                    }

                    var          inventoryType = (InventoryType)guriPacket.Argument;
                    ItemInstance pearls        = Session.Character.Inventory.FirstOrDefault(s => s.Value.ItemVNum == 1429).Value;
                    var          shell         = (WearableInstance)Session.Character.Inventory.LoadBySlotAndType((short)guriPacket.User.Value, inventoryType);

                    if (pearls == null)
                    {
                        // USING PACKET LOGGER
                        return;
                    }

                    if (shell.EquipmentOptions.Any())
                    {
                        // ALREADY IDENTIFIED
                        Session.SendPacket(UserInterfaceHelper.Instance.GenerateMsg(Language.Instance.GetMessageFromKey("SHELL_ALREADY_IDENTIFIED"), 0));
                        return;
                    }

                    if (!ShellGeneratorHelper.Instance.ShellTypes.TryGetValue(shell.ItemVNum, out byte shellType))
                    {
                        // SHELL TYPE NOT IMPLEMENTED
                        return;
                    }

                    if (shellType != 8 && shellType != 9)
                    {
                        if (shell.Upgrade < 50)
                        {
                            return;
                        }
                    }

                    if (shellType == 8 || shellType == 9)
                    {
                        switch (shell.Upgrade)
                        {
                        case 25:
                        case 30:
                        case 40:
                        case 55:
                        case 60:
                        case 65:
                        case 70:
                        case 75:
                        case 80:
                        case 85:
                            break;

                        default:
                            Session.Character.Inventory.RemoveItemAmountFromInventory(1, shell.Id);
                            Session.SendPacket(UserInterfaceHelper.Instance.GenerateMsg(Language.Instance.GetMessageFromKey("STOP_SPAWNING_BROKEN_SHELL"), 0));
                            return;
                        }
                    }

                    int perlsNeeded = shell.Upgrade / 10 + shell.Rare;

                    if (Session.Character.Inventory.CountItem(pearls.ItemVNum) < perlsNeeded)
                    {
                        // NOT ENOUGH PEARLS
                        return;
                    }

                    List <EquipmentOptionDTO> shellOptions = ShellGeneratorHelper.Instance.GenerateShell(shellType, shell.Rare, shell.Upgrade);

                    if (!shellOptions.Any())
                    {
                        Session.Character.Inventory.RemoveItemAmountFromInventory(1, shell.Id);
                        Session.SendPacket(UserInterfaceHelper.Instance.GenerateMsg(Language.Instance.GetMessageFromKey("STOP_SPAWNING_BROKEN_SHELL"), 0));
                        return;
                    }

                    shell.EquipmentOptions.AddRange(shellOptions);

                    Session.Character.Inventory.RemoveItemAmount(pearls.ItemVNum, perlsNeeded);
                    Session.CurrentMapInstance?.Broadcast(Session, Session.Character.GenerateEff(3006));
                    Session.SendPacket(UserInterfaceHelper.Instance.GenerateMsg(Language.Instance.GetMessageFromKey("SHELL_IDENTIFIED"), 0));
                    break;

                case 205:
                    if (guriPacket.User == null)
                    {
                        return;
                    }
                    const int perfumeVnum          = 1428;
                    var       perfumeInventoryType = (InventoryType)guriPacket.Argument;
                    var       eq = (WearableInstance)Session.Character.Inventory.LoadBySlotAndType((short)guriPacket.User.Value, perfumeInventoryType);

                    if (eq.BoundCharacterId == Session.Character.CharacterId)
                    {
                        // ALREADY YOURS
                        return;
                    }
                    if (eq.ShellRarity == null)
                    {
                        // NO SHELL APPLIED
                        return;
                    }

                    int perfumesNeeded = ShellGeneratorHelper.Instance.PerfumeFromItemLevelAndShellRarity(eq.Item.LevelMinimum, (byte)eq.ShellRarity.Value);
                    if (Session.Character.Inventory.CountItem(perfumeVnum) < perfumesNeeded)
                    {
                        // NOT ENOUGH PEARLS
                        return;
                    }

                    Session.Character.Inventory.RemoveItemAmount(perfumeVnum, perfumesNeeded);
                    eq.BoundCharacterId = Session.Character.CharacterId;
                    break;

                case 300:
                    if (guriPacket.Argument == 8023)
                    {
                        if (guriPacket.User == null)
                        {
                            return;
                        }
                        short        slot = (short)guriPacket.User.Value;
                        ItemInstance box  = Session.Character.Inventory.LoadBySlotAndType <BoxInstance>(slot, InventoryType.Equipment);
                        if (box != null)
                        {
                            if (guriPacket.Data > 0)
                            {
                                box.Item.Use(Session, ref box, 1, new[] { guriPacket.Data.ToString() });
                            }
                            else
                            {
                                box.Item.Use(Session, ref box, 1);
                            }
                        }
                    }
                    break;

                case 501:
                    if (ServerManager.Instance.IceBreakerInWaiting && IceBreaker.Map.Sessions.Count() < IceBreaker.MaxAllowedPlayers)
                    {
                        ServerManager.Instance.TeleportOnRandomPlaceInMap(Session, IceBreaker.Map.MapInstanceId);
                        var group = new Group(GroupType.IceBreaker);
                        if (Session.Character.Group != null)
                        {
                            foreach (var session in Session.Character.Group.Characters)
                            {
                                group.Characters.Add(session);
                            }
                        }
                        else
                        {
                            group.Characters.Add(Session);
                        }
                        IceBreaker.AddGroup(group);
                    }
                    break;

                case 502:
                    long?charid = guriPacket.User;
                    if (charid == null)
                    {
                        return;
                    }
                    ClientSession target = ServerManager.Instance.GetSessionByCharacterId(charid.Value);
                    IceBreaker.FrozenPlayers.Remove(target);
                    IceBreaker.AlreadyFrozenPlayers.Add(target);
                    target.SendPacket(target.Character?.GenerateCond());
                    target.CurrentMapInstance?.Broadcast(
                        UserInterfaceHelper.Instance.GenerateMsg(string.Format(Language.Instance.GetMessageFromKey("ICEBREAKER_PLAYER_UNFROZEN"), target.Character?.Name), 0));
                    if (!IceBreaker.SessionsHaveSameGroup(Session, target))
                    {
                        Group[] groups = { IceBreaker.GetGroupByClientSession(Session), IceBreaker.GetGroupByClientSession(target) };
                        IceBreaker.MergeGroups(groups);
                    }
                    break;

                case 506:
                    if (ServerManager.Instance.EventInWaiting)
                    {
                        Session.Character.IsWaitingForEvent = true;
                    }
                    break;

                case 710:     // Maps Teleporters
                    if (!Session.CurrentMapInstance.Npcs.Any(n => n.MapNpcId.Equals(guriPacket.Data)))
                    {
                        return;
                    }
                    Session.Character.TeleportOnMap((short)guriPacket.Argument, (short)guriPacket.User);
                    break;

                case 711:     // Maps Teleporters
                    TeleporterDTO tp = Session.CurrentMapInstance.Npcs.FirstOrDefault(n => n.Teleporters.Any(t => t?.TeleporterId == guriPacket.Argument))?.Teleporters.FirstOrDefault(t => t?.Type == TeleporterType.TeleportOnOtherMap);
                    if (tp == null)
                    {
                        return;
                    }
                    ServerManager.Instance.ChangeMap(Session.Character.CharacterId, tp.MapId, tp.MapX, tp.MapY);
                    break;

                case 4999:     //RollGeneratedItem for SpecialItem
                    if (guriPacket.Argument == 8023)
                    {
                        if (guriPacket.User == null)
                        {
                            return;
                        }
                        short        slot = (short)guriPacket.User.Value;
                        ItemInstance item = Session.Character.Inventory.LoadBySlotAndType(slot, InventoryType.Main);
                        if (item != null)
                        {
                            if (guriPacket.Data > 0)
                            {
                                item.Item.Use(Session, ref item, 1, new[] { guriPacket.Data.ToString() });
                            }
                            else
                            {
                                item.Item.Use(Session, ref item, 1);
                            }
                        }
                    }
                    break;

                default:
                    if (guriPacket.Type == 199 && guriPacket.Argument == 2)
                    {
                        short[] listWingOfFriendship = { 2160, 2312, 10048 };
                        short   vnumToUse            = -1;
                        foreach (short vnum in listWingOfFriendship)
                        {
                            if (Session.Character.Inventory.CountItem(vnum) > 0)
                            {
                                vnumToUse = vnum;
                            }
                        }
                        if (vnumToUse != -1 || Session.Character.Authority > AuthorityType.User)
                        {
                            if (guriPacket.User == null)
                            {
                                return;
                            }
                            if (!long.TryParse(guriPacket.User.Value.ToString(), out long charId))
                            {
                                return;
                            }
                            ClientSession session = ServerManager.Instance.GetSessionByCharacterId(charId);
                            if (session != null)
                            {
                                if (Session.Character.IsFriendOfCharacter(charId))
                                {
                                    if (session.CurrentMapInstance.MapInstanceType == MapInstanceType.BaseMapInstance)
                                    {
                                        short mapy  = session.Character.PositionY;
                                        short mapx  = session.Character.PositionX;
                                        short mapId = session.Character.MapInstance.Map.MapId;

                                        ServerManager.Instance.ChangeMap(Session.Character.CharacterId, mapId, mapx, mapy);
                                        Session.Character.Inventory.RemoveItemAmount(vnumToUse);
                                    }
                                    else
                                    {
                                        if (session.Character.Faction == Session.Character.Faction && session.Character.MapInstance.MapInstanceType == MapInstanceType.Act4Instance || session.Character.MapInstance.MapInstanceType == MapInstanceType.LobbyMapInstance)
                                        {
                                            short mapy  = session.Character.PositionY;
                                            short mapx  = session.Character.PositionX;
                                            Guid  mapId = session.CurrentMapInstance.MapInstanceId;

                                            ServerManager.Instance.ChangeMapInstance(Session.Character.CharacterId, mapId, mapx, mapy);
                                            Session.Character.Inventory.RemoveItemAmount(vnumToUse);
                                        }
                                        else
                                        {
                                            Session.SendPacket(UserInterfaceHelper.Instance.GenerateMsg(Language.Instance.GetMessageFromKey("USER_ON_INSTANCEMAP"), 0));
                                        }
                                    }
                                }
                            }
                            else
                            {
                                Session.SendPacket(UserInterfaceHelper.Instance.GenerateMsg(Language.Instance.GetMessageFromKey("USER_NOT_CONNECTED"), 0));
                            }
                        }
                        else
                        {
                            Session.SendPacket(Session.Character.GenerateSay(Language.Instance.GetMessageFromKey("NO_WINGS"), 10));
                        }
                    }
                    else
                    {
                        switch (guriPacket.Type)
                        {
                        case 400:
                            if (guriPacket.Argument != 0)
                            {
                                if (!Session.HasCurrentMapInstance)
                                {
                                    return;
                                }
                                MapNpc npc = Session.CurrentMapInstance.Npcs.FirstOrDefault(n => n.MapNpcId.Equals(guriPacket.Argument));
                                if (npc != null)
                                {
                                    NpcMonster mapobject = ServerManager.Instance.GetNpc(npc.NpcVNum);

                                    int rateDrop = ServerManager.Instance.DropRate;
                                    int delay    = (int)Math.Round((3 + mapobject.RespawnTime / 1000d) * Session.Character.TimesUsed);
                                    delay = delay > 11 ? 8 : delay;
                                    if (Session.Character.LastMapObject.AddSeconds(delay) < DateTime.Now)
                                    {
                                        if (mapobject.Drops.Any(s => s.MonsterVNum != null))
                                        {
                                            if (mapobject.VNumRequired > 10 && Session.Character.Inventory.CountItem(mapobject.VNumRequired) < mapobject.AmountRequired)
                                            {
                                                Session.SendPacket(UserInterfaceHelper.Instance.GenerateMsg(Language.Instance.GetMessageFromKey("NOT_ENOUGH_ITEM"), 0));
                                                return;
                                            }
                                        }
                                        var     random       = new Random();
                                        double  randomAmount = ServerManager.Instance.RandomNumber() * random.NextDouble();
                                        DropDTO drop         = mapobject.Drops.FirstOrDefault(s => s.MonsterVNum == npc.NpcVNum);
                                        if (drop != null)
                                        {
                                            short vnum = drop.ItemVNum;
                                            if (npc.NpcVNum == 2004 && npc.IsOut == false)
                                            {
                                                ItemInstance newInv = Session.Character.Inventory.AddNewToInventory(vnum).FirstOrDefault();
                                                if (newInv == null)
                                                {
                                                    return;
                                                }
                                                Session.Character.IncrementQuests(QuestType.Collect1, drop.ItemVNum);
                                                Session.CurrentMapInstance.Broadcast(npc.GenerateOut());
                                                Session.SendPacket(UserInterfaceHelper.Instance.GenerateMsg(string.Format(Language.Instance.GetMessageFromKey("RECEIVED_ITEM"), newInv.Item.Name), 0));
                                                Session.SendPacket(Session.Character.GenerateSay(string.Format(Language.Instance.GetMessageFromKey("RECEIVED_ITEM"), newInv.Item.Name), 11));
                                                return;
                                            }
                                            int dropChance = drop.DropChance;
                                            if (randomAmount <= (double)dropChance * rateDrop / 5000.000)
                                            {
                                                ItemInstance newInv = Session.Character.Inventory.AddNewToInventory(vnum).FirstOrDefault();
                                                Session.Character.LastMapObject = DateTime.Now;
                                                Session.Character.TimesUsed++;
                                                if (Session.Character.TimesUsed >= 4)
                                                {
                                                    Session.Character.TimesUsed = 0;
                                                }
                                                if (newInv != null)
                                                {
                                                    Session.SendPacket(UserInterfaceHelper.Instance.GenerateMsg(
                                                                           string.Format(Language.Instance.GetMessageFromKey("RECEIVED_ITEM"), newInv.Item.Name), 0));
                                                    Session.SendPacket(Session.Character.GenerateSay(string.Format(Language.Instance.GetMessageFromKey("RECEIVED_ITEM"), newInv.Item.Name),
                                                                                                     11));
                                                    Session.Character.IncrementQuests(QuestType.Collect1, vnum);
                                                }
                                                else
                                                {
                                                    Session.SendPacket(UserInterfaceHelper.Instance.GenerateMsg(Language.Instance.GetMessageFromKey("NOT_ENOUGH_PLACE"), 0));
                                                }
                                            }
                                            else
                                            {
                                                Session.SendPacket(UserInterfaceHelper.Instance.GenerateMsg(Language.Instance.GetMessageFromKey("TRY_FAILED"), 0));
                                            }
                                        }
                                    }
                                    else
                                    {
                                        Session.SendPacket(UserInterfaceHelper.Instance.GenerateMsg(
                                                               string.Format(Language.Instance.GetMessageFromKey("TRY_FAILED_WAIT"),
                                                                             (int)(Session.Character.LastMapObject.AddSeconds(delay) - DateTime.Now).TotalSeconds), 0));
                                    }
                                }
                            }
                            break;

                        case 710:
                            if (guriPacket.Value != null)
                            {
                                // MapNpc npc = Session.CurrentMapInstance.Npcs.FirstOrDefault(n =>
                                // n.MapNpcId.Equals(Convert.ToInt16(guriPacket.Data)); NpcMonster mapObject
                                // = ServerManager.Instance.GetNpc(npc.NpcVNum); teleport free
                            }
                            break;

                        case 750:
                            if (!guriPacket.User.HasValue)
                            {
                                const short baseVnum = 1623;
                                if (!short.TryParse(guriPacket.Argument.ToString(), out short faction))
                                {
                                    // WRONG PACKET
                                    return;
                                }
                                if (Session.Character.Inventory.CountItem(baseVnum + faction) < 1)
                                {
                                    // NO EGG
                                    return;
                                }
                                if (faction > 4)
                                {
                                    /*
                                     * Character faction : 1 - 2
                                     * Family faction : 3 - 4
                                     */
                                    return;
                                }
                                if (faction < 3)
                                {
                                    if (Session.Character.Family != null)
                                    {
                                        // CAN'T USE PERSONAL EGG IF IN FAMILY
                                        Session.SendPacket(UserInterfaceHelper.Instance.GenerateMsg(Language.Instance.GetMessageFromKey("CHANGE_CHARACTER_FACTION_IN_FAM"), 0));
                                        return;
                                    }
                                    Session.Character.Faction = (FactionType)faction;
                                    Session.Character.Inventory.RemoveItemAmount(baseVnum + faction);
                                    Session.SendPacket("scr 0 0 0 0 0 0 0");
                                    Session.SendPacket(Session.Character.GenerateFaction());
                                    Session.SendPacket(Session.Character.GenerateEff(4799 + faction));
                                    Session.SendPacket(UserInterfaceHelper.Instance.GenerateMsg(
                                                           Language.Instance.GetMessageFromKey(
                                                               $"GET_PROTECTION_POWER_{faction}"), 0));
                                }
                                else
                                {
                                    if (Session.Character.Family == null)
                                    {
                                        // IF CHARACTER HAS NO FAMILY
                                        Session.SendPacket(UserInterfaceHelper.Instance.GenerateMsg(Language.Instance.GetMessageFromKey("NEED_FAMILY"), 0));
                                        return;
                                    }
                                    if (Session.Character.FamilyCharacter.Authority != FamilyAuthority.Head)
                                    {
                                        // IF IS NOT HEAD OF FAMILY
                                        Session.SendPacket(UserInterfaceHelper.Instance.GenerateMsg(Language.Instance.GetMessageFromKey("NOT_FAMILYHEAD"), 0));
                                        return;
                                    }
                                    FamilyDTO fam = Session.Character.Family;
                                    fam.FamilyFaction         = (byte)(faction / 2);
                                    Session.Character.Faction = (FactionType)(faction / 2);
                                    Session.SendPacket(Session.Character.GenerateFaction());
                                    DaoFactory.FamilyDao.InsertOrUpdate(ref fam);
                                    ServerManager.Instance.FamilyRefresh(Session.Character.Family.FamilyId);
                                    Session.SendPacket(Session.Character.GenerateEff(4799 + faction / 2));
                                    Session.Character.Inventory.RemoveItemAmount(baseVnum + faction);
                                    Session.SendPacket(UserInterfaceHelper.Instance.GenerateMsg(
                                                           Language.Instance.GetMessageFromKey(
                                                               $"GET_PROTECTION_POWER_{faction / 2}"), 0));
                                }
                            }
                            break;

                        case 2:
                            Session.CurrentMapInstance?.Broadcast(UserInterfaceHelper.Instance.GenerateGuri(2, 1, Session.Character.CharacterId), Session.Character.PositionX,
                                                                  Session.Character.PositionY);
                            break;

                        case 4:
                            const int speakerVNum = 2173;
                            const int petnameVNum = 2157;
                            switch (guriPacket.Argument)
                            {
                            case 1:
                                Mate mate = Session.Character.Mates.FirstOrDefault(s => s.MateTransportId == guriPacket.Data);
                                if (guriPacket.Value.Length > 15)
                                {
                                    Session.SendPacket(UserInterfaceHelper.Instance.GenerateInfo(Language.Instance.GetMessageFromKey("NEW_NAME_PET_MAX_LENGTH")));
                                    return;
                                }
                                if (mate != null)
                                {
                                    mate.Name = guriPacket.Value;
                                    Session.CurrentMapInstance.Broadcast(mate.GenerateOut());
                                    Session.CurrentMapInstance.Broadcast(mate.GenerateIn());
                                    Session.SendPacket(UserInterfaceHelper.Instance.GenerateInfo(Language.Instance.GetMessageFromKey("NEW_NAME_PET")));
                                    Session.SendPacket(Session.Character.GeneratePinit());
                                    Session.SendPackets(Session.Character.Mates.Where(s => s.IsTeamMember)
                                                        .OrderBy(s => s.MateType)
                                                        .Select(s => s.GeneratePst()));
                                    Session.SendPackets(Session.Character.GenerateScP());
                                    Session.Character.Inventory.RemoveItemAmount(petnameVNum);
                                }
                                break;

                            case 2:
                                int presentationVNum = Session.Character.Inventory.CountItem(1117) > 0 ? 1117 : (Session.Character.Inventory.CountItem(9013) > 0 ? 9013 : -1);
                                if (presentationVNum != -1)
                                {
                                    string message = string.Empty;

                                    // message = $" ";
                                    string[] valuesplit = guriPacket.Value.Split(' ');
                                    message = valuesplit.Aggregate(message, (current, t) => current + t + "^");
                                    message = message.Substring(0, message.Length - 1);             // Remove the last ^
                                    message = message.Trim();
                                    if (message.Length > 60)
                                    {
                                        message = message.Substring(0, 60);
                                    }

                                    Session.Character.Biography = message;
                                    Session.SendPacket(Session.Character.GenerateSay(Language.Instance.GetMessageFromKey("INTRODUCTION_SET"), 10));
                                    Session.Character.Inventory.RemoveItemAmount(presentationVNum);
                                }
                                break;

                            case 3:
                                if (Session.Character.Inventory.CountItem(speakerVNum) > 0)
                                {
                                    if (Session.Character == null || guriPacket.Value == null)
                                    {
                                        return;
                                    }
                                    string   message    = $"<{Language.Instance.GetMessageFromKey("SPEAKER")}> [{Session.Character.Name}]:";
                                    string[] valuesplit = guriPacket.Value.Split(' ');
                                    message = valuesplit.Aggregate(message, (current, t) => current + t + " ");
                                    if (message.Length > 120)
                                    {
                                        message = message.Substring(0, 120);
                                    }

                                    message = message.Trim();

                                    if (Session.Character.IsMuted())
                                    {
                                        Session.SendPacket(Session.Character.GenerateSay(Language.Instance.GetMessageFromKey("SPEAKER_CANT_BE_USED"), 10));
                                        return;
                                    }
                                    Session.Character.Inventory.RemoveItemAmount(speakerVNum);
                                    ServerManager.Instance.Broadcast(Session.Character.GenerateSay(message, 13));
                                    LogHelper.Instance.InsertChatLog(ChatType.Speaker, Session.Character.CharacterId, message, Session.IpAddress);
                                }
                                break;
                            }

                            // presentation message

                            // Speaker
                            break;

                        default:
                            if (guriPacket.Type == 199 && guriPacket.Argument == 1)
                            {
                                if (guriPacket.User != null && long.TryParse(guriPacket.User.Value.ToString(), out long charId))
                                {
                                    if (!Session.Character.IsFriendOfCharacter(charId))
                                    {
                                        Session.SendPacket(Language.Instance.GetMessageFromKey("CHARACTER_NOT_IN_FRIENDLIST"));
                                        return;
                                    }
                                    Session.SendPacket(UserInterfaceHelper.Instance.GenerateDelay(3000, 4, $"#guri^199^2^{guriPacket.User.Value}"));
                                }
                            }
                            else
                            {
                                switch (guriPacket.Type)
                                {
                                case 201:
                                    if (Session.Character.StaticBonusList.Any(s => s.StaticBonusType == StaticBonusType.PetBasket))
                                    {
                                        Session.SendPacket(Session.Character.GenerateStashAll());
                                    }
                                    break;

                                case 202:
                                    Session.SendPacket(Session.Character.GenerateSay(Language.Instance.GetMessageFromKey("PARTNER_BACKPACK"), 10));
                                    Session.SendPacket(Session.Character.GeneratePStashAll());
                                    break;

                                default:
                                    switch (guriPacket.Type)
                                    {
                                    case 208 when guriPacket.Argument == 0:
                                    {
                                        if (guriPacket.User != null && short.TryParse(guriPacket.User.Value.ToString(), out short pearlSlot) &&
                                            short.TryParse(guriPacket.Value, out short mountSlot))
                                        {
                                            var mount = Session.Character.Inventory.LoadBySlotAndType <ItemInstance>(mountSlot, InventoryType.Main);
                                            var pearl = Session.Character.Inventory.LoadBySlotAndType <BoxInstance>(pearlSlot, InventoryType.Equipment);
                                            if (mount != null && pearl != null)
                                            {
                                                pearl.HoldingVNum = mount.ItemVNum;
                                                Session.Character.Inventory.RemoveItemAmountFromInventory(1, mount.Id);
                                            }
                                        }

                                        break;
                                    }

                                    case 209 when guriPacket.Argument == 0:
                                    {
                                        if (guriPacket.User != null && short.TryParse(guriPacket.User.Value.ToString(), out short pearlSlot) &&
                                            short.TryParse(guriPacket.Value, out short mountSlot))
                                        {
                                            var fairy = Session.Character.Inventory.LoadBySlotAndType <WearableInstance>(mountSlot, InventoryType.Equipment);
                                            var pearl = Session.Character.Inventory.LoadBySlotAndType <BoxInstance>(pearlSlot, InventoryType.Equipment);
                                            if (fairy != null && pearl != null)
                                            {
                                                pearl.HoldingVNum = fairy.ItemVNum;
                                                pearl.ElementRate = fairy.ElementRate;
                                                Session.Character.Inventory.RemoveItemAmountFromInventory(1, fairy.Id);
                                            }
                                        }

                                        break;
                                    }

                                    case 203 when guriPacket.Argument == 0:
                                        // SP points initialization
                                        int[] listPotionResetVNums = { 1366, 1427, 5115, 9040 };
                                        int   vnumToUse            = -1;
                                        foreach (int vnum in listPotionResetVNums)
                                        {
                                            if (Session.Character.Inventory.CountItem(vnum) > 0)
                                            {
                                                vnumToUse = vnum;
                                            }
                                        }
                                        if (vnumToUse != -1)
                                        {
                                            if (Session.Character.UseSp)
                                            {
                                                var specialistInstance =
                                                    Session.Character.Inventory.LoadBySlotAndType <SpecialistInstance>((byte)EquipmentType.Sp, InventoryType.Wear);
                                                if (specialistInstance != null)
                                                {
                                                    specialistInstance.SlDamage  = 0;
                                                    specialistInstance.SlDefence = 0;
                                                    specialistInstance.SlElement = 0;
                                                    specialistInstance.SlHP      = 0;

                                                    specialistInstance.DamageMinimum        = 0;
                                                    specialistInstance.DamageMaximum        = 0;
                                                    specialistInstance.HitRate              = 0;
                                                    specialistInstance.CriticalLuckRate     = 0;
                                                    specialistInstance.CriticalRate         = 0;
                                                    specialistInstance.DefenceDodge         = 0;
                                                    specialistInstance.DistanceDefenceDodge = 0;
                                                    specialistInstance.ElementRate          = 0;
                                                    specialistInstance.DarkResistance       = 0;
                                                    specialistInstance.LightResistance      = 0;
                                                    specialistInstance.FireResistance       = 0;
                                                    specialistInstance.WaterResistance      = 0;
                                                    specialistInstance.CriticalDodge        = 0;
                                                    specialistInstance.CloseDefence         = 0;
                                                    specialistInstance.DistanceDefence      = 0;
                                                    specialistInstance.MagicDefence         = 0;
                                                    specialistInstance.HP = 0;
                                                    specialistInstance.MP = 0;

                                                    Session.Character.Inventory.RemoveItemAmount(vnumToUse);
                                                    Session.Character.Inventory.DeleteFromSlotAndType((byte)EquipmentType.Sp, InventoryType.Wear);
                                                    Session.Character.Inventory.AddToInventoryWithSlotAndType(specialistInstance, InventoryType.Wear, (byte)EquipmentType.Sp);
                                                    Session.SendPacket(Session.Character.GenerateCond());
                                                    Session.SendPacket(specialistInstance.GenerateSlInfo());
                                                    Session.SendPacket(Session.Character.GenerateLev());
                                                    Session.SendPacket(Session.Character.GenerateStatChar());
                                                    Session.SendPacket(UserInterfaceHelper.Instance.GenerateMsg(Language.Instance.GetMessageFromKey("POINTS_RESET"), 0));
                                                }
                                            }
                                            else
                                            {
                                                Session.SendPacket(Session.Character.GenerateSay(Language.Instance.GetMessageFromKey("TRANSFORMATION_NEEDED"), 10));
                                            }
                                        }
                                        else
                                        {
                                            Session.SendPacket(Session.Character.GenerateSay(Language.Instance.GetMessageFromKey("NOT_ENOUGH_POINTS"), 10));
                                        }

                                        break;
                                    }
                                    break;
                                }
                            }
                            break;
                        }
                    }
                    break;
                }
            }
        }
    /* 1 - свиток маг атаки
     * 2 - свиток восстановления
     * 3 - свиток усиления хар.
     * 4 - свиток сна
     */

    void ScrollMechanics(int option, int npcId)
    {
        Text       logText = GameObject.Find("Log Field Text").GetComponent <Text>();
        NpcMonster npc     = BattleMechanics.NpcList[npcId];

        if (npc.CurrentHp == 0 && (option == 1 || option == 4))
        {
            logText.text += npc.Name + " уже недееспособен. Выберите другого противника.\n\r";
            return;
        }
        PlayerStats.PlayerBattlePhase(3, npc);
        if (PlayerStats.CurrentHp == 0)
        {
            BattleMechanics.WhoIsLoosing(npc);
            return;
        }
        //BattleMechanics.PlayerSkillAndBuffCountersCheck();
        switch (option)
        {
        case 1:
            PlayerStats.PlayerMagicAttack(npc, ScrollEffects.ScrollMult, ScrollEffects.ScrollDmg);
            break;

        case 2:
            ScrollEffects.HpScrollMechanic(ScrollEffects.ScrollHp);
            logText.text += "\n\rИспользован свиток лечения. ХП Героя возросло на " + ScrollEffects.ScrollHp +
                            ", теперь у Героя " + PlayerStats.CurrentHp + " ХП.\n\r";
            break;

        case 3:
            if (!PlayerStats.BuffIsActivated)
            {
                ScrollEffects.BoostScrollMechanic(ScrollEffects.ScrollBuff);
                logText.text +=
                    "\n\rИспользован свиток усиления характеристик на 3 хода. Характеристики возросли на " +
                    ScrollEffects.ScrollBuff + ".\n\r";
            }
            else
            {
                logText.text         += "\n\rСвиток усиления характеристик уже действует. Эффект продлён до 3 ходов\n\r";
                PlayerStats.BuffTurns = 3;
            }
            break;

        case 4:
            ScrollEffects.SleepScrollMechanic(npc);
            logText.text += "\n\rИспользован свиток сна. " + npc.Name + " засыпает на 2 хода\n\r";
            break;
        }
        if (npc.CurrentHp == 0) //если боевой свиток убил моба
        {
            //if (BattleMechanics.eZombie)
            //{
            //    BattleMechanics.EnemySkillZombieDied();
            //    logText.text += "Магия убила зомби. Теперь на место зомби встал хозяин.\n\r";
            //    return;
            //}
            if (npc.Reincarnation)
            {
                npc.EnemyReincarnation();
            }
            else
            {
                BattleMechanics.WhoIsLoosing(npc);
            }
        }
        //if (option != 1)//в методе PlayerBattlePhase уже есть атака монстра
        BattleMechanics.AfterPlayerAction();
    }
        private void ExecuteHandler(ClientSession session)
        {
            if (session.Account.IsVerified || Type == 4 && Argument == 11)
            {
                if (Data.HasValue && Type == 10 && Data.Value >= 973 &&
                    Data.Value <= 999 && !session.Character.EmoticonsBlocked)
                {
                    if (Parameter == session.Character.CharacterId)
                    {
                        session.CurrentMapInstance?.Broadcast(session,
                                                              StaticPacketHelper.GenerateEff(UserType.Player, session.Character.CharacterId,
                                                                                             Data.Value + 4099), ReceiverType.AllNoEmoBlocked);
                    }
                    else if (Parameter.TryCastToInt(out int mateTransportId))
                    {
                        Mate mate = session.Character.Mates.Find(s => s.MateTransportId == mateTransportId);
                        if (mate != null)
                        {
                            session.CurrentMapInstance?.Broadcast(session,
                                                                  StaticPacketHelper.GenerateEff(UserType.Npc, mate.MateTransportId,
                                                                                                 Data.Value + 4099), ReceiverType.AllNoEmoBlocked);
                        }
                    }
                }
                else if (Type == 204)
                {
                    if (Argument == 0 && short.TryParse(Parameter.ToString(), out short slot))
                    {
                        ItemInstance shell =
                            session.Character.Inventory.LoadBySlotAndType(slot, InventoryType.Equipment);
                        if (shell?.ShellEffects.Count == 0 && shell.Upgrade > 0 && shell.Rare > 0 &&
                            session.Character.Inventory.CountItem(1429) >= ((shell.Upgrade / 10) + shell.Rare))
                        {
                            shell.SetShellEffects();
                            session.SendPacket(
                                UserInterfaceHelper.GenerateMsg(
                                    Language.Instance.GetMessageFromKey("OPTION_IDENTIFIED"), 0));
                            session.SendPacket(StaticPacketHelper.GenerateEff(UserType.Player,
                                                                              session.Character.CharacterId, 3006));
                            session.Character.Inventory.RemoveItemAmount(1429, (shell.Upgrade / 10) + shell.Rare);
                        }
                    }
                }
                else if (Type == 205)
                {
                    if (Parameter.TryCastToShort(out short slot))
                    {
                        ItemInstance inv = session.Character.Inventory.LoadBySlotAndType(slot, InventoryType.Equipment);
                        if (inv.Rare < 1 || inv.Rare > 8 || inv.Item.LevelMinimum > 99 ||
                            inv.BoundCharacterId == null)
                        {
                            return;
                        }

                        short[][] parfumeReq =
                        {
                            new short[] { 0, 0,  0,  0,  0,   5,  10,  10,  20 },
                            new short[] { 0, 0,  0,  0,  5,  10,  10,  20,  40 },
                            new short[] { 0, 0,  0,  5, 10,  10,  20,  40,  80 },
                            new short[] { 0, 0,  5,  5, 10,  20,  40,  80, 120 },
                            new short[] { 0, 0,  5, 10, 20,  40,  80, 120, 160 },
                            new short[] { 0, 0,  5, 20, 40,  80, 120, 160, 200 },
                            new short[] { 0, 0, 10, 40, 80, 120, 160, 200, 300 },
                            new short[] { 0, 0, 10, 40, 80, 120, 160, 200, 400 }
                        };
                        int[] goldReq =
                        {
                            1000,
                            2000,
                            5000,
                            8000,
                            10000,
                            12500,
                            15000,
                            17500,
                            20000,
                            30000
                        };

                        if (session.Character.Inventory.CountItem(1428)
                            >= parfumeReq[inv.Rare - 1][(inv.Item.LevelMinimum / 10) - 1] &&
                            session.Character.Gold >= goldReq[(inv.Item.LevelMinimum / 10) - 1])
                        {
                            session.Character.Inventory.RemoveItemAmount(1428,
                                                                         parfumeReq[inv.Rare - 1][(inv.Item.LevelMinimum / 10) - 1]);
                            session.Character.Gold -= goldReq[(inv.Item.LevelMinimum / 10) - 1];
                            session.SendPacket(session.Character.GenerateGold());
                            inv.BoundCharacterId = session.Character.CharacterId;
                            session.SendPacket(
                                UserInterfaceHelper.GenerateMsg(
                                    Language.Instance.GetMessageFromKey("SHELL_PERFUMED"), 0));
                        }
                    }
                }
                else if (Type == 300)
                {
                    if (Argument == 8023 && Parameter.TryCastToShort(out short slot))
                    {
                        ItemInstance box = session.Character.Inventory.LoadBySlotAndType(slot, InventoryType.Equipment);
                        if (box != null)
                        {
                            box.Item.Use(session, ref box, 1, new[] { Data?.ToString() ?? string.Empty });
                        }
                    }
                }
                else if (Type == 506)
                {
                    session.Character.IsWaitingForEvent |= ServerManager.Instance.EventInWaiting;
                }
                else if (Type == 199 && Argument == 2)
                {
                    short[] listWingOfFriendship = { 2160, 2312, 10048 };
                    short   vnumToUse            = -1;
                    foreach (short vnum in listWingOfFriendship)
                    {
                        if (session.Character.Inventory.CountItem(vnum) > 0)
                        {
                            vnumToUse = vnum;
                        }
                    }

                    if (vnumToUse != -1 || session.Character.IsSpouseOfCharacter(Parameter))
                    {
                        ClientSession sess = ServerManager.Instance.GetSessionByCharacterId(Parameter);
                        if (sess != null)
                        {
                            if (session.Character.IsFriendOfCharacter(Parameter))
                            {
                                if (sess.CurrentMapInstance?.MapInstanceType == MapInstanceType.BaseMapInstance)
                                {
                                    if (session.Character.MapInstance.MapInstanceType
                                        != MapInstanceType.BaseMapInstance ||
                                        (ServerManager.Instance.ChannelId == 51 &&
                                         session.Character.Faction != sess.Character.Faction))
                                    {
                                        session.SendPacket(
                                            session.Character.GenerateSay(
                                                Language.Instance.GetMessageFromKey("CANT_USE_THAT"), 10));
                                        return;
                                    }

                                    short mapy  = sess.Character.PositionY;
                                    short mapx  = sess.Character.PositionX;
                                    short mapId = sess.Character.MapInstance.Map.MapId;

                                    ServerManager.Instance.ChangeMap(session.Character.CharacterId, mapId, mapx, mapy);
                                    if (!session.Character.IsSpouseOfCharacter(Parameter))
                                    {
                                        session.Character.Inventory.RemoveItemAmount(vnumToUse);
                                    }
                                }
                                else
                                {
                                    session.SendPacket(
                                        UserInterfaceHelper.GenerateMsg(
                                            Language.Instance.GetMessageFromKey("USER_ON_INSTANCEMAP"), 0));
                                }
                            }
                        }
                        else
                        {
                            session.SendPacket(
                                UserInterfaceHelper.GenerateMsg(
                                    Language.Instance.GetMessageFromKey("USER_NOT_CONNECTED"), 0));
                        }
                    }
                    else
                    {
                        session.SendPacket(
                            session.Character.GenerateSay(Language.Instance.GetMessageFromKey("NO_WINGS"), 10));
                    }
                }
                else if (Type == 400)
                {
                    if (!session.HasCurrentMapInstance)
                    {
                        return;
                    }

                    MapNpc npc = session.CurrentMapInstance.Npcs.Find(n => n.MapNpcId.Equals(Argument));
                    if (npc != null)
                    {
                        NpcMonster mapobject = ServerManager.GetNpcMonster(npc.NpcVNum);

                        int rateDrop = ServerManager.Instance.Configuration.RateDrop;
                        int delay    = (int)Math.Round(
                            (3 + (mapobject.RespawnTime / 1000d)) * session.Character.TimesUsed);
                        delay = delay > 11 ? 8 : delay;
                        if (session.Character.LastMapObject.AddSeconds(delay) < DateTime.UtcNow)
                        {
                            if (mapobject.Drops.Any(s => s.MonsterVNum != null) && mapobject.VNumRequired > 10 &&
                                session.Character.Inventory
                                .CountItem(mapobject.VNumRequired)
                                < mapobject.AmountRequired)
                            {
                                session.SendPacket(
                                    UserInterfaceHelper.GenerateMsg(
                                        Language.Instance.GetMessageFromKey("NOT_ENOUGH_ITEM"), 0));
                                return;
                            }

                            Random  random       = new Random();
                            double  randomAmount = ServerManager.RandomNumber() * random.NextDouble();
                            DropDTO drop         = mapobject.Drops.Find(s => s.MonsterVNum == npc.NpcVNum);
                            if (drop != null)
                            {
                                int dropChance = drop.DropChance;
                                if (randomAmount <= (double)dropChance * rateDrop / 5000.000)
                                {
                                    short        vnum   = drop.ItemVNum;
                                    ItemInstance newInv = session.Character.Inventory.AddNewToInventory(vnum)
                                                          .FirstOrDefault();
                                    session.Character.LastMapObject = DateTime.UtcNow;
                                    session.Character.TimesUsed++;
                                    if (session.Character.TimesUsed >= 4)
                                    {
                                        session.Character.TimesUsed = 0;
                                    }

                                    if (newInv != null)
                                    {
                                        session.SendPacket(UserInterfaceHelper.GenerateMsg(
                                                               string.Format(Language.Instance.GetMessageFromKey("RECEIVED_ITEM"),
                                                                             newInv.Item.Name), 0));
                                        session.SendPacket(session.Character.GenerateSay(
                                                               string.Format(Language.Instance.GetMessageFromKey("RECEIVED_ITEM"),
                                                                             newInv.Item.Name), 11));
                                    }
                                    else
                                    {
                                        session.SendPacket(UserInterfaceHelper.GenerateMsg(
                                                               Language.Instance.GetMessageFromKey("NOT_ENOUGH_PLACE"), 0));
                                    }
                                }
                                else
                                {
                                    session.SendPacket(
                                        UserInterfaceHelper.GenerateMsg(
                                            Language.Instance.GetMessageFromKey("TRY_FAILED"), 0));
                                }
                            }
                        }
                        else
                        {
                            session.SendPacket(UserInterfaceHelper.GenerateMsg(
                                                   string.Format(Language.Instance.GetMessageFromKey("TRY_FAILED_WAIT"),
                                                                 (int)(session.Character.LastMapObject.AddSeconds(delay) - DateTime.UtcNow)
                                                                 .TotalSeconds), 0));
                        }
                    }
                }
                else if (Type == 710)
                {
                    if (Value != null)
                    {
                        // TODO: MAP TELEPORTER
                    }
                }
                else if (Type == 750)
                {
                    const short baseVnum = 1623;
                    if (Argument.TryCastToByte(out byte faction) &&
                        (Enum.IsDefined(typeof(FactionType), faction) ||
                         Enum.IsDefined(typeof(FactionType), (byte)(faction / 2))) &&
                        session.Character.Inventory.CountItem(baseVnum + faction) > 0)
                    {
                        if (faction < 3)
                        {
                            if (session.Character.Family != null)
                            {
                                session.SendPacket(
                                    UserInterfaceHelper.GenerateMsg(Language.Instance.GetMessageFromKey("IN_FAMILY"),
                                                                    0));
                                return;
                            }

                            session.Character.Faction = (FactionType)faction;
                            session.Character.Inventory.RemoveItemAmount(baseVnum + faction);
                            session.SendPacket("scr 0 0 0 0 0 0 0");
                            session.SendPacket(session.Character.GenerateFaction());
                            session.SendPacket(StaticPacketHelper.GenerateEff(UserType.Player,
                                                                              session.Character.CharacterId, 4799 + faction));
                            session.SendPacket(UserInterfaceHelper.GenerateMsg(
                                                   Language.Instance.GetMessageFromKey($"GET_PROTECTION_POWER_{faction}"), 0));
                        }
                        else
                        {
                            if (session.Character.Family == null || session.Character.Family.FamilyCharacters
                                .Find(s => s.Authority.Equals(FamilyAuthority.Head))?.CharacterId
                                .Equals(session.Character.CharacterId) != true)
                            {
                                session.SendPacket(
                                    UserInterfaceHelper.GenerateMsg(Language.Instance.GetMessageFromKey("NO_FAMILY"),
                                                                    0));
                                return;
                            }

                            if (session.Character.Family.LastFactionChange > DateTime.UtcNow.AddDays(-1).Ticks)
                            {
                                session.SendPacket(UserInterfaceHelper.GenerateMsg(
                                                       Language.Instance.GetMessageFromKey("CHANGE_NOT PERMITTED"), 0));
                                return;
                            }

                            session.Character.Faction = (FactionType)(faction / 2);
                            session.Character.Inventory.RemoveItemAmount(baseVnum + faction);
                            session.SendPacket("scr 0 0 0 0 0 0 0");
                            session.SendPacket(session.Character.GenerateFaction());
                            session.SendPacket(StaticPacketHelper.GenerateEff(UserType.Player,
                                                                              session.Character.CharacterId, 4799 + (faction / 2)));
                            session.SendPacket(UserInterfaceHelper.GenerateMsg(
                                                   Language.Instance.GetMessageFromKey($"GET_PROTECTION_POWER_{faction / 2}"), 0));
                            session.Character.Family.LastFactionChange = DateTime.UtcNow.Ticks;
                            session.Character.Save();
                            ServerManager.Instance.FamilyRefresh(session.Character.Family.FamilyId);
                            CommunicationServiceClient.Instance.SendMessageToCharacter(new ScsCharacterMessage
                            {
                                DestinationCharacterId = session.Character.Family.FamilyId,
                                SourceCharacterId      = 0,
                                SourceWorldId          = ServerManager.Instance.WorldId,
                                Message = "fhis_stc",
                                Type    = MessageType.Family
                            });
                        }
                    }
                }
                else if (Type == 2)
                {
                    session.CurrentMapInstance?.Broadcast(
                        UserInterfaceHelper.GenerateGuri(2, 1, session.Character.CharacterId),
                        session.Character.PositionX, session.Character.PositionY);
                }
                else if (Type == 4)
                {
                    const int speakerVNum = 2173;
                    const int petnameVNum = 2157;
                    if (Argument == 1 && Data.HasValue)
                    {
                        Mate mate = session.Character.Mates.Find(s => s.MateTransportId == Data.Value);
                        if (mate != null && session.Character.Inventory.CountItem(petnameVNum) > 0)
                        {
                            mate.Name = Value.Truncate(16);
                            session.CurrentMapInstance?.Broadcast(mate.GenerateOut(), ReceiverType.AllExceptMe);
                            session.CurrentMapInstance?.Broadcast(mate.GenerateIn());
                            session.SendPacket(mate.GenerateCond());
                            session.SendPacket(
                                UserInterfaceHelper.GenerateInfo(Language.Instance.GetMessageFromKey("NEW_NAME_PET")));
                            session.SendPacket(session.Character.GeneratePinit());
                            session.SendPackets(session.Character.GeneratePst());
                            session.SendPackets(session.Character.GenerateScP());
                            session.Character.Inventory.RemoveItemAmount(petnameVNum);
                        }
                    }

                    // presentation message
                    if (Argument == 2)
                    {
                        int presentationVNum = session.Character.Inventory.CountItem(1117) > 0
                            ? 1117
                            : (session.Character.Inventory.CountItem(9013) > 0 ? 9013 : -1);
                        if (presentationVNum != -1)
                        {
                            string   message    = string.Empty;
                            string[] valuesplit = Value?.Split(' ');
                            if (valuesplit == null)
                            {
                                return;
                            }

                            for (int i = 0; i < valuesplit.Length; i++)
                            {
                                message += valuesplit[i] + "^";
                            }

                            message = message.Substring(0, message.Length - 1); // Remove the last ^
                            message = message.Trim();
                            if (message.Length > 60)
                            {
                                message = message.Substring(0, 60);
                            }

                            session.Character.Biography = message;
                            session.SendPacket(
                                session.Character.GenerateSay(Language.Instance.GetMessageFromKey("INTRODUCTION_SET"),
                                                              10));
                            session.Character.Inventory.RemoveItemAmount(presentationVNum);
                        }
                    }

                    // Speaker
                    if (Argument == 3 && session.Character.Inventory.CountItem(speakerVNum) > 0)
                    {
                        string message =
                            $"[{session.Character.Name}]:";
                        int      baseLength = message.Length;
                        string[] valuesplit = Value?.Split(' ');
                        if (valuesplit == null)
                        {
                            return;
                        }

                        for (int i = 0; i < valuesplit.Length; i++)
                        {
                            message += valuesplit[i] + " ";
                        }

                        if (message.Length > 120 + baseLength)
                        {
                            message = message.Substring(0, 120 + baseLength);
                        }

                        message = message.Replace("\n", string.Empty).Replace("\r", string.Empty)
                                  .Replace($"<{Language.Instance.GetMessageFromKey("SPEAKER")}>", string.Empty).Trim();
                        message = $"<{Language.Instance.GetMessageFromKey("SPEAKER")}> {message}";
                        if (session.Character.IsMuted())
                        {
                            session.SendPacket(
                                session.Character.GenerateSay(
                                    Language.Instance.GetMessageFromKey("SPEAKER_CANT_BE_USED"), 10));
                            return;
                        }

                        session.Character.Inventory.RemoveItemAmount(speakerVNum);
                        ServerManager.Instance.Broadcast(session.Character.GenerateSay(message, 13));

                        if (ServerManager.Instance.Configuration.UseChatLogService)
                        {
                            ChatLogServiceClient.Instance.LogChatMessage(new ChatLogEntry
                            {
                                Sender      = session.Character.Name,
                                SenderId    = session.Character.CharacterId,
                                Receiver    = null,
                                ReceiverId  = null,
                                MessageType = ChatLogType.Speaker,
                                Message     = message
                            });
                        }
                    }

                    if (Argument == 11 && !string.IsNullOrWhiteSpace(Value) &&
                        !string.IsNullOrWhiteSpace(session.Account.TotpSecret))
                    {
                        Totp totp = new Totp(Base32Encoding.ToBytes(session.Account.TotpSecret));
                        if (totp.VerifyTotp(Value, out long _, VerificationWindow.RfcSpecifiedNetworkDelay))
                        {
                            session.Character.GeneralLogs.Add(new GeneralLogDTO
                            {
                                AccountId = session.Account.AccountId,
                                IpAddress = session.IpAddress,
                                LogType   = GeneralLogType.TOTP.ToString(),
                                LogData   = "SUCCESS",
                                Timestamp = DateTime.UtcNow
                            });
                            session.Account.IsVerified = true;
                            session.SendPacket(session.Character.GenerateSay(Language.Instance.GetMessageFromKey("TOTP_VERIFIED"), 12));
                        }
                        else
                        {
                            session.Character.GeneralLogs.Add(new GeneralLogDTO
                            {
                                AccountId = session.Account.AccountId,
                                IpAddress = session.IpAddress,
                                LogType   = GeneralLogType.TOTP.ToString(),
                                LogData   = "FAIL",
                                Timestamp = DateTime.UtcNow
                            });
                            session.Disconnect();
                        }
                    }
                }
                else if (Type == 199 && Argument == 1)
                {
                    if (!session.Character.IsFriendOfCharacter(Parameter))
                    {
                        session.SendPacket(Language.Instance.GetMessageFromKey("CHARACTER_NOT_IN_FRIENDLIST"));
                        return;
                    }

                    session.SendPacket(UserInterfaceHelper.GenerateDelay(3000, 4, $"#guri^199^2^{Parameter}"));
                }
                else if (Type == 201)
                {
                    if (session.Character.StaticBonusList.Any(s => s.StaticBonusType == StaticBonusType.PetBasket))
                    {
                        session.SendPacket(session.Character.GenerateStashAll());
                    }
                }
                else if (Type == 202)
                {
                    session.SendPacket(
                        session.Character.GenerateSay(Language.Instance.GetMessageFromKey("PARTNER_BACKPACK"), 10));
                    session.SendPacket(session.Character.GeneratePStashAll());
                }
                else if (Type == 208 && Argument == 0)
                {
                    if (short.TryParse(Value, out short mountSlot) &&
                        Parameter.TryCastToShort(out short pearlSlot))
                    {
                        ItemInstance mount =
                            session.Character.Inventory.LoadBySlotAndType <ItemInstance>(mountSlot, InventoryType.Main);
                        ItemInstance pearl =
                            session.Character.Inventory.LoadBySlotAndType(pearlSlot, InventoryType.Equipment);
                        if (mount != null && pearl != null)
                        {
                            pearl.HoldingVNum = mount.ItemVNum;
                            session.Character.Inventory.RemoveItemFromInventory(mount.Id);
                        }
                    }
                }
                else if (Type == 209 && Argument == 0)
                {
                    if (short.TryParse(Value, out short mountSlot) &&
                        Parameter.TryCastToShort(out short pearlSlot))
                    {
                        ItemInstance fairy =
                            session.Character.Inventory.LoadBySlotAndType(mountSlot, InventoryType.Equipment);
                        ItemInstance pearl =
                            session.Character.Inventory.LoadBySlotAndType(pearlSlot, InventoryType.Equipment);
                        if (fairy != null && pearl != null)
                        {
                            pearl.HoldingVNum = fairy.ItemVNum;
                            pearl.ElementRate = fairy.ElementRate;
                            session.Character.Inventory.RemoveItemFromInventory(fairy.Id);
                        }
                    }
                }
                else if (Type == 203 && Argument == 0)
                {
                    // SP points initialization
                    int[] listPotionResetVNums = { 1366, 1427, 5115, 9040 };
                    int   vnumToUse            = -1;
                    foreach (int vnum in listPotionResetVNums)
                    {
                        if (session.Character.Inventory.CountItem(vnum) > 0)
                        {
                            vnumToUse = vnum;
                        }
                    }

                    if (vnumToUse != -1)
                    {
                        if (session.Character.UseSp)
                        {
                            ItemInstance specialistInstance =
                                session.Character.Inventory.LoadBySlotAndType((byte)EquipmentType.Sp,
                                                                              InventoryType.Wear);
                            if (specialistInstance != null)
                            {
                                specialistInstance.SlDamage  = 0;
                                specialistInstance.SlDefence = 0;
                                specialistInstance.SlElement = 0;
                                specialistInstance.SlHP      = 0;

                                specialistInstance.DamageMinimum        = 0;
                                specialistInstance.DamageMaximum        = 0;
                                specialistInstance.HitRate              = 0;
                                specialistInstance.CriticalLuckRate     = 0;
                                specialistInstance.CriticalRate         = 0;
                                specialistInstance.DefenceDodge         = 0;
                                specialistInstance.DistanceDefenceDodge = 0;
                                specialistInstance.ElementRate          = 0;
                                specialistInstance.DarkResistance       = 0;
                                specialistInstance.LightResistance      = 0;
                                specialistInstance.FireResistance       = 0;
                                specialistInstance.WaterResistance      = 0;
                                specialistInstance.CriticalDodge        = 0;
                                specialistInstance.CloseDefence         = 0;
                                specialistInstance.DistanceDefence      = 0;
                                specialistInstance.MagicDefence         = 0;
                                specialistInstance.HP = 0;
                                specialistInstance.MP = 0;

                                session.Character.Inventory.RemoveItemAmount(vnumToUse);
                                session.Character.Inventory.DeleteFromSlotAndType((byte)EquipmentType.Sp,
                                                                                  InventoryType.Wear);
                                session.Character.Inventory.AddToInventoryWithSlotAndType(specialistInstance,
                                                                                          InventoryType.Wear, (byte)EquipmentType.Sp);
                                session.SendPacket(session.Character.GenerateCond());
                                session.SendPacket(specialistInstance.GenerateSlInfo());
                                session.SendPacket(session.Character.GenerateLev());
                                session.SendPacket(session.Character.GenerateStatChar());
                                session.SendPacket(
                                    UserInterfaceHelper.GenerateMsg(Language.Instance.GetMessageFromKey("POINTS_RESET"),
                                                                    0));
                            }
                        }
                        else
                        {
                            session.SendPacket(
                                session.Character.GenerateSay(
                                    Language.Instance.GetMessageFromKey("TRANSFORMATION_NEEDED"), 10));
                        }
                    }
                    else
                    {
                        session.SendPacket(
                            session.Character.GenerateSay(Language.Instance.GetMessageFromKey("NOT_ENOUGH_POINTS"),
                                                          10));
                    }
                }
            }
        private void ExecuteHandler(ClientSession session)
        {
            switch (Type)
            {
            // characters
            case 1:
                session.SendPacket(ServerManager.Instance.GetSessionByCharacterId(TargetId)?.Character
                                   ?.GenerateStatInfo());
                break;

            // npcs/mates
            case 2:
                if (session.HasCurrentMapInstance)
                {
                    session.CurrentMapInstance.Npcs.Where(n => n.MapNpcId == (int)TargetId).ToList()
                    .ForEach(npc =>
                    {
                        NpcMonster npcinfo = ServerManager.GetNpcMonster(npc.NpcVNum);
                        if (npcinfo == null)
                        {
                            return;
                        }

                        session.Character.LastNpcMonsterId = npc.MapNpcId;
                        session.SendPacket(
                            $"st 2 {TargetId} {npcinfo.Level} {npcinfo.HeroLevel} 100 100 50000 50000");
                    });
                    Parallel.ForEach(session.CurrentMapInstance.Sessions, sess =>
                    {
                        Mate mate = sess.Character.Mates.Find(
                            s => s.MateTransportId == (int)TargetId);
                        if (mate != null)
                        {
                            session.SendPacket(mate.GenerateStatInfo());
                        }
                    });
                }

                break;

            // monsters
            case 3:
                if (session.HasCurrentMapInstance)
                {
                    session.CurrentMapInstance.Monsters.Where(m => m.MapMonsterId == (int)TargetId)
                    .ToList().ForEach(monster =>
                    {
                        NpcMonster monsterinfo = ServerManager.GetNpcMonster(monster.MonsterVNum);
                        if (monsterinfo == null)
                        {
                            return;
                        }

                        session.Character.LastNpcMonsterId = monster.MapMonsterId;
                        session.SendPacket(
                            $"st 3 {TargetId} {monsterinfo.Level} {monsterinfo.HeroLevel} {(int)(monster.CurrentHp / (float)monster.MaxHp * 100)} {(int)(monster.CurrentMp / (float)monster.MaxMp * 100)} {monster.CurrentHp} {monster.CurrentMp}{monster.Buff.GetAllItems().Aggregate(string.Empty, (current, buff) => current + $" {buff.Card.CardId}")}");
                    });
                }

                break;
            }
        }
示例#10
0
        public void TargetHit(int castingId, int targetId)
        {
            IList <string> broadcastPackets = new List <string>();

            List <CharacterSkill> skills = Session.Character.UseSp ? Session.Character.SkillsSp.GetAllItems() : Session.Character.Skills.GetAllItems();
            bool notcancel = false;

            if ((DateTime.Now - Session.Character.LastTransform).TotalSeconds < 3)
            {
                Session.SendPacket("cancel 0 0");
                Session.SendPacket(Session.Character.GenerateMsg(Language.Instance.GetMessageFromKey("CANT_ATTACK"), 0));
                return;
            }
            if (skills != null)
            {
                ushort         damage  = 0;
                int            hitmode = 0;
                CharacterSkill ski     = skills.FirstOrDefault(s => s.Skill?.CastId == castingId && s.Skill?.UpgradeSkill == 0);
                Session.SendPacket("ms_c 0");
                if (!Session.Character.WeaponLoaded(ski))
                {
                    Session.SendPacket("cancel 2 0");
                    return;
                }
                for (int i = 0; i < 10 && !ski.CanBeUsed(); i++)
                {
                    Thread.Sleep(100);
                    if (i == 10)
                    {
                        Session.SendPacket("cancel 2 0");
                        return;
                    }
                }

                if (ski != null && Session.Character.Mp >= ski.Skill.MpCost)
                {
                    if (ski.Skill.TargetType == 1 && ski.Skill.HitType == 1)
                    {
                        Session.Character.LastSkillUse = DateTime.Now;
                        if (!Session.Character.HasGodMode)
                        {
                            Session.Character.Mp -= ski.Skill.MpCost;
                        }
                        if (Session.Character.UseSp && ski.Skill.CastEffect != -1)
                        {
                            Session.SendPackets(Session.Character.GenerateQuicklist());
                        }

                        Session.SendPacket(Session.Character.GenerateStat());
                        CharacterSkill skillinfo = Session.Character.Skills.GetAllItems().OrderBy(o => o.SkillVNum).FirstOrDefault(s => s.Skill.UpgradeSkill == ski.Skill.SkillVNum && s.Skill.Effect > 0 && s.Skill.SkillType == 2);
                        Session.CurrentMap?.Broadcast($"ct 1 {Session.Character.CharacterId} 1 {Session.Character.CharacterId} {ski.Skill.CastAnimation} {(skillinfo != null ? skillinfo.Skill.CastEffect : ski.Skill.CastEffect)} {ski.Skill.SkillVNum}");

                        // Generate scp
                        ski.LastUse = DateTime.Now;
                        if (ski.Skill.CastEffect != 0)
                        {
                            Thread.Sleep(ski.Skill.CastTime * 100);
                        }
                        notcancel = true;
                        MapMonster mmon;
                        broadcastPackets.Add($"su 1 {Session.Character.CharacterId} 1 {Session.Character.CharacterId} {ski.Skill.SkillVNum} {ski.Skill.Cooldown} {ski.Skill.AttackAnimation} {(skillinfo != null ? skillinfo.Skill.Effect : ski.Skill.Effect)} {Session.Character.MapX} {Session.Character.MapY} 1 {((int)((double)Session.Character.Hp / Session.Character.HPLoad()) * 100)} 0 -2 {ski.Skill.SkillType - 1}");
                        if (ski.Skill.TargetRange != 0)
                        {
                            foreach (MapMonster mon in Session.CurrentMap.GetListMonsterInRange(Session.Character.MapX, Session.Character.MapY, ski.Skill.TargetRange).Where(s => s.CurrentHp > 0))
                            {
                                mmon = Session.CurrentMap.GetMonster(mon.MapMonsterId);
                                if (mmon != null)
                                {
                                    damage = GenerateDamage(mon.MapMonsterId, ski.Skill, ref hitmode);
                                    broadcastPackets.Add($"su 1 {Session.Character.CharacterId} 3 {mmon.MapMonsterId} {ski.Skill.SkillVNum} {ski.Skill.Cooldown} {ski.Skill.AttackAnimation} {(skillinfo != null ? skillinfo.Skill.Effect : ski.Skill.Effect)} {Session.Character.MapX} {Session.Character.MapY} {(mmon.IsAlive ? 1 : 0)} {(int)(((float)mmon.CurrentHp / (float)mon.Monster.MaxHP) * 100)} {damage} 5 {ski.Skill.SkillType - 1}");
                                    Task.Factory.StartNew(() => { GenerateKillBonus(mon.MapMonsterId); });
                                }
                            }
                        }
                    }
                    else if (ski.Skill.TargetType == 0)
                    {
                        // if monster target
                        MapMonster monsterToAttack = Session.CurrentMap.GetMonster(targetId);
                        if (monsterToAttack != null && monsterToAttack.IsAlive)
                        {
                            NpcMonster monsterToAttackInfo = ServerManager.GetNpc(monsterToAttack.MonsterVNum);
                            if (monsterToAttack != null && ski != null && ski.CanBeUsed())
                            {
                                if (Session.Character.Mp >= ski.Skill.MpCost)
                                {
                                    short distanceX = (short)(Session.Character.MapX - monsterToAttack.MapX);
                                    short distanceY = (short)(Session.Character.MapY - monsterToAttack.MapY);

                                    if (Map.GetDistance(new MapCell()
                                    {
                                        X = Session.Character.MapX, Y = Session.Character.MapY
                                    },
                                                        new MapCell()
                                    {
                                        X = monsterToAttack.MapX, Y = monsterToAttack.MapY
                                    }) <= ski.Skill.Range + (DateTime.Now - monsterToAttack.LastMove).TotalSeconds * 2 * (monsterToAttackInfo.Speed == 0 ? 1 : monsterToAttackInfo.Speed) || ski.Skill.TargetRange != 0)
                                    {
                                        Session.Character.LastSkillUse = DateTime.Now;
                                        damage = GenerateDamage(monsterToAttack.MapMonsterId, ski.Skill, ref hitmode);

                                        ski.LastUse = DateTime.Now;
                                        Task.Factory.StartNew(() => { GenerateKillBonus(monsterToAttack.MapMonsterId); });
                                        notcancel = true;
                                        if (!Session.Character.HasGodMode)
                                        {
                                            Session.Character.Mp -= ski.Skill.MpCost;
                                        }
                                        if (Session.Character.UseSp && ski.Skill.CastEffect != -1)
                                        {
                                            Session.SendPackets(Session.Character.GenerateQuicklist());
                                        }
                                        Session.SendPacket(Session.Character.GenerateStat());
                                        CharacterSkill characterSkillInfo = Session.Character.Skills.GetAllItems().OrderBy(o => o.SkillVNum).FirstOrDefault(s => s.Skill.UpgradeSkill == ski.Skill.SkillVNum && s.Skill.Effect > 0 && s.Skill.SkillType == 2);
                                        Session.CurrentMap?.Broadcast($"ct 1 {Session.Character.CharacterId} 3 {monsterToAttack.MapMonsterId} {ski.Skill.CastAnimation} {(characterSkillInfo != null ? characterSkillInfo.Skill.CastEffect : ski.Skill.CastEffect)} {ski.Skill.SkillVNum}");
                                        Session.Character.Skills.GetAllItems().Where(s => s.Id != ski.Id).ToList().ForEach(i => i.Hit = 0);

                                        // Generate scp
                                        ski.LastUse = DateTime.Now;
                                        if (damage == 0 || (DateTime.Now - ski.LastUse).TotalSeconds > 3)
                                        {
                                            ski.Hit = 0;
                                        }
                                        else
                                        {
                                            ski.Hit++;
                                        }
                                        if (ski.Skill.CastEffect != 0)
                                        {
                                            Thread.Sleep(ski.Skill.CastTime * 100);
                                        }

                                        ComboDTO skillCombo = ski.Skill.Combos.FirstOrDefault(s => ski.Hit == s.Hit);
                                        if (skillCombo != null)
                                        {
                                            if (ski.Skill.Combos.OrderByDescending(s => s.Hit).ElementAt(0).Hit == ski.Hit)
                                            {
                                                ski.Hit = 0;
                                            }
                                            broadcastPackets.Add($"su 1 {Session.Character.CharacterId} 3 {monsterToAttack.MapMonsterId} {ski.Skill.SkillVNum} {ski.Skill.Cooldown} {skillCombo.Animation} {skillCombo.Effect} {Session.Character.MapX} {Session.Character.MapY} {(monsterToAttack.IsAlive ? 1 : 0)} {(int)(((float)monsterToAttack.CurrentHp / (float)monsterToAttackInfo.MaxHP) * 100)} {damage} {hitmode} {ski.Skill.SkillType - 1}");
                                        }
                                        else
                                        {
                                            broadcastPackets.Add($"su 1 {Session.Character.CharacterId} 3 {monsterToAttack.MapMonsterId} {ski.Skill.SkillVNum} {ski.Skill.Cooldown} {ski.Skill.AttackAnimation} {(characterSkillInfo != null ? characterSkillInfo.Skill.Effect : ski.Skill.Effect)} {Session.Character.MapX} {Session.Character.MapY} {(monsterToAttack.IsAlive ? 1 : 0)} {(int)(((float)monsterToAttack.CurrentHp / (float)monsterToAttackInfo.MaxHP) * 100)} {damage} {hitmode} {ski.Skill.SkillType - 1}");
                                        }
                                        if (ski.Skill.TargetRange != 0)
                                        {
                                            IEnumerable <MapMonster> monstersInAOERange = Session.CurrentMap?.GetListMonsterInRange(monsterToAttack.MapX, monsterToAttack.MapY, ski.Skill.TargetRange).ToList();
                                            foreach (MapMonster mon in monstersInAOERange.Where(s => s.CurrentHp > 0))
                                            {
                                                damage = GenerateDamage(mon.MapMonsterId, ski.Skill, ref hitmode);
                                                broadcastPackets.Add($"su 1 {Session.Character.CharacterId} 3 {mon.MapMonsterId} {ski.Skill.SkillVNum} {ski.Skill.Cooldown} {ski.Skill.AttackAnimation} {(characterSkillInfo != null ? characterSkillInfo.Skill.Effect : ski.Skill.Effect)} {Session.Character.MapX} {Session.Character.MapY} {(mon.IsAlive ? 1 : 0)} {(int)(((float)mon.CurrentHp / (float)ServerManager.GetNpc(mon.MonsterVNum).MaxHP) * 100)} {damage} 5 {ski.Skill.SkillType - 1}");
                                                Task.Factory.StartNew(() => { GenerateKillBonus(mon.MapMonsterId); });
                                            }
                                        }
                                    }
                                }
                            }
                        }
                    }

                    // send su packets
                    Session.CurrentMap.Broadcast(broadcastPackets.ToArray());

                    Task t = Task.Factory.StartNew((Func <Task>)(async() =>
                    {
                        await Task.Delay((ski.Skill.Cooldown) * 100);
                        Session.SendPacket($"sr {castingId}");
                    }));
                }
                else
                {
                    notcancel = false;
                    Session.SendPacket(Session.Character.GenerateSay(Language.Instance.GetMessageFromKey("NOT_ENOUGH_MP"), 10));
                }
            }
            if (!notcancel)
            {
                Session.SendPacket($"cancel 2 {targetId}");
            }
        }
示例#11
0
        private void ExecuteHandler(ClientSession session)
        {
            if (_isParsed)
            {
                Logger.LogUserEvent("GMCOMMAND", session.GenerateIdentity(),
                                    $"[SummonNPC]NpcMonsterVNum: {NpcMonsterVNum} Amount: {Amount} IsMoving: {IsMoving}");

                if (session.IsOnMap && session.HasCurrentMapInstance)
                {
                    NpcMonster npcmonster = ServerManager.GetNpcMonster(NpcMonsterVNum);
                    if (npcmonster == null)
                    {
                        return;
                    }

                    Random random = new Random();
                    for (int i = 0; i < Amount; i++)
                    {
                        List <MapCell> possibilities = new List <MapCell>();
                        for (short x = -4; x < 5; x++)
                        {
                            for (short y = -4; y < 5; y++)
                            {
                                possibilities.Add(new MapCell {
                                    X = x, Y = y
                                });
                            }
                        }

                        foreach (MapCell possibilitie in possibilities.OrderBy(s => random.Next()))
                        {
                            short mapx = (short)(session.Character.PositionX + possibilitie.X);
                            short mapy = (short)(session.Character.PositionY + possibilitie.Y);
                            if (!session.CurrentMapInstance?.Map.IsBlockedZone(mapx, mapy) ?? false)
                            {
                                break;
                            }
                        }

                        if (session.CurrentMapInstance != null)
                        {
                            MapNpc npc = new MapNpc
                            {
                                NpcVNum  = NpcMonsterVNum,
                                MapY     = session.Character.PositionY,
                                MapX     = session.Character.PositionX,
                                MapId    = session.Character.MapInstance.Map.MapId,
                                Position = session.Character.Direction,
                                IsMoving = IsMoving,
                                MapNpcId = session.CurrentMapInstance.GetNextNpcId()
                            };
                            npc.Initialize(session.CurrentMapInstance);
                            session.CurrentMapInstance.AddNpc(npc);
                            session.CurrentMapInstance.Broadcast(npc.GenerateIn());
                        }
                    }
                }
            }
            else
            {
                session.SendPacket(session.Character.GenerateSay(ReturnHelp(), 10));
            }
        }
示例#12
0
        public void ApplyBCards(IBattleEntity session, IBattleEntity caster = null)
        {
            Mate mate;

            switch ((BCardType.CardType)Type)
            {
            case BCardType.CardType.Buff:
                if (ServerManager.Instance.RandomNumber() < FirstData)
                {
                    session?.BattleEntity.AddBuff(new Buff(SecondData, caster?.BattleEntity.Level ?? session.BattleEntity.Level));
                }
                break;

            case BCardType.CardType.Move:
                if (session.GetSession() is Character chara)
                {
                    chara.LastSpeedChange = DateTime.Now;
                    chara.LoadSpeed();
                    chara?.Session.SendPacket(chara.GenerateCond());
                }
                break;

            case BCardType.CardType.Summons:
                NpcMonster npcMonster = session.GetSession() is MapMonster mob ? mob.Monster : session.GetSession() is MapNpc npc ? npc.Npc : null;
                ConcurrentBag <ToSummon> summonParameters = new ConcurrentBag <ToSummon>();

                switch ((AdditionalTypes.Summons)SubType)
                {
                case AdditionalTypes.Summons.Summons:
                    for (int i = 0; i < FirstData; i++)
                    {
                        MapCell cell = session.GetPos();
                        cell.Y += (short)ServerManager.Instance.RandomNumber(-3, 3);
                        cell.X += (short)ServerManager.Instance.RandomNumber(-3, 3);
                        summonParameters.Add(new ToSummon((short)SecondData, cell, null, true, (byte)Math.Abs(ThirdData)));
                    }
                    EventHelper.Instance.RunEvent(new EventContainer(session.MapInstance, EventActionType.SPAWNMONSTERS, summonParameters));
                    break;

                case AdditionalTypes.Summons.SummonTrainingDummy:
                    if (npcMonster != null && session.BattleEntity.OnHitEvents.All(s => s?.EventActionType != EventActionType.SPAWNMONSTERS))
                    {
                        summonParameters.Add(new ToSummon((short)SecondData, session.GetPos(), null, true, (byte)Math.Abs(ThirdData)));
                        session.BattleEntity.OnHitEvents.Add(new EventContainer(session.MapInstance, EventActionType.SPAWNMONSTERS, summonParameters));
                    }
                    break;

                case AdditionalTypes.Summons.SummonUponDeathChance:
                case AdditionalTypes.Summons.SummonUponDeath:
                    if (npcMonster != null && session.BattleEntity.OnDeathEvents.All(s => s?.EventActionType != EventActionType.SPAWNMONSTERS))
                    {
                        for (int i = 0; i < FirstData; i++)
                        {
                            MapCell cell = session.GetPos();
                            cell.Y += (short)i;
                            summonParameters.Add(new ToSummon((short)SecondData, cell, null, true, (byte)Math.Abs(ThirdData)));
                        }
                        session.BattleEntity.OnDeathEvents.Add(new EventContainer(session.MapInstance, EventActionType.SPAWNMONSTERS, summonParameters));
                    }
                    break;

                default:
                    break;
                }
                break;

            case BCardType.CardType.SpecialAttack:
                break;

            case BCardType.CardType.SpecialDefence:
                break;

            case BCardType.CardType.AttackPower:
                break;

            case BCardType.CardType.Target:
                break;

            case BCardType.CardType.Critical:
                break;

            case BCardType.CardType.SpecialCritical:
                break;

            case BCardType.CardType.Element:
                break;

            case BCardType.CardType.IncreaseDamage:
                break;

            case BCardType.CardType.Defence:
                break;

            case BCardType.CardType.DodgeAndDefencePercent:
                break;

            case BCardType.CardType.Block:
                break;

            case BCardType.CardType.Absorption:
                break;

            case BCardType.CardType.ElementResistance:
                break;

            case BCardType.CardType.EnemyElementResistance:
                break;

            case BCardType.CardType.Damage:
                break;

            case BCardType.CardType.GuarantedDodgeRangedAttack:
                break;

            case BCardType.CardType.Morale:
                break;

            case BCardType.CardType.Casting:
                break;

            case BCardType.CardType.Reflection:
                break;

            case BCardType.CardType.DrainAndSteal:
                break;

            case BCardType.CardType.HealingBurningAndCasting:
                var       subtype = (AdditionalTypes.HealingBurningAndCasting)SubType;
                Character sess;
                switch (subtype)
                {
                case AdditionalTypes.HealingBurningAndCasting.RestoreHP:
                case AdditionalTypes.HealingBurningAndCasting.RestoreHPWhenCasting:
                    if (session.GetSession() is Character)
                    {
                        sess = (Character)session.GetSession();
                        int  heal   = FirstData;
                        bool change = false;
                        if (IsLevelScaled)
                        {
                            if (IsLevelDivided)
                            {
                                heal /= sess.Level;
                            }
                            else
                            {
                                heal *= sess.Level;
                            }
                        }
                        if (sess.Hp + heal < sess.HpLoad())
                        {
                            sess.Hp += heal;
                            sess.Session?.CurrentMapInstance?.Broadcast(sess.GenerateRc(heal));
                            change = true;
                        }
                        else
                        {
                            if (sess.Hp != (int)sess.HpLoad())
                            {
                                sess.Session?.CurrentMapInstance?.Broadcast(sess.GenerateRc((int)(sess.HpLoad() - sess.Hp)));
                                change = true;
                            }
                            sess.Hp = (int)sess.HpLoad();
                        }
                        if (change)
                        {
                            sess.Session?.SendPacket(sess.GenerateStat());
                        }
                    }

                    if (session.GetSession() is Mate)
                    {
                        mate = (Mate)session.GetSession();
                        int heal = FirstData;
                        if (IsLevelScaled)
                        {
                            if (IsLevelDivided)
                            {
                                heal /= mate.Level;
                            }
                            else
                            {
                                heal *= mate.Level;
                            }
                        }
                        if (mate.Hp + heal < mate.HpLoad())
                        {
                            mate.Hp += heal;
                        }
                        else
                        {
                            mate.Hp = mate.HpLoad();
                        }
                    }

                    break;

                case AdditionalTypes.HealingBurningAndCasting.RestoreMP:
                    if (session.GetSession() is Character)
                    {
                        sess = (Character)session.GetSession();
                        int  heal   = FirstData;
                        bool change = false;
                        if (IsLevelScaled)
                        {
                            if (IsLevelDivided)
                            {
                                heal /= sess.Level;
                            }
                            else
                            {
                                heal *= sess.Level;
                            }
                        }
                        if (sess.Mp + heal < sess.MpLoad())
                        {
                            sess.Mp += heal;
                            change   = true;
                        }
                        else
                        {
                            if (sess.Mp != (int)sess.MpLoad())
                            {
                                change = true;
                            }
                            sess.Mp = (int)sess.MpLoad();
                        }
                        if (change)
                        {
                            sess.Session?.SendPacket(sess.GenerateStat());
                        }
                    }

                    if (session.GetSession() is Mate)
                    {
                        mate = (Mate)session.GetSession();
                        int heal = FirstData;
                        if (IsLevelScaled)
                        {
                            if (IsLevelDivided)
                            {
                                heal /= mate.Level;
                            }
                            else
                            {
                                heal *= mate.Level;
                            }
                        }
                        if (mate.Mp + heal < mate.MpLoad())
                        {
                            mate.Mp += heal;
                        }
                        else
                        {
                            mate.Mp = mate.MpLoad();
                        }
                    }
                    break;
                }
                break;

            case BCardType.CardType.HPMP:
                break;

            case BCardType.CardType.SpecialisationBuffResistance:
                break;

            case BCardType.CardType.SpecialEffects:
                break;

            case BCardType.CardType.Capture:
                if (session is MapMonster monsterToCapture && caster is Character hunter)
                {
                    if (monsterToCapture.Monster.RaceType == 1 && (hunter.MapInstance.MapInstanceType == MapInstanceType.BaseMapInstance || hunter.MapInstance.MapInstanceType == MapInstanceType.TimeSpaceInstance))
                    {
                        if (monsterToCapture.Monster.Level < hunter.Level)
                        {
                            if (monsterToCapture.CurrentHp < (monsterToCapture.Monster.MaxHP / 2))
                            {
                                if (hunter.MaxMateCount > hunter.Mates.Count())
                                {
                                    // Algo
                                    int capturerate = 100 - (monsterToCapture.CurrentHp / monsterToCapture.Monster.MaxHP + 1) / 2;
                                    if (ServerManager.Instance.RandomNumber() <= capturerate)
                                    {
                                        if (hunter.Quests.Any(q => q.Quest.QuestType == (int)QuestType.Capture1 && q.Quest.QuestObjectives.Any(d => d.Data == monsterToCapture.MonsterVNum)))
                                        {
                                            hunter.IncrementQuests(QuestType.Capture1, monsterToCapture.MonsterVNum);
                                            return;
                                        }
                                        hunter.IncrementQuests(QuestType.Capture2, monsterToCapture.MonsterVNum);
                                        int  level       = monsterToCapture.Monster.Level - 15 < 1 ? 1 : monsterToCapture.Monster.Level - 15;
                                        Mate currentmate = hunter.Mates?.FirstOrDefault(m => m.IsTeamMember && m.MateType == MateType.Pet);
                                        if (currentmate != null)
                                        {
                                            currentmate.RemoveTeamMember();     // remove current pet
                                            hunter.MapInstance.Broadcast(currentmate.GenerateOut());
                                        }
                                        monsterToCapture.MapInstance.DespawnMonster(monsterToCapture);
                                        NpcMonster mateNpc = ServerManager.Instance.GetNpc(monsterToCapture.MonsterVNum);
                                        mate = new Mate(hunter, mateNpc, (byte)level, MateType.Pet);
                                        hunter.Mates?.Add(mate);
                                        mate.RefreshStats();
                                        hunter.Session.SendPacket($"ctl 2 {mate.PetId} 3");
                                        hunter.MapInstance.Broadcast(mate.GenerateIn());
                                        hunter.Session.SendPacket(hunter.GenerateSay(string.Format(Language.Instance.GetMessageFromKey("YOU_GET_PET"), mate.Name), 0));
                                        hunter.Session.SendPacket(UserInterfaceHelper.Instance.GeneratePClear());
                                        hunter.Session.SendPackets(hunter.GenerateScP());
                                        hunter.Session.SendPackets(hunter.GenerateScN());
                                        hunter.Session.SendPacket(hunter.GeneratePinit());
                                        hunter.Session.SendPackets(hunter.Mates.Where(s => s.IsTeamMember)
                                                                   .OrderBy(s => s.MateType)
                                                                   .Select(s => s.GeneratePst()));
                                    }
                                    else
                                    {
                                        hunter.Session.SendPacket(UserInterfaceHelper.Instance.GenerateMsg(Language.Instance.GetMessageFromKey("CAPTURE_FAILED"), 0));
                                    }
                                }
                                else
                                {
                                    hunter.Session.SendPacket(UserInterfaceHelper.Instance.GenerateMsg(Language.Instance.GetMessageFromKey("MAX_MATES_COUNT"), 0));
                                }
                            }
                            else
                            {
                                hunter.Session.SendPacket(UserInterfaceHelper.Instance.GenerateMsg(Language.Instance.GetMessageFromKey("monsterToCapture_MUST_BE_LOW_HP"), 0));
                            }
                        }
                        else
                        {
                            hunter.Session.SendPacket(UserInterfaceHelper.Instance.GenerateMsg(Language.Instance.GetMessageFromKey("monsterToCapture_LVL_MUST_BE_LESS"), 0));
                        }
                    }
                    else
                    {
                        hunter.Session.SendPacket(UserInterfaceHelper.Instance.GenerateMsg(Language.Instance.GetMessageFromKey("monsterToCapture_CANNOT_BE_CAPTURED"), 0));
                    }
                }
                break;

            case BCardType.CardType.SpecialDamageAndExplosions:
                break;

            case BCardType.CardType.SpecialEffects2:
                break;

            case BCardType.CardType.CalculatingLevel:
                break;

            case BCardType.CardType.Recovery:
                break;

            case BCardType.CardType.MaxHPMP:
                break;

            case BCardType.CardType.MultAttack:
                break;

            case BCardType.CardType.MultDefence:
                break;

            case BCardType.CardType.TimeCircleSkills:
                break;

            case BCardType.CardType.RecoveryAndDamagePercent:
                break;

            case BCardType.CardType.Count:
                break;

            case BCardType.CardType.NoDefeatAndNoDamage:
                break;

            case BCardType.CardType.SpecialActions:
                if (session.GetSession() is Character charact)
                {
                    if (SubType.Equals((byte)AdditionalTypes.SpecialActions.Hide))
                    {
                        charact.Invisible = true;
                        charact.Mates.Where(s => s.IsTeamMember).ToList().ForEach(s => charact.Session.CurrentMapInstance?.Broadcast(s.GenerateOut()));
                        charact.Session.CurrentMapInstance?.Broadcast(charact.GenerateInvisible());
                    }
                }
                break;

            case BCardType.CardType.Mode:
                break;

            case BCardType.CardType.NoCharacteristicValue:
                break;

            case BCardType.CardType.LightAndShadow:
                break;

            case BCardType.CardType.Item:
                break;

            case BCardType.CardType.DebuffResistance:
                break;

            case BCardType.CardType.SpecialBehaviour:
                break;

            case BCardType.CardType.Quest:
                break;

            case BCardType.CardType.SecondSPCard:
                break;

            case BCardType.CardType.SPCardUpgrade:
                break;

            case BCardType.CardType.HugeSnowman:
                break;

            case BCardType.CardType.Drain:
                break;

            case BCardType.CardType.BossMonstersSkill:
                break;

            case BCardType.CardType.LordHatus:
                break;

            case BCardType.CardType.LordCalvinas:
                break;

            case BCardType.CardType.SESpecialist:
                break;

            case BCardType.CardType.FourthGlacernonFamilyRaid:
                break;

            case BCardType.CardType.SummonedMonsterAttack:
                break;

            case BCardType.CardType.BearSpirit:
                break;

            case BCardType.CardType.SummonSkill:
                break;

            case BCardType.CardType.InflictSkill:
                break;

            case BCardType.CardType.HideBarrelSkill:
                break;

            case BCardType.CardType.FocusEnemyAttentionSkill:
                break;

            case BCardType.CardType.TauntSkill:
                break;

            case BCardType.CardType.FireCannoneerRangeBuff:
                break;

            case BCardType.CardType.VulcanoElementBuff:
                break;

            case BCardType.CardType.DamageConvertingSkill:
                break;

            case BCardType.CardType.MeditationSkill:
                if (session.GetSession().GetType() == typeof(Character))
                {
                    if (SubType.Equals((byte)AdditionalTypes.MeditationSkill.CausingChance))
                    {
                        if (ServerManager.Instance.RandomNumber() < FirstData)
                        {
                            if (!(session is Character character))
                            {
                                break;
                            }
                            if (SkillVNum.HasValue)
                            {
                                character.LastSkillCombo = DateTime.Now;
                                Skill skill    = ServerManager.Instance.GetSkill(SkillVNum.Value);
                                Skill newSkill = ServerManager.Instance.GetSkill((short)SecondData);
                                Observable.Timer(TimeSpan.FromMilliseconds(100)).Subscribe(observer =>
                                {
                                    foreach (QuicklistEntryDTO qe in character.QuicklistEntries.Where(s =>
                                                                                                      s.Pos.Equals(skill.CastId)))
                                    {
                                        character.Session.SendPacket(
                                            $"qset {qe.Q1} {qe.Q2} {qe.Type}.{qe.Slot}.{newSkill.CastId}.0");
                                    }
                                    character.Session.SendPacket($"mslot {newSkill.CastId} -1");
                                });

                                if (skill.CastId > 10)
                                {
                                    // HACK this way
                                    Observable.Timer(TimeSpan.FromMilliseconds(skill.Cooldown * 100 + 500))
                                    .Subscribe(observer =>
                                    {
                                        character.Session.SendPacket($"sr {skill.CastId}");
                                    });
                                }
                            }
                        }
                    }
                    else
                    {
                        if (!(session is Character character))
                        {
                            break;
                        }
                        switch (SubType)
                        {
                        case 21:
                            character.MeditationDictionary[(short)SecondData] = DateTime.Now.AddSeconds(4);
                            break;

                        case 31:
                            character.MeditationDictionary[(short)SecondData] = DateTime.Now.AddSeconds(8);
                            break;

                        case 41:
                            character.MeditationDictionary[(short)SecondData] = DateTime.Now.AddSeconds(12);
                            break;
                        }
                    }
                }
                break;

            case BCardType.CardType.FalconSkill:
                break;

            case BCardType.CardType.AbsorptionAndPowerSkill:
                break;

            case BCardType.CardType.LeonaPassiveSkill:
                break;

            case BCardType.CardType.FearSkill:
                break;

            case BCardType.CardType.SniperAttack:
                break;

            case BCardType.CardType.FrozenDebuff:
                break;

            case BCardType.CardType.JumpBackPush:
                break;

            case BCardType.CardType.FairyXPIncrease:
                break;

            case BCardType.CardType.SummonAndRecoverHP:
                break;

            case BCardType.CardType.TeamArenaBuff:
                break;

            case BCardType.CardType.ArenaCamera:
                break;

            case BCardType.CardType.DarkCloneSummon:
                break;

            case BCardType.CardType.AbsorbedSpirit:
                break;

            case BCardType.CardType.AngerSkill:
                break;

            case BCardType.CardType.MeteoriteTeleport:
                break;

            case BCardType.CardType.StealBuff:
                break;

            default:
                Logger.Error(new ArgumentOutOfRangeException($"Card Type {Type} not defined!"));
                //throw new ArgumentOutOfRangeException();
                break;
            }
        }
示例#13
0
 public void ClearLog() //кнопка "Очистить"
 {
     GameObject.Find("Log Field Text").GetComponent <Text>().text = "";
     BeginBattleButton.SetActive(true);
     GameObject.Find("Attack Button").GetComponent <Button>().enabled  = false;
     GameObject.Find("Defence Button").GetComponent <Button>().enabled = false;
     GameObject.Find("Clear Button").GetComponent <Button>().enabled   = false;
     GameObject.Find("Attack Scroll").transform.Find("Button").GetComponent <Button>().enabled = false;
     GameObject.Find("Heal Scroll").transform.Find("Button").GetComponent <Button>().enabled   = false;
     GameObject.Find("Buff Scroll").transform.Find("Button").GetComponent <Button>().enabled   = false;
     GameObject.Find("Sleep Scroll").transform.Find("Button").GetComponent <Button>().enabled  = false;
     GameObject.Find("HP Potion").transform.Find("Button").GetComponent <Button>().enabled     = false;
     GameObject.Find("Balsam Potion").transform.Find("Button").GetComponent <Button>().enabled = false;
     GameObject.Find("Poison Potion").transform.Find("Button").GetComponent <Button>().enabled = false;
     PlayerStats.Poison               = false;
     PlayerStats.DebuffCount          = 0;
     PlayerStats.DebuffHeadAccPercent = 0;     //дебафф игрока на точность
     PlayerStats.DebuffEvaPercent     = 0;     //дебафф игрока на уворот
     PlayerStats.DebuffRHandPhysDmg   = 0;     //дебафф игрока на урон с правой руки
     PlayerStats.DebuffLDmg           = false; //дебафф игрока на неспособность бить левой рукой
     //BattleMechanics.greaseIsActivated = false;
     PlayerStats.BuffIsActivated     = false;
     PlayerStats.PoisonBonus         = 0;
     PlayerStats.GreaseBonus         = 0;
     PlayerStats.pBleed              = false;
     PlayerStats.pVampire            = false;
     PlayerStats.pBoneBreaker        = false;
     PlayerStats.PDueler             = false;
     PlayerStats.PSpikes             = false;
     PlayerStats.PAntimagic          = false;
     PlayerStats.pCrusher            = false;
     PlayerStats.pSoulEater          = false;
     PlayerStats.KickEffectOnHero    = false;
     PlayerStats.PoisonEffectOnHero  = false;
     PlayerStats.ToxicEffectOnHero   = false;
     PlayerStats.WallEyeEffectOnHero = false;
     PlayerStats.pBeast              = false;
     PlayerStats.PBerserk            = false;
     PlayerStats.pMadMan             = false;
     PlayerStats.pMadManMultiplier   = 0;
     PlayerStats.PSpikes             = false;
     PlayerStats.PAntimagic          = false;
     BattleMechanics.GameOver        = false;
     //BattleMechanics.NpcList.Clear();
     BattleMechanics.SelectedNpc = 0;
     //PlayerStats.CurrentNumberWhichIsHundredPercent = 10;
     BattleMechanics.GameStarted = false;
     PlayerStats.MadeTurn        = false;
     GameObject.Find("Log Field Text").GetComponent <RectTransform>().localPosition = new Vector3(0, -14677);
     for (int i = 0; i < BattleMechanics.NpcList.Count; i++)
     {
         NpcMonster newNpcIncomming = BattleMechanics.NpcData[BattleMechanics.NpcList[i].Name].Clone();
         newNpcIncomming.Id = i;
         if (newNpcIncomming.Initiative == 10)
         {
             newNpcIncomming.DistanceAttack = true;
         }
         BattleMechanics.NpcList[i] = newNpcIncomming;
     }
     PlayerStats.HpReset();
 }
    public void UseSkillbyID()
    {
        Text       logText = GameObject.Find("Log Field Text").GetComponent <Text>();
        NpcMonster npc     = BattleMechanics.NpcList[BattleMechanics.SelectedNpc];

        if (npc.CurrentHp == 0)
        {
            logText.text += npc.Name + " уже недееспособен. Выберите другого противника.\n\r";
            return;
        }

        switch (skillId)
        {
        //скилы, которые атакуют сразу
        //оружейные:
        case 2:     //Удар в печень
        case 4:     //Оружие вон
        case 6:     //Саблезуб
        case 7:     //Камикадзе
        case 15:    //Стрела к олено
        case 16:    //Рыцарский хук
        case 17:    //Безумец
        case 18:    //Разряд
        case 19:    //Выпад
        case 20:    //Тишина
        case 21:    //Невозмутимость
        //щитовые:
        case 27:    //Электро
        case 28:    //Всем лежать!
            if (npc.CurrentHp == 0)
            {
                logText.text += npc.Name + " уже недееспособен. Выберите другого противника.\n\r";
                return;
            }
            PlayerStats.PlayerSkillEffects(skillId, npc);     //используем скил
            PlayerStats.PlayerBattlePhase(1, npc);
            break;

        //просто включают пассивки
        //оружейные:
        case 8:     //Кровотечение
        case 9:     //Вампир
        case 10:    //Костолом
        case 11:    //Дуэлянт
        case 22:    //пассивка "Безумца"
        case 23:    //Ярость
        case 24:    //Пожиратель душ
        case 25:    //Крушитель
        //щитовые:
        case 29:    //Месть
        case 30:    //Везунчик
        case 31:    //Зеркало
        case 32:    //Хранитель
        case 33:    //Стратег
        case 34:    //Дубовая голова

        //моментальное использование скила без проматывания хода
        //оружейные скилы:
        case 3:                                           //Зверь
        case 5:                                           //Берсерк
        //щитовые:
        case 12:                                          //Шипы
        case 13:                                          //Антимагия
        case 26:                                          //Накопитель
            PlayerStats.PlayerSkillEffects(skillId, npc); //используем скил
            return;
            //BattleMechanics.PlayerBattlePhase(3, npc);
            //break;
        }
        if (npc.CurrentHp == 0 || PlayerStats.CurrentHp == 0)
        {
            BattleMechanics.WhoIsLoosing(npc);
            if (PlayerStats.CurrentHp == 0 || BattleMechanics.GameOver)
            {
                return;
            }
        }
        BattleMechanics.AfterPlayerAction(); //после использования скила монстр атакует в ответ
    }
示例#15
0
        public override void Use(ClientSession session, ref ItemInstance inv, byte option = 0, string[] packetsplit = null)
        {
            inv.Item.BCards.ForEach(c => c.ApplyBCards(session.Character));

            switch (Effect)
            {
            case 0:
                switch (VNum)
                {
                case 5370:
                    if (session.Character.Buff.Any(s => s.Card.CardId == 393))
                    {
                        session.SendPacket(session.Character.GenerateSay(string.Format(Language.Instance.GetMessageFromKey("ALREADY_GOT_BUFF"), session.Character.Buff.FirstOrDefault(s => s.Card.CardId == 393)?.Card.Name), 10));
                        return;
                    }
                    session.Character.Inventory.RemoveItemAmountFromInventory(1, inv.Id);
                    session.Character.AddStaticBuff(new StaticBuffDTO {
                        CardId = 393
                    });
                    break;

                case 1428:
                    session.SendPacket("guri 18 1");
                    break;

                case 1429:
                    session.SendPacket("guri 18 0");
                    break;

                case 1430:
                    if (packetsplit == null)
                    {
                        return;
                    }

                    if (packetsplit.Length < 9)
                    {
                        // MODIFIED PACKET
                        return;
                    }

                    if (!short.TryParse(packetsplit[9], out short eqSlot) || !Enum.TryParse(packetsplit[8], out InventoryType eqType))
                    {
                        return;
                    }
                    WearableInstance eq = session.Character.Inventory.LoadBySlotAndType <WearableInstance>(eqSlot, eqType);
                    if (eq == null)
                    {
                        // PACKET MODIFIED
                        return;
                    }
                    if (eq.Item.ItemType != ItemType.Armor && eq.Item.ItemType != ItemType.Weapon)
                    {
                        return;
                    }
                    eq.EquipmentOptions.Clear();
                    eq.ShellRarity = null;
                    session.Character.Inventory.RemoveItemAmountFromInventory(1, inv.Id);
                    session.SendPacket(UserInterfaceHelper.Instance.GenerateMsg(Language.Instance.GetMessageFromKey("SHELL_ERASED"), 0));
                    session.SendPacket(UserInterfaceHelper.Instance.GenerateGuri(17, 1, session.Character.CharacterId));
                    break;

                case 1904:
                    short[] items = { 1894, 1895, 1896, 1897, 1898, 1899, 1900, 1901, 1902, 1903 };
                    for (int i = 0; i < 5; i++)
                    {
                        session.Character.GiftAdd(items[ServerManager.Instance.RandomNumber(0, items.Length)], 1);
                    }
                    session.Character.Inventory.RemoveItemAmountFromInventory(1, inv.Id);
                    break;

                case 5916:
                    session.Character.AddStaticBuff(new StaticBuffDTO
                    {
                        CardId        = 340,
                        CharacterId   = session.Character.CharacterId,
                        RemainingTime = 7200
                    });
                    session.Character.RemoveBuff(339, true);
                    session.Character.Inventory.RemoveItemAmountFromInventory(1, inv.Id);
                    break;

                case 5929:
                    session.Character.AddStaticBuff(new StaticBuffDTO
                    {
                        CardId        = 340,
                        CharacterId   = session.Character.CharacterId,
                        RemainingTime = 600
                    });
                    session.Character.RemoveBuff(339, true);
                    session.Character.Inventory.RemoveItemAmountFromInventory(1, inv.Id);
                    break;

                default:
                    IEnumerable <RollGeneratedItemDTO> roll = DaoFactory.RollGeneratedItemDao.LoadByItemVNum(VNum);
                    IEnumerable <RollGeneratedItemDTO> rollGeneratedItemDtos = roll as IList <RollGeneratedItemDTO> ?? roll.ToList();
                    if (!rollGeneratedItemDtos.Any())
                    {
                        return;
                    }
                    int probabilities = rollGeneratedItemDtos.Sum(s => s.Probability);
                    int rnd           = ServerManager.Instance.RandomNumber(0, probabilities);
                    int currentrnd    = 0;
                    foreach (RollGeneratedItemDTO rollitem in rollGeneratedItemDtos)
                    {
                        if (rollitem.Probability == 10000)
                        {
                            session.Character.GiftAdd(rollitem.ItemGeneratedVNum, rollitem.ItemGeneratedAmount);
                            continue;
                        }
                        currentrnd += rollitem.Probability;
                        if (currentrnd < rnd)
                        {
                            continue;
                        }
                        if (rollitem.IsSuperReward)
                        {
                            CommunicationServiceClient.Instance.SendMessageToCharacter(new SCSCharacterMessage
                            {
                                DestinationCharacterId = null,
                                SourceCharacterId      = session.Character.CharacterId,
                                SourceWorldId          = ServerManager.Instance.WorldId,
                                Message = Language.Instance.GetMessageFromKey("SUPER_REWARD"),
                                Type    = MessageType.Shout
                            });
                        }
                        session.Character.GiftAdd(rollitem.ItemGeneratedVNum, rollitem.ItemGeneratedAmount, 0, rollitem.ItemGeneratedUpgrade);
                        break;
                    }
                    session.Character.Inventory.RemoveItemAmount(VNum);
                    break;
                }
                break;

            // sp point potions
            case 150:
            case 151:
                session.Character.SpAdditionPoint += EffectValue;
                if (session.Character.SpAdditionPoint > 1000000)
                {
                    session.Character.SpAdditionPoint = 1000000;
                }
                session.SendPacket(UserInterfaceHelper.Instance.GenerateMsg(string.Format(Language.Instance.GetMessageFromKey("SP_POINTSADDED"), EffectValue), 0));
                session.Character.Inventory.RemoveItemAmountFromInventory(1, inv.Id);
                session.SendPacket(session.Character.GenerateSpPoint());
                break;

            case 204:
                session.Character.SpPoint         += EffectValue;
                session.Character.SpAdditionPoint += EffectValue * 3;
                if (session.Character.SpAdditionPoint > 1000000)
                {
                    session.Character.SpAdditionPoint = 1000000;
                }
                if (session.Character.SpPoint > 10000)
                {
                    session.Character.SpPoint = 10000;
                }
                session.SendPacket(UserInterfaceHelper.Instance.GenerateMsg(string.Format(Language.Instance.GetMessageFromKey("SP_POINTSADDEDBOTH"), EffectValue, EffectValue * 3), 0));
                session.Character.Inventory.RemoveItemAmountFromInventory(1, inv.Id);
                session.SendPacket(session.Character.GenerateSpPoint());
                break;

            case 250:
                if (session.Character.Buff.Any(s => s.Card.CardId == 131))
                {
                    session.SendPacket(session.Character.GenerateSay(string.Format(Language.Instance.GetMessageFromKey("ALREADY_GOT_BUFF"), session.Character.Buff.FirstOrDefault(s => s.Card.CardId == 131)?.Card.Name), 10));
                    return;
                }
                session.Character.Inventory.RemoveItemAmountFromInventory(1, inv.Id);
                session.Character.AddStaticBuff(new StaticBuffDTO {
                    CardId = 131
                });
                session.CurrentMapInstance.Broadcast(session.Character.GeneratePairy());
                session.SendPacket(session.Character.GeneratePairy());
                break;

            case 208:
                if (session.Character.Buff.Any(s => s.Card.CardId == 121))
                {
                    session.SendPacket(session.Character.GenerateSay(string.Format(Language.Instance.GetMessageFromKey("ALREADY_GOT_BUFF"), session.Character.Buff.FirstOrDefault(s => s.Card.CardId == 121)?.Card.Name), 10));
                    return;
                }
                session.Character.Inventory.RemoveItemAmountFromInventory(1, inv.Id);
                session.Character.AddStaticBuff(new StaticBuffDTO {
                    CardId = 121, CharacterId = session.Character.CharacterId, RemainingTime = 3600
                });
                break;

            case 301:
                if (ServerManager.Instance.IsCharacterMemberOfGroup(session.Character.CharacterId))
                {
                    //TODO you are in group
                    return;
                }
                ItemInstance raidSeal = session.Character.Inventory.LoadBySlotAndType <ItemInstance>(inv.Slot, InventoryType.Main);

                ScriptedInstance raid = ServerManager.Instance?.Raids?.FirstOrDefault(s =>
                {
                    return(s?.RequieredItems != null && s.RequieredItems.Any(obj => obj?.VNum == raidSeal?.ItemVNum));
                })?.GetClone();
                if (raid != null)
                {
                    session.Character.Inventory.RemoveItemAmountFromInventory(1, raidSeal.Id);
                    GroupType groupType = GroupType.Team;
                    switch (raidSeal.Item.EffectValue)
                    {
                    case 20:
                        groupType = GroupType.GiantTeam;
                        break;

                    case 23:
                        groupType = GroupType.BigTeam;
                        break;
                    }

                    Group group = new Group(groupType);
                    group.Raid = raid;
                    group.JoinGroup(session.Character.CharacterId);
                    ServerManager.Instance.AddGroup(group);
                    session.SendPacket(UserInterfaceHelper.Instance.GenerateMsg(string.Format(Language.Instance.GetMessageFromKey("YOU_ARE_RAID_CHIEF"), session.Character.Name), 0));
                    session.SendPacket(session.Character.GenerateSay(string.Format(Language.Instance.GetMessageFromKey("YOU_ARE_RAID_CHIEF"), session.Character.Name), 10));
                    if (session.Character.Level > raid.LevelMaximum || session.Character.Level < raid.LevelMinimum)
                    {
                        session.SendPacket(session.Character.GenerateSay(Language.Instance.GetMessageFromKey("RAID_LEVEL_INCORRECT"), 10));
                    }
                    session.SendPacket(session.Character.GenerateRaid(2, false));
                    session.SendPacket(session.Character.GenerateRaid(0, false));
                    session.SendPacket(session.Character.GenerateRaid(1, false));
                    session.SendPacket(group.GenerateRdlst());
                }
                break;

            case 305:
                Mate partner = session.Character.Mates
                               .FirstOrDefault(x => x.IsTeamMember && (x.NpcMonsterVNum == 317 || x.NpcMonsterVNum == 318 || x.NpcMonsterVNum == 319) && x.MateType == MateType.Partner);
                if (partner == null)
                {
                    return;
                }
                switch (partner.NpcMonsterVNum)
                {
                case 317:
                    if (inv.Item.VNum == 1103 && partner.Skin != inv.Item.Morph)
                    {
                        partner.Skin = inv.Item.Morph;
                    }
                    else
                    {
                        return;
                    }
                    break;

                case 318:
                    if (inv.Item.VNum == 1141 && partner.Skin != inv.Item.Morph)
                    {
                        partner.Skin = inv.Item.Morph;
                    }
                    else
                    {
                        return;
                    }
                    break;

                case 319:
                    if (inv.Item.VNum == 1142 && partner.Skin != inv.Item.Morph)
                    {
                        partner.Skin = inv.Item.Morph;
                    }
                    else
                    {
                        return;
                    }
                    break;
                }
                session.Character?.Inventory?.RemoveItemAmountFromInventory(1, inv.Id);
                session.CurrentMapInstance?.Broadcast(partner.GenerateCMode(partner.Skin));
                break;

            //suction Funnel (Quest Item / QuestId = 1724)
            case 400:
                if (session.Character == null || session.Character.Quests.All(q => q.QuestId != 1724))
                {
                    break;
                }
                MapMonster kenko = session.CurrentMapInstance?.Monsters.FirstOrDefault(m => m.MapMonsterId == session.Character.LastMonsterId && m.MonsterVNum == 146);
                if (kenko == null)
                {
                    break;
                }
                kenko.GenerateDeath(session.Character);
                kenko.GenerateOut();
                session.Character.Inventory.AddNewToInventory(1174);     // Kenko Bead
                session.Character.Inventory.RemoveItemAmountFromInventory(1, inv.Id);
                break;

            //speed booster
            case 998:
                if (!session.Character.IsVehicled || session.Character.Buff.Any(s => s.Card.CardId == 336))
                {
                    return;
                }
                session.CurrentMapInstance?.Broadcast(session.Character.GenerateEff(885), session.Character.MapX, session.Character.MapY);
                session.Character.AddBuff(new Buff.Buff(336));
                session.Character.Speed += 5;
                switch (session.Character.Morph)
                {
                case 2517:         // Nossi M
                case 2518:         // Nossi F
                case 2522:         // Roller M
                case 2523:         // Roller F
                                   // Removes <= lv 4 debuffs
                    List <BuffType> bufftodisable = new List <BuffType> {
                        BuffType.Bad
                    };
                    session.Character.DisableBuffs(bufftodisable, 4);
                    break;
                }
                Observable.Timer(TimeSpan.FromSeconds(session.Character.BuffRandomTime * 0.1D)).Subscribe(o =>
                {
                    session.Character.Speed -= 5;
                    session.Character.LoadSpeed();
                    switch (session.Character.Morph)
                    {
                    case 2526:         // White male unicorn
                    case 2527:         // White female unicorn
                    case 2528:         // Pink male unicorn
                    case 2529:         // Pink female unicorn
                    case 2530:         // Black male unicorn
                    case 2531:         // Black Female Unicorn
                    case 2928:         // Male UFO
                    case 2929:         // Female UFO
                    case 3679:         // Male squelettic dragon
                    case 3680:         // Female squelettic dragon
                        ServerManager.Instance.TeleportOnRandomPlaceInMap(session, session.Character.MapInstanceId, true);
                        break;

                    case 2432:         // Magic broom
                    case 2433:         // Magic broom F
                    case 2520:         // VTT M
                    case 2521:         // VTT F
                        switch (session.Character.Direction)
                        {
                        case 0:
                            // -y
                            ServerManager.Instance.TeleportForward(session, session.Character.MapInstanceId, session.Character.PositionX, (short)(session.Character.PositionY - 5));
                            break;

                        case 1:
                            // +x
                            ServerManager.Instance.TeleportForward(session, session.Character.MapInstanceId, (short)(session.Character.PositionX + 5), session.Character.PositionY);
                            break;

                        case 2:
                            // +y
                            ServerManager.Instance.TeleportForward(session, session.Character.MapInstanceId, session.Character.PositionX, (short)(session.Character.PositionY + 5));
                            break;

                        case 3:
                            // -x
                            ServerManager.Instance.TeleportForward(session, session.Character.MapInstanceId, (short)(session.Character.PositionX - 5), session.Character.PositionY);
                            break;

                        case 4:
                            ServerManager.Instance.TeleportForward(session, session.Character.MapInstanceId, (short)(session.Character.PositionX - 5), (short)(session.Character.PositionY - 5));
                            // -x -y
                            break;

                        case 5:
                            // +x +y
                            ServerManager.Instance.TeleportForward(session, session.Character.MapInstanceId, (short)(session.Character.PositionX - 5), (short)(session.Character.PositionY - 5));
                            break;

                        case 6:
                            // +x -y
                            ServerManager.Instance.TeleportForward(session, session.Character.MapInstanceId, (short)(session.Character.PositionX + 5), (short)(session.Character.PositionY + 5));
                            break;

                        case 7:
                            // -x +y
                            ServerManager.Instance.TeleportForward(session, session.Character.MapInstanceId, (short)(session.Character.PositionX - 5), (short)(session.Character.PositionY + 5));
                            break;
                        }
                        break;

                    case 2524:
                    case 2525:
                        if (session.Character.Hp > 0)
                        {
                            session.Character.Hp += session.Character.Level * 15;
                            if (session.Character.Hp > session.Character.HpLoad())
                            {
                                session.Character.Hp = (int)session.Character.HpLoad();
                            }
                        }
                        break;
                    }
                });
                session.Character.Inventory.RemoveItemAmountFromInventory(1, inv.Id);
                break;

            //Atk/Def/HP/Exp potions
            case 6600:
                session.Character.Inventory.RemoveItemAmountFromInventory(1, inv.Id);
                break;

            // Divorce letter
            case 6969:     // this is imaginary number I = √(-1)
                CharacterRelationDTO rel = session.Character.CharacterRelations.FirstOrDefault(s => s.RelationType == CharacterRelationType.Spouse);
                if (rel != null)
                {
                    session.Character.DeleteRelation(rel.CharacterId == session.Character.CharacterId ? rel.RelatedCharacterId : rel.CharacterId);
                    session.SendPacket(UserInterfaceHelper.Instance.GenerateInfo(Language.Instance.GetMessageFromKey("DIVORCED")));
                    session.Character.Inventory.RemoveItemAmountFromInventory(1, inv.Id);
                }
                break;

            // Cupid's arrow
            case 34:
                if (packetsplit != null && packetsplit.Length > 3)
                {
                    if (long.TryParse(packetsplit[3], out long characterId))
                    {
                        if (session.Character.CharacterRelations.Any(s => s.RelationType == CharacterRelationType.Spouse))
                        {
                            session.SendPacket($"info {Language.Instance.GetMessageFromKey("ALREADY_MARRIED")}");
                            return;
                        }
                        ClientSession otherSession = ServerManager.Instance.GetSessionByCharacterId(characterId);
                        if (otherSession != null)
                        {
                            otherSession.SendPacket(UserInterfaceHelper.Instance.GenerateDialog(
                                                        $"#fins^-34^{session.Character.CharacterId} #fins^-69^{session.Character.CharacterId} {string.Format(Language.Instance.GetMessageFromKey("MARRY_REQUEST"), session.Character.Name)}"));
                            session.Character.FriendRequestCharacters.Add(characterId);
                            //session.Character.Inventory.RemoveItemAmountFromInventory(1, inv.Id);
                        }
                    }
                }
                break;

            case 570:
                if (session.CurrentMapInstance?.MapInstanceType == MapInstanceType.Act4Instance)
                {
                    session.SendPacket(UserInterfaceHelper.Instance.GenerateMsg(Language.Instance.GetMessageFromKey("MUST_BE_IN_CLASSIC_MAP"), 0));
                    return;
                }
                if (EffectValue < 3)
                {
                    if (session.Character.Faction == (FactionType)EffectValue)
                    {
                        session.SendPacket(UserInterfaceHelper.Instance.GenerateMsg(Language.Instance.GetMessageFromKey("SAME_FACTION"), 0));
                        return;
                    }
                    session.SendPacket(session.Character.Family == null
                            ? $"qna #guri^750^{EffectValue} {Language.Instance.GetMessageFromKey($"ASK_CHANGE_FACTION{EffectValue}")}"
                            : UserInterfaceHelper.Instance.GenerateMsg(Language.Instance.GetMessageFromKey("IN_FAMILY"),
                                                                       0));
                }
                else
                {
                    if (session.Character.Family == null)
                    {
                        session.SendPacket(UserInterfaceHelper.Instance.GenerateMsg(Language.Instance.GetMessageFromKey("NO_FAMILY"), 0));
                        return;
                    }
                    if (session.Character.Family.FamilyFaction / 2 == EffectValue)
                    {
                        session.SendPacket(UserInterfaceHelper.Instance.GenerateMsg(Language.Instance.GetMessageFromKey("SAME_FACTION"), 0));
                        return;
                    }
                    session.SendPacket(session.Character.Family != null
                            ? $"qna #guri^750^{EffectValue} {Language.Instance.GetMessageFromKey($"ASK_CHANGE_FACTION{EffectValue}")}"
                            : UserInterfaceHelper.Instance.GenerateMsg(Language.Instance.GetMessageFromKey("NOT_IN_FAMILY"),
                                                                       0));
                }
                break;

            // wings
            case 650:
                if (session.Character.UseSp && session.Character.SpInstance != null)
                {
                    if (option == 0)
                    {
                        session.SendPacket($"qna #u_i^1^{session.Character.CharacterId}^{(byte)inv.Type}^{inv.Slot}^3 {Language.Instance.GetMessageFromKey("ASK_WINGS_CHANGE")}");
                    }
                    else
                    {
                        session.Character.SpInstance.Design = (byte)EffectValue;
                        session.Character.MorphUpgrade2     = EffectValue;
                        session.CurrentMapInstance?.Broadcast(session.Character.GenerateCMode());
                        session.SendPacket(session.Character.GenerateStat());
                        session.SendPacket(session.Character.GenerateStatChar());
                        session.Character.Inventory.RemoveItemAmountFromInventory(1, inv.Id);
                    }
                }
                else
                {
                    session.SendPacket(UserInterfaceHelper.Instance.GenerateMsg(Language.Instance.GetMessageFromKey("NO_SP"), 0));
                }
                break;

            // presentation messages
            case 203:
                if (!session.Character.IsVehicled)
                {
                    if (option == 0)
                    {
                        session.SendPacket(UserInterfaceHelper.Instance.GenerateGuri(10, 2, session.Character.CharacterId, 1));
                    }
                }
                break;

            // magic lamps
            case 651:
                if (session.Character.Inventory.All(i => i.Value.Type != InventoryType.Wear))
                {
                    if (option == 0)
                    {
                        session.SendPacket($"qna #u_i^1^{session.Character.CharacterId}^{(byte)inv.Type}^{inv.Slot}^3 {Language.Instance.GetMessageFromKey("ASK_USE")}");
                    }
                    else
                    {
                        session.Character.ChangeSex();
                        session.Character.Inventory.RemoveItemAmountFromInventory(1, inv.Id);
                    }
                }
                else
                {
                    session.SendPacket(UserInterfaceHelper.Instance.GenerateMsg(Language.Instance.GetMessageFromKey("EQ_NOT_EMPTY"), 0));
                }
                break;

            // vehicles
            case 1000:
                if (session.Character.HasShopOpened)
                {
                    return;
                }
                if (Morph > 0)
                {
                    if (option == 0 && !session.Character.IsVehicled)
                    {
                        if (session.Character.IsSitting)
                        {
                            session.Character.IsSitting = false;
                            session.CurrentMapInstance?.Broadcast(session.Character.GenerateRest());
                        }
                        session.Character.LastDelay = DateTime.Now;
                        session.SendPacket(UserInterfaceHelper.Instance.GenerateDelay(3000, 3, $"#u_i^1^{session.Character.CharacterId}^{(byte)inv.Type}^{inv.Slot}^2"));
                    }
                    else
                    {
                        if (!session.Character.IsVehicled && option != 0)
                        {
                            DateTime delay = DateTime.Now.AddSeconds(-4);
                            if (session.Character.LastDelay > delay && session.Character.LastDelay < delay.AddSeconds(2))
                            {
                                session.Character.Speed         = Speed;
                                session.Character.IsVehicled    = true;
                                session.Character.VehicleSpeed  = Speed;
                                session.Character.MorphUpgrade  = 0;
                                session.Character.MorphUpgrade2 = 0;
                                session.Character.Morph         = Morph + (byte)session.Character.Gender;
                                session.Character.Mates?.ForEach(x => session.CurrentMapInstance?.Broadcast(x.GenerateOut()));
                                session.CurrentMapInstance?.Broadcast(session.Character.GenerateEff(196), session.Character.MapX, session.Character.MapY);
                                session.CurrentMapInstance?.Broadcast(session.Character.GenerateCMode());
                                session.SendPacket(session.Character.GenerateCond());
                                session.Character.LastSpeedChange = DateTime.Now;
                            }
                        }
                        else if (session.Character.IsVehicled)
                        {
                            session.Character.Mates?.Where(s => s.IsTeamMember).ToList().ForEach(x =>
                            {
                                x.PositionX = session.Character.PositionX;
                                x.PositionY = session.Character.PositionY;
                                session.CurrentMapInstance?.Broadcast(x.GenerateIn());
                            });
                            session.Character.RemoveVehicle();
                        }
                    }
                }
                break;

            case 1002:
                if (session.HasCurrentMapInstance)
                {
                    if (session.CurrentMapInstance.Map.MapTypes.All(m => m.MapTypeId != (short)MapTypeEnum.Act4))
                    {
                        short[] vnums =
                        {
                            1386, 1387, 1388, 1389, 1390, 1391, 1392, 1393, 1394, 1395, 1396, 1397, 1398, 1399,
                            1400, 1401, 1402, 1403, 1404, 1405
                        };
                        short vnum = vnums[ServerManager.Instance.RandomNumber(0, 20)];

                        NpcMonster npcmonster = ServerManager.Instance.GetNpc(vnum);
                        if (npcmonster == null)
                        {
                            return;
                        }
                        MapMonster monster = new MapMonster
                        {
                            MonsterVNum   = vnum,
                            MapY          = session.Character.MapY,
                            MapX          = session.Character.MapX,
                            MapId         = session.Character.MapInstance.Map.MapId,
                            Position      = (byte)session.Character.Direction,
                            IsMoving      = true,
                            MapMonsterId  = session.CurrentMapInstance.GetNextId(),
                            ShouldRespawn = false
                        };
                        monster.Initialize(session.CurrentMapInstance);
                        session.CurrentMapInstance.AddMonster(monster);
                        session.CurrentMapInstance.Broadcast(monster.GenerateIn());
                        session.Character.Inventory.RemoveItemAmountFromInventory(1, inv.Id);
                    }
                }
                break;

            case 69:
                session.Character.GetReput(ReputPrice);
                session.SendPacket(session.Character.GenerateFd());
                session.Character.Inventory.RemoveItemAmountFromInventory(1, inv.Id);
                break;

            case 789:
                session.Character.GiftAdd((short)inv.Item.EffectValue, 1);
                session.Character.Inventory.RemoveItemAmountFromInventory(1, inv.Id);
                break;

            case 1003:
                if (!session.Character.StaticBonusList.Any(s => s.StaticBonusType == StaticBonusType.BazaarMedalGold || s.StaticBonusType == StaticBonusType.BazaarMedalSilver))
                {
                    session.Character.StaticBonusList.Add(new StaticBonusDTO
                    {
                        CharacterId     = session.Character.CharacterId,
                        DateEnd         = DateTime.Now.AddDays(EffectValue),
                        StaticBonusType = StaticBonusType.BazaarMedalGold
                    });
                    session.Character.Inventory.RemoveItemAmountFromInventory(1, inv.Id);
                    session.SendPacket(session.Character.GenerateSay(string.Format(Language.Instance.GetMessageFromKey("EFFECT_ACTIVATED"), Name), 12));
                }
                break;

            case 1004:
                if (!session.Character.StaticBonusList.Any(s => s.StaticBonusType == StaticBonusType.BazaarMedalGold || s.StaticBonusType == StaticBonusType.BazaarMedalGold))
                {
                    session.Character.StaticBonusList.Add(new StaticBonusDTO
                    {
                        CharacterId     = session.Character.CharacterId,
                        DateEnd         = DateTime.Now.AddDays(EffectValue),
                        StaticBonusType = StaticBonusType.BazaarMedalSilver
                    });
                    session.Character.Inventory.RemoveItemAmountFromInventory(1, inv.Id);
                    session.SendPacket(session.Character.GenerateSay(string.Format(Language.Instance.GetMessageFromKey("EFFECT_ACTIVATED"), Name), 12));
                }
                break;

            case 1005:
                if (session.Character.StaticBonusList.All(s => s.StaticBonusType != StaticBonusType.BackPack))
                {
                    session.Character.StaticBonusList.Add(new StaticBonusDTO
                    {
                        CharacterId     = session.Character.CharacterId,
                        DateEnd         = DateTime.Now.AddDays(EffectValue),
                        StaticBonusType = StaticBonusType.BackPack
                    });
                    session.Character.Inventory.RemoveItemAmountFromInventory(1, inv.Id);
                    session.SendPacket(session.Character.GenerateExts());
                    session.SendPacket(session.Character.GenerateSay(string.Format(Language.Instance.GetMessageFromKey("EFFECT_ACTIVATED"), Name), 12));
                }
                break;

            case 1006:
                if (option == 0)
                {
                    session.SendPacket($"qna #u_i^1^{session.Character.CharacterId}^{(byte)inv.Type}^{inv.Slot}^2 {Language.Instance.GetMessageFromKey("ASK_PET_MAX")}");
                }
                else
                {
                    if (session.Character.MaxMateCount < 30)
                    {
                        session.SendPacket(session.Character.GenerateSay(Language.Instance.GetMessageFromKey("GET_PET_PLACES"), 10));
                        session.SendPacket(session.Character.GenerateScpStc());
                        session.Character.Inventory.RemoveItemAmountFromInventory(1, inv.Id);
                    }
                }
                break;

            case 1007:
                if (session.Character.StaticBonusList.All(s => s.StaticBonusType != StaticBonusType.PetBasket))
                {
                    session.Character.StaticBonusList.Add(new StaticBonusDTO
                    {
                        CharacterId     = session.Character.CharacterId,
                        DateEnd         = DateTime.Now.AddDays(EffectValue),
                        StaticBonusType = StaticBonusType.PetBasket
                    });
                    session.Character.Inventory.RemoveItemAmountFromInventory(1, inv.Id);
                    session.SendPacket(session.Character.GenerateExts());
                    session.SendPacket("ib 1278 1");
                    session.SendPacket(session.Character.GenerateSay(string.Format(Language.Instance.GetMessageFromKey("EFFECT_ACTIVATED"), Name), 12));
                }
                break;

            case 1008:
                if (session.Character.StaticBonusList.All(s => s.StaticBonusType != StaticBonusType.PetBackPack))
                {
                    session.Character.StaticBonusList.Add(new StaticBonusDTO
                    {
                        CharacterId     = session.Character.CharacterId,
                        DateEnd         = DateTime.Now.AddDays(EffectValue),
                        StaticBonusType = StaticBonusType.PetBackPack
                    });
                    session.Character.Inventory.RemoveItemAmountFromInventory(1, inv.Id);
                    session.SendPacket(session.Character.GenerateExts());
                    session.SendPacket(session.Character.GenerateSay(string.Format(Language.Instance.GetMessageFromKey("EFFECT_ACTIVATED"), Name), 12));
                }
                break;

            default:
                List <RollGeneratedItemDTO> rolls = inv.Item.RollGeneratedItems?.ToList();
                if (rolls != null && rolls.Any())
                {
                    if (option == 0)
                    {
                        if (packetsplit != null && packetsplit.Length == 9 || inv.Item.ItemSubType == 3)
                        {
                            session.SendPacket($"qna #guri^4999^8023^{inv.Slot} {Language.Instance.GetMessageFromKey("ASK_OPEN_BOX")}");
                        }
                        break;
                    }
                    else
                    {
                        int probabilities          = rolls.Sum(s => s.Probability);
                        int rnd                    = ServerManager.Instance.RandomNumber(0, probabilities);
                        int currentrnd             = 0;
                        List <ItemInstance> newInv = null;
                        foreach (RollGeneratedItemDTO rollitem in rolls)
                        {
                            if (rollitem.Probability == 10000)
                            {
                                session.Character.GiftAdd(rollitem.ItemGeneratedVNum, rollitem.ItemGeneratedAmount);
                                continue;
                            }
                            currentrnd += rollitem.Probability;
                            if (newInv != null || currentrnd < rnd)
                            {
                                continue;
                            }
                            newInv = session.Character.Inventory.AddNewToInventory(rollitem.ItemGeneratedVNum, rollitem.ItemGeneratedAmount, upgrade: rollitem.ItemGeneratedUpgrade);
                            short slot = inv.Slot;
                            if (!newInv.Any() || slot == -1)
                            {
                                continue;
                            }
                            session.SendPacket(session.Character.GenerateSay($"{Language.Instance.GetMessageFromKey("ITEM_ACQUIRED")}: {newInv.FirstOrDefault()?.Item.Name ?? ""} x {rollitem.ItemGeneratedAmount})", 12));
                            session.SendPacket($"rdi {rollitem.ItemGeneratedVNum} {rollitem.ItemGeneratedAmount}");
                            newInv.ForEach(s => session.SendPacket(s?.GenerateInventoryAdd()));
                        }
                        session.Character.Inventory.RemoveItemAmountFromInventory(1, inv.Id);
                        break;
                    }
                }
                Logger.Log.Warn(string.Format(Language.Instance.GetMessageFromKey("NO_HANDLER_ITEM"), GetType()));
                break;
            }
            session.Character.IncrementQuests(QuestType.Use, inv.ItemVNum);
        }