#include <string>
#include <iostream>
#include <map>
+#include <list>
#include "mapnode.h"
#ifndef SERVER
#include "tile.h"
+#include "shader.h"
#endif
#include "itemgroup.h"
#include "sound.h" // SimpleSoundSpec
class IItemDefManager;
class ITextureSource;
+class IShaderSource;
class IGameDef;
+typedef std::list<std::pair<content_t, int> > GroupItems;
+typedef std::list<std::pair<std::string, std::vector<content_t> *> >
+ ContentVectorResolveList;
+
enum ContentParamType
{
CPT_NONE,
CPT2_FACEDIR,
// Direction for signs, torches and such
CPT2_WALLMOUNTED,
+ // Block level like FLOWINGLIQUID
+ CPT2_LEVELED,
};
enum LiquidType
{
LIQUID_NONE,
LIQUID_FLOWING,
- LIQUID_SOURCE
+ LIQUID_SOURCE,
};
enum NodeBoxType
NODEBOX_REGULAR, // Regular block; allows buildable_to
NODEBOX_FIXED, // Static separately defined box(es)
NODEBOX_WALLMOUNTED, // Box for wall mounted nodes; (top, bottom, side)
+ NODEBOX_LEVELED, // Same as fixed, but with dynamic height from param2. for snow, ...
};
struct NodeBox
{ reset(); }
void reset();
- void serialize(std::ostream &os) const;
+ void serialize(std::ostream &os, u16 protocol_version) const;
void deSerialize(std::istream &is);
};
animation.length = 1.0;
}
- void serialize(std::ostream &os) const;
+ void serialize(std::ostream &os, u16 protocol_version) const;
void deSerialize(std::istream &is);
};
NDT_FENCELIKE,
NDT_RAILLIKE,
NDT_NODEBOX,
+ NDT_GLASSLIKE_FRAMED, // Glass-like, draw connected frames and all all
+ // visible faces
+ // uses 2 textures, one for frames, second for faces
+ NDT_FIRELIKE, // Draw faces slightly rotated and only on connecting nodes,
+ NDT_GLASSLIKE_FRAMED_OPTIONAL, // enabled -> connected, disabled -> Glass-like
+ // uses 2 textures, one for frames, second for faces
+ NDT_MESH, // Uses static meshes
};
-#define CF_SPECIAL_COUNT 2
+#define CF_SPECIAL_COUNT 6
struct ContentFeatures
{
*/
#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
// Visual definition
enum NodeDrawType drawtype;
+ std::string mesh;
+#ifndef SERVER
+ scene::IMesh *mesh_ptr[24];
+#endif
float visual_scale; // Misc. scale parameter
TileDef tiledef[6];
TileDef tiledef_special[CF_SPECIAL_COUNT]; // eg. flowing liquid
bool buildable_to;
// Player cannot build to these (placement prediction disabled)
bool rightclickable;
+ // Flowing liquid or snow, value = default level
+ u8 leveled;
// Whether the node is non-liquid, source liquid or flowing liquid
enum LiquidType liquid_type;
// If the content is liquid, this is the flowing version of the liquid.
u8 liquid_viscosity;
// Is liquid renewable (new liquid source will be created between 2 existing)
bool liquid_renewable;
+ // Ice for water, water for ice
+ std::string freezemelt;
+ // Number of flowing liquids surrounding source
+ u8 liquid_range;
+ u8 drowning;
// Amount of light the node emits
u8 light_source;
u32 damage_per_second;
NodeBox node_box;
NodeBox selection_box;
+ NodeBox collision_box;
+ // Used for waving leaves/plants
+ u8 waving;
// Compatibility with old maps
// Set to true if paramtype used to be 'facedir_simple'
bool legacy_facedir_simple;
/*
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
+
+/**
+ NodeResolver
+
+ NodeResolver attempts to resolve node names to content ID integers. If the
+ node registration phase has not yet finished at the time the resolution
+ request is placed, the request is marked as pending and added to an internal
+ queue. The name resolution request is later satisfied by writing directly
+ to the output location when the node registration phase has been completed.
+
+ This is primarily intended to be used for objects registered during script
+ initialization (i.e. while nodes are being registered) that reference
+ particular nodes.
+*/
+class NodeResolver {
+public:
+ NodeResolver(INodeDefManager *ndef);
+ ~NodeResolver();
+
+ /**
+ Add a request to resolve the node n_wanted and set *content to the
+ result, or alternatively, n_alt if n_wanted is not found. If n_alt
+ cannot be found either, or has not been specified, *content is set
+ to c_fallback.
+
+ If node registration is complete, the request is finished immediately
+ and NR_STATUS_SUCCESS is returned (or NR_STATUS_FAILURE if no node can
+ be found). Otherwise, NR_STATUS_PENDING is returned and the resolution
+ request is queued.
+
+ N.B. If the memory in which content is located has been deallocated
+ before the pending request had been satisfied, cancelNode() must be
+ called.
+
+ @param n_wanted Name of node that is wanted.
+ @param n_alt Name of node in case n_wanted could not be found. Blank
+ if no alternative node is desired.
+ @param c_fallback Content ID that content is set to in case of node
+ resolution failure (should be CONTENT_AIR, CONTENT_IGNORE, etc.)
+ @param content Pointer to content_t that receives the result of the
+ node name resolution.
+ @return Status of node resolution request.
+ */
+ int addNode(const std::string &n_wanted, const std::string &n_alt,
+ content_t c_fallback, content_t *content);
+
+ /**
+ Add a request to resolve the node(s) specified by nodename.
+
+ If node registration is complete, the request is finished immediately
+ and NR_STATUS_SUCCESS is returned if at least one node is resolved; if
+ zero were resolved, NR_STATUS_FAILURE. Otherwise, NR_STATUS_PENDING is
+ returned and the resolution request is queued.
+
+ N.B. If the memory in which content_vec is located has been deallocated
+ before the pending request had been satisfied, cancelNodeList() must be
+ called.
+
+ @param nodename Name of node (or node group) to be resolved.
+ @param content_vec Pointer to content_t vector onto which the results
+ are added.
+
+ @return Status of node resolution request.
+ */
+ int addNodeList(const std::string &nodename,
+ std::vector<content_t> *content_vec);
+
+ /**
+ Removes all pending requests from the resolution queue with the output
+ address of 'content'.
+
+ @param content Location of the content ID for the request being
+ cancelled.
+ @return Number of pending requests cancelled.
+ */
+ bool cancelNode(content_t *content);
+
+ /**
+ Removes all pending requests from the resolution queue with the output
+ address of 'content_vec'.
+
+ @param content_vec Location of the content ID vector for requests being
+ cancelled.
+ @return Number of pending requests cancelled.
+ */
+ int cancelNodeList(std::vector<content_t> *content_vec);
+
+ /**
+ Carries out all pending node resolution requests. Call this when the
+ node registration phase has completed.
+
+ Internally marks node registration as complete.
+
+ @return Number of failed pending requests.
+ */
+ int resolveNodes();
+
+ /**
+ Returns the status of the node registration phase.
+
+ @return Boolean of whether the registration phase is complete.
+ */
+ bool isNodeRegFinished() { return m_is_node_registration_complete; }
+
+private:
+ INodeDefManager *m_ndef;
+ bool m_is_node_registration_complete;
+ std::list<NodeResolveInfo *> m_pending_contents;
+ ContentVectorResolveList m_pending_content_vecs;
+};
+
class INodeDefManager
{
public:
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;
};
class IWritableNodeDefManager : public INodeDefManager
virtual const ContentFeatures& get(content_t c) const=0;
virtual const ContentFeatures& get(const MapNode &n) const=0;
virtual bool getId(const std::string &name, content_t &result) const=0;
+ // If not found, returns CONTENT_IGNORE
virtual content_t getId(const std::string &name) const=0;
// Allows "group:name" in addition to regular node names
virtual void getIds(const std::string &name, std::set<content_t> &result)
const=0;
- // If not found, returns the features of CONTENT_IGNORE
+ // If not found, returns the features of CONTENT_UNKNOWN
virtual const ContentFeatures& get(const std::string &name) const=0;
- // Register node definition
- virtual void set(content_t c, const ContentFeatures &def)=0;
// Register node definition by name (allocate an id)
// If returns CONTENT_IGNORE, could not allocate id
virtual content_t set(const std::string &name,
/*
Update tile textures to latest return values of TextueSource.
- Call after updating the texture atlas of a TextureSource.
*/
- virtual void updateTextures(ITextureSource *tsrc)=0;
+ virtual void updateTextures(IGameDef *gamedef)=0;
virtual void serialize(std::ostream &os, u16 protocol_version)=0;
virtual void deSerialize(std::istream &is)=0;
+
+ virtual NodeResolver *getResolver()=0;
};
-IWritableNodeDefManager* createNodeDefManager();
+IWritableNodeDefManager *createNodeDefManager();
#endif