fix terrain collision and water recovery
This commit is contained in:
parent
da7f072365
commit
1ab2a291d2
13 changed files with 110 additions and 11 deletions
|
|
@ -156,6 +156,7 @@ func _validate_portable_water_body() -> void:
|
|||
PlayerWaterTrigger.EntryHeightReference.PLAYER_ORIGIN,
|
||||
)
|
||||
water_body.set("recovery_entry_depth_threshold", 0.1)
|
||||
water_body.set("recovery_entry_confirmation_seconds", 0.2)
|
||||
water_body.set("fish_pool", PondPool)
|
||||
root.add_child(water_body)
|
||||
await process_frame
|
||||
|
|
@ -183,6 +184,34 @@ func _validate_portable_water_body() -> void:
|
|||
== PlayerWaterTrigger.EntryHeightReference.PLAYER_ORIGIN
|
||||
)
|
||||
assert(is_equal_approx(recovery_region.entry_depth_threshold, 0.1))
|
||||
assert(is_equal_approx(recovery_region.entry_confirmation_seconds, 0.2))
|
||||
|
||||
var recovery_player := PlayerScene.instantiate() as Player
|
||||
assert(recovery_player != null)
|
||||
root.add_child(recovery_player)
|
||||
recovery_player.set_process(false)
|
||||
recovery_player.set_physics_process(false)
|
||||
var recovery_requests: Array[float] = []
|
||||
recovery_region.recovery_requested.connect(
|
||||
func(_player: Player, requested_surface_height: float) -> void:
|
||||
recovery_requests.append(requested_surface_height)
|
||||
)
|
||||
recovery_region.call("_on_body_entered", recovery_player)
|
||||
recovery_player.global_position.y = 6.8
|
||||
recovery_region.call("_physics_process", 0.1)
|
||||
assert(recovery_requests.is_empty())
|
||||
# Breaking the submersion resets confirmation rather than carrying a stale
|
||||
# partial fall into a later jump.
|
||||
recovery_player.global_position.y = 7.0
|
||||
recovery_region.call("_physics_process", 0.1)
|
||||
recovery_player.global_position.y = 6.8
|
||||
recovery_region.call("_physics_process", 0.11)
|
||||
assert(recovery_requests.is_empty())
|
||||
recovery_region.call("_physics_process", 0.1)
|
||||
assert(recovery_requests == [7.0])
|
||||
recovery_region.call("_on_body_exited", recovery_player)
|
||||
recovery_player.queue_free()
|
||||
await process_frame
|
||||
|
||||
water_body.queue_free()
|
||||
await process_frame
|
||||
|
|
|
|||
|
|
@ -490,6 +490,10 @@ func _validate_generated_region(
|
|||
== PlayerWaterTrigger.EntryHeightReference.PLAYER_ORIGIN
|
||||
)
|
||||
assert(is_equal_approx(fresh_recovery.entry_depth_threshold, 0.1))
|
||||
assert(is_equal_approx(
|
||||
fresh_recovery.entry_confirmation_seconds,
|
||||
0.2,
|
||||
))
|
||||
var coordinate_tokens := child.name.trim_prefix("FreshWater_").split("_")
|
||||
assert(coordinate_tokens.size() == 2)
|
||||
var coordinate := Vector2i(
|
||||
|
|
@ -1043,6 +1047,25 @@ func _validate_prop_catalog(region: GeneratedWorldRegion) -> void:
|
|||
assert(palm.maximum_cluster_radius > palm.minimum_cluster_radius)
|
||||
assert(palm.prefer_ocean_facing)
|
||||
assert(not palm.local_overhang_direction.is_zero_approx())
|
||||
var aligned_tree_collisions: Dictionary[StringName, Vector2] = {
|
||||
&"prop_tree_1": Vector2(0.08, 0.01),
|
||||
&"prop_tree_2": Vector2(0.1, 0.075),
|
||||
&"prop_tree_3": Vector2(-0.1, 0.18),
|
||||
&"prop_tree_large": Vector2(0.084, 0.504),
|
||||
&"prop_pine": Vector2(-0.044, 0.083),
|
||||
&"prop_pine_large": Vector2(-0.04, 0.075),
|
||||
&"prop_palm": Vector2(0.15, -0.1),
|
||||
}
|
||||
for tree_id: StringName in aligned_tree_collisions:
|
||||
var aligned_tree := catalog.definition_for_id(tree_id)
|
||||
assert(aligned_tree != null and aligned_tree.has_cylinder_collision())
|
||||
var collision_center := Vector2(
|
||||
aligned_tree.collision_offset.x,
|
||||
aligned_tree.collision_offset.z,
|
||||
)
|
||||
assert(collision_center.is_equal_approx(
|
||||
aligned_tree_collisions[tree_id]
|
||||
))
|
||||
var forest := region.get_biome_catalog().definition_for_id(&"biome_forest")
|
||||
var forest_rule := forest.prop_rule_for_group(&"grass_tree")
|
||||
var large_tree := catalog.definition_for_id(&"prop_tree_large")
|
||||
|
|
@ -1139,6 +1162,20 @@ func _validate_decoration_transform(
|
|||
or collision.shape is BoxShape3D
|
||||
)
|
||||
assert(collision.global_basis.get_scale().is_equal_approx(Vector3.ONE))
|
||||
if collision.shape is CylinderShape3D:
|
||||
var cylinder := collision.shape as CylinderShape3D
|
||||
assert(is_equal_approx(
|
||||
cylinder.radius,
|
||||
definition.collision_radius * visual_scale,
|
||||
))
|
||||
assert(is_equal_approx(
|
||||
cylinder.height,
|
||||
definition.collision_height * visual_scale,
|
||||
))
|
||||
assert(collision.position.is_equal_approx(
|
||||
definition.collision_offset * visual_scale
|
||||
+ Vector3.UP * cylinder.height * 0.5
|
||||
))
|
||||
else:
|
||||
assert(collision == null)
|
||||
var query := PhysicsRayQueryParameters3D.create(
|
||||
|
|
|
|||
Loading…
Add table
Add a link
Reference in a new issue