92 lines
2.3 KiB
GDScript3
92 lines
2.3 KiB
GDScript3
|
|
class_name RemoteFishingPresentation
|
||
|
|
extends Node3D
|
||
|
|
|
||
|
|
var _owner: Player
|
||
|
|
var _bobber: MeshInstance3D
|
||
|
|
var _line: MeshInstance3D
|
||
|
|
var _line_mesh := ImmediateMesh.new()
|
||
|
|
var _target: Vector3
|
||
|
|
var _active: bool = false
|
||
|
|
|
||
|
|
|
||
|
|
func setup(owner: Player) -> void:
|
||
|
|
_owner = owner
|
||
|
|
_bobber = MeshInstance3D.new()
|
||
|
|
var bobber_mesh := SphereMesh.new()
|
||
|
|
bobber_mesh.radius = 0.12
|
||
|
|
bobber_mesh.height = 0.24
|
||
|
|
_bobber.mesh = bobber_mesh
|
||
|
|
var bobber_material := StandardMaterial3D.new()
|
||
|
|
bobber_material.albedo_color = Color(0.92, 0.12, 0.08, 1.0)
|
||
|
|
bobber_material.roughness = 0.45
|
||
|
|
_bobber.material_override = bobber_material
|
||
|
|
add_child(_bobber)
|
||
|
|
_line = MeshInstance3D.new()
|
||
|
|
_line.mesh = _line_mesh
|
||
|
|
var line_material := StandardMaterial3D.new()
|
||
|
|
line_material.shading_mode = BaseMaterial3D.SHADING_MODE_UNSHADED
|
||
|
|
line_material.albedo_color = Color(0.9, 0.9, 0.82, 1.0)
|
||
|
|
_line.material_override = line_material
|
||
|
|
add_child(_line)
|
||
|
|
cleanup()
|
||
|
|
|
||
|
|
|
||
|
|
func show_cast(target: Vector3) -> void:
|
||
|
|
if _owner == null or not target.is_finite():
|
||
|
|
return
|
||
|
|
_active = true
|
||
|
|
_target = target
|
||
|
|
_bobber.global_position = target
|
||
|
|
_bobber.visible = true
|
||
|
|
_line.visible = true
|
||
|
|
_owner.set_active_item_is_rod(true)
|
||
|
|
_redraw_line()
|
||
|
|
|
||
|
|
|
||
|
|
func update_bobber(position: Vector3) -> void:
|
||
|
|
if not _active or not position.is_finite():
|
||
|
|
return
|
||
|
|
_target = position
|
||
|
|
_bobber.global_position = position
|
||
|
|
_redraw_line()
|
||
|
|
|
||
|
|
|
||
|
|
func show_bite() -> void:
|
||
|
|
if not _active:
|
||
|
|
return
|
||
|
|
var tween: Tween = create_tween()
|
||
|
|
tween.tween_property(_bobber, "scale", Vector3.ONE * 0.7, 0.08)
|
||
|
|
tween.tween_property(_bobber, "scale", Vector3.ONE, 0.12)
|
||
|
|
|
||
|
|
|
||
|
|
func cleanup() -> void:
|
||
|
|
_active = false
|
||
|
|
if _bobber != null:
|
||
|
|
_bobber.visible = false
|
||
|
|
_bobber.scale = Vector3.ONE
|
||
|
|
if _line != null:
|
||
|
|
_line.visible = false
|
||
|
|
_line_mesh.clear_surfaces()
|
||
|
|
|
||
|
|
|
||
|
|
func _process(_delta: float) -> void:
|
||
|
|
if _active:
|
||
|
|
_redraw_line()
|
||
|
|
|
||
|
|
|
||
|
|
func _redraw_line() -> void:
|
||
|
|
if _owner == null or not is_instance_valid(_owner):
|
||
|
|
cleanup()
|
||
|
|
return
|
||
|
|
var tip: Marker3D = _owner.get_fishing_rod_tip()
|
||
|
|
if tip == null:
|
||
|
|
return
|
||
|
|
_line_mesh.clear_surfaces()
|
||
|
|
_line_mesh.surface_begin(Mesh.PRIMITIVE_LINE_STRIP)
|
||
|
|
_line_mesh.surface_add_vertex(to_local(tip.global_position))
|
||
|
|
var midpoint: Vector3 = tip.global_position.lerp(_target, 0.5)
|
||
|
|
midpoint.y -= 0.12
|
||
|
|
_line_mesh.surface_add_vertex(to_local(midpoint))
|
||
|
|
_line_mesh.surface_add_vertex(to_local(_target))
|
||
|
|
_line_mesh.surface_end()
|