New way of determining the outcome of digging

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

View File

@ -140,6 +140,7 @@ void init_mapnode()
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(i)+" 1";
i = CONTENT_GRASS;
f = &g_content_features[i];
@ -148,6 +149,7 @@ void init_mapnode()
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];
@ -156,18 +158,21 @@ void init_mapnode()
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->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];
@ -176,6 +181,7 @@ void init_mapnode()
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];
@ -186,11 +192,13 @@ void init_mapnode()
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_COALSTONE;
f = &g_content_features[i];
@ -202,16 +210,19 @@ void init_mapnode()
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];
@ -263,6 +274,7 @@ void init_mapnode()
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];
@ -272,6 +284,7 @@ void init_mapnode()
f->solidness = 0; // drawn separately, makes no faces
f->walkable = false;
f->wall_mounted = true;
f->dug_item = std::string("MaterialItem ")+itos(i)+" 1";
}

View File

@ -154,7 +154,13 @@ struct ContentFeatures
bool diggable;
bool buildable_to;
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
@ -173,6 +179,7 @@ struct ContentFeatures
buildable_to = false;
liquid_type = LIQUID_NONE;
wall_mounted = false;
dug_item = "";
}
~ContentFeatures();

View File

@ -1854,6 +1854,7 @@ void Server::ProcessData(u8 *data, u32 datasize, u16 peer_id)
0: start digging
1: place block
2: stop digging (all parameters ignored)
3: digging completed
*/
u8 action = readU8(&data[2]);
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;
@ -2004,16 +2005,26 @@ void Server::ProcessData(u8 *data, u32 datasize, u16 peer_id)
if(mineral != MINERAL_NONE)
item = getDiggedMineralItem(mineral);
// If not mineral
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);
/*
Send inventory
*/
// Send inventory
SendInventory(player->peer_id);
}
}
/*
Remove the node