Beginnings of the netcode

This commit is contained in:
Layla 2020-10-28 10:25:11 -04:00
parent 7e361f6758
commit 5559c3b31e
No known key found for this signature in database
GPG Key ID: A494D9357BA1BE31
10 changed files with 249 additions and 2 deletions

1
.gitignore vendored
View File

@ -351,3 +351,4 @@ MigrationBackup/
.mono
.import
builds

48
export_presets.cfg Normal file
View File

@ -0,0 +1,48 @@
[preset.0]
name="HTML5"
platform="HTML5"
runnable=true
custom_features=""
export_filter="all_resources"
include_filter=""
exclude_filter=""
export_path=""
patch_list=PoolStringArray( )
script_export_mode=1
script_encryption_key=""
[preset.0.options]
vram_texture_compression/for_desktop=true
vram_texture_compression/for_mobile=false
html/custom_html_shell=""
html/head_include=""
custom_template/release=""
custom_template/debug=""
[preset.1]
name="Server"
platform="Linux/X11"
runnable=true
custom_features=""
export_filter="all_resources"
include_filter=""
exclude_filter=""
export_path="builds/client/godot-csharp-example.x86_64"
patch_list=PoolStringArray( )
script_export_mode=1
script_encryption_key=""
[preset.1.options]
texture_format/bptc=false
texture_format/s3tc=true
texture_format/etc=false
texture_format/etc2=false
texture_format/no_bptc_fallbacks=true
binary_format/64_bits=true
binary_format/embed_pck=true
custom_template/release=""
custom_template/debug=""

6
nodes/Game.tscn Normal file
View File

@ -0,0 +1,6 @@
[gd_scene load_steps=2 format=2]
[ext_resource path="res://scripts/Game.cs" type="Script" id=1]
[node name="Game" type="Node"]
script = ExtResource( 1 )

View File

@ -19,6 +19,10 @@ config/name="godot-csharp-example"
run/main_scene="res://scenes/GameWorld.tscn"
config/icon="res://icon.png"
[autoload]
Game="*res://nodes/Game.tscn"
[input]
move_up={

View File

@ -47,4 +47,3 @@ tile_data = PoolIntArray( -131077, 0, 0, -196605, 0, 0, 131067, 0, 0, 65539, 0,
[node name="Orc" parent="." instance=ExtResource( 5 )]
position = Vector2( 40, 0 )
[connection signal="UpdatePlayerGuiHandler" from="Player" to="PlayerGui" method="OnUpdatePlayerGui"]

23
scripts/Game.cs Normal file
View File

@ -0,0 +1,23 @@
using Godot;
using Network;
public class Game : Node
{
public static Network.Network network;
public override void _Ready()
{
network = new Network.Network(GetTree());
AddChild(network);
if(OS.GetEnvironment("DEDICATED_SERVER") == "true" || OS.GetName() == "Server")
{
GD.Print("Attempting to start server...");
network.StartServer();
}
else
{
GD.Print("Attempting to start client...");
network.StartClient();
}
}
}

56
scripts/Network/Client.cs Normal file
View File

@ -0,0 +1,56 @@
using Godot;
namespace Network
{
public class Client : Node, INetworkObject
{
public static Client main;
public static SceneTree tree;
public int port { get; }
public NetworkedMultiplayerENet peer { get; set; }
public Client(SceneTree _tree, string host, int _port = 7777)
{
Name = "Network";
if (tree == null)
tree = _tree;
port = _port;
peer = new NetworkedMultiplayerENet();
peer.CreateClient(host, port);
tree.NetworkPeer = peer;
main = this;
//Intialize signal connects
tree.Connect("connected_to_server", this, "ConnectedToServer");
tree.Connect("connection_failed", this, "ConnectionFailed");
tree.Connect("server_disconnected", this, "ServerDisconnected");
}
public void RegisterPlayer(string name)
{
Rpc("RegisterPlayer", "Fred");
}
public void ConnectedToServer()
{
GD.Print("Connected to server!");
RegisterPlayer("Bro");
}
public void ConnectionFailed()
{
GD.Print("Failed to connect to server!");
}
public void ServerDisconnected()
{
GD.Print("Server disconnected!");
}
public void Close()
{
tree.NetworkPeer = null;
}
}
}

View File

@ -0,0 +1,8 @@
namespace Network.Data
{
public struct PlayerData
{
public int peer_id;
public string name;
}
}

View File

@ -0,0 +1,11 @@
using Godot;
namespace Network
{
public interface INetworkObject
{
int port { get; }
NetworkedMultiplayerENet peer { get; set; }
void Close();
}
}

91
scripts/Network/Server.cs Normal file
View File

@ -0,0 +1,91 @@
using Godot;
using Network.Data;
using System;
namespace Network
{
public class Network : Node, INetworkObject
{
public static Network main;
public static SceneTree tree;
public int port { get; }
public int max_players { get; set; }
public NetworkedMultiplayerENet peer { get; set; }
//public PlayerData[] playerData;
public Network(SceneTree _tree, int _port = 7777)
{
port = _port;
tree = _tree;
}
public void StartServer(int _max_players = 32)
{
max_players = _max_players;
peer = new NetworkedMultiplayerENet();
peer.CreateServer(port, max_players);
tree.NetworkPeer = peer;
if(tree.NetworkPeer != null)
{
GD.Print("Successfully started server!");
} else {
throw new Exception("Failed to start server!");
}
main = this;
//Intialize signal connects
tree.Connect("network_peer_connected", this, "NetworkPeerConnected");
tree.Connect("network_peer_disconnected", this, "NetworkPeerDisconnected");
}
public void StartClient(string host = "127.0.0.1")
{
peer = new NetworkedMultiplayerENet();
peer.CreateClient(host, port);
tree.NetworkPeer = peer;
main = this;
//Intialize signal connects
tree.Connect("connected_to_server", this, "ConnectedToServer");
tree.Connect("connection_failed", this, "ConnectionFailed");
tree.Connect("server_disconnected", this, "ServerDisconnected");
}
public void NetworkPeerConnected(int id)
{
GD.Print("Player connected to the server!");
}
public void NetworkPeerDisconnected(int id)
{
GD.Print("Player left the server!");
}
public void ConnectedToServer()
{
GD.Print("Connected to server!");
Rpc("RegisterPlayer", "Fred");
}
public void ConnectionFailed()
{
GD.Print("Failed to connect to server!");
}
public void ServerDisconnected()
{
GD.Print("Server disconnected!");
}
[Remote]
public void RegisterPlayer(string name)
{
GD.Print($"Loaded {name}");
}
public void Close()
{
tree.NetworkPeer = null;
}
}
}