using System; using System.Collections.Generic; using System.Data; using System.Linq; using FilterAPI; using FilterAPI.Networking; using FilterZone.ZoneNetworking; namespace FilterZone.ZoneHandlers { internal class Zone9Handle { [ZonePacketHandler(NETCMD.ZONE_CLICK_ENT)] public static void HandleClickEntity(ZoneClient ClientSocket, Packet ClientPacket) { UInt16 MapObjectID = UInt16.MaxValue; ClientSocket.AutoAttacking = false; ClientSocket.SendPacketServer(ClientPacket); if ((MapObjectID = ClientPacket.PacketReader.ReadUInt16()) != UInt16.MaxValue) { ClientSocket.ClickedMapObjectID = MapObjectID; } } [ZonePacketHandler(NETCMD.ZONE_UNLICK_ENT)] public static void HandleUnclickEntity(ZoneClient ClientSocket, Packet ClientPacket) { ClientSocket.AutoAttacking = false; ClientSocket.SendPacketServer(ClientPacket); ClientSocket.ClickedMapObjectID = UInt16.MaxValue; } [ZonePacketHandler(NETCMD.ZONE_LVL_UP)] public static void HandleLevelUp(ZoneClient ClientSocket, Packet ServerPacket) { ClientSocket.SendPacketClient(ServerPacket); if (Convert.ToBoolean(Program.Conf.GetConfigValue("ZoneFeatureLUAS"))) { try { Dictionary> nSkillNos = Program.SQL.GetnSkillNos(); foreach (String sID in Program.SQL.GetOnlinesIDs()) { Int32 nCharNo = Program.SQL.GetnCharNoFromsID(sID); Byte Level = Program.SQL.GetnLevelFromsID(sID); Byte PlayerClass = Program.SQL.GetnClassFromnCharNo(nCharNo); List> SkillsToLearn = new List>(); List> PassivesToLearn = new List>(); switch (PlayerClass) { case 1: { SkillsToLearn.Add(Program.ClassSkills[1].ToList()); PassivesToLearn.Add(Program.ClassPassives[1].ToList()); break; } case 2: { SkillsToLearn.Add(Program.ClassSkills[1].ToList()); SkillsToLearn.Add(Program.ClassSkills[2].ToList()); PassivesToLearn.Add(Program.ClassPassives[1].ToList()); PassivesToLearn.Add(Program.ClassPassives[2].ToList()); break; } case 3: { SkillsToLearn.Add(Program.ClassSkills[1].ToList()); SkillsToLearn.Add(Program.ClassSkills[2].ToList()); SkillsToLearn.Add(Program.ClassSkills[3].ToList()); PassivesToLearn.Add(Program.ClassPassives[1].ToList()); PassivesToLearn.Add(Program.ClassPassives[2].ToList()); PassivesToLearn.Add(Program.ClassPassives[3].ToList()); break; } case 4: { SkillsToLearn.Add(Program.ClassSkills[1].ToList()); SkillsToLearn.Add(Program.ClassSkills[2].ToList()); SkillsToLearn.Add(Program.ClassSkills[3].ToList()); SkillsToLearn.Add(Program.ClassSkills[4].ToList()); PassivesToLearn.Add(Program.ClassPassives[1].ToList()); PassivesToLearn.Add(Program.ClassPassives[2].ToList()); PassivesToLearn.Add(Program.ClassPassives[3].ToList()); PassivesToLearn.Add(Program.ClassPassives[4].ToList()); break; } case 5: { SkillsToLearn.Add(Program.ClassSkills[1].ToList()); SkillsToLearn.Add(Program.ClassSkills[2].ToList()); SkillsToLearn.Add(Program.ClassSkills[3].ToList()); SkillsToLearn.Add(Program.ClassSkills[5].ToList()); PassivesToLearn.Add(Program.ClassPassives[1].ToList()); PassivesToLearn.Add(Program.ClassPassives[2].ToList()); PassivesToLearn.Add(Program.ClassPassives[3].ToList()); PassivesToLearn.Add(Program.ClassPassives[5].ToList()); break; } case 6: { SkillsToLearn.Add(Program.ClassSkills[6].ToList()); PassivesToLearn.Add(Program.ClassPassives[6].ToList()); break; } case 7: { SkillsToLearn.Add(Program.ClassSkills[6].ToList()); SkillsToLearn.Add(Program.ClassSkills[7].ToList()); PassivesToLearn.Add(Program.ClassPassives[6].ToList()); PassivesToLearn.Add(Program.ClassPassives[7].ToList()); break; } case 8: { SkillsToLearn.Add(Program.ClassSkills[6].ToList()); SkillsToLearn.Add(Program.ClassSkills[7].ToList()); SkillsToLearn.Add(Program.ClassSkills[8].ToList()); PassivesToLearn.Add(Program.ClassPassives[6].ToList()); PassivesToLearn.Add(Program.ClassPassives[7].ToList()); PassivesToLearn.Add(Program.ClassPassives[8].ToList()); break; } case 9: { SkillsToLearn.Add(Program.ClassSkills[6].ToList()); SkillsToLearn.Add(Program.ClassSkills[7].ToList()); SkillsToLearn.Add(Program.ClassSkills[8].ToList()); SkillsToLearn.Add(Program.ClassSkills[9].ToList()); PassivesToLearn.Add(Program.ClassPassives[6].ToList()); PassivesToLearn.Add(Program.ClassPassives[7].ToList()); PassivesToLearn.Add(Program.ClassPassives[8].ToList()); PassivesToLearn.Add(Program.ClassPassives[9].ToList()); break; } case 10: { SkillsToLearn.Add(Program.ClassSkills[6].ToList()); SkillsToLearn.Add(Program.ClassSkills[7].ToList()); SkillsToLearn.Add(Program.ClassSkills[8].ToList()); SkillsToLearn.Add(Program.ClassSkills[10].ToList()); PassivesToLearn.Add(Program.ClassPassives[6].ToList()); PassivesToLearn.Add(Program.ClassPassives[7].ToList()); PassivesToLearn.Add(Program.ClassPassives[8].ToList()); PassivesToLearn.Add(Program.ClassPassives[10].ToList()); break; } case 11: { SkillsToLearn.Add(Program.ClassSkills[11].ToList()); PassivesToLearn.Add(Program.ClassPassives[11].ToList()); break; } case 12: { SkillsToLearn.Add(Program.ClassSkills[11].ToList()); SkillsToLearn.Add(Program.ClassSkills[12].ToList()); PassivesToLearn.Add(Program.ClassPassives[11].ToList()); PassivesToLearn.Add(Program.ClassPassives[12].ToList()); break; } case 13: { SkillsToLearn.Add(Program.ClassSkills[11].ToList()); SkillsToLearn.Add(Program.ClassSkills[12].ToList()); SkillsToLearn.Add(Program.ClassSkills[13].ToList()); PassivesToLearn.Add(Program.ClassPassives[11].ToList()); PassivesToLearn.Add(Program.ClassPassives[12].ToList()); PassivesToLearn.Add(Program.ClassPassives[13].ToList()); break; } case 14: { SkillsToLearn.Add(Program.ClassSkills[11].ToList()); SkillsToLearn.Add(Program.ClassSkills[12].ToList()); SkillsToLearn.Add(Program.ClassSkills[13].ToList()); SkillsToLearn.Add(Program.ClassSkills[14].ToList()); PassivesToLearn.Add(Program.ClassPassives[11].ToList()); PassivesToLearn.Add(Program.ClassPassives[12].ToList()); PassivesToLearn.Add(Program.ClassPassives[13].ToList()); PassivesToLearn.Add(Program.ClassPassives[14].ToList()); break; } case 15: { SkillsToLearn.Add(Program.ClassSkills[11].ToList()); SkillsToLearn.Add(Program.ClassSkills[12].ToList()); SkillsToLearn.Add(Program.ClassSkills[13].ToList()); SkillsToLearn.Add(Program.ClassSkills[15].ToList()); PassivesToLearn.Add(Program.ClassPassives[11].ToList()); PassivesToLearn.Add(Program.ClassPassives[12].ToList()); PassivesToLearn.Add(Program.ClassPassives[13].ToList()); PassivesToLearn.Add(Program.ClassPassives[15].ToList()); break; } case 16: { SkillsToLearn.Add(Program.ClassSkills[16].ToList()); PassivesToLearn.Add(Program.ClassPassives[16].ToList()); break; } case 17: { SkillsToLearn.Add(Program.ClassSkills[16].ToList()); SkillsToLearn.Add(Program.ClassSkills[17].ToList()); PassivesToLearn.Add(Program.ClassPassives[16].ToList()); PassivesToLearn.Add(Program.ClassPassives[17].ToList()); break; } case 18: { SkillsToLearn.Add(Program.ClassSkills[16].ToList()); SkillsToLearn.Add(Program.ClassSkills[17].ToList()); SkillsToLearn.Add(Program.ClassSkills[18].ToList()); PassivesToLearn.Add(Program.ClassPassives[16].ToList()); PassivesToLearn.Add(Program.ClassPassives[17].ToList()); PassivesToLearn.Add(Program.ClassPassives[18].ToList()); break; } case 19: { SkillsToLearn.Add(Program.ClassSkills[16].ToList()); SkillsToLearn.Add(Program.ClassSkills[17].ToList()); SkillsToLearn.Add(Program.ClassSkills[18].ToList()); SkillsToLearn.Add(Program.ClassSkills[19].ToList()); PassivesToLearn.Add(Program.ClassPassives[16].ToList()); PassivesToLearn.Add(Program.ClassPassives[17].ToList()); PassivesToLearn.Add(Program.ClassPassives[18].ToList()); PassivesToLearn.Add(Program.ClassPassives[19].ToList()); break; } case 20: { SkillsToLearn.Add(Program.ClassSkills[16].ToList()); SkillsToLearn.Add(Program.ClassSkills[17].ToList()); SkillsToLearn.Add(Program.ClassSkills[18].ToList()); SkillsToLearn.Add(Program.ClassSkills[20].ToList()); PassivesToLearn.Add(Program.ClassPassives[16].ToList()); PassivesToLearn.Add(Program.ClassPassives[17].ToList()); PassivesToLearn.Add(Program.ClassPassives[18].ToList()); PassivesToLearn.Add(Program.ClassPassives[20].ToList()); break; } case 21: { SkillsToLearn.Add(Program.ClassSkills[21].ToList()); PassivesToLearn.Add(Program.ClassPassives[21].ToList()); break; } case 22: { SkillsToLearn.Add(Program.ClassSkills[21].ToList()); SkillsToLearn.Add(Program.ClassSkills[22].ToList()); PassivesToLearn.Add(Program.ClassPassives[21].ToList()); PassivesToLearn.Add(Program.ClassPassives[22].ToList()); break; } case 23: { SkillsToLearn.Add(Program.ClassSkills[21].ToList()); SkillsToLearn.Add(Program.ClassSkills[22].ToList()); SkillsToLearn.Add(Program.ClassSkills[23].ToList()); PassivesToLearn.Add(Program.ClassPassives[21].ToList()); PassivesToLearn.Add(Program.ClassPassives[22].ToList()); PassivesToLearn.Add(Program.ClassPassives[23].ToList()); break; } case 24: { SkillsToLearn.Add(Program.ClassSkills[21].ToList()); SkillsToLearn.Add(Program.ClassSkills[22].ToList()); SkillsToLearn.Add(Program.ClassSkills[23].ToList()); SkillsToLearn.Add(Program.ClassSkills[24].ToList()); PassivesToLearn.Add(Program.ClassPassives[21].ToList()); PassivesToLearn.Add(Program.ClassPassives[22].ToList()); PassivesToLearn.Add(Program.ClassPassives[23].ToList()); PassivesToLearn.Add(Program.ClassPassives[24].ToList()); break; } case 25: { SkillsToLearn.Add(Program.ClassSkills[21].ToList()); SkillsToLearn.Add(Program.ClassSkills[22].ToList()); SkillsToLearn.Add(Program.ClassSkills[23].ToList()); SkillsToLearn.Add(Program.ClassSkills[25].ToList()); PassivesToLearn.Add(Program.ClassPassives[21].ToList()); PassivesToLearn.Add(Program.ClassPassives[22].ToList()); PassivesToLearn.Add(Program.ClassPassives[23].ToList()); PassivesToLearn.Add(Program.ClassPassives[25].ToList()); break; } } bool addedSkills = false; foreach (UInt16 nSkillNo in Program.SQL.GettSkilllearnerFornCharNo(nCharNo)) { if (!nSkillNos.ContainsKey(nCharNo) || !nSkillNos[nCharNo].Contains(nSkillNo)) { using (var LocalPacket = new Packet(5, 15)) { LocalPacket.PacketWriter.Write(sID); LocalPacket.PacketWriter.Write(nSkillNo); Program.LocalClient.SendPacket(LocalPacket); addedSkills = true; } } } Program.SQL.DeletetSkillLearner(nCharNo); foreach (List ClassSkills in SkillsToLearn) { foreach (Object[] SkillInfo in ClassSkills) { if ((!nSkillNos.ContainsKey(nCharNo) || !nSkillNos[nCharNo].Contains(Convert.ToUInt16(SkillInfo[1]))) && Level >= Convert.ToByte(SkillInfo[0])) { using (var LocalPacket = new Packet(5, 15)) { LocalPacket.PacketWriter.Write(sID); LocalPacket.PacketWriter.Write(Convert.ToInt32(SkillInfo[1])); Program.LocalClient.SendPacket(LocalPacket); addedSkills = true; } } } } foreach (List ClassPassives in PassivesToLearn) { foreach (Object[] PassiveInfo in ClassPassives) { if ((!nSkillNos.ContainsKey(nCharNo) || !nSkillNos[nCharNo].Contains(Convert.ToUInt16(Convert.ToUInt16(PassiveInfo[1]) + 30000))) && Level >= Convert.ToByte(PassiveInfo[0])) { using (var LocalPacket = new Packet(5, 16)) { LocalPacket.PacketWriter.Write(sID); LocalPacket.PacketWriter.Write(Convert.ToInt32(PassiveInfo[1])); Program.LocalClient.SendPacket(LocalPacket); addedSkills = true; } } } } if (addedSkills) { Program.SendConsoleText(ConsoleColor.Gray, "Added skills for {0}", sID); } SkillsToLearn.Clear(); PassivesToLearn.Clear(); } nSkillNos.Clear(); } catch (Exception Error) { Program.SendConsoleText(ConsoleColor.Red, "Timers error - Levelup skill giver\n{0}", Error.ToString()); } } Byte NewLevel = ServerPacket.PacketReader.ReadByte(); } [ZonePacketHandler(NETCMD.ZONE_SET_HP)] public static void HandleSetHP(ZoneClient ClientSocket, Packet ServerPacket) { UInt32 HP = ServerPacket.PacketReader.ReadUInt32(); if (HP == 0) { if (ClientSocket.TradeWaitAccept) { ClientSocket.TradeWaitAccept = false; GlobalPacket.SendRejectTrade(ClientSocket); } else if (ClientSocket.InTrade) { ClientSocket.InTrade = false; GlobalPacket.SendCloseTrade(ClientSocket); } else if (ClientSocket.IsVending) { ClientSocket.Dispose(); return; } } ClientSocket.SendPacketClient(ServerPacket); } [ZonePacketHandler(NETCMD.ZONE_ATK_ENT_MELEE)] public static void HandleAttackEntityMelee(ZoneClient ClientSocket, Packet ClientPacket) { ClientSocket.SendPacketServer(ClientPacket); ClientSocket.AutoAttacking = true; } [ZonePacketHandler(NETCMD.ZONE_STOP_ATK_MELEE)] public static void HandleStopAttackingMelee(ZoneClient ClientSocket, Packet ClientPacket) { ClientSocket.SendPacketServer(ClientPacket); ClientSocket.AutoAttacking = false; } [ZonePacketHandler(NETCMD.ZONE_SKILL_USE)] public static void HandleUseSkill(ZoneClient ClientSocket, Packet ClientPacket) { ClientSocket.SendPacketServer(ClientPacket); if (ClientSocket.TradeWaitAccept) { ClientSocket.TradeWaitAccept = false; GlobalPacket.SendRejectTrade(ClientSocket); } else if (ClientSocket.InTrade) { ClientSocket.InTrade = false; GlobalPacket.SendCloseTrade(ClientSocket); } UInt16 SkillID = UInt16.MaxValue; UInt16 MapObjectID = UInt16.MaxValue; if ((SkillID = ClientPacket.PacketReader.ReadUInt16()) != UInt16.MaxValue && (MapObjectID = ClientPacket.PacketReader.ReadUInt16()) != UInt16.MaxValue) { if (Convert.ToBoolean(Program.Conf.GetConfigValue("ZoneFeatureGSP"))) // what it do? skill attack protection???? { DataRow ActiveSkillRow = Program.ActiveSkill.Table.Rows.Cast().Where(ItemArray => Convert.ToUInt16(ItemArray.ItemArray[0]) == SkillID).FirstOrDefault(); if ((Convert.ToByte(ActiveSkillRow.ItemArray[16]) == 1 && Convert.ToByte(ActiveSkillRow.ItemArray[17]) == 0) || (Convert.ToByte(ActiveSkillRow.ItemArray[16]) == 1 && Convert.ToByte(ActiveSkillRow.ItemArray[17]) == 1) || (Convert.ToByte(ActiveSkillRow.ItemArray[16]) == 1 && Convert.ToByte(ActiveSkillRow.ItemArray[17]) == 2) || (Convert.ToByte(ActiveSkillRow.ItemArray[16]) == 1 && Convert.ToByte(ActiveSkillRow.ItemArray[17]) == 3) || (Convert.ToByte(ActiveSkillRow.ItemArray[16]) == 2 && Convert.ToByte(ActiveSkillRow.ItemArray[17]) == 2)) { if (MapObjectID != ClientSocket.MapObjectID) { ClientSocket.Dispose(); return; } } else if ((Convert.ToByte(ActiveSkillRow.ItemArray[16]) == 7 && Convert.ToByte(ActiveSkillRow.ItemArray[17]) == 7)) { if (Program.ZoneClients.Where(MOID => MOID.Value.MapObjectID == MapObjectID).FirstOrDefault().Value == null) { ClientSocket.Dispose(); return; } } } } } [ZonePacketHandler(NETCMD.ZONE_ANIM_ATK)] public static void HandleAttackAnimation(ZoneClient ClientSocket, Packet ServerPacket) { ClientSocket.SendPacketClient(ServerPacket); UInt16 MapObjectID = ServerPacket.PacketReader.ReadUInt16(); if (ClientSocket.TradeMapObjectID == MapObjectID) { if (ClientSocket.TradeWaitAccept) { ClientSocket.TradeWaitAccept = false; GlobalPacket.SendRejectTrade(ClientSocket); } else if (ClientSocket.InTrade) { ClientSocket.InTrade = false; GlobalPacket.SendCloseTrade(ClientSocket); } } } [ZonePacketHandler(NETCMD.ZONE_ATK_DMG)] public static void HandleAttackDamage(ZoneClient ClientSocket, Packet ServerPacket) { UInt16 AttackMapObjectID = ServerPacket.PacketReader.ReadUInt16(); UInt16 TargetMapObjectID = ServerPacket.PacketReader.ReadUInt16(); Byte IsCrit = ServerPacket.PacketReader.ReadByte(); UInt16 Damage = ServerPacket.PacketReader.ReadUInt16(); UInt32 HPLeft = ServerPacket.PacketReader.ReadUInt32(); if (ClientSocket.TradeMapObjectID == AttackMapObjectID || ClientSocket.TradeMapObjectID == TargetMapObjectID) { if (ClientSocket.TradeWaitAccept) { ClientSocket.TradeWaitAccept = false; GlobalPacket.SendRejectTrade(ClientSocket); } else if (ClientSocket.InTrade) { ClientSocket.InTrade = false; GlobalPacket.SendCloseTrade(ClientSocket); } } ClientSocket.SendPacketClient(ServerPacket); } [ZonePacketHandler(NETCMD.ZONE_ANIM_DIE)] public static void HandleDieAnimation(ZoneClient ClientSocket, Packet ServerPacket) { ClientSocket.SendPacketClient(ServerPacket); UInt16 MobMapObjectID = ServerPacket.PacketReader.ReadUInt16(); UInt16 KillerMapObjectID = ServerPacket.PacketReader.ReadUInt16(); MapObject MO; if (MobMapObjectID == ClientSocket.ClickedMapObjectID) { ClientSocket.AutoAttacking = false; } MO = ClientSocket.MapObjects.ToArray().Where(MOID => MOID.MapObjectID == MobMapObjectID).FirstOrDefault(); if (MO != null) { ClientSocket.MapObjects.Remove(MO); } } [ZonePacketHandler(NETCMD.ZONE_SKILL_USE_PREP_SELF)] public static void HandleSkillUsePrepareSelf(ZoneClient ClientSocket, Packet ServerPacket) { UInt16 MapObjectID = ServerPacket.PacketReader.ReadUInt16(); if (ClientSocket.TradeMapObjectID == MapObjectID) { if (ClientSocket.TradeWaitAccept) { ClientSocket.TradeWaitAccept = false; GlobalPacket.SendRejectTrade(ClientSocket); } else if (ClientSocket.InTrade) { ClientSocket.InTrade = false; GlobalPacket.SendCloseTrade(ClientSocket); } } ClientSocket.SendPacketClient(ServerPacket); } [ZonePacketHandler(NETCMD.ZONE_SKILL_USE_PREP_OTHR)] public static void HandleSkillUsePrepareOthers(ZoneClient ClientSocket, Packet ServerPacket) { UInt16 MapObjectID = ServerPacket.PacketReader.ReadUInt16(); if (ClientSocket.TradeMapObjectID == MapObjectID) { if (ClientSocket.TradeWaitAccept) { ClientSocket.TradeWaitAccept = false; GlobalPacket.SendRejectTrade(ClientSocket); } else if (ClientSocket.InTrade) { ClientSocket.InTrade = false; GlobalPacket.SendCloseTrade(ClientSocket); } } ClientSocket.SendPacketClient(ServerPacket); } } }