extends StaticBody3D @export var stats_resource: PortalStats @export var is_red: bool = false @export var is_return: bool = false @onready var mesh: MeshInstance3D = $Mesh @onready var name_label: Label3D = $NameLabel @onready var enter_area: Area3D = $EnterArea var triggered: bool = false func _enter_tree() -> void: set_multiplayer_authority(1) func _ready() -> void: add_to_group("portals") if is_red: add_to_group("red_portal") if stats_resource == null: stats_resource = PortalStats.new() stats_resource.max_health = 1.0 stats_resource.is_red = is_red Stats.register(self, stats_resource) enter_area.body_entered.connect(_on_body_entered) if is_return: var mat: StandardMaterial3D = StandardMaterial3D.new() mat.albedo_color = Color(1.0, 0.85, 0.3) mat.emission_enabled = true mat.emission = Color(1.0, 0.8, 0.2) mat.emission_energy_multiplier = 1.2 mesh.material_override = mat name_label.text = "Zurück" elif is_red: var mat: StandardMaterial3D = StandardMaterial3D.new() mat.albedo_color = Color(0.95, 0.2, 0.2) mat.emission_enabled = true mat.emission = Color(1.0, 0.4, 0.3) mat.emission_energy_multiplier = 1.5 mesh.material_override = mat name_label.text = "Red Portal" else: name_label.text = "Portal" func _exit_tree() -> void: Stats.deregister(self) func _on_body_entered(body: Node) -> void: if not body.is_in_group("player"): return if not body.is_multiplayer_authority(): return if triggered: return triggered = true EventBus.portal_entered.emit(self, body) if is_return: _request_return.rpc_id(1) else: _request_enter.rpc_id(1, is_red, global_position) @rpc("any_peer", "reliable", "call_local") func _request_enter(red: bool, return_pos: Vector3) -> void: if not multiplayer.is_server() and multiplayer.multiplayer_peer != null: return var seed: int = randi() _do_enter.rpc(seed, red, return_pos) @rpc("authority", "reliable", "call_local") func _do_enter(seed: int, red: bool, return_pos: Vector3) -> void: GameState.dungeon_seed = seed GameState.dungeon_red = red GameState.portal_return_position = return_pos GameState.change_scene(GameState.SCENE_DUNGEON) @rpc("any_peer", "reliable", "call_local") func _request_return() -> void: if not multiplayer.is_server() and multiplayer.multiplayer_peer != null: return _do_return.rpc() @rpc("authority", "reliable", "call_local") func _do_return() -> void: GameState.change_scene(GameState.SCENE_WORLD)