/// <summary> /// psl packet /// </summary> /// <param name="pslPacket"></param> public void Psl(PslPacket pslPacket) { Mate mate = Session.Character.Mates.FirstOrDefault(x => x.IsTeamMember && x.MateType == MateType.Partner); if (mate == null) { return; } if (pslPacket.Type == 0) { if (mate.IsUsingSp) { mate.IsUsingSp = false; mate.SpSkills = null; Session.Character.MapInstance.Broadcast(mate.GenerateCMode(-1)); Session.SendPacket(mate.GenerateCond()); Session.SendPacket(mate.GeneratePski()); Session.SendPacket(mate.GenerateScPacket()); Session.Character.MapInstance.Broadcast(mate.GenerateOut()); Session.Character.MapInstance.Broadcast(mate.GenerateIn()); Session.SendPacket(Session.Character.GeneratePinit()); //psd 30 } else { Session.SendPacket("delay 5000 3 #psl^1 "); Session.CurrentMapInstance?.Broadcast(UserInterfaceHelper.Instance.GenerateGuri(2, 2, mate.MateTransportId), mate.PositionX, mate.PositionY); } } else { if (mate.SpInstance == null) { return; } mate.IsUsingSp = true; //TODO: update pet skills mate.SpSkills = new NpcMonsterSkill[3]; Session.SendPacket(mate.GenerateCond()); Session.Character.MapInstance.Broadcast(mate.GenerateCMode(mate.SpInstance.Item.Morph)); Session.SendPacket(mate.GeneratePski()); Session.SendPacket(mate.GenerateScPacket()); Session.Character.MapInstance.Broadcast(mate.GenerateOut()); Session.Character.MapInstance.Broadcast(mate.GenerateIn()); Session.SendPacket(Session.Character.GeneratePinit()); Session.Character.MapInstance.Broadcast(mate.GenerateEff(196)); } }
private void ExecuteHandler(ClientSession session) { Mate mate = session.Character.Mates.Find(x => x.IsTeamMember && x.MateType == MateType.Partner); if (mate == null) { return; } if (Type == 0) { if (mate.SpInstance == null) { session.SendPacket(UserInterfaceHelper.GenerateMsg(Language.Instance.GetMessageFromKey("NEED_WEAR_PARTNER_SP"), 0)); return; } var currentRunningSeconds = (DateTime.UtcNow - Process.GetCurrentProcess().StartTime.AddHours(-2).AddSeconds(-50)).TotalSeconds; var timeSpanSinceLastUsage = currentRunningSeconds - mate.LastSp; if (timeSpanSinceLastUsage < mate.SpCooldown) { session.SendPacket(UserInterfaceHelper.GenerateMsg(string.Format(Language.Instance.GetMessageFromKey("PARTNER_SP_IN_COOLDOWN"), mate.SpCooldown - (int)Math.Round(timeSpanSinceLastUsage, 0)), 0)); return; } if (mate.IsUsingSp) { mate.RemoveSp(); } else { session.SendPacket("pdelay 5000 3 #psl^1 "); session.CurrentMapInstance?.Broadcast(UserInterfaceHelper.GenerateGuri(2, 2, mate.MateTransportId), mate.PositionX, mate.PositionY); } } else { if (mate.SpInstance == null) { session.SendPacket(UserInterfaceHelper.GenerateMsg(Language.Instance.GetMessageFromKey("NEED_WEAR_PARTNER_SP"), 0)); return; } mate.IsUsingSp = true; session.SendPacket(mate.GenerateCond()); session.Character.MapInstance.Broadcast(mate.GenerateCMode(mate.SpInstance.Item.Morph)); session.SendPacket(mate.GenerateScPacket()); session.Character.MapInstance.Broadcast(mate.GenerateOut()); session.Character.MapInstance.Broadcast(mate.GenerateIn()); session.SendPacket(session.Character.GeneratePinit()); session.Character.MapInstance.Broadcast(StaticPacketHelper.GenerateEff(UserType.Npc, mate.MateTransportId, 196)); session.SendPacket(mate.GeneratePski()); MateHelper.Instance.AddPartnerBuffs(session, mate); } }
public static void RemoveSp(this Mate e, bool isBackToMiniland = false) { if (e.Owner?.Session == null || e.Owner.MapInstance == null) { return; } e.IsUsingSp = false; e.Owner.Session.SendPacket(e.GenerateScPacket()); if (!e.IsTeamMember) { return; } e.Owner.MapInstance.Broadcast(e.GenerateCMode(-1)); e.GenerateDpski(); e.Owner.Session.SendPacket(e.GenerateCond()); e.Owner.MapInstance.Broadcast(e.GenerateOut()); if (!isBackToMiniland) { bool isAct4 = ServerManager.Instance.ChannelId == 51; Parallel.ForEach(e.Owner.MapInstance.Sessions.Where(s => s.Character != null), s => { if (!isAct4 || e.Owner.Faction == s.Character.Faction) { s.SendPacket(e.GenerateIn(false, isAct4)); } else { s.SendPacket(e.GenerateIn(true, isAct4, s.Account.Authority)); } }); } e.Owner.Session.SendPacket(e.Owner.GeneratePinit()); }
private void ExecuteHandler(ClientSession session) { Mate partnerInTeam = session.Character.Mates.FirstOrDefault(s => s.IsTeamMember && s.MateType == MateType.Partner); if (partnerInTeam == null || PetId != partnerInTeam.PartnerSlot) { session.SendPacket(UserInterfaceHelper.GenerateModal(Language.Instance.GetMessageFromKey("PARTNER_NOT_IN_TEAM"), 1)); return; } if (partnerInTeam.SpInstance == null) { session.SendPacket(UserInterfaceHelper.GenerateModal(Language.Instance.GetMessageFromKey("PARTNER_DOESNT_WEAR_SP"), 1)); return; } if (partnerInTeam.SpInstance.FirstPartnerSkill > 0 && SkillSlot == 0 || partnerInTeam.SpInstance.SecondPartnerSkill > 0 && SkillSlot == 1 || partnerInTeam.SpInstance.ThirdPartnerSkill > 0 && SkillSlot == 2) { session.SendPacket(UserInterfaceHelper.GenerateModal(Language.Instance.GetMessageFromKey("PARTNER_ALREADY_HAS_SKILL"), 1)); return; } if (partnerInTeam.IsUsingSp) { session.SendPacket(UserInterfaceHelper.GenerateModal(Language.Instance.GetMessageFromKey("MUST_REMOVE_PARTNER_SP"), 1)); return; } if (partnerInTeam.SpInstance.Agility < 100 && session.Account.Authority < AuthorityType.GameMaster) { session.SendPacket(UserInterfaceHelper.GenerateModal(Language.Instance.GetMessageFromKey("NOT_ENOUGH_AGILITY"), 1)); return; } var skillList = ServerManager.Instance.PartnerSkills.FirstOrDefault(s => s.PartnerVnum == partnerInTeam.SpInstance.ItemVNum); if (skillList == null) { return; } switch (Option) { case 0: session.SendPacket($"pdelay 3000 12 #ps_op^{PetId}^{SkillSlot}^1"); session.CurrentMapInstance?.Broadcast(UserInterfaceHelper.GenerateGuri(2, 2, partnerInTeam.MateTransportId), partnerInTeam.PositionX, partnerInTeam.PositionY); break; default: switch (SkillSlot) { case 0: partnerInTeam.SpInstance.FirstPartnerSkill = skillList.FirstSkill; partnerInTeam.SpInstance.FirstPartnerSkillRank = (PartnerSkillRankType)ServerManager.RandomNumber <byte>(1, 8); break; case 1: partnerInTeam.SpInstance.SecondPartnerSkill = skillList.SecondSkill; partnerInTeam.SpInstance.SecondPartnerSkillRank = (PartnerSkillRankType)ServerManager.RandomNumber <byte>(1, 8); break; case 2: partnerInTeam.SpInstance.ThirdPartnerSkill = skillList.ThirdSkill; partnerInTeam.SpInstance.ThirdPartnerSkillRank = (PartnerSkillRankType)ServerManager.RandomNumber <byte>(1, 8); break; } partnerInTeam.SpInstance.Agility = 0; session.SendPacket(partnerInTeam.GenerateScPacket()); session.SendPacket(partnerInTeam.GeneratePski()); session.SendPacket(UserInterfaceHelper.GenerateModal(Language.Instance.GetMessageFromKey("PARTNER_LEARNT_SKILL"), 1)); break; } }
public override void Use(ClientSession session, ref ItemInstance inv, byte option = 0, string[] packetsplit = null) { switch (Effect) { default: bool delay = false; if (option == 255) { delay = true; option = 0; } Mate mate = null; if (option != 0) { if (session.Character.Mates.Count(s => s.MateType == MateType.Partner) == 1 && option == 2) { option = 1; } mate = session.Character.Mates.FirstOrDefault(s => s.MateType == MateType.Partner && s.PetId == (option - 1)); } short slot = inv.Slot; var equipment = InventoryType.Wear; switch (option) { case 1: equipment = InventoryType.FirstPartnerInventory; break; case 2: equipment = InventoryType.SecondPartnerInventory; break; case 3: equipment = InventoryType.ThirdPartnerInventory; break; } InventoryType itemToWearType = inv.Type; if (inv == null) { return; } if (ItemValidTime > 0 && !inv.IsBound) { inv.ItemDeleteTime = DateTime.Now.AddSeconds(ItemValidTime); } if (!inv.IsBound) { switch (inv.Item.Effect) { case 790: // Tarot case 932: // Attack amulet case 933: // defense amulet inv.BoundCharacterId = session.Character.CharacterId; break; } if (!delay && (EquipmentSlot == EquipmentType.Fairy && (MaxElementRate == 70 || MaxElementRate == 80) || EquipmentSlot == EquipmentType.CostumeHat || EquipmentSlot == EquipmentType.CostumeSuit || EquipmentSlot == EquipmentType.WeaponSkin)) { session.SendPacket( $"qna #u_i^1^{session.Character.CharacterId}^{(byte)itemToWearType}^{slot}^1 {Language.Instance.GetMessageFromKey("ASK_BIND")}"); return; } if (delay) { inv.BoundCharacterId = session.Character.CharacterId; } } double timeSpanSinceLastSpUsage = (DateTime.Now - Process.GetCurrentProcess().StartTime.AddSeconds(-50)).TotalSeconds - session.Character.LastSp; if (EquipmentSlot == EquipmentType.Sp && inv.Rare == -2) { session.SendPacket( UserInterfaceHelper.Instance.GenerateMsg( Language.Instance.GetMessageFromKey("CANT_EQUIP_DESTROYED_SP"), 0)); return; } if (option == 0) { if (EquipmentSlot == EquipmentType.Sp && timeSpanSinceLastSpUsage <= session.Character.SpCooldown && session.Character.Inventory.LoadBySlotAndType <SpecialistInstance>((byte)EquipmentType.Sp, InventoryType.Specialist) != null) { session.SendPacket(UserInterfaceHelper.Instance.GenerateMsg( string.Format(Language.Instance.GetMessageFromKey("SP_INLOADING"), session.Character.SpCooldown - (int)Math.Round(timeSpanSinceLastSpUsage)), 0)); return; } if (ItemType != ItemType.Weapon && ItemType != ItemType.Armor && ItemType != ItemType.Fashion && ItemType != ItemType.Jewelery && ItemType != ItemType.Specialist || LevelMinimum > (IsHeroic ? session.Character.HeroLevel : session.Character.Level) || Sex != 0 && Sex != ((byte)session.Character.Gender + 1) || ItemType != ItemType.Jewelery && EquipmentSlot != EquipmentType.Boots && EquipmentSlot != EquipmentType.Gloves && (Class >> (byte)session.Character.Class & 1) != 1) { session.SendPacket( session.Character.GenerateSay(Language.Instance.GetMessageFromKey("BAD_EQUIPMENT"), 10)); return; } if (session.Character.UseSp) { var sp = session.Character.Inventory.LoadBySlotAndType <SpecialistInstance>( (byte)EquipmentType.Sp, equipment); if (sp != null && sp.Item.Element != 0 && EquipmentSlot == EquipmentType.Fairy && Element != sp.Item.Element && Element != sp.Item.SecondaryElement) { session.SendPacket( UserInterfaceHelper.Instance.GenerateMsg( Language.Instance.GetMessageFromKey("BAD_FAIRY"), 0)); return; } } if (ItemType == ItemType.Weapon || ItemType == ItemType.Armor) { if (inv.BoundCharacterId.HasValue && inv.BoundCharacterId.Value != session.Character.CharacterId) { session.SendPacket( session.Character.GenerateSay(Language.Instance.GetMessageFromKey("BAD_EQUIPMENT"), 10)); return; } } if (session.Character.UseSp && EquipmentSlot == EquipmentType.Sp) { session.SendPacket( session.Character.GenerateSay(Language.Instance.GetMessageFromKey("SP_BLOCKED"), 10)); return; } if (session.Character.JobLevel < LevelJobMinimum) { session.SendPacket( session.Character.GenerateSay(Language.Instance.GetMessageFromKey("LOW_JOB_LVL"), 10)); return; } } else if (mate != null) { if (mate.Level < LevelMinimum) { session.SendPacket( session.Character.GenerateSay(Language.Instance.GetMessageFromKey("BAD_EQUIPMENT"), 10)); return; } switch (EquipmentSlot) { case EquipmentType.Armor: if (ItemSubType == 4) { if (MateHelper.Instance.CanWearItem(inv.ItemVNum, mate.Monster.NpcMonsterVNum, session)) { mate.ArmorInstance = inv; } else { goto default; } break; } else { goto default; } case EquipmentType.MainWeapon: if (ItemSubType == 12) { if (MateHelper.Instance.CanWearItem(inv.ItemVNum, mate.Monster.NpcMonsterVNum, session)) { mate.WeaponInstance = inv; } else { goto default; } break; } else { goto default; } case EquipmentType.Gloves: mate.GlovesInstance = inv; break; case EquipmentType.Boots: mate.BootsInstance = inv; break; case EquipmentType.Sp: if (ItemSubType == 4) { if (MateHelper.Instance.CanWearItem(inv.ItemVNum, mate.Monster.NpcMonsterVNum, session)) { mate.SpInstance = (SpecialistInstance)inv; } else { goto default; } break; } else { goto default; } default: session.SendPacket( session.Character.GenerateSay(Language.Instance.GetMessageFromKey("BAD_EQUIPMENT"), 10)); return; } } ItemInstance currentlyEquippedItem = session.Character.Inventory.LoadBySlotAndType((short)EquipmentSlot, equipment); if (currentlyEquippedItem == null) { // move from equipment to wear session.Character.Inventory.MoveInInventory(inv.Slot, itemToWearType, equipment); session.SendPacket(UserInterfaceHelper.Instance.GenerateInventoryRemove(itemToWearType, slot)); } else { // move from wear to equipment and back session.Character.Inventory.MoveInInventory(currentlyEquippedItem.Slot, equipment, itemToWearType, inv.Slot); session.SendPacket(currentlyEquippedItem.GenerateInventoryAdd()); session.Character.BattleEntity.StaticBcards.RemoveWhere( o => o.ItemVNum != currentlyEquippedItem.ItemVNum, out ConcurrentBag <BCard> eqBcards); session.Character.BattleEntity.StaticBcards = eqBcards; } if (inv.Item.ItemType != ItemType.Fashion) { inv.Item.BCards.ForEach(s => session.Character.BattleEntity.StaticBcards.Add(s)); } if (inv is WearableInstance wearableInstance) { var specialistInstance = session.Character.Inventory.LoadBySlotAndType <SpecialistInstance>((byte)EquipmentType.Sp, InventoryType.Wear); if (wearableInstance.EquipmentOptions != null) { switch (wearableInstance.Item.ItemType) { case ItemType.Armor: case ItemType.Weapon: case ItemType.Jewelery: case ItemType.Fashion: switch (wearableInstance.Slot) { case (byte)EquipmentType.CostumeHat: session.Character.BattleEntity.CostumeHatBcards.Clear(); foreach (BCard bc in wearableInstance.Item.BCards) { session.Character.BattleEntity.CostumeHatBcards.Add(bc); } break; case (byte)EquipmentType.CostumeSuit: session.Character.BattleEntity.CostumeSuitBcards.Clear(); foreach (BCard bc in wearableInstance.Item.BCards) { session.Character.BattleEntity.CostumeSuitBcards.Add(bc); } break; case (byte)EquipmentType.Armor: session.Character.Inventory.Armor = wearableInstance; session.Character.ShellOptionArmor.Clear(); foreach (EquipmentOptionDTO dto in DaoFactory.EquipmentOptionDao.GetOptionsByWearableInstanceId(inv.Id)) { session.Character.ShellOptionArmor.Add(dto); } EquipmentOptionHelper.Instance .ShellToBCards(wearableInstance.EquipmentOptions, wearableInstance.ItemVNum) .ForEach(s => session.Character.BattleEntity.StaticBcards.Add(s)); break; case (byte)EquipmentType.MainWeapon: session.Character.ShellOptionsMain.Clear(); foreach (EquipmentOptionDTO dto in DaoFactory.EquipmentOptionDao.GetOptionsByWearableInstanceId(inv.Id)) { session.Character.ShellOptionsMain.Add(dto); } session.Character.Inventory.PrimaryWeapon = wearableInstance; EquipmentOptionHelper.Instance .ShellToBCards(wearableInstance.EquipmentOptions, wearableInstance.ItemVNum) .ForEach(s => session.Character.BattleEntity.StaticBcards.Add(s)); specialistInstance?.RestorePoints(session, specialistInstance); break; case (byte)EquipmentType.SecondaryWeapon: session.Character.ShellOptionsSecondary.Clear(); foreach (EquipmentOptionDTO dto in DaoFactory.EquipmentOptionDao.GetOptionsByWearableInstanceId(inv.Id)) { session.Character.ShellOptionsSecondary.Add(dto); } session.Character.Inventory.SecondaryWeapon = wearableInstance; EquipmentOptionHelper.Instance .ShellToBCards(wearableInstance.EquipmentOptions, wearableInstance.ItemVNum) .ForEach(s => session.Character.BattleEntity.StaticBcards.Add(s)); specialistInstance?.RestorePoints(session, specialistInstance); break; case (byte)EquipmentType.Ring: case (byte)EquipmentType.Necklace: case (byte)EquipmentType.Bracelet: EquipmentOptionHelper.Instance .CellonToBCards(wearableInstance.EquipmentOptions, wearableInstance.ItemVNum) .ForEach(s => session.Character.BattleEntity.StaticBcards.Add(s)); session.Character.BattleEntity.CellonOptions.Clear(); WearableInstance ring = session.Character.Inventory.LoadBySlotAndType <WearableInstance>((byte)EquipmentType.Ring, InventoryType.Wear); WearableInstance bracelet = session.Character.Inventory.LoadBySlotAndType <WearableInstance>((byte)EquipmentType.Bracelet, InventoryType.Wear); WearableInstance necklace = session.Character.Inventory.LoadBySlotAndType <WearableInstance>((byte)EquipmentType.Necklace, InventoryType.Wear); if (ring?.EquipmentOptions != null) { session.Character.BattleEntity.CellonOptions.AddRange(ring?.EquipmentOptions); } if (bracelet?.EquipmentOptions != null) { session.Character.BattleEntity.CellonOptions.AddRange(bracelet?.EquipmentOptions); } if (necklace?.EquipmentOptions != null) { session.Character.BattleEntity.CellonOptions.AddRange(necklace?.EquipmentOptions); } break; } break; } } } if (option == 0) { session.SendPacket(session.Character.GenerateStatChar()); session.CurrentMapInstance?.Broadcast(session.Character.GenerateEq()); session.SendPacket(session.Character.GenerateEquipment()); session.CurrentMapInstance?.Broadcast(session.Character.GeneratePairy()); switch (EquipmentSlot) { case EquipmentType.Fairy: var fairy = session.Character.Inventory.LoadBySlotAndType <WearableInstance>( (byte)EquipmentType.Fairy, equipment); session.SendPacket(session.Character.GenerateSay( string.Format(Language.Instance.GetMessageFromKey("FAIRYSTATS"), fairy.XP, CharacterHelper.LoadFairyXpData(fairy.ElementRate + fairy.Item.ElementRate)), 10)); break; case EquipmentType.Amulet: session.SendPacket(session.Character.GenerateEff(39)); break; } } else if (mate != null) { session.SendPacket(mate.GenerateScPacket()); } break; } }
private void ExecuteHandler(ClientSession session) { InventoryType equipment; Mate mate = null; if (Type >= 1 && Type <= 12) { // Partner inventories equipment = (InventoryType)(Type + 12); mate = session.Character.Mates.FirstOrDefault(s => s.PartnerSlot == (Type - 1) && s.MateType == MateType.Partner); } else { equipment = InventoryType.Wear; } if (session.HasCurrentMapInstance && session.CurrentMapInstance.UserShops.FirstOrDefault(mapshop => mapshop.Value.OwnerId.Equals(session.Character.CharacterId)).Value == null && (session.Character.ExchangeInfo == null || (session.Character.ExchangeInfo?.ExchangeList).Count == 0)) { ItemInstance inventory = session.Character.Inventory.LoadBySlotAndType(InventorySlot, equipment); if (inventory != null) { double currentRunningSeconds = (DateTime.UtcNow - Process.GetCurrentProcess().StartTime.AddHours(-2).AddSeconds(-50)).TotalSeconds; double timeSpanSinceLastSpUsage = currentRunningSeconds - session.Character.LastSp; if (Type == 0) { if (InventorySlot == (byte)EquipmentType.Sp && session.Character.UseSp) { if (session.Character.IsVehicled) { session.SendPacket( UserInterfaceHelper.GenerateMsg( Language.Instance.GetMessageFromKey("REMOVE_VEHICLE"), 0)); return; } if (session.Character.LastSkillUse.AddSeconds(2) > DateTime.UtcNow) { return; } session.Character.LastSp = (DateTime.UtcNow - Process.GetCurrentProcess().StartTime.AddHours(-2).AddSeconds(-50)).TotalSeconds; session.RemoveSp(inventory.ItemVNum); } else if (InventorySlot == (byte)EquipmentType.Sp && !session.Character.UseSp && timeSpanSinceLastSpUsage <= session.Character.SpCooldown) { session.SendPacket(UserInterfaceHelper.GenerateMsg( string.Format(Language.Instance.GetMessageFromKey("SP_INLOADING"), session.Character.SpCooldown - (int)Math.Round(timeSpanSinceLastSpUsage, 0)), 0)); return; } else if (InventorySlot == (byte)EquipmentType.Fairy && session.Character.IsUsingFairyBooster) { session.SendPacket(UserInterfaceHelper.GenerateMsg( Language.Instance.GetMessageFromKey("REMOVE_FAIRY_WHILE_USING_BOOSTER"), 0)); return; } session.Character.EquipmentBCards.RemoveAll(o => o.ItemVNum == inventory.ItemVNum); } ItemInstance inv = session.Character.Inventory.MoveInInventory(InventorySlot, equipment, InventoryType.Equipment); if (inv == null) { session.SendPacket( UserInterfaceHelper.GenerateMsg(Language.Instance.GetMessageFromKey("NOT_ENOUGH_PLACE"), 0)); return; } if (inv.Slot != -1) { session.SendPacket(inventory.GenerateInventoryAdd()); } if (Type == 0) { session.SendPacket(session.Character.GenerateStatChar()); session.CurrentMapInstance?.Broadcast(session.Character.GenerateEq()); session.SendPacket(session.Character.GenerateEquipment()); session.CurrentMapInstance?.Broadcast(session.Character.GeneratePairy()); } else if (mate != null) { switch (inv.Item.EquipmentSlot) { case EquipmentType.Armor: mate.ArmorInstance = null; break; case EquipmentType.MainWeapon: mate.WeaponInstance = null; break; case EquipmentType.Gloves: mate.GlovesInstance = null; break; case EquipmentType.Boots: mate.BootsInstance = null; break; case EquipmentType.Sp: mate.SpInstance = null; mate.RemoveSp(); break; } session.SendPacket(mate.GenerateScPacket()); } } } }