feat: implemented basic third person movement

This commit is contained in:
Sara 2025-07-04 16:01:56 +02:00
parent 062633c742
commit f7e07797c8
15 changed files with 278 additions and 764 deletions

View file

@ -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;
}

View file

@ -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

View file

@ -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<PartyMemberData> data{ array[i] };
if (data.is_valid()) {
this->player_party.push_back(data);
}
}
}
Array GameState::get_player_party() const {
Array a{};
for (Ref<PartyMemberData> const &data : this->player_party) {
a.push_back(data);
}
return a;
}

View file

@ -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<Ref<PartyMemberData>> player_party{};
};
#endif // !GAME_STATE_H

View file

@ -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<PlayerInput>(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;
}
}

View file

@ -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

View file

@ -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<InputEvent> 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<InputEventMouseMotion> 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;
}

View file

@ -11,6 +11,12 @@ class PlayerInput : public Node {
public:
void _notification(int what);
virtual void unhandled_input(Ref<InputEvent> 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

View file

@ -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()));

View file

@ -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<PlayerInput>(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;
}

View file

@ -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

View file

@ -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")

View file

@ -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"

View file

@ -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)

View file

@ -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)
]
}