This commit is contained in:
torsten 2026-02-15 14:00:09 +01:00
parent 82295d8642
commit 721f005ff3
7 changed files with 60 additions and 9 deletions

View file

@ -1,5 +1,7 @@
[gd_scene format=3 uid="uid://h5qt2pcidh8x"]
[ext_resource type="PackedScene" uid="uid://coq1j1cdrvqyn" path="res://systems/interaction/portal/portal.tscn" id="1_1yg6u"]
[sub_resource type="ProceduralSkyMaterial" id="ProceduralSkyMaterial_d3jw7"]
[sub_resource type="Sky" id="Sky_1yg6u"]
@ -41,3 +43,7 @@ transform = Transform3D(1, 0, 0, 0, 1, 0, 0, 0, 1, 0, -0.01873529, 0)
[node name="Interaction" type="Node3D" parent="." unique_id=1592705952]
[node name="Triggers" type="Node3D" parent="." unique_id=1507691477]
[node name="Portal" parent="." unique_id=988801188 instance=ExtResource("1_1yg6u")]
transform = Transform3D(1, 0, 0, 0, 1, 0, 0, 0, 1, -6, 0, -6)
target_area_key = "ahnenhalle"

View file

@ -26,6 +26,7 @@ NetworkManager="*uid://tniwwfk5703p"
[global_group]
players="Verwaltung der Spieler Objekte"
portals="Area Übergänge"
[physics]

View file

@ -0,0 +1,7 @@
extends Area3D
## Definiert, wohin dieses Portal führt und ermöglicht die Interaktion.
## Löst einen RPC an den NetworkManager aus, um einen Area-Wechsel anzufordern.
# Dieser Wert muss einem Schlüssel in NetworkManager.area_paths entsprechen (z.B. "ahnenhalle").
@export var target_area_key: String = ""

View file

@ -0,0 +1 @@
uid://c23uu6akws8nj

View file

@ -0,0 +1,19 @@
[gd_scene format=3 uid="uid://coq1j1cdrvqyn"]
[ext_resource type="Script" uid="uid://c23uu6akws8nj" path="res://systems/interaction/portal/portal.gd" id="1_8dnr8"]
[sub_resource type="BoxShape3D" id="BoxShape3D_h1tlh"]
size = Vector3(3.2, 1, 1)
[sub_resource type="BoxMesh" id="BoxMesh_gtfyq"]
[node name="Portal" type="Area3D" unique_id=988801188 groups=["portals"]]
script = ExtResource("1_8dnr8")
[node name="CollisionShape3D" type="CollisionShape3D" parent="." unique_id=1301383310]
transform = Transform3D(1, 0, 0, 0, 1, 0, 0, 0, 1, 0, 0.50266325, 0)
shape = SubResource("BoxShape3D_h1tlh")
[node name="MeshInstance3D" type="MeshInstance3D" parent="." unique_id=1902207257]
transform = Transform3D(3.2577846, 0, 0, 0, 1, 0, 0, 0, 1, 0, 0.48517025, 0)
mesh = SubResource("BoxMesh_gtfyq")

View file

@ -54,7 +54,7 @@ func _on_player_disconnected(id):
func change_player_area(id: int, area_key: String):
if not multiplayer.is_server(): return
print("Server is loading ", area_key)
var path = area_paths[area_key]
var path = area_paths[area_key
var container_name = area_key + "_container"
var viewport_name = area_key + "_viewport"
@ -111,7 +111,7 @@ func client_ready_to_spawn():
if not multiplayer.is_server(): return
if player_worlds.has(id):
var viewport_node = player_worlds[id]
var viewport_node = player_worlds[id
print("Client ", id, " ist bereit. Spawne jetzt.")
_spawn_player_in_world(id, viewport_node)
@ -209,3 +209,27 @@ func assign_camera_target(node_name: String):
local_camera.target = p
# var camera = get_viewport().get_camera_3d()
@rpc("any_peer", "call_remote", "reliable")
func handle_area_change_request(area_key: String):
var id = multiplayer.get_remote_sender_id()
if not player_worlds.has(id): return
print("Server: Player ", id, " requests area change to ", area_key)
# 1. Alten Avatar finden und entfernen
var old_viewport = player_worlds[id]
var player_node = old_viewport.find_child(str(id), true)
if player_node:
player_node.queue_free()
# 2. Bestehende Funktion für den Wechsel aufrufen
change_player_area(id, area_key)
## The following script is for a Portal node.
## File: portal.gd
extends Area3D
## Definiert, wohin dieses Portal führt.
## Dieser Wert muss einem Schlüssel in NetworkManager.area_paths entsprechen.
@export var target_area_key: String = ""

View file

@ -11,8 +11,6 @@ extends CharacterBody3D
var path: PackedVector3Array = []
var speed = 5.0
var _is_displayed=false
func _enter_tree():
# Da der Name des Nodes die Peer-ID ist, setzen wir die Authority einfach selbst
if name.is_valid_int():
@ -41,8 +39,6 @@ func _ready():
func _physics_process(delta):
# Dieser Teil läuft NUR auf dem Server
if path.size() > 0:
print("Server moving...")
_is_displayed = false
var next_point = path[0]
var direction = (next_point - global_position).normalized()
@ -62,9 +58,6 @@ func _physics_process(delta):
else:
velocity = Vector3.ZERO
sync_position = global_position # Sicherstellen, dass Standbild syncron bleibt
if _is_displayed == false:
print("Target reached:", sync_position)
_is_displayed = true
@rpc("any_peer", "call_remote", "reliable")