aboutsummaryrefslogtreecommitdiff
diff options
context:
space:
mode:
-rw-r--r--src/main.cpp34
-rw-r--r--src/mapnode.cpp55
-rw-r--r--src/mapnode.h36
-rw-r--r--src/materials.cpp6
-rw-r--r--src/nodemetadata.cpp28
-rw-r--r--src/nodemetadata.h14
-rw-r--r--src/server.cpp1
7 files changed, 122 insertions, 52 deletions
diff --git a/src/main.cpp b/src/main.cpp
index c9099f69b..6bcd7f5ac 100644
--- a/src/main.cpp
+++ b/src/main.cpp
@@ -200,41 +200,13 @@ FIXME: Server sometimes goes into some infinite PeerNotFoundException loop
* Make a small history check to transformLiquids to detect and log
continuous oscillations, in such detail that they can be fixed.
-TODO: When player dies, throw items on map
+TODO: Player health points
+ - When player dies, throw items on map
Objects:
--------
-TODO: There has to be some better way to handle static objects than to
- send them all the time. This affects signs and item objects.
-SUGG: Signs could be done in the same way as torches. For this, blocks
- need an additional metadata field for the texts
- - This is also needed for item container chests
-
-Block object server side:
- - A "near blocks" buffer, in which some nearby blocks are stored.
- - For all blocks in the buffer, objects are stepped(). This
- means they are active.
- - A global active buffer is needed for the server
- - A timestamp to blocks
- - All blocks going in and out of the buffer are recorded.
- - For outgoing blocks, timestamp is written.
- - For incoming blocks, time difference is calculated and
- objects are stepped according to it.
-
-- When an active object goes far from a player, either delete
- it or store it statically.
-- When a statically stored active object comes near a player,
- recreate the active object
-
-* Continue making the scripting system:
- * Make updateNodeMesh for a less verbose mesh update on add/removenode
- * Switch to using a safe way for the self and env pointers
- * Make some global environment hooks, like node placed and general
- on_step()
-* Add a global Lua spawn handler and such
-* Get rid of MapBlockObjects
-* Other players could be sent to clients as LuaCAOs
+TODO: Get rid of MapBlockObjects
Map:
----
diff --git a/src/mapnode.cpp b/src/mapnode.cpp
index cb8bf7c42..f498d9e75 100644
--- a/src/mapnode.cpp
+++ b/src/mapnode.cpp
@@ -288,14 +288,6 @@ void init_mapnode()
f->wall_mounted = true;
f->dug_item = std::string("MaterialItem ")+itos(i)+" 1";
- i = CONTENT_FURNACE;
- f = &g_content_features[i];
- f->setAllTextures("furnace_side.png");
- f->setTexture(2, "furnace_front.png");
- f->setInventoryTexture("furnace_front.png");
- f->param_type = CPT_NONE;
- f->dug_item = std::string("MaterialItem ")+itos(i)+" 1";
-
i = CONTENT_SIGN_WALL;
f = &g_content_features[i];
f->setInventoryTexture("sign_wall.png");
@@ -309,10 +301,57 @@ void init_mapnode()
if(f->initial_metadata == NULL)
f->initial_metadata = new SignNodeMetadata("Some sign");
+ i = CONTENT_CHEST;
+ f = &g_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_front.png"); // Z-
+ f->setInventoryTexture("chest_top.png");
+ //f->setInventoryTextureCube("chest_top.png", "chest_side.png", "chest_side.png");
+ f->dug_item = std::string("MaterialItem ")+itos(i)+" 1";
+ if(f->initial_metadata == NULL)
+ f->initial_metadata = new ChestNodeMetadata();
+
+ i = CONTENT_FURNACE;
+ f = &g_content_features[i];
+ f->param_type = CPT_FACEDIR_SIMPLE;
+ f->setAllTextures("furnace_side.png");
+ f->setTexture(5, "furnace_front.png"); // Z-
+ f->setInventoryTexture("furnace_front.png");
+ f->dug_item = std::string("MaterialItem ")+itos(i)+" 1";
+
+}
+
+v3s16 facedir_rotate(u8 facedir, v3s16 dir)
+{
+ /*
+ Face 2 (normally Z-) direction:
+ facedir=0: Z-
+ facedir=1: X-
+ facedir=2: Z+
+ facedir=3: X+
+ */
+ v3s16 newdir;
+ if(facedir==0) // Same
+ newdir = v3s16(dir.X, dir.Y, dir.Z);
+ else if(facedir == 1) // Face is taken from rotXZccv(-90)
+ newdir = v3s16(-dir.Z, dir.Y, dir.X);
+ else if(facedir == 2) // Face is taken from rotXZccv(180)
+ newdir = v3s16(-dir.X, dir.Y, -dir.Z);
+ else if(facedir == 3) // Face is taken from rotXZccv(90)
+ newdir = v3s16(dir.Z, dir.Y, -dir.X);
+ else
+ newdir = dir;
+ return newdir;
}
TileSpec MapNode::getTile(v3s16 dir)
{
+ if(content_features(d).param_type == CPT_FACEDIR_SIMPLE)
+ dir = facedir_rotate(param1, dir);
+
TileSpec spec;
s32 dir_i = -1;
diff --git a/src/mapnode.h b/src/mapnode.h
index 0762599c8..2843208a9 100644
--- a/src/mapnode.h
+++ b/src/mapnode.h
@@ -95,8 +95,9 @@ void init_content_inventory_texture_paths();
#define CONTENT_COALSTONE 11
#define CONTENT_WOOD 12
#define CONTENT_SAND 13
-#define CONTENT_FURNACE 14
-#define CONTENT_SIGN_WALL 15
+#define CONTENT_SIGN_WALL 14
+#define CONTENT_CHEST 15
+#define CONTENT_FURNACE 16
/*
Content feature list
@@ -106,7 +107,9 @@ enum ContentParamType
{
CPT_NONE,
CPT_LIGHT,
- CPT_MINERAL
+ CPT_MINERAL,
+ // Direction for chests and furnaces and such
+ CPT_FACEDIR_SIMPLE
};
enum LiquidType
@@ -136,13 +139,9 @@ struct ContentFeatures
*/
TileSpec tiles[6];
- // TODO: Somehow specify inventory image
- //std::string inventory_image_path;
- //TextureSpec inventory_texture;
- //u32 inventory_texture_id;
video::ITexture *inventory_texture;
- bool is_ground_content; //TODO: Remove, use walkable instead
+ bool is_ground_content;
bool light_propagates;
bool sunlight_propagates;
u8 solidness; // Used when choosing which face is drawn
@@ -409,6 +408,13 @@ inline v3s16 unpackDir(u8 b)
return d;
}
+/*
+ facedir: CPT_FACEDIR_SIMPLE param1 value
+ dir: The face for which stuff is wanted
+ return value: The face from which the stuff is actually found
+*/
+v3s16 facedir_rotate(u8 facedir, v3s16 dir);
+
enum LightBank
{
LIGHTBANK_DAY,
@@ -431,14 +437,18 @@ struct MapNode
Sunlight is LIGHT_SUN, which is LIGHT_MAX+1.
- Contains 2 values, day- and night lighting. Each takes 4 bits.
*/
- s8 param;
+ union
+ {
+ s8 param;
+ u8 param1;
+ };
+ /*
+ The second parameter. Initialized to 0.
+ E.g. direction for torches and flowing water.
+ */
union
{
- /*
- The second parameter. Initialized to 0.
- Direction for torches and flowing water.
- */
u8 param2;
u8 dir;
};
diff --git a/src/materials.cpp b/src/materials.cpp
index 50f994523..2e85950ec 100644
--- a/src/materials.cpp
+++ b/src/materials.cpp
@@ -60,8 +60,14 @@ void initializeMaterialProperties()
g_material_properties[CONTENT_SAND].setDiggingProperties("",
DiggingProperties(true, 0.4, 0));
+ g_material_properties[CONTENT_CHEST].setDiggingProperties("",
+ DiggingProperties(true, 1.0, 0));
+
setStoneLikeDiggingProperties(CONTENT_FURNACE, 1.0);
+ g_material_properties[CONTENT_SIGN_WALL].setDiggingProperties("",
+ DiggingProperties(true, 0.0, 0));
+
/*
Add MesePick to everything
*/
diff --git a/src/nodemetadata.cpp b/src/nodemetadata.cpp
index 775b59b24..fca4e5b84 100644
--- a/src/nodemetadata.cpp
+++ b/src/nodemetadata.cpp
@@ -105,6 +105,34 @@ std::string SignNodeMetadata::infoText()
}
/*
+ ChestNodeMetadata
+*/
+
+ChestNodeMetadata::ChestNodeMetadata()
+{
+ NodeMetadata::registerType(typeId(), create);
+}
+u16 ChestNodeMetadata::typeId() const
+{
+ return CONTENT_CHEST;
+}
+NodeMetadata* ChestNodeMetadata::create(std::istream &is)
+{
+ return new ChestNodeMetadata();
+}
+NodeMetadata* ChestNodeMetadata::clone()
+{
+ return new ChestNodeMetadata();
+}
+void ChestNodeMetadata::serializeBody(std::ostream &os)
+{
+}
+std::string ChestNodeMetadata::infoText()
+{
+ return "Chest";
+}
+
+/*
NodeMetadatalist
*/
diff --git a/src/nodemetadata.h b/src/nodemetadata.h
index aa2e0196c..21916677e 100644
--- a/src/nodemetadata.h
+++ b/src/nodemetadata.h
@@ -79,6 +79,20 @@ private:
std::string m_text;
};
+class ChestNodeMetadata : public NodeMetadata
+{
+public:
+ ChestNodeMetadata();
+
+ virtual u16 typeId() const;
+ static NodeMetadata* create(std::istream &is);
+ virtual NodeMetadata* clone();
+ virtual void serializeBody(std::ostream &os);
+ virtual std::string infoText();
+
+private:
+};
+
class NodeMetadataList
{
public:
diff --git a/src/server.cpp b/src/server.cpp
index 44c26dbc3..4f3846cf8 100644
--- a/src/server.cpp
+++ b/src/server.cpp
@@ -3387,6 +3387,7 @@ void setCreativeInventory(Player *player)
CONTENT_MESE,
CONTENT_WATERSOURCE,
CONTENT_CLOUD,
+ CONTENT_CHEST,
CONTENT_FURNACE,
CONTENT_SIGN_WALL,
CONTENT_IGNORE