From f7e07797c84157f9ab7ccdb2b09c43d52fe12846 Mon Sep 17 00:00:00 2001 From: Sara Date: Fri, 4 Jul 2025 16:01:56 +0200 Subject: [PATCH] feat: implemented basic third person movement --- modules/authority/actor_body.cpp | 27 +- modules/authority/actor_body.h | 5 +- modules/authority/game_state.cpp | 43 +- modules/authority/game_state.h | 13 +- modules/authority/player_actor.cpp | 17 +- modules/authority/player_actor.h | 4 + modules/authority/player_input.cpp | 82 ++- modules/authority/player_input.h | 25 + modules/authority/register_types.cpp | 6 +- modules/authority/third_person_camera.cpp | 54 ++ modules/authority/third_person_camera.h | 29 + project/locales/city.tscn | 579 +------------------ project/maps/map.tscn | 126 ---- project/objects/characters/player_actor.tscn | 2 +- project/project.godot | 30 +- 15 files changed, 278 insertions(+), 764 deletions(-) create mode 100644 modules/authority/third_person_camera.cpp create mode 100644 modules/authority/third_person_camera.h delete mode 100644 project/maps/map.tscn diff --git a/modules/authority/actor_body.cpp b/modules/authority/actor_body.cpp index e2937295..1f995409 100644 --- a/modules/authority/actor_body.cpp +++ b/modules/authority/actor_body.cpp @@ -7,6 +7,16 @@ void ActorBody::_bind_methods() { BIND_HPROPERTY(Variant::FLOAT, movement_speed, PROPERTY_HINT_RANGE, "0.0,20.0"); } +void ActorBody::physics_process(double delta) { + if (this->teleport_on_process) { + set_global_position(this->teleport_target); + this->teleport_on_process = false; + force_update_transform(); + } + set_velocity(get_movement_direction() * this->movement_speed); + move_and_slide(); +} + void ActorBody::_notification(int what) { if (Engine::get_singleton()->is_editor_hint()) { return; @@ -14,20 +24,18 @@ void ActorBody::_notification(int what) { switch (what) { default: return; + case NOTIFICATION_READY: + set_physics_process(true); + set_as_top_level(true); case NOTIFICATION_PHYSICS_PROCESS: physics_process(get_physics_process_delta_time()); return; } } -void ActorBody::physics_process(double delta) { - set_velocity(get_movement_direction() * this->movement_speed); - move_and_slide(); -} - void ActorBody::set_movement_direction(Vector3 direction) { this->mode = Direction; - this->movement_vector = { direction.x, 0.f, direction.y }; + this->movement_vector = Vector3(direction.x, 0.f, direction.z).normalized(); } Vector3 ActorBody::get_movement_direction() const { @@ -43,7 +51,7 @@ Vector3 ActorBody::get_movement_direction() const { void ActorBody::set_movement_target(Vector3 location) { this->mode = Position; - this->movement_vector = { location.x, 0.f, location.y }; + this->movement_vector = { location.x, 0.f, location.z }; } Vector3 ActorBody::get_movement_target() const { @@ -55,6 +63,11 @@ Vector3 ActorBody::get_movement_target() const { } } +void ActorBody::teleport(Vector3 target) { + this->teleport_target = target; + this->teleport_on_process = true; +} + void ActorBody::set_movement_speed(float speed) { this->movement_speed = speed; } diff --git a/modules/authority/actor_body.h b/modules/authority/actor_body.h index 5fb20086..fa7fbaac 100644 --- a/modules/authority/actor_body.h +++ b/modules/authority/actor_body.h @@ -20,15 +20,18 @@ public: Vector3 get_movement_direction() const; void set_movement_target(Vector3 location); Vector3 get_movement_target() const; + void teleport(Vector3 target); void set_movement_speed(float speed); float get_movement_speed() const; MovementMode get_movement_mode() const; private: - float movement_speed{ 1.f }; + float movement_speed{ 3.f }; Vector3 movement_vector{ 0.f, 0.f, 0.f }; MovementMode mode{ Direction }; + bool teleport_on_process{ false }; + Vector3 teleport_target{}; }; #endif //! ACTOR_BODY_H diff --git a/modules/authority/game_state.cpp b/modules/authority/game_state.cpp index e3a2e0f1..d10da4fd 100644 --- a/modules/authority/game_state.cpp +++ b/modules/authority/game_state.cpp @@ -3,14 +3,7 @@ GameState *GameState::singleton_instance{ nullptr }; -void GameState::_bind_methods() { - BIND_PROPERTY(Variant::STRING, locale_uid); - BIND_PROPERTY(Variant::STRING, locale_entrance_path); - { - String const party_member_data_hint{ vformat("%s/%s:PartyMemberData", Variant::OBJECT, PROPERTY_HINT_RESOURCE_TYPE) }; - BIND_HPROPERTY(Variant::ARRAY, player_party, PROPERTY_HINT_ARRAY_TYPE, party_member_data_hint); - } -} +void GameState::_bind_methods() {} GameState::GameState() { self_type::singleton_instance = this; @@ -23,37 +16,3 @@ GameState::~GameState() { GameState *GameState::get_singleton() { return self_type::singleton_instance; } - -void GameState::set_locale_uid(String const &value) { - this->locale_uid = value; -} - -String GameState::get_locale_uid() const { - return this->locale_uid; -} - -void GameState::set_locale_entrance_path(String const &value) { - this->locale_uid = value; -} - -String GameState::get_locale_entrance_path() const { - return this->locale_uid; -} - -void GameState::set_player_party(Array array) { - this->player_party.clear(); - for (int i{ 0 }; i < array.size(); ++i) { - Ref data{ array[i] }; - if (data.is_valid()) { - this->player_party.push_back(data); - } - } -} - -Array GameState::get_player_party() const { - Array a{}; - for (Ref const &data : this->player_party) { - a.push_back(data); - } - return a; -} diff --git a/modules/authority/game_state.h b/modules/authority/game_state.h index b3f0a7af..0170bd94 100644 --- a/modules/authority/game_state.h +++ b/modules/authority/game_state.h @@ -1,7 +1,7 @@ #ifndef GAME_STATE_H #define GAME_STATE_H -#include "authority/party_member_data.h" +#include "core/object/class_db.h" #include "core/object/object.h" #include "core/templates/vector.h" @@ -14,17 +14,6 @@ public: GameState(); virtual ~GameState(); static GameState *get_singleton(); - void set_locale_uid(String const &value); - String get_locale_uid() const; - void set_locale_entrance_path(String const &value); - String get_locale_entrance_path() const; - void set_player_party(Array array); - Array get_player_party() const; - -private: - String locale_uid{ "" }; - String locale_entrance_path{ "" }; - Vector> player_party{}; }; #endif // !GAME_STATE_H diff --git a/modules/authority/player_actor.cpp b/modules/authority/player_actor.cpp index 5bc08134..0401ec04 100644 --- a/modules/authority/player_actor.cpp +++ b/modules/authority/player_actor.cpp @@ -1,5 +1,7 @@ #include "player_actor.h" +#include "authority/game_state.h" #include "authority/player_input.h" +#include "scene/main/viewport.h" void PlayerActor::_bind_methods() { } @@ -7,10 +9,20 @@ void PlayerActor::_bind_methods() { void PlayerActor::ready() { PlayerInput *input{ cast_to(get_node(NodePath("%PlayerInput"))) }; input->connect(PlayerInput::signal_movement, callable_mp(this, &self_type::input_move)); + set_process(true); +} + +void PlayerActor::process(double delta) { + Basis const basis{ this->get_viewport()->get_camera_3d()->get_global_basis() }; + Vector3 x{ basis.get_column(0) }; + x = Vector3{ x.x, 0.f, x.z }.normalized(); + Vector3 z{ basis.get_column(2) }; + z = Vector3{ z.x, 0.f, z.z }.normalized(); + set_movement_direction(x * this->move_input.x + z * this->move_input.y); } void PlayerActor::input_move(Vector2 movement) { - set_movement_direction({ movement.x, 0.f, movement.y }); + this->move_input = movement; } void PlayerActor::_notification(int what) { @@ -23,5 +35,8 @@ void PlayerActor::_notification(int what) { case NOTIFICATION_READY: ready(); return; + case NOTIFICATION_PROCESS: + process(get_process_delta_time()); + return; } } diff --git a/modules/authority/player_actor.h b/modules/authority/player_actor.h index af7bd862..6cdcdc59 100644 --- a/modules/authority/player_actor.h +++ b/modules/authority/player_actor.h @@ -7,10 +7,14 @@ class PlayerActor : public ActorBody { GDCLASS(PlayerActor, ActorBody); static void _bind_methods(); void ready(); + void process(double delta); void input_move(Vector2 movement); public: void _notification(int what); + +private: + Vector2 move_input{ 0.f, 0.f }; }; #endif // !PLAYER_ACTOR_H diff --git a/modules/authority/player_input.cpp b/modules/authority/player_input.cpp index 4228c55d..bfd00590 100644 --- a/modules/authority/player_input.cpp +++ b/modules/authority/player_input.cpp @@ -4,13 +4,21 @@ #include "macros.h" String const PlayerInput::signal_movement{ "movement" }; +String const PlayerInput::signal_look{ "look" }; +String const PlayerInput::signal_mouselook{ "mouselook" }; void PlayerInput::_bind_methods() { BIND_PROPERTY(Variant::STRING, action_move_left); BIND_PROPERTY(Variant::STRING, action_move_right); BIND_PROPERTY(Variant::STRING, action_move_forward); BIND_PROPERTY(Variant::STRING, action_move_back); + BIND_PROPERTY(Variant::STRING, action_look_left); + BIND_PROPERTY(Variant::STRING, action_look_right); + BIND_PROPERTY(Variant::STRING, action_look_up); + BIND_PROPERTY(Variant::STRING, action_look_down); ADD_SIGNAL(MethodInfo(self_type::signal_movement, PropertyInfo(Variant::VECTOR2, "movement_directions"))); + ADD_SIGNAL(MethodInfo(self_type::signal_look, PropertyInfo(Variant::VECTOR2, "look_delta"))); + ADD_SIGNAL(MethodInfo(self_type::signal_mouselook, PropertyInfo(Variant::VECTOR2, "mouse_delta"))); } void PlayerInput::_notification(int what) { @@ -21,22 +29,56 @@ void PlayerInput::_notification(int what) { default: return; case NOTIFICATION_READY: - this->set_process_unhandled_input(true); + set_process_unhandled_input(true); + Input::get_singleton()->set_mouse_mode(Input::MOUSE_MODE_CAPTURED); return; } } void PlayerInput::unhandled_input(Ref const &event) { Input *input{ Input::get_singleton() }; + bool is_movement_action{ event->is_action(self_type::action_move_left) }; is_movement_action |= event->is_action(self_type::action_move_right); is_movement_action |= event->is_action(self_type::action_move_forward); is_movement_action |= event->is_action(self_type::action_move_back); if (is_movement_action) { - float const h_axis{ input->get_axis(self_type::action_move_right, self_type::action_move_left) }; - float const v_axis{ input->get_axis(self_type::action_move_back, self_type::action_move_forward) }; - this->emit_signal(self_type::signal_movement, Vector2{ h_axis, v_axis }); + float const h_axis{ input->get_axis(self_type::action_move_left, self_type::action_move_right) }; + float const v_axis{ input->get_axis(self_type::action_move_forward, self_type::action_move_back) }; + emit_signal(self_type::signal_movement, Vector2{ h_axis, v_axis }); } + + bool is_look_action{ event->is_action(self_type::action_look_left) }; + is_look_action |= event->is_action(self_type::action_look_right); + is_look_action |= event->is_action(self_type::action_look_up); + is_look_action |= event->is_action(self_type::action_look_down); + if (is_look_action) { + float const h_axis{ input->get_axis(self_type::action_look_right, self_type::action_look_left) }; + float const v_axis{ input->get_axis(self_type::action_look_down, self_type::action_look_up) }; + emit_signal(self_type::signal_look, Vector2{ h_axis, v_axis } * this->look_speed); + } + + Ref mouse_motion_action{ event }; + if (mouse_motion_action.is_valid()) { + Vector2 const velocity{ mouse_motion_action->get_relative() }; + emit_signal(self_type::signal_mouselook, velocity * this->mouselook_speed); + } +} + +void PlayerInput::set_mouselook_speed(Vector2 speed) { + this->mouselook_speed = speed; +} + +Vector2 PlayerInput::get_mouselook_speed() const { + return this->mouselook_speed; +} + +void PlayerInput::set_look_speed(Vector2 speed) { + this->look_speed = speed; +} + +Vector2 PlayerInput::get_look_speed() const { + return this->look_speed; } void PlayerInput::set_action_move_left(String action) { @@ -70,3 +112,35 @@ void PlayerInput::set_action_move_back(String action) { String PlayerInput::get_action_move_back() const { return this->action_move_back; } + +void PlayerInput::set_action_look_left(String action) { + this->action_look_left = action; +} + +String PlayerInput::get_action_look_left() const { + return this->action_look_left; +} + +void PlayerInput::set_action_look_right(String action) { + this->action_look_right = action; +} + +String PlayerInput::get_action_look_right() const { + return this->action_look_right; +} + +void PlayerInput::set_action_look_up(String action) { + this->action_look_up = action; +} + +String PlayerInput::get_action_look_up() const { + return this->action_look_up; +} + +void PlayerInput::set_action_look_down(String action) { + this->action_look_down = action; +} + +String PlayerInput::get_action_look_down() const { + return this->action_look_down; +} diff --git a/modules/authority/player_input.h b/modules/authority/player_input.h index 7dba0ec4..977dc2a1 100644 --- a/modules/authority/player_input.h +++ b/modules/authority/player_input.h @@ -11,6 +11,12 @@ class PlayerInput : public Node { public: void _notification(int what); virtual void unhandled_input(Ref const &event) override; + + void set_mouselook_speed(Vector2 speed); + Vector2 get_mouselook_speed() const; + void set_look_speed(Vector2 speed); + Vector2 get_look_speed() const; + void set_action_move_left(String action); String get_action_move_left() const; void set_action_move_right(String action); @@ -20,14 +26,33 @@ public: void set_action_move_back(String action); String get_action_move_back() const; + void set_action_look_left(String action); + String get_action_look_left() const; + void set_action_look_right(String action); + String get_action_look_right() const; + void set_action_look_up(String action); + String get_action_look_up() const; + void set_action_look_down(String action); + String get_action_look_down() const; + public: static String const signal_movement; + static String const signal_look; + static String const signal_mouselook; private: + Vector2 mouselook_speed{ 0.001f, 0.001f }; + Vector2 look_speed{ 1.75f, 1.75f }; + String action_move_left{ "move_left" }; String action_move_right{ "move_right" }; String action_move_forward{ "move_forward" }; String action_move_back{ "move_back" }; + + String action_look_left{ "look_left" }; + String action_look_right{ "look_right" }; + String action_look_up{ "look_up" }; + String action_look_down{ "look_down" }; }; #endif // !PLAYER_INPUT_H diff --git a/modules/authority/register_types.cpp b/modules/authority/register_types.cpp index 0d44b7d7..8d674102 100644 --- a/modules/authority/register_types.cpp +++ b/modules/authority/register_types.cpp @@ -2,10 +2,9 @@ #include "authority/actor_body.h" #include "authority/game_state.h" -#include "authority/locale_marker.h" -#include "authority/party_member_data.h" #include "authority/player_actor.h" #include "authority/player_input.h" +#include "authority/third_person_camera.h" #include "core/config/engine.h" #include "core/object/class_db.h" @@ -16,11 +15,10 @@ void initialize_authority_module(ModuleInitializationLevel p_level) { return; } GDREGISTER_CLASS(GameState); - GDREGISTER_RUNTIME_CLASS(LocaleMarker); - GDREGISTER_RUNTIME_CLASS(PartyMemberData); GDREGISTER_CLASS(ActorBody); GDREGISTER_CLASS(PlayerActor); GDREGISTER_CLASS(PlayerInput); + GDREGISTER_CLASS(ThirdPersonCamera); game_state = memnew(GameState); Engine::get_singleton()->add_singleton(Engine::Singleton("GameState", GameState::get_singleton())); diff --git a/modules/authority/third_person_camera.cpp b/modules/authority/third_person_camera.cpp new file mode 100644 index 00000000..04077cc6 --- /dev/null +++ b/modules/authority/third_person_camera.cpp @@ -0,0 +1,54 @@ +#include "third_person_camera.h" +#include "player_input.h" + +void ThirdPersonCamera::_bind_methods() { +} + +void ThirdPersonCamera::ready() { + set_process(true); + if (PlayerInput * player_input{ cast_to(get_node(NodePath("%PlayerInput"))) }) { + player_input->connect(PlayerInput::signal_look, callable_mp(this, &self_type::on_look_input)); + player_input->connect(PlayerInput::signal_mouselook, callable_mp(this, &self_type::on_mouselook_input)); + } +} + +void ThirdPersonCamera::process(double delta) { + this->look_rotation += look_rotation_motion * delta; + this->look_rotation.y = CLAMP(this->look_rotation.y, -Math_PI / 2.5, Math_PI / 2.5); + Vector3 pivot{ get_parent_node_3d()->get_global_position() }; + pivot.y += this->height; + Vector3 offset{ 0.f, 0.f, this->distance }; + offset.rotate({ 1.f, 0.f, 0.f }, this->look_rotation.y); + offset.rotate({ 0.f, 1.f, 0.f }, this->look_rotation.x); + look_at_from_position(pivot + offset, pivot); +} + +void ThirdPersonCamera::on_look_input(Vector2 input) { + this->look_rotation_motion = input; +} + +void ThirdPersonCamera::on_mouselook_input(Vector2 input) { + this->look_rotation -= input; +} + +void ThirdPersonCamera::_notification(int what) { + if (Engine::get_singleton()->is_editor_hint()) { + return; + } + switch (what) { + case NOTIFICATION_READY: + ready(); + break; + case NOTIFICATION_PROCESS: + process(get_process_delta_time()); + break; + } +} + +void ThirdPersonCamera::set_base_rotation_speed(Vector2 value) { + this->base_rotation_speed = value; +} + +Vector2 ThirdPersonCamera::get_base_rotation_speed() const { + return this->base_rotation_speed; +} diff --git a/modules/authority/third_person_camera.h b/modules/authority/third_person_camera.h new file mode 100644 index 00000000..9ec2935d --- /dev/null +++ b/modules/authority/third_person_camera.h @@ -0,0 +1,29 @@ +#ifndef THIRD_PERSON_CAMERA_H +#define THIRD_PERSON_CAMERA_H + +#include "scene/3d/camera_3d.h" + +class ThirdPersonCamera : public Camera3D { + GDCLASS(ThirdPersonCamera, Camera3D); + static void _bind_methods(); + void ready(); + void process(double delta); + void on_look_input(Vector2 input); + void on_mouselook_input(Vector2 input); + +public: + void _notification(int what); + + void set_base_rotation_speed(Vector2 value); + Vector2 get_base_rotation_speed() const; + +private: + Vector2 look_rotation_motion{ 0.f, 0.f }; + Vector2 look_rotation{ 0.f, 0.f }; + + Vector2 base_rotation_speed{ 0.1f, 0.1f }; + float distance{ 3.f }; + float height{ 2.2f }; +}; + +#endif // !THIRD_PERSON_CAMERA_H diff --git a/project/locales/city.tscn b/project/locales/city.tscn index 45461d8d..c31fb667 100644 --- a/project/locales/city.tscn +++ b/project/locales/city.tscn @@ -1,7 +1,6 @@ -[gd_scene load_steps=7 format=3 uid="uid://bqaoxvqgrbi3v"] +[gd_scene load_steps=6 format=3 uid="uid://bqaoxvqgrbi3v"] [ext_resource type="Material" uid="uid://cbuk8uxxuj7j5" path="res://materials/grids/grass.tres" id="1_etye1"] -[ext_resource type="Material" uid="uid://ke4yek3xtin5" path="res://materials/grids/bricks.tres" id="1_sb1vi"] [ext_resource type="PackedScene" uid="uid://cykd1a23ria6k" path="res://objects/characters/player_actor.tscn" id="3_vuk2b"] [sub_resource type="ProceduralSkyMaterial" id="ProceduralSkyMaterial_sb1vi"] @@ -19,572 +18,22 @@ glow_enabled = true [node name="City" type="Node"] -[node name="PartySelectionUI" type="CanvasLayer" parent="."] - -[node name="VBoxContainer" type="VBoxContainer" parent="PartySelectionUI"] -anchors_preset = 6 -anchor_left = 1.0 -anchor_top = 0.5 -anchor_right = 1.0 -anchor_bottom = 0.5 -offset_left = -298.0 -offset_top = -211.0 -offset_bottom = 211.0 -grow_horizontal = 0 -grow_vertical = 2 - -[node name="Level" type="Node3D" parent="."] - -[node name="WorldEnvironment" type="WorldEnvironment" parent="Level"] +[node name="WorldEnvironment" type="WorldEnvironment" parent="."] environment = SubResource("Environment_wwygw") -[node name="DirectionalLight3D" type="DirectionalLight3D" parent="Level"] -transform = Transform3D(-0.866024, -0.433016, 0.250001, 0, 0.499998, 0.866026, -0.500003, 0.749999, -0.43301, 0, 0, 0) +[node name="DirectionalLight3D" type="DirectionalLight3D" parent="."] +transform = Transform3D(-0.866023, -0.433016, 0.250001, 0, 0.499998, 0.866027, -0.500003, 0.749999, -0.43301, 0, 0, 0) shadow_enabled = true -[node name="CSGWorld" type="CSGCombiner3D" parent="Level"] -use_collision = true - -[node name="CSGBox3D2" type="CSGBox3D" parent="Level/CSGWorld"] -transform = Transform3D(1, 0, 0, 0, 1, 0, 0, 0, 1, -16.7726, 1.24028, -3.26613) -size = Vector3(29.3063, 2.53036, 32.2042) -material = ExtResource("1_sb1vi") - -[node name="CSGBox3D4" type="CSGBox3D" parent="Level/CSGWorld/CSGBox3D2"] -operation = 2 -size = Vector3(28.3818, 4.94897, 31.2627) -material = ExtResource("1_sb1vi") - -[node name="CSGBox3D5" type="CSGBox3D" parent="Level/CSGWorld/CSGBox3D2"] -transform = Transform3D(1, 0, 0, 0, 1, 0, 0, 0, 1, 12.3707, 0, 8.21931) -operation = 2 -size = Vector3(5.48248, 4.94897, 4.52136) -material = ExtResource("1_sb1vi") - -[node name="CSGBox3D10" type="CSGBox3D" parent="Level/CSGWorld/CSGBox3D2"] -transform = Transform3D(0.996095, -0.0882858, 0, 0.0882858, 0.996095, 0, 0, 0, 1, -4.27235, 1.64007, -16.0551) -operation = 2 -size = Vector3(17.209, 2.77515, 1.67773) -material = ExtResource("1_sb1vi") - -[node name="CSGBox3D11" type="CSGBox3D" parent="Level/CSGWorld/CSGBox3D2"] -transform = Transform3D(-0.662908, 0.748701, 0, -0.748701, -0.662908, 0, 0, 0, 1, 1.99536, 0.140041, -16.0551) -operation = 2 -size = Vector3(3.51099, 4.26892, 1.67773) -material = ExtResource("1_sb1vi") - -[node name="CSGBox3D12" type="CSGBox3D" parent="Level/CSGWorld/CSGBox3D2"] -transform = Transform3D(0.0515306, -0.596407, 0.801026, -0.589269, -0.665739, -0.45777, 0.806292, -0.448431, -0.38575, 13.6247, 0.402275, -15.0203) -operation = 2 -size = Vector3(4.65393, 4.26892, 4.29919) -material = ExtResource("1_sb1vi") - -[node name="CSGBox3D9" type="CSGBox3D" parent="Level/CSGWorld/CSGBox3D2"] -transform = Transform3D(1, 0, 0, 0, 0.990234, 0.139415, 0, -0.139415, 0.990234, -15.0347, 1.84148, -10.1624) -operation = 2 -size = Vector3(5.48248, 4.94897, 15.628) -material = ExtResource("1_sb1vi") - -[node name="CSGBox3D6" type="CSGBox3D" parent="Level/CSGWorld/CSGBox3D2"] -transform = Transform3D(0.996356, 0.0852952, 0, -0.0852952, 0.996356, 0, 0, 0, 1, -6.08641, 2.3849, 15.0748) -operation = 2 -size = Vector3(18.0761, 4.49255, 4.52136) -material = ExtResource("1_sb1vi") - -[node name="CSGBox3D13" type="CSGBox3D" parent="Level/CSGWorld/CSGBox3D2"] -transform = Transform3D(0.940934, 0.33859, 0, -0.33859, 0.940934, 0, 0, 0, 1, 10.9771, 1.22338, 15.0748) -operation = 2 -size = Vector3(5.48767, 4.49255, 4.52136) -material = ExtResource("1_sb1vi") - -[node name="CSGBox3D7" type="CSGBox3D" parent="Level/CSGWorld/CSGBox3D2"] -transform = Transform3D(0.998184, -0.0602297, 0, 0.0602297, 0.998184, 0, 0, 0, 1, -11.169, 1.83497, 16.5285) -operation = 2 -size = Vector3(7.92215, 4.49255, 4.52136) -material = ExtResource("1_sb1vi") - -[node name="CSGBox3D8" type="CSGBox3D" parent="Level/CSGWorld/CSGBox3D2"] -transform = Transform3D(0.938076, -0.346428, 0, 0.346428, 0.938076, 0, 0, 0, 1, -8.1568, 0.67643, 16.5285) -operation = 2 -size = Vector3(4.54713, 4.49255, 4.52136) -material = ExtResource("1_sb1vi") - -[node name="CSGBox3D9" type="CSGBox3D" parent="Level/CSGWorld"] -transform = Transform3D(-1, 0, 8.74228e-08, 0, 1, 0, -8.74228e-08, 0, -1, 17.3635, 1.24027, -22.297) -size = Vector3(29.3063, 2.53036, 32.2042) -material = ExtResource("1_sb1vi") - -[node name="CSGBox3D4" type="CSGBox3D" parent="Level/CSGWorld/CSGBox3D9"] -operation = 2 -size = Vector3(28.3818, 4.94897, 31.2627) -material = ExtResource("1_sb1vi") - -[node name="CSGBox3D5" type="CSGBox3D" parent="Level/CSGWorld/CSGBox3D9"] -transform = Transform3D(1, 0, 0, 0, 1, 0, 0, 0, 1, 12.3707, 0, 8.21931) -operation = 2 -size = Vector3(5.48248, 4.94897, 4.52136) -material = ExtResource("1_sb1vi") - -[node name="CSGBox3D6" type="CSGBox3D" parent="Level/CSGWorld/CSGBox3D9"] -transform = Transform3D(1, 0, 0, 0, 1, 0, 0, 0, 1, 1.67738, 1.90735e-06, -15.8587) -operation = 2 -size = Vector3(11.8087, 4.94897, 1.39062) -material = ExtResource("1_sb1vi") - -[node name="CSGBox3D10" type="CSGBox3D" parent="Level/CSGWorld/CSGBox3D9"] -transform = Transform3D(0.983341, 0.181772, 0, -0.181772, 0.983341, 0, 0, 0, 1, 5.71055, 0.339279, 15.5698) -operation = 2 -size = Vector3(9.78, 4.23425, 1.39062) -material = ExtResource("1_sb1vi") - -[node name="CSGBox3D9" type="CSGBox3D" parent="Level/CSGWorld/CSGBox3D9"] -transform = Transform3D(-4.37114e-08, 0, 1, 0, 1, 0, -1, 0, -4.37114e-08, -14.4351, 1.90735e-06, -3.8005) -operation = 2 -size = Vector3(11.8087, 4.94897, 1.39062) -material = ExtResource("1_sb1vi") - -[node name="CSGBox3D7" type="CSGBox3D" parent="Level/CSGWorld/CSGBox3D9"] -transform = Transform3D(0.835299, 0.549796, 0, -0.549796, 0.835299, 0, 0, 0, 1, -2.58652, 1.00152, -15.8587) -operation = 2 -size = Vector3(2.53568, 4.46423, 1.39062) -material = ExtResource("1_sb1vi") - -[node name="CSGBox3D8" type="CSGBox3D" parent="Level/CSGWorld/CSGBox3D9"] -transform = Transform3D(0.835299, 0.549796, -9.2008e-09, -0.491933, 0.747388, 0.446557, 0.245515, -0.373009, 0.894755, -14.5944, -0.54182, -15.1699) -operation = 2 -size = Vector3(3, 4.46423, 2.88232) -material = ExtResource("1_sb1vi") - -[node name="CSGBox3D4" type="CSGBox3D" parent="Level/CSGWorld"] -transform = Transform3D(0.94881, 0, 0.315848, 0, 1, 0, -0.315848, 0, 0.94881, -7.66859, 1.24028, 32.2569) -size = Vector3(22.6908, 2.53036, 26.0577) -material = ExtResource("1_sb1vi") - -[node name="CSGBox3D4" type="CSGBox3D" parent="Level/CSGWorld/CSGBox3D4"] -operation = 2 -size = Vector3(21.699, 4.94897, 24.7637) -material = ExtResource("1_sb1vi") - -[node name="CSGBox3D5" type="CSGBox3D" parent="Level/CSGWorld/CSGBox3D4"] -transform = Transform3D(1, 0, 0, 0, 1, 0, 0, 0, 1, 9.81546, 0, 1.44135) -operation = 2 -size = Vector3(5.48248, 4.94897, 4.52136) -material = ExtResource("1_sb1vi") - -[node name="CSGBox3D12" type="CSGBox3D" parent="Level/CSGWorld/CSGBox3D4"] -transform = Transform3D(0.966641, 0.256107, 0.00379327, -0.221096, 0.841791, -0.492448, -0.129312, 0.475181, 0.870333, 10.1198, 1.29747, 12.165) -operation = 2 -size = Vector3(5.48248, 4.94897, 5.69867) -material = ExtResource("1_sb1vi") - -[node name="CSGBox3D6" type="CSGBox3D" parent="Level/CSGWorld/CSGBox3D4"] -transform = Transform3D(0.861603, -0.507583, 0, 0.507583, 0.861603, 0, 0, 0, 1, 1.68174, 0.365051, 12.4396) -operation = 2 -size = Vector3(5.18265, 4.66061, 4.52136) -material = ExtResource("1_sb1vi") - -[node name="CSGBox3D7" type="CSGBox3D" parent="Level/CSGWorld/CSGBox3D4"] -transform = Transform3D(0.956661, -0.291203, 0, 0.291203, 0.956661, 0, 8.9407e-08, -7.45058e-09, 1, -5.16157, 2.49941, 12.5804) -operation = 2 -size = Vector3(8.79707, 4.04699, 4.52136) -material = ExtResource("1_sb1vi") - -[node name="CSGBox3D11" type="CSGBox3D" parent="Level/CSGWorld/CSGBox3D4"] -transform = Transform3D(-1.49012e-07, 6.70552e-08, -1, 0.291203, 0.956661, 0, 0.956661, -0.291203, -5.96046e-08, -10.3324, 0.55706, 9.10962) -operation = 2 -size = Vector3(8.30031, 5.37523, 4.52136) -material = ExtResource("1_sb1vi") - -[node name="CSGBox3D8" type="CSGBox3D" parent="Level/CSGWorld/CSGBox3D4"] -transform = Transform3D(0.942027, 0.335534, 0, -0.335534, 0.942028, 0, 2.38419e-07, 7.45058e-08, 1, 1.96285, 0.912893, -11.3267) -operation = 2 -size = Vector3(20.6193, 10.1297, 4.52136) -material = ExtResource("1_sb1vi") - -[node name="CSGBox3D9" type="CSGBox3D" parent="Level/CSGWorld/CSGBox3D4"] -transform = Transform3D(2.98023e-07, -2.98023e-08, 1, 0.477634, 0.878559, 0, -0.878558, 0.477634, 0, -11.4397, 0.843881, -2.17569) -operation = 2 -size = Vector3(9.11396, 5.37523, 4.52136) -material = ExtResource("1_sb1vi") - -[node name="CSGBox3D10" type="CSGBox3D" parent="Level/CSGWorld/CSGBox3D4"] -transform = Transform3D(1.19209e-07, -4.47035e-08, 1, 0.22165, 0.975126, 0, -0.975125, 0.22165, 0, -11.4397, -1.17258, -1.42908) -operation = 2 -size = Vector3(9.26142, 5.37523, 4.52136) -material = ExtResource("1_sb1vi") - -[node name="CSGBox3D7" type="CSGBox3D" parent="Level/CSGWorld"] -transform = Transform3D(-0.980662, 0, -0.195706, 0, 1, 0, 0.195706, 0, -0.980662, 16.4482, 1.24028, 10.8159) -size = Vector3(22.6908, 2.53036, 26.0577) -material = ExtResource("1_sb1vi") - -[node name="CSGBox3D4" type="CSGBox3D" parent="Level/CSGWorld/CSGBox3D7"] -operation = 2 -size = Vector3(21.699, 4.94897, 24.7637) -material = ExtResource("1_sb1vi") - -[node name="CSGBox3D5" type="CSGBox3D" parent="Level/CSGWorld/CSGBox3D7"] -transform = Transform3D(1, 0, 0, 0, 1, 0, 0, 0, 1, 9.81546, 0, 1.44135) -operation = 2 -size = Vector3(5.48248, 4.94897, 4.52136) -material = ExtResource("1_sb1vi") - -[node name="CSGBox3D11" type="CSGBox3D" parent="Level/CSGWorld/CSGBox3D7"] -transform = Transform3D(1, 0, -7.45058e-08, 0, 1, 0, 7.45058e-08, 0, 1, 9.81546, 1.02972, -11.1309) -operation = 2 -size = Vector3(5.48248, 2.88953, 4.52136) -material = ExtResource("1_sb1vi") - -[node name="CSGBox3D12" type="CSGBox3D" parent="Level/CSGWorld/CSGBox3D7"] -transform = Transform3D(0.968409, -0.249366, -7.45058e-08, 0.249366, 0.968409, 0, 7.21521e-08, -1.85792e-08, 1, 7.47525, 1.68203, -11.1309) -operation = 2 -size = Vector3(5.48248, 2.88953, 4.52136) -material = ExtResource("1_sb1vi") - -[node name="CSGBox3D9" type="CSGBox3D" parent="Level/CSGWorld/CSGBox3D7"] -transform = Transform3D(1, 0, -7.45058e-08, 0, 1, 0, 7.45058e-08, 0, 1, -7.5132, 2.28486, -10.4518) -operation = 2 -size = Vector3(8.62306, 4.94897, 5.58841) -material = ExtResource("1_sb1vi") - -[node name="CSGBox3D10" type="CSGBox3D" parent="Level/CSGWorld/CSGBox3D7"] -transform = Transform3D(0.920047, -0.391807, -7.45058e-08, 0.391807, 0.920047, 0, 7.45058e-08, -2.98023e-08, 1, -6.59657, 0.52667, -12.3894) -operation = 2 -size = Vector3(7.21283, 3.23804, 1.71315) -material = ExtResource("1_sb1vi") - -[node name="CSGBox3D6" type="CSGBox3D" parent="Level/CSGWorld/CSGBox3D7"] -transform = Transform3D(1, 0, -7.45058e-08, 0, 1, 0, 7.45058e-08, 0, 1, -1.74361, 1.34271, 10.7097) -operation = 2 -size = Vector3(19.7208, 2.26355, 5.36632) -material = ExtResource("1_sb1vi") - -[node name="CSGBox3D7" type="CSGBox3D" parent="Level/CSGWorld/CSGBox3D7"] -transform = Transform3D(0.90949, -0.415725, -7.45058e-08, 0.415725, 0.90949, 0, 5.96046e-08, -2.98023e-08, 1, 6.5508, 1.03969, 12.4855) -operation = 2 -size = Vector3(3.29733, 2.26355, 1.9962) -material = ExtResource("1_sb1vi") - -[node name="CSGBox3D8" type="CSGBox3D" parent="Level/CSGWorld/CSGBox3D7"] -transform = Transform3D(0.872811, 0.488058, -7.45058e-08, -0.488058, 0.872811, 0, 5.96046e-08, 4.47035e-08, 1, 3.25758, 0.0104947, 12.4855) -operation = 2 -size = Vector3(3.29733, 3.41986, 1.9962) -material = ExtResource("1_sb1vi") - -[node name="CSGBox3D5" type="CSGBox3D" parent="Level/CSGWorld"] -transform = Transform3D(1, 0, 0, 0, 1, 0, 0, 0, 1, -13.4648, 1.24028, -35.2034) -size = Vector3(22.6908, 2.53036, 26.0577) -material = ExtResource("1_sb1vi") - -[node name="CSGBox3D4" type="CSGBox3D" parent="Level/CSGWorld/CSGBox3D5"] -operation = 2 -size = Vector3(21.699, 4.94897, 24.7637) -material = ExtResource("1_sb1vi") - -[node name="CSGBox3D5" type="CSGBox3D" parent="Level/CSGWorld/CSGBox3D5"] -transform = Transform3D(1, 0, 0, 0, 1, 0, 0, 0, 1, 9.81546, 0, 1.44135) -operation = 2 -size = Vector3(5.48248, 4.94897, 4.52136) -material = ExtResource("1_sb1vi") - -[node name="CSGBox3D6" type="CSGBox3D" parent="Level/CSGWorld/CSGBox3D5"] -transform = Transform3D(0.922282, -0.386518, 0, 0.386518, 0.922282, 0, 0, 0, 1, -1.86533, 0.1865, 12.965) -operation = 2 -size = Vector3(7.06031, 5.05847, 2.48825) -material = ExtResource("1_sb1vi") - -[node name="CSGBox3D8" type="CSGBox3D" parent="Level/CSGWorld/CSGBox3D5"] -transform = Transform3D(-4.03142e-08, 1.68952e-08, 1, 0.386518, 0.922282, 0, -0.922282, 0.386518, -4.37114e-08, -10.9717, 0.1865, -0.139679) -operation = 2 -size = Vector3(7.06031, 5.05847, 2.48825) -material = ExtResource("1_sb1vi") - -[node name="CSGBox3D9" type="CSGBox3D" parent="Level/CSGWorld/CSGBox3D5"] -transform = Transform3D(-0.999949, 0.0101053, -8.74228e-08, 0.0101053, 0.999949, 0, 8.74183e-08, -8.83436e-10, -1, 1.46112, -0.431518, -12.5492) -operation = 2 -size = Vector3(10.2582, 5.05847, 2.48825) -material = ExtResource("1_sb1vi") - -[node name="CSGBox3D7" type="CSGBox3D" parent="Level/CSGWorld/CSGBox3D5"] -transform = Transform3D(1, 0, 0, 0, 0.856465, 0.516204, 0, -0.516204, 0.856465, 11.0115, 0, -6.14323) -operation = 2 -size = Vector3(3.41214, 4.94897, 4.52136) -material = ExtResource("1_sb1vi") - -[node name="CSGBox3D" type="CSGBox3D" parent="Level/CSGWorld"] -transform = Transform3D(1, 0, 0, 0, 1, 0, 0, 0, 1, 0.0259626, -3.00393, -0.963224) -size = Vector3(86.0781, 6, 106.223) -material = ExtResource("1_etye1") - -[node name="CSGBox3D3" type="CSGBox3D" parent="Level/CSGWorld"] -transform = Transform3D(1, 0, 0, 0, 1, 0, 0, 0, 1, 0.295873, -0.0920334, -20.6882) -size = Vector3(5.66602, 0.212601, 66.5905) -material = ExtResource("1_sb1vi") - -[node name="CSGBox3D6" type="CSGBox3D" parent="Level/CSGWorld"] -transform = Transform3D(0.951525, 0, 0.307573, 0, 1, 0, -0.307573, 0, 0.951525, 6.34913, -0.0920353, 30.9568) -size = Vector3(5.66602, 0.212601, 40.6149) -material = ExtResource("1_sb1vi") - -[node name="CSGBox3D8" type="CSGBox3D" parent="Level/CSGWorld"] -transform = Transform3D(0.979392, 0, 0.201967, 0, 1, 0, -0.201967, 0, 0.979392, 2.65383, -0.0920353, 13.0373) -size = Vector3(5.66602, 0.212601, 22.0021) -material = ExtResource("1_sb1vi") - -[node name="CSGCombiner3D" type="CSGCombiner3D" parent="Level"] -transform = Transform3D(1, 0, 0, 0, 1, 0, 0, 0, 1, -15.7127, -3.8147e-06, -4.44497) -use_collision = true - -[node name="CSGBox3D" type="CSGBox3D" parent="Level/CSGCombiner3D"] -transform = Transform3D(1, 0, 0, 0, 1, 0, 0, 0, 1, -0.943035, 2.69934, 0.370387) -size = Vector3(13.2101, 6.39868, 18.7856) -material = ExtResource("1_sb1vi") - -[node name="CSGBox3D3" type="CSGBox3D" parent="Level/CSGCombiner3D"] -transform = Transform3D(1, 0, 0, 0, 1, 0, 0, 0, 1, -0.779079, 3.9671, 0.421809) -operation = 2 -size = Vector3(12.1248, 7.93005, 17.5173) -material = ExtResource("1_sb1vi") - -[node name="CSGBox3D2" type="CSGBox3D" parent="Level/CSGCombiner3D"] -transform = Transform3D(1, 0, 0, 0, 1, 0, 0, 0, 1, 3.05528, 5.6087, 1.09461) -operation = 2 -size = Vector3(6.36378, 4.64685, 18.8601) -material = ExtResource("1_sb1vi") - -[node name="CSGBox3D5" type="CSGBox3D" parent="Level/CSGCombiner3D"] -transform = Transform3D(1, 0, 0, 0, 0.993972, -0.10963, 0, 0.10963, 0.993972, -6.20065, 6.81794, -1.62846) -operation = 2 -size = Vector3(6.36378, 4.64685, 18.8601) -material = ExtResource("1_sb1vi") - -[node name="CSGBox3D6" type="CSGBox3D" parent="Level/CSGCombiner3D"] -transform = Transform3D(-4.11049e-08, 0.441193, 0.897412, 1.48684e-08, 0.897412, -0.441193, -1, -4.79209e-09, -4.34479e-08, -2.90541, 6.09294, 9.63982) -operation = 2 -size = Vector3(2.34985, 3.30096, 4) -material = ExtResource("1_sb1vi") - -[node name="CSGBox3D7" type="CSGBox3D" parent="Level/CSGCombiner3D"] -transform = Transform3D(-4.11049e-08, 0.441193, 0.897412, 1.48684e-08, 0.897412, -0.441193, -1, -4.79209e-09, -4.34479e-08, -0.501738, 6.60845, 9.63982) -operation = 2 -size = Vector3(2.34985, 3.30096, 4) -material = ExtResource("1_sb1vi") - -[node name="CSGBox3D8" type="CSGBox3D" parent="Level/CSGCombiner3D"] -transform = Transform3D(-4.11049e-08, 0.924792, 0.380473, 1.48684e-08, 0.380473, -0.924792, -1, -3.23565e-08, -2.93895e-08, 1.50422, 4.57072, -8.66012) -operation = 2 -size = Vector3(2.34985, 3.30096, 3.98828) -material = ExtResource("1_sb1vi") - -[node name="CSGBox3D4" type="CSGBox3D" parent="Level/CSGCombiner3D"] -transform = Transform3D(1, 0, 0, 0, 1, 0, 0, 0, 1, 5.47246, 0.911386, 4.88385) -operation = 2 -size = Vector3(1.52942, 1.75981, 1.18262) -material = ExtResource("1_sb1vi") - -[node name="CSGCombiner3D5" type="CSGCombiner3D" parent="Level"] -transform = Transform3D(1, 0, 0, 0, 1, 0, 0, 0, 1, -12.3902, -3.8147e-06, -34.9045) -use_collision = true - -[node name="CSGBox3D" type="CSGBox3D" parent="Level/CSGCombiner3D5"] -transform = Transform3D(1, 0, 0, 0, 1, 0, 0, 0, 1, -0.943035, 2.69934, 0.370387) -size = Vector3(13.2101, 6.39868, 18.7856) -material = ExtResource("1_sb1vi") - -[node name="CSGBox3D3" type="CSGBox3D" parent="Level/CSGCombiner3D5"] -transform = Transform3D(1, 0, 0, 0, 1, 0, 0, 0, 1, -0.779079, 3.9671, 0.421809) -operation = 2 -size = Vector3(12.1248, 7.93005, 17.5173) -material = ExtResource("1_sb1vi") - -[node name="CSGBox3D2" type="CSGBox3D" parent="Level/CSGCombiner3D5"] -transform = Transform3D(1, 0, 0, 0, 1, 0, 0, 0, 1, 3.05528, 5.6087, 1.09461) -operation = 2 -size = Vector3(6.36378, 4.64685, 18.8601) -material = ExtResource("1_sb1vi") - -[node name="CSGBox3D5" type="CSGBox3D" parent="Level/CSGCombiner3D5"] -transform = Transform3D(1, 0, 0, 0, 0.993972, -0.10963, 0, 0.10963, 0.993972, -6.20065, 6.81794, -1.62846) -operation = 2 -size = Vector3(6.36378, 4.64685, 18.8601) -material = ExtResource("1_sb1vi") - -[node name="CSGBox3D6" type="CSGBox3D" parent="Level/CSGCombiner3D5"] -transform = Transform3D(-4.11049e-08, 0.441193, 0.897412, 1.48684e-08, 0.897412, -0.441193, -1, -4.79209e-09, -4.34479e-08, -2.90541, 6.09294, 9.63982) -operation = 2 -size = Vector3(2.34985, 3.30096, 4) -material = ExtResource("1_sb1vi") - -[node name="CSGBox3D7" type="CSGBox3D" parent="Level/CSGCombiner3D5"] -transform = Transform3D(-4.11049e-08, 0.441193, 0.897412, 1.48684e-08, 0.897412, -0.441193, -1, -4.79209e-09, -4.34479e-08, -0.501738, 6.60845, 9.63982) -operation = 2 -size = Vector3(2.34985, 3.30096, 4) -material = ExtResource("1_sb1vi") - -[node name="CSGBox3D8" type="CSGBox3D" parent="Level/CSGCombiner3D5"] -transform = Transform3D(-4.11049e-08, 0.924792, 0.380473, 1.48684e-08, 0.380473, -0.924792, -1, -3.23565e-08, -2.93895e-08, 1.44811, 4.70709, -8.66012) -operation = 2 -size = Vector3(2.34985, 3.30096, 4.2832) -material = ExtResource("1_sb1vi") - -[node name="CSGBox3D4" type="CSGBox3D" parent="Level/CSGCombiner3D5"] -transform = Transform3D(1, 0, 0, 0, 1, 0, 0, 0, 1, 5.47246, 0.911386, 4.88385) -operation = 2 -size = Vector3(1.52942, 1.75981, 1.18262) -material = ExtResource("1_sb1vi") - -[node name="CSGCombiner3D2" type="CSGCombiner3D" parent="Level"] -transform = Transform3D(0.947261, 0, 0.320464, 0, 1, 0, -0.320464, 0, 0.947261, -9.09123, 0, 34.072) -use_collision = true - -[node name="CSGBox3D" type="CSGBox3D" parent="Level/CSGCombiner3D2"] -transform = Transform3D(1, 0, 0, 0, 1, 0, 0, 0, 1, -0.943035, 2.69934, 0.370387) -size = Vector3(13.2101, 6.39868, 18.7856) -material = ExtResource("1_sb1vi") - -[node name="CSGBox3D3" type="CSGBox3D" parent="Level/CSGCombiner3D2"] -transform = Transform3D(1, 0, 0, 0, 1, 0, 0, 0, 1, -0.779079, 3.9671, 0.421809) -operation = 2 -size = Vector3(12.1248, 7.93005, 17.5173) -material = ExtResource("1_sb1vi") - -[node name="CSGBox3D2" type="CSGBox3D" parent="Level/CSGCombiner3D2"] -transform = Transform3D(1, 0, 0, 0, 1, 0, 0, 0, 1, 3.05528, 5.6087, 1.09461) -operation = 2 -size = Vector3(6.36378, 4.64685, 18.8601) -material = ExtResource("1_sb1vi") - -[node name="CSGBox3D5" type="CSGBox3D" parent="Level/CSGCombiner3D2"] -transform = Transform3D(1, 0, 0, 0, 0.993972, -0.10963, 0, 0.10963, 0.993972, -6.20065, 6.81794, -1.62846) -operation = 2 -size = Vector3(6.36378, 4.64685, 18.8601) -material = ExtResource("1_sb1vi") - -[node name="CSGBox3D6" type="CSGBox3D" parent="Level/CSGCombiner3D2"] -transform = Transform3D(-4.11049e-08, 0.441193, 0.897412, 1.48684e-08, 0.897412, -0.441193, -1, -4.79209e-09, -4.34479e-08, -2.90541, 6.09294, 9.63982) -operation = 2 -size = Vector3(2.34985, 3.30096, 4) -material = ExtResource("1_sb1vi") - -[node name="CSGBox3D7" type="CSGBox3D" parent="Level/CSGCombiner3D2"] -transform = Transform3D(-4.11049e-08, 0.441193, 0.897412, 1.48684e-08, 0.897412, -0.441193, -1, -4.79209e-09, -4.34479e-08, -0.501738, 6.60845, 9.63982) -operation = 2 -size = Vector3(2.34985, 3.30096, 4) -material = ExtResource("1_sb1vi") - -[node name="CSGBox3D8" type="CSGBox3D" parent="Level/CSGCombiner3D2"] -transform = Transform3D(-2.98023e-08, 0.924792, 0.380473, 1.48684e-08, 0.380473, -0.924792, -1, -2.98023e-08, -6.70552e-08, 1.43882, 4.72967, -8.66012) -operation = 2 -size = Vector3(2.34985, 3.30096, 4.33203) -material = ExtResource("1_sb1vi") - -[node name="CSGBox3D4" type="CSGBox3D" parent="Level/CSGCombiner3D2"] -transform = Transform3D(1, 0, 0, 0, 1, 0, 0, 0, 1, 5.47246, 0.911386, 4.88385) -operation = 2 -size = Vector3(1.52942, 1.75981, 1.18262) -material = ExtResource("1_sb1vi") - -[node name="CSGCombiner3D3" type="CSGCombiner3D" parent="Level"] -transform = Transform3D(-0.979862, 0, -0.199676, 0, 1, 0, 0.199676, 0, -0.979862, 18.4676, 0, 11.5749) -use_collision = true - -[node name="CSGBox3D" type="CSGBox3D" parent="Level/CSGCombiner3D3"] -transform = Transform3D(1, 0, 0, 0, 1, 0, 0, 0, 1, -0.943035, 2.69934, 0.370387) -size = Vector3(13.2101, 6.39868, 18.7856) -material = ExtResource("1_sb1vi") - -[node name="CSGBox3D3" type="CSGBox3D" parent="Level/CSGCombiner3D3"] -transform = Transform3D(1, 0, 0, 0, 1, 0, 0, 0, 1, -0.779079, 3.9671, 0.421809) -operation = 2 -size = Vector3(12.1248, 7.93005, 17.5173) -material = ExtResource("1_sb1vi") - -[node name="CSGBox3D2" type="CSGBox3D" parent="Level/CSGCombiner3D3"] -transform = Transform3D(1, 0, 0, 0, 1, 0, 0, 0, 1, 3.05528, 5.6087, 1.09461) -operation = 2 -size = Vector3(6.36378, 4.64685, 18.8601) -material = ExtResource("1_sb1vi") - -[node name="CSGBox3D5" type="CSGBox3D" parent="Level/CSGCombiner3D3"] -transform = Transform3D(1, 0, 0, 0, 0.993972, -0.10963, 0, 0.10963, 0.993972, -6.20065, 6.81794, -1.62846) -operation = 2 -size = Vector3(6.36378, 4.64685, 18.8601) -material = ExtResource("1_sb1vi") - -[node name="CSGBox3D6" type="CSGBox3D" parent="Level/CSGCombiner3D3"] -transform = Transform3D(-4.11049e-08, 0.441193, 0.897412, 1.48684e-08, 0.897412, -0.441193, -1, -4.79209e-09, -4.34479e-08, -2.90541, 6.09294, 9.63982) -operation = 2 -size = Vector3(2.34985, 3.30096, 4) -material = ExtResource("1_sb1vi") - -[node name="CSGBox3D7" type="CSGBox3D" parent="Level/CSGCombiner3D3"] -transform = Transform3D(-4.11049e-08, 0.441193, 0.897412, 1.48684e-08, 0.897412, -0.441193, -1, -4.79209e-09, -4.34479e-08, -0.501738, 6.60845, 9.63982) -operation = 2 -size = Vector3(2.34985, 3.30096, 4) -material = ExtResource("1_sb1vi") - -[node name="CSGBox3D8" type="CSGBox3D" parent="Level/CSGCombiner3D3"] -transform = Transform3D(-4.11049e-08, 0.924792, 0.380473, 1.48684e-08, 0.380473, -0.924792, -1, -3.23565e-08, -2.93895e-08, 1.55623, 4.44428, -8.66012) -operation = 2 -size = Vector3(2.34985, 3.30096, 3.71484) -material = ExtResource("1_sb1vi") - -[node name="CSGBox3D4" type="CSGBox3D" parent="Level/CSGCombiner3D3"] -transform = Transform3D(1, 0, 0, 0, 1, 0, 0, 0, 1, 5.47246, 0.911386, 4.88385) -operation = 2 -size = Vector3(1.52942, 1.75981, 1.18262) -material = ExtResource("1_sb1vi") - -[node name="CSGCombiner3D4" type="CSGCombiner3D" parent="Level"] -transform = Transform3D(-0.970654, 0, 0.240482, 0, 1, 0, -0.240482, 0, -0.970654, 19.1359, 0, -21.0191) -use_collision = true - -[node name="CSGBox3D" type="CSGBox3D" parent="Level/CSGCombiner3D4"] -transform = Transform3D(1, 0, 0, 0, 1, 0, 0, 0, 1, -0.943035, 2.69934, 0.370387) -size = Vector3(13.2101, 6.39868, 18.7856) -material = ExtResource("1_sb1vi") - -[node name="CSGBox3D3" type="CSGBox3D" parent="Level/CSGCombiner3D4"] -transform = Transform3D(1, 0, 0, 0, 1, 0, 0, 0, 1, -0.779079, 3.9671, 0.421809) -operation = 2 -size = Vector3(12.1248, 7.93005, 17.5173) -material = ExtResource("1_sb1vi") - -[node name="CSGBox3D2" type="CSGBox3D" parent="Level/CSGCombiner3D4"] -transform = Transform3D(1, 0, 0, 0, 1, 0, 0, 0, 1, 3.05528, 5.6087, 1.09461) -operation = 2 -size = Vector3(6.36378, 4.64685, 18.8601) -material = ExtResource("1_sb1vi") - -[node name="CSGBox3D5" type="CSGBox3D" parent="Level/CSGCombiner3D4"] -transform = Transform3D(1, 0, 0, 0, 0.993972, -0.10963, 0, 0.10963, 0.993972, -6.20065, 6.81794, -1.62846) -operation = 2 -size = Vector3(6.36378, 4.64685, 18.8601) -material = ExtResource("1_sb1vi") - -[node name="CSGBox3D6" type="CSGBox3D" parent="Level/CSGCombiner3D4"] -transform = Transform3D(-4.11049e-08, 0.441193, 0.897412, 1.48684e-08, 0.897412, -0.441193, -1, -4.79209e-09, -4.34479e-08, -2.90541, 6.09294, 9.63982) -operation = 2 -size = Vector3(2.34985, 3.30096, 4) -material = ExtResource("1_sb1vi") - -[node name="CSGBox3D7" type="CSGBox3D" parent="Level/CSGCombiner3D4"] -transform = Transform3D(-4.11049e-08, 0.441193, 0.897412, 1.48684e-08, 0.897412, -0.441193, -1, -4.79209e-09, -4.34479e-08, -0.501738, 6.60845, 9.63982) -operation = 2 -size = Vector3(2.34985, 3.30096, 4) -material = ExtResource("1_sb1vi") - -[node name="CSGBox3D8" type="CSGBox3D" parent="Level/CSGCombiner3D4"] -transform = Transform3D(-4.11049e-08, 0.924792, 0.380473, 1.48684e-08, 0.380473, -0.924792, -1, -3.23565e-08, -2.93895e-08, 1.55623, 4.44428, -8.66012) -operation = 2 -size = Vector3(2.34985, 3.30096, 3.71484) -material = ExtResource("1_sb1vi") - -[node name="CSGBox3D4" type="CSGBox3D" parent="Level/CSGCombiner3D4"] -transform = Transform3D(1, 0, 0, 0, 1, 0, 0, 0, 1, 5.47246, 0.911386, 4.88385) -operation = 2 -size = Vector3(1.52942, 1.75981, 1.18262) -material = ExtResource("1_sb1vi") +[node name="CampEntrance" type="Node3D" parent="."] +unique_name_in_owner = true +transform = Transform3D(1, 0, 0, 0, 1, 0, 0, 0, 1, 16.2797, -0.00393486, -42.0831) [node name="PlayerActor" parent="." instance=ExtResource("3_vuk2b")] -transform = Transform3D(1, 0, 0, 0, 1, 0, 0, 0, 1, 13.6368, -0.00393009, -46.4616) +transform = Transform3D(1, 0, 0, 0, 1, 0, 0, 0, 1, -0.0171704, -0.00572681, 0.28793) + +[node name="CSGBox3D" type="CSGBox3D" parent="."] +transform = Transform3D(1, 0, 0, 0, 1, 0, 0, 0, 1, 0, -0.505729, 0) +use_collision = true +size = Vector3(100, 1, 100) +material = ExtResource("1_etye1") diff --git a/project/maps/map.tscn b/project/maps/map.tscn deleted file mode 100644 index 3b75753e..00000000 --- a/project/maps/map.tscn +++ /dev/null @@ -1,126 +0,0 @@ -[gd_scene load_steps=11 format=3 uid="uid://mn086drdvyym"] - -[sub_resource type="ProceduralSkyMaterial" id="ProceduralSkyMaterial_oejri"] -sky_horizon_color = Color(0.662243, 0.671743, 0.686743, 1) -ground_horizon_color = Color(0.662243, 0.671743, 0.686743, 1) - -[sub_resource type="Sky" id="Sky_urvl1"] -sky_material = SubResource("ProceduralSkyMaterial_oejri") - -[sub_resource type="Environment" id="Environment_ers5l"] -background_mode = 2 -sky = SubResource("Sky_urvl1") -tonemap_mode = 2 -glow_enabled = true - -[sub_resource type="StandardMaterial3D" id="StandardMaterial3D_oejri"] -albedo_color = Color(0.16206, 0.18, 0.1332, 1) - -[sub_resource type="QuadMesh" id="QuadMesh_oejri"] -size = Vector2(100, 100) -orientation = 1 - -[sub_resource type="StandardMaterial3D" id="StandardMaterial3D_urvl1"] -albedo_color = Color(0.21, 0.232, 0.25, 1) - -[sub_resource type="CylinderMesh" id="CylinderMesh_ers5l"] -top_radius = 10.0 -bottom_radius = 10.0 -height = 0.5 - -[sub_resource type="CylinderShape3D" id="CylinderShape3D_c3pkw"] -radius = 2.86377 - -[sub_resource type="PrismMesh" id="PrismMesh_oejri"] - -[sub_resource type="BoxMesh" id="BoxMesh_oejri"] -size = Vector3(0.53, 0.56, 1) - -[node name="Map" type="Node3D"] - -[node name="WorldEnvironment" type="WorldEnvironment" parent="."] -environment = SubResource("Environment_ers5l") - -[node name="DirectionalLight3D" type="DirectionalLight3D" parent="."] -transform = Transform3D(-0.866023, -0.433016, 0.250001, 0, 0.499998, 0.866027, -0.500003, 0.749999, -0.43301, 0, 0, 0) -shadow_enabled = true - -[node name="MeshInstance3D" type="MeshInstance3D" parent="."] -material_override = SubResource("StandardMaterial3D_oejri") -mesh = SubResource("QuadMesh_oejri") - -[node name="LocaleMarker" type="LocaleMarker" parent="."] -locale_scene = "uid://bqaoxvqgrbi3v" -entrance_path = "%CampEntrance" -transform = Transform3D(1, 0, 0, 0, 1, 0, 0, 0, 1, 19.8126, -1.90735e-06, -10.5129) - -[node name="MeshInstance3D" type="MeshInstance3D" parent="LocaleMarker"] -material_override = SubResource("StandardMaterial3D_urvl1") -mesh = SubResource("CylinderMesh_ers5l") - -[node name="CollisionShape3D" type="CollisionShape3D" parent="LocaleMarker"] -transform = Transform3D(1, 0, 0, 0, 1, 0, 0, 0, 1, -14.1601, 0, 4.78461) -shape = SubResource("CylinderShape3D_c3pkw") - -[node name="Label3D" type="Label3D" parent="LocaleMarker"] -transform = Transform3D(1, 0, 4.37114e-08, -4.37114e-08, 1.91069e-15, 1, 0, -1, 1.91069e-15, 0, 1.03264, 0) -pixel_size = 0.1 -text = "City -" - -[node name="Label3D2" type="Label3D" parent="LocaleMarker"] -transform = Transform3D(1, 0, 4.37114e-08, -4.37114e-08, 1.91069e-15, 1, 0, -1, 1.91069e-15, -14.3197, 1.03264, 2.5534) -pixel_size = 0.05 -text = "Camp" - -[node name="Label3D3" type="Label3D" parent="LocaleMarker"] -transform = Transform3D(1, 0, 4.37114e-08, -4.37114e-08, 1.91069e-15, 1, 0, -1, 1.91069e-15, -15.5085, 1.03264, 4.74225) -pixel_size = 0.05 -modulate = Color(1, 0, 0, 1) -text = "! -" - -[node name="MeshInstance3D2" type="MeshInstance3D" parent="LocaleMarker"] -transform = Transform3D(-0.0195116, 0, 0.99981, 0, 1, 0, -0.99981, 0, -0.0195116, -15.7257, 0, 5.36808) -mesh = SubResource("PrismMesh_oejri") - -[node name="MeshInstance3D3" type="MeshInstance3D" parent="LocaleMarker"] -transform = Transform3D(-0.0195116, 0, 0.99981, 0, 1, 0, -0.99981, 0, -0.0195116, -15.7232, 0, 4.67118) -mesh = SubResource("PrismMesh_oejri") - -[node name="MeshInstance3D4" type="MeshInstance3D" parent="LocaleMarker"] -transform = Transform3D(-0.0195116, 0, 0.99981, 0, 1, 0, -0.99981, 0, -0.0195116, -15.807, 0, 4.03467) -mesh = SubResource("PrismMesh_oejri") - -[node name="MeshInstance3D5" type="MeshInstance3D" parent="LocaleMarker"] -transform = Transform3D(-0.0195116, 0, 0.99981, 0, 1, 0, -0.99981, 0, -0.0195116, -13.7496, -4.76837e-07, 2.95756) -mesh = SubResource("PrismMesh_oejri") - -[node name="MeshInstance3D6" type="MeshInstance3D" parent="LocaleMarker"] -transform = Transform3D(-0.0195116, 0, 0.99981, 0, 1, 0, -0.99981, 0, -0.0195116, -13.2813, -4.76837e-07, 3.76329) -mesh = SubResource("PrismMesh_oejri") - -[node name="MeshInstance3D7" type="MeshInstance3D" parent="LocaleMarker"] -transform = Transform3D(-0.0195116, 0, 0.99981, 0, 1, 0, -0.99981, 0, -0.0195116, -13.2956, -4.76837e-07, 4.4297) -mesh = SubResource("PrismMesh_oejri") - -[node name="MeshInstance3D8" type="MeshInstance3D" parent="LocaleMarker"] -transform = Transform3D(-0.0195116, 0, 0.99981, 0, 1, 0, -0.99981, 0, -0.0195116, -13.3204, -4.76837e-07, 5.30799) -mesh = SubResource("PrismMesh_oejri") - -[node name="MeshInstance3D9" type="MeshInstance3D" parent="LocaleMarker"] -transform = Transform3D(-0.0195116, 0, 0.99981, 0, 1, 0, -0.99981, 0, -0.0195116, -13.3516, -4.76837e-07, 6.29061) -mesh = SubResource("PrismMesh_oejri") - -[node name="Camera3D" type="Camera3D" parent="."] -transform = Transform3D(1, 0, 0, 0, 0.258819, 0.965926, 0, -0.965926, 0.258819, 0, 26.4443, 6.29706) -fov = 52.6 - -[node name="MeshInstance3D2" type="MeshInstance3D" parent="."] -transform = Transform3D(1, 0, 0, 0, 1, 0, 0, 0, 1, 0, 0.292486, 0) -mesh = SubResource("BoxMesh_oejri") - -[node name="Label3D" type="Label3D" parent="MeshInstance3D2"] -transform = Transform3D(1, 0, 4.37114e-08, -4.37114e-08, 1.91069e-15, 1, 0, -1, 1.91069e-15, 0, 1.03264, -0.956246) -pixel_size = 0.05 -text = "You" diff --git a/project/objects/characters/player_actor.tscn b/project/objects/characters/player_actor.tscn index 568b74a6..c499369d 100644 --- a/project/objects/characters/player_actor.tscn +++ b/project/objects/characters/player_actor.tscn @@ -17,5 +17,5 @@ mesh = SubResource("CylinderMesh_66ixd") [node name="PlayerInput" type="PlayerInput" parent="."] unique_name_in_owner = true -[node name="Camera3D" type="Camera3D" parent="."] +[node name="Camera3D" type="ThirdPersonCamera" parent="."] transform = Transform3D(-1, 0, 8.74228e-08, 0, 1, 0, -8.74228e-08, 0, -1, 4.76837e-07, 1.8675, -2.90407) diff --git a/project/project.godot b/project/project.godot index f9818ecd..0ee1b8b4 100644 --- a/project/project.godot +++ b/project/project.godot @@ -11,29 +11,57 @@ config_version=5 [application] config/name="authority" -run/main_scene="uid://mn086drdvyym" +run/main_scene="uid://bqaoxvqgrbi3v" config/features=PackedStringArray("4.4", "Forward Plus") config/icon="res://icon.svg" +[display] + +window/vsync/vsync_mode=2 + [input] move_left={ "deadzone": 0.2, "events": [Object(InputEventKey,"resource_local_to_scene":false,"resource_name":"","device":-1,"window_id":0,"alt_pressed":false,"shift_pressed":false,"ctrl_pressed":false,"meta_pressed":false,"pressed":false,"keycode":0,"physical_keycode":65,"key_label":0,"unicode":97,"location":0,"echo":false,"script":null) +, Object(InputEventJoypadMotion,"resource_local_to_scene":false,"resource_name":"","device":-1,"axis":0,"axis_value":-1.0,"script":null) ] } move_right={ "deadzone": 0.2, "events": [Object(InputEventKey,"resource_local_to_scene":false,"resource_name":"","device":-1,"window_id":0,"alt_pressed":false,"shift_pressed":false,"ctrl_pressed":false,"meta_pressed":false,"pressed":false,"keycode":0,"physical_keycode":68,"key_label":0,"unicode":100,"location":0,"echo":false,"script":null) +, Object(InputEventJoypadMotion,"resource_local_to_scene":false,"resource_name":"","device":-1,"axis":0,"axis_value":1.0,"script":null) ] } move_forward={ "deadzone": 0.2, "events": [Object(InputEventKey,"resource_local_to_scene":false,"resource_name":"","device":-1,"window_id":0,"alt_pressed":false,"shift_pressed":false,"ctrl_pressed":false,"meta_pressed":false,"pressed":false,"keycode":0,"physical_keycode":87,"key_label":0,"unicode":119,"location":0,"echo":false,"script":null) +, Object(InputEventJoypadMotion,"resource_local_to_scene":false,"resource_name":"","device":-1,"axis":1,"axis_value":-1.0,"script":null) ] } move_back={ "deadzone": 0.2, "events": [Object(InputEventKey,"resource_local_to_scene":false,"resource_name":"","device":-1,"window_id":0,"alt_pressed":false,"shift_pressed":false,"ctrl_pressed":false,"meta_pressed":false,"pressed":false,"keycode":0,"physical_keycode":83,"key_label":0,"unicode":115,"location":0,"echo":false,"script":null) +, Object(InputEventJoypadMotion,"resource_local_to_scene":false,"resource_name":"","device":-1,"axis":1,"axis_value":1.0,"script":null) +] +} +look_left={ +"deadzone": 0.2, +"events": [Object(InputEventJoypadMotion,"resource_local_to_scene":false,"resource_name":"","device":-1,"axis":2,"axis_value":-1.0,"script":null) +] +} +look_right={ +"deadzone": 0.2, +"events": [Object(InputEventJoypadMotion,"resource_local_to_scene":false,"resource_name":"","device":-1,"axis":2,"axis_value":1.0,"script":null) +] +} +look_up={ +"deadzone": 0.2, +"events": [Object(InputEventJoypadMotion,"resource_local_to_scene":false,"resource_name":"","device":-1,"axis":3,"axis_value":-1.0,"script":null) +] +} +look_down={ +"deadzone": 0.2, +"events": [Object(InputEventJoypadMotion,"resource_local_to_scene":false,"resource_name":"","device":-1,"axis":3,"axis_value":1.0,"script":null) ] }