From d62ae0e18bc570033ada07454b1642f696fe17b1 Mon Sep 17 00:00:00 2001 From: Perttu Ahola Date: Sat, 30 Jul 2011 18:51:15 +0300 Subject: Rats are now eatable. Also made their selection box move smoothly. --- src/server.cpp | 123 ++++++++++++++++++++++++++++++++------------------------- 1 file changed, 70 insertions(+), 53 deletions(-) (limited to 'src/server.cpp') diff --git a/src/server.cpp b/src/server.cpp index e2e6ce46b..ab60be5cc 100644 --- a/src/server.cpp +++ b/src/server.cpp @@ -2368,77 +2368,94 @@ void Server::ProcessData(u8 *data, u32 datasize, u16 peer_id) return; } + // Skip if object has been removed + if(obj->m_removed) + return; + //TODO: Check that object is reasonably close // Left click, pick object up (usually) if(button == 0) { - InventoryList *ilist = player->inventory.getList("main"); - if(g_settings.getBool("creative_mode") == false && ilist != NULL) - { + /* + Try creating inventory item + */ + InventoryItem *item = obj->createPickedUpItem(); - // Skip if inventory has no free space - if(ilist->getUsedSlots() == ilist->getSize()) + if(item) + { + if(g_settings.getBool("creative_mode") == false) { - dout_server<<"Player inventory has no free space"<inventory.getList("main"); + if(ilist != NULL) + { + // Skip if inventory has no free space + if(ilist->getUsedSlots() == ilist->getSize()) + { + dout_server<<"Player inventory has no free space"<m_removed) - return; - - /* - Create the inventory item - */ - InventoryItem *item = obj->createPickedUpItem(); - - if(item) - { - // Add to inventory and send inventory - ilist->addItem(item); - UpdateCrafting(player->peer_id); - SendInventory(player->peer_id); + // Add to inventory and send inventory + ilist->addItem(item); + UpdateCrafting(player->peer_id); + SendInventory(player->peer_id); - // Remove object from environment - obj->m_removed = true; + // Remove object from environment + obj->m_removed = true; + } } - else - { - /* - Item cannot be picked up. Punch it instead. - */ + } + else + { + /* + Item cannot be picked up. Punch it instead. + */ - ToolItem *titem = NULL; - std::string toolname = ""; + ToolItem *titem = NULL; + std::string toolname = ""; - InventoryList *mlist = player->inventory.getList("main"); - if(mlist != NULL) + InventoryList *mlist = player->inventory.getList("main"); + if(mlist != NULL) + { + InventoryItem *item = mlist->getItem(item_i); + if(item && (std::string)item->getName() == "ToolItem") { - InventoryItem *item = mlist->getItem(item_i); - if(item && (std::string)item->getName() == "ToolItem") - { - titem = (ToolItem*)item; - toolname = titem->getToolName(); - } + titem = (ToolItem*)item; + toolname = titem->getToolName(); } + } - v3f playerpos = player->getPosition(); - v3f objpos = obj->getBasePosition(); - v3f dir = (objpos - playerpos).normalize(); - - u16 wear = obj->punch(toolname, dir); - - if(titem) - { - bool weared_out = titem->addWear(wear); - if(weared_out) - mlist->deleteItem(item_i); - SendInventory(player->peer_id); - } + v3f playerpos = player->getPosition(); + v3f objpos = obj->getBasePosition(); + v3f dir = (objpos - playerpos).normalize(); + + u16 wear = obj->punch(toolname, dir); + + if(titem) + { + bool weared_out = titem->addWear(wear); + if(weared_out) + mlist->deleteItem(item_i); + SendInventory(player->peer_id); } } } + // Right click, do something with object + if(button == 1) + { + // Track hp changes super-crappily + u16 oldhp = player->hp; + + // Do stuff + obj->rightClick(player); + + // Send back stuff + if(player->hp != oldhp) + { + SendPlayerHP(player); + } + } } else if(command == TOSERVER_GROUND_ACTION) { -- cgit v1.2.3 From 4b0c3e435715479ce13df7319298884b1589be22 Mon Sep 17 00:00:00 2001 From: Perttu Ahola Date: Sat, 30 Jul 2011 19:05:25 +0300 Subject: Made picking items up in creative mode delete them (because they usually are in the inventory already anyway) --- src/server.cpp | 12 ++++++------ 1 file changed, 6 insertions(+), 6 deletions(-) (limited to 'src/server.cpp') diff --git a/src/server.cpp b/src/server.cpp index ab60be5cc..b0c087d09 100644 --- a/src/server.cpp +++ b/src/server.cpp @@ -2384,10 +2384,10 @@ void Server::ProcessData(u8 *data, u32 datasize, u16 peer_id) if(item) { - if(g_settings.getBool("creative_mode") == false) + InventoryList *ilist = player->inventory.getList("main"); + if(ilist != NULL) { - InventoryList *ilist = player->inventory.getList("main"); - if(ilist != NULL) + if(g_settings.getBool("creative_mode") == false) { // Skip if inventory has no free space if(ilist->getUsedSlots() == ilist->getSize()) @@ -2400,10 +2400,10 @@ void Server::ProcessData(u8 *data, u32 datasize, u16 peer_id) ilist->addItem(item); UpdateCrafting(player->peer_id); SendInventory(player->peer_id); - - // Remove object from environment - obj->m_removed = true; } + + // Remove object from environment + obj->m_removed = true; } } else -- cgit v1.2.3 From 9b294ffa7a1f3cf7ee19111b7e5f4882f130dd21 Mon Sep 17 00:00:00 2001 From: Perttu Ahola Date: Sat, 30 Jul 2011 19:31:33 +0300 Subject: Added message of the day and made it properly configurable using /#setting (not saved to config file yet) --- src/defaultsettings.cpp | 1 + src/server.cpp | 9 ++++++++- src/servercommand.cpp | 3 ++- src/servercommand.h | 5 ++++- src/strfnd.h | 50 +++++++++++++++++++++++++++++++++++++++++++++++++ 5 files changed, 65 insertions(+), 3 deletions(-) (limited to 'src/server.cpp') diff --git a/src/defaultsettings.cpp b/src/defaultsettings.cpp index 947892d12..c1104eff0 100644 --- a/src/defaultsettings.cpp +++ b/src/defaultsettings.cpp @@ -77,6 +77,7 @@ void set_default_settings() g_settings.setDefault("screenshot_path", "."); // Server stuff + 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/server.cpp b/src/server.cpp index b0c087d09..0b312fbc3 100644 --- a/src/server.cpp +++ b/src/server.cpp @@ -3196,9 +3196,14 @@ void Server::ProcessData(u8 *data, u32 datasize, u16 peer_id) line += L"Server: "; message = message.substr(commandprefix.size()); + + WStrfnd f1(message); + f1.next(L" "); + std::wstring paramstring = f1.next(L""); ServerCommandContext *ctx = new ServerCommandContext( str_split(message, L' '), + paramstring, this, &m_env, player, @@ -4018,7 +4023,9 @@ std::wstring Server::getStatusString() } os<isSavingEnabled() == false) - os<<" WARNING: Map saving is disabled."<parms[1] + L" = " + ctx->parms[2]); + std::string confline = wide_to_narrow( + ctx->parms[1] + L" = " + ctx->paramstring); g_settings.parseConfigLine(confline); os<< L"-!- Setting changed."; } diff --git a/src/servercommand.h b/src/servercommand.h index 9013bc2a6..cee4976b1 100644 --- a/src/servercommand.h +++ b/src/servercommand.h @@ -29,6 +29,7 @@ struct ServerCommandContext { std::vector parms; + std::wstring paramstring; Server* server; ServerEnvironment *env; Player* player; @@ -39,11 +40,13 @@ struct ServerCommandContext ServerCommandContext( std::vector parms, + std::wstring paramstring, Server* server, ServerEnvironment *env, Player* player, u64 privs) - : parms(parms), server(server), env(env), player(player), privs(privs) + : parms(parms), paramstring(paramstring), + server(server), env(env), player(player), privs(privs) { } diff --git a/src/strfnd.h b/src/strfnd.h index 2be92d43b..e3d380e37 100644 --- a/src/strfnd.h +++ b/src/strfnd.h @@ -74,6 +74,56 @@ public: } }; +class WStrfnd{ + std::wstring tek; + unsigned int p; +public: + void start(std::wstring niinq){ + tek = niinq; + p=0; + } + unsigned int where(){ + return p; + } + void to(unsigned int i){ + p = i; + } + std::wstring what(){ + return tek; + } + std::wstring next(std::wstring plop){ + //std::cout<<"tek=\""<=tek.size()"<=tek.size()) return true; + return false; + } + WStrfnd(std::wstring s){ + start(s); + } +}; + inline std::string trim(const std::string &s) { std::string str = s; -- cgit v1.2.3 From cdadbdbd17d624dd45cca67f41309cbe776dc348 Mon Sep 17 00:00:00 2001 From: Perttu Ahola Date: Sat, 30 Jul 2011 19:49:42 +0300 Subject: Server configuration is now written when "/#setting whatever = whatever" is issued. --- src/game.cpp | 5 +++-- src/game.h | 3 ++- src/main.cpp | 5 +++-- src/server.cpp | 10 ++++++---- src/server.h | 13 ++++++++++++- src/servercommand.cpp | 12 +++++++++--- src/servermain.cpp | 2 +- 7 files changed, 36 insertions(+), 14 deletions(-) (limited to 'src/server.cpp') diff --git a/src/game.cpp b/src/game.cpp index 74b8e5029..6c0474ee7 100644 --- a/src/game.cpp +++ b/src/game.cpp @@ -715,7 +715,8 @@ void the_game( std::string password, std::string address, u16 port, - std::wstring &error_message + std::wstring &error_message, + std::string configpath ) { video::IVideoDriver* driver = device->getVideoDriver(); @@ -755,7 +756,7 @@ void the_game( if(address == ""){ draw_load_screen(L"Creating server...", driver, font); std::cout<start(port); } diff --git a/src/game.h b/src/game.h index eb289b8f2..95623316a 100644 --- a/src/game.h +++ b/src/game.h @@ -70,7 +70,8 @@ void the_game( std::string password, std::string address, u16 port, - std::wstring &error_message + std::wstring &error_message, + std::string configpath ); #endif diff --git a/src/main.cpp b/src/main.cpp index 9a9b22f87..3cc748954 100644 --- a/src/main.cpp +++ b/src/main.cpp @@ -1302,7 +1302,7 @@ int main(int argc, char *argv[]) g_timegetter = new SimpleTimeGetter(); // Create server - Server server(map_dir.c_str()); + Server server(map_dir.c_str(), configpath); server.start(port); // Run server @@ -1641,7 +1641,8 @@ int main(int argc, char *argv[]) password, address, port, - error_message + error_message, + configpath ); } //try diff --git a/src/server.cpp b/src/server.cpp index 0b312fbc3..96e64b314 100644 --- a/src/server.cpp +++ b/src/server.cpp @@ -1058,7 +1058,8 @@ u32 PIChecksum(core::list &l) */ Server::Server( - std::string mapsavedir + std::string mapsavedir, + std::string configpath ): m_env(new ServerMap(mapsavedir), this), m_con(PROTOCOL_ID, 512, CONNECTION_TIMEOUT, this), @@ -1069,6 +1070,7 @@ Server::Server( m_time_of_day_send_timer(0), m_uptime(0), m_mapsavedir(mapsavedir), + m_configpath(configpath), m_shutdown_requested(false), m_ignore_map_edit_events(false), m_ignore_map_edit_events_peer_id(0) @@ -3198,7 +3200,7 @@ void Server::ProcessData(u8 *data, u32 datasize, u16 peer_id) message = message.substr(commandprefix.size()); WStrfnd f1(message); - f1.next(L" "); + f1.next(L" "); // Skip over /#whatever std::wstring paramstring = f1.next(L""); ServerCommandContext *ctx = new ServerCommandContext( @@ -4023,9 +4025,9 @@ std::wstring Server::getStatusString() } os<isSavingEnabled() == false) - os<parms[1] + L" = " + ctx->paramstring); + /*std::string confline = wide_to_narrow( + ctx->parms[1] + L" = " + ctx->params[2]);*/ + + std::string confline = wide_to_narrow(ctx->paramstring); + g_settings.parseConfigLine(confline); - os<< L"-!- Setting changed."; + + ctx->server->saveConfig(); + + os<< L"-!- Setting changed and configuration saved."; } void cmd_teleport(std::wostringstream &os, diff --git a/src/servermain.cpp b/src/servermain.cpp index 146c548c5..91fd1d3a5 100644 --- a/src/servermain.cpp +++ b/src/servermain.cpp @@ -323,7 +323,7 @@ int main(int argc, char *argv[]) map_dir = g_settings.get("map-dir"); // Create server - Server server(map_dir.c_str()); + Server server(map_dir.c_str(), configpath); server.start(port); // Run server -- cgit v1.2.3 From 24a662705cb73f8a5630114654c38a0e1328b9ec Mon Sep 17 00:00:00 2001 From: Perttu Ahola Date: Sat, 30 Jul 2011 20:02:17 +0300 Subject: Added network protocol version number in protocol --- src/client.cpp | 8 ++++++-- src/clientserver.h | 3 ++- src/server.cpp | 19 ++++++++++++++++++- 3 files changed, 26 insertions(+), 4 deletions(-) (limited to 'src/server.cpp') diff --git a/src/client.cpp b/src/client.cpp index 7ebb30fba..5f299890a 100644 --- a/src/client.cpp +++ b/src/client.cpp @@ -415,8 +415,9 @@ void Client::step(float dtime) // [0] u16 TOSERVER_INIT // [2] u8 SER_FMT_VER_HIGHEST // [3] u8[20] player_name - // [23] u8[28] password - SharedBuffer data(2+1+PLAYERNAME_SIZE+PASSWORD_SIZE); + // [23] u8[28] password (new in some version) + // [51] u16 client network protocol version (new in some version) + SharedBuffer data(2+1+PLAYERNAME_SIZE+PASSWORD_SIZE+2); writeU16(&data[0], TOSERVER_INIT); writeU8(&data[2], SER_FMT_VER_HIGHEST); @@ -428,6 +429,9 @@ void Client::step(float dtime) memset((char*)&data[23], 0, PASSWORD_SIZE); snprintf((char*)&data[23], PASSWORD_SIZE, "%s", m_password.c_str()); + + // This should be incremented in each version + writeU16(&data[51], 1); // Send as unreliable Send(0, data, false); diff --git a/src/clientserver.h b/src/clientserver.h index 35484fe76..4981b7ea8 100644 --- a/src/clientserver.h +++ b/src/clientserver.h @@ -171,7 +171,8 @@ enum ToServerCommand [0] u16 TOSERVER_INIT [2] u8 SER_FMT_VER_HIGHEST [3] u8[20] player_name - [23] u8[28] password + [23] u8[28] password (new in some version) + [51] u16 client network protocol version (new in some version) */ TOSERVER_INIT2 = 0x11, diff --git a/src/server.cpp b/src/server.cpp index 96e64b314..ca166eaef 100644 --- a/src/server.cpp +++ b/src/server.cpp @@ -1966,6 +1966,23 @@ void Server::ProcessData(u8 *data, u32 datasize, u16 peer_id) derr_server<= 2+1+PLAYERNAME_SIZE+PASSWORD_SIZE+2) + { + net_proto_version = readU16(&data[2+1+PLAYERNAME_SIZE+PASSWORD_SIZE]); + } + if(net_proto_version == 0) + { + SendAccessDenied(m_con, peer_id, + L"Your client is too old (network protocol)"); return; } @@ -1999,7 +2016,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) { // old version - assume blank password password[0] = 0; -- cgit v1.2.3 From f8fca8ca5e1e5cc72ea4a8c46cbf3d4f9a64ad0a Mon Sep 17 00:00:00 2001 From: Perttu Ahola Date: Sat, 30 Jul 2011 20:06:30 +0300 Subject: easier notice on old version --- src/server.cpp | 5 +++-- 1 file changed, 3 insertions(+), 2 deletions(-) (limited to 'src/server.cpp') diff --git a/src/server.cpp b/src/server.cpp index ca166eaef..368f0acbf 100644 --- a/src/server.cpp +++ b/src/server.cpp @@ -1981,9 +1981,10 @@ void Server::ProcessData(u8 *data, u32 datasize, u16 peer_id) } if(net_proto_version == 0) { - SendAccessDenied(m_con, peer_id, + /*SendAccessDenied(m_con, peer_id, L"Your client is too old (network protocol)"); - return; + return;*/ + SendChatMessage(peer_id, L"# Server: NOTE: YOUR CLIENT IS OLD AND DOES NOT WORK PROPERLY WITH THIS SERVER"); } /* -- cgit v1.2.3 From f2051c98223d087c8ba3d7e4514935781c93ed1c Mon Sep 17 00:00:00 2001 From: Perttu Ahola Date: Sat, 30 Jul 2011 20:10:16 +0300 Subject: fix to the former --- src/server.cpp | 15 ++++++++++----- src/server.h | 3 +++ 2 files changed, 13 insertions(+), 5 deletions(-) (limited to 'src/server.cpp') diff --git a/src/server.cpp b/src/server.cpp index 368f0acbf..07f9875c4 100644 --- a/src/server.cpp +++ b/src/server.cpp @@ -1979,13 +1979,13 @@ void Server::ProcessData(u8 *data, u32 datasize, u16 peer_id) { net_proto_version = readU16(&data[2+1+PLAYERNAME_SIZE+PASSWORD_SIZE]); } - if(net_proto_version == 0) + getClient(peer->id)->net_proto_version = net_proto_version; + /*if(net_proto_version == 0) { - /*SendAccessDenied(m_con, peer_id, + SendAccessDenied(m_con, peer_id, L"Your client is too old (network protocol)"); - return;*/ - SendChatMessage(peer_id, L"# Server: NOTE: YOUR CLIENT IS OLD AND DOES NOT WORK PROPERLY WITH THIS SERVER"); - } + return; + }*/ /* Set up player @@ -2182,6 +2182,11 @@ void Server::ProcessData(u8 *data, u32 datasize, u16 peer_id) BroadcastChatMessage(message); } + 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; } diff --git a/src/server.h b/src/server.h index c300d40e6..4a2d667a8 100644 --- a/src/server.h +++ b/src/server.h @@ -235,6 +235,8 @@ public: u16 peer_id; // The serialization version to use with the client u8 serialization_version; + // + u16 net_proto_version; // Version is stored in here after INIT before INIT2 u8 pending_serialization_version; @@ -244,6 +246,7 @@ public: { peer_id = 0; serialization_version = SER_FMT_VER_INVALID; + net_proto_version = 0; pending_serialization_version = SER_FMT_VER_INVALID; m_nearest_unsent_d = 0; m_nearest_unsent_reset_timer = 0.0; -- cgit v1.2.3