diff --git a/assets/characters/rogue.tscn b/assets/characters/rogue.tscn index f03dd0d..e6b9445 100644 --- a/assets/characters/rogue.tscn +++ b/assets/characters/rogue.tscn @@ -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") diff --git a/assets/characters/rogue_animation_library.tres b/assets/characters/rogue_animation_library.tres index 75cf020..c0c6870 100644 --- a/assets/characters/rogue_animation_library.tres +++ b/assets/characters/rogue_animation_library.tres @@ -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" diff --git a/assets/tools/Dagger.tscn b/assets/tools/Dagger.tscn index c6204af..b35e678 100644 --- a/assets/tools/Dagger.tscn +++ b/assets/tools/Dagger.tscn @@ -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") diff --git a/assets/tools/Sword.tscn b/assets/tools/Sword.tscn index 30e3627..6801f94 100644 --- a/assets/tools/Sword.tscn +++ b/assets/tools/Sword.tscn @@ -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") diff --git a/objects/grass.gd b/objects/grass.gd new file mode 100644 index 0000000..55bcd96 --- /dev/null +++ b/objects/grass.gd @@ -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 diff --git a/objects/grass.tscn b/objects/grass.tscn new file mode 100644 index 0000000..b8d01e5 --- /dev/null +++ b/objects/grass.tscn @@ -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"] diff --git a/objects/player.gd b/objects/player.gd index 6079944..33b17c0 100644 --- a/objects/player.gd +++ b/objects/player.gd @@ -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) diff --git a/objects/player.tscn b/objects/player.tscn index c0545b6..6a4c1ec 100644 --- a/objects/player.tscn +++ b/objects/player.tscn @@ -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 diff --git a/objects/player_right_hand_attachement.gd b/objects/player_right_hand_attachement.gd new file mode 100644 index 0000000..f8d4f8d --- /dev/null +++ b/objects/player_right_hand_attachement.gd @@ -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 diff --git a/project.godot b/project.godot index a03b751..6c4f865 100644 --- a/project.godot +++ b/project.godot @@ -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" diff --git a/world/level.tscn b/world/level.tscn index f983638..7572aca 100644 --- a/world/level.tscn +++ b/world/level.tscn @@ -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"]