if(1)
{
MapNode n_top = block->getNodeNoEx(p0+v3s16(0,1,0));
- if(content_features(n_top.d).walkable == false &&
+ if(content_features(n_top.d).air_equivalent &&
n_top.getLight(LIGHTBANK_DAY) >= 13)
{
n.d = CONTENT_GRASS;
// Convert mud under proper lighting to grass
if(n.d == CONTENT_MUD)
{
- if(myrand()%4 == 0)
+ if(myrand()%10 == 0)
{
MapNode n_top = block->getNodeNoEx(p0+v3s16(0,1,0));
- if(content_features(n_top.d).walkable == false &&
+ if(content_features(n_top.d).air_equivalent &&
n_top.getLightBlend(getDayNightRatio()) >= 13)
{
n.d = CONTENT_GRASS;
private:
};
+/*
+ Active block modifier interface
+*/
+
+class ActiveBlockModifier
+{
+public:
+ ActiveBlockModifier(){};
+ virtual ~ActiveBlockModifier(){};
+ //TODO
+ //virtual void
+};
+
/*
The server-side environment.
lightweight operation and simple AI\r
- Not practical; client would still need to show smooth movement.\r
\r
+SUGG: Make a system for pregenerating quick information for mapblocks, so\r
+ that the client can show them as cubes before they are actually sent\r
+ or even generated.\r
+\r
Gaming ideas:\r
-------------\r
\r
FIXME: The new optimized map sending doesn't sometimes send enough blocks\r
from big caves and such\r
\r
+Environment:\r
+------------\r
+\r
TODO: A list of "active blocks" in which stuff happens.\r
+ Add a never-resetted game timer to the server\r
+ Add a timestamp value to blocks\r
\r
Misc. stuff:\r
------------\r
-* Make an "environment metafile" to store at least time of day\r
-* Move digging property stuff from material.{h,cpp} to mapnode.cpp...\r
- - Or maybe move content_features to material.{h,cpp}?\r
-* Maybe:\r
- Make a system for pregenerating quick information for mapblocks, so\r
- that the client can show them as cubes before they are actually sent\r
- or even generated.\r
+* Move digging property stuff from material.{h,cpp} to mapnode.cpp\r
+ - ...Or maybe move content_features to material.{h,cpp}?\r
\r
Making it more portable:\r
------------------------\r
-* Some MSVC: std::sto* are defined without a namespace and collide\r
- with the ones in utility.h\r
+ \r
+Stuff to do before release:\r
+---------------------------\r
+- Player default privileges and default password\r
+- Chat privilege\r
+- Some simple block-based dynamic stuff in the world (finish the\r
+ ActiveBlockModifier stuff)\r
+- Protocol version field\r
+- Consider getting some textures from cisoun's texture pack\r
\r
======================================================================\r
\r
f->pointable = false;
f->diggable = false;
f->buildable_to = true;
+ f->air_equivalent = true;
i = CONTENT_WATER;
f = &g_content_features[i];
f->solidness = 0; // drawn separately, makes no faces
f->walkable = false;
f->wall_mounted = true;
+ f->air_equivalent = true;
f->dug_item = std::string("MaterialItem ")+itos(i)+" 1";
i = CONTENT_SIGN_WALL;
f->solidness = 0; // drawn separately, makes no faces
f->walkable = false;
f->wall_mounted = true;
+ f->air_equivalent = true;
f->dug_item = std::string("MaterialItem ")+itos(i)+" 1";
if(f->initial_metadata == NULL)
f->initial_metadata = new SignNodeMetadata("Some sign");
// This is used for collision detection.
// Also for general solidness queries.
bool walkable;
+ // Player can point to these
bool pointable;
+ // Player can dig these
bool diggable;
+ // Player can build on these
bool buildable_to;
+ // Whether the node has no liquid, source liquid or flowing liquid
enum LiquidType liquid_type;
- // If true, param2 is set to direction when placed
+ // If true, param2 is set to direction when placed. Used for torches.
// NOTE: the direction format is quite inefficient and should be changed
bool wall_mounted;
+ // If true, node is equivalent to air. Torches are, air is. Water is not.
+ // Is used for example to check whether a mud block can have grass on.
+ bool air_equivalent;
// Inventory item string as which the node appears in inventory when dug.
// Mineral overrides this.
buildable_to = false;
liquid_type = LIQUID_NONE;
wall_mounted = false;
+ air_equivalent = false;
dug_item = "";
initial_metadata = NULL;
}