X-Git-Url: https://git.lizzy.rs/?a=blobdiff_plain;f=src%2Fnodedef.h;h=183b95d87f52844166c45f8fa97faa62d80107dc;hb=5d60a6c533efb572a4004d110536da63bb62c58a;hp=645e75e3e4a2b6ce1933eeaeb5f2b6b4c298287f;hpb=e5650bb54917ead2dccac9b46dfa1a00cd737694;p=dragonfireclient.git diff --git a/src/nodedef.h b/src/nodedef.h index 645e75e3e..183b95d87 100644 --- a/src/nodedef.h +++ b/src/nodedef.h @@ -1,18 +1,18 @@ /* -Minetest-c55 -Copyright (C) 2010-2011 celeron55, Perttu Ahola +Minetest +Copyright (C) 2010-2013 celeron55, Perttu Ahola This program is free software; you can redistribute it and/or modify -it under the terms of the GNU General Public License as published by -the Free Software Foundation; either version 2 of the License, or +it under the terms of the GNU Lesser General Public License as published by +the Free Software Foundation; either version 2.1 of the License, or (at your option) any later version. This program is distributed in the hope that it will be useful, but WITHOUT ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the -GNU General Public License for more details. +GNU Lesser General Public License for more details. -You should have received a copy of the GNU General Public License along +You should have received a copy of the GNU Lesser General Public License along with this program; if not, write to the Free Software Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA. */ @@ -20,39 +20,71 @@ with this program; if not, write to the Free Software Foundation, Inc., #ifndef NODEDEF_HEADER #define NODEDEF_HEADER -#include "common_irrlicht.h" +#include "irrlichttypes_bloated.h" #include #include -#include +#include +#include +#include "util/numeric.h" #include "mapnode.h" #ifndef SERVER -#include "tile.h" +#include "client/tile.h" +#include "shader.h" +class Client; #endif -#include "materials.h" // MaterialProperties +#include "itemgroup.h" +#include "sound.h" // SimpleSoundSpec +#include "constants.h" // BS +#include "tileanimation.h" + +class INodeDefManager; +class IItemDefManager; class ITextureSource; +class IShaderSource; class IGameDef; +class NodeResolver; + +typedef std::list > GroupItems; enum ContentParamType { CPT_NONE, CPT_LIGHT, - CPT_MINERAL, +}; + +enum ContentParamType2 +{ + CPT2_NONE, + // Need 8-bit param2 + CPT2_FULL, + // Flowing liquid properties + CPT2_FLOWINGLIQUID, // Direction for chests and furnaces and such - CPT_FACEDIR_SIMPLE + CPT2_FACEDIR, + // Direction for signs, torches and such + CPT2_WALLMOUNTED, + // Block level like FLOWINGLIQUID + CPT2_LEVELED, + // 2D rotation for things like plants + CPT2_DEGROTATE, + // Mesh options for plants + CPT2_MESHOPTIONS }; 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 - NODEBOX_WALLMOUNTED, // Box for wall_mounted nodes; (top, bottom, side) + 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, ... + NODEBOX_CONNECTED, // optionally draws nodeboxes if a neighbor node attaches }; struct NodeBox @@ -60,41 +92,48 @@ struct NodeBox enum NodeBoxType type; // NODEBOX_REGULAR (no parameters) // NODEBOX_FIXED - core::aabbox3d fixed; + std::vector fixed; // NODEBOX_WALLMOUNTED - core::aabbox3d wall_top; - core::aabbox3d wall_bottom; - core::aabbox3d wall_side; // being at the -X side - - NodeBox(): - type(NODEBOX_REGULAR), - // default is rail-like - fixed(-BS/2, -BS/2, -BS/2, BS/2, -BS/2+BS/16., BS/2), - // default is sign/ladder-like - wall_top(-BS/2, BS/2-BS/16., -BS/2, BS/2, BS/2, BS/2), - wall_bottom(-BS/2, -BS/2, -BS/2, BS/2, -BS/2+BS/16., BS/2), - wall_side(-BS/2, -BS/2, -BS/2, -BS/2+BS/16., BS/2, BS/2) - {} - - void serialize(std::ostream &os) const; + aabb3f wall_top; + aabb3f wall_bottom; + aabb3f wall_side; // being at the -X side + // NODEBOX_CONNECTED + std::vector connect_top; + std::vector connect_bottom; + std::vector connect_front; + std::vector connect_left; + std::vector connect_back; + std::vector connect_right; + + NodeBox() + { reset(); } + + void reset(); + void serialize(std::ostream &os, u16 protocol_version) const; void deSerialize(std::istream &is); }; struct MapNode; class NodeMetadata; -struct MaterialSpec -{ - std::string tname; - bool backface_culling; - - MaterialSpec(const std::string &tname_="", bool backface_culling_=true): - tname(tname_), - backface_culling(backface_culling_) - {} +enum LeavesStyle { + LEAVES_FANCY, + LEAVES_SIMPLE, + LEAVES_OPAQUE, +}; - void serialize(std::ostream &os) const; - void deSerialize(std::istream &is); +class TextureSettings { +public: + LeavesStyle leaves_style; + bool opaque_water; + bool connected_glass; + bool use_normal_texture; + bool enable_mesh_cache; + bool enable_minimap; + + TextureSettings() {} + + void readSettings(); }; enum NodeDrawType @@ -111,9 +150,42 @@ enum NodeDrawType NDT_PLANTLIKE, 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 +/* + Stand-alone definition of a TileSpec (basically a server-side TileSpec) +*/ + +struct TileDef +{ + std::string name; + bool backface_culling; // Takes effect only in special cases + bool tileable_horizontal; + bool tileable_vertical; + struct TileAnimationParams animation; + + TileDef() + { + name = ""; + backface_culling = true; + tileable_horizontal = true; + tileable_vertical = true; + animation.type = TAT_NONE; + } + + void serialize(std::ostream &os, u16 protocol_version) const; + void deSerialize(std::istream &is, const u8 contentfeatures_version, const NodeDrawType drawtype); +}; + +#define CF_SPECIAL_COUNT 6 struct ContentFeatures { @@ -122,40 +194,47 @@ 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]; - video::ITexture *inventory_texture; - // Special material/texture + // Special tiles // - Currently used for flowing liquids - video::SMaterial *special_materials[CF_SPECIAL_COUNT]; - AtlasPointer *special_aps[CF_SPECIAL_COUNT]; + TileSpec special_tiles[CF_SPECIAL_COUNT]; u8 solidness; // Used when choosing which face is drawn u8 visual_solidness; // When solidness=0, this tells how it looks like bool backface_culling; #endif - - // List of textures that are used and are wanted to be included in - // the texture atlas - std::set used_texturenames; - + + // Server-side cached callback existence for fast skipping + bool has_on_construct; + bool has_on_destruct; + bool has_after_destruct; + /* Actual data */ std::string name; // "" = undefined node + ItemGroupList groups; // Same as in itemdef // Visual definition enum NodeDrawType drawtype; + std::string mesh; +#ifndef SERVER + scene::IMesh *mesh_ptr[24]; + video::SColor minimap_color; +#endif float visual_scale; // Misc. scale parameter - std::string tname_tiles[6]; - std::string tname_inventory; - MaterialSpec mspec_special[CF_SPECIAL_COUNT]; // Use setter methods + TileDef tiledef[6]; + TileDef tiledef_special[CF_SPECIAL_COUNT]; // eg. flowing liquid u8 alpha; // Post effect color, drawn when the camera is inside the node. video::SColor post_effect_color; + // Type of MapNode::param1 ContentParamType param_type; + // Type of MapNode::param2 + ContentParamType2 param_type_2; // True for all ground-like things like stone and mud, false for eg. trees bool is_ground_content; bool light_propagates; @@ -171,25 +250,12 @@ struct ContentFeatures bool climbable; // Player can build on these bool buildable_to; - // If true, param2 is set to direction when placed. Used for torches. - // NOTE: the direction format is quite inefficient and should be changed - bool wall_mounted; - // If true, node is equivalent to air. Torches are, air is. Water is not. - // Is used for example to check whether a mud block can have grass on. - bool air_equivalent; - // Whether this content type often contains mineral. - // Used for texture atlas creation. - // Currently only enabled for CONTENT_STONE. - bool often_contains_mineral; - // Inventory item string as which the node appears in inventory when dug. - // Mineral overrides this. - std::string dug_item; - // Extra dug item and its rarity - std::string extra_dug_item; - // Usual get interval for extra dug item - s32 extra_dug_item_rarity; - // Metadata name of node (eg. "furnace") - std::string metadata_name; + // Liquids flow into and replace node + bool floodable; + // 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. @@ -200,39 +266,47 @@ struct ContentFeatures // 1 giving almost instantaneous propagation and 7 being // the slowest possible u8 liquid_viscosity; + // Is liquid renewable (new liquid source will be created between 2 existing) + bool liquid_renewable; + // 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; - MaterialProperties material; - std::string cookresult_item; - float furnace_cooktime; - float furnace_burntime; + 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; + // Set to true if wall_mounted used to be set to true + bool legacy_wallmounted; + // for NDT_CONNECTED pairing + u8 connect_sides; + + // Sound properties + SimpleSoundSpec sound_footstep; + SimpleSoundSpec sound_dig; + SimpleSoundSpec sound_dug; + + std::vector connects_to; + std::set connects_to_ids; /* Methods */ - + ContentFeatures(); ~ContentFeatures(); void reset(); - void serialize(std::ostream &os); - void deSerialize(std::istream &is, IGameDef *gamedef); + void serialize(std::ostream &os, u16 protocol_version) const; + void deSerialize(std::istream &is); + void serializeOld(std::ostream &os, u16 protocol_version) const; + void deSerializeOld(std::istream &is, int version); - /* - Texture setters. - - */ - - // Texture setters. They also add stuff to used_texturenames. - void setTexture(u16 i, std::string name); - void setAllTextures(std::string name); - void setSpecialMaterial(u16 i, const MaterialSpec &mspec); - - void setInventoryTexture(std::string imgname); - void setInventoryTextureCube(std::string top, - std::string left, std::string right); - /* Some handy methods */ @@ -243,57 +317,124 @@ struct ContentFeatures if(!isLiquid() || !f.isLiquid()) return false; return (liquid_alternative_flowing == f.liquid_alternative_flowing); } + +#ifndef SERVER + void fillTileAttribs(ITextureSource *tsrc, TileSpec *tile, TileDef *tiledef, + u32 shader_id, bool use_normal_texture, bool backface_culling, + u8 alpha, u8 material_type); + void updateTextures(ITextureSource *tsrc, IShaderSource *shdsrc, + scene::IMeshManipulator *meshmanip, Client *client, const TextureSettings &tsettings); +#endif }; -class INodeDefManager -{ +class INodeDefManager { public: INodeDefManager(){} virtual ~INodeDefManager(){} // Get node definition - virtual const ContentFeatures& get(content_t c) const=0; - virtual const ContentFeatures& get(const MapNode &n) const=0; + 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; virtual content_t getId(const std::string &name) const=0; - virtual const ContentFeatures& get(const std::string &name) const=0; - - virtual void serialize(std::ostream &os)=0; + // Allows "group:name" in addition to regular node names + // returns false if node name not found, true otherwise + virtual bool getIds(const std::string &name, std::set &result) + const=0; + virtual const ContentFeatures &get(const std::string &name) const=0; + + virtual void serialize(std::ostream &os, u16 protocol_version) const=0; + + virtual bool getNodeRegistrationStatus() const=0; + + virtual void pendNodeResolve(NodeResolver *nr)=0; + virtual bool cancelNodeResolveCallback(NodeResolver *nr)=0; + virtual bool nodeboxConnects(const MapNode from, const MapNode to, u8 connect_face)=0; + /*! + * Returns the smallest box in node coordinates that + * contains all nodes' selection boxes. + */ + virtual core::aabbox3d getSelectionBoxIntUnion() const=0; }; -class IWritableNodeDefManager : public INodeDefManager -{ +class IWritableNodeDefManager : public INodeDefManager { public: IWritableNodeDefManager(){} virtual ~IWritableNodeDefManager(){} virtual IWritableNodeDefManager* clone()=0; // Get node definition - virtual const ContentFeatures& get(content_t c) const=0; - virtual const ContentFeatures& get(const MapNode &n) const=0; + 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; - // If not found, returns the features of CONTENT_IGNORE - virtual const ContentFeatures& get(const std::string &name) const=0; - - // Register node definition - virtual void set(content_t c, const ContentFeatures &def)=0; + // Allows "group:name" in addition to regular node names + virtual bool getIds(const std::string &name, std::set &result) + const=0; + // If not found, returns the features of CONTENT_UNKNOWN + virtual const ContentFeatures &get(const std::string &name) const=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, const ContentFeatures &def)=0; // If returns CONTENT_IGNORE, could not allocate id virtual content_t allocateDummy(const std::string &name)=0; + // Remove a node + virtual void removeNode(const std::string &name)=0; + + /* + Update item alias mapping. + Call after updating item definitions. + */ + virtual void updateAliases(IItemDefManager *idef)=0; + + /* + Override textures from servers with ones specified in texturepack/override.txt + */ + virtual void applyTextureOverrides(const std::string &override_filepath)=0; /* 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, + void (*progress_cbk)(void *progress_args, u32 progress, u32 max_progress), + void *progress_cbk_args)=0; + + virtual void serialize(std::ostream &os, u16 protocol_version) const=0; + virtual void deSerialize(std::istream &is)=0; + + virtual bool getNodeRegistrationStatus() const=0; + virtual void setNodeRegistrationStatus(bool completed)=0; - virtual void serialize(std::ostream &os)=0; - virtual void deSerialize(std::istream &is, IGameDef *gamedef)=0; + virtual void pendNodeResolve(NodeResolver *nr)=0; + virtual bool cancelNodeResolveCallback(NodeResolver *nr)=0; + virtual void runNodeResolveCallbacks()=0; + virtual void resetNodeResolveState()=0; + virtual void mapNodeboxConnections()=0; + virtual core::aabbox3d getSelectionBoxIntUnion() const=0; }; -IWritableNodeDefManager* createNodeDefManager(); +IWritableNodeDefManager *createNodeDefManager(); -#endif +class NodeResolver { +public: + NodeResolver(); + virtual ~NodeResolver(); + virtual void resolveNodeNames() = 0; + + bool getIdFromNrBacklog(content_t *result_out, + const std::string &node_alt, content_t c_fallback); + bool getIdsFromNrBacklog(std::vector *result_out, + bool all_required=false, content_t c_fallback=CONTENT_IGNORE); + + void nodeResolveInternal(); + u32 m_nodenames_idx; + u32 m_nnlistsizes_idx; + std::vector m_nodenames; + std::vector m_nnlistsizes; + INodeDefManager *m_ndef; + bool m_resolve_done; +}; + +#endif