This commit is contained in:
darkrose 2013-10-13 18:51:55 +10:00
parent 81aac33dbe
commit ee7c6d72ab
13 changed files with 243 additions and 22 deletions

Binary file not shown.

After

Width:  |  Height:  |  Size: 329 B

Binary file not shown.

After

Width:  |  Height:  |  Size: 363 B

Binary file not shown.

After

Width:  |  Height:  |  Size: 369 B

Binary file not shown.

Before

Width:  |  Height:  |  Size: 854 B

After

Width:  |  Height:  |  Size: 461 B

Binary file not shown.

After

Width:  |  Height:  |  Size: 445 B

View File

@ -256,6 +256,7 @@ collisionMoveResult collisionMoveSimple(Map *map,
node_positions.push_back(p);
is_object.push_back(false);
}
nodeboxes.clear();
}
catch(InvalidPositionException &e)
{

View File

@ -107,7 +107,7 @@ struct CraftDef {
*/
InventoryItem *craft_get_result(InventoryItem **items)
{
static CraftDef defs[112];
static CraftDef defs[113];
static int defs_init = 0;
// only initialise (and hence allocate) these once
@ -1201,6 +1201,17 @@ InventoryItem *craft_get_result(InventoryItem **items)
defs[defs_init].item = new ToolItem("WBucket", 0);
defs_init++;
}
// Steel bucket
{
defs[defs_init].specs[3] = ItemSpec(ITEM_CRAFT, "steel_ingot");
defs[defs_init].specs[5] = ItemSpec(ITEM_CRAFT, "steel_ingot");
defs[defs_init].specs[6] = ItemSpec(ITEM_CRAFT, "steel_ingot");
defs[defs_init].specs[7] = ItemSpec(ITEM_CRAFT, "steel_ingot");
defs[defs_init].specs[8] = ItemSpec(ITEM_CRAFT, "steel_ingot");
defs[defs_init].item = new ToolItem("SteelBucket", 0);
defs_init++;
}
}
for (int i=0; i<defs_init; i++) {

View File

@ -37,6 +37,7 @@ void setStoneLikeDiggingProperties(DiggingPropertiesList &list, float toughness)
void setDirtLikeDiggingProperties(DiggingPropertiesList &list, float toughness);
void setWoodLikeDiggingProperties(DiggingPropertiesList &list, float toughness);
void setLeafLikeDiggingProperties(DiggingPropertiesList &list, float toughness);
void setWaterLikeDiggingProperties(DiggingPropertiesList &list, float toughness);
static void content_mapnode_nodebox_stair(ContentFeatures *f)
{
@ -1080,7 +1081,7 @@ void content_mapnode_init()
f->light_propagates = true;
f->walkable = false;
f->pointable = false;
f->diggable = false;
//f->diggable = false;
f->buildable_to = true;
f->liquid_type = LIQUID_SOURCE;
f->dug_item = std::string("MaterialItem2 ")+itos(i)+" 1";
@ -1106,6 +1107,7 @@ void content_mapnode_init()
f->special_atlas = pa_water1;
}
#endif
setWaterLikeDiggingProperties(f->digging_properties, 0.5);
i = CONTENT_LAVA;
f = &content_features(i);
@ -1182,7 +1184,7 @@ void content_mapnode_init()
f->light_source = LIGHT_MAX-1;
f->walkable = false;
f->pointable = false;
f->diggable = false;
//f->diggable = false;
f->buildable_to = true;
f->liquid_type = LIQUID_SOURCE;
f->dug_item = std::string("MaterialItem2 ")+itos(i)+" 1";
@ -1209,6 +1211,7 @@ void content_mapnode_init()
f->special_atlas = pa_lava1;
}
#endif
setWaterLikeDiggingProperties(f->digging_properties, 0.5);
i = CONTENT_TORCH;
f = &content_features(i);
@ -2766,4 +2769,14 @@ void setLeafLikeDiggingProperties(DiggingPropertiesList &list, float toughness)
DiggingProperties(true, 0.5*toughness, 65535./333.*toughness));
}
void setWaterLikeDiggingProperties(DiggingPropertiesList &list, float toughness)
{
list.set("",
DiggingProperties(true, 150000.0*toughness, 0));
list.set("WBucket",
DiggingProperties(true, 0.0, 65535./30.*toughness));
list.set("SteelBucket",
DiggingProperties(true, 0.0, 65535./80.*toughness));
}

View File

@ -113,5 +113,6 @@ void set_default_settings(Settings *settings)
settings->setDefault("server_map_save_interval", "1.238");
settings->setDefault("full_block_send_enable_min_time_from_building", "2.0");
settings->setDefault("enable_experimental", "false");
settings->setDefault("enable_lavabuckets", "false");
}

View File

@ -322,8 +322,23 @@ void getPointedNode(Client *client, v3f player_position,
try
{
n = client->getNode(v3s16(x,y,z));
if(content_pointable(n.getContent()) == false)
continue;
if(content_pointable(n.getContent()) == false) {
if (content_liquid_source(n.getContent()) == false)
continue;
const InventoryItem *wield = client->getLocalPlayer()->getWieldItem();
std::string wieldname;
if (
!wield
|| wield->getName() != std::string("ToolItem")
|| (wieldname = ((ToolItem*)wield)->getToolName()) == std::string("")
|| (
wieldname != std::string("SteelBucket")
&& wieldname != std::string("WBucket")
)
) {
continue;
}
}
}
catch(InvalidPositionException &e)
{

View File

@ -316,38 +316,47 @@ public:
}
#ifndef SERVER
std::string getBasename() const {
if(m_toolname == "WPick")
if (m_toolname == "WPick") {
return "tool_woodpick.png";
else if(m_toolname == "STPick")
}else if (m_toolname == "STPick") {
return "tool_stonepick.png";
else if(m_toolname == "SteelPick")
}else if (m_toolname == "SteelPick") {
return "tool_steelpick.png";
else if(m_toolname == "MesePick")
}else if (m_toolname == "MesePick") {
return "tool_mesepick.png";
else if(m_toolname == "WShovel")
}else if (m_toolname == "WShovel") {
return "tool_woodshovel.png";
else if(m_toolname == "STShovel")
}else if (m_toolname == "STShovel") {
return "tool_stoneshovel.png";
else if(m_toolname == "SteelShovel")
}else if (m_toolname == "SteelShovel") {
return "tool_steelshovel.png";
else if(m_toolname == "WAxe")
}else if (m_toolname == "WAxe") {
return "tool_woodaxe.png";
else if(m_toolname == "STAxe")
}else if (m_toolname == "STAxe") {
return "tool_stoneaxe.png";
else if(m_toolname == "SteelAxe")
}else if (m_toolname == "SteelAxe") {
return "tool_steelaxe.png";
else if(m_toolname == "WSword")
}else if (m_toolname == "WSword") {
return "tool_woodsword.png";
else if(m_toolname == "STSword")
}else if (m_toolname == "STSword") {
return "tool_stonesword.png";
else if(m_toolname == "SteelSword")
}else if (m_toolname == "SteelSword") {
return "tool_steelsword.png";
else if(m_toolname == "Shears")
}else if (m_toolname == "Shears") {
return "tool_shears.png";
else if(m_toolname == "WBucket")
}else if (m_toolname == "WBucket") {
return "tool_woodbucket.png";
else
}else if (m_toolname == "WBucket_water") {
return "tool_woodbucket_water.png";
}else if(m_toolname == "SteelBucket") {
return "tool_steelbucket.png";
}else if(m_toolname == "SteelBucket_water") {
return "tool_steelbucket_water.png";
}else if(m_toolname == "SteelBucket_lava") {
return "tool_steelbucket_lava.png";
}else{
return "cotton.png";
}
}
video::ITexture * getImage() const
@ -410,6 +419,14 @@ public:
return "Shears";
}else if(m_toolname == "WBucket") {
return "Wooden Bucket";
}else if(m_toolname == "WBucket_water") {
return "Wooden Bucket of Water";
}else if(m_toolname == "SteelBucket") {
return "Steel Bucket";
}else if(m_toolname == "SteelBucket_water") {
return "Steel Bucket of Water";
}else if(m_toolname == "SteelBucket_lava") {
return "Steel Bucket of Lava";
}
return "";

View File

@ -2582,7 +2582,7 @@ void Server::ProcessData(u8 *data, u32 datasize, u16 peer_id)
}
wield = player->getWieldItem();
std::string wieldname;
std::string wieldname("");
bool is_farm_swap = false;
// This is pretty much the entirety of farming
if (
@ -2751,6 +2751,45 @@ void Server::ProcessData(u8 *data, u32 datasize, u16 peer_id)
std::string dug_s = std::string("MaterialItem2 ")+itos(CONTENT_TRIMMED_LEAVES)+" 1";;
std::istringstream is(dug_s, std::ios::binary);
item = InventoryItem::deSerialize(is);
}else if (
material == CONTENT_WATERSOURCE
&& wield
&& wield->getName() == std::string("ToolItem")
&& (wieldname = ((ToolItem*)wield)->getToolName()) != std::string("")
&& (
wieldname == std::string("WBucket")
|| wieldname == std::string("SteelBucket")
)
) {
std::string dug_s = std::string("ToolItem ") + wieldname + "_water 1";
std::istringstream is(dug_s, std::ios::binary);
item = InventoryItem::deSerialize(is);
mlist->changeItem(item_i,item);
item = NULL;
UpdateCrafting(player->peer_id);
SendInventory(player->peer_id);
}else if (
material == CONTENT_LAVASOURCE
&& wield
&& wield->getName() == std::string("ToolItem")
&& (wieldname = ((ToolItem*)wield)->getToolName()) != std::string("")
&& (
wieldname == std::string("WBucket")
|| wieldname == std::string("SteelBucket")
)
) {
if (g_settings->getBool("enable_lavabuckets") == false || wieldname == std::string("WBucket")) {
mlist->deleteItem(item_i);
HandlePlayerHP(player,4);
}else{
std::string dug_s = std::string("ToolItem ") + wieldname + "_lava 1";
std::istringstream is(dug_s, std::ios::binary);
item = InventoryItem::deSerialize(is);
mlist->changeItem(item_i,item);
item = NULL;
}
UpdateCrafting(player->peer_id);
SendInventory(player->peer_id);
}else{
std::string &dug_s = content_features(material).dug_item;
if(dug_s != "")
@ -3076,6 +3115,108 @@ void Server::ProcessData(u8 *data, u32 datasize, u16 peer_id)
}
}*/
}else if (
item->getName() == std::string("ToolItem")
&& (
((ToolItem*)item)->getToolName() == std::string("WBucket_water")
|| ((ToolItem*)item)->getToolName() == std::string("SteelBucket_water")
|| ((ToolItem*)item)->getToolName() == std::string("SteelBucket_lava")
)
) {
MapNode n = m_env.getMap().getNodeNoEx(p_over);
std::string wieldname = ((ToolItem*)item)->getToolName();
if (
wieldname == std::string("WBucket_water")
|| wieldname == std::string("SteelBucket_water")
) {
if (ilist != NULL) {
std::string dug_s = std::string("ToolItem ");
if (wieldname == std::string("WBucket_water")) {
dug_s += "WBucket 1";
}else{
dug_s += "SteelBucket 1";
}
std::istringstream is(dug_s, std::ios::binary);
InventoryItem *item = InventoryItem::deSerialize(is);
ilist->changeItem(item_i,item);
UpdateCrafting(player->peer_id);
SendInventory(player->peer_id);
n.setContent(CONTENT_WATERSOURCE);
core::list<u16> far_players;
sendAddNode(p_over, n, 0, &far_players, 30);
/*
Add node.
This takes some time so it is done after the quick stuff
*/
core::map<v3s16, MapBlock*> modified_blocks;
{
MapEditEventIgnorer ign(&m_ignore_map_edit_events);
std::string p_name = std::string(player->getName());
m_env.getMap().addNodeAndUpdate(p_over, n, modified_blocks, p_name);
}
/*
Set blocks not sent to far players
*/
for(core::list<u16>::Iterator
i = far_players.begin();
i != far_players.end(); i++)
{
u16 peer_id = *i;
RemoteClient *client = getClient(peer_id);
if(client==NULL)
continue;
client->SetBlocksNotSent(modified_blocks);
}
}
}else if (wieldname == std::string("SteelBucket_lava")) {
if (ilist != NULL) {
if (g_settings->getBool("enable_lavabuckets")) {
std::string dug_s = std::string("ToolItem SteelBucket 1");
std::istringstream is(dug_s, std::ios::binary);
InventoryItem *item = InventoryItem::deSerialize(is);
ilist->changeItem(item_i,item);
UpdateCrafting(player->peer_id);
SendInventory(player->peer_id);
n.setContent(CONTENT_LAVASOURCE);
core::list<u16> far_players;
sendAddNode(p_over, n, 0, &far_players, 30);
/*
Add node.
This takes some time so it is done after the quick stuff
*/
core::map<v3s16, MapBlock*> modified_blocks;
{
MapEditEventIgnorer ign(&m_ignore_map_edit_events);
std::string p_name = std::string(player->getName());
m_env.getMap().addNodeAndUpdate(p_over, n, modified_blocks, p_name);
}
/*
Set blocks not sent to far players
*/
for(core::list<u16>::Iterator
i = far_players.begin();
i != far_players.end(); i++)
{
u16 peer_id = *i;
RemoteClient *client = getClient(peer_id);
if(client==NULL)
continue;
client->SetBlocksNotSent(modified_blocks);
}
}else{
ilist->deleteItem(item_i);
HandlePlayerHP(player,4);
UpdateCrafting(player->peer_id);
SendInventory(player->peer_id);
}
}
}
}
/*
Place other item (not a block)

View File

@ -117,6 +117,17 @@ std::string getTexturePath(const std::string &filename)
return fullpath;
std::string rel_path = std::string("textures")+DIR_DELIM+filename;
/*
Check from user data directory
*/
if(fullpath == "")
{
std::string testpath = porting::path_userdata + DIR_DELIM + rel_path;
// Check all filename extensions. Returns "" if not found.
fullpath = getImagePath(testpath);
}
/*
Check from data_path /textures
*/
@ -166,6 +177,17 @@ std::string getModelPath(const std::string &filename)
return fullpath;
std::string rel_path = std::string("models")+DIR_DELIM+filename;
/*
Check from user data directory
*/
if(fullpath == "")
{
std::string testpath = porting::path_userdata + DIR_DELIM + rel_path;
// Check all filename extensions. Returns "" if not found.
fullpath = getImagePath(testpath);
}
/*
Check from data_path /models
*/