Compare commits
29 commits
archive/v1
...
developmen
| Author | SHA1 | Date | |
|---|---|---|---|
| 78433f1514 | |||
| 48b8e46448 | |||
| bc7fdda2bc | |||
| cf71e336fe | |||
| ae2f24d5ae | |||
| a2df2e1a47 | |||
| b422998e25 | |||
| b89eccb62d | |||
| c0d0451236 | |||
| b34aae1bda | |||
| 2e271f355c | |||
| 9cd0624341 | |||
| 0f8539e803 | |||
| 0642b6b7ba | |||
| 33b088c315 | |||
| cb7138353e | |||
| 1e94542085 | |||
| 411f1662c1 | |||
| ea3b68aef8 | |||
| c3ff41e1e6 | |||
| 54a887dbf3 | |||
| 88a1a524f0 | |||
| 79bf5c6ac0 | |||
| 61c9925b40 | |||
| 9508f2078d | |||
| 3324d25e9b | |||
| f3c2bf7515 | |||
| d87b782d6d | |||
|
|
82f2cae0f6 |
6
.dir-locals.el
Normal file
|
|
@ -0,0 +1,6 @@
|
|||
((c++-mode . ((mode . clang-format-on-save)))
|
||||
(c-mode . ((mode . c++)))
|
||||
(nil . ((projectile-project-compilation-cmd . "just build")
|
||||
(projectile-project-run-cmd . "engine/bin/godot.linuxbsd.editor.dev.x86_64.llvm --path project")
|
||||
(projectile-project-configure-cmd . "engine/bin/godot.linuxbsd.editor.dev.x86_64.llvm --path project -e")
|
||||
(projectile-project-test-cmd . "engine/bin/godot.linuxbsd.editor.dev.x86.llvm --path project"))))
|
||||
14
.gitignore
vendored
|
|
@ -6,9 +6,17 @@
|
|||
config.log
|
||||
.sconf_temp
|
||||
|
||||
# build artifacts
|
||||
*.o
|
||||
compile_commands.json
|
||||
engine/.github
|
||||
project/.godot
|
||||
build/PROJECT.pck
|
||||
build/PROJECT.x86_64
|
||||
build/PROJECT.exe
|
||||
build/authority.pck
|
||||
build/authority.x86_64
|
||||
build/authority.exe
|
||||
build.zip
|
||||
|
||||
# general-purpose cache folder (used by e.g clangd)
|
||||
.cache
|
||||
|
||||
__pycache__
|
||||
|
|
|
|||
BIN
assets/textures/props/grass_a.kra
Normal file
BIN
assets/textures/props/grass_a.kra~
Normal file
2
engine
|
|
@ -1 +1 @@
|
|||
Subproject commit 215acd52e82f4c575abb715e25e54558deeef998
|
||||
Subproject commit 6b76a5a8dc011723033cc8ad2ba3da345daab039
|
||||
5
justfile
|
|
@ -1,6 +1,6 @@
|
|||
set export
|
||||
|
||||
BUILD_NAME := "change_me"
|
||||
BUILD_NAME := "authority"
|
||||
|
||||
build: format
|
||||
# Compiling Editor
|
||||
|
|
@ -37,9 +37,8 @@ release-windows: build
|
|||
initialize-template projectname:
|
||||
# Initializing Template {{projectname}}
|
||||
sed -i -e "s/PROJECT/{{projectname}}/g" ./modules/PROJECT/register_types.h ./modules/PROJECT/register_types.cpp ./project/project.godot ./project/export_presets.cfg .gitignore
|
||||
sed "s/change_me/{{projectname}}/" ./justfile
|
||||
sed -i -e "s/authority/{{projectname}}/" ./justfile
|
||||
mv ./modules/PROJECT ./modules/{{projectname}}
|
||||
# Done Initializing, you will still have to update BUILD_NAME in your justfile
|
||||
|
||||
format:
|
||||
# Formatting Custom Modules
|
||||
|
|
|
|||
|
|
@ -1,15 +0,0 @@
|
|||
#include "register_types.h"
|
||||
|
||||
#include "core/object/class_db.h"
|
||||
|
||||
void initialize_PROJECT_module(ModuleInitializationLevel p_level) {
|
||||
if (p_level != MODULE_INITIALIZATION_LEVEL_SCENE) {
|
||||
return;
|
||||
}
|
||||
}
|
||||
|
||||
void uninitialize_PROJECT_module(ModuleInitializationLevel p_level) {
|
||||
if (p_level != MODULE_INITIALIZATION_LEVEL_SCENE) {
|
||||
return;
|
||||
}
|
||||
}
|
||||
|
|
@ -1,9 +0,0 @@
|
|||
#ifndef PROJECT_REGISTER_TYPES_H
|
||||
#define PROJECT_REGISTER_TYPES_H
|
||||
|
||||
#include "modules/register_module_types.h"
|
||||
|
||||
void initialize_PROJECT_module(ModuleInitializationLevel p_level);
|
||||
void uninitialize_PROJECT_module(ModuleInitializationLevel p_level);
|
||||
|
||||
#endif // !PROJECT_REGISTER_TYPES_H
|
||||
155
modules/authority/character.cpp
Normal file
|
|
@ -0,0 +1,155 @@
|
|||
#include "character.h"
|
||||
#include "authority/macros.h"
|
||||
#include "core/config/engine.h"
|
||||
|
||||
void CharacterData::_bind_methods() {
|
||||
BIND_PROPERTY(Variant::FLOAT, speed);
|
||||
}
|
||||
|
||||
void Character::_bind_methods() {
|
||||
BIND_HPROPERTY(Variant::OBJECT, data, PROPERTY_HINT_RESOURCE_TYPE, "CharacterData");
|
||||
}
|
||||
|
||||
void Character::physics_process(double delta) {
|
||||
Vector3 const velocity{ get_velocity() };
|
||||
Vector3 new_velocity{ velocity };
|
||||
new_velocity.x = this->world_movement_direction.x;
|
||||
new_velocity.z = this->world_movement_direction.y;
|
||||
set_velocity(new_velocity);
|
||||
if (!velocity.is_zero_approx()) {
|
||||
move_and_slide();
|
||||
}
|
||||
}
|
||||
|
||||
void Character::_notification(int what) {
|
||||
if (Engine::get_singleton()->is_editor_hint() || !this->data.is_valid()) {
|
||||
return;
|
||||
}
|
||||
switch (what) {
|
||||
default:
|
||||
return;
|
||||
case NOTIFICATION_READY:
|
||||
set_physics_process(true);
|
||||
return;
|
||||
case NOTIFICATION_PHYSICS_PROCESS:
|
||||
physics_process(get_physics_process_delta_time());
|
||||
return;
|
||||
}
|
||||
}
|
||||
|
||||
PackedStringArray Character::get_configuration_warnings() const {
|
||||
PackedStringArray warnings{ super_type::get_configuration_warnings() };
|
||||
if (this->data.is_null()) {
|
||||
warnings.push_back("Character requires 'data' to be initialised. To avoid crashes consider adding a placeholder if you intend to programmatically initialise it.");
|
||||
}
|
||||
return warnings;
|
||||
}
|
||||
|
||||
void Character::set_movement(Vector2 movement) {
|
||||
this->world_movement_direction = movement;
|
||||
}
|
||||
|
||||
bool Character::is_moving() const {
|
||||
return !this->world_movement_direction.is_zero_approx();
|
||||
}
|
||||
|
||||
void CharacterState::_bind_methods() {
|
||||
BIND_PROPERTY(Variant::BOOL, start_active);
|
||||
}
|
||||
|
||||
void CharacterState::_notification(int what) {
|
||||
if (Engine::get_singleton()->is_editor_hint()) {
|
||||
return;
|
||||
}
|
||||
switch (what) {
|
||||
default:
|
||||
return;
|
||||
case NOTIFICATION_ENTER_TREE:
|
||||
this->character = cast_to<Character>(get_parent());
|
||||
ERR_FAIL_COND_EDMSG(this->character == nullptr, "CharacterState requires parent to be of type Character");
|
||||
return;
|
||||
case NOTIFICATION_READY:
|
||||
if (start_active) {
|
||||
callable_mp(this, &self_type::set_state_active).call_deferred(true);
|
||||
}
|
||||
return;
|
||||
}
|
||||
}
|
||||
|
||||
PackedStringArray CharacterState::get_configuration_warnings() const {
|
||||
PackedStringArray warnings{ super_type::get_configuration_warnings() };
|
||||
if (cast_to<Character>(get_parent()) == nullptr) {
|
||||
warnings.push_back("CharacterState requires direct Character parent");
|
||||
}
|
||||
return warnings;
|
||||
}
|
||||
|
||||
void CharacterState::switch_to_state(String value) {
|
||||
if (!this->state_active) {
|
||||
print_error(vformat("Attempt to switch from inactive state %s to new state %s", get_path(), value));
|
||||
return;
|
||||
}
|
||||
set_state_active(false);
|
||||
stack_state_independent(value);
|
||||
}
|
||||
|
||||
void CharacterState::stack_state_dependent(String value) {
|
||||
if (!this->state_active) {
|
||||
print_error(vformat("Attempt to stack dependent state %s from inactive state %s", value, get_path()));
|
||||
return;
|
||||
}
|
||||
Node *node{ get_parent()->get_node(value) };
|
||||
if (CharacterState * state{ cast_to<CharacterState>(node) }) {
|
||||
state->depending_state = this;
|
||||
this->dependent_states.insert(state);
|
||||
state->set_state_active(true);
|
||||
}
|
||||
}
|
||||
|
||||
void CharacterState::notify_dependent_inactive(CharacterState *state) {
|
||||
if (!this->state_active) {
|
||||
print_error(vformat("Received notification that dependent state %s became inactive, while depending state %s was inactive", state->get_path(), get_path()));
|
||||
return;
|
||||
}
|
||||
this->dependent_states.erase(state);
|
||||
}
|
||||
|
||||
void CharacterState::stack_state_independent(String value) {
|
||||
if (!this->state_active) {
|
||||
print_error(vformat("Attempt to stack state %s from inactive state %s", value, get_path()));
|
||||
return;
|
||||
}
|
||||
Node *node{ get_parent()->get_node(value) };
|
||||
if (CharacterState * state{ cast_to<CharacterState>(node) }) {
|
||||
state->set_state_active(true);
|
||||
} else {
|
||||
print_error(vformat("Attempt to stack nonexistent state %s from %s", value, get_path()));
|
||||
}
|
||||
}
|
||||
|
||||
void CharacterState::set_state_active(bool active) {
|
||||
if (this->state_active != active) {
|
||||
this->state_active = active;
|
||||
if (active) {
|
||||
state_entered();
|
||||
} else {
|
||||
state_exited();
|
||||
if (this->depending_state && this->depending_state->state_active) {
|
||||
this->depending_state->notify_dependent_inactive(this);
|
||||
}
|
||||
this->depending_state = nullptr;
|
||||
for (CharacterState *state : this->dependent_states) {
|
||||
state->set_state_active(false);
|
||||
}
|
||||
this->dependent_states.clear();
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
bool CharacterState::get_state_active() const {
|
||||
return this->state_active;
|
||||
}
|
||||
|
||||
Character *CharacterState::get_character() const {
|
||||
return this->character;
|
||||
}
|
||||
69
modules/authority/character.h
Normal file
|
|
@ -0,0 +1,69 @@
|
|||
#pragma once
|
||||
|
||||
#include "authority/macros.h"
|
||||
#include "core/io/resource.h"
|
||||
#include "core/templates/hash_set.h"
|
||||
#include "scene/3d/physics/character_body_3d.h"
|
||||
|
||||
class CharacterData : public Resource {
|
||||
GDCLASS(CharacterData, Resource);
|
||||
static void _bind_methods();
|
||||
|
||||
private:
|
||||
float speed{};
|
||||
|
||||
public:
|
||||
GET_SET_FNS(float, speed);
|
||||
};
|
||||
|
||||
class Character : public CharacterBody3D {
|
||||
GDCLASS(Character, CharacterBody3D);
|
||||
|
||||
protected:
|
||||
static void _bind_methods();
|
||||
void physics_process(double delta);
|
||||
void _notification(int what);
|
||||
PackedStringArray get_configuration_warnings() const override;
|
||||
|
||||
public:
|
||||
void set_movement(Vector2 movement);
|
||||
bool is_moving() const;
|
||||
|
||||
private:
|
||||
Ref<CharacterData> data{};
|
||||
Vector2 world_movement_direction{};
|
||||
|
||||
public:
|
||||
GET_SET_FNS(Ref<CharacterData>, data);
|
||||
};
|
||||
|
||||
class CharacterState : public Node {
|
||||
GDCLASS(CharacterState, Node);
|
||||
static void _bind_methods();
|
||||
|
||||
protected:
|
||||
void _notification(int what);
|
||||
PackedStringArray get_configuration_warnings() const override;
|
||||
void switch_to_state(String state);
|
||||
void stack_state_dependent(String state);
|
||||
void notify_dependent_inactive(CharacterState *dependent);
|
||||
void stack_state_independent(String state);
|
||||
virtual void state_entered() {}
|
||||
virtual void state_exited() {}
|
||||
|
||||
public:
|
||||
void set_state_active(bool active);
|
||||
bool get_state_active() const;
|
||||
Character *get_character() const;
|
||||
|
||||
private:
|
||||
bool start_active{ false };
|
||||
bool state_active{ false };
|
||||
|
||||
Character *character{ nullptr };
|
||||
HashSet<CharacterState *> dependent_states{};
|
||||
CharacterState *depending_state{ nullptr };
|
||||
|
||||
public:
|
||||
GET_SET_FNS(bool, start_active);
|
||||
};
|
||||
|
|
@ -17,4 +17,12 @@
|
|||
ADD_PROPERTY(PropertyInfo(m_type, #m_property), "set_" #m_property, \
|
||||
"get_" #m_property)
|
||||
|
||||
#define GET_SET_FNS(m_type, m_property) \
|
||||
m_type get_##m_property() const { \
|
||||
return this->m_property; \
|
||||
} \
|
||||
void set_##m_property(m_type value) { \
|
||||
this->m_property = value; \
|
||||
}
|
||||
|
||||
#endif // !GODOT_EXTRA_MACROS_H
|
||||
13
modules/authority/nav_marker.cpp
Normal file
|
|
@ -0,0 +1,13 @@
|
|||
#include "nav_marker.h"
|
||||
|
||||
void NavMarker::_bind_methods() {}
|
||||
|
||||
void NavMarker::_notification(int what) {
|
||||
switch (what) {
|
||||
default:
|
||||
return;
|
||||
case NOTIFICATION_ENTER_TREE:
|
||||
this->set_gizmo_extents(3);
|
||||
return;
|
||||
}
|
||||
}
|
||||
19
modules/authority/nav_marker.h
Normal file
|
|
@ -0,0 +1,19 @@
|
|||
#pragma once
|
||||
|
||||
#include "authority/macros.h"
|
||||
#include "scene/3d/marker_3d.h"
|
||||
class Character;
|
||||
|
||||
class NavMarker : public Marker3D {
|
||||
GDCLASS(NavMarker, Marker3D);
|
||||
static void _bind_methods();
|
||||
|
||||
protected:
|
||||
void _notification(int what);
|
||||
|
||||
private:
|
||||
Character *claimed{ nullptr };
|
||||
|
||||
public:
|
||||
GET_SET_FNS(Character *, claimed);
|
||||
};
|
||||
84
modules/authority/party_member_states.cpp
Normal file
|
|
@ -0,0 +1,84 @@
|
|||
#include "party_member_states.h"
|
||||
#include "authority/nav_marker.h"
|
||||
#include "authority/player_character.h"
|
||||
#include "core/config/engine.h"
|
||||
#include "core/error/error_macros.h"
|
||||
#include "core/templates/vector.h"
|
||||
|
||||
void PartyMemberFollow::_bind_methods() {}
|
||||
|
||||
void PartyMemberFollow::process_position_target() {
|
||||
Vector3 const marker_position{ this->claimed_marker->get_global_position() };
|
||||
Vector3 const nav_target{ this->nav->get_target_position() };
|
||||
Vector3 const global_position{ get_character()->get_global_position() };
|
||||
if (global_position.distance_squared_to(marker_position) < 0.5) {
|
||||
return;
|
||||
}
|
||||
if (nav_target.distance_squared_to(marker_position) > 0.25) {
|
||||
this->nav->set_target_position(marker_position);
|
||||
}
|
||||
if (this->nav->is_navigation_finished()) {
|
||||
return;
|
||||
}
|
||||
Vector3 velocity{ global_position.direction_to(this->nav->get_next_path_position()) };
|
||||
velocity.y = 0;
|
||||
if (this->nav->get_avoidance_enabled()) {
|
||||
this->nav->set_velocity(velocity * get_character()->get_data()->get_speed());
|
||||
} else {
|
||||
push_movement_direction(velocity * get_character()->get_data()->get_speed());
|
||||
}
|
||||
}
|
||||
|
||||
void PartyMemberFollow::push_movement_direction(Vector3 velocity) {
|
||||
get_character()->set_movement(Vector2{ velocity.x, velocity.z });
|
||||
}
|
||||
|
||||
void PartyMemberFollow::_notification(int what) {
|
||||
if (Engine::get_singleton()->is_editor_hint()) {
|
||||
return;
|
||||
}
|
||||
switch (what) {
|
||||
default:
|
||||
return;
|
||||
case NOTIFICATION_READY:
|
||||
this->nav = cast_to<NavigationAgent3D>(get_parent()->get_node(NodePath("%NavigationAgent3D")));
|
||||
ERR_FAIL_COND_EDMSG(this->nav == nullptr, "PartyMemberFollow cannot initialise without a navigation agent");
|
||||
return;
|
||||
case NOTIFICATION_PROCESS:
|
||||
process_position_target();
|
||||
return;
|
||||
}
|
||||
}
|
||||
|
||||
PackedStringArray PartyMemberFollow::get_configuration_warnings() const {
|
||||
PackedStringArray warnings{ super_type::get_configuration_warnings() };
|
||||
if (!get_parent()->has_node(NodePath("%NavigationAgent3D")) || !cast_to<NavigationAgent3D>(get_parent()->get_node(NodePath("%NavigationAgent3D")))) {
|
||||
warnings.push_back("PartyMemberFollow expects a scene sibling of type NavigationAgent3D named with unique name '%NavigationAgent3D'");
|
||||
}
|
||||
return warnings;
|
||||
}
|
||||
|
||||
void PartyMemberFollow::state_entered() {
|
||||
Vector<NavMarker *> const &markers{ PlayerCharacter::get_singleton()->get_party_follow_markers() };
|
||||
for (NavMarker *marker : markers) {
|
||||
if (marker->get_claimed() == nullptr) {
|
||||
marker->set_claimed(get_character());
|
||||
this->claimed_marker = marker;
|
||||
if (this->nav->get_avoidance_enabled()) {
|
||||
this->nav->connect("velocity_computed", callable_mp(this, &self_type::push_movement_direction));
|
||||
}
|
||||
set_process(true);
|
||||
return;
|
||||
}
|
||||
}
|
||||
ERR_FAIL_EDMSG("PartyMemberFollow could not find an unclaimed player follow marker");
|
||||
set_state_active(false);
|
||||
}
|
||||
|
||||
void PartyMemberFollow::state_exited() {
|
||||
if (this->claimed_marker) {
|
||||
this->claimed_marker->set_claimed(nullptr);
|
||||
this->nav->disconnect("velocity_computed", callable_mp(this, &self_type::push_movement_direction));
|
||||
set_process(false);
|
||||
}
|
||||
}
|
||||
22
modules/authority/party_member_states.h
Normal file
|
|
@ -0,0 +1,22 @@
|
|||
#pragma once
|
||||
|
||||
#include "authority/character.h"
|
||||
#include "authority/nav_marker.h"
|
||||
#include "scene/3d/navigation/navigation_agent_3d.h"
|
||||
|
||||
class PartyMemberFollow : public CharacterState {
|
||||
GDCLASS(PartyMemberFollow, CharacterState);
|
||||
static void _bind_methods();
|
||||
void process_position_target();
|
||||
void push_movement_direction(Vector3 velocity);
|
||||
|
||||
protected:
|
||||
void _notification(int what);
|
||||
PackedStringArray get_configuration_warnings() const override;
|
||||
void state_entered() override;
|
||||
void state_exited() override;
|
||||
|
||||
private:
|
||||
NavigationAgent3D *nav{ nullptr };
|
||||
NavMarker *claimed_marker{ nullptr };
|
||||
};
|
||||
8
modules/authority/player_camera.h
Normal file
|
|
@ -0,0 +1,8 @@
|
|||
#pragma once
|
||||
|
||||
#include "scene/3d/camera_3d.h"
|
||||
|
||||
class PlayerCamera : public Camera3D {
|
||||
GDCLASS(PlayerCamera, Camera3D);
|
||||
static void _bind_methods();
|
||||
};
|
||||
36
modules/authority/player_character.cpp
Normal file
|
|
@ -0,0 +1,36 @@
|
|||
#include "player_character.h"
|
||||
#include "authority/nav_marker.h"
|
||||
|
||||
void PlayerCharacter::_bind_methods() {}
|
||||
|
||||
void PlayerCharacter::_notification(int what) {
|
||||
if (Engine::get_singleton()->is_editor_hint()) {
|
||||
return;
|
||||
}
|
||||
switch (what) {
|
||||
default:
|
||||
return;
|
||||
case NOTIFICATION_ENTER_TREE:
|
||||
instance = this;
|
||||
return;
|
||||
case NOTIFICATION_READY:
|
||||
for (Variant var : find_children("*", "NavMarker")) {
|
||||
if (NavMarker * marker{ cast_to<NavMarker>(var) }) {
|
||||
this->party_follow_markers.push_back(marker);
|
||||
}
|
||||
}
|
||||
ERR_FAIL_COND_EDMSG(this->party_follow_markers.size() < 4, "PlayerCharacter should have at least 4 follow NavMarkers for party members");
|
||||
return;
|
||||
case NOTIFICATION_EXIT_TREE:
|
||||
if (instance == this) {
|
||||
instance = nullptr;
|
||||
}
|
||||
return;
|
||||
}
|
||||
}
|
||||
|
||||
PlayerCharacter *PlayerCharacter::instance{ nullptr };
|
||||
|
||||
PlayerCharacter *PlayerCharacter::get_singleton() {
|
||||
return instance;
|
||||
}
|
||||
21
modules/authority/player_character.h
Normal file
|
|
@ -0,0 +1,21 @@
|
|||
#pragma once
|
||||
|
||||
#include "authority/character.h"
|
||||
#include "authority/macros.h"
|
||||
#include "authority/nav_marker.h"
|
||||
|
||||
class PlayerCharacter : public Character {
|
||||
GDCLASS(PlayerCharacter, Character);
|
||||
static void _bind_methods();
|
||||
|
||||
protected:
|
||||
void _notification(int what);
|
||||
|
||||
private:
|
||||
Vector<NavMarker *> party_follow_markers{};
|
||||
static PlayerCharacter *instance;
|
||||
|
||||
public:
|
||||
static PlayerCharacter *get_singleton();
|
||||
GET_SET_FNS(Vector<NavMarker *> const &, party_follow_markers);
|
||||
};
|
||||
75
modules/authority/player_states.cpp
Normal file
|
|
@ -0,0 +1,75 @@
|
|||
#include "player_states.h"
|
||||
#include "core/input/input.h"
|
||||
#include "core/math/basis.h"
|
||||
#include "scene/3d/camera_3d.h"
|
||||
#include "scene/main/viewport.h"
|
||||
|
||||
void PlayerInputState::_bind_methods() {}
|
||||
|
||||
void PlayerInputState::unhandled_input(Ref<InputEvent> const &what) {
|
||||
bool const is_move_vertical{ what->is_action("move_forward") || what->is_action("move_backward") };
|
||||
bool const is_move_horizontal{ what->is_action("move_right") || what->is_action("move_left") };
|
||||
if (is_move_vertical || is_move_horizontal) {
|
||||
stack_state_dependent("PlayerMovementState");
|
||||
get_viewport()->set_input_as_handled();
|
||||
}
|
||||
}
|
||||
|
||||
void PlayerInputState::state_entered() {
|
||||
set_process_unhandled_input(true);
|
||||
}
|
||||
|
||||
void PlayerInputState::state_exited() {
|
||||
set_process_unhandled_input(false);
|
||||
}
|
||||
|
||||
void PlayerMovementState::_bind_methods() {}
|
||||
|
||||
void PlayerMovementState::process(double delta) {
|
||||
Basis const basis{ get_viewport()->get_camera_3d()->get_global_basis() };
|
||||
Vector2 backward{ basis.get_column(0).x, basis.get_column(0).z };
|
||||
if (backward.is_zero_approx()) {
|
||||
backward = Vector2{ basis.get_column(1).x, basis.get_column(1).z };
|
||||
}
|
||||
Vector2 const right{ basis.get_column(2).x, basis.get_column(2).z };
|
||||
get_character()->set_movement((backward.normalized() * this->movement.x + right.normalized() * this->movement.y) * get_character()->get_data()->get_speed());
|
||||
}
|
||||
|
||||
void PlayerMovementState::_notification(int what) {
|
||||
if (Engine::get_singleton()->is_editor_hint()) {
|
||||
return;
|
||||
}
|
||||
switch (what) {
|
||||
default:
|
||||
return;
|
||||
case NOTIFICATION_READY:
|
||||
set_process_input(true);
|
||||
return;
|
||||
case NOTIFICATION_PROCESS:
|
||||
process(get_process_delta_time());
|
||||
return;
|
||||
}
|
||||
}
|
||||
|
||||
void PlayerMovementState::input(Ref<InputEvent> const &what) {
|
||||
bool const is_move_vertical{ what->is_action("move_forward") || what->is_action("move_backward") };
|
||||
bool const is_move_horizontal{ what->is_action("move_right") || what->is_action("move_left") };
|
||||
if (is_move_vertical || is_move_horizontal) {
|
||||
this->movement = {
|
||||
Input::get_singleton()->get_axis("move_left", "move_right"),
|
||||
Input::get_singleton()->get_axis("move_forward", "move_backward")
|
||||
};
|
||||
this->movement.normalize();
|
||||
}
|
||||
if (this->get_state_active() && this->movement.is_zero_approx()) {
|
||||
set_state_active(false);
|
||||
}
|
||||
}
|
||||
|
||||
void PlayerMovementState::state_entered() {
|
||||
set_process(true);
|
||||
}
|
||||
|
||||
void PlayerMovementState::state_exited() {
|
||||
set_process(false);
|
||||
}
|
||||
29
modules/authority/player_states.h
Normal file
|
|
@ -0,0 +1,29 @@
|
|||
#pragma once
|
||||
|
||||
#include "authority/character.h"
|
||||
|
||||
class PlayerInputState : public CharacterState {
|
||||
GDCLASS(PlayerInputState, CharacterState);
|
||||
static void _bind_methods();
|
||||
|
||||
protected:
|
||||
void unhandled_input(Ref<InputEvent> const &event) override;
|
||||
void state_entered() override;
|
||||
void state_exited() override;
|
||||
};
|
||||
|
||||
class PlayerMovementState : public CharacterState {
|
||||
GDCLASS(PlayerMovementState, CharacterState);
|
||||
static void _bind_methods();
|
||||
void ready();
|
||||
void process(double delta);
|
||||
|
||||
protected:
|
||||
void _notification(int what);
|
||||
void input(Ref<InputEvent> const &event) override;
|
||||
void state_entered() override;
|
||||
void state_exited() override;
|
||||
|
||||
private:
|
||||
Vector2 movement{};
|
||||
};
|
||||
28
modules/authority/register_types.cpp
Normal file
|
|
@ -0,0 +1,28 @@
|
|||
#include "register_types.h"
|
||||
|
||||
#include "authority/character.h"
|
||||
#include "authority/nav_marker.h"
|
||||
#include "authority/party_member_states.h"
|
||||
#include "authority/player_character.h"
|
||||
#include "authority/player_states.h"
|
||||
#include "core/object/class_db.h"
|
||||
|
||||
void initialize_authority_module(ModuleInitializationLevel p_level) {
|
||||
if (p_level != MODULE_INITIALIZATION_LEVEL_SCENE) {
|
||||
return;
|
||||
}
|
||||
ClassDB::register_class<CharacterData>();
|
||||
ClassDB::register_class<Character>();
|
||||
ClassDB::register_class<CharacterState>();
|
||||
ClassDB::register_class<PlayerCharacter>();
|
||||
ClassDB::register_class<PlayerInputState>();
|
||||
ClassDB::register_class<PlayerMovementState>();
|
||||
ClassDB::register_class<NavMarker>();
|
||||
ClassDB::register_class<PartyMemberFollow>();
|
||||
}
|
||||
|
||||
void uninitialize_authority_module(ModuleInitializationLevel p_level) {
|
||||
if (p_level != MODULE_INITIALIZATION_LEVEL_SCENE) {
|
||||
return;
|
||||
}
|
||||
}
|
||||
9
modules/authority/register_types.h
Normal file
|
|
@ -0,0 +1,9 @@
|
|||
#ifndef authority_REGISTER_TYPES_H
|
||||
#define authority_REGISTER_TYPES_H
|
||||
|
||||
#include "modules/register_module_types.h"
|
||||
|
||||
void initialize_authority_module(ModuleInitializationLevel p_level);
|
||||
void uninitialize_authority_module(ModuleInitializationLevel p_level);
|
||||
|
||||
#endif // !authority_REGISTER_TYPES_H
|
||||
BIN
project/assets/characters/player_fem/character_fem.blend
Normal file
|
|
@ -0,0 +1,60 @@
|
|||
[remap]
|
||||
|
||||
importer="scene"
|
||||
importer_version=1
|
||||
type="PackedScene"
|
||||
uid="uid://grb3q5nd2uds"
|
||||
path="res://.godot/imported/character_fem.blend-e169cb46816e89cf00aa8e7f988a0574.scn"
|
||||
|
||||
[deps]
|
||||
|
||||
source_file="res://assets/characters/player_fem/character_fem.blend"
|
||||
dest_files=["res://.godot/imported/character_fem.blend-e169cb46816e89cf00aa8e7f988a0574.scn"]
|
||||
|
||||
[params]
|
||||
|
||||
nodes/root_type=""
|
||||
nodes/root_name=""
|
||||
nodes/root_script=null
|
||||
nodes/apply_root_scale=true
|
||||
nodes/root_scale=1.0
|
||||
nodes/import_as_skeleton_bones=false
|
||||
nodes/use_name_suffixes=true
|
||||
nodes/use_node_type_suffixes=true
|
||||
meshes/ensure_tangents=true
|
||||
meshes/generate_lods=true
|
||||
meshes/create_shadow_meshes=true
|
||||
meshes/light_baking=1
|
||||
meshes/lightmap_texel_size=0.2
|
||||
meshes/force_disable_compression=false
|
||||
skins/use_named_skins=true
|
||||
animation/import=true
|
||||
animation/fps=30
|
||||
animation/trimming=false
|
||||
animation/remove_immutable_tracks=true
|
||||
animation/import_rest_as_RESET=false
|
||||
import_script/path="uid://ba7qlhj5ylm3d"
|
||||
materials/extract=0
|
||||
materials/extract_format=0
|
||||
materials/extract_path=""
|
||||
_subresources={}
|
||||
blender/nodes/visible=0
|
||||
blender/nodes/active_collection_only=false
|
||||
blender/nodes/punctual_lights=true
|
||||
blender/nodes/cameras=true
|
||||
blender/nodes/custom_properties=true
|
||||
blender/nodes/modifiers=1
|
||||
blender/meshes/colors=false
|
||||
blender/meshes/uvs=true
|
||||
blender/meshes/normals=true
|
||||
blender/meshes/export_geometry_nodes_instances=false
|
||||
blender/meshes/gpu_instances=false
|
||||
blender/meshes/tangents=true
|
||||
blender/meshes/skins=2
|
||||
blender/meshes/export_bones_deforming_mesh_only=false
|
||||
blender/materials/unpack_enabled=true
|
||||
blender/materials/export_materials=1
|
||||
blender/animation/limit_playback=true
|
||||
blender/animation/always_sample=true
|
||||
blender/animation/group_tracks=true
|
||||
gltf/naming_version=2
|
||||
BIN
project/assets/characters/player_fem/character_fem.blend1
Normal file
BIN
project/assets/characters/player_fem/textures/Face.png
Normal file
|
After Width: | Height: | Size: 13 KiB |
|
|
@ -0,0 +1,41 @@
|
|||
[remap]
|
||||
|
||||
importer="texture"
|
||||
type="CompressedTexture2D"
|
||||
uid="uid://biqq268lccpng"
|
||||
path.s3tc="res://.godot/imported/Face.png-08c0111f3b71fa077c35243a4c740f6e.s3tc.ctex"
|
||||
metadata={
|
||||
"imported_formats": ["s3tc_bptc"],
|
||||
"vram_texture": true
|
||||
}
|
||||
|
||||
[deps]
|
||||
|
||||
source_file="res://assets/characters/player_fem/textures/Face.png"
|
||||
dest_files=["res://.godot/imported/Face.png-08c0111f3b71fa077c35243a4c740f6e.s3tc.ctex"]
|
||||
|
||||
[params]
|
||||
|
||||
compress/mode=2
|
||||
compress/high_quality=false
|
||||
compress/lossy_quality=0.7
|
||||
compress/uastc_level=0
|
||||
compress/rdo_quality_loss=0.0
|
||||
compress/hdr_compression=1
|
||||
compress/normal_map=0
|
||||
compress/channel_pack=0
|
||||
mipmaps/generate=true
|
||||
mipmaps/limit=-1
|
||||
roughness/mode=0
|
||||
roughness/src_normal=""
|
||||
process/channel_remap/red=0
|
||||
process/channel_remap/green=1
|
||||
process/channel_remap/blue=2
|
||||
process/channel_remap/alpha=3
|
||||
process/fix_alpha_border=true
|
||||
process/premult_alpha=false
|
||||
process/normal_map_invert_y=false
|
||||
process/hdr_as_srgb=false
|
||||
process/hdr_clamp_exposure=false
|
||||
process/size_limit=0
|
||||
detect_3d/compress_to=0
|
||||
BIN
project/assets/characters/player_fem/textures/Texture.png
Normal file
|
After Width: | Height: | Size: 96 KiB |
|
|
@ -0,0 +1,41 @@
|
|||
[remap]
|
||||
|
||||
importer="texture"
|
||||
type="CompressedTexture2D"
|
||||
uid="uid://cwqc2g4616eun"
|
||||
path.s3tc="res://.godot/imported/Texture.png-98af1a158e1830cbcd0a13178176c442.s3tc.ctex"
|
||||
metadata={
|
||||
"imported_formats": ["s3tc_bptc"],
|
||||
"vram_texture": true
|
||||
}
|
||||
|
||||
[deps]
|
||||
|
||||
source_file="res://assets/characters/player_fem/textures/Texture.png"
|
||||
dest_files=["res://.godot/imported/Texture.png-98af1a158e1830cbcd0a13178176c442.s3tc.ctex"]
|
||||
|
||||
[params]
|
||||
|
||||
compress/mode=2
|
||||
compress/high_quality=false
|
||||
compress/lossy_quality=0.7
|
||||
compress/uastc_level=0
|
||||
compress/rdo_quality_loss=0.0
|
||||
compress/hdr_compression=1
|
||||
compress/normal_map=0
|
||||
compress/channel_pack=0
|
||||
mipmaps/generate=true
|
||||
mipmaps/limit=-1
|
||||
roughness/mode=0
|
||||
roughness/src_normal=""
|
||||
process/channel_remap/red=0
|
||||
process/channel_remap/green=1
|
||||
process/channel_remap/blue=2
|
||||
process/channel_remap/alpha=3
|
||||
process/fix_alpha_border=true
|
||||
process/premult_alpha=false
|
||||
process/normal_map_invert_y=false
|
||||
process/hdr_as_srgb=false
|
||||
process/hdr_clamp_exposure=false
|
||||
process/size_limit=0
|
||||
detect_3d/compress_to=0
|
||||
BIN
project/assets/characters/player_masc/character_masc.blend
Normal file
|
|
@ -0,0 +1,60 @@
|
|||
[remap]
|
||||
|
||||
importer="scene"
|
||||
importer_version=1
|
||||
type="PackedScene"
|
||||
uid="uid://bsdvnyn6nhiaa"
|
||||
path="res://.godot/imported/character_masc.blend-0037c94467e2e85d7ec685a838d7e95d.scn"
|
||||
|
||||
[deps]
|
||||
|
||||
source_file="res://assets/characters/player_masc/character_masc.blend"
|
||||
dest_files=["res://.godot/imported/character_masc.blend-0037c94467e2e85d7ec685a838d7e95d.scn"]
|
||||
|
||||
[params]
|
||||
|
||||
nodes/root_type=""
|
||||
nodes/root_name=""
|
||||
nodes/root_script=null
|
||||
nodes/apply_root_scale=true
|
||||
nodes/root_scale=1.0
|
||||
nodes/import_as_skeleton_bones=false
|
||||
nodes/use_name_suffixes=true
|
||||
nodes/use_node_type_suffixes=true
|
||||
meshes/ensure_tangents=true
|
||||
meshes/generate_lods=true
|
||||
meshes/create_shadow_meshes=true
|
||||
meshes/light_baking=1
|
||||
meshes/lightmap_texel_size=0.2
|
||||
meshes/force_disable_compression=false
|
||||
skins/use_named_skins=true
|
||||
animation/import=true
|
||||
animation/fps=30
|
||||
animation/trimming=false
|
||||
animation/remove_immutable_tracks=true
|
||||
animation/import_rest_as_RESET=false
|
||||
import_script/path=""
|
||||
materials/extract=0
|
||||
materials/extract_format=0
|
||||
materials/extract_path=""
|
||||
_subresources={}
|
||||
blender/nodes/visible=0
|
||||
blender/nodes/active_collection_only=false
|
||||
blender/nodes/punctual_lights=true
|
||||
blender/nodes/cameras=true
|
||||
blender/nodes/custom_properties=true
|
||||
blender/nodes/modifiers=1
|
||||
blender/meshes/colors=false
|
||||
blender/meshes/uvs=true
|
||||
blender/meshes/normals=true
|
||||
blender/meshes/export_geometry_nodes_instances=false
|
||||
blender/meshes/gpu_instances=false
|
||||
blender/meshes/tangents=true
|
||||
blender/meshes/skins=2
|
||||
blender/meshes/export_bones_deforming_mesh_only=false
|
||||
blender/materials/unpack_enabled=true
|
||||
blender/materials/export_materials=1
|
||||
blender/animation/limit_playback=true
|
||||
blender/animation/always_sample=true
|
||||
blender/animation/group_tracks=true
|
||||
gltf/naming_version=2
|
||||
BIN
project/assets/characters/player_masc/character_masc.blend1
Normal file
BIN
project/assets/characters/player_masc/textures/Face.png
Normal file
|
After Width: | Height: | Size: 31 KiB |
|
|
@ -0,0 +1,41 @@
|
|||
[remap]
|
||||
|
||||
importer="texture"
|
||||
type="CompressedTexture2D"
|
||||
uid="uid://b7n0rgtlub4r7"
|
||||
path.s3tc="res://.godot/imported/Face.png-f5f833f7c71137a9e4aac5fe268e4dd4.s3tc.ctex"
|
||||
metadata={
|
||||
"imported_formats": ["s3tc_bptc"],
|
||||
"vram_texture": true
|
||||
}
|
||||
|
||||
[deps]
|
||||
|
||||
source_file="res://assets/characters/player_masc/textures/Face.png"
|
||||
dest_files=["res://.godot/imported/Face.png-f5f833f7c71137a9e4aac5fe268e4dd4.s3tc.ctex"]
|
||||
|
||||
[params]
|
||||
|
||||
compress/mode=2
|
||||
compress/high_quality=false
|
||||
compress/lossy_quality=0.7
|
||||
compress/uastc_level=0
|
||||
compress/rdo_quality_loss=0.0
|
||||
compress/hdr_compression=1
|
||||
compress/normal_map=0
|
||||
compress/channel_pack=0
|
||||
mipmaps/generate=true
|
||||
mipmaps/limit=-1
|
||||
roughness/mode=0
|
||||
roughness/src_normal=""
|
||||
process/channel_remap/red=0
|
||||
process/channel_remap/green=1
|
||||
process/channel_remap/blue=2
|
||||
process/channel_remap/alpha=3
|
||||
process/fix_alpha_border=true
|
||||
process/premult_alpha=false
|
||||
process/normal_map_invert_y=false
|
||||
process/hdr_as_srgb=false
|
||||
process/hdr_clamp_exposure=false
|
||||
process/size_limit=0
|
||||
detect_3d/compress_to=0
|
||||
BIN
project/assets/characters/player_masc/textures/Texture.png
Normal file
|
After Width: | Height: | Size: 96 KiB |
|
|
@ -0,0 +1,41 @@
|
|||
[remap]
|
||||
|
||||
importer="texture"
|
||||
type="CompressedTexture2D"
|
||||
uid="uid://lea3dgv2585y"
|
||||
path.s3tc="res://.godot/imported/Texture.png-51f4b86d2d244a13f05f399cc30a0d6b.s3tc.ctex"
|
||||
metadata={
|
||||
"imported_formats": ["s3tc_bptc"],
|
||||
"vram_texture": true
|
||||
}
|
||||
|
||||
[deps]
|
||||
|
||||
source_file="res://assets/characters/player_masc/textures/Texture.png"
|
||||
dest_files=["res://.godot/imported/Texture.png-51f4b86d2d244a13f05f399cc30a0d6b.s3tc.ctex"]
|
||||
|
||||
[params]
|
||||
|
||||
compress/mode=2
|
||||
compress/high_quality=false
|
||||
compress/lossy_quality=0.7
|
||||
compress/uastc_level=0
|
||||
compress/rdo_quality_loss=0.0
|
||||
compress/hdr_compression=1
|
||||
compress/normal_map=0
|
||||
compress/channel_pack=0
|
||||
mipmaps/generate=true
|
||||
mipmaps/limit=-1
|
||||
roughness/mode=0
|
||||
roughness/src_normal=""
|
||||
process/channel_remap/red=0
|
||||
process/channel_remap/green=1
|
||||
process/channel_remap/blue=2
|
||||
process/channel_remap/alpha=3
|
||||
process/fix_alpha_border=true
|
||||
process/premult_alpha=false
|
||||
process/normal_map_invert_y=false
|
||||
process/hdr_as_srgb=false
|
||||
process/hdr_clamp_exposure=false
|
||||
process/size_limit=0
|
||||
detect_3d/compress_to=0
|
||||
BIN
project/assets/environments/blockouts/cliffs_blockout.blend
Normal file
|
|
@ -0,0 +1,60 @@
|
|||
[remap]
|
||||
|
||||
importer="scene"
|
||||
importer_version=1
|
||||
type="PackedScene"
|
||||
uid="uid://dw4p3s74f1pdg"
|
||||
path="res://.godot/imported/cliffs_blockout.blend-f86a374f2c48645fd5614df18445a45a.scn"
|
||||
|
||||
[deps]
|
||||
|
||||
source_file="res://assets/environments/blockouts/cliffs_blockout.blend"
|
||||
dest_files=["res://.godot/imported/cliffs_blockout.blend-f86a374f2c48645fd5614df18445a45a.scn"]
|
||||
|
||||
[params]
|
||||
|
||||
nodes/root_type=""
|
||||
nodes/root_name=""
|
||||
nodes/root_script=null
|
||||
nodes/apply_root_scale=true
|
||||
nodes/root_scale=1.0
|
||||
nodes/import_as_skeleton_bones=false
|
||||
nodes/use_name_suffixes=true
|
||||
nodes/use_node_type_suffixes=true
|
||||
meshes/ensure_tangents=true
|
||||
meshes/generate_lods=true
|
||||
meshes/create_shadow_meshes=true
|
||||
meshes/light_baking=1
|
||||
meshes/lightmap_texel_size=0.2
|
||||
meshes/force_disable_compression=false
|
||||
skins/use_named_skins=true
|
||||
animation/import=true
|
||||
animation/fps=30
|
||||
animation/trimming=false
|
||||
animation/remove_immutable_tracks=true
|
||||
animation/import_rest_as_RESET=false
|
||||
import_script/path="uid://ba7qlhj5ylm3d"
|
||||
materials/extract=0
|
||||
materials/extract_format=0
|
||||
materials/extract_path=""
|
||||
_subresources={}
|
||||
blender/nodes/visible=0
|
||||
blender/nodes/active_collection_only=false
|
||||
blender/nodes/punctual_lights=true
|
||||
blender/nodes/cameras=true
|
||||
blender/nodes/custom_properties=true
|
||||
blender/nodes/modifiers=1
|
||||
blender/meshes/colors=false
|
||||
blender/meshes/uvs=true
|
||||
blender/meshes/normals=true
|
||||
blender/meshes/export_geometry_nodes_instances=false
|
||||
blender/meshes/gpu_instances=false
|
||||
blender/meshes/tangents=true
|
||||
blender/meshes/skins=2
|
||||
blender/meshes/export_bones_deforming_mesh_only=false
|
||||
blender/materials/unpack_enabled=true
|
||||
blender/materials/export_materials=1
|
||||
blender/animation/limit_playback=true
|
||||
blender/animation/always_sample=true
|
||||
blender/animation/group_tracks=true
|
||||
gltf/naming_version=2
|
||||
BIN
project/assets/environments/blockouts/cliffs_blockout.blend1
Normal file
BIN
project/assets/environments/blockouts/terrain.png
Normal file
|
After Width: | Height: | Size: 6.5 KiB |
41
project/assets/environments/blockouts/terrain.png.import
Normal file
|
|
@ -0,0 +1,41 @@
|
|||
[remap]
|
||||
|
||||
importer="texture"
|
||||
type="CompressedTexture2D"
|
||||
uid="uid://dwmur2qflotv6"
|
||||
path.bptc="res://.godot/imported/terrain.png-52ea7eaf6b989ed8d9fc2c0c5a398fdf.bptc.ctex"
|
||||
metadata={
|
||||
"imported_formats": ["s3tc_bptc"],
|
||||
"vram_texture": true
|
||||
}
|
||||
|
||||
[deps]
|
||||
|
||||
source_file="res://assets/environments/blockouts/terrain.png"
|
||||
dest_files=["res://.godot/imported/terrain.png-52ea7eaf6b989ed8d9fc2c0c5a398fdf.bptc.ctex"]
|
||||
|
||||
[params]
|
||||
|
||||
compress/mode=2
|
||||
compress/high_quality=true
|
||||
compress/lossy_quality=0.7
|
||||
compress/uastc_level=0
|
||||
compress/rdo_quality_loss=0.0
|
||||
compress/hdr_compression=1
|
||||
compress/normal_map=0
|
||||
compress/channel_pack=0
|
||||
mipmaps/generate=true
|
||||
mipmaps/limit=-1
|
||||
roughness/mode=0
|
||||
roughness/src_normal=""
|
||||
process/channel_remap/red=0
|
||||
process/channel_remap/green=1
|
||||
process/channel_remap/blue=2
|
||||
process/channel_remap/alpha=3
|
||||
process/fix_alpha_border=true
|
||||
process/premult_alpha=false
|
||||
process/normal_map_invert_y=false
|
||||
process/hdr_as_srgb=false
|
||||
process/hdr_clamp_exposure=false
|
||||
process/size_limit=0
|
||||
detect_3d/compress_to=0
|
||||
BIN
project/assets/environments/props/flower.blend
Normal file
60
project/assets/environments/props/flower.blend.import
Normal file
|
|
@ -0,0 +1,60 @@
|
|||
[remap]
|
||||
|
||||
importer="scene"
|
||||
importer_version=1
|
||||
type="PackedScene"
|
||||
uid="uid://dyt1mwbep2012"
|
||||
path="res://.godot/imported/flower.blend-a54f993c4db9e1bce792f272b6b1a837.scn"
|
||||
|
||||
[deps]
|
||||
|
||||
source_file="res://assets/environments/props/flower.blend"
|
||||
dest_files=["res://.godot/imported/flower.blend-a54f993c4db9e1bce792f272b6b1a837.scn"]
|
||||
|
||||
[params]
|
||||
|
||||
nodes/root_type=""
|
||||
nodes/root_name=""
|
||||
nodes/root_script=null
|
||||
nodes/apply_root_scale=true
|
||||
nodes/root_scale=1.0
|
||||
nodes/import_as_skeleton_bones=false
|
||||
nodes/use_name_suffixes=true
|
||||
nodes/use_node_type_suffixes=true
|
||||
meshes/ensure_tangents=true
|
||||
meshes/generate_lods=true
|
||||
meshes/create_shadow_meshes=true
|
||||
meshes/light_baking=1
|
||||
meshes/lightmap_texel_size=0.2
|
||||
meshes/force_disable_compression=false
|
||||
skins/use_named_skins=true
|
||||
animation/import=true
|
||||
animation/fps=30
|
||||
animation/trimming=false
|
||||
animation/remove_immutable_tracks=true
|
||||
animation/import_rest_as_RESET=false
|
||||
import_script/path="uid://ba7qlhj5ylm3d"
|
||||
materials/extract=0
|
||||
materials/extract_format=0
|
||||
materials/extract_path=""
|
||||
_subresources={}
|
||||
blender/nodes/visible=0
|
||||
blender/nodes/active_collection_only=false
|
||||
blender/nodes/punctual_lights=true
|
||||
blender/nodes/cameras=true
|
||||
blender/nodes/custom_properties=true
|
||||
blender/nodes/modifiers=1
|
||||
blender/meshes/colors=false
|
||||
blender/meshes/uvs=true
|
||||
blender/meshes/normals=true
|
||||
blender/meshes/export_geometry_nodes_instances=false
|
||||
blender/meshes/gpu_instances=false
|
||||
blender/meshes/tangents=true
|
||||
blender/meshes/skins=2
|
||||
blender/meshes/export_bones_deforming_mesh_only=false
|
||||
blender/materials/unpack_enabled=true
|
||||
blender/materials/export_materials=1
|
||||
blender/animation/limit_playback=true
|
||||
blender/animation/always_sample=true
|
||||
blender/animation/group_tracks=true
|
||||
gltf/naming_version=2
|
||||
BIN
project/assets/environments/props/flower.blend1
Normal file
BIN
project/assets/environments/props/grass_a.png
Normal file
|
After Width: | Height: | Size: 39 KiB |
41
project/assets/environments/props/grass_a.png.import
Normal file
|
|
@ -0,0 +1,41 @@
|
|||
[remap]
|
||||
|
||||
importer="texture"
|
||||
type="CompressedTexture2D"
|
||||
uid="uid://uujfed6yrp8p"
|
||||
path.s3tc="res://.godot/imported/grass_a.png-df3280112d606c2f3fb6a8ca84baa85d.s3tc.ctex"
|
||||
metadata={
|
||||
"imported_formats": ["s3tc_bptc"],
|
||||
"vram_texture": true
|
||||
}
|
||||
|
||||
[deps]
|
||||
|
||||
source_file="res://assets/environments/props/grass_a.png"
|
||||
dest_files=["res://.godot/imported/grass_a.png-df3280112d606c2f3fb6a8ca84baa85d.s3tc.ctex"]
|
||||
|
||||
[params]
|
||||
|
||||
compress/mode=2
|
||||
compress/high_quality=false
|
||||
compress/lossy_quality=0.7
|
||||
compress/uastc_level=0
|
||||
compress/rdo_quality_loss=0.0
|
||||
compress/hdr_compression=1
|
||||
compress/normal_map=0
|
||||
compress/channel_pack=0
|
||||
mipmaps/generate=true
|
||||
mipmaps/limit=-1
|
||||
roughness/mode=0
|
||||
roughness/src_normal=""
|
||||
process/channel_remap/red=0
|
||||
process/channel_remap/green=1
|
||||
process/channel_remap/blue=2
|
||||
process/channel_remap/alpha=3
|
||||
process/fix_alpha_border=true
|
||||
process/premult_alpha=false
|
||||
process/normal_map_invert_y=false
|
||||
process/hdr_as_srgb=false
|
||||
process/hdr_clamp_exposure=false
|
||||
process/size_limit=0
|
||||
detect_3d/compress_to=0
|
||||
BIN
project/assets/environments/props/grass_a.png~
Normal file
|
After Width: | Height: | Size: 89 KiB |
BIN
project/assets/environments/props/rock_a.blend
Normal file
60
project/assets/environments/props/rock_a.blend.import
Normal file
|
|
@ -0,0 +1,60 @@
|
|||
[remap]
|
||||
|
||||
importer="scene"
|
||||
importer_version=1
|
||||
type="PackedScene"
|
||||
uid="uid://db6ddpj53gl5w"
|
||||
path="res://.godot/imported/rock_a.blend-b8d8f34d9e140f1b8adb493b605dd07e.scn"
|
||||
|
||||
[deps]
|
||||
|
||||
source_file="res://assets/environments/props/rock_a.blend"
|
||||
dest_files=["res://.godot/imported/rock_a.blend-b8d8f34d9e140f1b8adb493b605dd07e.scn"]
|
||||
|
||||
[params]
|
||||
|
||||
nodes/root_type=""
|
||||
nodes/root_name=""
|
||||
nodes/root_script=null
|
||||
nodes/apply_root_scale=true
|
||||
nodes/root_scale=1.0
|
||||
nodes/import_as_skeleton_bones=false
|
||||
nodes/use_name_suffixes=true
|
||||
nodes/use_node_type_suffixes=true
|
||||
meshes/ensure_tangents=true
|
||||
meshes/generate_lods=true
|
||||
meshes/create_shadow_meshes=true
|
||||
meshes/light_baking=1
|
||||
meshes/lightmap_texel_size=0.2
|
||||
meshes/force_disable_compression=false
|
||||
skins/use_named_skins=true
|
||||
animation/import=true
|
||||
animation/fps=30
|
||||
animation/trimming=false
|
||||
animation/remove_immutable_tracks=true
|
||||
animation/import_rest_as_RESET=false
|
||||
import_script/path="uid://ba7qlhj5ylm3d"
|
||||
materials/extract=0
|
||||
materials/extract_format=0
|
||||
materials/extract_path=""
|
||||
_subresources={}
|
||||
blender/nodes/visible=0
|
||||
blender/nodes/active_collection_only=false
|
||||
blender/nodes/punctual_lights=true
|
||||
blender/nodes/cameras=true
|
||||
blender/nodes/custom_properties=true
|
||||
blender/nodes/modifiers=1
|
||||
blender/meshes/colors=false
|
||||
blender/meshes/uvs=true
|
||||
blender/meshes/normals=true
|
||||
blender/meshes/export_geometry_nodes_instances=false
|
||||
blender/meshes/gpu_instances=false
|
||||
blender/meshes/tangents=true
|
||||
blender/meshes/skins=2
|
||||
blender/meshes/export_bones_deforming_mesh_only=false
|
||||
blender/materials/unpack_enabled=true
|
||||
blender/materials/export_materials=1
|
||||
blender/animation/limit_playback=true
|
||||
blender/animation/always_sample=true
|
||||
blender/animation/group_tracks=true
|
||||
gltf/naming_version=2
|
||||
BIN
project/assets/environments/props/rock_a.blend1
Normal file
BIN
project/assets/environments/props/rock_a.png
Normal file
|
After Width: | Height: | Size: 37 KiB |
41
project/assets/environments/props/rock_a.png.import
Normal file
|
|
@ -0,0 +1,41 @@
|
|||
[remap]
|
||||
|
||||
importer="texture"
|
||||
type="CompressedTexture2D"
|
||||
uid="uid://b4rklg0l7aqdm"
|
||||
path.s3tc="res://.godot/imported/rock_a.png-3ff1a5814ef260ae524170318024cca4.s3tc.ctex"
|
||||
metadata={
|
||||
"imported_formats": ["s3tc_bptc"],
|
||||
"vram_texture": true
|
||||
}
|
||||
|
||||
[deps]
|
||||
|
||||
source_file="res://assets/environments/props/rock_a.png"
|
||||
dest_files=["res://.godot/imported/rock_a.png-3ff1a5814ef260ae524170318024cca4.s3tc.ctex"]
|
||||
|
||||
[params]
|
||||
|
||||
compress/mode=2
|
||||
compress/high_quality=false
|
||||
compress/lossy_quality=0.7
|
||||
compress/uastc_level=0
|
||||
compress/rdo_quality_loss=0.0
|
||||
compress/hdr_compression=1
|
||||
compress/normal_map=0
|
||||
compress/channel_pack=0
|
||||
mipmaps/generate=true
|
||||
mipmaps/limit=-1
|
||||
roughness/mode=0
|
||||
roughness/src_normal=""
|
||||
process/channel_remap/red=0
|
||||
process/channel_remap/green=1
|
||||
process/channel_remap/blue=2
|
||||
process/channel_remap/alpha=3
|
||||
process/fix_alpha_border=true
|
||||
process/premult_alpha=false
|
||||
process/normal_map_invert_y=false
|
||||
process/hdr_as_srgb=false
|
||||
process/hdr_clamp_exposure=false
|
||||
process/size_limit=0
|
||||
detect_3d/compress_to=0
|
||||
BIN
project/assets/environments/props/rock_b.blend
Normal file
60
project/assets/environments/props/rock_b.blend.import
Normal file
|
|
@ -0,0 +1,60 @@
|
|||
[remap]
|
||||
|
||||
importer="scene"
|
||||
importer_version=1
|
||||
type="PackedScene"
|
||||
uid="uid://517yqaw110pf"
|
||||
path="res://.godot/imported/rock_b.blend-d76791249d4c14d1c951b842f0208090.scn"
|
||||
|
||||
[deps]
|
||||
|
||||
source_file="res://assets/environments/props/rock_b.blend"
|
||||
dest_files=["res://.godot/imported/rock_b.blend-d76791249d4c14d1c951b842f0208090.scn"]
|
||||
|
||||
[params]
|
||||
|
||||
nodes/root_type=""
|
||||
nodes/root_name=""
|
||||
nodes/root_script=null
|
||||
nodes/apply_root_scale=true
|
||||
nodes/root_scale=1.0
|
||||
nodes/import_as_skeleton_bones=false
|
||||
nodes/use_name_suffixes=true
|
||||
nodes/use_node_type_suffixes=true
|
||||
meshes/ensure_tangents=true
|
||||
meshes/generate_lods=true
|
||||
meshes/create_shadow_meshes=true
|
||||
meshes/light_baking=1
|
||||
meshes/lightmap_texel_size=0.2
|
||||
meshes/force_disable_compression=false
|
||||
skins/use_named_skins=true
|
||||
animation/import=true
|
||||
animation/fps=30
|
||||
animation/trimming=false
|
||||
animation/remove_immutable_tracks=true
|
||||
animation/import_rest_as_RESET=false
|
||||
import_script/path="uid://ba7qlhj5ylm3d"
|
||||
materials/extract=0
|
||||
materials/extract_format=0
|
||||
materials/extract_path=""
|
||||
_subresources={}
|
||||
blender/nodes/visible=0
|
||||
blender/nodes/active_collection_only=false
|
||||
blender/nodes/punctual_lights=true
|
||||
blender/nodes/cameras=true
|
||||
blender/nodes/custom_properties=true
|
||||
blender/nodes/modifiers=1
|
||||
blender/meshes/colors=false
|
||||
blender/meshes/uvs=true
|
||||
blender/meshes/normals=true
|
||||
blender/meshes/export_geometry_nodes_instances=false
|
||||
blender/meshes/gpu_instances=false
|
||||
blender/meshes/tangents=true
|
||||
blender/meshes/skins=2
|
||||
blender/meshes/export_bones_deforming_mesh_only=false
|
||||
blender/materials/unpack_enabled=true
|
||||
blender/materials/export_materials=1
|
||||
blender/animation/limit_playback=true
|
||||
blender/animation/always_sample=true
|
||||
blender/animation/group_tracks=true
|
||||
gltf/naming_version=2
|
||||
BIN
project/assets/environments/props/rock_b.blend1
Normal file
BIN
project/assets/environments/props/rock_b.png
Normal file
|
After Width: | Height: | Size: 31 KiB |
41
project/assets/environments/props/rock_b.png.import
Normal file
|
|
@ -0,0 +1,41 @@
|
|||
[remap]
|
||||
|
||||
importer="texture"
|
||||
type="CompressedTexture2D"
|
||||
uid="uid://dpn3sfcjnnool"
|
||||
path.s3tc="res://.godot/imported/rock_b.png-063dafa9684f12d7486304024d1aaecf.s3tc.ctex"
|
||||
metadata={
|
||||
"imported_formats": ["s3tc_bptc"],
|
||||
"vram_texture": true
|
||||
}
|
||||
|
||||
[deps]
|
||||
|
||||
source_file="res://assets/environments/props/rock_b.png"
|
||||
dest_files=["res://.godot/imported/rock_b.png-063dafa9684f12d7486304024d1aaecf.s3tc.ctex"]
|
||||
|
||||
[params]
|
||||
|
||||
compress/mode=2
|
||||
compress/high_quality=false
|
||||
compress/lossy_quality=0.7
|
||||
compress/uastc_level=0
|
||||
compress/rdo_quality_loss=0.0
|
||||
compress/hdr_compression=1
|
||||
compress/normal_map=0
|
||||
compress/channel_pack=0
|
||||
mipmaps/generate=true
|
||||
mipmaps/limit=-1
|
||||
roughness/mode=0
|
||||
roughness/src_normal=""
|
||||
process/channel_remap/red=0
|
||||
process/channel_remap/green=1
|
||||
process/channel_remap/blue=2
|
||||
process/channel_remap/alpha=3
|
||||
process/fix_alpha_border=true
|
||||
process/premult_alpha=false
|
||||
process/normal_map_invert_y=false
|
||||
process/hdr_as_srgb=false
|
||||
process/hdr_clamp_exposure=false
|
||||
process/size_limit=0
|
||||
detect_3d/compress_to=0
|
||||
BIN
project/assets/environments/props/rock_c.blend
Normal file
60
project/assets/environments/props/rock_c.blend.import
Normal file
|
|
@ -0,0 +1,60 @@
|
|||
[remap]
|
||||
|
||||
importer="scene"
|
||||
importer_version=1
|
||||
type="PackedScene"
|
||||
uid="uid://8n8fduklxduk"
|
||||
path="res://.godot/imported/rock_c.blend-26ab78e8b85061bd62ef5331656df04c.scn"
|
||||
|
||||
[deps]
|
||||
|
||||
source_file="res://assets/environments/props/rock_c.blend"
|
||||
dest_files=["res://.godot/imported/rock_c.blend-26ab78e8b85061bd62ef5331656df04c.scn"]
|
||||
|
||||
[params]
|
||||
|
||||
nodes/root_type=""
|
||||
nodes/root_name=""
|
||||
nodes/root_script=null
|
||||
nodes/apply_root_scale=true
|
||||
nodes/root_scale=1.0
|
||||
nodes/import_as_skeleton_bones=false
|
||||
nodes/use_name_suffixes=true
|
||||
nodes/use_node_type_suffixes=true
|
||||
meshes/ensure_tangents=true
|
||||
meshes/generate_lods=true
|
||||
meshes/create_shadow_meshes=true
|
||||
meshes/light_baking=1
|
||||
meshes/lightmap_texel_size=0.2
|
||||
meshes/force_disable_compression=false
|
||||
skins/use_named_skins=true
|
||||
animation/import=true
|
||||
animation/fps=30
|
||||
animation/trimming=false
|
||||
animation/remove_immutable_tracks=true
|
||||
animation/import_rest_as_RESET=false
|
||||
import_script/path="uid://ba7qlhj5ylm3d"
|
||||
materials/extract=0
|
||||
materials/extract_format=0
|
||||
materials/extract_path=""
|
||||
_subresources={}
|
||||
blender/nodes/visible=0
|
||||
blender/nodes/active_collection_only=false
|
||||
blender/nodes/punctual_lights=true
|
||||
blender/nodes/cameras=true
|
||||
blender/nodes/custom_properties=true
|
||||
blender/nodes/modifiers=1
|
||||
blender/meshes/colors=false
|
||||
blender/meshes/uvs=true
|
||||
blender/meshes/normals=true
|
||||
blender/meshes/export_geometry_nodes_instances=false
|
||||
blender/meshes/gpu_instances=false
|
||||
blender/meshes/tangents=true
|
||||
blender/meshes/skins=2
|
||||
blender/meshes/export_bones_deforming_mesh_only=false
|
||||
blender/materials/unpack_enabled=true
|
||||
blender/materials/export_materials=1
|
||||
blender/animation/limit_playback=true
|
||||
blender/animation/always_sample=true
|
||||
blender/animation/group_tracks=true
|
||||
gltf/naming_version=2
|
||||
BIN
project/assets/environments/props/rock_c.blend1
Normal file
BIN
project/assets/environments/props/rock_c.png
Normal file
|
After Width: | Height: | Size: 34 KiB |
41
project/assets/environments/props/rock_c.png.import
Normal file
|
|
@ -0,0 +1,41 @@
|
|||
[remap]
|
||||
|
||||
importer="texture"
|
||||
type="CompressedTexture2D"
|
||||
uid="uid://drf6dro5di2ap"
|
||||
path.s3tc="res://.godot/imported/rock_c.png-a276885ef75cf615c39e79d768211422.s3tc.ctex"
|
||||
metadata={
|
||||
"imported_formats": ["s3tc_bptc"],
|
||||
"vram_texture": true
|
||||
}
|
||||
|
||||
[deps]
|
||||
|
||||
source_file="res://assets/environments/props/rock_c.png"
|
||||
dest_files=["res://.godot/imported/rock_c.png-a276885ef75cf615c39e79d768211422.s3tc.ctex"]
|
||||
|
||||
[params]
|
||||
|
||||
compress/mode=2
|
||||
compress/high_quality=false
|
||||
compress/lossy_quality=0.7
|
||||
compress/uastc_level=0
|
||||
compress/rdo_quality_loss=0.0
|
||||
compress/hdr_compression=1
|
||||
compress/normal_map=0
|
||||
compress/channel_pack=0
|
||||
mipmaps/generate=true
|
||||
mipmaps/limit=-1
|
||||
roughness/mode=0
|
||||
roughness/src_normal=""
|
||||
process/channel_remap/red=0
|
||||
process/channel_remap/green=1
|
||||
process/channel_remap/blue=2
|
||||
process/channel_remap/alpha=3
|
||||
process/fix_alpha_border=true
|
||||
process/premult_alpha=false
|
||||
process/normal_map_invert_y=false
|
||||
process/hdr_as_srgb=false
|
||||
process/hdr_clamp_exposure=false
|
||||
process/size_limit=0
|
||||
detect_3d/compress_to=0
|
||||
BIN
project/assets/environments/props/tree.blend
Normal file
60
project/assets/environments/props/tree.blend.import
Normal file
|
|
@ -0,0 +1,60 @@
|
|||
[remap]
|
||||
|
||||
importer="scene"
|
||||
importer_version=1
|
||||
type="PackedScene"
|
||||
uid="uid://bnm0go8negvo7"
|
||||
path="res://.godot/imported/tree.blend-20cb45b772c5003289278d8ec4060a00.scn"
|
||||
|
||||
[deps]
|
||||
|
||||
source_file="res://assets/environments/props/tree.blend"
|
||||
dest_files=["res://.godot/imported/tree.blend-20cb45b772c5003289278d8ec4060a00.scn"]
|
||||
|
||||
[params]
|
||||
|
||||
nodes/root_type=""
|
||||
nodes/root_name=""
|
||||
nodes/root_script=null
|
||||
nodes/apply_root_scale=true
|
||||
nodes/root_scale=1.0
|
||||
nodes/import_as_skeleton_bones=false
|
||||
nodes/use_name_suffixes=true
|
||||
nodes/use_node_type_suffixes=true
|
||||
meshes/ensure_tangents=true
|
||||
meshes/generate_lods=true
|
||||
meshes/create_shadow_meshes=true
|
||||
meshes/light_baking=1
|
||||
meshes/lightmap_texel_size=0.2
|
||||
meshes/force_disable_compression=false
|
||||
skins/use_named_skins=true
|
||||
animation/import=true
|
||||
animation/fps=30
|
||||
animation/trimming=false
|
||||
animation/remove_immutable_tracks=true
|
||||
animation/import_rest_as_RESET=false
|
||||
import_script/path="uid://ba7qlhj5ylm3d"
|
||||
materials/extract=0
|
||||
materials/extract_format=0
|
||||
materials/extract_path=""
|
||||
_subresources={}
|
||||
blender/nodes/visible=0
|
||||
blender/nodes/active_collection_only=false
|
||||
blender/nodes/punctual_lights=true
|
||||
blender/nodes/cameras=true
|
||||
blender/nodes/custom_properties=true
|
||||
blender/nodes/modifiers=1
|
||||
blender/meshes/colors=false
|
||||
blender/meshes/uvs=true
|
||||
blender/meshes/normals=true
|
||||
blender/meshes/export_geometry_nodes_instances=false
|
||||
blender/meshes/gpu_instances=false
|
||||
blender/meshes/tangents=true
|
||||
blender/meshes/skins=2
|
||||
blender/meshes/export_bones_deforming_mesh_only=false
|
||||
blender/materials/unpack_enabled=true
|
||||
blender/materials/export_materials=1
|
||||
blender/animation/limit_playback=true
|
||||
blender/animation/always_sample=true
|
||||
blender/animation/group_tracks=true
|
||||
gltf/naming_version=2
|
||||
BIN
project/assets/environments/props/tree.blend1
Normal file
BIN
project/assets/environments/props/tree.png
Normal file
|
After Width: | Height: | Size: 174 KiB |
41
project/assets/environments/props/tree.png.import
Normal file
|
|
@ -0,0 +1,41 @@
|
|||
[remap]
|
||||
|
||||
importer="texture"
|
||||
type="CompressedTexture2D"
|
||||
uid="uid://cvfsvh8tdpflf"
|
||||
path.bptc="res://.godot/imported/tree.png-b3baca9a70a35e7b7075603680fb265f.bptc.ctex"
|
||||
metadata={
|
||||
"imported_formats": ["s3tc_bptc"],
|
||||
"vram_texture": true
|
||||
}
|
||||
|
||||
[deps]
|
||||
|
||||
source_file="res://assets/environments/props/tree.png"
|
||||
dest_files=["res://.godot/imported/tree.png-b3baca9a70a35e7b7075603680fb265f.bptc.ctex"]
|
||||
|
||||
[params]
|
||||
|
||||
compress/mode=2
|
||||
compress/high_quality=true
|
||||
compress/lossy_quality=0.7
|
||||
compress/uastc_level=0
|
||||
compress/rdo_quality_loss=0.0
|
||||
compress/hdr_compression=1
|
||||
compress/normal_map=0
|
||||
compress/channel_pack=0
|
||||
mipmaps/generate=true
|
||||
mipmaps/limit=-1
|
||||
roughness/mode=0
|
||||
roughness/src_normal=""
|
||||
process/channel_remap/red=0
|
||||
process/channel_remap/green=1
|
||||
process/channel_remap/blue=2
|
||||
process/channel_remap/alpha=3
|
||||
process/fix_alpha_border=true
|
||||
process/premult_alpha=false
|
||||
process/normal_map_invert_y=false
|
||||
process/hdr_as_srgb=false
|
||||
process/hdr_clamp_exposure=false
|
||||
process/size_limit=0
|
||||
detect_3d/compress_to=0
|
||||
16
project/assets/style/base_outline_material.tres
Normal file
|
|
@ -0,0 +1,16 @@
|
|||
[gd_resource type="StandardMaterial3D" format=3 uid="uid://cd4vnmrmj8cj7"]
|
||||
|
||||
[resource]
|
||||
transparency = 2
|
||||
alpha_scissor_threshold = 0.5
|
||||
alpha_antialiasing_mode = 0
|
||||
cull_mode = 1
|
||||
shading_mode = 0
|
||||
diffuse_mode = 3
|
||||
specular_mode = 2
|
||||
vertex_color_use_as_albedo = true
|
||||
albedo_color = Color(0.121152334, 0.121152334, 0.121152334, 1)
|
||||
grow = true
|
||||
grow_amount = 0.02
|
||||
proximity_fade_distance = 0.1
|
||||
stencil_outline_thickness = 0.029
|
||||
17
project/assets/style/detail_outline_material.tres
Normal file
|
|
@ -0,0 +1,17 @@
|
|||
[gd_resource type="StandardMaterial3D" format=3 uid="uid://02s3lq67141v"]
|
||||
|
||||
[resource]
|
||||
transparency = 2
|
||||
alpha_scissor_threshold = 0.94
|
||||
alpha_antialiasing_mode = 0
|
||||
cull_mode = 1
|
||||
shading_mode = 0
|
||||
diffuse_mode = 3
|
||||
specular_mode = 2
|
||||
vertex_color_use_as_albedo = true
|
||||
albedo_color = Color(0.121152334, 0.121152334, 0.121152334, 1)
|
||||
grow = true
|
||||
grow_amount = 0.02
|
||||
proximity_fade_enabled = true
|
||||
proximity_fade_distance = 0.3
|
||||
stencil_outline_thickness = 0.029
|
||||
36
project/assets/style/model_importer.gd
Normal file
|
|
@ -0,0 +1,36 @@
|
|||
@tool
|
||||
extends EditorScenePostImport
|
||||
|
||||
var regular_outline_material : StandardMaterial3D
|
||||
var detail_outline_material : StandardMaterial3D
|
||||
var thin_outline_material : StandardMaterial3D
|
||||
|
||||
func _post_import(root : Node):
|
||||
regular_outline_material = ResourceLoader.load("res://assets/style/base_outline_material.tres") as StandardMaterial3D
|
||||
detail_outline_material = ResourceLoader.load("res://assets/style/detail_outline_material.tres") as StandardMaterial3D
|
||||
thin_outline_material = ResourceLoader.load("res://assets/style/thin_outline_material.tres") as StandardMaterial3D
|
||||
apply_outline_recursive(root)
|
||||
return root
|
||||
|
||||
func get_flag(node : Node, flag : String) -> bool:
|
||||
if node.name.contains(flag):
|
||||
node.name = node.name.erase(node.name.find(flag), flag.length())
|
||||
return true
|
||||
else:
|
||||
return false
|
||||
|
||||
func apply_outline_recursive(node : Node):
|
||||
if node != null:
|
||||
var outline : bool = not get_flag(node, "-nooutline")
|
||||
if outline and node is MeshInstance3D:
|
||||
var detail : bool = get_flag(node, "-detailoutline")
|
||||
var thin : bool = get_flag(node, "-thinoutline")
|
||||
var mesh : MeshInstance3D = (node as MeshInstance3D)
|
||||
if detail and detail_outline_material:
|
||||
mesh.material_overlay = detail_outline_material
|
||||
elif thin and thin_outline_material:
|
||||
mesh.material_overlay = thin_outline_material
|
||||
elif regular_outline_material:
|
||||
mesh.material_overlay = regular_outline_material
|
||||
for child in node.get_children():
|
||||
apply_outline_recursive(child)
|
||||
1
project/assets/style/model_importer.gd.uid
Normal file
|
|
@ -0,0 +1 @@
|
|||
uid://ba7qlhj5ylm3d
|
||||
22
project/assets/style/thin_outline_material.tres
Normal file
|
|
@ -0,0 +1,22 @@
|
|||
[gd_resource type="StandardMaterial3D" format=3 uid="uid://vo4kk73alewq"]
|
||||
|
||||
[ext_resource type="Material" uid="uid://02s3lq67141v" path="res://assets/style/detail_outline_material.tres" id="1_jjhui"]
|
||||
|
||||
[resource]
|
||||
next_pass = ExtResource("1_jjhui")
|
||||
transparency = 2
|
||||
alpha_scissor_threshold = 0.9
|
||||
alpha_antialiasing_mode = 0
|
||||
cull_mode = 1
|
||||
shading_mode = 0
|
||||
diffuse_mode = 3
|
||||
specular_mode = 2
|
||||
vertex_color_use_as_albedo = true
|
||||
albedo_color = Color(0.121152334, 0.121152334, 0.121152334, 1)
|
||||
grow = true
|
||||
grow_amount = 0.007
|
||||
proximity_fade_distance = 0.1
|
||||
distance_fade_mode = 1
|
||||
distance_fade_min_distance = 10.0
|
||||
distance_fade_max_distance = 9.0
|
||||
stencil_outline_thickness = 0.029
|
||||
BIN
project/assets/vehicles/bike.blend
Normal file
60
project/assets/vehicles/bike.blend.import
Normal file
|
|
@ -0,0 +1,60 @@
|
|||
[remap]
|
||||
|
||||
importer="scene"
|
||||
importer_version=1
|
||||
type="PackedScene"
|
||||
uid="uid://dkq8b07op54lx"
|
||||
path="res://.godot/imported/bike.blend-8d249f74417ff10660977200f19cdfc5.scn"
|
||||
|
||||
[deps]
|
||||
|
||||
source_file="res://assets/vehicles/bike.blend"
|
||||
dest_files=["res://.godot/imported/bike.blend-8d249f74417ff10660977200f19cdfc5.scn"]
|
||||
|
||||
[params]
|
||||
|
||||
nodes/root_type=""
|
||||
nodes/root_name=""
|
||||
nodes/root_script=null
|
||||
nodes/apply_root_scale=true
|
||||
nodes/root_scale=1.0
|
||||
nodes/import_as_skeleton_bones=false
|
||||
nodes/use_name_suffixes=true
|
||||
nodes/use_node_type_suffixes=true
|
||||
meshes/ensure_tangents=true
|
||||
meshes/generate_lods=true
|
||||
meshes/create_shadow_meshes=true
|
||||
meshes/light_baking=1
|
||||
meshes/lightmap_texel_size=0.2
|
||||
meshes/force_disable_compression=false
|
||||
skins/use_named_skins=true
|
||||
animation/import=true
|
||||
animation/fps=30
|
||||
animation/trimming=false
|
||||
animation/remove_immutable_tracks=true
|
||||
animation/import_rest_as_RESET=false
|
||||
import_script/path="uid://ba7qlhj5ylm3d"
|
||||
materials/extract=0
|
||||
materials/extract_format=0
|
||||
materials/extract_path=""
|
||||
_subresources={}
|
||||
blender/nodes/visible=0
|
||||
blender/nodes/active_collection_only=false
|
||||
blender/nodes/punctual_lights=true
|
||||
blender/nodes/cameras=true
|
||||
blender/nodes/custom_properties=true
|
||||
blender/nodes/modifiers=1
|
||||
blender/meshes/colors=false
|
||||
blender/meshes/uvs=true
|
||||
blender/meshes/normals=true
|
||||
blender/meshes/export_geometry_nodes_instances=false
|
||||
blender/meshes/gpu_instances=false
|
||||
blender/meshes/tangents=true
|
||||
blender/meshes/skins=2
|
||||
blender/meshes/export_bones_deforming_mesh_only=false
|
||||
blender/materials/unpack_enabled=true
|
||||
blender/materials/export_materials=1
|
||||
blender/animation/limit_playback=true
|
||||
blender/animation/always_sample=true
|
||||
blender/animation/group_tracks=true
|
||||
gltf/naming_version=2
|
||||
BIN
project/assets/vehicles/bike.blend1
Normal file
BIN
project/assets/vehicles/sidecar.png
Normal file
|
After Width: | Height: | Size: 22 KiB |
41
project/assets/vehicles/sidecar.png.import
Normal file
|
|
@ -0,0 +1,41 @@
|
|||
[remap]
|
||||
|
||||
importer="texture"
|
||||
type="CompressedTexture2D"
|
||||
uid="uid://csscfssydx1n4"
|
||||
path.s3tc="res://.godot/imported/sidecar.png-10b8daaf663ef9108162d2fab75bc493.s3tc.ctex"
|
||||
metadata={
|
||||
"imported_formats": ["s3tc_bptc"],
|
||||
"vram_texture": true
|
||||
}
|
||||
|
||||
[deps]
|
||||
|
||||
source_file="res://assets/vehicles/sidecar.png"
|
||||
dest_files=["res://.godot/imported/sidecar.png-10b8daaf663ef9108162d2fab75bc493.s3tc.ctex"]
|
||||
|
||||
[params]
|
||||
|
||||
compress/mode=2
|
||||
compress/high_quality=false
|
||||
compress/lossy_quality=0.7
|
||||
compress/uastc_level=0
|
||||
compress/rdo_quality_loss=0.0
|
||||
compress/hdr_compression=1
|
||||
compress/normal_map=0
|
||||
compress/channel_pack=0
|
||||
mipmaps/generate=true
|
||||
mipmaps/limit=-1
|
||||
roughness/mode=0
|
||||
roughness/src_normal=""
|
||||
process/channel_remap/red=0
|
||||
process/channel_remap/green=1
|
||||
process/channel_remap/blue=2
|
||||
process/channel_remap/alpha=3
|
||||
process/fix_alpha_border=true
|
||||
process/premult_alpha=false
|
||||
process/normal_map_invert_y=false
|
||||
process/hdr_as_srgb=false
|
||||
process/hdr_clamp_exposure=false
|
||||
process/size_limit=0
|
||||
detect_3d/compress_to=0
|
||||
4
project/data/character_data/fallback_character_data.tres
Normal file
|
|
@ -0,0 +1,4 @@
|
|||
[gd_resource type="CharacterData" format=3 uid="uid://d28pn4xekwh6p"]
|
||||
|
||||
[resource]
|
||||
speed = 2.0
|
||||
4
project/data/default_player_character.tres
Normal file
|
|
@ -0,0 +1,4 @@
|
|||
[gd_resource type="CharacterData" format=3 uid="uid://bmudhddb0vedg"]
|
||||
|
||||
[resource]
|
||||
speed = 2.0
|
||||
|
|
@ -9,7 +9,7 @@ custom_features=""
|
|||
export_filter="all_resources"
|
||||
include_filter=""
|
||||
exclude_filter=""
|
||||
export_path="../build/PROJECT.x86_64"
|
||||
export_path="../build/authority.x86_64"
|
||||
patches=PackedStringArray()
|
||||
encryption_include_filters=""
|
||||
encryption_exclude_filters=""
|
||||
|
|
@ -51,7 +51,7 @@ custom_features=""
|
|||
export_filter="all_resources"
|
||||
include_filter=""
|
||||
exclude_filter=""
|
||||
export_path="../build/PROJECT.exe"
|
||||
export_path="../build/authority.exe"
|
||||
patches=PackedStringArray()
|
||||
encryption_include_filters=""
|
||||
encryption_exclude_filters=""
|
||||
|
|
|
|||
|
|
@ -18,6 +18,8 @@ dest_files=["res://.godot/imported/icon.svg-218a8f2b3041327d8a5756f3a245f83b.cte
|
|||
compress/mode=0
|
||||
compress/high_quality=false
|
||||
compress/lossy_quality=0.7
|
||||
compress/uastc_level=0
|
||||
compress/rdo_quality_loss=0.0
|
||||
compress/hdr_compression=1
|
||||
compress/normal_map=0
|
||||
compress/channel_pack=0
|
||||
|
|
@ -25,6 +27,10 @@ mipmaps/generate=false
|
|||
mipmaps/limit=-1
|
||||
roughness/mode=0
|
||||
roughness/src_normal=""
|
||||
process/channel_remap/red=0
|
||||
process/channel_remap/green=1
|
||||
process/channel_remap/blue=2
|
||||
process/channel_remap/alpha=3
|
||||
process/fix_alpha_border=true
|
||||
process/premult_alpha=false
|
||||
process/normal_map_invert_y=false
|
||||
|
|
|
|||
24
project/objects/party_member.tscn
Normal file
|
|
@ -0,0 +1,24 @@
|
|||
[gd_scene format=3 uid="uid://dfbdn64i7vfuc"]
|
||||
|
||||
[ext_resource type="CharacterData" uid="uid://d28pn4xekwh6p" path="res://data/character_data/fallback_character_data.tres" id="1_0torn"]
|
||||
|
||||
[sub_resource type="CylinderMesh" id="CylinderMesh_0torn"]
|
||||
|
||||
[sub_resource type="CapsuleShape3D" id="CapsuleShape3D_4iifp"]
|
||||
|
||||
[node name="PartyMember" type="Character" unique_id=2124931928]
|
||||
data = ExtResource("1_0torn")
|
||||
|
||||
[node name="MeshInstance3D" type="MeshInstance3D" parent="." unique_id=2087924260]
|
||||
mesh = SubResource("CylinderMesh_0torn")
|
||||
skeleton = NodePath("../CollisionShape3D")
|
||||
|
||||
[node name="CollisionShape3D" type="CollisionShape3D" parent="." unique_id=705075802]
|
||||
shape = SubResource("CapsuleShape3D_4iifp")
|
||||
|
||||
[node name="PartyMemberFollow" type="PartyMemberFollow" parent="." unique_id=1261360781]
|
||||
start_active = true
|
||||
|
||||
[node name="NavigationAgent3D" type="NavigationAgent3D" parent="." unique_id=1509674092]
|
||||
unique_name_in_owner = true
|
||||
avoidance_enabled = true
|
||||
42
project/objects/player_character.tscn
Normal file
|
|
@ -0,0 +1,42 @@
|
|||
[gd_scene format=3 uid="uid://dcqd0wo5y5a1g"]
|
||||
|
||||
[ext_resource type="CharacterData" uid="uid://bmudhddb0vedg" path="res://data/default_player_character.tres" id="1_jy05a"]
|
||||
|
||||
[sub_resource type="CapsuleShape3D" id="CapsuleShape3D_vcg8s"]
|
||||
|
||||
[sub_resource type="CylinderMesh" id="CylinderMesh_5kd2n"]
|
||||
|
||||
[node name="PlayerCharacter" type="PlayerCharacter" unique_id=159035892]
|
||||
data = ExtResource("1_jy05a")
|
||||
|
||||
[node name="CollisionShape3D" type="CollisionShape3D" parent="." unique_id=511026275]
|
||||
shape = SubResource("CapsuleShape3D_vcg8s")
|
||||
|
||||
[node name="MeshInstance3D" type="MeshInstance3D" parent="." unique_id=957221075]
|
||||
mesh = SubResource("CylinderMesh_5kd2n")
|
||||
|
||||
[node name="Camera3D" type="Camera3D" parent="." unique_id=932811285]
|
||||
transform = Transform3D(-1, 5.660465e-08, -6.662324e-08, 0, 0.762081, 0.64748174, 8.742278e-08, 0.64748174, -0.762081, 9.536743e-07, 5.8584056, -4.4809494)
|
||||
current = true
|
||||
far = 1000.0
|
||||
|
||||
[node name="PlayerInputState" type="PlayerInputState" parent="." unique_id=1290843255]
|
||||
start_active = true
|
||||
|
||||
[node name="PlayerMovementState" type="PlayerMovementState" parent="." unique_id=71639209]
|
||||
|
||||
[node name="NavMarker" type="NavMarker" parent="." unique_id=2076207950]
|
||||
transform = Transform3D(-1, 0, 8.742278e-08, 0, 1, 0, -8.742278e-08, 0, -1, 2.0248106, 0, -1.4610382)
|
||||
gizmo_extents = 3.0
|
||||
|
||||
[node name="NavMarker2" type="NavMarker" parent="." unique_id=786944405]
|
||||
transform = Transform3D(-1, 0, 8.742278e-08, 0, 1, 0, -8.742278e-08, 0, -1, -0.54701775, 9.536743e-07, -2.7108493)
|
||||
gizmo_extents = 3.0
|
||||
|
||||
[node name="NavMarker4" type="NavMarker" parent="." unique_id=1781147686]
|
||||
transform = Transform3D(-1, 0, 8.742278e-08, 0, 1, 0, -8.742278e-08, 0, -1, 0.8027056, 9.536743e-07, -2.7077246)
|
||||
gizmo_extents = 3.0
|
||||
|
||||
[node name="NavMarker3" type="NavMarker" parent="." unique_id=430426412]
|
||||
transform = Transform3D(-1, 0, 8.742278e-08, 0, 1, 0, -8.742278e-08, 0, -1, -2.0046833, 9.536743e-07, -1.4623514)
|
||||
gizmo_extents = 3.0
|
||||
78
project/objects/player_vehicle.tscn
Normal file
|
|
@ -0,0 +1,78 @@
|
|||
[gd_scene format=3 uid="uid://bedet0our63p0"]
|
||||
|
||||
[ext_resource type="PackedScene" uid="uid://dkq8b07op54lx" path="res://assets/vehicles/bike.blend" id="1_qt1cm"]
|
||||
[ext_resource type="PackedScene" uid="uid://grb3q5nd2uds" path="res://assets/characters/player_fem/character_fem.blend" id="2_buo3h"]
|
||||
|
||||
[sub_resource type="BoxShape3D" id="BoxShape3D_7eqww"]
|
||||
size = Vector3(0.36328125, 0.5884735, 0.9517517)
|
||||
|
||||
[sub_resource type="BoxShape3D" id="BoxShape3D_we6jx"]
|
||||
size = Vector3(0.21679688, 0.29020843, 0.87223816)
|
||||
|
||||
[sub_resource type="BoxShape3D" id="BoxShape3D_kok0e"]
|
||||
size = Vector3(0.8516388, 0.81409013, 1.4329796)
|
||||
|
||||
[sub_resource type="BoxShape3D" id="BoxShape3D_khxbi"]
|
||||
size = Vector3(0.7451172, 0.59351885, 0.5995445)
|
||||
|
||||
[node name="PlayerVehicle" type="VehicleBody3D" unique_id=2037675333]
|
||||
mass = 400.0
|
||||
|
||||
[node name="bike" parent="." unique_id=1819523012 instance=ExtResource("1_qt1cm")]
|
||||
transform = Transform3D(1.0000004, 0, 0, 0, 1.0000001, 0, 0, 0, 0.9999994, -0.48627073, 0, 0)
|
||||
|
||||
[node name="character_fem" parent="bike" unique_id=111626287 instance=ExtResource("2_buo3h")]
|
||||
|
||||
[node name="CollisionShape3D" type="CollisionShape3D" parent="." unique_id=1803684826]
|
||||
transform = Transform3D(1, 0, 0, 0, 1, 0, 0, 0, 1, -0.48627073, 0.7048377, 0.074576735)
|
||||
shape = SubResource("BoxShape3D_7eqww")
|
||||
|
||||
[node name="CollisionShape3D3" type="CollisionShape3D" parent="." unique_id=781828471]
|
||||
transform = Transform3D(1, 0, 0, 0, 1, 0, 0, 0, 1, -0.48627073, 0.8603005, 0.938115)
|
||||
shape = SubResource("BoxShape3D_we6jx")
|
||||
|
||||
[node name="CollisionShape3D2" type="CollisionShape3D" parent="." unique_id=1277628977]
|
||||
transform = Transform3D(1, 0, 0, 0, 0.9983196, 0.057947356, 0, -0.057947356, 0.9983196, 0.2234863, 0.62375516, 0.6136677)
|
||||
shape = SubResource("BoxShape3D_kok0e")
|
||||
|
||||
[node name="CollisionShape3D4" type="CollisionShape3D" parent="." unique_id=2030366048]
|
||||
transform = Transform3D(1, 0, 0, 0, 0.72955376, -0.6839234, 0, 0.6839234, 0.72955376, 0.2234863, 0.5898677, -0.092960924)
|
||||
shape = SubResource("BoxShape3D_khxbi")
|
||||
|
||||
[node name="SidecarWheel" type="VehicleWheel3D" parent="." unique_id=1869360183]
|
||||
transform = Transform3D(-1, 0, 8.742278e-08, 0, 1, 0, -8.742278e-08, 0, -1, 0.7563137, 0.37474027, 0.7443161)
|
||||
wheel_roll_influence = 0.3
|
||||
wheel_radius = 0.389
|
||||
wheel_rest_length = 0.05
|
||||
wheel_friction_slip = 1.0
|
||||
suspension_travel = 0.1
|
||||
suspension_stiffness = 500.0
|
||||
suspension_max_force = 10500.0
|
||||
damping_compression = 10.0
|
||||
damping_relaxation = 11.0
|
||||
|
||||
[node name="BackWheel" type="VehicleWheel3D" parent="." unique_id=128773497]
|
||||
transform = Transform3D(-1, 0, 8.742278e-08, 0, 1, 0, -8.742278e-08, 0, -1, -0.4791991, 0.37716705, 0.9504494)
|
||||
use_as_traction = true
|
||||
wheel_roll_influence = 0.3
|
||||
wheel_radius = 0.389
|
||||
wheel_rest_length = 0.05
|
||||
wheel_friction_slip = 1.0
|
||||
suspension_travel = 0.1
|
||||
suspension_stiffness = 500.0
|
||||
suspension_max_force = 10500.0
|
||||
damping_compression = 10.0
|
||||
damping_relaxation = 11.0
|
||||
|
||||
[node name="FrontWheel" type="VehicleWheel3D" parent="." unique_id=1222187628]
|
||||
transform = Transform3D(-1, 6.4255117e-09, 8.7186315e-08, 4.371139e-08, 0.90043265, 0.43499538, -7.5710346e-08, 0.43499538, -0.90043265, -0.479199, 0.3713468, -0.73007745)
|
||||
use_as_steering = true
|
||||
wheel_roll_influence = 0.3
|
||||
wheel_radius = 0.389
|
||||
wheel_rest_length = 0.05
|
||||
wheel_friction_slip = 1.0
|
||||
suspension_travel = 0.1
|
||||
suspension_stiffness = 500.0
|
||||
suspension_max_force = 10500.0
|
||||
damping_compression = 10.0
|
||||
damping_relaxation = 11.0
|
||||
|
|
@ -8,8 +8,53 @@
|
|||
|
||||
config_version=5
|
||||
|
||||
[animation]
|
||||
|
||||
compatibility/default_parent_skeleton_in_mesh_instance_3d=true
|
||||
|
||||
[application]
|
||||
|
||||
config/name="PROJECT"
|
||||
config/features=PackedStringArray("4.4", "Forward Plus")
|
||||
config/name="authority"
|
||||
run/main_scene="uid://1qvpc2ej32pd"
|
||||
config/features=PackedStringArray("4.6", "Forward Plus")
|
||||
config/icon="res://icon.svg"
|
||||
|
||||
[display]
|
||||
|
||||
window/size/viewport_width=1920
|
||||
window/size/viewport_height=1080
|
||||
|
||||
[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)
|
||||
]
|
||||
}
|
||||
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)
|
||||
]
|
||||
}
|
||||
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)
|
||||
]
|
||||
}
|
||||
move_backward={
|
||||
"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)
|
||||
]
|
||||
}
|
||||
|
||||
[physics]
|
||||
|
||||
3d/physics_engine="Jolt Physics"
|
||||
|
||||
[rendering]
|
||||
|
||||
lights_and_shadows/directional_shadow/soft_shadow_filter_quality=3
|
||||
lights_and_shadows/positional_shadow/soft_shadow_filter_quality=3
|
||||
shading/overrides/force_vertex_shading=true
|
||||
anti_aliasing/quality/msaa_3d=1
|
||||
anti_aliasing/quality/use_debanding=true
|
||||
|
|
|
|||
BIN
project/scenes/style_test_blockout.scn
Normal file
50
project/scenes/test_world.tscn
Normal file
|
|
@ -0,0 +1,50 @@
|
|||
[gd_scene format=3 uid="uid://cv0ub3llm3jew"]
|
||||
|
||||
[ext_resource type="PackedScene" uid="uid://dcqd0wo5y5a1g" path="res://objects/player_character.tscn" id="1_kyfjp"]
|
||||
[ext_resource type="PackedScene" uid="uid://dfbdn64i7vfuc" path="res://objects/party_member.tscn" id="2_amxg5"]
|
||||
|
||||
[sub_resource type="ProceduralSkyMaterial" id="ProceduralSkyMaterial_kyfjp"]
|
||||
sky_horizon_color = Color(0.66224277, 0.6717428, 0.6867428, 1)
|
||||
ground_horizon_color = Color(0.66224277, 0.6717428, 0.6867428, 1)
|
||||
|
||||
[sub_resource type="Sky" id="Sky_amxg5"]
|
||||
sky_material = SubResource("ProceduralSkyMaterial_kyfjp")
|
||||
|
||||
[sub_resource type="Environment" id="Environment_3263u"]
|
||||
background_mode = 2
|
||||
sky = SubResource("Sky_amxg5")
|
||||
tonemap_mode = 2
|
||||
glow_enabled = true
|
||||
|
||||
[sub_resource type="NavigationMesh" id="NavigationMesh_amxg5"]
|
||||
vertices = PackedVector3Array(-8.5, 0.5, -9, -6.5, 0.5, -9, -6.5, 0.5, -49.5, -49.5, 0.5, -7.5, -8.75, 0.5, -7.25, -49.5, 0.5, -49.5, -4.25, 0.5, -9, -4.25, 0.5, -49.5, -2, 0.5, -8.75, 49.5, 0.5, -6.5, 49.5, 0.5, -49.5, -2, 0.5, -6.5, -7.75, 2.5, -8, -7.75, 2.5, -5.25, -3, 2.5, -5.25, -3, 2.5, -8, -49.5, 0.5, -5.75, -8.75, 0.5, -6, -2, 0.5, -4.5, -3.75, 0.5, -4.25, -3.5, 0.5, 49.5, 49.5, 0.5, 49.5, -8.75, 0.5, -4.5, -7, 0.5, -4.25, -49.5, 0.5, 49.5, -7.25, 0.5, 49.5)
|
||||
polygons = [PackedInt32Array(2, 1, 0), PackedInt32Array(4, 3, 0), PackedInt32Array(0, 3, 5), PackedInt32Array(0, 5, 2), PackedInt32Array(2, 7, 1), PackedInt32Array(1, 7, 6), PackedInt32Array(6, 7, 8), PackedInt32Array(8, 7, 10), PackedInt32Array(8, 10, 9), PackedInt32Array(9, 11, 8), PackedInt32Array(15, 14, 12), PackedInt32Array(12, 14, 13), PackedInt32Array(17, 16, 4), PackedInt32Array(4, 16, 3), PackedInt32Array(18, 11, 9), PackedInt32Array(18, 9, 19), PackedInt32Array(19, 9, 20), PackedInt32Array(20, 9, 21), PackedInt32Array(16, 17, 22), PackedInt32Array(22, 23, 16), PackedInt32Array(16, 23, 25), PackedInt32Array(16, 25, 24), PackedInt32Array(23, 19, 25), PackedInt32Array(25, 19, 20)]
|
||||
|
||||
[node name="TestWorld" type="Node3D" unique_id=262419127]
|
||||
|
||||
[node name="WorldEnvironment" type="WorldEnvironment" parent="." unique_id=1185961481]
|
||||
environment = SubResource("Environment_3263u")
|
||||
|
||||
[node name="DirectionalLight3D" type="DirectionalLight3D" parent="." unique_id=1382994887]
|
||||
transform = Transform3D(-0.8660254, -0.43301278, 0.25, 0, 0.49999997, 0.86602545, -0.50000006, 0.75, -0.43301266, 0, 0, 0)
|
||||
shadow_enabled = true
|
||||
|
||||
[node name="PlayerCharacter" parent="." unique_id=1435471129 instance=ExtResource("1_kyfjp")]
|
||||
transform = Transform3D(1, 0, 0, 0, 1, 0, 0, 0, 1, 0, 1, 0)
|
||||
|
||||
[node name="PartyMember" parent="." unique_id=2124931928 instance=ExtResource("2_amxg5")]
|
||||
transform = Transform3D(1, 0, 0, 0, 1, 0, 0, 0, 1, 2, 1, 5)
|
||||
|
||||
[node name="NavigationRegion3D" type="NavigationRegion3D" parent="." unique_id=357996274]
|
||||
navigation_mesh = SubResource("NavigationMesh_amxg5")
|
||||
|
||||
[node name="CSGCombiner3D" type="CSGCombiner3D" parent="NavigationRegion3D" unique_id=885387983]
|
||||
use_collision = true
|
||||
|
||||
[node name="CSGBox3D" type="CSGBox3D" parent="NavigationRegion3D/CSGCombiner3D" unique_id=1853081325]
|
||||
transform = Transform3D(1, 0, 0, 0, 1, 0, 0, 0, 1, 0, -0.5, 0)
|
||||
size = Vector3(100, 1, 100)
|
||||
|
||||
[node name="CSGBox3D2" type="CSGBox3D" parent="NavigationRegion3D/CSGCombiner3D" unique_id=40055740]
|
||||
transform = Transform3D(1, 0, 0, 0, 1, 0, 0, 0, 1, -5.293318, 1.1054688, -6.6544046)
|
||||
size = Vector3(5.5302734, 2.2109375, 3.6298828)
|
||||