private void ExecuteHandler(ClientSession session) { if (session.Character.NoMove == 0) { if (session.Character.MeditationDictionary.Count != 0) { session.Character.MeditationDictionary.Clear(); } session.Character.IsAfk = false; double currentRunningSeconds = (DateTime.UtcNow - Process.GetCurrentProcess().StartTime.AddHours(-2).AddSeconds(-50)).TotalSeconds; double timeSpanSinceLastPortal = currentRunningSeconds - session.Character.LastPortal; int distance = Map.GetDistance(new MapCell { X = session.Character.PositionX, Y = session.Character.PositionY }, new MapCell { X = XCoordinate, Y = YCoordinate }); if (session.HasCurrentMapInstance && !session.CurrentMapInstance.Map.IsBlockedZone(XCoordinate, YCoordinate) && !session.Character.IsChangingMapInstance && !session.Character.HasShopOpened) { if ((session.Character.Speed >= Speed || session.Character.LastSpeedChange.AddSeconds(5) > DateTime.UtcNow) && !(distance > 60 && timeSpanSinceLastPortal > 10)) { #region Direction Calculation if (XCoordinate < session.Character.PositionX && YCoordinate < session.Character.PositionY) // NW { session.Character.Direction = 4; } else if (XCoordinate == session.Character.PositionX && YCoordinate < session.Character.PositionY) // N { session.Character.Direction = 0; } else if (XCoordinate > session.Character.PositionX && YCoordinate < session.Character.PositionY) // NE { session.Character.Direction = 6; } else if (XCoordinate < session.Character.PositionX && YCoordinate == session.Character.PositionY) // W { session.Character.Direction = 3; } // X&Y equal is impossible, skipping else if (XCoordinate > session.Character.PositionX && YCoordinate == session.Character.PositionY) // E { session.Character.Direction = 1; } else if (XCoordinate < session.Character.PositionX && YCoordinate > session.Character.PositionY) // SW { session.Character.Direction = 7; } else if (XCoordinate == session.Character.PositionX && YCoordinate > session.Character.PositionY) // S { session.Character.Direction = 2; } else if (XCoordinate > session.Character.PositionX && YCoordinate > session.Character.PositionY) // SE { session.Character.Direction = 5; } #endregion if (session.Character.MapInstance.MapInstanceType == MapInstanceType.BaseMapInstance) { session.Character.MapX = XCoordinate; session.Character.MapY = YCoordinate; } session.Character.PositionX = XCoordinate; session.Character.PositionY = YCoordinate; if (session.Character.LastMonsterAggro.AddSeconds(5) > DateTime.UtcNow) { session.Character.UpdateBushFire(); } if (!session.Character.InvisibleGm) { session.CurrentMapInstance?.Broadcast(StaticPacketHelper.Move(UserType.Player, session.Character.CharacterId, session.Character.PositionX, session.Character.PositionY, session.Character.Speed)); } session.SendPacket(session.Character.GenerateCond()); session.Character.LastMove = DateTime.UtcNow; session.CurrentMapInstance?.OnAreaEntryEvents ?.Where(s => s.InZone(session.Character.PositionX, session.Character.PositionY)).ToList() .ForEach(e => e.Events.ForEach(evt => EventHelper.Instance.RunEvent(evt))); session.CurrentMapInstance?.OnAreaEntryEvents?.RemoveAll(s => s.InZone(session.Character.PositionX, session.Character.PositionY)); session.CurrentMapInstance?.OnMoveOnMapEvents?.ForEach(e => EventHelper.Instance.RunEvent(e)); session.CurrentMapInstance?.OnMoveOnMapEvents?.RemoveAll(s => s != null); if (session.CurrentMapInstance != null) { session.Character.OnMove(new MoveEventArgs(session.CurrentMapInstance.Map.MapId, session.Character.PositionX, session.Character.PositionY)); } } else { session.SendPacket(UserInterfaceHelper.GenerateModal( "This is an automatique message, your movement got corrupted\n" + "Please use $Unstuck\n", 0)); } } } }
public override void Use(ClientSession session, ref ItemInstance inv, byte Option = 0, string[] packetsplit = null) { switch (Effect) { default: bool delay = false; if (Option == 255) { delay = true; Option = 0; } Mate mate = null; if (Option != 0) { mate = session.Character.Mates.Find(s => s.MateType == MateType.Partner && s.PetId == Option - 1); if (mate == null || mate.IsTemporalMate) { return; } } short slot = inv.Slot; InventoryType equipment = InventoryType.Wear; if (Option > 0) { equipment = (InventoryType)(12 + Option); } InventoryType itemToWearType = inv.Type; if (inv == null) { return; } if (ItemValidTime > 0 && !inv.IsBound) { inv.ItemDeleteTime = DateTime.Now.AddSeconds(ItemValidTime); } else if (!inv.IsBound && ItemType == ItemType.Jewelery && new int[] { 3951, 3952, 3953, 3954, 3955, 7427 }.Contains(EffectValue)) { inv.ItemDeleteTime = DateTime.Now.AddSeconds(3600); } if (!inv.IsBound) { switch (inv.Item.Effect) { case 790: // Tarot case 932: // Attack amulet case 933: // defense amulet inv.BoundCharacterId = session.Character.CharacterId; break; } if (!delay && ((EquipmentSlot == EquipmentType.Fairy && (MaxElementRate == 70 || MaxElementRate == 80)) || EquipmentSlot == EquipmentType.CostumeHat || EquipmentSlot == EquipmentType.CostumeSuit || EquipmentSlot == EquipmentType.WeaponSkin)) { session.SendPacket($"qna #u_i^1^{session.Character.CharacterId}^{(byte)itemToWearType}^{slot}^1 {Language.Instance.GetMessageFromKey("ASK_BIND")}"); return; } if (delay) { inv.BoundCharacterId = session.Character.CharacterId; } } double timeSpanSinceLastSpUsage = (DateTime.Now - Process.GetCurrentProcess().StartTime.AddSeconds(-50)).TotalSeconds - session.Character.LastSp; if (EquipmentSlot == EquipmentType.Sp && inv.Rare == -2) { session.SendPacket(UserInterfaceHelper.GenerateMsg(Language.Instance.GetMessageFromKey("CANT_EQUIP_DESTROYED_SP"), 0)); return; } if (Option == 0) { if (EquipmentSlot == EquipmentType.Sp && timeSpanSinceLastSpUsage <= session.Character.SpCooldown && session.Character.Inventory.LoadBySlotAndType((byte)EquipmentType.Sp, InventoryType.Specialist) != null) { session.SendPacket(UserInterfaceHelper.GenerateMsg(string.Format(Language.Instance.GetMessageFromKey("SP_INLOADING"), session.Character.SpCooldown - (int)Math.Round(timeSpanSinceLastSpUsage)), 0)); return; } if ((ItemType != ItemType.Weapon && ItemType != ItemType.Armor && ItemType != ItemType.Fashion && ItemType != ItemType.Jewelery && ItemType != ItemType.Specialist) || LevelMinimum > (IsHeroic ? session.Character.HeroLevel : session.Character.Level) || (Sex != 0 && Sex != (byte)session.Character.Gender + 1) || (ItemType != ItemType.Jewelery && EquipmentSlot != EquipmentType.Boots && EquipmentSlot != EquipmentType.Gloves && ((Class >> (byte)session.Character.Class) & 1) != 1)) { session.SendPacket(session.Character.GenerateSay(Language.Instance.GetMessageFromKey("BAD_EQUIPMENT"), 10)); return; } if (session.Character.UseSp) { if (session.Character.Inventory.LoadBySlotAndType((byte)EquipmentType.Sp, equipment) is ItemInstance sp && sp.Item.Element != 0 && EquipmentSlot == EquipmentType.Fairy && Element != sp.Item.Element && Element != sp.Item.SecondaryElement) { session.SendPacket(UserInterfaceHelper.GenerateMsg(Language.Instance.GetMessageFromKey("BAD_FAIRY"), 0)); return; } } if (ItemType == ItemType.Weapon || ItemType == ItemType.Armor) { if (inv.BoundCharacterId.HasValue && inv.BoundCharacterId.Value != session.Character.CharacterId) { session.SendPacket(session.Character.GenerateSay(Language.Instance.GetMessageFromKey("BAD_EQUIPMENT"), 10)); return; } } if (session.Character.UseSp && EquipmentSlot == EquipmentType.Sp) { session.SendPacket(session.Character.GenerateSay(Language.Instance.GetMessageFromKey("SP_BLOCKED"), 10)); return; } if (session.Character.JobLevel < LevelJobMinimum) { session.SendPacket(session.Character.GenerateSay(Language.Instance.GetMessageFromKey("LOW_JOB_LVL"), 10)); return; } } else if (mate != null) { if (inv.Item.EquipmentSlot == EquipmentType.MainWeapon || inv.Item.EquipmentSlot == EquipmentType.SecondaryWeapon || inv.Item.EquipmentSlot == EquipmentType.Armor) { switch (mate.Monster.AttackClass) { case 0: if (inv.ItemVNum != 990 && inv.ItemVNum != 997) { session.SendPacket(session.Character.GenerateSay(Language.Instance.GetMessageFromKey("BAD_EQUIPMENT"), 10)); return; } break; case 1: if (inv.ItemVNum != 991 && inv.ItemVNum != 996) { session.SendPacket(session.Character.GenerateSay(Language.Instance.GetMessageFromKey("BAD_EQUIPMENT"), 10)); return; } break; case 2: if (inv.ItemVNum != 992 && inv.ItemVNum != 995) { session.SendPacket(session.Character.GenerateSay(Language.Instance.GetMessageFromKey("BAD_EQUIPMENT"), 10)); return; } break; } } if (mate.Level < LevelMinimum) { session.SendPacket(session.Character.GenerateSay(Language.Instance.GetMessageFromKey("BAD_EQUIPMENT"), 10)); return; } Item partnerEquipment = ServerManager.GetItem(inv.ItemVNum); bool isBadEquipment = false; switch (partnerEquipment.EquipmentSlot) { case EquipmentType.MainWeapon: { if (partnerEquipment.ItemSubType != 12) { isBadEquipment = true; } else { mate.WeaponInstance = inv; } } break; case EquipmentType.Armor: { if (partnerEquipment.ItemSubType != 4) { isBadEquipment = true; } else { mate.ArmorInstance = inv; } } break; case EquipmentType.Gloves: { mate.GlovesInstance = inv; } break; case EquipmentType.Boots: { mate.BootsInstance = inv; } break; case EquipmentType.Sp: { if (mate.IsUsingSp) { return; } if (partnerEquipment.ItemSubType != 4 || !PartnerHelper.CanWearSp(mate.NpcMonsterVNum, inv.ItemVNum)) { isBadEquipment = true; } else { if (!mate.CanUseSp()) { int spRemainingCooldown = mate.GetSpRemainingCooldown(); session.SendPacket(session.Character.GenerateSay(string.Format(Language.Instance.GetMessageFromKey("STAY_TIME"), spRemainingCooldown), 11)); session.SendPacket($"psd {spRemainingCooldown}"); return; } mate.Sp = new PartnerSp(inv); } } break; } if (isBadEquipment) { session.SendPacket(session.Character.GenerateSay(Language.Instance.GetMessageFromKey("BAD_EQUIPMENT"), 10)); return; } } ItemInstance currentlyEquippedItem = session.Character.Inventory.LoadBySlotAndType((short)EquipmentSlot, equipment); if (currentlyEquippedItem == null) { // move from equipment to wear session.Character.Inventory.MoveInInventory(inv.Slot, itemToWearType, equipment); session.SendPacket(UserInterfaceHelper.Instance.GenerateInventoryRemove(itemToWearType, slot)); } else { Logger.LogUserEvent("EQUIPMENT_TAKEOFF", session.GenerateIdentity(), $"IIId: {currentlyEquippedItem.Id} ItemVnum: {currentlyEquippedItem.ItemVNum} Upgrade: {currentlyEquippedItem.Upgrade} Rare: {currentlyEquippedItem.Rare}"); // move from wear to equipment and back session.Character.Inventory.MoveInInventory(currentlyEquippedItem.Slot, equipment, itemToWearType, inv.Slot); session.SendPacket(currentlyEquippedItem.GenerateInventoryAdd()); session.Character.EquipmentBCards.RemoveAll(o => o.ItemVNum == currentlyEquippedItem.ItemVNum); } Logger.LogUserEvent("EQUIPMENT_WEAR", session.GenerateIdentity(), $"IIId: {inv.Id} ItemVnum: {inv.ItemVNum} Upgrade: {inv.Upgrade} Rare: {inv.Rare}"); ScriptedInstance raid = ServerManager.Instance.Raids.FirstOrDefault(s => s.RequiredItems?.Any(obj => obj?.VNum == VNum) == true)?.Copy(); if (raid?.DailyEntries > 0) { var entries = raid.DailyEntries - session.Character.GeneralLogs.CountLinq(s => s.LogType == "InstanceEntry" && short.Parse(s.LogData) == raid.Id && s.Timestamp.Date == DateTime.Today); session.SendPacket(session.Character.GenerateSay(string.Format(Language.Instance.GetMessageFromKey("INSTANCE_ENTRIES"), entries), 10)); } if (mate == null) { session.Character.EquipmentBCards.AddRange(inv.Item.BCards); switch (inv.Item.ItemType) { case ItemType.Armor: session.Character.ShellEffectArmor.Clear(); foreach (ShellEffectDTO dto in inv.ShellEffects) { session.Character.ShellEffectArmor.Add(dto); } break; case ItemType.Weapon: switch (inv.Item.EquipmentSlot) { case EquipmentType.MainWeapon: session.Character.ShellEffectMain.Clear(); foreach (ShellEffectDTO dto in inv.ShellEffects) { session.Character.ShellEffectMain.Add(dto); } break; case EquipmentType.SecondaryWeapon: session.Character.ShellEffectSecondary.Clear(); foreach (ShellEffectDTO dto in inv.ShellEffects) { session.Character.ShellEffectSecondary.Add(dto); } break; } break; } } else { mate.BattleEntity.BCards.AddRange(inv.Item.BCards); } if (Option == 0) { session.SendPackets(session.Character.GenerateStatChar()); session.CurrentMapInstance?.Broadcast(session.Character.GenerateEq()); session.SendPacket(session.Character.GenerateEquipment()); session.CurrentMapInstance?.Broadcast(session.Character.GeneratePairy()); if (EquipmentSlot == EquipmentType.Fairy) { ItemInstance fairy = session.Character.Inventory.LoadBySlotAndType((byte)EquipmentType.Fairy, equipment); session.SendPacket(session.Character.GenerateSay(string.Format(Language.Instance.GetMessageFromKey("FAIRYSTATS"), fairy.XP, CharacterHelper.LoadFairyXPData(fairy.ElementRate + fairy.Item.ElementRate)), 10)); } if (EquipmentSlot == EquipmentType.Amulet) { session.SendPacket(StaticPacketHelper.GenerateEff(UserType.Player, session.Character.CharacterId, 39)); inv.BoundCharacterId = session.Character.CharacterId; if (inv.ItemDeleteTime > DateTime.Now || inv.DurabilityPoint > 0) { session.Character.AddBuff(new Buff(62, session.Character.Level), session.Character.BattleEntity); } } } else if (mate != null) { session.SendPacket(mate.GenerateScPacket()); } break; } }
internal static void ChangeSp(this ClientSession session) { ItemInstance sp = session.Character.Inventory.LoadBySlotAndType((byte)EquipmentType.Sp, InventoryType.Wear); ItemInstance fairy = session.Character.Inventory.LoadBySlotAndType((byte)EquipmentType.Fairy, InventoryType.Wear); if (sp != null) { if (session.Character.GetReputationIco() < sp.Item.ReputationMinimum) { session.SendPacket(UserInterfaceHelper.GenerateMsg(Language.Instance.GetMessageFromKey("LOW_REP"), 0)); return; } if (fairy != null && sp.Item.Element != 0 && fairy.Item.Element != sp.Item.Element && fairy.Item.Element != sp.Item.SecondaryElement) { session.SendPacket(UserInterfaceHelper.GenerateMsg(Language.Instance.GetMessageFromKey("BAD_FAIRY"), 0)); return; } session.Character.DisableBuffs(BuffType.All, force: true); session.Character.EquipmentBCards.AddRange(sp.Item.BCards); session.Character.LastTransform = DateTime.UtcNow; session.Character.UseSp = true; session.Character.Morph = sp.Item.Morph; session.Character.MorphUpgrade = sp.Upgrade; session.Character.MorphUpgrade2 = sp.Design; session.CurrentMapInstance?.Broadcast(session.Character.GenerateCMode()); session.SendPacket(session.Character.GenerateLev()); session.CurrentMapInstance?.Broadcast( StaticPacketHelper.GenerateEff(UserType.Player, session.Character.CharacterId, 196), session.Character.PositionX, session.Character.PositionY); session.CurrentMapInstance?.Broadcast( UserInterfaceHelper.GenerateGuri(6, 1, session.Character.CharacterId), session.Character.PositionX, session.Character.PositionY); session.SendPacket(session.Character.GenerateSpPoint()); session.Character.LoadSpeed(); session.SendPacket(session.Character.GenerateCond()); session.SendPacket(session.Character.GenerateStat()); session.SendPacket(session.Character.GenerateStatChar()); session.Character.SkillsSp = new ThreadSafeSortedList <int, CharacterSkill>(); Parallel.ForEach(ServerManager.GetAllSkill(), skill => { if (skill.Class == session.Character.Morph + 31 && sp.SpLevel >= skill.LevelMinimum) { session.Character.SkillsSp[skill.SkillVNum] = new CharacterSkill { SkillVNum = skill.SkillVNum, CharacterId = session.Character.CharacterId }; } }); session.SendPacket(session.Character.GenerateSki()); session.SendPackets(session.Character.GenerateQuicklist()); GameLogger.Instance.LogSpecialistWear(ServerManager.Instance.ChannelId, session.Character.Name, session.Character.CharacterId, sp.Item.Morph); } }
public string GenerateIn() => StaticPacketHelper.In(Domain.UserType.Object, State ? EnabledVNum : DisabledVNum, MapButtonId, PositionX, PositionY, 1, 0, 0, 0, 0, false, "-", false);
public override void Use(ClientSession session, ref ItemInstance inv, byte Option = 0, string[] packetsplit = null) { switch (Effect) { default: bool delay = false; if (Option == 255) { delay = true; Option = 0; } Mate mate = null; if (Option != 0) { mate = session.Character.Mates.Find(s => s.MateType == MateType.Partner && s.PetId == Option - 1); } short slot = inv.Slot; InventoryType equipment = InventoryType.Wear; switch (Option) { case 1: equipment = InventoryType.FirstPartnerInventory; break; case 2: equipment = InventoryType.SecondPartnerInventory; break; case 3: equipment = InventoryType.ThirdPartnerInventory; break; } InventoryType itemToWearType = inv.Type; if (inv == null) { return; } if (ItemValidTime > 0 && !inv.IsBound) { inv.ItemDeleteTime = DateTime.Now.AddSeconds(ItemValidTime); } if (!inv.IsBound) { if (!delay && ((EquipmentSlot == EquipmentType.Fairy && (MaxElementRate == 70 || MaxElementRate == 80)) || EquipmentSlot == EquipmentType.CostumeHat || EquipmentSlot == EquipmentType.CostumeSuit || EquipmentSlot == EquipmentType.WeaponSkin)) { session.SendPacket($"qna #u_i^1^{session.Character.CharacterId}^{(byte)itemToWearType}^{slot}^1 {Language.Instance.GetMessageFromKey("ASK_BIND")}"); return; } if (delay) { inv.BoundCharacterId = session.Character.CharacterId; } } double timeSpanSinceLastSpUsage = (DateTime.Now - Process.GetCurrentProcess().StartTime.AddSeconds(-50)).TotalSeconds - session.Character.LastSp; if (EquipmentSlot == EquipmentType.Sp && inv.Rare == -2) { session.SendPacket(UserInterfaceHelper.GenerateMsg(Language.Instance.GetMessageFromKey("CANT_EQUIP_DESTROYED_SP"), 0)); return; } if (Option == 0) { if (EquipmentSlot == EquipmentType.Sp && timeSpanSinceLastSpUsage <= session.Character.SpCooldown && session.Character.Inventory.LoadBySlotAndType((byte)EquipmentType.Sp, InventoryType.Specialist) != null) { session.SendPacket(UserInterfaceHelper.GenerateMsg(string.Format(Language.Instance.GetMessageFromKey("SP_INLOADING"), session.Character.SpCooldown - (int)Math.Round(timeSpanSinceLastSpUsage)), 0)); return; } if ((ItemType != ItemType.Weapon && ItemType != ItemType.Armor && ItemType != ItemType.Fashion && ItemType != ItemType.Jewelery && ItemType != ItemType.Specialist) || LevelMinimum > (IsHeroic ? session.Character.HeroLevel : session.Character.Level) || (Sex != 0 && Sex != (byte)session.Character.Gender + 1) || (ItemType != ItemType.Jewelery && EquipmentSlot != EquipmentType.Boots && EquipmentSlot != EquipmentType.Gloves && ((Class >> (byte)session.Character.Class) & 1) != 1)) { session.SendPacket(session.Character.GenerateSay(Language.Instance.GetMessageFromKey("BAD_EQUIPMENT"), 10)); return; } if (session.Character.UseSp) { if (session.Character.Inventory.LoadBySlotAndType((byte)EquipmentType.Sp, equipment) is ItemInstance sp && sp.Item.Element != 0 && EquipmentSlot == EquipmentType.Fairy && Element != sp.Item.Element && Element != sp.Item.SecondaryElement) { session.SendPacket(UserInterfaceHelper.GenerateMsg(Language.Instance.GetMessageFromKey("BAD_FAIRY"), 0)); return; } } if (session.Character.UseSp && EquipmentSlot == EquipmentType.Sp) { session.SendPacket(session.Character.GenerateSay(Language.Instance.GetMessageFromKey("SP_BLOCKED"), 10)); return; } if (session.Character.JobLevel < LevelJobMinimum) { session.SendPacket(session.Character.GenerateSay(Language.Instance.GetMessageFromKey("LOW_JOB_LVL"), 10)); return; } } else if (mate != null) { if (mate.Level < LevelMinimum) { session.SendPacket(session.Character.GenerateSay(Language.Instance.GetMessageFromKey("BAD_EQUIPMENT"), 10)); return; } switch (EquipmentSlot) { case EquipmentType.Armor: if (ItemSubType == 4) { mate.ArmorInstance = inv; break; } else { goto default; } case EquipmentType.MainWeapon: if (ItemSubType == 12) { mate.WeaponInstance = inv; break; } else { goto default; } case EquipmentType.Gloves: mate.GlovesInstance = inv; break; case EquipmentType.Boots: mate.BootsInstance = inv; break; case EquipmentType.Sp: if (ItemSubType == 4) { mate.SpInstance = inv; break; } else { goto default; } default: session.SendPacket(session.Character.GenerateSay(Language.Instance.GetMessageFromKey("BAD_EQUIPMENT"), 10)); return; } } ItemInstance currentlyEquippedItem = session.Character.Inventory.LoadBySlotAndType((short)EquipmentSlot, equipment); if (currentlyEquippedItem == null) { // move from equipment to wear session.Character.Inventory.MoveInInventory(inv.Slot, itemToWearType, equipment); session.SendPacket(UserInterfaceHelper.Instance.GenerateInventoryRemove(itemToWearType, slot)); } else { Logger.LogUserEvent("EQUIPMENT_TAKEOFF", session.GenerateIdentity(), $"IIId: {currentlyEquippedItem.Id} ItemVnum: {currentlyEquippedItem.ItemVNum} Upgrade: {currentlyEquippedItem.Upgrade} Rare: {currentlyEquippedItem.Rare}"); // move from wear to equipment and back session.Character.Inventory.MoveInInventory(currentlyEquippedItem.Slot, equipment, itemToWearType, inv.Slot); session.SendPacket(currentlyEquippedItem.GenerateInventoryAdd()); session.Character.EquipmentBCards.RemoveAll(o => o.ItemVNum == currentlyEquippedItem.ItemVNum); } Logger.LogUserEvent("EQUIPMENT_WEAR", session.GenerateIdentity(), $"IIId: {inv.Id} ItemVnum: {inv.ItemVNum} Upgrade: {inv.Upgrade} Rare: {inv.Rare}"); session.Character.EquipmentBCards.AddRange(inv.Item.BCards); switch (inv.Item.ItemType) { case ItemType.Armor: session.Character.ShellEffectArmor.Clear(); foreach (ShellEffectDTO dto in inv.ShellEffects) { session.Character.ShellEffectArmor.Add(dto); } break; case ItemType.Weapon: switch (inv.Item.EquipmentSlot) { case EquipmentType.MainWeapon: session.Character.ShellEffectMain.Clear(); foreach (ShellEffectDTO dto in inv.ShellEffects) { session.Character.ShellEffectMain.Add(dto); } break; case EquipmentType.SecondaryWeapon: session.Character.ShellEffectSecondary.Clear(); foreach (ShellEffectDTO dto in inv.ShellEffects) { session.Character.ShellEffectSecondary.Add(dto); } break; } break; } if (Option == 0) { session.SendPacket(session.Character.GenerateStatChar()); session.CurrentMapInstance?.Broadcast(session.Character.GenerateEq()); session.SendPacket(session.Character.GenerateEquipment()); session.CurrentMapInstance?.Broadcast(session.Character.GeneratePairy()); if (EquipmentSlot == EquipmentType.Fairy) { ItemInstance fairy = session.Character.Inventory.LoadBySlotAndType((byte)EquipmentType.Fairy, equipment); session.SendPacket(session.Character.GenerateSay(string.Format(Language.Instance.GetMessageFromKey("FAIRYSTATS"), fairy.XP, CharacterHelper.LoadFairyXPData(fairy.ElementRate + fairy.Item.ElementRate)), 10)); } if (EquipmentSlot == EquipmentType.Amulet) { session.SendPacket(StaticPacketHelper.GenerateEff(UserType.Player, session.Character.CharacterId, 39)); inv.BoundCharacterId = session.Character.CharacterId; } } else if (mate != null) { session.SendPacket(mate.GenerateScPacket()); } break; } }
public override void Use(ClientSession session, ref ItemInstance inv, byte Option = 0, string[] packetsplit = null) { if (packetsplit == null) { return; } void releasePet(MateType mateType, Guid itemToRemoveId) { if (int.TryParse(packetsplit[3], out int mateTransportId)) { Mate mate = session.Character.Mates.Find(s => s.MateTransportId == mateTransportId && s.MateType == mateType); if (mate != null) { if (!mate.IsTeamMember) { session.Character.Mates.Remove(mate); session.SendPacket(UserInterfaceHelper.Instance.GenerateInfo(Language.Instance.GetMessageFromKey("PET_RELEASED"))); session.SendPacket(UserInterfaceHelper.Instance.GeneratePClear()); session.SendPackets(session.Character.GenerateScP()); session.SendPackets(session.Character.GenerateScN()); session.CurrentMapInstance?.Broadcast(mate.GenerateOut()); session.Character.Inventory.RemoveItemFromInventory(itemToRemoveId); } else { session.SendPacket(UserInterfaceHelper.Instance.GenerateMsg(Language.Instance.GetMessageFromKey("PET_IN_TEAM_UNRELEASABLE"), 0)); } } } } switch (Effect) { case 11: if (int.TryParse(packetsplit[3], out int mateTransportId)) { Mate mate = session.Character.Mates.Find(s => s.MateTransportId == mateTransportId); if (mate == null || mate.Level >= session.Character.Level - 5) { return; } mate.Level++; session.CurrentMapInstance?.Broadcast(StaticPacketHelper.GenerateEff(UserType.Npc, mate.MateTransportId, 8), mate.PositionX, mate.PositionY); session.CurrentMapInstance?.Broadcast(StaticPacketHelper.GenerateEff(UserType.Npc, mate.MateTransportId, 198), mate.PositionX, mate.PositionY); session.Character.Inventory.RemoveItemFromInventory(inv.Id); } break; case 13: if (int.TryParse(packetsplit[3], out mateTransportId) && session.Character.Mates.Any(s => s.MateTransportId == mateTransportId)) { session.SendPacket(UserInterfaceHelper.Instance.GenerateGuri(10, 1, mateTransportId, 2)); session.Character.Inventory.RemoveItemFromInventory(inv.Id); } break; case 14: if (int.TryParse(packetsplit[3], out mateTransportId)) { Mate mate = session.Character.Mates.Find(s => s.MateTransportId == mateTransportId && s.MateType == MateType.Pet); if (mate?.CanPickUp == false) { session.CurrentMapInstance.Broadcast(StaticPacketHelper.GenerateEff(UserType.Npc, mate.MateTransportId, 5)); session.CurrentMapInstance.Broadcast(StaticPacketHelper.GenerateEff(UserType.Npc, mate.MateTransportId, 5002)); mate.CanPickUp = true; session.SendPackets(session.Character.GenerateScP()); session.SendPacket(session.Character.GenerateSay(Language.Instance.GetMessageFromKey("PET_CAN_PICK_UP"), 10)); session.Character.Inventory.RemoveItemFromInventory(inv.Id); } } break; case 17: if (int.TryParse(packetsplit[3], out mateTransportId)) { Mate mate = session.Character.Mates.Find(s => s.MateTransportId == mateTransportId); if (mate?.IsSummonable == false) { mate.IsSummonable = true; session.SendPackets(session.Character.GenerateScP()); session.SendPacket(session.Character.GenerateSay(string.Format(Language.Instance.GetMessageFromKey("PET_SUMMONABLE"), mate.Name), 10)); session.SendPacket(UserInterfaceHelper.Instance.GenerateMsg(string.Format(Language.Instance.GetMessageFromKey("PET_SUMMONABLE"), mate.Name), 0)); session.Character.Inventory.RemoveItemFromInventory(inv.Id); } } break; case 1000: releasePet(MateType.Pet, inv.Id); break; case 1001: releasePet(MateType.Partner, inv.Id); break; default: Logger.Warn(string.Format(Language.Instance.GetMessageFromKey("NO_HANDLER_ITEM"), GetType())); break; } }
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) { // Honour Medals case 69: session.Character.Reputation += ReputPrice; session.SendPacket(session.Character.GenerateFd()); session.Character.Inventory.RemoveItemFromInventory(inv.Id); break; // SP Potions case 150: case 151: session.Character.SpAdditionPoint += EffectValue; if (session.Character.SpAdditionPoint > 1000000) { session.Character.SpAdditionPoint = 1000000; } session.SendPacket(UserInterfaceHelper.GenerateMsg(string.Format(Language.Instance.GetMessageFromKey("SP_POINTSADDED"), EffectValue), 0)); session.Character.Inventory.RemoveItemFromInventory(inv.Id); session.SendPacket(session.Character.GenerateSpPoint()); break; // Specialist Medal 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.GenerateMsg(string.Format(Language.Instance.GetMessageFromKey("SP_POINTSADDEDBOTH"), EffectValue, EffectValue * 3), 0)); session.Character.Inventory.RemoveItemFromInventory(inv.Id); session.SendPacket(session.Character.GenerateSpPoint()); break; // Raid Seals 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); session.Character.Inventory.RemoveItemFromInventory(raidSeal.Id); ScriptedInstance raid = ServerManager.Instance.Raids.FirstOrDefault(s => s.RequiredItems?.Any(obj => obj?.VNum == raidSeal.ItemVNum) == true)?.Copy(); if (raid != null) { Group group = new Group() { GroupType = GroupType.BigTeam, Raid = raid }; group.JoinGroup(session.Character.CharacterId); ServerManager.Instance.AddGroup(group); session.SendPacket(UserInterfaceHelper.GenerateMsg(string.Format(Language.Instance.GetMessageFromKey("RAID_LEADER"), session.Character.Name), 0)); session.SendPacket(session.Character.GenerateSay(string.Format(Language.Instance.GetMessageFromKey("RAID_LEADER"), 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; // Partner Suits/Skins case 305: Mate mate = session.Character.Mates.Find(s => s.MateTransportId == int.Parse(packetsplit[3])); if (mate != null && EffectValue == mate.NpcMonsterVNum && mate.Skin == 0) { mate.Skin = Morph; session.SendPacket(mate.GenerateCMode(mate.Skin)); session.Character.Inventory.RemoveItemFromInventory(inv.Id); } break; // Fairy Booster case 250: if (!session.Character.Buff.ContainsKey(131)) { session.Character.AddStaticBuff(new StaticBuffDTO() { CardId = 131 }); session.CurrentMapInstance?.Broadcast(session.Character.GeneratePairy()); session.SendPacket(UserInterfaceHelper.GenerateMsg(string.Format(Language.Instance.GetMessageFromKey("EFFECT_ACTIVATED"), inv.Item.Name), 0)); session.CurrentMapInstance?.Broadcast(StaticPacketHelper.GenerateEff(UserType.Player, session.Character.CharacterId, 3011), session.Character.MapX, session.Character.MapY); session.Character.Inventory.RemoveItemFromInventory(inv.Id); } else { session.SendPacket(UserInterfaceHelper.GenerateMsg(Language.Instance.GetMessageFromKey("ITEM_IN_USE"), 0)); } break; // Fairy booster 2 case 253: if (!session.Character.Buff.ContainsKey(131)) { session.Character.AddStaticBuff(new StaticBuffDTO() { CardId = 131 }); session.CurrentMapInstance?.Broadcast(session.Character.GeneratePairy()); session.SendPacket(UserInterfaceHelper.GenerateMsg(string.Format(Language.Instance.GetMessageFromKey("EFFECT_ACTIVATED"), inv.Item.Name), 0)); session.CurrentMapInstance?.Broadcast(StaticPacketHelper.GenerateEff(UserType.Player, session.Character.CharacterId, 3011), session.Character.MapX, session.Character.MapY); session.Character.Inventory.RemoveItemFromInventory(inv.Id); } else { session.SendPacket(UserInterfaceHelper.GenerateMsg(Language.Instance.GetMessageFromKey("ITEM_IN_USE"), 0)); } break; // exp/job booster case 251: if (!session.Character.Buff.ContainsKey(121)) { session.Character.AddStaticBuff(new StaticBuffDTO() { CardId = 121 }); session.CurrentMapInstance?.Broadcast(session.Character.GeneratePairy()); session.SendPacket(UserInterfaceHelper.GenerateMsg(string.Format(Language.Instance.GetMessageFromKey("EFFECT_ACTIVATED"), inv.Item.Name), 0)); session.CurrentMapInstance?.Broadcast(StaticPacketHelper.GenerateEff(UserType.Player, session.Character.CharacterId, 3011), session.Character.MapX, session.Character.MapY); session.Character.Inventory.RemoveItemFromInventory(inv.Id); } else { session.SendPacket(UserInterfaceHelper.GenerateMsg(Language.Instance.GetMessageFromKey("ITEM_IN_USE"), 0)); } break; //sp job booster case 146: if (!session.Character.Buff.ContainsKey(146)) { session.Character.AddStaticBuff(new StaticBuffDTO() { CardId = 146 }); session.CurrentMapInstance?.Broadcast(session.Character.GeneratePairy()); session.SendPacket(UserInterfaceHelper.GenerateMsg(string.Format(Language.Instance.GetMessageFromKey("EFFECT_ACTIVATED"), inv.Item.Name), 0)); session.CurrentMapInstance?.Broadcast(StaticPacketHelper.GenerateEff(UserType.Player, session.Character.CharacterId, 3011), session.Character.MapX, session.Character.MapY); session.Character.Inventory.RemoveItemFromInventory(inv.Id); } else { session.SendPacket(UserInterfaceHelper.GenerateMsg(Language.Instance.GetMessageFromKey("ITEM_IN_USE"), 0)); } break; // Ice oil case 252: if (!session.Character.Buff.ContainsKey(340)) { session.Character.AddStaticBuff(new StaticBuffDTO() { CardId = 340 }); session.CurrentMapInstance?.Broadcast(session.Character.GeneratePairy()); session.SendPacket(UserInterfaceHelper.GenerateMsg(string.Format(Language.Instance.GetMessageFromKey("EFFECT_ACTIVATED"), inv.Item.Name), 0)); session.CurrentMapInstance?.Broadcast(StaticPacketHelper.GenerateEff(UserType.Player, session.Character.CharacterId, 16), session.Character.MapX, session.Character.MapY); session.Character.Inventory.RemoveItemFromInventory(inv.Id); } else { session.SendPacket(UserInterfaceHelper.GenerateMsg(Language.Instance.GetMessageFromKey("ITEM_IN_USE"), 0)); } break; // Valentin Buff case 254: if (!session.Character.Buff.ContainsKey(109)) { session.Character.AddStaticBuff(new StaticBuffDTO() { CardId = 109 }); session.CurrentMapInstance?.Broadcast(session.Character.GeneratePairy()); session.SendPacket(UserInterfaceHelper.GenerateMsg(string.Format(Language.Instance.GetMessageFromKey("EFFECT_ACTIVATED"), inv.Item.Name), 0)); session.CurrentMapInstance?.Broadcast(StaticPacketHelper.GenerateEff(UserType.Player, session.Character.CharacterId, 3410), session.Character.MapX, session.Character.MapY); session.Character.Inventory.RemoveItemFromInventory(inv.Id); } else { session.SendPacket(UserInterfaceHelper.GenerateMsg(Language.Instance.GetMessageFromKey("ITEM_IN_USE"), 0)); } break; // Buff exp 20% case 256: if (!session.Character.Buff.ContainsKey(119)) { session.Character.AddStaticBuff(new StaticBuffDTO() { CardId = 119 }); session.CurrentMapInstance?.Broadcast(session.Character.GeneratePairy()); session.SendPacket(UserInterfaceHelper.GenerateMsg(string.Format(Language.Instance.GetMessageFromKey("EFFECT_ACTIVATED"), inv.Item.Name), 0)); session.CurrentMapInstance?.Broadcast(StaticPacketHelper.GenerateEff(UserType.Player, session.Character.CharacterId, 4756), session.Character.MapX, session.Character.MapY); session.Character.Inventory.RemoveItemFromInventory(inv.Id); } else { session.SendPacket(UserInterfaceHelper.GenerateMsg(Language.Instance.GetMessageFromKey("ITEM_IN_USE"), 0)); } break; // Ancella fate case 258: if (!session.Character.Buff.ContainsKey(393)) { session.Character.AddStaticBuff(new StaticBuffDTO() { CardId = 393 }); session.CurrentMapInstance?.Broadcast(session.Character.GeneratePairy()); session.SendPacket(UserInterfaceHelper.GenerateMsg(string.Format(Language.Instance.GetMessageFromKey("EFFECT_ACTIVATED"), inv.Item.Name), 0)); session.CurrentMapInstance?.Broadcast(StaticPacketHelper.GenerateEff(UserType.Player, session.Character.CharacterId, 4756), session.Character.MapX, session.Character.MapY); session.Character.Inventory.RemoveItemFromInventory(inv.Id); } else { session.SendPacket(UserInterfaceHelper.GenerateMsg(Language.Instance.GetMessageFromKey("ITEM_IN_USE"), 0)); } break; // Speedbooster case 260: 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.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; } }); session.Character.Inventory.RemoveItemFromInventory(inv.Id); break; // Rainbow Pearl/Magic Eraser case 666: if (EffectValue == 1 && byte.TryParse(packetsplit[9], out byte islot)) { ItemInstance wearInstance = session.Character.Inventory.LoadBySlotAndType(islot, InventoryType.Equipment); if (wearInstance != null && (wearInstance.Item.ItemType == ItemType.Weapon || wearInstance.Item.ItemType == ItemType.Armor) && wearInstance.ShellEffects.Count != 0 && wearInstance.Item.IsHeroic) { wearInstance.ShellEffects.Clear(); DAOFactory.ShellEffectDAO.DeleteByEquipmentSerialId(wearInstance.EquipmentSerialId); if (wearInstance.EquipmentSerialId == Guid.Empty) { wearInstance.EquipmentSerialId = Guid.NewGuid(); } session.Character.Inventory.RemoveItemFromInventory(inv.Id); session.SendPacket(UserInterfaceHelper.GenerateMsg(Language.Instance.GetMessageFromKey("OPTION_DELETE"), 0)); } } else { session.SendPacket("guri 18 0"); } break; // Atk/Def/HP/Exp potions case 6600: session.Character.Inventory.RemoveItemFromInventory(inv.Id); break; // Ancelloan's Blessing case 208: if (!session.Character.Buff.ContainsKey(121)) { session.Character.Inventory.RemoveItemFromInventory(inv.Id); session.Character.AddStaticBuff(new StaticBuffDTO() { CardId = 121 }); } else { session.SendPacket(UserInterfaceHelper.GenerateMsg(Language.Instance.GetMessageFromKey("ITEM_IN_USE"), 0)); } break; case 2081: if (!session.Character.Buff.ContainsKey(146)) { session.Character.Inventory.RemoveItemFromInventory(inv.Id); session.Character.AddStaticBuff(new StaticBuffDTO() { CardId = 146 }); } else { session.SendPacket(UserInterfaceHelper.GenerateMsg(Language.Instance.GetMessageFromKey("ITEM_IN_USE"), 0)); } break; // Divorce letter case 6969: // this is imaginary number I = √(-1) var 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.GenerateInfo(Language.Instance.GetMessageFromKey("DIVORCED"))); session.Character.Inventory.RemoveItemFromInventory(inv.Id); } break; // Cupid's arrow case 34: // this is imaginary number I = √(-1) 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; } if (session.Character.IsFriendOfCharacter(characterId)) { var otherSession = ServerManager.Instance.GetSessionByCharacterId(characterId); if (otherSession != null) { otherSession.SendPacket(UserInterfaceHelper.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.RemoveItemFromInventory(inv.Id); } } else { session.SendPacket($"info {Language.Instance.GetMessageFromKey("NOT_FRIEND")}"); } } } break; case 100: { } break; case 5836: { session.SendPacket($"gb 0 {session.Account.BankGold / 1000} {session.Character.Gold} 0 0"); session.SendPacket($"s_memo 6 [Account balance]: {session.Account.BankGold} gold; [Owned]: {session.Character.Gold} gold\nWe will do our best. Thank you for using the services of Cuarry Bank."); } break; // Faction Egg case 570: if (session.Character.Faction == (FactionType)EffectValue) { return; } if (EffectValue < 3) { session.SendPacket(session.Character.Family == null ? $"qna #guri^750^{EffectValue} {Language.Instance.GetMessageFromKey($"ASK_CHANGE_FACTION{EffectValue}")}" : UserInterfaceHelper.GenerateMsg(Language.Instance.GetMessageFromKey("IN_FAMILY"), 0)); } else { session.SendPacket(session.Character.Family != null ? $"qna #guri^750^{EffectValue} {Language.Instance.GetMessageFromKey($"ASK_CHANGE_FACTION{EffectValue}")}" : UserInterfaceHelper.GenerateMsg(Language.Instance.GetMessageFromKey("NO_FAMILY"), 0)); } break; // SP Wings case 650: ItemInstance specialistInstance = session.Character.Inventory.LoadBySlotAndType((byte)EquipmentType.Sp, InventoryType.Wear); if (session.Character.UseSp && specialistInstance != 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 { void disposeBuff(short vNum) { if (session.Character.BuffObservables.ContainsKey(vNum)) { session.Character.BuffObservables[vNum].Dispose(); session.Character.BuffObservables.Remove(vNum); } session.Character.RemoveBuff(vNum); } disposeBuff(387); disposeBuff(395); disposeBuff(396); disposeBuff(397); disposeBuff(398); disposeBuff(410); disposeBuff(411); disposeBuff(444); specialistInstance.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.RemoveItemFromInventory(inv.Id); } } else { session.SendPacket(UserInterfaceHelper.GenerateMsg(Language.Instance.GetMessageFromKey("NO_SP"), 0)); } break; // Self-Introduction case 203: if (!session.Character.IsVehicled && Option == 0) { session.SendPacket(UserInterfaceHelper.GenerateGuri(10, 2, session.Character.CharacterId, 1)); } break; // Magic Lamp case 651: if (session.Character.Inventory.All(i => i.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.RemoveItemFromInventory(inv.Id); } } else { session.SendPacket(UserInterfaceHelper.GenerateMsg(Language.Instance.GetMessageFromKey("EQ_NOT_EMPTY"), 0)); } break; // Vehicles case 1000: if (EffectValue != 0 || ServerManager.Instance.ChannelId == 51 || session.CurrentMapInstance?.MapInstanceType == MapInstanceType.EventGameInstance) { return; } 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.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.CurrentMapInstance?.Broadcast(StaticPacketHelper.GenerateEff(UserType.Player, session.Character.CharacterId, 4809), 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; // Sealed Vessel case 1002: if (EffectValue == 69) { int rnd = ServerManager.RandomNumber(0, 1000); if (rnd < 5) { short[] vnums = { 5560, 5591, 4099, 907, 1160, 4705, 4706, 4707, 4708, 4709, 4710, 4711, 4712, 4713, 4714, 4715, 4716 }; byte[] counts = { 1, 1, 1, 1, 10, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1 }; int item = ServerManager.RandomNumber(0, 17); session.Character.GiftAdd(vnums[item], counts[item]); } else if (rnd < 30) { short[] vnums = { 361, 362, 363, 366, 367, 368, 371, 372, 373 }; session.Character.GiftAdd(vnums[ServerManager.RandomNumber(0, 9)], 1); } else { short[] vnums = { 1161, 2282, 1030, 1244, 1218, 5369, 1012, 1363, 1364, 2160, 2173, 5959, 5983, 2514, 2515, 2516, 2517, 2518, 2519, 2520, 2521, 1685, 1686, 5087, 5203, 2418, 2310, 2303, 2169, 2280, 5892, 5893, 5894, 5895, 5896, 5897, 5898, 5899, 5332, 5105, 2161, 2162 }; byte[] counts = { 10, 10, 20, 5, 1, 1, 99, 1, 1, 5, 5, 1, 2, 2, 2, 2, 2, 2, 2, 2, 2, 1, 1, 1, 1, 5, 20, 20, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1 }; int item = ServerManager.RandomNumber(0, 42); session.Character.GiftAdd(vnums[item], counts[item]); } session.Character.Inventory.RemoveItemFromInventory(inv.Id); } else if (session.HasCurrentMapInstance && 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.RandomNumber(0, 20)]; NpcMonster npcmonster = ServerManager.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 = session.Character.Direction, IsMoving = true, MapMonsterId = session.CurrentMapInstance.GetNextMonsterId(), ShouldRespawn = false }; monster.Initialize(session.CurrentMapInstance); session.CurrentMapInstance.AddMonster(monster); session.CurrentMapInstance.Broadcast(monster.GenerateIn()); session.Character.Inventory.RemoveItemFromInventory(inv.Id); } break; // Golden Bazaar Medal 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.RemoveItemFromInventory(inv.Id); session.SendPacket(session.Character.GenerateSay(string.Format(Language.Instance.GetMessageFromKey("EFFECT_ACTIVATED"), Name), 12)); } break; // Silver Bazaar Medal 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.RemoveItemFromInventory(inv.Id); session.SendPacket(session.Character.GenerateSay(string.Format(Language.Instance.GetMessageFromKey("EFFECT_ACTIVATED"), Name), 12)); } break; // Pet Slot Expansion 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.RemoveItemFromInventory(inv.Id); } break; // Pet Basket 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.RemoveItemFromInventory(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; // Partner's Backpack 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.RemoveItemFromInventory(inv.Id); session.SendPacket(session.Character.GenerateExts()); session.SendPacket(session.Character.GenerateSay(string.Format(Language.Instance.GetMessageFromKey("EFFECT_ACTIVATED"), Name), 12)); } break; // Backpack Expansion case 1009: 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.RemoveItemFromInventory(inv.Id); session.SendPacket(session.Character.GenerateExts()); session.SendPacket(session.Character.GenerateSay(string.Format(Language.Instance.GetMessageFromKey("EFFECT_ACTIVATED"), Name), 12)); } break; // Sealed Tarot Card case 1005: session.Character.GiftAdd((short)(VNum - Effect), 1); session.Character.Inventory.RemoveItemFromInventory(inv.Id); break; // Tarot Card Game case 1894: if (EffectValue == 0) { for (int i = 0; i < 5; i++) { session.Character.GiftAdd((short)(Effect + ServerManager.RandomNumber(0, 10)), 1); } session.Character.Inventory.RemoveItemFromInventory(inv.Id); } break; // Sealed Tarot Card case 2152: session.Character.GiftAdd((short)(VNum + Effect), 1); session.Character.Inventory.RemoveItemFromInventory(inv.Id); break; default: switch (VNum) { case 5841: int rnd = ServerManager.RandomNumber(0, 1000); short[] vnums = null; if (rnd < 900) { vnums = new short[] { 4356, 4357, 4358, 4359 }; } else { vnums = new short[] { 4360, 4361, 4362, 4363 }; } session.Character.GiftAdd(vnums[ServerManager.RandomNumber(0, 4)], 1); session.Character.Inventory.RemoveItemFromInventory(inv.Id); break; default: Logger.Warn(string.Format(Language.Instance.GetMessageFromKey("NO_HANDLER_ITEM"), GetType()) + $" ItemVNum: {VNum} Effect: {Effect} EffectValue: {EffectValue}"); break; } break; } }
public void DespawnMonster(MapMonster monster) { monster.SetDeathStatement(); Broadcast(StaticPacketHelper.Out(UserType.Monster, monster.MapMonsterId)); }
public override void Use(ClientSession session, ref ItemInstance inv, byte Option = 0, string[] packetsplit = null) { switch (Effect) { // airwaves - eventitems case 0: if (inv.Item.ItemType == ItemType.Shell) { if (inv.ShellEffects.Count != 0 && packetsplit?.Length > 9 && byte.TryParse(packetsplit[9], out byte islot)) { ItemInstance wearable = session.Character.Inventory.LoadBySlotAndType <ItemInstance>(islot, InventoryType.Equipment); if (wearable != null && (wearable.Item.ItemType == ItemType.Weapon || wearable.Item.ItemType == ItemType.Armor) && (wearable.Item.LevelMinimum >= inv.Upgrade || wearable.Item.IsHeroic) && wearable.Rare >= inv.Rare) { bool weapon = false; if ((inv.ItemVNum >= 565 && inv.ItemVNum <= 576) || (inv.ItemVNum >= 589 && inv.ItemVNum <= 598)) { weapon = true; } else if ((inv.ItemVNum >= 577 && inv.ItemVNum <= 588) || (inv.ItemVNum >= 656 && inv.ItemVNum <= 664) || inv.ItemVNum == 599) { weapon = false; } else { return; } if ((wearable.Item.ItemType == ItemType.Weapon && weapon) || (wearable.Item.ItemType == ItemType.Armor && !weapon)) { //if (wearable.ShellEffects.Count > 0 && ServerManager.RandomNumber() < 50) //{ // session.Character.DeleteItemByItemInstanceId(inv.Id); // session.SendPacket(UserInterfaceHelper.GenerateMsg(Language.Instance.GetMessageFromKey("OPTION_APPLY_FAIL"), 0)); // return; //} wearable.ShellEffects.Clear(); DAOFactory.ShellEffectDAO.DeleteByEquipmentSerialId(wearable.EquipmentSerialId); wearable.ShellEffects.AddRange(inv.ShellEffects); if (wearable.EquipmentSerialId == Guid.Empty) { wearable.EquipmentSerialId = Guid.NewGuid(); } DAOFactory.ShellEffectDAO.InsertOrUpdateFromList(wearable.ShellEffects, wearable.EquipmentSerialId); session.Character.DeleteItemByItemInstanceId(inv.Id); session.SendPacket(UserInterfaceHelper.GenerateMsg(Language.Instance.GetMessageFromKey("OPTION_APPLY_SUCCESS"), 0)); } } } return; } if (ItemType == ItemType.Event) { session.CurrentMapInstance?.Broadcast(StaticPacketHelper.GenerateEff(UserType.Player, session.Character.CharacterId, EffectValue)); if (MappingHelper.GuriItemEffects.ContainsKey(EffectValue)) { session.CurrentMapInstance?.Broadcast(UserInterfaceHelper.GenerateGuri(19, 1, session.Character.CharacterId, MappingHelper.GuriItemEffects[EffectValue]), session.Character.MapX, session.Character.MapY); } session.Character.Inventory.RemoveItemFromInventory(inv.Id); } break; //respawn objects case 1: if (session.Character.MapInstance.MapInstanceType != MapInstanceType.BaseMapInstance || ServerManager.Instance.ChannelId == 51) { session.SendPacket(session.Character.GenerateSay(Language.Instance.GetMessageFromKey("CANT_USE_THAT"), 10)); return; } int type, secondaryType, inventoryType, slot; if (packetsplit != null && int.TryParse(packetsplit[2], out type) && int.TryParse(packetsplit[3], out secondaryType) && int.TryParse(packetsplit[4], out inventoryType) && int.TryParse(packetsplit[5], out slot)) { int packetType; switch (EffectValue) { case 0: if (Option == 0) { session.SendPacket(UserInterfaceHelper.GenerateDialog($"#u_i^{type}^{secondaryType}^{inventoryType}^{slot}^1 #u_i^{type}^{secondaryType}^{inventoryType}^{slot}^2 {Language.Instance.GetMessageFromKey("WANT_TO_SAVE_POSITION")}")); } else if (int.TryParse(packetsplit[6], out packetType)) { switch (packetType) { case 1: session.SendPacket(UserInterfaceHelper.GenerateDelay(5000, 7, $"#u_i^{type}^{secondaryType}^{inventoryType}^{slot}^3")); break; case 2: session.SendPacket(UserInterfaceHelper.GenerateDelay(5000, 7, $"#u_i^{type}^{secondaryType}^{inventoryType}^{slot}^4")); break; case 3: session.Character.SetReturnPoint(session.Character.MapId, session.Character.MapX, session.Character.MapY); RespawnMapTypeDTO respawn = session.Character.Respawn; if (respawn.DefaultX != 0 && respawn.DefaultY != 0 && respawn.DefaultMapId != 0) { ServerManager.Instance.ChangeMap(session.Character.CharacterId, respawn.DefaultMapId, (short)(respawn.DefaultX + ServerManager.RandomNumber(-5, 5)), (short)(respawn.DefaultY + ServerManager.RandomNumber(-5, 5))); } session.Character.Inventory.RemoveItemFromInventory(inv.Id); break; case 4: RespawnMapTypeDTO respawnObj = session.Character.Respawn; if (respawnObj.DefaultX != 0 && respawnObj.DefaultY != 0 && respawnObj.DefaultMapId != 0) { ServerManager.Instance.ChangeMap(session.Character.CharacterId, respawnObj.DefaultMapId, (short)(respawnObj.DefaultX + ServerManager.RandomNumber(-5, 5)), (short)(respawnObj.DefaultY + ServerManager.RandomNumber(-5, 5))); } session.Character.Inventory.RemoveItemFromInventory(inv.Id); break; } } break; case 1: if (int.TryParse(packetsplit[6], out packetType)) { RespawnMapTypeDTO respawn = session.Character.Return; switch (packetType) { case 0: if (respawn.DefaultX != 0 && respawn.DefaultY != 0 && respawn.DefaultMapId != 0) { session.SendPacket(UserInterfaceHelper.GenerateRp(respawn.DefaultMapId, respawn.DefaultX, respawn.DefaultY, $"#u_i^{type}^{secondaryType}^{inventoryType}^{slot}^1")); } break; case 1: session.SendPacket(UserInterfaceHelper.GenerateDelay(5000, 7, $"#u_i^{type}^{secondaryType}^{inventoryType}^{slot}^2")); break; case 2: if (respawn.DefaultX != 0 && respawn.DefaultY != 0 && respawn.DefaultMapId != 0) { ServerManager.Instance.ChangeMap(session.Character.CharacterId, respawn.DefaultMapId, respawn.DefaultX, respawn.DefaultY); } session.Character.Inventory.RemoveItemFromInventory(inv.Id); break; } } break; case 2: if (Option == 0) { session.SendPacket(UserInterfaceHelper.GenerateDelay(5000, 7, $"#u_i^{type}^{secondaryType}^{inventoryType}^{slot}^1")); } else { ServerManager.Instance.JoinMiniland(session, session); session.Character.Inventory.RemoveItemFromInventory(inv.Id); } break; case 9: { if (Option == 0) { session.SendPacket(UserInterfaceHelper.GenerateDialog($"#u_i^{type}^{secondaryType}^{inventoryType}^{slot}^1 #u_i^{type}^{secondaryType}^{inventoryType}^{slot}^2 {Language.Instance.GetMessageFromKey("WANT_TO_SAVE_POSITION")}")); } else if (int.TryParse(packetsplit[6], out packetType)) { switch (packetType) { case 1: session.SendPacket(UserInterfaceHelper.GenerateDelay(5000, 7, $"#u_i^{type}^{secondaryType}^{inventoryType}^{slot}^3")); break; case 2: session.SendPacket(UserInterfaceHelper.GenerateDelay(5000, 7, $"#u_i^{type}^{secondaryType}^{inventoryType}^{slot}^4")); break; case 3: session.Character.SetReturnPoint(session.Character.MapId, session.Character.MapX, session.Character.MapY); RespawnMapTypeDTO respawn = session.Character.Respawn; if (respawn.DefaultX != 0 && respawn.DefaultY != 0 && respawn.DefaultMapId != 0) { ServerManager.Instance.ChangeMap(session.Character.CharacterId, respawn.DefaultMapId, (short)(respawn.DefaultX + ServerManager.RandomNumber(-5, 5)), (short)(respawn.DefaultY + ServerManager.RandomNumber(-5, 5))); } break; case 4: RespawnMapTypeDTO respawnObj = session.Character.Respawn; if (respawnObj.DefaultX != 0 && respawnObj.DefaultY != 0 && respawnObj.DefaultMapId != 0) { ServerManager.Instance.ChangeMap(session.Character.CharacterId, respawnObj.DefaultMapId, (short)(respawnObj.DefaultX + ServerManager.RandomNumber(-5, 5)), (short)(respawnObj.DefaultY + ServerManager.RandomNumber(-5, 5))); } break; } } } break; } } break; // dyes or waxes case 10: case 11: if (!session.Character.IsVehicled) { if (Effect == 10) { if (EffectValue == 99) { var nextValue = (byte)ServerManager.RandomNumber(0, 127); session.Character.HairColor = Enum.IsDefined(typeof(HairColorType), nextValue) ? (HairColorType)nextValue : 0; } else { session.Character.HairColor = Enum.IsDefined(typeof(HairColorType), (byte)EffectValue) ? (HairColorType)EffectValue : 0; } } else { if (session.Character.Class == (byte)ClassType.Adventurer && EffectValue > 1) { session.SendPacket(UserInterfaceHelper.GenerateMsg(Language.Instance.GetMessageFromKey("ADVENTURERS_CANT_USE"), 10)); return; } if (EffectValue == 10 || EffectValue == 11 || EffectValue == 13 || EffectValue == 15) { if ((EffectValue == 10 || EffectValue == 11) && session.Character.Gender == GenderType.Female) { session.Character.HairStyle = Enum.IsDefined(typeof(HairStyleType), (byte)EffectValue) ? (HairStyleType)EffectValue : 0; } else if ((EffectValue == 13 || EffectValue == 15) && session.Character.Gender == GenderType.Male) { session.Character.HairStyle = Enum.IsDefined(typeof(HairStyleType), (byte)EffectValue) ? (HairStyleType)EffectValue : 0; } else { session.SendPacket("info You cant use the Item!"); return; } } else { session.Character.HairStyle = Enum.IsDefined(typeof(HairStyleType), (byte)EffectValue) ? (HairStyleType)EffectValue : 0; } } session.SendPacket(session.Character.GenerateEq()); session.CurrentMapInstance?.Broadcast(session, session.Character.GenerateIn()); session.CurrentMapInstance?.Broadcast(session, session.Character.GenerateGidx()); session.Character.Inventory.RemoveItemAmount(inv.ItemVNum, 1); } break; // dignity restoration case 14: if ((EffectValue == 100 || EffectValue == 200) && session.Character.Dignity < 100 && !session.Character.IsVehicled) { session.Character.Dignity += EffectValue; if (session.Character.Dignity > 100) { session.Character.Dignity = 100; } session.SendPacket(session.Character.GenerateFd()); session.SendPacket(StaticPacketHelper.GenerateEff(UserType.Player, session.Character.CharacterId, 49 - (byte)session.Character.Faction)); session.CurrentMapInstance?.Broadcast(session, session.Character.GenerateIn(), ReceiverType.AllExceptMe); session.CurrentMapInstance?.Broadcast(session, session.Character.GenerateGidx(), ReceiverType.AllExceptMe); session.Character.Inventory.RemoveItemFromInventory(inv.Id); } else if (EffectValue == 2000 && session.Character.Dignity < 100 && !session.Character.IsVehicled) { session.Character.Dignity = 100; session.SendPacket(session.Character.GenerateFd()); session.SendPacket(StaticPacketHelper.GenerateEff(UserType.Player, session.Character.CharacterId, 49 - (byte)session.Character.Faction)); session.CurrentMapInstance?.Broadcast(session, session.Character.GenerateIn(), ReceiverType.AllExceptMe); session.CurrentMapInstance?.Broadcast(session, session.Character.GenerateGidx(), ReceiverType.AllExceptMe); session.Character.Inventory.RemoveItemFromInventory(inv.Id); } break; // speakers case 15: if (!session.Character.IsVehicled && Option == 0) { session.SendPacket(UserInterfaceHelper.GenerateGuri(10, 3, session.Character.CharacterId, 1)); } break; // bubbles case 16: if (!session.Character.IsVehicled && Option == 0) { session.SendPacket(UserInterfaceHelper.GenerateGuri(10, 4, session.Character.CharacterId, 1)); } break; // wigs case 30: if (!session.Character.IsVehicled) { ItemInstance wig = session.Character.Inventory.LoadBySlotAndType((byte)EquipmentType.Hat, InventoryType.Wear); if (wig != null) { wig.Design = (byte)ServerManager.RandomNumber(0, 15); session.SendPacket(session.Character.GenerateEq()); session.SendPacket(session.Character.GenerateEquipment()); session.CurrentMapInstance?.Broadcast(session, session.Character.GenerateIn()); session.CurrentMapInstance?.Broadcast(session, session.Character.GenerateGidx()); session.Character.Inventory.RemoveItemFromInventory(inv.Id); } else { session.SendPacket(UserInterfaceHelper.GenerateMsg(Language.Instance.GetMessageFromKey("NO_WIG"), 0)); } } break; case 13378: // goldene up rolle 5369 var item3 = session.Character.Inventory.LoadBySlotAndType(0, InventoryType.Equipment); // dont touch that People need to put the Sp in slot 0 if (item3 != null && (item3.Item.ItemType == ItemType.Weapon || item3.Item.ItemType == ItemType.Armor)) { if (item3.Upgrade < 10 && item3.Item.ItemType != ItemType.Specialist) { for (int i = 0; i < 10; i++) { item3.UpgradeItem(session, UpgradeMode.Reduced, UpgradeProtection.Protected); } } else { session.SendPacket("msg 2 Equipment already have max upgrade!", 10); session.SendPacket(session.Character.GenerateSay($" Equipment already have max upgrade!", 11)); } } else { session.SendPacket(session.Character.GenerateSay($"Put your item to upgrade in first inventory slot", 11)); } break; case 13380: // weapon dmg increase item var item4 = session.Character.Inventory.LoadBySlotAndType(0, InventoryType.Equipment); // dont touch that People need to put the Sp in slot 0 if (item4 != null && (item4.Item.ItemType == ItemType.Weapon)) { if (item4.DamageMinimum < 3550 && item4.DamageMaximum < 6050 && item4.Item.ItemType != ItemType.Specialist && item4.ItemVNum == 4983) //bogen { if (item4.Upgrade >= 10 && item4.Rare >= 10) { item4.DamageMinimum += 10; item4.DamageMaximum += 16; session.CurrentMapInstance?.Broadcast(StaticPacketHelper.GenerateEff(UserType.Player, session.Character.CharacterId, 23), session.Character.PositionX, session.Character.PositionY); session.Character.Inventory.RemoveItemFromInventory(inv.Id); } else { session.SendPacket("msg 2 The item is not Rare 10 + 10", 10); session.SendPacket(session.Character.GenerateSay($" The item is not Rare 10 + 10", 11)); } } else if (item4.DamageMinimum < 3430 && item4.DamageMaximum < 5870 && item4.Item.ItemType != ItemType.Specialist && item4.ItemVNum == 4980) //Dolch { if (item4.Upgrade >= 10 && item4.Rare >= 10) { item4.DamageMinimum += 9; item4.DamageMaximum += 15; session.CurrentMapInstance?.Broadcast(StaticPacketHelper.GenerateEff(UserType.Player, session.Character.CharacterId, 23), session.Character.PositionX, session.Character.PositionY); session.Character.Inventory.RemoveItemFromInventory(inv.Id); } else { session.SendPacket("msg 2 The item is not Rare 10 + 10", 10); session.SendPacket(session.Character.GenerateSay($" The item is not Rare 10 + 10", 11)); } } else if (item4.DamageMinimum < 3320 && item4.DamageMaximum < 5800 && item4.Item.ItemType != ItemType.Specialist && item4.ItemVNum == 4981) //Sword { if (item4.Upgrade >= 10 && item4.Rare >= 10) { item4.DamageMinimum += 8; item4.DamageMaximum += 14; session.CurrentMapInstance?.Broadcast(StaticPacketHelper.GenerateEff(UserType.Player, session.Character.CharacterId, 23), session.Character.PositionX, session.Character.PositionY); session.Character.Inventory.RemoveItemFromInventory(inv.Id); } else { session.SendPacket("msg 2 The item is not Rare 10 + 10", 10); session.SendPacket(session.Character.GenerateSay($" The item is not Rare 10 + 10", 11)); } } else if (item4.DamageMinimum < 3250 && item4.DamageMaximum < 5720 && item4.Item.ItemType != ItemType.Specialist && item4.ItemVNum == 4978) //crossbow { if (item4.Upgrade >= 10 && item4.Rare >= 10) { item4.DamageMinimum += 8; item4.DamageMaximum += 14; session.CurrentMapInstance?.Broadcast(StaticPacketHelper.GenerateEff(UserType.Player, session.Character.CharacterId, 23), session.Character.PositionX, session.Character.PositionY); session.Character.Inventory.RemoveItemFromInventory(inv.Id); } else { session.SendPacket("msg 2 The item is not Rare 10 + 10", 10); session.SendPacket(session.Character.GenerateSay($" The item is not Rare 10 + 10", 11)); } } else if (item4.DamageMinimum < 3700 && item4.DamageMaximum < 6300 && item4.Item.ItemType != ItemType.Specialist && item4.ItemVNum == 4982) //stab { if (item4.Upgrade >= 10 && item4.Rare >= 10) { item4.DamageMinimum += 12; item4.DamageMaximum += 18; session.CurrentMapInstance?.Broadcast(StaticPacketHelper.GenerateEff(UserType.Player, session.Character.CharacterId, 23), session.Character.PositionX, session.Character.PositionY); session.Character.Inventory.RemoveItemFromInventory(inv.Id); } else { session.SendPacket("msg 2 The item is not Rare 10 + 10", 10); session.SendPacket(session.Character.GenerateSay($" The item is not Rare 10 + 10", 11)); } } else if (item4.DamageMinimum < 3640 && item4.DamageMaximum < 6200 && item4.Item.ItemType != ItemType.Specialist && item4.ItemVNum == 4979) //zauberwaffe { if (item4.Upgrade >= 10 && item4.Rare >= 10) { item4.DamageMinimum += 11; item4.DamageMaximum += 17; session.CurrentMapInstance?.Broadcast(StaticPacketHelper.GenerateEff(UserType.Player, session.Character.CharacterId, 23), session.Character.PositionX, session.Character.PositionY); session.Character.Inventory.RemoveItemFromInventory(inv.Id); } else { session.SendPacket("msg 2 The item is not Rare 10 + 10", 10); session.SendPacket(session.Character.GenerateSay($" The item is not Rare 10 + 10", 11)); } } else { session.SendPacket("msg 2 You reached the maximal upgrade", 10); session.SendPacket(session.Character.GenerateSay($" You reached the maximal upgrade", 11)); } } else { session.SendPacket(session.Character.GenerateSay($"Put your weapon in first inventory slot", 11)); } break; case 13377: // Rote sp rolle 1364 //auto upgrade Toxic var item2 = session.Character.Inventory.LoadBySlotAndType(0, InventoryType.Equipment); // dont touch that People need to put the Sp in slot 0 if (item2 != null && (item2.Item.ItemType == ItemType.Specialist)) { if (item2.Rare != -2 && item2.Item.ItemType != ItemType.Weapon && item2.Item.ItemType != ItemType.Armor) { if (item2.Upgrade >= 10 && item2.Upgrade < 15) { for (int i = 0; i < 20; i++) { item2.UpgradeSp(session, UpgradeProtection.Protected); } } else { session.SendPacket(session.Character.GenerateSay($" your sp is under +10 or is already +15", 11)); } } else { session.SendPacket("msg 2 Your SP is destroyed!", 10); session.SendPacket(session.Character.GenerateSay($" Your SP is destroyed!", 11)); } } else { session.SendPacket(session.Character.GenerateSay($"Put your sp in the 1.st invorty slot", 11)); } break; case 13376: // blaue sp rolle 1363//auto upgrade Toxic var itemsp = session.Character.Inventory.LoadBySlotAndType(0, InventoryType.Equipment); // dont touch that People need to put the Sp in slot 0 if (itemsp != null && (itemsp.Item.ItemType == ItemType.Specialist)) { if (itemsp.Rare != -2 && itemsp.Item.ItemType != ItemType.Weapon && itemsp.Item.ItemType != ItemType.Armor) { if (itemsp.Upgrade < 10) { for (int i = 0; i < 20; i++) { itemsp.UpgradeSp(session, UpgradeProtection.Protected); } } else { session.SendPacket(session.Character.GenerateSay($" please use the red scroll", 11)); } } else { session.SendPacket("msg 2 Your SP is destroyed!", 10); session.SendPacket(session.Character.GenerateSay($" Your SP is destroyed!", 11)); } } else { session.SendPacket(session.Character.GenerateSay($"Put your sp in the 1.st invorty slot", 11)); } break; case 13387: //perfi 200 item { var itemperfi = session.Character.Inventory.LoadBySlotAndType(0, InventoryType.Equipment); // dont touch that People need to put the Sp in slot 0 if (itemperfi != null && (itemperfi.Item.ItemType == ItemType.Specialist)) { if (itemperfi.SpStoneUpgrade >= 100) { if (itemperfi.SpStoneUpgrade <= 199) { itemperfi.SpStoneUpgrade++; session.Character.Inventory.RemoveItemFromInventory(inv.Id); int rnd1 = ServerManager.RandomNumber(0, 10); if (rnd1 == 1) { itemperfi.SpDamage += 2; session.CurrentMapInstance?.Broadcast(StaticPacketHelper.GenerateEff(UserType.Player, session.Character.CharacterId, 50), session.Character.PositionX, session.Character.PositionY); } if (rnd1 == 2) { itemperfi.SpDefence += 2; session.CurrentMapInstance?.Broadcast(StaticPacketHelper.GenerateEff(UserType.Player, session.Character.CharacterId, 50), session.Character.PositionX, session.Character.PositionY); } if (rnd1 == 3) { itemperfi.SpElement += 2; session.CurrentMapInstance?.Broadcast(StaticPacketHelper.GenerateEff(UserType.Player, session.Character.CharacterId, 50), session.Character.PositionX, session.Character.PositionY); } if (rnd1 == 4) { itemperfi.SpHP += 2; session.CurrentMapInstance?.Broadcast(StaticPacketHelper.GenerateEff(UserType.Player, session.Character.CharacterId, 50), session.Character.PositionX, session.Character.PositionY); } if (rnd1 >= 5) { session.SendPacket("msg 2 upgrade failed", 10); session.SendPacket(session.Character.GenerateSay($" upgrade failed", 11)); } } else { session.SendPacket("msg 2 The item is already on perfection 200", 10); session.SendPacket(session.Character.GenerateSay($" The item is already on perfection 200", 11)); } } else { session.SendPacket("msg 2 you need perfection 100 on the sp to do this", 10); session.SendPacket(session.Character.GenerateSay($" you need perfection 100 on the sp to do this", 11)); } } else { session.SendPacket("msg 2 No sp in slot 1 found", 10); session.SendPacket(session.Character.GenerateSay($" No sp in slot 1 found", 11)); } break; } case 13379: { if (session.Character.HeroLevel > 27) { if (session.Character.HeroLevel < 50) { session.Character.HeroLevel++; session.CurrentMapInstance?.Broadcast(StaticPacketHelper.GenerateEff(UserType.Player, session.Character.CharacterId, 281), session.Character.PositionX, session.Character.PositionY); session.CurrentMapInstance?.Broadcast(StaticPacketHelper.GenerateEff(UserType.Player, session.Character.CharacterId, 280), session.Character.PositionX, session.Character.PositionY); session.Character.Inventory.RemoveItemFromInventory(inv.Id); UserInterfaceHelper.GenerateMsg(Language.Instance.GetMessageFromKey("You Reached Hero Level: " + session.Character.HeroLevel), 0); session.SendPacket(session.Character.GenerateLev()); session.CurrentMapInstance?.Broadcast(session, session.Character.GenerateIn(), ReceiverType.AllExceptMe); session.CurrentMapInstance?.Broadcast(session, session.Character.GenerateGidx(), ReceiverType.AllExceptMe); session.CurrentMapInstance?.Broadcast( StaticPacketHelper.GenerateEff(UserType.Player, session.Character.CharacterId, 6), session.Character.PositionX, session.Character.PositionY); } else { session.SendPacket("msg 2 you reached already the maximum hero level", 10); } } else { session.SendPacket("msg 2 you need atleast hero lvl 28 to use this", 10); } break; } case 300: if (session.Character.Group != null && session.Character.Group.GroupType != GroupType.Group && session.Character.Group.IsLeader(session) && session.CurrentMapInstance.Portals.Any(s => s.Type == (short)PortalType.Raid)) { int delay = 0; foreach (ClientSession sess in session.Character.Group.Characters.GetAllItems()) { Observable.Timer(TimeSpan.FromMilliseconds(delay)).Subscribe(o => { if (sess?.Character != null && session?.CurrentMapInstance != null && session?.Character != null) { ServerManager.Instance.ChangeMapInstance(sess.Character.CharacterId, session.CurrentMapInstance.MapInstanceId, session.Character.PositionX, session.Character.PositionY); } }); delay += 100; } session.Character.Inventory.RemoveItemFromInventory(inv.Id); } break; default: Logger.Warn(string.Format(Language.Instance.GetMessageFromKey("NO_HANDLER_ITEM"), GetType(), VNum, Effect, EffectValue)); break; } }
public override void Use(ClientSession session, ref ItemInstance inv, byte Option = 0, string[] packetsplit = null) { if (session.Character.IsVehicled) { session.SendPacket(session.Character.GenerateSay(Language.Instance.GetMessageFromKey("CANT_DO_VEHICLED"), 10)); return; } if (session.CurrentMapInstance.MapInstanceType == MapInstanceType.TalentArenaMapInstance) { return; } if (Effect == 0) { if (EffectValue != 0) { if (session.Character.IsSitting) { session.Character.IsSitting = false; session.SendPacket(session.Character.GenerateRest()); } session.SendPacket(UserInterfaceHelper.GenerateGuri(12, 1, session.Character.CharacterId, EffectValue)); } else if (EffectValue == 0) { if (packetsplit?.Length > 9 && byte.TryParse(packetsplit[8], out byte TypeEquip) && short.TryParse(packetsplit[9], out short SlotEquip)) { if (session.Character.IsSitting) { session.Character.IsSitting = false; session.SendPacket(session.Character.GenerateRest()); } if (Option != 0) { bool isUsed = false; switch (inv.ItemVNum) { case 1219: case 9130: ItemInstance equip = session.Character.Inventory.LoadBySlotAndType(SlotEquip, (InventoryType)TypeEquip); if (equip?.IsFixed == true) { equip.IsFixed = false; session.SendPacket(StaticPacketHelper.GenerateEff(UserType.Player, session.Character.CharacterId, 3003)); session.SendPacket(UserInterfaceHelper.GenerateGuri(17, 1, session.Character.CharacterId, SlotEquip)); session.SendPacket(session.Character.GenerateSay(Language.Instance.GetMessageFromKey("ITEM_UNFIXED"), 12)); isUsed = true; } break; case 1365: case 9039: ItemInstance specialist = session.Character.Inventory.LoadBySlotAndType(SlotEquip, (InventoryType)TypeEquip); if (specialist?.Rare == -2) { specialist.Rare = 0; session.SendPacket(UserInterfaceHelper.GenerateMsg(Language.Instance.GetMessageFromKey("SP_RESURRECTED"), 0)); session.SendPacket(UserInterfaceHelper.GenerateGuri(13, 1, session.Character.CharacterId, 1)); session.Character.SpPoint = 10000; if (session.Character.SpPoint > 10000) { session.Character.SpPoint = 10000; } session.SendPacket(session.Character.GenerateSpPoint()); session.SendPacket(specialist.GenerateInventoryAdd()); isUsed = true; } break; } if (!isUsed) { session.SendPacket(session.Character.GenerateSay(Language.Instance.GetMessageFromKey("ITEM_IS_NOT_FIXED"), 11)); } else { session.Character.Inventory.RemoveItemFromInventory(inv.Id); } } else { session.SendPacket($"qna #u_i^1^{session.Character.CharacterId}^{(byte)inv.Type}^{inv.Slot}^0^1^{TypeEquip}^{SlotEquip} {Language.Instance.GetMessageFromKey("QNA_ITEM")}"); } } } } else { Logger.Warn(string.Format(Language.Instance.GetMessageFromKey("NO_HANDLER_ITEM"), GetType(), VNum, Effect, EffectValue)); } }
public string GenerateIn() => StaticPacketHelper.In(Domain.UserType.Object, ItemVNum, TransportId, PositionX, PositionY, this is MonsterMapItem monsterMapItem && monsterMapItem.GoldAmount > 1 ? monsterMapItem.GoldAmount : Amount, 0, 0, 0, 0, false);
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) { // Honour Medals case 69: session.Character.Reputation += ReputPrice; session.SendPacket(session.Character.GenerateFd()); session.Character.Inventory.RemoveItemFromInventory(inv.Id); break; // SP Potions case 150: case 151: session.Character.SpAdditionPoint += EffectValue; if (session.Character.SpAdditionPoint > 1000000) { session.Character.SpAdditionPoint = 1000000; } session.SendPacket(UserInterfaceHelper.GenerateMsg(string.Format(Language.Instance.GetMessageFromKey("SP_POINTSADDED"), EffectValue), 0)); session.Character.Inventory.RemoveItemFromInventory(inv.Id); session.SendPacket(session.Character.GenerateSpPoint()); break; // Specialist Medal 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.GenerateMsg(string.Format(Language.Instance.GetMessageFromKey("SP_POINTSADDEDBOTH"), EffectValue, EffectValue * 3), 0)); session.Character.Inventory.RemoveItemFromInventory(inv.Id); session.SendPacket(session.Character.GenerateSpPoint()); break; // Raid Seals case 301: if (ServerManager.Instance.IsCharacterMemberOfGroup(session.Character.CharacterId)) { session.SendPacket(session.Character.GenerateSay(Language.Instance.GetMessageFromKey("RAID_OPEN_GROUP"), 12)); return; } ItemInstance raidSeal = session.Character.Inventory.LoadBySlotAndType <ItemInstance>(inv.Slot, InventoryType.Main); session.Character.Inventory.RemoveItemFromInventory(raidSeal.Id); ScriptedInstance raid = ServerManager.Instance.Raids.FirstOrDefault(s => s.RequiredItems?.Any(obj => obj?.VNum == raidSeal.ItemVNum) == true)?.Copy(); if (raid != null) { Group group = new Group { GroupType = GroupType.BigTeam, Raid = raid }; group.JoinGroup(session.Character.CharacterId); ServerManager.Instance.AddGroup(group); session.SendPacket(UserInterfaceHelper.GenerateMsg(string.Format(Language.Instance.GetMessageFromKey("RAID_LEADER"), session.Character.Name), 0)); session.SendPacket(session.Character.GenerateSay(string.Format(Language.Instance.GetMessageFromKey("RAID_LEADER"), 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)); session.SendPacket(session.Character.GenerateRaid(0)); session.SendPacket(session.Character.GenerateRaid(1)); session.SendPacket(group.GenerateRdlst()); } break; // Partner Suits/Skins case 305: Mate mate = session.Character.Mates.Find(s => s.MateTransportId == int.Parse(packetsplit[3])); if (mate != null && EffectValue == mate.NpcMonsterVNum && mate.Skin == 0) { mate.Skin = Morph; session.SendPacket(mate.GenerateCMode(mate.Skin)); session.Character.Inventory.RemoveItemFromInventory(inv.Id); } break; // Fairy Booster case 250: if (!session.Character.Buff.ContainsKey(131)) { session.Character.AddStaticBuff(new StaticBuffDTO { CardId = 131 }); session.CurrentMapInstance?.Broadcast(session.Character.GeneratePairy()); session.SendPacket(UserInterfaceHelper.GenerateMsg(string.Format(Language.Instance.GetMessageFromKey("EFFECT_ACTIVATED"), inv.Item.Name), 0)); session.CurrentMapInstance?.Broadcast(StaticPacketHelper.GenerateEff(UserType.Player, session.Character.CharacterId, 3014), session.Character.MapX, session.Character.MapY); session.Character.Inventory.RemoveItemFromInventory(inv.Id); } else { session.SendPacket(UserInterfaceHelper.GenerateMsg(Language.Instance.GetMessageFromKey("ITEM_IN_USE"), 0)); } break; // Rainbow Pearl/Magic Eraser case 666: if (EffectValue == 1 && byte.TryParse(packetsplit[9], out byte islot)) { ItemInstance wearInstance = session.Character.Inventory.LoadBySlotAndType(islot, InventoryType.Equipment); if (wearInstance != null && (wearInstance.Item.ItemType == ItemType.Weapon || wearInstance.Item.ItemType == ItemType.Armor) && wearInstance.ShellEffects.Count != 0 && !wearInstance.Item.IsHeroic) { wearInstance.ShellEffects.Clear(); DAOFactory.ShellEffectDAO.DeleteByEquipmentSerialId(wearInstance.EquipmentSerialId); if (wearInstance.EquipmentSerialId == Guid.Empty) { wearInstance.EquipmentSerialId = Guid.NewGuid(); } session.Character.Inventory.RemoveItemFromInventory(inv.Id); session.SendPacket(UserInterfaceHelper.GenerateMsg(Language.Instance.GetMessageFromKey("OPTION_DELETE"), 0)); } } else { session.SendPacket("guri 18 0"); } break; // Atk/Def/HP/Exp potions case 6600: session.Character.Inventory.RemoveItemFromInventory(inv.Id); break; // Ancelloan's Blessing case 208: if (!session.Character.Buff.ContainsKey(121)) { session.Character.Inventory.RemoveItemFromInventory(inv.Id); session.Character.AddStaticBuff(new StaticBuffDTO { CardId = 121 }); } else { session.SendPacket(UserInterfaceHelper.GenerateMsg(Language.Instance.GetMessageFromKey("ITEM_IN_USE"), 0)); } break; case 2081: if (!session.Character.Buff.ContainsKey(146)) { session.Character.Inventory.RemoveItemFromInventory(inv.Id); session.Character.AddStaticBuff(new StaticBuffDTO { CardId = 146 }); } else { session.SendPacket(UserInterfaceHelper.GenerateMsg(Language.Instance.GetMessageFromKey("ITEM_IN_USE"), 0)); } break; // Divorce letter case 6969: // this is imaginary number I = √(-1) break; // Cupid's arrow case 34: // this is imaginary number I = √(-1) break; case 100: { } break; // Faction Egg case 570: if (session.Character.Faction == (FactionType)EffectValue) { return; } if (EffectValue < 3) { session.SendPacket(session.Character.Family == null ? $"qna #guri^750^{EffectValue} {Language.Instance.GetMessageFromKey($"ASK_CHANGE_FACTION{EffectValue}")}" : UserInterfaceHelper.GenerateMsg(Language.Instance.GetMessageFromKey("IN_FAMILY"), 0)); } else { session.SendPacket(session.Character.Family != null ? $"qna #guri^750^{EffectValue} {Language.Instance.GetMessageFromKey($"ASK_CHANGE_FACTION{EffectValue}")}" : UserInterfaceHelper.GenerateMsg(Language.Instance.GetMessageFromKey("NO_FAMILY"), 0)); } break; // SP Wings case 650: ItemInstance specialistInstance = session.Character.Inventory.LoadBySlotAndType((byte)EquipmentType.Sp, InventoryType.Wear); if (session.Character.UseSp && specialistInstance != 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 { void disposeBuff(short vNum) { if (session.Character.BuffObservables.ContainsKey(vNum)) { session.Character.BuffObservables[vNum].Dispose(); session.Character.BuffObservables.Remove(vNum); } session.Character.RemoveBuff(vNum); } disposeBuff(387); disposeBuff(395); disposeBuff(396); disposeBuff(397); disposeBuff(398); disposeBuff(410); disposeBuff(411); disposeBuff(444); specialistInstance.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.RemoveItemFromInventory(inv.Id); } } else { session.SendPacket(UserInterfaceHelper.GenerateMsg(Language.Instance.GetMessageFromKey("NO_SP"), 0)); } break; // Self-Introduction case 203: if (!session.Character.IsVehicled && Option == 0) { session.SendPacket(UserInterfaceHelper.GenerateGuri(10, 2, session.Character.CharacterId, 1)); } break; // Magic Lamp case 651: if (session.Character.Inventory.All(i => i.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.RemoveItemFromInventory(inv.Id); } } else { session.SendPacket(UserInterfaceHelper.GenerateMsg(Language.Instance.GetMessageFromKey("EQ_NOT_EMPTY"), 0)); } break; // Vehicles case 1000: if (EffectValue != 0 || ServerManager.Instance.ChannelId == 51 || session.CurrentMapInstance?.MapInstanceType == MapInstanceType.EventGameInstance) { 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.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.CurrentMapInstance?.Broadcast(StaticPacketHelper.GenerateEff(UserType.Player, session.Character.CharacterId, 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.RemoveVehicle(); } } } break; // Sealed Vessel case 1002: if (EffectValue == 69) { int rnd = ServerManager.RandomNumber(0, 1000); if (rnd < 5) { short[] vnums = { 5560, 5591, 4099, 907, 1160, 4705, 4706, 4707, 4708, 4709, 4710, 4711, 4712, 4713, 4714, 4715, 4716 }; byte[] counts = { 1, 1, 1, 1, 10, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1 }; int item = ServerManager.RandomNumber(0, 17); session.Character.GiftAdd(vnums[item], counts[item]); } else if (rnd < 30) { short[] vnums = { 361, 362, 363, 366, 367, 368, 371, 372, 373 }; session.Character.GiftAdd(vnums[ServerManager.RandomNumber(0, 9)], 1); } else { short[] vnums = { 1161, 2282, 1030, 1244, 1218, 5369, 1012, 1363, 1364, 2160, 2173, 5959, 5983, 2514, 2515, 2516, 2517, 2518, 2519, 2520, 2521, 1685, 1686, 5087, 5203, 2418, 2310, 2303, 2169, 2280, 5892, 5893, 5894, 5895, 5896, 5897, 5898, 5899, 5332, 5105, 2161, 2162 }; byte[] counts = { 10, 10, 20, 5, 1, 1, 99, 1, 1, 5, 5, 1, 2, 2, 2, 2, 2, 2, 2, 2, 2, 1, 1, 1, 1, 5, 20, 20, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1 }; int item = ServerManager.RandomNumber(0, 42); session.Character.GiftAdd(vnums[item], counts[item]); } session.Character.Inventory.RemoveItemFromInventory(inv.Id); } else if (session.HasCurrentMapInstance && session.CurrentMapInstance.MapInstanceType == MapInstanceType.BaseMapInstance && (session.Character.LastVessel.AddSeconds(1) <= DateTime.Now || session.Character.StaticBonusList.Any(s => s.StaticBonusType == StaticBonusType.FastVessels))) { 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.RandomNumber(0, 20)]; NpcMonster npcmonster = ServerManager.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 = session.Character.Direction, IsMoving = true, MapMonsterId = session.CurrentMapInstance.GetNextMonsterId(), ShouldRespawn = false }; monster.Initialize(session.CurrentMapInstance); session.CurrentMapInstance.AddMonster(monster); session.CurrentMapInstance.Broadcast(monster.GenerateIn()); session.Character.Inventory.RemoveItemFromInventory(inv.Id); session.Character.LastVessel = DateTime.Now; } break; // Golden Bazaar Medal 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.RemoveItemFromInventory(inv.Id); session.SendPacket(session.Character.GenerateSay(string.Format(Language.Instance.GetMessageFromKey("EFFECT_ACTIVATED"), Name), 12)); } break; // Silver Bazaar Medal 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.RemoveItemFromInventory(inv.Id); session.SendPacket(session.Character.GenerateSay(string.Format(Language.Instance.GetMessageFromKey("EFFECT_ACTIVATED"), Name), 12)); } break; // Pet Slot Expansion 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.RemoveItemFromInventory(inv.Id); } break; // Pet Basket 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.RemoveItemFromInventory(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; // Partner's Backpack 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.RemoveItemFromInventory(inv.Id); session.SendPacket(session.Character.GenerateExts()); session.SendPacket(session.Character.GenerateSay(string.Format(Language.Instance.GetMessageFromKey("EFFECT_ACTIVATED"), Name), 12)); } break; // Backpack Expansion case 1009: 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.RemoveItemFromInventory(inv.Id); session.SendPacket(session.Character.GenerateExts()); session.SendPacket(session.Character.GenerateSay(string.Format(Language.Instance.GetMessageFromKey("EFFECT_ACTIVATED"), Name), 12)); } break; // Sealed Tarot Card case 1005: session.Character.GiftAdd((short)(VNum - Effect), 1); session.Character.Inventory.RemoveItemFromInventory(inv.Id); break; // Tarot Card Game case 1894: if (EffectValue == 0) { for (int i = 0; i < 5; i++) { session.Character.GiftAdd((short)(Effect + ServerManager.RandomNumber(0, 10)), 1); } session.Character.Inventory.RemoveItemFromInventory(inv.Id); } break; // Sealed Tarot Card case 2152: session.Character.GiftAdd((short)(VNum + Effect), 1); session.Character.Inventory.RemoveItemFromInventory(inv.Id); break; default: switch (VNum) { case 5841: int rnd = ServerManager.RandomNumber(0, 1000); short[] vnums = null; if (rnd < 900) { vnums = new short[] { 4356, 4357, 4358, 4359 }; } else { vnums = new short[] { 4360, 4361, 4362, 4363 }; } session.Character.GiftAdd(vnums[ServerManager.RandomNumber(0, 4)], 1); session.Character.Inventory.RemoveItemFromInventory(inv.Id); break; default: Logger.Warn(string.Format(Language.Instance.GetMessageFromKey("NO_HANDLER_ITEM"), GetType(), VNum, Effect, EffectValue)); break; } break; } }
private void ExecuteHandler(ClientSession session) { PenaltyLogDTO penalty = session.Account.PenaltyLogs.OrderByDescending(s => s.DateEnd).FirstOrDefault(); if (session.Character.IsMuted() && penalty != null) { if (session.Character.Gender == GenderType.Female) { session.CurrentMapInstance?.Broadcast(session.Character.GenerateSay(Language.Instance.GetMessageFromKey("MUTED_FEMALE"), 1)); session.SendPacket(session.Character.GenerateSay(string.Format(Language.Instance.GetMessageFromKey("MUTE_TIME"), (penalty.DateEnd - DateTime.Now).ToString("hh\\:mm\\:ss")), 11)); } else { session.CurrentMapInstance?.Broadcast(session.Character.GenerateSay(Language.Instance.GetMessageFromKey("MUTED_MALE"), 1)); session.SendPacket(session.Character.GenerateSay(string.Format(Language.Instance.GetMessageFromKey("MUTE_TIME"), (penalty.DateEnd - DateTime.Now).ToString("hh\\:mm\\:ss")), 11)); } return; } Mate attacker = session.Character.Mates.FirstOrDefault(x => x.MateTransportId == MateTransportId); if (attacker?.SpInstance == null || !attacker.IsUsingSp) { return; } short?skillVnum = null; byte value = 0; switch (SkillSlot) { case 0: skillVnum = attacker.SpInstance.FirstPartnerSkill; value = 0; break; case 1: skillVnum = attacker.SpInstance.SecondPartnerSkill; value = 1; break; case 2: skillVnum = attacker.SpInstance.ThirdPartnerSkill; value = 2; break; } if (skillVnum == null) { return; } var mateSkill = ServerManager.GetSkill(skillVnum.Value); if (mateSkill == null) { return; } session.SendPacketAfter($"psr {value}", mateSkill.Cooldown * 100); if (attacker.IsSitting) { return; } attacker.Owner.MapInstance.Broadcast(StaticPacketHelper.GenerateEff(UserType.Npc, attacker.MateTransportId, 5005), attacker.PositionX, attacker.PositionY); switch (TargetType) { case UserType.Monster: if (attacker.Hp <= 0) { return; } var target = session.Character.MapInstance.GetMonster(TargetId); if (target != null) { session.CurrentMapInstance.Broadcast(StaticPacketHelper.CastOnTarget(UserType.Npc, attacker.MateTransportId, 3, target.MapMonsterId, mateSkill.CastAnimation, mateSkill.CastEffect, mateSkill.SkillVNum)); session.CurrentMapInstance.Broadcast(StaticPacketHelper.SkillUsed(UserType.Npc, attacker.MateTransportId, 3, target.MapMonsterId, mateSkill.SkillVNum, mateSkill.Cooldown, mateSkill.AttackAnimation, mateSkill.Effect, target.MapX, target.MapY, target.CurrentHp > 0, (int)(target.CurrentHp / (double)target.MaxHp * 100), 0, 0, 0)); } session.AttackMonster(attacker, mateSkill, TargetId, target?.MapX ?? attacker.PositionX, target?.MapY ?? attacker.PositionY); return; case UserType.Npc: if (attacker.Hp <= 0) { return; } var npcTarget = session.Character.MapInstance.GetNpc(TargetId); if (npcTarget != null) { session.CurrentMapInstance.Broadcast(StaticPacketHelper.CastOnTarget(UserType.Npc, attacker.MateTransportId, 3, npcTarget.MapNpcId, mateSkill.CastAnimation, mateSkill.CastEffect, mateSkill.SkillVNum)); session.CurrentMapInstance.Broadcast(StaticPacketHelper.SkillUsed(UserType.Npc, attacker.MateTransportId, 3, npcTarget.MapNpcId, mateSkill.SkillVNum, mateSkill.Cooldown, mateSkill.AttackAnimation, mateSkill.Effect, npcTarget.MapX, npcTarget.MapY, true, 100, 0, 0, 0)); } session.AttackMonster(attacker, mateSkill, TargetId, npcTarget?.MapX ?? attacker.PositionX, npcTarget?.MapY ?? attacker.PositionY); return; case UserType.Player: return; case UserType.Object: return; default: return; } }
public void ApplyBCards(object session, object sender = null, short buffLevel = 0) { Type type = session.GetType(); // int counterBuff = 0; switch ((BCardType.CardType)Type) { case BCardType.CardType.Buff: { if (type == typeof(Character) && session is Character character) { Buff buff = null; if (sender != null) { Type sType = sender.GetType(); if (sType == typeof(Character) && sender is Character sendingCharacter) { buff = new Buff((short)((short)SecondData + buffLevel), sendingCharacter.Level); //Todo: Get anti stats from BCard } } else { buff = new Buff((short)((short)SecondData + buffLevel), character.Level); } int anti = 0; if (buff?.Card.BuffType == BuffType.Bad) { anti += character.ShellEffectArmor?.FirstOrDefault(s => s.Effect == (byte)ShellArmorEffectType.ReducedAllNegativeEffect)?.Value ?? 0; switch (SecondData) { case 1: anti += character.ShellEffectArmor?.FirstOrDefault(s => s.Effect == (byte)ShellArmorEffectType .ReducedBleedingAndMinorBleeding) ?.Value ?? 0; anti += character.ShellEffectArmor?.FirstOrDefault(s => s.Effect == (byte)ShellArmorEffectType.ReducedAllBleedingType) ?.Value ?? 0; break; case 7: anti += character.ShellEffectArmor ?.FirstOrDefault(s => s.Effect == (byte)ShellArmorEffectType.ReducedStun)?.Value ?? 0; anti += character.ShellEffectArmor?.FirstOrDefault(s => s.Effect == (byte)ShellArmorEffectType.ReducedAllStun)?.Value ?? 0; break; case 21: anti += character.ShellEffectArmor?.FirstOrDefault(s => s.Effect == (byte)ShellArmorEffectType.ReducedMinorBleeding)?.Value ?? 0; anti += character.ShellEffectArmor?.FirstOrDefault(s => s.Effect == (byte)ShellArmorEffectType .ReducedBleedingAndMinorBleeding) ?.Value ?? 0; anti += character.ShellEffectArmor?.FirstOrDefault(s => s.Effect == (byte)ShellArmorEffectType.ReducedAllBleedingType) ?.Value ?? 0; break; case 27: anti += character.ShellEffectArmor?.FirstOrDefault(s => s.Effect == (byte)ShellArmorEffectType.ReducedFreeze)?.Value ?? 0; break; case 42: anti += character.ShellEffectArmor?.FirstOrDefault(s => s.Effect == (byte)ShellArmorEffectType.ReducedAllBleedingType) ?.Value ?? 0; break; case 66: anti += character.ShellEffectArmor?.FirstOrDefault(s => s.Effect == (byte)ShellArmorEffectType.ReducedAllStun)?.Value ?? 0; break; } } if (ServerManager.RandomNumber() < FirstData / 100D * (100 - anti)) { character.AddBuff(buff); } } else if (type == typeof(MapMonster)) { if (ServerManager.RandomNumber() < FirstData && session is MapMonster mapMonster) { mapMonster.AddBuff(new Buff((short)((short)SecondData + buffLevel), mapMonster.Monster.Level)); } } else if (type == typeof(MapNpc)) { } else if (type == typeof(Mate)) { } } break; case BCardType.CardType.Move: { if (type == typeof(Character) && session is Character character) { character.LastSpeedChange = DateTime.UtcNow; character.Session.SendPacket(character.GenerateCond()); } } break; case BCardType.CardType.Summons: { if (type == typeof(Character)) { // jajamaru spawn if (session is Character character && character.MapInstance != null) { List <MonsterToSummon> summonParameters = new List <MonsterToSummon>(); for (int i = 0; i < FirstData; i++) { short x, y; byte t = 0; do { x = (short)(ServerManager.RandomNumber(-3, 3) + character.PositionX); y = (short)(ServerManager.RandomNumber(-3, 3) + character.PositionY); t++; } while (!character.MapInstance.Map.IsBlockedZone(x, y) && t < byte.MaxValue); summonParameters.Add(new MonsterToSummon((short)SecondData, new MapCell { X = x, Y = y }, -1, true)); } if (ServerManager.RandomNumber() <= Math.Abs(ThirdData) || ThirdData == 0) { switch (SubType) { case 2: EventHelper.Instance.RunEvent(new EventContainer( character.Session.CurrentMapInstance, EventActionType.SpawnMonsters, summonParameters)); break; } } } } else if (type == typeof(MapMonster)) { if (session is MapMonster mapMonster && mapMonster.MapInstance != null) { List <MonsterToSummon> summonParameters = new List <MonsterToSummon>(); for (int i = 0; i < FirstData; i++) { short x, y; byte t = 0; do { x = (short)(ServerManager.RandomNumber(-3, 3) + mapMonster.MapX); y = (short)(ServerManager.RandomNumber(-3, 3) + mapMonster.MapY); t++; } while (!mapMonster.MapInstance.Map.IsBlockedZone(x, y) && t < byte.MaxValue); summonParameters.Add(new MonsterToSummon((short)SecondData, new MapCell { X = x, Y = y }, -1, true)); } if (ServerManager.RandomNumber() <= Math.Abs(ThirdData) || ThirdData == 0) { switch (SubType) { case 2: EventHelper.Instance.RunEvent(new EventContainer(mapMonster.MapInstance, EventActionType.SpawnMonsters, summonParameters)); break; default: if (mapMonster.OnDeathEvents.All(s => s.EventActionType != EventActionType.SpawnMonsters)) { mapMonster.OnDeathEvents.Add(new EventContainer(mapMonster.MapInstance, EventActionType.SpawnMonsters, summonParameters)); } break; } } } } else if (type == typeof(MapNpc)) { } else if (type == typeof(Mate)) { } } 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: { if (type == typeof(Character)) { if (session is Character character && character.Hp > 0) { int bonus; if (SubType == (byte)AdditionalTypes.HealingBurningAndCasting.RestoreHP / 10) { if (IsLevelScaled) { bonus = character.Level * FirstData; } else { bonus = FirstData; } if (character.Hp + bonus <= character.HPLoad()) { character.Hp += bonus; } else { bonus = (int)character.HPLoad() - character.Hp; character.Hp = (int)character.HPLoad(); } character.Session.CurrentMapInstance?.Broadcast(character.Session, character.GenerateRc(bonus)); } if (SubType == (byte)AdditionalTypes.HealingBurningAndCasting.RestoreMP / 10) { if (IsLevelScaled) { bonus = character.Level * FirstData; } else { bonus = FirstData; } if (character.Mp + bonus <= character.MPLoad()) { character.Mp += bonus; } else { character.Mp = (int)character.MPLoad(); } } character.Session.SendPacket(character.GenerateStat()); } } else if (type == typeof(MapMonster)) { if (ServerManager.RandomNumber() < FirstData && session is MapMonster mapMonster) { mapMonster.AddBuff(new Buff((short)SecondData, mapMonster.Monster.Level)); } } else if (type == typeof(MapNpc)) { } else if (type == typeof(Mate)) { } } break; case BCardType.CardType.Hpmp: if (type == typeof(Character)) { if (session is Character c) { switch (SubType) { case (byte)AdditionalTypes.Hpmp.RestoreDecreasedMP / 10: { int bonus = (int)(FirstData * c.MPLoad() / 100); c.Mp = c.Mp + bonus > 1 ? c.Mp + bonus : c.Mp = 1; } break; } } } break; case BCardType.CardType.SpecialisationBuffResistance: { switch (SubType) { case (byte)AdditionalTypes.SpecialisationBuffResistance.RemoveBadEffects / 10: { if (session is Character c && /*&& sender is ClientSession senderSession*/ ServerManager.RandomNumber() < Math.Abs(FirstData)) { c.DisableBuffs(FirstData > 0 ? BuffType.Good : BuffType.Bad, SecondData); } } break; } } break; case BCardType.CardType.SpecialEffects: break; case BCardType.CardType.Capture: { if (type == typeof(MapMonster) && session is MapMonster mapMonster && sender is ClientSession senderSession) { NpcMonster mateNpc = ServerManager.GetNpcMonster(mapMonster.MonsterVNum); if (mateNpc != null) { if (mapMonster.Monster.Catch) { if (mapMonster.IsAlive && mapMonster.CurrentHp <= (int)((double)mapMonster.MaxHp / 2)) { if (mapMonster.Monster.Level < senderSession.Character.Level) { // TODO: find a new algorithm int[] chance = { 100, 80, 60, 40, 20, 0 }; if (ServerManager.RandomNumber() < chance[ServerManager.RandomNumber(0, 5)]) { Mate mate = new Mate(senderSession.Character, mateNpc, (byte)(mapMonster.Monster.Level - 15 > 0 ? mapMonster.Monster.Level - 15 : 1), MateType.Pet); if (senderSession.Character.CanAddMate(mate)) { senderSession.Character.AddPetWithSkill(mate); senderSession.SendPacket( UserInterfaceHelper.GenerateMsg( Language.Instance.GetMessageFromKey("CATCH_SUCCESS"), 0)); senderSession.CurrentMapInstance?.Broadcast( StaticPacketHelper.GenerateEff(UserType.Player, senderSession.Character.CharacterId, 197)); senderSession.CurrentMapInstance?.Broadcast( StaticPacketHelper.SkillUsed(UserType.Player, senderSession.Character.CharacterId, 3, mapMonster.MapMonsterId, -1, 0, 15, -1, -1, -1, true, (int)(mapMonster.CurrentHp / (float)mapMonster.MaxHp * 100 ), 0, -1, 0)); mapMonster.SetDeathStatement(); senderSession.CurrentMapInstance?.Broadcast( StaticPacketHelper.Out(UserType.Monster, mapMonster.MapMonsterId)); } else { senderSession.SendPacket( senderSession.Character.GenerateSay( Language.Instance.GetMessageFromKey("PET_SLOT_FULL"), 10)); senderSession.SendPacket( StaticPacketHelper.Cancel(2, mapMonster.MapMonsterId)); } } else { senderSession.SendPacket( UserInterfaceHelper.GenerateMsg( Language.Instance.GetMessageFromKey("CATCH_FAIL"), 0)); senderSession.CurrentMapInstance?.Broadcast( StaticPacketHelper.SkillUsed(UserType.Player, senderSession.Character.CharacterId, 3, mapMonster.MapMonsterId, -1, 0, 15, -1, -1, -1, true, (int)(mapMonster.CurrentHp / (float)mapMonster.MaxHp * 100), 0, -1, 0)); } } else { senderSession.SendPacket(UserInterfaceHelper.GenerateMsg( Language.Instance.GetMessageFromKey("LEVEL_LOWER_THAN_MONSTER"), 0)); senderSession.SendPacket( StaticPacketHelper.Cancel(2, mapMonster.MapMonsterId)); } } else { senderSession.SendPacket(UserInterfaceHelper.GenerateMsg( Language.Instance.GetMessageFromKey("CURRENT_HP_TOO_HIGH"), 0)); senderSession.SendPacket(StaticPacketHelper.Cancel(2, mapMonster.MapMonsterId)); } } else { senderSession.SendPacket(UserInterfaceHelper.GenerateMsg( Language.Instance.GetMessageFromKey("MONSTER_CANT_BE_CAPTURED"), 0)); senderSession.SendPacket(StaticPacketHelper.Cancel(2, mapMonster.MapMonsterId)); } } } } break; case BCardType.CardType.SpecialDamageAndExplosions: break; case BCardType.CardType.SpecialEffects2: if (type == typeof(Character)) { if (session is Character c) { short destinationX = c.PositionX; short destinationY = c.PositionY; switch (SubType) { case (byte)AdditionalTypes.SpecialEffects2.TeleportInRadius / 10: { switch (c.Direction) { case 0: // -y destinationY -= (short)FirstData; break; case 1: // +x destinationX += (short)FirstData; break; case 2: // +y destinationY += (short)FirstData; break; case 3: // -x destinationX -= (short)FirstData; break; case 4: // -x -y destinationX -= (short)FirstData; destinationY -= (short)FirstData; break; case 5: // +x +y destinationX += (short)FirstData; destinationY += (short)FirstData; break; case 6: // +x -y destinationX += (short)FirstData; destinationY -= (short)FirstData; break; case 7: // -x +y destinationX -= (short)FirstData; destinationY += (short)FirstData; break; } ServerManager.Instance.TeleportForward(c.Session, c.MapInstanceId, destinationX, destinationY); } break; } } } 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: { switch (SubType) { case (byte)AdditionalTypes.SpecialActions.RunAway / 10: if (session is MapMonster m) { m.MapInstance.Broadcast(StaticPacketHelper.Say(UserType.Monster, m.MapMonsterId, 0, "!!!")); m.RemoveTarget(); for (int i = 0; i < 10; i++) { Observable.Timer(TimeSpan.FromSeconds(i)).Subscribe(o => { m.MapX++; m.MapY++; m.IgnoreTargetsUntil = DateTime.UtcNow.AddSeconds(10); m.RemoveTarget(); }); } } break; } } break; case BCardType.CardType.Mode: break; case BCardType.CardType.NoCharacteristicValue: break; case BCardType.CardType.LightAndShadow: { switch (SubType) { case (byte)AdditionalTypes.LightAndShadow.RemoveBadEffects / 10: { if (session is Character c /*&& sender is ClientSession senderSession*/) { c.DisableBuffs(BuffType.Bad, FirstData); } } break; } } 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 (type == typeof(Character) && session is Character character) { if (SkillVNum.HasValue && SubType.Equals((byte)AdditionalTypes.MeditationSkill.CausingChance / 10) && ServerManager.RandomNumber() < FirstData) { Skill skill = ServerManager.GetSkill(SkillVNum.Value); Skill newSkill = ServerManager.GetSkill((short)SecondData); Observable.Timer(TimeSpan.FromMilliseconds(100)).Subscribe(observer => { foreach (QuicklistEntryDTO quicklistEntry in character.QuicklistEntries.Where(s => s.Morph == character.Morph && s.Pos.Equals(skill.CastId))) { character.Session.SendPacket( $"qset {quicklistEntry.Q1} {quicklistEntry.Q2} {quicklistEntry.Type}.{quicklistEntry.Slot}.{newSkill.CastId}.0"); } character.Session.SendPacket($"mslot {newSkill.CastId} -1"); }); character.SkillComboCount++; character.LastSkillComboUse = DateTime.UtcNow; if (skill.CastId > 10) { // HACK this way Observable.Timer(TimeSpan.FromMilliseconds((skill.Cooldown * 100) + 500)) .Subscribe(observer => character.Session.SendPacket(StaticPacketHelper.SkillReset(skill.CastId))); } } switch (SubType) { case 2: character.MeditationDictionary[(short)SecondData] = DateTime.UtcNow.AddSeconds(4); break; case 3: character.MeditationDictionary[(short)SecondData] = DateTime.UtcNow.AddSeconds(8); break; case 4: character.MeditationDictionary[(short)SecondData] = DateTime.UtcNow.AddSeconds(12); break; } } } break; case BCardType.CardType.FalconSkill: { if (session is Character c) { switch (SubType) { case (byte)AdditionalTypes.FalconSkill.Hide: c.Invisible = true; c.Mates.Where(s => s.IsTeamMember).ToList().ForEach(s => c.Session.CurrentMapInstance?.Broadcast(s.GenerateOut())); c.Session.CurrentMapInstance?.Broadcast(c.GenerateInvisible()); c.Session.SendPacket(c.GenerateEq()); break; } } } 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: if (type == typeof(Character)) { if (session is Character character) { switch (SubType) { case ((byte)AdditionalTypes.MeteoriteTeleport.TeleportYouAndGroupToSavedLocation / 10): if (character.TeleportSet == false) { character.TeleportX = character.PositionX; character.TeleportY = character.PositionY; character.TeleportMap = character.MapId; character.MapInstance.Broadcast(StaticPacketHelper.GenerateEff(UserType.Player, character.CharacterId, 4497)); character.TeleportSet = true; Observable.Timer(TimeSpan.FromSeconds(40)).Subscribe(o => character.TeleportSet = false); } else { if (character.MapInstance.IsPvp) { if (character.MapInstance.MapInstanceType != MapInstanceType.BaseMapInstance) { character.TeleportSet = false; return; } character.MapInstance.Broadcast($"tp 1 {character.CharacterId} {character.TeleportX} {character.TeleportY} 0"); character.PositionX = character.TeleportX; character.PositionY = character.TeleportY; character.TeleportSet = false; } else { if (character.MapId == character.TeleportMap) { if (character.MapInstance.MapInstanceType == MapInstanceType.CaligorInstance) { character.TeleportSet = false; return; } character.MapInstance.Broadcast($"tp 1 {character.CharacterId} {character.TeleportX} {character.TeleportY} 0"); character.PositionX = character.TeleportX; character.PositionY = character.TeleportY; character.TeleportSet = false; } else { character.TeleportSet = false; } } } break; case (byte)AdditionalTypes.MeteoriteTeleport.CauseMeteoriteFall / 10: { int amount = 10 + (character.Level / FirstData); for (int i = 0; i < amount; i++) { Observable.Timer(TimeSpan.FromMilliseconds(i * 500)).Subscribe(o => character.SpawnMeteorite()); } } break; } } } break; case BCardType.CardType.StealBuff: break; case BCardType.CardType.Unknown: break; case BCardType.CardType.EffectSummon: break; default: Logger.Warn($"Card Type {Type} not defined!"); break; } }
private void ExecuteHandler(ClientSession session) { if (session.HasCurrentMapInstance) { Logger.LogUserEvent("GMCOMMAND", session.GenerateIdentity(), $"[RemoveNpcMonster]NpcMonsterId: {session.Character.LastNpcMonsterId}"); MapMonster monster = session.CurrentMapInstance.GetMonster(session.Character.LastNpcMonsterId); MapNpc npc = session.CurrentMapInstance.GetNpc(session.Character.LastNpcMonsterId); if (monster != null) { if (monster.IsAlive) { session.CurrentMapInstance.Broadcast(StaticPacketHelper.Out(UserType.Monster, monster.MapMonsterId)); session.SendPacket(session.Character.GenerateSay( string.Format(Language.Instance.GetMessageFromKey("MONSTER_REMOVED"), monster.MapMonsterId, monster.Monster.Name, monster.MapId, monster.MapX, monster.MapY), 12)); session.CurrentMapInstance.RemoveMonster(monster); if (DAOFactory.MapMonsterDAO.LoadById(monster.MapMonsterId) != null) { DAOFactory.MapMonsterDAO.DeleteById(monster.MapMonsterId); } } else { session.SendPacket(session.Character.GenerateSay( string.Format(Language.Instance.GetMessageFromKey("MONSTER_NOT_ALIVE")), 11)); } } else if (npc != null) { if (!npc.IsMate && !npc.IsDisabled && !npc.IsProtected) { int mapNpcId = npc.MapNpcId; session.CurrentMapInstance.Broadcast(StaticPacketHelper.Out(UserType.Npc, mapNpcId)); session.SendPacket(session.Character.GenerateSay( string.Format(Language.Instance.GetMessageFromKey("NPCMONSTER_REMOVED"), mapNpcId, npc.Npc.Name, npc.MapId, npc.MapX, npc.MapY), 12)); session.CurrentMapInstance.RemoveNpc(npc); if (DAOFactory.RecipeListDAO.LoadFirstByMapNpcId(mapNpcId) != null) { DAOFactory.RecipeListDAO.DeleteByMapNpcId(mapNpcId); } if (DAOFactory.ShopDAO.LoadByNpc(mapNpcId) != null) { DAOFactory.ShopDAO.DeleteById(mapNpcId); } if (DAOFactory.MapNpcDAO.LoadById(mapNpcId) != null) { DAOFactory.MapNpcDAO.DeleteById(mapNpcId); } } else { session.SendPacket(session.Character.GenerateSay( string.Format(Language.Instance.GetMessageFromKey("NPC_CANNOT_BE_REMOVED")), 11)); } } else { session.SendPacket( session.Character.GenerateSay(Language.Instance.GetMessageFromKey("NPCMONSTER_NOT_FOUND"), 11)); } } }
private void npcLife() { // Respawn if (CurrentHp <= 0 && ShouldRespawn != null && !ShouldRespawn.Value) { MapInstance.RemoveNpc(this); MapInstance.Broadcast(GenerateOut()); } if (!IsAlive && ShouldRespawn != null && ShouldRespawn.Value) { double timeDeath = (DateTime.Now - Death).TotalSeconds; if (timeDeath >= Npc.RespawnTime / 10d) { Respawn(); } } if (LastProtectedEffect.AddMilliseconds(6000) <= DateTime.Now) { LastProtectedEffect = DateTime.Now; if (IsMate || IsProtected) { MapInstance.Broadcast(StaticPacketHelper.GenerateEff(UserType.Npc, MapNpcId, 825), MapX, MapY); } } double time = (DateTime.Now - LastEffect).TotalMilliseconds; if (EffectDelay > 0) { if (time > EffectDelay) { if (Effect > 0 && EffectActivated) { MapInstance.Broadcast(StaticPacketHelper.GenerateEff(UserType.Npc, MapNpcId, Effect), MapX, MapY); } LastEffect = DateTime.Now; } } time = (DateTime.Now - LastSay).Seconds; if (Delay != 0) { if (time > Delay) { if (Say != null) { MapInstance.Broadcast(StaticPacketHelper.Say(2, MapNpcId, 0, $"{Say}")); LastSay = DateTime.Now; } } } time = (DateTime.Now - LastMove).TotalMilliseconds; if (Target == -1 && IsMoving && Npc.Speed > 0 && time > _movetime && !HasBuff(CardType.Move, (byte)AdditionalTypes.Move.MovementImpossible)) { _movetime = ServerManager.RandomNumber(500, 3000); int maxindex = Path.Count > Npc.Speed / 2 && Npc.Speed > 1 ? Npc.Speed / 2 : Path.Count; if (maxindex < 1) { maxindex = 1; } if (Path.Count == 0 || Path.Count >= maxindex && maxindex > 0 && Path[maxindex - 1] == null) { short xoffset = (short)ServerManager.RandomNumber(-1, 1); short yoffset = (short)ServerManager.RandomNumber(-1, 1); MapCell moveToPosition = new MapCell { X = FirstX, Y = FirstY }; if (RunToX != 0 || RunToY != 0) { moveToPosition = new MapCell { X = RunToX, Y = RunToY }; _movetime = ServerManager.RandomNumber(300, 1200); } Path = BestFirstSearch.FindPathJagged(new GridPos { X = MapX, Y = MapY }, new GridPos { X = (short)ServerManager.RandomNumber(moveToPosition.X - 3, moveToPosition.X + 3), Y = (short)ServerManager.RandomNumber(moveToPosition.Y - 3, moveToPosition.Y + 3) }, MapInstance.Map.JaggedGrid); maxindex = Path.Count > Npc.Speed / 2 && Npc.Speed > 1 ? Npc.Speed / 2 : Path.Count; } if (DateTime.Now > LastMove && Npc.Speed > 0 && Path.Count > 0) { byte speedIndex = (byte)(Npc.Speed / 2.5 < 1 ? 1 : Npc.Speed / 2.5); maxindex = Path.Count > speedIndex ? speedIndex : Path.Count; short mapX = (short)ServerManager.RandomNumber(Path[maxindex - 1].X - 1, Path[maxindex - 1].X + 1); short mapY = (short)_random.Next(Path[maxindex - 1].Y - 1, Path[maxindex - 1].Y + 1); //short mapX = Path[maxindex - 1].X; //short mapY = Path[maxindex - 1].Y; double waitingtime = Map.GetDistance(new MapCell { X = mapX, Y = mapY }, new MapCell { X = MapX, Y = MapY }) / (double)Npc.Speed; MapInstance.Broadcast(new BroadcastPacket(null, PacketFactory.Serialize(StaticPacketHelper.Move(UserType.Npc, MapNpcId, mapX, mapY, Npc.Speed)), ReceiverType.All, xCoordinate: mapX, yCoordinate: mapY)); LastMove = DateTime.Now.AddSeconds(waitingtime > 1 ? 1 : waitingtime); Observable.Timer(TimeSpan.FromMilliseconds((int)((waitingtime > 1 ? 1 : waitingtime) * 1000))).Subscribe(x => { MapX = mapX; MapY = mapY; }); Path.RemoveRange(0, maxindex); } } if (Target == -1) { if (IsHostile && Shop == null) { MapMonster monster = MapInstance.GetMonsterInRangeList(MapX, MapY, (byte)(Npc.NoticeRange > 5 ? Npc.NoticeRange / 2 : Npc.NoticeRange)).Where(s => BattleEntity.CanAttackEntity(s.BattleEntity)).FirstOrDefault(); ClientSession session = MapInstance.Sessions.FirstOrDefault(s => BattleEntity.CanAttackEntity(s.Character.BattleEntity) && MapInstance == s.Character.MapInstance && Map.GetDistance(new MapCell { X = MapX, Y = MapY }, new MapCell { X = s.Character.PositionX, Y = s.Character.PositionY }) < Npc.NoticeRange); if (monster != null) { Target = monster.MapMonsterId; } if (session?.Character != null) { Target = session.Character.CharacterId; } } } else if (Target != -1) { MapMonster monster = MapInstance.Monsters.Find(s => s.MapMonsterId == Target); if (monster == null || monster.CurrentHp < 1) { Target = -1; return; } NpcMonsterSkill npcMonsterSkill = null; if (ServerManager.RandomNumber(0, 10) > 8) { npcMonsterSkill = Skills.Where(s => (DateTime.Now - s.LastSkillUse).TotalMilliseconds >= 100 * s.Skill.Cooldown).OrderBy(rnd => _random.Next()).FirstOrDefault(); } int hitmode = 0; bool onyxWings = false; int damage = DamageHelper.Instance.CalculateDamage(new BattleEntity(this), new BattleEntity(monster), npcMonsterSkill?.Skill, ref hitmode, ref onyxWings); if (monster.Monster.BCards.Find(s => s.Type == (byte)CardType.LightAndShadow && s.SubType == (byte)AdditionalTypes.LightAndShadow.InflictDamageToMP) is BCard card) { int reduce = damage / 100 * card.FirstData; if (monster.CurrentMp < reduce) { reduce = (int)monster.CurrentMp; monster.CurrentMp = 0; } else { monster.DecreaseMp(reduce); } damage -= reduce; } int distance = Map.GetDistance(new MapCell { X = MapX, Y = MapY }, new MapCell { X = monster.MapX, Y = monster.MapY }); if (monster.CurrentHp > 0 && ((npcMonsterSkill != null && distance < npcMonsterSkill.Skill.Range) || distance <= Npc.BasicRange) && !HasBuff(CardType.SpecialAttack, (byte)AdditionalTypes.SpecialAttack.NoAttack)) { if (((DateTime.Now - LastSkill).TotalMilliseconds >= 1000 + (Npc.BasicCooldown * 200) /* && Skills.Count == 0*/) || npcMonsterSkill != null) { if (npcMonsterSkill != null) { npcMonsterSkill.LastSkillUse = DateTime.Now; MapInstance.Broadcast(StaticPacketHelper.CastOnTarget(UserType.Npc, MapNpcId, UserType.Monster, Target, npcMonsterSkill.Skill.CastAnimation, npcMonsterSkill.Skill.CastEffect, npcMonsterSkill.Skill.SkillVNum)); } if (npcMonsterSkill != null && npcMonsterSkill.Skill.CastEffect != 0) { MapInstance.Broadcast(StaticPacketHelper.GenerateEff(UserType.Npc, MapNpcId, Effect)); } monster.BattleEntity.GetDamage(damage, BattleEntity); lock (monster.DamageList) { if (!monster.DamageList.Any(s => s.Key.MapEntityId == MapNpcId)) { monster.AddToAggroList(BattleEntity); } } MapInstance.Broadcast(npcMonsterSkill != null ? StaticPacketHelper.SkillUsed(UserType.Npc, MapNpcId, 3, Target, npcMonsterSkill.SkillVNum, npcMonsterSkill.Skill.Cooldown, npcMonsterSkill.Skill.AttackAnimation, npcMonsterSkill.Skill.Effect, 0, 0, monster.CurrentHp > 0, (int)((float)monster.CurrentHp / (float)monster.MaxHp * 100), damage, hitmode, 0) : StaticPacketHelper.SkillUsed(UserType.Npc, MapNpcId, 3, Target, 0, Npc.BasicCooldown, 11, Npc.BasicSkill, 0, 0, monster.CurrentHp > 0, (int)((float)monster.CurrentHp / (float)monster.MaxHp * 100), damage, hitmode, 0)); LastSkill = DateTime.Now; if (npcMonsterSkill?.Skill.TargetType == 1 && npcMonsterSkill?.Skill.HitType == 2) { IEnumerable <ClientSession> clientSessions = MapInstance.Sessions?.Where(s => s.Character.IsInRange(MapX, MapY, npcMonsterSkill.Skill.TargetRange)); IEnumerable <Mate> mates = MapInstance.GetListMateInRange(MapX, MapY, npcMonsterSkill.Skill.TargetRange); foreach (BCard skillBcard in npcMonsterSkill.Skill.BCards) { if (skillBcard.Type == 25 && skillBcard.SubType == 1 && new Buff((short)skillBcard.SecondData, Npc.Level)?.Card?.BuffType == BuffType.Good) { if (clientSessions != null) { foreach (ClientSession clientSession in clientSessions) { if (clientSession.Character != null) { if (!BattleEntity.CanAttackEntity(clientSession.Character.BattleEntity)) { skillBcard.ApplyBCards(clientSession.Character.BattleEntity, BattleEntity); } } } } if (mates != null) { foreach (Mate mate in mates) { if (!BattleEntity.CanAttackEntity(mate.BattleEntity)) { skillBcard.ApplyBCards(mate.BattleEntity, BattleEntity); } } } } } } if (monster.CurrentHp < 1 && monster.SetDeathStatement()) { monster.RunDeathEvent(); RemoveTarget(); } } } else { int maxdistance = Npc.NoticeRange > 5 ? Npc.NoticeRange / 2 : Npc.NoticeRange; if (IsMoving && !HasBuff(CardType.Move, (byte)AdditionalTypes.Move.MovementImpossible)) { const short maxDistance = 5; int maxindex = Path.Count > Npc.Speed / 2 && Npc.Speed > 1 ? Npc.Speed / 2 : Path.Count; if (maxindex < 1) { maxindex = 1; } if ((Path.Count == 0 && distance >= 1 && distance < maxDistance) || (Path.Count >= maxindex && maxindex > 0 && Path[maxindex - 1] == null)) { short xoffset = (short)ServerManager.RandomNumber(-1, 1); short yoffset = (short)ServerManager.RandomNumber(-1, 1); //go to monster Path = BestFirstSearch.FindPathJagged(new GridPos { X = MapX, Y = MapY }, new GridPos { X = (short)(monster.MapX + xoffset), Y = (short)(monster.MapY + yoffset) }, MapInstance.Map.JaggedGrid); maxindex = Path.Count > Npc.Speed / 2 && Npc.Speed > 1 ? Npc.Speed / 2 : Path.Count; } if (DateTime.Now > LastMove && Npc.Speed > 0 && Path.Count > 0) { byte speedIndex = (byte)(Npc.Speed / 2.5 < 1 ? 1 : Npc.Speed / 2.5); maxindex = Path.Count > speedIndex ? speedIndex : Path.Count; //short mapX = (short)ServerManager.RandomNumber(Path[maxindex - 1].X - 1, Path[maxindex - 1].X + 1); //short mapY = (short)_random.Next(Path[maxindex - 1].Y - 1, Path[maxindex - 1].Y + 1); short mapX = Path[maxindex - 1].X; short mapY = Path[maxindex - 1].Y; double waitingtime = Map.GetDistance(new MapCell { X = mapX, Y = mapY }, new MapCell { X = MapX, Y = MapY }) / (double)Npc.Speed; MapInstance.Broadcast(new BroadcastPacket(null, PacketFactory.Serialize(StaticPacketHelper.Move(UserType.Npc, MapNpcId, mapX, mapY, Npc.Speed)), ReceiverType.All, xCoordinate: mapX, yCoordinate: mapY)); LastMove = DateTime.Now.AddSeconds(waitingtime > 1 ? 1 : waitingtime); Observable.Timer(TimeSpan.FromMilliseconds((int)((waitingtime > 1 ? 1 : waitingtime) * 1000))).Subscribe(x => { MapX = mapX; MapY = mapY; }); Path.RemoveRange(0, maxindex); } if (Target != -1 && (MapId != monster.MapId || distance > maxDistance)) { RemoveTarget(); } } } } }
public void ApplyBCards(object session, object sender = null) { Type type = session.GetType(); // int counterBuff = 0; if (type == null) { return; } switch ((BCardType.CardType)Type) { case BCardType.CardType.Buff: { if (type == typeof(Character) && session is Character character) { Buff buff = null; if (sender != null) { Type sType = sender.GetType(); if (sType != null) { if (sType == typeof(Character) && sender is Character sendingCharacter) { buff = new Buff((short)SecondData, sendingCharacter.Level); //Todo: Get anti stats from BCard } } } else { buff = new Buff((short)SecondData, character.Level); } if (ServerManager.Instance.RandomNumber() < FirstData) { character.AddBuff(buff); } } else if (type == typeof(MapMonster)) { if (ServerManager.Instance.RandomNumber() < FirstData && session is MapMonster mapMonster) { mapMonster.AddBuff(new Buff((short)SecondData, mapMonster.Monster.Level)); } } else if (type == typeof(MapNpc)) { } else if (type == typeof(Mate)) { } break; } case BCardType.CardType.Move: { if (type == typeof(Character) && session is Character character) { character.LastSpeedChange = DateTime.Now; character.Session.SendPacket(character.GenerateCond()); } } break; case BCardType.CardType.Summons: if (type == typeof(Character)) { } else if (type == typeof(MapMonster)) { if (session is MapMonster mapMonster) { List <MonsterToSummon> summonParameters = new List <MonsterToSummon>(); for (int i = 0; i < FirstData; i++) { short x = (short)(ServerManager.Instance.RandomNumber(-3, 3) + mapMonster.MapX); short y = (short)(ServerManager.Instance.RandomNumber(-3, 3) + mapMonster.MapY); summonParameters.Add(new MonsterToSummon((short)SecondData, new MapCell() { X = x, Y = y }, -1, true)); } if (ServerManager.Instance.RandomNumber() <= Math.Abs(ThirdData) || ThirdData == 0) { switch (SubType) { case 2: EventHelper.Instance.RunEvent(new EventContainer(mapMonster.MapInstance, EventActionType.SPAWNMONSTERS, summonParameters)); break; default: if (!mapMonster.OnDeathEvents.Any(s => s.EventActionType == EventActionType.SPAWNMONSTERS)) { mapMonster.OnDeathEvents.Add(new EventContainer(mapMonster.MapInstance, EventActionType.SPAWNMONSTERS, summonParameters)); } break; } } } } else if (type == typeof(MapNpc)) { } else if (type == typeof(Mate)) { } 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: if (type == typeof(Character)) { if (session is Character character) { int bonus = 0; if (SubType == (byte)AdditionalTypes.HealingBurningAndCasting.RestoreHP / 10) { if (IsLevelScaled) { bonus = character.Level * FirstData; } else { bonus = FirstData; } if (character.Hp + bonus <= character.HPLoad()) { character.Hp += bonus; } else { bonus = (int)character.HPLoad() - character.Hp; character.Hp = (int)character.HPLoad(); } character.Session.CurrentMapInstance?.Broadcast(character.Session, character.GenerateRc(bonus)); } if (SubType == (byte)AdditionalTypes.HealingBurningAndCasting.RestoreMP / 10) { if (IsLevelScaled) { bonus = character.Level * FirstData; } else { bonus = FirstData; } if (character.Mp + bonus <= character.MPLoad()) { character.Mp += bonus; } else { bonus = (int)character.MPLoad() - character.Mp; character.Mp = (int)character.MPLoad(); } } character.Session.SendPacket(character.GenerateStat()); } } else if (type == typeof(MapMonster)) { if (ServerManager.Instance.RandomNumber() < FirstData && session is MapMonster mapMonster) { mapMonster.AddBuff(new Buff((short)SecondData, mapMonster.Monster.Level)); } } else if (type == typeof(MapNpc)) { } else if (type == typeof(Mate)) { } break; case BCardType.CardType.HPMP: break; case BCardType.CardType.SpecialisationBuffResistance: break; case BCardType.CardType.SpecialEffects: break; case BCardType.CardType.Capture: if (type == typeof(MapMonster)) { if (session is MapMonster mapMonster && sender is ClientSession senderSession) { NpcMonster mateNpc = ServerManager.Instance.GetNpc(mapMonster.MonsterVNum); if (mateNpc != null) { if (mapMonster.Monster.Catch) { if (mapMonster.IsAlive && mapMonster.CurrentHp <= (int)((double)mapMonster.MaxHp / 2)) { if (mapMonster.Monster.Level < senderSession.Character.Level) { #warning find a new algorithm int[] chance = { 100, 80, 60, 40, 20, 0 }; if (ServerManager.Instance.RandomNumber() < chance[ServerManager.Instance.RandomNumber(0, 5)]) { Mate mate = new Mate(senderSession.Character, mateNpc, (byte)(mapMonster.Monster.Level - 15 > 0 ? mapMonster.Monster.Level - 15 : 1), MateType.Pet); if (senderSession.Character.CanAddMate(mate)) { senderSession.Character.AddPetWithSkill(mate); senderSession.SendPacket(UserInterfaceHelper.Instance.GenerateMsg(Language.Instance.GetMessageFromKey("CATCH_SUCCESS"), 0)); senderSession.CurrentMapInstance?.Broadcast(StaticPacketHelper.GenerateEff(UserType.Player, senderSession.Character.CharacterId, 197)); senderSession.CurrentMapInstance?.Broadcast(StaticPacketHelper.SkillUsed(UserType.Player, senderSession.Character.CharacterId, 3, mapMonster.MapMonsterId, -1, 0, 15, -1, -1, -1, true, (int)((float)mapMonster.CurrentHp / (float)mapMonster.MaxHp * 100), 0, -1, 0)); mapMonster.SetDeathStatement(); senderSession.CurrentMapInstance?.Broadcast(StaticPacketHelper.Out(UserType.Monster, mapMonster.MapMonsterId)); } else { senderSession.SendPacket(senderSession.Character.GenerateSay(Language.Instance.GetMessageFromKey("PET_SLOT_FULL"), 10)); senderSession.SendPacket(StaticPacketHelper.Cancel(2, mapMonster.MapMonsterId)); } } else { senderSession.SendPacket(UserInterfaceHelper.Instance.GenerateMsg(Language.Instance.GetMessageFromKey("CATCH_FAIL"), 0)); senderSession.CurrentMapInstance?.Broadcast(StaticPacketHelper.SkillUsed(UserType.Player, senderSession.Character.CharacterId, 3, mapMonster.MapMonsterId, -1, 0, 15, -1, -1, -1, true, (int)((float)mapMonster.CurrentHp / (float)mapMonster.MaxHp * 100), 0, -1, 0)); } } else { senderSession.SendPacket(UserInterfaceHelper.Instance.GenerateMsg(Language.Instance.GetMessageFromKey("LEVEL_LOWER_THAN_MONSTER"), 0)); senderSession.SendPacket(StaticPacketHelper.Cancel(2, mapMonster.MapMonsterId)); } } else { senderSession.SendPacket(UserInterfaceHelper.Instance.GenerateMsg(Language.Instance.GetMessageFromKey("CURRENT_HP_TOO_HIGH"), 0)); senderSession.SendPacket(StaticPacketHelper.Cancel(2, mapMonster.MapMonsterId)); } } else { senderSession.SendPacket(UserInterfaceHelper.Instance.GenerateMsg(Language.Instance.GetMessageFromKey("MONSTER_CANT_BE_CAPTURED"), 0)); senderSession.SendPacket(StaticPacketHelper.Cancel(2, mapMonster.MapMonsterId)); } } } } 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: 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 (type == typeof(Character) && session is Character character) { if (SkillVNum.HasValue && SubType.Equals((byte)AdditionalTypes.MeditationSkill.CausingChance / 10) && ServerManager.Instance.RandomNumber() < FirstData) { Skill skill = ServerManager.Instance.GetSkill(SkillVNum.Value); Skill newSkill = ServerManager.Instance.GetSkill((short)SecondData); Observable.Timer(TimeSpan.FromMilliseconds(100)).Subscribe(observer => { foreach (QuicklistEntryDTO quicklistEntry in character.QuicklistEntries.Where(s => s.Pos.Equals(skill.CastId))) { character.Session.SendPacket($"qset {quicklistEntry.Q1} {quicklistEntry.Q2} {quicklistEntry.Type}.{quicklistEntry.Slot}.{newSkill.CastId}.0"); } character.Session.SendPacket($"mslot {newSkill.CastId} -1"); }); character.SkillComboCount++; character.LastSkillComboUse = DateTime.Now; if (skill.CastId > 10) { // HACK this way Observable.Timer(TimeSpan.FromMilliseconds((skill.Cooldown * 100) + 500)).Subscribe(observer => character.Session.SendPacket(StaticPacketHelper.SkillReset(skill.CastId))); } } switch (SubType) { case 2: character.MeditationDictionary[(short)SecondData] = DateTime.Now.AddSeconds(4); break; case 3: character.MeditationDictionary[(short)SecondData] = DateTime.Now.AddSeconds(8); break; case 4: 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; case BCardType.CardType.Unknown: break; case BCardType.CardType.EffectSummon: break; default: Logger.Warn($"Card Type {Type} not defined!"); break; } }
public void ApplyBCards(object session, object sender = null) { //Console.WriteLine($"BCardId: {BCardId} Type: {(BCardType.CardType)Type} SubType: {SubType} CardId: {CardId?.ToString() ?? "null"} ItemVNum: {ItemVNum?.ToString() ?? "null"} SkillVNum: {SkillVNum?.ToString() ?? "null"} SessionType: {session?.GetType().ToString() ?? "null"} SenderType: {sender?.GetType().ToString() ?? "null"}"); switch ((BCardType.CardType)Type) { case BCardType.CardType.Buff: { if (ServerManager.RandomNumber() < FirstData) { Character senderCharacter = sender is ClientSession senderSession ? senderSession.Character : sender as Character; if (session is Character character) { short cardId = (short)SecondData; // If either Berserk Spirit or Strong Berserk Spirit is active // then don't add Weak Berserk Spirit if (cardId == 601 && character.Buff?.Any(s => s?.Card?.CardId == 602 || s?.Card?.CardId == 603) == true) { break; } if (senderCharacter != null) { // TODO: Get anti stats from BCard character.AddBuff(new Buff((short)SecondData, senderCharacter.Level, senderCharacter)); } else { character.AddBuff(new Buff((short)SecondData, character.Level)); } } else if (session is MapMonster mapMonster) { if (senderCharacter != null) { mapMonster.AddBuff(new Buff((short)SecondData, senderCharacter.Level, senderCharacter)); } else { mapMonster.AddBuff(new Buff((short)SecondData, mapMonster.Monster.Level)); } } } } break; case BCardType.CardType.Move: { if (session is Character character) { character.LastSpeedChange = DateTime.Now; character.Session.SendPacket(character.GenerateCond()); } } break; case BCardType.CardType.Summons: { if (session is Character character) { if (character.MapInstance != null) { List <MonsterToSummon> monsterList = new List <MonsterToSummon>(); if (SubType == (byte)AdditionalTypes.Summons.Summons / 10) { int aliveTime = ServerManager.GetNpc((short)SecondData).RespawnTime; for (int i = 0; i < FirstData; i++) { MapCell mapCell = new MapCell { X = (short)(ServerManager.RandomNumber(-1, 2) + character.PositionX), Y = (short)(ServerManager.RandomNumber(-1, 2) + character.PositionY), }; monsterList.Add(new MonsterToSummon((short)SecondData, mapCell, -1, true, false, false, true, false, -1, character, aliveTime, false)); } } if (monsterList.Any()) { EventHelper.Instance.RunEvent(new EventContainer(character.MapInstance, EventActionType.SPAWNMONSTERS, monsterList)); } } } } 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: { Character senderCharacter = sender is ClientSession senderSession ? senderSession.Character : sender as Character; if (senderCharacter != null) { #region Character if (session is Character character) { void HealingBurningAndCastingAction() { if (!character.IsAlive || character.MapInstance == null || character.Session == null) { return; } int amount = 0; if (SubType == (byte)AdditionalTypes.HealingBurningAndCasting.RestoreHP / 10 || SubType == (byte)AdditionalTypes.HealingBurningAndCasting.DecreaseHP / 10) { if (FirstData > 0) { if (IsLevelScaled) { amount = senderCharacter.Level * FirstData; } else { amount = FirstData; } if (character.Hp + amount > character.HPMax) { amount = character.HPMax - character.Hp; } character.Hp += amount; character.MapInstance.Broadcast(character.GenerateRc(amount)); } else { if (IsLevelScaled) { amount = senderCharacter.Level * (FirstData - 1); } else { amount = FirstData; } amount *= -1; if (character.Hp - amount < 1) { amount = character.Hp - 1; } character.GetDamage(amount); character.MapInstance.Broadcast(character.GenerateDm(amount)); } character.Session.SendPacket(character.GenerateStat()); } else if (SubType == (byte)AdditionalTypes.HealingBurningAndCasting.RestoreMP / 10 || SubType == (byte)AdditionalTypes.HealingBurningAndCasting.DecreaseMP / 10) { if (FirstData > 0) { if (IsLevelScaled) { amount = senderCharacter.Level * FirstData; } else { amount = FirstData; } if (character.Mp + amount > character.MPMax) { amount = character.MPMax - character.Mp; } character.Mp += amount; } else { if (IsLevelScaled) { amount = senderCharacter.Level * (FirstData - 1); } else { amount = FirstData; } amount *= -1; if (character.Mp - amount < 1) { amount = character.Mp - 1; } character.DecreaseMp(amount); } character.Session.SendPacket(character.GenerateStat()); } } HealingBurningAndCastingAction(); if (ThirdData > 0 && CardId != null) { IDisposable disposable = Observable.Interval(TimeSpan.FromSeconds(ThirdData * 2)) .Subscribe(s => HealingBurningAndCastingAction()); character.DisposeBCard(BCardId); character.BCardDisposables[BCardId] = disposable; } } #endregion #region MapMonster else if (session is MapMonster mapMonster) { void HealingBurningAndCastingAction() { if (!mapMonster.IsAlive || mapMonster.MapInstance == null) { return; } int amount = 0; if (SubType == (byte)AdditionalTypes.HealingBurningAndCasting.RestoreHP / 10 || SubType == (byte)AdditionalTypes.HealingBurningAndCasting.DecreaseHP / 10) { if (FirstData > 0) { if (IsLevelScaled) { amount = senderCharacter.Level * FirstData; } else { amount = FirstData; } if (mapMonster.CurrentHp + amount > mapMonster.MaxHp) { amount = mapMonster.MaxHp - mapMonster.CurrentHp; } mapMonster.CurrentHp += amount; mapMonster.MapInstance.Broadcast(mapMonster.GenerateRc(amount)); } else { if (IsLevelScaled) { amount = senderCharacter.Level * (FirstData - 1); } else { amount = FirstData; } amount *= -1; if (mapMonster.CurrentHp - amount < 1) { amount = mapMonster.CurrentHp - 1; } mapMonster.CurrentHp -= amount; mapMonster.MapInstance.Broadcast(mapMonster.GenerateDm(amount)); } } if (SubType == (byte)AdditionalTypes.HealingBurningAndCasting.RestoreMP / 10 || SubType == (byte)AdditionalTypes.HealingBurningAndCasting.DecreaseMP / 10) { if (FirstData > 0) { if (IsLevelScaled) { amount = senderCharacter.Level * FirstData; } else { amount = FirstData; } if (mapMonster.CurrentMp + amount > mapMonster.MaxMp) { amount = mapMonster.MaxMp - mapMonster.CurrentMp; } mapMonster.CurrentMp += amount; } else { if (IsLevelScaled) { amount = senderCharacter.Level * (FirstData - 1); } else { amount = FirstData; } amount *= -1; if (mapMonster.CurrentMp - amount < 1) { amount = mapMonster.CurrentMp - 1; } mapMonster.CurrentMp -= amount; } } } HealingBurningAndCastingAction(); if (ThirdData > 0 && CardId != null) { IDisposable disposable = Observable.Interval(TimeSpan.FromSeconds(ThirdData * 2)) .Subscribe(s => HealingBurningAndCastingAction()); mapMonster.DisposeBCard(BCardId); mapMonster.BCardDisposables[BCardId] = disposable; } } #endregion } } break; case BCardType.CardType.HPMP: { if (SubType == (byte)AdditionalTypes.HPMP.DecreaseRemainingMP / 10) { if (FirstData < 0) { double multiplier = (FirstData * -1) / 100D; if (session is Character character) { character.DecreaseMp((int)(character.Mp * multiplier)); character.Session?.SendPacket(character.GenerateStat()); } else if (session is MapMonster mapMonster) { mapMonster.DecreaseMp((int)(mapMonster.CurrentMp * multiplier)); } } } } break; case BCardType.CardType.SpecializationBuffResistance: { if (SubType == (byte)AdditionalTypes.SpecializationBuffResistance.RemoveGoodEffects / 10) { if (session is Character character) { if (FirstData < 0) { if (ServerManager.RandomNumber() < (FirstData * -1)) { character.Buff?.GetAllItems()?.Where(s => s?.Card?.BuffType == BuffType.Bad && s.Card.Level < SecondData)? .ToList()?.ForEach(s => character.RemoveBuff(s.Card.CardId)); } } else { if (ServerManager.RandomNumber() < FirstData) { character.Buff?.GetAllItems()?.Where(s => s?.Card?.BuffType == BuffType.Good && s.Card.Level < SecondData)? .ToList()?.ForEach(s => character.RemoveBuff(s.Card.CardId)); } } } } } break; case BCardType.CardType.SpecialEffects: { if (SubType == (byte)AdditionalTypes.SpecialEffects.ShadowAppears / 10) { if (session is Character character) { character.NumberOfShadows = FirstData; character.ShadowsDistance = SecondData; character.MapInstance?.Broadcast(character.GenerateSpeed()); } } } break; case BCardType.CardType.Capture: { if (session is MapMonster mapMonster && sender is ClientSession senderSession) { NpcMonster mateNpc = ServerManager.GetNpc(mapMonster.MonsterVNum); if (mateNpc != null) { if (mapMonster.Monster.Catch) { if (mapMonster.IsAlive && mapMonster.CurrentHp <= (int)((double)mapMonster.MaxHp / 2)) { if (mapMonster.Monster.Level < senderSession.Character.Level) { // TODO: Find a new algorithm int[] chance = { 100, 80, 60, 40, 20, 0 }; if (ServerManager.RandomNumber() < chance[ServerManager.RandomNumber(0, 5)]) { Mate mate = new Mate(senderSession.Character, mateNpc, (byte)(mapMonster.Monster.Level - 15 > 0 ? mapMonster.Monster.Level - 15 : 1), MateType.Pet); if (senderSession.Character.CanAddMate(mate)) { senderSession.Character.AddPetWithSkill(mate); senderSession.SendPacket(UserInterfaceHelper.GenerateMsg(Language.Instance.GetMessageFromKey("CATCH_SUCCESS"), 0)); senderSession.CurrentMapInstance?.Broadcast(StaticPacketHelper.GenerateEff(UserType.Player, senderSession.Character.CharacterId, 197)); senderSession.CurrentMapInstance?.Broadcast(StaticPacketHelper.SkillUsed(UserType.Player, senderSession.Character.CharacterId, 3, mapMonster.MapMonsterId, -1, 0, 15, -1, -1, -1, true, (int)((float)mapMonster.CurrentHp / (float)mapMonster.MaxHp * 100), 0, -1, 0)); mapMonster.SetDeathStatement(); senderSession.CurrentMapInstance?.Broadcast(StaticPacketHelper.Out(UserType.Monster, mapMonster.MapMonsterId)); } else { senderSession.SendPacket(senderSession.Character.GenerateSay(Language.Instance.GetMessageFromKey("PET_SLOT_FULL"), 10)); senderSession.SendPacket(StaticPacketHelper.Cancel(2, mapMonster.MapMonsterId)); } } else { senderSession.SendPacket(UserInterfaceHelper.GenerateMsg(Language.Instance.GetMessageFromKey("CATCH_FAIL"), 0)); senderSession.CurrentMapInstance?.Broadcast(StaticPacketHelper.SkillUsed(UserType.Player, senderSession.Character.CharacterId, 3, mapMonster.MapMonsterId, -1, 0, 15, -1, -1, -1, true, (int)((float)mapMonster.CurrentHp / (float)mapMonster.MaxHp * 100), 0, -1, 0)); } } else { senderSession.SendPacket(UserInterfaceHelper.GenerateMsg(Language.Instance.GetMessageFromKey("LEVEL_LOWER_THAN_MONSTER"), 0)); senderSession.SendPacket(StaticPacketHelper.Cancel(2, mapMonster.MapMonsterId)); } } else { senderSession.SendPacket(UserInterfaceHelper.GenerateMsg(Language.Instance.GetMessageFromKey("CURRENT_HP_TOO_HIGH"), 0)); senderSession.SendPacket(StaticPacketHelper.Cancel(2, mapMonster.MapMonsterId)); } } else { senderSession.SendPacket(UserInterfaceHelper.GenerateMsg(Language.Instance.GetMessageFromKey("MONSTER_CANT_BE_CAPTURED"), 0)); senderSession.SendPacket(StaticPacketHelper.Cancel(2, mapMonster.MapMonsterId)); } } } } break; case BCardType.CardType.SpecialDamageAndExplosions: break; case BCardType.CardType.SpecialEffects2: { if (SubType == (byte)AdditionalTypes.SpecialEffects2.TeleportInRadius / 10) { if (session is Character character) { character.Teleport((short)FirstData); } } } break; case BCardType.CardType.CalculatingLevel: break; case BCardType.CardType.Recovery: break; case BCardType.CardType.MaxHPMP: { if (session is Character character) { if (SubType == (byte)AdditionalTypes.MaxHPMP.IncreasesMaximumHP / 10) { character.HPLoad(); character.Session?.SendPacket(character.GenerateStat()); } else if (SubType == (byte)AdditionalTypes.MaxHPMP.IncreasesMaximumMP / 10) { character.MPLoad(); character.Session?.SendPacket(character.GenerateStat()); } } } 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: { Character senderCharacter = sender is ClientSession senderSession ? senderSession.Character : sender as Character; if (SubType == (byte)AdditionalTypes.SpecialActions.PushBack / 10) { if (senderCharacter != null) { if (session is Character character) { if (character.ResistForcedMovementChance <= 0 || ServerManager.RandomNumber() < character.ResistForcedMovementChance) { character.PushBack((short)FirstData, senderCharacter); } } else if (session is MapMonster mapMonster) { mapMonster.PushBack((short)FirstData, senderCharacter); } } } else if (SubType == (byte)AdditionalTypes.SpecialActions.FocusEnemies / 10) { if (senderCharacter != null) { if (session is Character character) { if (character.ResistForcedMovementChance <= 0 || ServerManager.RandomNumber() < character.ResistForcedMovementChance) { character.Focus((short)FirstData, senderCharacter); } } else if (session is MapMonster mapMonster) { mapMonster.Focus((short)FirstData, senderCharacter); } } } else if (SubType == (byte)AdditionalTypes.SpecialActions.Hide / 10) { if (session is Character character) { character.SetInvisible(true); } } } break; case BCardType.CardType.Transform: break; case BCardType.CardType.Mode: break; case BCardType.CardType.NoCharacteristicValue: break; case BCardType.CardType.LightAndShadow: { if (SubType == (byte)AdditionalTypes.LightAndShadow.RemoveBadEffects / 10) { if (session is Character character) { character.Buff?.GetAllItems()?.Where(s => s?.Card?.BuffType == BuffType.Bad && s.Card.Level < FirstData)? .ToList()?.ForEach(s => character.RemoveBuff(s.Card.CardId)); } } } 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: { if (session is Character character) { if (character.MapInstance != null) { List <MonsterToSummon> monsterList = new List <MonsterToSummon>(); if (SubType == (byte)AdditionalTypes.SecondSPCard.PlantBomb / 10) { MapMonster bomb = character.MapInstance.Monsters.FirstOrDefault(m => m?.Owner?.CharacterId == character.CharacterId && m.MonsterVNum == (short)SecondData); if (bomb == null) { for (int i = 0; i < FirstData; i++) { monsterList.Add(new MonsterToSummon((short)SecondData, new MapCell { X = character.PositionX, Y = character.PositionY }, -1, false, false, false, false, false, -1, character, 0, false)); } } else { bomb.Explode(); break; } } else if (SubType == (byte)AdditionalTypes.SecondSPCard.PlantSelfDestructionBomb / 10) { int aliveTime = ServerManager.GetNpc((short)SecondData).RespawnTime; for (int i = 0; i < FirstData; i++) { MapCell mapCell = new MapCell { X = (short)(ServerManager.RandomNumber(-1, 2) + character.PositionX), Y = (short)(ServerManager.RandomNumber(-1, 2) + character.PositionY), }; monsterList.Add(new MonsterToSummon((short)SecondData, mapCell, -1, true, false, false, true, false, -1, character, aliveTime, true)); } } if (monsterList.Any()) { EventHelper.Instance.RunEvent(new EventContainer(character.MapInstance, EventActionType.SPAWNMONSTERS, monsterList)); } } } } 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: { if (SubType == (byte)AdditionalTypes.SESpecialist.LowerHPStrongerEffect / 10) { Character senderCharacter = sender is ClientSession senderSession ? senderSession.Character : sender as Character; if (senderCharacter != null) { if (session is Character character) { double percentage = (character.Hp * 100) / character.HPMax; if (percentage < 35) { character.AddBuff(new Buff(274, senderCharacter.Level, senderCharacter)); } else if (percentage < 67) { character.AddBuff(new Buff(273, senderCharacter.Level, senderCharacter)); } else { character.AddBuff(new Buff(272, senderCharacter.Level, senderCharacter)); } } } } } break; case BCardType.CardType.FourthGlacernonFamilyRaid: break; case BCardType.CardType.SummonedMonsterAttack: break; case BCardType.CardType.BearSpirit: { if (session is Character character) { if (SubType == (byte)AdditionalTypes.BearSpirit.IncreaseMaximumHP / 10) { character.HPLoad(); character.Session?.SendPacket(character.GenerateStat()); } else if (SubType == (byte)AdditionalTypes.BearSpirit.IncreaseMaximumMP / 10) { character.MPLoad(); character.Session?.SendPacket(character.GenerateStat()); } } } 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 is Character character) { if (SkillVNum.HasValue && SubType.Equals((byte)AdditionalTypes.MeditationSkill.CausingChance / 10) && ServerManager.RandomNumber() < FirstData) { Skill skill = ServerManager.GetSkill(SkillVNum.Value); Skill newSkill = ServerManager.GetSkill((short)SecondData); Observable.Timer(TimeSpan.FromMilliseconds(100)).Subscribe(observer => { foreach (QuicklistEntryDTO quicklistEntry in character.QuicklistEntries.Where(s => s.Pos.Equals(skill.CastId))) { character.Session.SendPacket($"qset {quicklistEntry.Q1} {quicklistEntry.Q2} {quicklistEntry.Type}.{quicklistEntry.Slot}.{newSkill.CastId}.0"); } character.Session.SendPacket($"mslot {newSkill.CastId} -1"); }); character.SkillComboCount++; character.LastSkillComboUse = DateTime.Now; if (skill.CastId > 10) { Observable.Timer(TimeSpan.FromMilliseconds((skill.GetCooldown(character) * 100) + 500)).Subscribe(observer => character.Session.SendPacket(StaticPacketHelper.SkillReset(skill.CastId))); } } switch (SubType) { case 2: character.MeditationDictionary[(short)SecondData] = DateTime.Now.AddSeconds(4); break; case 3: character.MeditationDictionary[(short)SecondData] = DateTime.Now.AddSeconds(8); break; case 4: 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; case BCardType.CardType.Unknown: break; case BCardType.CardType.EffectSummon: break; default: Logger.Warn($"Card Type {Type} Not Found!"); break; } }
public override void Use(ClientSession session, ref ItemInstance inv, byte option = 0, string[] packetsplit = null) { if (packetsplit == null) { return; } void ReleasePet(MateType mateType, Guid itemToRemoveId) { if (!int.TryParse(packetsplit[3], out int mateTransportId)) { return; } Mate mate = session.Character.Mates.Find(s => s.MateTransportId == mateTransportId && s.MateType == mateType); if (mate == null) { return; } if (mate.MateType == MateType.Partner) { if (mate.SpInstance != null || mate.GlovesInstance != null || mate.BootsInstance != null || mate.WeaponInstance != null || mate.ArmorInstance != null) { session.SendPacket(UserInterfaceHelper.GenerateInfo(Language.Instance.GetMessageFromKey("MUST_REMOVE_PARTNER_EQUIPMENT"))); return; } } if (!mate.IsTeamMember) { session.Character.Mates.Remove(mate); session.SendPacket(UserInterfaceHelper.GenerateInfo(Language.Instance.GetMessageFromKey("PET_RELEASED"))); session.SendPacket(UserInterfaceHelper.GeneratePClear()); session.SendPackets(session.Character.GenerateScP()); session.SendPackets(session.Character.GenerateScN()); session.CurrentMapInstance?.Broadcast(mate.GenerateOut()); session.Character.Inventory.RemoveItemFromInventory(itemToRemoveId); } else { session.SendPacket(UserInterfaceHelper.GenerateMsg(Language.Instance.GetMessageFromKey("PET_IN_TEAM_UNRELEASABLE"), 0)); } } switch (Effect) { // loyalty & xp petfood case 10: if (int.TryParse(packetsplit[3], out var mateTransportId)) { Mate mate = session.Character.Mates.Find(s => s.MateTransportId == mateTransportId && s.MateType == MateType.Pet); if (mate == null || mate.Loyalty >= 1000 || mate.MateType == MateType.Partner) { return; } mate.Loyalty = (short)(mate.Loyalty + 100 > 1000 ? 1000 : mate.Loyalty + 100); mate.GenerateXp(EffectValue); session.SendPacket(mate.GenerateScPacket()); mate.Owner?.Session.SendPacket(mate.GenerateCond()); mate.Owner?.Session.SendPacket(StaticPacketHelper.GenerateEff(UserType.Npc, mate.MateTransportId, 5)); mate.Owner?.Session.SendPacket(StaticPacketHelper.GenerateEff(UserType.Npc, mate.MateTransportId, 5002)); mate.Owner?.Session.SendPacket(mate.Owner.GenerateSay(Language.Instance.GetMessageFromKey("MATE_EATS_FOOD"), 10)); session.Character.Inventory.RemoveItemFromInventory(inv.Id); } break; case 11: case 12: if (int.TryParse(packetsplit[3], out mateTransportId)) { Mate mate = session.Character.Mates.Find(s => s.MateTransportId == mateTransportId && s.MateType == (Effect == 11 ? MateType.Pet : MateType.Partner)); AddPetLevel(ref mate, inv.Id); } break; case 13: if (int.TryParse(packetsplit[3], out mateTransportId) && session.Character.Mates.Any(s => s.MateTransportId == mateTransportId)) { session.SendPacket(UserInterfaceHelper.GenerateGuri(10, 1, mateTransportId, 2)); } break; case 14: if (int.TryParse(packetsplit[3], out mateTransportId)) { Mate mate = session.Character.Mates.Find(s => s.MateTransportId == mateTransportId && s.MateType == MateType.Pet); if (mate?.CanPickUp == false) { session.CurrentMapInstance.Broadcast(StaticPacketHelper.GenerateEff(UserType.Npc, mate.MateTransportId, 5)); session.CurrentMapInstance.Broadcast(StaticPacketHelper.GenerateEff(UserType.Npc, mate.MateTransportId, 5002)); mate.CanPickUp = true; session.SendPackets(session.Character.GenerateScP()); session.SendPacket(session.Character.GenerateSay(Language.Instance.GetMessageFromKey("PET_CAN_PICK_UP"), 10)); session.Character.Inventory.RemoveItemFromInventory(inv.Id); } } break; case 16: if (int.TryParse(packetsplit[3], out mateTransportId)) { Mate mate = session.Character.Mates.Find(s => s.MateTransportId == mateTransportId && s.MateType == MateType.Pet); RemovePetLevel(ref mate, inv.Id); } break; case 17: if (int.TryParse(packetsplit[3], out mateTransportId)) { Mate mate = session.Character.Mates.Find(s => s.MateTransportId == mateTransportId); if (mate?.IsSummonable == false) { mate.IsSummonable = true; session.SendPackets(session.Character.GenerateScP()); session.SendPacket(session.Character.GenerateSay(string.Format(Language.Instance.GetMessageFromKey("PET_SUMMONABLE"), mate.Name), 10)); session.SendPacket(UserInterfaceHelper.GenerateMsg(string.Format(Language.Instance.GetMessageFromKey("PET_SUMMONABLE"), mate.Name), 0)); session.Character.Inventory.RemoveItemFromInventory(inv.Id); } } break; case 18: if (int.TryParse(packetsplit[3], out mateTransportId)) { Mate mate = session.Character.Mates.Find(s => s.MateTransportId == mateTransportId && s.MateType == MateType.Partner); RemovePetLevel(ref mate, inv.Id); } break; case 1000: ReleasePet(MateType.Pet, inv.Id); break; case 1001: ReleasePet(MateType.Partner, inv.Id); break; // Pet trainer case 10000: if (session.Character.MapInstance != session.Character.Miniland) { session.SendPacket(UserInterfaceHelper.GenerateModal(Language.Instance.GetMessageFromKey("NOT_IN_MINILAND"), 1)); return; } var monster = new MapMonster { MonsterVNum = (short)EffectValue, MapY = session.Character.PositionY, MapX = session.Character.PositionX, MapId = session.Character.MapInstance.Map.MapId, Position = session.Character.Direction, IsMoving = true, IsHostile = true, MapMonsterId = session.CurrentMapInstance.GetNextMonsterId(), IsMateTrainer = true, ShouldRespawn = false }; monster.Initialize(session.CurrentMapInstance); session.CurrentMapInstance.AddMonster(monster); session.CurrentMapInstance.Broadcast(monster.GenerateIn()); session.Character.Inventory.RemoveItemAmount(inv.ItemVNum); monster.GetNearestOponent(); break; default: Logger.Warn(string.Format(Language.Instance.GetMessageFromKey("NO_HANDLER_ITEM"), GetType(), VNum, Effect, EffectValue)); break; } }
public override void Use(ClientSession session, ref ItemInstance inv, byte Option = 0, string[] packetsplit = null) { switch (Effect) { // airwaves - eventitems case 0: if (inv.Item.ItemType == ItemType.Shell) { if (inv.ShellEffects.Count != 0 && packetsplit?.Length > 9 && byte.TryParse(packetsplit[9], out byte islot)) { ItemInstance wearable = session.Character.Inventory.LoadBySlotAndType <ItemInstance>(islot, InventoryType.Equipment); if (wearable != null && (wearable.Item.ItemType == ItemType.Weapon || wearable.Item.ItemType == ItemType.Armor) && wearable.Item.LevelMinimum >= inv.Upgrade && wearable.Rare >= inv.Rare && !wearable.Item.IsHeroic) { bool weapon = false; if ((inv.ItemVNum >= 565 && inv.ItemVNum <= 576) || (inv.ItemVNum >= 589 && inv.ItemVNum <= 598)) { weapon = true; } else if ((inv.ItemVNum >= 577 && inv.ItemVNum <= 588) || (inv.ItemVNum >= 656 && inv.ItemVNum <= 664) || inv.ItemVNum == 599) { weapon = false; } else { return; } if ((wearable.Item.ItemType == ItemType.Weapon && weapon) || (wearable.Item.ItemType == ItemType.Armor && !weapon)) { if (wearable.ShellEffects.Count > 0 && ServerManager.RandomNumber() < 50) { session.Character.DeleteItemByItemInstanceId(inv.Id); session.SendPacket(UserInterfaceHelper.GenerateMsg(Language.Instance.GetMessageFromKey("OPTION_APPLY_FAIL"), 0)); return; } wearable.ShellEffects.Clear(); DAOFactory.ShellEffectDAO.DeleteByEquipmentSerialId(wearable.EquipmentSerialId); wearable.ShellEffects.AddRange(inv.ShellEffects); if (wearable.EquipmentSerialId == Guid.Empty) { wearable.EquipmentSerialId = Guid.NewGuid(); } DAOFactory.ShellEffectDAO.InsertOrUpdateFromList(wearable.ShellEffects, wearable.EquipmentSerialId); session.Character.DeleteItemByItemInstanceId(inv.Id); session.SendPacket(UserInterfaceHelper.GenerateMsg(Language.Instance.GetMessageFromKey("OPTION_APPLY_SUCCESS"), 0)); } } } return; } if (ItemType == ItemType.Event) { session.CurrentMapInstance?.Broadcast(StaticPacketHelper.GenerateEff(UserType.Player, session.Character.CharacterId, EffectValue)); if (MappingHelper.GuriItemEffects.ContainsKey(EffectValue)) { session.CurrentMapInstance?.Broadcast(UserInterfaceHelper.GenerateGuri(19, 1, session.Character.CharacterId, MappingHelper.GuriItemEffects[EffectValue]), session.Character.MapX, session.Character.MapY); } session.Character.Inventory.RemoveItemFromInventory(inv.Id); } break; //respawn objects case 1: if (session.Character.MapInstance.MapInstanceType != MapInstanceType.BaseMapInstance || ServerManager.Instance.ChannelId == 51) { session.SendPacket(session.Character.GenerateSay(Language.Instance.GetMessageFromKey("CANT_USE_THAT"), 10)); return; } int type, secondaryType, inventoryType, slot; if (packetsplit != null && int.TryParse(packetsplit[2], out type) && int.TryParse(packetsplit[3], out secondaryType) && int.TryParse(packetsplit[4], out inventoryType) && int.TryParse(packetsplit[5], out slot)) { int packetType; switch (EffectValue) { case 0: if (Option == 0) { session.SendPacket(UserInterfaceHelper.GenerateDialog($"#u_i^{type}^{secondaryType}^{inventoryType}^{slot}^1 #u_i^{type}^{secondaryType}^{inventoryType}^{slot}^2 {Language.Instance.GetMessageFromKey("WANT_TO_SAVE_POSITION")}")); } else if (int.TryParse(packetsplit[6], out packetType)) { switch (packetType) { case 1: session.SendPacket(UserInterfaceHelper.GenerateDelay(5000, 7, $"#u_i^{type}^{secondaryType}^{inventoryType}^{slot}^3")); break; case 2: session.SendPacket(UserInterfaceHelper.GenerateDelay(5000, 7, $"#u_i^{type}^{secondaryType}^{inventoryType}^{slot}^4")); break; case 3: session.Character.SetReturnPoint(session.Character.MapId, session.Character.MapX, session.Character.MapY); RespawnMapTypeDTO respawn = session.Character.Respawn; if (respawn.DefaultX != 0 && respawn.DefaultY != 0 && respawn.DefaultMapId != 0) { ServerManager.Instance.ChangeMap(session.Character.CharacterId, respawn.DefaultMapId, (short)(respawn.DefaultX + ServerManager.RandomNumber(-5, 5)), (short)(respawn.DefaultY + ServerManager.RandomNumber(-5, 5))); } session.Character.Inventory.RemoveItemFromInventory(inv.Id); break; case 4: RespawnMapTypeDTO respawnObj = session.Character.Respawn; if (respawnObj.DefaultX != 0 && respawnObj.DefaultY != 0 && respawnObj.DefaultMapId != 0) { ServerManager.Instance.ChangeMap(session.Character.CharacterId, respawnObj.DefaultMapId, (short)(respawnObj.DefaultX + ServerManager.RandomNumber(-5, 5)), (short)(respawnObj.DefaultY + ServerManager.RandomNumber(-5, 5))); } session.Character.Inventory.RemoveItemFromInventory(inv.Id); break; } } break; case 1: if (int.TryParse(packetsplit[6], out packetType)) { RespawnMapTypeDTO respawn = session.Character.Return; switch (packetType) { case 0: if (respawn.DefaultX != 0 && respawn.DefaultY != 0 && respawn.DefaultMapId != 0) { session.SendPacket(UserInterfaceHelper.GenerateRp(respawn.DefaultMapId, respawn.DefaultX, respawn.DefaultY, $"#u_i^{type}^{secondaryType}^{inventoryType}^{slot}^1")); } break; case 1: session.SendPacket(UserInterfaceHelper.GenerateDelay(5000, 7, $"#u_i^{type}^{secondaryType}^{inventoryType}^{slot}^2")); break; case 2: if (respawn.DefaultX != 0 && respawn.DefaultY != 0 && respawn.DefaultMapId != 0) { ServerManager.Instance.ChangeMap(session.Character.CharacterId, respawn.DefaultMapId, respawn.DefaultX, respawn.DefaultY); } session.Character.Inventory.RemoveItemFromInventory(inv.Id); break; } } break; case 2: if (Option == 0) { session.SendPacket(UserInterfaceHelper.GenerateDelay(5000, 7, $"#u_i^{type}^{secondaryType}^{inventoryType}^{slot}^1")); } else { ServerManager.Instance.JoinMiniland(session, session); session.Character.Inventory.RemoveItemFromInventory(inv.Id); } break; } } break; // dyes or waxes case 10: case 11: if (!session.Character.IsVehicled) { if (Effect == 10) { if (EffectValue == 99) { byte nextValue = (byte)ServerManager.RandomNumber(0, 127); session.Character.HairColor = Enum.IsDefined(typeof(HairColorType), nextValue) ? (HairColorType)nextValue : 0; } else { session.Character.HairColor = Enum.IsDefined(typeof(HairColorType), (byte)EffectValue) ? (HairColorType)EffectValue : 0; } } else if (Effect == 11) { if (session.Character.Class == (byte)ClassType.Adventurer && EffectValue > 1) { session.SendPacket(UserInterfaceHelper.GenerateMsg(Language.Instance.GetMessageFromKey("ADVENTURERS_CANT_USE"), 10)); return; } if (session.Character.Gender != (GenderType)Sex) { session.SendPacket(UserInterfaceHelper.GenerateMsg(Language.Instance.GetMessageFromKey("CANNOT_USE"), 10)); return; } session.Character.HairStyle = Enum.IsDefined(typeof(HairStyleType), (byte)EffectValue) ? (HairStyleType)EffectValue : 0; } else { if (session.Character.Class == (byte)ClassType.Adventurer && EffectValue > 1) { session.SendPacket(UserInterfaceHelper.GenerateMsg(Language.Instance.GetMessageFromKey("ADVENTURERS_CANT_USE"), 10)); return; } session.Character.HairStyle = Enum.IsDefined(typeof(HairStyleType), (byte)EffectValue) ? (HairStyleType)EffectValue : 0; } session.SendPacket(session.Character.GenerateEq()); session.CurrentMapInstance?.Broadcast(session, session.Character.GenerateIn()); session.CurrentMapInstance?.Broadcast(session, session.Character.GenerateGidx()); session.Character.Inventory.RemoveItemFromInventory(inv.Id); } break; // dignity restoration case 14: if ((EffectValue == 100 || EffectValue == 200) && session.Character.Dignity < 100 && !session.Character.IsVehicled) { session.Character.Dignity += EffectValue; if (session.Character.Dignity > 100) { session.Character.Dignity = 100; } session.SendPacket(session.Character.GenerateFd()); session.SendPacket(StaticPacketHelper.GenerateEff(UserType.Player, session.Character.CharacterId, 49 - (byte)session.Character.Faction)); session.CurrentMapInstance?.Broadcast(session, session.Character.GenerateIn(), ReceiverType.AllExceptMe); session.CurrentMapInstance?.Broadcast(session, session.Character.GenerateGidx(), ReceiverType.AllExceptMe); session.Character.Inventory.RemoveItemFromInventory(inv.Id); } else if (EffectValue == 2000 && session.Character.Dignity < 100 && !session.Character.IsVehicled) { session.Character.Dignity = 100; session.SendPacket(session.Character.GenerateFd()); session.SendPacket(StaticPacketHelper.GenerateEff(UserType.Player, session.Character.CharacterId, 49 - (byte)session.Character.Faction)); session.CurrentMapInstance?.Broadcast(session, session.Character.GenerateIn(), ReceiverType.AllExceptMe); session.CurrentMapInstance?.Broadcast(session, session.Character.GenerateGidx(), ReceiverType.AllExceptMe); session.Character.Inventory.RemoveItemFromInventory(inv.Id); } break; // speakers case 15: if (!session.Character.IsVehicled && Option == 0) { session.SendPacket(UserInterfaceHelper.GenerateGuri(10, 3, session.Character.CharacterId, 1)); } break; // bubbles case 16: if (!session.Character.IsVehicled && Option == 0) { session.SendPacket(UserInterfaceHelper.GenerateGuri(10, 4, session.Character.CharacterId, 1)); } break; // wigs case 30: if (!session.Character.IsVehicled) { ItemInstance wig = session.Character.Inventory.LoadBySlotAndType((byte)EquipmentType.Hat, InventoryType.Wear); if (wig != null) { wig.Design = (byte)ServerManager.RandomNumber(0, 15); session.SendPacket(session.Character.GenerateEq()); session.SendPacket(session.Character.GenerateEquipment()); session.CurrentMapInstance?.Broadcast(session, session.Character.GenerateIn()); session.CurrentMapInstance?.Broadcast(session, session.Character.GenerateGidx()); session.Character.Inventory.RemoveItemFromInventory(inv.Id); } else { session.SendPacket(UserInterfaceHelper.GenerateMsg(Language.Instance.GetMessageFromKey("NO_WIG"), 0)); } } break; case 31: if (!session.Character.IsVehicled && session.Character.HairStyle == HairStyleType.Hair7) { session.Character.HairStyle = HairStyleType.Hair8; session.SendPacket(session.Character.GenerateEq()); session.CurrentMapInstance?.Broadcast(session, session.Character.GenerateIn()); session.CurrentMapInstance?.Broadcast(session, session.Character.GenerateGidx()); session.Character.Inventory.RemoveItemFromInventory(inv.Id); // idk how it works yet but seems like all characters with this hairstyle have DarkPurple hair //session.Character.HairColor = HairColorType.DarkPurple; } break; case 300: if (session.Character.Group != null && session.Character.Group.GroupType != GroupType.Group && session.Character.Group.IsLeader(session) && session.CurrentMapInstance.Portals.Any(s => s.Type == (short)PortalType.Raid)) { int delay = 0; foreach (ClientSession sess in session.Character.Group.Characters.GetAllItems()) { Observable.Timer(TimeSpan.FromMilliseconds(delay)).Subscribe(o => { if (sess?.Character != null && session?.CurrentMapInstance != null && session?.Character != null) { ServerManager.Instance.ChangeMapInstance(sess.Character.CharacterId, session.CurrentMapInstance.MapInstanceId, session.Character.PositionX, session.Character.PositionY); } }); delay += 100; } session.Character.Inventory.RemoveItemFromInventory(inv.Id); } break; default: Logger.Warn(string.Format(Language.Instance.GetMessageFromKey("NO_HANDLER_ITEM"), GetType(), VNum, Effect, EffectValue)); break; } }
public override void Use(ClientSession session, ref ItemInstance inv, byte Option = 0, string[] packetsplit = null) { if (session.Character.IsVehicled) { session.SendPacket(session.Character.GenerateSay(Language.Instance.GetMessageFromKey("CANT_DO_VEHICLED"), 10)); return; } if (session.CurrentMapInstance.MapInstanceType == MapInstanceType.TalentArenaMapInstance) { return; } if (packetsplit == null) { return; } void releasePet(MateType mateType, Guid itemToRemoveId) { if (int.TryParse(packetsplit[3], out int mateTransportId)) { Mate mate = session.Character.Mates.Find(s => s.MateTransportId == mateTransportId && s.MateType == mateType); if (mate != null) { if (!mate.IsTeamMember) { List <ItemInstance> mateInventory = mate.GetInventory(); if (mateInventory.Count > 0) { session.SendPacket(UserInterfaceHelper.GenerateMsg(Language.Instance.GetMessageFromKey("EQ_NOT_EMPTY"), 0)); } else { session.Character.Mates.Remove(mate); byte i = 0; session.Character.Mates.Where(s => s.MateType == MateType.Partner).ToList().ForEach(s => { s.GetInventory().ForEach(item => item.Type = (InventoryType)(13 + i)); s.PetId = i; i++; }); session.SendPacket(UserInterfaceHelper.GenerateInfo(Language.Instance.GetMessageFromKey("PET_RELEASED"))); session.SendPacket(UserInterfaceHelper.GeneratePClear()); session.SendPackets(session.Character.GenerateScP()); session.SendPackets(session.Character.GenerateScN()); session.CurrentMapInstance?.Broadcast(mate.GenerateOut()); session.Character.Inventory.RemoveItemFromInventory(itemToRemoveId); } } else { session.SendPacket(UserInterfaceHelper.GenerateMsg(Language.Instance.GetMessageFromKey("PET_IN_TEAM_UNRELEASABLE"), 0)); } } } } if (BCards.Count > 0 && session.Character.MapInstance == session.Character.Miniland) { BCards.ForEach(c => c.ApplyBCards(session.Character.BattleEntity, session.Character.BattleEntity)); session.Character.Inventory.RemoveItemFromInventory(inv.Id); return; } switch (Effect) { case 10: if (int.TryParse(packetsplit[3], out int mateTransportId)) { Mate mate = session.Character.Mates.Find(s => s.MateTransportId == mateTransportId); if (mate == null || mate.MateType != MateType.Pet || mate.Loyalty >= 1000) { return; } mate.Loyalty += 100; if (mate.Loyalty > 1000) { mate.Loyalty = 1000; } mate.GenerateXp(EffectValue); session.SendPacket(mate.GenerateCond()); session.SendPacket(StaticPacketHelper.GenerateEff(UserType.Npc, mate.MateTransportId, 5002)); session.Character.Inventory.RemoveItemFromInventory(inv.Id); } break; case 11: if (int.TryParse(packetsplit[3], out mateTransportId)) { Mate mate = session.Character.Mates.Find(s => s.MateTransportId == mateTransportId); if (mate == null || mate.MateType != MateType.Pet || mate.Level >= session.Character.Level - 5 || mate.Level + 1 > ServerManager.Instance.Configuration.MaxLevel) { return; } mate.Level++; mate.Hp = mate.MaxHp; mate.Mp = mate.MaxMp; session.SendPacket($"say 2 {mate.MateTransportId} 0 " + Language.Instance.GetMessageFromKey("MATE_POWER_INCREASED")); session.SendPackets(session.Character.GenerateScP()); session.CurrentMapInstance?.Broadcast(StaticPacketHelper.GenerateEff(UserType.Npc, mate.MateTransportId, 8), mate.PositionX, mate.PositionY); session.CurrentMapInstance?.Broadcast(StaticPacketHelper.GenerateEff(UserType.Npc, mate.MateTransportId, 198), mate.PositionX, mate.PositionY); session.Character.Inventory.RemoveItemFromInventory(inv.Id); } break; case 12: if (int.TryParse(packetsplit[3], out mateTransportId)) { Mate mate = session.Character.Mates.Find(s => s.MateTransportId == mateTransportId); if (mate == null || mate.MateType != MateType.Partner || mate.Level >= session.Character.Level - 5 || mate.Level + 1 > ServerManager.Instance.Configuration.MaxLevel) { return; } mate.Level++; mate.Hp = mate.MaxHp; mate.Mp = mate.MaxMp; session.SendPacket($"say 2 {mate.MateTransportId} 0 " + Language.Instance.GetMessageFromKey("MATE_POWER_INCREASED")); session.SendPackets(session.Character.GenerateScN()); session.CurrentMapInstance?.Broadcast(StaticPacketHelper.GenerateEff(UserType.Npc, mate.MateTransportId, 8), mate.PositionX, mate.PositionY); session.CurrentMapInstance?.Broadcast(StaticPacketHelper.GenerateEff(UserType.Npc, mate.MateTransportId, 198), mate.PositionX, mate.PositionY); session.Character.Inventory.RemoveItemFromInventory(inv.Id); } break; case 13: if (int.TryParse(packetsplit[3], out mateTransportId) && session.Character.Mates.FirstOrDefault(s => s.MateTransportId == mateTransportId) is Mate pet) { if (pet.MateType == MateType.Pet) { session.SendPacket(UserInterfaceHelper.GenerateGuri(10, 1, mateTransportId, 2)); } else { session.SendPacket(UserInterfaceHelper.GenerateMsg(Language.Instance.GetMessageFromKey("CANT_CHANGE_PARTNER_NAME"), 0)); } } break; case 14: if (int.TryParse(packetsplit[3], out mateTransportId)) { if (session.Character.MapInstance == session.Character.Miniland) { Mate mate = session.Character.Mates.Find(s => s.MateTransportId == mateTransportId && s.MateType == MateType.Pet); if (mate?.CanPickUp == false) { session.CurrentMapInstance.Broadcast(StaticPacketHelper.GenerateEff(UserType.Npc, mate.MateTransportId, 5)); session.CurrentMapInstance.Broadcast(StaticPacketHelper.GenerateEff(UserType.Npc, mate.MateTransportId, 5002)); session.SendPacket($"say 2 {mate.MateTransportId} 0 " + Language.Instance.GetMessageFromKey("PET_SMART")); mate.CanPickUp = true; session.SendPackets(session.Character.GenerateScP()); session.SendPacket(session.Character.GenerateSay(Language.Instance.GetMessageFromKey("PET_CAN_PICK_UP"), 10)); session.Character.Inventory.RemoveItemFromInventory(inv.Id); } } else { session.SendPacket(session.Character.GenerateSay(Language.Instance.GetMessageFromKey("NOT_IN_MINILAND"), 12)); } } break; case 16: if (int.TryParse(packetsplit[3], out mateTransportId)) { Mate mate = session.Character.Mates.Find(s => s.MateTransportId == mateTransportId); if (mate == null || mate.MateType != MateType.Pet || mate.Level == 1) { return; } mate.Level--; mate.Hp = mate.MaxHp; mate.Mp = mate.MaxMp; session.SendPacket($"say 2 {mate.MateTransportId} 0 " + Language.Instance.GetMessageFromKey("MATE_POWER_DECREASED")); session.SendPackets(session.Character.GenerateScP()); session.CurrentMapInstance?.Broadcast(StaticPacketHelper.GenerateEff(UserType.Npc, mate.MateTransportId, 198), mate.PositionX, mate.PositionY); session.Character.Inventory.RemoveItemFromInventory(inv.Id); } break; case 17: if (int.TryParse(packetsplit[3], out mateTransportId)) { Mate mate = session.Character.Mates.Find(s => s.MateTransportId == mateTransportId); if (mate?.IsSummonable == false) { mate.IsSummonable = true; session.SendPackets(session.Character.GenerateScP()); session.SendPacket(session.Character.GenerateSay(string.Format(Language.Instance.GetMessageFromKey("PET_SUMMONABLE"), mate.Name), 10)); session.SendPacket(UserInterfaceHelper.GenerateMsg(string.Format(Language.Instance.GetMessageFromKey("PET_SUMMONABLE"), mate.Name), 0)); session.Character.Inventory.RemoveItemFromInventory(inv.Id); } } break; case 18: if (int.TryParse(packetsplit[3], out mateTransportId)) { Mate mate = session.Character.Mates.Find(s => s.MateTransportId == mateTransportId); if (mate == null || mate.MateType != MateType.Partner || mate.Level == 1) { return; } mate.Level--; mate.Hp = mate.MaxHp; mate.Mp = mate.MaxMp; session.SendPacket($"say 2 {mate.MateTransportId} 0 " + Language.Instance.GetMessageFromKey("MATE_POWER_DECREASED")); session.SendPackets(session.Character.GenerateScN()); session.CurrentMapInstance?.Broadcast(StaticPacketHelper.GenerateEff(UserType.Npc, mate.MateTransportId, 198), mate.PositionX, mate.PositionY); session.Character.Inventory.RemoveItemFromInventory(inv.Id); } break; case 1000: releasePet(MateType.Pet, inv.Id); break; case 1001: releasePet(MateType.Partner, inv.Id); break; case 1339: int rndevolve = ServerManager.RandomNumber(0, 1000); if (rndevolve > 900) { if (int.TryParse(packetsplit[3], out mateTransportId)) { Mate mate = session.Character.Mates.Find(s => s.MateTransportId == mateTransportId); if (mate == null) { session.SendPacket(session.Character.GenerateSay(Language.Instance.GetMessageFromKey("PICK_PET"), 10)); return; } if (mate.Level >= 30 && mate.NpcMonsterVNum == 649 && mate.IsTeamMember == true && mate.MateType == MateType.Pet) { mate.Level = 1; mate.NpcMonsterVNum = 650; session.CurrentMapInstance.Broadcast(StaticPacketHelper.GenerateEff(UserType.Npc, mate.MateTransportId, 5)); session.CurrentMapInstance.Broadcast(StaticPacketHelper.GenerateEff(UserType.Npc, mate.MateTransportId, 5002)); session.SendPackets(session.Character.GenerateScP()); session.SendPackets(session.Character.GenerateScN()); session.SendPacket(session.Character.GenerateSay(Language.Instance.GetMessageFromKey("PET_EVOLED"), 10)); if (session?.Character != null) { if (session.Character.Miniland == session.Character.MapInstance) { ServerManager.Instance.JoinMiniland(session, session); } else { ServerManager.Instance.ChangeMapInstance(session.Character.CharacterId, session.Character.MapInstanceId, session.Character.PositionX, session.Character.PositionY, true); session.SendPacket(StaticPacketHelper.Cancel(2)); } } } else { if (mate.Level >= 30 && mate.NpcMonsterVNum == 648 && mate.IsTeamMember == true && mate.MateType == MateType.Pet) { mate.Level = 1; mate.NpcMonsterVNum = 649; session.CurrentMapInstance.Broadcast(StaticPacketHelper.GenerateEff(UserType.Npc, mate.MateTransportId, 5)); session.CurrentMapInstance.Broadcast(StaticPacketHelper.GenerateEff(UserType.Npc, mate.MateTransportId, 5002)); session.SendPackets(session.Character.GenerateScP()); session.SendPackets(session.Character.GenerateScN()); session.SendPacket(session.Character.GenerateSay(Language.Instance.GetMessageFromKey("PET_EVOLED"), 10)); if (session?.Character != null) { if (session.Character.Miniland == session.Character.MapInstance) { ServerManager.Instance.JoinMiniland(session, session); } else { ServerManager.Instance.ChangeMapInstance(session.Character.CharacterId, session.Character.MapInstanceId, session.Character.PositionX, session.Character.PositionY, true); session.SendPacket(StaticPacketHelper.Cancel(2)); } } } else { if (mate.Level >= 30 && mate.NpcMonsterVNum == 651 && mate.IsTeamMember == true && mate.MateType == MateType.Pet) { mate.Level = 1; mate.NpcMonsterVNum = 652; session.CurrentMapInstance.Broadcast(StaticPacketHelper.GenerateEff(UserType.Npc, mate.MateTransportId, 5)); session.CurrentMapInstance.Broadcast(StaticPacketHelper.GenerateEff(UserType.Npc, mate.MateTransportId, 5002)); session.SendPackets(session.Character.GenerateScP()); session.SendPackets(session.Character.GenerateScN()); session.SendPacket(session.Character.GenerateSay(Language.Instance.GetMessageFromKey("PET_EVOLED"), 10)); if (session?.Character != null) { if (session.Character.Miniland == session.Character.MapInstance) { ServerManager.Instance.JoinMiniland(session, session); } else { ServerManager.Instance.ChangeMapInstance(session.Character.CharacterId, session.Character.MapInstanceId, session.Character.PositionX, session.Character.PositionY, true); session.SendPacket(StaticPacketHelper.Cancel(2)); } } } else { if (mate.Level >= 30 && mate.NpcMonsterVNum == 652 && mate.IsTeamMember == true && mate.MateType == MateType.Pet) { mate.Level = 1; mate.NpcMonsterVNum = 653; session.CurrentMapInstance.Broadcast(StaticPacketHelper.GenerateEff(UserType.Npc, mate.MateTransportId, 5)); session.CurrentMapInstance.Broadcast(StaticPacketHelper.GenerateEff(UserType.Npc, mate.MateTransportId, 5002)); session.SendPackets(session.Character.GenerateScP()); session.SendPackets(session.Character.GenerateScN()); session.SendPacket(session.Character.GenerateSay(Language.Instance.GetMessageFromKey("PET_EVOLED"), 10)); if (session?.Character != null) { if (session.Character.Miniland == session.Character.MapInstance) { ServerManager.Instance.JoinMiniland(session, session); } else { ServerManager.Instance.ChangeMapInstance(session.Character.CharacterId, session.Character.MapInstanceId, session.Character.PositionX, session.Character.PositionY, true); session.SendPacket(StaticPacketHelper.Cancel(2)); } } } else { if (mate.Level >= 30 && mate.NpcMonsterVNum == 660 && mate.IsTeamMember == true && mate.MateType == MateType.Pet) { mate.Level = 1; mate.NpcMonsterVNum = 661; session.CurrentMapInstance.Broadcast(StaticPacketHelper.GenerateEff(UserType.Npc, mate.MateTransportId, 5)); session.CurrentMapInstance.Broadcast(StaticPacketHelper.GenerateEff(UserType.Npc, mate.MateTransportId, 5002)); session.SendPackets(session.Character.GenerateScP()); session.SendPackets(session.Character.GenerateScN()); session.SendPacket(session.Character.GenerateSay(Language.Instance.GetMessageFromKey("PET_EVOLED"), 10)); if (session?.Character != null) { if (session.Character.Miniland == session.Character.MapInstance) { ServerManager.Instance.JoinMiniland(session, session); } else { ServerManager.Instance.ChangeMapInstance(session.Character.CharacterId, session.Character.MapInstanceId, session.Character.PositionX, session.Character.PositionY, true); session.SendPacket(StaticPacketHelper.Cancel(2)); } } } else { if (mate.Level >= 30 && mate.NpcMonsterVNum == 661 && mate.IsTeamMember == true && mate.MateType == MateType.Pet) { mate.Level = 1; mate.NpcMonsterVNum = 662; session.CurrentMapInstance.Broadcast(StaticPacketHelper.GenerateEff(UserType.Npc, mate.MateTransportId, 5)); session.CurrentMapInstance.Broadcast(StaticPacketHelper.GenerateEff(UserType.Npc, mate.MateTransportId, 5002)); session.SendPackets(session.Character.GenerateScP()); session.SendPackets(session.Character.GenerateScN()); session.SendPacket(session.Character.GenerateSay(Language.Instance.GetMessageFromKey("PET_EVOLED"), 10)); if (session?.Character != null) { if (session.Character.Miniland == session.Character.MapInstance) { ServerManager.Instance.JoinMiniland(session, session); } else { ServerManager.Instance.ChangeMapInstance(session.Character.CharacterId, session.Character.MapInstanceId, session.Character.PositionX, session.Character.PositionY, true); session.SendPacket(StaticPacketHelper.Cancel(2)); } } } else { if (mate.Level >= 30 && mate.NpcMonsterVNum == 657 && mate.IsTeamMember == true && mate.MateType == MateType.Pet) { mate.Level = 1; mate.NpcMonsterVNum = 658; session.CurrentMapInstance.Broadcast(StaticPacketHelper.GenerateEff(UserType.Npc, mate.MateTransportId, 5)); session.CurrentMapInstance.Broadcast(StaticPacketHelper.GenerateEff(UserType.Npc, mate.MateTransportId, 5002)); session.SendPackets(session.Character.GenerateScP()); session.SendPackets(session.Character.GenerateScN()); session.SendPacket(session.Character.GenerateSay(Language.Instance.GetMessageFromKey("PET_EVOLED"), 10)); if (session?.Character != null) { if (session.Character.Miniland == session.Character.MapInstance) { ServerManager.Instance.JoinMiniland(session, session); } else { ServerManager.Instance.ChangeMapInstance(session.Character.CharacterId, session.Character.MapInstanceId, session.Character.PositionX, session.Character.PositionY, true); session.SendPacket(StaticPacketHelper.Cancel(2)); } } } else { if (mate.Level >= 30 && mate.NpcMonsterVNum == 658 && mate.IsTeamMember == true && mate.MateType == MateType.Pet) { mate.Level = 1; mate.NpcMonsterVNum = 659; session.CurrentMapInstance.Broadcast(StaticPacketHelper.GenerateEff(UserType.Npc, mate.MateTransportId, 5)); session.CurrentMapInstance.Broadcast(StaticPacketHelper.GenerateEff(UserType.Npc, mate.MateTransportId, 5002)); session.SendPackets(session.Character.GenerateScP()); session.SendPackets(session.Character.GenerateScN()); session.SendPacket(session.Character.GenerateSay(Language.Instance.GetMessageFromKey("PET_EVOLED"), 10)); if (session?.Character != null) { if (session.Character.Miniland == session.Character.MapInstance) { ServerManager.Instance.JoinMiniland(session, session); } else { ServerManager.Instance.ChangeMapInstance(session.Character.CharacterId, session.Character.MapInstanceId, session.Character.PositionX, session.Character.PositionY, true); session.SendPacket(StaticPacketHelper.Cancel(2)); } } } else { if (mate.Level >= 30 && mate.NpcMonsterVNum == 660 && mate.IsTeamMember == true && mate.MateType == MateType.Pet) { mate.Level = 1; mate.NpcMonsterVNum = 661; session.CurrentMapInstance.Broadcast(StaticPacketHelper.GenerateEff(UserType.Npc, mate.MateTransportId, 5)); session.CurrentMapInstance.Broadcast(StaticPacketHelper.GenerateEff(UserType.Npc, mate.MateTransportId, 5002)); session.SendPackets(session.Character.GenerateScP()); session.SendPackets(session.Character.GenerateScN()); session.SendPacket(session.Character.GenerateSay(Language.Instance.GetMessageFromKey("PET_EVOLED"), 10)); if (session?.Character != null) { if (session.Character.Miniland == session.Character.MapInstance) { ServerManager.Instance.JoinMiniland(session, session); } else { ServerManager.Instance.ChangeMapInstance(session.Character.CharacterId, session.Character.MapInstanceId, session.Character.PositionX, session.Character.PositionY, true); session.SendPacket(StaticPacketHelper.Cancel(2)); } } } else { if (mate.Level >= 30 && mate.NpcMonsterVNum == 988 && mate.IsTeamMember == true && mate.MateType == MateType.Pet) { mate.Level = 1; mate.NpcMonsterVNum = 416; session.CurrentMapInstance.Broadcast(StaticPacketHelper.GenerateEff(UserType.Npc, mate.MateTransportId, 5)); session.CurrentMapInstance.Broadcast(StaticPacketHelper.GenerateEff(UserType.Npc, mate.MateTransportId, 5002)); session.SendPackets(session.Character.GenerateScP()); session.SendPackets(session.Character.GenerateScN()); session.SendPacket(session.Character.GenerateSay(Language.Instance.GetMessageFromKey("PET_EVOLED"), 10)); if (session?.Character != null) { if (session.Character.Miniland == session.Character.MapInstance) { ServerManager.Instance.JoinMiniland(session, session); } else { ServerManager.Instance.ChangeMapInstance(session.Character.CharacterId, session.Character.MapInstanceId, session.Character.PositionX, session.Character.PositionY, true); session.SendPacket(StaticPacketHelper.Cancel(2)); } } } else { if (mate.Level >= 30 && mate.NpcMonsterVNum == 416 && mate.IsTeamMember == true && mate.MateType == MateType.Pet) { mate.Level = 1; mate.NpcMonsterVNum = 412; session.CurrentMapInstance.Broadcast(StaticPacketHelper.GenerateEff(UserType.Npc, mate.MateTransportId, 5)); session.CurrentMapInstance.Broadcast(StaticPacketHelper.GenerateEff(UserType.Npc, mate.MateTransportId, 5002)); session.SendPackets(session.Character.GenerateScP()); session.SendPackets(session.Character.GenerateScN()); session.SendPacket(session.Character.GenerateSay(Language.Instance.GetMessageFromKey("PET_EVOLED"), 10)); if (session?.Character != null) { if (session.Character.Miniland == session.Character.MapInstance) { ServerManager.Instance.JoinMiniland(session, session); } else { ServerManager.Instance.ChangeMapInstance(session.Character.CharacterId, session.Character.MapInstanceId, session.Character.PositionX, session.Character.PositionY, true); session.SendPacket(StaticPacketHelper.Cancel(2)); } } } else { if (mate.Level >= 30 && mate.NpcMonsterVNum == 412 && mate.IsTeamMember == true && mate.MateType == MateType.Pet) { mate.Level = 1; mate.NpcMonsterVNum = 414; session.CurrentMapInstance.Broadcast(StaticPacketHelper.GenerateEff(UserType.Npc, mate.MateTransportId, 5)); session.CurrentMapInstance.Broadcast(StaticPacketHelper.GenerateEff(UserType.Npc, mate.MateTransportId, 5002)); session.SendPackets(session.Character.GenerateScP()); session.SendPackets(session.Character.GenerateScN()); session.SendPacket(session.Character.GenerateSay(Language.Instance.GetMessageFromKey("PET_EVOLED"), 10)); if (session?.Character != null) { if (session.Character.Miniland == session.Character.MapInstance) { ServerManager.Instance.JoinMiniland(session, session); } else { ServerManager.Instance.ChangeMapInstance(session.Character.CharacterId, session.Character.MapInstanceId, session.Character.PositionX, session.Character.PositionY, true); session.SendPacket(StaticPacketHelper.Cancel(2)); } } } else { } } } } break; } break; } break; } break; } break; } break; } break; } break; } break; } else { session.SendPacket(session.Character.GenerateSay(Language.Instance.GetMessageFromKey("PET_NOT_EVOLED"), 10)); } break; } else { session.Character.Inventory.RemoveItemFromInventory(inv.Id); session.SendPacket(session.Character.GenerateSay(Language.Instance.GetMessageFromKey("PET_NOT_EVOLED"), 10)); } break; case 2137: int rnd = ServerManager.RandomNumber(0, 1000); { if (int.TryParse(packetsplit[3], out mateTransportId)) { Mate mate = session.Character.Mates.Find(s => s.MateTransportId == mateTransportId); if (mate == null) { session.SendPacket(session.Character.GenerateSay(Language.Instance.GetMessageFromKey("PICK_PET"), 10)); } else if (mate.Defence <= 9 || mate.Attack <= 9) { if (rnd >= 600 && rnd <= 800) { mate.Attack++; session.SendPacket(session.Character.GenerateSay(Language.Instance.GetMessageFromKey("ATTACK_PLUS"), 10)); session.CurrentMapInstance.Broadcast(StaticPacketHelper.GenerateEff(UserType.Player, session.Character.CharacterId, 3004), session.Character.MapX, session.Character.MapY); } else if (rnd >= 801 && rnd <= 1000) { mate.Defence++; session.SendPacket(session.Character.GenerateSay(Language.Instance.GetMessageFromKey("DEF_PLUS"), 10)); session.CurrentMapInstance.Broadcast(StaticPacketHelper.GenerateEff(UserType.Player, session.Character.CharacterId, 3004), session.Character.MapX, session.Character.MapY); } else if (rnd <= 800 && rnd >= 400) { if (mate.Defence == 0) { return; } else { mate.Defence--; session.SendPacket(session.Character.GenerateSay(Language.Instance.GetMessageFromKey("DEF_MINUS"), 10)); session.CurrentMapInstance.Broadcast(StaticPacketHelper.GenerateEff(UserType.Player, session.Character.CharacterId, 3005), session.Character.MapX, session.Character.MapY); } } else if (rnd <= 399 && rnd >= 0) { if (mate.Attack == 0) { return; } else { mate.Attack--; session.SendPacket(session.Character.GenerateSay(Language.Instance.GetMessageFromKey("ATTACK_MINUS"), 10)); session.CurrentMapInstance.Broadcast(StaticPacketHelper.GenerateEff(UserType.Player, session.Character.CharacterId, 3005), session.Character.MapX, session.Character.MapY); } } else { return; } } else { return; } } else { return; } session.Character.Inventory.RemoveItemAmount(2079, 1); } break; default: Logger.Warn(string.Format(Language.Instance.GetMessageFromKey("NO_HANDLER_ITEM"), GetType(), VNum, Effect, EffectValue)); break; } }
public override void Use(ClientSession session, ref ItemInstance inv, byte Option = 0, string[] packetsplit = null) { if (session.Character.IsVehicled) { session.SendPacket(session.Character.GenerateSay(Language.Instance.GetMessageFromKey("CANT_DO_VEHICLED"), 10)); return; } if (session.CurrentMapInstance.MapInstanceType == MapInstanceType.TalentArenaMapInstance) { return; } if ((DateTime.Now - session.Character.LastPotion).TotalMilliseconds < 750) { return; } session.Character.LastPotion = DateTime.Now; Item item = inv.Item; switch (Effect) { default: if (session.Character.Hp <= 0) { return; } if (item.VNum == 2291 || item.VNum == 10035) { if (!session.Character.IsSitting) { session.Character.Rest(); } session.SendPacket(StaticPacketHelper.GenerateEff(UserType.Player, session.Character.CharacterId, 6000)); session.Character.SpPoint += 1500; if (session.Character.SpPoint > 10000) { session.Character.SpPoint = 10000; } session.Character.Inventory.RemoveItemFromInventory(inv.Id); session.SendPacket(session.Character.GenerateSpPoint()); return; } if (session.Character.FoodAmount < 0) { session.Character.FoodAmount = 0; } int amount = session.Character.FoodAmount; if (amount < 5) { if (item.BCards.Find(s => s.Type == (byte)BCardType.CardType.HPMP && s.SubType == (byte)AdditionalTypes.HPMP.ReceiveAdditionalHP / 10 && s.FirstData > 0) is BCard AdditionalHpBCard) { // MaxAdditionalHpPercent = AdditionalHp.SecondData; double AdditionalHp = 0; if (session.Character.BattleEntity.AdditionalHp + AdditionalHpBCard.FirstData <= session.Character.HPLoad() * 0.2) { AdditionalHp = AdditionalHpBCard.FirstData; } else if (session.Character.BattleEntity.AdditionalHp < session.Character.HPLoad() * 0.2) { AdditionalHp = session.Character.HPLoad() * 0.2 - session.Character.BattleEntity.AdditionalHp; } if (AdditionalHp > 0 && AdditionalHp <= AdditionalHpBCard.FirstData) { session.Character.FoodAmount++; session.SendPacket(StaticPacketHelper.GenerateEff(UserType.Player, session.Character.CharacterId, 6000)); session.Character.BattleEntity.AdditionalHp += AdditionalHp; session.SendPacket(session.Character.GenerateAdditionalHpMp()); session.SendPacket(session.Character.GenerateStat()); session.Character.Inventory.RemoveItemFromInventory(inv.Id); Observable.Timer(TimeSpan.FromMilliseconds(1800)).Subscribe(s => session.Character.FoodAmount--); } return; } if (item.BCards.Find(s => s.Type == (byte)BCardType.CardType.HPMP && s.SubType == (byte)AdditionalTypes.HPMP.ReceiveAdditionalMP / 10 && s.FirstData < 0) is BCard AdditionalMpBCard) { // MaxAdditionalMpPercent = AdditionalMp.SecondData; double AdditionalMp = 0; if (session.Character.BattleEntity.AdditionalMp + (-AdditionalMpBCard.FirstData) <= session.Character.MPLoad() * 0.2) { AdditionalMp = (-AdditionalMpBCard.FirstData); } else if (session.Character.BattleEntity.AdditionalMp < session.Character.MPLoad() * 0.2) { AdditionalMp = session.Character.MPLoad() * 0.2 - session.Character.BattleEntity.AdditionalMp; } if (AdditionalMp > 0 && AdditionalMp <= -AdditionalMpBCard.FirstData) { session.Character.FoodAmount++; session.SendPacket(StaticPacketHelper.GenerateEff(UserType.Player, session.Character.CharacterId, 6000)); session.Character.BattleEntity.AdditionalMp += AdditionalMp; session.SendPacket(session.Character.GenerateAdditionalHpMp()); session.SendPacket(session.Character.GenerateStat()); session.Character.Inventory.RemoveItemFromInventory(inv.Id); Observable.Timer(TimeSpan.FromMilliseconds(1800)).Subscribe(s => session.Character.FoodAmount--); } return; } } if (!session.Character.IsSitting) { session.Character.Rest(); } session.Character.Mates.Where(s => s.IsTeamMember).ToList().ForEach(m => session.CurrentMapInstance?.Broadcast(m.GenerateRest(true))); if (amount < 5) { if (!session.Character.IsSitting) { return; } Thread workerThread = new Thread(() => Regenerate(session, item)); workerThread.Start(); session.Character.Inventory.RemoveItemFromInventory(inv.Id); } else { session.SendPacket(session.Character.Gender == GenderType.Female ? session.Character.GenerateSay(Language.Instance.GetMessageFromKey("NOT_HUNGRY_FEMALE"), 1) : session.Character.GenerateSay(Language.Instance.GetMessageFromKey("NOT_HUNGRY_MALE"), 1)); } if (amount == 0) { if (!session.Character.IsSitting) { return; } Thread workerThread2 = new Thread(() => Sync(session)); workerThread2.Start(); } break; } }
private void ExecuteHandler(ClientSession session) { if (CharacterId == session.Character.CharacterId) { return; } if (IsInvoker) { if (session.Character.Inventory.CountItem(1981) < 1) { return; } if (session.Character.CharacterRelations.Any(s => s.RelationType == CharacterRelationType.Spouse)) { session.SendPacket($"info {Language.Instance.GetMessageFromKey("ALREADY_MARRIED")}"); return; } if (session.Character.IsFriendOfCharacter(CharacterId)) { ClientSession otherSession = ServerManager.Instance.GetSessionByCharacterId(CharacterId); if (otherSession != null) { otherSession.SendPacket(UserInterfaceHelper.GenerateDialog( $"#marry^1^{session.Character.CharacterId} #marry^0^{session.Character.CharacterId} " + string.Format(Language.Instance.GetMessageFromKey("MARRY_REQUEST"), session.Character.Name))); session.Character.MarriageRequestCharacters.Add(CharacterId); session.Character.Inventory.RemoveItemAmount(1981); } } else { session.SendPacket($"info {Language.Instance.GetMessageFromKey("NOT_FRIEND")}"); } } else { if (session.Character.CharacterRelations.Any(s => s.RelationType == CharacterRelationType.Spouse)) { session.SendPacket($"info {Language.Instance.GetMessageFromKey("ALREADY_MARRIED")}"); return; } if (ServerManager.Instance.GetSessionByCharacterId(CharacterId) is ClientSession targetsSession && targetsSession.Character.MarriageRequestCharacters.Any(s => s == session.Character.CharacterId)) { if (Accept) { session.Character.DeleteRelation(CharacterId); session.Character.AddRelation(CharacterId, CharacterRelationType.Spouse); ServerManager.Instance.Broadcast(UserInterfaceHelper.GenerateMsg( string.Format(Language.Instance.GetMessageFromKey("MARRIAGE_ACCEPT"), session.Character.Name, targetsSession.Character.Name), 0)); session.CurrentMapInstance.Broadcast( StaticPacketHelper.GenerateEff(UserType.Player, CharacterId, 850)); session.CurrentMapInstance.Broadcast( StaticPacketHelper.GenerateEff(UserType.Player, session.Character.CharacterId, 850)); } else { ServerManager.Instance.Broadcast(UserInterfaceHelper.GenerateMsg( string.Format(Language.Instance.GetMessageFromKey("MARRIAGE_REJECT"), session.Character.Name, targetsSession.Character.Name), 0)); } targetsSession.Character.MarriageRequestCharacters.Remove(session.Character.CharacterId); } } }
private void NpcLife() { double time = (DateTime.Now - LastEffect).TotalMilliseconds; if (time > EffectDelay) { if (IsMate || IsProtected) { MapInstance.Broadcast(StaticPacketHelper.GenerateEff(UserType.Npc, MapNpcId, 825), MapX, MapY); } if (Effect > 0 && EffectActivated) { MapInstance.Broadcast(StaticPacketHelper.GenerateEff(UserType.Npc, MapNpcId, Effect), MapX, MapY); } LastEffect = DateTime.Now; } time = (DateTime.Now - LastMove).TotalMilliseconds; if (IsMoving && Npc.Speed > 0 && time > _movetime) { _movetime = ServerManager.RandomNumber(500, 3000); byte point = (byte)ServerManager.RandomNumber(2, 4); byte fpoint = (byte)ServerManager.RandomNumber(0, 2); byte xpoint = (byte)ServerManager.RandomNumber(fpoint, point); byte ypoint = (byte)(point - xpoint); short mapX = FirstX; short mapY = FirstY; if (MapInstance.Map.GetFreePosition(ref mapX, ref mapY, xpoint, ypoint)) { double value = (xpoint + ypoint) / (double)(2 * Npc.Speed); Observable.Timer(TimeSpan.FromMilliseconds(1000 * value)).Subscribe(x => { MapX = mapX; MapY = mapY; }); LastMove = DateTime.Now.AddSeconds(value); MapInstance.Broadcast(new BroadcastPacket(null, PacketFactory.Serialize(StaticPacketHelper.Move(UserType.Npc, MapNpcId, MapX, MapY, Npc.Speed)), ReceiverType.All, xCoordinate: mapX, yCoordinate: mapY)); } } if (Target == -1) { if (IsHostile && Shop == null) { MapMonster monster = MapInstance.Monsters.FirstOrDefault(s => s.Owner == null && MapInstance == s.MapInstance && Map.GetDistance(new MapCell { X = MapX, Y = MapY }, new MapCell { X = s.MapX, Y = s.MapY }) < (Npc.NoticeRange > 5 ? Npc.NoticeRange / 2 : Npc.NoticeRange)); ClientSession session = MapInstance.Sessions.FirstOrDefault(s => MapInstance == s.Character.MapInstance && Map.GetDistance(new MapCell { X = MapX, Y = MapY }, new MapCell { X = s.Character.PositionX, Y = s.Character.PositionY }) < Npc.NoticeRange); if (monster != null && session != null) { Target = monster.MapMonsterId; } } } else if (Target != -1) { MapMonster monster = MapInstance.Monsters.Find(s => s.MapMonsterId == Target); if (monster == null || monster.CurrentHp < 1) { Target = -1; return; } NpcMonsterSkill npcMonsterSkill = null; if (ServerManager.RandomNumber(0, 10) > 8) { npcMonsterSkill = Npc.Skills.Where(s => (DateTime.Now - s.LastSkillUse).TotalMilliseconds >= 100 * s.Skill.Cooldown).OrderBy(rnd => _random.Next()).FirstOrDefault(); } int hitmode = 0; bool onyxWings = false; int damage = DamageHelper.Instance.CalculateDamage(new BattleEntity(this), new BattleEntity(monster), npcMonsterSkill?.Skill, ref hitmode, ref onyxWings); if (monster.Monster.BCards.Find(s => s.Type == (byte)CardType.LightAndShadow && s.SubType == (byte)AdditionalTypes.LightAndShadow.InflictDamageToMP) is BCard card) { int reduce = damage / 100 * card.FirstData; if (monster.CurrentMp < reduce) { monster.CurrentMp = 0; } else { monster.CurrentMp -= reduce; } } int distance = Map.GetDistance(new MapCell { X = MapX, Y = MapY }, new MapCell { X = monster.MapX, Y = monster.MapY }); if (monster.CurrentHp > 0 && ((npcMonsterSkill != null && distance < npcMonsterSkill.Skill.Range) || distance <= Npc.BasicRange)) { if (((DateTime.Now - LastEffect).TotalMilliseconds >= 1000 + (Npc.BasicCooldown * 200) && Npc.Skills.Count == 0) || npcMonsterSkill != null) { if (npcMonsterSkill != null) { npcMonsterSkill.LastSkillUse = DateTime.Now; MapInstance.Broadcast(StaticPacketHelper.CastOnTarget(UserType.Npc, MapNpcId, 3, Target, npcMonsterSkill.Skill.CastAnimation, npcMonsterSkill.Skill.CastEffect, npcMonsterSkill.Skill.SkillVNum)); } if (npcMonsterSkill != null && npcMonsterSkill.Skill.CastEffect != 0) { MapInstance.Broadcast(StaticPacketHelper.GenerateEff(UserType.Npc, MapNpcId, Effect)); } monster.CurrentHp -= damage; MapInstance.Broadcast(npcMonsterSkill != null ? StaticPacketHelper.SkillUsed(UserType.Npc, MapNpcId, 3, Target, npcMonsterSkill.SkillVNum, npcMonsterSkill.Skill.Cooldown, npcMonsterSkill.Skill.AttackAnimation, npcMonsterSkill.Skill.Effect, 0, 0, monster.CurrentHp > 0, (int)((float)monster.CurrentHp / (float)monster.Monster.MaxHP * 100), damage, hitmode, 0) : StaticPacketHelper.SkillUsed(UserType.Npc, MapNpcId, 3, Target, 0, Npc.BasicCooldown, 11, Npc.BasicSkill, 0, 0, monster.CurrentHp > 0, (int)((float)monster.CurrentHp / (float)monster.Monster.MaxHP * 100), damage, hitmode, 0)); LastEffect = DateTime.Now; if (monster.CurrentHp < 1) { RemoveTarget(); monster.IsAlive = false; monster.LastMove = DateTime.Now; monster.CurrentHp = 0; monster.CurrentMp = 0; monster.Death = DateTime.Now; Target = -1; } } } else { int maxdistance = Npc.NoticeRange > 5 ? Npc.NoticeRange / 2 : Npc.NoticeRange; if (IsMoving) { const short maxDistance = 5; int maxindex = Path.Count > Npc.Speed / 2 && Npc.Speed > 1 ? Npc.Speed / 2 : Path.Count; if (maxindex < 1) { maxindex = 1; } if ((Path.Count == 0 && distance >= 1 && distance < maxDistance) || (Path.Count >= maxindex && maxindex > 0 && Path[maxindex - 1] == null)) { short xoffset = (short)ServerManager.RandomNumber(-1, 1); short yoffset = (short)ServerManager.RandomNumber(-1, 1); //go to monster Path = BestFirstSearch.FindPathJagged(new GridPos { X = MapX, Y = MapY }, new GridPos { X = (short)(monster.MapX + xoffset), Y = (short)(monster.MapY + yoffset) }, MapInstance.Map.JaggedGrid); maxindex = Path.Count > Npc.Speed / 2 && Npc.Speed > 1 ? Npc.Speed / 2 : Path.Count; } if (DateTime.Now > LastMove && Npc.Speed > 0 && Path.Count > 0) { short mapX = Path[maxindex - 1].X; short mapY = Path[maxindex - 1].Y; double waitingtime = Map.GetDistance(new MapCell { X = mapX, Y = mapY }, new MapCell { X = MapX, Y = MapY }) / (double)Npc.Speed; MapInstance.Broadcast(new BroadcastPacket(null, PacketFactory.Serialize(StaticPacketHelper.Move(UserType.Npc, MapNpcId, MapX, MapY, Npc.Speed)), ReceiverType.All, xCoordinate: mapX, yCoordinate: mapY)); LastMove = DateTime.Now.AddSeconds(waitingtime > 1 ? 1 : waitingtime); Observable.Timer(TimeSpan.FromMilliseconds((int)((waitingtime > 1 ? 1 : waitingtime) * 1000))).Subscribe(x => { MapX = mapX; MapY = mapY; }); Path.RemoveRange(0, maxindex); } if (Target != -1 && (MapId != monster.MapId || distance > maxDistance)) { RemoveTarget(); } } } } }
/// <summary> /// Calculates the damage attacker inflicts defender /// </summary> /// <param name="attacker">The attacking Entity</param> /// <param name="defender">The defending Entity</param> /// <param name="skill">The used Skill</param> /// <param name="hitMode">reference to HitMode</param> /// <param name="onyxWings"></param> /// <returns>Damage</returns> public int CalculateDamage(BattleEntity attacker, BattleEntity defender, Skill skill, ref int hitMode, ref bool onyxWings) { int[] GetAttackerBenefitingBuffs(CardType type, byte subtype) { int value1 = 0; int value2 = 0; int value3 = 0; int[] tmp; int temp = 0; tmp = getBuff(attacker.Level, attacker.Buffs, attacker.BCards, type, subtype, BuffType.Good, ref temp); value1 += tmp[0]; value2 += tmp[1]; value3 += tmp[2]; tmp = getBuff(attacker.Level, attacker.Buffs, attacker.BCards, type, subtype, BuffType.Neutral, ref temp); value1 += tmp[0]; value2 += tmp[1]; value3 += tmp[2]; tmp = getBuff(defender.Level, defender.Buffs, defender.BCards, type, subtype, BuffType.Bad, ref temp); value1 += tmp[0]; value2 += tmp[1]; value3 += tmp[2]; return(new int[] { value1, value2, value3, temp }); } int[] GetDefenderBenefitingBuffs(CardType type, byte subtype) { int value1 = 0; int value2 = 0; int value3 = 0; int[] tmp; int temp = 0; tmp = getBuff(defender.Level, defender.Buffs, defender.BCards, type, subtype, BuffType.Good, ref temp); value1 += tmp[0]; value2 += tmp[1]; value3 += tmp[2]; tmp = getBuff(defender.Level, defender.Buffs, defender.BCards, type, subtype, BuffType.Neutral, ref temp); value1 += tmp[0]; value2 += tmp[1]; value3 += tmp[2]; tmp = getBuff(attacker.Level, attacker.Buffs, attacker.BCards, type, subtype, BuffType.Bad, ref temp); value1 += tmp[0]; value2 += tmp[1]; value3 += tmp[2]; return(new int[] { value1, value2, value3, temp }); } int GetShellWeaponEffectValue(ShellWeaponEffectType effectType) { return(attacker.ShellWeaponEffects?.Where(s => s.Effect == (byte)effectType)?.FirstOrDefault()?.Value ?? 0); } int GetShellArmorEffectValue(ShellArmorEffectType effectType) { return(defender.ShellArmorEffects?.Where(s => s.Effect == (byte)effectType)?.FirstOrDefault()?.Value ?? 0); } if (skill != null) { attacker.BCards.AddRange(skill.BCards); } #region Basic Buff Initialisation attacker.Morale += GetAttackerBenefitingBuffs(CardType.Morale, (byte)AdditionalTypes.Morale.MoraleIncreased)[0]; attacker.Morale += GetDefenderBenefitingBuffs(CardType.Morale, (byte)AdditionalTypes.Morale.MoraleDecreased)[0]; defender.Morale += GetDefenderBenefitingBuffs(CardType.Morale, (byte)AdditionalTypes.Morale.MoraleIncreased)[0]; defender.Morale += GetAttackerBenefitingBuffs(CardType.Morale, (byte)AdditionalTypes.Morale.MoraleDecreased)[0]; attacker.AttackUpgrade += (short)GetAttackerBenefitingBuffs(CardType.AttackPower, (byte)AdditionalTypes.AttackPower.AttackLevelIncreased)[0]; attacker.AttackUpgrade += (short)GetDefenderBenefitingBuffs(CardType.AttackPower, (byte)AdditionalTypes.AttackPower.AttackLevelDecreased)[0]; defender.DefenseUpgrade += (short)GetDefenderBenefitingBuffs(CardType.Defence, (byte)AdditionalTypes.Defence.DefenceLevelIncreased)[0]; defender.DefenseUpgrade += (short)GetAttackerBenefitingBuffs(CardType.Defence, (byte)AdditionalTypes.Defence.DefenceLevelDecreased)[0]; int[] attackerpercentdamage = GetDefenderBenefitingBuffs(CardType.RecoveryAndDamagePercent, 11); int[] defenderpercentdefense = GetDefenderBenefitingBuffs(CardType.RecoveryAndDamagePercent, 2); if (attackerpercentdamage[3] != 0) { return(defender.HPMax / 100 * attackerpercentdamage[2]); } if (defenderpercentdefense[3] != 0) { return(defender.HPMax / 100 * Math.Abs(defenderpercentdefense[2])); } /* * * Percentage Boost categories: * 1.: Adds to Total Damage * 2.: Adds to Normal Damage * 3.: Adds to Base Damage * 4.: Adds to Defense * 5.: Adds to Element * * Buff Effects get added, whereas * Shell Effects get multiplied afterwards. * * Simplified Example on Defense (Same for Attack): * - 1k Defense * - Costume(+5% Defense) * - Defense Potion(+20% Defense) * - S-Defense Shell with 20% Boost * * Calculation: * 1000 * 1.25 * 1.2 = 1500 * Def Buff Shell Total * * Keep in Mind that after each step, one has * to round the current value down if necessary * * Static Boost categories: * 1.: Adds to Total Damage * 2.: Adds to Normal Damage * 3.: Adds to Base Damage * 4.: Adds to Defense * 5.: Adds to Element * */ #region Definitions double boostCategory1 = 1; double boostCategory2 = 1; double boostCategory3 = 1; double boostCategory4 = 1; double boostCategory5 = 1; double shellBoostCategory1 = 1; double shellBoostCategory2 = 1; double shellBoostCategory3 = 1; double shellBoostCategory4 = 1; double shellBoostCategory5 = 1; int staticBoostCategory1 = 0; int staticBoostCategory2 = 0; int staticBoostCategory3 = 0; int staticBoostCategory4 = 0; int staticBoostCategory5 = 0; #endregion #region Type 1 #region Static // None for now #endregion #region Boost boostCategory1 += GetAttackerBenefitingBuffs(CardType.Damage, (byte)AdditionalTypes.Damage.DamageIncreased)[0] / 100D; boostCategory1 += GetAttackerBenefitingBuffs(CardType.Item, (byte)AdditionalTypes.Item.AttackIncreased)[0] / 100D; boostCategory1 += GetDefenderBenefitingBuffs(CardType.Item, (byte)AdditionalTypes.Item.DefenceIncreased)[0] / 100D; shellBoostCategory1 += GetShellWeaponEffectValue(ShellWeaponEffectType.PercentageTotalDamage) / 100D; if ((attacker.EntityType == EntityType.Player || attacker.EntityType == EntityType.Mate) && (defender.EntityType == EntityType.Player || defender.EntityType == EntityType.Mate)) { boostCategory1 += GetAttackerBenefitingBuffs(CardType.SpecialisationBuffResistance, (byte)AdditionalTypes.SpecialisationBuffResistance.IncreaseDamageInPVP)[0] / 100D; boostCategory1 += GetAttackerBenefitingBuffs(CardType.LeonaPassiveSkill, (byte)AdditionalTypes.LeonaPassiveSkill.AttackIncreasedInPVP)[0] / 100D; shellBoostCategory1 += GetShellWeaponEffectValue(ShellWeaponEffectType.PercentageDamageInPVP) / 100D; } #endregion #endregion #region Type 2 #region Static // None for now #endregion #region Boost boostCategory2 += GetDefenderBenefitingBuffs(CardType.Damage, (byte)AdditionalTypes.Damage.DamageDecreased)[0] / 100D; if ((attacker.EntityType == EntityType.Player || attacker.EntityType == EntityType.Mate) && (defender.EntityType == EntityType.Player || defender.EntityType == EntityType.Mate)) { boostCategory2 += GetDefenderBenefitingBuffs(CardType.SpecialisationBuffResistance, (byte)AdditionalTypes.SpecialisationBuffResistance.DecreaseDamageInPVP)[0] / 100D; boostCategory2 += GetDefenderBenefitingBuffs(CardType.LeonaPassiveSkill, (byte)AdditionalTypes.LeonaPassiveSkill.AttackDecreasedInPVP)[0] / 100D; } #endregion #endregion #region Type 3 #region Static staticBoostCategory3 += GetAttackerBenefitingBuffs(CardType.AttackPower, (byte)AdditionalTypes.AttackPower.AllAttacksIncreased)[0]; staticBoostCategory3 += GetDefenderBenefitingBuffs(CardType.AttackPower, (byte)AdditionalTypes.AttackPower.AllAttacksDecreased)[0]; staticBoostCategory3 += GetShellWeaponEffectValue(ShellWeaponEffectType.DamageImproved); #endregion #region Soft-Damage int[] soft = GetAttackerBenefitingBuffs(CardType.IncreaseDamage, (byte)AdditionalTypes.IncreaseDamage.IncreasingPropability); int[] skin = GetAttackerBenefitingBuffs(CardType.EffectSummon, (byte)AdditionalTypes.EffectSummon.DamageBoostOnHigherLvl); if (attacker.Level < defender.Level) { soft[0] += skin[0]; soft[1] += skin[1]; } if (ServerManager.Instance.RandomNumber() < soft[0]) { boostCategory3 += soft[1] / 100D; if (attacker.EntityType.Equals(EntityType.Player) && attacker.Session != null) { attacker.Session.CurrentMapInstance?.Broadcast(StaticPacketHelper.GenerateEff(UserType.Player, attacker.Session.Character.CharacterId, 15)); } } #endregion #endregion #region Type 4 #region Static staticBoostCategory4 += GetDefenderBenefitingBuffs(CardType.Defence, (byte)AdditionalTypes.Defence.AllIncreased)[0]; staticBoostCategory4 += GetAttackerBenefitingBuffs(CardType.Defence, (byte)AdditionalTypes.Defence.AllDecreased)[0]; #endregion #region Boost boostCategory4 += GetDefenderBenefitingBuffs(CardType.DodgeAndDefencePercent, (byte)AdditionalTypes.DodgeAndDefencePercent.DefenceIncreased)[0] / 100D; boostCategory4 += GetAttackerBenefitingBuffs(CardType.DodgeAndDefencePercent, (byte)AdditionalTypes.DodgeAndDefencePercent.DefenceReduced)[0] / 100D; shellBoostCategory4 += GetShellArmorEffectValue(ShellArmorEffectType.PercentageTotalDefence) / 100D; if ((attacker.EntityType == EntityType.Player || attacker.EntityType == EntityType.Mate) && (defender.EntityType == EntityType.Player || defender.EntityType == EntityType.Mate)) { boostCategory4 += GetDefenderBenefitingBuffs(CardType.LeonaPassiveSkill, (byte)AdditionalTypes.LeonaPassiveSkill.DefenceIncreasedInPVP)[0] / 100D; boostCategory4 += GetAttackerBenefitingBuffs(CardType.LeonaPassiveSkill, (byte)AdditionalTypes.LeonaPassiveSkill.DefenceDecreasedInPVP)[0] / 100D; shellBoostCategory4 -= GetShellWeaponEffectValue(ShellWeaponEffectType.ReducesPercentageEnemyDefenceInPVP) / 100D; shellBoostCategory4 += GetShellArmorEffectValue(ShellArmorEffectType.PercentageAllPVPDefence) / 100D; } int[] def = GetAttackerBenefitingBuffs(CardType.Block, (byte)AdditionalTypes.Block.ChanceAllIncreased); if (ServerManager.Instance.RandomNumber() < def[0]) { boostCategory3 += def[1] / 100D; } #endregion #endregion #region Type 5 #region Static staticBoostCategory5 += GetAttackerBenefitingBuffs(CardType.Element, (byte)AdditionalTypes.Element.AllIncreased)[0]; staticBoostCategory5 += GetDefenderBenefitingBuffs(CardType.Element, (byte)AdditionalTypes.Element.AllDecreased)[0]; staticBoostCategory5 += GetShellWeaponEffectValue(ShellWeaponEffectType.IncreasedElementalProperties); #endregion #region Boost // Nothing for now #endregion #endregion #region All Type Class Dependant int[] def2 = null; switch (attacker.AttackType) { case AttackType.Melee: def2 = GetAttackerBenefitingBuffs(CardType.Block, (byte)AdditionalTypes.Block.ChanceMeleeIncreased); boostCategory1 += GetAttackerBenefitingBuffs(CardType.Damage, (byte)AdditionalTypes.Damage.MeleeIncreased)[0] / 100D; boostCategory1 += GetDefenderBenefitingBuffs(CardType.Damage, (byte)AdditionalTypes.Damage.MeleeDecreased)[0] / 100D; staticBoostCategory3 += GetAttackerBenefitingBuffs(CardType.AttackPower, (byte)AdditionalTypes.AttackPower.MeleeAttacksIncreased)[0]; staticBoostCategory3 += GetDefenderBenefitingBuffs(CardType.AttackPower, (byte)AdditionalTypes.AttackPower.MeleeAttacksDecreased)[0]; staticBoostCategory4 += GetShellArmorEffectValue(ShellArmorEffectType.CloseDefence); break; case AttackType.Range: def2 = GetAttackerBenefitingBuffs(CardType.Block, (byte)AdditionalTypes.Block.ChanceRangedIncreased); boostCategory1 += GetAttackerBenefitingBuffs(CardType.Damage, (byte)AdditionalTypes.Damage.RangedIncreased)[0] / 100D; boostCategory1 += GetDefenderBenefitingBuffs(CardType.Damage, (byte)AdditionalTypes.Damage.RangedDecreased)[0] / 100D; staticBoostCategory3 += GetAttackerBenefitingBuffs(CardType.AttackPower, (byte)AdditionalTypes.AttackPower.MeleeAttacksIncreased)[0]; staticBoostCategory3 += GetDefenderBenefitingBuffs(CardType.AttackPower, (byte)AdditionalTypes.AttackPower.MeleeAttacksDecreased)[0]; staticBoostCategory4 += GetShellArmorEffectValue(ShellArmorEffectType.DistanceDefence); break; case AttackType.Magical: def2 = GetAttackerBenefitingBuffs(CardType.Block, (byte)AdditionalTypes.Block.ChanceRangedIncreased); boostCategory1 += GetAttackerBenefitingBuffs(CardType.Damage, (byte)AdditionalTypes.Damage.MagicalIncreased)[0] / 100D; boostCategory1 += GetDefenderBenefitingBuffs(CardType.Damage, (byte)AdditionalTypes.Damage.MagicalDecreased)[0] / 100D; staticBoostCategory3 += GetAttackerBenefitingBuffs(CardType.AttackPower, (byte)AdditionalTypes.AttackPower.MeleeAttacksIncreased)[0]; staticBoostCategory3 += GetDefenderBenefitingBuffs(CardType.AttackPower, (byte)AdditionalTypes.AttackPower.MeleeAttacksDecreased)[0]; staticBoostCategory4 += GetShellArmorEffectValue(ShellArmorEffectType.MagicDefence); break; } def[0] += def2[0]; def[1] += def2[1]; #endregion #region Softdef finishing if (ServerManager.Instance.RandomNumber() < def[0]) { boostCategory3 += def[1] / 100D; } #endregion #region Element Dependant switch (attacker.Element) { case 1: defender.FireResistance += GetDefenderBenefitingBuffs(CardType.ElementResistance, (byte)AdditionalTypes.ElementResistance.AllIncreased)[0]; defender.FireResistance += GetAttackerBenefitingBuffs(CardType.ElementResistance, (byte)AdditionalTypes.ElementResistance.AllDecreased)[0]; defender.FireResistance += GetDefenderBenefitingBuffs(CardType.ElementResistance, (byte)AdditionalTypes.ElementResistance.FireIncreased)[0]; defender.FireResistance += GetAttackerBenefitingBuffs(CardType.ElementResistance, (byte)AdditionalTypes.ElementResistance.FireDecreased)[0]; defender.FireResistance += GetDefenderBenefitingBuffs(CardType.EnemyElementResistance, (byte)AdditionalTypes.EnemyElementResistance.AllIncreased)[0]; defender.FireResistance += GetAttackerBenefitingBuffs(CardType.EnemyElementResistance, (byte)AdditionalTypes.EnemyElementResistance.AllDecreased)[0]; defender.FireResistance += GetDefenderBenefitingBuffs(CardType.EnemyElementResistance, (byte)AdditionalTypes.EnemyElementResistance.FireIncreased)[0]; defender.FireResistance += GetAttackerBenefitingBuffs(CardType.EnemyElementResistance, (byte)AdditionalTypes.EnemyElementResistance.FireDecreased)[0]; if ((attacker.EntityType == EntityType.Player || attacker.EntityType == EntityType.Mate) && (defender.EntityType == EntityType.Player || defender.EntityType == EntityType.Mate)) { defender.FireResistance -= GetShellWeaponEffectValue(ShellWeaponEffectType.ReducesEnemyFireResistanceInPVP); defender.FireResistance -= GetShellWeaponEffectValue(ShellWeaponEffectType.ReducesEnemyAllResistancesInPVP); } defender.FireResistance += GetShellArmorEffectValue(ShellArmorEffectType.IncreasedFireResistence); defender.FireResistance += GetShellArmorEffectValue(ShellArmorEffectType.IncreasedAllResistence); staticBoostCategory5 += GetShellWeaponEffectValue(ShellWeaponEffectType.IncreasedFireProperties); boostCategory5 += GetAttackerBenefitingBuffs(CardType.IncreaseDamage, (byte)AdditionalTypes.IncreaseDamage.FireIncreased)[0] / 100D; staticBoostCategory5 += GetAttackerBenefitingBuffs(CardType.Element, (byte)AdditionalTypes.Element.FireIncreased)[0]; staticBoostCategory5 += GetDefenderBenefitingBuffs(CardType.Element, (byte)AdditionalTypes.Element.FireDecreased)[0]; break; case 2: defender.WaterResistance += GetDefenderBenefitingBuffs(CardType.ElementResistance, (byte)AdditionalTypes.ElementResistance.AllIncreased)[0]; defender.WaterResistance += GetAttackerBenefitingBuffs(CardType.ElementResistance, (byte)AdditionalTypes.ElementResistance.AllDecreased)[0]; defender.WaterResistance += GetDefenderBenefitingBuffs(CardType.ElementResistance, (byte)AdditionalTypes.ElementResistance.WaterIncreased)[0]; defender.WaterResistance += GetAttackerBenefitingBuffs(CardType.ElementResistance, (byte)AdditionalTypes.ElementResistance.WaterDecreased)[0]; defender.WaterResistance += GetDefenderBenefitingBuffs(CardType.EnemyElementResistance, (byte)AdditionalTypes.EnemyElementResistance.AllIncreased)[0]; defender.WaterResistance += GetAttackerBenefitingBuffs(CardType.EnemyElementResistance, (byte)AdditionalTypes.EnemyElementResistance.AllDecreased)[0]; defender.WaterResistance += GetDefenderBenefitingBuffs(CardType.EnemyElementResistance, (byte)AdditionalTypes.EnemyElementResistance.WaterIncreased)[0]; defender.WaterResistance += GetAttackerBenefitingBuffs(CardType.EnemyElementResistance, (byte)AdditionalTypes.EnemyElementResistance.WaterDecreased)[0]; if ((attacker.EntityType == EntityType.Player || attacker.EntityType == EntityType.Mate) && (defender.EntityType == EntityType.Player || defender.EntityType == EntityType.Mate)) { defender.FireResistance -= GetShellWeaponEffectValue(ShellWeaponEffectType.ReducesEnemyWaterResistanceInPVP); defender.FireResistance -= GetShellWeaponEffectValue(ShellWeaponEffectType.ReducesEnemyAllResistancesInPVP); } defender.FireResistance += GetShellArmorEffectValue(ShellArmorEffectType.IncreasedWaterResistence); defender.FireResistance += GetShellArmorEffectValue(ShellArmorEffectType.IncreasedAllResistence); staticBoostCategory5 += GetShellWeaponEffectValue(ShellWeaponEffectType.IncreasedWaterProperties); boostCategory5 += GetAttackerBenefitingBuffs(CardType.IncreaseDamage, (byte)AdditionalTypes.IncreaseDamage.WaterIncreased)[0] / 100D; staticBoostCategory5 += GetAttackerBenefitingBuffs(CardType.Element, (byte)AdditionalTypes.Element.WaterIncreased)[0]; staticBoostCategory5 += GetDefenderBenefitingBuffs(CardType.Element, (byte)AdditionalTypes.Element.WaterDecreased)[0]; break; case 3: defender.LightResistance += GetDefenderBenefitingBuffs(CardType.ElementResistance, (byte)AdditionalTypes.ElementResistance.AllIncreased)[0]; defender.LightResistance += GetAttackerBenefitingBuffs(CardType.ElementResistance, (byte)AdditionalTypes.ElementResistance.AllDecreased)[0]; defender.LightResistance += GetDefenderBenefitingBuffs(CardType.ElementResistance, (byte)AdditionalTypes.ElementResistance.LightIncreased)[0]; defender.LightResistance += GetAttackerBenefitingBuffs(CardType.ElementResistance, (byte)AdditionalTypes.ElementResistance.LightDecreased)[0]; defender.LightResistance += GetDefenderBenefitingBuffs(CardType.EnemyElementResistance, (byte)AdditionalTypes.EnemyElementResistance.AllIncreased)[0]; defender.LightResistance += GetAttackerBenefitingBuffs(CardType.EnemyElementResistance, (byte)AdditionalTypes.EnemyElementResistance.AllDecreased)[0]; defender.LightResistance += GetDefenderBenefitingBuffs(CardType.EnemyElementResistance, (byte)AdditionalTypes.EnemyElementResistance.LightIncreased)[0]; defender.LightResistance += GetAttackerBenefitingBuffs(CardType.EnemyElementResistance, (byte)AdditionalTypes.EnemyElementResistance.LightDecreased)[0]; if ((attacker.EntityType == EntityType.Player || attacker.EntityType == EntityType.Mate) && (defender.EntityType == EntityType.Player || defender.EntityType == EntityType.Mate)) { defender.FireResistance -= GetShellWeaponEffectValue(ShellWeaponEffectType.ReducesEnemyLightResistanceInPVP); defender.FireResistance -= GetShellWeaponEffectValue(ShellWeaponEffectType.ReducesEnemyAllResistancesInPVP); } defender.FireResistance += GetShellArmorEffectValue(ShellArmorEffectType.IncreasedLightResistence); defender.FireResistance += GetShellArmorEffectValue(ShellArmorEffectType.IncreasedAllResistence); staticBoostCategory5 += GetShellWeaponEffectValue(ShellWeaponEffectType.IncreasedLightProperties); boostCategory5 += GetAttackerBenefitingBuffs(CardType.IncreaseDamage, (byte)AdditionalTypes.IncreaseDamage.LightIncreased)[0] / 100D; staticBoostCategory5 += GetAttackerBenefitingBuffs(CardType.Element, (byte)AdditionalTypes.Element.LightIncreased)[0]; staticBoostCategory5 += GetDefenderBenefitingBuffs(CardType.Element, (byte)AdditionalTypes.Element.Light5Decreased)[0]; break; case 4: defender.ShadowResistance += GetDefenderBenefitingBuffs(CardType.ElementResistance, (byte)AdditionalTypes.ElementResistance.AllIncreased)[0]; defender.ShadowResistance += GetAttackerBenefitingBuffs(CardType.ElementResistance, (byte)AdditionalTypes.ElementResistance.AllDecreased)[0]; defender.ShadowResistance += GetDefenderBenefitingBuffs(CardType.ElementResistance, (byte)AdditionalTypes.ElementResistance.DarkIncreased)[0]; defender.ShadowResistance += GetAttackerBenefitingBuffs(CardType.ElementResistance, (byte)AdditionalTypes.ElementResistance.DarkDecreased)[0]; defender.ShadowResistance += GetDefenderBenefitingBuffs(CardType.EnemyElementResistance, (byte)AdditionalTypes.EnemyElementResistance.AllIncreased)[0]; defender.ShadowResistance += GetAttackerBenefitingBuffs(CardType.EnemyElementResistance, (byte)AdditionalTypes.EnemyElementResistance.AllDecreased)[0]; defender.ShadowResistance += GetDefenderBenefitingBuffs(CardType.EnemyElementResistance, (byte)AdditionalTypes.EnemyElementResistance.DarkIncreased)[0]; defender.ShadowResistance += GetAttackerBenefitingBuffs(CardType.EnemyElementResistance, (byte)AdditionalTypes.EnemyElementResistance.DarkDecreased)[0]; if ((attacker.EntityType == EntityType.Player || attacker.EntityType == EntityType.Mate) && (defender.EntityType == EntityType.Player || defender.EntityType == EntityType.Mate)) { defender.FireResistance -= GetShellWeaponEffectValue(ShellWeaponEffectType.ReducesEnemyDarkResistanceInPVP); defender.FireResistance -= GetShellWeaponEffectValue(ShellWeaponEffectType.ReducesEnemyAllResistancesInPVP); } defender.FireResistance += GetShellArmorEffectValue(ShellArmorEffectType.IncreasedDarkResistence); defender.FireResistance += GetShellArmorEffectValue(ShellArmorEffectType.IncreasedAllResistence); staticBoostCategory5 += GetShellWeaponEffectValue(ShellWeaponEffectType.IncreasedDarkProperties); boostCategory5 += GetAttackerBenefitingBuffs(CardType.IncreaseDamage, (byte)AdditionalTypes.IncreaseDamage.DarkIncreased)[0] / 100D; staticBoostCategory5 += GetAttackerBenefitingBuffs(CardType.Element, (byte)AdditionalTypes.Element.DarkIncreased)[0]; staticBoostCategory5 += GetDefenderBenefitingBuffs(CardType.Element, (byte)AdditionalTypes.Element.DarkDecreased)[0]; break; } #endregion #endregion #region Attack Type Related Variables switch (attacker.AttackType) { case AttackType.Melee: defender.Defense = defender.MeleeDefense; defender.ArmorDefense = defender.ArmorMeleeDefense; defender.Dodge = defender.MeleeDefenseDodge; break; case AttackType.Range: defender.Defense = defender.RangeDefense; defender.ArmorDefense = defender.ArmorRangeDefense; defender.Dodge = defender.RangeDefenseDodge; break; case AttackType.Magical: defender.Defense = defender.MagicalDefense; defender.ArmorDefense = defender.ArmorMagicalDefense; break; } #endregion #region Too Near Range Attack Penalty (boostCategory2) if (attacker.AttackType == AttackType.Range && Map.GetDistance(new MapCell { X = attacker.PositionX, Y = attacker.PositionY }, new MapCell { X = defender.PositionX, Y = defender.PositionY }) < 4) { boostCategory2 -= 0.3; } #endregion #region Morale and Dodge attacker.Morale -= defender.Morale; double chance = 0; if (attacker.AttackType != AttackType.Magical) { int hitrate = attacker.Hitrate + attacker.Morale; double multiplier = defender.Dodge / (hitrate > 1 ? hitrate : 1); if (multiplier > 5) { multiplier = 5; } chance = (-0.25 * Math.Pow(multiplier, 3)) - (0.57 * Math.Pow(multiplier, 2)) + (25.3 * multiplier) - 1.41; if (chance <= 1) { chance = 1; } //if (GetBuff(CardType.Buff, (byte)AdditionalTypes.DodgeAndDefencePercent.)[0] != 0) TODO: Eagle Eyes AND Other Fixed Hitrates //{ // chance = 10; //} } int bonus = 0; if ((attacker.EntityType == EntityType.Player || attacker.EntityType == EntityType.Mate) && (defender.EntityType == EntityType.Player || defender.EntityType == EntityType.Mate)) { switch (attacker.AttackType) { case AttackType.Melee: bonus += GetShellArmorEffectValue(ShellArmorEffectType.CloseDefenceDodgeInPVP); break; case AttackType.Range: bonus += GetShellArmorEffectValue(ShellArmorEffectType.DistanceDefenceDodgeInPVP); break; case AttackType.Magical: bonus += GetShellArmorEffectValue(ShellArmorEffectType.IgnoreMagicDamage); break; } bonus += GetShellArmorEffectValue(ShellArmorEffectType.DodgeAllAttacksInPVP); } if (!defender.Invincible && ServerManager.Instance.RandomNumber() - bonus < chance) { hitMode = 1; return(0); } #endregion #region Base Damage int baseDamage = ServerManager.Instance.RandomNumber(attacker.DamageMinimum, attacker.DamageMaximum + 1); int weaponDamage = ServerManager.Instance.RandomNumber(attacker.WeaponDamageMinimum, attacker.WeaponDamageMaximum + 1); #region Attack Level Calculation int[] atklvlfix = GetDefenderBenefitingBuffs(CardType.CalculatingLevel, (byte)AdditionalTypes.CalculatingLevel.CalculatedAttackLevel); int[] deflvlfix = GetAttackerBenefitingBuffs(CardType.CalculatingLevel, (byte)AdditionalTypes.CalculatingLevel.CalculatedDefenceLevel); if (atklvlfix[3] != 0) { attacker.AttackUpgrade = (short)atklvlfix[0]; } if (deflvlfix[3] != 0) { attacker.DefenseUpgrade = (short)deflvlfix[0]; } attacker.AttackUpgrade -= defender.DefenseUpgrade; if (attacker.AttackUpgrade < -10) { attacker.AttackUpgrade = -10; } else if (attacker.AttackUpgrade > ServerManager.Instance.Configuration.MaxUpgrade) { attacker.AttackUpgrade = ServerManager.Instance.Configuration.MaxUpgrade; } switch (attacker.AttackUpgrade) { case 0: weaponDamage += 0; break; case 1: weaponDamage += (int)(weaponDamage * 0.1); break; case 2: weaponDamage += (int)(weaponDamage * 0.15); break; case 3: weaponDamage += (int)(weaponDamage * 0.22); break; case 4: weaponDamage += (int)(weaponDamage * 0.32); break; case 5: weaponDamage += (int)(weaponDamage * 0.43); break; case 6: weaponDamage += (int)(weaponDamage * 0.54); break; case 7: weaponDamage += (int)(weaponDamage * 0.65); break; case 8: weaponDamage += (int)(weaponDamage * 0.9); break; case 9: weaponDamage += (int)(weaponDamage * 1.2); break; case 10: weaponDamage += (int)(weaponDamage * 2); break; default: if (attacker.AttackUpgrade > 0) { weaponDamage *= attacker.AttackUpgrade / 5; } break; } #endregion baseDamage = (int)((int)((baseDamage + staticBoostCategory3 + weaponDamage + 15) * boostCategory3) * shellBoostCategory3); #endregion #region Defense switch (attacker.AttackUpgrade) { default: if (attacker.AttackUpgrade < 0) { defender.ArmorDefense += defender.ArmorDefense / 5; } break; case -10: defender.ArmorDefense += (int)(defender.ArmorDefense * 2); break; case -9: defender.ArmorDefense += (int)(defender.ArmorDefense * 1.2); break; case -8: defender.ArmorDefense += (int)(defender.ArmorDefense * 0.9); break; case -7: defender.ArmorDefense += (int)(defender.ArmorDefense * 0.65); break; case -6: defender.ArmorDefense += (int)(defender.ArmorDefense * 0.54); break; case -5: defender.ArmorDefense += (int)(defender.ArmorDefense * 0.43); break; case -4: defender.ArmorDefense += (int)(defender.ArmorDefense * 0.32); break; case -3: defender.ArmorDefense += (int)(defender.ArmorDefense * 0.22); break; case -2: defender.ArmorDefense += (int)(defender.ArmorDefense * 0.15); break; case -1: defender.ArmorDefense += (int)(defender.ArmorDefense * 0.1); break; case 0: defender.ArmorDefense += 0; break; } int defense = (int)((int)((defender.Defense + defender.ArmorDefense + staticBoostCategory4) * boostCategory4) * shellBoostCategory4); if (GetAttackerBenefitingBuffs(CardType.SpecialDefence, (byte)AdditionalTypes.SpecialDefence.AllDefenceNullified)[3] != 0 || (GetAttackerBenefitingBuffs(CardType.SpecialDefence, (byte)AdditionalTypes.SpecialDefence.MeleeDefenceNullified)[3] != 0 && attacker.AttackType.Equals(AttackType.Melee)) || (GetAttackerBenefitingBuffs(CardType.SpecialDefence, (byte)AdditionalTypes.SpecialDefence.RangedDefenceNullified)[3] != 0 && attacker.AttackType.Equals(AttackType.Range)) || (GetAttackerBenefitingBuffs(CardType.SpecialDefence, (byte)AdditionalTypes.SpecialDefence.MagicDefenceNullified)[3] != 0 && attacker.AttackType.Equals(AttackType.Magical))) { defense = 0; } #endregion #region Normal Damage int normalDamage = (int)((int)((baseDamage + staticBoostCategory2 - defense) * boostCategory2) * shellBoostCategory2); if (normalDamage < 0) { normalDamage = 0; } #endregion #region Crit Damage attacker.CritChance += GetShellWeaponEffectValue(ShellWeaponEffectType.CriticalChance); attacker.CritChance -= GetShellArmorEffectValue(ShellArmorEffectType.ReducedCritChanceRecive); attacker.CritRate += GetShellWeaponEffectValue(ShellWeaponEffectType.CriticalDamage); if (defender.CellonOptions != null) { attacker.CritRate -= defender.CellonOptions.Where(s => s.Type == CellonOptionType.CritReduce).Sum(s => s.Value); } if (ServerManager.Instance.RandomNumber() < attacker.CritChance && attacker.AttackType != AttackType.Magical) { double multiplier = attacker.CritRate / 100D; if (multiplier > 3) { multiplier = 3; } normalDamage += (int)(normalDamage * multiplier); hitMode = 3; } #endregion #region Fairy Damage int fairyDamage = (int)((baseDamage + 100) * attacker.ElementRate / 100D); #endregion #region Elemental Damage Advantage double elementalBoost = 0; switch (attacker.Element) { case 0: break; case 1: defender.Resistance = defender.FireResistance; switch (defender.Element) { case 0: elementalBoost = 1.3; // Damage vs no element break; case 1: elementalBoost = 1; // Damage vs fire break; case 2: elementalBoost = 2; // Damage vs water break; case 3: elementalBoost = 1; // Damage vs light break; case 4: elementalBoost = 1.5; // Damage vs darkness break; } break; case 2: defender.Resistance = defender.WaterResistance; switch (defender.Element) { case 0: elementalBoost = 1.3; break; case 1: elementalBoost = 2; break; case 2: elementalBoost = 1; break; case 3: elementalBoost = 1.5; break; case 4: elementalBoost = 1; break; } break; case 3: defender.Resistance = defender.LightResistance; switch (defender.Element) { case 0: elementalBoost = 1.3; break; case 1: elementalBoost = 1.5; break; case 2: case 3: elementalBoost = 1; break; case 4: elementalBoost = 3; break; } break; case 4: defender.Resistance = defender.ShadowResistance; switch (defender.Element) { case 0: elementalBoost = 1.3; break; case 1: elementalBoost = 1; break; case 2: elementalBoost = 1.5; break; case 3: elementalBoost = 3; break; case 4: elementalBoost = 1; break; } break; } if (skill?.Element == 0 || (skill?.Element != attacker.Element && attacker.EntityType == EntityType.Player)) { elementalBoost = 0; } #endregion #region Elemental Damage int elementalDamage = (int)((int)((int)((int)((staticBoostCategory5 + fairyDamage) * elementalBoost) * (1 - (defender.Resistance / 100D))) * boostCategory5) * shellBoostCategory5); if (elementalDamage < 0) { elementalDamage = 0; } #endregion #region Total Damage int totalDamage = (int)((int)((normalDamage + elementalDamage + attacker.Morale + staticBoostCategory1) * boostCategory1) * shellBoostCategory1); if ((attacker.EntityType == EntityType.Player || attacker.EntityType == EntityType.Mate) && (defender.EntityType == EntityType.Player || defender.EntityType == EntityType.Mate)) { totalDamage /= 2; } if (defender.EntityType == EntityType.Monster || defender.EntityType == EntityType.NPC) { totalDamage -= getMonsterDamageBonus(defender.Level); } if (totalDamage < 5) { totalDamage = ServerManager.Instance.RandomNumber(1, 6); } if (attacker.EntityType == EntityType.Monster || attacker.EntityType == EntityType.NPC) { totalDamage += getMonsterDamageBonus(attacker.Level); } #endregion #region Onyx Wings int[] onyxBuff = GetAttackerBenefitingBuffs(CardType.StealBuff, (byte)AdditionalTypes.StealBuff.ChanceSummonOnyxDragon); if (onyxBuff[0] > ServerManager.Instance.RandomNumber()) { onyxWings = true; } #endregion return(totalDamage); }
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 override void Use(ClientSession session, ref ItemInstance inv, byte Option = 0, string[] packetsplit = null) { if (session.Character.IsVehicled) { session.SendPacket(session.Character.GenerateSay(Language.Instance.GetMessageFromKey("CANT_DO_VEHICLED"), 10)); return; } if (session.CurrentMapInstance.MapInstanceType == MapInstanceType.TalentArenaMapInstance) { return; } if (inv.ItemVNum == 2539 || inv.ItemVNum == 10066) { session.SendPacket(session.Character.GenerateGB(3)); session.SendPacket(session.Character.GenerateSMemo(6, "A warm welcome to the Cuarry Bank. You can deposit or withdraw from 1,000 to 1 billion units of gold.")); session.Character.Inventory.RemoveItemFromInventory(inv.Id); } switch (Effect) { // airwaves - eventitems case 0: if (inv.Item.ItemType == ItemType.Shell) { if (!(inv).ShellEffects.Any()) { session.SendPacket(UserInterfaceHelper.GenerateMsg(Language.Instance.GetMessageFromKey("SHELL_MUST_BE_IDENTIFIED"), 0)); return; } if (packetsplit?.Length < 9) { return; } if (!int.TryParse(packetsplit[6], out int requestType)) { return; } if (!Enum.TryParse(packetsplit[8], out InventoryType eqType)) { return; } if (inv.ShellEffects.Count != 0 && packetsplit?.Length > 9 && byte.TryParse(packetsplit[9], out byte islot)) { ItemInstance wearable = session.Character.Inventory.LoadBySlotAndType(islot, InventoryType.Equipment); if (wearable != null && (wearable.Item.ItemType == ItemType.Weapon || wearable.Item.ItemType == ItemType.Armor) && wearable.Item.LevelMinimum >= inv.Upgrade && wearable.Rare >= inv.Rare && !wearable.Item.IsHeroic) { switch (requestType) { case 0: session.SendPacket(wearable.ShellEffects.Any() ? $"qna #u_i^1^{session.Character.CharacterId}^{(short)inv.Type}^{inv.Slot}^1^1^{(short)eqType}^{islot} {Language.Instance.GetMessageFromKey("ADD_OPTION_ON_STUFF_NOT_EMPTY")}" : $"qna #u_i^1^{session.Character.CharacterId}^{(short)inv.Type}^{inv.Slot}^1^1^{(short)eqType}^{islot} {Language.Instance.GetMessageFromKey("ADD_OPTION_ON_STUFF")}"); break; case 1: if (inv.ShellEffects == null) { return; } if (wearable.BoundCharacterId != session.Character.CharacterId && wearable.BoundCharacterId != null) { session.SendPacket(UserInterfaceHelper.GenerateMsg(Language.Instance.GetMessageFromKey("NEED_FRAGANCE"), 0)); return; } if (wearable.Rare < inv.Rare) { session.SendPacket(UserInterfaceHelper.GenerateMsg(Language.Instance.GetMessageFromKey("SHELL_RARITY_TOO_HIGH"), 0)); return; } if (wearable.Item.LevelMinimum < inv.Upgrade) { session.SendPacket(UserInterfaceHelper.GenerateMsg(Language.Instance.GetMessageFromKey("SHELL_LEVEL_TOO_HIGH"), 0)); return; } bool weapon = false; if ((inv.ItemVNum >= 565 && inv.ItemVNum <= 576) || (inv.ItemVNum >= 589 && inv.ItemVNum <= 598)) { weapon = true; } else if ((inv.ItemVNum >= 577 && inv.ItemVNum <= 588) || (inv.ItemVNum >= 656 && inv.ItemVNum <= 664) || inv.ItemVNum == 599) { weapon = false; } else { return; } if ((wearable.Item.ItemType == ItemType.Weapon && weapon) || (wearable.Item.ItemType == ItemType.Armor && !weapon)) { if (wearable.ShellEffects.Count > 0 && ServerManager.RandomNumber() < 50) { session.Character.DeleteItemByItemInstanceId(inv.Id); session.SendPacket(UserInterfaceHelper.GenerateMsg(Language.Instance.GetMessageFromKey("OPTION_FAIL"), 0)); return; } wearable.BoundCharacterId = session.Character.CharacterId; wearable.ShellRarity = inv.Rare; wearable.ShellEffects.Clear(); DAOFactory.ShellEffectDAO.DeleteByEquipmentSerialId(wearable.EquipmentSerialId); wearable.ShellEffects.AddRange(inv.ShellEffects); if (wearable.EquipmentSerialId == Guid.Empty) { wearable.EquipmentSerialId = Guid.NewGuid(); } DAOFactory.ShellEffectDAO.InsertOrUpdateFromList(wearable.ShellEffects, wearable.EquipmentSerialId); session.Character.DeleteItemByItemInstanceId(inv.Id); session.SendPacket(UserInterfaceHelper.GenerateMsg(Language.Instance.GetMessageFromKey("OPTION_SUCCESS"), 0)); } break; } } } return; } if (ItemType == ItemType.Event) { session.CurrentMapInstance?.Broadcast(StaticPacketHelper.GenerateEff(UserType.Player, session.Character.CharacterId, EffectValue)); if (MappingHelper.GuriItemEffects.ContainsKey(EffectValue)) { session.CurrentMapInstance?.Broadcast(UserInterfaceHelper.GenerateGuri(19, 1, session.Character.CharacterId, MappingHelper.GuriItemEffects[EffectValue]), session.Character.PositionX, session.Character.PositionY); } session.Character.Inventory.RemoveItemFromInventory(inv.Id); } break; //respawn objects case 1: if (session.Character.MapInstance.MapInstanceType != MapInstanceType.BaseMapInstance || session.Character.IsSeal) { session.SendPacket(session.Character.GenerateSay(Language.Instance.GetMessageFromKey("CANT_USE_THAT"), 10)); return; } int type, secondaryType, inventoryType, slot; if (packetsplit?.Length > 6 && int.TryParse(packetsplit[2], out type) && int.TryParse(packetsplit[3], out secondaryType) && int.TryParse(packetsplit[4], out inventoryType) && int.TryParse(packetsplit[5], out slot)) { int packetType; switch (EffectValue) { case 0: if (inv.ItemVNum != 2070 && inv.ItemVNum != 10010 || (session.CurrentMapInstance.Map.MapTypes.Any(m => m.MapTypeId == (short)MapTypeEnum.Act51 || m.MapTypeId == (short)MapTypeEnum.Act52))) { return; } if (Option == 0) { if (ServerManager.Instance.ChannelId == 51) { session.SendPacket(UserInterfaceHelper.GenerateDialog($"#u_i^{type}^{secondaryType}^{inventoryType}^{slot}^2 #u_i^{type}^{secondaryType}^{inventoryType}^{slot}^0 {Language.Instance.GetMessageFromKey("WANT_TO_GO_BASE")}")); } else { session.SendPacket(UserInterfaceHelper.GenerateDialog($"#u_i^{type}^{secondaryType}^{inventoryType}^{slot}^1 #u_i^{type}^{secondaryType}^{inventoryType}^{slot}^2 {Language.Instance.GetMessageFromKey("WANT_TO_SAVE_POSITION")}")); } } else if (int.TryParse(packetsplit[6], out packetType)) { switch (packetType) { case 1: session.SendPacket(UserInterfaceHelper.GenerateDelay(5000, 7, $"#u_i^{type}^{secondaryType}^{inventoryType}^{slot}^3")); break; case 2: session.SendPacket(UserInterfaceHelper.GenerateDelay(5000, 7, $"#u_i^{type}^{secondaryType}^{inventoryType}^{slot}^4")); break; case 3: session.Character.SetReturnPoint(session.Character.MapId, session.Character.MapX, session.Character.MapY); RespawnMapTypeDTO respawn = session.Character.Respawn; if (respawn.DefaultX != 0 && respawn.DefaultY != 0 && respawn.DefaultMapId != 0) { MapCell mapCell = new MapCell(); for (int i = 0; i < 5; i++) { mapCell.X = (short)(respawn.DefaultX + ServerManager.RandomNumber(-3, 3)); mapCell.Y = (short)(respawn.DefaultY + ServerManager.RandomNumber(-3, 3)); if (ServerManager.GetMapInstanceByMapId(respawn.DefaultMapId) is MapInstance GoToMap) { if (!GoToMap.Map.IsBlockedZone(mapCell.X, mapCell.Y)) { break; } } } ServerManager.Instance.ChangeMap(session.Character.CharacterId, respawn.DefaultMapId, mapCell.X, mapCell.Y); } session.Character.Inventory.RemoveItemFromInventory(inv.Id); break; case 4: RespawnMapTypeDTO respawnObj = session.Character.Respawn; if (ServerManager.Instance.ChannelId == 51) { respawnObj.DefaultMapId = (short)(129 + session.Character.Faction); respawnObj.DefaultX = 41; respawnObj.DefaultY = 42; } if (respawnObj.DefaultX != 0 && respawnObj.DefaultY != 0 && respawnObj.DefaultMapId != 0) { MapCell mapCell = new MapCell(); for (int i = 0; i < 5; i++) { mapCell.X = (short)(respawnObj.DefaultX + ServerManager.RandomNumber(-3, 3)); mapCell.Y = (short)(respawnObj.DefaultY + ServerManager.RandomNumber(-3, 3)); if (ServerManager.GetMapInstanceByMapId(respawnObj.DefaultMapId) is MapInstance GoToMap) { if (!GoToMap.Map.IsBlockedZone(mapCell.X, mapCell.Y)) { break; } } } ServerManager.Instance.ChangeMap(session.Character.CharacterId, respawnObj.DefaultMapId, mapCell.X, mapCell.Y); } session.Character.Inventory.RemoveItemFromInventory(inv.Id); break; } } break; case 1: if (inv.ItemVNum != 2071 && inv.ItemVNum != 10011) { return; } if (int.TryParse(packetsplit[6], out packetType)) { if (ServerManager.Instance.ChannelId == 51) { session.SendPacket(UserInterfaceHelper.GenerateMsg(Language.Instance.GetMessageFromKey("CANNOT_USE"), 10)); return; } RespawnMapTypeDTO respawn = session.Character.Return; switch (packetType) { case 0: if (respawn.DefaultX != 0 && respawn.DefaultY != 0 && respawn.DefaultMapId != 0) { session.SendPacket(UserInterfaceHelper.GenerateRp(respawn.DefaultMapId, respawn.DefaultX, respawn.DefaultY, $"#u_i^{type}^{secondaryType}^{inventoryType}^{slot}^1")); } break; case 1: session.SendPacket(UserInterfaceHelper.GenerateDelay(5000, 7, $"#u_i^{type}^{secondaryType}^{inventoryType}^{slot}^2")); break; case 2: if (respawn.DefaultX != 0 && respawn.DefaultY != 0 && respawn.DefaultMapId != 0) { ServerManager.Instance.ChangeMap(session.Character.CharacterId, respawn.DefaultMapId, respawn.DefaultX, respawn.DefaultY); } session.Character.Inventory.RemoveItemFromInventory(inv.Id); break; } } break; case 2: if (inv.ItemVNum != 2072 && inv.ItemVNum != 10012) { return; } if (Option == 0) { session.SendPacket(UserInterfaceHelper.GenerateDelay(5000, 7, $"#u_i^{type}^{secondaryType}^{inventoryType}^{slot}^1")); } else { ServerManager.Instance.JoinMiniland(session, session); session.Character.Inventory.RemoveItemFromInventory(inv.Id); } break; case 4: if (inv.ItemVNum != 2188 || session.Character.MapInstance.Map.MapTypes.Any(s => s.MapTypeId == (short)MapTypeEnum.Act4)) { return; } if (Option == 0) { session.SendPacket(UserInterfaceHelper.GenerateDelay(5000, 7, $"#u_i^{type}^{secondaryType}^{inventoryType}^{slot}^1")); } else { ServerManager.Instance.ChangeMap(session.Character.CharacterId, 98, 28, 34); session.Character.Inventory.RemoveItemFromInventory(inv.Id); } break; case 5: if (inv.ItemVNum != 2311 || ServerManager.Instance.ChannelId != 51) { return; } if (ServerManager.GetAllMapInstances().SelectMany(s => s.Monsters.ToList()).LastOrDefault(s => s.MonsterVNum == (short)session.Character.Faction + 964) is MapMonster flag) { if (Option == 0) { session.SendPacket(UserInterfaceHelper.GenerateDelay(5000, 7, $"#u_i^{type}^{secondaryType}^{inventoryType}^{slot}^1")); } else { ServerManager.Instance.ChangeMapInstance(session.Character.CharacterId, flag.MapInstance.MapInstanceId, flag.MapX, flag.MapY); session.Character.Inventory.RemoveItemFromInventory(inv.Id); } } break; case 6: if (inv.ItemVNum != 2384 || ServerManager.Instance.ChannelId == 51 || session.CurrentMapInstance.MapInstanceType != MapInstanceType.BaseMapInstance) { return; } if (Option == 0) { session.SendPacket(UserInterfaceHelper.GenerateDialog($"#u_i^{type}^{secondaryType}^{inventoryType}^{slot}^1 #u_i^{type}^{secondaryType}^{inventoryType}^{slot}^2 {Language.Instance.GetMessageFromKey("WANT_TO_SAVE_POSITION")}")); } else if (int.TryParse(packetsplit[6], out packetType)) { switch (packetType) { case 1: session.SendPacket(UserInterfaceHelper.GenerateDelay(5000, 7, $"#u_i^{type}^{secondaryType}^{inventoryType}^{slot}^3")); break; case 2: session.SendPacket(UserInterfaceHelper.GenerateDelay(5000, 7, $"#u_i^{type}^{secondaryType}^{inventoryType}^{slot}^4")); break; case 3: if (session.CurrentMapInstance.Map.MapTypes.Any(s => s.MapTypeId == (short)MapTypeEnum.Act51 || s.MapTypeId == (short)MapTypeEnum.Act52)) { session.Character.SetReturnPoint(session.Character.MapId, session.Character.MapX, session.Character.MapY); RespawnMapTypeDTO respawn = session.Character.Respawn; if (respawn.DefaultX != 0 && respawn.DefaultY != 0 && respawn.DefaultMapId != 0) { MapCell mapCell = new MapCell(); for (int i = 0; i < 5; i++) { mapCell.X = (short)(respawn.DefaultX + ServerManager.RandomNumber(-3, 3)); mapCell.Y = (short)(respawn.DefaultY + ServerManager.RandomNumber(-3, 3)); if (ServerManager.GetMapInstanceByMapId(respawn.DefaultMapId) is MapInstance GoToMap) { if (!GoToMap.Map.IsBlockedZone(mapCell.X, mapCell.Y)) { break; } } } ServerManager.Instance.ChangeMap(session.Character.CharacterId, respawn.DefaultMapId, mapCell.X, mapCell.Y); } session.Character.Inventory.RemoveItemFromInventory(inv.Id); } else { goto case 4; } break; case 4: MapInstance mapInstanceBackup = session.CurrentMapInstance; session.CurrentMapInstance = ServerManager.GetMapInstanceByMapId(170); RespawnMapTypeDTO respawnObj = session.Character.Respawn; session.CurrentMapInstance = mapInstanceBackup; if (ServerManager.Instance.ChannelId == 51) { respawnObj.DefaultMapId = (short)(129 + session.Character.Faction); respawnObj.DefaultX = 41; respawnObj.DefaultY = 42; } if (respawnObj.DefaultX != 0 && respawnObj.DefaultY != 0 && respawnObj.DefaultMapId != 0) { MapCell mapCell = new MapCell(); for (int i = 0; i < 5; i++) { mapCell.X = (short)(respawnObj.DefaultX + ServerManager.RandomNumber(-3, 3)); mapCell.Y = (short)(respawnObj.DefaultY + ServerManager.RandomNumber(-3, 3)); if (ServerManager.GetMapInstanceByMapId(respawnObj.DefaultMapId) is MapInstance GoToMap) { if (!GoToMap.Map.IsBlockedZone(mapCell.X, mapCell.Y)) { break; } } } ServerManager.Instance.ChangeMap(session.Character.CharacterId, respawnObj.DefaultMapId, mapCell.X, mapCell.Y); } session.Character.Inventory.RemoveItemFromInventory(inv.Id); break; } } break; } } break; // dyes or waxes case 10: case 11: if (!session.Character.IsVehicled) { if (Effect == 10) { if (EffectValue == 99) { byte nextValue = (byte)ServerManager.RandomNumber(0, 127); session.Character.HairColor = Enum.IsDefined(typeof(HairColorType), nextValue) ? (HairColorType)nextValue : 0; } else { session.Character.HairColor = Enum.IsDefined(typeof(HairColorType), (byte)EffectValue) ? (HairColorType)EffectValue : 0; } } else if (Effect == 11) { if (session.Character.Class == (byte)ClassType.Adventurer && EffectValue > 1) { session.SendPacket(UserInterfaceHelper.GenerateMsg(Language.Instance.GetMessageFromKey("ADVENTURERS_CANT_USE"), 10)); return; } if (session.Character.Gender != (GenderType)Sex && (VNum < 2130 || VNum > 2162) && (VNum < 10025 || VNum > 10026)) { session.SendPacket(UserInterfaceHelper.GenerateMsg(Language.Instance.GetMessageFromKey("CANNOT_USE"), 10)); return; } session.Character.HairStyle = Enum.IsDefined(typeof(HairStyleType), (byte)EffectValue) ? (HairStyleType)EffectValue : 0; } else { if (session.Character.Class == (byte)ClassType.Adventurer && EffectValue > 1) { session.SendPacket(UserInterfaceHelper.GenerateMsg(Language.Instance.GetMessageFromKey("ADVENTURERS_CANT_USE"), 10)); return; } session.Character.HairStyle = Enum.IsDefined(typeof(HairStyleType), (byte)EffectValue) ? (HairStyleType)EffectValue : 0; } session.SendPacket(session.Character.GenerateEq()); session.CurrentMapInstance?.Broadcast(session, session.Character.GenerateIn()); session.CurrentMapInstance?.Broadcast(session, session.Character.GenerateGidx()); session.Character.Inventory.RemoveItemFromInventory(inv.Id); } break; // TS npcs health case 12: if (EffectValue > 0) { if (session.Character.Timespace != null) { session.Character.MapInstance.GetBattleEntitiesInRange(new MapCell { X = session.Character.PositionX, Y = session.Character.PositionY }, 6) .Where(s => (s.MapNpc != null || (s.Mate != null && s.Mate.IsTemporalMate)) && !session.Character.BattleEntity.CanAttackEntity(s)).ToList() .ForEach(s => { int health = EffectValue; if (s.Hp + EffectValue > s.HpMax) { health = s.HpMax - s.Hp; } s.Hp += health; session.Character.MapInstance.Broadcast(s.GenerateRc(health)); s.Mate?.Owner.Session.SendPacket(s.Mate.GenerateStatInfo()); }); session.Character.Inventory.RemoveItemFromInventory(inv.Id); session.SendPacket(StaticPacketHelper.GenerateEff(UserType.Player, session.Character.CharacterId, 48)); } } break; // dignity restoration case 14: if ((EffectValue == 100 || EffectValue == 200) && session.Character.Dignity < 100 && !session.Character.IsVehicled) { session.Character.Dignity += EffectValue; if (session.Character.Dignity > 100) { session.Character.Dignity = 100; } session.SendPacket(session.Character.GenerateFd()); session.SendPacket(StaticPacketHelper.GenerateEff(UserType.Player, session.Character.CharacterId, 49 - (byte)session.Character.Faction)); session.CurrentMapInstance?.Broadcast(session, session.Character.GenerateIn(InEffect: 1), ReceiverType.AllExceptMe); session.CurrentMapInstance?.Broadcast(session, session.Character.GenerateGidx(), ReceiverType.AllExceptMe); session.Character.Inventory.RemoveItemFromInventory(inv.Id); } else if (EffectValue == 2000 && session.Character.Dignity < 100 && !session.Character.IsVehicled) { session.Character.Dignity = 100; session.SendPacket(session.Character.GenerateFd()); session.SendPacket(StaticPacketHelper.GenerateEff(UserType.Player, session.Character.CharacterId, 49 - (byte)session.Character.Faction)); session.CurrentMapInstance?.Broadcast(session, session.Character.GenerateIn(InEffect: 1), ReceiverType.AllExceptMe); session.CurrentMapInstance?.Broadcast(session, session.Character.GenerateGidx(), ReceiverType.AllExceptMe); session.Character.Inventory.RemoveItemFromInventory(inv.Id); } break; // speakers case 15: if (!session.Character.IsVehicled && Option == 0) { session.SendPacket(UserInterfaceHelper.GenerateGuri(10, 3, session.Character.CharacterId, 1)); } break; // bubbles case 16: if (!session.Character.IsVehicled && Option == 0) { session.SendPacket(UserInterfaceHelper.GenerateGuri(10, 4, session.Character.CharacterId, 1)); } break; case 20: if (!session.Character.IsVehicled) { session.Character.AddBuff(new Buff(105, session.Character.Level), session.Character.BattleEntity); } break; // wigs case 30: if (!session.Character.IsVehicled) { ItemInstance wig = session.Character.Inventory.LoadBySlotAndType((byte)EquipmentType.Hat, InventoryType.Wear); if (wig != null) { wig.Design = (byte)ServerManager.RandomNumber(0, 15); session.SendPacket(session.Character.GenerateEq()); session.SendPacket(session.Character.GenerateEquipment()); session.CurrentMapInstance?.Broadcast(session, session.Character.GenerateIn()); session.CurrentMapInstance?.Broadcast(session, session.Character.GenerateGidx()); session.Character.Inventory.RemoveItemFromInventory(inv.Id); } else { session.SendPacket(UserInterfaceHelper.GenerateMsg(Language.Instance.GetMessageFromKey("NO_WIG"), 0)); } } break; case 31: if (!session.Character.IsVehicled && session.Character.HairStyle == HairStyleType.Hair7) { session.Character.HairStyle = HairStyleType.Hair8; session.SendPacket(session.Character.GenerateEq()); session.CurrentMapInstance?.Broadcast(session, session.Character.GenerateIn()); session.CurrentMapInstance?.Broadcast(session, session.Character.GenerateGidx()); session.Character.Inventory.RemoveItemFromInventory(inv.Id); // idk how it works yet but seems like all characters with this hairstyle have DarkPurple hair //session.Character.HairColor = HairColorType.DarkPurple; } break; // Passive skills books case 99: if (session.Character.HeroLevel >= EffectValue) { if (session.Character.AddSkill((short)(Sex + 1))) { session.SendPacket(session.Character.GenerateSki()); session.Character.Inventory.RemoveItemFromInventory(inv.Id); } } else { session.SendPacket(session.Character.GenerateSay(Language.Instance.GetMessageFromKey("LOW_HERO_LVL"), 10)); } break; case 300: if (session.Character.Group != null && session.Character.Group.GroupType != GroupType.Group && session.Character.Group.IsLeader(session) && session.CurrentMapInstance.Portals.Any(s => s.Type == (short)PortalType.Raid)) { int delay = 0; foreach (ClientSession sess in session.Character.Group.Sessions.GetAllItems()) { Observable.Timer(TimeSpan.FromMilliseconds(delay)).Subscribe(o => { if (sess?.Character != null && session?.CurrentMapInstance != null && session?.Character != null && sess.Character != session.Character) { ServerManager.Instance.TeleportOnRandomPlaceInMap(sess, session.CurrentMapInstance.MapInstanceId); } }); delay += 100; } session.Character.Inventory.RemoveItemFromInventory(inv.Id); } break; case 301: if (session.Character.Channel.ChannelId == 51) { return; } if (session.Character.MapInstance.MapInstanceType != MapInstanceType.BaseMapInstance) { return; } if (session.Character.Family != null && session.HasCurrentMapInstance && session.HasSelectedCharacter && session.Character.FamilyCharacter.Authority == FamilyAuthority.Head) { ServerManager.Instance.Sessions.Where(s => s.Character != session.Character && s.Character?.MapInstance.MapInstanceType == MapInstanceType.BaseMapInstance && s.Character.Family?.FamilyId == session.Character.Family?.FamilyId).ToList().ForEach(s => s.SendPacket($"qnaml 3 #guri^301^{session.Character.CharacterId} {Language.Instance.GetMessageFromKey("FAMILYTELEPORT_QUESTION")}")); session.Character.Inventory.RemoveItemFromInventory(inv.Id); session.Character.LastCall = DateTime.Now; } break; default: Logger.Warn(string.Format(Language.Instance.GetMessageFromKey("NO_HANDLER_ITEM"), GetType(), VNum, Effect, EffectValue)); break; } }
private void ExecuteHandler(ClientSession session) { PenaltyLogDTO penalty = session.Account.PenaltyLogs.OrderByDescending(s => s.DateEnd).FirstOrDefault(); if (session.Character.IsMuted() && penalty != null) { if (session.Character.Gender == GenderType.Female) { session.CurrentMapInstance?.Broadcast(session.Character.GenerateSay(Language.Instance.GetMessageFromKey("MUTED_FEMALE"), 1)); session.SendPacket(session.Character.GenerateSay(string.Format(Language.Instance.GetMessageFromKey("MUTE_TIME"), (penalty.DateEnd - DateTime.Now).ToString("hh\\:mm\\:ss")), 11)); } else { session.CurrentMapInstance?.Broadcast(session.Character.GenerateSay(Language.Instance.GetMessageFromKey("MUTED_MALE"), 1)); session.SendPacket(session.Character.GenerateSay(string.Format(Language.Instance.GetMessageFromKey("MUTE_TIME"), (penalty.DateEnd - DateTime.Now).ToString("hh\\:mm\\:ss")), 11)); } return; } Mate attacker = session.Character.Mates.FirstOrDefault(x => x.MateTransportId == MateTransportId); if (attacker == null) { return; } NpcMonsterSkill mateSkill = null; if (attacker.Monster.Skills.Any()) { mateSkill = attacker.Monster.Skills.FirstOrDefault(sk => MateHelper.Instance.PetSkills.Contains(sk.SkillVNum)); } if (mateSkill == null) { mateSkill = new NpcMonsterSkill { SkillVNum = 200 }; } if (attacker.IsSitting) { return; } MapMonster target = session.CurrentMapInstance?.GetMonster(TargetId); switch (TargetType) { case UserType.Monster: case UserType.Npc: if (attacker.Hp <= 0) { return; } if (target != null) { session.CurrentMapInstance.Broadcast(StaticPacketHelper.CastOnTarget(UserType.Npc, attacker.MateTransportId, 3, target.MapMonsterId, mateSkill.Skill.CastAnimation, mateSkill.Skill.CastEffect, mateSkill.SkillVNum)); session.CurrentMapInstance.Broadcast(StaticPacketHelper.SkillUsed(UserType.Npc, attacker.MateTransportId, 3, target.MapMonsterId, mateSkill.SkillVNum, mateSkill.Skill.Cooldown, mateSkill.Skill.AttackAnimation, mateSkill.Skill.Effect, target.MapX, target.MapY, target.CurrentHp > 0, (int)(target.CurrentHp / (double)target.MaxHp * 100), 0, 0, 0)); } session.AttackMonster(attacker, mateSkill.Skill, TargetId, target?.MapX ?? attacker.PositionX, target?.MapY ?? attacker.PositionY); session.SendPacketAfter("petsr 0", mateSkill.Skill.Cooldown * 100); return; case UserType.Player: if (attacker.Hp <= 0) { return; } Character targetChar = session.CurrentMapInstance?.GetSessionByCharacterId(TargetId) ?.Character; if (targetChar != null && session.CurrentMapInstance != null && (targetChar.Session.CurrentMapInstance == session.CurrentMapInstance && targetChar.CharacterId != session.Character.CharacterId && session.CurrentMapInstance.Map.MapTypes.Any(s => s.MapTypeId == (short)MapTypeEnum.Act4) && session.Character.Faction != targetChar.Faction && session.CurrentMapInstance.Map .MapId != 130 && session.CurrentMapInstance.Map .MapId != 131 || session.CurrentMapInstance.Map.MapTypes.Any(m => m.MapTypeId == (short)MapTypeEnum.PvpMap) && (session.Character.Group == null || !session.Character.Group .IsMemberOfGroup( targetChar.CharacterId)) || session.CurrentMapInstance.IsPvp && (session.Character.Group == null || !session.Character.Group.IsMemberOfGroup( targetChar.CharacterId)))) { session.AttackCharacter(attacker, mateSkill, targetChar); } return; case UserType.Object: return; default: return; } }