added basic multiplayer
This commit is contained in:
parent
811129ac02
commit
791837457c
@ -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
|
||||||
|
|||||||
@ -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"]
|
|
||||||
|
|||||||
@ -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
33
SceneManager.gd
Normal 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
12
player.gd
Executable file → Normal 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)
|
||||||
|
|||||||
17
player.tscn
17
player.tscn
File diff suppressed because one or more lines are too long
@ -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)
|
||||||
|
|||||||
Loading…
x
Reference in New Issue
Block a user