54 | {{>partials/scripts}}
55 |
56 | {{/redirect_url}}
57 |
58 |
--------------------------------------------------------------------------------
/Docs/templates/riptide/partials/affix.tmpl.partial:
--------------------------------------------------------------------------------
1 | {{!Licensed to the .NET Foundation under one or more agreements. The .NET Foundation licenses this file to you under the MIT license.}}
2 |
3 |
32 |
--------------------------------------------------------------------------------
/Docs/templates/riptide/partials/class.memberpage.tmpl.partial:
--------------------------------------------------------------------------------
1 | {{!Licensed to the .NET Foundation under one or more agreements. The .NET Foundation licenses this file to you under the MIT license.}}
2 |
3 | {{>partials/class.header}}
4 | {{#children}}
5 |
46 | {{/extensionMethods}}
47 |
--------------------------------------------------------------------------------
/Docs/templates/riptide/partials/footer.tmpl.partial:
--------------------------------------------------------------------------------
1 | {{!Licensed to the .NET Foundation under one or more agreements. The .NET Foundation licenses this file to you under the MIT license.}}
2 |
3 |
18 |
--------------------------------------------------------------------------------
/Docs/templates/riptide/partials/head.tmpl.partial:
--------------------------------------------------------------------------------
1 | {{!Licensed to the .NET Foundation under one or more agreements. The .NET Foundation licenses this file to you under the MIT license.}}
2 |
3 |
4 |
5 | {{#_googleAnalyticsTagId}}
6 |
7 |
13 | {{/_googleAnalyticsTagId}}
14 | {{#redirect_url}}
15 |
16 | {{/redirect_url}}
17 | {{^redirect_url}}
18 |
19 | {{#title}}{{title}}{{/title}}{{^title}}{{>partials/title}}{{/title}}{{#_appTitle}} | {{_appTitle}}{{/_appTitle}}
20 |
21 |
22 |
23 |
24 |
25 | {{>partials/description.head}}
26 | {{#_appLogoPath}}
27 |
28 |
29 |
30 |
31 | {{/_appLogoPath}}
32 |
33 |
34 |
35 |
36 |
37 |
38 |
39 |
40 |
41 |
42 |
43 | {{#_noindex}}{{/_noindex}}
44 | {{#_enableSearch}}{{/_enableSearch}}
45 | {{#_enableNewTab}}{{/_enableNewTab}}
46 | {{/redirect_url}}
47 |
48 |
--------------------------------------------------------------------------------
/Docs/templates/riptide/partials/li.tmpl.partial:
--------------------------------------------------------------------------------
1 | {{!Licensed to the .NET Foundation under one or more agreements. The .NET Foundation licenses this file to you under the MIT license.}}
2 |
3 |
31 |
--------------------------------------------------------------------------------
/Docs/templates/riptide/partials/namespace.tmpl.partial:
--------------------------------------------------------------------------------
1 | {{!Licensed to the .NET Foundation under one or more agreements. The .NET Foundation licenses this file to you under the MIT license.}}
2 |
3 |
{{>partials/title}}
4 |
{{{summary}}}
5 |
{{{conceptual}}}
6 |
{{{remarks}}}
7 | {{#children}}
8 |
{{>partials/namespaceSubtitle}}
9 | {{#children.0}}
10 |
11 |
12 | {{/children.0}}
13 | {{#children}}
14 |
15 |
16 |
17 |
18 |
{{{summary}}}
19 |
20 | {{/children}}
21 | {{#children.0}}
22 |
23 |
24 | {{/children.0}}
25 | {{/children}}
--------------------------------------------------------------------------------
/Docs/templates/riptide/partials/title.tmpl.partial:
--------------------------------------------------------------------------------
1 | {{!Licensed to the .NET Foundation under one or more agreements. The .NET Foundation licenses this file to you under the MIT license.}}{{!Everything on one line, otherwise newlines are insterted into the title...}}{{#inPackage}}{{name.0.value}} Package{{/inPackage}}{{#isNamespace}}{{name.0.value}} Namespace{{/isNamespace}}{{#inClass}}{{name.0.value}} Class{{/inClass}}{{#inStruct}}{{name.0.value}} Struct{{/inStruct}}{{#inInterface}}{{name.0.value}} Interface{{/inInterface}}{{#inEnum}}{{name.0.value}} Enum{{/inEnum}}{{#inDelegate}}{{nameWithType.0.value}} Delegate{{/inDelegate}}{{#inConstructor}}{{name.0.value}} Constructor{{/inConstructor}}{{#inField}}{{nameWithType.0.value}} Field{{/inField}}{{#inProperty}}{{nameWithType.0.value}} Property{{/inProperty}}{{#inMethod}}{{nameWithType.0.value}} Method{{/inMethod}}{{#inEvent}}{{nameWithType.0.value}} Event{{/inEvent}}{{#inOperator}}{{nameWithType.0.value}} Operator{{/inOperator}}{{#inEii}}{{nameWithType.0.value}} Explict Interface Implementation{{/inEii}}{{#inVariable}}{{name.0.value}} Variable{{/inVariable}}{{#inTypeAlias}}{{name.0.value}} Type Alias{{/inTypeAlias}}
--------------------------------------------------------------------------------
/Docs/templates/riptide/styles/codehighlighting.css:
--------------------------------------------------------------------------------
1 | .line-highlight {
2 | background-color: #344d5b;
3 | }
4 |
5 | .hljs {
6 | color: #e4e4f1;
7 | }
8 |
9 | .hljs-comment {
10 | color: #4e6d6d;
11 | }
12 |
13 | .hljs-number {
14 | color: #b5cea8;
15 | }
16 |
17 | .hljs-pscommand,
18 | .hljs-keyword,
19 | .hljs-selector-tag,
20 | .hljs-built_in,
21 | .hljs-name,
22 | .hljs-tag {
23 | color: #569cd6;
24 | }
25 |
26 | .hljs-literal {
27 | color: #569cd6;
28 | }
29 |
30 | .hljs-string .hljs-subst,
31 | .hljs-attr {
32 | color: #9cdcfe;
33 | }
34 |
35 | .hljs-string,
36 | .hljs-string .hljs-subst .hljs-string,
37 | .hljs-section,
38 | .hljs-attribute,
39 | .hljs-template-tag,
40 | .hljs-template-variable,
41 | .hljs-deletion,
42 | .hljs-type,
43 | .hljs-code {
44 | color: #ce9178;
45 | }
46 |
47 | .hljs-addition,
48 | .hljs-selector-attr,
49 | .hljs-selector-pseudo,
50 | .hljs-meta {
51 | color: #2b91af;
52 | }
53 |
54 | .hljs-parameter,
55 | .hljs-type,
56 | .hljs-attribute,
57 | .hljs-title,
58 | .hljs-addition,
59 | .hljs-selector-attr,
60 | .hljs-selector-pseudo,
61 | .hljs-meta {
62 | color: #4ec9b0;
63 | }
64 |
65 | .hljs-control {
66 | color: #c586c0;
67 | }
68 |
69 | .hljs-helper {
70 | color: #dcdcaa;
71 | }
72 |
73 | .hljs-doctag,
74 | .hljs-symbol,
75 | .hljs-bullet,
76 | .hljs-link {
77 | color: #368585;
78 | }
79 |
80 | .hljs-reserved,
81 | .hljs-constant {
82 | color: #f44747;
83 | }
--------------------------------------------------------------------------------
/Docs/templates/riptide/styles/config.css:
--------------------------------------------------------------------------------
1 | :root {
2 | --text: #e4e4f1;
3 | --text-subtle: #bcbcdc;
4 | --main-background: #1d2c34;
5 | --main-background-active: #344d5b;
6 | --secondary-background: #162127;
7 | --border: #344d5b;
8 | --nth-table-row: #253741;
9 | --table-border: #344d5b;
10 | --link: #2bbade;
11 | --link-hover: #1c93b0;
12 |
13 | --search-mark: #acf39d;
14 | --search-href: #bcbcdc;
15 |
16 | --pagination-background: var(--main-background);
17 | --pagination-background-active: var(--main-background-active);
18 | --pagination-border: var(--border);
19 |
20 | --alert-note-background: #9368b7;
21 | --alert-note-text: var(--text);
22 | --alert-note-code-background: #744997;
23 | --alert-note-link: #ff99a0;
24 | --alert-note-link-hover: #ff707a;
25 |
26 | --alert-tip-background: #5635e9;
27 | --alert-tip-text: var(--text);
28 | --alert-tip-code-background: #3716ca;
29 | --alert-tip-link: #0dd2e7;
30 | --alert-tip-link-hover: #0bafc1;
31 |
32 | --alert-important-background: #8fbe23;
33 | --alert-important-text: #283409;
34 | --alert-important-code-background: #aedc41;
35 | --alert-important-link: #0049a3;
36 | --alert-important-link-hover: #0065e0;
37 |
38 | --alert-caution-background: #921111;
39 | --alert-caution-text: var(--text);
40 | --alert-caution-code-background: #6e0d0d;
41 | --alert-caution-link: #de85ff;
42 | --alert-caution-link-hover: #ce47ff;
43 |
44 | --alert-warning-background: #ffad0a;
45 | --alert-warning-text: #523600;
46 | --alert-warning-code-background: #ffc95c;
47 | --alert-warning-link: #b80006;
48 | --alert-warning-link-hover: #f50008;
49 |
50 | --scrollbar-background: transparent;
51 | --scrollbar-thumb-background: #0b1216;
52 | }
--------------------------------------------------------------------------------
/Docs/toc.yml:
--------------------------------------------------------------------------------
1 | - name: Manual
2 | href: manual/
3 | homepage: manual/overview/about-riptide.md
4 | - name: GitHub
5 | href: https://github.com/RiptideNetworking/Riptide
6 | - name: Discord
7 | href: https://discord.gg/tomweiland
8 | - name: API
9 | href: api/
10 | homepage: api/Riptide.yml
11 | - name: Support Riptide
12 | href: https://github.com/sponsors/tom-weiland
13 |
--------------------------------------------------------------------------------
/LICENSE.md:
--------------------------------------------------------------------------------
1 | MIT License
2 |
3 | Copyright (c) 2021 Tom Weiland
4 |
5 | Permission is hereby granted, free of charge, to any person obtaining a copy
6 | of this software and associated documentation files (the "Software"), to deal
7 | in the Software without restriction, including without limitation the rights
8 | to use, copy, modify, merge, publish, distribute, sublicense, and/or sell
9 | copies of the Software, and to permit persons to whom the Software is
10 | furnished to do so, subject to the following conditions:
11 |
12 | The above copyright notice and this permission notice shall be included in all
13 | copies or substantial portions of the Software.
14 |
15 | THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
16 | IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
17 | FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
18 | AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
19 | LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
20 | OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE
21 | SOFTWARE.
--------------------------------------------------------------------------------
/RiptideNetworking/.editorconfig:
--------------------------------------------------------------------------------
1 | # You can learn more about editorconfig here: https://docs.microsoft.com/en-us/visualstudio/ide/editorconfig-code-style-settings-reference
2 |
3 | # Top-most EditorConfig file
4 | root = false
5 |
6 | [*.{cs,vb}]
7 |
8 | # Enforce file headers
9 | file_header_template = This file is provided under The MIT License as part of RiptideNetworking.\nCopyright (c) Tom Weiland\nFor additional information please see the included LICENSE.md file or view it on GitHub:\nhttps://github.com/RiptideNetworking/Riptide/blob/main/LICENSE.md
10 |
11 | # IDE0073: Incorrect/missing header
12 | dotnet_diagnostic.IDE0073.severity = warning
--------------------------------------------------------------------------------
/RiptideNetworking/RiptideNetworking.sln:
--------------------------------------------------------------------------------
1 |
2 | Microsoft Visual Studio Solution File, Format Version 12.00
3 | # Visual Studio Version 16
4 | VisualStudioVersion = 16.0.30503.244
5 | MinimumVisualStudioVersion = 10.0.40219.1
6 | Project("{9A19103F-16F7-4668-BE54-9A1E7A4F7556}") = "RiptideNetworking", "RiptideNetworking\RiptideNetworking.csproj", "{CA9D3FCF-094B-4814-AC33-160F26B76336}"
7 | EndProject
8 | Global
9 | GlobalSection(SolutionConfigurationPlatforms) = preSolution
10 | Debug|Any CPU = Debug|Any CPU
11 | Release|Any CPU = Release|Any CPU
12 | EndGlobalSection
13 | GlobalSection(ProjectConfigurationPlatforms) = postSolution
14 | {CA9D3FCF-094B-4814-AC33-160F26B76336}.Debug|Any CPU.ActiveCfg = Debug|Any CPU
15 | {CA9D3FCF-094B-4814-AC33-160F26B76336}.Debug|Any CPU.Build.0 = Debug|Any CPU
16 | {CA9D3FCF-094B-4814-AC33-160F26B76336}.Release|Any CPU.ActiveCfg = Release|Any CPU
17 | {CA9D3FCF-094B-4814-AC33-160F26B76336}.Release|Any CPU.Build.0 = Release|Any CPU
18 | EndGlobalSection
19 | GlobalSection(SolutionProperties) = preSolution
20 | HideSolutionNode = FALSE
21 | EndGlobalSection
22 | GlobalSection(ExtensibilityGlobals) = postSolution
23 | SolutionGuid = {A71126B0-515C-46E8-8E32-60BD504A81E7}
24 | EndGlobalSection
25 | EndGlobal
26 |
--------------------------------------------------------------------------------
/RiptideNetworking/RiptideNetworking/IMessageSerializable.cs:
--------------------------------------------------------------------------------
1 | // This file is provided under The MIT License as part of RiptideNetworking.
2 | // Copyright (c) Tom Weiland
3 | // For additional information please see the included LICENSE.md file or view it on GitHub:
4 | // https://github.com/RiptideNetworking/Riptide/blob/main/LICENSE.md
5 |
6 | namespace Riptide
7 | {
8 | /// Represents a type that can be added to and retrieved from messages using the and methods.
9 | public interface IMessageSerializable
10 | {
11 | /// Adds the type to the message.
12 | /// The message to add the type to.
13 | void Serialize(Message message);
14 | /// Retrieves the type from the message.
15 | /// The message to retrieve the type from.
16 | void Deserialize(Message message);
17 | }
18 | }
19 |
--------------------------------------------------------------------------------
/RiptideNetworking/RiptideNetworking/Transports/EventArgs.cs:
--------------------------------------------------------------------------------
1 | // This file is provided under The MIT License as part of RiptideNetworking.
2 | // Copyright (c) Tom Weiland
3 | // For additional information please see the included LICENSE.md file or view it on GitHub:
4 | // https://github.com/RiptideNetworking/Riptide/blob/main/LICENSE.md
5 |
6 | namespace Riptide.Transports
7 | {
8 | /// Contains event data for when a server's transport successfully establishes a connection to a client.
9 | public class ConnectedEventArgs
10 | {
11 | /// The newly established connection.
12 | public readonly Connection Connection;
13 |
14 | /// Initializes event data.
15 | /// The newly established connection.
16 | public ConnectedEventArgs(Connection connection)
17 | {
18 | Connection = connection;
19 | }
20 | }
21 |
22 | /// Contains event data for when a server's or client's transport receives data.
23 | public class DataReceivedEventArgs
24 | {
25 | /// An array containing the received data.
26 | public readonly byte[] DataBuffer;
27 | /// The number of bytes that were received.
28 | public readonly int Amount;
29 | /// The connection which the data was received from.
30 | public readonly Connection FromConnection;
31 |
32 | /// Initializes event data.
33 | /// An array containing the received data.
34 | /// The number of bytes that were received.
35 | /// The connection which the data was received from.
36 | public DataReceivedEventArgs(byte[] dataBuffer, int amount, Connection fromConnection)
37 | {
38 | DataBuffer = dataBuffer;
39 | Amount = amount;
40 | FromConnection = fromConnection;
41 | }
42 | }
43 |
44 | /// Contains event data for when a server's or client's transport initiates or detects a disconnection.
45 | public class DisconnectedEventArgs
46 | {
47 | /// The closed connection.
48 | public readonly Connection Connection;
49 | /// The reason for the disconnection.
50 | public readonly DisconnectReason Reason;
51 |
52 | /// Initializes event data.
53 | /// The closed connection.
54 | /// The reason for the disconnection.
55 | public DisconnectedEventArgs(Connection connection, DisconnectReason reason)
56 | {
57 | Connection = connection;
58 | Reason = reason;
59 | }
60 | }
61 | }
62 |
--------------------------------------------------------------------------------
/RiptideNetworking/RiptideNetworking/Transports/IClient.cs:
--------------------------------------------------------------------------------
1 | // This file is provided under The MIT License as part of RiptideNetworking.
2 | // Copyright (c) Tom Weiland
3 | // For additional information please see the included LICENSE.md file or view it on GitHub:
4 | // https://github.com/RiptideNetworking/Riptide/blob/main/LICENSE.md
5 |
6 | using System;
7 |
8 | namespace Riptide.Transports
9 | {
10 | /// Defines methods, properties, and events which every transport's client must implement.
11 | public interface IClient : IPeer
12 | {
13 | /// Invoked when a connection is established at the transport level.
14 | event EventHandler Connected;
15 | /// Invoked when a connection attempt fails at the transport level.
16 | event EventHandler ConnectionFailed;
17 |
18 | /// Starts the transport and attempts to connect to the given host address.
19 | /// The host address to connect to.
20 | /// The pending connection. if an issue occurred.
21 | /// The error message associated with the issue that occurred, if any.
22 | /// 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.
23 | bool Connect(string hostAddress, out Connection connection, out string connectError);
24 |
25 | /// Closes the connection to the server.
26 | void Disconnect();
27 | }
28 | }
29 |
--------------------------------------------------------------------------------
/RiptideNetworking/RiptideNetworking/Transports/IPeer.cs:
--------------------------------------------------------------------------------
1 | // This file is provided under The MIT License as part of RiptideNetworking.
2 | // Copyright (c) Tom Weiland
3 | // For additional information please see the included LICENSE.md file or view it on GitHub:
4 | // https://github.com/RiptideNetworking/Riptide/blob/main/LICENSE.md
5 |
6 | using System;
7 |
8 | namespace Riptide.Transports
9 | {
10 | /// The header type of a .
11 | public enum MessageHeader : byte
12 | {
13 | /// An unreliable user message.
14 | Unreliable,
15 | /// An internal unreliable ack message.
16 | Ack,
17 | /// An internal unreliable connect message.
18 | Connect,
19 | /// An internal unreliable connection rejection message.
20 | Reject,
21 | /// An internal unreliable heartbeat message.
22 | Heartbeat,
23 | /// An internal unreliable disconnect message.
24 | Disconnect,
25 |
26 | /// A notify message.
27 | Notify,
28 |
29 | /// A reliable user message.
30 | Reliable,
31 | /// An internal reliable welcome message.
32 | Welcome,
33 | /// An internal reliable client connected message.
34 | ClientConnected,
35 | /// An internal reliable client disconnected message.
36 | ClientDisconnected,
37 | }
38 |
39 | /// Defines methods, properties, and events which every transport's server and client must implement.
40 | public interface IPeer
41 | {
42 | /// Invoked when data is received by the transport.
43 | event EventHandler DataReceived;
44 | /// Invoked when a disconnection is initiated or detected by the transport.
45 | event EventHandler Disconnected;
46 |
47 | /// Initiates handling of any received messages.
48 | void Poll();
49 | }
50 | }
51 |
--------------------------------------------------------------------------------
/RiptideNetworking/RiptideNetworking/Transports/IServer.cs:
--------------------------------------------------------------------------------
1 | // This file is provided under The MIT License as part of RiptideNetworking.
2 | // Copyright (c) Tom Weiland
3 | // For additional information please see the included LICENSE.md file or view it on GitHub:
4 | // https://github.com/RiptideNetworking/Riptide/blob/main/LICENSE.md
5 |
6 | using System;
7 |
8 | namespace Riptide.Transports
9 | {
10 | /// Defines methods, properties, and events which every transport's server must implement.
11 | public interface IServer : IPeer
12 | {
13 | /// Invoked when a connection is established at the transport level.
14 | event EventHandler Connected;
15 |
16 | ///
17 | ushort Port { get; }
18 |
19 | /// Starts the transport and begins listening for incoming connections.
20 | /// The local port on which to listen for connections.
21 | void Start(ushort port);
22 |
23 | /// Closes an active connection.
24 | /// The connection to close.
25 | void Close(Connection connection);
26 |
27 | /// Closes all existing connections and stops listening for new connections.
28 | void Shutdown();
29 | }
30 | }
31 |
--------------------------------------------------------------------------------
/RiptideNetworking/RiptideNetworking/Utils/DelayedEvents.cs:
--------------------------------------------------------------------------------
1 | // This file is provided under The MIT License as part of RiptideNetworking.
2 | // Copyright (c) Tom Weiland
3 | // For additional information please see the included LICENSE.md file or view it on GitHub:
4 | // https://github.com/RiptideNetworking/Riptide/blob/main/LICENSE.md
5 |
6 | using Riptide.Transports;
7 |
8 | namespace Riptide.Utils
9 | {
10 | /// Executes an action when invoked.
11 | internal abstract class DelayedEvent
12 | {
13 | /// Executes the action.
14 | public abstract void Invoke();
15 | }
16 |
17 | /// Resends a when invoked.
18 | internal class ResendEvent : DelayedEvent
19 | {
20 | /// The message to resend.
21 | private readonly PendingMessage message;
22 | /// The time at which the resend event was queued.
23 | private readonly long initiatedAtTime;
24 |
25 | /// Initializes the event.
26 | /// The message to resend.
27 | /// The time at which the resend event was queued.
28 | public ResendEvent(PendingMessage message, long initiatedAtTime)
29 | {
30 | this.message = message;
31 | this.initiatedAtTime = initiatedAtTime;
32 | }
33 |
34 | ///
35 | public override void Invoke()
36 | {
37 | if (initiatedAtTime == message.LastSendTime) // If this isn't the case then the message has been resent already
38 | message.RetrySend();
39 | }
40 | }
41 |
42 | /// Executes a heartbeat when invoked.
43 | internal class HeartbeatEvent : DelayedEvent
44 | {
45 | /// The peer whose heart to beat.
46 | private readonly Peer peer;
47 |
48 | /// Initializes the event.
49 | /// The peer whose heart to beat.
50 | public HeartbeatEvent(Peer peer)
51 | {
52 | this.peer = peer;
53 | }
54 |
55 | ///
56 | public override void Invoke()
57 | {
58 | peer.Heartbeat();
59 | }
60 | }
61 | }
62 |
--------------------------------------------------------------------------------
/RiptideNetworking/RiptideNetworking/Utils/Extensions.cs:
--------------------------------------------------------------------------------
1 | // This file is provided under The MIT License as part of RiptideNetworking.
2 | // Copyright (c) Tom Weiland
3 | // For additional information please see the included LICENSE.md file or view it on GitHub:
4 | // https://github.com/RiptideNetworking/Riptide/blob/main/LICENSE.md
5 |
6 | using System.Net;
7 |
8 | namespace Riptide.Utils
9 | {
10 | /// Contains extension methods for various classes.
11 | public static class Extensions
12 | {
13 | /// 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.
14 | /// A string containing the IP address and port number of the endpoint.
15 | public static string ToStringBasedOnIPFormat(this IPEndPoint endPoint)
16 | {
17 | if (endPoint.Address.IsIPv4MappedToIPv6)
18 | return $"{endPoint.Address.MapToIPv4()}:{endPoint.Port}";
19 |
20 | return endPoint.ToString();
21 | }
22 | }
23 | }
24 |
--------------------------------------------------------------------------------
/RiptideNetworking/nuget-readme.md:
--------------------------------------------------------------------------------
1 | # Riptide Networking
2 |
3 | Riptide Networking is a lightweight C# networking library primarily designed for use in multiplayer games. It can be used in Unity as well as in other .NET environments such as console applications.
4 |
5 | It provides functionality for establishing connections and sending data back and forth, leaving it up to you to decide what data you want to send and when. This is ideal if you like to be in control of your code and know what's going on under the hood.
6 |
7 | Riptide is 100% free to use under the [MIT license](https://github.com/RiptideNetworking/Riptide/blob/main/LICENSE.md) and its development is only funded by [donations](https://github.com/sponsors/tom-weiland).
8 |
9 | ## Getting Started
10 |
11 | Check out the documentation for [installation instructions](https://riptide.tomweiland.net/manual/overview/installation.html) and a [guide on setting up the basics](https://riptide.tomweiland.net/manual/overview/get-started.html).
--------------------------------------------------------------------------------
/RiptideNetworking/package-icon.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/RiptideNetworking/Riptide/c85b3db157f8225169c0f58331f9c1bc4e218db7/RiptideNetworking/package-icon.png
--------------------------------------------------------------------------------