Add modular holdover fishing world

This commit is contained in:
Alexander Sellite 2026-07-26 00:33:37 -04:00
parent 6a5923fdb8
commit a91f2b9825
17 changed files with 1354 additions and 191 deletions

View file

@ -100,7 +100,7 @@ func _ready() -> void:
_fishing_spot,
_game_ui,
_game_ui.get_screen_fade(),
_test_world.get_player_water_trigger(),
_test_world.get_player_water_triggers(),
_test_world.get_safe_respawn_points()
)
if not _settings_manager.settings_changed.is_connected(

View file

@ -26,7 +26,7 @@ item_catalog = ExtResource("11_items")
[node name="Player" parent="Players" instance=ExtResource("2_player")]
unique_name_in_owner = true
transform = Transform3D(1, 0, 0, 0, 1, 0, 0, 0, 1, 0, 1, 5)
transform = Transform3D(1, 0, 0, 0, 1, 0, 0, 0, 1, 0, 1, 16)
[node name="FishingSpot" parent="." instance=ExtResource("4_spot")]
unique_name_in_owner = true

View file

@ -308,6 +308,24 @@ func set_water_recovery_active(active: bool) -> void:
velocity = Vector3.ZERO
func prepare_for_water_recovery() -> void:
_restore_gameplay_presentation_for_recovery()
func restore_gameplay_orientation_after_recovery() -> void:
_restore_gameplay_presentation_for_recovery()
func _restore_gameplay_presentation_for_recovery() -> void:
# Recovery owns presentation teardown. Ending immediately kills every
# showcase tween, invalidates its callbacks, and restores the gameplay yaw.
end_catch_showcase(Callable(), true)
var gameplay_rotation: Vector3 = _visuals.rotation
gameplay_rotation.x = 0.0
gameplay_rotation.z = 0.0
_visuals.rotation = gameplay_rotation
func get_body_center_position() -> Vector3:
return global_position + Vector3.UP * body_center_height

View file

@ -0,0 +1,110 @@
# NETFISHING holdover world
`world/test_world.tscn` remains the active world. It composes the complete
temporary map, lighting, paths, bounds, and six region scenes. The practical
footprint is approximately 180 × 220 world units, including the coastal water
and outer collision bounds.
## Composition
```text
TestWorld
├── Environment
├── SeabedBoundary
├── Regions
│ ├── VillageRegion (0, 0, 15)
│ ├── StarterPondRegion (-42, 0, 15)
│ ├── RiverRegion (0, 0, -40)
│ ├── LakeRegion (53, 0, -25)
│ ├── MarshRegion (56, 0, 38)
│ └── CoastalDockRegion (0, 0, -103)
├── Connectors
├── Safety
└── WorldBounds
```
Every region uses the same ownership groups:
- `Visuals`: replaceable graybox meshes and labels.
- `StaticCollision`: simple gameplay collision paired with the visuals.
- `FishingWater`: explicit `FishableWaterRegion` children.
- `WaterRecovery`: explicit `PlayerWaterTrigger` children.
- `SafeRespawns`: known-safe `SafeRespawnPoint` markers.
- `Interactables`: region-owned services, currently used by the village.
`GrayboxRegion` only exposes those explicit child groups plus a stable region
ID. `TestWorld` is the aggregation boundary; regions do not select fish,
control recovery, own progression, register globally, or stream themselves.
## Safe editing
Move a whole region by moving its region root under `TestWorld/Regions`. This
keeps visuals, collision, water, recovery triggers, safe points, and
interactables synchronized. Moving only a visual mesh does not move collision
or gameplay volumes, so update its paired collision intentionally when editing
inside a region.
Safe designer targets:
- Entire region roots under `TestWorld/Regions`
- Children of `Visuals`, together with paired `StaticCollision`
- Safe-respawn marker transforms
- Landmark and label transforms
- Connector transforms and their complete StaticBody children
Structural land and route blocks extend from the common walkable elevation at
`y=0` down to approximately `y=-6`. Adjacent blocks meet at deliberate shared
edges instead of stacking collision surfaces. Decorative plaza/path color is
non-colliding and sits just above the authoritative ground.
Gameplay-critical children that must stay aligned:
- A water plane, its `FishingWater` Area3D, and its `WaterRecovery` Area3D
- A dock or bank mesh and its paired shape in `StaticCollision`
- Safe points and the land/dock they target
- The Fishing Shop visual root and `FishingShopInteraction`
Rename-sensitive paths:
- `TestWorld/Regions`
- `VillageRegion/Interactables/FishingShopWorld/FishingShopInteraction`
- `VillageRegion/Interactables/PelicanCoolerPerch`
- Each region's `FishingWater`, `WaterRecovery`, and `SafeRespawns` roots,
unless its exported NodePaths are updated at the same time
## Adding water and recovery
1. Add a `FishableWaterRegion` Area3D under the region's `FishingWater`.
2. Give it collision layer 4, a clear location tag, and an explicit fish pool.
3. Add a matching `PlayerWaterTrigger` under `WaterRecovery`.
4. Give the trigger collision layer 8, mask 2, matching horizontal coverage,
and the correct `surface_height`.
5. Place two or more safe respawns on nearby broad walkable land.
6. Validate casting, shoreline collision, recovery entry, and nearest-point
selection from every side.
`TestWorld/Safety/BelowWorldFailsafe` is a temporary whole-map recovery net.
It catches seam and below-world falls that escape normal regional water
coverage. It supplements rather than replaces the five region-local triggers;
the recovery controller still permits only one recovery sequence at a time.
## Services
The Fishing Shop is an instanced scene at the east side of the village plaza.
Move the complete `FishingShopWorld` instance, not only its booth meshes.
The Pelican perch is decorative signage, not an interaction NPC. Its sign says
“Sell to Pelicans from the Cooler”; the existing 0.25× Pelican sale remains
available from the Cooler anywhere in the world. Moving or removing the
decorative perch does not change that service.
## Temporary by design
All terrain, buildings, docks, reeds, landmarks, signage, palette, and lighting
are primitive holdover presentation. A future artist or level designer can
replace `Visuals` and paired static collision without changing fishing,
recovery, shop, save, economy, or player progression code. Region IDs and
gameplay volume ownership should remain stable while visuals are replaced.
Water surfaces sit near `y=0.2`; the shared graybox seabed is near `y=-6`.
There is no structural walkable layer directly below the fishable surfaces.

View file

@ -0,0 +1,83 @@
[gd_scene load_steps=10 format=3]
[ext_resource type="Script" path="res://world/fishing_shop_interaction.gd" id="1_shop"]
[sub_resource type="BoxMesh" id="CounterMesh"]
size = Vector3(4.2, 1.25, 1.8)
[sub_resource type="BoxMesh" id="RoofMesh"]
size = Vector3(5.2, 0.35, 3.2)
[sub_resource type="BoxMesh" id="PostMesh"]
size = Vector3(0.28, 3.2, 0.28)
[sub_resource type="BoxMesh" id="BackMesh"]
size = Vector3(5, 2.8, 0.25)
[sub_resource type="StandardMaterial3D" id="PrimaryMaterial"]
albedo_color = Color(0.12, 0.68, 0.62, 1)
[sub_resource type="StandardMaterial3D" id="AccentMaterial"]
albedo_color = Color(1, 0.68, 0.18, 1)
[sub_resource type="StandardMaterial3D" id="BackMaterial"]
albedo_color = Color(0.13, 0.34, 0.38, 1)
[sub_resource type="SphereShape3D" id="InteractionShape"]
radius = 3.0
[sub_resource type="BoxShape3D" id="CounterShape"]
size = Vector3(4.2, 1.25, 1.8)
[node name="FishingShopWorld" type="Node3D"]
[node name="Visuals" type="Node3D" parent="."]
[node name="Counter" type="MeshInstance3D" parent="Visuals"]
position = Vector3(0, 0.625, 0)
mesh = SubResource("CounterMesh")
material_override = SubResource("PrimaryMaterial")
[node name="Back" type="MeshInstance3D" parent="Visuals"]
position = Vector3(0, 1.4, 1.25)
mesh = SubResource("BackMesh")
material_override = SubResource("BackMaterial")
[node name="Roof" type="MeshInstance3D" parent="Visuals"]
position = Vector3(0, 3.15, 0.35)
mesh = SubResource("RoofMesh")
material_override = SubResource("AccentMaterial")
[node name="WestPost" type="MeshInstance3D" parent="Visuals"]
position = Vector3(-2.15, 1.6, -0.8)
mesh = SubResource("PostMesh")
material_override = SubResource("PrimaryMaterial")
[node name="EastPost" type="MeshInstance3D" parent="Visuals"]
position = Vector3(2.15, 1.6, -0.8)
mesh = SubResource("PostMesh")
material_override = SubResource("PrimaryMaterial")
[node name="ShopName" type="Label3D" parent="Visuals"]
position = Vector3(0, 3.7, 0)
text = "Fishing Shop"
font_size = 42
outline_size = 9
billboard = 1
no_depth_test = true
[node name="StaticCollision" type="StaticBody3D" parent="."]
[node name="CounterShape" type="CollisionShape3D" parent="StaticCollision"]
position = Vector3(0, 0.625, 0)
shape = SubResource("CounterShape")
[node name="FishingShopInteraction" type="Area3D" parent="."]
unique_name_in_owner = true
position = Vector3(0, 1, -0.3)
collision_layer = 0
collision_mask = 2
script = ExtResource("1_shop")
[node name="CollisionShape3D" type="CollisionShape3D" parent="FishingShopInteraction"]
shape = SubResource("InteractionShape")

View file

@ -0,0 +1,50 @@
[gd_scene load_steps=5 format=3]
[sub_resource type="BoxMesh" id="PerchMesh"]
size = Vector3(5, 0.7, 2.2)
[sub_resource type="CylinderMesh" id="PostMesh"]
top_radius = 0.18
bottom_radius = 0.24
height = 2.5
[sub_resource type="StandardMaterial3D" id="WoodMaterial"]
albedo_color = Color(0.46, 0.28, 0.13, 1)
[sub_resource type="StandardMaterial3D" id="SignMaterial"]
albedo_color = Color(0.95, 0.82, 0.42, 1)
[node name="PelicanCoolerPerch" type="Node3D"]
[node name="Visuals" type="Node3D" parent="."]
[node name="Perch" type="MeshInstance3D" parent="Visuals"]
position = Vector3(0, 1.65, 0)
mesh = SubResource("PerchMesh")
material_override = SubResource("WoodMaterial")
[node name="WestPost" type="MeshInstance3D" parent="Visuals"]
position = Vector3(-1.8, 0.7, 0)
mesh = SubResource("PostMesh")
material_override = SubResource("WoodMaterial")
[node name="EastPost" type="MeshInstance3D" parent="Visuals"]
position = Vector3(1.8, 0.7, 0)
mesh = SubResource("PostMesh")
material_override = SubResource("WoodMaterial")
[node name="Sign" type="Label3D" parent="Visuals"]
position = Vector3(0, 2.55, 0)
text = "Sell to Pelicans\nfrom the Cooler"
font_size = 30
outline_size = 8
billboard = 1
no_depth_test = true
[node name="ConvenienceLabel" type="Label3D" parent="Visuals"]
position = Vector3(0, 1.65, -1.15)
text = "Available anywhere • 0.25x"
font_size = 20
outline_size = 6
billboard = 1
no_depth_test = true

View file

@ -0,0 +1,140 @@
[gd_scene load_steps=21 format=3]
[ext_resource type="Script" path="res://world/regions/graybox_region.gd" id="1_region"]
[ext_resource type="Script" path="res://world/fishable_water_region.gd" id="2_water"]
[ext_resource type="Resource" path="res://fish/pools/test_water_pool.tres" id="3_pool"]
[ext_resource type="Script" path="res://world/player_water_trigger.gd" id="4_trigger"]
[ext_resource type="Script" path="res://world/safe_respawn_point.gd" id="5_safe"]
[sub_resource type="BoxShape3D" id="ShoreShape"]
size = Vector3(90, 6, 18)
[sub_resource type="BoxMesh" id="ShoreMesh"]
size = Vector3(90, 6, 18)
[sub_resource type="BoxShape3D" id="DockShape"]
size = Vector3(7, 0.4, 25)
[sub_resource type="BoxMesh" id="DockMesh"]
size = Vector3(7, 0.4, 25)
[sub_resource type="BoxShape3D" id="DockRampShape"]
size = Vector3(7, 0.35, 4)
[sub_resource type="BoxMesh" id="DockRampMesh"]
size = Vector3(7, 0.35, 4)
[sub_resource type="CylinderMesh" id="TowerMesh"]
top_radius = 2.4
bottom_radius = 3.4
height = 13
[sub_resource type="CylinderMesh" id="BeaconMesh"]
top_radius = 1.4
bottom_radius = 1.4
height = 2.5
[sub_resource type="BoxMesh" id="CraneArmMesh"]
size = Vector3(1, 1, 10)
[sub_resource type="PlaneMesh" id="WaterMesh"]
size = Vector2(90, 54)
[sub_resource type="BoxShape3D" id="WaterShape"]
size = Vector3(90, 0.2, 54)
[sub_resource type="BoxShape3D" id="RecoveryShape"]
size = Vector3(90, 5, 54)
[sub_resource type="StandardMaterial3D" id="ShoreMaterial"]
albedo_color = Color(0.7, 0.66, 0.5, 1)
[sub_resource type="StandardMaterial3D" id="DockMaterial"]
albedo_color = Color(0.58, 0.4, 0.2, 1)
[sub_resource type="StandardMaterial3D" id="TowerMaterial"]
albedo_color = Color(0.92, 0.9, 0.76, 1)
[sub_resource type="StandardMaterial3D" id="BeaconMaterial"]
albedo_color = Color(0.95, 0.28, 0.22, 1)
[sub_resource type="StandardMaterial3D" id="WaterMaterial"]
transparency = 1
albedo_color = Color(0.04, 0.3, 0.62, 0.84)
[node name="CoastalDockRegion" type="Node3D"]
script = ExtResource("1_region")
region_id = &"coast"
[node name="Visuals" type="Node3D" parent="."]
[node name="Shore" type="MeshInstance3D" parent="Visuals"]
position = Vector3(0, -3, 22)
mesh = SubResource("ShoreMesh")
material_override = SubResource("ShoreMaterial")
[node name="Ocean" type="MeshInstance3D" parent="Visuals"]
position = Vector3(0, 0.2, -14)
mesh = SubResource("WaterMesh")
material_override = SubResource("WaterMaterial")
[node name="MainDock" type="MeshInstance3D" parent="Visuals"]
position = Vector3(0, 0.45, -3.5)
mesh = SubResource("DockMesh")
material_override = SubResource("DockMaterial")
[node name="DockApproachRamp" type="MeshInstance3D" parent="Visuals"]
position = Vector3(0, 0.155, 11)
rotation_degrees = Vector3(9, 0, 0)
mesh = SubResource("DockRampMesh")
material_override = SubResource("DockMaterial")
[node name="Lighthouse" type="MeshInstance3D" parent="Visuals"]
position = Vector3(-32, 6.5, 20)
mesh = SubResource("TowerMesh")
material_override = SubResource("TowerMaterial")
[node name="Beacon" type="MeshInstance3D" parent="Visuals"]
position = Vector3(-32, 14, 20)
mesh = SubResource("BeaconMesh")
material_override = SubResource("BeaconMaterial")
[node name="CraneArm" type="MeshInstance3D" parent="Visuals"]
position = Vector3(17, 5, 19)
rotation_degrees = Vector3(0, 0, 60)
mesh = SubResource("CraneArmMesh")
material_override = SubResource("BeaconMaterial")
[node name="CoastLabel" type="Label3D" parent="Visuals"]
position = Vector3(25, 3.2, 23)
text = "COAST"
font_size = 38
outline_size = 8
billboard = 1
no_depth_test = true
[node name="StaticCollision" type="Node3D" parent="."]
[node name="Shore" type="StaticBody3D" parent="StaticCollision"]
[node name="Shape" type="CollisionShape3D" parent="StaticCollision/Shore"]
position = Vector3(0, -3, 22)
shape = SubResource("ShoreShape")
[node name="MainDock" type="StaticBody3D" parent="StaticCollision"]
[node name="Shape" type="CollisionShape3D" parent="StaticCollision/MainDock"]
position = Vector3(0, 0.45, -3.5)
shape = SubResource("DockShape")
[node name="DockApproachRamp" type="StaticBody3D" parent="StaticCollision"]
[node name="Shape" type="CollisionShape3D" parent="StaticCollision/DockApproachRamp"]
position = Vector3(0, 0.155, 11)
rotation_degrees = Vector3(9, 0, 0)
shape = SubResource("DockRampShape")
[node name="FishingWater" type="Node3D" parent="."]
[node name="CoastalWater" type="Area3D" parent="FishingWater"]
position = Vector3(0, 0.2, -14)
collision_layer = 4
collision_mask = 0
monitoring = false
script = ExtResource("2_water")
location_tags = Array[StringName]([&"coast"])
fish_pool = ExtResource("3_pool")
[node name="Shape" type="CollisionShape3D" parent="FishingWater/CoastalWater"]
shape = SubResource("WaterShape")
[node name="WaterRecovery" type="Node3D" parent="."]
[node name="CoastalRecovery" type="Area3D" parent="WaterRecovery"]
position = Vector3(0, -2.3, -14)
collision_layer = 8
collision_mask = 2
script = ExtResource("4_trigger")
surface_height = 0.2
[node name="Shape" type="CollisionShape3D" parent="WaterRecovery/CoastalRecovery"]
shape = SubResource("RecoveryShape")
[node name="SafeRespawns" type="Node3D" parent="."]
[node name="DockApproach" type="Marker3D" parent="SafeRespawns"]
position = Vector3(8, 0.58, 23)
rotation_degrees = Vector3(0, 180, 0)
script = ExtResource("5_safe")
[node name="DockMidpoint" type="Marker3D" parent="SafeRespawns"]
position = Vector3(0, 1.23, 0)
rotation_degrees = Vector3(0, 180, 0)
script = ExtResource("5_safe")
[node name="LighthouseShore" type="Marker3D" parent="SafeRespawns"]
position = Vector3(-24, 0.58, 24)
rotation_degrees = Vector3(0, -135, 0)
script = ExtResource("5_safe")

View file

@ -0,0 +1,43 @@
class_name GrayboxRegion
extends Node3D
@export var region_id: StringName
@export var fishable_water_root: NodePath = ^"FishingWater"
@export var water_recovery_root: NodePath = ^"WaterRecovery"
@export var safe_respawns_root: NodePath = ^"SafeRespawns"
func get_fishable_water_regions() -> Array[FishableWaterRegion]:
var regions: Array[FishableWaterRegion] = []
var root: Node = get_node_or_null(fishable_water_root)
if root == null:
return regions
for child: Node in root.get_children():
var water: FishableWaterRegion = child as FishableWaterRegion
if water != null:
regions.append(water)
return regions
func get_water_recovery_triggers() -> Array[PlayerWaterTrigger]:
var triggers: Array[PlayerWaterTrigger] = []
var root: Node = get_node_or_null(water_recovery_root)
if root == null:
return triggers
for child: Node in root.get_children():
var trigger: PlayerWaterTrigger = child as PlayerWaterTrigger
if trigger != null:
triggers.append(trigger)
return triggers
func get_safe_respawn_points() -> Array[SafeRespawnPoint]:
var points: Array[SafeRespawnPoint] = []
var root: Node = get_node_or_null(safe_respawns_root)
if root == null:
return points
for child: Node in root.get_children():
var point: SafeRespawnPoint = child as SafeRespawnPoint
if point != null:
points.append(point)
return points

View file

@ -0,0 +1 @@
uid://bb1j0uhvrbf5n

View file

@ -0,0 +1,141 @@
[gd_scene load_steps=17 format=3]
[ext_resource type="Script" path="res://world/regions/graybox_region.gd" id="1_region"]
[ext_resource type="Script" path="res://world/fishable_water_region.gd" id="2_water"]
[ext_resource type="Resource" path="res://fish/pools/test_water_pool.tres" id="3_pool"]
[ext_resource type="Script" path="res://world/player_water_trigger.gd" id="4_trigger"]
[ext_resource type="Script" path="res://world/safe_respawn_point.gd" id="5_safe"]
[sub_resource type="BoxShape3D" id="BankNSShape"]
size = Vector3(58, 6, 10)
[sub_resource type="BoxShape3D" id="BankEWShape"]
size = Vector3(8, 6, 36)
[sub_resource type="BoxMesh" id="BankNSMesh"]
size = Vector3(58, 6, 10)
[sub_resource type="BoxMesh" id="BankEWMesh"]
size = Vector3(8, 6, 36)
[sub_resource type="BoxShape3D" id="DockShape"]
size = Vector3(10, 0.4, 7)
[sub_resource type="BoxMesh" id="DockMesh"]
size = Vector3(10, 0.4, 7)
[sub_resource type="BoxShape3D" id="DockRampShape"]
size = Vector3(4, 0.35, 7)
[sub_resource type="BoxMesh" id="DockRampMesh"]
size = Vector3(4, 0.35, 7)
[sub_resource type="PlaneMesh" id="WaterMesh"]
size = Vector2(42, 36)
[sub_resource type="BoxShape3D" id="WaterShape"]
size = Vector3(42, 0.2, 36)
[sub_resource type="BoxShape3D" id="RecoveryShape"]
size = Vector3(42, 5, 36)
[sub_resource type="StandardMaterial3D" id="GrassMaterial"]
albedo_color = Color(0.34, 0.65, 0.3, 1)
[sub_resource type="StandardMaterial3D" id="DockMaterial"]
albedo_color = Color(0.55, 0.34, 0.16, 1)
[sub_resource type="StandardMaterial3D" id="WaterMaterial"]
transparency = 1
albedo_color = Color(0.08, 0.43, 0.75, 0.82)
[node name="LakeRegion" type="Node3D"]
script = ExtResource("1_region")
region_id = &"lake"
[node name="Visuals" type="Node3D" parent="."]
[node name="NorthBank" type="MeshInstance3D" parent="Visuals"]
position = Vector3(0, -3, 23)
mesh = SubResource("BankNSMesh")
material_override = SubResource("GrassMaterial")
[node name="SouthBank" type="MeshInstance3D" parent="Visuals"]
position = Vector3(0, -3, -23)
mesh = SubResource("BankNSMesh")
material_override = SubResource("GrassMaterial")
[node name="WestBank" type="MeshInstance3D" parent="Visuals"]
position = Vector3(-25, -3, 0)
mesh = SubResource("BankEWMesh")
material_override = SubResource("GrassMaterial")
[node name="EastBank" type="MeshInstance3D" parent="Visuals"]
position = Vector3(25, -3, 0)
mesh = SubResource("BankEWMesh")
material_override = SubResource("GrassMaterial")
[node name="Water" type="MeshInstance3D" parent="Visuals"]
position = Vector3(0, 0.2, 0)
mesh = SubResource("WaterMesh")
material_override = SubResource("WaterMaterial")
[node name="WestDock" type="MeshInstance3D" parent="Visuals"]
position = Vector3(-12, 0.45, 0)
mesh = SubResource("DockMesh")
material_override = SubResource("DockMaterial")
[node name="WestDockRamp" type="MeshInstance3D" parent="Visuals"]
position = Vector3(-19, 0.155, 0)
rotation_degrees = Vector3(0, 0, 9)
mesh = SubResource("DockRampMesh")
material_override = SubResource("DockMaterial")
[node name="LakeLabel" type="Label3D" parent="Visuals"]
position = Vector3(-25, 3, 20)
text = "LAKE"
font_size = 38
outline_size = 8
billboard = 1
no_depth_test = true
[node name="StaticCollision" type="Node3D" parent="."]
[node name="NorthBank" type="StaticBody3D" parent="StaticCollision"]
[node name="Shape" type="CollisionShape3D" parent="StaticCollision/NorthBank"]
position = Vector3(0, -3, 23)
shape = SubResource("BankNSShape")
[node name="SouthBank" type="StaticBody3D" parent="StaticCollision"]
[node name="Shape" type="CollisionShape3D" parent="StaticCollision/SouthBank"]
position = Vector3(0, -3, -23)
shape = SubResource("BankNSShape")
[node name="WestBank" type="StaticBody3D" parent="StaticCollision"]
[node name="Shape" type="CollisionShape3D" parent="StaticCollision/WestBank"]
position = Vector3(-25, -3, 0)
shape = SubResource("BankEWShape")
[node name="EastBank" type="StaticBody3D" parent="StaticCollision"]
[node name="Shape" type="CollisionShape3D" parent="StaticCollision/EastBank"]
position = Vector3(25, -3, 0)
shape = SubResource("BankEWShape")
[node name="WestDock" type="StaticBody3D" parent="StaticCollision"]
[node name="Shape" type="CollisionShape3D" parent="StaticCollision/WestDock"]
position = Vector3(-12, 0.45, 0)
shape = SubResource("DockShape")
[node name="WestDockRamp" type="StaticBody3D" parent="StaticCollision"]
[node name="Shape" type="CollisionShape3D" parent="StaticCollision/WestDockRamp"]
position = Vector3(-19, 0.155, 0)
rotation_degrees = Vector3(0, 0, 9)
shape = SubResource("DockRampShape")
[node name="FishingWater" type="Node3D" parent="."]
[node name="LakeWater" type="Area3D" parent="FishingWater"]
position = Vector3(0, 0.2, 0)
collision_layer = 4
collision_mask = 0
monitoring = false
script = ExtResource("2_water")
location_tags = Array[StringName]([&"lake"])
fish_pool = ExtResource("3_pool")
[node name="Shape" type="CollisionShape3D" parent="FishingWater/LakeWater"]
shape = SubResource("WaterShape")
[node name="WaterRecovery" type="Node3D" parent="."]
[node name="LakeRecovery" type="Area3D" parent="WaterRecovery"]
position = Vector3(0, -2.3, 0)
collision_layer = 8
collision_mask = 2
script = ExtResource("4_trigger")
surface_height = 0.2
[node name="Shape" type="CollisionShape3D" parent="WaterRecovery/LakeRecovery"]
shape = SubResource("RecoveryShape")
[node name="SafeRespawns" type="Node3D" parent="."]
[node name="WestDockApproach" type="Marker3D" parent="SafeRespawns"]
position = Vector3(-25, 0.58, 8)
rotation_degrees = Vector3(0, -90, 0)
script = ExtResource("5_safe")
[node name="NorthShore" type="Marker3D" parent="SafeRespawns"]
position = Vector3(0, 0.58, 24)
rotation_degrees = Vector3(0, 180, 0)
script = ExtResource("5_safe")
[node name="SouthEastShore" type="Marker3D" parent="SafeRespawns"]
position = Vector3(25, 0.58, -23)
rotation_degrees = Vector3(0, 45, 0)
script = ExtResource("5_safe")

View file

@ -0,0 +1,164 @@
[gd_scene load_steps=20 format=3]
[ext_resource type="Script" path="res://world/regions/graybox_region.gd" id="1_region"]
[ext_resource type="Script" path="res://world/fishable_water_region.gd" id="2_water"]
[ext_resource type="Resource" path="res://fish/pools/test_water_pool.tres" id="3_pool"]
[ext_resource type="Script" path="res://world/player_water_trigger.gd" id="4_trigger"]
[ext_resource type="Script" path="res://world/safe_respawn_point.gd" id="5_safe"]
[sub_resource type="BoxShape3D" id="BankNSShape"]
size = Vector3(50, 6, 8)
[sub_resource type="BoxShape3D" id="BankEWShape"]
size = Vector3(8, 6, 30)
[sub_resource type="BoxMesh" id="BankNSMesh"]
size = Vector3(50, 6, 8)
[sub_resource type="BoxMesh" id="BankEWMesh"]
size = Vector3(8, 6, 30)
[sub_resource type="BoxShape3D" id="BoardwalkShape"]
size = Vector3(6, 0.4, 22)
[sub_resource type="BoxMesh" id="BoardwalkMesh"]
size = Vector3(6, 0.4, 22)
[sub_resource type="BoxShape3D" id="BoardwalkRampShape"]
size = Vector3(6, 0.35, 4)
[sub_resource type="BoxMesh" id="BoardwalkRampMesh"]
size = Vector3(6, 0.35, 4)
[sub_resource type="CylinderMesh" id="ReedMesh"]
top_radius = 0.06
bottom_radius = 0.1
height = 2.2
[sub_resource type="PlaneMesh" id="WaterMesh"]
size = Vector2(38, 30)
[sub_resource type="BoxShape3D" id="WaterShape"]
size = Vector3(38, 0.2, 30)
[sub_resource type="BoxShape3D" id="RecoveryShape"]
size = Vector3(38, 5, 30)
[sub_resource type="StandardMaterial3D" id="BankMaterial"]
albedo_color = Color(0.38, 0.53, 0.27, 1)
[sub_resource type="StandardMaterial3D" id="BoardwalkMaterial"]
albedo_color = Color(0.48, 0.32, 0.18, 1)
[sub_resource type="StandardMaterial3D" id="ReedMaterial"]
albedo_color = Color(0.59, 0.67, 0.2, 1)
[sub_resource type="StandardMaterial3D" id="WaterMaterial"]
transparency = 1
albedo_color = Color(0.1, 0.48, 0.48, 0.8)
[node name="MarshRegion" type="Node3D"]
script = ExtResource("1_region")
region_id = &"marsh"
[node name="Visuals" type="Node3D" parent="."]
[node name="NorthBank" type="MeshInstance3D" parent="Visuals"]
position = Vector3(0, -3, 19)
mesh = SubResource("BankNSMesh")
material_override = SubResource("BankMaterial")
[node name="SouthBank" type="MeshInstance3D" parent="Visuals"]
position = Vector3(0, -3, -19)
mesh = SubResource("BankNSMesh")
material_override = SubResource("BankMaterial")
[node name="WestBank" type="MeshInstance3D" parent="Visuals"]
position = Vector3(-23, -3, 0)
mesh = SubResource("BankEWMesh")
material_override = SubResource("BankMaterial")
[node name="EastBank" type="MeshInstance3D" parent="Visuals"]
position = Vector3(23, -3, 0)
mesh = SubResource("BankEWMesh")
material_override = SubResource("BankMaterial")
[node name="Water" type="MeshInstance3D" parent="Visuals"]
position = Vector3(0, 0.2, 0)
mesh = SubResource("WaterMesh")
material_override = SubResource("WaterMaterial")
[node name="Boardwalk" type="MeshInstance3D" parent="Visuals"]
position = Vector3(0, 0.45, 0)
mesh = SubResource("BoardwalkMesh")
material_override = SubResource("BoardwalkMaterial")
[node name="BoardwalkNorthRamp" type="MeshInstance3D" parent="Visuals"]
position = Vector3(0, 0.155, 13)
rotation_degrees = Vector3(9, 0, 0)
mesh = SubResource("BoardwalkRampMesh")
material_override = SubResource("BoardwalkMaterial")
[node name="BoardwalkSouthRamp" type="MeshInstance3D" parent="Visuals"]
position = Vector3(0, 0.155, -13)
rotation_degrees = Vector3(-9, 0, 0)
mesh = SubResource("BoardwalkRampMesh")
material_override = SubResource("BoardwalkMaterial")
[node name="ReedWest" type="MeshInstance3D" parent="Visuals"]
position = Vector3(-13, 1.1, -8)
mesh = SubResource("ReedMesh")
material_override = SubResource("ReedMaterial")
[node name="ReedEast" type="MeshInstance3D" parent="Visuals"]
position = Vector3(12, 1.1, 7)
mesh = SubResource("ReedMesh")
material_override = SubResource("ReedMaterial")
[node name="MarshLabel" type="Label3D" parent="Visuals"]
position = Vector3(21, 3, 17)
text = "MARSH"
font_size = 36
outline_size = 8
billboard = 1
no_depth_test = true
[node name="StaticCollision" type="Node3D" parent="."]
[node name="NorthBank" type="StaticBody3D" parent="StaticCollision"]
[node name="Shape" type="CollisionShape3D" parent="StaticCollision/NorthBank"]
position = Vector3(0, -3, 19)
shape = SubResource("BankNSShape")
[node name="SouthBank" type="StaticBody3D" parent="StaticCollision"]
[node name="Shape" type="CollisionShape3D" parent="StaticCollision/SouthBank"]
position = Vector3(0, -3, -19)
shape = SubResource("BankNSShape")
[node name="WestBank" type="StaticBody3D" parent="StaticCollision"]
[node name="Shape" type="CollisionShape3D" parent="StaticCollision/WestBank"]
position = Vector3(-23, -3, 0)
shape = SubResource("BankEWShape")
[node name="EastBank" type="StaticBody3D" parent="StaticCollision"]
[node name="Shape" type="CollisionShape3D" parent="StaticCollision/EastBank"]
position = Vector3(23, -3, 0)
shape = SubResource("BankEWShape")
[node name="Boardwalk" type="StaticBody3D" parent="StaticCollision"]
[node name="Shape" type="CollisionShape3D" parent="StaticCollision/Boardwalk"]
position = Vector3(0, 0.45, 0)
shape = SubResource("BoardwalkShape")
[node name="BoardwalkNorthRamp" type="StaticBody3D" parent="StaticCollision"]
[node name="Shape" type="CollisionShape3D" parent="StaticCollision/BoardwalkNorthRamp"]
position = Vector3(0, 0.155, 13)
rotation_degrees = Vector3(9, 0, 0)
shape = SubResource("BoardwalkRampShape")
[node name="BoardwalkSouthRamp" type="StaticBody3D" parent="StaticCollision"]
[node name="Shape" type="CollisionShape3D" parent="StaticCollision/BoardwalkSouthRamp"]
position = Vector3(0, 0.155, -13)
rotation_degrees = Vector3(-9, 0, 0)
shape = SubResource("BoardwalkRampShape")
[node name="FishingWater" type="Node3D" parent="."]
[node name="MarshWater" type="Area3D" parent="FishingWater"]
position = Vector3(0, 0.2, 0)
collision_layer = 4
collision_mask = 0
monitoring = false
script = ExtResource("2_water")
location_tags = Array[StringName]([&"marsh"])
fish_pool = ExtResource("3_pool")
[node name="Shape" type="CollisionShape3D" parent="FishingWater/MarshWater"]
shape = SubResource("WaterShape")
[node name="WaterRecovery" type="Node3D" parent="."]
[node name="MarshRecovery" type="Area3D" parent="WaterRecovery"]
position = Vector3(0, -2.3, 0)
collision_layer = 8
collision_mask = 2
script = ExtResource("4_trigger")
surface_height = 0.2
[node name="Shape" type="CollisionShape3D" parent="WaterRecovery/MarshRecovery"]
shape = SubResource("RecoveryShape")
[node name="SafeRespawns" type="Node3D" parent="."]
[node name="BoardwalkNorth" type="Marker3D" parent="SafeRespawns"]
position = Vector3(8, 0.58, 19)
rotation_degrees = Vector3(0, 180, 0)
script = ExtResource("5_safe")
[node name="BoardwalkSouth" type="Marker3D" parent="SafeRespawns"]
position = Vector3(-8, 0.58, -19)
script = ExtResource("5_safe")
[node name="EastBank" type="Marker3D" parent="SafeRespawns"]
position = Vector3(23, 0.58, 7)
rotation_degrees = Vector3(0, 90, 0)
script = ExtResource("5_safe")

View file

@ -0,0 +1,143 @@
[gd_scene load_steps=19 format=3]
[ext_resource type="Script" path="res://world/regions/graybox_region.gd" id="1_region"]
[ext_resource type="Script" path="res://world/fishable_water_region.gd" id="2_water"]
[ext_resource type="Resource" path="res://fish/pools/test_water_pool.tres" id="3_pool"]
[ext_resource type="Script" path="res://world/player_water_trigger.gd" id="4_trigger"]
[ext_resource type="Script" path="res://world/safe_respawn_point.gd" id="5_safe"]
[sub_resource type="BoxShape3D" id="BankShape"]
size = Vector3(13, 6, 61)
[sub_resource type="BoxMesh" id="BankMesh"]
size = Vector3(13, 6, 61)
[sub_resource type="BoxShape3D" id="BridgeShape"]
size = Vector3(6, 0.4, 7)
[sub_resource type="BoxMesh" id="BridgeMesh"]
size = Vector3(6, 0.4, 7)
[sub_resource type="BoxShape3D" id="BridgeRampShape"]
size = Vector3(4, 0.35, 7)
[sub_resource type="BoxMesh" id="BridgeRampMesh"]
size = Vector3(4, 0.35, 7)
[sub_resource type="BoxMesh" id="RailMesh"]
size = Vector3(14, 0.25, 0.25)
[sub_resource type="PlaneMesh" id="WaterMesh"]
size = Vector2(14, 58)
[sub_resource type="BoxShape3D" id="WaterShape"]
size = Vector3(14, 0.2, 58)
[sub_resource type="BoxShape3D" id="RecoveryShape"]
size = Vector3(14, 5, 58)
[sub_resource type="StandardMaterial3D" id="BankMaterial"]
albedo_color = Color(0.31, 0.61, 0.37, 1)
[sub_resource type="StandardMaterial3D" id="BridgeMaterial"]
albedo_color = Color(0.58, 0.58, 0.54, 1)
[sub_resource type="StandardMaterial3D" id="RailMaterial"]
albedo_color = Color(0.3, 0.32, 0.34, 1)
[sub_resource type="StandardMaterial3D" id="WaterMaterial"]
transparency = 1
albedo_color = Color(0.12, 0.48, 0.72, 0.8)
[node name="RiverRegion" type="Node3D"]
script = ExtResource("1_region")
region_id = &"river"
[node name="Visuals" type="Node3D" parent="."]
[node name="WestBank" type="MeshInstance3D" parent="Visuals"]
position = Vector3(-13.5, -3, -1.5)
mesh = SubResource("BankMesh")
material_override = SubResource("BankMaterial")
[node name="EastBank" type="MeshInstance3D" parent="Visuals"]
position = Vector3(13.5, -3, -1.5)
mesh = SubResource("BankMesh")
material_override = SubResource("BankMaterial")
[node name="Water" type="MeshInstance3D" parent="Visuals"]
position = Vector3(0, 0.2, 0)
mesh = SubResource("WaterMesh")
material_override = SubResource("WaterMaterial")
[node name="Bridge" type="MeshInstance3D" parent="Visuals"]
position = Vector3(0, 0.45, 7)
mesh = SubResource("BridgeMesh")
material_override = SubResource("BridgeMaterial")
[node name="WestBridgeRamp" type="MeshInstance3D" parent="Visuals"]
position = Vector3(-5, 0.155, 7)
rotation_degrees = Vector3(0, 0, 9)
mesh = SubResource("BridgeRampMesh")
material_override = SubResource("BridgeMaterial")
[node name="EastBridgeRamp" type="MeshInstance3D" parent="Visuals"]
position = Vector3(5, 0.155, 7)
rotation_degrees = Vector3(0, 0, -9)
mesh = SubResource("BridgeRampMesh")
material_override = SubResource("BridgeMaterial")
[node name="NorthRail" type="MeshInstance3D" parent="Visuals"]
position = Vector3(0, 1.15, 10.2)
mesh = SubResource("RailMesh")
material_override = SubResource("RailMaterial")
[node name="SouthRail" type="MeshInstance3D" parent="Visuals"]
position = Vector3(0, 1.15, 3.8)
mesh = SubResource("RailMesh")
material_override = SubResource("RailMaterial")
[node name="RiverLabel" type="Label3D" parent="Visuals"]
position = Vector3(-16, 3, 20)
text = "RIVER"
font_size = 34
outline_size = 7
billboard = 1
no_depth_test = true
[node name="StaticCollision" type="Node3D" parent="."]
[node name="WestBank" type="StaticBody3D" parent="StaticCollision"]
[node name="Shape" type="CollisionShape3D" parent="StaticCollision/WestBank"]
position = Vector3(-13.5, -3, -1.5)
shape = SubResource("BankShape")
[node name="EastBank" type="StaticBody3D" parent="StaticCollision"]
[node name="Shape" type="CollisionShape3D" parent="StaticCollision/EastBank"]
position = Vector3(13.5, -3, -1.5)
shape = SubResource("BankShape")
[node name="Bridge" type="StaticBody3D" parent="StaticCollision"]
[node name="Shape" type="CollisionShape3D" parent="StaticCollision/Bridge"]
position = Vector3(0, 0.45, 7)
shape = SubResource("BridgeShape")
[node name="WestBridgeRamp" type="StaticBody3D" parent="StaticCollision"]
[node name="Shape" type="CollisionShape3D" parent="StaticCollision/WestBridgeRamp"]
position = Vector3(-5, 0.155, 7)
rotation_degrees = Vector3(0, 0, 9)
shape = SubResource("BridgeRampShape")
[node name="EastBridgeRamp" type="StaticBody3D" parent="StaticCollision"]
[node name="Shape" type="CollisionShape3D" parent="StaticCollision/EastBridgeRamp"]
position = Vector3(5, 0.155, 7)
rotation_degrees = Vector3(0, 0, -9)
shape = SubResource("BridgeRampShape")
[node name="FishingWater" type="Node3D" parent="."]
[node name="RiverWater" type="Area3D" parent="FishingWater"]
position = Vector3(0, 0.2, 0)
collision_layer = 4
collision_mask = 0
monitoring = false
script = ExtResource("2_water")
location_tags = Array[StringName]([&"river"])
fish_pool = ExtResource("3_pool")
[node name="Shape" type="CollisionShape3D" parent="FishingWater/RiverWater"]
shape = SubResource("WaterShape")
[node name="WaterRecovery" type="Node3D" parent="."]
[node name="RiverRecovery" type="Area3D" parent="WaterRecovery"]
position = Vector3(0, -2.3, 0)
collision_layer = 8
collision_mask = 2
script = ExtResource("4_trigger")
surface_height = 0.2
[node name="Shape" type="CollisionShape3D" parent="WaterRecovery/RiverRecovery"]
shape = SubResource("RecoveryShape")
[node name="SafeRespawns" type="Node3D" parent="."]
[node name="BridgeWest" type="Marker3D" parent="SafeRespawns"]
position = Vector3(-15, 0.58, 14)
rotation_degrees = Vector3(0, -90, 0)
script = ExtResource("5_safe")
[node name="NorthEastBank" type="Marker3D" parent="SafeRespawns"]
position = Vector3(14, 0.58, 24)
rotation_degrees = Vector3(0, 90, 0)
script = ExtResource("5_safe")
[node name="SouthWestBank" type="Marker3D" parent="SafeRespawns"]
position = Vector3(-14, 0.58, -25)
rotation_degrees = Vector3(0, -90, 0)
script = ExtResource("5_safe")

View file

@ -0,0 +1,114 @@
[gd_scene load_steps=14 format=3]
[ext_resource type="Script" path="res://world/regions/graybox_region.gd" id="1_region"]
[ext_resource type="Script" path="res://world/fishable_water_region.gd" id="2_water"]
[ext_resource type="Resource" path="res://fish/pools/test_water_pool.tres" id="3_pool"]
[ext_resource type="Script" path="res://world/player_water_trigger.gd" id="4_trigger"]
[ext_resource type="Script" path="res://world/safe_respawn_point.gd" id="5_safe"]
[sub_resource type="BoxShape3D" id="BankNSShape"]
size = Vector3(36, 6, 8)
[sub_resource type="BoxShape3D" id="BankEWShape"]
size = Vector3(6, 6, 20)
[sub_resource type="BoxMesh" id="BankNSMesh"]
size = Vector3(36, 6, 8)
[sub_resource type="BoxMesh" id="BankEWMesh"]
size = Vector3(6, 6, 20)
[sub_resource type="PlaneMesh" id="WaterMesh"]
size = Vector2(24, 20)
[sub_resource type="BoxShape3D" id="WaterShape"]
size = Vector3(24, 0.2, 20)
[sub_resource type="BoxShape3D" id="RecoveryShape"]
size = Vector3(24, 5, 20)
[sub_resource type="StandardMaterial3D" id="GrassMaterial"]
albedo_color = Color(0.43, 0.75, 0.34, 1)
[sub_resource type="StandardMaterial3D" id="WaterMaterial"]
transparency = 1
albedo_color = Color(0.16, 0.58, 0.78, 0.78)
roughness = 0.25
[node name="StarterPondRegion" type="Node3D"]
script = ExtResource("1_region")
region_id = &"starter_pond"
[node name="Visuals" type="Node3D" parent="."]
[node name="NorthBank" type="MeshInstance3D" parent="Visuals"]
position = Vector3(0, -3, 14)
mesh = SubResource("BankNSMesh")
material_override = SubResource("GrassMaterial")
[node name="SouthBank" type="MeshInstance3D" parent="Visuals"]
position = Vector3(0, -3, -14)
mesh = SubResource("BankNSMesh")
material_override = SubResource("GrassMaterial")
[node name="WestBank" type="MeshInstance3D" parent="Visuals"]
position = Vector3(-15, -3, 0)
mesh = SubResource("BankEWMesh")
material_override = SubResource("GrassMaterial")
[node name="EastBank" type="MeshInstance3D" parent="Visuals"]
position = Vector3(15, -3, 0)
mesh = SubResource("BankEWMesh")
material_override = SubResource("GrassMaterial")
[node name="Water" type="MeshInstance3D" parent="Visuals"]
position = Vector3(0, 0.2, 0)
mesh = SubResource("WaterMesh")
material_override = SubResource("WaterMaterial")
[node name="PondLabel" type="Label3D" parent="Visuals"]
position = Vector3(-14, 2.4, 11)
text = "POND"
font_size = 34
outline_size = 7
billboard = 1
no_depth_test = true
[node name="StaticCollision" type="Node3D" parent="."]
[node name="NorthBank" type="StaticBody3D" parent="StaticCollision"]
[node name="Shape" type="CollisionShape3D" parent="StaticCollision/NorthBank"]
position = Vector3(0, -3, 14)
shape = SubResource("BankNSShape")
[node name="SouthBank" type="StaticBody3D" parent="StaticCollision"]
[node name="Shape" type="CollisionShape3D" parent="StaticCollision/SouthBank"]
position = Vector3(0, -3, -14)
shape = SubResource("BankNSShape")
[node name="WestBank" type="StaticBody3D" parent="StaticCollision"]
[node name="Shape" type="CollisionShape3D" parent="StaticCollision/WestBank"]
position = Vector3(-15, -3, 0)
shape = SubResource("BankEWShape")
[node name="EastBank" type="StaticBody3D" parent="StaticCollision"]
[node name="Shape" type="CollisionShape3D" parent="StaticCollision/EastBank"]
position = Vector3(15, -3, 0)
shape = SubResource("BankEWShape")
[node name="FishingWater" type="Node3D" parent="."]
[node name="StarterPondWater" type="Area3D" parent="FishingWater"]
position = Vector3(0, 0.2, 0)
collision_layer = 4
collision_mask = 0
monitoring = false
script = ExtResource("2_water")
location_tags = Array[StringName]([&"starter_pond"])
fish_pool = ExtResource("3_pool")
[node name="Shape" type="CollisionShape3D" parent="FishingWater/StarterPondWater"]
shape = SubResource("WaterShape")
[node name="WaterRecovery" type="Node3D" parent="."]
[node name="StarterPondRecovery" type="Area3D" parent="WaterRecovery"]
position = Vector3(0, -2.3, 0)
collision_layer = 8
collision_mask = 2
script = ExtResource("4_trigger")
surface_height = 0.2
[node name="Shape" type="CollisionShape3D" parent="WaterRecovery/StarterPondRecovery"]
shape = SubResource("RecoveryShape")
[node name="SafeRespawns" type="Node3D" parent="."]
[node name="EastShore" type="Marker3D" parent="SafeRespawns"]
position = Vector3(15, 0.58, 4)
rotation_degrees = Vector3(0, 90, 0)
script = ExtResource("5_safe")
[node name="NorthShore" type="Marker3D" parent="SafeRespawns"]
position = Vector3(0, 0.58, 14)
rotation_degrees = Vector3(0, 180, 0)
script = ExtResource("5_safe")
[node name="SouthShore" type="Marker3D" parent="SafeRespawns"]
position = Vector3(0, 0.58, -14)
script = ExtResource("5_safe")

View file

@ -0,0 +1,179 @@
[gd_scene load_steps=16 format=3]
[ext_resource type="Script" path="res://world/regions/graybox_region.gd" id="1_region"]
[ext_resource type="Script" path="res://world/safe_respawn_point.gd" id="2_safe"]
[ext_resource type="PackedScene" path="res://world/interactables/fishing_shop_world.tscn" id="3_shop"]
[ext_resource type="PackedScene" path="res://world/interactables/pelican_buyer_world.tscn" id="4_pelican"]
[sub_resource type="BoxShape3D" id="GroundShape"]
size = Vector3(48, 6, 36)
[sub_resource type="BoxShape3D" id="BuildingShape"]
size = Vector3(8, 5, 7)
[sub_resource type="BoxMesh" id="GroundMesh"]
size = Vector3(48, 6, 36)
[sub_resource type="BoxMesh" id="PlazaMesh"]
size = Vector3(22, 0.02, 18)
[sub_resource type="BoxMesh" id="BuildingMesh"]
size = Vector3(8, 5, 7)
[sub_resource type="CylinderMesh" id="RoofMesh"]
top_radius = 0
bottom_radius = 5.5
height = 3
radial_segments = 4
[sub_resource type="CylinderMesh" id="TowerMesh"]
top_radius = 2.4
bottom_radius = 2.4
height = 8
[sub_resource type="CylinderMesh" id="TowerTankMesh"]
top_radius = 3.2
bottom_radius = 3.2
height = 3.2
[sub_resource type="BoxMesh" id="PavilionRoofMesh"]
size = Vector3(9, 0.35, 7)
[sub_resource type="BoxMesh" id="PavilionPostMesh"]
size = Vector3(0.3, 3.2, 0.3)
[sub_resource type="StandardMaterial3D" id="GrassMaterial"]
albedo_color = Color(0.37, 0.68, 0.3, 1)
[sub_resource type="StandardMaterial3D" id="PlazaMaterial"]
albedo_color = Color(0.76, 0.69, 0.54, 1)
[sub_resource type="StandardMaterial3D" id="BuildingMaterial"]
albedo_color = Color(0.92, 0.55, 0.34, 1)
[sub_resource type="StandardMaterial3D" id="RoofMaterial"]
albedo_color = Color(0.2, 0.46, 0.53, 1)
[sub_resource type="StandardMaterial3D" id="LandmarkMaterial"]
albedo_color = Color(0.95, 0.82, 0.28, 1)
[node name="VillageRegion" type="Node3D"]
script = ExtResource("1_region")
region_id = &"village"
[node name="Visuals" type="Node3D" parent="."]
[node name="Ground" type="MeshInstance3D" parent="Visuals"]
position = Vector3(0, -3, 0)
mesh = SubResource("GroundMesh")
material_override = SubResource("GrassMaterial")
[node name="Plaza" type="MeshInstance3D" parent="Visuals"]
position = Vector3(0, 0.011, 0)
mesh = SubResource("PlazaMesh")
material_override = SubResource("PlazaMaterial")
[node name="WestBuilding" type="MeshInstance3D" parent="Visuals"]
position = Vector3(-17, 2.5, 9)
mesh = SubResource("BuildingMesh")
material_override = SubResource("BuildingMaterial")
[node name="WestRoof" type="MeshInstance3D" parent="Visuals"]
position = Vector3(-17, 6.1, 9)
rotation_degrees = Vector3(0, 45, 0)
mesh = SubResource("RoofMesh")
material_override = SubResource("RoofMaterial")
[node name="NorthBuilding" type="MeshInstance3D" parent="Visuals"]
position = Vector3(-7, 2.5, 13)
mesh = SubResource("BuildingMesh")
material_override = SubResource("BuildingMaterial")
[node name="NorthRoof" type="MeshInstance3D" parent="Visuals"]
position = Vector3(-7, 6.1, 13)
rotation_degrees = Vector3(0, 45, 0)
mesh = SubResource("RoofMesh")
material_override = SubResource("RoofMaterial")
[node name="WaterTower" type="MeshInstance3D" parent="Visuals"]
position = Vector3(18, 4, 11)
mesh = SubResource("TowerMesh")
material_override = SubResource("RoofMaterial")
[node name="WaterTank" type="MeshInstance3D" parent="Visuals"]
position = Vector3(18, 8.5, 11)
mesh = SubResource("TowerTankMesh")
material_override = SubResource("LandmarkMaterial")
[node name="PavilionRoof" type="MeshInstance3D" parent="Visuals"]
position = Vector3(-12, 3.3, -10)
mesh = SubResource("PavilionRoofMesh")
material_override = SubResource("LandmarkMaterial")
[node name="PavilionPostNW" type="MeshInstance3D" parent="Visuals"]
position = Vector3(-15.5, 1.6, -12.5)
mesh = SubResource("PavilionPostMesh")
material_override = SubResource("RoofMaterial")
[node name="PavilionPostSE" type="MeshInstance3D" parent="Visuals"]
position = Vector3(-8.5, 1.6, -7.5)
mesh = SubResource("PavilionPostMesh")
material_override = SubResource("RoofMaterial")
[node name="VillageLabel" type="Label3D" parent="Visuals"]
position = Vector3(0, 3.2, 7)
text = "VILLAGE"
font_size = 42
outline_size = 8
billboard = 1
no_depth_test = true
[node name="StaticCollision" type="Node3D" parent="."]
[node name="Ground" type="StaticBody3D" parent="StaticCollision"]
[node name="CollisionShape3D" type="CollisionShape3D" parent="StaticCollision/Ground"]
position = Vector3(0, -3, 0)
shape = SubResource("GroundShape")
[node name="WestBuilding" type="StaticBody3D" parent="StaticCollision"]
[node name="Shape" type="CollisionShape3D" parent="StaticCollision/WestBuilding"]
position = Vector3(-17, 2.5, 9)
shape = SubResource("BuildingShape")
[node name="NorthBuilding" type="StaticBody3D" parent="StaticCollision"]
[node name="Shape" type="CollisionShape3D" parent="StaticCollision/NorthBuilding"]
position = Vector3(-7, 2.5, 13)
shape = SubResource("BuildingShape")
[node name="FishingWater" type="Node3D" parent="."]
[node name="WaterRecovery" type="Node3D" parent="."]
[node name="SafeRespawns" type="Node3D" parent="."]
[node name="VillageCenter" type="Marker3D" parent="SafeRespawns"]
position = Vector3(0, 0.58, 2)
script = ExtResource("2_safe")
[node name="VillageWest" type="Marker3D" parent="SafeRespawns"]
position = Vector3(-19, 0.58, -2)
rotation_degrees = Vector3(0, -90, 0)
script = ExtResource("2_safe")
[node name="VillageSouth" type="Marker3D" parent="SafeRespawns"]
position = Vector3(5, 0.58, -14)
rotation_degrees = Vector3(0, 180, 0)
script = ExtResource("2_safe")
[node name="Interactables" type="Node3D" parent="."]
[node name="FishingShopWorld" parent="Interactables" instance=ExtResource("3_shop")]
position = Vector3(12, 0, 3)
rotation_degrees = Vector3(0, -25, 0)
[node name="PelicanCoolerPerch" parent="Interactables" instance=ExtResource("4_pelican")]
position = Vector3(-19, 0, -9)
rotation_degrees = Vector3(0, 20, 0)

View file

@ -5,23 +5,52 @@ const FishingShopInteractionType = preload(
"res://world/fishing_shop_interaction.gd"
)
@onready var _water_trigger: PlayerWaterTrigger = %PlayerWaterTrigger
@onready var _safe_respawn_points: Node3D = %SafeRespawnPoints
@onready var _fishing_shop: FishingShopInteractionType = %FishingShopInteraction
@onready var _regions_root: Node3D = $Regions
@onready var _below_world_failsafe: PlayerWaterTrigger = (
$Safety/BelowWorldFailsafe
)
@onready var _fishing_shop: FishingShopInteractionType = (
$Regions/VillageRegion/Interactables/FishingShopWorld/FishingShopInteraction
)
func get_player_water_trigger() -> PlayerWaterTrigger:
return _water_trigger
func get_player_water_triggers() -> Array[PlayerWaterTrigger]:
var triggers: Array[PlayerWaterTrigger] = []
for region: GrayboxRegion in _get_regions():
triggers.append_array(region.get_water_recovery_triggers())
triggers.append(_below_world_failsafe)
return triggers
func get_safe_respawn_points() -> Array[SafeRespawnPoint]:
var points: Array[SafeRespawnPoint] = []
for child: Node in _safe_respawn_points.get_children():
var point: SafeRespawnPoint = child as SafeRespawnPoint
if point != null:
points.append(point)
for region: GrayboxRegion in _get_regions():
points.append_array(region.get_safe_respawn_points())
return points
func get_fishing_shop() -> FishingShopInteractionType:
return _fishing_shop
func get_fishable_water_regions() -> Array[FishableWaterRegion]:
var waters: Array[FishableWaterRegion] = []
for region: GrayboxRegion in _get_regions():
waters.append_array(region.get_fishable_water_regions())
return waters
func get_pelican_convenience_landmark() -> Node3D:
return (
$Regions/VillageRegion/Interactables/PelicanCoolerPerch
as Node3D
)
func _get_regions() -> Array[GrayboxRegion]:
var regions: Array[GrayboxRegion] = []
for child: Node in _regions_root.get_children():
var region: GrayboxRegion = child as GrayboxRegion
if region != null:
regions.append(region)
return regions

View file

@ -1,204 +1,137 @@
[gd_scene load_steps=25 format=3]
[gd_scene load_steps=16 format=3]
[ext_resource type="Script" path="res://world/fishable_water_region.gd" id="1_water_region"]
[ext_resource type="Resource" path="res://fish/pools/test_water_pool.tres" id="2_fish_pool"]
[ext_resource type="Script" path="res://world/test_world.gd" id="3_world"]
[ext_resource type="Script" path="res://world/player_water_trigger.gd" id="4_water_trigger"]
[ext_resource type="Script" path="res://world/safe_respawn_point.gd" id="5_safe_point"]
[ext_resource type="Script" path="res://world/fishing_shop_interaction.gd" id="6_shop"]
[sub_resource type="BoxShape3D" id="GroundShape"]
size = Vector3(30, 1, 30)
[sub_resource type="BoxMesh" id="GroundMesh"]
size = Vector3(30, 1, 30)
[sub_resource type="StandardMaterial3D" id="GroundMaterial"]
albedo_color = Color(0.25, 0.52, 0.24, 1)
[sub_resource type="BoxShape3D" id="DockShape"]
size = Vector3(5, 0.5, 10)
[sub_resource type="BoxMesh" id="DockMesh"]
size = Vector3(5, 0.5, 10)
[sub_resource type="StandardMaterial3D" id="DockMaterial"]
albedo_color = Color(0.42, 0.25, 0.12, 1)
[sub_resource type="PlaneMesh" id="WaterMesh"]
size = Vector2(40, 25)
[sub_resource type="BoxShape3D" id="FishableWaterShape"]
size = Vector3(40, 0.16, 19.5)
[sub_resource type="BoxShape3D" id="FishableShoreShape"]
size = Vector3(17.5, 0.16, 5.5)
[sub_resource type="BoxShape3D" id="PlayerWaterShape"]
size = Vector3(40, 5, 19.5)
[sub_resource type="BoxShape3D" id="PlayerWaterShoreShape"]
size = Vector3(17.5, 5, 5.5)
[sub_resource type="StandardMaterial3D" id="WaterMaterial"]
transparency = 1
albedo_color = Color(0.1, 0.45, 0.7, 0.72)
roughness = 0.25
[ext_resource type="Script" path="res://world/test_world.gd" id="1_world"]
[ext_resource type="PackedScene" path="res://world/regions/village_region.tscn" id="2_village"]
[ext_resource type="PackedScene" path="res://world/regions/starter_pond_region.tscn" id="3_pond"]
[ext_resource type="PackedScene" path="res://world/regions/river_region.tscn" id="4_river"]
[ext_resource type="PackedScene" path="res://world/regions/lake_region.tscn" id="5_lake"]
[ext_resource type="PackedScene" path="res://world/regions/marsh_region.tscn" id="6_marsh"]
[ext_resource type="PackedScene" path="res://world/regions/coastal_dock_region.tscn" id="7_coast"]
[ext_resource type="Script" path="res://world/player_water_trigger.gd" id="8_water_trigger"]
[sub_resource type="Environment" id="Environment"]
background_mode = 1
background_color = Color(0.48, 0.72, 0.9, 1)
background_color = Color(0.48, 0.74, 0.92, 1)
ambient_light_source = 3
ambient_light_color = Color(0.65, 0.72, 0.8, 1)
ambient_light_energy = 0.65
ambient_light_color = Color(0.72, 0.78, 0.84, 1)
ambient_light_energy = 0.72
[sub_resource type="BoxMesh" id="ShopCounterMesh"]
size = Vector3(3.4, 1.25, 1.5)
[sub_resource type="BoxShape3D" id="SeabedShape"]
size = Vector3(180, 1, 220)
[sub_resource type="BoxMesh" id="SeabedMesh"]
size = Vector3(180, 1, 220)
[sub_resource type="StandardMaterial3D" id="SeabedMaterial"]
albedo_color = Color(0.18, 0.36, 0.27, 1)
[sub_resource type="BoxMesh" id="ShopRoofMesh"]
size = Vector3(4.2, 0.35, 2.2)
[sub_resource type="BoxShape3D" id="RiverPathShape"]
size = Vector3(40, 6, 8)
[sub_resource type="BoxMesh" id="RiverPathMesh"]
size = Vector3(40, 6, 8)
[sub_resource type="BoxShape3D" id="MarshPathShape"]
size = Vector3(5, 6, 10)
[sub_resource type="BoxMesh" id="MarshPathMesh"]
size = Vector3(5, 6, 10)
[sub_resource type="StandardMaterial3D" id="PathMaterial"]
albedo_color = Color(0.72, 0.62, 0.43, 1)
[sub_resource type="BoxMesh" id="ShopPostMesh"]
size = Vector3(0.25, 2.8, 0.25)
[sub_resource type="StandardMaterial3D" id="ShopPrimaryMaterial"]
albedo_color = Color(0.18, 0.72, 0.68, 1)
[sub_resource type="StandardMaterial3D" id="ShopAccentMaterial"]
albedo_color = Color(1, 0.72, 0.22, 1)
[sub_resource type="SphereShape3D" id="ShopInteractionShape"]
radius = 3.0
[sub_resource type="BoxShape3D" id="NorthSouthBoundsShape"]
size = Vector3(180, 12, 2)
[sub_resource type="BoxShape3D" id="EastWestBoundsShape"]
size = Vector3(2, 12, 220)
[sub_resource type="BoxShape3D" id="FailsafeShape"]
size = Vector3(178, 5, 218)
[node name="TestWorld" type="Node3D"]
script = ExtResource("3_world")
script = ExtResource("1_world")
[node name="WorldEnvironment" type="WorldEnvironment" parent="."]
[node name="Environment" type="Node3D" parent="."]
[node name="WorldEnvironment" type="WorldEnvironment" parent="Environment"]
environment = SubResource("Environment")
[node name="Sun" type="DirectionalLight3D" parent="."]
rotation_degrees = Vector3(-55, -35, 0)
[node name="Sun" type="DirectionalLight3D" parent="Environment"]
rotation_degrees = Vector3(-54, -32, 0)
light_energy = 1.1
shadow_enabled = true
[node name="Ground" type="StaticBody3D" parent="."]
[node name="SeabedBoundary" type="StaticBody3D" parent="."]
position = Vector3(0, -6.5, -38)
[node name="CollisionShape3D" type="CollisionShape3D" parent="Ground"]
shape = SubResource("GroundShape")
[node name="CollisionShape3D" type="CollisionShape3D" parent="SeabedBoundary"]
shape = SubResource("SeabedShape")
[node name="MeshInstance3D" type="MeshInstance3D" parent="Ground"]
mesh = SubResource("GroundMesh")
material_override = SubResource("GroundMaterial")
[node name="MeshInstance3D" type="MeshInstance3D" parent="SeabedBoundary"]
mesh = SubResource("SeabedMesh")
material_override = SubResource("SeabedMaterial")
[node name="Dock" type="StaticBody3D" parent="."]
position = Vector3(0, 0.75, -15)
[node name="Regions" type="Node3D" parent="."]
[node name="CollisionShape3D" type="CollisionShape3D" parent="Dock"]
shape = SubResource("DockShape")
[node name="VillageRegion" parent="Regions" instance=ExtResource("2_village")]
position = Vector3(0, 0, 15)
[node name="MeshInstance3D" type="MeshInstance3D" parent="Dock"]
mesh = SubResource("DockMesh")
material_override = SubResource("DockMaterial")
[node name="StarterPondRegion" parent="Regions" instance=ExtResource("3_pond")]
position = Vector3(-42, 0, 15)
[node name="Water" type="MeshInstance3D" parent="."]
position = Vector3(0, 0.2, -27)
mesh = SubResource("WaterMesh")
material_override = SubResource("WaterMaterial")
[node name="RiverRegion" parent="Regions" instance=ExtResource("4_river")]
position = Vector3(0, 0, -40)
[node name="FishableWater" type="Area3D" parent="."]
position = Vector3(0, 0.2, -29.75)
collision_layer = 4
collision_mask = 0
monitoring = false
script = ExtResource("1_water_region")
location_tags = Array[StringName]([&"test_lake"])
fish_pool = ExtResource("2_fish_pool")
[node name="LakeRegion" parent="Regions" instance=ExtResource("5_lake")]
position = Vector3(53, 0, -25)
[node name="CollisionShape3D" type="CollisionShape3D" parent="FishableWater"]
shape = SubResource("FishableWaterShape")
[node name="MarshRegion" parent="Regions" instance=ExtResource("6_marsh")]
position = Vector3(56, 0, 38)
[node name="ShoreLeft" type="CollisionShape3D" parent="FishableWater"]
position = Vector3(-11.25, 0, 12.5)
shape = SubResource("FishableShoreShape")
[node name="CoastalDockRegion" parent="Regions" instance=ExtResource("7_coast")]
position = Vector3(0, 0, -103)
[node name="ShoreRight" type="CollisionShape3D" parent="FishableWater"]
position = Vector3(11.25, 0, 12.5)
shape = SubResource("FishableShoreShape")
[node name="Connectors" type="Node3D" parent="."]
[node name="PlayerWaterTrigger" type="Area3D" parent="."]
unique_name_in_owner = true
position = Vector3(0, -2.3, -29.75)
[node name="VillageRiverPath" type="StaticBody3D" parent="Connectors"]
position = Vector3(0, -3, -7)
[node name="Shape" type="CollisionShape3D" parent="Connectors/VillageRiverPath"]
shape = SubResource("RiverPathShape")
[node name="Mesh" type="MeshInstance3D" parent="Connectors/VillageRiverPath"]
mesh = SubResource("RiverPathMesh")
material_override = SubResource("PathMaterial")
[node name="VillageMarshPath" type="StaticBody3D" parent="Connectors"]
position = Vector3(26.5, -3, 28)
[node name="Shape" type="CollisionShape3D" parent="Connectors/VillageMarshPath"]
shape = SubResource("MarshPathShape")
[node name="Mesh" type="MeshInstance3D" parent="Connectors/VillageMarshPath"]
mesh = SubResource("MarshPathMesh")
material_override = SubResource("PathMaterial")
[node name="Safety" type="Node3D" parent="."]
[node name="BelowWorldFailsafe" type="Area3D" parent="Safety"]
position = Vector3(0, -5, -38)
collision_layer = 8
collision_mask = 2
script = ExtResource("4_water_trigger")
script = ExtResource("8_water_trigger")
surface_height = 0.2
[node name="DeepWater" type="CollisionShape3D" parent="PlayerWaterTrigger"]
shape = SubResource("PlayerWaterShape")
[node name="FailsafeShape" type="CollisionShape3D" parent="Safety/BelowWorldFailsafe"]
shape = SubResource("FailsafeShape")
[node name="ShoreLeft" type="CollisionShape3D" parent="PlayerWaterTrigger"]
position = Vector3(-11.25, 0, 12.5)
shape = SubResource("PlayerWaterShoreShape")
[node name="WorldBounds" type="Node3D" parent="."]
[node name="ShoreRight" type="CollisionShape3D" parent="PlayerWaterTrigger"]
position = Vector3(11.25, 0, 12.5)
shape = SubResource("PlayerWaterShoreShape")
[node name="North" type="StaticBody3D" parent="WorldBounds"]
position = Vector3(0, 5, 72)
[node name="Shape" type="CollisionShape3D" parent="WorldBounds/North"]
shape = SubResource("NorthSouthBoundsShape")
[node name="SafeRespawnPoints" type="Node3D" parent="."]
unique_name_in_owner = true
[node name="South" type="StaticBody3D" parent="WorldBounds"]
position = Vector3(0, 5, -148)
[node name="Shape" type="CollisionShape3D" parent="WorldBounds/South"]
shape = SubResource("NorthSouthBoundsShape")
[node name="DockApproach" type="Marker3D" parent="SafeRespawnPoints"]
position = Vector3(0, 0.58, -9)
script = ExtResource("5_safe_point")
[node name="West" type="StaticBody3D" parent="WorldBounds"]
position = Vector3(-90, 5, -38)
[node name="Shape" type="CollisionShape3D" parent="WorldBounds/West"]
shape = SubResource("EastWestBoundsShape")
[node name="WestShore" type="Marker3D" parent="SafeRespawnPoints"]
position = Vector3(-11.5, 0.58, -11.5)
script = ExtResource("5_safe_point")
[node name="EastShore" type="Marker3D" parent="SafeRespawnPoints"]
position = Vector3(11.5, 0.58, -11.5)
script = ExtResource("5_safe_point")
[node name="DockEnd" type="Marker3D" parent="SafeRespawnPoints"]
position = Vector3(0, 1.08, -17)
script = ExtResource("5_safe_point")
[node name="FishingShop" type="Node3D" parent="."]
position = Vector3(8, 0, 5)
[node name="Counter" type="MeshInstance3D" parent="FishingShop"]
position = Vector3(0, 0.625, 0)
mesh = SubResource("ShopCounterMesh")
material_override = SubResource("ShopPrimaryMaterial")
[node name="Roof" type="MeshInstance3D" parent="FishingShop"]
position = Vector3(0, 2.25, 0)
mesh = SubResource("ShopRoofMesh")
material_override = SubResource("ShopAccentMaterial")
[node name="WestPost" type="MeshInstance3D" parent="FishingShop"]
position = Vector3(-1.55, 1.4, 0.55)
mesh = SubResource("ShopPostMesh")
material_override = SubResource("ShopPrimaryMaterial")
[node name="EastPost" type="MeshInstance3D" parent="FishingShop"]
position = Vector3(1.55, 1.4, 0.55)
mesh = SubResource("ShopPostMesh")
material_override = SubResource("ShopPrimaryMaterial")
[node name="ShopName" type="Label3D" parent="FishingShop"]
position = Vector3(0, 2.7, 0)
text = "Fishing Shop"
font_size = 36
outline_size = 8
billboard = 1
no_depth_test = true
[node name="FishingShopInteraction" type="Area3D" parent="FishingShop"]
unique_name_in_owner = true
position = Vector3(0, 1, 0)
collision_layer = 0
collision_mask = 2
script = ExtResource("6_shop")
[node name="CollisionShape3D" type="CollisionShape3D" parent="FishingShop/FishingShopInteraction"]
shape = SubResource("ShopInteractionShape")
[node name="East" type="StaticBody3D" parent="WorldBounds"]
position = Vector3(90, 5, -38)
[node name="Shape" type="CollisionShape3D" parent="WorldBounds/East"]
shape = SubResource("EastWestBoundsShape")

View file

@ -21,11 +21,12 @@ var _player: Player
var _fishing_spot: FishingSpot
var _game_ui: GameUI
var _screen_fade: ScreenFade
var _water_trigger: PlayerWaterTrigger
var _water_triggers: Array[PlayerWaterTrigger] = []
var _safe_points: Array[SafeRespawnPoint] = []
var _initial_spawn_transform: Transform3D
var _entry_position: Vector3
var _bob_base_position: Vector3
var _recovery_root_basis: Basis
var _bob_elapsed: float = 0.0
var _prior_movement_enabled: bool = true
var _prior_camera_input_enabled: bool = true
@ -38,20 +39,26 @@ func setup(
fishing_spot: FishingSpot,
game_ui: GameUI,
screen_fade: ScreenFade,
water_trigger: PlayerWaterTrigger,
water_triggers: Array[PlayerWaterTrigger],
safe_points: Array[SafeRespawnPoint],
) -> void:
_player = player
_fishing_spot = fishing_spot
_game_ui = game_ui
_screen_fade = screen_fade
_water_trigger = water_trigger
_water_triggers = water_triggers
_safe_points = safe_points
_initial_spawn_transform = player.global_transform
if not _water_trigger.recovery_requested.is_connected(
_on_recovery_requested
):
_water_trigger.recovery_requested.connect(_on_recovery_requested)
for water_trigger: PlayerWaterTrigger in _water_triggers:
if (
water_trigger != null
and not water_trigger.recovery_requested.is_connected(
_on_recovery_requested
)
):
water_trigger.recovery_requested.connect(
_on_recovery_requested
)
if not _screen_fade.transition_completed.is_connected(
_on_fade_transition_completed
):
@ -84,6 +91,7 @@ func _exit_tree() -> void:
if _screen_fade != null and is_instance_valid(_screen_fade):
_screen_fade.reset_immediately()
if _player != null and is_instance_valid(_player):
_player.restore_gameplay_orientation_after_recovery()
_player.set_water_recovery_active(false)
_player.set_movement_enabled(_prior_movement_enabled)
_player.set_camera_input_enabled(_prior_camera_input_enabled)
@ -105,7 +113,9 @@ func _on_recovery_requested(
recovery_starting.emit()
_generation += 1
_entry_position = _player.global_position
_recovery_root_basis = _player.global_basis
_fishing_spot.begin_water_recovery()
_player.prepare_for_water_recovery()
_prior_movement_enabled = _player.is_movement_enabled()
_prior_camera_input_enabled = _player.is_camera_input_enabled()
_player.set_movement_enabled(false)
@ -137,7 +147,7 @@ func _on_fade_transition_completed(
func _respawn_player() -> void:
var target_transform: Transform3D = _initial_spawn_transform
var target_position: Vector3 = _initial_spawn_transform.origin
var nearest_distance: float = INF
for point: SafeRespawnPoint in _safe_points:
if point == null or not is_instance_valid(point) or not point.enabled:
@ -147,13 +157,18 @@ func _respawn_player() -> void:
)
if distance < nearest_distance:
nearest_distance = distance
target_transform = point.global_transform
target_transform.origin.y += respawn_height_offset
_player.global_transform = target_transform
target_position = point.global_position
target_position.y += respawn_height_offset
var respawn_transform: Transform3D = _player.global_transform
respawn_transform.basis = _recovery_root_basis
respawn_transform.origin = target_position
_player.global_transform = respawn_transform
_player.restore_gameplay_orientation_after_recovery()
_player.velocity = Vector3.ZERO
func _finish_recovery() -> void:
_player.restore_gameplay_orientation_after_recovery()
_player.set_water_recovery_active(false)
_player.set_movement_enabled(_prior_movement_enabled)
_player.set_camera_input_enabled(_prior_camera_input_enabled)