forked from Mirrorlandia_minetest/minetest
added locking chests - clean patch
This commit is contained in:
parent
ae6d83a41e
commit
582e450bad
@ -85,5 +85,10 @@ Furnace metadata:
|
|||||||
Chest metadata:
|
Chest metadata:
|
||||||
TBD
|
TBD
|
||||||
|
|
||||||
|
Locking Chest metadata:
|
||||||
|
u16 string_len
|
||||||
|
u8[string_len] string
|
||||||
|
TBD
|
||||||
|
|
||||||
// END
|
// END
|
||||||
|
|
||||||
|
@ -1963,7 +1963,8 @@ void Client::addNode(v3s16 p, MapNode n)
|
|||||||
try
|
try
|
||||||
{
|
{
|
||||||
//TimeTaker timer3("Client::addNode(): addNodeAndUpdate");
|
//TimeTaker timer3("Client::addNode(): addNodeAndUpdate");
|
||||||
m_env.getMap().addNodeAndUpdate(p, n, modified_blocks);
|
std::string st = std::string("");
|
||||||
|
m_env.getMap().addNodeAndUpdate(p, n, modified_blocks, st);
|
||||||
}
|
}
|
||||||
catch(InvalidPositionException &e)
|
catch(InvalidPositionException &e)
|
||||||
{}
|
{}
|
||||||
|
@ -297,6 +297,24 @@ InventoryItem *craft_get_result(InventoryItem **items)
|
|||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
// Locking Chest
|
||||||
|
{
|
||||||
|
ItemSpec specs[9];
|
||||||
|
specs[0] = ItemSpec(ITEM_MATERIAL, CONTENT_WOOD);
|
||||||
|
specs[1] = ItemSpec(ITEM_MATERIAL, CONTENT_WOOD);
|
||||||
|
specs[2] = ItemSpec(ITEM_MATERIAL, CONTENT_WOOD);
|
||||||
|
specs[3] = ItemSpec(ITEM_MATERIAL, CONTENT_WOOD);
|
||||||
|
specs[4] = ItemSpec(ITEM_CRAFT, "steel_ingot");
|
||||||
|
specs[5] = ItemSpec(ITEM_MATERIAL, CONTENT_WOOD);
|
||||||
|
specs[6] = ItemSpec(ITEM_MATERIAL, CONTENT_WOOD);
|
||||||
|
specs[7] = ItemSpec(ITEM_MATERIAL, CONTENT_WOOD);
|
||||||
|
specs[8] = ItemSpec(ITEM_MATERIAL, CONTENT_WOOD);
|
||||||
|
if(checkItemCombination(items, specs))
|
||||||
|
{
|
||||||
|
return new MaterialItem(CONTENT_LOCKABLE_CHEST, 1);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
// Furnace
|
// Furnace
|
||||||
{
|
{
|
||||||
ItemSpec specs[9];
|
ItemSpec specs[9];
|
||||||
|
@ -573,6 +573,20 @@ void content_mapnode_init()
|
|||||||
f->initial_metadata = new ChestNodeMetadata();
|
f->initial_metadata = new ChestNodeMetadata();
|
||||||
setWoodLikeDiggingProperties(f->digging_properties, 1.0);
|
setWoodLikeDiggingProperties(f->digging_properties, 1.0);
|
||||||
|
|
||||||
|
i = CONTENT_LOCKABLE_CHEST;
|
||||||
|
f = &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_lock.png"); // Z-
|
||||||
|
f->setInventoryTexture("chest_lock.png");
|
||||||
|
//f->setInventoryTextureCube("chest_top.png", "chest_side.png", "chest_side.png");
|
||||||
|
f->dug_item = std::string("MaterialItem2 ")+itos(i)+" 1";
|
||||||
|
if(f->initial_metadata == NULL)
|
||||||
|
f->initial_metadata = new LockingChestNodeMetadata();
|
||||||
|
setWoodLikeDiggingProperties(f->digging_properties, 1.0);
|
||||||
|
|
||||||
i = CONTENT_FURNACE;
|
i = CONTENT_FURNACE;
|
||||||
f = &content_features(i);
|
f = &content_features(i);
|
||||||
f->param_type = CPT_FACEDIR_SIMPLE;
|
f->param_type = CPT_FACEDIR_SIMPLE;
|
||||||
|
@ -48,6 +48,7 @@ MapNode mapnode_translate_to_internal(MapNode n_from, u8 version);
|
|||||||
#define CONTENT_SIGN_WALL 14
|
#define CONTENT_SIGN_WALL 14
|
||||||
#define CONTENT_CHEST 15
|
#define CONTENT_CHEST 15
|
||||||
#define CONTENT_FURNACE 16
|
#define CONTENT_FURNACE 16
|
||||||
|
#define CONTENT_LOCKABLE_CHEST 17
|
||||||
|
|
||||||
#define CONTENT_FENCE 21
|
#define CONTENT_FENCE 21
|
||||||
|
|
||||||
|
@ -117,6 +117,70 @@ std::string ChestNodeMetadata::getInventoryDrawSpecString()
|
|||||||
"list[current_player;main;0,5;8,4;]";
|
"list[current_player;main;0,5;8,4;]";
|
||||||
}
|
}
|
||||||
|
|
||||||
|
/*
|
||||||
|
LockingChestNodeMetadata
|
||||||
|
*/
|
||||||
|
|
||||||
|
// Prototype
|
||||||
|
LockingChestNodeMetadata proto_LockingChestNodeMetadata;
|
||||||
|
|
||||||
|
LockingChestNodeMetadata::LockingChestNodeMetadata()
|
||||||
|
{
|
||||||
|
NodeMetadata::registerType(typeId(), create);
|
||||||
|
|
||||||
|
m_inventory = new Inventory();
|
||||||
|
m_inventory->addList("0", 8*4);
|
||||||
|
}
|
||||||
|
LockingChestNodeMetadata::~LockingChestNodeMetadata()
|
||||||
|
{
|
||||||
|
delete m_inventory;
|
||||||
|
}
|
||||||
|
u16 LockingChestNodeMetadata::typeId() const
|
||||||
|
{
|
||||||
|
return CONTENT_LOCKABLE_CHEST;
|
||||||
|
}
|
||||||
|
NodeMetadata* LockingChestNodeMetadata::create(std::istream &is)
|
||||||
|
{
|
||||||
|
LockingChestNodeMetadata *d = new LockingChestNodeMetadata();
|
||||||
|
d->setOwner(deSerializeString(is));
|
||||||
|
d->m_inventory->deSerialize(is);
|
||||||
|
return d;
|
||||||
|
}
|
||||||
|
NodeMetadata* LockingChestNodeMetadata::clone()
|
||||||
|
{
|
||||||
|
LockingChestNodeMetadata *d = new LockingChestNodeMetadata();
|
||||||
|
*d->m_inventory = *m_inventory;
|
||||||
|
return d;
|
||||||
|
}
|
||||||
|
void LockingChestNodeMetadata::serializeBody(std::ostream &os)
|
||||||
|
{
|
||||||
|
os<<serializeString(m_text);
|
||||||
|
m_inventory->serialize(os);
|
||||||
|
}
|
||||||
|
std::string LockingChestNodeMetadata::infoText()
|
||||||
|
{
|
||||||
|
return "Locking Chest";
|
||||||
|
}
|
||||||
|
bool LockingChestNodeMetadata::nodeRemovalDisabled()
|
||||||
|
{
|
||||||
|
/*
|
||||||
|
Disable removal if chest contains something
|
||||||
|
*/
|
||||||
|
InventoryList *list = m_inventory->getList("0");
|
||||||
|
if(list == NULL)
|
||||||
|
return false;
|
||||||
|
if(list->getUsedSlots() == 0)
|
||||||
|
return false;
|
||||||
|
return true;
|
||||||
|
}
|
||||||
|
std::string LockingChestNodeMetadata::getInventoryDrawSpecString()
|
||||||
|
{
|
||||||
|
return
|
||||||
|
"invsize[8,9;]"
|
||||||
|
"list[current_name;0;0,0;8,4;]"
|
||||||
|
"list[current_player;main;0,5;8,4;]";
|
||||||
|
}
|
||||||
|
|
||||||
/*
|
/*
|
||||||
FurnaceNodeMetadata
|
FurnaceNodeMetadata
|
||||||
*/
|
*/
|
||||||
|
@ -62,6 +62,29 @@ private:
|
|||||||
Inventory *m_inventory;
|
Inventory *m_inventory;
|
||||||
};
|
};
|
||||||
|
|
||||||
|
class LockingChestNodeMetadata : public NodeMetadata
|
||||||
|
{
|
||||||
|
public:
|
||||||
|
LockingChestNodeMetadata();
|
||||||
|
~LockingChestNodeMetadata();
|
||||||
|
|
||||||
|
virtual u16 typeId() const;
|
||||||
|
static NodeMetadata* create(std::istream &is);
|
||||||
|
virtual NodeMetadata* clone();
|
||||||
|
virtual void serializeBody(std::ostream &os);
|
||||||
|
virtual std::string infoText();
|
||||||
|
virtual Inventory* getInventory() {return m_inventory;}
|
||||||
|
virtual bool nodeRemovalDisabled();
|
||||||
|
virtual std::string getInventoryDrawSpecString();
|
||||||
|
|
||||||
|
std::string getOwner(){ return m_text; }
|
||||||
|
void setOwner(std::string t){ m_text = t; }
|
||||||
|
|
||||||
|
private:
|
||||||
|
Inventory *m_inventory;
|
||||||
|
std::string m_text;
|
||||||
|
};
|
||||||
|
|
||||||
class FurnaceNodeMetadata : public NodeMetadata
|
class FurnaceNodeMetadata : public NodeMetadata
|
||||||
{
|
{
|
||||||
public:
|
public:
|
||||||
|
19
src/map.cpp
19
src/map.cpp
@ -28,6 +28,8 @@ with this program; if not, write to the Free Software Foundation, Inc.,
|
|||||||
#include "porting.h"
|
#include "porting.h"
|
||||||
#include "mapgen.h"
|
#include "mapgen.h"
|
||||||
#include "nodemetadata.h"
|
#include "nodemetadata.h"
|
||||||
|
#include "content_nodemeta.h"
|
||||||
|
#include "content_mapnode.h"
|
||||||
|
|
||||||
/*
|
/*
|
||||||
SQLite format specification:
|
SQLite format specification:
|
||||||
@ -890,7 +892,7 @@ void Map::updateLighting(core::map<v3s16, MapBlock*> & a_blocks,
|
|||||||
/*
|
/*
|
||||||
*/
|
*/
|
||||||
void Map::addNodeAndUpdate(v3s16 p, MapNode n,
|
void Map::addNodeAndUpdate(v3s16 p, MapNode n,
|
||||||
core::map<v3s16, MapBlock*> &modified_blocks)
|
core::map<v3s16, MapBlock*> &modified_blocks, std::string &player_name)
|
||||||
{
|
{
|
||||||
/*PrintInfo(m_dout);
|
/*PrintInfo(m_dout);
|
||||||
m_dout<<DTIME<<"Map::addNodeAndUpdate(): p=("
|
m_dout<<DTIME<<"Map::addNodeAndUpdate(): p=("
|
||||||
@ -1014,8 +1016,20 @@ void Map::addNodeAndUpdate(v3s16 p, MapNode n,
|
|||||||
if(meta_proto)
|
if(meta_proto)
|
||||||
{
|
{
|
||||||
NodeMetadata *meta = meta_proto->clone();
|
NodeMetadata *meta = meta_proto->clone();
|
||||||
|
/* lockable chest, insert the owner's name */
|
||||||
|
if (meta->typeId() == CONTENT_LOCKABLE_CHEST)
|
||||||
|
{
|
||||||
|
LockingChestNodeMetadata *lcm = (LockingChestNodeMetadata*)meta;
|
||||||
|
lcm->setOwner(player_name);
|
||||||
|
}
|
||||||
setNodeMetadata(p, meta);
|
setNodeMetadata(p, meta);
|
||||||
}
|
}
|
||||||
|
else if (n.getContent() == CONTENT_LOCKABLE_CHEST)
|
||||||
|
{
|
||||||
|
LockingChestNodeMetadata *lcm = new LockingChestNodeMetadata();
|
||||||
|
lcm->setOwner(player_name);
|
||||||
|
setNodeMetadata(p, (NodeMetadata*)lcm);
|
||||||
|
}
|
||||||
|
|
||||||
/*
|
/*
|
||||||
If node is under sunlight and doesn't let sunlight through,
|
If node is under sunlight and doesn't let sunlight through,
|
||||||
@ -1290,7 +1304,8 @@ bool Map::addNodeWithEvent(v3s16 p, MapNode n)
|
|||||||
bool succeeded = true;
|
bool succeeded = true;
|
||||||
try{
|
try{
|
||||||
core::map<v3s16, MapBlock*> modified_blocks;
|
core::map<v3s16, MapBlock*> modified_blocks;
|
||||||
addNodeAndUpdate(p, n, modified_blocks);
|
std::string st = std::string("");
|
||||||
|
addNodeAndUpdate(p, n, modified_blocks, st);
|
||||||
|
|
||||||
// Copy modified_blocks to event
|
// Copy modified_blocks to event
|
||||||
for(core::map<v3s16, MapBlock*>::Iterator
|
for(core::map<v3s16, MapBlock*>::Iterator
|
||||||
|
@ -205,7 +205,7 @@ public:
|
|||||||
These handle lighting but not faces.
|
These handle lighting but not faces.
|
||||||
*/
|
*/
|
||||||
void addNodeAndUpdate(v3s16 p, MapNode n,
|
void addNodeAndUpdate(v3s16 p, MapNode n,
|
||||||
core::map<v3s16, MapBlock*> &modified_blocks);
|
core::map<v3s16, MapBlock*> &modified_blocks, std::string &player_name);
|
||||||
void removeNodeAndUpdate(v3s16 p,
|
void removeNodeAndUpdate(v3s16 p,
|
||||||
core::map<v3s16, MapBlock*> &modified_blocks);
|
core::map<v3s16, MapBlock*> &modified_blocks);
|
||||||
|
|
||||||
|
@ -2873,7 +2873,8 @@ void Server::ProcessData(u8 *data, u32 datasize, u16 peer_id)
|
|||||||
{
|
{
|
||||||
MapEditEventIgnorer ign(&m_ignore_map_edit_events);
|
MapEditEventIgnorer ign(&m_ignore_map_edit_events);
|
||||||
|
|
||||||
m_env.getMap().addNodeAndUpdate(p_over, n, modified_blocks);
|
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
|
Set blocks not sent to far players
|
||||||
@ -3200,7 +3201,46 @@ void Server::ProcessData(u8 *data, u32 datasize, u16 peer_id)
|
|||||||
}
|
}
|
||||||
// Disallow moving items if not allowed to build
|
// Disallow moving items if not allowed to build
|
||||||
else if((getPlayerPrivs(player) & PRIV_BUILD) == 0)
|
else if((getPlayerPrivs(player) & PRIV_BUILD) == 0)
|
||||||
|
{
|
||||||
return;
|
return;
|
||||||
|
}
|
||||||
|
// if it's a locking chest, only allow the owner or server admins to move items
|
||||||
|
else if (ma->from_inv != "current_player" && (getPlayerPrivs(player) & PRIV_SERVER) == 0)
|
||||||
|
{
|
||||||
|
Strfnd fn(ma->from_inv);
|
||||||
|
std::string id0 = fn.next(":");
|
||||||
|
if(id0 == "nodemeta")
|
||||||
|
{
|
||||||
|
v3s16 p;
|
||||||
|
p.X = stoi(fn.next(","));
|
||||||
|
p.Y = stoi(fn.next(","));
|
||||||
|
p.Z = stoi(fn.next(","));
|
||||||
|
NodeMetadata *meta = m_env.getMap().getNodeMetadata(p);
|
||||||
|
if(meta && meta->typeId() == CONTENT_LOCKABLE_CHEST) {
|
||||||
|
LockingChestNodeMetadata *lcm = (LockingChestNodeMetadata*)meta;
|
||||||
|
if (lcm->getOwner() != player->getName())
|
||||||
|
return;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
else if (ma->to_inv != "current_player" && (getPlayerPrivs(player) & PRIV_SERVER) == 0)
|
||||||
|
{
|
||||||
|
Strfnd fn(ma->to_inv);
|
||||||
|
std::string id0 = fn.next(":");
|
||||||
|
if(id0 == "nodemeta")
|
||||||
|
{
|
||||||
|
v3s16 p;
|
||||||
|
p.X = stoi(fn.next(","));
|
||||||
|
p.Y = stoi(fn.next(","));
|
||||||
|
p.Z = stoi(fn.next(","));
|
||||||
|
NodeMetadata *meta = m_env.getMap().getNodeMetadata(p);
|
||||||
|
if(meta && meta->typeId() == CONTENT_LOCKABLE_CHEST) {
|
||||||
|
LockingChestNodeMetadata *lcm = (LockingChestNodeMetadata*)meta;
|
||||||
|
if (lcm->getOwner() != player->getName())
|
||||||
|
return;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
if(disable_action == false)
|
if(disable_action == false)
|
||||||
|
Loading…
Reference in New Issue
Block a user