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