Add "simple singleplayer mode"; Fix a number of GUI things
This commit is contained in:
parent
899004207d
commit
6298878bfa
|
@ -658,7 +658,8 @@ void the_game(
|
||||||
std::wstring &error_message,
|
std::wstring &error_message,
|
||||||
std::string configpath,
|
std::string configpath,
|
||||||
ChatBackend &chat_backend,
|
ChatBackend &chat_backend,
|
||||||
const SubgameSpec &gamespec // Used for local game
|
const SubgameSpec &gamespec, // Used for local game,
|
||||||
|
bool simple_singleplayer_mode
|
||||||
)
|
)
|
||||||
{
|
{
|
||||||
video::IVideoDriver* driver = device->getVideoDriver();
|
video::IVideoDriver* driver = device->getVideoDriver();
|
||||||
|
@ -709,7 +710,8 @@ void the_game(
|
||||||
if(address == ""){
|
if(address == ""){
|
||||||
draw_load_screen(L"Creating server...", driver, font);
|
draw_load_screen(L"Creating server...", driver, font);
|
||||||
infostream<<"Creating server"<<std::endl;
|
infostream<<"Creating server"<<std::endl;
|
||||||
server = new Server(map_dir, configpath, gamespec);
|
server = new Server(map_dir, configpath, gamespec,
|
||||||
|
simple_singleplayer_mode);
|
||||||
server->start(port);
|
server->start(port);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@ -1357,7 +1359,7 @@ void the_game(
|
||||||
<<"Launching pause menu"<<std::endl;
|
<<"Launching pause menu"<<std::endl;
|
||||||
// It will delete itself by itself
|
// It will delete itself by itself
|
||||||
(new GUIPauseMenu(guienv, guiroot, -1, g_gamecallback,
|
(new GUIPauseMenu(guienv, guiroot, -1, g_gamecallback,
|
||||||
&g_menumgr))->drop();
|
&g_menumgr, simple_singleplayer_mode))->drop();
|
||||||
|
|
||||||
// Move mouse cursor on top of the disconnect button
|
// Move mouse cursor on top of the disconnect button
|
||||||
input->setMousePos(displaycenter.X, displaycenter.Y+25);
|
input->setMousePos(displaycenter.X, displaycenter.Y+25);
|
||||||
|
|
|
@ -138,7 +138,8 @@ void the_game(
|
||||||
std::wstring &error_message,
|
std::wstring &error_message,
|
||||||
std::string configpath,
|
std::string configpath,
|
||||||
ChatBackend &chat_backend,
|
ChatBackend &chat_backend,
|
||||||
const SubgameSpec &gamespec // Used for local game
|
const SubgameSpec &gamespec, // Used for local game
|
||||||
|
bool simple_singleplayer_mode
|
||||||
);
|
);
|
||||||
|
|
||||||
#endif
|
#endif
|
||||||
|
|
|
@ -720,15 +720,13 @@ void GUIMainMenu::readInput(MainMenuData *dst)
|
||||||
if(e != NULL && e->getType() == gui::EGUIET_TAB_CONTROL)
|
if(e != NULL && e->getType() == gui::EGUIET_TAB_CONTROL)
|
||||||
dst->selected_tab = ((gui::IGUITabControl*)e)->getActiveTab();
|
dst->selected_tab = ((gui::IGUITabControl*)e)->getActiveTab();
|
||||||
}
|
}
|
||||||
if(getTab() == TAB_SINGLEPLAYER)
|
if(dst->selected_tab == TAB_SINGLEPLAYER)
|
||||||
{
|
{
|
||||||
dst->name = L"singleplayer";
|
dst->simple_singleplayer_mode = true;
|
||||||
dst->password = L"";
|
|
||||||
dst->address = L"";
|
|
||||||
dst->port = 30000;
|
|
||||||
}
|
}
|
||||||
else
|
else
|
||||||
{
|
{
|
||||||
|
dst->simple_singleplayer_mode = false;
|
||||||
{
|
{
|
||||||
gui::IGUIElement *e = getElementFromId(GUI_ID_NAME_INPUT);
|
gui::IGUIElement *e = getElementFromId(GUI_ID_NAME_INPUT);
|
||||||
if(e != NULL)
|
if(e != NULL)
|
||||||
|
|
|
@ -45,6 +45,7 @@ struct MainMenuData
|
||||||
bool creative_mode;
|
bool creative_mode;
|
||||||
bool enable_damage;
|
bool enable_damage;
|
||||||
int selected_world;
|
int selected_world;
|
||||||
|
bool simple_singleplayer_mode;
|
||||||
// Actions
|
// Actions
|
||||||
WorldSpec delete_world_spec;
|
WorldSpec delete_world_spec;
|
||||||
std::wstring create_world_name;
|
std::wstring create_world_name;
|
||||||
|
@ -62,7 +63,8 @@ struct MainMenuData
|
||||||
// Server opts
|
// Server opts
|
||||||
creative_mode(false),
|
creative_mode(false),
|
||||||
enable_damage(false),
|
enable_damage(false),
|
||||||
selected_world(0)
|
selected_world(0),
|
||||||
|
simple_singleplayer_mode(false)
|
||||||
{}
|
{}
|
||||||
};
|
};
|
||||||
|
|
||||||
|
|
|
@ -34,10 +34,12 @@ with this program; if not, write to the Free Software Foundation, Inc.,
|
||||||
GUIPauseMenu::GUIPauseMenu(gui::IGUIEnvironment* env,
|
GUIPauseMenu::GUIPauseMenu(gui::IGUIEnvironment* env,
|
||||||
gui::IGUIElement* parent, s32 id,
|
gui::IGUIElement* parent, s32 id,
|
||||||
IGameCallback *gamecallback,
|
IGameCallback *gamecallback,
|
||||||
IMenuManager *menumgr):
|
IMenuManager *menumgr,
|
||||||
GUIModalMenu(env, parent, id, menumgr)
|
bool simple_singleplayer_mode):
|
||||||
|
GUIModalMenu(env, parent, id, menumgr),
|
||||||
|
m_gamecallback(gamecallback),
|
||||||
|
m_simple_singleplayer_mode(simple_singleplayer_mode)
|
||||||
{
|
{
|
||||||
m_gamecallback = gamecallback;
|
|
||||||
}
|
}
|
||||||
|
|
||||||
GUIPauseMenu::~GUIPauseMenu()
|
GUIPauseMenu::~GUIPauseMenu()
|
||||||
|
@ -106,7 +108,7 @@ void GUIPauseMenu::regenerateGui(v2u32 screensize)
|
||||||
*/
|
*/
|
||||||
const s32 btn_height = 30;
|
const s32 btn_height = 30;
|
||||||
const s32 btn_gap = 20;
|
const s32 btn_gap = 20;
|
||||||
const s32 btn_num = 4;
|
const s32 btn_num = m_simple_singleplayer_mode ? 3 : 4;
|
||||||
s32 btn_y = size.Y/2-((btn_num*btn_height+(btn_num-1)*btn_gap))/2;
|
s32 btn_y = size.Y/2-((btn_num*btn_height+(btn_num-1)*btn_gap))/2;
|
||||||
changeCtype("");
|
changeCtype("");
|
||||||
{
|
{
|
||||||
|
@ -116,18 +118,21 @@ void GUIPauseMenu::regenerateGui(v2u32 screensize)
|
||||||
wgettext("Continue"));
|
wgettext("Continue"));
|
||||||
}
|
}
|
||||||
btn_y += btn_height + btn_gap;
|
btn_y += btn_height + btn_gap;
|
||||||
|
if(!m_simple_singleplayer_mode)
|
||||||
{
|
{
|
||||||
core::rect<s32> rect(0, 0, 140, btn_height);
|
{
|
||||||
rect = rect + v2s32(size.X/2-140/2, btn_y);
|
core::rect<s32> rect(0, 0, 140, btn_height);
|
||||||
Environment->addButton(rect, this, 261,
|
rect = rect + v2s32(size.X/2-140/2, btn_y);
|
||||||
wgettext("Change Password"));
|
Environment->addButton(rect, this, 261,
|
||||||
|
wgettext("Change Password"));
|
||||||
|
}
|
||||||
|
btn_y += btn_height + btn_gap;
|
||||||
}
|
}
|
||||||
btn_y += btn_height + btn_gap;
|
|
||||||
{
|
{
|
||||||
core::rect<s32> rect(0, 0, 140, btn_height);
|
core::rect<s32> rect(0, 0, 140, btn_height);
|
||||||
rect = rect + v2s32(size.X/2-140/2, btn_y);
|
rect = rect + v2s32(size.X/2-140/2, btn_y);
|
||||||
Environment->addButton(rect, this, 260,
|
Environment->addButton(rect, this, 260,
|
||||||
wgettext("Disconnect"));
|
wgettext("Exit to Menu"));
|
||||||
}
|
}
|
||||||
btn_y += btn_height + btn_gap;
|
btn_y += btn_height + btn_gap;
|
||||||
{
|
{
|
||||||
|
|
|
@ -37,7 +37,8 @@ public:
|
||||||
GUIPauseMenu(gui::IGUIEnvironment* env,
|
GUIPauseMenu(gui::IGUIEnvironment* env,
|
||||||
gui::IGUIElement* parent, s32 id,
|
gui::IGUIElement* parent, s32 id,
|
||||||
IGameCallback *gamecallback,
|
IGameCallback *gamecallback,
|
||||||
IMenuManager *menumgr);
|
IMenuManager *menumgr,
|
||||||
|
bool simple_singleplayer_mode);
|
||||||
~GUIPauseMenu();
|
~GUIPauseMenu();
|
||||||
|
|
||||||
void removeChildren();
|
void removeChildren();
|
||||||
|
@ -52,6 +53,7 @@ public:
|
||||||
|
|
||||||
private:
|
private:
|
||||||
IGameCallback *m_gamecallback;
|
IGameCallback *m_gamecallback;
|
||||||
|
bool m_simple_singleplayer_mode;
|
||||||
};
|
};
|
||||||
|
|
||||||
#endif
|
#endif
|
||||||
|
|
41
src/main.cpp
41
src/main.cpp
|
@ -1063,7 +1063,7 @@ int main(int argc, char *argv[])
|
||||||
infostream<<"Using gamespec \""<<gamespec.id<<"\""<<std::endl;
|
infostream<<"Using gamespec \""<<gamespec.id<<"\""<<std::endl;
|
||||||
|
|
||||||
// Create server
|
// Create server
|
||||||
Server server(world_path, configpath, gamespec);
|
Server server(world_path, configpath, gamespec, false);
|
||||||
server.start(port);
|
server.start(port);
|
||||||
|
|
||||||
// Run server
|
// Run server
|
||||||
|
@ -1253,6 +1253,13 @@ int main(int argc, char *argv[])
|
||||||
|
|
||||||
SubgameSpec gamespec;
|
SubgameSpec gamespec;
|
||||||
WorldSpec worldspec;
|
WorldSpec worldspec;
|
||||||
|
bool simple_singleplayer_mode = false;
|
||||||
|
|
||||||
|
// These are set up based on the menu and other things
|
||||||
|
std::string current_playername = "inv£lid";
|
||||||
|
std::string current_password = "";
|
||||||
|
std::string current_address = "does-not-exist";
|
||||||
|
int current_port = 0;
|
||||||
|
|
||||||
/*
|
/*
|
||||||
Out-of-game menu loop.
|
Out-of-game menu loop.
|
||||||
|
@ -1377,6 +1384,7 @@ int main(int argc, char *argv[])
|
||||||
int newport = stoi(wide_to_narrow(menudata.port));
|
int newport = stoi(wide_to_narrow(menudata.port));
|
||||||
if(newport != 0)
|
if(newport != 0)
|
||||||
port = newport;
|
port = newport;
|
||||||
|
simple_singleplayer_mode = menudata.simple_singleplayer_mode;
|
||||||
// Save settings
|
// Save settings
|
||||||
g_settings->setS32("selected_mainmenu_tab", menudata.selected_tab);
|
g_settings->setS32("selected_mainmenu_tab", menudata.selected_tab);
|
||||||
g_settings->set("new_style_leaves", itos(menudata.fancy_trees));
|
g_settings->set("new_style_leaves", itos(menudata.fancy_trees));
|
||||||
|
@ -1391,14 +1399,24 @@ int main(int argc, char *argv[])
|
||||||
if(menudata.selected_world != -1)
|
if(menudata.selected_world != -1)
|
||||||
g_settings->set("selected_world_path",
|
g_settings->set("selected_world_path",
|
||||||
worldspecs[menudata.selected_world].path);
|
worldspecs[menudata.selected_world].path);
|
||||||
/*// Update configuration file
|
|
||||||
if(configpath != "")
|
|
||||||
g_settings->updateConfigFile(configpath.c_str());*/
|
|
||||||
|
|
||||||
// Break out of menu-game loop to shut down cleanly
|
// Break out of menu-game loop to shut down cleanly
|
||||||
if(device->run() == false || kill == true)
|
if(device->run() == false || kill == true)
|
||||||
break;
|
break;
|
||||||
|
|
||||||
|
current_playername = playername;
|
||||||
|
current_password = password;
|
||||||
|
current_address = address;
|
||||||
|
current_port = port;
|
||||||
|
|
||||||
|
// If using simple singleplayer mode, override
|
||||||
|
if(simple_singleplayer_mode){
|
||||||
|
current_playername = "singleplayer";
|
||||||
|
current_password = "";
|
||||||
|
current_address = "";
|
||||||
|
current_port = 30011;
|
||||||
|
}
|
||||||
|
|
||||||
// Set world path to selected one
|
// Set world path to selected one
|
||||||
if(menudata.selected_world != -1){
|
if(menudata.selected_world != -1){
|
||||||
worldspec = worldspecs[menudata.selected_world];
|
worldspec = worldspecs[menudata.selected_world];
|
||||||
|
@ -1435,7 +1453,7 @@ int main(int argc, char *argv[])
|
||||||
}
|
}
|
||||||
|
|
||||||
// If local game
|
// If local game
|
||||||
if(address == "")
|
if(current_address == "")
|
||||||
{
|
{
|
||||||
if(menudata.selected_world == -1){
|
if(menudata.selected_world == -1){
|
||||||
error_message = L"No world selected and no address "
|
error_message = L"No world selected and no address "
|
||||||
|
@ -1474,7 +1492,7 @@ int main(int argc, char *argv[])
|
||||||
// Break out of menu-game loop to shut down cleanly
|
// Break out of menu-game loop to shut down cleanly
|
||||||
if(device->run() == false || kill == true)
|
if(device->run() == false || kill == true)
|
||||||
break;
|
break;
|
||||||
|
|
||||||
/*
|
/*
|
||||||
Run game
|
Run game
|
||||||
*/
|
*/
|
||||||
|
@ -1485,14 +1503,15 @@ int main(int argc, char *argv[])
|
||||||
device,
|
device,
|
||||||
font,
|
font,
|
||||||
worldspec.path,
|
worldspec.path,
|
||||||
playername,
|
current_playername,
|
||||||
password,
|
current_password,
|
||||||
address,
|
current_address,
|
||||||
port,
|
current_port,
|
||||||
error_message,
|
error_message,
|
||||||
configpath,
|
configpath,
|
||||||
chat_backend,
|
chat_backend,
|
||||||
gamespec
|
gamespec,
|
||||||
|
simple_singleplayer_mode
|
||||||
);
|
);
|
||||||
|
|
||||||
} //try
|
} //try
|
||||||
|
|
|
@ -836,11 +836,13 @@ void PlayerInfo::PrintLine(std::ostream *s)
|
||||||
Server::Server(
|
Server::Server(
|
||||||
const std::string &path_world,
|
const std::string &path_world,
|
||||||
const std::string &path_config,
|
const std::string &path_config,
|
||||||
const SubgameSpec &gamespec
|
const SubgameSpec &gamespec,
|
||||||
|
bool simple_singleplayer_mode
|
||||||
):
|
):
|
||||||
m_path_world(path_world),
|
m_path_world(path_world),
|
||||||
m_path_config(path_config),
|
m_path_config(path_config),
|
||||||
m_gamespec(gamespec),
|
m_gamespec(gamespec),
|
||||||
|
m_simple_singleplayer_mode(simple_singleplayer_mode),
|
||||||
m_async_fatal_error(""),
|
m_async_fatal_error(""),
|
||||||
m_env(NULL),
|
m_env(NULL),
|
||||||
m_con(PROTOCOL_ID, 512, CONNECTION_TIMEOUT, this),
|
m_con(PROTOCOL_ID, 512, CONNECTION_TIMEOUT, this),
|
||||||
|
@ -880,7 +882,11 @@ Server::Server(
|
||||||
// share/server
|
// share/server
|
||||||
m_path_share = porting::path_share + DIR_DELIM + "server";
|
m_path_share = porting::path_share + DIR_DELIM + "server";
|
||||||
|
|
||||||
infostream<<"Server created for gameid \""<<m_gamespec.id<<"\""<<std::endl;
|
infostream<<"Server created for gameid \""<<m_gamespec.id<<"\"";
|
||||||
|
if(m_simple_singleplayer_mode)
|
||||||
|
infostream<<" in simple singleplayer mode"<<std::endl;
|
||||||
|
else
|
||||||
|
infostream<<std::endl;
|
||||||
infostream<<"- world: "<<m_path_world<<std::endl;
|
infostream<<"- world: "<<m_path_world<<std::endl;
|
||||||
infostream<<"- config: "<<m_path_config<<std::endl;
|
infostream<<"- config: "<<m_path_config<<std::endl;
|
||||||
infostream<<"- game: "<<m_gamespec.path<<std::endl;
|
infostream<<"- game: "<<m_gamespec.path<<std::endl;
|
||||||
|
@ -2105,6 +2111,16 @@ void Server::ProcessData(u8 *data, u32 datasize, u16 peer_id)
|
||||||
SendAccessDenied(m_con, peer_id, L"Invalid password");
|
SendAccessDenied(m_con, peer_id, L"Invalid password");
|
||||||
return;
|
return;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
// Do not allow multiple players in simple singleplayer mode.
|
||||||
|
// This isn't a perfect way to do it, but will suffice for now.
|
||||||
|
if(m_simple_singleplayer_mode && m_clients.size() > 1){
|
||||||
|
infostream<<"Server: Not allowing another client to connect in"
|
||||||
|
<<" simple singleplayer mode"<<std::endl;
|
||||||
|
SendAccessDenied(m_con, peer_id,
|
||||||
|
L"Running in simple singleplayer mode.");
|
||||||
|
return;
|
||||||
|
}
|
||||||
|
|
||||||
// Enforce user limit.
|
// Enforce user limit.
|
||||||
// Don't enforce for users that have some admin right
|
// Don't enforce for users that have some admin right
|
||||||
|
@ -2204,21 +2220,25 @@ void Server::ProcessData(u8 *data, u32 datasize, u16 peer_id)
|
||||||
m_con.Send(peer_id, 0, data, true);
|
m_con.Send(peer_id, 0, data, true);
|
||||||
}
|
}
|
||||||
|
|
||||||
// Send information about server to player in chat
|
// Note things in chat if not in simple singleplayer mode
|
||||||
SendChatMessage(peer_id, getStatusString());
|
if(!m_simple_singleplayer_mode)
|
||||||
|
|
||||||
// Send information about joining in chat
|
|
||||||
{
|
{
|
||||||
std::wstring name = L"unknown";
|
// Send information about server to player in chat
|
||||||
Player *player = m_env->getPlayer(peer_id);
|
SendChatMessage(peer_id, getStatusString());
|
||||||
if(player != NULL)
|
|
||||||
name = narrow_to_wide(player->getName());
|
|
||||||
|
|
||||||
std::wstring message;
|
// Send information about joining in chat
|
||||||
message += L"*** ";
|
{
|
||||||
message += name;
|
std::wstring name = L"unknown";
|
||||||
message += L" joined game";
|
Player *player = m_env->getPlayer(peer_id);
|
||||||
BroadcastChatMessage(message);
|
if(player != NULL)
|
||||||
|
name = narrow_to_wide(player->getName());
|
||||||
|
|
||||||
|
std::wstring message;
|
||||||
|
message += L"*** ";
|
||||||
|
message += name;
|
||||||
|
message += L" joined game";
|
||||||
|
BroadcastChatMessage(message);
|
||||||
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
// Warnings about protocol version can be issued here
|
// Warnings about protocol version can be issued here
|
||||||
|
|
|
@ -410,7 +410,8 @@ public:
|
||||||
Server(
|
Server(
|
||||||
const std::string &path_world,
|
const std::string &path_world,
|
||||||
const std::string &path_config,
|
const std::string &path_config,
|
||||||
const SubgameSpec &gamespec
|
const SubgameSpec &gamespec,
|
||||||
|
bool simple_singleplayer_mode
|
||||||
);
|
);
|
||||||
~Server();
|
~Server();
|
||||||
void start(unsigned short port);
|
void start(unsigned short port);
|
||||||
|
@ -659,6 +660,9 @@ private:
|
||||||
std::string m_path_config;
|
std::string m_path_config;
|
||||||
// Subgame specification
|
// Subgame specification
|
||||||
SubgameSpec m_gamespec;
|
SubgameSpec m_gamespec;
|
||||||
|
// If true, do not allow multiple players and hide some multiplayer
|
||||||
|
// functionality
|
||||||
|
bool m_simple_singleplayer_mode;
|
||||||
|
|
||||||
// Equivalent of /usr/share/minetest/server
|
// Equivalent of /usr/share/minetest/server
|
||||||
std::string m_path_share;
|
std::string m_path_share;
|
||||||
|
|
Loading…
Reference in New Issue