#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;
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);
};
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;
- bool drowning;
+ // 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();
}
};
+class NodeResolver;
+class INodeDefManager;
+
+struct NodeListInfo {
+ NodeListInfo(u32 len)
+ {
+ length = len;
+ all_required = false;
+ c_fallback = CONTENT_IGNORE;
+ }
+
+ NodeListInfo(u32 len, content_t fallback)
+ {
+ length = len;
+ all_required = true;
+ c_fallback = fallback;
+ }
+
+ u32 length;
+ bool all_required;
+ content_t c_fallback;
+};
+
+struct NodeResolveInfo {
+ NodeResolveInfo(NodeResolver *nr)
+ {
+ resolver = nr;
+ }
+
+ std::list<std::string> nodenames;
+ std::list<NodeListInfo> nodelistinfo;
+ NodeResolver *resolver;
+};
+
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 bool getNodeRegistrationStatus() const=0;
+ virtual void setNodeRegistrationStatus(bool completed)=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 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 bool getNodeRegistrationStatus() const=0;
+ virtual void setNodeRegistrationStatus(bool completed)=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;
+ }
+
+ virtual ~NodeResolver()
+ {
+ if (!m_lookup_done && m_ndef)
+ m_ndef->cancelNodeResolve(this);
+ }
+
+ virtual void resolveNodeNames(NodeResolveInfo *nri) = 0;
+
+ bool m_lookup_done;
+ INodeDefManager *m_ndef;
};
-IWritableNodeDefManager* createNodeDefManager();
#endif