*/
#ifndef SERVER
// 0 1 2 3 4 5
- // up down right left back front
+ // up down right left back front
TileSpec tiles[6];
// Special tiles
// - Currently used for flowing liquids
std::string mesh;
#ifndef SERVER
scene::IMesh *mesh_ptr[24];
-#endif
+#endif
float visual_scale; // Misc. scale parameter
TileDef tiledef[6];
TileDef tiledef_special[CF_SPECIAL_COUNT]; // eg. flowing liquid
/*
Methods
*/
-
+
ContentFeatures();
~ContentFeatures();
void reset();
}
};
-struct NodeResolveInfo {
- std::string n_wanted;
- std::string n_alt;
- content_t c_fallback;
- content_t *output;
-};
-
-#define NR_STATUS_FAILURE 0
-#define NR_STATUS_PENDING 1
-#define NR_STATUS_SUCCESS 2
-
-class NodeResolver {
-public:
- NodeResolver(INodeDefManager *ndef);
- ~NodeResolver();
+class NodeResolver;
+class INodeDefManager;
- int addNode(std::string n_wanted, std::string n_alt,
- content_t c_fallback, content_t *content);
- int addNodeList(const char *nodename, std::vector<content_t> *content_vec);
+struct NodeListInfo {
+ NodeListInfo(u32 len)
+ {
+ length = len;
+ all_required = false;
+ c_fallback = CONTENT_IGNORE;
+ }
- bool cancelNode(content_t *content);
- int cancelNodeList(std::vector<content_t> *content_vec);
+ NodeListInfo(u32 len, content_t fallback)
+ {
+ length = len;
+ all_required = true;
+ c_fallback = fallback;
+ }
- int resolveNodes();
+ u32 length;
+ bool all_required;
+ content_t c_fallback;
+};
- bool isNodeRegFinished() { return m_is_node_registration_complete; }
+struct NodeResolveInfo {
+ NodeResolveInfo(NodeResolver *nr)
+ {
+ resolver = nr;
+ }
-private:
- INodeDefManager *m_ndef;
- bool m_is_node_registration_complete;
- std::list<NodeResolveInfo *> m_pending_contents;
- std::list<std::pair<std::string, std::vector<content_t> *> > m_pending_content_vecs;
+ std::list<std::string> nodenames;
+ std::list<NodeListInfo> nodelistinfo;
+ NodeResolver *resolver;
};
class INodeDefManager
virtual void getIds(const std::string &name, std::set<content_t> &result)
const=0;
virtual const ContentFeatures& get(const std::string &name) const=0;
-
+
virtual void serialize(std::ostream &os, u16 protocol_version)=0;
- virtual NodeResolver *getResolver()=0;
+ virtual void pendNodeResolve(NodeResolveInfo *nri)=0;
+ virtual void cancelNodeResolve(NodeResolver *resolver)=0;
+ virtual void runNodeResolverCallbacks()=0;
+
+ virtual bool getIdFromResolveInfo(NodeResolveInfo *nri,
+ const std::string &node_alt, content_t c_fallback, content_t &result)=0;
+ virtual bool getIdsFromResolveInfo(NodeResolveInfo *nri,
+ std::vector<content_t> &result)=0;
};
class IWritableNodeDefManager : public INodeDefManager
virtual void serialize(std::ostream &os, u16 protocol_version)=0;
virtual void deSerialize(std::istream &is)=0;
- virtual NodeResolver *getResolver()=0;
+ virtual void pendNodeResolve(NodeResolveInfo *nri)=0;
+ virtual void cancelNodeResolve(NodeResolver *resolver)=0;
+ virtual void runNodeResolverCallbacks()=0;
+
+ virtual bool getIdFromResolveInfo(NodeResolveInfo *nri,
+ const std::string &node_alt, content_t c_fallback, content_t &result)=0;
+ virtual bool getIdsFromResolveInfo(NodeResolveInfo *nri,
+ std::vector<content_t> &result)=0;
};
IWritableNodeDefManager *createNodeDefManager();
+class NodeResolver {
+public:
+ NodeResolver()
+ {
+ m_lookup_done = false;
+ m_ndef = NULL;
+ }
+
+ ~NodeResolver()
+ {
+ if (!m_lookup_done)
+ m_ndef->cancelNodeResolve(this);
+ }
+
+ virtual void resolveNodeNames(NodeResolveInfo *nri) = 0;
+
+ bool m_lookup_done;
+ INodeDefManager *m_ndef;
+};
+
+
#endif