diff options
author | Nils Dagsson Moskopp <nils@dieweltistgarnichtso.net> | 2011-07-31 20:04:04 +0200 |
---|---|---|
committer | Nils Dagsson Moskopp <nils@dieweltistgarnichtso.net> | 2011-07-31 20:04:04 +0200 |
commit | 7ece67727dcc1ff7a6634e4b911eeb82ed3eaf45 (patch) | |
tree | b06cf63fb0c8d01f03c1fb84faa936197029e03f /src | |
parent | 831003156c77c811e7f1fcb65811d1d099587442 (diff) | |
parent | 303351de6d2cb54af27198207ba6c8cef49ecf1a (diff) | |
download | minetest-7ece67727dcc1ff7a6634e4b911eeb82ed3eaf45.tar.gz minetest-7ece67727dcc1ff7a6634e4b911eeb82ed3eaf45.tar.bz2 minetest-7ece67727dcc1ff7a6634e4b911eeb82ed3eaf45.zip |
Merge remote-tracking branch 'origin/upstream'
Diffstat (limited to 'src')
-rw-r--r-- | src/CMakeLists.txt | 5 | ||||
-rw-r--r-- | src/client.cpp | 2 | ||||
-rw-r--r-- | src/content_mapnode.cpp | 77 | ||||
-rw-r--r-- | src/content_mapnode.h | 4 | ||||
-rw-r--r-- | src/defaultsettings.cpp | 2 | ||||
-rw-r--r-- | src/inventory.cpp | 27 | ||||
-rw-r--r-- | src/inventory.h | 2 | ||||
-rw-r--r-- | src/main.cpp | 2 | ||||
-rw-r--r-- | src/mapgen.cpp | 45 | ||||
-rw-r--r-- | src/mapnode.cpp | 2 | ||||
-rw-r--r-- | src/mapnode.h | 3 | ||||
-rw-r--r-- | src/player.cpp | 11 | ||||
-rw-r--r-- | src/player.h | 2 | ||||
-rw-r--r-- | src/server.cpp | 40 | ||||
-rw-r--r-- | src/winresource.rc | 6 |
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"
|