public static void Read(byte[] packet, Client cli) { PacketReader reader = new PacketReader(packet); reader.PopShort(); //magic 0xDFDF short pktType = reader.PopShort(); if (pktType != 0x0005) { //TextMessage type throw new WrongPacketTypeException("Wrong packet type given to VicinityHandler."); } reader.PopShort(); //unknown short packetSize = reader.PopShort(); UInt32 senderId = reader.PopUInt(); reader.PopInt(); // Receiver int pktId = reader.PopInt(); // Packet ID // 3 unknown values reader.PopInt(); reader.PopInt(); reader.PopInt(); short msgLen = reader.PopShort(); string msg = reader.PopString(msgLen); byte msgType = reader.PopByte(); #if DEBUG Console.WriteLine("Vicinity: " + msg); #endif float range = 0f; switch (msgType) { case 0: // Say range = 10.0f; break; case 1: // Whisper range = 1.5f; break; case 2: // Shout range = 60.0f; break; default: break; } List<Client> clients = FindClient.GetClientsInRadius(cli, range); UInt32[] recvers = new UInt32[clients.Count]; int index = 0; foreach (Client child in clients) { recvers[index] = (UInt32)child.Character.Id; index++; } ChatCom.SendVicinity(senderId, msgType, recvers, msg); }
/// <summary> /// /// </summary> /// <param name="packet"></param> /// <param name="client"></param> public static void Read(byte[] packet, Client client) { PacketWriter packetWriter = new PacketWriter(); PacketReader packetReader = new PacketReader(packet); Header header = packetReader.PopHeader(); byte unknown1 = packetReader.PopByte(); uint[] nanodelta = { 3, 3, 4, 2 }; uint[] healdelta = { 3, 3, 2, 4 }; uint baseIP = 0; uint characterLevel; characterLevel = client.Character.Stats.Level.StatBaseValue; // 54 = Level // Calculate base IP value for character level if (characterLevel > 204) { baseIP += (characterLevel - 204) * 600000; characterLevel = 204; } if (characterLevel > 189) { baseIP += (characterLevel - 189) * 150000; characterLevel = 189; } if (characterLevel > 149) { baseIP += (characterLevel - 149) * 80000; characterLevel = 149; } if (characterLevel > 99) { baseIP += (characterLevel - 99) * 40000; characterLevel = 99; } if (characterLevel > 49) { baseIP += (characterLevel - 49) * 20000; characterLevel = 49; } if (characterLevel > 14) { baseIP += (characterLevel - 14) * 10000; // Change 99 => 14 by Wizard characterLevel = 14; } baseIP += 1500 + (characterLevel - 1) * 4000; // Prepare reply packet packetWriter.PushByte(0xDF); packetWriter.PushByte(0xDF); packetWriter.PushShort(0x0a); packetWriter.PushShort(0x01); packetWriter.PushShort(0); packetWriter.PushInt(3086); packetWriter.PushInt(header.Sender); packetWriter.PushInt(0x3e205660); packetWriter.PushIdentity(50000, header.Sender); packetWriter.PushByte(0); int count = packetReader.PopInt(); uint statval; List<int> statlist = new List<int>(); while (count > 0) { int statNumber = packetReader.PopInt(); statval = packetReader.PopUInt(); client.Character.Stats.SetBaseValue(statNumber, statval); statlist.Add(statNumber); count--; } packetReader.Finish(); statlist.Add(53); // IP uint usedIP = baseIP - (uint)Math.Floor(CalculateIP(client)); client.Character.Stats.IP.StatBaseValue = usedIP; // Send the changed stats back to the client packetWriter.PushInt(statlist.Count); count = 0; while (count < statlist.Count) { statval = client.Character.Stats.GetBaseValue(statlist[count]); packetWriter.PushInt(statlist[count]); packetWriter.PushUInt(statval); count++; } byte[] reply = packetWriter.Finish(); client.SendCompressed(reply); // and save the changes to the statsdb client.Character.WriteStats(); client.Character.CalculateSkills(); }