Moved some mapnode content stuff from mapnode.{h,cpp} and digging property stuff from material.cpp to content_mapnode.{h,cpp}
This commit is contained in:
parent
d6b54514bf
commit
dc5319b6c9
|
@ -50,6 +50,7 @@ configure_file(
|
||||||
)
|
)
|
||||||
|
|
||||||
set(common_SRCS
|
set(common_SRCS
|
||||||
|
content_mapnode.cpp
|
||||||
auth.cpp
|
auth.cpp
|
||||||
collision.cpp
|
collision.cpp
|
||||||
nodemetadata.cpp
|
nodemetadata.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));
|
||||||
|
}
|
||||||
|
|
||||||
|
|
|
@ -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
|
||||||
|
|
|
@ -21,6 +21,7 @@ with this program; if not, write to the Free Software Foundation, Inc.,
|
||||||
#include "filesys.h"
|
#include "filesys.h"
|
||||||
#include "porting.h"
|
#include "porting.h"
|
||||||
#include "collision.h"
|
#include "collision.h"
|
||||||
|
#include "content_mapnode.h"
|
||||||
|
|
||||||
|
|
||||||
Environment::Environment():
|
Environment::Environment():
|
||||||
|
|
|
@ -32,6 +32,9 @@ with this program; if not, write to the Free Software Foundation, Inc.,
|
||||||
#include "keycode.h"
|
#include "keycode.h"
|
||||||
#include "farmesh.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
|
Setting this to 1 enables a special camera mode that forces
|
||||||
the renderers to think that the camera statically points from
|
the renderers to think that the camera statically points from
|
||||||
|
|
|
@ -28,6 +28,7 @@ with this program; if not, write to the Free Software Foundation, Inc.,
|
||||||
#include <sstream>
|
#include <sstream>
|
||||||
#include "main.h"
|
#include "main.h"
|
||||||
#include "serverobject.h"
|
#include "serverobject.h"
|
||||||
|
#include "content_mapnode.h"
|
||||||
|
|
||||||
/*
|
/*
|
||||||
InventoryItem
|
InventoryItem
|
||||||
|
|
|
@ -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
|
SUGG: Map unloading based on sector reference is not very good, it keeps
|
||||||
unnecessary stuff in memory. I guess. Investigate this.
|
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:
|
Environment:
|
||||||
------------
|
------------
|
||||||
|
|
||||||
|
@ -1143,7 +1149,7 @@ int main(int argc, char *argv[])
|
||||||
fs::CreateDir(porting::path_userdata);
|
fs::CreateDir(porting::path_userdata);
|
||||||
|
|
||||||
// Init material properties table
|
// Init material properties table
|
||||||
initializeMaterialProperties();
|
//initializeMaterialProperties();
|
||||||
|
|
||||||
// Debug handler
|
// Debug handler
|
||||||
BEGIN_DEBUG_EXCEPTION_HANDLER
|
BEGIN_DEBUG_EXCEPTION_HANDLER
|
||||||
|
@ -1414,7 +1420,6 @@ int main(int argc, char *argv[])
|
||||||
Preload some textures and stuff
|
Preload some textures and stuff
|
||||||
*/
|
*/
|
||||||
|
|
||||||
init_content_inventory_texture_paths();
|
|
||||||
init_mapnode(); // Second call with g_texturesource set
|
init_mapnode(); // Second call with g_texturesource set
|
||||||
init_mineral();
|
init_mineral();
|
||||||
|
|
||||||
|
|
|
@ -28,6 +28,7 @@ with this program; if not, write to the Free Software Foundation, Inc.,
|
||||||
#include "mineral.h"
|
#include "mineral.h"
|
||||||
#include "noise.h"
|
#include "noise.h"
|
||||||
#include "serverobject.h"
|
#include "serverobject.h"
|
||||||
|
#include "content_mapnode.h"
|
||||||
|
|
||||||
/*
|
/*
|
||||||
Map
|
Map
|
||||||
|
|
|
@ -24,6 +24,9 @@ with this program; if not, write to the Free Software Foundation, Inc.,
|
||||||
#include "light.h"
|
#include "light.h"
|
||||||
#include <sstream>
|
#include <sstream>
|
||||||
|
|
||||||
|
// TODO: Move content-aware mesh generation to a separate file
|
||||||
|
#include "content_mapnode.h"
|
||||||
|
|
||||||
#ifndef SERVER
|
#ifndef SERVER
|
||||||
void MeshMakeData::fill(u32 daynight_ratio, MapBlock *block)
|
void MeshMakeData::fill(u32 daynight_ratio, MapBlock *block)
|
||||||
{
|
{
|
||||||
|
|
257
src/mapnode.cpp
257
src/mapnode.cpp
|
@ -25,6 +25,7 @@ with this program; if not, write to the Free Software Foundation, Inc.,
|
||||||
#include "mineral.h"
|
#include "mineral.h"
|
||||||
// For g_settings
|
// For g_settings
|
||||||
#include "main.h"
|
#include "main.h"
|
||||||
|
#include "content_mapnode.h"
|
||||||
#include "nodemetadata.h"
|
#include "nodemetadata.h"
|
||||||
|
|
||||||
ContentFeatures::~ContentFeatures()
|
ContentFeatures::~ContentFeatures()
|
||||||
|
@ -107,9 +108,9 @@ void init_mapnode()
|
||||||
"g_texturesource!=NULL"<<std::endl;
|
"g_texturesource!=NULL"<<std::endl;
|
||||||
}
|
}
|
||||||
|
|
||||||
// Read some settings
|
/*// Read some settings
|
||||||
bool new_style_water = g_settings.getBool("new_style_water");
|
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
|
Initialize content feature table
|
||||||
|
@ -131,247 +132,17 @@ void init_mapnode()
|
||||||
{
|
{
|
||||||
ContentFeatures *f = &g_content_features[i];
|
ContentFeatures *f = &g_content_features[i];
|
||||||
// Re-initialize
|
// Re-initialize
|
||||||
*f = ContentFeatures();
|
f->reset();
|
||||||
|
|
||||||
for(u16 j=0; j<6; j++)
|
for(u16 j=0; j<6; j++)
|
||||||
f->tiles[j].material_type = initial_material_type;
|
f->tiles[j].material_type = initial_material_type;
|
||||||
}
|
}
|
||||||
|
|
||||||
u8 i;
|
/*
|
||||||
ContentFeatures *f = NULL;
|
Initialize mapnode content
|
||||||
|
*/
|
||||||
|
content_mapnode_init();
|
||||||
|
|
||||||
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";
|
|
||||||
|
|
||||||
// NOTE: Remember to add frequently used stuff to the texture atlas in tile.cpp
|
|
||||||
}
|
}
|
||||||
|
|
||||||
v3s16 facedir_rotate(u8 facedir, v3s16 dir)
|
v3s16 facedir_rotate(u8 facedir, v3s16 dir)
|
||||||
|
@ -459,16 +230,4 @@ u8 MapNode::getMineral()
|
||||||
return MINERAL_NONE;
|
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();
|
|
||||||
}*/
|
|
||||||
}
|
|
||||||
|
|
||||||
|
|
151
src/mapnode.h
151
src/mapnode.h
|
@ -27,6 +27,14 @@ with this program; if not, write to the Free Software Foundation, Inc.,
|
||||||
#include "exceptions.h"
|
#include "exceptions.h"
|
||||||
#include "serialization.h"
|
#include "serialization.h"
|
||||||
#include "tile.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.
|
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();
|
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.
|
Ignored node.
|
||||||
|
|
||||||
|
@ -67,41 +68,6 @@ void init_content_inventory_texture_paths();
|
||||||
*/
|
*/
|
||||||
#define CONTENT_AIR 254
|
#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
|
Content feature list
|
||||||
*/
|
*/
|
||||||
|
@ -174,9 +140,19 @@ struct ContentFeatures
|
||||||
// Initial metadata is cloned from this
|
// Initial metadata is cloned from this
|
||||||
NodeMetadata *initial_metadata;
|
NodeMetadata *initial_metadata;
|
||||||
|
|
||||||
//TODO: Move more properties here
|
// 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;
|
||||||
|
|
||||||
ContentFeatures()
|
// 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
|
||||||
|
|
||||||
|
void reset()
|
||||||
{
|
{
|
||||||
translate_to = NULL;
|
translate_to = NULL;
|
||||||
param_type = CPT_NONE;
|
param_type = CPT_NONE;
|
||||||
|
@ -194,6 +170,14 @@ struct ContentFeatures
|
||||||
air_equivalent = false;
|
air_equivalent = false;
|
||||||
dug_item = "";
|
dug_item = "";
|
||||||
initial_metadata = NULL;
|
initial_metadata = NULL;
|
||||||
|
liquid_alternative_flowing = CONTENT_IGNORE;
|
||||||
|
light_source = 0;
|
||||||
|
digging_properties.clear();
|
||||||
|
}
|
||||||
|
|
||||||
|
ContentFeatures()
|
||||||
|
{
|
||||||
|
reset();
|
||||||
}
|
}
|
||||||
|
|
||||||
~ContentFeatures();
|
~ContentFeatures();
|
||||||
|
@ -235,6 +219,11 @@ struct ContentFeatures
|
||||||
*/
|
*/
|
||||||
ContentFeatures & content_features(u8 i);
|
ContentFeatures & content_features(u8 i);
|
||||||
|
|
||||||
|
|
||||||
|
/*
|
||||||
|
Here is a bunch of DEPRECATED functions.
|
||||||
|
*/
|
||||||
|
|
||||||
/*
|
/*
|
||||||
If true, the material allows light propagation and brightness is stored
|
If true, the material allows light propagation and brightness is stored
|
||||||
in param.
|
in param.
|
||||||
|
@ -243,9 +232,7 @@ ContentFeatures & content_features(u8 i);
|
||||||
inline bool light_propagates_content(u8 m)
|
inline bool light_propagates_content(u8 m)
|
||||||
{
|
{
|
||||||
return content_features(m).light_propagates;
|
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.
|
If true, the material allows lossless sunlight propagation.
|
||||||
NOTE: It doesn't seem to go through torches regardlessly of this
|
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)
|
inline bool sunlight_propagates_content(u8 m)
|
||||||
{
|
{
|
||||||
return content_features(m).sunlight_propagates;
|
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
|
On a node-node surface, the material of the node with higher solidness
|
||||||
is used for drawing.
|
is used for drawing.
|
||||||
|
@ -268,83 +253,54 @@ inline bool sunlight_propagates_content(u8 m)
|
||||||
inline u8 content_solidness(u8 m)
|
inline u8 content_solidness(u8 m)
|
||||||
{
|
{
|
||||||
return content_features(m).solidness;
|
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
|
// Objects collide with walkable contents
|
||||||
// NOTE: Don't use, use "content_features(m).whatever" instead
|
// NOTE: Don't use, use "content_features(m).whatever" instead
|
||||||
inline bool content_walkable(u8 m)
|
inline bool content_walkable(u8 m)
|
||||||
{
|
{
|
||||||
return content_features(m).walkable;
|
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
|
// NOTE: Don't use, use "content_features(m).whatever" instead
|
||||||
inline bool content_liquid(u8 m)
|
inline bool content_liquid(u8 m)
|
||||||
{
|
{
|
||||||
return content_features(m).liquid_type != LIQUID_NONE;
|
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
|
// NOTE: Don't use, use "content_features(m).whatever" instead
|
||||||
inline bool content_flowing_liquid(u8 m)
|
inline bool content_flowing_liquid(u8 m)
|
||||||
{
|
{
|
||||||
return content_features(m).liquid_type == LIQUID_FLOWING;
|
return content_features(m).liquid_type == LIQUID_FLOWING;
|
||||||
//return (m == CONTENT_WATER);
|
|
||||||
}
|
}
|
||||||
|
|
||||||
// NOTE: Don't use, use "content_features(m).whatever" instead
|
// NOTE: Don't use, use "content_features(m).whatever" instead
|
||||||
inline bool content_liquid_source(u8 m)
|
inline bool content_liquid_source(u8 m)
|
||||||
{
|
{
|
||||||
return content_features(m).liquid_type == LIQUID_SOURCE;
|
return content_features(m).liquid_type == LIQUID_SOURCE;
|
||||||
//return (m == CONTENT_WATERSOURCE);
|
|
||||||
}
|
}
|
||||||
|
|
||||||
// CONTENT_WATER || CONTENT_WATERSOURCE -> CONTENT_WATER
|
// CONTENT_WATER || CONTENT_WATERSOURCE -> CONTENT_WATER
|
||||||
// CONTENT_LAVA || CONTENT_LAVASOURCE -> CONTENT_LAVA
|
// CONTENT_LAVA || CONTENT_LAVASOURCE -> CONTENT_LAVA
|
||||||
|
// NOTE: Don't use, use "content_features(m).whatever" instead
|
||||||
inline u8 make_liquid_flowing(u8 m)
|
inline u8 make_liquid_flowing(u8 m)
|
||||||
{
|
{
|
||||||
if(m == CONTENT_WATER || m == CONTENT_WATERSOURCE)
|
u8 c = content_features(m).liquid_alternative_flowing;
|
||||||
return CONTENT_WATER;
|
assert(c != CONTENT_IGNORE);
|
||||||
assert(0);
|
return c;
|
||||||
}
|
}
|
||||||
|
|
||||||
// Pointable contents can be pointed to in the map
|
// Pointable contents can be pointed to in the map
|
||||||
// NOTE: Don't use, use "content_features(m).whatever" instead
|
// NOTE: Don't use, use "content_features(m).whatever" instead
|
||||||
inline bool content_pointable(u8 m)
|
inline bool content_pointable(u8 m)
|
||||||
{
|
{
|
||||||
return content_features(m).pointable;
|
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
|
// NOTE: Don't use, use "content_features(m).whatever" instead
|
||||||
inline bool content_diggable(u8 m)
|
inline bool content_diggable(u8 m)
|
||||||
{
|
{
|
||||||
return content_features(m).diggable;
|
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
|
// NOTE: Don't use, use "content_features(m).whatever" instead
|
||||||
inline bool content_buildable_to(u8 m)
|
inline bool content_buildable_to(u8 m)
|
||||||
{
|
{
|
||||||
return content_features(m).buildable_to;
|
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.
|
Nodes make a face if contents differ and solidness differs.
|
||||||
Return value:
|
Return value:
|
||||||
|
@ -494,30 +450,24 @@ struct MapNode
|
||||||
&& param2 == other.param2);
|
&& param2 == other.param2);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
/*
|
||||||
|
These four are DEPRECATED I guess. -c55
|
||||||
|
*/
|
||||||
bool light_propagates()
|
bool light_propagates()
|
||||||
{
|
{
|
||||||
return light_propagates_content(d);
|
return light_propagates_content(d);
|
||||||
}
|
}
|
||||||
|
|
||||||
bool sunlight_propagates()
|
bool sunlight_propagates()
|
||||||
{
|
{
|
||||||
return sunlight_propagates_content(d);
|
return sunlight_propagates_content(d);
|
||||||
}
|
}
|
||||||
|
|
||||||
u8 solidness()
|
u8 solidness()
|
||||||
{
|
{
|
||||||
return content_solidness(d);
|
return content_solidness(d);
|
||||||
}
|
}
|
||||||
|
|
||||||
u8 light_source()
|
u8 light_source()
|
||||||
{
|
{
|
||||||
/*
|
return content_features(d).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;
|
|
||||||
}
|
}
|
||||||
|
|
||||||
u8 getLightBanksWithSource()
|
u8 getLightBanksWithSource()
|
||||||
|
@ -537,11 +487,6 @@ struct MapNode
|
||||||
return (lightday&0x0f) | ((lightnight<<4)&0xf0);
|
return (lightday&0x0f) | ((lightnight<<4)&0xf0);
|
||||||
}
|
}
|
||||||
|
|
||||||
void setLightBanks(u8 a_light)
|
|
||||||
{
|
|
||||||
param = a_light;
|
|
||||||
}
|
|
||||||
|
|
||||||
u8 getLight(enum LightBank bank)
|
u8 getLight(enum LightBank bank)
|
||||||
{
|
{
|
||||||
// Select the brightest of [light source, propagated light]
|
// Select the brightest of [light source, propagated light]
|
||||||
|
@ -606,13 +551,25 @@ struct MapNode
|
||||||
}
|
}
|
||||||
|
|
||||||
// In mapnode.cpp
|
// 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);
|
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();
|
u8 getMineral();
|
||||||
|
|
||||||
/*
|
/*
|
||||||
These serialization functions are used when informing client
|
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)
|
static u32 serializedLength(u8 version)
|
||||||
|
|
|
@ -1,112 +1,20 @@
|
||||||
#include "materials.h"
|
#include "materials.h"
|
||||||
|
#include "mapnode.h"
|
||||||
|
|
||||||
#define MATERIAL_PROPERTIES_COUNT 256
|
// NOTE: DEPRECATED
|
||||||
|
|
||||||
// These correspond to the CONTENT_* constants
|
DiggingPropertiesList * getDiggingPropertiesList(u8 content)
|
||||||
MaterialProperties g_material_properties[MATERIAL_PROPERTIES_COUNT];
|
|
||||||
|
|
||||||
bool g_material_properties_initialized = false;
|
|
||||||
|
|
||||||
void setStoneLikeDiggingProperties(u8 material, float toughness)
|
|
||||||
{
|
{
|
||||||
g_material_properties[material].setDiggingProperties("",
|
return &content_features(content).digging_properties;
|
||||||
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)
|
DiggingProperties getDiggingProperties(u8 content, const std::string &tool)
|
||||||
{
|
{
|
||||||
g_material_properties[material].setDiggingProperties("",
|
DiggingPropertiesList *mprop = getDiggingPropertiesList(content);
|
||||||
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)
|
|
||||||
{
|
|
||||||
assert(g_material_properties_initialized);
|
|
||||||
return &g_material_properties[material];
|
|
||||||
}
|
|
||||||
|
|
||||||
DiggingProperties getDiggingProperties(u8 material, const std::string &tool)
|
|
||||||
{
|
|
||||||
MaterialProperties *mprop = getMaterialProperties(material);
|
|
||||||
if(mprop == NULL)
|
if(mprop == NULL)
|
||||||
// Not diggable
|
// Not diggable
|
||||||
return DiggingProperties();
|
return DiggingProperties();
|
||||||
|
|
||||||
return mprop->getDiggingProperties(tool);
|
return mprop->get(tool);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
|
@ -25,7 +25,6 @@ with this program; if not, write to the Free Software Foundation, Inc.,
|
||||||
*/
|
*/
|
||||||
|
|
||||||
#include "common_irrlicht.h"
|
#include "common_irrlicht.h"
|
||||||
#include "inventory.h"
|
|
||||||
#include <string>
|
#include <string>
|
||||||
|
|
||||||
struct DiggingProperties
|
struct DiggingProperties
|
||||||
|
@ -49,20 +48,26 @@ struct DiggingProperties
|
||||||
u16 wear;
|
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:
|
public:
|
||||||
MaterialProperties()
|
DiggingPropertiesList()
|
||||||
{
|
{
|
||||||
}
|
}
|
||||||
|
|
||||||
void setDiggingProperties(const std::string toolname,
|
void set(const std::string toolname,
|
||||||
const DiggingProperties &prop)
|
const DiggingProperties &prop)
|
||||||
{
|
{
|
||||||
m_digging_properties[toolname] = 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;
|
core::map<std::string, DiggingProperties>::Node *n;
|
||||||
n = m_digging_properties.find(toolname);
|
n = m_digging_properties.find(toolname);
|
||||||
|
@ -80,16 +85,17 @@ public:
|
||||||
return n->getValue();
|
return n->getValue();
|
||||||
}
|
}
|
||||||
|
|
||||||
|
void clear()
|
||||||
|
{
|
||||||
|
m_digging_properties.clear();
|
||||||
|
}
|
||||||
|
|
||||||
private:
|
private:
|
||||||
// toolname="": default properties (digging by hand)
|
// toolname="": default properties (digging by hand)
|
||||||
// Key is toolname
|
// Key is toolname
|
||||||
core::map<std::string, DiggingProperties> m_digging_properties;
|
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=""
|
// For getting the default properties, set tool=""
|
||||||
DiggingProperties getDiggingProperties(u8 material, const std::string &tool);
|
DiggingProperties getDiggingProperties(u8 material, const std::string &tool);
|
||||||
|
|
||||||
|
|
|
@ -23,6 +23,7 @@ with this program; if not, write to the Free Software Foundation, Inc.,
|
||||||
#include "exceptions.h"
|
#include "exceptions.h"
|
||||||
#include "inventory.h"
|
#include "inventory.h"
|
||||||
#include <sstream>
|
#include <sstream>
|
||||||
|
#include "content_mapnode.h"
|
||||||
|
|
||||||
/*
|
/*
|
||||||
NodeMetadata
|
NodeMetadata
|
||||||
|
|
|
@ -31,6 +31,7 @@ with this program; if not, write to the Free Software Foundation, Inc.,
|
||||||
#include "config.h"
|
#include "config.h"
|
||||||
#include "servercommand.h"
|
#include "servercommand.h"
|
||||||
#include "filesys.h"
|
#include "filesys.h"
|
||||||
|
#include "content_mapnode.h"
|
||||||
|
|
||||||
#define BLOCK_EMERGE_FLAG_FROMDISK (1<<0)
|
#define BLOCK_EMERGE_FLAG_FROMDISK (1<<0)
|
||||||
|
|
||||||
|
|
|
@ -152,7 +152,7 @@ int main(int argc, char *argv[])
|
||||||
DSTACK(__FUNCTION_NAME);
|
DSTACK(__FUNCTION_NAME);
|
||||||
|
|
||||||
// Init material properties table
|
// Init material properties table
|
||||||
initializeMaterialProperties();
|
//initializeMaterialProperties();
|
||||||
|
|
||||||
// Debug handler
|
// Debug handler
|
||||||
BEGIN_DEBUG_EXCEPTION_HANDLER
|
BEGIN_DEBUG_EXCEPTION_HANDLER
|
||||||
|
|
|
@ -30,6 +30,7 @@ with this program; if not, write to the Free Software Foundation, Inc.,
|
||||||
#include "voxel.h"
|
#include "voxel.h"
|
||||||
#include <sstream>
|
#include <sstream>
|
||||||
#include "porting.h"
|
#include "porting.h"
|
||||||
|
#include "content_mapnode.h"
|
||||||
|
|
||||||
/*
|
/*
|
||||||
Asserts that the exception occurs
|
Asserts that the exception occurs
|
||||||
|
|
|
@ -19,10 +19,9 @@ with this program; if not, write to the Free Software Foundation, Inc.,
|
||||||
|
|
||||||
#include "voxel.h"
|
#include "voxel.h"
|
||||||
#include "map.h"
|
#include "map.h"
|
||||||
|
#include "utility.h" // For TimeTaker
|
||||||
// For TimeTaker
|
|
||||||
#include "utility.h"
|
|
||||||
#include "gettime.h"
|
#include "gettime.h"
|
||||||
|
#include "content_mapnode.h"
|
||||||
|
|
||||||
/*
|
/*
|
||||||
Debug stuff
|
Debug stuff
|
||||||
|
|
Loading…
Reference in New Issue