barrels pt1

master
darkrose 2017-07-20 04:48:35 +10:00
parent 03c6b535e6
commit ec7ee57309
9 changed files with 371 additions and 13 deletions

View File

@ -42,12 +42,6 @@
#include "intl.h"
#include "content_burntimes.h"
#define WATER_ALPHA 160
#define WATER_VISC 1
#define LAVA_VISC 7
MapNode mapnode_translate_from_internal(MapNode n_from, u8 version)
{
return n_from;

View File

@ -42,6 +42,10 @@ void content_mapnode_plants(bool repeat);
MapNode mapnode_translate_from_internal(MapNode n_from, u8 version);
MapNode mapnode_translate_to_internal(MapNode n_from, u8 version);
#define WATER_ALPHA 160
#define WATER_VISC 1
#define LAVA_VISC 7
/*
Node content type IDs
Range: 0x0 - 0xFFF
@ -116,7 +120,11 @@ MapNode mapnode_translate_to_internal(MapNode n_from, u8 version);
#define CONTENT_APPLE_FENCE 0x03F
#define CONTENT_BUSH_BLUEBERRY 0x040
#define CONTENT_BUSH_RASPBERRY 0x041
// FREE 0x042-0x07C
#define CONTENT_WOOD_BARREL 0x042
#define CONTENT_APPLEWOOD_BARREL 0x043
#define CONTENT_JUNGLEWOOD_BARREL 0x044
#define CONTENT_PINE_BARREL 0x045
// FREE 0x046-0x07C
// 0x7D-0x7F reserved values, air, ignore, etc
#define CONTENT_CHAIR_CENTRE 0x080
#define CONTENT_CHAIR_ENDL 0x081

View File

@ -979,6 +979,102 @@ void content_mapnode_special(bool repeat)
f->initial_metadata = new ReverseCraftGuideNodeMetadata();
f->sound_access = "open-book";
i = CONTENT_WOOD_BARREL;
f = &content_features(i);
f->description = gettext("Wood Barrel");
f->setAllTextures("wood.png^[transformR90");
f->setAllMetaTextures("water.png",WATER_ALPHA);
f->param_type = CPT_LIGHT;
f->draw_type = CDT_NODEBOX_META;
f->rotate_tile_with_nodebox = true;
f->light_propagates = true;
f->air_equivalent = true;
f->flammable = 1;
f->dug_item = std::string("MaterialItem2 ")+itos(i)+" 1";
content_nodebox_barrel(f);
f->setInventoryTextureNodeBox(i,"wood.png","wood.png^[transformR90","wood.png^[transformR90");
f->type = CMT_WOOD;
f->dig_time = 1.0;
f->pressure_type = CST_SOLID;
f->suffocation_per_second = 0;
if (f->initial_metadata == NULL)
f->initial_metadata = new BarrelNodeMetadata();
crafting::setURecipe(CONTENT_WOOD,i);
content_list_add("craftguide",i,1,0);
content_list_add("creative",i,1,0);
i = CONTENT_APPLEWOOD_BARREL;
f = &content_features(i);
f->description = gettext("Applewood Barrel");
f->setAllTextures("applewood.png^[transformR90");
f->setAllMetaTextures("water.png",WATER_ALPHA);
f->param_type = CPT_LIGHT;
f->draw_type = CDT_NODEBOX_META;
f->rotate_tile_with_nodebox = true;
f->light_propagates = true;
f->air_equivalent = true;
f->flammable = 1;
f->dug_item = std::string("MaterialItem2 ")+itos(i)+" 1";
content_nodebox_barrel(f);
f->setInventoryTextureNodeBox(i,"applewood.png","applewood.png^[transformR90","applewood.png^[transformR90");
f->type = CMT_WOOD;
f->dig_time = 1.0;
f->pressure_type = CST_SOLID;
f->suffocation_per_second = 0;
if (f->initial_metadata == NULL)
f->initial_metadata = new BarrelNodeMetadata();
crafting::setURecipe(CONTENT_APPLEWOOD,i);
content_list_add("craftguide",i,1,0);
content_list_add("creative",i,1,0);
i = CONTENT_JUNGLEWOOD_BARREL;
f = &content_features(i);
f->description = gettext("Junglewood Barrel");
f->setAllTextures("junglewood.png^[transformR90");
f->setAllMetaTextures("water.png",WATER_ALPHA);
f->param_type = CPT_LIGHT;
f->draw_type = CDT_NODEBOX_META;
f->rotate_tile_with_nodebox = true;
f->light_propagates = true;
f->air_equivalent = true;
f->flammable = 1;
f->dug_item = std::string("MaterialItem2 ")+itos(i)+" 1";
content_nodebox_barrel(f);
f->setInventoryTextureNodeBox(i,"junglewood.png","junglewood.png^[transformR90","junglewood.png^[transformR90");
f->type = CMT_WOOD;
f->dig_time = 1.0;
f->pressure_type = CST_SOLID;
f->suffocation_per_second = 0;
if (f->initial_metadata == NULL)
f->initial_metadata = new BarrelNodeMetadata();
crafting::setURecipe(CONTENT_JUNGLEWOOD,i);
content_list_add("craftguide",i,1,0);
content_list_add("creative",i,1,0);
i = CONTENT_PINE_BARREL;
f = &content_features(i);
f->description = gettext("Pine Barrel");
f->setAllTextures("pine.png^[transformR90");
f->setAllMetaTextures("water.png",WATER_ALPHA);
f->param_type = CPT_LIGHT;
f->draw_type = CDT_NODEBOX_META;
f->rotate_tile_with_nodebox = true;
f->light_propagates = true;
f->air_equivalent = true;
f->flammable = 1;
f->dug_item = std::string("MaterialItem2 ")+itos(i)+" 1";
content_nodebox_barrel(f);
f->setInventoryTextureNodeBox(i,"pine.png","pine.png^[transformR90","pine.png^[transformR90");
f->type = CMT_WOOD;
f->dig_time = 1.0;
f->pressure_type = CST_SOLID;
f->suffocation_per_second = 0;
if (f->initial_metadata == NULL)
f->initial_metadata = new BarrelNodeMetadata();
crafting::setURecipe(CONTENT_WOOD_PINE,i);
content_list_add("craftguide",i,1,0);
content_list_add("creative",i,1,0);
i = CONTENT_FIRE;
f = &content_features(i);
f->description = gettext("Fire");

View File

@ -13,11 +13,6 @@
#include "tile.h"
#endif
#define WATER_ALPHA 160
#define WATER_VISC 1
#define LAVA_VISC 7
void content_nodedef_knob(content_t nodeid, content_t source_node, ContentMaterialType material_type, const char* texture, char* desc)
{
ContentFeatures *features = &content_features(nodeid);

View File

@ -2223,3 +2223,45 @@ void content_nodebox_snowman(ContentFeatures *f)
-0.5*BS,-0.0625*BS,-0.0625*BS,0.5*BS,0.*BS,0.*BS
));
}
void content_nodebox_barrel(ContentFeatures *f)
{
f->setNodeBox(NodeBox(
-0.375*BS,-0.5*BS,-0.375*BS,-0.3125*BS,0.4375*BS,0.375*BS
));
f->addNodeBox(NodeBox(
0.3125*BS,-0.5*BS,-0.375*BS,0.375*BS,0.4375*BS,0.375*BS
));
f->addNodeBox(NodeBox(
-0.3125*BS,-0.5*BS,-0.375*BS,0.3125*BS,0.4375*BS,-0.3125*BS
));
f->addNodeBox(NodeBox(
-0.3125*BS,-0.5*BS,0.3125*BS,0.3125*BS,0.4375*BS,0.375*BS
));
f->addNodeBox(NodeBox(
-0.3125*BS,-0.4375*BS,-0.3125*BS,0.3125*BS,-0.375*BS,0.3125*BS
));
}
void content_nodebox_barrel_sealed(ContentFeatures *f)
{
f->setNodeBox(NodeBox(
-0.375*BS,-0.5*BS,-0.375*BS,-0.3125*BS,0.4375*BS,0.375*BS
));
f->addNodeBox(NodeBox(
0.3125*BS,-0.5*BS,-0.375*BS,0.375*BS,0.4375*BS,0.375*BS
));
f->addNodeBox(NodeBox(
-0.3125*BS,-0.5*BS,-0.375*BS,0.3125*BS,0.4375*BS,-0.3125*BS
));
f->addNodeBox(NodeBox(
-0.3125*BS,-0.5*BS,0.3125*BS,0.3125*BS,0.4375*BS,0.375*BS
));
f->addNodeBox(NodeBox(
-0.3125*BS,-0.4375*BS,-0.3125*BS,0.3125*BS,-0.375*BS,0.3125*BS
));
f->addNodeBox(NodeBox(
-0.3125*BS,0.3125*BS,-0.3125*BS,0.3125*BS,0.375*BS,0.3125*BS
));
}

View File

@ -102,5 +102,7 @@ void content_nodebox_rail(ContentFeatures *f);
void content_nodebox_chest(ContentFeatures *f);
void content_nodebox_glass_pane(ContentFeatures *f);
void content_nodebox_snowman(ContentFeatures *f);
void content_nodebox_barrel(ContentFeatures *f);
void content_nodebox_barrel_sealed(ContentFeatures *f);
#endif

View File

@ -297,6 +297,25 @@ private:
Inventory *m_inventory;
};
class BarrelNodeMetadata : public NodeMetadata
{
public:
BarrelNodeMetadata();
~BarrelNodeMetadata();
virtual u16 typeId() const;
static NodeMetadata* create(std::istream &is);
virtual NodeMetadata* clone();
virtual void serializeBody(std::ostream &os);
virtual std::wstring infoText();
virtual bool nodeRemovalDisabled();
virtual std::vector<NodeBox> getNodeBoxes(MapNode &n);
virtual bool import(NodeMetadata *meta);
uint8_t m_water_level;
};
class BorderStoneNodeMetadata : public NodeMetadata
{
public:

View File

@ -336,3 +336,86 @@ std::string ChestNodeMetadata::getInventoryOwner()
return m_owner;
return "";
}
/*
BarrelNodeMetadata
*/
// Prototype
BarrelNodeMetadata proto_BarrelNodeMetadata;
BarrelNodeMetadata::BarrelNodeMetadata()
{
NodeMetadata::registerType(typeId(), create);
m_water_level = 0;
}
BarrelNodeMetadata::~BarrelNodeMetadata()
{
}
u16 BarrelNodeMetadata::typeId() const
{
return CONTENT_WOOD_BARREL;
}
NodeMetadata* BarrelNodeMetadata::create(std::istream &is)
{
std::string s;
BarrelNodeMetadata *d = new BarrelNodeMetadata();
s = deSerializeString(is);
d->m_water_level = mystoi(s);
return d;
}
NodeMetadata* BarrelNodeMetadata::clone()
{
BarrelNodeMetadata *d = new BarrelNodeMetadata();
d->m_water_level = m_water_level;
return d;
}
void BarrelNodeMetadata::serializeBody(std::ostream &os)
{
os<<serializeString(itos(m_water_level));
}
std::wstring BarrelNodeMetadata::infoText()
{
char buff[1024];
if (!m_water_level)
return narrow_to_wide(gettext("Barrel is empty"));
if (m_water_level > 9)
return narrow_to_wide(gettext("Barrel is full"));
if (snprintf(buff,1024,gettext("Barrel is %u%% full"),m_water_level*10) < 1024)
return narrow_to_wide(buff);
return narrow_to_wide(gettext("Barrel"));
}
bool BarrelNodeMetadata::nodeRemovalDisabled()
{
if (!m_water_level)
return false;
return true;
}
std::vector<NodeBox> BarrelNodeMetadata::getNodeBoxes(MapNode &n)
{
std::vector<NodeBox> boxes;
if (m_water_level) {
float h = -0.375+(0.0625*(float)m_water_level);
boxes.push_back(NodeBox(
-0.3125*BS,-0.375*BS,-0.3125*BS,0.3125*BS,h*BS,0.3125*BS
));
}
return boxes;
}
bool BarrelNodeMetadata::import(NodeMetadata *meta)
{
if (meta->typeId() != CONTENT_WOOD_BARREL)
return false;
BarrelNodeMetadata *l = (BarrelNodeMetadata*)meta;
m_water_level = l->m_water_level;
return true;
}

View File

@ -2790,12 +2790,83 @@ void Server::ProcessData(u8 *data, u32 datasize, u16 peer_id)
meta->energise(energy,p_under,p_under,p_under);
}
}
}else if (
selected_content == CONTENT_WOOD_BARREL
|| selected_content == CONTENT_APPLEWOOD_BARREL
|| selected_content == CONTENT_JUNGLEWOOD_BARREL
|| selected_content == CONTENT_PINE_BARREL
) {
BarrelNodeMetadata *bmeta = (BarrelNodeMetadata*)m_env.getMap().getNodeMetadata(p_under);
if (!bmeta)
return;
if (wielded_tool_features.type == TT_BUCKET) {
if (bmeta->m_water_level) {
std::string dug_s = std::string("ToolItem ");
dug_s += ((ToolItem*)wielditem)->getToolName();
dug_s += "_water 1";
std::istringstream is(dug_s, std::ios::binary);
InventoryItem *item = InventoryItem::deSerialize(is);
InventoryList *mlist = player->inventory.getList("main");
InventoryItem *ritem = mlist->changeItem(item_i,item);
if (ritem)
delete ritem;
item = NULL;
bmeta->m_water_level--;
SendInventory(player->peer_id);
v3s16 blockpos = getNodeBlockPos(p_under);
MapBlock *block = m_env.getMap().getBlockNoCreateNoEx(blockpos);
if (!block)
return;
block->setChangedFlag();
core::map<v3s16, MapBlock*> modified_blocks;
modified_blocks.insert(block->getPos(),block);
for(core::map<u16, RemoteClient*>::Iterator
i = m_clients.getIterator();
i.atEnd()==false; i++)
{
RemoteClient *client = i.getNode()->getValue();
client->SetBlocksNotSent(modified_blocks);
client->SetBlockNotSent(blockpos);
}
}
}else if (wielded_tool_features.type == TT_SPECIAL) {
if (
bmeta->m_water_level < 10
&& wielded_tool_features.onplace_node == CONTENT_WATERSOURCE
&& wielded_tool_features.onplace_replace_item != CONTENT_IGNORE
) {
InventoryItem *itm = InventoryItem::create(wielded_tool_features.onplace_replace_item,1,0);
InventoryList *mlist = player->inventory.getList("main");
InventoryItem *old = mlist->changeItem(item_i,itm);
if (old)
delete old;
bmeta->m_water_level++;
SendInventory(player->peer_id);
v3s16 blockpos = getNodeBlockPos(p_under);
MapBlock *block = m_env.getMap().getBlockNoCreateNoEx(blockpos);
if (!block)
return;
block->setChangedFlag();
core::map<v3s16, MapBlock*> modified_blocks;
modified_blocks.insert(block->getPos(),block);
for(core::map<u16, RemoteClient*>::Iterator
i = m_clients.getIterator();
i.atEnd()==false; i++)
{
RemoteClient *client = i.getNode()->getValue();
client->SetBlocksNotSent(modified_blocks);
client->SetBlockNotSent(blockpos);
}
}
}
}else if (selected_content == CONTENT_CAULDRON) {
CauldronNodeMetadata *cmeta = (CauldronNodeMetadata*)m_env.getMap().getNodeMetadata(p_under);
if (!cmeta)
return;
if (wielded_tool_features.type == TT_BUCKET) {
if (cmeta->m_water_level) {
if (cmeta->m_water_level == 4) {
}
}else if (wielded_tool_features.type == TT_SPECIAL) {
if (
@ -2810,6 +2881,22 @@ void Server::ProcessData(u8 *data, u32 datasize, u16 peer_id)
delete old;
cmeta->m_water_level = 4;
SendInventory(player->peer_id);
v3s16 blockpos = getNodeBlockPos(p_under);
MapBlock *block = m_env.getMap().getBlockNoCreateNoEx(blockpos);
if (!block)
return;
block->setChangedFlag();
core::map<v3s16, MapBlock*> modified_blocks;
modified_blocks.insert(block->getPos(),block);
for(core::map<u16, RemoteClient*>::Iterator
i = m_clients.getIterator();
i.atEnd()==false; i++)
{
RemoteClient *client = i.getNode()->getValue();
client->SetBlocksNotSent(modified_blocks);
client->SetBlockNotSent(blockpos);
}
}
}else if (wieldcontent == CONTENT_CRAFTITEM_IRON_BOTTLE) {
if (cmeta->m_water_level && cmeta->m_water_hot && wielditem->getCount() == 1) {
@ -2820,6 +2907,22 @@ void Server::ProcessData(u8 *data, u32 datasize, u16 peer_id)
delete old;
cmeta->m_water_level--;
SendInventory(player->peer_id);
v3s16 blockpos = getNodeBlockPos(p_under);
MapBlock *block = m_env.getMap().getBlockNoCreateNoEx(blockpos);
if (!block)
return;
block->setChangedFlag();
core::map<v3s16, MapBlock*> modified_blocks;
modified_blocks.insert(block->getPos(),block);
for(core::map<u16, RemoteClient*>::Iterator
i = m_clients.getIterator();
i.atEnd()==false; i++)
{
RemoteClient *client = i.getNode()->getValue();
client->SetBlocksNotSent(modified_blocks);
client->SetBlockNotSent(blockpos);
}
}
}else if (wieldcontent == CONTENT_CRAFTITEM_GLASS_BOTTLE) {
if (cmeta->m_water_level && cmeta->m_water_heated && !cmeta->m_water_hot && wielditem->getCount() == 1) {
@ -2830,6 +2933,22 @@ void Server::ProcessData(u8 *data, u32 datasize, u16 peer_id)
delete old;
cmeta->m_water_level--;
SendInventory(player->peer_id);
v3s16 blockpos = getNodeBlockPos(p_under);
MapBlock *block = m_env.getMap().getBlockNoCreateNoEx(blockpos);
if (!block)
return;
block->setChangedFlag();
core::map<v3s16, MapBlock*> modified_blocks;
modified_blocks.insert(block->getPos(),block);
for(core::map<u16, RemoteClient*>::Iterator
i = m_clients.getIterator();
i.atEnd()==false; i++)
{
RemoteClient *client = i.getNode()->getValue();
client->SetBlocksNotSent(modified_blocks);
client->SetBlockNotSent(blockpos);
}
}
}
}else if (selected_content == CONTENT_INCINERATOR) {