Added Grass that can be chopped with Daggers and Swords.

main
Martin Felis 2024-11-01 11:51:59 +01:00
parent 5404e66b56
commit 2375341b61
11 changed files with 345 additions and 29 deletions

View File

@ -7,7 +7,7 @@
animation = &"rogue/1H_Melee_Attack_Chop"
[sub_resource type="AnimationNodeAnimation" id="AnimationNodeAnimation_njp2v"]
animation = &"rogue/1H_Melee_Attack_Slice_Diagonal"
animation = &"rogue/1H_Melee_Attack_Slice_Horizontal"
[sub_resource type="AnimationNodeAnimation" id="AnimationNodeAnimation_go27t"]
animation = &"rogue/Unarmed_Melee_Attack_Kick"
@ -42,7 +42,7 @@ advance_mode = 2
[sub_resource type="AnimationNodeStateMachine" id="AnimationNodeStateMachine_bqf2d"]
states/Start/position = Vector2(142, 162)
states/rogue_1H_Melee_Attack_Chop/node = SubResource("AnimationNodeAnimation_duxpv")
states/rogue_1H_Melee_Attack_Chop/position = Vector2(490, 58)
states/rogue_1H_Melee_Attack_Chop/position = Vector2(470, 23)
states/rogue_1H_Melee_Attack_Slice_Diagonal/node = SubResource("AnimationNodeAnimation_njp2v")
states/rogue_1H_Melee_Attack_Slice_Diagonal/position = Vector2(480, 162)
states/rogue_Unarmed_Melee_Attack_Kick/node = SubResource("AnimationNodeAnimation_go27t")

View File

@ -1207,6 +1207,18 @@ tracks/56/path = NodePath("Rig/Skeleton3D:toes.r")
tracks/56/interp = 1
tracks/56/loop_wrap = true
tracks/56/keys = PackedFloat32Array(0, 1, -3.04797e-08, -0.920355, 0.391084, 6.94849e-08)
tracks/57/type = "value"
tracks/57/imported = false
tracks/57/enabled = true
tracks/57/path = NodePath("%Geometry/..:tool_damage")
tracks/57/interp = 0
tracks/57/loop_wrap = true
tracks/57/keys = {
"times": PackedFloat32Array(0, 0.2, 0.4, 0.466667),
"transitions": PackedFloat32Array(1, 1, 1, 1),
"update": 0,
"values": [false, true, true, false]
}
[sub_resource type="Animation" id="Animation_vsnxm"]
resource_name = "1H_Melee_Attack_Stab"

View File

@ -1,5 +1,19 @@
[gd_scene load_steps=2 format=3 uid="uid://d0gvv2ddnk8gf"]
[gd_scene load_steps=3 format=3 uid="uid://d0gvv2ddnk8gf"]
[ext_resource type="PackedScene" uid="uid://20v2mjpyxm15" path="res://assets/3rdparty/KayKit_Adventurers_1.0_EXTRA/Assets/dagger.gltf" id="1_3dufl"]
[sub_resource type="CapsuleShape3D" id="CapsuleShape3D_0q0w8"]
radius = 0.141202
height = 0.690169
[node name="dagger2" instance=ExtResource("1_3dufl")]
[node name="Hitbox" type="Area3D" parent="." index="1"]
collision_layer = 8
collision_mask = 0
monitoring = false
monitorable = false
[node name="CollisionShape3D" type="CollisionShape3D" parent="Hitbox" index="0"]
transform = Transform3D(1, 0, 0, 0, 1, 0, 0, 0, 1, 0, 0.488286, 0)
shape = SubResource("CapsuleShape3D_0q0w8")

View File

@ -1,5 +1,19 @@
[gd_scene load_steps=2 format=3 uid="uid://b0hxoadcvbumx"]
[gd_scene load_steps=3 format=3 uid="uid://b0hxoadcvbumx"]
[ext_resource type="PackedScene" uid="uid://ddt2ameyjmbht" path="res://assets/3rdparty/KayKit_Adventurers_1.0_EXTRA/Assets/sword_1handed.gltf" id="1_mee4c"]
[sub_resource type="CapsuleShape3D" id="CapsuleShape3D_jwb68"]
radius = 0.189831
height = 1.21769
[node name="sword_1handed2" instance=ExtResource("1_mee4c")]
[node name="Hitbox" type="Area3D" parent="." index="1"]
collision_layer = 8
collision_mask = 0
monitoring = false
monitorable = false
[node name="CollisionShape3D" type="CollisionShape3D" parent="Hitbox" index="0"]
transform = Transform3D(1, 0, 0, 0, 1, 0, 0, 0, 1, 0, 0.807237, 0)
shape = SubResource("CapsuleShape3D_jwb68")

36
objects/grass.gd Normal file
View File

@ -0,0 +1,36 @@
@tool
extends Node3D
@export var is_chopped:bool = true:
get:
return is_chopped
set(value):
if value != is_chopped:
is_chopped = value
_update_geometry()
@onready var grass_large: Node3D = %grassLarge
@onready var grow_timer: Timer = %GrowTimer
# Called when the node enters the scene tree for the first time.
func _ready() -> void:
_update_geometry()
func _update_geometry() -> void:
if grass_large == null:
return
if is_chopped:
grass_large.transform = Transform3D(Basis.IDENTITY, grass_large.position)
else:
grass_large.transform = Transform3D(Basis.IDENTITY.scaled(Vector3(1, 3, 1)), grass_large.position)
func _on_hitbox_area_shape_entered(area_rid: RID, area: Area3D, area_shape_index: int, local_shape_index: int) -> void:
is_chopped = true
grow_timer.start()
func _on_grow_timer_timeout() -> void:
if is_chopped:
is_chopped = false

31
objects/grass.tscn Normal file
View File

@ -0,0 +1,31 @@
[gd_scene load_steps=4 format=3 uid="uid://bwt4hbinrod8q"]
[ext_resource type="Script" path="res://objects/grass.gd" id="1_sc4bm"]
[ext_resource type="PackedScene" uid="uid://c5x71uagdcocv" path="res://assets/3rdparty/kenney/survival-kit/Models/grassLarge.glb" id="2_4frmr"]
[sub_resource type="BoxShape3D" id="BoxShape3D_4etwi"]
size = Vector3(0.5, 0.483398, 0.5)
[node name="Grass" type="Node3D"]
script = ExtResource("1_sc4bm")
is_chopped = false
[node name="grassLarge" parent="." instance=ExtResource("2_4frmr")]
unique_name_in_owner = true
transform = Transform3D(1, 0, 0, 0, 4, 0, 0, 0, 1, 0, 0, 0)
[node name="Hitbox" type="Area3D" parent="."]
collision_layer = 0
collision_mask = 8
monitorable = false
[node name="CollisionShape3D" type="CollisionShape3D" parent="Hitbox"]
transform = Transform3D(1, 0, 0, 0, 1, 0, 0, 0, 1, 0.0167542, 0.244228, 0)
shape = SubResource("BoxShape3D_4etwi")
[node name="GrowTimer" type="Timer" parent="."]
unique_name_in_owner = true
wait_time = 2.0
[connection signal="area_shape_entered" from="Hitbox" to="." method="_on_hitbox_area_shape_entered"]
[connection signal="timeout" from="GrowTimer" to="." method="_on_grow_timer_timeout"]

View File

@ -6,9 +6,17 @@ const JUMP_VELOCITY = 3.5
@onready var geometry:Node3D = %Geometry
@onready var actionable_detector = %ActionableDetector
@onready var animation_tree:AnimationTree = $Geometry/Rogue/AnimationTree
@onready var animation_tree:AnimationTree = $Geometry/AnimationTree
@onready var build_location:Node3D = %BuildLocation
@onready var right_hand_attachement:Node3D = %RightHandAttachement
@onready var right_hand_attachement:HandTool = %RightHandAttachement
@export var tool_damage:bool = false :
get:
return tool_damage
set(value):
tool_damage = value
if right_hand_attachement != null and right_hand_attachement.tool_hitbox:
right_hand_attachement.tool_hitbox.monitorable = bool(tool_damage)
# Get the gravity from the project settings to be synced with RigidBody nodes.
var gravity = ProjectSettings.get_setting("physics/3d/default_gravity")
@ -85,13 +93,11 @@ func get_actionable_global_transform() -> Vector3:
func set_right_hand_item(item:ItemResource) -> void:
for child in right_hand_attachement.get_children():
child.queue_free()
current_tool = null
right_hand_attachement.set_tool(item.scene.instantiate())
if item != null and item.is_tool:
right_hand_attachement.add_child(item.scene.instantiate())
current_tool = item
animation_tree.set("parameters/Interact/conditions/tool_action_slice", false)

View File

@ -1,8 +1,10 @@
[gd_scene load_steps=8 format=3 uid="uid://ch0s3dxx3rpir"]
[gd_scene load_steps=33 format=3 uid="uid://ch0s3dxx3rpir"]
[ext_resource type="Script" path="res://objects/player.gd" id="1_qkf7c"]
[ext_resource type="PackedScene" uid="uid://dy8vjf760prhq" path="res://assets/characters/rogue.tscn" id="2_whuis"]
[ext_resource type="Script" path="res://objects/player_right_hand_attachement.gd" id="2_db8xg"]
[ext_resource type="PackedScene" uid="uid://dmvl0igyslm80" path="res://assets/tools/Shovel.tscn" id="2_wyjbd"]
[ext_resource type="PackedScene" uid="uid://c0ot1kp5fekqy" path="res://assets/3rdparty/KayKit_Adventurers_1.0_EXTRA/Characters/gltf/Rogue.glb" id="4_6j8ok"]
[ext_resource type="AnimationLibrary" uid="uid://dbaynxuqbkor6" path="res://assets/characters/rogue_animation_library.tres" id="5_0thdi"]
[sub_resource type="StandardMaterial3D" id="StandardMaterial3D_jd31k"]
albedo_color = Color(1, 1, 0.698039, 1)
@ -19,6 +21,127 @@ height = 0.844669
[sub_resource type="SphereShape3D" id="SphereShape3D_wrkyq"]
radius = 0.194932
[sub_resource type="Animation" id="Animation_6nify"]
length = 0.001
tracks/0/type = "value"
tracks/0/imported = false
tracks/0/enabled = true
tracks/0/path = NodePath("%Geometry/..:tool_slice_damage")
tracks/0/interp = 0
tracks/0/loop_wrap = true
tracks/0/keys = {
"times": PackedFloat32Array(0),
"transitions": PackedFloat32Array(1),
"update": 1,
"values": [false]
}
[sub_resource type="AnimationLibrary" id="AnimationLibrary_j2k78"]
_data = {
"RESET": SubResource("Animation_6nify")
}
[sub_resource type="AnimationNodeAnimation" id="AnimationNodeAnimation_duxpv"]
animation = &"rogue/1H_Melee_Attack_Chop"
[sub_resource type="AnimationNodeAnimation" id="AnimationNodeAnimation_njp2v"]
animation = &"rogue/1H_Melee_Attack_Slice_Horizontal"
[sub_resource type="AnimationNodeAnimation" id="AnimationNodeAnimation_go27t"]
animation = &"rogue/Unarmed_Melee_Attack_Kick"
[sub_resource type="AnimationNodeStateMachineTransition" id="AnimationNodeStateMachineTransition_glihl"]
advance_mode = 2
advance_condition = &"tool_action_chop"
[sub_resource type="AnimationNodeStateMachineTransition" id="AnimationNodeStateMachineTransition_qm71c"]
priority = 2
advance_mode = 2
[sub_resource type="AnimationNodeStateMachineTransition" id="AnimationNodeStateMachineTransition_t6she"]
advance_mode = 2
advance_condition = &"tool_action_slice"
[sub_resource type="AnimationNodeStateMachineTransition" id="AnimationNodeStateMachineTransition_oq6xv"]
reset = false
switch_mode = 2
advance_mode = 2
[sub_resource type="AnimationNodeStateMachineTransition" id="AnimationNodeStateMachineTransition_5ovo5"]
reset = false
switch_mode = 2
advance_mode = 2
[sub_resource type="AnimationNodeStateMachineTransition" id="AnimationNodeStateMachineTransition_kjkqd"]
reset = false
switch_mode = 2
advance_mode = 2
[sub_resource type="AnimationNodeStateMachine" id="AnimationNodeStateMachine_bqf2d"]
states/Start/position = Vector2(142, 162)
states/rogue_1H_Melee_Attack_Chop/node = SubResource("AnimationNodeAnimation_duxpv")
states/rogue_1H_Melee_Attack_Chop/position = Vector2(470, 23)
states/rogue_1H_Melee_Attack_Slice_Diagonal/node = SubResource("AnimationNodeAnimation_njp2v")
states/rogue_1H_Melee_Attack_Slice_Diagonal/position = Vector2(480, 162)
states/rogue_Unarmed_Melee_Attack_Kick/node = SubResource("AnimationNodeAnimation_go27t")
states/rogue_Unarmed_Melee_Attack_Kick/position = Vector2(485, 257)
transitions = ["Start", "rogue_1H_Melee_Attack_Chop", SubResource("AnimationNodeStateMachineTransition_glihl"), "Start", "rogue_Unarmed_Melee_Attack_Kick", SubResource("AnimationNodeStateMachineTransition_qm71c"), "Start", "rogue_1H_Melee_Attack_Slice_Diagonal", SubResource("AnimationNodeStateMachineTransition_t6she"), "rogue_1H_Melee_Attack_Chop", "End", SubResource("AnimationNodeStateMachineTransition_oq6xv"), "rogue_Unarmed_Melee_Attack_Kick", "End", SubResource("AnimationNodeStateMachineTransition_5ovo5"), "rogue_1H_Melee_Attack_Slice_Diagonal", "End", SubResource("AnimationNodeStateMachineTransition_kjkqd")]
[sub_resource type="AnimationNodeAnimation" id="AnimationNodeAnimation_dqt6d"]
animation = &"rogue/Idle"
[sub_resource type="AnimationNodeAnimation" id="AnimationNodeAnimation_g5g2g"]
animation = &"rogue/Running_A"
[sub_resource type="AnimationNodeTimeScale" id="AnimationNodeTimeScale_7v7om"]
[sub_resource type="AnimationNodeBlendTree" id="AnimationNodeBlendTree_uc6vu"]
nodes/Animation/node = SubResource("AnimationNodeAnimation_g5g2g")
nodes/Animation/position = Vector2(40, 180)
nodes/TimeScale/node = SubResource("AnimationNodeTimeScale_7v7om")
nodes/TimeScale/position = Vector2(340, 180)
nodes/output/position = Vector2(640, 160)
node_connections = [&"TimeScale", 0, &"Animation", &"output", 0, &"TimeScale"]
[sub_resource type="AnimationNodeStateMachineTransition" id="AnimationNodeStateMachineTransition_ryaua"]
advance_mode = 2
[sub_resource type="AnimationNodeStateMachineTransition" id="AnimationNodeStateMachineTransition_chmuj"]
xfade_time = 0.1
advance_mode = 2
advance_condition = &"running"
[sub_resource type="AnimationNodeStateMachineTransition" id="AnimationNodeStateMachineTransition_oa1w1"]
xfade_time = 0.1
advance_mode = 2
advance_condition = &"idle"
[sub_resource type="AnimationNodeStateMachineTransition" id="AnimationNodeStateMachineTransition_7j7mm"]
xfade_time = 0.1
advance_mode = 2
advance_condition = &"interact"
[sub_resource type="AnimationNodeStateMachineTransition" id="AnimationNodeStateMachineTransition_6s34y"]
switch_mode = 2
advance_mode = 2
[sub_resource type="AnimationNodeStateMachineTransition" id="AnimationNodeStateMachineTransition_g3yva"]
xfade_time = 0.2
advance_mode = 2
advance_condition = &"running"
[sub_resource type="AnimationNodeStateMachine" id="AnimationNodeStateMachine_h0y4b"]
states/End/position = Vector2(902, 102)
states/Interact/node = SubResource("AnimationNodeStateMachine_bqf2d")
states/Interact/position = Vector2(694, 123)
states/Start/position = Vector2(189, 123)
states/rogue_Idle/node = SubResource("AnimationNodeAnimation_dqt6d")
states/rogue_Idle/position = Vector2(422, 123)
states/running/node = SubResource("AnimationNodeBlendTree_uc6vu")
states/running/position = Vector2(422, 285)
transitions = ["Start", "rogue_Idle", SubResource("AnimationNodeStateMachineTransition_ryaua"), "rogue_Idle", "running", SubResource("AnimationNodeStateMachineTransition_chmuj"), "running", "rogue_Idle", SubResource("AnimationNodeStateMachineTransition_oa1w1"), "rogue_Idle", "Interact", SubResource("AnimationNodeStateMachineTransition_7j7mm"), "Interact", "rogue_Idle", SubResource("AnimationNodeStateMachineTransition_6s34y"), "Interact", "running", SubResource("AnimationNodeStateMachineTransition_g3yva")]
graph_offset = Vector2(-12, 57.7514)
[node name="Player" type="CharacterBody3D"]
collision_layer = 3
script = ExtResource("1_qkf7c")
@ -32,15 +155,29 @@ mesh = SubResource("CapsuleMesh_dwrtd")
transform = Transform3D(1, 0, 0, 0, 1, 0, 0, 0, 1, 0, 0.399047, 0)
shape = SubResource("CapsuleShape3D_7kfad")
[node name="ActionableDetector" type="Area3D" parent="."]
unique_name_in_owner = true
transform = Transform3D(1, 0, 0, 0, 1, 0, 0, 0, 1, 0, 0, 0.325311)
collision_layer = 0
collision_mask = 16
[node name="CollisionShape3D" type="CollisionShape3D" parent="ActionableDetector"]
shape = SubResource("SphereShape3D_wrkyq")
[node name="BuildLocation" type="Node3D" parent="."]
unique_name_in_owner = true
transform = Transform3D(1, 0, 0, 0, 1, 0, 0, 0, 1, 0, 0, 0.98728)
[node name="RightHandBone" type="BoneAttachment3D" parent="."]
transform = Transform3D(-0.000936468, -0.0640051, 0.394845, 0.399981, -0.00390502, 0.000315472, 0.00380429, 0.394827, 0.0640112, -0.196417, 0.250119, 0.0420737)
transform = Transform3D(-8.44922e-05, -0.0603305, 0.395424, 0.4, -0.000359516, 3.04633e-05, 0.000350951, 0.395424, 0.0603306, -0.1964, 0.25612, 0.042693)
bone_name = "Knife"
bone_idx = 17
use_external_skeleton = true
external_skeleton = NodePath("../Geometry/Rogue/Rogue/Rig/Skeleton3D")
external_skeleton = NodePath("../Geometry/Rogue/Rig/Skeleton3D")
[node name="RightHandAttachement" type="Node3D" parent="RightHandBone"]
unique_name_in_owner = true
script = ExtResource("2_db8xg")
[node name="ShovelScene" parent="RightHandBone/RightHandAttachement" instance=ExtResource("2_wyjbd")]
@ -48,17 +185,22 @@ unique_name_in_owner = true
unique_name_in_owner = true
transform = Transform3D(0.4, 0, 0, 0, 0.4, 0, 0, 0, 0.4, 0, 0, 0)
[node name="Rogue" parent="Geometry" instance=ExtResource("2_whuis")]
[node name="Rogue" parent="Geometry" instance=ExtResource("4_6j8ok")]
[node name="ActionableDetector" type="Area3D" parent="Geometry"]
unique_name_in_owner = true
transform = Transform3D(2.5, 0, 0, 0, 2.5, 0, 0, 0, 2.5, 0, 0, 0.813277)
collision_layer = 0
collision_mask = 16
[node name="AnimationPlayer" type="AnimationPlayer" parent="Geometry"]
root_node = NodePath("../Rogue")
libraries = {
"": SubResource("AnimationLibrary_j2k78"),
"rogue": ExtResource("5_0thdi")
}
[node name="CollisionShape3D" type="CollisionShape3D" parent="Geometry/ActionableDetector"]
shape = SubResource("SphereShape3D_wrkyq")
[node name="BuildLocation" type="Node3D" parent="Geometry"]
unique_name_in_owner = true
transform = Transform3D(2.5, 0, 0, 0, 2.5, 0, 0, 0, 2.5, 0, 0, 2.4682)
[node name="AnimationTree" type="AnimationTree" parent="Geometry"]
root_node = NodePath("../Rogue")
tree_root = SubResource("AnimationNodeStateMachine_h0y4b")
anim_player = NodePath("../AnimationPlayer")
parameters/conditions/idle = false
parameters/conditions/interact = false
parameters/conditions/running = false
parameters/Interact/conditions/tool_action_chop = false
parameters/Interact/conditions/tool_action_slice = false
parameters/running/TimeScale/scale = 1.5

View File

@ -0,0 +1,25 @@
class_name HandTool
extends Node3D
var tool_hitbox:Area3D = null
var _current_tool:Node3D = null
# Called when the node enters the scene tree for the first time.
func _ready() -> void:
pass # Replace with function body.
func set_tool(node:Node3D) -> void:
_current_tool = node
tool_hitbox = null
for child in get_children():
child.queue_free()
remove_child(child)
if _current_tool != null:
add_child(_current_tool)
tool_hitbox = find_child("Hitbox", true, false)
# Called every frame. 'delta' is the elapsed time since the previous frame.
func _process(delta: float) -> void:
pass

View File

@ -184,5 +184,7 @@ locale/translations_pot_files=PackedStringArray("res://dialogue/bridge_builder_m
3d_physics/layer_1="World"
3d_physics/layer_2="Player"
3d_physics/layer_5="Actionables"
3d_physics/layer_6="Structures"
3d_physics/layer_3="Hitbox"
3d_physics/layer_4="Weapon & Projectile"
3d_physics/layer_5="Actionable"
3d_physics/layer_6="Structure"

View File

@ -1,4 +1,4 @@
[gd_scene load_steps=28 format=3 uid="uid://dmagdl5pi6jdj"]
[gd_scene load_steps=29 format=3 uid="uid://dmagdl5pi6jdj"]
[ext_resource type="MeshLibrary" uid="uid://dcpuitbu16j1a" path="res://assets/mesh_library.tres" id="1_q0eym"]
[ext_resource type="PackedScene" uid="uid://da5r82nvypfk4" path="res://objects/pickup_item.tscn" id="2_ccr0r"]
@ -23,6 +23,7 @@
[ext_resource type="PackedScene" uid="uid://kpyvcyklt68g" path="res://assets/scene_props/bridge.tscn" id="18_yqn1p"]
[ext_resource type="PackedScene" uid="uid://2q8dhf61a7os" path="res://assets/characters/engineer.tscn" id="22_vjd6d"]
[ext_resource type="PackedScene" uid="uid://03eh1nglfg6t" path="res://objects/non_player_character.tscn" id="23_fjbgv"]
[ext_resource type="PackedScene" uid="uid://bwt4hbinrod8q" path="res://objects/grass.tscn" id="24_4cd0f"]
[sub_resource type="CylinderShape3D" id="CylinderShape3D_0soe6"]
height = 0.6
@ -109,6 +110,39 @@ transform = Transform3D(1, 0, 0, 0, 1, 0, 0, 0, 1, 1.99916, -4.76837e-06, -3.043
[node name="TreePine3" parent="Vegetation" instance=ExtResource("11_5olon")]
transform = Transform3D(1, 0, 0, 0, 1, 0, 0, 0, 1, -1.26548, 0, 0)
[node name="Grass" parent="Vegetation" instance=ExtResource("24_4cd0f")]
transform = Transform3D(1, 0, 0, 0, 1, 0, 0, 0, 1, -1, 0, -2)
[node name="Grass2" parent="Vegetation" instance=ExtResource("24_4cd0f")]
transform = Transform3D(1, 0, 0, 0, 1, 0, 0, 0, 1, 1, 0, -2.5)
[node name="Grass3" parent="Vegetation" instance=ExtResource("24_4cd0f")]
transform = Transform3D(1, 0, 0, 0, 1, 0, 0, 0, 1, 1, 0, -2)
[node name="Grass4" parent="Vegetation" instance=ExtResource("24_4cd0f")]
transform = Transform3D(1, 0, 0, 0, 1, 0, 0, 0, 1, -1, 0, -1.5)
[node name="Grass5" parent="Vegetation" instance=ExtResource("24_4cd0f")]
transform = Transform3D(1, 0, 0, 0, 1, 0, 0, 0, 1, -0.5, 0, -1.5)
[node name="Grass6" parent="Vegetation" instance=ExtResource("24_4cd0f")]
transform = Transform3D(-4.37114e-08, 0, -1, 0, 1, 0, 1, 0, -4.37114e-08, 3, 0, -3)
[node name="Grass7" parent="Vegetation" instance=ExtResource("24_4cd0f")]
transform = Transform3D(-4.37114e-08, 0, -1, 0, 1, 0, 1, 0, -4.37114e-08, 2.5, 0, -2.5)
[node name="Grass8" parent="Vegetation" instance=ExtResource("24_4cd0f")]
transform = Transform3D(-4.37114e-08, 0, -1, 0, 1, 0, 1, 0, -4.37114e-08, 2.5, 0, -2)
[node name="Grass9" parent="Vegetation" instance=ExtResource("24_4cd0f")]
transform = Transform3D(-4.37114e-08, 0, -1, 0, 1, 0, 1, 0, -4.37114e-08, 2, 0, -2)
[node name="Grass10" parent="Vegetation" instance=ExtResource("24_4cd0f")]
transform = Transform3D(-4.37114e-08, 0, -1, 0, 1, 0, 1, 0, -4.37114e-08, 1.5, 0, -2)
[node name="Grass11" parent="Vegetation" instance=ExtResource("24_4cd0f")]
transform = Transform3D(-4.37114e-08, 0, -1, 0, 1, 0, 1, 0, -4.37114e-08, 1.5, 0, -1.5)
[node name="Structures" type="Node3D" parent="."]
[node name="BridgeNorth" type="Node3D" parent="Structures"]