aboutsummaryrefslogtreecommitdiff
path: root/src
diff options
context:
space:
mode:
Diffstat (limited to 'src')
-rw-r--r--src/CMakeLists.txt5
-rw-r--r--src/client.cpp2
-rw-r--r--src/content_mapnode.cpp77
-rw-r--r--src/content_mapnode.h4
-rw-r--r--src/defaultsettings.cpp2
-rw-r--r--src/inventory.cpp27
-rw-r--r--src/inventory.h2
-rw-r--r--src/main.cpp2
-rw-r--r--src/mapgen.cpp45
-rw-r--r--src/mapnode.cpp2
-rw-r--r--src/mapnode.h3
-rw-r--r--src/player.cpp11
-rw-r--r--src/player.h2
-rw-r--r--src/server.cpp40
-rw-r--r--src/winresource.rc6
15 files changed, 184 insertions, 46 deletions
diff --git a/src/CMakeLists.txt b/src/CMakeLists.txt
index fcdb3ccbc..32177f8a9 100644
--- a/src/CMakeLists.txt
+++ b/src/CMakeLists.txt
@@ -129,6 +129,11 @@ set(common_SRCS
base64.cpp
)
+# This gives us the icon
+if(WIN32 AND MSVC)
+ set(common_SRCS ${common_SRCS} winresource.rc)
+endif()
+
# Client sources
set(minetest_SRCS
${common_SRCS}
diff --git a/src/client.cpp b/src/client.cpp
index c52d3ab09..02f78e233 100644
--- a/src/client.cpp
+++ b/src/client.cpp
@@ -424,7 +424,7 @@ void Client::step(float dtime)
memset((char*)&data[3], 0, PLAYERNAME_SIZE);
snprintf((char*)&data[3], PLAYERNAME_SIZE, "%s", myplayer->getName());
- /*dstream<<"Client: password hash is \""<<m_password<<"\""
+ /*dstream<<"Client: sending initial password hash: \""<<m_password<<"\""
<<std::endl;*/
memset((char*)&data[23], 0, PASSWORD_SIZE);
diff --git a/src/content_mapnode.cpp b/src/content_mapnode.cpp
index db036ebd9..7589f06ed 100644
--- a/src/content_mapnode.cpp
+++ b/src/content_mapnode.cpp
@@ -31,7 +31,7 @@ void setStoneLikeDiggingProperties(DiggingPropertiesList &list, float toughness)
void setDirtLikeDiggingProperties(DiggingPropertiesList &list, float toughness);
void setWoodLikeDiggingProperties(DiggingPropertiesList &list, float toughness);
-content_t trans_table_19[][2] = {
+content_t trans_table_19[21][2] = {
{CONTENT_GRASS, 1},
{CONTENT_TREE, 4},
{CONTENT_LEAVES, 5},
@@ -106,7 +106,7 @@ void content_mapnode_init()
f->setInventoryTextureCube("stone.png", "stone.png", "stone.png");
f->param_type = CPT_MINERAL;
f->is_ground_content = true;
- f->dug_item = std::string("MaterialItem ")+itos(CONTENT_COBBLE)+" 1";
+ f->dug_item = std::string("MaterialItem2 ")+itos(CONTENT_COBBLE)+" 1";
setStoneLikeDiggingProperties(f->digging_properties, 1.0);
if(invisible_stone)
f->solidness = 0; // For debugging, hides regular stone
@@ -118,7 +118,7 @@ void content_mapnode_init()
f->setTexture(1, "mud.png");
f->param_type = CPT_MINERAL;
f->is_ground_content = true;
- f->dug_item = std::string("MaterialItem ")+itos(CONTENT_MUD)+" 1";
+ f->dug_item = std::string("MaterialItem2 ")+itos(CONTENT_MUD)+" 1";
setDirtLikeDiggingProperties(f->digging_properties, 1.0);
i = CONTENT_GRASS_FOOTSTEPS;
@@ -128,7 +128,7 @@ void content_mapnode_init()
f->setTexture(1, "mud.png");
f->param_type = CPT_MINERAL;
f->is_ground_content = true;
- f->dug_item = std::string("MaterialItem ")+itos(CONTENT_MUD)+" 1";
+ f->dug_item = std::string("MaterialItem2 ")+itos(CONTENT_MUD)+" 1";
setDirtLikeDiggingProperties(f->digging_properties, 1.0);
i = CONTENT_MUD;
@@ -137,7 +137,7 @@ void content_mapnode_init()
f->setInventoryTextureCube("mud.png", "mud.png", "mud.png");
f->param_type = CPT_MINERAL;
f->is_ground_content = true;
- f->dug_item = std::string("MaterialItem ")+itos(i)+" 1";
+ f->dug_item = std::string("MaterialItem2 ")+itos(i)+" 1";
setDirtLikeDiggingProperties(f->digging_properties, 1.0);
i = CONTENT_SAND;
@@ -146,7 +146,7 @@ void content_mapnode_init()
f->setInventoryTextureCube("sand.png", "sand.png", "sand.png");
f->param_type = CPT_MINERAL;
f->is_ground_content = true;
- f->dug_item = std::string("MaterialItem ")+itos(i)+" 1";
+ f->dug_item = std::string("MaterialItem2 ")+itos(i)+" 1";
setDirtLikeDiggingProperties(f->digging_properties, 1.0);
i = CONTENT_GRAVEL;
@@ -155,7 +155,7 @@ void content_mapnode_init()
f->setInventoryTextureCube("gravel.png", "gravel.png", "gravel.png");
f->param_type = CPT_MINERAL;
f->is_ground_content = true;
- f->dug_item = std::string("MaterialItem ")+itos(i)+" 1";
+ f->dug_item = std::string("MaterialItem2 ")+itos(i)+" 1";
setDirtLikeDiggingProperties(f->digging_properties, 1.75);
i = CONTENT_SANDSTONE;
@@ -164,7 +164,7 @@ void content_mapnode_init()
f->setInventoryTextureCube("sandstone.png", "sandstone.png", "sandstone.png");
f->param_type = CPT_MINERAL;
f->is_ground_content = true;
- f->dug_item = std::string("MaterialItem ")+itos(CONTENT_SAND)+" 1";
+ f->dug_item = std::string("MaterialItem2 ")+itos(CONTENT_SAND)+" 1";
setDirtLikeDiggingProperties(f->digging_properties, 1.0);
i = CONTENT_CLAY;
@@ -192,7 +192,7 @@ void content_mapnode_init()
f->setTexture(1, "tree_top.png");
f->param_type = CPT_MINERAL;
f->is_ground_content = true;
- f->dug_item = std::string("MaterialItem ")+itos(i)+" 1";
+ f->dug_item = std::string("MaterialItem2 ")+itos(i)+" 1";
setWoodLikeDiggingProperties(f->digging_properties, 1.0);
i = CONTENT_JUNGLETREE;
@@ -202,7 +202,7 @@ void content_mapnode_init()
f->setTexture(1, "jungletree_top.png");
f->param_type = CPT_MINERAL;
//f->is_ground_content = true;
- f->dug_item = std::string("MaterialItem ")+itos(i)+" 1";
+ f->dug_item = std::string("MaterialItem2 ")+itos(i)+" 1";
setWoodLikeDiggingProperties(f->digging_properties, 1.0);
i = CONTENT_JUNGLEGRASS;
@@ -212,7 +212,7 @@ void content_mapnode_init()
f->param_type = CPT_LIGHT;
//f->is_ground_content = true;
f->air_equivalent = false; // grass grows underneath
- f->dug_item = std::string("MaterialItem ")+itos(i)+" 1";
+ f->dug_item = std::string("MaterialItem2 ")+itos(i)+" 1";
f->solidness = 0; // drawn separately, makes no faces
f->walkable = false;
setWoodLikeDiggingProperties(f->digging_properties, 0.10);
@@ -232,7 +232,7 @@ void content_mapnode_init()
{
f->setAllTextures("[noalpha:leaves.png");
}
- f->dug_item = std::string("MaterialItem ")+itos(i)+" 1";
+ f->dug_item = std::string("MaterialItem2 ")+itos(i)+" 1";
setWoodLikeDiggingProperties(f->digging_properties, 0.15);
i = CONTENT_CACTUS;
@@ -243,7 +243,7 @@ void content_mapnode_init()
f->setInventoryTextureCube("cactus_top.png", "cactus_side.png", "cactus_side.png");
f->param_type = CPT_MINERAL;
f->is_ground_content = true;
- f->dug_item = std::string("MaterialItem ")+itos(i)+" 1";
+ f->dug_item = std::string("MaterialItem2 ")+itos(i)+" 1";
setWoodLikeDiggingProperties(f->digging_properties, 0.75);
i = CONTENT_PAPYRUS;
@@ -252,7 +252,7 @@ void content_mapnode_init()
f->light_propagates = true;
f->param_type = CPT_LIGHT;
f->is_ground_content = true;
- f->dug_item = std::string("MaterialItem ")+itos(i)+" 1";
+ f->dug_item = std::string("MaterialItem2 ")+itos(i)+" 1";
f->solidness = 0; // drawn separately, makes no faces
f->walkable = false;
setWoodLikeDiggingProperties(f->digging_properties, 0.25);
@@ -275,7 +275,7 @@ void content_mapnode_init()
f->sunlight_propagates = true;
f->param_type = CPT_LIGHT;
f->is_ground_content = true;
- f->dug_item = std::string("MaterialItem ")+itos(i)+" 1";
+ f->dug_item = std::string("MaterialItem2 ")+itos(i)+" 1";
f->solidness = 0; // drawn separately, makes no faces
f->setInventoryTextureCube("glass.png", "glass.png", "glass.png");
setWoodLikeDiggingProperties(f->digging_properties, 0.15);
@@ -285,7 +285,7 @@ void content_mapnode_init()
f->light_propagates = true;
f->param_type = CPT_LIGHT;
f->is_ground_content = true;
- f->dug_item = std::string("MaterialItem ")+itos(i)+" 1";
+ f->dug_item = std::string("MaterialItem2 ")+itos(i)+" 1";
f->solidness = 0; // drawn separately, makes no faces
f->air_equivalent = true; // grass grows underneath
f->setInventoryTexture("item_fence.png");
@@ -297,7 +297,7 @@ void content_mapnode_init()
f->light_propagates = true;
f->param_type = CPT_LIGHT;
f->is_ground_content = true;
- f->dug_item = std::string("MaterialItem ")+itos(i)+" 1";
+ f->dug_item = std::string("MaterialItem2 ")+itos(i)+" 1";
f->solidness = 0; // drawn separately, makes no faces
f->air_equivalent = true; // grass grows underneath
f->walkable = false;
@@ -315,7 +315,7 @@ void content_mapnode_init()
f->setAllTextures("wood.png");
f->setInventoryTextureCube("wood.png", "wood.png", "wood.png");
f->is_ground_content = true;
- f->dug_item = std::string("MaterialItem ")+itos(i)+" 1";
+ f->dug_item = std::string("MaterialItem2 ")+itos(i)+" 1";
setWoodLikeDiggingProperties(f->digging_properties, 0.75);
i = CONTENT_MESE;
@@ -323,7 +323,7 @@ void content_mapnode_init()
f->setAllTextures("mese.png");
f->setInventoryTextureCube("mese.png", "mese.png", "mese.png");
f->is_ground_content = true;
- f->dug_item = std::string("MaterialItem ")+itos(i)+" 1";
+ f->dug_item = std::string("MaterialItem2 ")+itos(i)+" 1";
setStoneLikeDiggingProperties(f->digging_properties, 0.5);
i = CONTENT_CLOUD;
@@ -331,7 +331,7 @@ void content_mapnode_init()
f->setAllTextures("cloud.png");
f->setInventoryTextureCube("cloud.png", "cloud.png", "cloud.png");
f->is_ground_content = true;
- f->dug_item = std::string("MaterialItem ")+itos(i)+" 1";
+ f->dug_item = std::string("MaterialItem2 ")+itos(i)+" 1";
i = CONTENT_AIR;
f = &content_features(i);
@@ -387,7 +387,7 @@ void content_mapnode_init()
f->diggable = false;
f->buildable_to = true;
f->liquid_type = LIQUID_SOURCE;
- f->dug_item = std::string("MaterialItem ")+itos(i)+" 1";
+ f->dug_item = std::string("MaterialItem2 ")+itos(i)+" 1";
f->liquid_alternative_flowing = CONTENT_WATER;
f->liquid_alternative_source = CONTENT_WATERSOURCE;
@@ -401,7 +401,7 @@ void content_mapnode_init()
f->walkable = false;
f->wall_mounted = true;
f->air_equivalent = true;
- f->dug_item = std::string("MaterialItem ")+itos(i)+" 1";
+ f->dug_item = std::string("MaterialItem2 ")+itos(i)+" 1";
f->light_source = LIGHT_MAX-1;
f->digging_properties.set("", DiggingProperties(true, 0.0, 0));
@@ -415,7 +415,7 @@ void content_mapnode_init()
f->walkable = false;
f->wall_mounted = true;
f->air_equivalent = true;
- f->dug_item = std::string("MaterialItem ")+itos(i)+" 1";
+ f->dug_item = std::string("MaterialItem2 ")+itos(i)+" 1";
if(f->initial_metadata == NULL)
f->initial_metadata = new SignNodeMetadata("Some sign");
f->digging_properties.set("", DiggingProperties(true, 0.5, 0));
@@ -429,7 +429,7 @@ void content_mapnode_init()
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";
+ f->dug_item = std::string("MaterialItem2 ")+itos(i)+" 1";
if(f->initial_metadata == NULL)
f->initial_metadata = new ChestNodeMetadata();
setWoodLikeDiggingProperties(f->digging_properties, 1.0);
@@ -440,8 +440,8 @@ void content_mapnode_init()
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";
- f->dug_item = std::string("MaterialItem ")+itos(CONTENT_COBBLE)+" 6";
+ //f->dug_item = std::string("MaterialItem2 ")+itos(i)+" 1";
+ f->dug_item = std::string("MaterialItem2 ")+itos(CONTENT_COBBLE)+" 6";
if(f->initial_metadata == NULL)
f->initial_metadata = new FurnaceNodeMetadata();
setStoneLikeDiggingProperties(f->digging_properties, 3.0);
@@ -452,7 +452,7 @@ void content_mapnode_init()
f->setInventoryTextureCube("cobble.png", "cobble.png", "cobble.png");
f->param_type = CPT_NONE;
f->is_ground_content = true;
- f->dug_item = std::string("MaterialItem ")+itos(i)+" 1";
+ f->dug_item = std::string("MaterialItem2 ")+itos(i)+" 1";
setStoneLikeDiggingProperties(f->digging_properties, 0.9);
i = CONTENT_MOSSYCOBBLE;
@@ -461,7 +461,7 @@ void content_mapnode_init()
f->setInventoryTextureCube("mossycobble.png", "mossycobble.png", "mossycobble.png");
f->param_type = CPT_NONE;
f->is_ground_content = true;
- f->dug_item = std::string("MaterialItem ")+itos(i)+" 1";
+ f->dug_item = std::string("MaterialItem2 ")+itos(i)+" 1";
setStoneLikeDiggingProperties(f->digging_properties, 0.8);
i = CONTENT_STEEL;
@@ -471,16 +471,33 @@ void content_mapnode_init()
"steel_block.png");
f->param_type = CPT_NONE;
f->is_ground_content = true;
- f->dug_item = std::string("MaterialItem ")+itos(i)+" 1";
+ f->dug_item = std::string("MaterialItem2 ")+itos(i)+" 1";
setStoneLikeDiggingProperties(f->digging_properties, 5.0);
+ i = CONTENT_NC;
+ f = &content_features(i);
+ f->param_type = CPT_FACEDIR_SIMPLE;
+ f->setAllTextures("nc_side.png");
+ f->setTexture(5, "nc_front.png"); // Z-
+ f->setTexture(4, "nc_back.png"); // Z+
+ f->setInventoryTexture("nc_front.png");
+ f->dug_item = std::string("MaterialItem2 ")+itos(i)+" 1";
+ setStoneLikeDiggingProperties(f->digging_properties, 3.0);
+
+ i = CONTENT_NC_RB;
+ f = &content_features(i);
+ f->setAllTextures("nc_rb.png");
+ f->setInventoryTexture("nc_rb.png");
+ f->dug_item = std::string("MaterialItem2 ")+itos(i)+" 1";
+ setStoneLikeDiggingProperties(f->digging_properties, 3.0);
+
// NOTE: Remember to add frequently used stuff to the texture atlas in tile.cpp
/*
Add MesePick to everything
*/
- for(u16 i=0; i<256; i++)
+ for(u16 i=0; i<=MAX_CONTENT; i++)
{
content_features(i).digging_properties.set("MesePick",
DiggingProperties(true, 0.0, 65535./1337));
diff --git a/src/content_mapnode.h b/src/content_mapnode.h
index 5fdbf45f3..609df0a95 100644
--- a/src/content_mapnode.h
+++ b/src/content_mapnode.h
@@ -24,6 +24,8 @@ with this program; if not, write to the Free Software Foundation, Inc.,
void content_mapnode_init();
+extern content_t trans_table_19[21][2];
+
MapNode mapnode_translate_from_internal(MapNode n_from, u8 version);
MapNode mapnode_translate_to_internal(MapNode n_from, u8 version);
@@ -70,6 +72,8 @@ MapNode mapnode_translate_to_internal(MapNode n_from, u8 version);
#define CONTENT_BOOKSHELF 0x814 //29
#define CONTENT_JUNGLETREE 0x815
#define CONTENT_JUNGLEGRASS 0x816
+#define CONTENT_NC 0x817
+#define CONTENT_NC_RB 0x818
#endif
diff --git a/src/defaultsettings.cpp b/src/defaultsettings.cpp
index c1104eff0..91524a6de 100644
--- a/src/defaultsettings.cpp
+++ b/src/defaultsettings.cpp
@@ -77,7 +77,7 @@ void set_default_settings()
g_settings.setDefault("screenshot_path", ".");
// Server stuff
- g_settings.setDefault("motd", "<Message of the day (motd) not set>");
+ g_settings.setDefault("motd", "");
g_settings.setDefault("enable_experimental", "false");
g_settings.setDefault("creative_mode", "false");
g_settings.setDefault("enable_damage", "true");
diff --git a/src/inventory.cpp b/src/inventory.cpp
index ca050614f..30a43e37f 100644
--- a/src/inventory.cpp
+++ b/src/inventory.cpp
@@ -46,6 +46,18 @@ InventoryItem::~InventoryItem()
{
}
+content_t content_translate_from_19_to_internal(content_t c_from)
+{
+ for(u32 i=0; i<sizeof(trans_table_19)/sizeof(trans_table_19[0]); i++)
+ {
+ if(trans_table_19[i][1] == c_from)
+ {
+ return trans_table_19[i][0];
+ }
+ }
+ return c_from;
+}
+
InventoryItem* InventoryItem::deSerialize(std::istream &is)
{
DSTACK(__FUNCTION_NAME);
@@ -62,6 +74,21 @@ InventoryItem* InventoryItem::deSerialize(std::istream &is)
is>>material;
u16 count;
is>>count;
+ // Convert old materials
+ if(material <= 0xff)
+ {
+ material = content_translate_from_19_to_internal(material);
+ }
+ if(material > MAX_CONTENT)
+ throw SerializationError("Too large material number");
+ return new MaterialItem(material, count);
+ }
+ else if(name == "MaterialItem2")
+ {
+ u16 material;
+ is>>material;
+ u16 count;
+ is>>count;
if(material > MAX_CONTENT)
throw SerializationError("Too large material number");
return new MaterialItem(material, count);
diff --git a/src/inventory.h b/src/inventory.h
index 66b1cd1f0..53495c6e5 100644
--- a/src/inventory.h
+++ b/src/inventory.h
@@ -136,7 +136,7 @@ public:
virtual void serialize(std::ostream &os)
{
//os.imbue(std::locale("C"));
- os<<getName();
+ os<<"MaterialItem2";
os<<" ";
os<<(unsigned int)m_content;
os<<" ";
diff --git a/src/main.cpp b/src/main.cpp
index df0a7ff31..6eca96eac 100644
--- a/src/main.cpp
+++ b/src/main.cpp
@@ -1579,6 +1579,8 @@ int main(int argc, char *argv[])
password = translatePassword(playername, menudata.password);
+ //dstream<<"Main: password hash: '"<<password<<"'"<<std::endl;
+
address = wide_to_narrow(menudata.address);
int newport = stoi(wide_to_narrow(menudata.port));
if(newport != 0)
diff --git a/src/mapgen.cpp b/src/mapgen.cpp
index 0ba7f91ab..5dec7d843 100644
--- a/src/mapgen.cpp
+++ b/src/mapgen.cpp
@@ -976,6 +976,40 @@ static void make_dungeon1(VoxelManipulator &vmanip, PseudoRandom &random)
}
}
+static void make_nc(VoxelManipulator &vmanip, PseudoRandom &random)
+{
+ v3s16 dir;
+ u8 facedir_i = 0;
+ s32 r = random.range(0, 3);
+ if(r == 0){
+ dir = v3s16( 1, 0, 0);
+ facedir_i = 3;
+ }
+ if(r == 1){
+ dir = v3s16(-1, 0, 0);
+ facedir_i = 1;
+ }
+ if(r == 2){
+ dir = v3s16( 0, 0, 1);
+ facedir_i = 2;
+ }
+ if(r == 3){
+ dir = v3s16( 0, 0,-1);
+ facedir_i = 0;
+ }
+ v3s16 p = vmanip.m_area.MinEdge + v3s16(
+ 16+random.range(0,15),
+ 16+random.range(0,15),
+ 16+random.range(0,15));
+ vmanip.m_data[vmanip.m_area.index(p)] = MapNode(CONTENT_NC, facedir_i);
+ u32 length = random.range(3,15);
+ for(u32 j=0; j<length; j++)
+ {
+ p -= dir;
+ vmanip.m_data[vmanip.m_area.index(p)] = MapNode(CONTENT_NC_RB);
+ }
+}
+
/*
Noise functions. Make sure seed is mangled differently in each one.
*/
@@ -1871,6 +1905,17 @@ void make_block(BlockMakeData *data)
}
}
}
+
+ /*
+ Add NC
+ */
+ {
+ PseudoRandom ncrandom(blockseed+9324342);
+ if(ncrandom.range(0, 1000) == 0 && blockpos.Y <= -3)
+ {
+ make_nc(vmanip, ncrandom);
+ }
+ }
/*
Add top and bottom side of water to transforming_liquid queue
diff --git a/src/mapnode.cpp b/src/mapnode.cpp
index c9f85c303..9a8a73295 100644
--- a/src/mapnode.cpp
+++ b/src/mapnode.cpp
@@ -150,7 +150,7 @@ void init_mapnode()
continue;
ContentFeatures *f = &g_content_features[i];
f->setAllTextures("unknown_block.png");
- f->dug_item = std::string("MaterialItem ")+itos(i)+" 1";
+ f->dug_item = std::string("MaterialItem2 ")+itos(i)+" 1";
}
/*
diff --git a/src/mapnode.h b/src/mapnode.h
index 3cca985bc..1fb84e1c9 100644
--- a/src/mapnode.h
+++ b/src/mapnode.h
@@ -391,6 +391,9 @@ inline v3s16 unpackDir(u8 b)
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
+
+ NOTE: Currently this uses 2 bits for Z-,X-,Z+,X+, should there be Y+
+ and Y- too?
*/
v3s16 facedir_rotate(u8 facedir, v3s16 dir);
diff --git a/src/player.cpp b/src/player.cpp
index d52d6b88f..c43276ef1 100644
--- a/src/player.cpp
+++ b/src/player.cpp
@@ -29,6 +29,7 @@ Player::Player():
in_water(false),
in_water_stable(false),
swimming_up(false),
+ inventory_backup(NULL),
craftresult_is_preview(true),
hp(20),
peer_id(PEER_ID_INEXISTENT),
@@ -43,6 +44,7 @@ Player::Player():
Player::~Player()
{
+ delete inventory_backup;
}
void Player::resetInventory()
@@ -106,8 +108,13 @@ void Player::serialize(std::ostream &os)
args.writeLines(os);
os<<"PlayerArgsEnd\n";
-
- inventory.serialize(os);
+
+ // If actual inventory is backed up due to creative mode, save it
+ // instead of the dummy creative mode inventory
+ if(inventory_backup)
+ inventory_backup->serialize(os);
+ else
+ inventory.serialize(os);
}
void Player::deSerialize(std::istream &is)
diff --git a/src/player.h b/src/player.h
index a7a2433ce..29460e1e1 100644
--- a/src/player.h
+++ b/src/player.h
@@ -121,6 +121,8 @@ public:
bool swimming_up;
Inventory inventory;
+ // Actual inventory is backed up here when creative mode is used
+ Inventory *inventory_backup;
bool craftresult_is_preview;
diff --git a/src/server.cpp b/src/server.cpp
index 07f9875c4..8a19306a9 100644
--- a/src/server.cpp
+++ b/src/server.cpp
@@ -1972,20 +1972,23 @@ void Server::ProcessData(u8 *data, u32 datasize, u16 peer_id)
}
/*
- Check network protocol version
+ Read and check network protocol version
*/
+
u16 net_proto_version = 0;
if(datasize >= 2+1+PLAYERNAME_SIZE+PASSWORD_SIZE+2)
{
net_proto_version = readU16(&data[2+1+PLAYERNAME_SIZE+PASSWORD_SIZE]);
}
+
getClient(peer->id)->net_proto_version = net_proto_version;
- /*if(net_proto_version == 0)
+
+ if(net_proto_version == 0)
{
SendAccessDenied(m_con, peer_id,
- L"Your client is too old (network protocol)");
+ L"Your client is too old. Please upgrade.");
return;
- }*/
+ }
/*
Set up player
@@ -2017,7 +2020,7 @@ void Server::ProcessData(u8 *data, u32 datasize, u16 peer_id)
// Get password
char password[PASSWORD_SIZE];
- if(datasize >= 2+1+PLAYERNAME_SIZE)
+ if(datasize < 2+1+PLAYERNAME_SIZE+PASSWORD_SIZE)
{
// old version - assume blank password
password[0] = 0;
@@ -2041,7 +2044,10 @@ void Server::ProcessData(u8 *data, u32 datasize, u16 peer_id)
checkpwd = g_settings.get("default_password");
}
- if(password != checkpwd && checkpwd != "")
+ /*dstream<<"Server: Client gave password '"<<password
+ <<"', the correct one is '"<<checkpwd<<"'"<<std::endl;*/
+
+ if(password != checkpwd && m_authmanager.exists(playername))
{
derr_server<<DTIME<<"Server: peer_id="<<peer_id
<<": supplied invalid password for "
@@ -2181,11 +2187,12 @@ void Server::ProcessData(u8 *data, u32 datasize, u16 peer_id)
message += L" joined game";
BroadcastChatMessage(message);
}
-
- if(getClient(peer->id)->net_proto_version == 0)
+
+ // Warnings about protocol version can be issued here
+ /*if(getClient(peer->id)->net_proto_version == 0)
{
SendChatMessage(peer_id, L"# Server: NOTE: YOUR CLIENT IS OLD AND DOES NOT WORK PROPERLY WITH THIS SERVER");
- }
+ }*/
return;
}
@@ -3346,6 +3353,9 @@ void Server::ProcessData(u8 *data, u32 datasize, u16 peer_id)
newpwd += c;
}
+ dstream<<"Server: Client requests a password change from "
+ <<"'"<<oldpwd<<"' to '"<<newpwd<<"'"<<std::endl;
+
std::string playername = player->getName();
if(m_authmanager.exists(playername) == false)
@@ -3357,7 +3367,7 @@ void Server::ProcessData(u8 *data, u32 datasize, u16 peer_id)
}
std::string checkpwd = m_authmanager.getPassword(playername);
-
+
if(oldpwd != checkpwd)
{
dstream<<"Server: invalid old password"<<std::endl;
@@ -4130,6 +4140,11 @@ Player *Server::emergePlayer(const char *name, const char *password, u16 peer_id
// Reset inventory to creative if in creative mode
if(g_settings.getBool("creative_mode"))
{
+ // Warning: double code below
+ // Backup actual inventory
+ player->inventory_backup = new Inventory();
+ *(player->inventory_backup) = player->inventory;
+ // Set creative inventory
craft_set_creative_inventory(player);
}
@@ -4183,6 +4198,11 @@ Player *Server::emergePlayer(const char *name, const char *password, u16 peer_id
if(g_settings.getBool("creative_mode"))
{
+ // Warning: double code above
+ // Backup actual inventory
+ player->inventory_backup = new Inventory();
+ *(player->inventory_backup) = player->inventory;
+ // Set creative inventory
craft_set_creative_inventory(player);
}
else if(g_settings.getBool("give_initial_stuff"))
diff --git a/src/winresource.rc b/src/winresource.rc
new file mode 100644
index 000000000..24ec445aa
--- /dev/null
+++ b/src/winresource.rc
@@ -0,0 +1,6 @@
+#include <windows.h>
+#include <commctrl.h>
+#include <richedit.h>
+LANGUAGE 0, SUBLANG_NEUTRAL
+130 ICON "..\\minetest-icon.ico"
+//131 BITMAP "..\\minetest-icon.bmp"