New way of determining the outcome of digging

This commit is contained in:
Perttu Ahola 2011-02-14 12:08:03 +02:00
parent 5573142a2b
commit 00810408a8
3 changed files with 41 additions and 10 deletions

@ -140,6 +140,7 @@ void init_mapnode()
f->setInventoryTextureCube("stone.png", "stone.png", "stone.png"); f->setInventoryTextureCube("stone.png", "stone.png", "stone.png");
f->param_type = CPT_MINERAL; f->param_type = CPT_MINERAL;
f->is_ground_content = true; f->is_ground_content = true;
f->dug_item = std::string("MaterialItem ")+itos(i)+" 1";
i = CONTENT_GRASS; i = CONTENT_GRASS;
f = &g_content_features[i]; f = &g_content_features[i];
@ -148,6 +149,7 @@ void init_mapnode()
f->setTexture(1, "mud.png"); f->setTexture(1, "mud.png");
f->param_type = CPT_MINERAL; f->param_type = CPT_MINERAL;
f->is_ground_content = true; f->is_ground_content = true;
f->dug_item = std::string("MaterialItem ")+itos(CONTENT_MUD)+" 1";
i = CONTENT_GRASS_FOOTSTEPS; i = CONTENT_GRASS_FOOTSTEPS;
f = &g_content_features[i]; f = &g_content_features[i];
@ -156,18 +158,21 @@ void init_mapnode()
f->setTexture(1, "mud.png"); f->setTexture(1, "mud.png");
f->param_type = CPT_MINERAL; f->param_type = CPT_MINERAL;
f->is_ground_content = true; f->is_ground_content = true;
f->dug_item = std::string("MaterialItem ")+itos(CONTENT_MUD)+" 1";
i = CONTENT_MUD; i = CONTENT_MUD;
f = &g_content_features[i]; f = &g_content_features[i];
f->setAllTextures("mud.png"); f->setAllTextures("mud.png");
f->param_type = CPT_MINERAL; f->param_type = CPT_MINERAL;
f->is_ground_content = true; f->is_ground_content = true;
f->dug_item = std::string("MaterialItem ")+itos(i)+" 1";
i = CONTENT_SAND; i = CONTENT_SAND;
f = &g_content_features[i]; f = &g_content_features[i];
f->setAllTextures("sand.png"); f->setAllTextures("sand.png");
f->param_type = CPT_MINERAL; f->param_type = CPT_MINERAL;
f->is_ground_content = true; f->is_ground_content = true;
f->dug_item = std::string("MaterialItem ")+itos(i)+" 1";
i = CONTENT_TREE; i = CONTENT_TREE;
f = &g_content_features[i]; f = &g_content_features[i];
@ -176,6 +181,7 @@ void init_mapnode()
f->setTexture(1, "tree_top.png"); f->setTexture(1, "tree_top.png");
f->param_type = CPT_MINERAL; f->param_type = CPT_MINERAL;
f->is_ground_content = true; f->is_ground_content = true;
f->dug_item = std::string("MaterialItem ")+itos(i)+" 1";
i = CONTENT_LEAVES; i = CONTENT_LEAVES;
f = &g_content_features[i]; f = &g_content_features[i];
@ -186,11 +192,13 @@ void init_mapnode()
if(new_style_leaves) if(new_style_leaves)
{ {
f->solidness = 0; // drawn separately, makes no faces f->solidness = 0; // drawn separately, makes no faces
f->setInventoryTextureCube("leaves.png", "leaves.png", "leaves.png");
} }
else else
{ {
f->setAllTextures("[noalpha:leaves.png"); f->setAllTextures("[noalpha:leaves.png");
} }
f->dug_item = std::string("MaterialItem ")+itos(i)+" 1";
i = CONTENT_COALSTONE; i = CONTENT_COALSTONE;
f = &g_content_features[i]; f = &g_content_features[i];
@ -202,16 +210,19 @@ void init_mapnode()
f = &g_content_features[i]; f = &g_content_features[i];
f->setAllTextures("wood.png"); f->setAllTextures("wood.png");
f->is_ground_content = true; f->is_ground_content = true;
f->dug_item = std::string("MaterialItem ")+itos(i)+" 1";
i = CONTENT_MESE; i = CONTENT_MESE;
f = &g_content_features[i]; f = &g_content_features[i];
f->setAllTextures("mese.png"); f->setAllTextures("mese.png");
f->is_ground_content = true; f->is_ground_content = true;
f->dug_item = std::string("MaterialItem ")+itos(i)+" 1";
i = CONTENT_CLOUD; i = CONTENT_CLOUD;
f = &g_content_features[i]; f = &g_content_features[i];
f->setAllTextures("cloud.png"); f->setAllTextures("cloud.png");
f->is_ground_content = true; f->is_ground_content = true;
f->dug_item = std::string("MaterialItem ")+itos(i)+" 1";
i = CONTENT_AIR; i = CONTENT_AIR;
f = &g_content_features[i]; f = &g_content_features[i];
@ -263,6 +274,7 @@ void init_mapnode()
f->diggable = false; f->diggable = false;
f->buildable_to = true; f->buildable_to = true;
f->liquid_type = LIQUID_SOURCE; f->liquid_type = LIQUID_SOURCE;
f->dug_item = std::string("MaterialItem ")+itos(i)+" 1";
i = CONTENT_TORCH; i = CONTENT_TORCH;
f = &g_content_features[i]; f = &g_content_features[i];
@ -272,6 +284,7 @@ void init_mapnode()
f->solidness = 0; // drawn separately, makes no faces f->solidness = 0; // drawn separately, makes no faces
f->walkable = false; f->walkable = false;
f->wall_mounted = true; f->wall_mounted = true;
f->dug_item = std::string("MaterialItem ")+itos(i)+" 1";
} }

@ -154,7 +154,13 @@ struct ContentFeatures
bool diggable; bool diggable;
bool buildable_to; bool buildable_to;
enum LiquidType liquid_type; enum LiquidType liquid_type;
bool wall_mounted; // If true, param2 is set to direction when placed // If true, param2 is set to direction when placed
// NOTE: the direction format is quite inefficient and should be changed
bool wall_mounted;
// Inventory item string as which the node appears in inventory when dug.
// Mineral overrides this.
std::string dug_item;
//TODO: Move more properties here //TODO: Move more properties here
@ -173,6 +179,7 @@ struct ContentFeatures
buildable_to = false; buildable_to = false;
liquid_type = LIQUID_NONE; liquid_type = LIQUID_NONE;
wall_mounted = false; wall_mounted = false;
dug_item = "";
} }
~ContentFeatures(); ~ContentFeatures();

@ -1854,6 +1854,7 @@ void Server::ProcessData(u8 *data, u32 datasize, u16 peer_id)
0: start digging 0: start digging
1: place block 1: place block
2: stop digging (all parameters ignored) 2: stop digging (all parameters ignored)
3: digging completed
*/ */
u8 action = readU8(&data[2]); u8 action = readU8(&data[2]);
v3s16 p_under; v3s16 p_under;
@ -1996,7 +1997,7 @@ void Server::ProcessData(u8 *data, u32 datasize, u16 peer_id)
} }
/* /*
Add digged item to inventory Add dug item to inventory
*/ */
InventoryItem *item = NULL; InventoryItem *item = NULL;
@ -2004,16 +2005,26 @@ void Server::ProcessData(u8 *data, u32 datasize, u16 peer_id)
if(mineral != MINERAL_NONE) if(mineral != MINERAL_NONE)
item = getDiggedMineralItem(mineral); item = getDiggedMineralItem(mineral);
// If not mineral
if(item == NULL) if(item == NULL)
item = new MaterialItem(material, 1); {
std::string &dug_s = content_features(material).dug_item;
if(dug_s != "")
{
std::istringstream is(dug_s, std::ios::binary);
item = InventoryItem::deSerialize(is);
}
}
if(item != NULL)
{
// Add a item to inventory
player->inventory.addItem("main", item); player->inventory.addItem("main", item);
/* // Send inventory
Send inventory
*/
SendInventory(player->peer_id); SendInventory(player->peer_id);
} }
}
/* /*
Remove the node Remove the node