From fa5202ea8a3afc0ca70e6cbbeffb231e735821fc Mon Sep 17 00:00:00 2001
From: Canopteks <thomas.duhamel@protonmail.com>
Date: Tue, 4 Feb 2020 13:44:07 +0100
Subject: [PATCH] fully remote controled players test

---
 .gitignore                                    |  5 +-
 client/project.godot                          | 32 ++++++-
 client/scenes/autoloads/gamestate.gd          | 61 +++++++++++++
 client/scenes/autoloads/globals.gd            |  1 -
 .../entities/bloc/{Bloc.tscn => bloc.tscn}    |  0
 client/scenes/entities/player/player.gd       | 65 ++++++++++++++
 client/scenes/entities/player/player.tscn     | 37 ++++++++
 client/scenes/levels/Game.tscn                | 21 -----
 client/scenes/levels/game/game.gd             | 27 ++++++
 client/scenes/levels/game/game.tscn           | 30 +++++++
 client/scenes/levels/lobby/lobby.gd           | 40 ++-------
 client/scenes/levels/lobby/lobby.tscn         | 53 +++++++----
 server/project.godot                          |  6 +-
 server/scenes/Node.tscn                       |  6 --
 server/scenes/autoloads/gamestate.gd          | 87 +++++++++++++++++++
 server/scenes/entities/bloc/bloc.tscn         | 17 ++++
 .../scenes/entities/player/player.gd          | 60 ++++++-------
 .../scenes/entities/player/player.tscn        |  2 +-
 server/scenes/levels/game/game.gd             |  6 ++
 server/scenes/levels/game/game.tscn           | 30 +++++++
 server/scenes/levels/lobby/lobby.gd           | 68 +++++++++++++++
 server/scenes/levels/lobby/lobby.tscn         |  6 ++
 server/scripts/Node.gd                        | 65 --------------
 23 files changed, 544 insertions(+), 181 deletions(-)
 create mode 100644 client/scenes/autoloads/gamestate.gd
 delete mode 100644 client/scenes/autoloads/globals.gd
 rename client/scenes/entities/bloc/{Bloc.tscn => bloc.tscn} (100%)
 create mode 100644 client/scenes/entities/player/player.gd
 create mode 100644 client/scenes/entities/player/player.tscn
 delete mode 100644 client/scenes/levels/Game.tscn
 create mode 100644 client/scenes/levels/game/game.gd
 create mode 100644 client/scenes/levels/game/game.tscn
 delete mode 100644 server/scenes/Node.tscn
 create mode 100644 server/scenes/autoloads/gamestate.gd
 create mode 100644 server/scenes/entities/bloc/bloc.tscn
 rename client/scenes/entities/player/Player.gd => server/scenes/entities/player/player.gd (52%)
 rename client/scenes/entities/player/Player.tscn => server/scenes/entities/player/player.tscn (94%)
 create mode 100644 server/scenes/levels/game/game.gd
 create mode 100644 server/scenes/levels/game/game.tscn
 create mode 100644 server/scenes/levels/lobby/lobby.gd
 create mode 100644 server/scenes/levels/lobby/lobby.tscn
 delete mode 100644 server/scripts/Node.gd

diff --git a/.gitignore b/.gitignore
index a18dabf..f2b2400 100644
--- a/.gitignore
+++ b/.gitignore
@@ -8,4 +8,7 @@ export_presets.cfg
 
 # Mono-specific ignores
 .mono/
-data_*/
\ No newline at end of file
+data_*/
+
+*.pck
+*.x86_64
diff --git a/client/project.godot b/client/project.godot
index 8783985..3ba3c32 100644
--- a/client/project.godot
+++ b/client/project.godot
@@ -17,7 +17,37 @@ _global_script_class_icons={
 
 config/name="client"
 run/main_scene="res://scenes/levels/lobby/lobby.tscn"
-config/icon="res://icon.png"
+config/icon="res://assets/icon.png"
+
+[autoload]
+
+gamestate="*res://scenes/autoloads/gamestate.gd"
+
+[input]
+
+movementLeft={
+"deadzone": 0.5,
+"events": [ Object(InputEventKey,"resource_local_to_scene":false,"resource_name":"","device":0,"alt":false,"shift":false,"control":false,"meta":false,"command":false,"pressed":false,"scancode":16777231,"unicode":0,"echo":false,"script":null)
+, Object(InputEventKey,"resource_local_to_scene":false,"resource_name":"","device":0,"alt":false,"shift":false,"control":false,"meta":false,"command":false,"pressed":false,"scancode":81,"unicode":0,"echo":false,"script":null)
+ ]
+}
+movementJump={
+"deadzone": 0.5,
+"events": [ Object(InputEventKey,"resource_local_to_scene":false,"resource_name":"","device":0,"alt":false,"shift":false,"control":false,"meta":false,"command":false,"pressed":false,"scancode":32,"unicode":0,"echo":false,"script":null)
+, Object(InputEventKey,"resource_local_to_scene":false,"resource_name":"","device":0,"alt":false,"shift":false,"control":false,"meta":false,"command":false,"pressed":false,"scancode":16777232,"unicode":0,"echo":false,"script":null)
+ ]
+}
+movementRight={
+"deadzone": 0.5,
+"events": [ Object(InputEventKey,"resource_local_to_scene":false,"resource_name":"","device":0,"alt":false,"shift":false,"control":false,"meta":false,"command":false,"pressed":false,"scancode":16777233,"unicode":0,"echo":false,"script":null)
+, Object(InputEventKey,"resource_local_to_scene":false,"resource_name":"","device":0,"alt":false,"shift":false,"control":false,"meta":false,"command":false,"pressed":false,"scancode":68,"unicode":0,"echo":false,"script":null)
+ ]
+}
+movementSprint={
+"deadzone": 0.5,
+"events": [ Object(InputEventKey,"resource_local_to_scene":false,"resource_name":"","device":0,"alt":false,"shift":false,"control":false,"meta":false,"command":false,"pressed":false,"scancode":16777237,"unicode":0,"echo":false,"script":null)
+ ]
+}
 
 [rendering]
 
diff --git a/client/scenes/autoloads/gamestate.gd b/client/scenes/autoloads/gamestate.gd
new file mode 100644
index 0000000..71dfc47
--- /dev/null
+++ b/client/scenes/autoloads/gamestate.gd
@@ -0,0 +1,61 @@
+extends Node
+
+var players = {}
+
+signal connected_to_server
+signal connection_failed
+signal server_disconnected
+
+func join_server(ip, port):
+	var peer_join = NetworkedMultiplayerENet.new()
+	peer_join.create_client(ip, int(port))
+	get_tree().set_network_peer(peer_join)
+	set_network_master(1)
+	
+	#checks:
+	print("Trying to join the server ", ip, ":", port) 
+
+remote func start_game():
+	print("The server has started the game (you lost btw)")
+	print("players: ", players.values())
+
+	get_node("/root/lobby").hide()
+	
+	var game = load("res://scenes/levels/game/game.tscn").instance()
+	var player_scene = load("res://scenes/entities/player/player.tscn")
+	get_tree().get_root().add_child(game)
+
+	#Next evey player will spa every other player including the server's own client! Try to move this to server only 
+	var i = 1
+	for peer_id in players:
+		var player = player_scene.instance()
+		player.set_name(str(peer_id))
+		player.set_network_master(1)
+		get_node("/root/game").add_child(player)
+		player.playerID = str(peer_id) 
+		
+		var spawnPosition = get_node("/root/game/spawnCollection/spawn"+str(i)).get_translation()
+		player.translate(spawnPosition)
+		
+		i+=1
+
+remote func register_player(id): 
+	print("New player, id is ", id) #adding the new id to anyones array!
+	#if !(id in players):
+	players[id] = str(id)
+	
+remote func removePlayer(id):
+	players.erase(id)
+	if has_node("/root/game/"+str(id)):
+		rpc("removePlayer", id)
+		get_node("/root/game/"+str(id)).queue_free()
+	
+	print("Player ", str(id), " disconnected")
+
+remote func get_message(mess):
+	if mess == "quit":
+		print("Received order to quit")
+		get_tree().set_network_peer(null)
+		get_tree().quit()
+	else:
+		print(mess)
\ No newline at end of file
diff --git a/client/scenes/autoloads/globals.gd b/client/scenes/autoloads/globals.gd
deleted file mode 100644
index 0d9e32b..0000000
--- a/client/scenes/autoloads/globals.gd
+++ /dev/null
@@ -1 +0,0 @@
-const test = 42o
diff --git a/client/scenes/entities/bloc/Bloc.tscn b/client/scenes/entities/bloc/bloc.tscn
similarity index 100%
rename from client/scenes/entities/bloc/Bloc.tscn
rename to client/scenes/entities/bloc/bloc.tscn
diff --git a/client/scenes/entities/player/player.gd b/client/scenes/entities/player/player.gd
new file mode 100644
index 0000000..a930aa2
--- /dev/null
+++ b/client/scenes/entities/player/player.gd
@@ -0,0 +1,65 @@
+extends Spatial
+
+var player
+var playerID = ""
+
+var vel:Vector3 = Vector3()
+const MAX_SPEED:float = 8.0
+
+const ACCEL:float = 8.5
+const SPRINT_ACCEL:float = 16.0
+const DEACCEL:float = 16.0
+
+const MAX_SPRINT_SPEED:float = 12.0
+var is_sprinting:bool = false
+var is_jumping:bool = false
+
+const JUMP_SPEED:float = 16.0
+const GRAVITY:float = -28.0
+
+const MAX_SLOPE_ANGLE:int = 40
+
+var motion:Vector3 = Vector3()
+
+func _ready():
+	player = $KinematicBody
+
+#func _physics_process(delta):
+#
+#	processMovement(delta)
+#
+## useless in case of server checking
+#func processMovement(delta):
+#
+#	motion.y = 0
+#	motion.z = 0
+#	# motion = motion.normalized()
+#
+#	vel.y += delta * GRAVITY
+#
+#	var hvel:Vector3 = vel
+#	hvel.y = 0
+#	hvel.z = 0
+#
+#	var target = motion
+#	if is_sprinting:
+#		target *= MAX_SPRINT_SPEED
+#	else:
+#		target *= MAX_SPEED
+#
+#	var accel
+#	if motion.dot(hvel)>0:
+#		if is_sprinting:
+#			accel = SPRINT_ACCEL
+#		else:
+#			accel = ACCEL
+#	else:
+#		accel = DEACCEL
+#
+#	hvel = hvel.linear_interpolate(target, accel * delta)
+#	vel.x = hvel.x
+#
+#	vel = player.move_and_slide(vel, Vector3(0,1,0), 0.05, 4, deg2rad(MAX_SLOPE_ANGLE))
+
+remote func getRemoteMovement(position):
+	player.move_and_slide(position, Vector3(0,1,0), 0.05, 4, deg2rad(MAX_SLOPE_ANGLE))
\ No newline at end of file
diff --git a/client/scenes/entities/player/player.tscn b/client/scenes/entities/player/player.tscn
new file mode 100644
index 0000000..64a60bb
--- /dev/null
+++ b/client/scenes/entities/player/player.tscn
@@ -0,0 +1,37 @@
+[gd_scene load_steps=4 format=2]
+
+[ext_resource path="res://scenes/entities/player/player.gd" type="Script" id=1]
+
+[sub_resource type="CapsuleShape" id=1]
+radius = 0.209134
+
+[sub_resource type="BoxShape" id=2]
+extents = Vector3( 0.236482, 0.0564314, 0.280348 )
+
+[node name="Player" type="Spatial"]
+script = ExtResource( 1 )
+
+[node name="KinematicBody" type="KinematicBody" parent="."]
+
+[node name="Body_CollisionShape" type="CollisionShape" parent="KinematicBody"]
+transform = Transform( 1, 0, 0, 0, -4.37114e-08, -1, 0, 1, -4.37114e-08, 0, 0.585563, 0 )
+shape = SubResource( 1 )
+disabled = true
+
+[node name="Feet_CollisionShape" type="CollisionShape" parent="KinematicBody"]
+transform = Transform( 1, 0, 0, 0, 1, 0, 0, 0, 1, 0, 0.131137, 0 )
+shape = SubResource( 2 )
+disabled = true
+
+[node name="Model" type="Spatial" parent="KinematicBody"]
+
+[node name="CSGBox" type="CSGBox" parent="KinematicBody/Model"]
+transform = Transform( 1, 0, 0, 0, 1, 0, 0, 0, 1, 0, 0.513621, 0 )
+width = 0.35
+height = 1.05787
+depth = 0.684
+
+[node name="CSGSphere" type="CSGSphere" parent="KinematicBody/Model"]
+transform = Transform( 1, 0, 0, 0, 1, 0, 0, 0, 1, 0, 1.17856, 0 )
+radius = 0.2
+radial_segments = 24
diff --git a/client/scenes/levels/Game.tscn b/client/scenes/levels/Game.tscn
deleted file mode 100644
index c4439a8..0000000
--- a/client/scenes/levels/Game.tscn
+++ /dev/null
@@ -1,21 +0,0 @@
-[gd_scene load_steps=3 format=2]
-
-[ext_resource path="res://scenes/entities/player/Player.tscn" type="PackedScene" id=1]
-[ext_resource path="res://scenes/entities/bloc/Bloc.tscn" type="PackedScene" id=2]
-
-[node name="Spatial" type="Spatial"]
-
-[node name="Player" parent="." instance=ExtResource( 1 )]
-transform = Transform( 1, 0, 0, 0, 1, 0, 0, 0, 1, -0.0417032, 1.4664, 0 )
-
-[node name="Camera" type="Camera" parent="."]
-transform = Transform( 1, 0, 0, 0, 1, 0, 0, 0, 1, 0, 1.08, 18.986 )
-fov = 30.0
-
-[node name="Structure" type="Spatial" parent="."]
-
-[node name="Bloc" parent="Structure" instance=ExtResource( 2 )]
-transform = Transform( 10, 0, 0, 0, 1, 0, 0, 0, 1, 0, 0, 0 )
-
-[node name="Bloc2" parent="Structure" instance=ExtResource( 2 )]
-transform = Transform( 5, 0, 0, 0, 1, 0, 0, 0, 1, 0, 4.15191, 0 )
diff --git a/client/scenes/levels/game/game.gd b/client/scenes/levels/game/game.gd
new file mode 100644
index 0000000..8477c00
--- /dev/null
+++ b/client/scenes/levels/game/game.gd
@@ -0,0 +1,27 @@
+extends Node
+
+var movementInput:int = 0
+var jumpInput:bool = false
+var sprintInput:bool = false
+
+func _physics_process(delta):
+	getPlayerInput()
+	
+func getPlayerInput():
+	movementInput = 0
+	jumpInput = false
+		
+	if Input.is_action_pressed("movementLeft"):
+		movementInput = -1
+	if Input.is_action_pressed("movementRight"):
+		movementInput = 1
+		
+	if Input.is_action_just_pressed("movementJump"):
+		jumpInput = true
+		
+	if Input.is_action_pressed("movementSprint"):
+		sprintInput = true
+	else:
+		sprintInput = false
+		
+	rpc_id(1, "sendPlayerInputs", movementInput, sprintInput, jumpInput)
\ No newline at end of file
diff --git a/client/scenes/levels/game/game.tscn b/client/scenes/levels/game/game.tscn
new file mode 100644
index 0000000..b024073
--- /dev/null
+++ b/client/scenes/levels/game/game.tscn
@@ -0,0 +1,30 @@
+[gd_scene load_steps=3 format=2]
+
+[ext_resource path="res://scenes/levels/game/game.gd" type="Script" id=1]
+[ext_resource path="res://scenes/entities/bloc/bloc.tscn" type="PackedScene" id=2]
+
+[node name="game" type="Spatial"]
+script = ExtResource( 1 )
+
+[node name="camera" type="Camera" parent="."]
+transform = Transform( 1, 0, 0, 0, 1, 0, 0, 0, 1, 0, 1.08, 52.4675 )
+fov = 30.0
+
+[node name="structure" type="Spatial" parent="."]
+
+[node name="bloc" parent="structure" instance=ExtResource( 2 )]
+transform = Transform( 10, 0, 0, 0, 1, 0, 0, 0, 1, 0, 0, 0 )
+
+[node name="bloc2" parent="structure" instance=ExtResource( 2 )]
+transform = Transform( 5, 0, 0, 0, 1, 0, 0, 0, 1, 0, 4.15191, 0 )
+
+[node name="spawnCollection" type="Spatial" parent="."]
+
+[node name="spawn1" type="Position3D" parent="spawnCollection"]
+transform = Transform( 1, 0, 0, 0, 1, 0, 0, 0, 1, -2, 6, 0 )
+
+[node name="spawn2" type="Position3D" parent="spawnCollection"]
+transform = Transform( 1, 0, 0, 0, 1, 0, 0, 0, 1, 0, 6, 0 )
+
+[node name="spawn3" type="Position3D" parent="spawnCollection"]
+transform = Transform( 1, 0, 0, 0, 1, 0, 0, 0, 1, 2, 6, 0 )
diff --git a/client/scenes/levels/lobby/lobby.gd b/client/scenes/levels/lobby/lobby.gd
index 444e7a6..1317913 100644
--- a/client/scenes/levels/lobby/lobby.gd
+++ b/client/scenes/levels/lobby/lobby.gd
@@ -1,12 +1,9 @@
 extends Control
 
-var players = {}
-
 func _ready():
-	get_tree().connect("connected_to_server", self, "_player_connected")
-	get_tree().connect("connection_failed", self, "_connection_failed")
-	get_tree().connect("server_disconnected", self, "_player_disconnected")
-
+	gamestate.connect("connected_to_server", self, "_player_connected")
+	gamestate.connect("connection_failed", self, "_connection_failed")
+	gamestate.connect("server_disconnected", self, "_player_disconnected")
 
 
 func _on_joinButton_pressed():
@@ -23,36 +20,11 @@ func _on_joinButton_pressed():
 	get_node("menu/errorLabel").text=""
 	get_node("menu/joinButton").disabled = true
 	
-	var peer_join = NetworkedMultiplayerENet.new()
-	peer_join.create_client(ip, int(port))
-	get_tree().set_network_peer(peer_join)	
-	#checks:
-	print("Trying to join the server ", ip, ":", port) 
-	
-remote func register_player(id): 
-	print("A new player joined the game ..", id) #adding the new id to anyones array!
-	#if !(id in players):
-	players[id] = ""
-	#We can list all the users 
-	
-	# Checking whether the tree is initialized as a server or client:
-	# Server sends the info of existing players back to the new player
-	if get_tree().is_network_server(): 		
-		# Sending the list of existing players to the new player from ther server's personal list
-		for peer_id in players:
-			rpc_id(id, "register_player", peer_id) 	
-
-remote func get_message(mess):
-	if mess == "quit":
-		print("Received order to quit")
-		get_tree().set_network_peer(null)
-		get_tree().quit()
-	else:
-		print(mess)
+	gamestate.join_server(ip, port)
 
 func _player_connected():
-	print("You succesfuly joined the server with the id " + str(get_tree().get_network_unique_id()))
-	
+	print("You successfuly joined the server with the id " + str(get_tree().get_network_unique_id()))
+	rpc("get_message", "Hello there, I'm ", str(gamestate.get_network_unique_id()))
 	
 	
 func _connection_failed():
diff --git a/client/scenes/levels/lobby/lobby.tscn b/client/scenes/levels/lobby/lobby.tscn
index d419ae0..0d19c5a 100644
--- a/client/scenes/levels/lobby/lobby.tscn
+++ b/client/scenes/levels/lobby/lobby.tscn
@@ -12,38 +12,57 @@ margin_right = 506.0
 margin_bottom = 302.0
 
 [node name="ipLabel" type="Label" parent="menu"]
-margin_left = 60.0
-margin_top = 32.0
-margin_right = 140.0
-margin_bottom = 48.0
+margin_left = 25.0
+margin_top = 30.0
+margin_right = 105.0
+margin_bottom = 45.0
+rect_pivot_offset = Vector2( 85, -10 )
 text = "IP:"
 
 [node name="ipLineEdit" type="LineEdit" parent="menu"]
-margin_left = 62.0
-margin_top = 64.0
-margin_right = 176.0
-margin_bottom = 100.0
+margin_left = 25.0
+margin_top = 55.0
+margin_right = 125.0
+margin_bottom = 90.0
 rect_pivot_offset = Vector2( 55, 16 )
 hint_tooltip = "91.121.81.74 : lucas
 127.0.0.1 : local"
-text = "91.121.81.74"
+text = "127.0.0.1"
 
 [node name="portLabel" type="Label" parent="menu"]
-margin_left = 60.0
-margin_top = 131.0
-margin_right = 140.0
-margin_bottom = 147.0
+margin_left = 155.0
+margin_top = 30.0
+margin_right = 255.0
+margin_bottom = 45.0
 text = "Port:"
 
 [node name="portLineEdit" type="LineEdit" parent="menu"]
-margin_left = 66.0
-margin_top = 173.0
-margin_right = 180.0
-margin_bottom = 209.0
+margin_left = 155.0
+margin_top = 55.0
+margin_right = 255.0
+margin_bottom = 90.0
 rect_pivot_offset = Vector2( 55, 16 )
 hint_tooltip = "défini en dur: 10001"
 text = "10001"
 
+[node name="nameLabel" type="Label" parent="menu"]
+margin_left = 25.0
+margin_top = 130.0
+margin_right = 105.0
+margin_bottom = 145.0
+rect_pivot_offset = Vector2( 85, -10 )
+text = "Name:"
+
+[node name="nameLineEdit" type="LineEdit" parent="menu"]
+margin_left = 25.0
+margin_top = 155.0
+margin_right = 125.0
+margin_bottom = 190.0
+rect_pivot_offset = Vector2( 55, 16 )
+hint_tooltip = "91.121.81.74 : lucas
+127.0.0.1 : local"
+text = "Player"
+
 [node name="joinButton" type="Button" parent="menu"]
 margin_left = 319.0
 margin_top = 133.0
diff --git a/server/project.godot b/server/project.godot
index 5c7800e..60cd1c0 100644
--- a/server/project.godot
+++ b/server/project.godot
@@ -16,9 +16,13 @@ _global_script_class_icons={
 [application]
 
 config/name="server"
-run/main_scene="res://scenes/Node.tscn"
+run/main_scene="res://scenes/levels/lobby/lobby.tscn"
 config/icon="res://icon.png"
 
+[autoload]
+
+gamestate="*res://scenes/autoloads/gamestate.gd"
+
 [rendering]
 
 environment/default_environment="res://default_env.tres"
diff --git a/server/scenes/Node.tscn b/server/scenes/Node.tscn
deleted file mode 100644
index 6fd2dd1..0000000
--- a/server/scenes/Node.tscn
+++ /dev/null
@@ -1,6 +0,0 @@
-[gd_scene load_steps=2 format=2]
-
-[ext_resource path="res://scripts/Node.gd" type="Script" id=1]
-
-[node name="Node" type="Node"]
-script = ExtResource( 1 )
diff --git a/server/scenes/autoloads/gamestate.gd b/server/scenes/autoloads/gamestate.gd
new file mode 100644
index 0000000..d6f9482
--- /dev/null
+++ b/server/scenes/autoloads/gamestate.gd
@@ -0,0 +1,87 @@
+extends Node
+
+const PORT = 10001
+const MAX_CLIENTS = 1
+
+var players = {}
+
+func _ready():
+	get_tree().connect("network_peer_connected", self, "_player_connected")
+	get_tree().connect("network_peer_disconnected", self, "_player_disconnected")
+	
+	var peer = NetworkedMultiplayerENet.new()
+	peer.create_server(PORT, MAX_CLIENTS)
+	get_tree().set_network_peer(peer)
+	set_network_master(1)
+	
+	print("Server now hosting")
+	
+	
+remote func register_player(id):
+	print("A new player joined the game: ", id) #adding the new id to anyones array!
+	
+	#if !(id in players):
+	players[id] = str(id)
+	#We can list all the users 
+	
+	# Sending the list of existing players to the new player from ther server's personal list
+	print(players.values())
+	for peer_id in players:
+		rpc_id(peer_id, "register_player", id)
+		rpc_id(id, "register_player", peer_id)
+
+#Quand un client se connecte		
+func _player_connected(id):
+	if (players.size()<=MAX_CLIENTS):
+		register_player(id)
+		
+	if (players.size()==MAX_CLIENTS):
+		start_game()
+	
+#Quand un client se déconnecte
+func _player_disconnected(id):
+	players.erase(id)
+	if has_node("/root/game/"+str(id)):
+		rpc("removePlayer", id)
+		get_node("/root/game/"+str(id)).queue_free()
+	
+	print("Player ", str(id), " disconnected")
+	
+
+remote func get_message(mess):
+	if mess == "quit":
+		print("Received order to quit")
+		get_tree().set_network_peer(null)
+		get_tree().quit()
+	else:
+		print(mess)
+
+signal network_peer_disconnected
+
+func start_game():
+	print("game started with players ", players.values())
+	
+	#get_tree().get_root().get_node("lobby").hide()
+	
+	var game = load("res://scenes/levels/game/game.tscn").instance()
+	var player_scene = load("res://scenes/entities/player/player.tscn")
+	get_tree().get_root().add_child(game)
+
+	var i = 1
+	for peer_id in players:
+		var player = player_scene.instance()
+		
+		player.set_name(str(peer_id))			
+		player.set_network_master(1)
+		
+		get_node("/root/game").add_child(player)
+		
+		player.playerID = str(peer_id) 
+		
+		var spawnPosition = get_node("/root/game/spawnCollection/spawn"+str(i)).get_translation()
+		player.translate(spawnPosition)
+		
+		i+=1
+		
+	
+	rpc("start_game")
diff --git a/server/scenes/entities/bloc/bloc.tscn b/server/scenes/entities/bloc/bloc.tscn
new file mode 100644
index 0000000..6d021e8
--- /dev/null
+++ b/server/scenes/entities/bloc/bloc.tscn
@@ -0,0 +1,17 @@
+[gd_scene load_steps=3 format=2]
+
+[sub_resource type="CubeMesh" id=1]
+
+[sub_resource type="BoxShape" id=2]
+
+[node name="Bloc" type="Spatial"]
+
+[node name="MeshInstance" type="MeshInstance" parent="."]
+transform = Transform( 0.5, 0, 0, 0, 0.3, 0, 0, 0, 1, 0, 0, 0 )
+mesh = SubResource( 1 )
+material/0 = null
+
+[node name="StaticBody" type="StaticBody" parent="MeshInstance"]
+
+[node name="CollisionShape" type="CollisionShape" parent="MeshInstance/StaticBody"]
+shape = SubResource( 2 )
diff --git a/client/scenes/entities/player/Player.gd b/server/scenes/entities/player/player.gd
similarity index 52%
rename from client/scenes/entities/player/Player.gd
rename to server/scenes/entities/player/player.gd
index c633fbe..52cba77 100644
--- a/client/scenes/entities/player/Player.gd
+++ b/server/scenes/entities/player/player.gd
@@ -1,6 +1,7 @@
 extends Spatial
 
 var player
+var playerID = ""
 
 var vel:Vector3 = Vector3()
 const MAX_SPEED:float = 8.0
@@ -10,65 +11,55 @@ const SPRINT_ACCEL:float = 16.0
 const DEACCEL:float = 16.0
 
 const MAX_SPRINT_SPEED:float = 12.0
-var is_sprinting:bool = false
+var isSprinting:bool = false
 
 const JUMP_SPEED:float = 16.0
 const GRAVITY:float = -28.0
 
 const MAX_SLOPE_ANGLE:int = 40
 
-var dir:Vector3 = Vector3()
+var motion:Vector3 = Vector3()
 
 func _ready():
 	player = $KinematicBody
 
+# called by the engine
 func _physics_process(delta):
+	processMovement(delta)
+	broadcastMovement(delta)
+
+# called from the game script
+# update the vars
+func getPlayerInputs(movementInput, sprintInput, jumpInput):
+	motion = Vector3()
 	
-	process_input(delta)
-	process_movement(delta)
-	
-func process_input(delta):
+	motion.x = movementInput
+	motion.y= 0
+	motion.z = 0
 	
-	dir = Vector3()
-	var input_movement:int = 0
+	isSprinting = sprintInput
 	
-	if Input.is_action_pressed("ui_left"):
-		input_movement = -1
-	if Input.is_action_pressed("ui_right"):
-		input_movement = 1
-		
-	if player.is_on_floor() || player.is_on_wall():
-		if Input.is_action_just_pressed("ui_up"):
+	if player.is_on_floor()||player.is_on_wall():
+		if jumpInput:
+			print("nieh")
 			vel.y = JUMP_SPEED
-		
-	if Input.is_action_pressed("movement_sprint"):
-		is_sprinting = true
-	else:
-		is_sprinting = false
-		
-	dir.x = input_movement
-
-func process_movement(delta):
-	
-	dir.y = 0
-	dir.z = 0
-	# dir = dir.normalized()
 	
+func processMovement(delta):
 	vel.y += delta * GRAVITY
 	
 	var hvel:Vector3 = vel
 	hvel.y = 0
 	hvel.z = 0
 	
-	var target = dir
-	if is_sprinting:
+	var target = motion
+	if isSprinting:
 		target *= MAX_SPRINT_SPEED
 	else:
 		target *= MAX_SPEED
 	
 	var accel
-	if dir.dot(hvel)>0:
-		if is_sprinting:
+	if motion.dot(hvel)>0:
+		if isSprinting:
 			accel = SPRINT_ACCEL
 		else:
 			accel = ACCEL
@@ -78,4 +69,7 @@ func process_movement(delta):
 	hvel = hvel.linear_interpolate(target, accel * delta)
 	vel.x = hvel.x
 		
-	vel = player.move_and_slide(vel, Vector3(0,1,0), 0.05, 4, deg2rad(MAX_SLOPE_ANGLE))
\ No newline at end of file
+	vel = player.move_and_slide(vel, Vector3(0,1,0), 0.05, 4, deg2rad(MAX_SLOPE_ANGLE))
+	
+func broadcastMovement(delta):
+	rpc("getRemoteMovement", vel)
\ No newline at end of file
diff --git a/client/scenes/entities/player/Player.tscn b/server/scenes/entities/player/player.tscn
similarity index 94%
rename from client/scenes/entities/player/Player.tscn
rename to server/scenes/entities/player/player.tscn
index 5fbde1d..f8b4b8e 100644
--- a/client/scenes/entities/player/Player.tscn
+++ b/server/scenes/entities/player/player.tscn
@@ -1,6 +1,6 @@
 [gd_scene load_steps=4 format=2]
 
-[ext_resource path="res://scenes/entities/player/Player.gd" type="Script" id=1]
+[ext_resource path="res://scenes/entities/player/player.gd" type="Script" id=1]
 
 [sub_resource type="CapsuleShape" id=1]
 radius = 0.209134
diff --git a/server/scenes/levels/game/game.gd b/server/scenes/levels/game/game.gd
new file mode 100644
index 0000000..80eff65
--- /dev/null
+++ b/server/scenes/levels/game/game.gd
@@ -0,0 +1,6 @@
+extends Node
+
+remote func sendPlayerInputs(movementInput, jumpInput, sprintInput):
+	var senderId = get_tree().get_rpc_sender_id()
+
+	gamestate.get_node("/root/game/"+str(senderId)).getPlayerInputs(movementInput, jumpInput, sprintInput)
\ No newline at end of file
diff --git a/server/scenes/levels/game/game.tscn b/server/scenes/levels/game/game.tscn
new file mode 100644
index 0000000..c152862
--- /dev/null
+++ b/server/scenes/levels/game/game.tscn
@@ -0,0 +1,30 @@
+[gd_scene load_steps=3 format=2]
+
+[ext_resource path="res://scenes/levels/game/game.gd" type="Script" id=1]
+[ext_resource path="res://scenes/entities/bloc/bloc.tscn" type="PackedScene" id=2]
+
+[node name="game" type="Spatial"]
+script = ExtResource( 1 )
+
+[node name="camera" type="Camera" parent="."]
+transform = Transform( 1, 0, 0, 0, 1, 0, 0, 0, 1, 0, 1.08, 18.986 )
+fov = 30.0
+
+[node name="structure" type="Spatial" parent="."]
+
+[node name="bloc" parent="structure" instance=ExtResource( 2 )]
+transform = Transform( 10, 0, 0, 0, 1, 0, 0, 0, 1, 0, 0, 0 )
+
+[node name="bloc2" parent="structure" instance=ExtResource( 2 )]
+transform = Transform( 5, 0, 0, 0, 1, 0, 0, 0, 1, 0, 4.15191, 0 )
+
+[node name="spawnCollection" type="Spatial" parent="."]
+
+[node name="spawn1" type="Position3D" parent="spawnCollection"]
+transform = Transform( 1, 0, 0, 0, 1, 0, 0, 0, 1, -2, 6, 0 )
+
+[node name="spawn2" type="Position3D" parent="spawnCollection"]
+transform = Transform( 1, 0, 0, 0, 1, 0, 0, 0, 1, 0, 6, 0 )
+
+[node name="spawn3" type="Position3D" parent="spawnCollection"]
+transform = Transform( 1, 0, 0, 0, 1, 0, 0, 0, 1, 2, 6, 0 )
diff --git a/server/scenes/levels/lobby/lobby.gd b/server/scenes/levels/lobby/lobby.gd
new file mode 100644
index 0000000..e5c4a06
--- /dev/null
+++ b/server/scenes/levels/lobby/lobby.gd
@@ -0,0 +1,68 @@
+extends Node
+
+#const PORT = 10001
+#const MAX_CLIENTS = 2
+#
+#var players = {}
+#
+#func _ready():
+#	get_tree().connect("network_peer_connected", self, "_player_connected")
+#	get_tree().connect("network_peer_disconnected", self, "_player_disconnected")
+#
+#	var peer = NetworkedMultiplayerENet.new()
+#	peer.create_server(PORT, MAX_CLIENTS)
+#	get_tree().set_network_peer(peer)
+#	set_network_master(1)
+#
+#	print("Server now hosting")
+#
+#
+#remote func register_player(id):
+#	print("A new player joined the game ..", id) #adding the new id to anyones array!
+#	#if !(id in players):
+#	players[id] = ""
+#	#We can list all the users 
+#
+#	# Checking whether the tree is initialized as a server or client:
+#	# Server sends the info of existing players back to the new player
+#	if get_tree().is_network_server(): 		
+#		# Sending the list of existing players to the new player from ther server's personal list
+#		for peer_id in players:
+#			rpc_id(id, "get_message", str(peer_id))
+#
+#
+#func game_setup():
+#	print("game started with players ", players.values())
+#
+#
+##Quand un client se connecte		
+#func _player_connected(id):
+#	if (players.size()<MAX_CLIENTS):
+#		#print("Hello players. I have just joined the game and I will beat u!: ", id)
+#		register_player(id)
+#
+#	else:
+#		game_setup()
+#
+##Quand un client se déconnecte
+#func _player_disconnected(id):
+#	players.erase(id)
+#	print("Player ", id, " disconnected")
+#
+#
+#master func get_message(mess):
+#	if mess == "quit":
+#		print("Received order to quit")
+#		get_tree().set_network_peer(null)
+#		get_tree().quit()
+#	else:
+#		print(mess)
+#
+#signal network_peer_disconnected
+#
+#func start_game():
+#	var world = load("res://scenes/levels/game/game.tscn").instance()
+#	get_tree().get_root().add_child(world)
+#
+#	get_tree().get_root().get_node("lobby").hide()
+#
diff --git a/server/scenes/levels/lobby/lobby.tscn b/server/scenes/levels/lobby/lobby.tscn
new file mode 100644
index 0000000..5420a4f
--- /dev/null
+++ b/server/scenes/levels/lobby/lobby.tscn
@@ -0,0 +1,6 @@
+[gd_scene load_steps=2 format=2]
+
+[ext_resource path="res://scenes/levels/lobby/lobby.gd" type="Script" id=1]
+
+[node name="lobby" type="Node"]
+script = ExtResource( 1 )
diff --git a/server/scripts/Node.gd b/server/scripts/Node.gd
deleted file mode 100644
index 004d9f6..0000000
--- a/server/scripts/Node.gd
+++ /dev/null
@@ -1,65 +0,0 @@
-extends Node
-
-const PORT = 10001
-const MAX_CLIENTS = 2
-
-var players = {}
-
-func _ready():
-	get_tree().connect("network_peer_connected", self, "_player_connected")
-	get_tree().connect("network_peer_disconnected", self, "_player_disconnected")
-	#get_tree().connect("connection_failed", self, "_player_disconnected")
-	
-	var peer = NetworkedMultiplayerENet.new()
-	peer.create_server(PORT, MAX_CLIENTS)
-	get_tree().set_network_peer(peer)
-	
-	print("Server now hosting")
-	
-	
-remote func register_player(id):
-	print("A new player joined the game ..", id) #adding the new id to anyones array!
-	#if !(id in players):
-	players[id] = ""
-	#We can list all the users 
-	
-	# Checking whether the tree is initialized as a server or client:
-	# Server sends the info of existing players back to the new player
-	if get_tree().is_network_server(): 		
-		# Sending the list of existing players to the new player from ther server's personal list
-		for peer_id in players:
-			rpc_id(id, "register_player", peer_id)
-
-
-func game_setup():
-	print("game started with players ", players.values())
-
-
-#Quand un client se connecte		
-func _player_connected(id):
-	if (players.size()<MAX_CLIENTS):
-		print("Hello players. I have just joined the game and I will beat u!: ", id)
-		register_player(id)
-		
-	else:
-		game_setup()
-	
-#Quand un client se déconnecte
-func _player_disconnected(id):
-	print("Player ", id, " disconnected")
-	
-
-remote func get_message(mess):
-	if mess == "quit":
-		print("Received order to quit")
-		get_tree().set_network_peer(null)
-		get_tree().quit()
-	else:
-		print(mess)
-
-	
-func _messageToAll(fct,msg):
-	rpc(fct,msg)
-
-func _messageToOne(id, fct, msg):
-	rpc(id, fct, msg)
-- 
GitLab