add 'player-entity' to defaults.toml

This commit is contained in:
MihailRis 2025-02-12 16:32:21 +03:00
parent f0c7bc6377
commit 3430e5cd6f
10 changed files with 34 additions and 11 deletions

View File

@ -1 +1,2 @@
generator = "core:default"
player-entity = ""

View File

@ -1 +1,2 @@
generator = "base:demo"
player-entity = "base:player"

View File

@ -34,12 +34,14 @@ Content::Content(
UptrsMap<std::string, ContentPackRuntime> packs,
UptrsMap<std::string, BlockMaterial> blockMaterials,
UptrsMap<std::string, rigging::SkeletonConfig> skeletons,
ResourceIndicesSet resourceIndices
ResourceIndicesSet resourceIndices,
dv::value defaults
)
: indices(std::move(indices)),
packs(std::move(packs)),
blockMaterials(std::move(blockMaterials)),
skeletons(std::move(skeletons)),
defaults(std::move(defaults)),
blocks(std::move(blocks)),
items(std::move(items)),
entities(std::move(entities)),

View File

@ -201,6 +201,7 @@ class Content {
UptrsMap<std::string, ContentPackRuntime> packs;
UptrsMap<std::string, BlockMaterial> blockMaterials;
UptrsMap<std::string, rigging::SkeletonConfig> skeletons;
dv::value defaults = nullptr;
public:
ContentUnitDefs<Block> blocks;
ContentUnitDefs<ItemDef> items;
@ -219,7 +220,8 @@ public:
UptrsMap<std::string, ContentPackRuntime> packs,
UptrsMap<std::string, BlockMaterial> blockMaterials,
UptrsMap<std::string, rigging::SkeletonConfig> skeletons,
ResourceIndicesSet resourceIndices
ResourceIndicesSet resourceIndices,
dv::value defaults
);
~Content();
@ -231,6 +233,10 @@ public:
return resourceIndices[static_cast<size_t>(type)];
}
inline const dv::value& getDefaults() const {
return defaults;
}
const rigging::SkeletonConfig* getSkeleton(const std::string& id) const;
const BlockMaterial* findBlockMaterial(const std::string& id) const;
const ContentPackRuntime* getPackRuntime(const std::string& id) const;

View File

@ -84,7 +84,8 @@ std::unique_ptr<Content> ContentBuilder::build() {
std::move(packs),
std::move(blockMaterials),
std::move(skeletons),
std::move(resourceIndices)
std::move(resourceIndices),
std::move(defaults)
);
// Now, it's time to resolve foreign keys

View File

@ -73,6 +73,7 @@ public:
ContentUnitBuilder<EntityDef> entities {allNames, ContentType::ENTITY};
ContentUnitBuilder<GeneratorDef> generators {allNames, ContentType::GENERATOR};
ResourceIndicesSet resourceIndices {};
dv::value defaults = nullptr;
~ContentBuilder();

View File

@ -23,6 +23,7 @@
#include "data/dv_util.hpp"
#include "data/StructLayout.hpp"
#include "presets/ParticlesPreset.hpp"
#include "io/engine_paths.hpp"
namespace fs = std::filesystem;
using namespace data;
@ -760,6 +761,10 @@ void ContentLoader::load() {
auto folder = pack->folder;
builder.defaults = paths.readCombinedObject(
EnginePaths::CONFIG_DEFAULTS.string()
);
// Load world generators
io::path generatorsDir = folder / "generators";
foreach_file(generatorsDir, [this](const io::path& file) {

View File

@ -39,8 +39,7 @@ public:
static std::tuple<std::string, std::string> parsePath(std::string_view view);
static inline auto CONFIG_DEFAULTS =
std::filesystem::u8path("config/defaults.toml");
static inline io::path CONFIG_DEFAULTS = "config/defaults.toml";
private:
std::filesystem::path userFilesFolder {"."};
std::filesystem::path resourcesFolder {"res"};

View File

@ -6,6 +6,7 @@
#include "world/Level.hpp"
#include "world/generator/VoxelFragment.hpp"
#include "content/ContentLoader.hpp"
#include "content/Content.hpp"
#include "engine/Engine.hpp"
#include "../lua_custom_types.hpp"
@ -69,8 +70,9 @@ static int l_get_generators(lua::State* L) {
/// @brief Get the default world generator
/// @return The ID of the default world generator
static int l_get_default_generator(lua::State* L) {
// content is not initialized yet
auto combined = engine->getResPaths()->readCombinedObject(
EnginePaths::CONFIG_DEFAULTS.u8string()
EnginePaths::CONFIG_DEFAULTS.string()
);
return lua::pushstring(L, combined["generator"].asString());
}
@ -81,4 +83,5 @@ const luaL_Reg generationlib[] = {
{"load_fragment", lua::wrap<l_load_fragment>},
{"get_generators", lua::wrap<l_get_generators>},
{"get_default_generator", lua::wrap<l_get_default_generator>},
{NULL, NULL}};
{NULL, NULL}
};

View File

@ -63,10 +63,14 @@ Player::~Player() = default;
void Player::updateEntity() {
if (eid == ENTITY_AUTO) {
auto& def = level.content.entities.require("base:player");
eid = level.entities->spawn(def, getPosition());
if (auto entity = level.entities->get(eid)) {
entity->setPlayer(id);
const auto& defaults = level.content.getDefaults();
const auto& defName = defaults["player-entity"].asString();
if (!defName.empty()) {
auto& def = level.content.entities.require(defName);
eid = level.entities->spawn(def, getPosition());
if (auto entity = level.entities->get(eid)) {
entity->setPlayer(id);
}
}
} else if (auto entity = level.entities->get(eid)) {
position = entity->getTransform().pos;