/// <summary> /// Tells the client to create a player for the context ID. /// </summary> /// <param name="SendTo"></param> /// <param name="PlayerID"></param> public static void CreatePlayer(ClientContext SendTo, int PlayerID) { var b = BitConverter.GetBytes(PlayerID); var send = DSPacket.Format(Command.CLIENT_CREATEPLAYER, b); SendPacketToClient(SendTo, send); WriteLine($"Player created on context: {SendTo.ID}, for ID: {PlayerID}"); }
/// <summary> /// Client tells the server that the player has navigated to a specific point. /// </summary> /// <param name="context"></param> /// <param name="data"></param> public static void PlayerNavigated(ClientContext context, byte[] data) { var b = DSPacket.Format(Command.PLAYER_NAVIGATE, data); BroadcastPacket(b); var x = BitConverter.ToInt32(data, 4); var y = BitConverter.ToInt32(data, 8); WriteLine($"Client: {context.ID} Navigates to X:{x}, Y:{y}"); }
/// <summary> /// Sends the current level to client, forcing it to update it's level. /// </summary> /// <param name="context"></param> public static void SendLevel(ClientContext context) { if (SERVER_LevelFile == null) { WriteLine("A LevelSave is not present and therefore the SendLevel command was aborted."); return; } WriteLine($"Sending level data to context: {context.ID}"); SendPacketToClient(context, DSPacket.Format(Command.LEVEL_LEVELCHANGED, SERVER_LevelFile)); }
/// <summary> /// Client sent the server that it was interacting with an object. /// </summary> /// <param name="context"></param> /// <param name="data"></param> public static void PlayerInteracted(ClientContext context, byte[] data) { var b = DSPacket.Format(Command.PLAYER_INTERACT, data); BroadcastPacket(b); var x = BitConverter.ToInt32(data, 0); var y = BitConverter.ToInt32(data, 4); WriteLine($"Player: {x}, Interacts with Object: {y}"); }
/// <summary> /// The client tells the server that it has seated a person at a table. /// </summary> /// <param name="context"></param> /// <param name="data"></param> public static void PersonSeated(ClientContext context, byte[] data) { var b = DSPacket.Format(Command.PERSON_SEAT, data); BroadcastPacket(b, BroadcastAudience.All); //Tell all clients to seat a person at table ID in seat ID. var SenderID = BitConverter.ToInt32(data, 0); var pID = BitConverter.ToInt32(data, 4); var table = BitConverter.ToInt32(data, 8); WriteLine($"Player: {SenderID}, Seats Person: {pID} at Table: {table}"); }
public static void BroadcastGameStart() { var packet = DSPacket.Format(Command.HOST_STARTGAME, new byte[0]); BroadcastPacket(packet); }
void ProcessMessage(int MessageBufferSize) { byte[] buffer = new byte[MessageBufferSize]; context.Message.Position = 0; context.Message.Read(buffer, 0, MessageBufferSize); string message = "NO MESSAGE FORMATTED"; var packets = DSPacket.Unfold(buffer); if (packets is null) { return; } var completed = new List <DSPacket>(); foreach (var packet in packets) { if (!packet.HasEnd && !_waitingForCompletePacket) { BasePacket = packet; _waitingForCompletePacket = true; continue; } if (!packet.HasBegin && _waitingForCompletePacket) { var Packet = DSPacket.Merge(packet, BasePacket); if (Packet.HasEnd) { _waitingForCompletePacket = false; Server.WriteLine("[Client] Completed Packet Receieved: " + packet.data.Length); completed.Add(Packet); } else { BasePacket = Packet; } } else { completed.Add(packet); } } foreach (var Packet in completed) { switch ((Command)Packet.ServerCommand) { case Command.SERVER_SHUTDOWN: //Server shutting down { var r = Encoding.ASCII.GetString(Packet.data); int.TryParse(r.Substring(0, r.IndexOf('|')), out int id); r = r.Remove(0, r.IndexOf('|') + 1); Server.WriteLine($"{id} disconnected from the server because: {r}"); DisconnectedFromGame?.Invoke(id, r); } break; case Command.CLIENT_KICK: //Someone Kicked { var r = Encoding.ASCII.GetString(Packet.data); int.TryParse(r.Substring(0, r.IndexOf('|')), out int id); r = r.Remove(0, r.IndexOf('|') + 1); Server.WriteLine($"{id} has been kicked from the server because: {r}"); RemovedFromMatch?.Invoke(id, r); } break; case Command.LEVEL_LEVELCHANGED: //Switch Level Server.WriteLine("Server forcing level change. Size: " + Packet.data.Length); ReceiveLevel(Packet.data); break; case Command.CLIENT_IDCHANGE: //ID changed if (Packet.data.Length > 1) { Server.WriteLine("Command Formatting is incorrect: No <byte> in byte array."); return; } context.ID = Packet.data[0]; break; case Command.CLIENT_CREATEPLAYER: //Create player for ClientContext CreatePlayer(Packet.data); break; case Command.PLAYER_NAVIGATE: //Player navigates to a position PlayerNavigate(Packet.data); break; case Command.CLIENT_MESSAGE_ALL: //Textmessage message = Encoding.ASCII.GetString(Packet.data); string sender = message.Substring(0, message.IndexOf('|')); message = message.Substring(message.IndexOf('|') + 1); OnMessageReceived?.Invoke(sender, message); Server.WriteLine($"{sender}: {message}"); break; case Command.PLAYER_INTERACT: //Player interacts with an object PlayerInteract(Packet.data); break; case Command.PERSON_SEAT: PersonSeated(Packet.data); break; case Command.HOST_STARTGAME: //Host start game HostStartedGame?.Invoke(context.ID); break; } } PrepareForNextMessage(); }
public void RequestLevelChange(byte[] LevelData) { SendPacketToServer(DSPacket.Format(Commands.Command.LEVEL_NEWLEVEL, LevelData)); }
/// <summary> /// Tells every client to change the level to the currently stored level in the Server. /// </summary> public static void BroadcastSendLevel() { BroadcastPacket(DSPacket.Format(Command.LEVEL_LEVELCHANGED, SERVER_LevelFile)); }