From 277fbd967bf7de9e778f31c1ed8b7d0539b5ae3f Mon Sep 17 00:00:00 2001 From: Tom Weiland Date: Sat, 8 Oct 2022 17:53:18 -0700 Subject: [PATCH] Make demo projects use the Unity package --- .../Client/Assets/Scripts/Multiplayer.meta | 8 - .../Scripts/Multiplayer/MessageExtensions.cs | 70 - .../Multiplayer/MessageExtensions.cs.meta | 11 - .../Scripts/Multiplayer/RiptideNetworking.dll | Bin 70144 -> 0 bytes .../Multiplayer/RiptideNetworking.dll.meta | 33 - .../Scripts/Multiplayer/RiptideNetworking.xml | 2678 ----------------- .../Multiplayer/RiptideNetworking.xml.meta | 7 - .../{Multiplayer => }/NetworkManager.cs | 0 .../{Multiplayer => }/NetworkManager.cs.meta | 0 .../Client/Packages/manifest.json | 1 + .../Client/Packages/packages-lock.json | 7 + .../Server/Assets/Scripts/Multiplayer.meta | 8 - .../Scripts/Multiplayer/MessageExtensions.cs | 70 - .../Multiplayer/MessageExtensions.cs.meta | 11 - .../Scripts/Multiplayer/RiptideNetworking.dll | Bin 70144 -> 0 bytes .../Multiplayer/RiptideNetworking.dll.meta | 33 - .../Scripts/Multiplayer/RiptideNetworking.xml | 2678 ----------------- .../Multiplayer/RiptideNetworking.xml.meta | 7 - .../{Multiplayer => }/NetworkManager.cs | 0 .../{Multiplayer => }/NetworkManager.cs.meta | 0 .../Server/Packages/manifest.json | 1 + .../Server/Packages/packages-lock.json | 7 + .../Assets/Scripts/Multiplayer.meta | 8 - .../Scripts/Multiplayer/MessageExtensions.cs | 70 - .../Multiplayer/MessageExtensions.cs.meta | 11 - .../Scripts/Multiplayer/RiptideNetworking.dll | Bin 70144 -> 0 bytes .../Multiplayer/RiptideNetworking.dll.meta | 33 - .../Scripts/Multiplayer/RiptideNetworking.xml | 2678 ----------------- .../Multiplayer/RiptideNetworking.xml.meta | 7 - .../{Multiplayer => }/NetworkManager.cs | 0 .../{Multiplayer => }/NetworkManager.cs.meta | 0 .../PlayerHostedDemo/Packages/manifest.json | 1 + .../Packages/packages-lock.json | 7 + Docs/manual/overview/getting-started.md | 2 +- 34 files changed, 25 insertions(+), 8422 deletions(-) delete mode 100644 Demos/Unity/DedicatedServerDemo/Client/Assets/Scripts/Multiplayer.meta delete mode 100644 Demos/Unity/DedicatedServerDemo/Client/Assets/Scripts/Multiplayer/MessageExtensions.cs delete mode 100644 Demos/Unity/DedicatedServerDemo/Client/Assets/Scripts/Multiplayer/MessageExtensions.cs.meta delete mode 100644 Demos/Unity/DedicatedServerDemo/Client/Assets/Scripts/Multiplayer/RiptideNetworking.dll delete mode 100644 Demos/Unity/DedicatedServerDemo/Client/Assets/Scripts/Multiplayer/RiptideNetworking.dll.meta delete mode 100644 Demos/Unity/DedicatedServerDemo/Client/Assets/Scripts/Multiplayer/RiptideNetworking.xml delete mode 100644 Demos/Unity/DedicatedServerDemo/Client/Assets/Scripts/Multiplayer/RiptideNetworking.xml.meta rename Demos/Unity/DedicatedServerDemo/Client/Assets/Scripts/{Multiplayer => }/NetworkManager.cs (100%) rename Demos/Unity/DedicatedServerDemo/Client/Assets/Scripts/{Multiplayer => }/NetworkManager.cs.meta (100%) delete mode 100644 Demos/Unity/DedicatedServerDemo/Server/Assets/Scripts/Multiplayer.meta delete mode 100644 Demos/Unity/DedicatedServerDemo/Server/Assets/Scripts/Multiplayer/MessageExtensions.cs delete mode 100644 Demos/Unity/DedicatedServerDemo/Server/Assets/Scripts/Multiplayer/MessageExtensions.cs.meta delete mode 100644 Demos/Unity/DedicatedServerDemo/Server/Assets/Scripts/Multiplayer/RiptideNetworking.dll delete mode 100644 Demos/Unity/DedicatedServerDemo/Server/Assets/Scripts/Multiplayer/RiptideNetworking.dll.meta delete mode 100644 Demos/Unity/DedicatedServerDemo/Server/Assets/Scripts/Multiplayer/RiptideNetworking.xml delete mode 100644 Demos/Unity/DedicatedServerDemo/Server/Assets/Scripts/Multiplayer/RiptideNetworking.xml.meta rename Demos/Unity/DedicatedServerDemo/Server/Assets/Scripts/{Multiplayer => }/NetworkManager.cs (100%) rename Demos/Unity/DedicatedServerDemo/Server/Assets/Scripts/{Multiplayer => }/NetworkManager.cs.meta (100%) delete mode 100644 Demos/Unity/PlayerHostedDemo/Assets/Scripts/Multiplayer.meta delete mode 100644 Demos/Unity/PlayerHostedDemo/Assets/Scripts/Multiplayer/MessageExtensions.cs delete mode 100644 Demos/Unity/PlayerHostedDemo/Assets/Scripts/Multiplayer/MessageExtensions.cs.meta delete mode 100644 Demos/Unity/PlayerHostedDemo/Assets/Scripts/Multiplayer/RiptideNetworking.dll delete mode 100644 Demos/Unity/PlayerHostedDemo/Assets/Scripts/Multiplayer/RiptideNetworking.dll.meta delete mode 100644 Demos/Unity/PlayerHostedDemo/Assets/Scripts/Multiplayer/RiptideNetworking.xml delete mode 100644 Demos/Unity/PlayerHostedDemo/Assets/Scripts/Multiplayer/RiptideNetworking.xml.meta rename Demos/Unity/PlayerHostedDemo/Assets/Scripts/{Multiplayer => }/NetworkManager.cs (100%) rename Demos/Unity/PlayerHostedDemo/Assets/Scripts/{Multiplayer => }/NetworkManager.cs.meta (100%) diff --git a/Demos/Unity/DedicatedServerDemo/Client/Assets/Scripts/Multiplayer.meta b/Demos/Unity/DedicatedServerDemo/Client/Assets/Scripts/Multiplayer.meta deleted file mode 100644 index c4ab1d9f..00000000 --- a/Demos/Unity/DedicatedServerDemo/Client/Assets/Scripts/Multiplayer.meta +++ /dev/null @@ -1,8 +0,0 @@ -fileFormatVersion: 2 -guid: 801a5a4a36c283c4d95572aa3a82e376 -folderAsset: yes -DefaultImporter: - externalObjects: {} - userData: - assetBundleName: - assetBundleVariant: diff --git a/Demos/Unity/DedicatedServerDemo/Client/Assets/Scripts/Multiplayer/MessageExtensions.cs b/Demos/Unity/DedicatedServerDemo/Client/Assets/Scripts/Multiplayer/MessageExtensions.cs deleted file mode 100644 index 35f0d575..00000000 --- a/Demos/Unity/DedicatedServerDemo/Client/Assets/Scripts/Multiplayer/MessageExtensions.cs +++ /dev/null @@ -1,70 +0,0 @@ -using UnityEngine; - -namespace Riptide.Demos.DedicatedClient -{ - public static class MessageExtensions - { - #region Vector2 - /// - /// This method is simply an alternative way of calling . - public static Message Add(this Message message, Vector2 value) => AddVector2(message, value); - - /// Adds a to the message. - /// The to add. - /// The message that the was added to. - public static Message AddVector2(this Message message, Vector2 value) - { - return message.AddFloat(value.x).AddFloat(value.y); - } - - /// Retrieves a from the message. - /// The that was retrieved. - public static Vector2 GetVector2(this Message message) - { - return new Vector2(message.GetFloat(), message.GetFloat()); - } - #endregion - - #region Vector3 - /// - /// This method is simply an alternative way of calling . - public static Message Add(this Message message, Vector3 value) => AddVector3(message, value); - - /// Adds a to the message. - /// The to add. - /// The message that the was added to. - public static Message AddVector3(this Message message, Vector3 value) - { - return message.AddFloat(value.x).AddFloat(value.y).AddFloat(value.z); - } - - /// Retrieves a from the message. - /// The that was retrieved. - public static Vector3 GetVector3(this Message message) - { - return new Vector3(message.GetFloat(), message.GetFloat(), message.GetFloat()); - } - #endregion - - #region Quaternion - /// - /// This method is simply an alternative way of calling . - public static Message Add(this Message message, Quaternion value) => AddQuaternion(message, value); - - /// Adds a to the message. - /// The to add. - /// The message that the was added to. - public static Message AddQuaternion(this Message message, Quaternion value) - { - return message.AddFloat(value.x).AddFloat(value.y).AddFloat(value.z).AddFloat(value.w); - } - - /// Retrieves a from the message. - /// The that was retrieved. - public static Quaternion GetQuaternion(this Message message) - { - return new Quaternion(message.GetFloat(), message.GetFloat(), message.GetFloat(), message.GetFloat()); - } - #endregion - } -} diff --git a/Demos/Unity/DedicatedServerDemo/Client/Assets/Scripts/Multiplayer/MessageExtensions.cs.meta b/Demos/Unity/DedicatedServerDemo/Client/Assets/Scripts/Multiplayer/MessageExtensions.cs.meta deleted file mode 100644 index cefdbd38..00000000 --- a/Demos/Unity/DedicatedServerDemo/Client/Assets/Scripts/Multiplayer/MessageExtensions.cs.meta +++ /dev/null @@ -1,11 +0,0 @@ -fileFormatVersion: 2 -guid: e994a35be988bef40b7d7f7b27508092 -MonoImporter: - externalObjects: {} - serializedVersion: 2 - defaultReferences: [] - executionOrder: 0 - icon: {instanceID: 0} - userData: - assetBundleName: - assetBundleVariant: diff --git a/Demos/Unity/DedicatedServerDemo/Client/Assets/Scripts/Multiplayer/RiptideNetworking.dll b/Demos/Unity/DedicatedServerDemo/Client/Assets/Scripts/Multiplayer/RiptideNetworking.dll deleted file mode 100644 index 48e9c08175712576464662324720181dfa54cb2d..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 70144 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 diff --git a/Demos/Unity/DedicatedServerDemo/Client/Assets/Scripts/Multiplayer/RiptideNetworking.dll.meta b/Demos/Unity/DedicatedServerDemo/Client/Assets/Scripts/Multiplayer/RiptideNetworking.dll.meta deleted file mode 100644 index 0eb4fc80..00000000 --- a/Demos/Unity/DedicatedServerDemo/Client/Assets/Scripts/Multiplayer/RiptideNetworking.dll.meta +++ /dev/null @@ -1,33 +0,0 @@ -fileFormatVersion: 2 -guid: a2a64e903ba3c4e4b844c46575e8bcd1 -PluginImporter: - externalObjects: {} - serializedVersion: 2 - iconMap: {} - executionOrder: {} - defineConstraints: [] - isPreloaded: 0 - isOverridable: 0 - isExplicitlyReferenced: 0 - validateReferences: 1 - platformData: - - first: - Any: - second: - enabled: 1 - settings: {} - - first: - Editor: Editor - second: - enabled: 0 - settings: - DefaultValueInitialized: true - - first: - Windows Store Apps: WindowsStoreApps - second: - enabled: 0 - settings: - CPU: AnyCPU - userData: - assetBundleName: - assetBundleVariant: diff --git a/Demos/Unity/DedicatedServerDemo/Client/Assets/Scripts/Multiplayer/RiptideNetworking.xml b/Demos/Unity/DedicatedServerDemo/Client/Assets/Scripts/Multiplayer/RiptideNetworking.xml deleted file mode 100644 index 1cd4d0cf..00000000 --- a/Demos/Unity/DedicatedServerDemo/Client/Assets/Scripts/Multiplayer/RiptideNetworking.xml +++ /dev/null @@ -1,2678 +0,0 @@ - - - - RiptideNetworking - - - - A client that can connect to a . - - - Invoked when a connection to the server is established. - - - Invoked when a connection to the server fails to be established. - - - Invoked when a message is received. - - - Invoked when disconnected from the server. - - - Invoked when another non-local client connects. - - - Invoked when another non-local client disconnects. - - - The client's numeric ID. - - - - - - - This value is slower to accurately represent lasting changes in latency than , but it is less susceptible to changing drastically due to significant—but temporary—jumps in latency. - - - Whether or not the client is currently not connected nor trying to connect. - - - Whether or not the client is currently in the process of connecting. - - - Whether or not the client's connection is currently pending (will only be when a server doesn't immediately accept the connection request). - - - Whether or not the client is currently connected. - - - - - - Encapsulates a method that handles a message from a server. - The message that was received. - - - The client's connection to a server. - - - How many connection attempts have been made so far. - - - How many connection attempts to make before giving up. - - - - - - The underlying transport's client that is used for sending and receiving data. - - - Custom data to include when connecting. - - - - - - - - - Disconnects the client if it's connected and swaps out the transport it's using. - The new transport to use for sending and receiving data. - This method does not automatically reconnect to the server. To continue communicating with the server, must be called again. - - - Attempts to connect to a server at the given host address. - The host address to connect to. - How many connection attempts to make before giving up. - The ID of the group of message handler methods to use when building . - Data that should be sent to the server with the connection attempt. Use to get an empty message instance. - Riptide's default transport expects the host address to consist of an IP and port, separated by a colon. For example: 127.0.0.1:7777. If you are using a different transport, check the relevant documentation for what information it requires in the host address. - if a connection attempt will be made. if an issue occurred (such as being in an invalid format) and a connection attempt will not be made. - - - Subscribes appropriate methods to the transport's events. - - - Unsubscribes methods from all of the transport's events. - - - - - - - - - - - - - - - Sends a message to the server. - The message to send. - Whether or not to return the message to the pool after it is sent. - - - - Disconnects from the server. - - - Cleans up the local side of the connection. - The reason why the client has disconnected. - The disconnection or rejection message, potentially containing extra data to be handled externally. - TData that should be sent to the client being disconnected. Use to get an empty message instance. Unused if the connection wasn't rejected. - - - What to do when the transport establishes a connection. - - - What to do when the transport fails to connect. - - - What to do when the transport disconnects. - - - Invokes the event. - - - Invokes the event. - The reason for the connection failure. - Additional data related to the failed connection attempt. - - - Invokes the event and initiates handling of the received message. - The received message. - - - Invokes the event. - The reason for the disconnection. - Additional data related to the disconnection. - - - Invokes the event. - The numeric ID of the client that connected. - - - Invokes the event. - The numeric ID of the client that disconnected. - - - The state of a connection. - - - Not connected. No connection has been established or the connection has been closed. - - - Connecting. Still trying to establish a connection. - - - Connection is pending. The server is still determining whether or not the connection should be allowed. - - - Connected. A connection has been established successfully. - - - Represents a connection to a or . - - - The connection's numeric ID. - - - Whether or not the connection is currently not connected nor trying to connect. - - - Whether or not the connection is currently in the process of connecting. - - - Whether or not the connection is currently pending (will only be when a server doesn't immediately accept the connection request). - - - Whether or not the connection is currently connected. - - - The round trip time (ping) of the connection, in milliseconds. -1 if not calculated yet. - - - The smoothed round trip time (ping) of the connection, in milliseconds. -1 if not calculated yet. - This value is slower to accurately represent lasting changes in latency than , but it is less susceptible to changing drastically due to significant—but temporary—jumps in latency. - - - Whether or not the connection can time out. - - - The local peer this connection is associated with. - - - Whether or not the connection has timed out. - - - Whether or not the connection attempt has timed out. Uses a multiple of and ignores the value of . - - - The currently pending reliably sent messages whose delivery has not been acknowledged yet. Stored by sequence ID. - - - The sequence ID of the latest message that we want to acknowledge. - - - Messages that we have received and want to acknowledge. - - - Messages that we have received whose sequence IDs no longer fall into 's range. Used to improve duplicate message filtering capabilities. - - - The sequence ID of the latest message that we've received an ack for. - - - Messages that we sent which have been acknoweledged. - - - A with the left-most bit set to 1. - - - The next sequence ID to use. - - - The connection's current state. - - - The time at which the last heartbeat was received from the other end. - - - The ID of the last ping that was sent. - - - The ID of the currently pending ping. - - - The stopwatch that tracks the time since the currently pending ping was sent. - - - Initializes the connection. - - - Resets the connection's timeout time. - - - Sends a message. - The message to send. - Whether or not to return the message to the pool after it is sent. - - If you intend to continue using the message instance after calling this method, you must set - to . can be used to manually return the message to the pool at a later time. - - - - Sends data. - The array containing the data. - The number of bytes in the array which should be sent. - - - Updates acks and determines whether the message is a duplicate. - The message's sequence ID. - Whether or not the message should be handled. - - - Cleans up the local side of the connection. - - - Updates the acks bitfield and determines whether or not to handle the message. - The gap between the newly received sequence ID and the previously last received sequence ID. - Whether or not the message should be handled, based on whether or not it's a duplicate. - - - Updates the duplicate filter bitfield and determines whether or not to handle the message. - The gap between the newly received sequence ID and the previously last received sequence ID. - Whether or not the message should be handled, based on whether or not it's a duplicate. - - - Updates which messages we've received acks for. - The latest sequence ID that the other end has received. - A redundant list of sequence IDs that the other end has (or has not) received. - - - Check the ack status of the given sequence ID. - The sequence ID whose ack status to check. - The bit corresponding to the sequence ID's position in the bit field. - - - Immediately marks the of a given sequence ID as delivered. - The sequence ID that was acknowledged. - - - Puts the connection in the pending state. - - - Sends an ack message for the given sequence ID. - The sequence ID to acknowledge. - - - Handles an ack message. - The ack message to handle. - - - Handles an ack message for a sequence ID other than the last received one. - The ack message to handle. - - - Sends a welcome message. - - - Handles a welcome message on the server. - The welcome message to handle. - - - Handles a heartbeat message. - The heartbeat message to handle. - - - Sends a heartbeat message. - - - Handles a welcome message on the client. - The welcome message to handle. - - - Sends a welcome response message. - - - Sends a heartbeat message. - - - Handles a heartbeat message. - The heartbeat message to handle. - - - Contains event data for when a client connects to the server. - - - The newly connected client. - - - Initializes event data. - The newly connected client. - - - Contains event data for when a client disconnects from the server. - - - The client that disconnected. - - - The reason for the disconnection. - - - Initializes event data. - The client that disconnected. - The reason for the disconnection. - - - Contains event data for when a message is received. - - - The connection from which the message was received. - - - The ID of the message. - - - The received message. - - - Initializes event data. - The connection from which the message was received. - The ID of the message. - The received message. - - - Contains event data for when a connection attempt to a server fails. - - - Additional data related to the failed connection attempt (if any). - - - Initializes event data. - Additional data related to the failed connection attempt (if any). - - - Contains event data for when the client disconnects from a server. - - - The reason for the disconnection. - - - Additional data related to the disconnection (if any). - - - Initializes event data. - The reason for the disconnection. - Additional data related to the disconnection (if any). - - - Contains event data for when a non-local client connects to the server. - - - The numeric ID of the client that connected. - - - Initializes event data. - The numeric ID of the client that connected. - - - Contains event data for when a non-local client disconnects from the server. - - - The numeric ID of the client that disconnected. - - - Initializes event data. - The numeric ID of the client that disconnected. - - - The exception that is thrown when a does not contain enough unread bytes to add a certain value. - - - The message with insufficient remaining capacity. - - - The name of the type which could not be added to the message. - - - The number of available bytes the type requires in order to be added successfully. - - - Initializes a new instance. - - - Initializes a new instance with a specified error message. - The error message that explains the reason for the exception. - - - Initializes a new instance with a specified error message and a reference to the inner exception that is the cause of this exception. - The error message that explains the reason for the exception. - The exception that is the cause of the current exception. If is not a null reference, the current exception is raised in a catch block that handles the inner exception. - - - Initializes a new instance and constructs an error message from the given information. - The message with insufficient remaining capacity. - The name of the type which could not be added to the message. - The number of available bytes required for the type to be added successfully. - - - Initializes a new instance and constructs an error message from the given information. - The message with insufficient remaining capacity. - The length of the array which could not be added to the message. - The name of the array's type. - The number of available bytes required for a single element of the array to be added successfully. - The number of available bytes required for the entire array to be added successfully. If left as -1, this will be set to * . - - - Constructs the error message from the given information. - The error message. - - - Constructs the error message from the given information. - The error message. - - - The exception that is thrown when a method with a is not marked as . - - - The type containing the handler method. - - - The name of the handler method. - - - Initializes a new instance. - - - Initializes a new instance with a specified error message. - The error message that explains the reason for the exception. - - - Initializes a new instance with a specified error message and a reference to the inner exception that is the cause of this exception. - The error message that explains the reason for the exception. - The exception that is the cause of the current exception. If is not a null reference, the current exception is raised in a catch block that handles the inner exception. - - - Initializes a new instance and constructs an error message from the given information. - The type containing the handler method. - The name of the handler method. - - - Constructs the error message from the given information. - The error message. - - - The exception that is thrown when a method with a does not have an acceptable message handler method signature (either or ). - - - The type containing the handler method. - - - The name of the handler method. - - - Initializes a new instance. - - - Initializes a new instance with a specified error message. - The error message that explains the reason for the exception. - - - Initializes a new instance with a specified error message and a reference to the inner exception that is the cause of this exception. - The error message that explains the reason for the exception. - The exception that is the cause of the current exception. If is not a null reference, the current exception is raised in a catch block that handles the inner exception. - - - Initializes a new instance and constructs an error message from the given information. - The type containing the handler method. - The name of the handler method. - - - Constructs the error message from the given information. - The error message. - - - The exception that is thrown when multiple methods with s are set to handle messages with the same ID and have the same method signature. - - - The message ID with multiple handler methods. - - - The type containing the first handler method. - - - The name of the first handler method. - - - The type containing the second handler method. - - - The name of the second handler method. - - - Initializes a new instance with a specified error message. - - - Initializes a new instance with a specified error message. - The error message that explains the reason for the exception. - - - Initializes a new instance with a specified error message and a reference to the inner exception that is the cause of this exception. - The error message that explains the reason for the exception. - The exception that is the cause of the current exception. If is not a null reference, the current exception is raised in a catch block that handles the inner exception. - - - Initializes a new instance and constructs an error message from the given information. - The message ID with multiple handler methods. - The first handler method's info. - The second handler method's info. - - - Constructs the error message from the given information. - The error message. - - - Represents a type that can be added to and retrieved from messages using the and methods. - - - Adds the type to the message. - The message to add the type to. - - - Retrieves the type from the message. - The message to retrieve the type from. - - - The send mode of a . - - - Unreliable send mode. - - - Reliable send mode. - - - Provides functionality for converting data to bytes and vice versa. - - - The maximum number of bytes required for a message's header. - 1 byte for the actual header, 2 bytes for the sequence ID (only for reliable messages), 2 bytes for the message ID. Messages sent unreliably will use 2 bytes less than this value for the header. - - - The maximum number of bytes that a message can contain, including the . - - - The maximum number of bytes of payload data that a message can contain. This value represents how many bytes can be added to a message on top of the . - - - How many messages to add to the pool for each or instance that is started. - Changes will not affect and instances which are already running until they are restarted. - - - A pool of reusable message instances. - - - The message's send mode. - - - The length in bytes of the unread data contained in the message. - - - The length in bytes of the data that has been written to the message. - - - How many more bytes can be written into the packet. - - - The message's data. - - - The position in the byte array that the next bytes will be written to. - - - The position in the byte array that the next bytes will be read from. - - - Initializes a reusable instance. - The maximum amount of bytes the message can contain. - - - Trims the message pool to a more appropriate size for how many and/or instances are currently running. - - - Gets a usable message instance. - A message instance ready to be used. - - - Gets a message instance that can be used for sending. - The mode in which the message should be sent. - The message ID. - A message instance ready to be used for sending. - - - - NOTE: will be cast to a . You should ensure that its value never exceeds that of , otherwise you'll encounter unexpected behaviour when handling messages. - - - Gets a message instance that can be used for sending. - The message's header type. - A message instance ready to be used for sending. - - - Gets a message instance directly from the pool without doing any extra setup. - As this message instance is returned straight from the pool, it will contain all previous data and settings. Using this instance without preparing it properly will likely result in unexpected behaviour. - A message instance. - - - Retrieves a message instance from the pool. If none is available, a new instance is created. - A message instance ready to be used for sending or handling. - - - Returns the message instance to the internal pool so it can be reused. - - - Prepares the message to be used. - The message, ready to be used. - - - Prepares the message to be used for sending. - The header of the message. - The message, ready to be used for sending. - - - Prepares the message to be used for handling. - The header of the message. - The number of bytes that this message contains and which can be retrieved. - The message, ready to be used for handling. - - - Sets the message's header byte to the given and determines the appropriate and read/write positions. - The header to use for this message. - - - Adds a single to the message. - The to add. - The message that the was added to. - - - Adds a single to the message. - The to add. - The message that the was added to. - - - Retrieves a single from the message. - The that was retrieved. - - - Retrieves a single from the message. - The that was retrieved. - - - Adds a array to the message. - The array to add. - Whether or not to include the length of the array in the message. - The message that the array was added to. - - - Adds an array to the message. - The array to add. - Whether or not to include the length of the array in the message. - The message that the array was added to. - - - Retrieves a array from the message. - The array that was retrieved. - - - Retrieves a array from the message. - The amount of bytes to retrieve. - The array that was retrieved. - - - Populates a array with bytes retrieved from the message. - The amount of bytes to retrieve. - The array to populate. - The position at which to start populating the array. - - - Retrieves an array from the message. - The array that was retrieved. - - - Retrieves an array from the message. - The amount of sbytes to retrieve. - The array that was retrieved. - - - Populates a array with bytes retrieved from the message. - The amount of sbytes to retrieve. - The array to populate. - The position at which to start populating . - - - Reads a number of bytes from the message and writes them into the given array. - The amount of bytes to read. - The array to write the bytes into. - The position at which to start writing into the array. - - - Reads a number of sbytes from the message and writes them into the given array. - The amount of sbytes to read. - The array to write the sbytes into. - The position at which to start writing into the array. - - - Adds a to the message. - The to add. - The message that the was added to. - - - Retrieves a from the message. - The that was retrieved. - - - Adds a array to the message. - The array to add. - Whether or not to include the length of the array in the message. - The message that the array was added to. - - - Retrieves a array from the message. - The array that was retrieved. - - - Retrieves a array from the message. - The amount of bools to retrieve. - The array that was retrieved. - - - Populates a array with bools retrieved from the message. - The amount of bools to retrieve. - The array to populate. - The position at which to start populating the array. - - - Reads a number of bools from the message and writes them into the given array. - The number of bytes the bools are being stored in. - The array to write the bools into. - The position at which to start writing into the array. - - - Adds a to the message. - The to add. - The message that the was added to. - - - Adds a to the message. - The to add. - The message that the was added to. - - - Retrieves a from the message. - The that was retrieved. - - - Retrieves a from the message. - The that was retrieved. - - - Adds a array to the message. - The array to add. - Whether or not to include the length of the array in the message. - The message that the array was added to. - - - Adds a array to the message. - The array to add. - Whether or not to include the length of the array in the message. - The message that the array was added to. - - - Retrieves a array from the message. - The array that was retrieved. - - - Retrieves a array from the message. - The amount of shorts to retrieve. - The array that was retrieved. - - - Populates a array with shorts retrieved from the message. - The amount of shorts to retrieve. - The array to populate. - The position at which to start populating the array. - - - Retrieves a array from the message. - The array that was retrieved. - - - Retrieves a array from the message. - The amount of ushorts to retrieve. - The array that was retrieved. - - - Populates a array with ushorts retrieved from the message. - The amount of ushorts to retrieve. - The array to populate. - The position at which to start populating the array. - - - Reads a number of shorts from the message and writes them into the given array. - The amount of shorts to read. - The array to write the shorts into. - The position at which to start writing into the array. - - - Reads a number of ushorts from the message and writes them into the given array. - The amount of ushorts to read. - The array to write the ushorts into. - The position at which to start writing into the array. - - - Adds an to the message. - The to add. - The message that the was added to. - - - Adds a to the message. - The to add. - The message that the was added to. - - - Retrieves an from the message. - The that was retrieved. - - - Retrieves a from the message. - The that was retrieved. - - - Adds an array message. - The array to add. - Whether or not to include the length of the array in the message. - The message that the array was added to. - - - Adds a array to the message. - The array to add. - Whether or not to include the length of the array in the message. - The message that the array was added to. - - - Retrieves an array from the message. - The array that was retrieved. - - - Retrieves an array from the message. - The amount of ints to retrieve. - The array that was retrieved. - - - Populates an array with ints retrieved from the message. - The amount of ints to retrieve. - The array to populate. - The position at which to start populating the array. - - - Retrieves a array from the message. - The array that was retrieved. - - - Retrieves a array from the message. - The amount of uints to retrieve. - The array that was retrieved. - - - Populates a array with uints retrieved from the message. - The amount of uints to retrieve. - The array to populate. - The position at which to start populating the array. - - - Reads a number of ints from the message and writes them into the given array. - The amount of ints to read. - The array to write the ints into. - The position at which to start writing into the array. - - - Reads a number of uints from the message and writes them into the given array. - The amount of uints to read. - The array to write the uints into. - The position at which to start writing into the array. - - - Adds a to the message. - The to add. - The message that the was added to. - - - Adds a to the message. - The to add. - The message that the was added to. - - - Retrieves a from the message. - The that was retrieved. - - - Retrieves a from the message. - The that was retrieved. - - - Adds a array to the message. - The array to add. - Whether or not to include the length of the array in the message. - The message that the array was added to. - - - Adds a array to the message. - The array to add. - Whether or not to include the length of the array in the message. - The message that the array was added to. - - - Retrieves a array from the message. - The array that was retrieved. - - - Retrieves a array from the message. - The amount of longs to retrieve. - The array that was retrieved. - - - Populates a array with longs retrieved from the message. - The amount of longs to retrieve. - The array to populate. - The position at which to start populating the array. - - - Retrieves a array from the message. - The array that was retrieved. - - - Retrieves a array from the message. - The amount of ulongs to retrieve. - The array that was retrieved. - - - Populates a array with ulongs retrieved from the message. - The amount of ulongs to retrieve. - The array to populate. - The position at which to start populating the array. - - - Reads a number of longs from the message and writes them into the given array. - The amount of longs to read. - The array to write the longs into. - The position at which to start writing into the array. - - - Reads a number of ulongs from the message and writes them into the given array. - The amount of ulongs to read. - The array to write the ulongs into. - The position at which to start writing into the array. - - - Adds a to the message. - The to add. - The message that the was added to. - - - Retrieves a from the message. - The that was retrieved. - - - Adds a array to the message. - The array to add. - Whether or not to include the length of the array in the message. - The message that the array was added to. - - - Retrieves a array from the message. - The array that was retrieved. - - - Retrieves a array from the message. - The amount of floats to retrieve. - The array that was retrieved. - - - Populates a array with floats retrieved from the message. - The amount of floats to retrieve. - The array to populate. - The position at which to start populating the array. - - - Reads a number of floats from the message and writes them into the given array. - The amount of floats to read. - The array to write the floats into. - The position at which to start writing into the array. - - - Adds a to the message. - The to add. - The message that the was added to. - - - Retrieves a from the message. - The that was retrieved. - - - Adds a array to the message. - The array to add. - Whether or not to include the length of the array in the message. - The message that the array was added to. - - - Retrieves a array from the message. - The array that was retrieved. - - - Retrieves a array from the message. - The amount of doubles to retrieve. - The array that was retrieved. - - - Populates a array with doubles retrieved from the message. - The amount of doubles to retrieve. - The array to populate. - The position at which to start populating the array. - - - Reads a number of doubles from the message and writes them into the given array. - The amount of doubles to read. - The array to write the doubles into. - The position at which to start writing into the array. - - - Adds a to the message. - The to add. - The message that the was added to. - - - Retrieves a from the message. - The that was retrieved. - - - Adds a array to the message. - The array to add. - Whether or not to include the length of the array in the message. - The message that the array was added to. - - - Retrieves a array from the message. - The array that was retrieved. - - - Retrieves a array from the message. - The amount of strings to retrieve. - The array that was retrieved. - - - Populates a array with strings retrieved from the message. - The amount of strings to retrieve. - The array to populate. - The position at which to start populating the array. - - - The maximum number of elements an array can contain where the length still fits into a single byte. - - - The maximum number of elements an array can contain where the length still fits into two byte2. - - - Adds the length of an array to the message, using either 1 or 2 bytes depending on how large the array is. Does not support arrays with more than 32,767 elements. - The length of the array. - - - Retrieves the length of an array from the message, using either 1 or 2 bytes depending on how large the array is. - The length of the array. - - - Adds a serializable to the message. - The serializable to add. - The message that the serializable was added to. - - - Retrieves a serializable from the message. - The serializable that was retrieved. - - - Adds an array of serializables to the message. - The array to add. - Whether or not to include the length of the array in the message. - The message that the array was added to. - - - Retrieves an array of serializables from the message. - The array that was retrieved. - - - Retrieves an array of serializables from the message. - The amount of serializables to retrieve. - The array that was retrieved. - - - Populates an array of serializables retrieved from the message. - The amount of serializables to retrieve. - The array to populate. - The position at which to start populating the array. - - - Reads a number of serializables from the message and writes them into the given array. - The amount of serializables to read. - The array to write the serializables into. - The position at which to start writing into . - - - - This method is simply an alternative way of calling . - - - - This method is simply an alternative way of calling . - - - - This method is simply an alternative way of calling . - - - - This method is simply an alternative way of calling . - - - - This method is simply an alternative way of calling . - - - - This method is simply an alternative way of calling . - - - - This method is simply an alternative way of calling . - - - - This method is simply an alternative way of calling . - - - - This method is simply an alternative way of calling . - - - - This method is simply an alternative way of calling . - - - - This method is simply an alternative way of calling . - - - - This method is simply an alternative way of calling . - - - - This method is simply an alternative way of calling . - - - - This method is simply an alternative way of calling . - - - - This method is simply an alternative way of calling . - - - - This method is simply an alternative way of calling . - - - - This method is simply an alternative way of calling . - - - - This method is simply an alternative way of calling . - - - - This method is simply an alternative way of calling . - - - - This method is simply an alternative way of calling . - - - - This method is simply an alternative way of calling . - - - - This method is simply an alternative way of calling . - - - - This method is simply an alternative way of calling . - - - - This method is simply an alternative way of calling . - - - - This method is simply an alternative way of calling . - - - - This method is simply an alternative way of calling . - - - The name of a value. - - - The name of a value. - - - The name of a value. - - - The name of a value. - - - The name of a value. - - - The name of an value. - - - The name of a value. - - - The name of a value. - - - The name of a value. - - - The name of a value. - - - The name of a value. - - - The name of a value. - - - The name of an array length value. - - - Constructs an error message for when a message contains insufficient unread bytes to retrieve a certain value. - The name of the value type for which the retrieval attempt failed. - Text describing the value which will be returned. - The error message. - - - Constructs an error message for when a message contains insufficient unread bytes to retrieve an array of values. - The expected length of the array. - The name of the value type for which the retrieval attempt failed. - The error message. - - - Constructs an error message for when a number of retrieved values do not fit inside the bounds of the provided array. - The number of values being retrieved. - The length of the provided array. - The position in the array at which to begin writing values. - The name of the value type which is being retrieved. - The name of the value type in plural form. If left empty, this will be set to with an s appended to it. - The error message. - - - Specifies a method as the message handler for messages with the given ID. - - - In order for a method to qualify as a message handler, it must match a valid message handler method signature. s - will only use methods marked with this attribute if they match the signature, and s - will only use methods marked with this attribute if they match the signature. - - - Methods marked with this attribute which match neither of the valid message handler signatures will not be used by s - or s and will cause warnings at runtime. - - - If you want a or to only use a subset of all message handler methods, you can do so by setting up - custom message handler groups. Simply set the group ID in the constructor and pass the - same value to the or method. This - will make that or only use message handlers which have the same group ID. - - - - - The ID of the message type which this method is meant to handle. - - - The ID of the group of message handlers which this method belongs to. - - - Initializes a new instance of the class with the and values. - The ID of the message type which this method is meant to handle. - The ID of the group of message handlers which this method belongs to. - - s will only use this method if its signature matches the signature. - s will only use this method if its signature matches the signature. - This method will be ignored if its signature matches neither of the valid message handler signatures. - - - - Provides functionality for enabling/disabling automatic message relaying by message type. - - - The number of bits an int consists of. - - - An array storing all the bits which represent whether messages of a given ID should be relayed or not. - - - Creates a filter of a given size. - How big to make the filter. - - should be set to the value of the largest message ID, plus 1. For example, if a server will - handle messages with IDs 1, 2, 3, 7, and 8, should be set to 9 (8 is the largest possible value, - and 8 + 1 = 9) despite the fact that there are only 5 unique message IDs the server will ever handle. - - - - Creates a filter based on an enum of message IDs. - The enum type. - - - Creates a filter of a given size and enables relaying for the given message IDs. - How big to make the filter. - Message IDs to enable auto relaying for. - - - - Creates a filter based on an enum of message IDs and enables relaying for the given message IDs. - The enum type. - Message IDs to enable relaying for. - - - Enables auto relaying for the given message IDs. - Message IDs to enable relaying for. - - - Calculate the filter size necessary to manage all message IDs in the given enum. - The enum type. - The appropriate filter size. - is not an . - - - Sets the filter size. - How big to make the filter. - - - Enables auto relaying for the given message ID. - The message ID to enable relaying for. - - - - - - Disables auto relaying for the given message ID. - The message ID to enable relaying for. - - - - - - Checks whether or not messages with the given ID should be relayed. - The message ID to check. - Whether or not messages with the given ID should be relayed. - - - The reason the connection attempt was rejected. - - - No response was received from the server (because the client has no internet connection, the server is offline, no server is listening on the target endpoint, etc.). - - - The client is already connected. - - - A connection attempt is already pending. - - - The server is full. - - - The connection attempt was rejected. - - - The connection attempt was rejected and custom data may have been included with the rejection message. - - - The reason for a disconnection. - - - No connection was ever established. - - - The connection attempt was rejected by the server. - - - The active transport detected a problem with the connection. - - - The connection timed out. - - This also acts as the fallback reason—if a client disconnects and the message containing the real reason is lost - in transmission, it can't be resent as the connection will have already been closed. As a result, the other end will time - out the connection after a short period of time and this will be used as the reason. - - - - The client was forcibly disconnected by the server. - - - The server shut down. - - - The disconnection was initiated by the client. - - - Provides base functionality for and . - - - The name to use when logging messages via . - - - The time (in milliseconds) after which to disconnect if no heartbeats are received. - - - The interval (in milliseconds) at which to send and expect heartbeats to be received. - Changes to this value will only take effect after the next heartbeat is executed. - - - The number of currently active and instances. - - - The current time. - - - The text to log when disconnected due to . - - - The text to log when disconnected due to . - - - The text to log when disconnected due to . - - - The text to log when disconnected due to . - - - The text to log when disconnected due to . - - - The text to log when disconnected due to . - - - The text to log when disconnected or rejected due to an unknown reason. - - - The text to log when the connection failed due to . - - - The text to log when the connection failed due to . - - - The text to log when the connection failed due to . - - - The text to log when the connection failed due to . - - - A stopwatch used to track how much time has passed. - - - Received messages which need to be handled. - - - A queue of events to execute, ordered by how soon they need to be executed. - - - Initializes the peer. - The name to use when logging messages via . - - - Retrieves methods marked with . - An array containing message handler methods. - - - Builds a dictionary of message IDs and their corresponding message handler methods. - The ID of the group of message handler methods to include in the dictionary. - - - Starts tracking how much time has passed. - - - Stops tracking how much time has passed. - - - Beats the heart. - - - Handles any received messages and invokes any delayed events which need to be invoked. - - - Sets up a delayed event to be executed after the given time has passed. - How long from now to execute the delayed event, in milliseconds. - The delayed event to execute later. - - - Handles all queued messages. - - - Handles data received by the transport. - - - Handles a message. - The message to handle. - The message's header type. - The connection which the message was received on. - - - Increases . For use when a new or is started. - - - Decreases . For use when a or is stopped. - - - Stores information about a message that needs to be handled. - - - The message that needs to be handled. - - - The message's header type. - - - The connection on which the message was received. - - - Handles initialization. - The message that needs to be handled. - The message's header type. - The connection on which the message was received. - - - Represents a currently pending reliably sent message whose delivery has not been acknowledged yet. - - - The time of the latest send attempt. - - - The multiplier used to determine how long to wait before resending a pending message. - - - How often to try sending the message before giving up. - - - A pool of reusable instances. - - - The to use to send (and resend) the pending message. - - - The sequence ID of the message. - - - The contents of the message. - - - The length in bytes of the data that has been written to the message. - - - How many send attempts have been made so far. - - - Whether the pending message has been cleared or not. - - - Handles initial setup. - - - Retrieves a instance, initializes it and then sends it. - The sequence ID of the message. - The message that is being sent reliably. - The to use to send (and resend) the pending message. - - - Retrieves a instance from the pool. If none is available, a new instance is created. - A instance. - - - Returns the instance to the pool so it can be reused. - - - Resends the message. - - - Attempts to send the message. - - - Clears the message. - Whether or not to remove the message from . - - - A server that can accept connections from s. - - - Invoked when a client connects. - - - Invoked when a message is received. - - - Invoked when a client disconnects. - - - Whether or not the server is currently running. - - - The local port that the server is running on. - - - The maximum number of concurrent connections. - - - The number of currently connected clients. - - - An array of all the currently connected clients. - The position of each instance in the array does not correspond to that client's numeric ID (except by coincidence). - - - Encapsulates a method that handles a message from a client. - The numeric ID of the client from whom the message was received. - The message that was received. - - - Encapsulates a method that determines whether or not to accept a client's connection attempt. - - - An optional method which determines whether or not to accept a client's connection attempt. - The parameter is the pending connection and the parameter is a message containing any additional data the client included with the connection attempt. - - - Stores which message IDs have auto relaying enabled. Relaying is disabled entirely when this is . - - - Currently pending connections which are waiting to be accepted or rejected. - - - Currently connected clients. - - - Clients that have timed out and need to be removed from . - - - Methods used to handle messages, accessible by their corresponding message IDs. - - - The underlying transport's server that is used for sending and receiving data. - - - All currently unused client IDs. - - - Handles initial setup. - The transport to use for sending and receiving data. - The name to use when logging messages via . - - - Handles initial setup using the built-in UDP transport. - The name to use when logging messages via . - - - Stops the server if it's running and swaps out the transport it's using. - The new underlying transport server to use for sending and receiving data. - This method does not automatically restart the server. To continue accepting connections, must be called again. - - - Starts the server. - The local port on which to start the server. - The maximum number of concurrent connections to allow. - The ID of the group of message handler methods to use when building . - - - Subscribes appropriate methods to the transport's events. - - - Unsubscribes methods from all of the transport's events. - - - - - - Handles an incoming connection attempt. - - - Handles a connect message. - The client that sent the connect message. - The connect message. - - - Accepts the given pending connection. - The connection to accept. - - - Rejects the given pending connection. - The connection to reject. - Data that should be sent to the client being rejected. Use to get an empty message instance. - - - Accepts the given pending connection. - The connection to accept. - - - Rejects the given pending connection. - The connection to reject. - The reason why the connection is being rejected. - Data that should be sent to the client being rejected - - - Checks if clients have timed out. - - - - - - - - - Sends a message to a given client. - The message to send. - The numeric ID of the client to send the message to. - Whether or not to return the message to the pool after it is sent. - - - - Sends a message to a given client. - The message to send. - The client to send the message to. - Whether or not to return the message to the pool after it is sent. - - - - Sends a message to all connected clients. - The message to send. - Whether or not to return the message to the pool after it is sent. - - - - Sends a message to all connected clients except the given one. - The message to send. - The numeric ID of the client to not send the message to. - Whether or not to return the message to the pool after it is sent. - - - - Retrieves the client with the given ID, if a client with that ID is currently connected. - The ID of the client to retrieve. - The retrieved client. - if a client with the given ID was connected; otherwise . - - - Disconnects a specific client. - The numeric ID of the client to disconnect. - Data that should be sent to the client being disconnected. Use to get an empty message instance. - - - Disconnects the given client. - The client to disconnect. - Data that should be sent to the client being disconnected. Use to get an empty message instance. - - - Cleans up the local side of the given connection. - The client to disconnect. - The reason why the client is being disconnected. - - - What to do when the transport disconnects a client. - - - Stops the server. - - - Initializes available client IDs. - - - Retrieves an available client ID. - The client ID. 0 if none were available. - - - Sends a disconnect message. - The client to send the disconnect message to. - Why the client is being disconnected. - Optional custom data that should be sent to the client being disconnected. - - - Sends a client connected message. - The newly connected client. - - - Sends a client disconnected message. - The numeric ID of the client that disconnected. - - - Invokes the event. - The newly connected client. - - - Invokes the event and initiates handling of the received message. - The received message. - The client from which the message was received. - - - Invokes the event. - The client that disconnected. - The reason for the disconnection. - - - Contains event data for when a server's transport successfully establishes a connection to a client. - - - The newly established connection. - - - Initializes event data. - The newly established connection. - - - Contains event data for when a server's or client's transport receives data. - - - An array containing the received data. - - - The number of bytes that were received. - - - The connection which the data was received from. - - - Initializes event data. - An array containing the received data. - The number of bytes that were received. - The connection which the data was received from. - - - Contains event data for when a server's or client's transport initiates or detects a disconnection. - - - The closed connection. - - - The reason for the disconnection. - - - Initializes event data. - The closed connection. - The reason for the disconnection. - - - Defines methods, properties, and events which every transport's client must implement. - - - Invoked when a connection is established at the transport level. - - - Invoked when a connection attempt fails at the transport level. - - - Starts the transport and attempts to connect to the given host address. - The host address to connect to. - The pending connection. if an issue occurred. - The error message associated with the issue that occurred, if any. - if a connection attempt will be made. if an issue occurred (such as being in an invalid format) and a connection attempt will not be made. - - - Closes the connection to the server. - - - The header type of a . - - - An unreliable user message. - - - An internal unreliable ack message. - - - An internal unreliable ack message, used when acknowledging a sequence ID other than the last received one. - - - An internal unreliable connect message. - - - An internal unreliable connection rejection message. - - - An internal unreliable heartbeat message. - - - An internal unreliable disconnect message. - - - A reliable user message. - - - An internal reliable welcome message. - - - An internal reliable client connected message. - - - An internal reliable client disconnected message. - - - Defines methods, properties, and events which every transport's server and client must implement. - - - Invoked when data is received by the transport. - - - Invoked when a disconnection is initiated or detected by the transport. - - - Initiates handling of any received messages. - - - Defines methods, properties, and events which every transport's server must implement. - - - Invoked when a connection is established at the transport level. - - - - - - Starts the transport and begins listening for incoming connections. - The local port on which to listen for connections. - - - Closes an active connection. - The connection to close. - - - Closes all existing connections and stops listening for new connections. - - - A client which can connect to a . - - - - - - - - - - - - The connection to the server. - - - - Expects the host address to consist of an IP and port, separated by a colon. For example: 127.0.0.1:7777. - - - Parses into and , if possible. - The host address to parse. - The retrieved IP. - The retrieved port. - Whether or not was in a valid format. - - - - - - - - - Invokes the event. - - - Invokes the event. - - - - - - Represents a connection to a or . - - - The endpoint representing the other end of the connection. - - - The socket to use for sending and receiving. - - - The local peer this connection is associated with. - - - An array to receive message size values into. - - - The size of the next message to be received. - - - Initializes the connection. - The socket to use for sending and receiving. - The endpoint representing the other end of the connection. - The local peer this connection is associated with. - - - - - - Polls the socket and checks if any data was received. - - - Receives a message, if all of its data is ready to be received. - How many bytes were received. - Whether or not all of the message's data was ready to be received. - - - Closes the connection. - - - - - - - - - - - - - - - Provides base send & receive functionality for and . - - - - - - An array that incoming data is received into. - - - An array that outgoing data is sent out of. - - - The default size used for the socket's send and receive buffers. - - - The size to use for the socket's send and receive buffers. - - - The main socket, either used for listening for connections or for sending and receiving data. - - - The minimum size that may be used for the socket's send and receive buffers. - - - Initializes the transport. - How big the socket's send and receive buffers should be. - - - Handles received data. - The number of bytes that were received. - The connection from which the data was received. - - - Invokes the event. - The closed connection. - The reason for the disconnection. - - - A server which can accept connections from s. - - - - - - - - - - - - The maximum number of pending connections to allow at any given time. - - - Whether or not the server is running. - - - The currently open connections, accessible by their endpoints. - - - Connections that need to be closed. - - - - - - - - - Starts listening for connections on the given port. - The port to listen on. - - - - - - Accepts any pending connections. - - - Stops listening for connections. - - - - - - - - - Invokes the event. - The successfully established connection. - - - - - - A client which can connect to a . - - - - - - - - - - - - The connection to the server. - - - - - - - Expects the host address to consist of an IP and port, separated by a colon. For example: 127.0.0.1:7777. - - - Parses into and , if possible. - The host address to parse. - The retrieved IP. - The retrieved port. - Whether or not was in a valid format. - - - - - - Invokes the event. - - - Invokes the event. - - - - - - Represents a connection to a or . - - - The endpoint representing the other end of the connection. - - - The local peer this connection is associated with. - - - Initializes the connection. - The endpoint representing the other end of the connection. - The local peer this connection is associated with. - - - - - - - - - - - - - - - - - - The kind of socket to create. - - - Dual-mode. Works with both IPv4 and IPv6. - - - IPv4 only mode. - - - IPv6 only mode. - - - Provides base send & receive functionality for and . - - - - - - The default size used for the socket's send and receive buffers. - - - The minimum size that may be used for the socket's send and receive buffers. - - - How long to wait for a packet, in microseconds. - - - Whether to create an IPv4 only, IPv6 only, or dual-mode socket. - - - The size to use for the socket's send and receive buffers. - - - The array that incoming data is received into. - - - The socket to use for sending and receiving. - - - Whether or not the transport is running. - - - A reusable endpoint. - - - Initializes the transport. - Whether to create an IPv4 only, IPv6 only, or dual-mode socket. - How big the socket's send and receive buffers should be. - - - - - - Opens the socket and starts the transport. - The port to bind the socket to. - - - Closes the socket and stops the transport. - - - Polls the socket and checks if any data was received. - - - Sends data to a given endpoint. - The array containing the data. - The number of bytes in the array which should be sent. - The endpoint to send the data to. - - - Handles received data. - A byte array containing the received data. - The number of bytes in used by the received data. - The endpoint from which the data was received. - - - Invokes the event. - The closed connection. - The reason for the disconnection. - - - A server which can accept connections from s. - - - - - - - - - - - - The currently open connections, accessible by their endpoints. - - - - - - - - - Decides what to do with a connection attempt. - The connection to accept or reject. - Whether or not the connection attempt was a new connection. - - - - - - - - - Invokes the event. - The successfully established connection. - - - - - - Provides functionality for queueing methods for later execution from a chosen thread. - - - The name to use when logging messages via . - - - Handles initial setup. - The name to use when logging messages via . - - - Adds an action to the queue. - The action to be added to the queue. - - - Executes all actions in the queue on the calling thread. - This method should only be called from a single thread in the application. - - - Clears all actions in the queue without executing them. - - - Provides functionality for converting bytes to various value types and vice versa. - - - Converts a given to bytes and writes them into the given array. - The to convert. - The array to write the bytes into. - The position in the array at which to write the bytes. - - - Converts a given to bytes and writes them into the given array. - The to convert. - The array to write the bytes into. - The position in the array at which to write the bytes. - - - Converts the 2 bytes in the array at to a . - The array to read the bytes from. - The position in the array at which to read the bytes. - The converted . - - - Converts the 2 bytes in the array at to a . - The array to read the bytes from. - The position in the array at which to read the bytes. - The converted . - - - Converts a given to bytes and writes them into the given array. - The to convert. - The array to write the bytes into. - The position in the array at which to write the bytes. - - - Converts a given to bytes and writes them into the given array. - The to convert. - The array to write the bytes into. - The position in the array at which to write the bytes. - - - Converts the 4 bytes in the array at to a . - The array to read the bytes from. - The position in the array at which to read the bytes. - The converted . - - - Converts the 4 bytes in the array at to a . - The array to read the bytes from. - The position in the array at which to read the bytes. - The converted . - - - Converts a given to bytes and writes them into the given array. - The to convert. - The array to write the bytes into. - The position in the array at which to write the bytes. - - - Converts a given to bytes and writes them into the given array. - The to convert. - The array to write the bytes into. - The position in the array at which to write the bytes. - - - Converts the 8 bytes in the array at to a . - The array to read the bytes from. - The position in the array at which to read the bytes. - The converted . - - - Converts the 8 bytes in the array at to a . - The array to read the bytes from. - The position in the array at which to read the bytes. - The converted . - - - Converts a given to bytes and writes them into the given array. - The to convert. - The array to write the bytes into. - The position in the array at which to write the bytes. - - - Converts the 4 bytes in the array at to a . - The array to read the bytes from. - The position in the array at which to read the bytes. - The converted . - - - Converts a given to bytes and writes them into the given array. - The to convert. - The array to write the bytes into. - The position in the array at which to write the bytes. - - - Converts the 8 bytes in the array at to a . - The array to read the bytes from. - The position in the array at which to read the bytes. - The converted . - - - Executes an action when invoked. - - - Executes the action. - - - Resends a when invoked. - - - The message to resend. - - - The time at which the resend event was queued. - - - Initializes the event. - The message to resend. - The time at which the resend event was queued. - - - - - - Executes a heartbeat when invoked. - - - The peer whose heart to beat. - - - Initializes the event. - The peer whose heart to beat. - - - - - - Contains extension methods for various classes. - - - Takes the 's IP address and port number and converts it to a string, accounting for whether the address is an IPv4 or IPv6 address. - A string containing the IP address and port number of the endpoint. - - - Contains miscellaneous helper methods. - - - Determines whether or form should be used based on the . - The amount that and refer to. - The singular form. - The plural form. - if is 1; otherwise . - - - Calculates the signed gap between sequence IDs, accounting for wrapping. - The new sequence ID. - The previous sequence ID. - The signed gap between the two given sequence IDs. A positive gap means is newer than . A negative gap means is older than . - - - Represents a collection of items that have a value and a priority. On dequeue, the item with the lowest priority value is removed. - Specifies the type of elements in the queue. - Specifies the type of priority associated with enqueued elements. - - - Gets the number of elements contained in the . - - - Adds the specified element and associated priority to the . - The element to add. - The priority with which to associate the new element. - - - Removes and returns the lowest priority element. - - - Returns the priority of the lowest priority element. - - - Removes all elements from the . - - - Defines log message types. - - - Logs that are used for investigation during development. - - - Logs that provide general information about application flow. - - - Logs that highlight abnormal or unexpected events in the application flow. - - - Logs that highlight problematic events in the application flow which will cause unexpected behavior if not planned for. - - - Provides functionality for logging messages. - - - Whether or not messages will be logged. - - - Whether or not messages will be logged. - - - Whether or not messages will be logged. - - - Whether or not messages will be logged. - - - Encapsulates a method used to log messages. - The message to log. - - - Log methods, accessible by their - - - Whether or not to include timestamps when logging messages. - - - The format to use for timestamps. - - - Initializes with all log types enabled. - The method to use when logging all types of messages. - Whether or not to include timestamps when logging messages. - The format to use for timestamps. - - - Initializes with the supplied log methods. - The method to use when logging debug messages. Set to to disable debug logs. - The method to use when logging info messages. Set to to disable info logs. - The method to use when logging warning messages. Set to to disable warning logs. - The method to use when logging error messages. Set to to disable error logs. - Whether or not to include timestamps when logging messages. - The format to use for timestamps. - - - Enables logging for messages of the given . - The type of message to enable logging for. - The method to use when logging this type of message. - - - Disables logging for messages of the given . - The type of message to enable logging for. - - - Logs a message. - The type of log message that is being logged. - The message to log. - - - Logs a message. - The type of log message that is being logged. - Who is logging this message. - The message to log. - - - Converts a object to a formatted timestamp string. - The time to format. - The formatted timestamp. - - - diff --git a/Demos/Unity/DedicatedServerDemo/Client/Assets/Scripts/Multiplayer/RiptideNetworking.xml.meta b/Demos/Unity/DedicatedServerDemo/Client/Assets/Scripts/Multiplayer/RiptideNetworking.xml.meta deleted file mode 100644 index b73b3424..00000000 --- a/Demos/Unity/DedicatedServerDemo/Client/Assets/Scripts/Multiplayer/RiptideNetworking.xml.meta +++ /dev/null @@ -1,7 +0,0 @@ -fileFormatVersion: 2 -guid: 7e53d802df6193448bd9cdb934d1e4fa -TextScriptImporter: - externalObjects: {} - userData: - assetBundleName: - assetBundleVariant: diff --git a/Demos/Unity/DedicatedServerDemo/Client/Assets/Scripts/Multiplayer/NetworkManager.cs b/Demos/Unity/DedicatedServerDemo/Client/Assets/Scripts/NetworkManager.cs similarity index 100% rename from Demos/Unity/DedicatedServerDemo/Client/Assets/Scripts/Multiplayer/NetworkManager.cs rename to Demos/Unity/DedicatedServerDemo/Client/Assets/Scripts/NetworkManager.cs diff --git a/Demos/Unity/DedicatedServerDemo/Client/Assets/Scripts/Multiplayer/NetworkManager.cs.meta b/Demos/Unity/DedicatedServerDemo/Client/Assets/Scripts/NetworkManager.cs.meta similarity index 100% rename from Demos/Unity/DedicatedServerDemo/Client/Assets/Scripts/Multiplayer/NetworkManager.cs.meta rename to Demos/Unity/DedicatedServerDemo/Client/Assets/Scripts/NetworkManager.cs.meta diff --git a/Demos/Unity/DedicatedServerDemo/Client/Packages/manifest.json b/Demos/Unity/DedicatedServerDemo/Client/Packages/manifest.json index 137e47ea..17afdd7e 100644 --- a/Demos/Unity/DedicatedServerDemo/Client/Packages/manifest.json +++ b/Demos/Unity/DedicatedServerDemo/Client/Packages/manifest.json @@ -9,6 +9,7 @@ "com.unity.textmeshpro": "3.0.6", "com.unity.timeline": "1.4.8", "com.unity.ugui": "1.0.0", + "net.tomweiland.riptide": "https://github.com/RiptideNetworking/Riptide.git?path=/Packages/Core#unity-package", "com.unity.modules.ai": "1.0.0", "com.unity.modules.androidjni": "1.0.0", "com.unity.modules.animation": "1.0.0", diff --git a/Demos/Unity/DedicatedServerDemo/Client/Packages/packages-lock.json b/Demos/Unity/DedicatedServerDemo/Client/Packages/packages-lock.json index 984ab05e..3fc84e4a 100644 --- a/Demos/Unity/DedicatedServerDemo/Client/Packages/packages-lock.json +++ b/Demos/Unity/DedicatedServerDemo/Client/Packages/packages-lock.json @@ -145,6 +145,13 @@ "com.unity.modules.imgui": "1.0.0" } }, + "net.tomweiland.riptide": { + "version": "https://github.com/RiptideNetworking/Riptide.git?path=/Packages/Core#unity-package", + "depth": 0, + "source": "git", + "dependencies": {}, + "hash": "bb252ba2ea4bd1314d3f8f60bea490418635d06e" + }, "com.unity.modules.ai": { "version": "1.0.0", "depth": 0, diff --git a/Demos/Unity/DedicatedServerDemo/Server/Assets/Scripts/Multiplayer.meta b/Demos/Unity/DedicatedServerDemo/Server/Assets/Scripts/Multiplayer.meta deleted file mode 100644 index ca62ba9d..00000000 --- a/Demos/Unity/DedicatedServerDemo/Server/Assets/Scripts/Multiplayer.meta +++ /dev/null @@ -1,8 +0,0 @@ -fileFormatVersion: 2 -guid: 6b9b2b7cc2937f0459021a0acf148a58 -folderAsset: yes -DefaultImporter: - externalObjects: {} - userData: - assetBundleName: - assetBundleVariant: diff --git a/Demos/Unity/DedicatedServerDemo/Server/Assets/Scripts/Multiplayer/MessageExtensions.cs b/Demos/Unity/DedicatedServerDemo/Server/Assets/Scripts/Multiplayer/MessageExtensions.cs deleted file mode 100644 index faf569c9..00000000 --- a/Demos/Unity/DedicatedServerDemo/Server/Assets/Scripts/Multiplayer/MessageExtensions.cs +++ /dev/null @@ -1,70 +0,0 @@ -using UnityEngine; - -namespace Riptide.Demos.DedicatedServer -{ - public static class MessageExtensions - { - #region Vector2 - /// - /// This method is simply an alternative way of calling . - public static Message Add(this Message message, Vector2 value) => AddVector2(message, value); - - /// Adds a to the message. - /// The to add. - /// The message that the was added to. - public static Message AddVector2(this Message message, Vector2 value) - { - return message.AddFloat(value.x).AddFloat(value.y); - } - - /// Retrieves a from the message. - /// The that was retrieved. - public static Vector2 GetVector2(this Message message) - { - return new Vector2(message.GetFloat(), message.GetFloat()); - } - #endregion - - #region Vector3 - /// - /// This method is simply an alternative way of calling . - public static Message Add(this Message message, Vector3 value) => AddVector3(message, value); - - /// Adds a to the message. - /// The to add. - /// The message that the was added to. - public static Message AddVector3(this Message message, Vector3 value) - { - return message.AddFloat(value.x).AddFloat(value.y).AddFloat(value.z); - } - - /// Retrieves a from the message. - /// The that was retrieved. - public static Vector3 GetVector3(this Message message) - { - return new Vector3(message.GetFloat(), message.GetFloat(), message.GetFloat()); - } - #endregion - - #region Quaternion - /// - /// This method is simply an alternative way of calling . - public static Message Add(this Message message, Quaternion value) => AddQuaternion(message, value); - - /// Adds a to the message. - /// The to add. - /// The message that the was added to. - public static Message AddQuaternion(this Message message, Quaternion value) - { - return message.AddFloat(value.x).AddFloat(value.y).AddFloat(value.z).AddFloat(value.w); - } - - /// Retrieves a from the message. - /// The that was retrieved. - public static Quaternion GetQuaternion(this Message message) - { - return new Quaternion(message.GetFloat(), message.GetFloat(), message.GetFloat(), message.GetFloat()); - } - #endregion - } -} diff --git a/Demos/Unity/DedicatedServerDemo/Server/Assets/Scripts/Multiplayer/MessageExtensions.cs.meta b/Demos/Unity/DedicatedServerDemo/Server/Assets/Scripts/Multiplayer/MessageExtensions.cs.meta deleted file mode 100644 index 219f11fb..00000000 --- a/Demos/Unity/DedicatedServerDemo/Server/Assets/Scripts/Multiplayer/MessageExtensions.cs.meta +++ /dev/null @@ -1,11 +0,0 @@ -fileFormatVersion: 2 -guid: 85d4e36c412dbce4a83e5bd3061451dd -MonoImporter: - externalObjects: {} - serializedVersion: 2 - defaultReferences: [] - executionOrder: 0 - icon: {instanceID: 0} - userData: - assetBundleName: - assetBundleVariant: diff --git a/Demos/Unity/DedicatedServerDemo/Server/Assets/Scripts/Multiplayer/RiptideNetworking.dll b/Demos/Unity/DedicatedServerDemo/Server/Assets/Scripts/Multiplayer/RiptideNetworking.dll deleted file mode 100644 index 48e9c08175712576464662324720181dfa54cb2d..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 70144 zcmd?S34ByV_CH!xxBGUd(_6Og?CGqu+1L>gCEx~#3W69AWf4#iZA@^%5KIO{ad1Hq z5m5p69Tmro@ds`rGwO(gii!?yxC}Zvqci9zzVA6zy(A>ayx;$Q-urxBw9l>Ysj5?_ zPMunA-CLIvCSEHnA%p|JUw#qdNnGi#f$4!s8>0OsPy5Bjv{y@?l%rlP9e4Ju=E&Tp z*jY_e&yAcp^}O?9^CHt`M4B!*FEZ=A$k8W_jhq{sKBL~}^HdnoqmL0{l(fX3o}2ku zytG}SERrsJ3E`1K*qZxg6yXTM4Y&#smkLs&T$9A5h2_u@owPZDY$;#jEm<1f8&O}h~v5%z2nKi zo>Je`+;k=wtQ&OXih6NP`D=jo^-VM8#E_7570{V&5Zo`_u#{{Z+)8%EAL*uqQ@q|T z#D+VC=$Mm}92CjwWr;(O68SS!3#h|mr@O3Z05zQF1K+C_5ZCRZf@?gstM6Z{k-ocp z83&mUrbBt4spX-B0+dHwl!wdy<#o=-w?;!HQ zzfm4&YIzVwP%Y`+l$wqO3bob0^EX zE0vur>%LTWvaAPE%K9hj1XH3tFs|7iWnVq3IRu4TJ!Jdzkayspkiz9&?MsWId1|s8 z8IG3mh_f0VLPT0D7m4dK(_&~yPg)GEBuVvFIqwwY?CZ4!*0HWWOhiH;haZB#3D#qQ~CO!PQ`W7=>p2{4mWz; zuB&Gasr}`bU#c;7JH%sD39dhSpj~^SYSE5GUe>dJUi4aUJ*tJgr`C^Vra&mR2HYxT zhe=Oc={(^^_Q{%YDwG|HmLj5Ngd$I}YvEz!+A-*8*Y;C+Ccaul;Xrn6nTbA(fF~td z=Ys2@jA$v^=RDPXIWEz9YQbqLT8FE4z1V{kjP|66tX@u$4R3~}GaSdDZ()8!5I@+P zXSsg3PQh;$eiSz!zg76%h2Ox3L6jBifno>#5n-nlLu1(kpVeVBzCG|!3dhD$@NNXH z*lGklc5dHv!(9%puHK*}6bxIown+=boq@zPO(=tMS;knX4mClY+ZgR+Bs>ia6|1D= zMK{kdgnHzfE?k2y>{teh=*tna>`2VqRIcvL7I**ZLE7GyBQ_Fgs@H2+ zi-Lo|wX#|ja=V-6EsQr8&GjdvGW3^B%Og{?FPpz6*&g?BkemGkNVV$H;1{tfD$ok| zO;b*X1`29KiCe6q)zo^`3ID0SP;2IBc>>a33sTsNWCdX(gaOJ$v^ zs#XgzKzU*qB0TI5mq2GIlVKf$nTHoyh!^yOmk4;N$j7fH(zF%AJT=8lpYk=-WJ$vQ zrX0T7O()PbUh+8rb`!?yxls%++Q@n}qm^(pPeawH0X=9a@=LU+fJbKN#zfDuP@~E^ ztEwgo{fNwETg_7`6HJ9@Xy>pqC3&N#*6p%l845Ovw>L)3x%RRl)X1oUE}#0fQ(S{` zbbUd&zI|{_tt-_XN{O0YO<9WSSl`r_uT@QB`C8m`7GFb67x2~JbUj}?+2BDi_qPF- z4yYD2gym>Hlj?&;_Ef(Sx7^3bWp&bAwV*G?b2U$=OmOy;OaZH_OlZ(VrWuq8werw} z4U;&k%P>=Opjx$Hv~q;@Nw^pX!^vQ7GMI-TGGk&p+HW3In32IL`D0efOE?F z_U$`lqIFK$>YHvla$;i?9nN!hjkKZ|S7^fLypVwjPbbxm_srR+uvkI9 z_`00(A4I;~iIfw1gyVW}01V7;S}_iQfr(BtH~dVST~qR z;I<+I2F8Tv2se7{RtnhLs&}g#wjeHKH`R=lnWvTXQO&(5h)(TLQCP>L!mZS%DjXdE z3t(x;Rc$2;RljD%7K2%rjj?bk0(wM@9gkp*PeqR-mWmF9(HymiydD^aqdD;_=;nuR zVGj}<0e#4I6{0f6Ap@_y3gC02P{RPVOGsNbdN^WZ z7&|;MxW30z{L1<9Me-RF|8<(EAso0 zS+#HWz!mI_uoa$AQZjkkHh3}F#-3aUpU}Z6+CE|O=(s7b;Oe;bWN46?Ryy6nc9(S=a^g<)-7V;{(^-T+p)vZfLMc33tO0C znC)_zvM4|1d-QsNUI;llnaS<4O|prKh9JAvr*e(M(7>kK3tf!YmZlfgTe&qdtXGs6 z0I6fe9s;QXpr+R#p4g2($+5J|9GQ@bF+yN8jL)BX8ckPr^kgJawktZCld|rWNQ>dL zQ(Bz`y{~f?&O~A`azjJ%l2Y5@459320493nQi`s_O{h{0>^W4u%r6)*!d`R99iu zLu0q6`Z|Q1(Q{BQj)9&%NvyLK<{;_4DF2U?2>0vG=$y_8{mz_vMASHN^FC2$ayDHE zpQ0|~(b;K?!yv_fP1xm`YdLr}ay0D$X!;kWz7l;s+JG!gdjVDK3KYbNbg*+u_D?E7 z`-)2-J^%R~Iend$b7IiZG|m=t3$DT-BP&CW^_5|Z<*l#GwVM8lsARe8EA#wXqxF^f z{?1yhrvcp4^mkuFep!#0b?m1 z(sVOc=P!iUP>*QiYgu$5^emWwdoW92M&!R}Ih--n+nd+)oCmIXGfzXIp2c}hXQjgl zQdUwFRS>-tB5K?Ps*yv{Wq>HB!IWdJEodyg$m9U-aZwzGCCtx`3AC~$SUpTdmm>Ss zvoz)i%=bDY2Tn9AOY17gktRA4OJ7H%T zy_ypANl8$h&j5B;0*=pfTC%KA?>q*f80Kh?E;AH^FL-Lwxy71)3xOWH`q^Y29U6f& zJ##s%X#2oZmu|rE0I+YUl`M`6o1aF)=#7x25M@FR6SZ5nMaWuX74->Wp5lyoI<_c! z8C3}jeCCEVH>A0yJiifdq^DMwiv~)~Yq=?53H*RAYwzWpF?>pEo zL7LN&`HQ_`?yu#4g9MO2V5TwUFX8fY^Rxm@)sPbPQyY^5W7n3Q4ysUHv?>&`muoqg zJNA=9iX6P0vv`l=WXPdEM{Sz2uAUYB8?@4O1L~PUJZ+$y=GkN+D`XU76H$&)XhUN$ zz-`84+Fnj^3S{G^FXKS+*?>lV$Wv3As5-R*EgEzyxGekHH`bt0JT?mI^NxZmtLPqR z6}=5a+a(j_VZ6%FT@iD<9g5z8SiAa3#x^7Tc&w@O9_RvJ?cW%&h<$~uwK$V0%mpC2re2~{wCtzE5 za?%b3!d&E;cF%0>nVkx>v09~)v|l*I43vd?t_(Oao6-|XuQ{sNi;isdO|$E4=6gfF znkt9WRXj1RG46Cc*0~y&r@@$Kh9{#{*QA9TeQEAKZ}H8v)#oWQASPWMGXgbbE{)_T z!w|W8B*!fwP1<@SkK#EMJ#wIS$W0hMHRl=K~lqWfM zKfwjWr##x%9lSSBHZfx?tXi!52x-^3Q|6u)lo)3ZNf~F8 zK5>h2?YL8DYxVhyp4Uz@w%@ND((<6oAz$gX9Md22sVB{W)cme`(uK+Xkl(o{an5<& z<-Dk?oL%&zeC|i2z=8e#;-ue`Cf)WUEsxYXu)O)*$orLklppU$Y_g7izash!T;;#( zM+tds$d2-Eh;HgEFVT;l(@q)pbKHz$?!e4y{QM7y?xr8Hsk`!X%9HFzFLD8K`DH90 ztA8W^AR9odAjLGu!8AFq+MtK&hM@tkx$%e`cd2|4%m;9<&c&KT@Lw5x8<0A zR80M7A*2>})sHUG-bOQ0ap!)-Ij`t0XG>Q(xgX)SlK=D=QQR{R^ARb~+3#n^Z!YxU zvp@@^4n(TxjzsO;l{`}GSLC&JE$>(QQE|K9IziH%ONcfx*T$qZp%rXk5)ixm-Ep=?QGPKlJgOI z0ofNT=al}CPxn<#B&d`BVki@$W0$xz>B8}01O}$PuLG`u5@R>3+tKG%Mc+m=W1B=W4Pd7f19P=o5=eFv0Y$cnl?QU#M9rM;gYL{bP zTe7W^V;*cz^+pfizxdb{L0gfaPHlzmsQ)^)S9`L(;_iAd?UfiKSmloGbyM_%Zrkgl zj_p;&?S*|1(_Wu+-(Fm$uG)+8bkknRzD2n^w^z4)m~67{0DagJN5GUlpgTP|_E<4I z-}QKKKZ*ZKF73?^-WqYMNq1K+n#&$S=`OQRhUaT*z^|fh9&SI{=h6FOv>}tYVZ`9W z`IWN!<-OAfMTyp$QjV2yDHd=2dF-XitRE8yB=l$+Ku$-nlmetWuNu4h5Fup(x z?q4hsLH;PW6>aC!U8&D@spxLRujl(q)V$AE`hK~=l-1S!G8sZYsYq_>K#zc4*0VS> zSboL#^3Ot6>YibaYWe^othklU`k>^}UWJL>7aGt~Hz40wQ*A|lxm1YWB~5#&eA_4H zG9$V5-HZo1*uF~M4^t`e`(b`AJteV!wEq@o@tN3?iElb~QM?}iZcfx?3CtGewK^5k zsh=kHFL{ZvJko}2lj~sY)zlce`SlI+fimyE`B^+Ip(1%m>b~d{w#MXb)x!c(?F-=< zQ$cJ2N~3#MMbC8UExwGXo8BzW6!8?TNI@Ns{DXYC^ZhN_H52}IJBf>?A#c*hK2OM z$N}nY93YeEN0&4n=+G^R&^?LJBZ<(XiO~NfLYotzR}-Pv5}|hzp}chQP*6F9iN;S*EZ&%aQU7 zlb=#j+a;fw;d$*?G3M|X>ieCkPez?_(dKce7J6mmH3vQE zrgcwS1E_hF)I1LI+UO}0J=eyl3>R$0g&r}ECoUdc_hxQ14`!%7*+6(pF0f`IXG$8p zy&k5dE4xUFI6v%9M?PwFD%g*FH5XUvOYl`6`p@;ze27R4&tFwPWW^exMqRM!%M6Sj zgEPfkz58xOCxEY|V$iG!H{wyeRT4Q3ztcm#c<;E8Z){s3z(MbO(v?zNL$|w?Bg2%E zwqvJ^!>Zdn?4shU@iKIGX=hGONnA*YXC@P`NQj&q+Go*&!C6!^x>zd*z?dCpa3Fu- zIfU^<(_CBT#N#XUo-yyKi4pHoM#8$RZ481T~v+!RX(}XF_Oin{F^m=y9!hd&6lS^sN;xrT!%|@DN z4hWshpc=+d2T%1G2EeFzql4-ggC)%S1S$41$p#@VT7|Z%37XWfwkNg-9D`wOPpEg6 zLFWRgXeFY1{~5i53xE}gVKv6iL#*Cw>kk{&!iF^!s)cMGiy;cH`M0zH*ewf~V&ZVb zdUH{nW-b-g>owgDw!p9|>LA0>f(=ebXt^i49D@+v2XnMM4#u|FO28@?ziwF6_f*Zz z>nW=pEx$v&&K8c+hFxqFlGe^OEEm6+7}goW6ZG>RR+D5?-sXOk>3ph=N!7dH|4!xs z{6IR~7_ET3>hm<3z=*@4o_NB*aTC!I$Tk>b$T)aYg{(vUWFcLtpK#y|&s2B++!E@JqK@-C$!gZ zw2s6O9-qN%K2Jbz%5W>?u^;PKJ}Qxu#4j6$!5TBLMor%$cjuXt-_Nf(cK@Pe7QG*b zVGg%930YkViZ-AD^n3o{D7}1&*SJYHCpJM*?7M*tC;@Krz$l+rc7ClvXmx266MF)}Y_01S+JZ9ci^p;RvDZ>8 z#w<_uu?Aoa^h9%MT1z?dM?&^H^7jsewsH*CV>8IpEDdQd1kKNXIwtjy9+q1pC~-4} zSx@UVkgOcd7;8PPq>N!Nr(kp@rHhUx%Jr~fk1(g2D4*fO8}P>h#7|e;g-+G^bcMd} zI5w^i3&MfDvB=hp5#1Aeh@{2Yy@-veJ$_)1>W9?RiJe1i96gEOYaKx5!(Gd~FO{8? zX%6Pm+UK9p(@nmTaxU*uGR}2S&*hQe__@3`ltkz9QhDg9-Ji=#Nr-cK zR74D80G-Rjl+dBLUq6>Oz|ry;S(}e_>aoEgpb`J6ma7nlLt<9+RB8e3tyT#Yvq;Z%NRIoLe211D&oC>yV+QIoji_mm#|i2Q zrf!{U6FmzmdMrDJ)g9cHQtI^qcE3h|WyMYf?NFO|9q1nJW|YwfWjMn11M}G!>CW0> zSAl+A+2wR5kItIojx}zVd70V5JMtsBh!ePM>Kj(nLBT`o>?;!f$=az&FKoSQjMdyv0zOg)=1?n_2xk@#)<UisY(Yf`KCzbS>nha4;t8Gm3PlEgb zUCPf(`U+NBwxb>=2|E_`LFb~J$wN``vZ@Z%W#Qdg?wAg)ufEU1=0%Dv=#&ZDB2(Gu z@n^%r2yhD|&Mv-3{;p3$pqs>fp6q%YWYJ%IY$KIpDA7}k?Yp=*t1EH*g@7((T8a1L zEncImdWn%U*>5|PgkI#S#iD2hcWW*j!#jqRUeJSvJV)$YRLF`^@2@@)r&6ClN_{p} zR}s1wpdPp3is2t~*fB_7M@7=`9HU;8%ePFGp~5wl;es_Dtw7Qx($P01yM&F6Y+ls@ zbC;&RDffj^yEL^19bkhP?qZLTy`y75Q_tmwIxG>!hOl9^21%-gZr^^QXpC-O+Rs2; z^%$(Dk7gLd(@GWzduohr>=>B^`#{?~W|HZ>yZU$9ZuF8e?zAu_Q69QM_Eeh>8Z_a2 zy)Ky!DpGs*Ls{tg8T!;QZWi?*?8xsMcGhOwU5v%bHd7bhk5!obC25HRG2Chop?z@J z#A2@qM<-KdX>E}gPwz>jH%Y_MGuR@ems1QyI{J&Rs(uf}wJ>%uD|xUQ)8H&*R4o{q z6K7E;liS`%HHQq6hZTevh#akdYx9{e)# zqmix*KdQ<9_PlT)+|i15v;hU_`?{7ZllF5oPay-|LBMBvoTPH5}1U=AhKHvWvFdZEu>5gQ?(J;p#)Zx%b^c(m=rp3XulHi zqH2y7=Z>vK>exCEe$~_zf;RK?c|YD~3q{?Cq+Zl#sqWoWv%50Q`OGv?SgB~dv=8Z?2EweVh~DhWc0<;X)Qm*l0UnNBgB zhC`eNA#Cp^r7A18ad}B_+7v8J5y+i3<=3M1xNQ4$IO(f z6~5_kc`WRsp>sI6q3jlP3JT^n+AZ*G3g#gQ$96z#Z4Z()m}Chf3!jNt-bym?42{~e zm4r|j_HHF96o$!LNsQe>ns4STC&7Sg*Sfuk}J#i0cKPkL$Ho2T3ouHF5J1 zghx}b06|!Qf`tg)p@T&T-bq0=448Z#3roS|6%RNT)7WdZ-i?IVw!8V>L>uBwHY zG1`mkn{L420QBg@A4|01c+@^4-x20-a5ezy) zHCl#a8IILRhn4s-0cm?ba>uZ6rpblo&@+r|Jfk@*fUPcy=i`>17R+s)eW5B^%Rh`@ zsAsl`#+Mm3fDwBHq?(`Sq{zkV*(@ZU=ut|9hb|;IMCUj$lIiec2-D8Er+Q?ZMbTVt zLe z^#GIZ8GtGpE1Y5obUG6KM8{xRya{o&Jr|Pr+ETmedYYVm4_@>Z)TZf1njE9g0>`Ro z8pm|bSC(~dm$FXRvWD1&@so`t6Z^GEv2?oeHfHM6jdydn01r%uB};00n96RVI7f;G z0|H_p86o;VNSgG({N~NTZPa+l$B?aX1wL&{9TXiBPC*?KZBNe;(DeKu(?p`hDH2UZ zg9^3bA*i2(tyIg4V5aPU`oPEjCvmYqh$Q>(M|RGa0S)5ct^4(SFLhZSaSvQxGGA(W z2g(P3K>hyEvAi_&P1KLLC@-(8`gP97<#m^jk01Yudk2jTx52IrDA(Ea7&q~Up!~fW z+(l;!EQK~9X`R!NJqE9OwEP8Hg!^Lf*a8!lgzGakE4ObC&C2bI4OE>d&DpdtSIiw# z<8n5I^AOM?LeW>w0dQzWY8_K7m&%rPZZLbdT~#bi^E?VP$u0U;n7(>j24CAJ?WaU+FRqN zRDIocXmz?BUhQ>;#=0C)*cjVZZf6u_d-%I<(brHqJ+34-+3(vy;8Sz%$N!^hA?;hX zf;eNKo?4iNS}^|A8=ate9i+$pNQGgd8jck$`UPcz>x1jSL;DuGVvWMGVy}}n7~m;Q zbSVKWurBC{DK`2dp$n}#g=Vt)sxTUhQdv49=}>(}r0SKIzK;G0VI%Jq1RF6jX<@{z+W;XF*r~**PEk=da{D5p7L>dMa>4 zAYSw=Y1)WZZF&oY8G53{O^C<55@ofLSHXPS>B5g6a~t&o$Tz{EA?nX$C_OJ?Xr*_b zQKz>NNgv*!=8ijXhRV$?$!LBR(p%p`d`+*ov*)Rja6GCq6nia^!mo%8Q|KJ3h4RH- z2S#6UE!>7cjdS4}xS$0nPPLGtF(}=U0j^=-u8z7z4C>>_bcjLg4$2yCC9Uz&1Zz(_ z2qET}QX!t^f7)w6fwaG5>WP$L&p=E=B7{{BYY0KOA+Ogc5?SXGp%}{W)E30mBcg-O{qIFkT`kn$gyBl0w+rt8glC#Y#v24wWy=wA#@>VKRrLM`Id8mcHm`^H*iJ<8y6g~0 zKZb3GYNz^ry7qhG!tV>a^83#D*zXS_pB~R)*wpgUba})*@H~*r$K`dG42p&G-*FxqsEz`V~8s;O4K%3Bf(10u2Ji`ht z&+8jhPCa)--$OdyP$NlBEUP|79(;JEg)9?qW;ZDF zf|eZQPug1-mLW!et`K}`;r;jvRSUI*=Bt*^5XQ|}a(&T9MQG19`X4HAz0y0(t*{|x zNnUt3TG8du&0EpIXhDuX!}s&lma~NZbKosLI#b_Nk&n0d#z3h{un$ieVxI!k4s&c% zEtIk4bC8gJWha!v%5|96n7EK+QtV8GV!I)tid&TWw{Ej+F=mEtGn&UT(EDf}!}Mh# zNYfX}b%c7SV~ZjBEvn|h(;Tf3O=-D(@H9dfMK#S0#b6h_YoS^QhWKTbR+12x<4elH z^!EN$(BoHUxMR!=cZ8YYFw^l27pbYyHCMT@pP^b!p@D@O`V7ot_(28Dd~6Yu{)5c@ zI5Z=gY%Uf12}12b|K3MmYlXdd9!wKw&JnZpJc#g{B2&+U2!AFrX&#J^o7AEyrqUMZ z6Sd+7<7Ol`GPYsU;q$F*uW+>$8W*CKC^tSiE&=kO^XU1KxER+8x*E4T=i_nhSMp6D!{JY_ zORWgRAJn?^OC;>LAZ6orSfWy|q2&na9G|CBmLrM!>UG6eNR_e4oG z{Y^h{t%DE8AI(#BV=xSs-Z>cUU!=*46qIalPxxK2`($N0I)qpAoNGpcje_VZzyG7od#hePCC5T8VE* zi_k@@M_RGToEDXHM6tu=!7F7}t3&{Iv5K$|!^VyrCTaHze_s49>{s8bzHhI-y$>Uf zQ_KPV?nEKV7vjs+Ckau3xuAUPyrx;_oz+Y!7GEU9^nCD687n?t&d+W|`EjR=z+5W! z0zZkGl@FT}n?{N8r!Y^PTJl6%S~0+nvM(K~q0%SecLaVgh@gLY;R^gnAE+tT;kp(- zKYp+QeaD!e4AK>I5Wnlz3s;guKNo%h{9px6E5v&_#K$Ix_$)ZC&=&JDh`!78+Tbe% zSz;bWHN0^hEX}sXmW=m9wm5?6k3kBDIlO}D9n85T|7h^95kyaCnf>Hl$`(K8Qu-r< z#J{tQXjTc){>&L(PT>VPM3;t$-sUIzTJ|diwpaz4s+)EDLf7m78#j;;Brr`_^iyv?meZS9HHPTzL)Pcs0+REr z_o6&o{NB5^#1?n4oXrKK=MUUcLwZmxmgZ5)TiG%<2Z(bu(@p6V_7xKq#qXm9aQ6of zB!8m+g5rzvap{vZf-4;t9G5;7&s1vgY&|H}gvX_yfPI1*PPw>vT>2PMAtp2W9ivJy zg^{C#;(CawjAnCOwV1|e2csHsCZk&z)nRU-(%)cIkFVkonwL8+eLmi@p2?_~Q6F(G zqo1M6eB8MTj#O+0S zCqRCGmRV3h_Pjz2VN{oSXvqoU25}yvpYjRaB${LpQoaPb7ibZqcNyIZ)CQT^6_oOB zAS$6AXaUe=jD|D1S6nXJA?1b=N_n5a&L&dc#U|=U^m1 zMSLfM$|?a70O3p4uppv=_KG}}O!=cIWOO;_`%y$xI#Lcr(tE{^qJrc8;~|+p ziArRX_RAhA{_1!Iw9K^~bfdi!^abZ9psVaXpm&GA1HGnnFX()xCq@2)aG=VWF2$Qg zw9|f`@~4k)d)Ju(Iy0N-Gg(BXoq;r?T{)n|Rk@)3T|_UbDggb!T?`sZD+683Y5vXh zZdVOB(>eS)=$N+3a+0u9kq)N@N#^lo^`Jd1KWHgvsdzrSPkI%`h3`CZ`ak)U@K?M2>cfuRVmWKL>Wr+-&a>>mWBKSxry zQ68DF$tv$Lu){S>|C+hilOZm56aCKZPwy@2LL;Dmj{6wUL(@EoJj0Vi&alVG_#vjt3Mf3bifF!r=s%clw5b(>C|8Qv zZmQigpc&$VG%EK5_r&yZZPT1bf?iobw7iOFu7l_|Ow(-&Uzbbtq%hHcHPbl6MIw`RWVKc2M0%R@qAtUh5|Qb!j>2m^s7CLAT_u1m}m6)u2_Sw}XaC zDST4o0nk9z??AsOc*a8Trf_?nl}A9)wS>q<*1$mgZA$ijM=UymKM#;vAw26w%FPL?2^% z64RYbui=zO2PpOhC(%{*Tv#JMF45@px&0|PSA@Stxic&N$+g(aWs&|{YLAkVs zU6p$x_YSR_H_{i9A1fJxryIT02yX~)lb#6rFEJUkO~$-fU7~;4Vw0TjEf;&s1^)dd z75&6HI)X_;EO8&=T#Q;=VbGyKN^CZ0rQ=GkCH5M0KafN8Dn&Nr``%vR#j{w0(p)Q0 z(prP^?OVMrvBRJmAh!sX>3oZv_juF9aD#3H@`yHrPP8BOri&*HngQe$Um5h8+T`_# z9}OC&HUqiJwak+lWgE2J*(9;vGiXXSp@cXF(b1I@_kvj4<3n$bIJ%0^ z^XjBBi~_>yLFgrs8zfZ7=ml}9Z#UX+Fz(=BYw@w?TW_8?-k_bxS0LswY8P*p?e!Lj zHw^mB`J5~k?;7-$<2e}-pBi+(t$by|I)r4tAjdl;R=%|cJ@4@ND#S*EBCbqdl_=lXhxCk%Sd8Sxz=_87F%j`*rYDc$nIC#a2T#376px!+U~UybNv;;2<>#SsQk ztJI3&22rcjim?V!tJI1!45F5<6*C#NyGN=@U#(bg;;7y0#C;}i3gYU-Vw&3AD?gdgSXRBDGYbMeZXRonp{+h5dcK#OaLM z-FFoZ0h(#hW!5HdZ*iVMH(L>3Z*h@9Gd!ETeZ-{(UFeDU`iLtGdM|CHudle)pns>G z2y~M{lOeO8SZ7cZWcCyH8Pppx`-?{nIvz6ni%kaYK|2f(?=e~oPnLM+KL@)=e-%YbiTK8fg(+y9xGI4pR^B%xP!QE(`lR!87&eYp3TnC9aXWX<2!zc)pkwEQgmMBP|JALPffs9Dz z1HN;`>_nUtG0~JjL7+zLd8FmRvk{xt73AH39{AM@S-3NTvYUXcE_Z?On7YIiS9-w6~kaqnl} zuPzfk4f=`Ep^O%}{W%mj+@MQ}KJr~AMl))6FE08FXo5!YGbeiJTt+KJR_H6=<>E7g zN`l`4{WF371!NCotwl+2pKqziW^_G}%l}(ZYS2AZ-};t`D5K?~FhuAqMoYw>&;yo< z8yU5W2Lb{AGI37=Wdl9RXc6KH{a1`I`~{*_{10*&|I zD0&~RrOYil!@pWIB+!{aXC%-p|IK0rqjqt1(Rlx@Vvj+m70vRm6Qc%eDOTuw{~cn5 zLFu6;d8gQA&`Bj1`R^2~Y0DE@H0?D4-Owi~2Mzw^H=K1rY-fD~;>Lo-$Si+`)=Z_wuvSKt+KbOL#SrX^5j z;8n4TQM>py@{9jSiCeYBp`=ZsLql-rb zc8O&PbRy7w2{bP7q1eT!U7T1vH1LTSKAcLxTva?S@R@j+(Gt;KHYxC>*kjO|vT1?8 ziG~qcms=t;fvz>^?#Ow8uf*B}Y6f~Xf#wIk7T+;y7uQAR2fh`jjnq;+zV^U(VwFKr zpHSb6Z{n!v^1%0^;dq_0Z_zb@e~Zxxv;ye71X>-~EAC*_E((iQ2mT|xqjbKbveyUp ziAICQXSc{-#3qCCith>hBEB}LqIg3<%AXSGaiHi4T1rLnGXW*%F=`jRa-6~`8&0IS zb}=Mplh>A?F5&yo2F^sYZ7%M&O+5SFzG6ba17_E^w$U977f)^kd*Kd9gvq z6o}yA@)btQbDt{s%GV(O&WKiWX~72RJee)e^X)L1oj`%$QSy)k$_XAVha^y8@K|{^ zqjvGvg391i;B1vc5 z4La!__7u5d9HGVHJHHg;-0KPNBF(;=%l3!SS+! z(PFWvP-18FY=f>-BZ7^I^5{-@qU<@I@~sfxSA69=T^?c3hm0mLBCU6OPnUBUEpoS_ zepBSdjN08-qkdClyN*LjDW=LbjII|id&UH(%8FB|1X>|Y3{ID4Fly%&(sX$-qebEa z?A%P3g^iSQk$8*IstFn`%KHMJzSzP@d)*BAI-@1-Mb62=8PYwGQZ8}d2sBeR7)1Lh zXUU5VqJ5OJ~mzjiCcjc#2k6J zL3xahGAU~-BfdFul!;5LykDIwCm7@@Z4RC*&(R20nh(^HKv?U`8#KZWNPBRuyu+YN zE3XKiFZ)d*&GZh)Jb8sdv;#6v?qsBQK<3H!PS+{Vs=Ow6f!t%z(`7dXFOnCZ!SxeU zDrfuV%exJF3~`sp9gNz=%J6L80y%iHmhxEHZNXOg2_wC$(k366LUDRmrA@xfNbjn& z$+oE!N4qNb1{cY@66lfO61l;kZ8_h1m&)KYopM{wy}{qg1qQuS{&etaxy+!K%byEg zD|aN&jlt_=?U|I1_Gae#R>-9W(f-Ryxt7rq(S+~ut&)?b>y$siBUi~)2JOIo|0?;i zK`)nW4X%>z89L=d&e^`3U7P++on-?D~w&@)LuuEbE`~oa{AQOIcBN zM8=D9fkD~6qci>>zcr}DcfIqE@<&4EF8LKR_Ppd=gq_h>q&kP<^ghZf(!+=>I4a{6 z8DaF2pp>u4hD2OX-)r)ul(;|3NsLyC31wq5{w%L!biJ4onwasr++a{%-qei0$nP0Z z33!Gkf7Zx-XT|;MP3fJ(dWzFB@04%K3k@2ZInwdAyuqM-J&sdv%X_Iq1Ct`W<8 zTfWR_rF(?qtc3`k}fNO=4HGq&o!v5U`fU< zd4oZH3$D%hNZw)4b+-xG-Tw(+Jd|Gnf}=~(Q=yP^i&4}@2WG;(e( zdm`hX2}Jv?|B55u7JExZ61@S0R}qbreEXFQyx40{4bTs9c=>OW^ZRC(V;;9 zNyO3U{Zkw{FU5GBL^3$rhu27T3C>-)5>JC)=eqAsquTD1?ifYxPNUlXA{z{%+6r~C zK~!6*HW)-TQtESqs7975noCls9X`sy3yX|)OR|ftwliuM7ev0yNK?bl=kg?3$*V>) z(!0xEb+$pzJ1DMABeC25KEtaXW3&h*{E`t+TN%BGF?p;nLw&&LC2<1o3bNGS4C+;~ z#?DedFxoA9m84~6t8f#Q{*suKe!t35JsGWZzuP02nWKgov>Pa_Ml;%-Ms1X*t}uw& zC|_-6L_PeYi~^P4tZPIqR-`HzEf%Ug;ww^L8T2pIwpe-RQOb6)I+IZL1%zl%_4|xs zMPXVmQEf|AJ;%{r`dnXy8qSDX?Cp#y)n*WRK@at$LDVWy^^HN)Du<}b3rXhgH1d#Y zRmZ5^eG5FKS`A>NTdYPk=#-MYr%s)wQ;M@H(=zMTG80F>)Kfif5cyIs^)e%BzuCTC z>JyE)#d@n=7wOW;&-$se4I)45uhtqwel|euFo^u@P!+sb=c5`8RKpFT8XczEG-A&h zq$2YvrS_~N)CxwsCAC9?de|WHvj+7%BkgAm>OF(V&l=P}8NCRt^D`S%)+HoUk0`@b zgb{gNS>`Y`ijnrZW7KvX$E|ssDqNs-*`3}q^Eh=jqeXZhU5erA0!G?DhpXQhME*Hk zUCW64vw!9Y^^l1p{~W1aVnqHqICG?W$DrLnqtxd*AN%KtD$+`&?@lBCJV`Y&BL8%X z(Z;i0glFYvj#0noxEI;8#;P4AA9>a(D!5QfAZ5Xg7P^Bo(|=TX0WS#CN)CW29U2 z3^lM#$4#k};tX}8K_B3Gz!_>IqurAH^9=QoLFAv4)%T3Fe@<5Zc7Z?L(o@(j7Ps_K za+*Oe$wl5w-}D4p=sh-bMgq_2peto8^Bi?fO1?R2o{0;K3o_@Z`wet+TCzl;0#$F2eK7#R;^~yE^l-1R^Q) zj;9nWGXKxeKvgh^f9>5LL~qLVlT1}bbV-Ex^Gkz4OANJwK?mMYApTH`D20`HI1gXz zzjZF>jpOR{)#Q$InvBYQ@uWv_AGS{#9|2gbwccqg| zZMW1g`K@H{)l`Wx*ecFR^{(t5i_Ay6WNmw-j}qVslJ-prvLkJYJLB|7XH>p zz55LwhiSA_;#(fmv`zH*N&VUZK8>Fra%>p0p%SO^*uH|tnK>aEA1JKEBRoqICmv36 zbQ+u>;k@0^?rg4SXFdNOfq6=a(h4ef9*6bZs^^7{^D?E>9GYw5BPY#tdVZl9oM!*a zdL(1J(_w#pck732*iDHcm3sX^lC|ck+S1Aa|K2%UOs^tHllZI`=TI728(5-@Q+8L! z`^zbfUV-Q|9XTX9HTFleV?2EymqICecJAX!>hKL@#`Q^^wNuwKNxmg|v4*=bzsKim zEmP~G?XPQ1HHxpe-qQYq6`jH?Lo=YBO~~3EITWi*Y-)J_l>2j1)2D{_Pq{xQHGOLM zz$p(Lt8MZEuQ>y}l3Bz4tb5xc0=i#QTVi_-(+~y6?en1I~U8z<(R@+kmgz(tdvis1skGr7+&> zF7V*Je|j2w7}KFlM=%}3bOO_0ui2zuJFfJ@mXF2ml^HW4grRqHtKw+R{)6mD0f;T52llwHkqC39|3D_G77@oEnz zo;lN#mla~H_hHaJp~peJc*eg%Z0W6;(WT(L zSarE|2W$QS)5By{kNd5|nxka9x-0OSwaJ9f z>aovyfy1vb-6k$&%Vd{Jd{><;_JE)#NDpvL9}x8X=mCDhbO-bAVE!H8JcAaYw%*R1 z?QD(hY>n+~hwW^K1@N@xNJDM6lT+^GR{O+osMeEMlRcnLv4=fs4|~)emcLWPGGBIl z!ZJT$nV+!CogDiexBgGu`af~&e*(@A4u^DCj07cr_=M}VlRaT4%iqZoypn3MlViQG zyi<53wXau_1^Tf!?%`a6Ih@U{bCcShe~L3(QY+u24lSRAFxf3zj`W^~FnPsP>@*UG zq^(mM<$UKlMb8#z$yt%r&iUBlYLfHi$8t3|EAZ6)CVsjh)yoBIorRLl-BfVi3YJzY z>5RtF;+x#RIcuTAw}`!}@&{1Tp+b@e)=E0fQNfy2u%3e@_07S|8H|*7B7As=D7DC7 zNxg5Ycoe;iJU_?Y3LT2tk%o^IjI+1M-sNZ7?JDM-jqr1!cEkpP z%j_ROZ?JC?wBJ37t#q^;Tz;Q@w49XwH|J91-DxkC52t?t`dGo&pjz^oJ@!JvWYDGZ zt4t@I@600lx#wqaXlH$?yxn`hT8bTiuWPA1K9ucRC(lkVMfi){9P>&OdeUZ$Mu64 zQTPwnHhEmpe_V&jrwaq_1t^{R>6twu?k)1&9)sMAxiuGayF2j>@KfD>jQaCEPBBm7aL^`=##P^=q5Q9bhDfZ`hsi*eOX=$`ii_4 z^mX|X=yv%b=nlCLbf*k>yy7Q$tjCRM`*_&x1U12}#3`U|F++_8{{p7%Os@h};wFy0 zmpL1lZd9ir<>MTFQcXm7lbVc_FS4{(IsN;Hb&AgwSzr%yzGBWditO;6B0KC=0a)M% z=KrLqj>5_Uby(C!PKzYCt?8g%YbI#WIvb_rSfq0is9V$_ja&3$+Rq}b23n-g5zJ|@ zW+QyG6$2e^%>y05{8K=cn89++WjU?Pzl!NiOz+^lcXD_GBw&AmQ*L3-tDs7}!<;Xe z^F4EK7k6 ze(UjzpB;3^<#e73$;+L@f693^_`e5ridVtU6kj<3C>pd+wH>=!d!8xd{=MZMfqmmK$O^s)=wFCzRPa~=W5ErzBMJr^`0&J?G3 zN}1N<>lUYY>P43LTV_2@Z+!<^F0!)f@g;&n(7s|U=;2~E=uzS#(Bs8o(6P)v4YYyf z3}rfn=~Sj|Oxu~RWx9^(W~N)1?qZ6kR?s2Bw1Mdqrfp1zDvCW5FS}fmg>ebtElfXT zDlM)H)1geKGHqvil!IzF#Yt(}m`<@d%ybu1;UbR3w4CV_rfp2uGTqE{7t;@!3OD7F zOe0Jim=0w+h3QnLZA{lP-ORKUr(aI-3}rf%X*<)+0pf3Ax{GN;kT_GAwlQ7HRAvxA z!nBlW1Jj{Qr!sA4x-OSxGW}4~JmQoV5FN^ND${jLw=n%shYKmqx+0dq^h2hym^i!2 ziHZuM5vC1Hr!Z|}x|Zo?9j>C3o0;zF!Fi*cmuUmjDNNg#u4Q^hw3%{o_!AC`LpYbF zy}5n+5vPsmTBe(sM*0)Kf$0>cZA>>a-K9ALD9u`?o0;xnDh}mRG(C*vFr6}p!fi~~ zGTqE{7gKRK#frh4muUmjDNNg#u4Nh-!ZMj|X1a^1XyCj|8<^j_S3b7tz5xy%SY|uOS8#i}y`n$xX;BFCr z6+eptd6*m_AC!;Ex8+yTp@J%`Myb(ioSLN0RA;MmRkNC}UQ>TjAE=Mj9`z6PgW9Jo z%We6rOe<^^TBX+E*3s5D>rU$=$2iAy$Jvha9LpT9Ikr2}ok3^5v(9;#bA)rMv(0(A zbD1+>m)S?#lkAQ5Teid1&o#w0)3w}nqw6)-ZkL6zP~tm1F8u2q9#Jd2xO4U6t~G$W z&rIC0W?_8F!S{P|ai@yMSU3yaAM~#ds$ZE4TV6O>jm;~(?SjoHd>aC{>Ih?N!o;q! zixH0JqP(BmxT#03YUbDfYOGFwUfyk>bSB2wuqcPNJy5SGZr|(h@5$GL(p`98 z)T1BD%y8Teg=ed~L8mj_;k=*1*+d`8B6<;X)`TBMSf}qUO{$z&73KBhZv^eb;bBbg zD|`x^CoC%WDi6^-&-0)cGUp`be4~heX4W4-H)j&vm-i>oThjjw`eF8VP?1A4lj)~L zJ188WTpM$U{#-%1KKH*5dL2_A*JxcO#r9%4tdb-YmwpI3oWmzLK128{roEZAG1a+J z>BlA8Gu^PX!q-e_mr>#SIu`ydJ`1)F;^zRzk3N9a3;IA1KO39?{L9V1Ag*q3f@mo> zejbE8_>cZ|uykPaE5_mw;K7};wYI3&e5O> zvuYOfs|9uAyDr(_-vNr}=K4C~5%8Y?Rp>jV;12+GW7S#) z{!^d|#}3QE9|-CeTV)0Ke*{%n`B#GT7m2T9VC_nNJqVuc#`~aAaNYt{SS=iayn{jA z_{HXaAsX@d?gG2gRqL3h%b`1b-MPR-v*N z_&4lNYEF?1B@Qj{RYm7v)3mB%3*0mW)fjzG8! zREctVJi-;AN>s`d5Uv7+o#jag4*-Rpaty-9f-UDT^ScC3cI zhQK-}-~{jK_zKjyINN%fbgNo5MBT22S}UwI)(h6xR+VG0W0K=O#}khKaeU$U7XJ!d zm9xQlr}KH|Th7m&4tt$F-qq?_;(FNiwChDz$lc&}w9#&8>fbB;^e@Rd(R~A2!d2pH#r!H0sh95dV$6AG&^rXFEb%Z1BavG}B!y=(`Ve&7$F6yeH>? z9Te~L6(hgFADZjO=K86*e#Td5t8~5sTubpSuTt?OesAIT9e$az6!(=q#kn|Zd6M<6 zJjwb9zuoxl#P0+A9u((V599YZet!_3TYnP&S9@OlYJfXNnO#aWzi}`t7Z^M&iJuz54+_58zN%MY9FAnv`gzlWM@$4P+tSAJn{515zF#FWa~derIqvA^FA zzIxfzHp6}=NK5zoeqyV>)DQYZ*?bU$i5-wdptM`bv33*00NrTy5+uFgeyw@gbb{n4 zLTa1bl;SPF6I?bML8I;SJ%IJ&E{df4vbj?WljpAt$w%&tiGutq=6XMDeD#Xij$2U- zDwN18W~0?eT2bi7$Ee&46G??2yyZ+NxH3r)nq>*PA_S$BJpXZ&JTJ)43-vF(VCoTO zfm9X&$r)34L0Y|FZu(uc*nXhp7p0fWFG=M~<}gV1YCYBhts682^QB=MMf<#<-Kk&y zd5&qma5HN5+rcZQ72e#Hs-1crE0XLnWskd^C`yhTG%Y>w+x=i~&vIw2ac}cc68k0& z8bRwp(AUTMm zOEKgPw82z^CP+aQ`7{P1VFc}1K8zxcLgSzlCBY;%$al>+%Bw-L_P}qosbA~u7PJb$ zgE;C83&EpC&`s*m5YTXFYt5$FSpTIKX*LkGAZ|yJC!Mw4>wX+!?l+>tLnNCahfwC$ zdK~*6!nW))V z-womiLA;wp6nFE`@2$53KSp+aXD9d?Mr3w4_7IdIX@V92$Qs)Ur6EbkZ>--6Fko7# zTujT-v+zEJxw(#kcOi_rUMVWZ8pF~7ZbfePAYz;$0Ijv-z;D8|3Y&#cxPiv7NU}x% zmZlNd?Qo=+PGtlVNca1J9-Arp4OX^9gP8jv9jWM+$OV|9IqVrd)) z-wwwit)}_H(4xI^Z*T9K-?#@wxZVodsH!z5VWaAPdc7k=lz0+lqu*_}8h#R7Z?&P2 z*ILN|$D2eHOJiy7eJt9?)N)y19W?_>4&s8leBC>Zqcr2R@=%Z}DBN3hngM>oV z^kcXS8Qe*g*=co?Rx_Xv-tv1#>rf<(is(fX@pmcAYMQWwlv3@CmAhfN=PDRHY#=5U ztlfaokY=T8$#&R*CBgPXepvhBAfp0qzRduQgi4c9HgV6l38mucl_`W zV~d~GybatpA2p7ouI}Fp5HdGw;e!adYXL$Co3C%S*|yzcJYnvHvCE3|xLC%tn!S3Y zK}U8&VQTOS-KZyxK?=Nl3tNY;OSxug9RXsVBV{z&i25A+I>IEItw%NkY@2f=YQ$$? zoe~%}ZZa$cs4TG;3$er3BU`pC!$d4#7xoPUbEe$9Ozs}ck#53N1_ejSkt~OkOyV-T z)DZ!7+x^&YzsA5@$`XQ0PT!I)**iC)@KAD43Q3_7lCH(Ef2=wvWs-Qk-)>9cS`=yK zdOPwH0b%lza-*f0-6Pm5$tFjw-de90boSfF0$^uZhayTa0)X2N=r0%CJboQuX{sV91SEI}9lFdRe7zl^R+T59q1g6g0MsB`%Vv`e3~&fO zo16VMc3X%9hLF_TaVG|fH~pIb?R~ zhsSA!HB16eTKg@YqolP*evd&&6vCK33L3H`u$nX*^jn&NNpt{7wS^pmm_S;g16$<5 zjb=Bvr|#3tYpRAyl!69>yJx z=<*#4b6y8p7xb)~3b4s7H=b7R&(`8Q?$|yaOjW(MKX099iR*ZNnth(Or{!(>GN@Zkuo0g;7lTMUqvafzfTTl7q7bCI+jw>sMdFnVs`?1GVu0J?;dM>U+rsl+g&qUscu*cd=9 zFccm;!bSq0)j{aS17I;PkZ|HjSvu@Vmg5J0Xy}7?Vb0{VHwevIx4RK_U^rxS>&q?V z??wQtWinBBZ@0gXBSkT7L)i@u?6IM`=JXg*yBi+%*tK!e8ih`_G7yrTDISa#*LQA3 znc8}zn<*tDr8~`RU4Nvs*5KJ(rfDOk@%BCssjS0pBC-Z1%&@tIwcH6{*Ld2Qg4g0h z9J+_e?S69mK!WnL4v{x3PSZN5-PU2~C;d3n_*N9spSKzoC2cy~9!}J#flM(S0VxC< zB^cmVgQt?~e%EinGo`h6!h2!#Fx){bgIVeMn=R;8#1_B-%aviRv}mfGhVb^|(Ci-d zlP0>edI5Rl4T+#0Q4BSNqK`*3)!7eX$<}$^FH&j`hhO!(5Oz2-FqV0%SQm!}QoV~< z=+nShW7F!gFG@6mqE1(AvXjgkt?<5)^GCCO9U|!V)t{MWnoS+2({zht*#V<` zh{iB?xXQ+xbCysMM^}KkIq6Pjz zn-Ss$R`2(mP;IpQ!!YVWYkOb?Nv$<|#&ZR&5q{D>_8tx+Ag3D>)(9Op9;3m&2de-P#>CllzPbYdJtK%@R zXK3!4HVST`JHRs~m>Br59t09WW9CetCt=G701Zbm*hZyDuw52-nJo8bGU(Wr!wxAc zFJozrgJ|v$9Mv54R&yLtb9BlS8k3OeJFq@2+@nxXJW^t`sBkz}%~%=J0!Gvf2b2I? z$hA41i&3uIK7KDv#ZmJhKtnjec3BcAF`971<}iZIv6@OCwVFYtW}s~&_jBY{FPsC0 zl~}~q2hFs?9fR6C6lsOFNIk%0qtokX*=)3*8ODm-t4Dkn?6s{HDD@Bm7MR5FxN$*_A@kqLcv=*Z%RVE()Kqid3nKda^=KT(jUTvdJsPc8rhwgG%KITox&%WI z3BDtTXgVF6<%DdO7%4(p@2ah=4$12w*a(IPz7T81czv>sJMFcE-Wa!MO4dpsWXli%Sy|caX|5h=>K5H-$je<6B3}?9 zi4JdhD72M~S(CEaC;T zkIycGnFNstE|eI1Dqw1B+{~dRjtHPUl3;3-Io;_pgN-f|E*(?UyK1fF72_~OV-|Q! zYAS{B1U7>x#pV#D*jzeSha?9owh#snZLT4bY6$h4? z!l(}>pF*{xh|ui4I5E=D`^^ycqlFRJGbJkthM;(~$UW4sF2UixZ5gWpg*0jARc8t$&fsyopgF7| zl4h{cz+IZ5F~E(ihiM^k4^EhMXtUXilZ1h(HHShOZfT8|trFTvjnuCDAgITN-Pn=_@OEY+cJ)b=e_m6D= zESm%uxN8AtBs{EvUrW-Qg5(s3Mo=90F9pZcMBRHJRB{KdLI@TH%HF%~cUtXZNd1Es zZikwAX_#3Hk70D=Rviv##|}={qwewW{GR5Q-X(p&%+7ms>(tBCi`d#dwB@jFsCgE$ zX&;|sz7`^C#BM)1HnPFx18oMo!+Y-OHvG1|KIUd>J)R}pjyJInJLWTjpIyfnsSegjVmpWumN{+Z4l!Fpu67B|2zgjVr9C{8u;=c8SK@)52+Y626Z zbl&!H9?wTs@$792m<`m&z;I)I!(7HFRs0s|F~((Y7mfF~N9oeBdiefd1AjW=0ZMKB z9iwmaw{8i=jj`EqZf12?sCi&%A`Mmif~mGPOFMvn4Ij>*RV=O$rX4|r!ltzGYmJ#S>z2>DoWA-2k z`0X5wR+X`FK!B22u7h@t!7({{Vhny?s0Gg56X^JQC^x$zSK$7qos?wdQbxuPXQ=#) z*Klqeohy>%r10+N*1?+=Mh=Bim1(ZycrW1b<_9r7ApJa^iAHIW7gCZ1pi; zir%}DW% zq{ne)UuMHuaD1iS)ipswSNfn)()k^rhqmN#9%H=SQIR+T9{b^y=Ew@;kx&X?U|HwTdqSaUCd2Ey%M{MUcr(tx;;H*z;V9#VAT@GMNnBs)nsX({amRJ?O(l#5QcUsS*Uy?5 z)q&znVd8SS#TcI&*>fKCS%TC@=%mh?`19gN@T<>u;@%S!QhsNFVhlTkO$z6 z=Z!b`brP>`hAW)P152v$B#BZ;GfiFG#~M-!#@B@Mc9wZ}`b0@n-Jr%MXhBEbfR*qb z|5K9E#4uF95M0$kh@xu9?zt8;5+toF9h|Pz^zLVq!@*ln&rk@Ua&ydc=zABr)Vuw4 zr`QuV(Oc7ak^*`sUB&ZYo7U5maIQ+9tGy{SxafrS6jsWgE`T#V57DoBT$<9Xzxdyy zmL7u<$|T*Ngff_)$N1@R4R_K2>+B_Z#berShinQ4b9 zCaNsiB_Eehj+ZK_vw>7UF8l4_J8N+E&bXXHo#KqD z64|V3NpdL=E<$Ilo%LyIVK*_hF70U8Myc(I&{48gk*m zwV~=)8RW1JH5RELr~sy6*cv!WL8mT~Qr(|8YfZHX!9xw{XfLTCRQI%pEZy1Vb7SlL ztL9Z1VRR%|(!rmPE;1+YjI)OJ^qi_SDYL1_TnN=tjfd#3)ikIJ9W^49GRo{BCh16H z4=TC3wNm$#)w|O|AzEtPIPXY%x>RRWNFgmaC-&cenkMEVG$oIQDoea7X?7*)J}8@R z3*#1n8W>2BPt!o@9G80-sHq-)Ug2l!;52Po);hW1(nYc=o|Ef9d&kg{ak8%Cp+s1%Wg?sJB`hB!%R8j1nHhg!)UDTT2Pj#G)_7uZFiQH7evLK zjpOE57lHdl^QCR@XEg9(tiavUCPv|msM_40kxmy+s_7ve#GpKDuny0=kZo%Q@7w~J zTm)`5Puuo7o9C8<(x53 z(226g4lE2D%;5JwDcS0?xaJISDX?cvWR&Ra#^ryJ=+EwgRIVNgS9zdANZpZA0)-g- z!*ww}jFnxqpN;IDmZj%?G=f=Sb(5laGZdjXXb8g9)e|^92V=|ee%t{DgEopTnRW>A z^G+j-+UO46{;v_XN%Q2WQ0|T%^f;%U9x*A4Qb8r(|31(DsLnt6)6vs)%bkC@0N;B! zDG8^YV~y{3&RTyBFLiyLWQ{V4%)?55W;9BsF^Rwx@}&uPWol00=>BN?(<7wOotGYp zQDrm|(7mND(Iqiyqp`Q6JZsV?DReT-y)LbfI|r7di&y{Z9#7*TX;N{}&6W8%H%C2F zR~=IqL>ZxGF@9tqZ=P`Cq>ji;;YSFIU(s`4q;wCa_*r`njQrUpJUT$Y|zBb&uVf( zljjP=9{fEmJ*mml#iuHRf8s5BNYQ@qZJWMr(>F_~{}WWa?=l~iic^&r`G+_5RBHU2 zU-YK%%A02l|MIh5<;5q9Q%X&=#{5Uu3TQ3uI9XzrZ|DpbBy;P6NYDVL>$hD9B@nnP!c%N{75pPy&b4&EWQ6oB1JouyzY01*qA zN(oCuVw;6xK3AHXn<;uvE%gb&n+Bh%+($36toI!Vl?qZUOla9dKSg}zip6}XBz@&7 z%}SG0|8l@J6R{d39ylc;(eHNEji#Tgc7d70yd>{?x5qiMWI(^MY6h!Iz(%f;$c86fGdT*^U8i&)<2Mf^-31r}Mf zLl$qSDKB8@LH=7@|HqqCvtE%9)LJ0d|M5cQ1X2$a2SobY-qKg8CBK=g{OT+^tPK7= zX&8KK8lp3JN9d^)s%90S8Q^_0hfMC%i(bxlk|y5-iMeTr-r!qLI83RnoP1_6XYn1C zg5W6einHvta#GfIC)#YY05D{g^kLl19OZhGB0yFweYIH3Ee-ylvSk;piKXTg0COt! zq^Oj=I+c3T)jln?_UdYBTqvQ79Bk2cz36o8hgg~%#Jrd*SGJxk=2dtXD~nGp4gL`L z(t^T^mLjo>GmvZ6EgL`t2eelfhl0O2SIiB2fqlb@6aiYDwm{XeACdM7K*W)Tb`ocp@_QNEIGS0_^ry|MxlOH#N%B_9t5cN; z*(^aH%6Ktbnd0@9SB6o_l^4+x96+Xs;d3is@Z+zbyZ7*eWs+SsLyF#3id-_J=xv$C z2lLe_59BO8_Lm+9bZog9P-cq-jssX_@L{nyl`Aa`z7M*QK5n61X?1$(aR;<~$SDoJ zKVQuQgvt&;!|~tL@m(?;|4l5|8Z_s<%A!#6{(Ld79D1)Z_-IDDXJ1Zu-jfv|{@^2N z@E(VNoGM7=leI*=Z=tg(LdjvwaV5TMJEHu2SET4e>GUJyS1Tta7_rLc(&PJ>?&?bA zBsT|JuLk6uoLZE3oJDyjw~STGn3U9(zyx8D${9(6P?f&-jpZMI|8xK5OCChu%Xw2d zGw_OeSSyp~Pc-I#jBCk-E3@f|Heh;u4VXKzp3fdw7j(y8a>vyrcS1dz9#+q$XVvrB zqw0AEFgm*_T&=w3ojMRd(&RwnOg|5^c-V+E6m-+GavuZMP>4ti}~y$7b_pP zCwqDW5#ni&H>_|^d)D(Te^a+OqZ=&UE02w);iTJVEspQEUm6EwZz-Mqv`zkZzWL2B z=JB&K@Or#>yySS{o8G*VH{;EshOckL|9thWqM2XENp=m#UAIgfa)E!jOJ;r-fF1Li zT%TUU8~f_Oxec5u-a>u{V15?2@N&7A5l44$<>m?_ArgAAs9|W;rYkmm)}|M1`W$c< zbA{3j&^18I!x(&Ls<1kpD@;!n@cY5A#DzkxkOSu3l0|Fg3UjCo0Ba%rGSaPFp^W4N z#SNlqm{M3R0Z`8sW(7u1&Y{$m=L>Lyxx&0dZ(5?BwCU5NItMm*n;;2#p{ zUACZClFr2k4f%V zkrf~D@&oNzjm&Ut>G0nzk|YU5kiLb`_6ZAck%Qn%%)qV%^&N)12=ixf6*8;C+{!Tb z>@as>n0pQZVG*AKG#7qdoX&R;0Mn*_r&P`7%B5+9%P3FJ!V^@s7?dp1?_uF!guSIN z16F6lmCE34rb~51rtDx#N~mXZIwDU-xhs`-89T_5AUY<|5;=pCIU>$+1o#T%bK=6_ z$#WjUUesAK7ni>#H9^n84e@roJO?=4aA_>ZEY=W6uIj{TJaf&l0Rf6 zNYX;7%G$vn6vzvS3?f)IoYC=X_!6N{e9 z5kcA@ZWjau>O?5WwWz%oEP7GUS+!cQ=mi;qyj?9?P*Ho(>kMd|(Oycnml^4W)vMsO z42s~S4KDfHG26BPpSR zi-H{F5n&mx5U%Pp1gs=QuPAa-Iib9jz)&QWlhulk@xWhPOO+GmD?SAs3_v`wN#xne zuYy3T(YGO#kj^a_3kEPUkyaN2+hlpGYGMBo-wdJ5`d#I zb5Kww2#H~)kfIx}jBR^$it2@JN_C2%^5SAyEs$9EH2Zd%6;{&B!v<<}y;vl#*bRbe z@|lt4pMqNmEZ+wuOz@v<1j!(J6RL&1Tgq5AXCI6@$%{zDO|pIiGO&LH(v281%nq2o2wW(2l8fWA->^@Z-wDC zTe$_iXdrrMzvLT`IQ-lC)Gz-hGyBF8*cyFFaC${dA8Vi`7U1a(tLP#BWlQZ+3_l@pa&P?K8>^Aq!?$+9s7hf`#xc~ekOB@;SXaC?|{>A5R zzI(m36n^gmOw#@PbLOkAG@5>x!7~Q$lZ-do?VEhYJnRKtHl<8WCI@$y>bV59osDK{&@d}w@vu(S!tDS?szwh zk96_yU;q81d>6{*fx2`)#7Fpa%~yeg$oLCy=*hcr*VPGt#FY+5Zm4 z;(c&^XqtOaKDy4Qg6;vvyDFW~gVcOSg=nHQ~Ku@lZ z%bD9nr2mHb6!6J0-iUIy-qRWU)ni`7?wR+74DO@x*A#A`A3jQlH>F_IF8INj@L?T1 z4PdJH)Md=u7EUe@+s&UPKDqEoc$bc?>#&VJd5?*Yz$bt0b-2W{dE67r_A$=Elz#?q tOee3`WV_1e9rzF(Z{nTZhPUZ{ivLwT9K9R!mp}hgOymD2?I*^8{|WK!j3fX6 diff --git a/Demos/Unity/DedicatedServerDemo/Server/Assets/Scripts/Multiplayer/RiptideNetworking.dll.meta b/Demos/Unity/DedicatedServerDemo/Server/Assets/Scripts/Multiplayer/RiptideNetworking.dll.meta deleted file mode 100644 index c86b2b9e..00000000 --- a/Demos/Unity/DedicatedServerDemo/Server/Assets/Scripts/Multiplayer/RiptideNetworking.dll.meta +++ /dev/null @@ -1,33 +0,0 @@ -fileFormatVersion: 2 -guid: 4454308f8452d3b40acfead0227c816b -PluginImporter: - externalObjects: {} - serializedVersion: 2 - iconMap: {} - executionOrder: {} - defineConstraints: [] - isPreloaded: 0 - isOverridable: 0 - isExplicitlyReferenced: 0 - validateReferences: 1 - platformData: - - first: - Any: - second: - enabled: 1 - settings: {} - - first: - Editor: Editor - second: - enabled: 0 - settings: - DefaultValueInitialized: true - - first: - Windows Store Apps: WindowsStoreApps - second: - enabled: 0 - settings: - CPU: AnyCPU - userData: - assetBundleName: - assetBundleVariant: diff --git a/Demos/Unity/DedicatedServerDemo/Server/Assets/Scripts/Multiplayer/RiptideNetworking.xml b/Demos/Unity/DedicatedServerDemo/Server/Assets/Scripts/Multiplayer/RiptideNetworking.xml deleted file mode 100644 index 1cd4d0cf..00000000 --- a/Demos/Unity/DedicatedServerDemo/Server/Assets/Scripts/Multiplayer/RiptideNetworking.xml +++ /dev/null @@ -1,2678 +0,0 @@ - - - - RiptideNetworking - - - - A client that can connect to a . - - - Invoked when a connection to the server is established. - - - Invoked when a connection to the server fails to be established. - - - Invoked when a message is received. - - - Invoked when disconnected from the server. - - - Invoked when another non-local client connects. - - - Invoked when another non-local client disconnects. - - - The client's numeric ID. - - - - - - - This value is slower to accurately represent lasting changes in latency than , but it is less susceptible to changing drastically due to significant—but temporary—jumps in latency. - - - Whether or not the client is currently not connected nor trying to connect. - - - Whether or not the client is currently in the process of connecting. - - - Whether or not the client's connection is currently pending (will only be when a server doesn't immediately accept the connection request). - - - Whether or not the client is currently connected. - - - - - - Encapsulates a method that handles a message from a server. - The message that was received. - - - The client's connection to a server. - - - How many connection attempts have been made so far. - - - How many connection attempts to make before giving up. - - - - - - The underlying transport's client that is used for sending and receiving data. - - - Custom data to include when connecting. - - - - - - - - - Disconnects the client if it's connected and swaps out the transport it's using. - The new transport to use for sending and receiving data. - This method does not automatically reconnect to the server. To continue communicating with the server, must be called again. - - - Attempts to connect to a server at the given host address. - The host address to connect to. - How many connection attempts to make before giving up. - The ID of the group of message handler methods to use when building . - Data that should be sent to the server with the connection attempt. Use to get an empty message instance. - Riptide's default transport expects the host address to consist of an IP and port, separated by a colon. For example: 127.0.0.1:7777. If you are using a different transport, check the relevant documentation for what information it requires in the host address. - if a connection attempt will be made. if an issue occurred (such as being in an invalid format) and a connection attempt will not be made. - - - Subscribes appropriate methods to the transport's events. - - - Unsubscribes methods from all of the transport's events. - - - - - - - - - - - - - - - Sends a message to the server. - The message to send. - Whether or not to return the message to the pool after it is sent. - - - - Disconnects from the server. - - - Cleans up the local side of the connection. - The reason why the client has disconnected. - The disconnection or rejection message, potentially containing extra data to be handled externally. - TData that should be sent to the client being disconnected. Use to get an empty message instance. Unused if the connection wasn't rejected. - - - What to do when the transport establishes a connection. - - - What to do when the transport fails to connect. - - - What to do when the transport disconnects. - - - Invokes the event. - - - Invokes the event. - The reason for the connection failure. - Additional data related to the failed connection attempt. - - - Invokes the event and initiates handling of the received message. - The received message. - - - Invokes the event. - The reason for the disconnection. - Additional data related to the disconnection. - - - Invokes the event. - The numeric ID of the client that connected. - - - Invokes the event. - The numeric ID of the client that disconnected. - - - The state of a connection. - - - Not connected. No connection has been established or the connection has been closed. - - - Connecting. Still trying to establish a connection. - - - Connection is pending. The server is still determining whether or not the connection should be allowed. - - - Connected. A connection has been established successfully. - - - Represents a connection to a or . - - - The connection's numeric ID. - - - Whether or not the connection is currently not connected nor trying to connect. - - - Whether or not the connection is currently in the process of connecting. - - - Whether or not the connection is currently pending (will only be when a server doesn't immediately accept the connection request). - - - Whether or not the connection is currently connected. - - - The round trip time (ping) of the connection, in milliseconds. -1 if not calculated yet. - - - The smoothed round trip time (ping) of the connection, in milliseconds. -1 if not calculated yet. - This value is slower to accurately represent lasting changes in latency than , but it is less susceptible to changing drastically due to significant—but temporary—jumps in latency. - - - Whether or not the connection can time out. - - - The local peer this connection is associated with. - - - Whether or not the connection has timed out. - - - Whether or not the connection attempt has timed out. Uses a multiple of and ignores the value of . - - - The currently pending reliably sent messages whose delivery has not been acknowledged yet. Stored by sequence ID. - - - The sequence ID of the latest message that we want to acknowledge. - - - Messages that we have received and want to acknowledge. - - - Messages that we have received whose sequence IDs no longer fall into 's range. Used to improve duplicate message filtering capabilities. - - - The sequence ID of the latest message that we've received an ack for. - - - Messages that we sent which have been acknoweledged. - - - A with the left-most bit set to 1. - - - The next sequence ID to use. - - - The connection's current state. - - - The time at which the last heartbeat was received from the other end. - - - The ID of the last ping that was sent. - - - The ID of the currently pending ping. - - - The stopwatch that tracks the time since the currently pending ping was sent. - - - Initializes the connection. - - - Resets the connection's timeout time. - - - Sends a message. - The message to send. - Whether or not to return the message to the pool after it is sent. - - If you intend to continue using the message instance after calling this method, you must set - to . can be used to manually return the message to the pool at a later time. - - - - Sends data. - The array containing the data. - The number of bytes in the array which should be sent. - - - Updates acks and determines whether the message is a duplicate. - The message's sequence ID. - Whether or not the message should be handled. - - - Cleans up the local side of the connection. - - - Updates the acks bitfield and determines whether or not to handle the message. - The gap between the newly received sequence ID and the previously last received sequence ID. - Whether or not the message should be handled, based on whether or not it's a duplicate. - - - Updates the duplicate filter bitfield and determines whether or not to handle the message. - The gap between the newly received sequence ID and the previously last received sequence ID. - Whether or not the message should be handled, based on whether or not it's a duplicate. - - - Updates which messages we've received acks for. - The latest sequence ID that the other end has received. - A redundant list of sequence IDs that the other end has (or has not) received. - - - Check the ack status of the given sequence ID. - The sequence ID whose ack status to check. - The bit corresponding to the sequence ID's position in the bit field. - - - Immediately marks the of a given sequence ID as delivered. - The sequence ID that was acknowledged. - - - Puts the connection in the pending state. - - - Sends an ack message for the given sequence ID. - The sequence ID to acknowledge. - - - Handles an ack message. - The ack message to handle. - - - Handles an ack message for a sequence ID other than the last received one. - The ack message to handle. - - - Sends a welcome message. - - - Handles a welcome message on the server. - The welcome message to handle. - - - Handles a heartbeat message. - The heartbeat message to handle. - - - Sends a heartbeat message. - - - Handles a welcome message on the client. - The welcome message to handle. - - - Sends a welcome response message. - - - Sends a heartbeat message. - - - Handles a heartbeat message. - The heartbeat message to handle. - - - Contains event data for when a client connects to the server. - - - The newly connected client. - - - Initializes event data. - The newly connected client. - - - Contains event data for when a client disconnects from the server. - - - The client that disconnected. - - - The reason for the disconnection. - - - Initializes event data. - The client that disconnected. - The reason for the disconnection. - - - Contains event data for when a message is received. - - - The connection from which the message was received. - - - The ID of the message. - - - The received message. - - - Initializes event data. - The connection from which the message was received. - The ID of the message. - The received message. - - - Contains event data for when a connection attempt to a server fails. - - - Additional data related to the failed connection attempt (if any). - - - Initializes event data. - Additional data related to the failed connection attempt (if any). - - - Contains event data for when the client disconnects from a server. - - - The reason for the disconnection. - - - Additional data related to the disconnection (if any). - - - Initializes event data. - The reason for the disconnection. - Additional data related to the disconnection (if any). - - - Contains event data for when a non-local client connects to the server. - - - The numeric ID of the client that connected. - - - Initializes event data. - The numeric ID of the client that connected. - - - Contains event data for when a non-local client disconnects from the server. - - - The numeric ID of the client that disconnected. - - - Initializes event data. - The numeric ID of the client that disconnected. - - - The exception that is thrown when a does not contain enough unread bytes to add a certain value. - - - The message with insufficient remaining capacity. - - - The name of the type which could not be added to the message. - - - The number of available bytes the type requires in order to be added successfully. - - - Initializes a new instance. - - - Initializes a new instance with a specified error message. - The error message that explains the reason for the exception. - - - Initializes a new instance with a specified error message and a reference to the inner exception that is the cause of this exception. - The error message that explains the reason for the exception. - The exception that is the cause of the current exception. If is not a null reference, the current exception is raised in a catch block that handles the inner exception. - - - Initializes a new instance and constructs an error message from the given information. - The message with insufficient remaining capacity. - The name of the type which could not be added to the message. - The number of available bytes required for the type to be added successfully. - - - Initializes a new instance and constructs an error message from the given information. - The message with insufficient remaining capacity. - The length of the array which could not be added to the message. - The name of the array's type. - The number of available bytes required for a single element of the array to be added successfully. - The number of available bytes required for the entire array to be added successfully. If left as -1, this will be set to * . - - - Constructs the error message from the given information. - The error message. - - - Constructs the error message from the given information. - The error message. - - - The exception that is thrown when a method with a is not marked as . - - - The type containing the handler method. - - - The name of the handler method. - - - Initializes a new instance. - - - Initializes a new instance with a specified error message. - The error message that explains the reason for the exception. - - - Initializes a new instance with a specified error message and a reference to the inner exception that is the cause of this exception. - The error message that explains the reason for the exception. - The exception that is the cause of the current exception. If is not a null reference, the current exception is raised in a catch block that handles the inner exception. - - - Initializes a new instance and constructs an error message from the given information. - The type containing the handler method. - The name of the handler method. - - - Constructs the error message from the given information. - The error message. - - - The exception that is thrown when a method with a does not have an acceptable message handler method signature (either or ). - - - The type containing the handler method. - - - The name of the handler method. - - - Initializes a new instance. - - - Initializes a new instance with a specified error message. - The error message that explains the reason for the exception. - - - Initializes a new instance with a specified error message and a reference to the inner exception that is the cause of this exception. - The error message that explains the reason for the exception. - The exception that is the cause of the current exception. If is not a null reference, the current exception is raised in a catch block that handles the inner exception. - - - Initializes a new instance and constructs an error message from the given information. - The type containing the handler method. - The name of the handler method. - - - Constructs the error message from the given information. - The error message. - - - The exception that is thrown when multiple methods with s are set to handle messages with the same ID and have the same method signature. - - - The message ID with multiple handler methods. - - - The type containing the first handler method. - - - The name of the first handler method. - - - The type containing the second handler method. - - - The name of the second handler method. - - - Initializes a new instance with a specified error message. - - - Initializes a new instance with a specified error message. - The error message that explains the reason for the exception. - - - Initializes a new instance with a specified error message and a reference to the inner exception that is the cause of this exception. - The error message that explains the reason for the exception. - The exception that is the cause of the current exception. If is not a null reference, the current exception is raised in a catch block that handles the inner exception. - - - Initializes a new instance and constructs an error message from the given information. - The message ID with multiple handler methods. - The first handler method's info. - The second handler method's info. - - - Constructs the error message from the given information. - The error message. - - - Represents a type that can be added to and retrieved from messages using the and methods. - - - Adds the type to the message. - The message to add the type to. - - - Retrieves the type from the message. - The message to retrieve the type from. - - - The send mode of a . - - - Unreliable send mode. - - - Reliable send mode. - - - Provides functionality for converting data to bytes and vice versa. - - - The maximum number of bytes required for a message's header. - 1 byte for the actual header, 2 bytes for the sequence ID (only for reliable messages), 2 bytes for the message ID. Messages sent unreliably will use 2 bytes less than this value for the header. - - - The maximum number of bytes that a message can contain, including the . - - - The maximum number of bytes of payload data that a message can contain. This value represents how many bytes can be added to a message on top of the . - - - How many messages to add to the pool for each or instance that is started. - Changes will not affect and instances which are already running until they are restarted. - - - A pool of reusable message instances. - - - The message's send mode. - - - The length in bytes of the unread data contained in the message. - - - The length in bytes of the data that has been written to the message. - - - How many more bytes can be written into the packet. - - - The message's data. - - - The position in the byte array that the next bytes will be written to. - - - The position in the byte array that the next bytes will be read from. - - - Initializes a reusable instance. - The maximum amount of bytes the message can contain. - - - Trims the message pool to a more appropriate size for how many and/or instances are currently running. - - - Gets a usable message instance. - A message instance ready to be used. - - - Gets a message instance that can be used for sending. - The mode in which the message should be sent. - The message ID. - A message instance ready to be used for sending. - - - - NOTE: will be cast to a . You should ensure that its value never exceeds that of , otherwise you'll encounter unexpected behaviour when handling messages. - - - Gets a message instance that can be used for sending. - The message's header type. - A message instance ready to be used for sending. - - - Gets a message instance directly from the pool without doing any extra setup. - As this message instance is returned straight from the pool, it will contain all previous data and settings. Using this instance without preparing it properly will likely result in unexpected behaviour. - A message instance. - - - Retrieves a message instance from the pool. If none is available, a new instance is created. - A message instance ready to be used for sending or handling. - - - Returns the message instance to the internal pool so it can be reused. - - - Prepares the message to be used. - The message, ready to be used. - - - Prepares the message to be used for sending. - The header of the message. - The message, ready to be used for sending. - - - Prepares the message to be used for handling. - The header of the message. - The number of bytes that this message contains and which can be retrieved. - The message, ready to be used for handling. - - - Sets the message's header byte to the given and determines the appropriate and read/write positions. - The header to use for this message. - - - Adds a single to the message. - The to add. - The message that the was added to. - - - Adds a single to the message. - The to add. - The message that the was added to. - - - Retrieves a single from the message. - The that was retrieved. - - - Retrieves a single from the message. - The that was retrieved. - - - Adds a array to the message. - The array to add. - Whether or not to include the length of the array in the message. - The message that the array was added to. - - - Adds an array to the message. - The array to add. - Whether or not to include the length of the array in the message. - The message that the array was added to. - - - Retrieves a array from the message. - The array that was retrieved. - - - Retrieves a array from the message. - The amount of bytes to retrieve. - The array that was retrieved. - - - Populates a array with bytes retrieved from the message. - The amount of bytes to retrieve. - The array to populate. - The position at which to start populating the array. - - - Retrieves an array from the message. - The array that was retrieved. - - - Retrieves an array from the message. - The amount of sbytes to retrieve. - The array that was retrieved. - - - Populates a array with bytes retrieved from the message. - The amount of sbytes to retrieve. - The array to populate. - The position at which to start populating . - - - Reads a number of bytes from the message and writes them into the given array. - The amount of bytes to read. - The array to write the bytes into. - The position at which to start writing into the array. - - - Reads a number of sbytes from the message and writes them into the given array. - The amount of sbytes to read. - The array to write the sbytes into. - The position at which to start writing into the array. - - - Adds a to the message. - The to add. - The message that the was added to. - - - Retrieves a from the message. - The that was retrieved. - - - Adds a array to the message. - The array to add. - Whether or not to include the length of the array in the message. - The message that the array was added to. - - - Retrieves a array from the message. - The array that was retrieved. - - - Retrieves a array from the message. - The amount of bools to retrieve. - The array that was retrieved. - - - Populates a array with bools retrieved from the message. - The amount of bools to retrieve. - The array to populate. - The position at which to start populating the array. - - - Reads a number of bools from the message and writes them into the given array. - The number of bytes the bools are being stored in. - The array to write the bools into. - The position at which to start writing into the array. - - - Adds a to the message. - The to add. - The message that the was added to. - - - Adds a to the message. - The to add. - The message that the was added to. - - - Retrieves a from the message. - The that was retrieved. - - - Retrieves a from the message. - The that was retrieved. - - - Adds a array to the message. - The array to add. - Whether or not to include the length of the array in the message. - The message that the array was added to. - - - Adds a array to the message. - The array to add. - Whether or not to include the length of the array in the message. - The message that the array was added to. - - - Retrieves a array from the message. - The array that was retrieved. - - - Retrieves a array from the message. - The amount of shorts to retrieve. - The array that was retrieved. - - - Populates a array with shorts retrieved from the message. - The amount of shorts to retrieve. - The array to populate. - The position at which to start populating the array. - - - Retrieves a array from the message. - The array that was retrieved. - - - Retrieves a array from the message. - The amount of ushorts to retrieve. - The array that was retrieved. - - - Populates a array with ushorts retrieved from the message. - The amount of ushorts to retrieve. - The array to populate. - The position at which to start populating the array. - - - Reads a number of shorts from the message and writes them into the given array. - The amount of shorts to read. - The array to write the shorts into. - The position at which to start writing into the array. - - - Reads a number of ushorts from the message and writes them into the given array. - The amount of ushorts to read. - The array to write the ushorts into. - The position at which to start writing into the array. - - - Adds an to the message. - The to add. - The message that the was added to. - - - Adds a to the message. - The to add. - The message that the was added to. - - - Retrieves an from the message. - The that was retrieved. - - - Retrieves a from the message. - The that was retrieved. - - - Adds an array message. - The array to add. - Whether or not to include the length of the array in the message. - The message that the array was added to. - - - Adds a array to the message. - The array to add. - Whether or not to include the length of the array in the message. - The message that the array was added to. - - - Retrieves an array from the message. - The array that was retrieved. - - - Retrieves an array from the message. - The amount of ints to retrieve. - The array that was retrieved. - - - Populates an array with ints retrieved from the message. - The amount of ints to retrieve. - The array to populate. - The position at which to start populating the array. - - - Retrieves a array from the message. - The array that was retrieved. - - - Retrieves a array from the message. - The amount of uints to retrieve. - The array that was retrieved. - - - Populates a array with uints retrieved from the message. - The amount of uints to retrieve. - The array to populate. - The position at which to start populating the array. - - - Reads a number of ints from the message and writes them into the given array. - The amount of ints to read. - The array to write the ints into. - The position at which to start writing into the array. - - - Reads a number of uints from the message and writes them into the given array. - The amount of uints to read. - The array to write the uints into. - The position at which to start writing into the array. - - - Adds a to the message. - The to add. - The message that the was added to. - - - Adds a to the message. - The to add. - The message that the was added to. - - - Retrieves a from the message. - The that was retrieved. - - - Retrieves a from the message. - The that was retrieved. - - - Adds a array to the message. - The array to add. - Whether or not to include the length of the array in the message. - The message that the array was added to. - - - Adds a array to the message. - The array to add. - Whether or not to include the length of the array in the message. - The message that the array was added to. - - - Retrieves a array from the message. - The array that was retrieved. - - - Retrieves a array from the message. - The amount of longs to retrieve. - The array that was retrieved. - - - Populates a array with longs retrieved from the message. - The amount of longs to retrieve. - The array to populate. - The position at which to start populating the array. - - - Retrieves a array from the message. - The array that was retrieved. - - - Retrieves a array from the message. - The amount of ulongs to retrieve. - The array that was retrieved. - - - Populates a array with ulongs retrieved from the message. - The amount of ulongs to retrieve. - The array to populate. - The position at which to start populating the array. - - - Reads a number of longs from the message and writes them into the given array. - The amount of longs to read. - The array to write the longs into. - The position at which to start writing into the array. - - - Reads a number of ulongs from the message and writes them into the given array. - The amount of ulongs to read. - The array to write the ulongs into. - The position at which to start writing into the array. - - - Adds a to the message. - The to add. - The message that the was added to. - - - Retrieves a from the message. - The that was retrieved. - - - Adds a array to the message. - The array to add. - Whether or not to include the length of the array in the message. - The message that the array was added to. - - - Retrieves a array from the message. - The array that was retrieved. - - - Retrieves a array from the message. - The amount of floats to retrieve. - The array that was retrieved. - - - Populates a array with floats retrieved from the message. - The amount of floats to retrieve. - The array to populate. - The position at which to start populating the array. - - - Reads a number of floats from the message and writes them into the given array. - The amount of floats to read. - The array to write the floats into. - The position at which to start writing into the array. - - - Adds a to the message. - The to add. - The message that the was added to. - - - Retrieves a from the message. - The that was retrieved. - - - Adds a array to the message. - The array to add. - Whether or not to include the length of the array in the message. - The message that the array was added to. - - - Retrieves a array from the message. - The array that was retrieved. - - - Retrieves a array from the message. - The amount of doubles to retrieve. - The array that was retrieved. - - - Populates a array with doubles retrieved from the message. - The amount of doubles to retrieve. - The array to populate. - The position at which to start populating the array. - - - Reads a number of doubles from the message and writes them into the given array. - The amount of doubles to read. - The array to write the doubles into. - The position at which to start writing into the array. - - - Adds a to the message. - The to add. - The message that the was added to. - - - Retrieves a from the message. - The that was retrieved. - - - Adds a array to the message. - The array to add. - Whether or not to include the length of the array in the message. - The message that the array was added to. - - - Retrieves a array from the message. - The array that was retrieved. - - - Retrieves a array from the message. - The amount of strings to retrieve. - The array that was retrieved. - - - Populates a array with strings retrieved from the message. - The amount of strings to retrieve. - The array to populate. - The position at which to start populating the array. - - - The maximum number of elements an array can contain where the length still fits into a single byte. - - - The maximum number of elements an array can contain where the length still fits into two byte2. - - - Adds the length of an array to the message, using either 1 or 2 bytes depending on how large the array is. Does not support arrays with more than 32,767 elements. - The length of the array. - - - Retrieves the length of an array from the message, using either 1 or 2 bytes depending on how large the array is. - The length of the array. - - - Adds a serializable to the message. - The serializable to add. - The message that the serializable was added to. - - - Retrieves a serializable from the message. - The serializable that was retrieved. - - - Adds an array of serializables to the message. - The array to add. - Whether or not to include the length of the array in the message. - The message that the array was added to. - - - Retrieves an array of serializables from the message. - The array that was retrieved. - - - Retrieves an array of serializables from the message. - The amount of serializables to retrieve. - The array that was retrieved. - - - Populates an array of serializables retrieved from the message. - The amount of serializables to retrieve. - The array to populate. - The position at which to start populating the array. - - - Reads a number of serializables from the message and writes them into the given array. - The amount of serializables to read. - The array to write the serializables into. - The position at which to start writing into . - - - - This method is simply an alternative way of calling . - - - - This method is simply an alternative way of calling . - - - - This method is simply an alternative way of calling . - - - - This method is simply an alternative way of calling . - - - - This method is simply an alternative way of calling . - - - - This method is simply an alternative way of calling . - - - - This method is simply an alternative way of calling . - - - - This method is simply an alternative way of calling . - - - - This method is simply an alternative way of calling . - - - - This method is simply an alternative way of calling . - - - - This method is simply an alternative way of calling . - - - - This method is simply an alternative way of calling . - - - - This method is simply an alternative way of calling . - - - - This method is simply an alternative way of calling . - - - - This method is simply an alternative way of calling . - - - - This method is simply an alternative way of calling . - - - - This method is simply an alternative way of calling . - - - - This method is simply an alternative way of calling . - - - - This method is simply an alternative way of calling . - - - - This method is simply an alternative way of calling . - - - - This method is simply an alternative way of calling . - - - - This method is simply an alternative way of calling . - - - - This method is simply an alternative way of calling . - - - - This method is simply an alternative way of calling . - - - - This method is simply an alternative way of calling . - - - - This method is simply an alternative way of calling . - - - The name of a value. - - - The name of a value. - - - The name of a value. - - - The name of a value. - - - The name of a value. - - - The name of an value. - - - The name of a value. - - - The name of a value. - - - The name of a value. - - - The name of a value. - - - The name of a value. - - - The name of a value. - - - The name of an array length value. - - - Constructs an error message for when a message contains insufficient unread bytes to retrieve a certain value. - The name of the value type for which the retrieval attempt failed. - Text describing the value which will be returned. - The error message. - - - Constructs an error message for when a message contains insufficient unread bytes to retrieve an array of values. - The expected length of the array. - The name of the value type for which the retrieval attempt failed. - The error message. - - - Constructs an error message for when a number of retrieved values do not fit inside the bounds of the provided array. - The number of values being retrieved. - The length of the provided array. - The position in the array at which to begin writing values. - The name of the value type which is being retrieved. - The name of the value type in plural form. If left empty, this will be set to with an s appended to it. - The error message. - - - Specifies a method as the message handler for messages with the given ID. - - - In order for a method to qualify as a message handler, it must match a valid message handler method signature. s - will only use methods marked with this attribute if they match the signature, and s - will only use methods marked with this attribute if they match the signature. - - - Methods marked with this attribute which match neither of the valid message handler signatures will not be used by s - or s and will cause warnings at runtime. - - - If you want a or to only use a subset of all message handler methods, you can do so by setting up - custom message handler groups. Simply set the group ID in the constructor and pass the - same value to the or method. This - will make that or only use message handlers which have the same group ID. - - - - - The ID of the message type which this method is meant to handle. - - - The ID of the group of message handlers which this method belongs to. - - - Initializes a new instance of the class with the and values. - The ID of the message type which this method is meant to handle. - The ID of the group of message handlers which this method belongs to. - - s will only use this method if its signature matches the signature. - s will only use this method if its signature matches the signature. - This method will be ignored if its signature matches neither of the valid message handler signatures. - - - - Provides functionality for enabling/disabling automatic message relaying by message type. - - - The number of bits an int consists of. - - - An array storing all the bits which represent whether messages of a given ID should be relayed or not. - - - Creates a filter of a given size. - How big to make the filter. - - should be set to the value of the largest message ID, plus 1. For example, if a server will - handle messages with IDs 1, 2, 3, 7, and 8, should be set to 9 (8 is the largest possible value, - and 8 + 1 = 9) despite the fact that there are only 5 unique message IDs the server will ever handle. - - - - Creates a filter based on an enum of message IDs. - The enum type. - - - Creates a filter of a given size and enables relaying for the given message IDs. - How big to make the filter. - Message IDs to enable auto relaying for. - - - - Creates a filter based on an enum of message IDs and enables relaying for the given message IDs. - The enum type. - Message IDs to enable relaying for. - - - Enables auto relaying for the given message IDs. - Message IDs to enable relaying for. - - - Calculate the filter size necessary to manage all message IDs in the given enum. - The enum type. - The appropriate filter size. - is not an . - - - Sets the filter size. - How big to make the filter. - - - Enables auto relaying for the given message ID. - The message ID to enable relaying for. - - - - - - Disables auto relaying for the given message ID. - The message ID to enable relaying for. - - - - - - Checks whether or not messages with the given ID should be relayed. - The message ID to check. - Whether or not messages with the given ID should be relayed. - - - The reason the connection attempt was rejected. - - - No response was received from the server (because the client has no internet connection, the server is offline, no server is listening on the target endpoint, etc.). - - - The client is already connected. - - - A connection attempt is already pending. - - - The server is full. - - - The connection attempt was rejected. - - - The connection attempt was rejected and custom data may have been included with the rejection message. - - - The reason for a disconnection. - - - No connection was ever established. - - - The connection attempt was rejected by the server. - - - The active transport detected a problem with the connection. - - - The connection timed out. - - This also acts as the fallback reason—if a client disconnects and the message containing the real reason is lost - in transmission, it can't be resent as the connection will have already been closed. As a result, the other end will time - out the connection after a short period of time and this will be used as the reason. - - - - The client was forcibly disconnected by the server. - - - The server shut down. - - - The disconnection was initiated by the client. - - - Provides base functionality for and . - - - The name to use when logging messages via . - - - The time (in milliseconds) after which to disconnect if no heartbeats are received. - - - The interval (in milliseconds) at which to send and expect heartbeats to be received. - Changes to this value will only take effect after the next heartbeat is executed. - - - The number of currently active and instances. - - - The current time. - - - The text to log when disconnected due to . - - - The text to log when disconnected due to . - - - The text to log when disconnected due to . - - - The text to log when disconnected due to . - - - The text to log when disconnected due to . - - - The text to log when disconnected due to . - - - The text to log when disconnected or rejected due to an unknown reason. - - - The text to log when the connection failed due to . - - - The text to log when the connection failed due to . - - - The text to log when the connection failed due to . - - - The text to log when the connection failed due to . - - - A stopwatch used to track how much time has passed. - - - Received messages which need to be handled. - - - A queue of events to execute, ordered by how soon they need to be executed. - - - Initializes the peer. - The name to use when logging messages via . - - - Retrieves methods marked with . - An array containing message handler methods. - - - Builds a dictionary of message IDs and their corresponding message handler methods. - The ID of the group of message handler methods to include in the dictionary. - - - Starts tracking how much time has passed. - - - Stops tracking how much time has passed. - - - Beats the heart. - - - Handles any received messages and invokes any delayed events which need to be invoked. - - - Sets up a delayed event to be executed after the given time has passed. - How long from now to execute the delayed event, in milliseconds. - The delayed event to execute later. - - - Handles all queued messages. - - - Handles data received by the transport. - - - Handles a message. - The message to handle. - The message's header type. - The connection which the message was received on. - - - Increases . For use when a new or is started. - - - Decreases . For use when a or is stopped. - - - Stores information about a message that needs to be handled. - - - The message that needs to be handled. - - - The message's header type. - - - The connection on which the message was received. - - - Handles initialization. - The message that needs to be handled. - The message's header type. - The connection on which the message was received. - - - Represents a currently pending reliably sent message whose delivery has not been acknowledged yet. - - - The time of the latest send attempt. - - - The multiplier used to determine how long to wait before resending a pending message. - - - How often to try sending the message before giving up. - - - A pool of reusable instances. - - - The to use to send (and resend) the pending message. - - - The sequence ID of the message. - - - The contents of the message. - - - The length in bytes of the data that has been written to the message. - - - How many send attempts have been made so far. - - - Whether the pending message has been cleared or not. - - - Handles initial setup. - - - Retrieves a instance, initializes it and then sends it. - The sequence ID of the message. - The message that is being sent reliably. - The to use to send (and resend) the pending message. - - - Retrieves a instance from the pool. If none is available, a new instance is created. - A instance. - - - Returns the instance to the pool so it can be reused. - - - Resends the message. - - - Attempts to send the message. - - - Clears the message. - Whether or not to remove the message from . - - - A server that can accept connections from s. - - - Invoked when a client connects. - - - Invoked when a message is received. - - - Invoked when a client disconnects. - - - Whether or not the server is currently running. - - - The local port that the server is running on. - - - The maximum number of concurrent connections. - - - The number of currently connected clients. - - - An array of all the currently connected clients. - The position of each instance in the array does not correspond to that client's numeric ID (except by coincidence). - - - Encapsulates a method that handles a message from a client. - The numeric ID of the client from whom the message was received. - The message that was received. - - - Encapsulates a method that determines whether or not to accept a client's connection attempt. - - - An optional method which determines whether or not to accept a client's connection attempt. - The parameter is the pending connection and the parameter is a message containing any additional data the client included with the connection attempt. - - - Stores which message IDs have auto relaying enabled. Relaying is disabled entirely when this is . - - - Currently pending connections which are waiting to be accepted or rejected. - - - Currently connected clients. - - - Clients that have timed out and need to be removed from . - - - Methods used to handle messages, accessible by their corresponding message IDs. - - - The underlying transport's server that is used for sending and receiving data. - - - All currently unused client IDs. - - - Handles initial setup. - The transport to use for sending and receiving data. - The name to use when logging messages via . - - - Handles initial setup using the built-in UDP transport. - The name to use when logging messages via . - - - Stops the server if it's running and swaps out the transport it's using. - The new underlying transport server to use for sending and receiving data. - This method does not automatically restart the server. To continue accepting connections, must be called again. - - - Starts the server. - The local port on which to start the server. - The maximum number of concurrent connections to allow. - The ID of the group of message handler methods to use when building . - - - Subscribes appropriate methods to the transport's events. - - - Unsubscribes methods from all of the transport's events. - - - - - - Handles an incoming connection attempt. - - - Handles a connect message. - The client that sent the connect message. - The connect message. - - - Accepts the given pending connection. - The connection to accept. - - - Rejects the given pending connection. - The connection to reject. - Data that should be sent to the client being rejected. Use to get an empty message instance. - - - Accepts the given pending connection. - The connection to accept. - - - Rejects the given pending connection. - The connection to reject. - The reason why the connection is being rejected. - Data that should be sent to the client being rejected - - - Checks if clients have timed out. - - - - - - - - - Sends a message to a given client. - The message to send. - The numeric ID of the client to send the message to. - Whether or not to return the message to the pool after it is sent. - - - - Sends a message to a given client. - The message to send. - The client to send the message to. - Whether or not to return the message to the pool after it is sent. - - - - Sends a message to all connected clients. - The message to send. - Whether or not to return the message to the pool after it is sent. - - - - Sends a message to all connected clients except the given one. - The message to send. - The numeric ID of the client to not send the message to. - Whether or not to return the message to the pool after it is sent. - - - - Retrieves the client with the given ID, if a client with that ID is currently connected. - The ID of the client to retrieve. - The retrieved client. - if a client with the given ID was connected; otherwise . - - - Disconnects a specific client. - The numeric ID of the client to disconnect. - Data that should be sent to the client being disconnected. Use to get an empty message instance. - - - Disconnects the given client. - The client to disconnect. - Data that should be sent to the client being disconnected. Use to get an empty message instance. - - - Cleans up the local side of the given connection. - The client to disconnect. - The reason why the client is being disconnected. - - - What to do when the transport disconnects a client. - - - Stops the server. - - - Initializes available client IDs. - - - Retrieves an available client ID. - The client ID. 0 if none were available. - - - Sends a disconnect message. - The client to send the disconnect message to. - Why the client is being disconnected. - Optional custom data that should be sent to the client being disconnected. - - - Sends a client connected message. - The newly connected client. - - - Sends a client disconnected message. - The numeric ID of the client that disconnected. - - - Invokes the event. - The newly connected client. - - - Invokes the event and initiates handling of the received message. - The received message. - The client from which the message was received. - - - Invokes the event. - The client that disconnected. - The reason for the disconnection. - - - Contains event data for when a server's transport successfully establishes a connection to a client. - - - The newly established connection. - - - Initializes event data. - The newly established connection. - - - Contains event data for when a server's or client's transport receives data. - - - An array containing the received data. - - - The number of bytes that were received. - - - The connection which the data was received from. - - - Initializes event data. - An array containing the received data. - The number of bytes that were received. - The connection which the data was received from. - - - Contains event data for when a server's or client's transport initiates or detects a disconnection. - - - The closed connection. - - - The reason for the disconnection. - - - Initializes event data. - The closed connection. - The reason for the disconnection. - - - Defines methods, properties, and events which every transport's client must implement. - - - Invoked when a connection is established at the transport level. - - - Invoked when a connection attempt fails at the transport level. - - - Starts the transport and attempts to connect to the given host address. - The host address to connect to. - The pending connection. if an issue occurred. - The error message associated with the issue that occurred, if any. - if a connection attempt will be made. if an issue occurred (such as being in an invalid format) and a connection attempt will not be made. - - - Closes the connection to the server. - - - The header type of a . - - - An unreliable user message. - - - An internal unreliable ack message. - - - An internal unreliable ack message, used when acknowledging a sequence ID other than the last received one. - - - An internal unreliable connect message. - - - An internal unreliable connection rejection message. - - - An internal unreliable heartbeat message. - - - An internal unreliable disconnect message. - - - A reliable user message. - - - An internal reliable welcome message. - - - An internal reliable client connected message. - - - An internal reliable client disconnected message. - - - Defines methods, properties, and events which every transport's server and client must implement. - - - Invoked when data is received by the transport. - - - Invoked when a disconnection is initiated or detected by the transport. - - - Initiates handling of any received messages. - - - Defines methods, properties, and events which every transport's server must implement. - - - Invoked when a connection is established at the transport level. - - - - - - Starts the transport and begins listening for incoming connections. - The local port on which to listen for connections. - - - Closes an active connection. - The connection to close. - - - Closes all existing connections and stops listening for new connections. - - - A client which can connect to a . - - - - - - - - - - - - The connection to the server. - - - - Expects the host address to consist of an IP and port, separated by a colon. For example: 127.0.0.1:7777. - - - Parses into and , if possible. - The host address to parse. - The retrieved IP. - The retrieved port. - Whether or not was in a valid format. - - - - - - - - - Invokes the event. - - - Invokes the event. - - - - - - Represents a connection to a or . - - - The endpoint representing the other end of the connection. - - - The socket to use for sending and receiving. - - - The local peer this connection is associated with. - - - An array to receive message size values into. - - - The size of the next message to be received. - - - Initializes the connection. - The socket to use for sending and receiving. - The endpoint representing the other end of the connection. - The local peer this connection is associated with. - - - - - - Polls the socket and checks if any data was received. - - - Receives a message, if all of its data is ready to be received. - How many bytes were received. - Whether or not all of the message's data was ready to be received. - - - Closes the connection. - - - - - - - - - - - - - - - Provides base send & receive functionality for and . - - - - - - An array that incoming data is received into. - - - An array that outgoing data is sent out of. - - - The default size used for the socket's send and receive buffers. - - - The size to use for the socket's send and receive buffers. - - - The main socket, either used for listening for connections or for sending and receiving data. - - - The minimum size that may be used for the socket's send and receive buffers. - - - Initializes the transport. - How big the socket's send and receive buffers should be. - - - Handles received data. - The number of bytes that were received. - The connection from which the data was received. - - - Invokes the event. - The closed connection. - The reason for the disconnection. - - - A server which can accept connections from s. - - - - - - - - - - - - The maximum number of pending connections to allow at any given time. - - - Whether or not the server is running. - - - The currently open connections, accessible by their endpoints. - - - Connections that need to be closed. - - - - - - - - - Starts listening for connections on the given port. - The port to listen on. - - - - - - Accepts any pending connections. - - - Stops listening for connections. - - - - - - - - - Invokes the event. - The successfully established connection. - - - - - - A client which can connect to a . - - - - - - - - - - - - The connection to the server. - - - - - - - Expects the host address to consist of an IP and port, separated by a colon. For example: 127.0.0.1:7777. - - - Parses into and , if possible. - The host address to parse. - The retrieved IP. - The retrieved port. - Whether or not was in a valid format. - - - - - - Invokes the event. - - - Invokes the event. - - - - - - Represents a connection to a or . - - - The endpoint representing the other end of the connection. - - - The local peer this connection is associated with. - - - Initializes the connection. - The endpoint representing the other end of the connection. - The local peer this connection is associated with. - - - - - - - - - - - - - - - - - - The kind of socket to create. - - - Dual-mode. Works with both IPv4 and IPv6. - - - IPv4 only mode. - - - IPv6 only mode. - - - Provides base send & receive functionality for and . - - - - - - The default size used for the socket's send and receive buffers. - - - The minimum size that may be used for the socket's send and receive buffers. - - - How long to wait for a packet, in microseconds. - - - Whether to create an IPv4 only, IPv6 only, or dual-mode socket. - - - The size to use for the socket's send and receive buffers. - - - The array that incoming data is received into. - - - The socket to use for sending and receiving. - - - Whether or not the transport is running. - - - A reusable endpoint. - - - Initializes the transport. - Whether to create an IPv4 only, IPv6 only, or dual-mode socket. - How big the socket's send and receive buffers should be. - - - - - - Opens the socket and starts the transport. - The port to bind the socket to. - - - Closes the socket and stops the transport. - - - Polls the socket and checks if any data was received. - - - Sends data to a given endpoint. - The array containing the data. - The number of bytes in the array which should be sent. - The endpoint to send the data to. - - - Handles received data. - A byte array containing the received data. - The number of bytes in used by the received data. - The endpoint from which the data was received. - - - Invokes the event. - The closed connection. - The reason for the disconnection. - - - A server which can accept connections from s. - - - - - - - - - - - - The currently open connections, accessible by their endpoints. - - - - - - - - - Decides what to do with a connection attempt. - The connection to accept or reject. - Whether or not the connection attempt was a new connection. - - - - - - - - - Invokes the event. - The successfully established connection. - - - - - - Provides functionality for queueing methods for later execution from a chosen thread. - - - The name to use when logging messages via . - - - Handles initial setup. - The name to use when logging messages via . - - - Adds an action to the queue. - The action to be added to the queue. - - - Executes all actions in the queue on the calling thread. - This method should only be called from a single thread in the application. - - - Clears all actions in the queue without executing them. - - - Provides functionality for converting bytes to various value types and vice versa. - - - Converts a given to bytes and writes them into the given array. - The to convert. - The array to write the bytes into. - The position in the array at which to write the bytes. - - - Converts a given to bytes and writes them into the given array. - The to convert. - The array to write the bytes into. - The position in the array at which to write the bytes. - - - Converts the 2 bytes in the array at to a . - The array to read the bytes from. - The position in the array at which to read the bytes. - The converted . - - - Converts the 2 bytes in the array at to a . - The array to read the bytes from. - The position in the array at which to read the bytes. - The converted . - - - Converts a given to bytes and writes them into the given array. - The to convert. - The array to write the bytes into. - The position in the array at which to write the bytes. - - - Converts a given to bytes and writes them into the given array. - The to convert. - The array to write the bytes into. - The position in the array at which to write the bytes. - - - Converts the 4 bytes in the array at to a . - The array to read the bytes from. - The position in the array at which to read the bytes. - The converted . - - - Converts the 4 bytes in the array at to a . - The array to read the bytes from. - The position in the array at which to read the bytes. - The converted . - - - Converts a given to bytes and writes them into the given array. - The to convert. - The array to write the bytes into. - The position in the array at which to write the bytes. - - - Converts a given to bytes and writes them into the given array. - The to convert. - The array to write the bytes into. - The position in the array at which to write the bytes. - - - Converts the 8 bytes in the array at to a . - The array to read the bytes from. - The position in the array at which to read the bytes. - The converted . - - - Converts the 8 bytes in the array at to a . - The array to read the bytes from. - The position in the array at which to read the bytes. - The converted . - - - Converts a given to bytes and writes them into the given array. - The to convert. - The array to write the bytes into. - The position in the array at which to write the bytes. - - - Converts the 4 bytes in the array at to a . - The array to read the bytes from. - The position in the array at which to read the bytes. - The converted . - - - Converts a given to bytes and writes them into the given array. - The to convert. - The array to write the bytes into. - The position in the array at which to write the bytes. - - - Converts the 8 bytes in the array at to a . - The array to read the bytes from. - The position in the array at which to read the bytes. - The converted . - - - Executes an action when invoked. - - - Executes the action. - - - Resends a when invoked. - - - The message to resend. - - - The time at which the resend event was queued. - - - Initializes the event. - The message to resend. - The time at which the resend event was queued. - - - - - - Executes a heartbeat when invoked. - - - The peer whose heart to beat. - - - Initializes the event. - The peer whose heart to beat. - - - - - - Contains extension methods for various classes. - - - Takes the 's IP address and port number and converts it to a string, accounting for whether the address is an IPv4 or IPv6 address. - A string containing the IP address and port number of the endpoint. - - - Contains miscellaneous helper methods. - - - Determines whether or form should be used based on the . - The amount that and refer to. - The singular form. - The plural form. - if is 1; otherwise . - - - Calculates the signed gap between sequence IDs, accounting for wrapping. - The new sequence ID. - The previous sequence ID. - The signed gap between the two given sequence IDs. A positive gap means is newer than . A negative gap means is older than . - - - Represents a collection of items that have a value and a priority. On dequeue, the item with the lowest priority value is removed. - Specifies the type of elements in the queue. - Specifies the type of priority associated with enqueued elements. - - - Gets the number of elements contained in the . - - - Adds the specified element and associated priority to the . - The element to add. - The priority with which to associate the new element. - - - Removes and returns the lowest priority element. - - - Returns the priority of the lowest priority element. - - - Removes all elements from the . - - - Defines log message types. - - - Logs that are used for investigation during development. - - - Logs that provide general information about application flow. - - - Logs that highlight abnormal or unexpected events in the application flow. - - - Logs that highlight problematic events in the application flow which will cause unexpected behavior if not planned for. - - - Provides functionality for logging messages. - - - Whether or not messages will be logged. - - - Whether or not messages will be logged. - - - Whether or not messages will be logged. - - - Whether or not messages will be logged. - - - Encapsulates a method used to log messages. - The message to log. - - - Log methods, accessible by their - - - Whether or not to include timestamps when logging messages. - - - The format to use for timestamps. - - - Initializes with all log types enabled. - The method to use when logging all types of messages. - Whether or not to include timestamps when logging messages. - The format to use for timestamps. - - - Initializes with the supplied log methods. - The method to use when logging debug messages. Set to to disable debug logs. - The method to use when logging info messages. Set to to disable info logs. - The method to use when logging warning messages. Set to to disable warning logs. - The method to use when logging error messages. Set to to disable error logs. - Whether or not to include timestamps when logging messages. - The format to use for timestamps. - - - Enables logging for messages of the given . - The type of message to enable logging for. - The method to use when logging this type of message. - - - Disables logging for messages of the given . - The type of message to enable logging for. - - - Logs a message. - The type of log message that is being logged. - The message to log. - - - Logs a message. - The type of log message that is being logged. - Who is logging this message. - The message to log. - - - Converts a object to a formatted timestamp string. - The time to format. - The formatted timestamp. - - - diff --git a/Demos/Unity/DedicatedServerDemo/Server/Assets/Scripts/Multiplayer/RiptideNetworking.xml.meta b/Demos/Unity/DedicatedServerDemo/Server/Assets/Scripts/Multiplayer/RiptideNetworking.xml.meta deleted file mode 100644 index ded4fecb..00000000 --- a/Demos/Unity/DedicatedServerDemo/Server/Assets/Scripts/Multiplayer/RiptideNetworking.xml.meta +++ /dev/null @@ -1,7 +0,0 @@ -fileFormatVersion: 2 -guid: c5a61e845c1fff044b95518a94069a85 -TextScriptImporter: - externalObjects: {} - userData: - assetBundleName: - assetBundleVariant: diff --git a/Demos/Unity/DedicatedServerDemo/Server/Assets/Scripts/Multiplayer/NetworkManager.cs b/Demos/Unity/DedicatedServerDemo/Server/Assets/Scripts/NetworkManager.cs similarity index 100% rename from Demos/Unity/DedicatedServerDemo/Server/Assets/Scripts/Multiplayer/NetworkManager.cs rename to Demos/Unity/DedicatedServerDemo/Server/Assets/Scripts/NetworkManager.cs diff --git a/Demos/Unity/DedicatedServerDemo/Server/Assets/Scripts/Multiplayer/NetworkManager.cs.meta b/Demos/Unity/DedicatedServerDemo/Server/Assets/Scripts/NetworkManager.cs.meta similarity index 100% rename from Demos/Unity/DedicatedServerDemo/Server/Assets/Scripts/Multiplayer/NetworkManager.cs.meta rename to Demos/Unity/DedicatedServerDemo/Server/Assets/Scripts/NetworkManager.cs.meta diff --git a/Demos/Unity/DedicatedServerDemo/Server/Packages/manifest.json b/Demos/Unity/DedicatedServerDemo/Server/Packages/manifest.json index 137e47ea..17afdd7e 100644 --- a/Demos/Unity/DedicatedServerDemo/Server/Packages/manifest.json +++ b/Demos/Unity/DedicatedServerDemo/Server/Packages/manifest.json @@ -9,6 +9,7 @@ "com.unity.textmeshpro": "3.0.6", "com.unity.timeline": "1.4.8", "com.unity.ugui": "1.0.0", + "net.tomweiland.riptide": "https://github.com/RiptideNetworking/Riptide.git?path=/Packages/Core#unity-package", "com.unity.modules.ai": "1.0.0", "com.unity.modules.androidjni": "1.0.0", "com.unity.modules.animation": "1.0.0", diff --git a/Demos/Unity/DedicatedServerDemo/Server/Packages/packages-lock.json b/Demos/Unity/DedicatedServerDemo/Server/Packages/packages-lock.json index 984ab05e..3fc84e4a 100644 --- a/Demos/Unity/DedicatedServerDemo/Server/Packages/packages-lock.json +++ b/Demos/Unity/DedicatedServerDemo/Server/Packages/packages-lock.json @@ -145,6 +145,13 @@ "com.unity.modules.imgui": "1.0.0" } }, + "net.tomweiland.riptide": { + "version": "https://github.com/RiptideNetworking/Riptide.git?path=/Packages/Core#unity-package", + "depth": 0, + "source": "git", + "dependencies": {}, + "hash": "bb252ba2ea4bd1314d3f8f60bea490418635d06e" + }, "com.unity.modules.ai": { "version": "1.0.0", "depth": 0, diff --git a/Demos/Unity/PlayerHostedDemo/Assets/Scripts/Multiplayer.meta b/Demos/Unity/PlayerHostedDemo/Assets/Scripts/Multiplayer.meta deleted file mode 100644 index 81e5a3c3..00000000 --- a/Demos/Unity/PlayerHostedDemo/Assets/Scripts/Multiplayer.meta +++ /dev/null @@ -1,8 +0,0 @@ -fileFormatVersion: 2 -guid: 9b534641b4d8d5e45b96413300921df4 -folderAsset: yes -DefaultImporter: - externalObjects: {} - userData: - assetBundleName: - assetBundleVariant: diff --git a/Demos/Unity/PlayerHostedDemo/Assets/Scripts/Multiplayer/MessageExtensions.cs b/Demos/Unity/PlayerHostedDemo/Assets/Scripts/Multiplayer/MessageExtensions.cs deleted file mode 100644 index acafc335..00000000 --- a/Demos/Unity/PlayerHostedDemo/Assets/Scripts/Multiplayer/MessageExtensions.cs +++ /dev/null @@ -1,70 +0,0 @@ -using UnityEngine; - -namespace Riptide.Demos.PlayerHosted -{ - public static class MessageExtensions - { - #region Vector2 - /// - /// This method is simply an alternative way of calling . - public static Message Add(this Message message, Vector2 value) => AddVector2(message, value); - - /// Adds a to the message. - /// The to add. - /// The message that the was added to. - public static Message AddVector2(this Message message, Vector2 value) - { - return message.AddFloat(value.x).AddFloat(value.y); - } - - /// Retrieves a from the message. - /// The that was retrieved. - public static Vector2 GetVector2(this Message message) - { - return new Vector2(message.GetFloat(), message.GetFloat()); - } - #endregion - - #region Vector3 - /// - /// This method is simply an alternative way of calling . - public static Message Add(this Message message, Vector3 value) => AddVector3(message, value); - - /// Adds a to the message. - /// The to add. - /// The message that the was added to. - public static Message AddVector3(this Message message, Vector3 value) - { - return message.AddFloat(value.x).AddFloat(value.y).AddFloat(value.z); - } - - /// Retrieves a from the message. - /// The that was retrieved. - public static Vector3 GetVector3(this Message message) - { - return new Vector3(message.GetFloat(), message.GetFloat(), message.GetFloat()); - } - #endregion - - #region Quaternion - /// - /// This method is simply an alternative way of calling . - public static Message Add(this Message message, Quaternion value) => AddQuaternion(message, value); - - /// Adds a to the message. - /// The to add. - /// The message that the was added to. - public static Message AddQuaternion(this Message message, Quaternion value) - { - return message.AddFloat(value.x).AddFloat(value.y).AddFloat(value.z).AddFloat(value.w); - } - - /// Retrieves a from the message. - /// The that was retrieved. - public static Quaternion GetQuaternion(this Message message) - { - return new Quaternion(message.GetFloat(), message.GetFloat(), message.GetFloat(), message.GetFloat()); - } - #endregion - } -} diff --git a/Demos/Unity/PlayerHostedDemo/Assets/Scripts/Multiplayer/MessageExtensions.cs.meta b/Demos/Unity/PlayerHostedDemo/Assets/Scripts/Multiplayer/MessageExtensions.cs.meta deleted file mode 100644 index 8ca6499c..00000000 --- a/Demos/Unity/PlayerHostedDemo/Assets/Scripts/Multiplayer/MessageExtensions.cs.meta +++ /dev/null @@ -1,11 +0,0 @@ -fileFormatVersion: 2 -guid: 902e9c84d084f8646b058c1c9e02625f -MonoImporter: - externalObjects: {} - serializedVersion: 2 - defaultReferences: [] - executionOrder: 0 - icon: {instanceID: 0} - userData: - assetBundleName: - assetBundleVariant: diff --git a/Demos/Unity/PlayerHostedDemo/Assets/Scripts/Multiplayer/RiptideNetworking.dll b/Demos/Unity/PlayerHostedDemo/Assets/Scripts/Multiplayer/RiptideNetworking.dll deleted file mode 100644 index 48e9c08175712576464662324720181dfa54cb2d..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 70144 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 diff --git a/Demos/Unity/PlayerHostedDemo/Assets/Scripts/Multiplayer/RiptideNetworking.dll.meta b/Demos/Unity/PlayerHostedDemo/Assets/Scripts/Multiplayer/RiptideNetworking.dll.meta deleted file mode 100644 index cb9677fa..00000000 --- a/Demos/Unity/PlayerHostedDemo/Assets/Scripts/Multiplayer/RiptideNetworking.dll.meta +++ /dev/null @@ -1,33 +0,0 @@ -fileFormatVersion: 2 -guid: dc23106aa097d8a488c815e9bcb76acf -PluginImporter: - externalObjects: {} - serializedVersion: 2 - iconMap: {} - executionOrder: {} - defineConstraints: [] - isPreloaded: 0 - isOverridable: 0 - isExplicitlyReferenced: 0 - validateReferences: 1 - platformData: - - first: - Any: - second: - enabled: 1 - settings: {} - - first: - Editor: Editor - second: - enabled: 0 - settings: - DefaultValueInitialized: true - - first: - Windows Store Apps: WindowsStoreApps - second: - enabled: 0 - settings: - CPU: AnyCPU - userData: - assetBundleName: - assetBundleVariant: diff --git a/Demos/Unity/PlayerHostedDemo/Assets/Scripts/Multiplayer/RiptideNetworking.xml b/Demos/Unity/PlayerHostedDemo/Assets/Scripts/Multiplayer/RiptideNetworking.xml deleted file mode 100644 index 1cd4d0cf..00000000 --- a/Demos/Unity/PlayerHostedDemo/Assets/Scripts/Multiplayer/RiptideNetworking.xml +++ /dev/null @@ -1,2678 +0,0 @@ - - - - RiptideNetworking - - - - A client that can connect to a . - - - Invoked when a connection to the server is established. - - - Invoked when a connection to the server fails to be established. - - - Invoked when a message is received. - - - Invoked when disconnected from the server. - - - Invoked when another non-local client connects. - - - Invoked when another non-local client disconnects. - - - The client's numeric ID. - - - - - - - This value is slower to accurately represent lasting changes in latency than , but it is less susceptible to changing drastically due to significant—but temporary—jumps in latency. - - - Whether or not the client is currently not connected nor trying to connect. - - - Whether or not the client is currently in the process of connecting. - - - Whether or not the client's connection is currently pending (will only be when a server doesn't immediately accept the connection request). - - - Whether or not the client is currently connected. - - - - - - Encapsulates a method that handles a message from a server. - The message that was received. - - - The client's connection to a server. - - - How many connection attempts have been made so far. - - - How many connection attempts to make before giving up. - - - - - - The underlying transport's client that is used for sending and receiving data. - - - Custom data to include when connecting. - - - - - - - - - Disconnects the client if it's connected and swaps out the transport it's using. - The new transport to use for sending and receiving data. - This method does not automatically reconnect to the server. To continue communicating with the server, must be called again. - - - Attempts to connect to a server at the given host address. - The host address to connect to. - How many connection attempts to make before giving up. - The ID of the group of message handler methods to use when building . - Data that should be sent to the server with the connection attempt. Use to get an empty message instance. - Riptide's default transport expects the host address to consist of an IP and port, separated by a colon. For example: 127.0.0.1:7777. If you are using a different transport, check the relevant documentation for what information it requires in the host address. - if a connection attempt will be made. if an issue occurred (such as being in an invalid format) and a connection attempt will not be made. - - - Subscribes appropriate methods to the transport's events. - - - Unsubscribes methods from all of the transport's events. - - - - - - - - - - - - - - - Sends a message to the server. - The message to send. - Whether or not to return the message to the pool after it is sent. - - - - Disconnects from the server. - - - Cleans up the local side of the connection. - The reason why the client has disconnected. - The disconnection or rejection message, potentially containing extra data to be handled externally. - TData that should be sent to the client being disconnected. Use to get an empty message instance. Unused if the connection wasn't rejected. - - - What to do when the transport establishes a connection. - - - What to do when the transport fails to connect. - - - What to do when the transport disconnects. - - - Invokes the event. - - - Invokes the event. - The reason for the connection failure. - Additional data related to the failed connection attempt. - - - Invokes the event and initiates handling of the received message. - The received message. - - - Invokes the event. - The reason for the disconnection. - Additional data related to the disconnection. - - - Invokes the event. - The numeric ID of the client that connected. - - - Invokes the event. - The numeric ID of the client that disconnected. - - - The state of a connection. - - - Not connected. No connection has been established or the connection has been closed. - - - Connecting. Still trying to establish a connection. - - - Connection is pending. The server is still determining whether or not the connection should be allowed. - - - Connected. A connection has been established successfully. - - - Represents a connection to a or . - - - The connection's numeric ID. - - - Whether or not the connection is currently not connected nor trying to connect. - - - Whether or not the connection is currently in the process of connecting. - - - Whether or not the connection is currently pending (will only be when a server doesn't immediately accept the connection request). - - - Whether or not the connection is currently connected. - - - The round trip time (ping) of the connection, in milliseconds. -1 if not calculated yet. - - - The smoothed round trip time (ping) of the connection, in milliseconds. -1 if not calculated yet. - This value is slower to accurately represent lasting changes in latency than , but it is less susceptible to changing drastically due to significant—but temporary—jumps in latency. - - - Whether or not the connection can time out. - - - The local peer this connection is associated with. - - - Whether or not the connection has timed out. - - - Whether or not the connection attempt has timed out. Uses a multiple of and ignores the value of . - - - The currently pending reliably sent messages whose delivery has not been acknowledged yet. Stored by sequence ID. - - - The sequence ID of the latest message that we want to acknowledge. - - - Messages that we have received and want to acknowledge. - - - Messages that we have received whose sequence IDs no longer fall into 's range. Used to improve duplicate message filtering capabilities. - - - The sequence ID of the latest message that we've received an ack for. - - - Messages that we sent which have been acknoweledged. - - - A with the left-most bit set to 1. - - - The next sequence ID to use. - - - The connection's current state. - - - The time at which the last heartbeat was received from the other end. - - - The ID of the last ping that was sent. - - - The ID of the currently pending ping. - - - The stopwatch that tracks the time since the currently pending ping was sent. - - - Initializes the connection. - - - Resets the connection's timeout time. - - - Sends a message. - The message to send. - Whether or not to return the message to the pool after it is sent. - - If you intend to continue using the message instance after calling this method, you must set - to . can be used to manually return the message to the pool at a later time. - - - - Sends data. - The array containing the data. - The number of bytes in the array which should be sent. - - - Updates acks and determines whether the message is a duplicate. - The message's sequence ID. - Whether or not the message should be handled. - - - Cleans up the local side of the connection. - - - Updates the acks bitfield and determines whether or not to handle the message. - The gap between the newly received sequence ID and the previously last received sequence ID. - Whether or not the message should be handled, based on whether or not it's a duplicate. - - - Updates the duplicate filter bitfield and determines whether or not to handle the message. - The gap between the newly received sequence ID and the previously last received sequence ID. - Whether or not the message should be handled, based on whether or not it's a duplicate. - - - Updates which messages we've received acks for. - The latest sequence ID that the other end has received. - A redundant list of sequence IDs that the other end has (or has not) received. - - - Check the ack status of the given sequence ID. - The sequence ID whose ack status to check. - The bit corresponding to the sequence ID's position in the bit field. - - - Immediately marks the of a given sequence ID as delivered. - The sequence ID that was acknowledged. - - - Puts the connection in the pending state. - - - Sends an ack message for the given sequence ID. - The sequence ID to acknowledge. - - - Handles an ack message. - The ack message to handle. - - - Handles an ack message for a sequence ID other than the last received one. - The ack message to handle. - - - Sends a welcome message. - - - Handles a welcome message on the server. - The welcome message to handle. - - - Handles a heartbeat message. - The heartbeat message to handle. - - - Sends a heartbeat message. - - - Handles a welcome message on the client. - The welcome message to handle. - - - Sends a welcome response message. - - - Sends a heartbeat message. - - - Handles a heartbeat message. - The heartbeat message to handle. - - - Contains event data for when a client connects to the server. - - - The newly connected client. - - - Initializes event data. - The newly connected client. - - - Contains event data for when a client disconnects from the server. - - - The client that disconnected. - - - The reason for the disconnection. - - - Initializes event data. - The client that disconnected. - The reason for the disconnection. - - - Contains event data for when a message is received. - - - The connection from which the message was received. - - - The ID of the message. - - - The received message. - - - Initializes event data. - The connection from which the message was received. - The ID of the message. - The received message. - - - Contains event data for when a connection attempt to a server fails. - - - Additional data related to the failed connection attempt (if any). - - - Initializes event data. - Additional data related to the failed connection attempt (if any). - - - Contains event data for when the client disconnects from a server. - - - The reason for the disconnection. - - - Additional data related to the disconnection (if any). - - - Initializes event data. - The reason for the disconnection. - Additional data related to the disconnection (if any). - - - Contains event data for when a non-local client connects to the server. - - - The numeric ID of the client that connected. - - - Initializes event data. - The numeric ID of the client that connected. - - - Contains event data for when a non-local client disconnects from the server. - - - The numeric ID of the client that disconnected. - - - Initializes event data. - The numeric ID of the client that disconnected. - - - The exception that is thrown when a does not contain enough unread bytes to add a certain value. - - - The message with insufficient remaining capacity. - - - The name of the type which could not be added to the message. - - - The number of available bytes the type requires in order to be added successfully. - - - Initializes a new instance. - - - Initializes a new instance with a specified error message. - The error message that explains the reason for the exception. - - - Initializes a new instance with a specified error message and a reference to the inner exception that is the cause of this exception. - The error message that explains the reason for the exception. - The exception that is the cause of the current exception. If is not a null reference, the current exception is raised in a catch block that handles the inner exception. - - - Initializes a new instance and constructs an error message from the given information. - The message with insufficient remaining capacity. - The name of the type which could not be added to the message. - The number of available bytes required for the type to be added successfully. - - - Initializes a new instance and constructs an error message from the given information. - The message with insufficient remaining capacity. - The length of the array which could not be added to the message. - The name of the array's type. - The number of available bytes required for a single element of the array to be added successfully. - The number of available bytes required for the entire array to be added successfully. If left as -1, this will be set to * . - - - Constructs the error message from the given information. - The error message. - - - Constructs the error message from the given information. - The error message. - - - The exception that is thrown when a method with a is not marked as . - - - The type containing the handler method. - - - The name of the handler method. - - - Initializes a new instance. - - - Initializes a new instance with a specified error message. - The error message that explains the reason for the exception. - - - Initializes a new instance with a specified error message and a reference to the inner exception that is the cause of this exception. - The error message that explains the reason for the exception. - The exception that is the cause of the current exception. If is not a null reference, the current exception is raised in a catch block that handles the inner exception. - - - Initializes a new instance and constructs an error message from the given information. - The type containing the handler method. - The name of the handler method. - - - Constructs the error message from the given information. - The error message. - - - The exception that is thrown when a method with a does not have an acceptable message handler method signature (either or ). - - - The type containing the handler method. - - - The name of the handler method. - - - Initializes a new instance. - - - Initializes a new instance with a specified error message. - The error message that explains the reason for the exception. - - - Initializes a new instance with a specified error message and a reference to the inner exception that is the cause of this exception. - The error message that explains the reason for the exception. - The exception that is the cause of the current exception. If is not a null reference, the current exception is raised in a catch block that handles the inner exception. - - - Initializes a new instance and constructs an error message from the given information. - The type containing the handler method. - The name of the handler method. - - - Constructs the error message from the given information. - The error message. - - - The exception that is thrown when multiple methods with s are set to handle messages with the same ID and have the same method signature. - - - The message ID with multiple handler methods. - - - The type containing the first handler method. - - - The name of the first handler method. - - - The type containing the second handler method. - - - The name of the second handler method. - - - Initializes a new instance with a specified error message. - - - Initializes a new instance with a specified error message. - The error message that explains the reason for the exception. - - - Initializes a new instance with a specified error message and a reference to the inner exception that is the cause of this exception. - The error message that explains the reason for the exception. - The exception that is the cause of the current exception. If is not a null reference, the current exception is raised in a catch block that handles the inner exception. - - - Initializes a new instance and constructs an error message from the given information. - The message ID with multiple handler methods. - The first handler method's info. - The second handler method's info. - - - Constructs the error message from the given information. - The error message. - - - Represents a type that can be added to and retrieved from messages using the and methods. - - - Adds the type to the message. - The message to add the type to. - - - Retrieves the type from the message. - The message to retrieve the type from. - - - The send mode of a . - - - Unreliable send mode. - - - Reliable send mode. - - - Provides functionality for converting data to bytes and vice versa. - - - The maximum number of bytes required for a message's header. - 1 byte for the actual header, 2 bytes for the sequence ID (only for reliable messages), 2 bytes for the message ID. Messages sent unreliably will use 2 bytes less than this value for the header. - - - The maximum number of bytes that a message can contain, including the . - - - The maximum number of bytes of payload data that a message can contain. This value represents how many bytes can be added to a message on top of the . - - - How many messages to add to the pool for each or instance that is started. - Changes will not affect and instances which are already running until they are restarted. - - - A pool of reusable message instances. - - - The message's send mode. - - - The length in bytes of the unread data contained in the message. - - - The length in bytes of the data that has been written to the message. - - - How many more bytes can be written into the packet. - - - The message's data. - - - The position in the byte array that the next bytes will be written to. - - - The position in the byte array that the next bytes will be read from. - - - Initializes a reusable instance. - The maximum amount of bytes the message can contain. - - - Trims the message pool to a more appropriate size for how many and/or instances are currently running. - - - Gets a usable message instance. - A message instance ready to be used. - - - Gets a message instance that can be used for sending. - The mode in which the message should be sent. - The message ID. - A message instance ready to be used for sending. - - - - NOTE: will be cast to a . You should ensure that its value never exceeds that of , otherwise you'll encounter unexpected behaviour when handling messages. - - - Gets a message instance that can be used for sending. - The message's header type. - A message instance ready to be used for sending. - - - Gets a message instance directly from the pool without doing any extra setup. - As this message instance is returned straight from the pool, it will contain all previous data and settings. Using this instance without preparing it properly will likely result in unexpected behaviour. - A message instance. - - - Retrieves a message instance from the pool. If none is available, a new instance is created. - A message instance ready to be used for sending or handling. - - - Returns the message instance to the internal pool so it can be reused. - - - Prepares the message to be used. - The message, ready to be used. - - - Prepares the message to be used for sending. - The header of the message. - The message, ready to be used for sending. - - - Prepares the message to be used for handling. - The header of the message. - The number of bytes that this message contains and which can be retrieved. - The message, ready to be used for handling. - - - Sets the message's header byte to the given and determines the appropriate and read/write positions. - The header to use for this message. - - - Adds a single to the message. - The to add. - The message that the was added to. - - - Adds a single to the message. - The to add. - The message that the was added to. - - - Retrieves a single from the message. - The that was retrieved. - - - Retrieves a single from the message. - The that was retrieved. - - - Adds a array to the message. - The array to add. - Whether or not to include the length of the array in the message. - The message that the array was added to. - - - Adds an array to the message. - The array to add. - Whether or not to include the length of the array in the message. - The message that the array was added to. - - - Retrieves a array from the message. - The array that was retrieved. - - - Retrieves a array from the message. - The amount of bytes to retrieve. - The array that was retrieved. - - - Populates a array with bytes retrieved from the message. - The amount of bytes to retrieve. - The array to populate. - The position at which to start populating the array. - - - Retrieves an array from the message. - The array that was retrieved. - - - Retrieves an array from the message. - The amount of sbytes to retrieve. - The array that was retrieved. - - - Populates a array with bytes retrieved from the message. - The amount of sbytes to retrieve. - The array to populate. - The position at which to start populating . - - - Reads a number of bytes from the message and writes them into the given array. - The amount of bytes to read. - The array to write the bytes into. - The position at which to start writing into the array. - - - Reads a number of sbytes from the message and writes them into the given array. - The amount of sbytes to read. - The array to write the sbytes into. - The position at which to start writing into the array. - - - Adds a to the message. - The to add. - The message that the was added to. - - - Retrieves a from the message. - The that was retrieved. - - - Adds a array to the message. - The array to add. - Whether or not to include the length of the array in the message. - The message that the array was added to. - - - Retrieves a array from the message. - The array that was retrieved. - - - Retrieves a array from the message. - The amount of bools to retrieve. - The array that was retrieved. - - - Populates a array with bools retrieved from the message. - The amount of bools to retrieve. - The array to populate. - The position at which to start populating the array. - - - Reads a number of bools from the message and writes them into the given array. - The number of bytes the bools are being stored in. - The array to write the bools into. - The position at which to start writing into the array. - - - Adds a to the message. - The to add. - The message that the was added to. - - - Adds a to the message. - The to add. - The message that the was added to. - - - Retrieves a from the message. - The that was retrieved. - - - Retrieves a from the message. - The that was retrieved. - - - Adds a array to the message. - The array to add. - Whether or not to include the length of the array in the message. - The message that the array was added to. - - - Adds a array to the message. - The array to add. - Whether or not to include the length of the array in the message. - The message that the array was added to. - - - Retrieves a array from the message. - The array that was retrieved. - - - Retrieves a array from the message. - The amount of shorts to retrieve. - The array that was retrieved. - - - Populates a array with shorts retrieved from the message. - The amount of shorts to retrieve. - The array to populate. - The position at which to start populating the array. - - - Retrieves a array from the message. - The array that was retrieved. - - - Retrieves a array from the message. - The amount of ushorts to retrieve. - The array that was retrieved. - - - Populates a array with ushorts retrieved from the message. - The amount of ushorts to retrieve. - The array to populate. - The position at which to start populating the array. - - - Reads a number of shorts from the message and writes them into the given array. - The amount of shorts to read. - The array to write the shorts into. - The position at which to start writing into the array. - - - Reads a number of ushorts from the message and writes them into the given array. - The amount of ushorts to read. - The array to write the ushorts into. - The position at which to start writing into the array. - - - Adds an to the message. - The to add. - The message that the was added to. - - - Adds a to the message. - The to add. - The message that the was added to. - - - Retrieves an from the message. - The that was retrieved. - - - Retrieves a from the message. - The that was retrieved. - - - Adds an array message. - The array to add. - Whether or not to include the length of the array in the message. - The message that the array was added to. - - - Adds a array to the message. - The array to add. - Whether or not to include the length of the array in the message. - The message that the array was added to. - - - Retrieves an array from the message. - The array that was retrieved. - - - Retrieves an array from the message. - The amount of ints to retrieve. - The array that was retrieved. - - - Populates an array with ints retrieved from the message. - The amount of ints to retrieve. - The array to populate. - The position at which to start populating the array. - - - Retrieves a array from the message. - The array that was retrieved. - - - Retrieves a array from the message. - The amount of uints to retrieve. - The array that was retrieved. - - - Populates a array with uints retrieved from the message. - The amount of uints to retrieve. - The array to populate. - The position at which to start populating the array. - - - Reads a number of ints from the message and writes them into the given array. - The amount of ints to read. - The array to write the ints into. - The position at which to start writing into the array. - - - Reads a number of uints from the message and writes them into the given array. - The amount of uints to read. - The array to write the uints into. - The position at which to start writing into the array. - - - Adds a to the message. - The to add. - The message that the was added to. - - - Adds a to the message. - The to add. - The message that the was added to. - - - Retrieves a from the message. - The that was retrieved. - - - Retrieves a from the message. - The that was retrieved. - - - Adds a array to the message. - The array to add. - Whether or not to include the length of the array in the message. - The message that the array was added to. - - - Adds a array to the message. - The array to add. - Whether or not to include the length of the array in the message. - The message that the array was added to. - - - Retrieves a array from the message. - The array that was retrieved. - - - Retrieves a array from the message. - The amount of longs to retrieve. - The array that was retrieved. - - - Populates a array with longs retrieved from the message. - The amount of longs to retrieve. - The array to populate. - The position at which to start populating the array. - - - Retrieves a array from the message. - The array that was retrieved. - - - Retrieves a array from the message. - The amount of ulongs to retrieve. - The array that was retrieved. - - - Populates a array with ulongs retrieved from the message. - The amount of ulongs to retrieve. - The array to populate. - The position at which to start populating the array. - - - Reads a number of longs from the message and writes them into the given array. - The amount of longs to read. - The array to write the longs into. - The position at which to start writing into the array. - - - Reads a number of ulongs from the message and writes them into the given array. - The amount of ulongs to read. - The array to write the ulongs into. - The position at which to start writing into the array. - - - Adds a to the message. - The to add. - The message that the was added to. - - - Retrieves a from the message. - The that was retrieved. - - - Adds a array to the message. - The array to add. - Whether or not to include the length of the array in the message. - The message that the array was added to. - - - Retrieves a array from the message. - The array that was retrieved. - - - Retrieves a array from the message. - The amount of floats to retrieve. - The array that was retrieved. - - - Populates a array with floats retrieved from the message. - The amount of floats to retrieve. - The array to populate. - The position at which to start populating the array. - - - Reads a number of floats from the message and writes them into the given array. - The amount of floats to read. - The array to write the floats into. - The position at which to start writing into the array. - - - Adds a to the message. - The to add. - The message that the was added to. - - - Retrieves a from the message. - The that was retrieved. - - - Adds a array to the message. - The array to add. - Whether or not to include the length of the array in the message. - The message that the array was added to. - - - Retrieves a array from the message. - The array that was retrieved. - - - Retrieves a array from the message. - The amount of doubles to retrieve. - The array that was retrieved. - - - Populates a array with doubles retrieved from the message. - The amount of doubles to retrieve. - The array to populate. - The position at which to start populating the array. - - - Reads a number of doubles from the message and writes them into the given array. - The amount of doubles to read. - The array to write the doubles into. - The position at which to start writing into the array. - - - Adds a to the message. - The to add. - The message that the was added to. - - - Retrieves a from the message. - The that was retrieved. - - - Adds a array to the message. - The array to add. - Whether or not to include the length of the array in the message. - The message that the array was added to. - - - Retrieves a array from the message. - The array that was retrieved. - - - Retrieves a array from the message. - The amount of strings to retrieve. - The array that was retrieved. - - - Populates a array with strings retrieved from the message. - The amount of strings to retrieve. - The array to populate. - The position at which to start populating the array. - - - The maximum number of elements an array can contain where the length still fits into a single byte. - - - The maximum number of elements an array can contain where the length still fits into two byte2. - - - Adds the length of an array to the message, using either 1 or 2 bytes depending on how large the array is. Does not support arrays with more than 32,767 elements. - The length of the array. - - - Retrieves the length of an array from the message, using either 1 or 2 bytes depending on how large the array is. - The length of the array. - - - Adds a serializable to the message. - The serializable to add. - The message that the serializable was added to. - - - Retrieves a serializable from the message. - The serializable that was retrieved. - - - Adds an array of serializables to the message. - The array to add. - Whether or not to include the length of the array in the message. - The message that the array was added to. - - - Retrieves an array of serializables from the message. - The array that was retrieved. - - - Retrieves an array of serializables from the message. - The amount of serializables to retrieve. - The array that was retrieved. - - - Populates an array of serializables retrieved from the message. - The amount of serializables to retrieve. - The array to populate. - The position at which to start populating the array. - - - Reads a number of serializables from the message and writes them into the given array. - The amount of serializables to read. - The array to write the serializables into. - The position at which to start writing into . - - - - This method is simply an alternative way of calling . - - - - This method is simply an alternative way of calling . - - - - This method is simply an alternative way of calling . - - - - This method is simply an alternative way of calling . - - - - This method is simply an alternative way of calling . - - - - This method is simply an alternative way of calling . - - - - This method is simply an alternative way of calling . - - - - This method is simply an alternative way of calling . - - - - This method is simply an alternative way of calling . - - - - This method is simply an alternative way of calling . - - - - This method is simply an alternative way of calling . - - - - This method is simply an alternative way of calling . - - - - This method is simply an alternative way of calling . - - - - This method is simply an alternative way of calling . - - - - This method is simply an alternative way of calling . - - - - This method is simply an alternative way of calling . - - - - This method is simply an alternative way of calling . - - - - This method is simply an alternative way of calling . - - - - This method is simply an alternative way of calling . - - - - This method is simply an alternative way of calling . - - - - This method is simply an alternative way of calling . - - - - This method is simply an alternative way of calling . - - - - This method is simply an alternative way of calling . - - - - This method is simply an alternative way of calling . - - - - This method is simply an alternative way of calling . - - - - This method is simply an alternative way of calling . - - - The name of a value. - - - The name of a value. - - - The name of a value. - - - The name of a value. - - - The name of a value. - - - The name of an value. - - - The name of a value. - - - The name of a value. - - - The name of a value. - - - The name of a value. - - - The name of a value. - - - The name of a value. - - - The name of an array length value. - - - Constructs an error message for when a message contains insufficient unread bytes to retrieve a certain value. - The name of the value type for which the retrieval attempt failed. - Text describing the value which will be returned. - The error message. - - - Constructs an error message for when a message contains insufficient unread bytes to retrieve an array of values. - The expected length of the array. - The name of the value type for which the retrieval attempt failed. - The error message. - - - Constructs an error message for when a number of retrieved values do not fit inside the bounds of the provided array. - The number of values being retrieved. - The length of the provided array. - The position in the array at which to begin writing values. - The name of the value type which is being retrieved. - The name of the value type in plural form. If left empty, this will be set to with an s appended to it. - The error message. - - - Specifies a method as the message handler for messages with the given ID. - - - In order for a method to qualify as a message handler, it must match a valid message handler method signature. s - will only use methods marked with this attribute if they match the signature, and s - will only use methods marked with this attribute if they match the signature. - - - Methods marked with this attribute which match neither of the valid message handler signatures will not be used by s - or s and will cause warnings at runtime. - - - If you want a or to only use a subset of all message handler methods, you can do so by setting up - custom message handler groups. Simply set the group ID in the constructor and pass the - same value to the or method. This - will make that or only use message handlers which have the same group ID. - - - - - The ID of the message type which this method is meant to handle. - - - The ID of the group of message handlers which this method belongs to. - - - Initializes a new instance of the class with the and values. - The ID of the message type which this method is meant to handle. - The ID of the group of message handlers which this method belongs to. - - s will only use this method if its signature matches the signature. - s will only use this method if its signature matches the signature. - This method will be ignored if its signature matches neither of the valid message handler signatures. - - - - Provides functionality for enabling/disabling automatic message relaying by message type. - - - The number of bits an int consists of. - - - An array storing all the bits which represent whether messages of a given ID should be relayed or not. - - - Creates a filter of a given size. - How big to make the filter. - - should be set to the value of the largest message ID, plus 1. For example, if a server will - handle messages with IDs 1, 2, 3, 7, and 8, should be set to 9 (8 is the largest possible value, - and 8 + 1 = 9) despite the fact that there are only 5 unique message IDs the server will ever handle. - - - - Creates a filter based on an enum of message IDs. - The enum type. - - - Creates a filter of a given size and enables relaying for the given message IDs. - How big to make the filter. - Message IDs to enable auto relaying for. - - - - Creates a filter based on an enum of message IDs and enables relaying for the given message IDs. - The enum type. - Message IDs to enable relaying for. - - - Enables auto relaying for the given message IDs. - Message IDs to enable relaying for. - - - Calculate the filter size necessary to manage all message IDs in the given enum. - The enum type. - The appropriate filter size. - is not an . - - - Sets the filter size. - How big to make the filter. - - - Enables auto relaying for the given message ID. - The message ID to enable relaying for. - - - - - - Disables auto relaying for the given message ID. - The message ID to enable relaying for. - - - - - - Checks whether or not messages with the given ID should be relayed. - The message ID to check. - Whether or not messages with the given ID should be relayed. - - - The reason the connection attempt was rejected. - - - No response was received from the server (because the client has no internet connection, the server is offline, no server is listening on the target endpoint, etc.). - - - The client is already connected. - - - A connection attempt is already pending. - - - The server is full. - - - The connection attempt was rejected. - - - The connection attempt was rejected and custom data may have been included with the rejection message. - - - The reason for a disconnection. - - - No connection was ever established. - - - The connection attempt was rejected by the server. - - - The active transport detected a problem with the connection. - - - The connection timed out. - - This also acts as the fallback reason—if a client disconnects and the message containing the real reason is lost - in transmission, it can't be resent as the connection will have already been closed. As a result, the other end will time - out the connection after a short period of time and this will be used as the reason. - - - - The client was forcibly disconnected by the server. - - - The server shut down. - - - The disconnection was initiated by the client. - - - Provides base functionality for and . - - - The name to use when logging messages via . - - - The time (in milliseconds) after which to disconnect if no heartbeats are received. - - - The interval (in milliseconds) at which to send and expect heartbeats to be received. - Changes to this value will only take effect after the next heartbeat is executed. - - - The number of currently active and instances. - - - The current time. - - - The text to log when disconnected due to . - - - The text to log when disconnected due to . - - - The text to log when disconnected due to . - - - The text to log when disconnected due to . - - - The text to log when disconnected due to . - - - The text to log when disconnected due to . - - - The text to log when disconnected or rejected due to an unknown reason. - - - The text to log when the connection failed due to . - - - The text to log when the connection failed due to . - - - The text to log when the connection failed due to . - - - The text to log when the connection failed due to . - - - A stopwatch used to track how much time has passed. - - - Received messages which need to be handled. - - - A queue of events to execute, ordered by how soon they need to be executed. - - - Initializes the peer. - The name to use when logging messages via . - - - Retrieves methods marked with . - An array containing message handler methods. - - - Builds a dictionary of message IDs and their corresponding message handler methods. - The ID of the group of message handler methods to include in the dictionary. - - - Starts tracking how much time has passed. - - - Stops tracking how much time has passed. - - - Beats the heart. - - - Handles any received messages and invokes any delayed events which need to be invoked. - - - Sets up a delayed event to be executed after the given time has passed. - How long from now to execute the delayed event, in milliseconds. - The delayed event to execute later. - - - Handles all queued messages. - - - Handles data received by the transport. - - - Handles a message. - The message to handle. - The message's header type. - The connection which the message was received on. - - - Increases . For use when a new or is started. - - - Decreases . For use when a or is stopped. - - - Stores information about a message that needs to be handled. - - - The message that needs to be handled. - - - The message's header type. - - - The connection on which the message was received. - - - Handles initialization. - The message that needs to be handled. - The message's header type. - The connection on which the message was received. - - - Represents a currently pending reliably sent message whose delivery has not been acknowledged yet. - - - The time of the latest send attempt. - - - The multiplier used to determine how long to wait before resending a pending message. - - - How often to try sending the message before giving up. - - - A pool of reusable instances. - - - The to use to send (and resend) the pending message. - - - The sequence ID of the message. - - - The contents of the message. - - - The length in bytes of the data that has been written to the message. - - - How many send attempts have been made so far. - - - Whether the pending message has been cleared or not. - - - Handles initial setup. - - - Retrieves a instance, initializes it and then sends it. - The sequence ID of the message. - The message that is being sent reliably. - The to use to send (and resend) the pending message. - - - Retrieves a instance from the pool. If none is available, a new instance is created. - A instance. - - - Returns the instance to the pool so it can be reused. - - - Resends the message. - - - Attempts to send the message. - - - Clears the message. - Whether or not to remove the message from . - - - A server that can accept connections from s. - - - Invoked when a client connects. - - - Invoked when a message is received. - - - Invoked when a client disconnects. - - - Whether or not the server is currently running. - - - The local port that the server is running on. - - - The maximum number of concurrent connections. - - - The number of currently connected clients. - - - An array of all the currently connected clients. - The position of each instance in the array does not correspond to that client's numeric ID (except by coincidence). - - - Encapsulates a method that handles a message from a client. - The numeric ID of the client from whom the message was received. - The message that was received. - - - Encapsulates a method that determines whether or not to accept a client's connection attempt. - - - An optional method which determines whether or not to accept a client's connection attempt. - The parameter is the pending connection and the parameter is a message containing any additional data the client included with the connection attempt. - - - Stores which message IDs have auto relaying enabled. Relaying is disabled entirely when this is . - - - Currently pending connections which are waiting to be accepted or rejected. - - - Currently connected clients. - - - Clients that have timed out and need to be removed from . - - - Methods used to handle messages, accessible by their corresponding message IDs. - - - The underlying transport's server that is used for sending and receiving data. - - - All currently unused client IDs. - - - Handles initial setup. - The transport to use for sending and receiving data. - The name to use when logging messages via . - - - Handles initial setup using the built-in UDP transport. - The name to use when logging messages via . - - - Stops the server if it's running and swaps out the transport it's using. - The new underlying transport server to use for sending and receiving data. - This method does not automatically restart the server. To continue accepting connections, must be called again. - - - Starts the server. - The local port on which to start the server. - The maximum number of concurrent connections to allow. - The ID of the group of message handler methods to use when building . - - - Subscribes appropriate methods to the transport's events. - - - Unsubscribes methods from all of the transport's events. - - - - - - Handles an incoming connection attempt. - - - Handles a connect message. - The client that sent the connect message. - The connect message. - - - Accepts the given pending connection. - The connection to accept. - - - Rejects the given pending connection. - The connection to reject. - Data that should be sent to the client being rejected. Use to get an empty message instance. - - - Accepts the given pending connection. - The connection to accept. - - - Rejects the given pending connection. - The connection to reject. - The reason why the connection is being rejected. - Data that should be sent to the client being rejected - - - Checks if clients have timed out. - - - - - - - - - Sends a message to a given client. - The message to send. - The numeric ID of the client to send the message to. - Whether or not to return the message to the pool after it is sent. - - - - Sends a message to a given client. - The message to send. - The client to send the message to. - Whether or not to return the message to the pool after it is sent. - - - - Sends a message to all connected clients. - The message to send. - Whether or not to return the message to the pool after it is sent. - - - - Sends a message to all connected clients except the given one. - The message to send. - The numeric ID of the client to not send the message to. - Whether or not to return the message to the pool after it is sent. - - - - Retrieves the client with the given ID, if a client with that ID is currently connected. - The ID of the client to retrieve. - The retrieved client. - if a client with the given ID was connected; otherwise . - - - Disconnects a specific client. - The numeric ID of the client to disconnect. - Data that should be sent to the client being disconnected. Use to get an empty message instance. - - - Disconnects the given client. - The client to disconnect. - Data that should be sent to the client being disconnected. Use to get an empty message instance. - - - Cleans up the local side of the given connection. - The client to disconnect. - The reason why the client is being disconnected. - - - What to do when the transport disconnects a client. - - - Stops the server. - - - Initializes available client IDs. - - - Retrieves an available client ID. - The client ID. 0 if none were available. - - - Sends a disconnect message. - The client to send the disconnect message to. - Why the client is being disconnected. - Optional custom data that should be sent to the client being disconnected. - - - Sends a client connected message. - The newly connected client. - - - Sends a client disconnected message. - The numeric ID of the client that disconnected. - - - Invokes the event. - The newly connected client. - - - Invokes the event and initiates handling of the received message. - The received message. - The client from which the message was received. - - - Invokes the event. - The client that disconnected. - The reason for the disconnection. - - - Contains event data for when a server's transport successfully establishes a connection to a client. - - - The newly established connection. - - - Initializes event data. - The newly established connection. - - - Contains event data for when a server's or client's transport receives data. - - - An array containing the received data. - - - The number of bytes that were received. - - - The connection which the data was received from. - - - Initializes event data. - An array containing the received data. - The number of bytes that were received. - The connection which the data was received from. - - - Contains event data for when a server's or client's transport initiates or detects a disconnection. - - - The closed connection. - - - The reason for the disconnection. - - - Initializes event data. - The closed connection. - The reason for the disconnection. - - - Defines methods, properties, and events which every transport's client must implement. - - - Invoked when a connection is established at the transport level. - - - Invoked when a connection attempt fails at the transport level. - - - Starts the transport and attempts to connect to the given host address. - The host address to connect to. - The pending connection. if an issue occurred. - The error message associated with the issue that occurred, if any. - if a connection attempt will be made. if an issue occurred (such as being in an invalid format) and a connection attempt will not be made. - - - Closes the connection to the server. - - - The header type of a . - - - An unreliable user message. - - - An internal unreliable ack message. - - - An internal unreliable ack message, used when acknowledging a sequence ID other than the last received one. - - - An internal unreliable connect message. - - - An internal unreliable connection rejection message. - - - An internal unreliable heartbeat message. - - - An internal unreliable disconnect message. - - - A reliable user message. - - - An internal reliable welcome message. - - - An internal reliable client connected message. - - - An internal reliable client disconnected message. - - - Defines methods, properties, and events which every transport's server and client must implement. - - - Invoked when data is received by the transport. - - - Invoked when a disconnection is initiated or detected by the transport. - - - Initiates handling of any received messages. - - - Defines methods, properties, and events which every transport's server must implement. - - - Invoked when a connection is established at the transport level. - - - - - - Starts the transport and begins listening for incoming connections. - The local port on which to listen for connections. - - - Closes an active connection. - The connection to close. - - - Closes all existing connections and stops listening for new connections. - - - A client which can connect to a . - - - - - - - - - - - - The connection to the server. - - - - Expects the host address to consist of an IP and port, separated by a colon. For example: 127.0.0.1:7777. - - - Parses into and , if possible. - The host address to parse. - The retrieved IP. - The retrieved port. - Whether or not was in a valid format. - - - - - - - - - Invokes the event. - - - Invokes the event. - - - - - - Represents a connection to a or . - - - The endpoint representing the other end of the connection. - - - The socket to use for sending and receiving. - - - The local peer this connection is associated with. - - - An array to receive message size values into. - - - The size of the next message to be received. - - - Initializes the connection. - The socket to use for sending and receiving. - The endpoint representing the other end of the connection. - The local peer this connection is associated with. - - - - - - Polls the socket and checks if any data was received. - - - Receives a message, if all of its data is ready to be received. - How many bytes were received. - Whether or not all of the message's data was ready to be received. - - - Closes the connection. - - - - - - - - - - - - - - - Provides base send & receive functionality for and . - - - - - - An array that incoming data is received into. - - - An array that outgoing data is sent out of. - - - The default size used for the socket's send and receive buffers. - - - The size to use for the socket's send and receive buffers. - - - The main socket, either used for listening for connections or for sending and receiving data. - - - The minimum size that may be used for the socket's send and receive buffers. - - - Initializes the transport. - How big the socket's send and receive buffers should be. - - - Handles received data. - The number of bytes that were received. - The connection from which the data was received. - - - Invokes the event. - The closed connection. - The reason for the disconnection. - - - A server which can accept connections from s. - - - - - - - - - - - - The maximum number of pending connections to allow at any given time. - - - Whether or not the server is running. - - - The currently open connections, accessible by their endpoints. - - - Connections that need to be closed. - - - - - - - - - Starts listening for connections on the given port. - The port to listen on. - - - - - - Accepts any pending connections. - - - Stops listening for connections. - - - - - - - - - Invokes the event. - The successfully established connection. - - - - - - A client which can connect to a . - - - - - - - - - - - - The connection to the server. - - - - - - - Expects the host address to consist of an IP and port, separated by a colon. For example: 127.0.0.1:7777. - - - Parses into and , if possible. - The host address to parse. - The retrieved IP. - The retrieved port. - Whether or not was in a valid format. - - - - - - Invokes the event. - - - Invokes the event. - - - - - - Represents a connection to a or . - - - The endpoint representing the other end of the connection. - - - The local peer this connection is associated with. - - - Initializes the connection. - The endpoint representing the other end of the connection. - The local peer this connection is associated with. - - - - - - - - - - - - - - - - - - The kind of socket to create. - - - Dual-mode. Works with both IPv4 and IPv6. - - - IPv4 only mode. - - - IPv6 only mode. - - - Provides base send & receive functionality for and . - - - - - - The default size used for the socket's send and receive buffers. - - - The minimum size that may be used for the socket's send and receive buffers. - - - How long to wait for a packet, in microseconds. - - - Whether to create an IPv4 only, IPv6 only, or dual-mode socket. - - - The size to use for the socket's send and receive buffers. - - - The array that incoming data is received into. - - - The socket to use for sending and receiving. - - - Whether or not the transport is running. - - - A reusable endpoint. - - - Initializes the transport. - Whether to create an IPv4 only, IPv6 only, or dual-mode socket. - How big the socket's send and receive buffers should be. - - - - - - Opens the socket and starts the transport. - The port to bind the socket to. - - - Closes the socket and stops the transport. - - - Polls the socket and checks if any data was received. - - - Sends data to a given endpoint. - The array containing the data. - The number of bytes in the array which should be sent. - The endpoint to send the data to. - - - Handles received data. - A byte array containing the received data. - The number of bytes in used by the received data. - The endpoint from which the data was received. - - - Invokes the event. - The closed connection. - The reason for the disconnection. - - - A server which can accept connections from s. - - - - - - - - - - - - The currently open connections, accessible by their endpoints. - - - - - - - - - Decides what to do with a connection attempt. - The connection to accept or reject. - Whether or not the connection attempt was a new connection. - - - - - - - - - Invokes the event. - The successfully established connection. - - - - - - Provides functionality for queueing methods for later execution from a chosen thread. - - - The name to use when logging messages via . - - - Handles initial setup. - The name to use when logging messages via . - - - Adds an action to the queue. - The action to be added to the queue. - - - Executes all actions in the queue on the calling thread. - This method should only be called from a single thread in the application. - - - Clears all actions in the queue without executing them. - - - Provides functionality for converting bytes to various value types and vice versa. - - - Converts a given to bytes and writes them into the given array. - The to convert. - The array to write the bytes into. - The position in the array at which to write the bytes. - - - Converts a given to bytes and writes them into the given array. - The to convert. - The array to write the bytes into. - The position in the array at which to write the bytes. - - - Converts the 2 bytes in the array at to a . - The array to read the bytes from. - The position in the array at which to read the bytes. - The converted . - - - Converts the 2 bytes in the array at to a . - The array to read the bytes from. - The position in the array at which to read the bytes. - The converted . - - - Converts a given to bytes and writes them into the given array. - The to convert. - The array to write the bytes into. - The position in the array at which to write the bytes. - - - Converts a given to bytes and writes them into the given array. - The to convert. - The array to write the bytes into. - The position in the array at which to write the bytes. - - - Converts the 4 bytes in the array at to a . - The array to read the bytes from. - The position in the array at which to read the bytes. - The converted . - - - Converts the 4 bytes in the array at to a . - The array to read the bytes from. - The position in the array at which to read the bytes. - The converted . - - - Converts a given to bytes and writes them into the given array. - The to convert. - The array to write the bytes into. - The position in the array at which to write the bytes. - - - Converts a given to bytes and writes them into the given array. - The to convert. - The array to write the bytes into. - The position in the array at which to write the bytes. - - - Converts the 8 bytes in the array at to a . - The array to read the bytes from. - The position in the array at which to read the bytes. - The converted . - - - Converts the 8 bytes in the array at to a . - The array to read the bytes from. - The position in the array at which to read the bytes. - The converted . - - - Converts a given to bytes and writes them into the given array. - The to convert. - The array to write the bytes into. - The position in the array at which to write the bytes. - - - Converts the 4 bytes in the array at to a . - The array to read the bytes from. - The position in the array at which to read the bytes. - The converted . - - - Converts a given to bytes and writes them into the given array. - The to convert. - The array to write the bytes into. - The position in the array at which to write the bytes. - - - Converts the 8 bytes in the array at to a . - The array to read the bytes from. - The position in the array at which to read the bytes. - The converted . - - - Executes an action when invoked. - - - Executes the action. - - - Resends a when invoked. - - - The message to resend. - - - The time at which the resend event was queued. - - - Initializes the event. - The message to resend. - The time at which the resend event was queued. - - - - - - Executes a heartbeat when invoked. - - - The peer whose heart to beat. - - - Initializes the event. - The peer whose heart to beat. - - - - - - Contains extension methods for various classes. - - - Takes the 's IP address and port number and converts it to a string, accounting for whether the address is an IPv4 or IPv6 address. - A string containing the IP address and port number of the endpoint. - - - Contains miscellaneous helper methods. - - - Determines whether or form should be used based on the . - The amount that and refer to. - The singular form. - The plural form. - if is 1; otherwise . - - - Calculates the signed gap between sequence IDs, accounting for wrapping. - The new sequence ID. - The previous sequence ID. - The signed gap between the two given sequence IDs. A positive gap means is newer than . A negative gap means is older than . - - - Represents a collection of items that have a value and a priority. On dequeue, the item with the lowest priority value is removed. - Specifies the type of elements in the queue. - Specifies the type of priority associated with enqueued elements. - - - Gets the number of elements contained in the . - - - Adds the specified element and associated priority to the . - The element to add. - The priority with which to associate the new element. - - - Removes and returns the lowest priority element. - - - Returns the priority of the lowest priority element. - - - Removes all elements from the . - - - Defines log message types. - - - Logs that are used for investigation during development. - - - Logs that provide general information about application flow. - - - Logs that highlight abnormal or unexpected events in the application flow. - - - Logs that highlight problematic events in the application flow which will cause unexpected behavior if not planned for. - - - Provides functionality for logging messages. - - - Whether or not messages will be logged. - - - Whether or not messages will be logged. - - - Whether or not messages will be logged. - - - Whether or not messages will be logged. - - - Encapsulates a method used to log messages. - The message to log. - - - Log methods, accessible by their - - - Whether or not to include timestamps when logging messages. - - - The format to use for timestamps. - - - Initializes with all log types enabled. - The method to use when logging all types of messages. - Whether or not to include timestamps when logging messages. - The format to use for timestamps. - - - Initializes with the supplied log methods. - The method to use when logging debug messages. Set to to disable debug logs. - The method to use when logging info messages. Set to to disable info logs. - The method to use when logging warning messages. Set to to disable warning logs. - The method to use when logging error messages. Set to to disable error logs. - Whether or not to include timestamps when logging messages. - The format to use for timestamps. - - - Enables logging for messages of the given . - The type of message to enable logging for. - The method to use when logging this type of message. - - - Disables logging for messages of the given . - The type of message to enable logging for. - - - Logs a message. - The type of log message that is being logged. - The message to log. - - - Logs a message. - The type of log message that is being logged. - Who is logging this message. - The message to log. - - - Converts a object to a formatted timestamp string. - The time to format. - The formatted timestamp. - - - diff --git a/Demos/Unity/PlayerHostedDemo/Assets/Scripts/Multiplayer/RiptideNetworking.xml.meta b/Demos/Unity/PlayerHostedDemo/Assets/Scripts/Multiplayer/RiptideNetworking.xml.meta deleted file mode 100644 index bdf63c99..00000000 --- a/Demos/Unity/PlayerHostedDemo/Assets/Scripts/Multiplayer/RiptideNetworking.xml.meta +++ /dev/null @@ -1,7 +0,0 @@ -fileFormatVersion: 2 -guid: e19a3f2faa2051941881847be1d0a3e7 -TextScriptImporter: - externalObjects: {} - userData: - assetBundleName: - assetBundleVariant: diff --git a/Demos/Unity/PlayerHostedDemo/Assets/Scripts/Multiplayer/NetworkManager.cs b/Demos/Unity/PlayerHostedDemo/Assets/Scripts/NetworkManager.cs similarity index 100% rename from Demos/Unity/PlayerHostedDemo/Assets/Scripts/Multiplayer/NetworkManager.cs rename to Demos/Unity/PlayerHostedDemo/Assets/Scripts/NetworkManager.cs diff --git a/Demos/Unity/PlayerHostedDemo/Assets/Scripts/Multiplayer/NetworkManager.cs.meta b/Demos/Unity/PlayerHostedDemo/Assets/Scripts/NetworkManager.cs.meta similarity index 100% rename from Demos/Unity/PlayerHostedDemo/Assets/Scripts/Multiplayer/NetworkManager.cs.meta rename to Demos/Unity/PlayerHostedDemo/Assets/Scripts/NetworkManager.cs.meta diff --git a/Demos/Unity/PlayerHostedDemo/Packages/manifest.json b/Demos/Unity/PlayerHostedDemo/Packages/manifest.json index 137e47ea..17afdd7e 100644 --- a/Demos/Unity/PlayerHostedDemo/Packages/manifest.json +++ b/Demos/Unity/PlayerHostedDemo/Packages/manifest.json @@ -9,6 +9,7 @@ "com.unity.textmeshpro": "3.0.6", "com.unity.timeline": "1.4.8", "com.unity.ugui": "1.0.0", + "net.tomweiland.riptide": "https://github.com/RiptideNetworking/Riptide.git?path=/Packages/Core#unity-package", "com.unity.modules.ai": "1.0.0", "com.unity.modules.androidjni": "1.0.0", "com.unity.modules.animation": "1.0.0", diff --git a/Demos/Unity/PlayerHostedDemo/Packages/packages-lock.json b/Demos/Unity/PlayerHostedDemo/Packages/packages-lock.json index 984ab05e..3fc84e4a 100644 --- a/Demos/Unity/PlayerHostedDemo/Packages/packages-lock.json +++ b/Demos/Unity/PlayerHostedDemo/Packages/packages-lock.json @@ -145,6 +145,13 @@ "com.unity.modules.imgui": "1.0.0" } }, + "net.tomweiland.riptide": { + "version": "https://github.com/RiptideNetworking/Riptide.git?path=/Packages/Core#unity-package", + "depth": 0, + "source": "git", + "dependencies": {}, + "hash": "bb252ba2ea4bd1314d3f8f60bea490418635d06e" + }, "com.unity.modules.ai": { "version": "1.0.0", "depth": 0, diff --git a/Docs/manual/overview/getting-started.md b/Docs/manual/overview/getting-started.md index c9f2871c..b56d86e3 100644 --- a/Docs/manual/overview/getting-started.md +++ b/Docs/manual/overview/getting-started.md @@ -16,7 +16,7 @@ RiptideLogger.Initialize(Debug.Log, Debug.Log, Debug.LogWarning, Debug.LogError, Obviously this is using Unity's logging methods, so if you're not using Unity for your project you'll need to replace the four log methods with `Console.WriteLine` or your engine's equivalent. > [!IMPORTANT] -> This article explains the basics and includes various code snippets, but if you'd like to see these snippets in the context of a working demo, take a look at the `NetworkManager` classes in the [dedicated server demo](https://github.com/RiptideNetworking/Riptide/tree/main/Demos/Unity/DedicatedServerDemo)'s [server](https://github.com/RiptideNetworking/Riptide/blob/main/Demos/Unity/DedicatedServerDemo/Server/Assets/Scripts/Multiplayer/NetworkManager.cs) and [client](https://github.com/RiptideNetworking/Riptide/blob/main/Demos/Unity/DedicatedServerDemo/Client/Assets/Scripts/Multiplayer/NetworkManager.cs) projects. +> This article explains the basics and includes various code snippets, but if you'd like to see these snippets in the context of a working demo, take a look at the `NetworkManager` classes in the [dedicated server demo](https://github.com/RiptideNetworking/Riptide/tree/main/Demos/Unity/DedicatedServerDemo)'s [server](https://github.com/RiptideNetworking/Riptide/blob/main/Demos/Unity/DedicatedServerDemo/Server/Assets/Scripts/NetworkManager.cs) and [client](https://github.com/RiptideNetworking/Riptide/blob/main/Demos/Unity/DedicatedServerDemo/Client/Assets/Scripts/NetworkManager.cs) projects. ### Starting a Server