X-Git-Url: https://git.lizzy.rs/?a=blobdiff_plain;f=src%2Fnodedef.h;h=d846489aecd7f4bbdcb4386690373d8876aeeff7;hb=418c2e7a446f8f0aca9f8bd23005a5896869ef7e;hp=0430621e7da629e363a994f85d10e9cdf6a13a95;hpb=01ae0daea501f47ec56a8368e530cb4176fc44cd;p=dragonfireclient.git diff --git a/src/nodedef.h b/src/nodedef.h index 0430621e7..d846489ae 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,45 +20,42 @@ 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 "mapnode.h" #ifndef SERVER #include "tile.h" #endif -#include "materials.h" // MaterialProperties -class ITextureSource; - -/* - TODO: Rename to nodedef.h -*/ - -#if 0 - -/* - Content feature list - - Used for determining properties of MapNodes by content type without - storing such properties in the nodes itself. -*/ - -/* - Initialize content feature table. +#include "itemgroup.h" +#include "sound.h" // SimpleSoundSpec +#include "constants.h" // BS - Must be called before accessing the table. -*/ -void init_contentfeatures(ITextureSource *tsrc); +class IItemDefManager; +class ITextureSource; +class IGameDef; -#endif +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, }; enum LiquidType @@ -71,8 +68,8 @@ enum LiquidType 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) }; struct NodeBox @@ -80,67 +77,120 @@ 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) - {} + aabb3f wall_top; + aabb3f wall_bottom; + aabb3f wall_side; // being at the -X side + + NodeBox() + { reset(); } + + void reset(); + void serialize(std::ostream &os) const; + void deSerialize(std::istream &is); }; struct MapNode; class NodeMetadata; +/* + Stand-alone definition of a TileSpec (basically a server-side TileSpec) +*/ +enum TileAnimationType{ + TAT_NONE=0, + TAT_VERTICAL_FRAMES=1, +}; +struct TileDef +{ + std::string name; + bool backface_culling; // Takes effect only in special cases + struct{ + enum TileAnimationType type; + int aspect_w; // width for aspect ratio + int aspect_h; // height for aspect ratio + float length; // seconds + } animation; + + TileDef() + { + name = ""; + backface_culling = true; + animation.type = TAT_NONE; + animation.aspect_w = 1; + animation.aspect_h = 1; + animation.length = 1.0; + } + + void serialize(std::ostream &os, u16 protocol_version) const; + void deSerialize(std::istream &is); +}; + +enum NodeDrawType +{ + NDT_NORMAL, // A basic solid block + NDT_AIRLIKE, // Nothing is drawn + NDT_LIQUID, // Do not draw face towards same kind of flowing/source liquid + NDT_FLOWINGLIQUID, // A very special kind of thing + NDT_GLASSLIKE, // Glass-like, don't draw faces towards other glass + NDT_ALLFACES, // Leaves-like, draw all faces no matter what + NDT_ALLFACES_OPTIONAL, // Fancy -> allfaces, fast -> normal + NDT_TORCHLIKE, + NDT_SIGNLIKE, + NDT_PLANTLIKE, + NDT_FENCELIKE, + NDT_RAILLIKE, + NDT_NODEBOX, +}; + +#define CF_SPECIAL_COUNT 2 + struct ContentFeatures { -#ifndef SERVER /* - 0: up - 1: down - 2: right - 3: left - 4: back - 5: front + Cached stuff */ +#ifndef SERVER + // 0 1 2 3 4 5 + // up down right left back front TileSpec tiles[6]; - - video::ITexture *inventory_texture; + // Special tiles + // - Currently used for flowing liquids + 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 + + // 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; + float visual_scale; // Misc. scale parameter + TileDef tiledef[6]; + TileDef tiledef_special[CF_SPECIAL_COUNT]; // eg. flowing liquid + u8 alpha; - // Used currently for flowing liquids - u8 vertex_alpha; // Post effect color, drawn when the camera is inside the node. video::SColor post_effect_color; - // Special irrlicht material, used sometimes - video::SMaterial *special_material; - video::SMaterial *special_material2; - // Currently used for fetching liquid texture coordinates - // - This is also updated to the above two (if they are non-NULL) - // when textures are updated - AtlasPointer *special_atlas; -#endif - - // List of all block textures that have been used (value is dummy) - // Used for texture atlas making. - // Exists on server too for cleaner code in content_mapnode.cpp. - std::set used_texturenames; - // 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; bool sunlight_propagates; - u8 solidness; // Used when choosing which face is drawn - u8 visual_solidness; // When solidness=0, this tells how it looks like // This is used for collision detection. // Also for general solidness queries. bool walkable; @@ -152,141 +202,47 @@ 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; - s32 extra_dug_item_rarity; - - // Initial metadata is cloned from this - NodeMetadata *initial_metadata; - + // Player cannot build to these (placement prediction disabled) + bool rightclickable; // 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. - content_t liquid_alternative_flowing; + std::string liquid_alternative_flowing; // If the content is liquid, this is the source version of the liquid. - content_t liquid_alternative_source; + std::string liquid_alternative_source; // Viscosity for fluid flow, ranging from 1 to 7, with // 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; // Amount of light the node emits u8 light_source; - u32 damage_per_second; - + NodeBox node_box; NodeBox selection_box; + // 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; - MaterialProperties material; - - // NOTE: Move relevant properties to here from elsewhere - - void reset() - { -#ifndef SERVER - inventory_texture = NULL; - - vertex_alpha = 255; - post_effect_color = video::SColor(0, 0, 0, 0); - special_material = NULL; - special_material2 = NULL; - special_atlas = NULL; -#endif - used_texturenames.clear(); - param_type = CPT_NONE; - is_ground_content = false; - light_propagates = false; - sunlight_propagates = false; - solidness = 2; - visual_solidness = 0; - walkable = true; - pointable = true; - diggable = true; - climbable = false; - buildable_to = false; - wall_mounted = false; - air_equivalent = false; - often_contains_mineral = false; - dug_item = ""; - initial_metadata = NULL; - liquid_type = LIQUID_NONE; - liquid_alternative_flowing = CONTENT_IGNORE; - liquid_alternative_source = CONTENT_IGNORE; - liquid_viscosity = 0; - light_source = 0; - damage_per_second = 0; - selection_box = NodeBox(); - material = MaterialProperties(); - } - - ContentFeatures() - { - reset(); - } + // Sound properties + SimpleSoundSpec sound_footstep; + SimpleSoundSpec sound_dig; + SimpleSoundSpec sound_dug; - ~ContentFeatures(); - /* - Quickhands for simple materials + Methods */ -#ifdef SERVER - void setTexture(ITextureSource *tsrc, u16 i, std::string name, - u8 alpha=255) - {} - void setAllTextures(ITextureSource *tsrc, std::string name, u8 alpha=255) - {} -#else - void setTexture(ITextureSource *tsrc, - u16 i, std::string name, u8 alpha=255); - - void setAllTextures(ITextureSource *tsrc, - std::string name, u8 alpha=255) - { - for(u16 i=0; i<6; i++) - { - setTexture(tsrc, i, name, alpha); - } - // Force inventory texture too - setInventoryTexture(name, tsrc); - } -#endif - -#ifndef SERVER - void setTile(u16 i, const TileSpec &tile) - { tiles[i] = tile; } - void setAllTiles(const TileSpec &tile) - { for(u16 i=0; i<6; i++) setTile(i, tile); } -#endif - -#ifdef SERVER - void setInventoryTexture(std::string imgname, - ITextureSource *tsrc) - {} - void setInventoryTextureCube(std::string top, - std::string left, std::string right, ITextureSource *tsrc) - {} -#else - void setInventoryTexture(std::string imgname, ITextureSource *tsrc); - - void setInventoryTextureCube(std::string top, - std::string left, std::string right, ITextureSource *tsrc); -#endif + ContentFeatures(); + ~ContentFeatures(); + void reset(); + void serialize(std::ostream &os, u16 protocol_version); + void deSerialize(std::istream &is); + void serializeOld(std::ostream &os, u16 protocol_version); + void deSerializeOld(std::istream &is, int version); /* Some handy methods @@ -308,6 +264,14 @@ class INodeDefManager // Get node definition 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; + // Allows "group:name" in addition to regular node names + virtual void 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)=0; }; class IWritableNodeDefManager : public INodeDefManager @@ -319,21 +283,40 @@ class IWritableNodeDefManager : public INodeDefManager // Get node definition 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; + // Allows "group:name" in addition to regular node names + virtual void getIds(const std::string &name, std::set &result) + 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; - virtual ContentFeatures* getModifiable(content_t c)=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; + + /* + Update item alias mapping. + Call after updating item definitions. + */ + virtual void updateAliases(IItemDefManager *idef)=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; -}; -// If textures not actually available (server), tsrc can be NULL -IWritableNodeDefManager* createNodeDefManager(ITextureSource *tsrc); + virtual void serialize(std::ostream &os, u16 protocol_version)=0; + virtual void deSerialize(std::istream &is)=0; +}; +IWritableNodeDefManager* createNodeDefManager(); #endif