diff options
author | Perttu Ahola <celeron55@gmail.com> | 2011-06-17 22:20:15 +0300 |
---|---|---|
committer | Perttu Ahola <celeron55@gmail.com> | 2011-06-17 22:20:15 +0300 |
commit | dc5319b6c9f2e39d93f2fa881403f36fc47ffaac (patch) | |
tree | b59d8ef9888d4e4fb75be9a6ad178bc0e9632814 | |
parent | d6b54514bfddac3a2b3fe2a1729b822a79a2e99a (diff) | |
download | minetest-dc5319b6c9f2e39d93f2fa881403f36fc47ffaac.tar.gz minetest-dc5319b6c9f2e39d93f2fa881403f36fc47ffaac.tar.bz2 minetest-dc5319b6c9f2e39d93f2fa881403f36fc47ffaac.zip |
Moved some mapnode content stuff from mapnode.{h,cpp} and digging property stuff from material.cpp to content_mapnode.{h,cpp}
-rw-r--r-- | src/CMakeLists.txt | 1 | ||||
-rw-r--r-- | src/content_mapnode.cpp | 351 | ||||
-rw-r--r-- | src/content_mapnode.h | 53 | ||||
-rw-r--r-- | src/environment.cpp | 1 | ||||
-rw-r--r-- | src/game.cpp | 3 | ||||
-rw-r--r-- | src/inventory.cpp | 1 | ||||
-rw-r--r-- | src/main.cpp | 9 | ||||
-rw-r--r-- | src/map.cpp | 1 | ||||
-rw-r--r-- | src/mapblock.cpp | 3 | ||||
-rw-r--r-- | src/mapnode.cpp | 257 | ||||
-rw-r--r-- | src/mapnode.h | 157 | ||||
-rw-r--r-- | src/materials.cpp | 106 | ||||
-rw-r--r-- | src/materials.h | 24 | ||||
-rw-r--r-- | src/nodemetadata.cpp | 1 | ||||
-rw-r--r-- | src/server.cpp | 1 | ||||
-rw-r--r-- | src/servermain.cpp | 2 | ||||
-rw-r--r-- | src/test.cpp | 1 | ||||
-rw-r--r-- | src/voxel.cpp | 5 |
18 files changed, 514 insertions, 463 deletions
diff --git a/src/CMakeLists.txt b/src/CMakeLists.txt index 558c28027..05b56310f 100644 --- a/src/CMakeLists.txt +++ b/src/CMakeLists.txt @@ -50,6 +50,7 @@ configure_file( ) set(common_SRCS + content_mapnode.cpp auth.cpp collision.cpp nodemetadata.cpp diff --git a/src/content_mapnode.cpp b/src/content_mapnode.cpp new file mode 100644 index 000000000..1f1c8e30a --- /dev/null +++ b/src/content_mapnode.cpp @@ -0,0 +1,351 @@ +/* +Minetest-c55 +Copyright (C) 2010-2011 celeron55, Perttu Ahola <celeron55@gmail.com> + +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 +(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. + +You should have received a copy of the GNU 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. +*/ + +// For g_settings +#include "main.h" + +#include "content_mapnode.h" +#include "mapnode.h" +#include "nodemetadata.h" + +// TODO: Get rid of these and set up some attributes like toughness, +// fluffyness, and a funciton to calculate time and durability loss +// (and sound? and whatever else) from them +void setStoneLikeDiggingProperties(DiggingPropertiesList &list, float toughness); +void setDirtLikeDiggingProperties(DiggingPropertiesList &list, float toughness); +void setWoodLikeDiggingProperties(DiggingPropertiesList &list, float toughness); + +void content_mapnode_init() +{ + // Read some settings + bool new_style_water = g_settings.getBool("new_style_water"); + bool new_style_leaves = g_settings.getBool("new_style_leaves"); + + u8 i; + ContentFeatures *f = NULL; + + i = CONTENT_STONE; + f = &content_features(i); + f->setAllTextures("stone.png"); + f->setInventoryTextureCube("stone.png", "stone.png", "stone.png"); + f->param_type = CPT_MINERAL; + f->is_ground_content = true; + f->dug_item = std::string("MaterialItem ")+itos(CONTENT_COBBLE)+" 1"; + setStoneLikeDiggingProperties(f->digging_properties, 1.0); + + i = CONTENT_GRASS; + f = &content_features(i); + f->setAllTextures("mud.png^grass_side.png"); + f->setTexture(0, "grass.png"); + f->setTexture(1, "mud.png"); + f->param_type = CPT_MINERAL; + f->is_ground_content = true; + f->dug_item = std::string("MaterialItem ")+itos(CONTENT_MUD)+" 1"; + setDirtLikeDiggingProperties(f->digging_properties, 1.0); + + i = CONTENT_GRASS_FOOTSTEPS; + f = &content_features(i); + f->setAllTextures("mud.png^grass_side.png"); + f->setTexture(0, "grass_footsteps.png"); + f->setTexture(1, "mud.png"); + f->param_type = CPT_MINERAL; + f->is_ground_content = true; + f->dug_item = std::string("MaterialItem ")+itos(CONTENT_MUD)+" 1"; + setDirtLikeDiggingProperties(f->digging_properties, 1.0); + + i = CONTENT_MUD; + f = &content_features(i); + f->setAllTextures("mud.png"); + f->setInventoryTextureCube("mud.png", "mud.png", "mud.png"); + f->param_type = CPT_MINERAL; + f->is_ground_content = true; + f->dug_item = std::string("MaterialItem ")+itos(i)+" 1"; + setDirtLikeDiggingProperties(f->digging_properties, 1.0); + + i = CONTENT_SAND; + f = &content_features(i); + f->setAllTextures("sand.png"); + f->param_type = CPT_MINERAL; + f->is_ground_content = true; + f->dug_item = std::string("MaterialItem ")+itos(i)+" 1"; + setDirtLikeDiggingProperties(f->digging_properties, 1.0); + + i = CONTENT_TREE; + f = &content_features(i); + f->setAllTextures("tree.png"); + f->setTexture(0, "tree_top.png"); + f->setTexture(1, "tree_top.png"); + f->param_type = CPT_MINERAL; + f->is_ground_content = true; + f->dug_item = std::string("MaterialItem ")+itos(i)+" 1"; + setWoodLikeDiggingProperties(f->digging_properties, 1.0); + + i = CONTENT_LEAVES; + f = &content_features(i); + f->light_propagates = true; + //f->param_type = CPT_MINERAL; + f->param_type = CPT_LIGHT; + f->is_ground_content = true; + if(new_style_leaves) + { + f->solidness = 0; // drawn separately, makes no faces + f->setInventoryTextureCube("leaves.png", "leaves.png", "leaves.png"); + } + else + { + f->setAllTextures("[noalpha:leaves.png"); + } + f->dug_item = std::string("MaterialItem ")+itos(i)+" 1"; + setWoodLikeDiggingProperties(f->digging_properties, 0.15); + + i = CONTENT_GLASS; + f = &content_features(i); + f->light_propagates = true; + f->param_type = CPT_LIGHT; + f->is_ground_content = true; + f->dug_item = std::string("MaterialItem ")+itos(i)+" 1"; + f->solidness = 0; // drawn separately, makes no faces + f->setInventoryTextureCube("glass.png", "glass.png", "glass.png"); + setWoodLikeDiggingProperties(f->digging_properties, 0.15); + + i = CONTENT_FENCE; + f = &content_features(i); + f->light_propagates = true; + f->param_type = CPT_LIGHT; + f->is_ground_content = true; + f->dug_item = std::string("MaterialItem ")+itos(i)+" 1"; + f->solidness = 0; // drawn separately, makes no faces + f->air_equivalent = true; // grass grows underneath + f->setInventoryTexture("item_fence.png"); + setWoodLikeDiggingProperties(f->digging_properties, 0.75); + + // Deprecated + i = CONTENT_COALSTONE; + f = &content_features(i); + //f->translate_to = new MapNode(CONTENT_STONE, MINERAL_COAL); + f->setAllTextures("stone.png^mineral_coal.png"); + f->is_ground_content = true; + setStoneLikeDiggingProperties(f->digging_properties, 1.5); + + i = CONTENT_WOOD; + f = &content_features(i); + f->setAllTextures("wood.png"); + f->is_ground_content = true; + f->dug_item = std::string("MaterialItem ")+itos(i)+" 1"; + setWoodLikeDiggingProperties(f->digging_properties, 0.75); + + i = CONTENT_MESE; + f = &content_features(i); + f->setAllTextures("mese.png"); + f->is_ground_content = true; + f->dug_item = std::string("MaterialItem ")+itos(i)+" 1"; + setStoneLikeDiggingProperties(f->digging_properties, 0.5); + + i = CONTENT_CLOUD; + f = &content_features(i); + f->setAllTextures("cloud.png"); + f->is_ground_content = true; + f->dug_item = std::string("MaterialItem ")+itos(i)+" 1"; + + i = CONTENT_AIR; + f = &content_features(i); + f->param_type = CPT_LIGHT; + f->light_propagates = true; + f->sunlight_propagates = true; + f->solidness = 0; + f->walkable = false; + f->pointable = false; + f->diggable = false; + f->buildable_to = true; + f->air_equivalent = true; + + i = CONTENT_WATER; + f = &content_features(i); + f->setInventoryTextureCube("water.png", "water.png", "water.png"); + f->param_type = CPT_LIGHT; + f->light_propagates = true; + f->solidness = 0; // Drawn separately, makes no faces + f->walkable = false; + f->pointable = false; + f->diggable = false; + f->buildable_to = true; + f->liquid_type = LIQUID_FLOWING; + f->liquid_alternative_flowing = CONTENT_WATER; + + i = CONTENT_WATERSOURCE; + f = &content_features(i); + f->setInventoryTexture("water.png"); + if(new_style_water) + { + f->solidness = 0; // drawn separately, makes no faces + } + else // old style + { + f->solidness = 1; + + TileSpec t; + if(g_texturesource) + t.texture = g_texturesource->getTexture("water.png"); + + t.alpha = WATER_ALPHA; + t.material_type = MATERIAL_ALPHA_VERTEX; + t.material_flags &= ~MATERIAL_FLAG_BACKFACE_CULLING; + f->setAllTiles(t); + } + f->param_type = CPT_LIGHT; + f->light_propagates = true; + f->walkable = false; + f->pointable = false; + f->diggable = false; + f->buildable_to = true; + f->liquid_type = LIQUID_SOURCE; + f->dug_item = std::string("MaterialItem ")+itos(i)+" 1"; + f->liquid_alternative_flowing = CONTENT_WATER; + + i = CONTENT_TORCH; + f = &content_features(i); + f->setInventoryTexture("torch_on_floor.png"); + f->param_type = CPT_LIGHT; + f->light_propagates = true; + f->sunlight_propagates = true; + f->solidness = 0; // drawn separately, makes no faces + f->walkable = false; + f->wall_mounted = true; + f->air_equivalent = true; + f->dug_item = std::string("MaterialItem ")+itos(i)+" 1"; + f->light_source = LIGHT_MAX; + f->digging_properties.set("", DiggingProperties(true, 0.0, 0)); + + i = CONTENT_SIGN_WALL; + f = &content_features(i); + f->setInventoryTexture("sign_wall.png"); + f->param_type = CPT_LIGHT; + f->light_propagates = true; + f->sunlight_propagates = true; + f->solidness = 0; // drawn separately, makes no faces + f->walkable = false; + f->wall_mounted = true; + f->air_equivalent = true; + f->dug_item = std::string("MaterialItem ")+itos(i)+" 1"; + if(f->initial_metadata == NULL) + f->initial_metadata = new SignNodeMetadata("Some sign"); + f->digging_properties.set("", DiggingProperties(true, 0.5, 0)); + + i = CONTENT_CHEST; + f = &content_features(i); + f->param_type = CPT_FACEDIR_SIMPLE; + f->setAllTextures("chest_side.png"); + f->setTexture(0, "chest_top.png"); + f->setTexture(1, "chest_top.png"); + f->setTexture(5, "chest_front.png"); // Z- + f->setInventoryTexture("chest_top.png"); + //f->setInventoryTextureCube("chest_top.png", "chest_side.png", "chest_side.png"); + f->dug_item = std::string("MaterialItem ")+itos(i)+" 1"; + if(f->initial_metadata == NULL) + f->initial_metadata = new ChestNodeMetadata(); + setWoodLikeDiggingProperties(f->digging_properties, 1.0); + + i = CONTENT_FURNACE; + f = &content_features(i); + f->param_type = CPT_FACEDIR_SIMPLE; + f->setAllTextures("furnace_side.png"); + f->setTexture(5, "furnace_front.png"); // Z- + f->setInventoryTexture("furnace_front.png"); + //f->dug_item = std::string("MaterialItem ")+itos(i)+" 1"; + f->dug_item = std::string("MaterialItem ")+itos(CONTENT_COBBLE)+" 6"; + if(f->initial_metadata == NULL) + f->initial_metadata = new FurnaceNodeMetadata(); + setStoneLikeDiggingProperties(f->digging_properties, 3.0); + + i = CONTENT_COBBLE; + f = &content_features(i); + f->setAllTextures("cobble.png"); + f->setInventoryTextureCube("cobble.png", "cobble.png", "cobble.png"); + f->param_type = CPT_NONE; + f->is_ground_content = true; + f->dug_item = std::string("MaterialItem ")+itos(i)+" 1"; + setStoneLikeDiggingProperties(f->digging_properties, 1.0); + + i = CONTENT_STEEL; + f = &content_features(i); + f->setAllTextures("steel_block.png"); + f->setInventoryTextureCube("steel_block.png", "steel_block.png", + "steel_block.png"); + f->param_type = CPT_NONE; + f->is_ground_content = true; + f->dug_item = std::string("MaterialItem ")+itos(i)+" 1"; + setStoneLikeDiggingProperties(f->digging_properties, 5.0); + + // NOTE: Remember to add frequently used stuff to the texture atlas in tile.cpp + + + /* + Add MesePick to everything + */ + for(u16 i=0; i<256; i++) + { + content_features(i).digging_properties.set("MesePick", + DiggingProperties(true, 0.0, 65535./1337)); + } + +} + +void setStoneLikeDiggingProperties(DiggingPropertiesList &list, float toughness) +{ + list.set("", + DiggingProperties(true, 15.0*toughness, 0)); + + list.set("WPick", + DiggingProperties(true, 1.3*toughness, 65535./30.*toughness)); + list.set("STPick", + DiggingProperties(true, 0.75*toughness, 65535./100.*toughness)); + list.set("SteelPick", + DiggingProperties(true, 0.50*toughness, 65535./333.*toughness)); + + /*list.set("MesePick", + DiggingProperties(true, 0.0*toughness, 65535./20.*toughness));*/ +} + +void setDirtLikeDiggingProperties(DiggingPropertiesList &list, float toughness) +{ + list.set("", + DiggingProperties(true, 0.75*toughness, 0)); + + list.set("WShovel", + DiggingProperties(true, 0.4*toughness, 65535./50.*toughness)); + list.set("STShovel", + DiggingProperties(true, 0.2*toughness, 65535./150.*toughness)); + list.set("SteelShovel", + DiggingProperties(true, 0.15*toughness, 65535./400.*toughness)); +} + +void setWoodLikeDiggingProperties(DiggingPropertiesList &list, float toughness) +{ + list.set("", + DiggingProperties(true, 3.0*toughness, 0)); + + list.set("WAxe", + DiggingProperties(true, 1.5*toughness, 65535./30.*toughness)); + list.set("STAxe", + DiggingProperties(true, 0.75*toughness, 65535./100.*toughness)); + list.set("SteelAxe", + DiggingProperties(true, 0.5*toughness, 65535./333.*toughness)); +} + + diff --git a/src/content_mapnode.h b/src/content_mapnode.h new file mode 100644 index 000000000..c511834e5 --- /dev/null +++ b/src/content_mapnode.h @@ -0,0 +1,53 @@ +/* +Minetest-c55 +Copyright (C) 2010-2011 celeron55, Perttu Ahola <celeron55@gmail.com> + +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 +(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. + +You should have received a copy of the GNU 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. +*/ + +#ifndef CONTENT_MAPNODE_HEADER +#define CONTENT_MAPNODE_HEADER + +void content_mapnode_init(); + +/* + Node content type IDs +*/ +#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 +#define CONTENT_GLASS 20 +#define CONTENT_FENCE 21 + +#endif + diff --git a/src/environment.cpp b/src/environment.cpp index 798228802..8f8628305 100644 --- a/src/environment.cpp +++ b/src/environment.cpp @@ -21,6 +21,7 @@ with this program; if not, write to the Free Software Foundation, Inc., #include "filesys.h" #include "porting.h" #include "collision.h" +#include "content_mapnode.h" Environment::Environment(): diff --git a/src/game.cpp b/src/game.cpp index ef574c348..eef27c805 100644 --- a/src/game.cpp +++ b/src/game.cpp @@ -32,6 +32,9 @@ with this program; if not, write to the Free Software Foundation, Inc., #include "keycode.h" #include "farmesh.h" +// TODO: Move content-aware stuff to separate file +#include "content_mapnode.h" + /* Setting this to 1 enables a special camera mode that forces the renderers to think that the camera statically points from diff --git a/src/inventory.cpp b/src/inventory.cpp index 47a8d4de9..88453530e 100644 --- a/src/inventory.cpp +++ b/src/inventory.cpp @@ -28,6 +28,7 @@ with this program; if not, write to the Free Software Foundation, Inc., #include <sstream> #include "main.h" #include "serverobject.h" +#include "content_mapnode.h" /* InventoryItem diff --git a/src/main.cpp b/src/main.cpp index bb34a1a97..ed3b322a4 100644 --- a/src/main.cpp +++ b/src/main.cpp @@ -228,6 +228,12 @@ TODO: Map saving should be done by EmergeThread SUGG: Map unloading based on sector reference is not very good, it keeps
unnecessary stuff in memory. I guess. Investigate this.
+TODO: FIXME: Make furnaces handle long step() times better; now a 10-day
+ dtime for a bunch of furnaces will take ages
+
+TODO: When block is placed and it has param_type==CPT_FACEDIR_SIMPLE, set
+ the direction accordingly.
+
Environment:
------------
@@ -1143,7 +1149,7 @@ int main(int argc, char *argv[]) fs::CreateDir(porting::path_userdata);
// Init material properties table
- initializeMaterialProperties();
+ //initializeMaterialProperties();
// Debug handler
BEGIN_DEBUG_EXCEPTION_HANDLER
@@ -1414,7 +1420,6 @@ int main(int argc, char *argv[]) Preload some textures and stuff
*/
- init_content_inventory_texture_paths();
init_mapnode(); // Second call with g_texturesource set
init_mineral();
diff --git a/src/map.cpp b/src/map.cpp index 9230d1c16..515885d87 100644 --- a/src/map.cpp +++ b/src/map.cpp @@ -28,6 +28,7 @@ with this program; if not, write to the Free Software Foundation, Inc., #include "mineral.h" #include "noise.h" #include "serverobject.h" +#include "content_mapnode.h" /* Map diff --git a/src/mapblock.cpp b/src/mapblock.cpp index 1ebdd6b0d..70006a718 100644 --- a/src/mapblock.cpp +++ b/src/mapblock.cpp @@ -24,6 +24,9 @@ with this program; if not, write to the Free Software Foundation, Inc., #include "light.h" #include <sstream> +// TODO: Move content-aware mesh generation to a separate file +#include "content_mapnode.h" + #ifndef SERVER void MeshMakeData::fill(u32 daynight_ratio, MapBlock *block) { diff --git a/src/mapnode.cpp b/src/mapnode.cpp index 9a8a09a15..3717bf0ab 100644 --- a/src/mapnode.cpp +++ b/src/mapnode.cpp @@ -25,6 +25,7 @@ with this program; if not, write to the Free Software Foundation, Inc., #include "mineral.h" // For g_settings #include "main.h" +#include "content_mapnode.h" #include "nodemetadata.h" ContentFeatures::~ContentFeatures() @@ -107,9 +108,9 @@ void init_mapnode() "g_texturesource!=NULL"<<std::endl; } - // Read some settings + /*// Read some settings bool new_style_water = g_settings.getBool("new_style_water"); - bool new_style_leaves = g_settings.getBool("new_style_leaves"); + bool new_style_leaves = g_settings.getBool("new_style_leaves");*/ /* Initialize content feature table @@ -131,247 +132,17 @@ void init_mapnode() { ContentFeatures *f = &g_content_features[i]; // Re-initialize - *f = ContentFeatures(); + f->reset(); for(u16 j=0; j<6; j++) f->tiles[j].material_type = initial_material_type; } - - u8 i; - ContentFeatures *f = NULL; - - i = CONTENT_STONE; - f = &g_content_features[i]; - f->setAllTextures("stone.png"); - f->setInventoryTextureCube("stone.png", "stone.png", "stone.png"); - f->param_type = CPT_MINERAL; - f->is_ground_content = true; - f->dug_item = std::string("MaterialItem ")+itos(CONTENT_COBBLE)+" 1"; - - i = CONTENT_GRASS; - f = &g_content_features[i]; - f->setAllTextures("mud.png^grass_side.png"); - f->setTexture(0, "grass.png"); - f->setTexture(1, "mud.png"); - f->param_type = CPT_MINERAL; - f->is_ground_content = true; - f->dug_item = std::string("MaterialItem ")+itos(CONTENT_MUD)+" 1"; - - i = CONTENT_GRASS_FOOTSTEPS; - f = &g_content_features[i]; - f->setAllTextures("mud.png^grass_side.png"); - f->setTexture(0, "grass_footsteps.png"); - f->setTexture(1, "mud.png"); - f->param_type = CPT_MINERAL; - f->is_ground_content = true; - f->dug_item = std::string("MaterialItem ")+itos(CONTENT_MUD)+" 1"; - - i = CONTENT_MUD; - f = &g_content_features[i]; - f->setAllTextures("mud.png"); - f->setInventoryTextureCube("mud.png", "mud.png", "mud.png"); - f->param_type = CPT_MINERAL; - f->is_ground_content = true; - f->dug_item = std::string("MaterialItem ")+itos(i)+" 1"; - - i = CONTENT_SAND; - f = &g_content_features[i]; - f->setAllTextures("sand.png"); - f->param_type = CPT_MINERAL; - f->is_ground_content = true; - f->dug_item = std::string("MaterialItem ")+itos(i)+" 1"; - - i = CONTENT_TREE; - f = &g_content_features[i]; - f->setAllTextures("tree.png"); - f->setTexture(0, "tree_top.png"); - f->setTexture(1, "tree_top.png"); - f->param_type = CPT_MINERAL; - f->is_ground_content = true; - f->dug_item = std::string("MaterialItem ")+itos(i)+" 1"; - - i = CONTENT_LEAVES; - f = &g_content_features[i]; - f->light_propagates = true; - //f->param_type = CPT_MINERAL; - f->param_type = CPT_LIGHT; - f->is_ground_content = true; - if(new_style_leaves) - { - f->solidness = 0; // drawn separately, makes no faces - f->setInventoryTextureCube("leaves.png", "leaves.png", "leaves.png"); - } - else - { - f->setAllTextures("[noalpha:leaves.png"); - } - f->dug_item = std::string("MaterialItem ")+itos(i)+" 1"; - - i = CONTENT_GLASS; - f = &g_content_features[i]; - f->light_propagates = true; - f->param_type = CPT_LIGHT; - f->is_ground_content = true; - f->dug_item = std::string("MaterialItem ")+itos(i)+" 1"; - f->solidness = 0; // drawn separately, makes no faces - f->setInventoryTextureCube("glass.png", "glass.png", "glass.png"); - - i = CONTENT_FENCE; - f = &g_content_features[i]; - f->light_propagates = true; - f->param_type = CPT_LIGHT; - f->is_ground_content = true; - f->dug_item = std::string("MaterialItem ")+itos(i)+" 1"; - f->solidness = 0; // drawn separately, makes no faces - f->air_equivalent = true; // grass grows underneath - f->setInventoryTexture("item_fence.png"); - - // Deprecated - i = CONTENT_COALSTONE; - f = &g_content_features[i]; - //f->translate_to = new MapNode(CONTENT_STONE, MINERAL_COAL); - f->setAllTextures("stone.png^mineral_coal.png"); - f->is_ground_content = true; - - i = CONTENT_WOOD; - f = &g_content_features[i]; - f->setAllTextures("wood.png"); - f->is_ground_content = true; - f->dug_item = std::string("MaterialItem ")+itos(i)+" 1"; - - i = CONTENT_MESE; - f = &g_content_features[i]; - f->setAllTextures("mese.png"); - f->is_ground_content = true; - f->dug_item = std::string("MaterialItem ")+itos(i)+" 1"; - - i = CONTENT_CLOUD; - f = &g_content_features[i]; - f->setAllTextures("cloud.png"); - f->is_ground_content = true; - f->dug_item = std::string("MaterialItem ")+itos(i)+" 1"; - - i = CONTENT_AIR; - f = &g_content_features[i]; - f->param_type = CPT_LIGHT; - f->light_propagates = true; - f->sunlight_propagates = true; - f->solidness = 0; - f->walkable = false; - f->pointable = false; - f->diggable = false; - f->buildable_to = true; - f->air_equivalent = true; - - i = CONTENT_WATER; - f = &g_content_features[i]; - f->setInventoryTextureCube("water.png", "water.png", "water.png"); - f->param_type = CPT_LIGHT; - f->light_propagates = true; - f->solidness = 0; // Drawn separately, makes no faces - f->walkable = false; - f->pointable = false; - f->diggable = false; - f->buildable_to = true; - f->liquid_type = LIQUID_FLOWING; - - i = CONTENT_WATERSOURCE; - f = &g_content_features[i]; - f->setInventoryTexture("water.png"); - if(new_style_water) - { - f->solidness = 0; // drawn separately, makes no faces - } - else // old style - { - f->solidness = 1; - TileSpec t; - if(g_texturesource) - t.texture = g_texturesource->getTexture("water.png"); - - t.alpha = WATER_ALPHA; - t.material_type = MATERIAL_ALPHA_VERTEX; - t.material_flags &= ~MATERIAL_FLAG_BACKFACE_CULLING; - f->setAllTiles(t); - } - f->param_type = CPT_LIGHT; - f->light_propagates = true; - f->walkable = false; - f->pointable = false; - f->diggable = false; - f->buildable_to = true; - f->liquid_type = LIQUID_SOURCE; - f->dug_item = std::string("MaterialItem ")+itos(i)+" 1"; - - i = CONTENT_TORCH; - f = &g_content_features[i]; - f->setInventoryTexture("torch_on_floor.png"); - f->param_type = CPT_LIGHT; - f->light_propagates = true; - f->sunlight_propagates = true; - f->solidness = 0; // drawn separately, makes no faces - f->walkable = false; - f->wall_mounted = true; - f->air_equivalent = true; - f->dug_item = std::string("MaterialItem ")+itos(i)+" 1"; - - i = CONTENT_SIGN_WALL; - f = &g_content_features[i]; - f->setInventoryTexture("sign_wall.png"); - f->param_type = CPT_LIGHT; - f->light_propagates = true; - f->sunlight_propagates = true; - f->solidness = 0; // drawn separately, makes no faces - f->walkable = false; - f->wall_mounted = true; - f->air_equivalent = true; - f->dug_item = std::string("MaterialItem ")+itos(i)+" 1"; - if(f->initial_metadata == NULL) - f->initial_metadata = new SignNodeMetadata("Some sign"); - - i = CONTENT_CHEST; - f = &g_content_features[i]; - f->param_type = CPT_FACEDIR_SIMPLE; - f->setAllTextures("chest_side.png"); - f->setTexture(0, "chest_top.png"); - f->setTexture(1, "chest_top.png"); - f->setTexture(5, "chest_front.png"); // Z- - f->setInventoryTexture("chest_top.png"); - //f->setInventoryTextureCube("chest_top.png", "chest_side.png", "chest_side.png"); - f->dug_item = std::string("MaterialItem ")+itos(i)+" 1"; - if(f->initial_metadata == NULL) - f->initial_metadata = new ChestNodeMetadata(); - - i = CONTENT_FURNACE; - f = &g_content_features[i]; - f->param_type = CPT_FACEDIR_SIMPLE; - f->setAllTextures("furnace_side.png"); - f->setTexture(5, "furnace_front.png"); // Z- - f->setInventoryTexture("furnace_front.png"); - //f->dug_item = std::string("MaterialItem ")+itos(i)+" 1"; - f->dug_item = std::string("MaterialItem ")+itos(CONTENT_COBBLE)+" 6"; - if(f->initial_metadata == NULL) - f->initial_metadata = new FurnaceNodeMetadata(); - - i = CONTENT_COBBLE; - f = &g_content_features[i]; - f->setAllTextures("cobble.png"); - f->setInventoryTextureCube("cobble.png", "cobble.png", "cobble.png"); - f->param_type = CPT_NONE; - f->is_ground_content = true; - f->dug_item = std::string("MaterialItem ")+itos(i)+" 1"; - - i = CONTENT_STEEL; - f = &g_content_features[i]; - f->setAllTextures("steel_block.png"); - f->setInventoryTextureCube("steel_block.png", "steel_block.png", - "steel_block.png"); - f->param_type = CPT_NONE; - f->is_ground_content = true; - f->dug_item = std::string("MaterialItem ")+itos(i)+" 1"; + /* + Initialize mapnode content + */ + content_mapnode_init(); - // NOTE: Remember to add frequently used stuff to the texture atlas in tile.cpp } v3s16 facedir_rotate(u8 facedir, v3s16 dir) @@ -459,16 +230,4 @@ u8 MapNode::getMineral() return MINERAL_NONE; } -// Pointers to c_str()s g_content_features[i].inventory_image_path -//const char * g_content_inventory_texture_paths[USEFUL_CONTENT_COUNT] = {0}; - -void init_content_inventory_texture_paths() -{ - dstream<<"DEPRECATED "<<__FUNCTION_NAME<<std::endl; - /*for(u16 i=0; i<USEFUL_CONTENT_COUNT; i++) - { - g_content_inventory_texture_paths[i] = - g_content_features[i].inventory_image_path.c_str(); - }*/ -} diff --git a/src/mapnode.h b/src/mapnode.h index 57382aa2b..aa3fa3960 100644 --- a/src/mapnode.h +++ b/src/mapnode.h @@ -27,6 +27,14 @@ with this program; if not, write to the Free Software Foundation, Inc., #include "exceptions.h" #include "serialization.h" #include "tile.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. @@ -42,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,41 +69,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 -#define CONTENT_GLASS 20 -#define CONTENT_FENCE 21 - -/* Content feature list */ @@ -173,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; @@ -194,6 +170,14 @@ struct ContentFeatures air_equivalent = false; dug_item = ""; initial_metadata = NULL; + liquid_alternative_flowing = CONTENT_IGNORE; + light_source = 0; + digging_properties.clear(); + } + + ContentFeatures() + { + reset(); } ~ContentFeatures(); @@ -235,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. @@ -243,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 @@ -254,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. @@ -268,84 +253,55 @@ 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: 0: No face @@ -493,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() @@ -537,11 +487,6 @@ 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] @@ -606,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) diff --git a/src/materials.cpp b/src/materials.cpp index 841f1d655..e3a24b9e3 100644 --- a/src/materials.cpp +++ b/src/materials.cpp @@ -1,112 +1,20 @@ #include "materials.h" +#include "mapnode.h" -#define MATERIAL_PROPERTIES_COUNT 256 +// NOTE: DEPRECATED -// These correspond to the CONTENT_* constants -MaterialProperties g_material_properties[MATERIAL_PROPERTIES_COUNT]; - -bool g_material_properties_initialized = false; - -void setStoneLikeDiggingProperties(u8 material, float toughness) -{ - g_material_properties[material].setDiggingProperties("", - DiggingProperties(true, 15.0*toughness, 0)); - - g_material_properties[material].setDiggingProperties("WPick", - DiggingProperties(true, 1.3*toughness, 65535./30.*toughness)); - g_material_properties[material].setDiggingProperties("STPick", - DiggingProperties(true, 0.75*toughness, 65535./100.*toughness)); - g_material_properties[material].setDiggingProperties("SteelPick", - DiggingProperties(true, 0.50*toughness, 65535./333.*toughness)); - - /*g_material_properties[material].setDiggingProperties("MesePick", - DiggingProperties(true, 0.0*toughness, 65535./20.*toughness));*/ -} - -void setDirtLikeDiggingProperties(u8 material, float toughness) -{ - g_material_properties[material].setDiggingProperties("", - DiggingProperties(true, 0.75*toughness, 0)); - - g_material_properties[material].setDiggingProperties("WShovel", - DiggingProperties(true, 0.4*toughness, 65535./50.*toughness)); - g_material_properties[material].setDiggingProperties("STShovel", - DiggingProperties(true, 0.2*toughness, 65535./150.*toughness)); - g_material_properties[material].setDiggingProperties("SteelShovel", - DiggingProperties(true, 0.15*toughness, 65535./400.*toughness)); -} - -void setWoodLikeDiggingProperties(u8 material, float toughness) -{ - g_material_properties[material].setDiggingProperties("", - DiggingProperties(true, 3.0*toughness, 0)); - - g_material_properties[material].setDiggingProperties("WAxe", - DiggingProperties(true, 1.5*toughness, 65535./30.*toughness)); - g_material_properties[material].setDiggingProperties("STAxe", - DiggingProperties(true, 0.75*toughness, 65535./100.*toughness)); - g_material_properties[material].setDiggingProperties("SteelAxe", - DiggingProperties(true, 0.5*toughness, 65535./333.*toughness)); -} - -void initializeMaterialProperties() -{ - /* - Now, the g_material_properties array is already initialized - by the constructors to such that no digging is possible. - - Add some digging properties to them. - */ - - setStoneLikeDiggingProperties(CONTENT_STONE, 1.0); - setStoneLikeDiggingProperties(CONTENT_MESE, 0.5); - setStoneLikeDiggingProperties(CONTENT_COALSTONE, 1.5); - setStoneLikeDiggingProperties(CONTENT_FURNACE, 3.0); - setStoneLikeDiggingProperties(CONTENT_COBBLE, 1.0); - setStoneLikeDiggingProperties(CONTENT_STEEL, 5.0); - - setDirtLikeDiggingProperties(CONTENT_MUD, 1.0); - setDirtLikeDiggingProperties(CONTENT_GRASS, 1.0); - setDirtLikeDiggingProperties(CONTENT_GRASS_FOOTSTEPS, 1.0); - setDirtLikeDiggingProperties(CONTENT_SAND, 1.0); - - setWoodLikeDiggingProperties(CONTENT_TREE, 1.0); - setWoodLikeDiggingProperties(CONTENT_LEAVES, 0.15); - setWoodLikeDiggingProperties(CONTENT_GLASS, 0.15); - setWoodLikeDiggingProperties(CONTENT_FENCE, 0.75); - setWoodLikeDiggingProperties(CONTENT_WOOD, 0.75); - setWoodLikeDiggingProperties(CONTENT_CHEST, 1.0); - - g_material_properties[CONTENT_SIGN_WALL].setDiggingProperties("", - DiggingProperties(true, 0.5, 0)); - g_material_properties[CONTENT_TORCH].setDiggingProperties("", - DiggingProperties(true, 0.0, 0)); - - /* - Add MesePick to everything - */ - for(u16 i=0; i<MATERIAL_PROPERTIES_COUNT; i++) - { - g_material_properties[i].setDiggingProperties("MesePick", - DiggingProperties(true, 0.0, 65535./1337)); - } - - g_material_properties_initialized = true; -} - -MaterialProperties * getMaterialProperties(u8 material) +DiggingPropertiesList * getDiggingPropertiesList(u8 content) { - assert(g_material_properties_initialized); - return &g_material_properties[material]; + return &content_features(content).digging_properties; } -DiggingProperties getDiggingProperties(u8 material, const std::string &tool) +DiggingProperties getDiggingProperties(u8 content, const std::string &tool) { - MaterialProperties *mprop = getMaterialProperties(material); + DiggingPropertiesList *mprop = getDiggingPropertiesList(content); if(mprop == NULL) // Not diggable return DiggingProperties(); - return mprop->getDiggingProperties(tool); + return mprop->get(tool); } diff --git a/src/materials.h b/src/materials.h index 422149753..272116d83 100644 --- a/src/materials.h +++ b/src/materials.h @@ -25,7 +25,6 @@ with this program; if not, write to the Free Software Foundation, Inc., */ #include "common_irrlicht.h" -#include "inventory.h" #include <string> struct DiggingProperties @@ -49,20 +48,26 @@ struct DiggingProperties u16 wear; }; -class MaterialProperties +/* + This is a DEPRECATED way of determining mining characteristics. + TODO: Get rid of this and set up some attributes like toughness, + fluffyness, and a funciton to calculate time and durability loss + (and sound? and whatever else) from them +*/ +class DiggingPropertiesList { public: - MaterialProperties() + DiggingPropertiesList() { } - void setDiggingProperties(const std::string toolname, + void set(const std::string toolname, const DiggingProperties &prop) { m_digging_properties[toolname] = prop; } - DiggingProperties getDiggingProperties(const std::string toolname) + DiggingProperties get(const std::string toolname) { core::map<std::string, DiggingProperties>::Node *n; n = m_digging_properties.find(toolname); @@ -80,16 +85,17 @@ public: return n->getValue(); } + void clear() + { + m_digging_properties.clear(); + } + private: // toolname="": default properties (digging by hand) // Key is toolname core::map<std::string, DiggingProperties> m_digging_properties; }; -void initializeMaterialProperties(); - -// Material correspond to the CONTENT_* constants -MaterialProperties * getMaterialProperties(u8 material); // For getting the default properties, set tool="" DiggingProperties getDiggingProperties(u8 material, const std::string &tool); diff --git a/src/nodemetadata.cpp b/src/nodemetadata.cpp index 6822173cb..1fc4c93a1 100644 --- a/src/nodemetadata.cpp +++ b/src/nodemetadata.cpp @@ -23,6 +23,7 @@ with this program; if not, write to the Free Software Foundation, Inc., #include "exceptions.h" #include "inventory.h" #include <sstream> +#include "content_mapnode.h" /* NodeMetadata diff --git a/src/server.cpp b/src/server.cpp index 16ad80c00..70448fbf6 100644 --- a/src/server.cpp +++ b/src/server.cpp @@ -31,6 +31,7 @@ with this program; if not, write to the Free Software Foundation, Inc., #include "config.h" #include "servercommand.h" #include "filesys.h" +#include "content_mapnode.h" #define BLOCK_EMERGE_FLAG_FROMDISK (1<<0) diff --git a/src/servermain.cpp b/src/servermain.cpp index 907d0d2db..6eb45ea22 100644 --- a/src/servermain.cpp +++ b/src/servermain.cpp @@ -152,7 +152,7 @@ int main(int argc, char *argv[]) DSTACK(__FUNCTION_NAME); // Init material properties table - initializeMaterialProperties(); + //initializeMaterialProperties(); // Debug handler BEGIN_DEBUG_EXCEPTION_HANDLER diff --git a/src/test.cpp b/src/test.cpp index 07ef772ef..38497136d 100644 --- a/src/test.cpp +++ b/src/test.cpp @@ -30,6 +30,7 @@ with this program; if not, write to the Free Software Foundation, Inc., #include "voxel.h" #include <sstream> #include "porting.h" +#include "content_mapnode.h" /* Asserts that the exception occurs diff --git a/src/voxel.cpp b/src/voxel.cpp index f60b641f1..5938f9016 100644 --- a/src/voxel.cpp +++ b/src/voxel.cpp @@ -19,10 +19,9 @@ with this program; if not, write to the Free Software Foundation, Inc., #include "voxel.h" #include "map.h" - -// For TimeTaker -#include "utility.h" +#include "utility.h" // For TimeTaker #include "gettime.h" +#include "content_mapnode.h" /* Debug stuff |