First Map Tests, Player + Movement and Spawning.

This commit is contained in:
Patrick 2024-12-06 19:48:11 +01:00
parent 1351ce3178
commit c483a438c7
7 changed files with 145 additions and 8 deletions

View file

@ -0,0 +1,18 @@
[gd_scene load_steps=4 format=3 uid="uid://dpdxe3muj2o26"]
[ext_resource type="Script" path="res://scripts/entities/player.gd" id="1_r7f2r"]
[sub_resource type="CapsuleMesh" id="CapsuleMesh_yly5q"]
[sub_resource type="CapsuleShape3D" id="CapsuleShape3D_7frjr"]
[node name="Player" type="CharacterBody3D"]
script = ExtResource("1_r7f2r")
[node name="MeshInstance3D" type="MeshInstance3D" parent="."]
mesh = SubResource("CapsuleMesh_yly5q")
[node name="CollisionShape3D" type="CollisionShape3D" parent="."]
shape = SubResource("CapsuleShape3D_7frjr")
[node name="Camera3D" type="Camera3D" parent="."]

View file

@ -1,3 +1,28 @@
[gd_scene format=3 uid="uid://cbyee7drds7qu"] [gd_scene load_steps=2 format=3 uid="uid://cbyee7drds7qu"]
[ext_resource type="Script" path="res://scripts/maps/map.gd" id="1_4npcs"]
[node name="Testmap" type="Node3D"] [node name="Testmap" type="Node3D"]
script = ExtResource("1_4npcs")
[node name="CSGBox3D" type="CSGBox3D" parent="."]
use_collision = true
size = Vector3(50, 1, 50)
[node name="PlayerSpawn" type="Node3D" parent="."]
[node name="0" type="Node3D" parent="PlayerSpawn"]
transform = Transform3D(1, 0, 0, 0, 1, 0, 0, 0, 1, -17, 3, 0)
[node name="1" type="Node3D" parent="PlayerSpawn"]
transform = Transform3D(1, 0, 0, 0, 1, 0, 0, 0, 1, 16, 4, 0)
[node name="2" type="Node3D" parent="PlayerSpawn"]
transform = Transform3D(1, 0, 0, 0, 1, 0, 0, 0, 1, 0, 3, 15)
[node name="Camera3D" type="Camera3D" parent="."]
transform = Transform3D(0.707107, -0.353553, 0.612372, 0, 0.866025, 0.5, -0.707107, -0.353553, 0.612372, 43, 20, 43)
current = true
[node name="DirectionalLight3D" type="DirectionalLight3D" parent="."]
transform = Transform3D(-0.965926, 0.258819, 0, -0.224144, -0.836516, 0.5, 0.12941, 0.482963, 0.866025, 0, 0, 0)

View file

@ -0,0 +1,55 @@
extends CharacterBody3D
const SPEED: float = 5.0
const JUMP_VELOCITY: float = 4.5
var activated: bool = false
@onready
var camera: Camera3D = $Camera3D
var camera_rotation: Vector2 = Vector2(0,0)
func _ready() -> void:
if name == Game.username:
activated = true
camera.current = true
Input.set_mouse_mode(Input.MOUSE_MODE_CAPTURED)
func _physics_process(delta: float) -> void:
if activated:
if not is_on_floor():
velocity += get_gravity() * delta
if Input.is_action_just_pressed("ui_accept") and is_on_floor():
velocity.y = JUMP_VELOCITY
var input_dir: Vector2 = Input.get_vector("ui_left", "ui_right", "ui_up", "ui_down")
var direction: Vector3 = (transform.basis * Vector3(input_dir.x, 0, input_dir.y)).normalized()
if direction:
velocity.x = direction.x * SPEED
velocity.z = direction.z * SPEED
else:
velocity.x = move_toward(velocity.x, 0, SPEED)
velocity.z = move_toward(velocity.z, 0, SPEED)
if move_and_slide():
pass
Networking.player_sync_call(position, rotation)
func _input(event: InputEvent) -> void:
if event is InputEventMouseMotion and activated:
var mouse_event: InputEventMouseMotion = event
camera_rotation = mouse_event.relative * 0.01 * 0.5
if camera.rotation.x <= 1.6 && camera_rotation.y <= 0:
camera.rotate(Vector3.RIGHT, -camera_rotation.y)
elif camera.rotation.x >= -1.6 && camera_rotation.y >= 0:
camera.rotate(Vector3.RIGHT, -camera_rotation.y)
if camera.rotation.x >= 1.6:
camera.rotation.x = 1.6
elif camera.rotation.x <= -1.6:
camera.rotation.x = -1.6
rotate(Vector3.DOWN, camera_rotation.x)

13
scripts/maps/map.gd Normal file
View file

@ -0,0 +1,13 @@
extends Node3D
var player: PackedScene = preload("res://scenes/entities/player.tscn")
func _ready() -> void:
var spawns: Array = $PlayerSpawn.get_children()
var i: int = 0
for peer: String in Networking.peers:
var instance: CharacterBody3D = player.instantiate()
instance.position = spawns[i].position
instance.name = peer
add_child(instance)
i += 1

View file

@ -24,4 +24,4 @@ func _on_playerlist_changed() -> void:
func _on_start_button_pressed() -> void: func _on_start_button_pressed() -> void:
Networking.send_rpcs("start_game", ["hello", " world"]) Networking.start_game_call()

View file

@ -14,6 +14,7 @@ var max_clients: int = 1024
var roomname: String = "sample" var roomname: String = "sample"
var username: String = "sample" var username: String = "sample"
var mapname: String = "Testmap"
func _ready() -> void: func _ready() -> void:
var args: PackedStringArray = OS.get_cmdline_args() var args: PackedStringArray = OS.get_cmdline_args()

View file

@ -240,15 +240,40 @@ func send_playerlist(status: int, newPeers: Dictionary) -> void:
## General Game RPCs ## General Game RPCs
# Does RPCs to all clients. # Does RPCs to all clients.
func send_rpcs(method: String, args: Array) -> void: func get_ids() -> Array:
var ret: Array = []
for peer: String in peers: for peer: String in peers:
var id: int = peers[peer] ret.append(peers[peer])
if rpc_id(id, method, args) != OK: return ret
Log.warning("Failed to send the rpc %s to %d." % [method, id])
func verify_id(id: int) -> bool:
if id in get_ids():
return true
return false
func start_game_call() -> void:
for peer: int in Networking.get_ids():
if rpc_id(peer, "start_game") != OK:
Log.warning("Couldn't send RPC to %d!" % peer)
# Starts the game. # Starts the game.
@rpc("any_peer", "call_remote", "reliable") @rpc("any_peer", "call_local", "reliable")
func start_game() -> void: func start_game() -> void:
if multiplayer.get_remote_sender_id() == managerID: if multiplayer.get_remote_sender_id() == managerID:
if !get_tree().change_scene_to_file("res://scenes/maps/testmap.tscn"): if get_tree().change_scene_to_file("res://scenes/maps/testmap.tscn") != OK:
Log.warning("Couldn't load the map!") Log.warning("Couldn't load the map!")
func player_sync_call(position: Vector3, rotation: Vector3) -> void:
for peer: int in Networking.get_ids():
if rpc_id(peer, "player_sync", position, rotation) != OK:
Log.warning("Couldn't send RPC to %d!" % peer)
# Starts the game.
@rpc("any_peer", "call_local", "reliable")
func player_sync(position: Vector3, rotation: Vector3) -> void:
if verify_id(multiplayer.get_remote_sender_id()):
for peer: String in peers:
if peers[peer] == multiplayer.get_remote_sender_id() and has_node("/root/"+Game.mapname+"/"+peer):
var player: CharacterBody3D = get_node("/root/"+Game.mapname+"/"+peer)
player.position = position
player.rotation = rotation