Unify fishing surfaces and presentation
This commit is contained in:
parent
c596b2aee7
commit
070765741c
19 changed files with 1705 additions and 372 deletions
|
|
@ -2,6 +2,8 @@
|
|||
class_name WaterBodyAuthoring
|
||||
extends Node3D
|
||||
|
||||
const FishPoolType = preload("res://fish/fish_pool.gd")
|
||||
|
||||
@export_group("Surface")
|
||||
## Visible water footprint in meters.
|
||||
@export_custom(
|
||||
|
|
@ -19,31 +21,29 @@ var surface_size: Vector2 = Vector2(10.0, 10.0):
|
|||
_sync_owned_nodes()
|
||||
|
||||
@export_group("Fishing Coverage")
|
||||
## Extra fishable coverage beyond each edge of the visible surface.
|
||||
@export_custom(
|
||||
PROPERTY_HINT_RANGE,
|
||||
"0.0,20.0,0.1,or_greater,suffix:m",
|
||||
)
|
||||
var fishing_padding: Vector2 = Vector2.ZERO:
|
||||
set(value):
|
||||
fishing_padding = Vector2(maxf(value.x, 0.0), maxf(value.y, 0.0))
|
||||
_sync_owned_nodes()
|
||||
@export_range(0.1, 20.0, 0.1, "or_greater", "suffix:m")
|
||||
var fishing_depth: float = 4.0:
|
||||
set(value):
|
||||
fishing_depth = maxf(value, 0.1)
|
||||
_sync_owned_nodes()
|
||||
@export var fish_pool: FishPoolType:
|
||||
set(value):
|
||||
fish_pool = value
|
||||
_sync_owned_nodes()
|
||||
@export var water_type: WaterType.Type = WaterType.Type.FRESH_WATER:
|
||||
set(value):
|
||||
water_type = value
|
||||
_sync_owned_nodes()
|
||||
@export var location_tags: Array[StringName] = []:
|
||||
set(value):
|
||||
location_tags = value
|
||||
_sync_owned_nodes()
|
||||
@export var selection_priority: int = 0:
|
||||
set(value):
|
||||
selection_priority = value
|
||||
_sync_owned_nodes()
|
||||
|
||||
@export_group("Recovery Coverage")
|
||||
## Extra recovery coverage beyond each edge of the visible surface.
|
||||
@export_custom(
|
||||
PROPERTY_HINT_RANGE,
|
||||
"0.0,20.0,0.1,or_greater,suffix:m",
|
||||
)
|
||||
var recovery_padding: Vector2 = Vector2.ZERO:
|
||||
set(value):
|
||||
recovery_padding = Vector2(maxf(value.x, 0.0), maxf(value.y, 0.0))
|
||||
_sync_owned_nodes()
|
||||
@export_range(0.1, 20.0, 0.1, "or_greater", "suffix:m")
|
||||
var recovery_depth: float = 4.8:
|
||||
set(value):
|
||||
|
|
@ -56,6 +56,8 @@ var visual_water_path: NodePath = ^"VisualWater"
|
|||
@export_node_path("CollisionShape3D")
|
||||
var fishing_shape_path: NodePath = ^"FishingRegion/Shape"
|
||||
@export_node_path("Area3D")
|
||||
var fishing_region_path: NodePath = ^"FishingRegion"
|
||||
@export_node_path("Area3D")
|
||||
var recovery_region_path: NodePath = ^"RecoveryRegion"
|
||||
@export_node_path("CollisionShape3D")
|
||||
var recovery_shape_path: NodePath = ^"RecoveryRegion/Shape"
|
||||
|
|
@ -80,13 +82,28 @@ func _sync_owned_nodes() -> void:
|
|||
var fishing_shape_node := (
|
||||
get_node_or_null(fishing_shape_path) as CollisionShape3D
|
||||
)
|
||||
var fishing_region := (
|
||||
get_node_or_null(fishing_region_path) as FishableWaterRegion
|
||||
)
|
||||
if fishing_region != null:
|
||||
fishing_region.fish_pool = fish_pool
|
||||
fishing_region.water_type = water_type
|
||||
fishing_region.location_tags = location_tags.duplicate()
|
||||
fishing_region.selection_priority = selection_priority
|
||||
fishing_region.surface_height_mode = (
|
||||
FishableWaterRegion.SurfaceHeightMode.PARENT_GLOBAL_Y
|
||||
)
|
||||
if fishing_shape_node != null:
|
||||
var fishing_shape := fishing_shape_node.shape as BoxShape3D
|
||||
if fishing_shape != null:
|
||||
# The authored root is the one water-surface height. Keep the fishable
|
||||
# volume entirely below that plane so visible water and interaction
|
||||
# can be moved together without a second height to tune.
|
||||
fishing_shape_node.position.y = -fishing_depth * 0.5
|
||||
fishing_shape.size = Vector3(
|
||||
surface_size.x + fishing_padding.x * 2.0,
|
||||
surface_size.x,
|
||||
fishing_depth,
|
||||
surface_size.y + fishing_padding.y * 2.0
|
||||
surface_size.y
|
||||
)
|
||||
|
||||
var recovery_region := (
|
||||
|
|
@ -101,9 +118,9 @@ func _sync_owned_nodes() -> void:
|
|||
var recovery_shape := recovery_shape_node.shape as BoxShape3D
|
||||
if recovery_shape != null:
|
||||
recovery_shape.size = Vector3(
|
||||
surface_size.x + recovery_padding.x * 2.0,
|
||||
surface_size.x,
|
||||
recovery_depth,
|
||||
surface_size.y + recovery_padding.y * 2.0
|
||||
surface_size.y
|
||||
)
|
||||
|
||||
if Engine.is_editor_hint():
|
||||
|
|
@ -139,11 +156,9 @@ func _get_configuration_warnings() -> PackedStringArray:
|
|||
)
|
||||
if recovery_shape == null or not recovery_shape.shape is BoxShape3D:
|
||||
warnings.append("RecoveryRegion must provide a BoxShape3D.")
|
||||
var fishing_region := (
|
||||
fishing_shape.get_parent() as FishableWaterRegion
|
||||
if fishing_shape != null
|
||||
else null
|
||||
)
|
||||
var fishing_region := get_node_or_null(
|
||||
fishing_region_path
|
||||
) as FishableWaterRegion
|
||||
if fishing_region == null:
|
||||
warnings.append("FishingRegion must use FishableWaterRegion.")
|
||||
elif (
|
||||
|
|
@ -155,4 +170,6 @@ func _get_configuration_warnings() -> PackedStringArray:
|
|||
)
|
||||
if water_material == null:
|
||||
warnings.append("Assign a water material.")
|
||||
if fish_pool == null:
|
||||
warnings.append("Assign a fish pool.")
|
||||
return warnings
|
||||
|
|
|
|||
Loading…
Add table
Add a link
Reference in a new issue