public SendPackets ( IEnumerable |
||
packets | IEnumerable |
|
priority | byte | |
Результат | void |
// PacketHandler -> with Callback? public void AskRevive(long characterId) { ClientSession Session = GetSessionByCharacterId(characterId); if (Session != null && Session.HasSelectedCharacter) { if (Session.Character.IsVehicled) { Session.Character.RemoveVehicle(); } Session.SendPacket(Session.Character.GenerateStat()); Session.SendPacket(Session.Character.GenerateCond()); Session.SendPackets(Session.Character.GenerateVb()); if (Session.Character.Level > 20) { Session.Character.Dignity -= (short)(Session.Character.Level < 50 ? Session.Character.Level : 50); if (Session.Character.Dignity < -1000) { Session.Character.Dignity = -1000; } Session.SendPacket(Session.Character.GenerateSay(string.Format(Language.Instance.GetMessageFromKey("LOSE_DIGNITY"), (short)(Session.Character.Level < 50 ? Session.Character.Level : 50)), 11)); Session.SendPacket(Session.Character.GenerateFd()); Session.CurrentMap?.Broadcast(Session, Session.Character.GenerateIn(), ReceiverType.AllExceptMe); } Session.SendPacket("eff_ob -1 -1 0 4269"); Session.SendPacket(Session.Character.GenerateDialog($"#revival^0 #revival^1 {(Session.Character.Level > 20 ? Language.Instance.GetMessageFromKey("ASK_REVIVE") : Language.Instance.GetMessageFromKey("ASK_REVIVE_FREE"))}")); Task.Factory.StartNew(async() => { bool revive = true; for (int i = 1; i <= 30; i++) { await Task.Delay(1000); if (Session.Character.Hp > 0) { revive = false; break; } } if (revive) { Instance.ReviveFirstPosition(Session.Character.CharacterId); } }); } }
// PacketHandler -> with Callback? public void AskRevive(long characterId) { ClientSession Session = GetSessionByCharacterId(characterId); if (Session != null && Session.HasSelectedCharacter) { if (Session.Character.IsVehicled) { Session.Character.RemoveVehicle(); } Session.SendPacket(Session.Character.GenerateStat()); Session.SendPacket(Session.Character.GenerateCond()); Session.SendPackets(Session.Character.GenerateVb()); if (Session.Character.Level > 20) { Session.Character.Dignity -= (short)(Session.Character.Level < 50 ? Session.Character.Level : 50); if (Session.Character.Dignity < -1000) { Session.Character.Dignity = -1000; } Session.SendPacket(Session.Character.GenerateSay(String.Format(Language.Instance.GetMessageFromKey("LOSE_DIGNITY"), (short)(Session.Character.Level < 50 ? Session.Character.Level : 50)), 11)); Session.SendPacket(Session.Character.GenerateFd()); Session.CurrentMap?.Broadcast(Session, Session.Character.GenerateIn(), ReceiverType.AllExceptMe); } Session.SendPacket("eff_ob -1 -1 0 4269"); Session.SendPacket(Session.Character.GenerateDialog($"#revival^0 #revival^1 {(Session.Character.Level > 20 ? Language.Instance.GetMessageFromKey("ASK_REVIVE") : Language.Instance.GetMessageFromKey("ASK_REVIVE_FREE"))}")); Parallel.Invoke(delegate() { for (int i = 1; i <= 30; i++) { Thread.Sleep(1000); if (Session.Character.Hp > 0) { return; } } Instance.ReviveFirstPosition(Session.Character.CharacterId); }); } }
//PacketHandler -> with Callback? public void AskRevive(long characterId) { ClientSession Session = Sessions.FirstOrDefault(s => s.Character != null && s.Character.CharacterId == characterId); if (Session != null && Session.Character != null) { if (Session.Character.IsVehicled) { Session.Character.RemoveVehicle(); } Session.SendPacket(Session.Character.GenerateStat()); Session.SendPacket(Session.Character.GenerateCond()); Session.SendPackets(Session.Character.GenerateVb()); if (Session.Character.Level > 20) { Session.Character.Dignity -= (short)(Session.Character.Level < 50 ? Session.Character.Level : 50); if (Session.Character.Dignity < -1000) { Session.Character.Dignity = -1000; } Session.SendPacket(Session.Character.GenerateSay(string.Format(Language.Instance.GetMessageFromKey("LOSE_DIGNITY"), (short)(Session.Character.Level < 50 ? Session.Character.Level : 50)), 11)); Session.SendPacket(Session.Character.GenerateFd()); } Session.SendPacket("eff_ob -1 -1 0 4269"); Session.SendPacket(Session.Character.GenerateDialog($"#revival^0 #revival^1 {(Session.Character.Level > 20 ? Language.Instance.GetMessageFromKey("ASK_REVIVE") : Language.Instance.GetMessageFromKey("ASK_REVIVE_FREE"))}")); Task.Factory.StartNew(async() => { for (int i = 1; i <= 30; i++) { await Task.Delay(1000); if (Session.Character.Hp > 0) { return; } } Instance.ReviveFirstPosition(Session.Character.CharacterId); }); } }
// Both partly public void ChangeMap(long id, short?mapId = null, short?mapX = null, short?mapY = null) { ClientSession session = GetSessionByCharacterId(id); if (session?.Character != null && !session.Character.IsChangingMap) { try { session.Character.IsChangingMap = true; session.CurrentMap.RemoveMonstersTarget(session.Character.CharacterId); session.CurrentMap.UnregisterSession(session.Character.CharacterId); // cleanup sending queue to avoid sending uneccessary packets to it session.ClearLowPriorityQueue(); // avoid cleaning new portals if (mapId != null && mapX != null && mapY != null) { session.Character.MapId = (short)mapId; session.Character.MapX = (short)mapX; session.Character.MapY = (short)mapY; } session.CurrentMap = GetMap(session.Character.MapId); session.CurrentMap.RegisterSession(session); session.SendPacket(session.Character.GenerateCInfo()); session.SendPacket(session.Character.GenerateCMode()); session.SendPacket(session.Character.GenerateEq()); session.SendPacket(session.Character.GenerateEquipment()); session.SendPacket(session.Character.GenerateLev()); session.SendPacket(session.Character.GenerateStat()); session.SendPacket(session.Character.GenerateAt()); session.SendPacket(session.Character.GenerateCond()); session.SendPacket(session.Character.GenerateCMap()); session.SendPacket(session.Character.GenerateStatChar()); session.SendPacket($"gidx 1 {session.Character.CharacterId} -1 - 0"); // family session.SendPacket("rsfp 0 -1"); // in 2 // send only when partner present cond 2 // send only when partner present session.SendPacket(session.Character.GeneratePairy()); session.SendPacket("pinit 0"); // clear party list session.SendPacket("act6"); // act6 1 0 14 0 0 0 14 0 0 0 Sessions.Where(s => s.Character != null && s.Character.MapId.Equals(session.Character.MapId) && s.Character.Name != session.Character.Name && !s.Character.InvisibleGm).ToList().ForEach(s => RequireBroadcastFromUser(session, s.Character.CharacterId, "GenerateIn")); session.SendPackets(session.Character.GenerateGp()); // wp 23 124 4 4 12 99 session.SendPackets(session.Character.GenerateIn3()); session.SendPackets(session.Character.GenerateIn2()); session.SendPackets(session.Character.GenerateNPCShopOnMap()); session.SendPackets(session.Character.GenerateDroppedItem()); session.SendPackets(session.Character.GenerateShopOnMap()); session.SendPackets(session.Character.GeneratePlayerShopOnMap()); if (mapId == 138) { session.SendPacket("bc 0 0 0"); } if (!session.Character.InvisibleGm) { session.CurrentMap?.Broadcast(session, session.Character.GenerateIn(), ReceiverType.AllExceptMe); } if (session.Character.Size != 10) { session.SendPacket(session.Character.GenerateScal()); } if (session.CurrentMap != null && session.CurrentMap.IsDancing && !session.Character.IsDancing) { session.CurrentMap?.Broadcast("dance 2"); } else if (session.CurrentMap != null && !session.CurrentMap.IsDancing && session.Character.IsDancing) { session.Character.IsDancing = false; session.CurrentMap?.Broadcast("dance"); } if (Groups != null) { foreach (Group g in Groups) { foreach (ClientSession groupSession in g.Characters) { ClientSession chara = Sessions.FirstOrDefault(s => s.Character != null && s.Character.CharacterId == groupSession.Character.CharacterId && s.CurrentMap.MapId == groupSession.CurrentMap.MapId); if (chara != null) { groupSession.SendPacket(groupSession.Character.GeneratePinit()); } session.CurrentMap?.Broadcast(groupSession, groupSession.Character.GeneratePidx(), ReceiverType.AllExceptMe); } } } session.Character.IsChangingMap = false; } catch (Exception) { Logger.Log.Warn("Character changed while changing map. Do not abuse Commands."); session.Character.IsChangingMap = false; } } }
public static void NRun(ClientSession Session, NRunPacket packet) { if (!Session.HasCurrentMapInstance) { return; } MapNpc npc = Session.CurrentMapInstance.Npcs.Find(s => s.MapNpcId == packet.NpcId); TeleporterDTO tp; switch (packet.Runner) { case 1: if (Session.Character.Class != (byte)ClassType.Adventurer) { Session.SendPacket(UserInterfaceHelper.GenerateMsg(Language.Instance.GetMessageFromKey("NOT_ADVENTURER"), 0)); return; } if (Session.Character.Level < 15 || Session.Character.JobLevel < 20) { Session.SendPacket(UserInterfaceHelper.GenerateMsg(Language.Instance.GetMessageFromKey("LOW_LVL"), 0)); return; } if (packet.Type == (byte)Session.Character.Class) { return; } if (Session.Character.Inventory.All(i => i.Type != InventoryType.Wear)) { Session.Character.Inventory.AddNewToInventory((short)(4 + (packet.Type * 14)), type: InventoryType.Wear); Session.Character.Inventory.AddNewToInventory((short)(81 + (packet.Type * 13)), type: InventoryType.Wear); switch (packet.Type) { case 1: Session.Character.Inventory.AddNewToInventory(68, type: InventoryType.Wear); Session.Character.Inventory.AddNewToInventory(2082, 10); break; case 2: Session.Character.Inventory.AddNewToInventory(78, type: InventoryType.Wear); Session.Character.Inventory.AddNewToInventory(2083, 10); break; case 3: Session.Character.Inventory.AddNewToInventory(86, type: InventoryType.Wear); break; } Session.CurrentMapInstance?.Broadcast(Session.Character.GenerateEq()); Session.SendPacket(Session.Character.GenerateEquipment()); Session.Character.ChangeClass((ClassType)packet.Type); } else { Session.SendPacket(UserInterfaceHelper.GenerateMsg(Language.Instance.GetMessageFromKey("EQ_NOT_EMPTY"), 0)); } break; case 2: Session.SendPacket("wopen 1 0"); break; case 4: Mate mate = Session.Character.Mates.Find(s => s.MateTransportId == packet.NpcId); switch (packet.Type) { case 2: if (mate != null) { if (Session.Character.Level >= mate.Level) { Mate teammate = Session.Character.Mates.Where(s => s.IsTeamMember).FirstOrDefault(s => s.MateType == mate.MateType); if (teammate != null) { teammate.IsTeamMember = false; teammate.MapX = teammate.PositionX; teammate.MapY = teammate.PositionY; } mate.IsTeamMember = true; } else { Session.SendPacket(UserInterfaceHelper.GenerateMsg(Language.Instance.GetMessageFromKey("PET_HIGHER_LEVEL"), 0)); } } break; case 3: if (mate != null && Session.Character.Miniland == Session.Character.MapInstance) { mate.IsTeamMember = false; mate.MapX = mate.PositionX; mate.MapY = mate.PositionY; } break; case 4: if (mate != null) { if (Session.Character.Miniland == Session.Character.MapInstance) { mate.IsTeamMember = false; mate.MapX = mate.PositionX; mate.MapY = mate.PositionY; } else { Session.SendPacket($"qna #n_run^4^5^3^{mate.MateTransportId} {Language.Instance.GetMessageFromKey("ASK_KICK_PET")}"); } break; } break; case 5: if (mate != null) { Session.SendPacket(UserInterfaceHelper.GenerateDelay(3000, 10, $"#n_run^4^6^3^{mate.MateTransportId}")); } break; case 6: if (mate != null && Session.Character.Miniland != Session.Character.MapInstance) { mate.IsTeamMember = false; Session.CurrentMapInstance.Broadcast(mate.GenerateOut()); Session.SendPacket(Session.Character.GenerateSay(string.Format(Language.Instance.GetMessageFromKey("PET_KICKED"), mate.Name), 11)); Session.SendPacket(UserInterfaceHelper.GenerateMsg(string.Format(Language.Instance.GetMessageFromKey("PET_KICKED"), mate.Name), 0)); } break; case 7: if (mate != null) { if (Session.Character.Mates.Any(s => s.MateType == mate.MateType && s.IsTeamMember)) { Session.SendPacket(Session.Character.GenerateSay(Language.Instance.GetMessageFromKey("ALREADY_PET_IN_TEAM"), 11)); Session.SendPacket(UserInterfaceHelper.GenerateMsg(Language.Instance.GetMessageFromKey("ALREADY_PET_IN_TEAM"), 0)); } else { Session.SendPacket(UserInterfaceHelper.GenerateDelay(3000, 10, $"#n_run^4^9^3^{mate.MateTransportId}")); } } break; case 9: if (mate != null && Session.Character.Level >= mate.Level) { mate.PositionX = (short)(Session.Character.PositionX + (mate.MateType == MateType.Partner ? -1 : 1)); mate.PositionY = (short)(Session.Character.PositionY + 1); mate.IsTeamMember = true; Session.CurrentMapInstance?.Broadcast(mate.GenerateIn()); } else { Session.SendPacket(UserInterfaceHelper.GenerateMsg(Language.Instance.GetMessageFromKey("PET_HIGHER_LEVEL"), 0)); } break; } Session.SendPacket(Session.Character.GeneratePinit()); Session.SendPackets(Session.Character.GeneratePst()); break; case 10: Session.SendPacket("wopen 3 0"); break; case 12: Session.SendPacket($"wopen {packet.Type} 0"); break; case 14: Session.SendPacket("wopen 27 0"); string recipelist = "m_list 2"; if (npc != null) { List <Recipe> tps = npc.Recipes; recipelist = tps.Where(s => s.Amount > 0).Aggregate(recipelist, (current, s) => current + $" {s.ItemVNum}"); recipelist += " -100"; Session.SendPacket(recipelist); } break; case 15: if (npc != null) { if (packet.Value == 2) { Session.SendPacket($"qna #n_run^15^1^1^{npc.MapNpcId} {Language.Instance.GetMessageFromKey("ASK_CHANGE_SPAWNLOCATION")}"); } else { switch (npc.MapId) { case 1: Session.Character.SetRespawnPoint(1, 79, 116); break; case 20: Session.Character.SetRespawnPoint(20, 9, 92); break; case 145: Session.Character.SetRespawnPoint(145, 13, 110); break; } Session.SendPacket(UserInterfaceHelper.GenerateMsg(Language.Instance.GetMessageFromKey("RESPAWNLOCATION_CHANGED"), 0)); } } break; case 16: tp = npc?.Teleporters?.FirstOrDefault(s => s.Index == packet.Type); if (tp != null) { if (Session.Character.Gold >= 1000 * packet.Type) { Session.Character.Gold -= 1000 * packet.Type; Session.SendPacket(Session.Character.GenerateGold()); ServerManager.Instance.ChangeMap(Session.Character.CharacterId, tp.MapId, tp.MapX, tp.MapY); } else { Session.SendPacket(Session.Character.GenerateSay(Language.Instance.GetMessageFromKey("NOT_ENOUGH_MONEY"), 10)); } } break; case 17: double currentRunningSeconds = (DateTime.Now - Process.GetCurrentProcess().StartTime.AddSeconds(-50)).TotalSeconds; double timeSpanSinceLastPortal = currentRunningSeconds - Session.Character.LastPortal; if (!(timeSpanSinceLastPortal >= 4) || !Session.HasCurrentMapInstance || ServerManager.Instance.ChannelId == 51 || Session.CurrentMapInstance.MapInstanceId == ServerManager.Instance.ArenaInstance.MapInstanceId || Session.CurrentMapInstance.MapInstanceId == ServerManager.Instance.FamilyArenaInstance.MapInstanceId) { Session.SendPacket(Session.Character.GenerateSay(Language.Instance.GetMessageFromKey("CANT_MOVE"), 10)); return; } if (Session.Character.Gold >= 500 * (1 + packet.Type)) { Session.Character.LastPortal = currentRunningSeconds; Session.Character.Gold -= 500 * (1 + packet.Type); Session.SendPacket(Session.Character.GenerateGold()); MapCell pos = packet.Type == 0 ? ServerManager.Instance.ArenaInstance.Map.GetRandomPosition() : ServerManager.Instance.FamilyArenaInstance.Map.GetRandomPosition(); ServerManager.Instance.ChangeMapInstance(Session.Character.CharacterId, packet.Type == 0 ? ServerManager.Instance.ArenaInstance.MapInstanceId : ServerManager.Instance.FamilyArenaInstance.MapInstanceId, pos.X, pos.Y); } else { Session.SendPacket(Session.Character.GenerateSay(Language.Instance.GetMessageFromKey("NOT_ENOUGH_MONEY"), 10)); } break; case 18: Session.SendPacket(Session.Character.GenerateNpcDialog(17)); break; case 26: tp = npc?.Teleporters?.FirstOrDefault(s => s.Index == packet.Type); if (tp != null) { if (Session.Character.Gold >= 5000 * packet.Type) { Session.Character.Gold -= 5000 * packet.Type; ServerManager.Instance.ChangeMap(Session.Character.CharacterId, tp.MapId, tp.MapX, tp.MapY); } else { Session.SendPacket(Session.Character.GenerateSay(Language.Instance.GetMessageFromKey("NOT_ENOUGH_MONEY"), 10)); } } break; case 45: tp = npc?.Teleporters?.FirstOrDefault(s => s.Index == packet.Type); if (tp != null) { if (Session.Character.Gold >= 500) { Session.Character.Gold -= 500; Session.SendPacket(Session.Character.GenerateGold()); ServerManager.Instance.ChangeMap(Session.Character.CharacterId, tp.MapId, tp.MapX, tp.MapY); } else { Session.SendPacket(Session.Character.GenerateSay(Language.Instance.GetMessageFromKey("NOT_ENOUGH_MONEY"), 10)); } } break; case 132: tp = npc?.Teleporters?.FirstOrDefault(s => s.Index == packet.Type); if (tp != null) { ServerManager.Instance.ChangeMap(Session.Character.CharacterId, tp.MapId, tp.MapX, tp.MapY); } break; case 135: if (TalentArena.IsRunning) { TalentArena.RegisteredParticipants[Session.Character.CharacterId] = Session; Session.SendPacket(UserInterfaceHelper.GenerateBSInfo(0, 3, 300, 5)); } break; case 150: if (npc != null) { if (Session.Character.Family != null) { if (Session.Character.Family.LandOfDeath != null && npc.EffectActivated) { if (Session.Character.Level >= 55) { ServerManager.Instance.ChangeMapInstance(Session.Character.CharacterId, Session.Character.Family.LandOfDeath.MapInstanceId, 153, 145); } else { Session.SendPacket(UserInterfaceHelper.GenerateMsg(Language.Instance.GetMessageFromKey("LOD_REQUIERE_LVL"), 0)); } } else { Session.SendPacket(UserInterfaceHelper.GenerateMsg(Language.Instance.GetMessageFromKey("LOD_CLOSED"), 0)); } } else { Session.SendPacket(UserInterfaceHelper.GenerateMsg(Language.Instance.GetMessageFromKey("NEED_FAMILY"), 0)); } } break; case 301: tp = npc?.Teleporters?.FirstOrDefault(s => s.Index == packet.Type); if (tp != null) { ServerManager.Instance.ChangeMap(Session.Character.CharacterId, tp.MapId, tp.MapX, tp.MapY); } break; case 1600: Session.SendPacket(Session.Character.OpenFamilyWarehouse()); break; case 1601: Session.SendPackets(Session.Character.OpenFamilyWarehouseHist()); break; case 1602: if (Session.Character.Family?.FamilyLevel >= 3 && Session.Character.Family.WarehouseSize < 21) { if (Session.Character.FamilyCharacter.Authority == FamilyAuthority.Head) { if (500000 >= Session.Character.Gold) { Session.SendPacket(Session.Character.GenerateSay(Language.Instance.GetMessageFromKey("NOT_ENOUGH_MONEY"), 10)); return; } Session.Character.Family.WarehouseSize = 21; Session.Character.Gold -= 500000; Session.SendPacket(Session.Character.GenerateGold()); FamilyDTO fam = Session.Character.Family; DAOFactory.FamilyDAO.InsertOrUpdate(ref fam); ServerManager.Instance.FamilyRefresh(Session.Character.Family.FamilyId); } else { Session.SendPacket(Session.Character.GenerateSay(Language.Instance.GetMessageFromKey("ONLY_HEAD_CAN_BUY"), 10)); Session.SendPacket(UserInterfaceHelper.GenerateModal(Language.Instance.GetMessageFromKey("ONLY_HEAD_CAN_BUY"), 1)); } } break; case 1603: if (Session.Character.Family?.FamilyLevel >= 7 && Session.Character.Family.WarehouseSize < 49) { if (Session.Character.FamilyCharacter.Authority == FamilyAuthority.Head) { if (2000000 >= Session.Character.Gold) { Session.SendPacket(Session.Character.GenerateSay(Language.Instance.GetMessageFromKey("NOT_ENOUGH_MONEY"), 10)); return; } Session.Character.Family.WarehouseSize = 49; Session.Character.Gold -= 2000000; Session.SendPacket(Session.Character.GenerateGold()); FamilyDTO fam = Session.Character.Family; DAOFactory.FamilyDAO.InsertOrUpdate(ref fam); ServerManager.Instance.FamilyRefresh(Session.Character.Family.FamilyId); } else { Session.SendPacket(Session.Character.GenerateSay(Language.Instance.GetMessageFromKey("ONLY_HEAD_CAN_BUY"), 10)); Session.SendPacket(UserInterfaceHelper.GenerateModal(Language.Instance.GetMessageFromKey("ONLY_HEAD_CAN_BUY"), 1)); } } break; case 1604: if (Session.Character.Family?.FamilyLevel >= 5 && Session.Character.Family.MaxSize < 70) { if (Session.Character.FamilyCharacter.Authority == FamilyAuthority.Head) { if (5000000 >= Session.Character.Gold) { Session.SendPacket(Session.Character.GenerateSay(Language.Instance.GetMessageFromKey("NOT_ENOUGH_MONEY"), 10)); return; } Session.Character.Family.MaxSize = 70; Session.Character.Gold -= 5000000; Session.SendPacket(Session.Character.GenerateGold()); FamilyDTO fam = Session.Character.Family; DAOFactory.FamilyDAO.InsertOrUpdate(ref fam); ServerManager.Instance.FamilyRefresh(Session.Character.Family.FamilyId); } else { Session.SendPacket(Session.Character.GenerateSay(Language.Instance.GetMessageFromKey("ONLY_HEAD_CAN_BUY"), 10)); Session.SendPacket(UserInterfaceHelper.GenerateModal(Language.Instance.GetMessageFromKey("ONLY_HEAD_CAN_BUY"), 1)); } } break; case 1605: if (Session.Character.Family?.FamilyLevel >= 9 && Session.Character.Family.MaxSize < 100) { if (Session.Character.FamilyCharacter.Authority == FamilyAuthority.Head) { if (10000000 >= Session.Character.Gold) { Session.SendPacket(Session.Character.GenerateSay(Language.Instance.GetMessageFromKey("NOT_ENOUGH_MONEY"), 10)); return; } Session.Character.Family.MaxSize = 100; Session.Character.Gold -= 10000000; Session.SendPacket(Session.Character.GenerateGold()); FamilyDTO fam = Session.Character.Family; DAOFactory.FamilyDAO.InsertOrUpdate(ref fam); ServerManager.Instance.FamilyRefresh(Session.Character.Family.FamilyId); } else { Session.SendPacket(Session.Character.GenerateSay(Language.Instance.GetMessageFromKey("ONLY_HEAD_CAN_BUY"), 10)); Session.SendPacket(UserInterfaceHelper.GenerateModal(Language.Instance.GetMessageFromKey("ONLY_HEAD_CAN_BUY"), 1)); } } break; case 23: if (packet.Type == 0) { if (Session.Character.Group?.CharacterCount == 3) { foreach (ClientSession s in Session.Character.Group.Characters.GetAllItems()) { if (s.Character.Family != null) { Session.SendPacket(UserInterfaceHelper.GenerateInfo(Language.Instance.GetMessageFromKey("GROUP_MEMBER_ALREADY_IN_FAMILY"))); return; } } } if (Session.Character.Group == null || Session.Character.Group.CharacterCount != 3) { Session.SendPacket(UserInterfaceHelper.GenerateInfo(Language.Instance.GetMessageFromKey("FAMILY_GROUP_NOT_FULL"))); return; } Session.SendPacket(UserInterfaceHelper.GenerateInbox($"#glmk^ {14} 1 {Language.Instance.GetMessageFromKey("CREATE_FAMILY").Replace(' ', '^')}")); } else { if (Session.Character.Family == null) { Session.SendPacket(UserInterfaceHelper.GenerateInfo(Language.Instance.GetMessageFromKey("NOT_IN_FAMILY"))); return; } if (Session.Character.Family != null && Session.Character.FamilyCharacter != null && Session.Character.FamilyCharacter.Authority != FamilyAuthority.Head) { Session.SendPacket(UserInterfaceHelper.GenerateInfo(Language.Instance.GetMessageFromKey("NOT_FAMILY_HEAD"))); return; } Session.SendPacket($"qna #glrm^1 {Language.Instance.GetMessageFromKey("DISMISS_FAMILY")}"); } break; case 60: StaticBonusDTO medal = Session.Character.StaticBonusList.Find(s => s.StaticBonusType == StaticBonusType.BazaarMedalGold || s.StaticBonusType == StaticBonusType.BazaarMedalSilver); byte Medal = 0; int Time = 0; if (medal != null) { Medal = medal.StaticBonusType == StaticBonusType.BazaarMedalGold ? (byte)MedalType.Gold : (byte)MedalType.Silver; Time = (int)(medal.DateEnd - DateTime.Now).TotalHours; } Session.SendPacket($"wopen 32 {Medal} {Time}"); break; case 5002: tp = npc?.Teleporters?.FirstOrDefault(s => s.Index == packet.Type); if (tp != null) { //Session.SendPacket("it 3"); if (ServerManager.Instance.ChannelId == 51) { string connection = CommunicationServiceClient.Instance.RetrieveOriginWorld(Session.Account.AccountId); if (string.IsNullOrWhiteSpace(connection)) { return; } Session.Character.MapId = tp.MapId; Session.Character.MapX = tp.MapX; Session.Character.MapY = tp.MapY; int port = Convert.ToInt32(connection.Split(':')[1]); Session.Character.ChangeChannel(connection.Split(':')[0], port, 3); } else { ServerManager.Instance.ChangeMap(Session.Character.CharacterId, tp.MapId, tp.MapX, tp.MapY); } } break; case 5001: if (npc != null) { MapInstance map = null; switch (Session.Character.Faction) { case FactionType.None: Session.SendPacket(UserInterfaceHelper.GenerateInfo("You need to be part of a faction to join Act 4")); return; case FactionType.Angel: map = ServerManager.GetAllMapInstances().Find(s => s.MapInstanceType.Equals(MapInstanceType.Act4ShipAngel)); break; case FactionType.Demon: map = ServerManager.GetAllMapInstances().Find(s => s.MapInstanceType.Equals(MapInstanceType.Act4ShipDemon)); break; } if (map == null || npc.EffectActivated) { Session.SendPacket(UserInterfaceHelper.GenerateMsg(Language.Instance.GetMessageFromKey("SHIP_NOTARRIVED"), 0)); return; } if (3000 > Session.Character.Gold) { Session.SendPacket(Session.Character.GenerateSay(Language.Instance.GetMessageFromKey("NOT_ENOUGH_MONEY"), 10)); return; } Session.Character.Gold -= 3000; MapCell pos = map.Map.GetRandomPosition(); ServerManager.Instance.ChangeMapInstance(Session.Character.CharacterId, map.MapInstanceId, pos.X, pos.Y); } break; case 5004: if (npc != null) { ServerManager.Instance.ChangeMap(Session.Character.CharacterId, 145, 50, 41); } break; case 5011: if (npc != null) { ServerManager.Instance.ChangeMap(Session.Character.CharacterId, 170, 127, 46); } break; case 5012: tp = npc?.Teleporters?.FirstOrDefault(s => s.Index == packet.Type); if (tp != null) { ServerManager.Instance.ChangeMap(Session.Character.CharacterId, tp.MapId, tp.MapX, tp.MapY); } break; default: Logger.Warn(string.Format(Language.Instance.GetMessageFromKey("NO_NRUN_HANDLER"), packet.Runner)); 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 (packetsplit == null) { return; } int x1; switch (Effect) { case 11: if (int.TryParse(packetsplit[3], out x1)) { Mate mate = session.Character.Mates.FirstOrDefault(s => s.MateTransportId == x1); if (mate == null || mate.Level >= session.Character.Level - 5) { return; } mate.Level++; session.Character.Inventory.RemoveItemAmount(inv.ItemVNum); session.CurrentMapInstance?.Broadcast(mate.GenerateEff(8), mate.PositionX, mate.PositionY); session.CurrentMapInstance?.Broadcast(mate.GenerateEff(198), mate.PositionX, mate.PositionY); } break; case 13: if (int.TryParse(packetsplit[3], out x1)) { if (session.Character.Mates.Any(s => s.MateTransportId == x1)) { session.SendPacket(UserInterfaceHelper.Instance.GenerateGuri(10, 1, x1, 2)); } } break; case 14: if (int.TryParse(packetsplit[3], out x1)) { Mate mate = session.Character.Mates.FirstOrDefault(s => s.MateTransportId == x1 && s.MateType == MateType.Pet); if (mate != null) { if (!mate.CanPickUp) { session.Character.Inventory.RemoveItemAmount(inv.ItemVNum); session.CurrentMapInstance.Broadcast(mate.GenerateEff(5)); session.CurrentMapInstance.Broadcast(mate.GenerateEff(5002)); mate.CanPickUp = true; session.SendPackets(session.Character.GenerateScP()); session.SendPacket(session.Character.GenerateSay(Language.Instance.GetMessageFromKey("PET_CAN_PICK_UP"), 10)); } } } break; case 17: if (int.TryParse(packetsplit[3], out x1)) { Mate mate = session.Character.Mates.FirstOrDefault(s => s.MateTransportId == x1); if (mate != null) { if (!mate.IsSummonable) { session.Character.Inventory.RemoveItemAmount(inv.ItemVNum, 1); 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)); } } } break; case 1000: if (int.TryParse(packetsplit[3], out x1)) { Mate mate = session.Character.Mates.FirstOrDefault(s => s.MateTransportId == x1 && s.MateType == MateType.Pet); 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.Character.Inventory.RemoveItemAmountFromInventory(1, inv.Id); session.CurrentMapInstance?.Broadcast(mate.GenerateOut()); } else { session.SendPacket(UserInterfaceHelper.Instance.GenerateMsg(Language.Instance.GetMessageFromKey("PET_IN_TEAM_UNRELEASABLE"), 0)); } } } break; case 1001: if (int.TryParse(packetsplit[3], out x1)) { Mate mate = session.Character.Mates.FirstOrDefault(s => s.MateTransportId == x1 && s.MateType == MateType.Partner); 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.Character.Inventory.RemoveItemAmountFromInventory(1, inv.Id); session.CurrentMapInstance?.Broadcast(mate.GenerateOut()); } else { session.SendPacket(UserInterfaceHelper.Instance.GenerateMsg(Language.Instance.GetMessageFromKey("PET_IN_TEAM_UNRELEASABLE"), 0)); } } } break; default: Logger.Log.Warn(string.Format(Language.Instance.GetMessageFromKey("NO_HANDLER_ITEM"), GetType())); break; } }
private static void Sync(ClientSession session) { for (session.Character.MaxFood = 0; session.Character.MaxFood < 5; session.Character.MaxFood++) { if (session.Character.Hp <= 0 || !session.Character.IsSitting) { _regenerateDisposable?.Dispose(); session.Character.FoodAmount = 0; session.Character.FoodHp = 0; session.Character.FoodMp = 0; return; } int hpLoad = (int)session.Character.HPLoad(); int mpLoad = (int)session.Character.MPLoad(); double buffRc = session.Character.GetBuff(BCardType.CardType.LeonaPassiveSkill, (byte)AdditionalTypes.LeonaPassiveSkill.IncreaseRecoveryItems)[0] / 100D; int hpAmount = session.Character.FoodHp + (int)(session.Character.FoodHp * buffRc); int mpAmount = session.Character.FoodMp + (int)(session.Character.FoodMp * buffRc); if (session.Character.Hp + hpAmount > hpLoad) { hpAmount = hpLoad - session.Character.Hp; } if (session.Character.Mp + mpAmount > mpLoad) { mpAmount = mpLoad - session.Character.Mp; } bool convertRecoveryToDamage = ServerManager.RandomNumber() < session.Character.GetBuff(BCardType.CardType.DarkCloneSummon, (byte)AdditionalTypes.DarkCloneSummon.ConvertRecoveryToDamage)[0]; if (convertRecoveryToDamage) { session.Character.Hp -= hpAmount; if (session.Character.Hp < 1) { session.Character.Hp = 1; } if (hpAmount > 0) { session.CurrentMapInstance?.Broadcast(session, session.Character.GenerateDm(hpAmount)); } } else { session.Character.Hp += hpAmount; if (hpAmount > 0) { session.CurrentMapInstance?.Broadcast(session, session.Character.GenerateRc(hpAmount)); } } session.Character.Mp += mpAmount; foreach (Mate mate in session.Character.Mates.Where(s => s.IsTeamMember && s.IsAlive && s.IsSitting)) { hpLoad = mate.HpLoad(); mpLoad = mate.MpLoad(); hpAmount = session.Character.FoodHp; mpAmount = session.Character.FoodMp; if (mate.Hp + hpAmount > hpLoad) { hpAmount = hpLoad - (int)mate.Hp; } if (mate.Mp + mpAmount > mpLoad) { mpAmount = mpLoad - (int)mate.Mp; } mate.Hp += hpAmount; mate.Mp += mpAmount; if (hpAmount > 0) { session.CurrentMapInstance?.Broadcast(session, mate.GenerateRc(hpAmount)); } } if (session.IsConnected) { session.SendPacket(session.Character.GenerateStat()); if (session.Character.Mates.Any(m => m.IsTeamMember && m.IsAlive && m.IsSitting)) { session.SendPackets(session.Character.GeneratePst()); } Thread.Sleep(1800); } } }
public override void Use(ClientSession session, ref ItemInstance inv, byte Option = 0, string[] packetsplit = null) { if (session.Character.IsVehicled && Effect != 888) { session.SendPacket(session.Character.GenerateSay(Language.Instance.GetMessageFromKey("CANT_DO_VEHICLED"), 10)); return; } if (inv.ItemVNum == 333 || inv.ItemVNum == 334) // Sealed Jajamaru Specialist Card & Sealed Princess Sakura Bead { return; } switch (Effect) { case 0: if (Option == 0) { if (packetsplit?.Length == 9) { ItemInstance box = session.Character.Inventory.LoadBySlotAndType(inv.Slot, InventoryType.Equipment); if (box != null) { if (box.Item.ItemSubType == 3) { session.SendPacket($"qna #guri^300^8023^{inv.Slot} {Language.Instance.GetMessageFromKey("ASK_OPEN_BOX")}"); } else if (box.HoldingVNum == 0) { session.SendPacket($"qna #guri^300^8023^{inv.Slot}^{packetsplit[3]} {Language.Instance.GetMessageFromKey("ASK_STORE_PET")}"); } else { session.SendPacket($"qna #guri^300^8023^{inv.Slot} {Language.Instance.GetMessageFromKey("ASK_RELEASE_PET")}"); } } } } else { //u_i 2 2000000 0 21 0 0 ItemInstance box = session.Character.Inventory.LoadBySlotAndType(inv.Slot, InventoryType.Equipment); if (box != null) { if (box.Item.ItemSubType == 3) { List <RollGeneratedItemDTO> roll = box.Item.RollGeneratedItems.Where(s => s.MinimumOriginalItemRare <= box.Rare && s.MaximumOriginalItemRare >= box.Rare && s.OriginalItemDesign == box.Design).ToList(); int probabilities = roll.Sum(s => s.Probability); int rnd = ServerManager.RandomNumber(0, probabilities); int currentrnd = 0; foreach (RollGeneratedItemDTO rollitem in roll.OrderBy(s => ServerManager.RandomNumber())) { currentrnd += rollitem.Probability; if (currentrnd >= rnd) { Item i = ServerManager.GetItem(rollitem.ItemGeneratedVNum); sbyte rare = 0; byte upgrade = 0; if (i.ItemType == ItemType.Armor || i.ItemType == ItemType.Weapon || i.ItemType == ItemType.Shell || i.ItemType == ItemType.Box) { rare = box.Rare; } if (i.ItemType == ItemType.Shell) { if (rare < 1) { rare = 1; } else if (rare > 7) { rare = 7; } upgrade = (byte)ServerManager.RandomNumber(50, 81); } if (rollitem.IsRareRandom) { rnd = ServerManager.RandomNumber(0, 100); for (int j = ItemHelper.RareRate.Length - 1; j >= 0; j--) { if (rnd < ItemHelper.RareRate[j]) { rare = (sbyte)j; break; } } if (rare < 1) { rare = 1; } } session.Character.GiftAdd(rollitem.ItemGeneratedVNum, rollitem.ItemGeneratedAmount, (byte)rare, upgrade, rollitem.ItemGeneratedDesign); session.SendPacket($"rdi {rollitem.ItemGeneratedVNum} {rollitem.ItemGeneratedAmount}"); session.Character.Inventory.RemoveItemFromInventory(box.Id); return; } } } else if (box.HoldingVNum == 0) { if (packetsplit.Length == 1 && int.TryParse(packetsplit[0], out int PetId) && session.Character.Mates.Find(s => s.MateTransportId == PetId) is Mate mate) { if (ItemSubType == 0 && mate.MateType != MateType.Pet || ItemSubType == 1 && mate.MateType != MateType.Partner) { return; } if (mate.MateType == MateType.Partner && mate.GetInventory().Count > 0) { session.SendPacket(UserInterfaceHelper.GenerateMsg(Language.Instance.GetMessageFromKey("EQ_NOT_EMPTY"), 0)); return; } box.HoldingVNum = mate.NpcMonsterVNum; box.SpLevel = mate.Level; box.SpDamage = mate.Attack; box.SpDefence = mate.Defence; session.Character.Mates.Remove(mate); if (mate.MateType == MateType.Partner) { 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_STORED"))); session.SendPacket(UserInterfaceHelper.GeneratePClear()); session.SendPackets(session.Character.GenerateScP()); session.SendPackets(session.Character.GenerateScN()); session.CurrentMapInstance?.Broadcast(mate.GenerateOut()); } } else { NpcMonster heldMonster = ServerManager.GetNpcMonster(box.HoldingVNum); if (heldMonster != null) { Mate mate = new Mate(session.Character, heldMonster, box.SpLevel, ItemSubType == 0 ? MateType.Pet : MateType.Partner) { Attack = box.SpDamage, Defence = box.SpDefence }; if (session.Character.AddPet(mate)) { session.Character.Inventory.RemoveItemFromInventory(inv.Id); session.SendPacket(UserInterfaceHelper.GenerateInfo(Language.Instance.GetMessageFromKey("PET_LEAVE_BEAD"))); } } } } } break; case 1: if (Option == 0) { session.SendPacket($"qna #guri^300^8023^{inv.Slot} {Language.Instance.GetMessageFromKey("ASK_RELEASE_PET")}"); } else { NpcMonster heldMonster = ServerManager.GetNpcMonster((short)EffectValue); if (session.CurrentMapInstance == session.Character.Miniland && heldMonster != null) { Mate mate = new Mate(session.Character, heldMonster, LevelMinimum, ItemSubType == 1 ? MateType.Partner : MateType.Pet); if (session.Character.AddPet(mate)) { session.Character.Inventory.RemoveItemFromInventory(inv.Id); session.SendPacket(UserInterfaceHelper.GenerateInfo(Language.Instance.GetMessageFromKey("PET_LEAVE_BEAD"))); } } else { session.SendPacket(session.Character.GenerateSay(Language.Instance.GetMessageFromKey("NOT_IN_MINILAND"), 12)); } } break; case 69: if (EffectValue == 1 || EffectValue == 2) { ItemInstance box = session.Character.Inventory.LoadBySlotAndType(inv.Slot, InventoryType.Equipment); if (box != null) { if (box.HoldingVNum == 0) { session.SendPacket($"wopen 44 {inv.Slot}"); } else { List <ItemInstance> newInv = session.Character.Inventory.AddNewToInventory(box.HoldingVNum); if (newInv.Count > 0) { ItemInstance itemInstance = newInv[0]; ItemInstance specialist = session.Character.Inventory.LoadBySlotAndType(itemInstance.Slot, itemInstance.Type); if (specialist != null) { specialist.SlDamage = box.SlDamage; specialist.SlDefence = box.SlDefence; specialist.SlElement = box.SlElement; specialist.SlHP = box.SlHP; specialist.SpDamage = box.SpDamage; specialist.SpDark = box.SpDark; specialist.SpDefence = box.SpDefence; specialist.SpElement = box.SpElement; specialist.SpFire = box.SpFire; specialist.SpHP = box.SpHP; specialist.SpLevel = box.SpLevel; specialist.SpLight = box.SpLight; specialist.SpStoneUpgrade = box.SpStoneUpgrade; specialist.SpWater = box.SpWater; specialist.Upgrade = box.Upgrade; specialist.EquipmentSerialId = box.EquipmentSerialId; specialist.XP = box.XP; } short Slot = inv.Slot; if (Slot != -1) { if (specialist != null) { session.SendPacket(session.Character.GenerateSay($"{Language.Instance.GetMessageFromKey("ITEM_ACQUIRED")} {specialist.Item.Name} + {specialist.Upgrade}", 12)); newInv.ForEach(s => session.SendPacket(specialist.GenerateInventoryAdd())); } session.Character.Inventory.RemoveItemFromInventory(box.Id); } } else { session.SendPacket(UserInterfaceHelper.GenerateMsg(Language.Instance.GetMessageFromKey("NOT_ENOUGH_PLACE"), 0)); } } } } if (EffectValue == 3) { ItemInstance box = session.Character.Inventory.LoadBySlotAndType(inv.Slot, InventoryType.Equipment); if (box != null) { if (box.HoldingVNum == 0) { session.SendPacket($"guri 26 0 {inv.Slot}"); } else { List <ItemInstance> newInv = session.Character.Inventory.AddNewToInventory(box.HoldingVNum); if (newInv.Count > 0) { ItemInstance itemInstance = newInv[0]; ItemInstance fairy = session.Character.Inventory.LoadBySlotAndType(itemInstance.Slot, itemInstance.Type); if (fairy != null) { fairy.ElementRate = box.ElementRate; } short Slot = inv.Slot; if (Slot != -1) { if (fairy != null) { session.SendPacket(session.Character.GenerateSay($"{Language.Instance.GetMessageFromKey("ITEM_ACQUIRED")} {fairy.Item.Name} ({fairy.ElementRate}%)", 12)); newInv.ForEach(s => session.SendPacket(fairy.GenerateInventoryAdd())); } session.Character.Inventory.RemoveItemFromInventory(box.Id); } } else { session.SendPacket(UserInterfaceHelper.GenerateMsg(Language.Instance.GetMessageFromKey("NOT_ENOUGH_PLACE"), 0)); } } } } if (EffectValue == 4) { ItemInstance box = session.Character.Inventory.LoadBySlotAndType(inv.Slot, InventoryType.Equipment); if (box != null) { if (box.HoldingVNum == 0) { session.SendPacket($"guri 24 0 {inv.Slot}"); } else { List <ItemInstance> newInv = session.Character.Inventory.AddNewToInventory(box.HoldingVNum); if (newInv.Count > 0) { short Slot = inv.Slot; if (Slot != -1) { session.SendPacket(session.Character.GenerateSay($"{Language.Instance.GetMessageFromKey("ITEM_ACQUIRED")} {newInv[0].Item.Name} x 1)", 12)); newInv.ForEach(s => session.SendPacket(s.GenerateInventoryAdd())); session.Character.Inventory.RemoveItemFromInventory(box.Id); } } else { session.SendPacket(UserInterfaceHelper.GenerateMsg(Language.Instance.GetMessageFromKey("NOT_ENOUGH_PLACE"), 0)); } } } } if (EffectValue == 5) { ItemInstance box = session.Character.Inventory.LoadBySlotAndType(inv.Slot, InventoryType.Equipment); if (box != null) { if (box.HoldingVNum == 0) { session.SendPacket($"guri 24 0 {inv.Slot}"); } else { List <ItemInstance> newInv = session.Character.Inventory.AddNewToInventory(box.HoldingVNum); if (newInv.Count > 0) { short Slot = inv.Slot; if (Slot != -1) { session.SendPacket(session.Character.GenerateSay($"{Language.Instance.GetMessageFromKey("ITEM_ACQUIRED")} {newInv[0].Item.Name} x 1)", 12)); newInv.ForEach(s => session.SendPacket(s.GenerateInventoryAdd())); session.Character.Inventory.RemoveItemFromInventory(box.Id); } } else { session.SendPacket(UserInterfaceHelper.GenerateMsg(Language.Instance.GetMessageFromKey("NOT_ENOUGH_PLACE"), 0)); } } } } break; case 888: if (session.Character.IsVehicled) { if (!session.Character.Buff.Any(s => s.Card.CardId == 336)) { if (inv.ItemDeleteTime == null) { inv.ItemDeleteTime = DateTime.Now.AddHours(LevelMinimum); } session.Character.VehicleItem.BCards.ForEach(s => s.ApplyBCards(session.Character.BattleEntity, session.Character.BattleEntity)); session.CurrentMapInstance.Broadcast($"eff 1 {session.Character.CharacterId} 885"); } } break; case 4801: break; default: Logger.Warn(string.Format(Language.Instance.GetMessageFromKey("NO_HANDLER_ITEM"), GetType(), VNum, Effect, EffectValue)); break; } }
public static void NRun(ClientSession Session, NRunPacket packet) { if (!Session.HasCurrentMapInstance) { return; } MapNpc npc = Session.CurrentMapInstance.Npcs.FirstOrDefault(s => s.MapNpcId == packet.NpcId); switch (packet.Runner) { case 1: if (Session.Character.Class != (byte)ClassType.Adventurer) { Session.SendPacket(UserInterfaceHelper.Instance.GenerateMsg(Language.Instance.GetMessageFromKey("NOT_ADVENTURER"), 0)); return; } if (Session.Character.Level < 15 || Session.Character.JobLevel < 20) { Session.SendPacket(UserInterfaceHelper.Instance.GenerateMsg(Language.Instance.GetMessageFromKey("LOW_LVL"), 0)); return; } if (packet.Type == (byte)Session.Character.Class) { return; } if (Session.Character.Inventory.GetAllItems().All(i => i.Type != InventoryType.Wear)) { Session.Character.Inventory.AddNewToInventory((short)(4 + packet.Type * 14), type: InventoryType.Wear); Session.Character.Inventory.AddNewToInventory((short)(81 + packet.Type * 13), type: InventoryType.Wear); switch (packet.Type) { case 1: Session.Character.Inventory.AddNewToInventory(68, type: InventoryType.Wear); Session.Character.Inventory.AddNewToInventory(2082, 10); break; case 2: Session.Character.Inventory.AddNewToInventory(78, type: InventoryType.Wear); Session.Character.Inventory.AddNewToInventory(2083, 10); break; case 3: Session.Character.Inventory.AddNewToInventory(86, type: InventoryType.Wear); break; } Session.CurrentMapInstance?.Broadcast(Session.Character.GenerateEq()); Session.SendPacket(Session.Character.GenerateEquipment()); Session.Character.ChangeClass((ClassType)packet.Type); } else { Session.SendPacket(UserInterfaceHelper.Instance.GenerateMsg(Language.Instance.GetMessageFromKey("EQ_NOT_EMPTY"), 0)); } break; case 2: Session.SendPacket("wopen 1 0"); break; case 4: Mate mate = Session.Character.Mates.FirstOrDefault(s => s.MateTransportId == packet.NpcId); switch (packet.Type) { case 2: if (mate != null) { if (Session.Character.Level >= mate.Level) { Mate teammate = Session.Character.Mates.Where(s => s.IsTeamMember).FirstOrDefault(s => s.MateType == mate.MateType); if (teammate != null) { teammate.IsTeamMember = false; teammate.MapX = teammate.PositionX; teammate.MapY = teammate.PositionY; } mate.IsTeamMember = true; } else { Session.SendPacket(UserInterfaceHelper.Instance.GenerateMsg(Language.Instance.GetMessageFromKey("PET_HIGHER_LEVEL"), 0)); } } break; case 3: if (mate != null && Session.Character.Miniland == Session.Character.MapInstance) { mate.IsTeamMember = false; mate.MapX = mate.PositionX; mate.MapY = mate.PositionY; } break; case 4: if (mate != null) { if (Session.Character.Miniland == Session.Character.MapInstance) { mate.IsTeamMember = false; mate.MapX = mate.PositionX; mate.MapY = mate.PositionY; } else { Session.SendPacket($"qna #n_run^4^5^3^{mate.MateTransportId} {Language.Instance.GetMessageFromKey("ASK_KICK_PET")}"); } break; } break; case 5: if (mate != null) { Session.SendPacket(UserInterfaceHelper.Instance.GenerateDelay(3000, 10, $"#n_run^4^6^3^{mate.MateTransportId}")); } break; case 6: if (mate != null) { if (Session.Character.Miniland != Session.Character.MapInstance) { mate.IsTeamMember = false; Session.CurrentMapInstance.Broadcast(mate.GenerateOut()); Session.SendPacket(Session.Character.GenerateSay(string.Format(Language.Instance.GetMessageFromKey("PET_KICKED"), mate.Name), 11)); Session.SendPacket(UserInterfaceHelper.Instance.GenerateMsg(string.Format(Language.Instance.GetMessageFromKey("PET_KICKED"), mate.Name), 0)); } } break; case 7: if (mate != null) { if (Session.Character.Mates.Any(s => s.MateType == mate.MateType && s.IsTeamMember)) { Session.SendPacket(Session.Character.GenerateSay(Language.Instance.GetMessageFromKey("ALREADY_PET_IN_TEAM"), 11)); Session.SendPacket(UserInterfaceHelper.Instance.GenerateMsg(Language.Instance.GetMessageFromKey("ALREADY_PET_IN_TEAM"), 0)); } else { Session.SendPacket(UserInterfaceHelper.Instance.GenerateDelay(3000, 10, $"#n_run^4^9^3^{mate.MateTransportId}")); } } break; case 9: if (mate != null) { if (Session.Character.Level >= mate.Level) { mate.PositionX = (short)(Session.Character.PositionX + 1); } mate.PositionY = (short)(Session.Character.PositionY + 1); mate.IsTeamMember = true; Session.CurrentMapInstance.Broadcast(mate.GenerateIn()); } else { Session.SendPacket(UserInterfaceHelper.Instance.GenerateMsg(Language.Instance.GetMessageFromKey("PET_HIGHER_LEVEL"), 0)); } break; } Session.SendPacket(Session.Character.GeneratePinit()); Session.Character.SendPst(); break; case 10: Session.SendPacket("wopen 3 0"); break; case 12: Session.SendPacket($"wopen {packet.Type} 0"); break; case 14: Session.SendPacket("wopen 27 0"); string recipelist = "m_list 2"; if (npc != null) { List <Recipe> tp = npc.Recipes; foreach (Recipe s in tp) { if (s.Amount > 0) { recipelist = recipelist + $" {s.ItemVNum}"; } } recipelist += " -100"; Session.SendPacket(recipelist); } break; case 15: if (npc != null) { if (packet.Value == 2) { Session.SendPacket($"qna #n_run^15^1^1^{npc.MapNpcId} {Language.Instance.GetMessageFromKey("ASK_CHANGE_SPAWNLOCATION")}"); } else { switch (npc.MapId) { case 1: Session.Character.SetRespawnPoint(1, 79, 116); break; case 20: Session.Character.SetRespawnPoint(20, 9, 92); break; case 145: Session.Character.SetRespawnPoint(145, 13, 110); break; } Session.SendPacket(UserInterfaceHelper.Instance.GenerateMsg(Language.Instance.GetMessageFromKey("RESPAWNLOCATION_CHANGED"), 0)); } } break; case 16: if (npc != null) { TeleporterDTO tp = npc.Teleporters?.FirstOrDefault(s => s.Index == packet.Type); if (tp != null) { if (Session.Character.Gold >= 1000 * packet.Type) { Session.Character.Gold -= 1000 * packet.Type; Session.SendPacket(Session.Character.GenerateGold()); ServerManager.Instance.ChangeMap(Session.Character.CharacterId, tp.MapId, tp.MapX, tp.MapY); } else { Session.SendPacket(Session.Character.GenerateSay(Language.Instance.GetMessageFromKey("NOT_ENOUGH_MONEY"), 10)); } } } break; case 17: double currentRunningSeconds = (DateTime.Now - Process.GetCurrentProcess().StartTime.AddSeconds(-50)).TotalSeconds; double timeSpanSinceLastPortal = currentRunningSeconds - Session.Character.LastPortal; if (!(timeSpanSinceLastPortal >= 4) || !Session.HasCurrentMapInstance) { Session.SendPacket(Session.Character.GenerateSay(Language.Instance.GetMessageFromKey("CANT_MOVE"), 10)); return; } if (Session.Character.Raid != null && Session.Character.Raid.Launched) { Session.SendPacket(Session.Character.GenerateSay("Vous n'avez pas le droit d'aller à l'arène une fois en raid", 10)); // french in source? nou! break; } if (Session.Character.Gold >= 500 * (1 + packet.Type)) { Session.Character.LastPortal = currentRunningSeconds; Session.Character.Gold -= 500 * (1 + packet.Type); Session.SendPacket(Session.Character.GenerateGold()); ServerManager.Instance.ChangeMapInstance(Session.Character.CharacterId, packet.Type == 0 ? ServerManager.Instance.ArenaInstance.MapInstanceId : ServerManager.Instance.FamilyArenaInstance.MapInstanceId, packet.Type == 0 ? ServerManager.Instance.ArenaInstance.Map.GetRandomPosition().X : ServerManager.Instance.FamilyArenaInstance.Map.GetRandomPosition().X, packet.Type == 0 ? ServerManager.Instance.ArenaInstance.Map.GetRandomPosition().Y : ServerManager.Instance.FamilyArenaInstance.Map.GetRandomPosition().Y); } else { Session.SendPacket(Session.Character.GenerateSay(Language.Instance.GetMessageFromKey("NOT_ENOUGH_MONEY"), 10)); } break; case 18: Session.SendPacket(Session.Character.GenerateNpcDialog(17)); break; case 26: if (npc != null) { TeleporterDTO tp = npc.Teleporters?.FirstOrDefault(s => s.Index == packet.Type); if (tp != null) { if (Session.Character.Gold >= 5000 * packet.Type) { Session.Character.Gold -= 5000 * packet.Type; ServerManager.Instance.ChangeMap(Session.Character.CharacterId, tp.MapId, tp.MapX, tp.MapY); } else { Session.SendPacket(Session.Character.GenerateSay(Language.Instance.GetMessageFromKey("NOT_ENOUGH_MONEY"), 10)); } } } break; case 45: if (npc != null) { TeleporterDTO tp = npc.Teleporters?.FirstOrDefault(s => s.Index == packet.Type); if (tp != null) { if (Session.Character.Gold >= 500) { Session.Character.Gold -= 500; Session.SendPacket(Session.Character.GenerateGold()); ServerManager.Instance.ChangeMap(Session.Character.CharacterId, tp.MapId, tp.MapX, tp.MapY); } else { Session.SendPacket(Session.Character.GenerateSay(Language.Instance.GetMessageFromKey("NOT_ENOUGH_MONEY"), 10)); } } } break; case 132: if (npc != null) { TeleporterDTO tp = npc.Teleporters?.FirstOrDefault(s => s.Index == packet.Type); if (tp != null) { ServerManager.Instance.ChangeMap(Session.Character.CharacterId, tp.MapId, tp.MapX, tp.MapY); } } break; case 150: if (npc != null) { if (Session.Character.Family != null) { if (Session.Character.Family.LandOfDeath != null && !npc.EffectActivated) { if (Session.Character.Level >= 55) { ServerManager.Instance.ChangeMapInstance(Session.Character.CharacterId, Session.Character.Family.LandOfDeath.MapInstanceId, 153, 145); } else { Session.SendPacket(UserInterfaceHelper.Instance.GenerateMsg(Language.Instance.GetMessageFromKey("LOD_REQUIERE_LVL"), 0)); } } else { Session.SendPacket(UserInterfaceHelper.Instance.GenerateMsg(Language.Instance.GetMessageFromKey("LOD_CLOSED"), 0)); } } else { Session.SendPacket(UserInterfaceHelper.Instance.GenerateMsg(Language.Instance.GetMessageFromKey("NEED_FAMILY"), 0)); } } break; case 301: if (npc != null) { TeleporterDTO tp = npc.Teleporters?.FirstOrDefault(s => s.Index == packet.Type); if (tp != null) { ServerManager.Instance.ChangeMap(Session.Character.CharacterId, tp.MapId, tp.MapX, tp.MapY); } } break; case 1600: Session.SendPacket(Session.Character.OpenFamilyWarehouse()); break; case 1601: Session.SendPackets(Session.Character.OpenFamilyWarehouseHist()); break; case 1602: if (Session.Character.Family != null && Session.Character.Family.FamilyLevel >= 3 && Session.Character.Family.WarehouseSize < 21) { if (Session.Character.FamilyCharacter.Authority == FamilyAuthority.Head) { if (500000 >= Session.Character.Gold) { Session.SendPacket(Session.Character.GenerateSay(Language.Instance.GetMessageFromKey("NOT_ENOUGH_MONEY"), 10)); return; } Session.Character.Family.WarehouseSize = 21; Session.Character.Gold -= 500000; Session.SendPacket(Session.Character.GenerateGold()); FamilyDTO fam = Session.Character.Family; DAOFactory.FamilyDAO.InsertOrUpdate(ref fam); ServerManager.Instance.FamilyRefresh(Session.Character.Family.FamilyId); } else { Session.SendPacket(Session.Character.GenerateSay(Language.Instance.GetMessageFromKey("ONLY_HEAD_CAN_BUY"), 10)); Session.SendPacket(UserInterfaceHelper.Instance.GenerateModal(Language.Instance.GetMessageFromKey("ONLY_HEAD_CAN_BUY"), 1)); } } break; case 1603: if (Session.Character.Family != null && Session.Character.Family.FamilyLevel >= 7 && Session.Character.Family.WarehouseSize < 49) { if (Session.Character.FamilyCharacter.Authority == FamilyAuthority.Head) { if (2000000 >= Session.Character.Gold) { Session.SendPacket(Session.Character.GenerateSay(Language.Instance.GetMessageFromKey("NOT_ENOUGH_MONEY"), 10)); return; } Session.Character.Family.WarehouseSize = 49; Session.Character.Gold -= 2000000; Session.SendPacket(Session.Character.GenerateGold()); FamilyDTO fam = Session.Character.Family; DAOFactory.FamilyDAO.InsertOrUpdate(ref fam); ServerManager.Instance.FamilyRefresh(Session.Character.Family.FamilyId); } else { Session.SendPacket(Session.Character.GenerateSay(Language.Instance.GetMessageFromKey("ONLY_HEAD_CAN_BUY"), 10)); Session.SendPacket(UserInterfaceHelper.Instance.GenerateModal(Language.Instance.GetMessageFromKey("ONLY_HEAD_CAN_BUY"), 1)); } } break; case 1604: if (Session.Character.Family != null && Session.Character.Family.FamilyLevel >= 5 && Session.Character.Family.MaxSize < 70) { if (Session.Character.FamilyCharacter.Authority == FamilyAuthority.Head) { if (5000000 >= Session.Character.Gold) { Session.SendPacket(Session.Character.GenerateSay(Language.Instance.GetMessageFromKey("NOT_ENOUGH_MONEY"), 10)); return; } Session.Character.Family.MaxSize = 70; Session.Character.Gold -= 5000000; Session.SendPacket(Session.Character.GenerateGold()); FamilyDTO fam = Session.Character.Family; DAOFactory.FamilyDAO.InsertOrUpdate(ref fam); ServerManager.Instance.FamilyRefresh(Session.Character.Family.FamilyId); } else { Session.SendPacket(Session.Character.GenerateSay(Language.Instance.GetMessageFromKey("ONLY_HEAD_CAN_BUY"), 10)); Session.SendPacket(UserInterfaceHelper.Instance.GenerateModal(Language.Instance.GetMessageFromKey("ONLY_HEAD_CAN_BUY"), 1)); } } break; case 1605: if (Session.Character.Family != null && Session.Character.Family.FamilyLevel >= 9 && Session.Character.Family.MaxSize < 100) { if (Session.Character.FamilyCharacter.Authority == FamilyAuthority.Head) { if (10000000 >= Session.Character.Gold) { Session.SendPacket(Session.Character.GenerateSay(Language.Instance.GetMessageFromKey("NOT_ENOUGH_MONEY"), 10)); return; } Session.Character.Family.MaxSize = 100; Session.Character.Gold -= 10000000; Session.SendPacket(Session.Character.GenerateGold()); FamilyDTO fam = Session.Character.Family; DAOFactory.FamilyDAO.InsertOrUpdate(ref fam); ServerManager.Instance.FamilyRefresh(Session.Character.Family.FamilyId); } else { Session.SendPacket(Session.Character.GenerateSay(Language.Instance.GetMessageFromKey("ONLY_HEAD_CAN_BUY"), 10)); Session.SendPacket(UserInterfaceHelper.Instance.GenerateModal(Language.Instance.GetMessageFromKey("ONLY_HEAD_CAN_BUY"), 1)); } } break; case 23: if (packet.Type == 0) { if (Session.Character.Group != null && Session.Character.Group.CharacterCount == 3) { foreach (ClientSession s in Session.Character.Group.Characters) { if (s.Character.Family != null) { Session.SendPacket(UserInterfaceHelper.Instance.GenerateInfo(Language.Instance.GetMessageFromKey("GROUP_MEMBER_ALREADY_IN_FAMILY"))); return; } } } if (Session.Character.Group == null || Session.Character.Group.CharacterCount != 3) { Session.SendPacket(UserInterfaceHelper.Instance.GenerateInfo(Language.Instance.GetMessageFromKey("FAMILY_GROUP_NOT_FULL"))); return; } Session.SendPacket(UserInterfaceHelper.Instance.GenerateInbox($"#glmk^ {14} 1 {Language.Instance.GetMessageFromKey("CREATE_FAMILY").Replace(' ', '^')}")); } else { if (Session.Character.Family == null) { Session.SendPacket(UserInterfaceHelper.Instance.GenerateInfo(Language.Instance.GetMessageFromKey("NOT_IN_FAMILY"))); return; } if (Session.Character.Family != null && Session.Character.FamilyCharacter != null && Session.Character.FamilyCharacter.Authority != FamilyAuthority.Head) { Session.SendPacket(UserInterfaceHelper.Instance.GenerateInfo(Language.Instance.GetMessageFromKey("NOT_FAMILY_HEAD"))); return; } Session.SendPacket($"qna #glrm^1 {Language.Instance.GetMessageFromKey("DISMISS_FAMILY")}"); } break; case 60: StaticBonusDTO medal = Session.Character.StaticBonusList.FirstOrDefault(s => s.StaticBonusType == StaticBonusType.BazaarMedalGold || s.StaticBonusType == StaticBonusType.BazaarMedalSilver); byte Medal = 0; int Time = 0; if (medal != null) { Medal = medal.StaticBonusType == StaticBonusType.BazaarMedalGold ? (byte)MedalType.Gold : (byte)MedalType.Silver; Time = (int)(medal.DateEnd - DateTime.Now).TotalHours; } Session.SendPacket($"wopen 32 {Medal} {Time}"); break; case 5002: if (npc != null) { TeleporterDTO tp = npc.Teleporters?.FirstOrDefault(s => s.Index == packet.Type); if (tp != null) { Session.SendPacket("it 3"); ServerManager.Instance.ChangeMap(Session.Character.CharacterId, tp.MapId, tp.MapX, tp.MapY); } } break; case 5001: if (npc != null) { ServerManager.Instance.ChangeMap(Session.Character.CharacterId, 130, 12, 40); } break; case 5011: if (npc != null) { ServerManager.Instance.ChangeMap(Session.Character.CharacterId, 170, 127, 46); } break; case 5012: if (npc != null) { TeleporterDTO tp = npc.Teleporters?.FirstOrDefault(s => s.Index == packet.Type); if (tp != null) { ServerManager.Instance.ChangeMap(Session.Character.CharacterId, tp.MapId, tp.MapX, tp.MapY); } } break; default: Logger.Log.Warn(string.Format(Language.Instance.GetMessageFromKey("NO_NRUN_HANDLER"), packet.Runner)); break; } }
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; } }
public override void Use(ClientSession session, ref ItemInstance inv, byte option = 0, string[] packetsplit = null) { switch (Effect) { case 0: if (option == 0) { if (packetsplit?.Length == 9) { ItemInstance box = session.Character.Inventory.LoadBySlotAndType <ItemInstance>(inv.Slot, InventoryType.Equipment); if (box != null) { if (box.Item.ItemSubType == 3) { session.SendPacket( $"qna #guri^300^8023^{inv.Slot} {Language.Instance.GetMessageFromKey("ASK_OPEN_BOX")}"); } else if (box.HoldingVNum == 0) { session.SendPacket( $"qna #guri^300^8023^{inv.Slot}^{packetsplit[3]} {Language.Instance.GetMessageFromKey("ASK_STORE_PET")}"); } else { session.SendPacket( $"qna #guri^300^8023^{inv.Slot}^{packetsplit[3]} {Language.Instance.GetMessageFromKey("ASK_RELEASE_PET")}"); } } } } else { //u_i 2 2000000 0 21 0 0 if (inv.Item.ItemSubType == 3) { OpenBoxItem(session, inv); } else if (inv.HoldingVNum == 0) { if (packetsplit?.Length == 1 && int.TryParse(packetsplit[0], out int petId) && session.Character.Mates.Find(s => s.MateTransportId == petId) is Mate mate) { if (mate.IsTeamMember) { session.SendPacket( session.Character.GenerateSay(Language.Instance.GetMessageFromKey("CANT_STORE_YOUR_TEAMMEM"), 10)); } else { inv.HoldingVNum = mate.NpcMonsterVNum; inv.SpLevel = mate.Level; inv.SpDamage = mate.Attack; inv.SpDefence = mate.Defence; session.Character.Mates.Remove(mate); session.SendPacket( UserInterfaceHelper.GenerateInfo( Language.Instance.GetMessageFromKey("PET_STORED"))); session.SendPacket(UserInterfaceHelper.GeneratePClear()); session.SendPackets(session.Character.GenerateScP()); session.SendPackets(session.Character.GenerateScN()); session.CurrentMapInstance?.Broadcast(mate.GenerateOut()); } } } else { NpcMonster heldMonster = ServerManager.GetNpcMonster(inv.HoldingVNum); if (heldMonster != null) { Mate mate = new Mate(session.Character, heldMonster, 1, MateType.Pet) { Attack = inv.SpDamage, Defence = inv.SpDefence }; if (session.Character.AddPet(mate)) { session.Character.Inventory.RemoveItemFromInventory(inv.Id); session.SendPacket( UserInterfaceHelper.GenerateInfo( Language.Instance.GetMessageFromKey("PET_LEAVE_BEAD"))); } } } } break; case 1: if (option == 0) { session.SendPacket( $"qna #guri^300^8023^{inv.Slot} {Language.Instance.GetMessageFromKey("ASK_RELEASE_PET")}"); } else { NpcMonster heldMonster = ServerManager.GetNpcMonster((short)EffectValue); if (session.CurrentMapInstance == session.Character.Miniland && heldMonster != null) { Mate mate = new Mate(session.Character, heldMonster, LevelMinimum, ItemSubType == 1 ? MateType.Partner : MateType.Pet); if (session.Character.AddPet(mate)) { session.Character.Inventory.RemoveItemFromInventory(inv.Id); session.SendPacket( UserInterfaceHelper.GenerateInfo( Language.Instance.GetMessageFromKey("PET_LEAVE_BEAD"))); } } else { session.SendPacket( session.Character.GenerateSay(Language.Instance.GetMessageFromKey("NOT_IN_MINILAND"), 12)); } } break; case 6969: if (EffectValue == 1 || EffectValue == 2) { var box = session.Character.Inventory.LoadBySlotAndType(inv.Slot, InventoryType.Equipment); if (box != null) { if (box.HoldingVNum == 0) { session.SendPacket($"wopen 44 {inv.Slot} 1"); } else { List <ItemInstance> newInv = session.Character.Inventory.AddNewToInventory(box.HoldingVNum); if (newInv.Any()) { ItemInstance itemInstance = newInv.First(); var specialist = session.Character.Inventory.LoadBySlotAndType( itemInstance.Slot, itemInstance.Type); if (specialist != null) { specialist.FirstPartnerSkillRank = box.FirstPartnerSkillRank; specialist.SecondPartnerSkillRank = box.SecondPartnerSkillRank; specialist.ThirdPartnerSkillRank = box.ThirdPartnerSkillRank; specialist.FirstPartnerSkill = box.FirstPartnerSkill; specialist.SecondPartnerSkill = box.SecondPartnerSkill; specialist.ThirdPartnerSkill = box.ThirdPartnerSkill; } short slot = inv.Slot; if (slot != -1) { if (specialist != null) { session.SendPacket(session.Character.GenerateSay( $"{Language.Instance.GetMessageFromKey("ITEM_ACQUIRED")}: {specialist.Item.Name}", 12)); newInv.ForEach(s => session.SendPacket(specialist.GenerateInventoryAdd())); } session.Character.Inventory.RemoveItemFromInventory(box.Id); } } else { session.SendPacket( UserInterfaceHelper.GenerateMsg(Language.Instance.GetMessageFromKey("NOT_ENOUGH_PLACE"), 0)); } } } } break; case 69: if (EffectValue == 1 || EffectValue == 2) { ItemInstance box = session.Character.Inventory.LoadBySlotAndType <ItemInstance>(inv.Slot, InventoryType.Equipment); if (box != null) { if (box.HoldingVNum == 0) { session.SendPacket($"wopen 44 {inv.Slot}"); } else { List <ItemInstance> newInv = session.Character.Inventory.AddNewToInventory(box.HoldingVNum); if (newInv.Count > 0) { ItemInstance itemInstance = newInv[0]; ItemInstance specialist = session.Character.Inventory.LoadBySlotAndType <ItemInstance>(itemInstance.Slot, itemInstance.Type); if (specialist != null) { specialist.SlDamage = box.SlDamage; specialist.SlDefence = box.SlDefence; specialist.SlElement = box.SlElement; specialist.SlHP = box.SlHP; specialist.SpDamage = box.SpDamage; specialist.SpDark = box.SpDark; specialist.SpDefence = box.SpDefence; specialist.SpElement = box.SpElement; specialist.SpFire = box.SpFire; specialist.SpHP = box.SpHP; specialist.SpLevel = box.SpLevel; specialist.SpLight = box.SpLight; specialist.SpStoneUpgrade = box.SpStoneUpgrade; specialist.SpWater = box.SpWater; specialist.Upgrade = box.Upgrade; specialist.EquipmentSerialId = box.EquipmentSerialId; specialist.XP = box.XP; } if (inv.Slot != -1) { if (specialist != null) { session.SendPacket(session.Character.GenerateSay( $"{Language.Instance.GetMessageFromKey("ITEM_ACQUIRED")}: {specialist.Item.Name} + {specialist.Upgrade}", 12)); newInv.ForEach(s => session.SendPacket(specialist.GenerateInventoryAdd())); } session.Character.Inventory.RemoveItemFromInventory(box.Id); } } else { session.SendPacket( UserInterfaceHelper.GenerateMsg( Language.Instance.GetMessageFromKey("NOT_ENOUGH_PLACE"), 0)); } } } } if (EffectValue == 3) { ItemInstance box = session.Character.Inventory.LoadBySlotAndType <ItemInstance>(inv.Slot, InventoryType.Equipment); if (box != null) { if (box.HoldingVNum == 0) { session.SendPacket($"guri 26 0 {inv.Slot}"); } else { List <ItemInstance> newInv = session.Character.Inventory.AddNewToInventory(box.HoldingVNum); if (newInv.Count > 0) { ItemInstance itemInstance = newInv[0]; ItemInstance fairy = session.Character.Inventory.LoadBySlotAndType <ItemInstance>(itemInstance.Slot, itemInstance.Type); if (fairy != null) { fairy.ElementRate = box.ElementRate; } if (inv.Slot != -1) { if (fairy != null) { session.SendPacket(session.Character.GenerateSay( $"{Language.Instance.GetMessageFromKey("ITEM_ACQUIRED")}: {fairy.Item.Name} ({fairy.ElementRate}%)", 12)); newInv.ForEach(s => session.SendPacket(fairy.GenerateInventoryAdd())); } session.Character.Inventory.RemoveItemFromInventory(box.Id); } } else { session.SendPacket( UserInterfaceHelper.GenerateMsg( Language.Instance.GetMessageFromKey("NOT_ENOUGH_PLACE"), 0)); } } } } if (EffectValue == 4) { ItemInstance box = session.Character.Inventory.LoadBySlotAndType <ItemInstance>(inv.Slot, InventoryType.Equipment); if (box != null) { if (box.HoldingVNum == 0) { session.SendPacket($"guri 24 0 {inv.Slot}"); } else { List <ItemInstance> newInv = session.Character.Inventory.AddNewToInventory(box.HoldingVNum); if (newInv.Count > 0) { if (inv.Slot != -1) { session.SendPacket(session.Character.GenerateSay( $"{Language.Instance.GetMessageFromKey("ITEM_ACQUIRED")}: {newInv[0].Item.Name} x 1)", 12)); newInv.ForEach(s => session.SendPacket(s.GenerateInventoryAdd())); session.Character.Inventory.RemoveItemFromInventory(box.Id); } } else { session.SendPacket( UserInterfaceHelper.GenerateMsg( Language.Instance.GetMessageFromKey("NOT_ENOUGH_PLACE"), 0)); } } } } break; default: Logger.Warn(string.Format(Language.Instance.GetMessageFromKey("NO_HANDLER_ITEM"), GetType(), VNum, Effect, EffectValue)); break; } }
public static void NRun(ClientSession Session, NRunPacket packet) { if (!Session.HasCurrentMapInstance) { return; } MapNpc npc = Session.CurrentMapInstance.Npcs.FirstOrDefault(s => s.MapNpcId == packet.NpcId); TeleporterDTO tp; Random rand = new Random(); switch (packet.Runner) { case 1: if (Session.Character.Class != (byte)ClassType.Adventurer) { Session.SendPacket(UserInterfaceHelper.Instance.GenerateMsg(Language.Instance.GetMessageFromKey("NOT_ADVENTURER"), 0)); return; } if (Session.Character.Level < 15 || Session.Character.JobLevel < 20) { Session.SendPacket(UserInterfaceHelper.Instance.GenerateMsg(Language.Instance.GetMessageFromKey("LOW_LVL"), 0)); return; } if (packet.Type == (byte)Session.Character.Class) { return; } if (Session.Character.Inventory.All(i => i.Value.Type != InventoryType.Wear)) { Session.Character.Inventory.AddNewToInventory((short)(4 + packet.Type * 14), type: InventoryType.Wear); Session.Character.Inventory.AddNewToInventory((short)(81 + packet.Type * 13), type: InventoryType.Wear); switch (packet.Type) { case 1: Session.Character.Inventory.AddNewToInventory(68, type: InventoryType.Wear); Session.Character.Inventory.AddNewToInventory(2082, 10); break; case 2: Session.Character.Inventory.AddNewToInventory(78, type: InventoryType.Wear); Session.Character.Inventory.AddNewToInventory(2083, 10); break; case 3: Session.Character.Inventory.AddNewToInventory(86, type: InventoryType.Wear); break; } Session.CurrentMapInstance?.Broadcast(Session.Character.GenerateEq()); Session.SendPacket(Session.Character.GenerateEquipment()); Session.Character.ChangeClass((ClassType)packet.Type); } else { Session.SendPacket(UserInterfaceHelper.Instance.GenerateMsg(Language.Instance.GetMessageFromKey("EQ_NOT_EMPTY"), 0)); } break; case 2: Session.SendPacket("wopen 1 0"); break; case 4: Mate mate = Session.Character.Mates.FirstOrDefault(s => s.MateTransportId == packet.NpcId); switch (packet.Type) { case 2: if (mate != null) { if (Session.Character.Level >= mate.Level) { Mate teammate = Session.Character.Mates.Where(s => s.IsTeamMember).FirstOrDefault(s => s.MateType == mate.MateType); if (teammate != null) { teammate.IsTeamMember = false; teammate.MapX = teammate.PositionX; teammate.MapY = teammate.PositionY; } mate.IsTeamMember = true; } else { Session.SendPacket(UserInterfaceHelper.Instance.GenerateMsg(Language.Instance.GetMessageFromKey("PET_HIGHER_LEVEL"), 0)); } } break; case 3: if (mate != null && Session.Character.Miniland == Session.Character.MapInstance) { mate.IsTeamMember = false; mate.MapX = mate.PositionX; mate.MapY = mate.PositionY; } break; case 4: if (mate != null) { if (Session.Character.Miniland == Session.Character.MapInstance) { mate.IsTeamMember = false; mate.MapX = mate.PositionX; mate.MapY = mate.PositionY; } else { Session.SendPacket($"qna #n_run^4^5^3^{mate.MateTransportId} {Language.Instance.GetMessageFromKey("ASK_KICK_PET")}"); } break; } break; case 5: if (mate != null) { Session.SendPacket(UserInterfaceHelper.Instance.GenerateDelay(3000, 10, $"#n_run^4^6^3^{mate.MateTransportId}")); } break; case 6: if (mate != null) { if (Session.Character.Miniland != Session.Character.MapInstance) { mate.IsTeamMember = false; Session.CurrentMapInstance.Broadcast(mate.GenerateOut()); Session.SendPacket(Session.Character.GenerateSay(string.Format(Language.Instance.GetMessageFromKey("PET_KICKED"), mate.Name), 11)); Session.SendPacket(UserInterfaceHelper.Instance.GenerateMsg(string.Format(Language.Instance.GetMessageFromKey("PET_KICKED"), mate.Name), 0)); } } break; case 7: if (mate != null) { if (Session.Character.Mates.Any(s => s.MateType == mate.MateType && s.IsTeamMember)) { Session.SendPacket(Session.Character.GenerateSay(Language.Instance.GetMessageFromKey("ALREADY_PET_IN_TEAM"), 11)); Session.SendPacket(UserInterfaceHelper.Instance.GenerateMsg(Language.Instance.GetMessageFromKey("ALREADY_PET_IN_TEAM"), 0)); } else { Session.SendPacket(UserInterfaceHelper.Instance.GenerateDelay(3000, 10, $"#n_run^4^9^3^{mate.MateTransportId}")); } } break; case 9: if (mate != null) { if (Session.Character.Level >= mate.Level) { mate.PositionX = (short)(Session.Character.PositionX + 1); } mate.PositionY = (short)(Session.Character.PositionY + 1); mate.IsTeamMember = true; Session.CurrentMapInstance.Broadcast(mate.GenerateIn()); } else { Session.SendPacket(UserInterfaceHelper.Instance.GenerateMsg(Language.Instance.GetMessageFromKey("PET_HIGHER_LEVEL"), 0)); } break; } Session.SendPacket(Session.Character.GeneratePinit()); Session.SendPackets(Session.Character.GeneratePst()); break; case 10: Session.SendPacket("wopen 3 0"); break; case 12: Session.SendPacket($"wopen {packet.Type} 0"); break; case 14: Session.SendPacket("wopen 27 0"); string recipelist = "m_list 2"; if (npc != null) { List<Recipe> tps = npc.Recipes; recipelist = tps.Where(s => s.Amount > 0).Aggregate(recipelist, (current, s) => current + $" {s.ItemVNum}"); recipelist += " -100"; Session.SendPacket(recipelist); } break; case 15: if (npc != null) { if (packet.Value == 2) { Session.SendPacket($"qna #n_run^15^1^1^{npc.MapNpcId} {Language.Instance.GetMessageFromKey("ASK_CHANGE_SPAWNLOCATION")}"); } else { switch (npc.MapId) { case 1: Session.Character.SetRespawnPoint(1, 79, 116); break; case 20: Session.Character.SetRespawnPoint(20, 9, 92); break; case 145: Session.Character.SetRespawnPoint(145, 13, 110); break; } Session.SendPacket(UserInterfaceHelper.Instance.GenerateMsg(Language.Instance.GetMessageFromKey("RESPAWNLOCATION_CHANGED"), 0)); } } break; case 16: tp = npc?.Teleporters?.FirstOrDefault(s => s.Index == packet.Type); if (tp != null) { if (Session.Character.Gold >= 1000 * packet.Type) { Session.Character.Gold -= 1000 * packet.Type; Session.SendPacket(Session.Character.GenerateGold()); ServerManager.Instance.ChangeMap(Session.Character.CharacterId, tp.MapId, tp.MapX, tp.MapY); } else { Session.SendPacket( Session.Character.GenerateSay(Language.Instance.GetMessageFromKey("NOT_ENOUGH_MONEY"), 10)); } } break; case 17: double currentRunningSeconds = (DateTime.Now - Process.GetCurrentProcess().StartTime.AddSeconds(-50)).TotalSeconds; double timeSpanSinceLastPortal = currentRunningSeconds - Session.Character.LastPortal; if (!(timeSpanSinceLastPortal >= 4) || !Session.HasCurrentMapInstance || Session.CurrentMapInstance.MapInstanceType == MapInstanceType.Act4Instance) { Session.SendPacket(Session.Character.GenerateSay(Language.Instance.GetMessageFromKey("CANT_MOVE"), 10)); return; } if (Session.Character.Gold >= 500 * (1 + packet.Type)) { Session.Character.LastPortal = currentRunningSeconds; Session.Character.Gold -= 500 * (1 + packet.Type); Session.SendPacket(Session.Character.GenerateGold()); ServerManager.Instance.TeleportOnRandomPlaceInMap(Session, packet.Type == 0 ? ServerManager.Instance.ArenaInstance.MapInstanceId : ServerManager.Instance.FamilyArenaInstance.MapInstanceId); } else { Session.SendPacket(Session.Character.GenerateSay(Language.Instance.GetMessageFromKey("NOT_ENOUGH_MONEY"), 10)); } break; case 18: Session.SendPacket(Session.Character.GenerateNpcDialog(17)); break; case 26: tp = npc?.Teleporters?.FirstOrDefault(s => s.Index == packet.Type); if (tp != null) { if (Session.Character.Gold >= 5000 * packet.Type) { Session.Character.Gold -= 5000 * packet.Type; ServerManager.Instance.ChangeMap(Session.Character.CharacterId, tp.MapId, tp.MapX, tp.MapY); } else { Session.SendPacket(Session.Character.GenerateSay(Language.Instance.GetMessageFromKey("NOT_ENOUGH_MONEY"), 10)); } } break; case 45: tp = npc?.Teleporters?.FirstOrDefault(s => s.Index == packet.Type); if (tp != null) { if (Session.Character.Gold >= 500) { Session.Character.Gold -= 500; Session.SendPacket(Session.Character.GenerateGold()); ServerManager.Instance.ChangeMap(Session.Character.CharacterId, tp.MapId, tp.MapX, tp.MapY); } else { Session.SendPacket( Session.Character.GenerateSay(Language.Instance.GetMessageFromKey("NOT_ENOUGH_MONEY"), 10)); } } break; case 132: tp = npc?.Teleporters?.FirstOrDefault(s => s.Index == packet.Type); if (tp != null) { ServerManager.Instance.ChangeMap(Session.Character.CharacterId, tp.MapId, tp.MapX, tp.MapY); } break; case 137: Session.SendPacket("taw_open"); break; case 138: ConcurrentBag<ArenaTeamMember> at = ServerManager.Instance.ArenaTeams.OrderBy(s => rand.Next()).FirstOrDefault(); if (at != null) { ServerManager.Instance.ChangeMapInstance(Session.Character.CharacterId, at.FirstOrDefault(s => s.Session != null).Session.CurrentMapInstance.MapInstanceId, 69, 100); ArenaTeamMember zenas = at.OrderBy(s => s.Order).FirstOrDefault(s => s.Session != null && !s.Dead && s.ArenaTeamType == ArenaTeamType.ZENAS); ArenaTeamMember erenia = at.OrderBy(s => s.Order).FirstOrDefault(s => s.Session != null && !s.Dead && s.ArenaTeamType == ArenaTeamType.ERENIA); Session.SendPacket(erenia.Session.Character.GenerateTaM(0)); Session.SendPacket(erenia.Session.Character.GenerateTaM(3)); Session.SendPacket("taw_sv 0"); Session.SendPacket(zenas.Session.Character.GenerateTaP(0, true)); Session.SendPacket(erenia.Session.Character.GenerateTaP(2, true)); Session.SendPacket(zenas.Session.Character.GenerateTaFc(0)); Session.SendPacket(erenia.Session.Character.GenerateTaFc(1)); } else { Session.SendPacket(UserInterfaceHelper.Instance.GenerateInfo(Language.Instance.GetMessageFromKey("NO_TALENT_ARENA"))); } break; case 135: if (!ServerManager.Instance.StartedEvents.Contains(EventType.TALENTARENA)) { Session.SendPacket(npc?.GenerateSay(Language.Instance.GetMessageFromKey("ARENA_NOT_OPEN"), 10)); } else { int tickets = 5 - Session.Character.GeneralLogs.Count(s => s.LogType == "TalentArena" && s.Timestamp.Date == DateTime.Today); if (ServerManager.Instance.ArenaMembers.All(s => s.Session != Session) && tickets > 0) { if (ServerManager.Instance.IsCharacterMemberOfGroup(Session.Character.CharacterId)) { Session.SendPacket(UserInterfaceHelper.Instance.GenerateMsg(Language.Instance.GetMessageFromKey("TALENT_ARENA_GROUP"), 0)); Session.SendPacket(Session.Character.GenerateSay(Language.Instance.GetMessageFromKey("TALENT_ARENA_GROUP"), 10)); } else { Session.SendPacket(Session.Character.GenerateSay(string.Format(Language.Instance.GetMessageFromKey("ARENA_TICKET_LEFT"), tickets), 10)); ServerManager.Instance.ArenaMembers.Add(new ArenaMember { ArenaType = EventType.TALENTARENA, Session = Session, GroupId = null, Time = 0 }); } } else { Session.SendPacket(UserInterfaceHelper.Instance.GenerateMsg(Language.Instance.GetMessageFromKey("TALENT_ARENA_NO_MORE_TICKET"), 0)); Session.SendPacket(Session.Character.GenerateSay(Language.Instance.GetMessageFromKey("TALENT_ARENA_NO_MORE_TICKET"), 10)); } } break; case 150: if (npc != null) { if (Session.Character.Family != null) { if (Session.Character.Family.LandOfDeath != null && npc.EffectActivated) { if (Session.Character.Level >= 55) { ServerManager.Instance.ChangeMapInstance(Session.Character.CharacterId, Session.Character.Family.LandOfDeath.MapInstanceId, 153, 145); } else { Session.SendPacket(UserInterfaceHelper.Instance.GenerateMsg(Language.Instance.GetMessageFromKey("LOD_REQUIERE_LVL"), 0)); } } else { Session.SendPacket(UserInterfaceHelper.Instance.GenerateMsg(Language.Instance.GetMessageFromKey("LOD_CLOSED"), 0)); } } else { Session.SendPacket(UserInterfaceHelper.Instance.GenerateMsg(Language.Instance.GetMessageFromKey("NEED_FAMILY"), 0)); } } break; case 301: tp = npc?.Teleporters?.FirstOrDefault(s => s.Index == packet.Type); if (tp != null) { ServerManager.Instance.ChangeMap(Session.Character.CharacterId, tp.MapId, tp.MapX, tp.MapY); } break; case 1600: Session.SendPacket(Session.Character.OpenFamilyWarehouse()); break; case 1601: Session.SendPackets(Session.Character.OpenFamilyWarehouseHist()); break; case 1602: if (Session.Character.Family != null && Session.Character.Family.FamilyLevel >= 3 && Session.Character.Family.WarehouseSize < 21) { if (Session.Character.FamilyCharacter.Authority == FamilyAuthority.Head) { if (500000 >= Session.Character.Gold) { Session.SendPacket(Session.Character.GenerateSay(Language.Instance.GetMessageFromKey("NOT_ENOUGH_MONEY"), 10)); return; } Session.Character.Family.WarehouseSize = 21; Session.Character.Gold -= 500000; Session.SendPacket(Session.Character.GenerateGold()); FamilyDTO fam = Session.Character.Family; DAOFactory.FamilyDAO.InsertOrUpdate(ref fam); ServerManager.Instance.FamilyRefresh(Session.Character.Family.FamilyId); } else { Session.SendPacket(Session.Character.GenerateSay(Language.Instance.GetMessageFromKey("ONLY_HEAD_CAN_BUY"), 10)); Session.SendPacket(UserInterfaceHelper.Instance.GenerateModal(Language.Instance.GetMessageFromKey("ONLY_HEAD_CAN_BUY"), 1)); } } break; case 1603: if (Session.Character.Family != null && Session.Character.Family.FamilyLevel >= 7 && Session.Character.Family.WarehouseSize < 49) { if (Session.Character.FamilyCharacter.Authority == FamilyAuthority.Head) { if (2000000 >= Session.Character.Gold) { Session.SendPacket(Session.Character.GenerateSay(Language.Instance.GetMessageFromKey("NOT_ENOUGH_MONEY"), 10)); return; } Session.Character.Family.WarehouseSize = 49; Session.Character.Gold -= 2000000; Session.SendPacket(Session.Character.GenerateGold()); FamilyDTO fam = Session.Character.Family; DAOFactory.FamilyDAO.InsertOrUpdate(ref fam); ServerManager.Instance.FamilyRefresh(Session.Character.Family.FamilyId); } else { Session.SendPacket(Session.Character.GenerateSay(Language.Instance.GetMessageFromKey("ONLY_HEAD_CAN_BUY"), 10)); Session.SendPacket(UserInterfaceHelper.Instance.GenerateModal(Language.Instance.GetMessageFromKey("ONLY_HEAD_CAN_BUY"), 1)); } } break; case 1604: if (Session.Character.Family != null && Session.Character.Family.FamilyLevel >= 5 && Session.Character.Family.MaxSize < 70) { if (Session.Character.FamilyCharacter.Authority == FamilyAuthority.Head) { if (5000000 >= Session.Character.Gold) { Session.SendPacket(Session.Character.GenerateSay(Language.Instance.GetMessageFromKey("NOT_ENOUGH_MONEY"), 10)); return; } Session.Character.Family.MaxSize = 70; Session.Character.Gold -= 5000000; Session.SendPacket(Session.Character.GenerateGold()); FamilyDTO fam = Session.Character.Family; DAOFactory.FamilyDAO.InsertOrUpdate(ref fam); ServerManager.Instance.FamilyRefresh(Session.Character.Family.FamilyId); } else { Session.SendPacket(Session.Character.GenerateSay(Language.Instance.GetMessageFromKey("ONLY_HEAD_CAN_BUY"), 10)); Session.SendPacket(UserInterfaceHelper.Instance.GenerateModal(Language.Instance.GetMessageFromKey("ONLY_HEAD_CAN_BUY"), 1)); } } break; case 1605: if (Session.Character.Family != null && Session.Character.Family.FamilyLevel >= 9 && Session.Character.Family.MaxSize < 100) { if (Session.Character.FamilyCharacter.Authority == FamilyAuthority.Head) { if (10000000 >= Session.Character.Gold) { Session.SendPacket(Session.Character.GenerateSay(Language.Instance.GetMessageFromKey("NOT_ENOUGH_MONEY"), 10)); return; } Session.Character.Family.MaxSize = 100; Session.Character.Gold -= 10000000; Session.SendPacket(Session.Character.GenerateGold()); FamilyDTO fam = Session.Character.Family; DAOFactory.FamilyDAO.InsertOrUpdate(ref fam); ServerManager.Instance.FamilyRefresh(Session.Character.Family.FamilyId); } else { Session.SendPacket(Session.Character.GenerateSay(Language.Instance.GetMessageFromKey("ONLY_HEAD_CAN_BUY"), 10)); Session.SendPacket(UserInterfaceHelper.Instance.GenerateModal(Language.Instance.GetMessageFromKey("ONLY_HEAD_CAN_BUY"), 1)); } } break; case 23: if (packet.Type == 0) { if (Session.Character.Group != null && Session.Character.Group.CharacterCount == 3) { if (Session.Character.Group.Characters.Any(s => s.Character.Family != null)) { Session.SendPacket(UserInterfaceHelper.Instance.GenerateInfo(Language.Instance.GetMessageFromKey("GROUP_MEMBER_ALREADY_IN_FAMILY"))); return; } } if (Session.Character.Group == null || Session.Character.Group.CharacterCount != 3) { Session.SendPacket(UserInterfaceHelper.Instance.GenerateInfo(Language.Instance.GetMessageFromKey("FAMILY_GROUP_NOT_FULL"))); return; } Session.SendPacket(UserInterfaceHelper.Instance.GenerateInbox($"#glmk^ {14} 1 {Language.Instance.GetMessageFromKey("CREATE_FAMILY").Replace(' ', '^')}")); } else { if (Session.Character.Family == null) { Session.SendPacket(UserInterfaceHelper.Instance.GenerateInfo(Language.Instance.GetMessageFromKey("NOT_IN_FAMILY"))); return; } if (Session.Character.Family != null && Session.Character.FamilyCharacter != null && Session.Character.FamilyCharacter.Authority != FamilyAuthority.Head) { Session.SendPacket(UserInterfaceHelper.Instance.GenerateInfo(Language.Instance.GetMessageFromKey("NOT_FAMILY_HEAD"))); return; } Session.SendPacket($"qna #glrm^1 {Language.Instance.GetMessageFromKey("DISMISS_FAMILY")}"); } break; case 60: StaticBonusDTO medal = Session.Character.StaticBonusList.FirstOrDefault(s => s.StaticBonusType == StaticBonusType.BazaarMedalGold || s.StaticBonusType == StaticBonusType.BazaarMedalSilver); byte Medal = 0; int Time = 0; if (medal != null) { Medal = medal.StaticBonusType == StaticBonusType.BazaarMedalGold ? (byte)MedalType.Gold : (byte)MedalType.Silver; Time = (int)(medal.DateEnd - DateTime.Now).TotalHours; } Session.SendPacket($"wopen 32 {Medal} {Time}"); break; case 5001: if (npc != null) { MapInstance map = null; switch (Session.Character.Faction) { case FactionType.Neutral: Session.SendPacket(UserInterfaceHelper.Instance.GenerateInfo("NEED_FACTION_ACT4")); return; case FactionType.Angel: map = ServerManager.Instance.Act4ShipAngel; break; case FactionType.Demon: map = ServerManager.Instance.Act4ShipDemon; break; } if (map == null || !npc.EffectActivated) { Session.SendPacket(UserInterfaceHelper.Instance.GenerateMsg(Language.Instance.GetMessageFromKey("SHIP_NOTARRIVED"), 0)); return; } if (3000 > Session.Character.Gold) { Session.SendPacket(Session.Character.GenerateSay(Language.Instance.GetMessageFromKey("NOT_ENOUGH_MONEY"), 10)); return; } Session.Character.Gold -= 3000; MapCell pos = map.Map.GetRandomPosition(); ServerManager.Instance.ChangeMapInstance(Session.Character.CharacterId, map.MapInstanceId, pos.X, pos.Y); } break; case 5002: if (npc != null) { tp = npc.Teleporters?.FirstOrDefault(s => s.Index == packet.Type); if (tp != null) { Session.SendPacket("it 3"); SerializableWorldServer connection = CommunicationServiceClient.Instance.GetPreviousChannelByAccountId(Session.Account.AccountId); Session.Character.MapId = tp.MapId; Session.Character.MapX = tp.MapX; Session.Character.MapY = tp.MapY; Session.Character.ChangeChannel(connection.EndPointIp, connection.EndPointPort, 3); } } break; case 5011: if (npc != null) { ServerManager.Instance.ChangeMap(Session.Character.CharacterId, 170, 127, 46); } break; case 5012: tp = npc?.Teleporters?.FirstOrDefault(s => s.Index == packet.Type); if (tp != null) { ServerManager.Instance.ChangeMap(Session.Character.CharacterId, tp.MapId, tp.MapX, tp.MapY); } break; default: Logger.Log.Warn(string.Format(Language.Instance.GetMessageFromKey("NO_NRUN_HANDLER"), packet.Runner)); break; } }
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; } }
// Both partly public void ChangeMap(long id) { ClientSession session = GetSessionByCharacterId(id); if (session != null) { try { session.CurrentMap.UnregisterSession(session.Character.CharacterId); session.CurrentMap = GetMap(session.Character.MapId); session.CurrentMap.RegisterSession(session); session.SendPacket(session.Character.GenerateCInfo()); session.SendPacket(session.Character.GenerateCMode()); session.SendPacket(session.Character.GenerateEq()); session.SendPacket(session.Character.GenerateEquipment()); session.SendPacket(session.Character.GenerateLev()); session.SendPacket(session.Character.GenerateStat()); session.SendPacket(session.Character.GenerateAt()); session.SendPacket(session.Character.GenerateCMap()); session.SendPacket(session.Character.GenerateStatChar()); session.SendPacket(session.Character.GenerateCond()); session.SendPacket(session.Character.GenerateGidx()); // family session.SendPacket("rsfp 0 -1"); // in 2 // send only when partner present cond 2 // send only when partner present session.SendPacket("pinit 0"); // clear party list session.SendPacket(session.Character.GeneratePairy()); session.SendPacket("act6"); // act6 1 0 14 0 0 0 14 0 0 0 Sessions.Where(s => s.Character != null && s.Character.MapId.Equals(session.Character.MapId) && s.Character.Name != session.Character.Name && !s.Character.InvisibleGm).ToList().ForEach(s => RequireBroadcastFromUser(session, s.Character.CharacterId, "GenerateIn")); session.SendPackets(session.Character.GenerateGp()); // wp 23 124 4 4 12 99 session.SendPackets(session.Character.GenerateIn3()); session.SendPackets(session.Character.GenerateIn2()); session.SendPackets(session.Character.GenerateNPCShopOnMap()); session.SendPackets(session.Character.GenerateDroppedItem()); session.SendPackets(session.Character.GenerateShopOnMap()); session.SendPackets(session.Character.GeneratePlayerShopOnMap()); if (!session.Character.InvisibleGm) { session.CurrentMap?.Broadcast(session, session.Character.GenerateIn(), ReceiverType.AllExceptMe); } if (session.Character.Size != 10) { session.SendPacket(session.Character.GenerateScal()); } if (session.CurrentMap.IsDancing && !session.Character.IsDancing) { session.CurrentMap?.Broadcast("dance 2"); } else if (!session.CurrentMap.IsDancing && session.Character.IsDancing) { session.Character.IsDancing = false; session.CurrentMap?.Broadcast("dance"); } foreach (Group g in Groups) { foreach (ClientSession groupSession in g.Characters) { ClientSession chara = Sessions.FirstOrDefault(s => s.Character != null && s.Character.CharacterId == groupSession.Character.CharacterId && s.CurrentMap.MapId == groupSession.CurrentMap.MapId); if (chara != null) { groupSession.SendPacket(groupSession.Character.GeneratePinit()); } if (groupSession.Character.CharacterId == groupSession.Character.CharacterId) { session.CurrentMap?.Broadcast(groupSession, groupSession.Character.GeneratePidx(), ReceiverType.AllExceptMe); } } } } catch (Exception) { Logger.Log.Warn("Character changed while changing map. Do not abuse Commands."); } } }
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.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) { 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.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 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 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(), VNum, Effect, EffectValue)); break; } }
public override void Use(ClientSession session, ref ItemInstance inv, byte Option = 0, string[] packetsplit = null) { if (!session.HasCurrentMapInstance) { return; } if (session.Character.IsLaurenaMorph()) { return; } if ((DateTime.Now - session.Character.LastPotion).TotalMilliseconds < (session.CurrentMapInstance.Map.MapTypes.OrderByDescending(s => s.PotionDelay).FirstOrDefault()?.PotionDelay ?? 750)) { return; } if ((session.CurrentMapInstance.MapInstanceType.Equals(MapInstanceType.TalentArenaMapInstance) && VNum != 5935) || session.CurrentMapInstance.MapInstanceType.Equals(MapInstanceType.IceBreakerInstance)) { return; } if (session.CurrentMapInstance.MapInstanceType != MapInstanceType.TalentArenaMapInstance && VNum == 5935) { return; } if (ServerManager.Instance.ChannelId == 51 && session.Character.MapId != 130 && session.Character.MapId != 131 && (session.Character.Group?.Raid == null || !session.Character.Group.Raid.InstanceBag.Lock) && session.Character.MapInstance.MapInstanceType != MapInstanceType.Act4Berios && session.Character.MapInstance.MapInstanceType != MapInstanceType.Act4Calvina && session.Character.MapInstance.MapInstanceType != MapInstanceType.Act4Hatus && session.Character.MapInstance.MapInstanceType != MapInstanceType.Act4Morcos && (inv.ItemVNum == 1242 || inv.ItemVNum == 1243 || inv.ItemVNum == 1244 || inv.ItemVNum == 5582 || inv.ItemVNum == 5583 || inv.ItemVNum == 5584)) { return; } session.Character.LastPotion = DateTime.Now; switch (Effect) { default: { bool hasPotionBeenUsed = false; int hpLoad = (int)session.Character.HPLoad(); int mpLoad = (int)session.Character.MPLoad(); if (session.Character.Hp > 0 && (session.Character.Hp < hpLoad || session.Character.Mp < mpLoad)) { hasPotionBeenUsed = true; double buffRc = session.Character.GetBuff(BCardType.CardType.LeonaPassiveSkill, (byte)AdditionalTypes.LeonaPassiveSkill.IncreaseRecoveryItems)[0] / 100D; int hpAmount = Hp + (int)(Hp * buffRc); int mpAmount = Mp + (int)(Mp * buffRc); if (session.Character.Hp + hpAmount > hpLoad) { hpAmount = hpLoad - session.Character.Hp; } if (session.Character.Mp + mpAmount > mpLoad) { mpAmount = mpLoad - session.Character.Mp; } bool convertRecoveryToDamage = ServerManager.RandomNumber() < session.Character.GetBuff(BCardType.CardType.DarkCloneSummon, (byte)AdditionalTypes.DarkCloneSummon.ConvertRecoveryToDamage)[0]; if (convertRecoveryToDamage) { session.CurrentMapInstance.Broadcast(session.Character.GenerateDm(hpAmount)); session.Character.Hp -= hpAmount; if (session.Character.Hp < 1) { session.Character.Hp = 1; } } else { session.CurrentMapInstance.Broadcast(session.Character.GenerateRc(hpAmount)); session.Character.Hp += hpAmount; } session.Character.Mp += mpAmount; switch (inv.ItemVNum) { // Full HP Potion case 1242: case 5582: { if (convertRecoveryToDamage) { session.CurrentMapInstance.Broadcast(session.Character.GenerateDm(session.Character.Hp - 1)); session.Character.Hp = 1; } else { session.CurrentMapInstance.Broadcast(session.Character.GenerateRc(hpLoad - session.Character.Hp)); session.Character.Hp = hpLoad; } } break; // Full MP Potion case 1243: case 5583: { session.Character.Mp = mpLoad; } break; // Full HP & MP Potion case 1244: case 5584: case 9129: { if (convertRecoveryToDamage) { session.CurrentMapInstance.Broadcast(session.Character.GenerateDm(session.Character.Hp - 1)); session.Character.Hp = 1; } else { session.CurrentMapInstance.Broadcast(session.Character.GenerateRc(hpLoad - session.Character.Hp)); session.Character.Hp = hpLoad; } session.Character.Mp = mpLoad; } break; } session.SendPacket(session.Character.GenerateStat()); } foreach (Mate mate in session.Character.Mates.Where(s => s.IsTeamMember && s.IsAlive)) { hpLoad = (int)mate.MaxHp; mpLoad = (int)mate.MaxMp; if (mate.Hp <= 0 || (mate.Hp == hpLoad && mate.Mp == mpLoad)) { continue; } hasPotionBeenUsed = true; int hpAmount = Hp; int mpAmount = Mp; if (mate.Hp + hpAmount > hpLoad) { hpAmount = hpLoad - (int)mate.Hp; } if (mate.Mp + mpAmount > mpLoad) { mpAmount = mpLoad - (int)mate.Mp; } mate.Hp += hpAmount; mate.Mp += mpAmount; session.CurrentMapInstance.Broadcast(mate.GenerateRc(hpAmount)); switch (inv.ItemVNum) { // Full HP Potion case 1242: case 5582: session.CurrentMapInstance.Broadcast(mate.GenerateRc(hpLoad - (int)mate.Hp)); mate.Hp = hpLoad; break; // Full MP Potion case 1243: case 5583: mate.Mp = mpLoad; break; // Full HP & MP Potion case 1244: case 5584: case 9129: session.CurrentMapInstance.Broadcast(mate.GenerateRc(hpLoad - (int)mate.Hp)); mate.Hp = hpLoad; mate.Mp = mpLoad; break; } session.SendPacket(mate.GenerateStatInfo()); } if (session.Character.Mates.Any(m => m.IsTeamMember && m.IsAlive)) { session.SendPackets(session.Character.GeneratePst()); } if (hasPotionBeenUsed) { session.Character.Inventory.RemoveItemFromInventory(inv.Id); } } break; } }
public override void Use(ClientSession session, ref ItemInstance inv, byte Option = 0, string[] packetsplit = null) { switch (Effect) { case 0: if (Option == 0) { if (packetsplit.Length == 9) { BoxInstance box = session.Character.Inventory.LoadBySlotAndType <BoxInstance>(inv.Slot, InventoryType.Equipment); if (box != null) { if (box.Item.ItemSubType == 3) { session.SendPacket($"qna #guri^300^8023^{inv.Slot} {Language.Instance.GetMessageFromKey("ASK_OPEN_BOX")}"); } else if (box.HoldingVNum == 0) { session.SendPacket($"qna #guri^300^8023^{inv.Slot}^{packetsplit[3]} {Language.Instance.GetMessageFromKey("ASK_STORE_PET")}"); } else { session.SendPacket($"qna #guri^300^8023^{inv.Slot} {Language.Instance.GetMessageFromKey("ASK_RELEASE_PET")}"); } } } } else { //u_i 2 2000000 0 21 0 0 BoxInstance box = session.Character.Inventory.LoadBySlotAndType <BoxInstance>(inv.Slot, InventoryType.Equipment); if (box != null) { if (box.Item.ItemSubType == 3) { List <RollGeneratedItemDTO> roll = box.Item.RollGeneratedItems.Where(s => s.MinimumOriginalItemRare <= box.Rare && s.MaximumOriginalItemRare >= box.Rare && s.OriginalItemDesign == box.Design).ToList(); int probabilities = roll.Sum(s => s.Probability); int rnd = ServerManager.Instance.RandomNumber(0, probabilities); int currentrnd = 0; List <ItemInstance> newInv = null; foreach (RollGeneratedItemDTO rollitem in roll) { if (newInv == null) { currentrnd += rollitem.Probability; if (currentrnd >= rnd) { newInv = session.Character.Inventory.AddNewToInventory(rollitem.ItemGeneratedVNum, rollitem.ItemGeneratedAmount); if (newInv.Any()) { short Slot = inv.Slot; if (Slot != -1) { session.SendPacket(session.Character.GenerateSay($"{Language.Instance.GetMessageFromKey("ITEM_ACQUIRED")}: {newInv.First().Item.Name} x 1)", 12)); newInv.ForEach(s => session.SendPacket(s.GenerateInventoryAdd())); session.Character.Inventory.RemoveItemAmountFromInventory(1, box.Id); } } } } } } else if (box.HoldingVNum == 0) { if (packetsplit.Length == 1) { if (int.TryParse(packetsplit[0], out int PetId)) { Mate mate = session.Character.Mates.FirstOrDefault(s => s.MateTransportId == PetId); box.HoldingVNum = mate.NpcMonsterVNum; box.SpLevel = mate.Level; box.SpDamage = mate.Attack; box.SpDefence = mate.Defence; session.Character.Mates.Remove(mate); session.SendPacket(UserInterfaceHelper.Instance.GenerateInfo(Language.Instance.GetMessageFromKey("PET_STORED"))); session.SendPacket(UserInterfaceHelper.Instance.GeneratePClear()); session.SendPackets(session.Character.GenerateScP()); session.SendPackets(session.Character.GenerateScN()); session.CurrentMapInstance?.Broadcast(mate.GenerateOut()); } } } else { NpcMonster heldMonster = ServerManager.Instance.GetNpc(box.HoldingVNum); if (heldMonster != null) { Mate mate = new Mate(session.Character, heldMonster, 1, MateType.Pet) { Attack = box.SpDamage, Defence = box.SpDefence }; if (session.Character.AddPet(mate)) { session.Character.Inventory.RemoveItemAmountFromInventory(1, inv.Id); session.SendPacket(UserInterfaceHelper.Instance.GenerateInfo(Language.Instance.GetMessageFromKey("PET_LEAVE_BEAD"))); } } } } } break; case 1: if (Option == 0) { session.SendPacket($"qna #guri^300^8023^{inv.Slot} {Language.Instance.GetMessageFromKey("ASK_RELEASE_PET")}"); } else { NpcMonster heldMonster = ServerManager.Instance.GetNpc((short)EffectValue); if (session.CurrentMapInstance == session.Character.Miniland && heldMonster != null) { Mate mate = new Mate(session.Character, heldMonster, LevelMinimum, ItemSubType == 1 ? MateType.Partner : MateType.Pet); if (session.Character.AddPet(mate)) { session.Character.Inventory.RemoveItemAmountFromInventory(1, inv.Id); session.SendPacket(UserInterfaceHelper.Instance.GenerateInfo(Language.Instance.GetMessageFromKey("PET_LEAVE_BEAD"))); } } else { //TODO ADD MINILAND SENDPACKET } } break; case 69: if (EffectValue == 1 || EffectValue == 2) { BoxInstance box = session.Character.Inventory.LoadBySlotAndType <BoxInstance>(inv.Slot, InventoryType.Equipment); if (box != null) { if (box.HoldingVNum == 0) { session.SendPacket($"wopen 44 {inv.Slot}"); } else { List <ItemInstance> newInv = session.Character.Inventory.AddNewToInventory(box.HoldingVNum); if (newInv.Any()) { ItemInstance itemInstance = newInv.First(); SpecialistInstance specialist = session.Character.Inventory.LoadBySlotAndType <SpecialistInstance>(itemInstance.Slot, itemInstance.Type); if (specialist != null) { specialist.SlDamage = box.SlDamage; specialist.SlDefence = box.SlDefence; specialist.SlElement = box.SlElement; specialist.SlHP = box.SlHP; specialist.SpDamage = box.SpDamage; specialist.SpDark = box.SpDark; specialist.SpDefence = box.SpDefence; specialist.SpElement = box.SpElement; specialist.SpFire = box.SpFire; specialist.SpHP = box.SpHP; specialist.SpLevel = box.SpLevel; specialist.SpLight = box.SpLight; specialist.SpStoneUpgrade = box.SpStoneUpgrade; specialist.SpWater = box.SpWater; specialist.Upgrade = box.Upgrade; specialist.XP = box.XP; } short Slot = inv.Slot; if (Slot != -1) { if (specialist != null) { session.SendPacket(session.Character.GenerateSay($"{Language.Instance.GetMessageFromKey("ITEM_ACQUIRED")}: {specialist.Item.Name} + {specialist.Upgrade}", 12)); newInv.ForEach(s => session.SendPacket(specialist.GenerateInventoryAdd())); } session.Character.Inventory.RemoveItemAmountFromInventory(1, box.Id); } } else { session.SendPacket(UserInterfaceHelper.Instance.GenerateMsg(Language.Instance.GetMessageFromKey("NOT_ENOUGH_PLACE"), 0)); } } } } if (EffectValue == 3) { BoxInstance box = session.Character.Inventory.LoadBySlotAndType <BoxInstance>(inv.Slot, InventoryType.Equipment); if (box != null) { if (box.HoldingVNum == 0) { session.SendPacket($"guri 26 0 {inv.Slot}"); } else { List <ItemInstance> newInv = session.Character.Inventory.AddNewToInventory(box.HoldingVNum); if (newInv.Any()) { ItemInstance itemInstance = newInv.First(); WearableInstance fairy = session.Character.Inventory.LoadBySlotAndType <WearableInstance>(itemInstance.Slot, itemInstance.Type); if (fairy != null) { fairy.ElementRate = box.ElementRate; } short Slot = inv.Slot; if (Slot != -1) { if (fairy != null) { session.SendPacket(session.Character.GenerateSay($"{Language.Instance.GetMessageFromKey("ITEM_ACQUIRED")}: {fairy.Item.Name} ({fairy.ElementRate}%)", 12)); newInv.ForEach(s => session.SendPacket(fairy.GenerateInventoryAdd())); } session.Character.Inventory.RemoveItemAmountFromInventory(1, box.Id); } } else { session.SendPacket(UserInterfaceHelper.Instance.GenerateMsg(Language.Instance.GetMessageFromKey("NOT_ENOUGH_PLACE"), 0)); } } } } if (EffectValue == 4) { BoxInstance box = session.Character.Inventory.LoadBySlotAndType <BoxInstance>(inv.Slot, InventoryType.Equipment); if (box != null) { if (box.HoldingVNum == 0) { session.SendPacket($"guri 24 0 {inv.Slot}"); } else { List <ItemInstance> newInv = session.Character.Inventory.AddNewToInventory(box.HoldingVNum); if (newInv.Any()) { short Slot = inv.Slot; if (Slot != -1) { session.SendPacket(session.Character.GenerateSay($"{Language.Instance.GetMessageFromKey("ITEM_ACQUIRED")}: {newInv.First().Item.Name} x 1)", 12)); newInv.ForEach(s => session.SendPacket(s.GenerateInventoryAdd())); session.Character.Inventory.RemoveItemAmountFromInventory(1, box.Id); } } else { session.SendPacket(UserInterfaceHelper.Instance.GenerateMsg(Language.Instance.GetMessageFromKey("NOT_ENOUGH_PLACE"), 0)); } } } } break; default: Logger.Log.Warn(string.Format(Language.Instance.GetMessageFromKey("NO_HANDLER_ITEM"), GetType())); break; } }
public 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) { 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)); } } } } 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++; 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++; 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)); 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--; 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--; 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(), VNum, Effect, EffectValue)); break; } }