X-Git-Url: https://git.lizzy.rs/?a=blobdiff_plain;f=src%2Fmapnode.h;h=d975a50c46fb0bf83740b6075c652e56ff8adc39;hb=30c34cc23e9a060ef964854038a314a94ad5cbae;hp=f359ecbbb6769214a7037af7bf70ce8fd1d5d7ea;hpb=89aa8b9be1fbe3659d0bfb9263cf1c563044c04e;p=dragonfireclient.git diff --git a/src/mapnode.h b/src/mapnode.h index f359ecbbb..d975a50c4 100644 --- a/src/mapnode.h +++ b/src/mapnode.h @@ -27,7 +27,14 @@ with this program; if not, write to the Free Software Foundation, Inc., #include "exceptions.h" #include "serialization.h" #include "tile.h" -#include "iirrlichtwrapper.h" +#include "materials.h" + +/* + Naming scheme: + - Material = irrlicht's Material class + - Content = (u8) content of a node + - Tile = TileSpec at some side of a node of some content type +*/ /* Initializes all kind of stuff in here. @@ -43,13 +50,6 @@ with this program; if not, write to the Free Software Foundation, Inc., */ void init_mapnode(); -// Initializes g_content_inventory_texture_paths -void init_content_inventory_texture_paths(); - - -// NOTE: This is not used appropriately everywhere. -#define MATERIALS_COUNT 256 - /* Ignored node. @@ -68,39 +68,6 @@ void init_content_inventory_texture_paths(); */ #define CONTENT_AIR 254 -/* - Suggested materials: - - Gravel - - Sand - - New naming scheme: - - Material = irrlicht's Material class - - Content = (u8) content of a node - - Tile = (u16) Material ID at some side of a node -*/ - -#define CONTENT_STONE 0 -#define CONTENT_GRASS 1 -#define CONTENT_WATER 2 -#define CONTENT_TORCH 3 -#define CONTENT_TREE 4 -#define CONTENT_LEAVES 5 -#define CONTENT_GRASS_FOOTSTEPS 6 -#define CONTENT_MESE 7 -#define CONTENT_MUD 8 -#define CONTENT_WATERSOURCE 9 -// Pretty much useless, clouds won't be drawn this way -#define CONTENT_CLOUD 10 -#define CONTENT_COALSTONE 11 -#define CONTENT_WOOD 12 -#define CONTENT_SAND 13 -#define CONTENT_SIGN_WALL 14 -#define CONTENT_CHEST 15 -#define CONTENT_FURNACE 16 -//#define CONTENT_WORKBENCH 17 -#define CONTENT_COBBLE 18 -#define CONTENT_STEEL 19 - /* Content feature list */ @@ -148,14 +115,23 @@ struct ContentFeatures bool light_propagates; bool sunlight_propagates; u8 solidness; // Used when choosing which face is drawn + // This is used for collision detection. + // Also for general solidness queries. bool walkable; + // Player can point to these bool pointable; + // Player can dig these bool diggable; + // Player can build on these bool buildable_to; + // Whether the node has no liquid, source liquid or flowing liquid enum LiquidType liquid_type; - // If true, param2 is set to direction when placed + // 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; // Inventory item string as which the node appears in inventory when dug. // Mineral overrides this. @@ -163,10 +139,20 @@ struct ContentFeatures // Initial metadata is cloned from this NodeMetadata *initial_metadata; + + // If the content is liquid, this is the flowing version of the liquid. + // If content is liquid, this is the same content. + u8 liquid_alternative_flowing; + + // Amount of light the node emits + u8 light_source; + + // Digging properties for different tools + DiggingPropertiesList digging_properties; + + // NOTE: Move relevant properties to here from elsewhere - //TODO: Move more properties here - - ContentFeatures() + void reset() { translate_to = NULL; param_type = CPT_NONE; @@ -181,8 +167,17 @@ struct ContentFeatures buildable_to = false; liquid_type = LIQUID_NONE; wall_mounted = false; + air_equivalent = false; dug_item = ""; initial_metadata = NULL; + liquid_alternative_flowing = CONTENT_IGNORE; + light_source = 0; + digging_properties.clear(); + } + + ContentFeatures() + { + reset(); } ~ContentFeatures(); @@ -224,6 +219,11 @@ struct ContentFeatures */ ContentFeatures & content_features(u8 i); + +/* + Here is a bunch of DEPRECATED functions. +*/ + /* If true, the material allows light propagation and brightness is stored in param. @@ -232,9 +232,7 @@ ContentFeatures & content_features(u8 i); inline bool light_propagates_content(u8 m) { return content_features(m).light_propagates; - //return (m == CONTENT_AIR || m == CONTENT_TORCH || m == CONTENT_WATER || m == CONTENT_WATERSOURCE); } - /* If true, the material allows lossless sunlight propagation. NOTE: It doesn't seem to go through torches regardlessly of this @@ -243,9 +241,7 @@ inline bool light_propagates_content(u8 m) inline bool sunlight_propagates_content(u8 m) { return content_features(m).sunlight_propagates; - //return (m == CONTENT_AIR || m == CONTENT_TORCH); } - /* On a node-node surface, the material of the node with higher solidness is used for drawing. @@ -257,83 +253,54 @@ inline bool sunlight_propagates_content(u8 m) inline u8 content_solidness(u8 m) { return content_features(m).solidness; - /*// As of now, every pseudo node like torches are added to this - if(m == CONTENT_AIR || m == CONTENT_TORCH || m == CONTENT_WATER) - return 0; - if(m == CONTENT_WATER || m == CONTENT_WATERSOURCE) - return 1; - return 2;*/ } - // Objects collide with walkable contents // NOTE: Don't use, use "content_features(m).whatever" instead inline bool content_walkable(u8 m) { return content_features(m).walkable; - //return (m != CONTENT_AIR && m != CONTENT_WATER && m != CONTENT_WATERSOURCE && m != CONTENT_TORCH); } - // NOTE: Don't use, use "content_features(m).whatever" instead inline bool content_liquid(u8 m) { return content_features(m).liquid_type != LIQUID_NONE; - //return (m == CONTENT_WATER || m == CONTENT_WATERSOURCE); } - // NOTE: Don't use, use "content_features(m).whatever" instead inline bool content_flowing_liquid(u8 m) { return content_features(m).liquid_type == LIQUID_FLOWING; - //return (m == CONTENT_WATER); } - // NOTE: Don't use, use "content_features(m).whatever" instead inline bool content_liquid_source(u8 m) { return content_features(m).liquid_type == LIQUID_SOURCE; - //return (m == CONTENT_WATERSOURCE); } - // CONTENT_WATER || CONTENT_WATERSOURCE -> CONTENT_WATER // CONTENT_LAVA || CONTENT_LAVASOURCE -> CONTENT_LAVA +// NOTE: Don't use, use "content_features(m).whatever" instead inline u8 make_liquid_flowing(u8 m) { - if(m == CONTENT_WATER || m == CONTENT_WATERSOURCE) - return CONTENT_WATER; - assert(0); + u8 c = content_features(m).liquid_alternative_flowing; + assert(c != CONTENT_IGNORE); + return c; } - // Pointable contents can be pointed to in the map // NOTE: Don't use, use "content_features(m).whatever" instead inline bool content_pointable(u8 m) { return content_features(m).pointable; - //return (m != CONTENT_AIR && m != CONTENT_WATER && m != CONTENT_WATERSOURCE); } - // NOTE: Don't use, use "content_features(m).whatever" instead inline bool content_diggable(u8 m) { return content_features(m).diggable; - //return (m != CONTENT_AIR && m != CONTENT_WATER && m != CONTENT_WATERSOURCE); } - // NOTE: Don't use, use "content_features(m).whatever" instead inline bool content_buildable_to(u8 m) { return content_features(m).buildable_to; - //return (m == CONTENT_AIR || m == CONTENT_WATER || m == CONTENT_WATERSOURCE); } -/* - Returns true for contents that form the base ground that - follows the main heightmap -*/ -/*inline bool is_ground_content(u8 m) -{ - return content_features(m).is_ground_content; -}*/ - /* Nodes make a face if contents differ and solidness differs. Return value: @@ -482,31 +449,25 @@ struct MapNode && param == other.param && param2 == other.param2); } - + + /* + These four are DEPRECATED I guess. -c55 + */ bool light_propagates() { return light_propagates_content(d); } - bool sunlight_propagates() { return sunlight_propagates_content(d); } - u8 solidness() { return content_solidness(d); } - u8 light_source() { - /* - Note that a block that isn't light_propagates() can be a light source. - */ - if(d == CONTENT_TORCH) - return LIGHT_MAX; - - return 0; + return content_features(d).light_source; } u8 getLightBanksWithSource() @@ -514,7 +475,7 @@ struct MapNode // Select the brightest of [light source, propagated light] u8 lightday = 0; u8 lightnight = 0; - if(light_propagates()) + if(content_features(d).param_type == CPT_LIGHT) { lightday = param & 0x0f; lightnight = (param>>4)&0x0f; @@ -526,16 +487,11 @@ struct MapNode return (lightday&0x0f) | ((lightnight<<4)&0xf0); } - void setLightBanks(u8 a_light) - { - param = a_light; - } - u8 getLight(enum LightBank bank) { // Select the brightest of [light source, propagated light] u8 light = 0; - if(light_propagates()) + if(content_features(d).param_type == CPT_LIGHT) { if(bank == LIGHTBANK_DAY) light = param & 0x0f; @@ -577,8 +533,8 @@ struct MapNode void setLight(enum LightBank bank, u8 a_light) { - // If not transparent, can't set light - if(light_propagates() == false) + // If node doesn't contain light data, ignore this + if(content_features(d).param_type != CPT_LIGHT) return; if(bank == LIGHTBANK_DAY) { @@ -595,13 +551,25 @@ struct MapNode } // In mapnode.cpp + /* + Get tile of a face of the node. + dir: direction of face + Returns: TileSpec. Can contain miscellaneous texture coordinates, + which must be obeyed so that the texture atlas can be used. + */ TileSpec getTile(v3s16 dir); - + + /* + Gets mineral content of node, if there is any. + MINERAL_NONE if doesn't contain or isn't able to contain mineral. + */ u8 getMineral(); /* These serialization functions are used when informing client - of a single node add + of a single node add. + + NOTE: When loading a MapBlock, these are not used. Should they? */ static u32 serializedLength(u8 version) @@ -680,7 +648,24 @@ struct MapNode } }; +/* + Gets lighting value at face of node + + Parameters must consist of air and !air. + Order doesn't matter. + If either of the nodes doesn't exist, light is 0. + + parameters: + daynight_ratio: 0...1000 + n: getNodeParent(p) + n2: getNodeParent(p + face_dir) + face_dir: axis oriented unit vector from p to p2 + + returns encoded light value. +*/ +u8 getFaceLight(u32 daynight_ratio, MapNode n, MapNode n2, + v3s16 face_dir); #endif