/// <summary> /// psl packet /// </summary> /// <param name="pslPacket"></param> public void Psl(PslPacket pslPacket) { Mate mate = Session.Character.Mates.FirstOrDefault(x => x.IsTeamMember && x.MateType == MateType.Partner); if (mate == null) { return; } if (pslPacket.Type == 0) { if (mate.IsUsingSp) { mate.IsUsingSp = false; mate.SpSkills = null; Session.Character.MapInstance.Broadcast(mate.GenerateCMode(-1)); Session.SendPacket(mate.GenerateCond()); Session.SendPacket(mate.GeneratePski()); Session.SendPacket(mate.GenerateScPacket()); Session.Character.MapInstance.Broadcast(mate.GenerateOut()); Session.Character.MapInstance.Broadcast(mate.GenerateIn()); Session.SendPacket(Session.Character.GeneratePinit()); //psd 30 } else { Session.SendPacket("delay 5000 3 #psl^1 "); Session.CurrentMapInstance?.Broadcast(UserInterfaceHelper.Instance.GenerateGuri(2, 2, mate.MateTransportId), mate.PositionX, mate.PositionY); } } else { if (mate.SpInstance == null) { return; } mate.IsUsingSp = true; //TODO: update pet skills mate.SpSkills = new NpcMonsterSkill[3]; Session.SendPacket(mate.GenerateCond()); Session.Character.MapInstance.Broadcast(mate.GenerateCMode(mate.SpInstance.Item.Morph)); Session.SendPacket(mate.GeneratePski()); Session.SendPacket(mate.GenerateScPacket()); Session.Character.MapInstance.Broadcast(mate.GenerateOut()); Session.Character.MapInstance.Broadcast(mate.GenerateIn()); Session.SendPacket(Session.Character.GeneratePinit()); Session.Character.MapInstance.Broadcast(mate.GenerateEff(196)); } }
private void ExecuteHandler(ClientSession session) { Mate mate = session.Character.Mates.Find(x => x.IsTeamMember && x.MateType == MateType.Partner); if (mate == null) { return; } if (Type == 0) { if (mate.SpInstance == null) { session.SendPacket(UserInterfaceHelper.GenerateMsg(Language.Instance.GetMessageFromKey("NEED_WEAR_PARTNER_SP"), 0)); return; } var currentRunningSeconds = (DateTime.UtcNow - Process.GetCurrentProcess().StartTime.AddHours(-2).AddSeconds(-50)).TotalSeconds; var timeSpanSinceLastUsage = currentRunningSeconds - mate.LastSp; if (timeSpanSinceLastUsage < mate.SpCooldown) { session.SendPacket(UserInterfaceHelper.GenerateMsg(string.Format(Language.Instance.GetMessageFromKey("PARTNER_SP_IN_COOLDOWN"), mate.SpCooldown - (int)Math.Round(timeSpanSinceLastUsage, 0)), 0)); return; } if (mate.IsUsingSp) { mate.RemoveSp(); } else { session.SendPacket("pdelay 5000 3 #psl^1 "); session.CurrentMapInstance?.Broadcast(UserInterfaceHelper.GenerateGuri(2, 2, mate.MateTransportId), mate.PositionX, mate.PositionY); } } else { if (mate.SpInstance == null) { session.SendPacket(UserInterfaceHelper.GenerateMsg(Language.Instance.GetMessageFromKey("NEED_WEAR_PARTNER_SP"), 0)); return; } mate.IsUsingSp = true; session.SendPacket(mate.GenerateCond()); session.Character.MapInstance.Broadcast(mate.GenerateCMode(mate.SpInstance.Item.Morph)); session.SendPacket(mate.GenerateScPacket()); session.Character.MapInstance.Broadcast(mate.GenerateOut()); session.Character.MapInstance.Broadcast(mate.GenerateIn()); session.SendPacket(session.Character.GeneratePinit()); session.Character.MapInstance.Broadcast(StaticPacketHelper.GenerateEff(UserType.Npc, mate.MateTransportId, 196)); session.SendPacket(mate.GeneratePski()); MateHelper.Instance.AddPartnerBuffs(session, mate); } }
public static void RemoveSp(this Mate e, bool isBackToMiniland = false) { if (e.Owner?.Session == null || e.Owner.MapInstance == null) { return; } e.IsUsingSp = false; e.Owner.Session.SendPacket(e.GenerateScPacket()); if (!e.IsTeamMember) { return; } e.Owner.MapInstance.Broadcast(e.GenerateCMode(-1)); e.GenerateDpski(); e.Owner.Session.SendPacket(e.GenerateCond()); e.Owner.MapInstance.Broadcast(e.GenerateOut()); if (!isBackToMiniland) { bool isAct4 = ServerManager.Instance.ChannelId == 51; Parallel.ForEach(e.Owner.MapInstance.Sessions.Where(s => s.Character != null), s => { if (!isAct4 || e.Owner.Faction == s.Character.Faction) { s.SendPacket(e.GenerateIn(false, isAct4)); } else { s.SendPacket(e.GenerateIn(true, isAct4, s.Account.Authority)); } }); } e.Owner.Session.SendPacket(e.Owner.GeneratePinit()); }
public void AddPetToTeam(ClientSession session, short vnum, byte level, MateType type) { Mate equipedMate = session.Character.Mates?.SingleOrDefault(s => s.IsTeamMember && s.MateType == type); if (equipedMate != null) { equipedMate.RemoveTeamMember(); session.Character.MapInstance?.Broadcast(equipedMate.GenerateOut()); } Mate mate = new Mate(session.Character, ServerManager.Instance.GetNpc(vnum), level, type); session.Character.Mates?.Add(mate); mate.RefreshStats(); session.SendPacket($"ctl 2 {mate.PetId} 3"); session.Character.MapInstance?.Broadcast(mate.GenerateIn()); session.SendPacket(UserInterfaceHelper.Instance.GeneratePClear()); session.SendPackets(session.Character.GenerateScN()); session.SendPackets(session.Character.GenerateScP()); session.SendPacket(session.Character.GeneratePinit()); session.SendPackets(session.Character.Mates.Where(s => s.IsTeamMember).OrderBy(s => s.MateType).Select(s => s.GeneratePst())); }
/// <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; } InventoryType inventoryType = (InventoryType)guriPacket.Argument; ItemInstance pearls = Session.Character.Inventory.FirstOrDefault(s => s.Value.ItemVNum == 1429).Value; WearableInstance 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 || shell.Upgrade > 90) { 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; InventoryType perfumeInventoryType = (InventoryType)guriPacket.Argument; WearableInstance 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); } 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?.CurrentMapInstance?.Broadcast( UserInterfaceHelper.Instance.GenerateMsg(string.Format(Language.Instance.GetMessageFromKey("ICEBREAKER_PLAYER_UNFROZEN"), target.Character?.Name), 0)); break; case 506: if (ServerManager.Instance.EventInWaiting) { Session.Character.IsWaitingForEvent = true; } 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) { 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) { if (Session.Character.MapInstance.MapInstanceType != MapInstanceType.BaseMapInstance) { Session.SendPacket(Session.Character.GenerateSay(Language.Instance.GetMessageFromKey("CANT_USE_THAT"), 10)); return; } 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.MapInstance.MapInstanceType == MapInstanceType.Act4Instance && session.Character.Faction == Session.Character.Faction) { 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; } } Random random = new Random(); double randomAmount = ServerManager.Instance.RandomNumber() * random.NextDouble(); DropDTO drop = mapobject.Drops.FirstOrDefault(s => s.MonsterVNum == npc.NpcVNum); if (drop != null) { if (npc.NpcVNum == 2004 && npc.IsOut == false) { ItemInstance newInv = Session.Character.Inventory.AddNewToInventory(drop.ItemVNum).FirstOrDefault(); if (newInv == null) { return; } 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) { short vnum = drop.ItemVNum; 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)); } 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)) { if (Session.Character.Inventory.CountItem(baseVnum + faction) > 0) { 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)); } } } 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.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: if (guriPacket.Type == 208 && guriPacket.Argument == 0) { if (guriPacket.User != null && short.TryParse(guriPacket.User.Value.ToString(), out short pearlSlot) && short.TryParse(guriPacket.Value, out short mountSlot)) { ItemInstance mount = Session.Character.Inventory.LoadBySlotAndType <ItemInstance>(mountSlot, InventoryType.Main); BoxInstance 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); } } } else if (guriPacket.Type == 209 && guriPacket.Argument == 0) { if (guriPacket.User != null && short.TryParse(guriPacket.User.Value.ToString(), out short pearlSlot) && short.TryParse(guriPacket.Value, out short mountSlot)) { WearableInstance fairy = Session.Character.Inventory.LoadBySlotAndType <WearableInstance>(mountSlot, InventoryType.Equipment); BoxInstance 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); } } } else if (guriPacket.Type == 203 && 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) { SpecialistInstance 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; } } }
public static void NRun(ClientSession session, int npcId, short runner, short type, short value) { if (!session.HasCurrentMapInstance) { return; } MapNpc npc = session.CurrentMapInstance.Npcs.Find(s => s.MapNpcId == npcId); TeleporterDTO tp; switch (runner) { case 1: if (session.Character.Class != (byte)ClassType.Adventurer) { session.SendPacket(UserInterfaceHelper.GenerateMsg(Language.Instance.GetMessageFromKey("NOT_ADVENTURER"), 0)); return; } if (session.Character.Level < 15 || session.Character.JobLevel < 20) { session.SendPacket(UserInterfaceHelper.GenerateMsg(Language.Instance.GetMessageFromKey("LOW_LVL"), 0)); return; } if (type == (byte)session.Character.Class || type < 1 || type > 3) { return; } if (session.Character.Inventory.All(i => i.Type != InventoryType.Wear)) { session.Character.Inventory.AddNewToInventory((short)(4 + (type * 14)), type: InventoryType.Wear); session.Character.Inventory.AddNewToInventory((short)(81 + (type * 13)), type: InventoryType.Wear); switch (type) { case 1: session.Character.Inventory.AddNewToInventory(68, type: InventoryType.Wear); session.Character.Inventory.AddNewToInventory(2082, 10); break; case 2: session.Character.Inventory.AddNewToInventory(78, type: InventoryType.Wear); session.Character.Inventory.AddNewToInventory(2083, 10); break; case 3: session.Character.Inventory.AddNewToInventory(86, type: InventoryType.Wear); break; } session.CurrentMapInstance?.Broadcast(session.Character.GenerateEq()); session.SendPacket(session.Character.GenerateEquipment()); session.Character.ChangeClass((ClassType)type); } else { session.SendPacket(UserInterfaceHelper.GenerateMsg(Language.Instance.GetMessageFromKey("EQ_NOT_EMPTY"), 0)); } break; case 2: session.SendPacket("wopen 1 0"); break; case 4: Mate mate = session.Character.Mates.Find(s => s.MateTransportId == npcId); switch (type) { case 2: if (mate != null) { if (session.Character.Level >= mate.Level) { Mate teammate = session.Character.Mates.Where(s => s.IsTeamMember).FirstOrDefault(s => s.MateType == mate.MateType); teammate?.LeaveTeam(); mate.JoinTeam(); } else { session.SendPacket(UserInterfaceHelper.GenerateMsg(Language.Instance.GetMessageFromKey("PET_HIGHER_LEVEL"), 0)); } } break; case 3: if (mate != null && session.Character.Miniland == session.Character.MapInstance) { mate.LeaveTeam(); } break; case 4: if (mate != null) { if (session.Character.Miniland == session.Character.MapInstance) { mate.LeaveTeam(); } else { session.SendPacket($"qna #n_run^4^5^3^{mate.MateTransportId} {Language.Instance.GetMessageFromKey("ASK_KICK_PET")}"); } } break; case 5: if (mate != null) { session.SendPacket(UserInterfaceHelper.GenerateDelay(3000, 10, $"#n_run^4^6^3^{mate.MateTransportId}")); } break; case 6: if (mate != null && session.Character.Miniland != session.Character.MapInstance) { mate.BackToMiniland(); session.CurrentMapInstance.Broadcast(mate.GenerateOut()); session.SendPacket(session.Character.GenerateSay(string.Format(Language.Instance.GetMessageFromKey("PET_KICKED"), mate.Name), 11)); session.SendPacket(UserInterfaceHelper.GenerateMsg(string.Format(Language.Instance.GetMessageFromKey("PET_KICKED"), mate.Name), 0)); } break; case 7: if (mate != null) { if (!mate.IsSummonable) { session.SendPacket(UserInterfaceHelper.GenerateInfo(Language.Instance.GetMessageFromKey("NEED_SUMMONING_SCROLL"))); return; } if (session.Character.Mates.Any(s => s.MateType == mate.MateType && s.IsTeamMember)) { session.SendPacket(session.Character.GenerateSay(Language.Instance.GetMessageFromKey("ALREADY_PET_IN_TEAM"), 11)); session.SendPacket(UserInterfaceHelper.GenerateMsg(Language.Instance.GetMessageFromKey("ALREADY_PET_IN_TEAM"), 0)); } else { session.SendPacket(UserInterfaceHelper.GenerateDelay(3000, 10, $"#n_run^4^9^3^{mate.MateTransportId}")); } } break; case 9: if (mate != null) { mate.PositionX = (short)(session.Character.PositionX + 1); mate.PositionY = (short)(session.Character.PositionY + 1); mate.JoinTeam(); session.CurrentMapInstance.Broadcast(mate.GenerateIn()); } else { session.SendPacket(UserInterfaceHelper.GenerateMsg(Language.Instance.GetMessageFromKey("PET_HIGHER_LEVEL"), 0)); } break; } session.SendPacket(session.Character.GeneratePinit()); session.SendPackets(session.Character.GeneratePst()); break; case 10: session.SendPacket("wopen 3 0"); break; case 12: session.SendPacket($"wopen {type} 0"); break; case 14: session.SendPacket("wopen 27 0"); string recipelist = "m_list 2"; if (npc != null) { List <Recipe> tps = npc.Recipes; recipelist = tps.Where(s => s.Amount > 0).Aggregate(recipelist, (current, s) => current + $" {s.ItemVNum}"); recipelist += " -100"; session.SendPacket(recipelist); } break; case 15: if (npc != null) { if (value == 2) { session.SendPacket($"qna #n_run^15^1^1^{npc.MapNpcId} {Language.Instance.GetMessageFromKey("ASK_CHANGE_SPAWNLOCATION")}"); } else { switch (npc.MapId) { case 1: session.Character.SetRespawnPoint(1, 79, 116); break; case 20: session.Character.SetRespawnPoint(20, 9, 92); break; case 145: session.Character.SetRespawnPoint(1, 81, 3); break; } session.SendPacket(UserInterfaceHelper.GenerateMsg(Language.Instance.GetMessageFromKey("RESPAWNLOCATION_CHANGED"), 0)); } } break; case 16: tp = npc?.Teleporters?.FirstOrDefault(s => s.Index == type); if (tp != null) { if (session.Character.Gold >= 1000 * type) { session.Character.Gold -= 1000 * type; session.SendPacket(session.Character.GenerateGold()); ServerManager.Instance.ChangeMap(session.Character.CharacterId, tp.MapId, tp.MapX, tp.MapY); } else { session.SendPacket(session.Character.GenerateSay(Language.Instance.GetMessageFromKey("NOT_ENOUGH_MONEY"), 10)); } } break; case 17: double currentRunningSeconds = (DateTime.UtcNow - Process.GetCurrentProcess().StartTime.AddHours(-2).AddSeconds(-50)).TotalSeconds; double timeSpanSinceLastPortal = currentRunningSeconds - session.Character.LastPortal; if (!(timeSpanSinceLastPortal >= 4) || !session.HasCurrentMapInstance || ServerManager.Instance.ChannelId == 51 || session.CurrentMapInstance.MapInstanceId == ServerManager.Instance.ArenaInstance.MapInstanceId || session.CurrentMapInstance.MapInstanceId == ServerManager.Instance.FamilyArenaInstance.MapInstanceId) { session.SendPacket(session.Character.GenerateSay(Language.Instance.GetMessageFromKey("CANT_MOVE"), 10)); return; } if (session.Character.Gold >= 500 * (1 + type) && type > -1) { session.Character.LastPortal = currentRunningSeconds; session.Character.Gold -= 500 * (1 + type); session.SendPacket(session.Character.GenerateGold()); MapCell pos = type == 0 ? ServerManager.Instance.ArenaInstance.Map.GetRandomPosition() : ServerManager.Instance.FamilyArenaInstance.Map.GetRandomPosition(); ServerManager.Instance.ChangeMapInstance(session.Character.CharacterId, type == 0 ? ServerManager.Instance.ArenaInstance.MapInstanceId : ServerManager.Instance.FamilyArenaInstance.MapInstanceId, pos.X, pos.Y); } else { session.SendPacket(session.Character.GenerateSay(Language.Instance.GetMessageFromKey("NOT_ENOUGH_MONEY"), 10)); } break; case 18: session.SendPacket(session.Character.GenerateNpcDialog(17)); break; case 26: tp = npc?.Teleporters?.FirstOrDefault(s => s.Index == type); if (tp != null) { if (session.Character.Gold >= 5000 * type) { session.Character.Gold -= 5000 * type; ServerManager.Instance.ChangeMap(session.Character.CharacterId, tp.MapId, tp.MapX, tp.MapY); } else { session.SendPacket(session.Character.GenerateSay(Language.Instance.GetMessageFromKey("NOT_ENOUGH_MONEY"), 10)); } } break; case 45: tp = npc?.Teleporters?.FirstOrDefault(s => s.Index == type); if (tp != null) { if (session.Character.Gold >= 500) { session.Character.Gold -= 500; session.SendPacket(session.Character.GenerateGold()); ServerManager.Instance.ChangeMap(session.Character.CharacterId, tp.MapId, tp.MapX, tp.MapY); } else { session.SendPacket(session.Character.GenerateSay(Language.Instance.GetMessageFromKey("NOT_ENOUGH_MONEY"), 10)); } } break; case 132: tp = npc?.Teleporters?.FirstOrDefault(s => s.Index == type); if (tp != null) { ServerManager.Instance.ChangeMap(session.Character.CharacterId, tp.MapId, tp.MapX, tp.MapY); } break; case 135: if (TalentArena.IsRunning) { TalentArena.RegisteredParticipants[session.Character.CharacterId] = session; session.SendPacket(UserInterfaceHelper.GenerateBsInfo(0, 3, 300, 5)); } break; case 150: if (npc != null) { if (session.Character.Family != null) { if (session.Character.Family.LandOfDeath != null && npc.EffectActivated) { if (session.Character.Level >= 55) { ServerManager.Instance.ChangeMapInstance(session.Character.CharacterId, session.Character.Family.LandOfDeath.MapInstanceId, 153, 145); } else { session.SendPacket(UserInterfaceHelper.GenerateMsg(Language.Instance.GetMessageFromKey("LOD_REQUIERE_LVL"), 0)); } } else { session.SendPacket(UserInterfaceHelper.GenerateMsg(Language.Instance.GetMessageFromKey("LOD_CLOSED"), 0)); } } else { session.SendPacket(UserInterfaceHelper.GenerateMsg(Language.Instance.GetMessageFromKey("NEED_FAMILY"), 0)); } } break; case 301: tp = npc?.Teleporters?.FirstOrDefault(s => s.Index == type); if (tp != null) { ServerManager.Instance.ChangeMap(session.Character.CharacterId, tp.MapId, tp.MapX, tp.MapY); } break; case 1600: session.SendPacket(session.Character.OpenFamilyWarehouse()); break; case 1601: session.SendPackets(session.Character.OpenFamilyWarehouseHist()); break; case 1602: if (session.Character.Family?.FamilyLevel >= 3 && session.Character.Family.WarehouseSize < 21) { if (session.Character.FamilyCharacter.Authority == FamilyAuthority.Head) { if (500000 >= session.Character.Gold) { session.SendPacket(session.Character.GenerateSay(Language.Instance.GetMessageFromKey("NOT_ENOUGH_MONEY"), 10)); return; } session.Character.Family.WarehouseSize = 21; session.Character.Gold -= 500000; session.SendPacket(session.Character.GenerateGold()); FamilyDTO fam = session.Character.Family; DAOFactory.FamilyDAO.InsertOrUpdate(ref fam); ServerManager.Instance.FamilyRefresh(session.Character.Family.FamilyId); } else { session.SendPacket(session.Character.GenerateSay(Language.Instance.GetMessageFromKey("ONLY_HEAD_CAN_BUY"), 10)); session.SendPacket(UserInterfaceHelper.GenerateModal(Language.Instance.GetMessageFromKey("ONLY_HEAD_CAN_BUY"), 1)); } } break; case 1603: if (session.Character.Family?.FamilyLevel >= 7 && session.Character.Family.WarehouseSize < 49) { if (session.Character.FamilyCharacter.Authority == FamilyAuthority.Head) { if (2000000 >= session.Character.Gold) { session.SendPacket(session.Character.GenerateSay(Language.Instance.GetMessageFromKey("NOT_ENOUGH_MONEY"), 10)); return; } session.Character.Family.WarehouseSize = 49; session.Character.Gold -= 2000000; session.SendPacket(session.Character.GenerateGold()); FamilyDTO fam = session.Character.Family; DAOFactory.FamilyDAO.InsertOrUpdate(ref fam); ServerManager.Instance.FamilyRefresh(session.Character.Family.FamilyId); } else { session.SendPacket(session.Character.GenerateSay(Language.Instance.GetMessageFromKey("ONLY_HEAD_CAN_BUY"), 10)); session.SendPacket(UserInterfaceHelper.GenerateModal(Language.Instance.GetMessageFromKey("ONLY_HEAD_CAN_BUY"), 1)); } } break; case 1604: if (session.Character.Family?.FamilyLevel >= 5 && session.Character.Family.MaxSize < 70) { if (session.Character.FamilyCharacter.Authority == FamilyAuthority.Head) { if (5000000 >= session.Character.Gold) { session.SendPacket(session.Character.GenerateSay(Language.Instance.GetMessageFromKey("NOT_ENOUGH_MONEY"), 10)); return; } session.Character.Family.MaxSize = 70; session.Character.Gold -= 5000000; session.SendPacket(session.Character.GenerateGold()); FamilyDTO fam = session.Character.Family; DAOFactory.FamilyDAO.InsertOrUpdate(ref fam); ServerManager.Instance.FamilyRefresh(session.Character.Family.FamilyId); } else { session.SendPacket(session.Character.GenerateSay(Language.Instance.GetMessageFromKey("ONLY_HEAD_CAN_BUY"), 10)); session.SendPacket(UserInterfaceHelper.GenerateModal(Language.Instance.GetMessageFromKey("ONLY_HEAD_CAN_BUY"), 1)); } } break; case 1605: if (session.Character.Family?.FamilyLevel >= 9 && session.Character.Family.MaxSize < 100) { if (session.Character.FamilyCharacter.Authority == FamilyAuthority.Head) { if (10000000 >= session.Character.Gold) { session.SendPacket(session.Character.GenerateSay(Language.Instance.GetMessageFromKey("NOT_ENOUGH_MONEY"), 10)); return; } session.Character.Family.MaxSize = 100; session.Character.Gold -= 10000000; session.SendPacket(session.Character.GenerateGold()); FamilyDTO fam = session.Character.Family; DAOFactory.FamilyDAO.InsertOrUpdate(ref fam); ServerManager.Instance.FamilyRefresh(session.Character.Family.FamilyId); } else { session.SendPacket(session.Character.GenerateSay(Language.Instance.GetMessageFromKey("ONLY_HEAD_CAN_BUY"), 10)); session.SendPacket(UserInterfaceHelper.GenerateModal(Language.Instance.GetMessageFromKey("ONLY_HEAD_CAN_BUY"), 1)); } } break; case 23: if (type == 0) { if (session.Character.Group?.CharacterCount == 3) { foreach (ClientSession s in session.Character.Group.Characters.GetAllItems()) { if (s.Character.Family != null) { session.SendPacket(UserInterfaceHelper.GenerateInfo(Language.Instance.GetMessageFromKey("GROUP_MEMBER_ALREADY_IN_FAMILY"))); return; } } } if (session.Character.Group == null || session.Character.Group.CharacterCount != 3) { session.SendPacket(UserInterfaceHelper.GenerateInfo(Language.Instance.GetMessageFromKey("FAMILY_GROUP_NOT_FULL"))); return; } session.SendPacket(UserInterfaceHelper.GenerateInbox($"#glmk^ {14} 1 {Language.Instance.GetMessageFromKey("CREATE_FAMILY").Replace(' ', '^')}")); } else { if (session.Character.Family == null) { session.SendPacket(UserInterfaceHelper.GenerateInfo(Language.Instance.GetMessageFromKey("NOT_IN_FAMILY"))); return; } if (session.Character.Family != null && session.Character.FamilyCharacter != null && session.Character.FamilyCharacter.Authority != FamilyAuthority.Head) { session.SendPacket(UserInterfaceHelper.GenerateInfo(Language.Instance.GetMessageFromKey("NOT_FAMILY_HEAD"))); return; } session.SendPacket($"qna #glrm^1 {Language.Instance.GetMessageFromKey("DISMISS_FAMILY")}"); } break; case 60: StaticBonusDTO medalDTO = session.Character.StaticBonusList.Find(s => s.StaticBonusType == StaticBonusType.BazaarMedalGold || s.StaticBonusType == StaticBonusType.BazaarMedalSilver); byte medal = 0; int time = 0; if (medalDTO != null) { medal = medalDTO.StaticBonusType == StaticBonusType.BazaarMedalGold ? (byte)MedalType.Gold : (byte)MedalType.Silver; time = (int)(medalDTO.DateEnd - DateTime.UtcNow).TotalHours; } session.SendPacket($"wopen 32 {medal} {time}"); break; case 5002: tp = npc?.Teleporters?.FirstOrDefault(s => s.Index == type); if (tp != null) { //Session.SendPacket("it 3"); if (ServerManager.Instance.ChannelId == 51) { string connection = CommunicationServiceClient.Instance.RetrieveOriginWorld(session.Account.AccountId); if (string.IsNullOrWhiteSpace(connection)) { return; } session.Character.MapId = tp.MapId; session.Character.MapX = tp.MapX; session.Character.MapY = tp.MapY; int port = Convert.ToInt32(connection.Split(':')[1]); session.Character.ChangeChannel(connection.Split(':')[0], port, 3); } else { ServerManager.Instance.ChangeMap(session.Character.CharacterId, tp.MapId, tp.MapX, tp.MapY); } } break; case 5001: if (npc != null) { MapInstance map = null; switch (session.Character.Faction) { case FactionType.None: session.SendPacket(UserInterfaceHelper.GenerateInfo("You need to be part of a faction to join Act 4")); return; case FactionType.Angel: map = ServerManager.GetAllMapInstances().Find(s => s.MapInstanceType.Equals(MapInstanceType.Act4ShipAngel)); break; case FactionType.Demon: map = ServerManager.GetAllMapInstances().Find(s => s.MapInstanceType.Equals(MapInstanceType.Act4ShipDemon)); break; } if (map == null || npc.EffectActivated) { session.SendPacket(UserInterfaceHelper.GenerateMsg(Language.Instance.GetMessageFromKey("SHIP_NOTARRIVED"), 0)); return; } if (3000 > session.Character.Gold) { session.SendPacket(session.Character.GenerateSay(Language.Instance.GetMessageFromKey("NOT_ENOUGH_MONEY"), 10)); return; } session.Character.Gold -= 3000; MapCell pos = map.Map.GetRandomPosition(); ServerManager.Instance.ChangeMapInstance(session.Character.CharacterId, map.MapInstanceId, pos.X, pos.Y); } break; case 5004: if (npc != null) { ServerManager.Instance.ChangeMap(session.Character.CharacterId, 1, 81, 3); } break; case 5011: if (npc != null) { ServerManager.Instance.ChangeMap(session.Character.CharacterId, 170, 127, 46); } break; case 5012: tp = npc?.Teleporters?.FirstOrDefault(s => s.Index == type); if (tp != null) { ServerManager.Instance.ChangeMap(session.Character.CharacterId, tp.MapId, tp.MapX, tp.MapY); } break; default: Logger.Warn(string.Format(Language.Instance.GetMessageFromKey("NO_NRUN_HANDLER"), runner)); break; } }
public static void NRun(ClientSession session, NRunPacket packet) { if (!session.HasCurrentMapInstance) { return; } MapNpc npc = session.CurrentMapInstance.Npcs.FirstOrDefault(s => s.MapNpcId == packet.NpcId); TeleporterDTO tp; var rand = new Random(); switch (packet.Runner) { case 1: if (session.Character.Class != (byte)ClassType.Adventurer) { session.SendPacket( UserInterfaceHelper.Instance.GenerateMsg( Language.Instance.GetMessageFromKey("NOT_ADVENTURER"), 0)); return; } if (session.Character.Level < 15 || session.Character.JobLevel < 20) { session.SendPacket( UserInterfaceHelper.Instance.GenerateMsg(Language.Instance.GetMessageFromKey("TOO_LOW_LVL"), 0)); return; } if (packet.Type == (byte)session.Character.Class || packet.Type > 3 && session.Account.Authority < AuthorityType.GameMaster || packet.Type < 0) { return; } if (session.Character.Inventory.All(i => i.Value.Type != InventoryType.Wear)) { session.Character.Inventory.AddNewToInventory((short)(4 + packet.Type * 14), type: InventoryType.Wear); session.Character.Inventory.AddNewToInventory((short)(81 + packet.Type * 13), type: InventoryType.Wear); switch (packet.Type) { case 1: session.Character.Inventory.AddNewToInventory(68, type: InventoryType.Wear); session.Character.Inventory.AddNewToInventory(2082, 10); break; case 2: session.Character.Inventory.AddNewToInventory(78, type: InventoryType.Wear); session.Character.Inventory.AddNewToInventory(2083, 10); break; case 3: session.Character.Inventory.AddNewToInventory(86, type: InventoryType.Wear); break; } foreach (ItemInstance item in session.Character.Inventory.Values.Where(i => i.Type == InventoryType.Wear && i.Item.EquipmentSlot != EquipmentType.Sp)) { switch (item.Slot) { case (byte)EquipmentType.MainWeapon: session.Character.Inventory.PrimaryWeapon = (WearableInstance)item; break; case (byte)EquipmentType.SecondaryWeapon: session.Character.Inventory.SecondaryWeapon = (WearableInstance)item; break; case (byte)EquipmentType.Armor: session.Character.Inventory.Armor = (WearableInstance)item; break; } } session.CurrentMapInstance?.Broadcast(session.Character.GenerateEq()); session.SendPacket(session.Character.GenerateEquipment()); session.Character.ChangeClass((ClassType)packet.Type); } else { session.SendPacket( UserInterfaceHelper.Instance.GenerateMsg( Language.Instance.GetMessageFromKey("EQ_NOT_EMPTY"), 0)); } break; case 2: session.SendPacket("wopen 1 0"); break; case 4: Mate mate = session.Character.Mates.FirstOrDefault(s => s.MateTransportId == packet.NpcId); switch (packet.Type) { case 2: if (mate != null) { if (session.Character.Level >= mate.Level) { Mate teammate = session.Character.Mates.Where(s => s.IsTeamMember) .FirstOrDefault(s => s.MateType == mate.MateType); if (teammate != null) { teammate.RemoveTeamMember(); } mate.AddTeamMember(); } else { session.SendPacket( UserInterfaceHelper.Instance.GenerateMsg( Language.Instance.GetMessageFromKey("PET_HIGHER_LEVEL"), 0)); } } break; case 3: if (mate != null && session.Character.Miniland == session.Character.MapInstance) { mate.RemoveTeamMember(); } break; case 4: if (mate != null) { if (session.Character.Miniland == session.Character.MapInstance) { mate.RemoveTeamMember(); } else { session.SendPacket( $"qna #n_run^4^5^3^{mate.MateTransportId} {Language.Instance.GetMessageFromKey("ASK_KICK_PET")}"); } } break; case 5: if (mate != null) { session.SendPacket(UserInterfaceHelper.Instance.GenerateDelay(3000, 10, $"#n_run^4^6^3^{mate.MateTransportId}")); } break; case 6: if (mate != null) { if (session.Character.Miniland != session.Character.MapInstance) { mate.RemoveTeamMember(); session.CurrentMapInstance.Broadcast(mate.GenerateOut()); session.SendPacket(session.Character.GenerateSay( string.Format(Language.Instance.GetMessageFromKey("PET_KICKED"), mate.Name), 11)); session.SendPacket(UserInterfaceHelper.Instance.GenerateMsg( string.Format(Language.Instance.GetMessageFromKey("PET_KICKED"), mate.Name), 0)); } } break; case 7: if (mate != null) { if (session.Character.Mates.Any(s => s.MateType == mate.MateType && s.IsTeamMember)) { session.SendPacket(session.Character.GenerateSay( Language.Instance.GetMessageFromKey("ALREADY_PET_IN_TEAM"), 11)); session.SendPacket(UserInterfaceHelper.Instance.GenerateMsg( Language.Instance.GetMessageFromKey("ALREADY_PET_IN_TEAM"), 0)); } else { MateHelper.Instance.RemovePetBuffs(session); session.SendPacket(UserInterfaceHelper.Instance.GenerateDelay(3000, 10, $"#n_run^4^9^3^{mate.MateTransportId}")); } } break; case 9: if (mate != null) { if (session.Character.Level >= mate.Level) { mate.PositionX = (short)(session.Character.PositionX + 1); } mate.PositionY = (short)(session.Character.PositionY + 1); mate.AddTeamMember(); session.CurrentMapInstance.Broadcast(mate.GenerateIn()); } else { session.SendPacket( UserInterfaceHelper.Instance.GenerateMsg( Language.Instance.GetMessageFromKey("PET_HIGHER_LEVEL"), 0)); } break; } session.SendPacket(session.Character.GeneratePinit()); session.SendPackets(session.Character.Mates.Where(s => s.IsTeamMember) .OrderBy(s => s.MateType) .Select(s => s.GeneratePst())); break; case 10: session.SendPacket("wopen 3 0"); break; case 12: session.SendPacket($"wopen {packet.Type} 0"); break; case 14: session.SendPacket("wopen 27 0"); string recipelist = "m_list 2"; if (npc != null) { List <Recipe> tps = npc.Recipes; recipelist = tps.Where(s => s.Amount > 0) .Aggregate(recipelist, (current, s) => current + $" {s.ItemVNum}"); recipelist += " -100"; session.SendPacket(recipelist); } break; case 15: if (npc != null) { if (packet.Value == 2) { session.SendPacket( $"qna #n_run^15^1^1^{npc.MapNpcId} {Language.Instance.GetMessageFromKey("ASK_CHANGE_SPAWNLOCATION")}"); } else { switch (npc.MapId) { case 1: session.Character.SetRespawnPoint(1, 79, 116); break; case 20: session.Character.SetRespawnPoint(20, 9, 92); break; case 145: session.Character.SetRespawnPoint(145, 13, 110); break; case (short)SpecialMapIdType.Lobby: session.Character.SetRespawnPoint((short)SpecialMapIdType.Lobby, 145, 91); break; } session.SendPacket(UserInterfaceHelper.Instance.GenerateMsg( Language.Instance.GetMessageFromKey("RESPAWNLOCATION_CHANGED"), 0)); } } break; case 16: tp = npc?.Teleporters?.FirstOrDefault(s => s.Index == packet.Type); if (tp != null) { if (session.Character.Gold >= 1000 * packet.Type) { session.Character.Gold -= 1000 * packet.Type; session.SendPacket(session.Character.GenerateGold()); ServerManager.Instance.ChangeMap(session.Character.CharacterId, tp.MapId, tp.MapX, tp.MapY); } else { session.SendPacket( session.Character.GenerateSay(Language.Instance.GetMessageFromKey("NOT_ENOUGH_MONEY"), 10)); } } break; case 17: double currentRunningSeconds = (DateTime.Now - Process.GetCurrentProcess().StartTime.AddSeconds(-50)).TotalSeconds; double timeSpanSinceLastPortal = currentRunningSeconds - session.Character.LastPortal; if (packet.Type < 0) { // Packet hacking allowing duplication return; } if (!(timeSpanSinceLastPortal >= 4) || !session.HasCurrentMapInstance || session.CurrentMapInstance.MapInstanceType == MapInstanceType.Act4Instance) { session.SendPacket( session.Character.GenerateSay(Language.Instance.GetMessageFromKey("CANT_MOVE"), 10)); return; } if (session.CurrentMapInstance.MapInstanceType == MapInstanceType.RaidInstance) { session.SendPacket( session.Character.GenerateSay( Language.Instance.GetMessageFromKey("CANT_JOIN_ARENA_IN_RAID"), 10)); return; } if (session.Character.Gold >= 500 * (1 + packet.Type)) { session.Character.LastPortal = currentRunningSeconds; session.Character.Gold -= 500 * (1 + packet.Type); session.SendPacket(session.Character.GenerateGold()); ServerManager.Instance.TeleportOnRandomPlaceInMap(session, packet.Type == 0 ? ServerManager.Instance.ArenaInstance.MapInstanceId : ServerManager.Instance.FamilyArenaInstance.MapInstanceId); } else { session.SendPacket( session.Character.GenerateSay(Language.Instance.GetMessageFromKey("NOT_ENOUGH_MONEY"), 10)); } break; case 18: session.SendPacket(session.Character.GenerateNpcDialog(17)); break; case 26: tp = npc?.Teleporters?.FirstOrDefault(s => s.Index == packet.Type); if (tp != null) { if (session.Character.Gold >= 5000 * packet.Type && packet.Type > 0) { session.Character.Gold -= 5000 * packet.Type; ServerManager.Instance.ChangeMap(session.Character.CharacterId, tp.MapId, tp.MapX, tp.MapY); } else { session.SendPacket( session.Character.GenerateSay(Language.Instance.GetMessageFromKey("NOT_ENOUGH_MONEY"), 10)); } } break; case 45: tp = npc?.Teleporters?.FirstOrDefault(s => s.Index == packet.Type); if (tp != null) { if (session.Character.Gold >= 500) { session.Character.Gold -= 500; session.SendPacket(session.Character.GenerateGold()); ServerManager.Instance.ChangeMap(session.Character.CharacterId, tp.MapId, tp.MapX, tp.MapY); } else { session.SendPacket( session.Character.GenerateSay(Language.Instance.GetMessageFromKey("NOT_ENOUGH_MONEY"), 10)); } } break; case 61: if (session.Character.Inventory.CountItem(5917) <= 0 || session.Character.Inventory.CountItem(5918) <= 0 || npc == null) { return; } session.Character.GiftAdd(5922, 1); session.Character.Inventory.RemoveItemAmount(5917); session.Character.Inventory.RemoveItemAmount(5918); break; case 62: if (npc == null || session.Character.Inventory.CountItem(5919) <= 0) { return; } ServerManager.Instance.ChangeMap(session.Character.CharacterId, 2536, 26, 31); session.Character.Inventory.RemoveItemAmount(5919); break; case 65: if (npc == null) { return; } session.Character.AddQuest(5514); break; case 66: if (npc == null) { return; } session.Character.AddQuest(5914); break; case 67: if (npc == null) { return; } session.Character.AddQuest(5908); break; case 68: if (npc == null) { return; } session.Character.AddQuest(5919); break; case 132: tp = npc?.Teleporters?.FirstOrDefault(s => s.Index == packet.Type); if (tp != null) { ServerManager.Instance.ChangeMap(session.Character.CharacterId, tp.MapId, tp.MapX, tp.MapY); } break; case 137: session.SendPacket("taw_open"); break; case 138: ConcurrentBag <ArenaTeamMember> at = ServerManager.Instance.ArenaTeams.OrderBy(s => rand.Next()) .FirstOrDefault(); if (at != null) { ServerManager.Instance.ChangeMapInstance(session.Character.CharacterId, at.FirstOrDefault(s => s.Session != null).Session.CurrentMapInstance.MapInstanceId, 69, 100); ArenaTeamMember zenas = at.OrderBy(s => s.Order).FirstOrDefault(s => s.Session != null && !s.Dead && s.ArenaTeamType == ArenaTeamType.ZENAS); ArenaTeamMember erenia = at.OrderBy(s => s.Order).FirstOrDefault(s => s.Session != null && !s.Dead && s.ArenaTeamType == ArenaTeamType.ERENIA); session.SendPacket(erenia.Session.Character.GenerateTaM(0)); session.SendPacket(erenia.Session.Character.GenerateTaM(3)); session.SendPacket("taw_sv 0"); session.SendPacket(zenas.Session.Character.GenerateTaP(0, true)); session.SendPacket(erenia.Session.Character.GenerateTaP(2, true)); session.SendPacket(zenas.Session.Character.GenerateTaFc(0)); session.SendPacket(erenia.Session.Character.GenerateTaFc(1)); } else { session.SendPacket( UserInterfaceHelper.Instance.GenerateInfo( Language.Instance.GetMessageFromKey("NO_TALENT_ARENA"))); } break; case 135: if (!ServerManager.Instance.StartedEvents.Contains(EventType.TALENTARENA)) { session.SendPacket(npc?.GenerateSay(Language.Instance.GetMessageFromKey("ARENA_NOT_OPEN"), 10)); } else { int tickets = 5 - session.Character.GeneralLogs.Count(s => s.LogType == "TalentArena" && s.Timestamp.Date == DateTime.Today); if (ServerManager.Instance.ArenaMembers.All(s => s.Session != session) && tickets > 0) { if (ServerManager.Instance.IsCharacterMemberOfGroup(session.Character.CharacterId)) { session.SendPacket( UserInterfaceHelper.Instance.GenerateMsg( Language.Instance.GetMessageFromKey("TALENT_ARENA_GROUP"), 0)); session.SendPacket( session.Character.GenerateSay( Language.Instance.GetMessageFromKey("TALENT_ARENA_GROUP"), 10)); } else { session.SendPacket(session.Character.GenerateSay( string.Format(Language.Instance.GetMessageFromKey("ARENA_TICKET_LEFT"), tickets), 10)); ServerManager.Instance.ArenaMembers.Add(new ArenaMember { ArenaType = EventType.TALENTARENA, Session = session, GroupId = null, Time = 0 }); } } else { session.SendPacket(UserInterfaceHelper.Instance.GenerateMsg( Language.Instance.GetMessageFromKey("TALENT_ARENA_NO_MORE_TICKET"), 0)); session.SendPacket(session.Character.GenerateSay( Language.Instance.GetMessageFromKey("TALENT_ARENA_NO_MORE_TICKET"), 10)); } } break; case 150: if (npc == null || !npc.EffectActivated && ServerManager.Instance.LodTimes || session.Character.Level < ServerManager.Instance.MinLodLevel) { return; } if (session.Character?.Family == null) { session.SendPacket( UserInterfaceHelper.Instance.GenerateMsg(Language.Instance.GetMessageFromKey("NEED_FAMILY"), 0)); break; } if (session.Character?.Family?.LandOfDeath != null) { ServerManager.Instance.ChangeMapInstance(session.Character.CharacterId, session.Character.Family.LandOfDeath.MapInstanceId, 153, 145); } break; case 300: if (npc == null) { return; } session.Character.AddQuest(6040); break; case 301: tp = npc?.Teleporters?.FirstOrDefault(s => s.Index == packet.Type); if (tp != null) { ServerManager.Instance.ChangeMap(session.Character.CharacterId, tp.MapId, tp.MapX, tp.MapY); } break; case 1600: session.SendPacket(session.Character.OpenFamilyWarehouse()); break; case 1601: session.SendPackets(session.Character.OpenFamilyWarehouseHist()); break; case 1602: if (session.Character.Family != null && session.Character.Family.FamilyLevel >= 3 && session.Character.Family.WarehouseSize < 21) { if (session.Character.FamilyCharacter.Authority == FamilyAuthority.Head) { if (500000 >= session.Character.Gold) { session.SendPacket( session.Character.GenerateSay( Language.Instance.GetMessageFromKey("NOT_ENOUGH_MONEY"), 10)); return; } session.Character.Family.WarehouseSize = 21; session.Character.Gold -= 500000; session.SendPacket(session.Character.GenerateGold()); FamilyDTO fam = session.Character.Family; DaoFactory.FamilyDao.InsertOrUpdate(ref fam); ServerManager.Instance.FamilyRefresh(session.Character.Family.FamilyId); } else { session.SendPacket( session.Character.GenerateSay(Language.Instance.GetMessageFromKey("ONLY_HEAD_CAN_BUY"), 10)); session.SendPacket( UserInterfaceHelper.Instance.GenerateModal( Language.Instance.GetMessageFromKey("ONLY_HEAD_CAN_BUY"), 1)); } } break; case 1603: if (session.Character.Family != null && session.Character.Family.FamilyLevel >= 7 && session.Character.Family.WarehouseSize < 49) { if (session.Character.FamilyCharacter.Authority == FamilyAuthority.Head) { if (2000000 >= session.Character.Gold) { session.SendPacket( session.Character.GenerateSay( Language.Instance.GetMessageFromKey("NOT_ENOUGH_MONEY"), 10)); return; } session.Character.Family.WarehouseSize = 49; session.Character.Gold -= 2000000; session.SendPacket(session.Character.GenerateGold()); FamilyDTO fam = session.Character.Family; DaoFactory.FamilyDao.InsertOrUpdate(ref fam); ServerManager.Instance.FamilyRefresh(session.Character.Family.FamilyId); } else { session.SendPacket( session.Character.GenerateSay(Language.Instance.GetMessageFromKey("ONLY_HEAD_CAN_BUY"), 10)); session.SendPacket( UserInterfaceHelper.Instance.GenerateModal( Language.Instance.GetMessageFromKey("ONLY_HEAD_CAN_BUY"), 1)); } } break; case 1604: if (session.Character.Family != null && session.Character.Family.FamilyLevel >= 5 && session.Character.Family.MaxSize < 70) { if (session.Character.FamilyCharacter.Authority == FamilyAuthority.Head) { if (5000000 >= session.Character.Gold) { session.SendPacket( session.Character.GenerateSay( Language.Instance.GetMessageFromKey("NOT_ENOUGH_MONEY"), 10)); return; } session.Character.Family.MaxSize = 70; session.Character.Gold -= 5000000; session.SendPacket(session.Character.GenerateGold()); FamilyDTO fam = session.Character.Family; DaoFactory.FamilyDao.InsertOrUpdate(ref fam); ServerManager.Instance.FamilyRefresh(session.Character.Family.FamilyId); } else { session.SendPacket( session.Character.GenerateSay(Language.Instance.GetMessageFromKey("ONLY_HEAD_CAN_BUY"), 10)); session.SendPacket( UserInterfaceHelper.Instance.GenerateModal( Language.Instance.GetMessageFromKey("ONLY_HEAD_CAN_BUY"), 1)); } } break; case 1605: if (session.Character.Family != null && session.Character.Family.FamilyLevel >= 9 && session.Character.Family.MaxSize < 100) { if (session.Character.FamilyCharacter.Authority == FamilyAuthority.Head) { if (10000000 >= session.Character.Gold) { session.SendPacket( session.Character.GenerateSay( Language.Instance.GetMessageFromKey("NOT_ENOUGH_MONEY"), 10)); return; } session.Character.Family.MaxSize = 100; session.Character.Gold -= 10000000; session.SendPacket(session.Character.GenerateGold()); FamilyDTO fam = session.Character.Family; DaoFactory.FamilyDao.InsertOrUpdate(ref fam); ServerManager.Instance.FamilyRefresh(session.Character.Family.FamilyId); } else { session.SendPacket( session.Character.GenerateSay(Language.Instance.GetMessageFromKey("ONLY_HEAD_CAN_BUY"), 10)); session.SendPacket( UserInterfaceHelper.Instance.GenerateModal( Language.Instance.GetMessageFromKey("ONLY_HEAD_CAN_BUY"), 1)); } } break; case 23: if (packet.Type == 0) { if (session.Character.Group != null && session.Character.Group.CharacterCount == 3) { if (session.Character.Group.Characters.Any(s => s.Character.Family != null)) { session.SendPacket(UserInterfaceHelper.Instance.GenerateInfo( Language.Instance.GetMessageFromKey("GROUP_MEMBER_ALREADY_IN_FAMILY"))); return; } } if (session.Character.Group == null || session.Character.Group.CharacterCount != 3) { session.SendPacket( UserInterfaceHelper.Instance.GenerateInfo( Language.Instance.GetMessageFromKey("FAMILY_GROUP_NOT_FULL"))); return; } session.SendPacket(UserInterfaceHelper.Instance.GenerateInbox( $"#glmk^ {14} 1 {Language.Instance.GetMessageFromKey("CREATE_FAMILY").Replace(' ', '^')}")); } else { if (session.Character.Family == null) { session.SendPacket( UserInterfaceHelper.Instance.GenerateInfo( Language.Instance.GetMessageFromKey("NOT_IN_FAMILY"))); return; } if (session.Character.Family != null && session.Character.FamilyCharacter != null && session.Character.FamilyCharacter.Authority != FamilyAuthority.Head) { session.SendPacket( UserInterfaceHelper.Instance.GenerateInfo( Language.Instance.GetMessageFromKey("NOT_FAMILY_HEAD"))); return; } session.SendPacket($"qna #glrm^1 {Language.Instance.GetMessageFromKey("DISMISS_FAMILY")}"); } break; case 60: StaticBonusDTO medal = session.Character.StaticBonusList.FirstOrDefault(s => s.StaticBonusType == StaticBonusType.BazaarMedalGold || s.StaticBonusType == StaticBonusType.BazaarMedalSilver); byte Medal = 0; int Time = 0; if (medal != null) { Medal = medal.StaticBonusType == StaticBonusType.BazaarMedalGold ? (byte)MedalType.Gold : (byte)MedalType.Silver; Time = (int)(medal.DateEnd - DateTime.Now).TotalHours; } session.SendPacket($"wopen 32 {Medal} {Time}"); break; case 3000: if (npc != null) { } break; case 3006: if (npc != null) { session.Character.AddQuest(packet.Type); } break; case 5001: if (npc != null) { MapInstance ship = session.Character.Faction == FactionType.Angel ? ServerManager.Instance.Act4ShipAngel : ServerManager.Instance.Act4ShipDemon; switch (session.Character.Faction) { case FactionType.Neutral: session.SendPacket(UserInterfaceHelper.Instance.GenerateInfo("NEED_FACTION_ACT4")); return; } if (3000 > session.Character.Gold) { session.SendPacket( session.Character.GenerateSay(Language.Instance.GetMessageFromKey("NOT_ENOUGH_MONEY"), 10)); return; } ServerManager.Instance.ChangeMapInstance(session.Character.CharacterId, ship.MapInstanceId, ServerManager.Instance.RandomNumber(15, 25), ServerManager.Instance.RandomNumber(28, 33)); } break; case 5002: if (npc != null) { tp = npc.Teleporters?.FirstOrDefault(s => s.Index == packet.Type); if (tp != null) { session.SendPacket("it 3"); SerializableWorldServer connection = CommunicationServiceClient.Instance.GetPreviousChannelByAccountId(session.Account .AccountId); if (connection == null || session.Character == null) { break; } session.Character.MapId = tp.MapId; session.Character.MapX = tp.MapX; session.Character.MapY = tp.MapY; session.Character.ChangeChannel(connection.EndPointIp, connection.EndPointPort, 3); } } break; case 5004: if (npc == null) { return; } ServerManager.Instance.ChangeMap(session.Character.CharacterId, 145, 52, 41); break; case 5011: if (npc != null) { ServerManager.Instance.ChangeMap(session.Character.CharacterId, 170, 127, 46); } break; case 5012: tp = npc?.Teleporters?.FirstOrDefault(s => s.Index == packet.Type); if (tp != null) { ServerManager.Instance.ChangeMap(session.Character.CharacterId, tp.MapId, tp.MapX, tp.MapY); } break; default: Logger.Log.Warn( string.Format(Language.Instance.GetMessageFromKey("NO_NRUN_HANDLER"), packet.Runner)); break; } }
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)); } } }
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; } }