X-Git-Url: https://git.librecmc.org/?a=blobdiff_plain;f=src%2Fmapnode.cpp;h=391e593f9548b9715de7f733169e88a50eb44f78;hb=8f742855a1f7b7679be1987c1b0c469e822c73f1;hp=ca36697efa93f1e2fd01f1cccd468be0c719a74c;hpb=12ca835e1404a6c9750a17d327a7d8bd97bafcb4;p=oweals%2Fminetest.git diff --git a/src/mapnode.cpp b/src/mapnode.cpp index ca36697ef..391e593f9 100644 --- a/src/mapnode.cpp +++ b/src/mapnode.cpp @@ -25,12 +25,13 @@ 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() { - if(translate_to) - delete translate_to; + /*if(translate_to) + delete translate_to;*/ if(initial_metadata) delete initial_metadata; } @@ -107,9 +108,9 @@ void init_mapnode() "g_texturesource!=NULL"<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 - - // 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) + + /* + Initially set every block to be shown as an unknown block. + Don't touch CONTENT_IGNORE or CONTENT_AIR. + */ + for(u16 i=0; i<=253; i++) { - f->solidness = 0; // drawn separately, makes no faces + ContentFeatures *f = &g_content_features[i]; + f->setAllTextures("unknown_block.png"); + f->dug_item = std::string("MaterialItem ")+itos(i)+" 1"; } - 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) @@ -458,16 +241,142 @@ 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}; +u32 MapNode::serializedLength(u8 version) +{ + if(!ser_ver_supported(version)) + throw VersionMismatchException("ERROR: MapNode format not supported"); + + if(version == 0) + return 1; + else if(version <= 9) + return 2; + else + return 3; +} +void MapNode::serialize(u8 *dest, u8 version) +{ + if(!ser_ver_supported(version)) + throw VersionMismatchException("ERROR: MapNode format not supported"); + + u8 actual_d = d; -void init_content_inventory_texture_paths() + // Convert from new version to old + if(version <= 18) + { + // In these versions, CONTENT_IGNORE and CONTENT_AIR + // are 255 and 254 + if(d == CONTENT_IGNORE) + d = 255; + else if(d == CONTENT_AIR) + d = 254; + } + + if(version == 0) + { + dest[0] = actual_d; + } + else if(version <= 9) + { + dest[0] = actual_d; + dest[1] = param; + } + else + { + dest[0] = actual_d; + dest[1] = param; + dest[2] = param2; + } +} +void MapNode::deSerialize(u8 *source, u8 version) { - dstream<<"DEPRECATED "<<__FUNCTION_NAME< 0) + param = 0; + else + param = source[1]; + } + else if(version <= 9) { - g_content_inventory_texture_paths[i] = - g_content_features[i].inventory_image_path.c_str(); - }*/ + d = source[0]; + param = source[1]; + } + else + { + d = source[0]; + param = source[1]; + param2 = source[2]; + + // Convert from old version to new + if(version <= 18) + { + // In these versions, CONTENT_IGNORE and CONTENT_AIR + // are 255 and 254 + if(d == 255) + d = CONTENT_IGNORE; + else if(d == 254) + d = CONTENT_AIR; + } + } } +/* + Gets lighting value at face of node + + Parameters must consist of air and !air. + Order doesn't matter. + + If either of the nodes doesn't exist, light is 0. + + parameters: + daynight_ratio: 0...1000 + n: getNodeParent(p) + n2: getNodeParent(p + face_dir) + face_dir: axis oriented unit vector from p to p2 + + returns encoded light value. +*/ +u8 getFaceLight(u32 daynight_ratio, MapNode n, MapNode n2, + v3s16 face_dir) +{ + try{ + u8 light; + u8 l1 = n.getLightBlend(daynight_ratio); + u8 l2 = n2.getLightBlend(daynight_ratio); + if(l1 > l2) + light = l1; + else + light = l2; + + // Make some nice difference to different sides + + // This makes light come from a corner + /*if(face_dir.X == 1 || face_dir.Z == 1 || face_dir.Y == -1) + light = diminish_light(diminish_light(light)); + else if(face_dir.X == -1 || face_dir.Z == -1) + light = diminish_light(light);*/ + + // All neighboring faces have different shade (like in minecraft) + if(face_dir.X == 1 || face_dir.X == -1 || face_dir.Y == -1) + light = diminish_light(diminish_light(light)); + else if(face_dir.Z == 1 || face_dir.Z == -1) + light = diminish_light(light); + + return light; + } + catch(InvalidPositionException &e) + { + return 0; + } +} + +