38 lines
1.0 KiB
GDScript
38 lines
1.0 KiB
GDScript
extends StaticBody3D
|
|
|
|
@export var stats: PortalStats
|
|
|
|
func _ready() -> void:
|
|
add_to_group("portals")
|
|
if stats.variant == PortalStats.Kind.RED:
|
|
add_to_group("red_portal")
|
|
_apply_appearance()
|
|
PortalData.register(self, stats)
|
|
|
|
func _exit_tree() -> void:
|
|
PortalData.deregister(self)
|
|
|
|
func _process(delta: float) -> void:
|
|
var mesh: Node3D = get_node_or_null("Mesh")
|
|
if mesh:
|
|
mesh.rotate_y(delta * 1.5)
|
|
|
|
func _apply_appearance() -> void:
|
|
var mesh: MeshInstance3D = get_node_or_null("Mesh")
|
|
if not mesh:
|
|
return
|
|
var mat := StandardMaterial3D.new()
|
|
mat.emission_enabled = true
|
|
mat.emission_energy_multiplier = 0.8
|
|
if stats.variant == PortalStats.Kind.RED:
|
|
mat.albedo_color = Color(0.9, 0.1, 0.1, 1)
|
|
mat.emission = Color(1.0, 0.25, 0.25, 1)
|
|
else:
|
|
mat.albedo_color = Color(0.4, 0.2, 0.85, 1)
|
|
mat.emission = Color(0.6, 0.35, 1.0, 1)
|
|
mesh.material_override = mat
|
|
|
|
func _on_detection_area_body_entered(body: Node3D) -> void:
|
|
if body is CharacterBody3D and body.name == "Player":
|
|
EventBus.portal_entered.emit(self, body)
|