Add modular holdover fishing world
This commit is contained in:
parent
6a5923fdb8
commit
a91f2b9825
17 changed files with 1354 additions and 191 deletions
|
|
@ -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(
|
||||
|
|
|
|||
|
|
@ -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
|
||||
|
|
|
|||
|
|
@ -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
|
||||
|
||||
|
|
|
|||
110
world/README-WORLD-GRAYBOX.md
Normal file
110
world/README-WORLD-GRAYBOX.md
Normal 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.
|
||||
83
world/interactables/fishing_shop_world.tscn
Normal file
83
world/interactables/fishing_shop_world.tscn
Normal 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")
|
||||
50
world/interactables/pelican_buyer_world.tscn
Normal file
50
world/interactables/pelican_buyer_world.tscn
Normal 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
|
||||
140
world/regions/coastal_dock_region.tscn
Normal file
140
world/regions/coastal_dock_region.tscn
Normal 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")
|
||||
43
world/regions/graybox_region.gd
Normal file
43
world/regions/graybox_region.gd
Normal 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
|
||||
1
world/regions/graybox_region.gd.uid
Normal file
1
world/regions/graybox_region.gd.uid
Normal file
|
|
@ -0,0 +1 @@
|
|||
uid://bb1j0uhvrbf5n
|
||||
141
world/regions/lake_region.tscn
Normal file
141
world/regions/lake_region.tscn
Normal 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")
|
||||
164
world/regions/marsh_region.tscn
Normal file
164
world/regions/marsh_region.tscn
Normal 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")
|
||||
143
world/regions/river_region.tscn
Normal file
143
world/regions/river_region.tscn
Normal 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")
|
||||
114
world/regions/starter_pond_region.tscn
Normal file
114
world/regions/starter_pond_region.tscn
Normal 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")
|
||||
179
world/regions/village_region.tscn
Normal file
179
world/regions/village_region.tscn
Normal 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)
|
||||
|
|
@ -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
|
||||
|
|
|
|||
|
|
@ -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")
|
||||
|
|
|
|||
|
|
@ -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)
|
||||
|
|
|
|||
Loading…
Add table
Add a link
Reference in a new issue