public static void OnServerClose(this RoomServer roomServer, DuelServer server) { using (PacketWriter writer = new PacketWriter(2)) { writer.Write((byte)RoomMessage.ServerClose); writer.Write(server.Port); DuelServer srv = roomServer.GetMinServer(); lock (srv.AsyncLock) { srv.Count = 0; } if (srv != null) { //特殊处理 writer.Write(srv.Port); writer.Write(srv.NeedAuth); //session.ServerInfo = srv; lock (roomServer.Clients) { foreach (Session client in roomServer.Clients.Values) { if (client.ServerInfo != null && client.ServerInfo.Port == server.Port) { client.ServerInfo = srv; client.Send(writer.Content); } } } } } }
/// <summary> /// Creates an instance of a packet /// </summary> /// <param name="id">the Id, or Command that identifies the packet</param> /// <param name="name">The name of the packet</param> public SendPacket(int id, string name) { m_Id = id; m_Name = name; Stream = PacketWriter.CreateInstance(m_Length); Stream.Write((byte)id); Stream.Write((short)0); }
public SendRecvPacket(int id, string name) { Id = id; Name = name; Stream = PacketWriter.CreateInstance(Length); Stream.Write(id); Stream.Write((short) 0); }
public static void OnServerInfo(GameServer server){ ServerConfig Config = server.Config; using(PacketWriter writer=new PacketWriter(2)){ writer.Write((byte)RoomMessage.Info); writer.Write(Config.ServerPort); writer.Write(Config.isNeedAuth); Send(writer.Content); } }
public override void HandlePacket(Client context, byte flags, byte[] data, uint position, uint size) { var writer = new PacketWriter(); writer.Write((uint) 0); writer.Write((uint) 0); writer.Write((uint) 0); writer.Write((uint) 0); context.SendPacket(0x11, 0x42, 0x0, writer.ToArray()); }
public static void OnRoomEvent(this GameServer server, StoSMessage msg, RoomInfo info){ using(PacketWriter writer = new PacketWriter(2)){ writer.Write((ushort)msg); //length writer.Write((ushort)1); writer.WriteUnicode(info.Name, 20); writer.WriteUnicode(info.Pwd, 20); writer.Write((byte)info.Rule); writer.Write((byte)info.Mode); writer.Write(info.IsStart); writer.WriteUnicode(info.Lflist, 60); writer.Write(info.Warring); writer.Write(info.StartLP); writer.Write((ushort)info.players.Length); for(int i =0; i<info.players.Length;i++){ writer.WriteUnicode(info.players[i], 20); } writer.Write((ushort)info.observers.Count); for(int i =0; i<info.observers.Count;i++){ writer.WriteUnicode(info.observers[i], 20); } //string str = Tool.ToJson(info); //byte[] bs = Encoding.Unicode.GetBytes(str); //writer.Write(bs); writer.Use(); //Send(server.LocalClient, writer.Content); } }
private void DoBlockBalance(Socket socket) { var writer = new PacketWriter(); writer.WriteStruct(new PacketHeader(0x90, 0x11, 0x2C, 0x0, 0x0)); writer.Write(new byte[0x68 - 8]); writer.Write(PolarisApp.BindAddress.GetAddressBytes()); writer.Write((UInt16)12205); writer.Write(new byte[0x90 - 0x6A]); socket.Send(writer.ToArray()); socket.Close(); }
public RicePacket(ushort id) { Writer = new PacketWriter(new MemoryStream()); ID = id; Writer.Write(id); }
public static void OnRoomClose(GameRoom room){ using (PacketWriter writer=new PacketWriter(2)){ writer.Write((byte)RoomMessage.RoomClose); writer.WriteUnicode(room.Config.Name, 20); Send(writer.Content); } }
public static void OnPlayerLeave(GameSession player, GameRoom room){ if (player.Name == null || player.Name.StartsWith("[AI]")) return; using (PacketWriter writer=new PacketWriter(2)){ writer.Write((byte)RoomMessage.PlayerLeave); writer.WriteUnicode(player.Name, 20); writer.WriteUnicode(room.Config.Name, 20); Send(writer.Content); } }
public SendRecvPacket(int id, string name, int length) { Id = id; Name = name; Length = length; Stream = PacketWriter.CreateInstance(length); Stream.Write((byte) id); }
public override void HandlePacket(Client context, byte flags, byte[] data, uint position, uint size) { if (context.Character == null) return; var reader = new PacketReader(data, position, size); reader.BaseStream.Seek(0xC, SeekOrigin.Begin); var channel = reader.ReadUInt32(); var message = reader.ReadUtf16(0x9D3F, 0x44); if (message.StartsWith(PolarisApp.Config.CommandPrefix)) { var valid = false; // Iterate commands foreach (var command in PolarisApp.ConsoleSystem.Commands) { var full = message.Substring(1); // Strip the command chars var args = full.Split(' '); if (command.Names.Any(name => args[0].ToLower() == name.ToLower())) { command.Run(args, args.Length, full, context); valid = true; Logger.WriteCommand(null, "[CMD] {0} issued command {1}", context.User.Username, full); } if (valid) break; } if (!valid) Logger.WriteClient(context, "[CMD] {0} - Command not found", message.Split(' ')[0].Trim('\r')); } else { Logger.Write("[CHT] <{0}> <{1}>", context.Character.Name, message); var writer = new PacketWriter(); writer.WritePlayerHeader((uint) context.User.PlayerId); writer.Write(channel); writer.WriteUtf16(message, 0x9D3F, 0x44); data = writer.ToArray(); foreach (var c in Server.Instance.Clients) { if (c.Character == null || c.CurrentZone != context.CurrentZone) continue; c.SendPacket(0x07, 0x00, 0x44, data); } } }
public static void OnPlayerEnter(GameSession player, GameRoom room){ if (player.Name==null||player.Name.StartsWith("[AI]")) return; using(PacketWriter writer=new PacketWriter(2)){ writer.Write((byte)RoomMessage.PlayerEnter); writer.WriteUnicode(player.Name, 20); writer.WriteUnicode(room.Config.Name, 20); Send(writer.Content); } string tip = Messages.RandomMessage(); if(!string.IsNullOrEmpty(tip)) player.ServerMessage(Messages.RandomMessage()); }
public static void OnRoomCreate(GameRoom room){ if(room==null||room.Config==null){ return; } using(PacketWriter writer=new PacketWriter(2)){ writer.Write((byte)RoomMessage.RoomCreate); writer.WriteUnicode(room.Name, 20); writer.WriteUnicode(room.Config.Name, 20); writer.WriteUnicode(room.Config.BanList); Send(writer.Content); } }
public static void OnSendServerInfo(this RoomServer roomServer, Session session) { using (PacketWriter writer = new PacketWriter(2)) { writer.Write((byte)RoomMessage.Info); writer.Write(roomServer.GetChatPort()); DuelServer srv = roomServer.GetMinServer(); lock (srv.AsyncLock) { srv.Count++; } if (srv != null) { session.ServerInfo = srv; writer.Write(srv.Port); writer.Write(srv.NeedAuth); } else { writer.Write(0); writer.Write((byte)0); } writer.WriteUnicode(session.Token, 32); session.Send(writer.Content); } }
public Client(Server server, SocketClient socket) { IsClosed = false; _server = server; Socket = socket; socket.DataReceived += HandleDataReceived; socket.ConnectionLost += HandleConnectionLost; _readBuffer = new byte[1024 * 64]; _readBufferSize = 0; InputArc4 = null; OutputArc4 = null; var welcome = new PacketWriter(); welcome.Write((ushort)3); welcome.Write((ushort)201); welcome.Write((ushort)0); welcome.Write((ushort)0); SendPacket(0x03, 0x08, 0, welcome.ToArray()); }
public virtual byte[] GenerateSpawnBlob() { PacketWriter writer = new PacketWriter(); writer.WriteStruct(Header); writer.Write(Position); writer.Seek(2, SeekOrigin.Current); // Padding I guess... writer.WriteFixedLengthASCII(Name, 0x34); writer.Write(ThingFlag); writer.Write(Things.Length); foreach (PSOObjectThing thing in Things) { writer.WriteStruct(thing); } return writer.ToArray(); }
private KeyValuePair<TransferBuffer, Packet> GetPacketToSend() { if (m_outgoing_packets.Count == 0) { throw (new Exception("[SecurityAPI::GetPacketToSend] No packets are avaliable to send.")); } Packet packet = m_outgoing_packets[0]; m_outgoing_packets.RemoveAt(0); if (packet.Massive) { ushort parts = 0; PacketWriter final = new PacketWriter(); PacketWriter final_data = new PacketWriter(); byte[] input_data = packet.GetBytes(); PacketReader input_reader = new PacketReader(input_data); TransferBuffer workspace = new TransferBuffer(4089, 0, (int)input_data.Length); while (workspace.Size > 0) { PacketWriter part_data = new PacketWriter(); int cur_size = workspace.Size > 4089 ? 4089 : workspace.Size; // Max buffer size is 4kb for the client part_data.Write((byte)0); // Data flag part_data.Write(input_data, workspace.Offset, cur_size); workspace.Offset += cur_size; workspace.Size -= cur_size; // Update the size final_data.Write(FormatPacket(0x600D, part_data.GetBytes(), false)); ++parts; // Track how many parts there are } // Write the final header packet to the front of the packet PacketWriter final_header = new PacketWriter(); final_header.Write((byte)1); // Header flag final_header.Write((short)parts); final_header.Write(packet.Opcode); final.Write(FormatPacket(0x600D, final_header.GetBytes(), false)); // Finish the large packet of all the data final.Write(final_data.GetBytes()); // Return the collated data byte[] raw_bytes = final.GetBytes(); packet.Lock(); return new KeyValuePair<TransferBuffer, Packet>(new TransferBuffer(raw_bytes, 0, raw_bytes.Length, true), packet); } else { bool encrypted = packet.Encrypted; if (!m_client_security) { if (m_enc_opcodes.Contains(packet.Opcode)) { encrypted = true; } } byte[] raw_bytes = FormatPacket(packet.Opcode, packet.GetBytes(), encrypted); packet.Lock(); return new KeyValuePair<TransferBuffer, Packet>(new TransferBuffer(raw_bytes, 0, raw_bytes.Length, true), packet); } }
private byte[] FormatPacket(ushort opcode, byte[] data, bool encrypted) { // Sanity check if (data.Length >= 0x8000) { throw (new Exception("[SecurityAPI::FormatPacket] Payload is too large!")); } ushort data_length = (ushort)data.Length; // Add the packet header to the start of the data PacketWriter writer = new PacketWriter(); writer.Write(data_length); // packet size writer.Write(opcode); // packet opcode writer.Write((ushort)0); // packet security bytes writer.Write(data); writer.Flush(); // Determine if we need to mark the packet size as encrypted if (encrypted && (m_security_flags.blowfish == 1 || (m_security_flags.security_bytes == 1 && m_security_flags.blowfish == 0))) { long seek_index = writer.BaseStream.Seek(0, SeekOrigin.Current); ushort packet_size = (ushort)(data_length | 0x8000); writer.BaseStream.Seek(0, SeekOrigin.Begin); writer.Write((ushort)packet_size); writer.Flush(); writer.BaseStream.Seek(seek_index, SeekOrigin.Begin); } // Only need to stamp bytes if this is a clientless object if (m_client_security == false && m_security_flags.security_bytes == 1) { long seek_index = writer.BaseStream.Seek(0, SeekOrigin.Current); byte sb1 = GenerateCountByte(true); writer.BaseStream.Seek(4, SeekOrigin.Begin); writer.Write(sb1); writer.Flush(); byte sb2 = GenerateCheckByte(writer.GetBytes()); writer.BaseStream.Seek(5, SeekOrigin.Begin); writer.Write(sb2); writer.Flush(); writer.BaseStream.Seek(seek_index, SeekOrigin.Begin); } // If the packet should be physically encrypted, return an encrypted version of it if (encrypted && m_security_flags.blowfish == 1) { byte[] raw_data = writer.GetBytes(); byte[] encrypted_data = m_blowfish.Encode(raw_data, 2, raw_data.Length - 2); writer.BaseStream.Seek(2, SeekOrigin.Begin); writer.Write(encrypted_data); writer.Flush(); } else { // Determine if we need to unmark the packet size from being encrypted but not physically encrypted if (encrypted && (m_security_flags.security_bytes == 1 && m_security_flags.blowfish == 0)) { long seek_index = writer.BaseStream.Seek(0, SeekOrigin.Current); writer.BaseStream.Seek(0, SeekOrigin.Begin); writer.Write((ushort)data_length); writer.Flush(); writer.BaseStream.Seek(seek_index, SeekOrigin.Begin); } } // Return the final data return writer.GetBytes(); }
/// <summary> /// Spawns a client into a map at a given location /// </summary> /// <param name="c">Client to spawn into map</param> /// <param name="location">Location to spawn client at</param> /// <param name="questOveride">If this also sets the quest data, specify the quest name here to load the spawn from the bin rather then generate it.</param> public void SpawnClient(Client c, PSOLocation location, string questOveride = "") { if (Clients.Contains(c)) { return; } // Set area if (questOveride != "") // TODO: This is a temporary hack, fix me!! { var setAreaPacket = File.ReadAllBytes("Resources/quests/" + questOveride + ".bin"); c.SendPacket(0x03, 0x24, 4, setAreaPacket); } else { PacketWriter writer = new PacketWriter(); writer.WriteStruct(new ObjectHeader(3, EntityType.Map)); writer.WriteStruct(new ObjectHeader((uint)c.User.PlayerId, EntityType.Player)); writer.Write(0x1); // 8 Zeros writer.Write(0); // 8 Zeros writer.Write(~(uint)Type); // F4 FF FF FF writer.Write(MapID); // Map ID maybe writer.Write((uint)Flags); writer.Write(GenerationArgs.seed); // 81 8F E6 19 (Maybe seed) writer.Write(VariantID); // Randomgen enable / disable maybe writer.Write(GenerationArgs.xsize); // X Size writer.Write(GenerationArgs.ysize); // Y Size writer.Write(1); writer.Write(1); writer.Write(~0); // FF FF FF FF FF FF FF FF writer.Write(0x301); c.SendPacket(0x3, 0x0, 0x0, writer.ToArray()); } if (c.CurrentZone != null) { c.CurrentZone.RemoveClient(c); } var setPlayerId = new PacketWriter(); setPlayerId.WritePlayerHeader((uint)c.User.PlayerId); c.SendPacket(0x06, 0x00, 0, setPlayerId.ToArray()); // Spawn Character c.SendPacket(new CharacterSpawnPacket(c.Character, location)); c.CurrentLocation = location; c.CurrentZone = this; // Objects foreach (PSOObject obj in Objects) { c.SendPacket(0x08, 0x0B, 0x0, obj.GenerateSpawnBlob()); } // NPCs foreach (PSONPC npc in NPCs) { c.SendPacket(0x08, 0xC, 0x4, npc.GenerateSpawnBlob()); } // Spawn for others, Spawn others for me CharacterSpawnPacket spawnMe = new CharacterSpawnPacket(c.Character, location, false); foreach (Client other in Clients) { other.SendPacket(spawnMe); c.SendPacket(new CharacterSpawnPacket(other.Character, other.CurrentLocation, false)); } // Unlock Controls c.SendPacket(new NoPayloadPacket(0x03, 0x2B)); // Inital spawn only, move this! Clients.Add(c); Logger.Write("[MAP] {0} has spawned in {1}.", c.User.Username, Name); if (InstanceName != null && ZoneManager.Instance.playerCounter.ContainsKey(InstanceName)) { ZoneManager.Instance.playerCounter[InstanceName] += 1; } }
public static void LobbyError(this Session session, string message) { using (PacketWriter join = new PacketWriter(2)) { join.Write((byte)RoomMessage.JoinGame); join.Write(0U); join.Write((byte)0); join.Write((byte)0); join.Write(0); join.Write(0); join.Write(0); // C++ padding: 5 bytes + 3 bytes = 8 bytes for (int i = 0; i < 3; i++) join.Write((byte)0); join.Write(0); join.Write((byte)0); join.Write((byte)0); join.Write((short)0); session.Send(join, false); } using (PacketWriter enter = new PacketWriter(2)) { enter.Write((byte)RoomMessage.HsPlayerEnter); enter.WriteUnicode("[err]" + message, 20); enter.Write((byte)0); session.Send(enter); } }
void Build() { PacketWriter w = new PacketWriter(); w.Write((int)Header.BUILD); w.Write(txtHost.Text); w.Write(int.Parse(txtPort.Text)); w.Write(xBackup.Checked); w.Write(txtBackupHost.Text); w.Write(int.Parse(txtBackupPort.Text)); w.Write(txtPassword.Text); w.Write(txtUpdatePassword.Text); w.Write(xInstall.Checked); w.Write(xHKCU.Checked); w.Write(txtHKCU.Text); w.Write(xHKLM.Checked); w.Write(txtHKLM.Text); w.Write(txtFolderName.Text); w.Write(txtFilename.Text); w.Write(txtPluginStoreLoc.Text); w.Write(txtPluginStoreName.Text); w.Write(txtMutex.Text); w.Write(xVisMode.Checked); w.Write(xShowConsole.Checked); w.Write(xMelt.Checked); w.Write((lstBinder.Items.Count > 0) ? true : false); w.Write((lstPlugins.CheckedItems.Count > 0) ? true : false); IAssembly asm = GlobalProperties.BuildAssembly; w.Write((asm == null) ? false : true); if (asm != null) { w.Write(asm.Title); w.Write(asm.Description); w.Write(asm.Configuration); w.Write(asm.Company); w.Write(asm.Title); w.Write(asm.Copyright); w.Write(asm.Culture); w.Write(asm.Guid); w.Write(asm.AssemblyVersion); w.Write(asm.AssemblyFileVersion); } string args = "/filealign:512 /platform:anycpu"; if (!xShowConsole.Checked) args += " /target:winexe"; //else // args += " /debug"; w.Write(args); Console.WriteLine(GlobalProperties.Client.Send(w.ToArray(true))); }
private void RunLUA(string[] args, int length, string full, Client client) { if (client == null) { var id = Helper.FindPlayerByUsername(args[1]); if (id == -1) return; client = PolarisApp.Instance.Server.Clients[id]; } else { string[] newargs = new string[args.Length + 1]; newargs[0] = ""; newargs[1] = ""; Array.Copy(args, 1, newargs, 2, args.Length - 1); args = newargs; } PacketWriter luaPacket = new PacketWriter(); luaPacket.Write((UInt16)1); luaPacket.Write((UInt16)1); luaPacket.WriteAscii(String.Join(" ", args, 2, args.Length - 2), 0xD975, 0x2F); client.SendPacket(0x10, 0x3, 0x4, luaPacket.ToArray()); }
public void SetCapacity(int fixedLength, params string[] args) { byte[] bytes; _Length = fixedLength; Queue<byte[]> strings = new Queue<byte[]>(); for (int i = 0; i < args.Length; ++i) { bytes = ASCIIEncoding.BigEndianUnicode.GetBytes(args[i]); _Length += bytes.Length; strings.Enqueue(bytes); } Writer = PacketWriter.CreateInstance(Length, strings); Writer.Write((byte)GetPacketType()); }
private void DoShipList(Socket socket) { var writer = new PacketWriter(); var entries = new List<ShipEntry>(); for (var i = 1; i < 11; i++) { var entry = new ShipEntry { order = (ushort)i, number = (uint)i, status = ShipStatus.Online, name = String.Format("Ship{0:0#}", i), ip = PolarisApp.BindAddress.GetAddressBytes() }; entries.Add(entry); } writer.WriteStruct(new PacketHeader(Marshal.SizeOf(typeof(ShipEntry)) * entries.Count + 12, 0x11, 0x3D, 0x4, 0x0)); writer.WriteMagic((uint)entries.Count, 0xE418, 81); foreach (var entry in entries) writer.WriteStruct(entry); writer.Write((Int32)(DateTime.UtcNow.Subtract(new DateTime(1970, 1, 1))).TotalSeconds); writer.Write(1); socket.Send(writer.ToArray()); socket.Close(); }
public void SendToken(string name, string tk) { using (PacketWriter token = new PacketWriter(2)) { token.Write((byte)RoomMessage.Info); token.WriteUnicode(name, 20); token.WriteUnicode(tk, 32); lock (DuelServers) { foreach(DuelServer srv in DuelServers) { srv.Send(token); } } } }
public static void OnClose(GameSession client, GameClientPacket packet) { using (PacketWriter packet_write = new PacketWriter(GameServerPacket.GamePacketByteLength)) { packet_write.Write((byte)RoomMessage.STOP_CLIENT); client.Send(packet_write.Content); } client.CloseAsync(); }
private static void SendMessage(this Session session, string msg) { using (PacketWriter chat = new PacketWriter(2)) { chat.Write((byte)RoomMessage.OnChat); //PlayerType.Yellow chat.Write((short)0x10); chat.WriteUnicode(msg); session.Send(chat); } }
public void EnsureCapacity(int length) { Stream = PacketWriter.CreateInstance(length); Stream.Write((byte) Id); Stream.Write((short) length); }
public override void HandlePacket(Client context, byte flags, byte[] data, uint position, uint size) { var reader = new PacketReader(data, position, size); reader.BaseStream.Seek(0x2C, SeekOrigin.Current); var macCount = reader.ReadMagic(0x5E6, 107); reader.BaseStream.Seek(0x1C * macCount, SeekOrigin.Current); reader.BaseStream.Seek(0x114, SeekOrigin.Current); var username = reader.ReadFixedLengthAscii(64); var password = reader.ReadFixedLengthAscii(64); // What am I doing here even using (var db = new PolarisEf()) { var users = from u in db.Players where u.Username.ToLower().Equals(username.ToLower()) select u; var error = ""; Player user; if (!users.Any()) { // Check if there is an empty field if (string.IsNullOrWhiteSpace(username) || string.IsNullOrWhiteSpace(password)) { error = "Username and password fields must not be empty."; user = null; } // Check for special characters else if (!Regex.IsMatch(username, "^[a-zA-Z0-9 ]*$", RegexOptions.IgnoreCase)) { error = "Username must not contain special characters.\nPlease use letters and numbers only."; user = null; } else // We're all good! { // Insert new player into database user = new Player { Username = username.ToLower(), Password = BCrypt.Net.BCrypt.HashPassword(password), Nickname = username.ToLower(), // Since we can't display the nickname prompt yet, just default it to the username SettingsIni = File.ReadAllText("Resources/settings.txt") }; db.Players.Add(user); db.SaveChanges(); // context.SendPacket(0x11, 0x1e, 0x0, new byte[0x44]); // Request nickname } } else { user = users.First(); if (!BCrypt.Net.BCrypt.Verify(password, user.Password)) { error = "Incorrect password."; user = null; } } // Mystery packet var mystery = new PacketWriter(); mystery.Write((uint)100); // SendPacket(0x11, 0x49, 0, mystery.ToArray()); // Login response packet var resp = new PacketWriter(); resp.Write((uint)((user == null) ? 1 : 0)); // Status flag: 0=success, 1=error resp.WriteUtf16(error, 0x8BA4, 0xB6); if (user == null) { for (var i = 0; i < 0xEC; i++) resp.Write((byte)0); context.SendPacket(0x11, 1, 4, resp.ToArray()); return; } resp.Write((uint)user.PlayerId); // Player ID resp.Write((uint)0); // Unknown resp.Write((uint)0); // Unknown resp.WriteFixedLengthUtf16("B001-DarkFox", 0x20); for (var i = 0; i < 0xBC; i++) resp.Write((byte)0); context.SendPacket(0x11, 1, 4, resp.ToArray()); // Settings packet var settings = new PacketWriter(); settings.WriteAscii(user.SettingsIni, 0x54AF, 0x100); context.SendPacket(0x2B, 2, 4, settings.ToArray()); context.User = user; } if (PolarisApp.Config.motd != "") { context.SendPacket(new SystemMessagePacket(PolarisApp.Config.motd, SystemMessagePacket.MessageType.AdminMessageInstant)); } // context.SendPacket(new SystemMessagePacket("I looooooove my Raxxy <3", SystemMessagePacket.MessageType.AdminMessage)); }