refactor
This commit is contained in:
62
scenes/entities/portal/portal.gd
Normal file
62
scenes/entities/portal/portal.gd
Normal file
@@ -0,0 +1,62 @@
|
||||
extends StaticBody3D
|
||||
|
||||
@export var stats_resource: PortalStats
|
||||
@export var is_red: 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_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)
|
||||
_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)
|
||||
1
scenes/entities/portal/portal.gd.uid
Normal file
1
scenes/entities/portal/portal.gd.uid
Normal file
@@ -0,0 +1 @@
|
||||
uid://cny0k5s884uco
|
||||
49
scenes/entities/portal/portal.tscn
Normal file
49
scenes/entities/portal/portal.tscn
Normal file
@@ -0,0 +1,49 @@
|
||||
[gd_scene load_steps=6 format=3 uid="uid://b0portal0001"]
|
||||
|
||||
[ext_resource type="Script" path="res://scenes/entities/portal/portal.gd" id="1"]
|
||||
|
||||
[sub_resource type="CylinderShape3D" id="CylShape_1"]
|
||||
height = 0.4
|
||||
radius = 1.5
|
||||
|
||||
[sub_resource type="CylinderMesh" id="CylMesh_1"]
|
||||
top_radius = 1.5
|
||||
bottom_radius = 1.5
|
||||
height = 3.0
|
||||
|
||||
[sub_resource type="StandardMaterial3D" id="PortalMat"]
|
||||
albedo_color = Color(0.3, 0.5, 0.95, 1)
|
||||
emission_enabled = true
|
||||
emission = Color(0.5, 0.7, 1.0, 1)
|
||||
emission_energy_multiplier = 1.5
|
||||
|
||||
[sub_resource type="SphereShape3D" id="SphereEnter"]
|
||||
radius = 1.8
|
||||
|
||||
[node name="Portal" type="StaticBody3D"]
|
||||
collision_layer = 8
|
||||
collision_mask = 0
|
||||
script = ExtResource("1")
|
||||
|
||||
[node name="Collision" type="CollisionShape3D" parent="."]
|
||||
transform = Transform3D(1, 0, 0, 0, 1, 0, 0, 0, 1, 0, 0.2, 0)
|
||||
shape = SubResource("CylShape_1")
|
||||
|
||||
[node name="Mesh" type="MeshInstance3D" parent="."]
|
||||
transform = Transform3D(1, 0, 0, 0, 1, 0, 0, 0, 1, 0, 1.5, 0)
|
||||
mesh = SubResource("CylMesh_1")
|
||||
material_override = SubResource("PortalMat")
|
||||
|
||||
[node name="NameLabel" type="Label3D" parent="."]
|
||||
transform = Transform3D(1, 0, 0, 0, 1, 0, 0, 0, 1, 0, 4.0, 0)
|
||||
billboard = 1
|
||||
text = "Portal"
|
||||
font_size = 22
|
||||
outline_size = 3
|
||||
|
||||
[node name="EnterArea" type="Area3D" parent="."]
|
||||
collision_layer = 0
|
||||
collision_mask = 2
|
||||
|
||||
[node name="EnterShape" type="CollisionShape3D" parent="EnterArea"]
|
||||
shape = SubResource("SphereEnter")
|
||||
Reference in New Issue
Block a user