added basic multiplayer

This commit is contained in:
Lucas Schumacher 2024-03-12 20:11:23 -04:00
parent 811129ac02
commit 791837457c
7 changed files with 138 additions and 69 deletions

View File

@ -2,10 +2,10 @@ extends Node
var players = {} var players = {}
# Called when the node enters the scene tree for the first time. # Called when the node enters the scene tree for the first time.
func _ready(): #func _ready():
pass # Replace with function body. #pass # Replace with function body.
# Called every frame. 'delta' is the elapsed time since the previous frame. # Called every frame. 'delta' is the elapsed time since the previous frame.
func _process(delta): #func _process(delta):
pass #pass

View File

@ -2,17 +2,10 @@
[ext_resource type="Script" path="res://MultiplayerController.gd" id="1_i2fn6"] [ext_resource type="Script" path="res://MultiplayerController.gd" id="1_i2fn6"]
[node name="Control" type="Control"] [node name="Control" type="CanvasLayer"]
layout_mode = 3
anchors_preset = 15
anchor_right = 1.0
anchor_bottom = 1.0
grow_horizontal = 2
grow_vertical = 2
script = ExtResource("1_i2fn6") script = ExtResource("1_i2fn6")
[node name="Host" type="Button" parent="."] [node name="Host" type="Button" parent="."]
layout_mode = 0
offset_right = 8.0 offset_right = 8.0
offset_bottom = 8.0 offset_bottom = 8.0
text = "Host text = "Host
@ -33,23 +26,14 @@ offset_bottom = 126.0
text = "Start" text = "Start"
[node name="Nickname" type="TextEdit" parent="."] [node name="Nickname" type="TextEdit" parent="."]
layout_mode = 0
offset_left = 26.0 offset_left = 26.0
offset_top = 138.0 offset_top = 138.0
offset_right = 378.0 offset_right = 378.0
offset_bottom = 170.0 offset_bottom = 170.0
placeholder_text = "nickname" placeholder_text = "nickname"
[node name="Apply" type="Button" parent="."] [node name="Map" type="Node" parent="."]
layout_mode = 0
offset_left = 390.0
offset_top = 139.0
offset_right = 456.0
offset_bottom = 170.0
text = "Apply"
[connection signal="button_down" from="Host" to="." method="_on_host_button_down"] [connection signal="button_down" from="Host" to="." method="_on_host_button_down"]
[connection signal="button_down" from="Join" to="." method="_on_join_button_down"] [connection signal="button_down" from="Join" to="." method="_on_join_button_down"]
[connection signal="button_down" from="Start" to="." method="_on_start_button_down"] [connection signal="button_down" from="Start" to="." method="_on_start_button_down"]
[connection signal="text_changed" from="Nickname" to="." method="_on_nickname_text_changed"]
[connection signal="button_down" from="Apply" to="." method="_on_apply_button_down"]

View File

@ -1,8 +1,10 @@
extends Control extends CanvasLayer
@export var address = "127.0.0.1" @export var address = "127.0.0.1"
@export var port = 8910 @export var port = 8910
var peer var peer
var nick = "NO_NICKNAME" #var nick = "NO_NICKNAME"
# Called when the node enters the scene tree for the first time. # Called when the node enters the scene tree for the first time.
func _ready(): func _ready():
@ -12,71 +14,88 @@ func _ready():
multiplayer.connection_failed.connect(connection_failed) multiplayer.connection_failed.connect(connection_failed)
pass # Replace with function body. pass # Replace with function body.
### Server and Client
func peer_connected(id): func peer_connected(id):
print("Peer connected: " + str(id)) print("Peer connected: ", id)
if multiplayer.is_server():
for p in GameManager.players: ### Server and Client
SendPlayerInformation(p["name"], p["id"]).rpc_id(id)
func peer_disconnected(id): func peer_disconnected(id):
print("Peer disconnected: " + str(id)) print("Peer disconnected: ", id)
GameManager.players.erase(id)
if id == 1:
print("Server Disconnected !!!!!")
var tree = get_children()
print("Children: ", tree)
for child in $Map.get_children():
child.queue_free()
self.show()
var players = get_tree().get_nodes_in_group("Player")
for i in players:
if i.name == str(id):
i.queue_free()
break
### Client
func connected_to_server(): func connected_to_server():
print("Connected to server :)") print("Connected to server :)")
SendPlayerInformation(nick, multiplayer.get_unique_id()) SendPlayerInformation.rpc_id(1, $Nickname.text, multiplayer.get_unique_id())
#SendPlayerInformation(nick, multiplayer.get_unique_id())
### Client
func connection_failed(): func connection_failed():
print("Disconnected from server :(") print("Disconnected from server :(")
# Called every frame. 'delta' is the elapsed time since the previous frame.
func _process(delta):
pass
@rpc("any_peer") @rpc("any_peer")
func SendPlayerInformation(name, id): func SendPlayerInformation(nickname, id):
print("got info on " + str(id)) var me = multiplayer.get_unique_id()
var sender_id = multiplayer.get_remote_sender_id() var sender_id = multiplayer.get_remote_sender_id()
#TODO: clients to only accept data from server print(me, ": got info on ", id, " from ", sender_id)
print(" from " + str(sender_id))
if !GameManager.players.has(id): if !GameManager.players.has(id):
GameManager.players[id] ={ GameManager.players[id] ={
"name" : name, "name" : nickname,
"id" : id, "id" : id,
"score": 0 "score": 0
} }
if multiplayer.is_server(): if multiplayer.is_server():
for i in GameManager.Players: print(me, ": Is Server!")
SendPlayerInformation.rpc(GameManager.Players[i].name, i) for i in GameManager.players:
print(me, ": Sending(?) player ", i)
SendPlayerInformation.rpc(GameManager.players[i].name, i)
@rpc("any_peer","call_local") @rpc("any_peer","call_local")
func StartGame(): func StartGame():
var me = multiplayer.get_unique_id()
print(me, ": Starting Game\n", me, ": Players: ", GameManager.players)
var scene = load("res://test_map.tscn").instantiate() var scene = load("res://test_map.tscn").instantiate()
get_tree().root.add_child(scene) #get_tree().root.add_child(scene)
$Map.add_child(scene)
self.hide() self.hide()
func _on_host_button_down():
func hostGame():
peer = ENetMultiplayerPeer.new() peer = ENetMultiplayerPeer.new()
var err = peer.create_server(port, 32) var error = peer.create_server(port, 2)
if err != OK: if error != OK:
print("Error Starting Server :(") print("cannot host: " + error)
return return
peer.get_host().compress(ENetConnection.COMPRESS_RANGE_CODER)
multiplayer.set_multiplayer_peer(peer) multiplayer.set_multiplayer_peer(peer)
print("Waiting for players...") print("Waiting For Players!")
func _on_host_button_down():
hostGame()
SendPlayerInformation($Nickname.text, multiplayer.get_unique_id())
#SendPlayerInformation(nick, multiplayer.get_unique_id())
func _on_join_button_down(): func _on_join_button_down():
peer = ENetMultiplayerPeer.new() peer = ENetMultiplayerPeer.new()
peer.create_client(address, port) peer.create_client(address, port)
peer.get_host().compress(ENetConnection.COMPRESS_RANGE_CODER)
multiplayer.set_multiplayer_peer(peer) multiplayer.set_multiplayer_peer(peer)
func _on_start_button_down(): func _on_start_button_down():
StartGame.rpc() StartGame.rpc()
func _on_apply_button_down():
get_node("Apply").disabled = true
nick = $Nickname.text
if peer.is_connected():
SendPlayerInformation(nick, multiplayer.get_unique_id())
pass # Replace with function body.
func _on_nickname_text_changed():
if $Apply.disabled && $Nickname.text != nick:
$Apply.disabled = false

33
SceneManager.gd Normal file
View File

@ -0,0 +1,33 @@
extends Node3D
@export var PlayerScene : PackedScene
# Called when the node enters the scene tree for the first time.
func _ready():
var me = multiplayer.get_unique_id()
var spawn_points = get_tree().get_nodes_in_group("PlayerSpawnPoint")
var sp_len = len(spawn_points)
var p_len = len(GameManager.players)
if !(sp_len > 0):
print("Warning: sp_len =", sp_len)
#assert(false)
if sp_len < p_len:
print("Warning: More players (", p_len, ") than spawn points")
print("Players:")
for p in GameManager.players:
print(" ", p)
#var player_scn = PlayerScene.instantiate()
var index = 0
for i in GameManager.players:
var currentPlayer = PlayerScene.instantiate()
currentPlayer.name = str(GameManager.players[i].id)
add_child(currentPlayer)
print(me, " Spawning:")
#TODO fix this dumb shit
for spawn in get_tree().get_nodes_in_group("PlayerSpawnPoint"):
if spawn.name == str(index):
print(" ", spawn)
currentPlayer.global_position = spawn.global_position
break
index += 1

12
player.gd Executable file → Normal file
View File

@ -5,6 +5,7 @@ var speed = 4.0 # movement speed
var jump_speed = 6.0 # determines jump height var jump_speed = 6.0 # determines jump height
var mouse_sensitivity = 0.002 # turning speed var mouse_sensitivity = 0.002 # turning speed
var moving = false var moving = false
var player_id
func get_input(): func get_input():
@ -14,9 +15,16 @@ func get_input():
velocity.z = movement_dir.z * speed velocity.z = movement_dir.z * speed
func _ready(): func _ready():
Input.mouse_mode = Input.MOUSE_MODE_CAPTURED player_id = str(name).to_int()
$MultiplayerSynchronizer.set_multiplayer_authority(player_id)
if player_id == multiplayer.get_unique_id():
Input.mouse_mode = Input.MOUSE_MODE_CAPTURED
var camera = Camera3D.new()
$SpringArm3D.add_child(camera)
func _physics_process(delta): func _physics_process(delta):
if player_id != multiplayer.get_unique_id():
return
velocity.y += -gravity * delta velocity.y += -gravity * delta
get_input() get_input()
if abs(velocity.x) + abs(velocity.z) > 0 && !moving: if abs(velocity.x) + abs(velocity.z) > 0 && !moving:
@ -29,6 +37,8 @@ func _physics_process(delta):
#mouse input stuff #mouse input stuff
func _unhandled_input(event): func _unhandled_input(event):
if player_id != multiplayer.get_unique_id():
return
if event is InputEventMouseMotion: if event is InputEventMouseMotion:
rotate_y(-event.relative.x * mouse_sensitivity) rotate_y(-event.relative.x * mouse_sensitivity)
get_node("SpringArm3D").rotate_x(-event.relative.y * mouse_sensitivity) get_node("SpringArm3D").rotate_x(-event.relative.y * mouse_sensitivity)

File diff suppressed because one or more lines are too long

View File

@ -1,5 +1,6 @@
[gd_scene load_steps=8 format=3 uid="uid://de1fwo7k3egnc"] [gd_scene load_steps=9 format=3 uid="uid://de1fwo7k3egnc"]
[ext_resource type="Script" path="res://SceneManager.gd" id="1_450es"]
[ext_resource type="PackedScene" uid="uid://c6mlkdq42nja5" path="res://player.tscn" id="1_y3rq4"] [ext_resource type="PackedScene" uid="uid://c6mlkdq42nja5" path="res://player.tscn" id="1_y3rq4"]
[ext_resource type="PackedScene" uid="uid://ba3ccygq71j1s" path="res://reloadinggun.tscn" id="2_lrg1g"] [ext_resource type="PackedScene" uid="uid://ba3ccygq71j1s" path="res://reloadinggun.tscn" id="2_lrg1g"]
@ -20,13 +21,12 @@ points = PackedVector3Array(-0.5, -0.5, -0.5, 0.5, 0.5, 0.5, 0.5, -0.5, 0.5, 0.5
[node name="TestMap" type="Node3D"] [node name="TestMap" type="Node3D"]
transform = Transform3D(0.69, 0, 0, 0, 0.69, 0, 0, 0, 0.69, 0, 0, 0) transform = Transform3D(0.69, 0, 0, 0, 0.69, 0, 0, 0, 0.69, 0, 0, 0)
script = ExtResource("1_450es")
PlayerScene = ExtResource("1_y3rq4")
[node name="DirectionalLight3D" type="DirectionalLight3D" parent="."] [node name="DirectionalLight3D" type="DirectionalLight3D" parent="."]
transform = Transform3D(1, 0, 0, 0, 0.844814, 0.53506, 0, -0.53506, 0.844814, 6.39415, 8.89804, 4.37005) transform = Transform3D(1, 0, 0, 0, 0.844814, 0.53506, 0, -0.53506, 0.844814, 6.39415, 8.89804, 4.37005)
[node name="Player" parent="." instance=ExtResource("1_y3rq4")]
transform = Transform3D(1, 0, 0, 0, 1, 0, 0, 0, 1, 0, 1.59781, 0)
[node name="floor" type="StaticBody3D" parent="."] [node name="floor" type="StaticBody3D" parent="."]
transform = Transform3D(0.5, 0, 0, 0, 0.5, 0, 0, 0, 0.5, 0, 0, 0) transform = Transform3D(0.5, 0, 0, 0, 0.5, 0, 0, 0, 0.5, 0, 0, 0)
@ -71,3 +71,17 @@ shape = SubResource("ConvexPolygonShape3D_j0sot")
[node name="reloadinggun" parent="." instance=ExtResource("2_lrg1g")] [node name="reloadinggun" parent="." instance=ExtResource("2_lrg1g")]
transform = Transform3D(0.305, 0, 0, 0, 0.305, 0, 0, 0, 0.305, -2.3898, 0.926755, -6.80532) transform = Transform3D(0.305, 0, 0, 0, 0.305, 0, 0, 0, 0.305, -2.3898, 0.926755, -6.80532)
[node name="SpawnLocations" type="Node3D" parent="."]
[node name="0" type="Node3D" parent="SpawnLocations" groups=["PlayerSpawnPoint"]]
transform = Transform3D(1, 0, 0, 0, 1, 0, 0, 0, 1, 0, 1.1897, 0)
[node name="1" type="Node3D" parent="SpawnLocations" groups=["PlayerSpawnPoint"]]
transform = Transform3D(1, 0, 0, 0, 1, 0, 0, 0, 1, 0, 1.1897, 1.88767)
[node name="2" type="Node3D" parent="SpawnLocations" groups=["PlayerSpawnPoint"]]
transform = Transform3D(1, 0, 0, 0, 1, 0, 0, 0, 1, 1.70596, 1.1897, 1.88767)
[node name="3" type="Node3D" parent="SpawnLocations" groups=["PlayerSpawnPoint"]]
transform = Transform3D(1, 0, 0, 0, 1, 0, 0, 0, 1, 1.70596, 1.1897, 3.80737)