borderstone part 2

This commit is contained in:
darkrose 2013-06-22 17:09:25 +10:00
parent 101631d55f
commit 8ed9678852
7 changed files with 120 additions and 2 deletions

View File

@ -137,6 +137,8 @@
#default_privs = build, shout
# enable a static spawnpoint (default unset)
#static_spawnpoint = (0,0,0)
# the protection radius of borderstone
#borderstone_radius = 5
# Profiler data print interval. #0 = disable.
#profiler_print_interval = 0

View File

@ -107,7 +107,7 @@ struct CraftDef {
*/
InventoryItem *craft_get_result(InventoryItem **items)
{
static CraftDef defs[32];
static CraftDef defs[33];
static int defs_init = 0;
// only initialise (and hence allocate) these once

View File

@ -345,9 +345,11 @@ void content_mapnode_init()
i = CONTENT_BORDERSTONE;
f = &content_features(i);
f->setAllTextures("borderstone.png");
f->setInventoryTextureCube("morderstone.png", "borderstone.png", "borderstone.png");
f->setInventoryTextureCube("borderstone.png", "borderstone.png", "borderstone.png");
f->is_ground_content = true;
f->dug_item = std::string("MaterialItem2 ")+itos(i)+" 1";
if(f->initial_metadata == NULL)
f->initial_metadata = new BorderStoneNodeMetadata();
setStoneLikeDiggingProperties(f->digging_properties, 2.0);
i = CONTENT_WOOD;

View File

@ -182,6 +182,44 @@ std::string LockingChestNodeMetadata::getInventoryDrawSpecString()
"list[current_player;main;0,5;8,4;]";
}
/*
BorderStoneNodeMetadata
*/
// Prototype
BorderStoneNodeMetadata proto_BorderStoneNodeMetadata;
BorderStoneNodeMetadata::BorderStoneNodeMetadata()
{
NodeMetadata::registerType(typeId(), create);
}
BorderStoneNodeMetadata::~BorderStoneNodeMetadata()
{
}
u16 BorderStoneNodeMetadata::typeId() const
{
return CONTENT_BORDERSTONE;
}
NodeMetadata* BorderStoneNodeMetadata::create(std::istream &is)
{
BorderStoneNodeMetadata *d = new BorderStoneNodeMetadata();
d->setOwner(deSerializeString(is));
return d;
}
NodeMetadata* BorderStoneNodeMetadata::clone()
{
BorderStoneNodeMetadata *d = new BorderStoneNodeMetadata();
return d;
}
void BorderStoneNodeMetadata::serializeBody(std::ostream &os)
{
os<<serializeString(m_text);
}
std::string BorderStoneNodeMetadata::infoText()
{
return std::string("Border Stone owned by '")+m_text+"'";
}
/*
FurnaceNodeMetadata
*/

View File

@ -85,6 +85,25 @@ private:
std::string m_text;
};
class BorderStoneNodeMetadata : public NodeMetadata
{
public:
BorderStoneNodeMetadata();
~BorderStoneNodeMetadata();
virtual u16 typeId() const;
static NodeMetadata* create(std::istream &is);
virtual NodeMetadata* clone();
virtual void serializeBody(std::ostream &os);
virtual std::string infoText();
virtual std::string getOwner(){ return m_text; }
virtual void setOwner(std::string t){ m_text = t; }
private:
std::string m_text;
};
class FurnaceNodeMetadata : public NodeMetadata
{
public:

View File

@ -93,6 +93,7 @@ void set_default_settings(Settings *settings)
settings->setDefault("give_initial_stuff", "false");
settings->setDefault("default_password", "");
settings->setDefault("default_privs", "build, shout");
settings->setDefault("borderstone_radius","5");
settings->setDefault("profiler_print_interval", "0");
settings->setDefault("enable_mapgen_debug_info", "false");

View File

@ -2477,6 +2477,25 @@ void Server::ProcessData(u8 *data, u32 datasize, u16 peer_id)
<<" because privileges are "<<getPlayerPrivs(player)
<<std::endl;
cannot_remove_node = true;
}else{
s16 max_d = g_settings->getS16("borderstone_radius");
v3s16 test_p;
MapNode testnode;
for(s16 z=-max_d; !cannot_remove_node && z<=max_d; z++) {
for(s16 y=-max_d; !cannot_remove_node && y<=max_d; y++) {
for(s16 x=-max_d; !cannot_remove_node && x<=max_d; x++) {
test_p = p_under + v3s16(x,y,z);
NodeMetadata *meta = m_env.getMap().getNodeMetadata(test_p);
if (meta && meta->typeId() == CONTENT_BORDERSTONE) {
BorderStoneNodeMetadata *bsm = (BorderStoneNodeMetadata*)meta;
if (bsm->getOwner() != player->getName()) {
cannot_remove_node = true;
break;
}
}
}
}
}
}
/*
@ -2727,6 +2746,23 @@ void Server::ProcessData(u8 *data, u32 datasize, u16 peer_id)
if(item == NULL)
return;
s16 max_d = g_settings->getS16("borderstone_radius");
v3s16 test_p;
MapNode testnode;
for(s16 z=-max_d; z<=max_d; z++) {
for(s16 y=-max_d; y<=max_d; y++) {
for(s16 x=-max_d; x<=max_d; x++) {
test_p = p_over + v3s16(x,y,z);
NodeMetadata *meta = m_env.getMap().getNodeMetadata(test_p);
if (meta && meta->typeId() == CONTENT_BORDERSTONE) {
BorderStoneNodeMetadata *bsm = (BorderStoneNodeMetadata*)meta;
if (bsm->getOwner() != player->getName())
return;
}
}
}
}
/*
Handle material items
*/
@ -2775,6 +2811,26 @@ void Server::ProcessData(u8 *data, u32 datasize, u16 peer_id)
MapNode n;
n.setContent(mitem->getMaterial());
// don't allow borderstone to be place near another player's borderstone
if (n.getContent() == CONTENT_BORDERSTONE) {
s16 max_d = g_settings->getS16("borderstone_radius")*2;
v3s16 test_p;
MapNode testnode;
for(s16 z=-max_d; z<=max_d; z++) {
for(s16 y=-max_d; y<=max_d; y++) {
for(s16 x=-max_d; x<=max_d; x++) {
test_p = p_over + v3s16(x,y,z);
NodeMetadata *meta = m_env.getMap().getNodeMetadata(test_p);
if (meta && meta->typeId() == CONTENT_BORDERSTONE) {
BorderStoneNodeMetadata *bsm = (BorderStoneNodeMetadata*)meta;
if (bsm->getOwner() != player->getName())
return;
}
}
}
}
}
actionstream<<player->getName()<<" places material "
<<(int)mitem->getMaterial()
<<" at "<<PP(p_under)<<std::endl;