BlockState: store properties
This commit is contained in:
parent
2db8c240c1
commit
2b06f0c149
|
@ -4,21 +4,35 @@
|
|||
#include <string>
|
||||
#include <string_view>
|
||||
#include <functional>
|
||||
#include <map>
|
||||
|
||||
namespace Feather
|
||||
{
|
||||
class BlockState
|
||||
{
|
||||
friend struct std::hash<BlockState>;
|
||||
|
||||
// PLACEHOLDER
|
||||
std::string_view m_name;
|
||||
std::map<std::string_view, std::string_view> m_properties;
|
||||
public:
|
||||
BlockState(std::string_view name) : m_name(name) {}
|
||||
|
||||
inline const std::string_view GetName() const { return m_name; }
|
||||
|
||||
inline void AddProperty(std::string_view key, std::string_view value) { m_properties.insert({ key, value }); }
|
||||
|
||||
inline bool operator ==(const BlockState that) const
|
||||
{
|
||||
return m_name == that.m_name;
|
||||
if (m_name != that.m_name) return false;
|
||||
|
||||
for (auto& [key, value] : that.m_properties)
|
||||
{
|
||||
if (!m_properties.contains(key) || m_properties.at(key) != value)
|
||||
return false;
|
||||
}
|
||||
|
||||
return true;
|
||||
}
|
||||
};
|
||||
}
|
||||
|
@ -31,6 +45,13 @@ struct std::hash<Feather::BlockState>
|
|||
using std::hash;
|
||||
using std::string_view;
|
||||
|
||||
return hash<string_view>()(state.GetName());
|
||||
size_t accum = 0;
|
||||
accum += hash<string_view>()(state.GetName());
|
||||
|
||||
// pretty basic hash, sum of all keys and values + block name
|
||||
for (auto& [key, value] : state.m_properties)
|
||||
accum += hash<string_view>()(key) + hash<string_view>()(value);
|
||||
|
||||
return accum;
|
||||
}
|
||||
};
|
|
@ -42,13 +42,28 @@ namespace Feather
|
|||
|
||||
for (auto& block : doc.GetObject())
|
||||
{
|
||||
//Log::Info("{}: {} states", m.name.GetString(), m.value["states"].Size());
|
||||
// TODO
|
||||
//if (block.value.HasMember("properties")) {}
|
||||
|
||||
//Log::Info("{}: {} states", block.name.GetString(), block.value["states"].Size());
|
||||
for (auto& stateData : block.value["states"].GetArray())
|
||||
{
|
||||
std::string* name = new std::string(block.name.GetString());
|
||||
BlockState state(*name);
|
||||
|
||||
if (stateData.HasMember("properties"))
|
||||
{
|
||||
for (auto& prop : stateData["properties"].GetObject())
|
||||
{
|
||||
std::string* propName = new std::string(prop.name.GetString());
|
||||
std::string* propValue = new std::string(prop.value.GetString());
|
||||
state.AddProperty(*propName, *propValue);
|
||||
}
|
||||
}
|
||||
|
||||
BLOCK_STATES.AddMapping(stateData["id"].GetInt(), state);
|
||||
}
|
||||
|
||||
}
|
||||
|
||||
Log::Info("Loaded {} block states.", BLOCK_STATES.Size());
|
||||
|
|
|
@ -55,6 +55,16 @@ namespace Feather
|
|||
const char* name = state.Get<StringTag>("Name").GetValue();
|
||||
|
||||
BlockState stateLookup(name);
|
||||
|
||||
CompoundTag properties = state.GetCompound("Properties");
|
||||
if (properties)
|
||||
{
|
||||
for (auto& prop : properties)
|
||||
{
|
||||
stateLookup.AddProperty(prop.GetName(), prop.GetValueString());
|
||||
}
|
||||
}
|
||||
|
||||
int id;
|
||||
|
||||
// TODO: handle this in IdMapper
|
||||
|
|
Loading…
Reference in New Issue