Generated items
This commit is contained in:
+28
-1
@@ -10,6 +10,9 @@ using glm::vec3;
|
|||||||
using std::string;
|
using std::string;
|
||||||
using std::unordered_map;
|
using std::unordered_map;
|
||||||
|
|
||||||
|
ContentBuilder::~ContentBuilder() {
|
||||||
|
}
|
||||||
|
|
||||||
void ContentBuilder::add(Block* def) {
|
void ContentBuilder::add(Block* def) {
|
||||||
checkIdentifier(def->name);
|
checkIdentifier(def->name);
|
||||||
blockDefs[def->name] = def;
|
blockDefs[def->name] = def;
|
||||||
@@ -22,10 +25,34 @@ void ContentBuilder::add(ItemDef* def) {
|
|||||||
itemIds.push_back(def->name);
|
itemIds.push_back(def->name);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
Block* ContentBuilder::createBlock(std::string id) {
|
||||||
|
auto found = blockDefs.find(id);
|
||||||
|
if (found != blockDefs.end()) {
|
||||||
|
//return found->second;
|
||||||
|
throw namereuse_error("name "+id+" is already used", contenttype::item);
|
||||||
|
}
|
||||||
|
Block* block = new Block(id);
|
||||||
|
add(block);
|
||||||
|
return block;
|
||||||
|
}
|
||||||
|
|
||||||
|
ItemDef* ContentBuilder::createItem(std::string id) {
|
||||||
|
auto found = itemDefs.find(id);
|
||||||
|
if (found != itemDefs.end()) {
|
||||||
|
if (found->second->generated) {
|
||||||
|
return found->second;
|
||||||
|
}
|
||||||
|
throw namereuse_error("name "+id+" is already used", contenttype::item);
|
||||||
|
}
|
||||||
|
ItemDef* item = new ItemDef(id);
|
||||||
|
add(item);
|
||||||
|
return item;
|
||||||
|
}
|
||||||
|
|
||||||
void ContentBuilder::checkIdentifier(std::string id) {
|
void ContentBuilder::checkIdentifier(std::string id) {
|
||||||
contenttype result;
|
contenttype result;
|
||||||
if ((checkContentType(id) != contenttype::none)) {
|
if ((checkContentType(id) != contenttype::none)) {
|
||||||
throw contentindexreuse_error("identifier "+id+" is already used", result);
|
throw namereuse_error("name "+id+" is already used", result);
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|||||||
@@ -18,10 +18,10 @@ enum class contenttype {
|
|||||||
none, block, item
|
none, block, item
|
||||||
};
|
};
|
||||||
|
|
||||||
class contentindexreuse_error: public std::runtime_error {
|
class namereuse_error: public std::runtime_error {
|
||||||
contenttype type;
|
contenttype type;
|
||||||
public:
|
public:
|
||||||
contentindexreuse_error(const std::string& msg, contenttype type)
|
namereuse_error(const std::string& msg, contenttype type)
|
||||||
: std::runtime_error(msg), type(type) {}
|
: std::runtime_error(msg), type(type) {}
|
||||||
|
|
||||||
inline contenttype getType() const {
|
inline contenttype getType() const {
|
||||||
@@ -36,9 +36,14 @@ class ContentBuilder {
|
|||||||
std::unordered_map<std::string, ItemDef*> itemDefs;
|
std::unordered_map<std::string, ItemDef*> itemDefs;
|
||||||
std::vector<std::string> itemIds;
|
std::vector<std::string> itemIds;
|
||||||
public:
|
public:
|
||||||
|
~ContentBuilder();
|
||||||
|
|
||||||
void add(Block* def);
|
void add(Block* def);
|
||||||
void add(ItemDef* def);
|
void add(ItemDef* def);
|
||||||
|
|
||||||
|
Block* createBlock(std::string id);
|
||||||
|
ItemDef* createItem(std::string id);
|
||||||
|
|
||||||
void checkIdentifier(std::string id);
|
void checkIdentifier(std::string id);
|
||||||
contenttype checkContentType(std::string id);
|
contenttype checkContentType(std::string id);
|
||||||
|
|
||||||
|
|||||||
@@ -92,9 +92,8 @@ void ContentLoader::fixPackIndices() {
|
|||||||
}
|
}
|
||||||
|
|
||||||
// TODO: add basic validation and logging
|
// TODO: add basic validation and logging
|
||||||
Block* ContentLoader::loadBlock(std::string name, fs::path file) {
|
void ContentLoader::loadBlock(Block* def, std::string name, fs::path file) {
|
||||||
std::unique_ptr<json::JObject> root(files::read_json(file));
|
std::unique_ptr<json::JObject> root(files::read_json(file));
|
||||||
std::unique_ptr<Block> def(new Block(name));
|
|
||||||
|
|
||||||
// block texturing
|
// block texturing
|
||||||
if (root->has("texture")) {
|
if (root->has("texture")) {
|
||||||
@@ -176,41 +175,32 @@ Block* ContentLoader::loadBlock(std::string name, fs::path file) {
|
|||||||
root->flag("hidden", def->hidden);
|
root->flag("hidden", def->hidden);
|
||||||
root->flag("sky-light-passing", def->skyLightPassing);
|
root->flag("sky-light-passing", def->skyLightPassing);
|
||||||
root->num("draw-group", def->drawGroup);
|
root->num("draw-group", def->drawGroup);
|
||||||
|
|
||||||
return def.release();
|
|
||||||
}
|
}
|
||||||
|
|
||||||
ItemDef* ContentLoader::loadItem(std::string name, std::filesystem::path file) {
|
void ContentLoader::loadItem(ItemDef* def, std::string name, std::filesystem::path file) {
|
||||||
std::unique_ptr<json::JObject> root(files::read_json(file));
|
std::unique_ptr<json::JObject> root(files::read_json(file));
|
||||||
std::unique_ptr<ItemDef> def(new ItemDef(name));
|
|
||||||
|
|
||||||
return def.release();
|
|
||||||
}
|
}
|
||||||
|
|
||||||
Block* ContentLoader::loadBlock(std::string name) {
|
void ContentLoader::loadBlock(Block* def, std::string full, std::string name) {
|
||||||
auto folder = pack->folder;
|
auto folder = pack->folder;
|
||||||
|
|
||||||
std::string prefix = pack->id+":"+name;
|
|
||||||
fs::path configFile = folder/fs::path("blocks/"+name+".json");
|
fs::path configFile = folder/fs::path("blocks/"+name+".json");
|
||||||
fs::path scriptfile = folder/fs::path("scripts/"+name+".lua");
|
fs::path scriptfile = folder/fs::path("scripts/"+name+".lua");
|
||||||
Block* def = loadBlock(prefix, configFile);
|
loadBlock(def, full, configFile);
|
||||||
if (fs::is_regular_file(scriptfile)) {
|
if (fs::is_regular_file(scriptfile)) {
|
||||||
scripting::load_block_script(prefix, scriptfile, &def->rt.funcsset);
|
scripting::load_block_script(full, scriptfile, &def->rt.funcsset);
|
||||||
}
|
}
|
||||||
return def;
|
|
||||||
}
|
}
|
||||||
|
|
||||||
ItemDef* ContentLoader::loadItem(std::string name) {
|
void ContentLoader::loadItem(ItemDef* def, std::string full, std::string name) {
|
||||||
auto folder = pack->folder;
|
auto folder = pack->folder;
|
||||||
|
|
||||||
std::string prefix = pack->id+":"+name;
|
|
||||||
fs::path configFile = folder/fs::path("items/"+name+".json");
|
fs::path configFile = folder/fs::path("items/"+name+".json");
|
||||||
fs::path scriptfile = folder/fs::path("scripts/"+name+".lua");
|
fs::path scriptfile = folder/fs::path("scripts/"+name+".lua");
|
||||||
ItemDef* def = loadItem(prefix, configFile);
|
loadItem(def, full, configFile);
|
||||||
if (fs::is_regular_file(scriptfile)) {
|
if (fs::is_regular_file(scriptfile)) {
|
||||||
scripting::load_item_script(prefix, scriptfile, &def->rt.funcsset);
|
scripting::load_item_script(full, scriptfile, &def->rt.funcsset);
|
||||||
}
|
}
|
||||||
return def;
|
|
||||||
}
|
}
|
||||||
|
|
||||||
void ContentLoader::load(ContentBuilder* builder) {
|
void ContentLoader::load(ContentBuilder* builder) {
|
||||||
@@ -226,14 +216,26 @@ void ContentLoader::load(ContentBuilder* builder) {
|
|||||||
json::JArray* blocksarr = root->arr("blocks");
|
json::JArray* blocksarr = root->arr("blocks");
|
||||||
if (blocksarr) {
|
if (blocksarr) {
|
||||||
for (uint i = 0; i < blocksarr->size(); i++) {
|
for (uint i = 0; i < blocksarr->size(); i++) {
|
||||||
builder->add(loadBlock(blocksarr->str(i)));
|
std::string name = blocksarr->str(i);
|
||||||
|
std::string full = pack->id+":"+name;
|
||||||
|
auto def = builder->createBlock(full);
|
||||||
|
loadBlock(def, full, name);
|
||||||
|
if (!def->hidden) {
|
||||||
|
auto item = builder->createItem(full+BLOCK_ITEM_SUFFIX);
|
||||||
|
item->generated = true;
|
||||||
|
item->iconType = item_icon_type::block;
|
||||||
|
item->icon = full;
|
||||||
|
item->placingBlock = full;
|
||||||
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
json::JArray* itemsarr = root->arr("items");
|
json::JArray* itemsarr = root->arr("items");
|
||||||
if (itemsarr) {
|
if (itemsarr) {
|
||||||
for (uint i = 0; i < itemsarr->size(); i++) {
|
for (uint i = 0; i < itemsarr->size(); i++) {
|
||||||
builder->add(loadItem(itemsarr->str(i)));
|
std::string name = itemsarr->str(i);
|
||||||
|
std::string full = pack->id+":"+name;
|
||||||
|
loadItem(builder->createItem(full), full, name);
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|||||||
@@ -16,8 +16,8 @@ namespace json {
|
|||||||
class ContentLoader {
|
class ContentLoader {
|
||||||
const ContentPack* pack;
|
const ContentPack* pack;
|
||||||
|
|
||||||
Block* loadBlock(std::string name);
|
void loadBlock(Block* def, std::string full, std::string name);
|
||||||
ItemDef* loadItem(std::string name);
|
void loadItem(ItemDef* def, std::string full, std::string name);
|
||||||
public:
|
public:
|
||||||
ContentLoader(ContentPack* pack);
|
ContentLoader(ContentPack* pack);
|
||||||
|
|
||||||
@@ -25,8 +25,8 @@ public:
|
|||||||
json::JObject* indicesRoot,
|
json::JObject* indicesRoot,
|
||||||
std::string contentSection);
|
std::string contentSection);
|
||||||
void fixPackIndices();
|
void fixPackIndices();
|
||||||
Block* loadBlock(std::string name, std::filesystem::path file);
|
void loadBlock(Block* def, std::string name, std::filesystem::path file);
|
||||||
ItemDef* loadItem(std::string name, std::filesystem::path file);
|
void loadItem(ItemDef* def, std::string name, std::filesystem::path file);
|
||||||
void load(ContentBuilder* builder);
|
void load(ContentBuilder* builder);
|
||||||
};
|
};
|
||||||
|
|
||||||
|
|||||||
+14
-1
@@ -6,13 +6,26 @@
|
|||||||
|
|
||||||
#include "../typedefs.h"
|
#include "../typedefs.h"
|
||||||
|
|
||||||
|
#define BLOCK_ITEM_SUFFIX ".item"
|
||||||
|
|
||||||
struct item_funcs_set {
|
struct item_funcs_set {
|
||||||
bool init: 1;
|
bool init: 1;
|
||||||
};
|
};
|
||||||
|
|
||||||
|
enum class item_icon_type {
|
||||||
|
sprite, block,
|
||||||
|
};
|
||||||
|
|
||||||
class ItemDef {
|
class ItemDef {
|
||||||
public:
|
public:
|
||||||
std::string name;
|
std::string const name;
|
||||||
|
|
||||||
|
bool generated = false;
|
||||||
|
|
||||||
|
item_icon_type iconType = item_icon_type::sprite;
|
||||||
|
std::string icon = "block:notfound";
|
||||||
|
|
||||||
|
std::string placingBlock = "none";
|
||||||
|
|
||||||
struct {
|
struct {
|
||||||
itemid_t id;
|
itemid_t id;
|
||||||
|
|||||||
Reference in New Issue
Block a user