new multiplayer menu, pt2

This commit is contained in:
darkrose 2015-12-17 01:12:48 +10:00
parent b5895604f2
commit c4405af431
3 changed files with 329 additions and 46 deletions

View File

@ -29,6 +29,7 @@
#include <IGUIEditBox.h> #include <IGUIEditBox.h>
#include <IGUIButton.h> #include <IGUIButton.h>
#include <IGUIStaticText.h> #include <IGUIStaticText.h>
#include <IGUIListBox.h>
#include <IGUIFont.h> #include <IGUIFont.h>
#include <IGUIScrollBar.h> #include <IGUIScrollBar.h>
#include "settings.h" #include "settings.h"
@ -48,6 +49,80 @@ GUIMultiplayerMenu::GUIMultiplayerMenu(
m_gamecallback(gamecallback) m_gamecallback(gamecallback)
{ {
m_data.mmdata = data; m_data.mmdata = data;
{
ServerInfo i;
i.name = L"Voxelands Survival Server";
i.addr = L"servers.voxelands.com:30000";
i.mode = L"survival";
i.is_favourite = false;
m_data.servers.push_back(i);
}
{
ServerInfo i;
i.name = L"Voxelands Adventure Server";
i.addr = L"servers.voxelands.com:30001";
i.mode = L"adventure";
i.is_favourite = true;
m_data.servers.push_back(i);
m_data.favourites.push_back(i);
}
{
ServerInfo i;
i.name = L"Voxelands Creative Server";
i.addr = L"servers.voxelands.com:30002";
i.mode = L"creative";
i.is_favourite = false;
m_data.servers.push_back(i);
}
{
ServerInfo i;
i.name = L"old public";
i.addr = L"106.187.103.195:30003";
i.mode = L"adventure";
i.is_favourite = false;
m_data.servers.push_back(i);
}
{
ServerInfo i;
i.name = L"UK Voxelands Survival Server";
i.addr = L"uk.servers.voxelands.com:30000";
i.mode = L"survival";
i.is_favourite = false;
m_data.servers.push_back(i);
}
{
ServerInfo i;
i.name = L"UK Voxelands Adventure Server";
i.addr = L"uk.servers.voxelands.com:30001";
i.mode = L"adventure";
i.is_favourite = false;
m_data.servers.push_back(i);
}
{
ServerInfo i;
i.name = L"UK Voxelands Creative Server";
i.addr = L"uk.servers.voxelands.com:30002";
i.mode = L"creative";
i.is_favourite = false;
m_data.servers.push_back(i);
}
{
ServerInfo i;
i.name = L"DE Holarse Linux-Gaming Voxelands-Server";
i.addr = L"holarse-linuxgaming.de:30000";
i.mode = L"survival";
i.is_favourite = false;
m_data.servers.push_back(i);
}
} }
GUIMultiplayerMenu::~GUIMultiplayerMenu() GUIMultiplayerMenu::~GUIMultiplayerMenu()
@ -151,14 +226,52 @@ void GUIMultiplayerMenu::regenerateGui(v2u32 screensize)
} }
v2s32 topleft_content(250, 0); v2s32 topleft_content(250, 0);
if (m_data.selected_tab == TAB_MP_CUSTOM) {
{ {
core::rect<s32> rect(0, 0, 550, 20); core::rect<s32> rect(0, 0, 550, 20);
rect += topleft_content + v2s32(0, 20); rect += topleft_content + v2s32(0, 10);
gui::IGUIStaticText *t = Environment->addStaticText(wgettext("Multi Player"), rect, false, true, this, -1); gui::IGUIStaticText *t = Environment->addStaticText(wgettext("Multi Player"), rect, false, true, this, -1);
t->setTextAlignment(gui::EGUIA_CENTER, gui::EGUIA_UPPERLEFT); t->setTextAlignment(gui::EGUIA_CENTER, gui::EGUIA_UPPERLEFT);
} }
if (m_data.selected_tab == TAB_MP_CUSTOM) {
{
core::rect<s32> rect(0, 0, 550, 20);
rect += topleft_content + v2s32(0, 30);
gui::IGUIStaticText *t = Environment->addStaticText(wgettext("Custom Connection"), rect, false, true, this, -1);
t->setTextAlignment(gui::EGUIA_CENTER, gui::EGUIA_UPPERLEFT);
}
// Address + port
{
core::rect<s32> rect(0, 0, 110, 20);
rect += topleft_content + v2s32(120, 60);
Environment->addStaticText(wgettext("Address/Port"), rect, false, true, this, -1);
}
{
if (text_address == L"")
text_address = L"servers.voxelands.com";
core::rect<s32> rect(0, 0, 230, 30);
rect += topleft_content + v2s32(135, 90);
#if USE_FREETYPE
new gui::intlGUIEditBox(text_address.c_str(), true, Environment, this, GUI_ID_ADDRESS_INPUT, rect);
#else
Environment->addEditBox(text_address.c_str(), rect, false, this, GUI_ID_ADDRESS_INPUT);
#endif
}
{
core::rect<s32> rect(0, 0, 120, 30);
rect += topleft_content + v2s32(245, 125);
#if USE_FREETYPE
new gui::intlGUIEditBox(text_port.c_str(), true, Environment, this, GUI_ID_PORT_INPUT, rect);
#else
Environment->addEditBox(text_port.c_str(), rect, false, this, GUI_ID_PORT_INPUT);
#endif
}
{
core::rect<s32> rect(0, 0, 180, 30);
rect += topleft_content + v2s32(160, 160);
Environment->addButton(rect, this, GUI_ID_CONNECT_BUTTON, wgettext("Connect"));
}
}else if (m_data.selected_tab == TAB_MP_CONNECT) {
// Nickname + password // Nickname + password
{ {
core::rect<s32> rect(0, 0, 110, 20); core::rect<s32> rect(0, 0, 110, 20);
@ -186,41 +299,94 @@ void GUIMultiplayerMenu::regenerateGui(v2u32 screensize)
e->setPasswordBox(true); e->setPasswordBox(true);
Environment->setFocus(e); Environment->setFocus(e);
}
// Address + port
{
core::rect<s32> rect(0, 0, 110, 20);
rect += topleft_content + v2s32(120, 170);
Environment->addStaticText(wgettext("Address/Port"), rect, false, true, this, -1);
}
{
if (text_address == L"")
text_address = L"servers.voxelands.com";
core::rect<s32> rect(0, 0, 230, 30);
rect += topleft_content + v2s32(135, 200);
#if USE_FREETYPE
new gui::intlGUIEditBox(text_address.c_str(), true, Environment, this, GUI_ID_ADDRESS_INPUT, rect);
#else
Environment->addEditBox(text_address.c_str(), rect, false, this, GUI_ID_ADDRESS_INPUT);
#endif
}
{
core::rect<s32> rect(0, 0, 120, 30);
rect += topleft_content + v2s32(245, 240);
#if USE_FREETYPE
new gui::intlGUIEditBox(text_port.c_str(), true, Environment, this, GUI_ID_PORT_INPUT, rect);
#else
Environment->addEditBox(text_port.c_str(), rect, false, this, GUI_ID_PORT_INPUT);
#endif
}
// Start game button // Start game button
{ {
core::rect<s32> rect(0, 0, 180, 30); core::rect<s32> rect(0, 0, 180, 30);
rect += topleft_content + v2s32(160, 290); rect += topleft_content + v2s32(160, 160);
Environment->addButton(rect, this, GUI_ID_START_BUTTON, wgettext("Join Server"));
}
}
}else{
gui::IGUIListBox *box = NULL;
gui::IGUIStaticText *header = NULL;
std::vector<ServerInfo> *list = NULL;
{
core::rect<s32> rect(0, 0, 550, 20);
rect += topleft_content + v2s32(0, 30);
header = Environment->addStaticText(L"", rect, false, true, this, -1);
header->setTextAlignment(gui::EGUIA_CENTER, gui::EGUIA_UPPERLEFT);
}
{
core::rect<s32> rect(0, 0, 350, 200);
rect += topleft_content + v2s32(100, 60);
box = Environment->addListBox(rect, this, GUI_ID_SERVER_LIST, true);
box->setItemHeight(25);
}
if (m_data.selected_tab == TAB_MP_FAVOURITES) {
header->setText(wgettext("My Favourites"));
list = &m_data.favourites;
}else{
header->setText(wgettext("Server List"));
list = &m_data.servers;
{
core::rect<s32> rect(0, 0, 180, 25);
rect += topleft_content + v2s32(270, 260);
Environment->addButton(rect, this, GUI_ID_REFRESH_BUTTON, wgettext("Get New List"));
}
}
for (std::vector<ServerInfo>::iterator i = list->begin(); i != list->end(); i++) {
box->addItem(i->name.c_str());
}
if (m_data.selected_row > -1) {
ServerInfo info = list->at(m_data.selected_row);
if (info.name == L"") {
m_data.selected_row = -1;
}else{
box->setSelected(m_data.selected_row);
{
core::rect<s32> rect(0, 0, 550, 20);
rect += topleft_content + v2s32(0, 300);
gui::IGUIStaticText *t = Environment->addStaticText(info.name.c_str(), rect, false, true, this, -1);
t->setTextAlignment(gui::EGUIA_CENTER, gui::EGUIA_UPPERLEFT);
}
{
core::rect<s32> rect(0, 0, 350, 20);
rect += topleft_content + v2s32(100, 330);
gui::IGUIStaticText *t = Environment->addStaticText(info.addr.c_str(), rect, false, true, this, -1);
t->setTextAlignment(gui::EGUIA_UPPERLEFT, gui::EGUIA_UPPERLEFT);
}
{
core::rect<s32> rect(0, 0, 350, 20);
rect += topleft_content + v2s32(100, 350);
gui::IGUIStaticText *t = Environment->addStaticText(info.mode.c_str(), rect, false, true, this, -1);
t->setTextAlignment(gui::EGUIA_UPPERLEFT, gui::EGUIA_UPPERLEFT);
}
if (info.is_favourite) {
{
core::rect<s32> rect(0, 0, 180, 30);
rect += topleft_content + v2s32(80, 390);
Environment->addButton(rect, this, GUI_ID_REMFAV_BUTTON, wgettext("Remove from Favourites"));
}
}else{
{
core::rect<s32> rect(0, 0, 180, 30);
rect += topleft_content + v2s32(80, 390);
Environment->addButton(rect, this, GUI_ID_ADDFAV_BUTTON, wgettext("Add to Favourites"));
}
}
{
core::rect<s32> rect(0, 0, 180, 30);
rect += topleft_content + v2s32(270, 390);
Environment->addButton(rect, this, GUI_ID_CONNECT_BUTTON, wgettext("Connect")); Environment->addButton(rect, this, GUI_ID_CONNECT_BUTTON, wgettext("Connect"));
} }
}else if (m_data.selected_tab == TAB_MP_FAVOURITES) { }
}else{ }
} }
} }
@ -285,6 +451,30 @@ bool GUIMultiplayerMenu::acceptInput()
if (e != NULL) if (e != NULL)
m_data.mmdata->port = e->getText(); m_data.mmdata->port = e->getText();
} }
{
gui::IGUIListBox *e = (gui::IGUIListBox*)getElementFromId(GUI_ID_SERVER_LIST);
if (e != NULL)
m_data.selected_row = e->getSelected();
if (m_data.selected_row > -1) {
if (m_data.selected_tab == TAB_MP_LIST) {
ServerInfo info = m_data.servers.at(m_data.selected_row);
if (info.name == L"")
m_data.selected_row = -1;
WStrfnd sf(info.addr);
m_data.mmdata->address = sf.next(L":");
m_data.mmdata->port = sf.end();
}else if (m_data.selected_tab == TAB_MP_FAVOURITES) {
ServerInfo info = m_data.favourites.at(m_data.selected_row);
if (info.name == L"")
m_data.selected_row = -1;
WStrfnd sf(info.addr);
m_data.mmdata->address = sf.next(L":");
m_data.mmdata->port = sf.end();
}else if (m_data.selected_tab != TAB_MP_CONNECT) {
m_data.selected_row = -1;
}
}
}
return true; return true;
} }
bool GUIMultiplayerMenu::OnEvent(const SEvent& event) bool GUIMultiplayerMenu::OnEvent(const SEvent& event)
@ -318,21 +508,90 @@ bool GUIMultiplayerMenu::OnEvent(const SEvent& event)
} }
if (event.GUIEvent.EventType == gui::EGET_BUTTON_CLICKED) { if (event.GUIEvent.EventType == gui::EGET_BUTTON_CLICKED) {
switch (event.GUIEvent.Caller->getID()) { switch (event.GUIEvent.Caller->getID()) {
case GUI_ID_CONNECT_BUTTON: // Start game case GUI_ID_START_BUTTON: // Start game
acceptInput(); acceptInput();
m_accepted = false;
m_gamecallback->startGame(); m_gamecallback->startGame();
quitMenu(); quitMenu();
return true; return true;
case GUI_ID_CONNECT_BUTTON:
acceptInput();
m_data.selected_tab = TAB_MP_CONNECT;
regenerateGui(m_screensize);
return true;
case GUI_ID_REMFAV_BUTTON:
acceptInput();
if (m_data.selected_row > -1) {
if (m_data.selected_tab == TAB_MP_LIST) {
ServerInfo &info = m_data.servers.at(m_data.selected_row);
if (info.is_favourite) {
info.is_favourite = false;
for (
std::vector<ServerInfo>::iterator i = m_data.favourites.begin();
i != m_data.favourites.end();
i++
) {
if (
i->name == info.name
&& i->addr == info.addr
&& i->mode == info.mode
) {
m_data.favourites.erase(i);
break;
}
}
}
}else if (m_data.selected_tab == TAB_MP_FAVOURITES) {
ServerInfo &info = m_data.favourites.at(m_data.selected_row);
if (info.is_favourite) {
m_data.favourites.erase(m_data.favourites.begin()+m_data.selected_row);
for (
std::vector<ServerInfo>::iterator i = m_data.servers.begin();
i != m_data.servers.end();
i++
) {
if (
i->name == info.name
&& i->addr == info.addr
&& i->mode == info.mode
) {
i->is_favourite = false;
break;
}
}
m_data.selected_row = -1;
}
}
}
regenerateGui(m_screensize);
return true;
case GUI_ID_ADDFAV_BUTTON:
acceptInput();
if (m_data.selected_tab == TAB_MP_LIST && m_data.selected_row > -1) {
ServerInfo &info = m_data.servers.at(m_data.selected_row);
if (info.name != L"" && !info.is_favourite) {
info.is_favourite = true;
m_data.favourites.push_back(info);
}
}
regenerateGui(m_screensize);
return true;
case GUI_ID_TAB_MP_LIST: case GUI_ID_TAB_MP_LIST:
acceptInput(); acceptInput();
m_accepted = false; m_accepted = false;
if (m_data.selected_tab != TAB_MP_LIST) {
m_data.selected_tab = TAB_MP_LIST; m_data.selected_tab = TAB_MP_LIST;
m_data.selected_row = -1;
}
regenerateGui(m_screensize); regenerateGui(m_screensize);
return true; return true;
case GUI_ID_TAB_MP_FAVOURITES: case GUI_ID_TAB_MP_FAVOURITES:
acceptInput(); acceptInput();
m_accepted = false; m_accepted = false;
if (m_data.selected_tab != TAB_MP_FAVOURITES) {
m_data.selected_tab = TAB_MP_FAVOURITES; m_data.selected_tab = TAB_MP_FAVOURITES;
m_data.selected_row = -1;
}
regenerateGui(m_screensize); regenerateGui(m_screensize);
return true; return true;
case GUI_ID_TAB_MP_CUSTOM: case GUI_ID_TAB_MP_CUSTOM:
@ -347,10 +606,6 @@ bool GUIMultiplayerMenu::OnEvent(const SEvent& event)
return true; return true;
} }
} }
if (event.GUIEvent.EventType == gui::EGET_SCROLL_BAR_CHANGED) {
//switch (event.GUIEvent.Caller->getID()) {
//}
}
if (event.GUIEvent.EventType == gui::EGET_EDITBOX_ENTER) { if (event.GUIEvent.EventType == gui::EGET_EDITBOX_ENTER) {
switch (event.GUIEvent.Caller->getID()) { switch (event.GUIEvent.Caller->getID()) {
case GUI_ID_ADDRESS_INPUT: case GUI_ID_ADDRESS_INPUT:
@ -363,6 +618,16 @@ bool GUIMultiplayerMenu::OnEvent(const SEvent& event)
return true; return true;
} }
} }
if (
event.GUIEvent.EventType == gui::EGET_LISTBOX_CHANGED
|| event.GUIEvent.EventType == gui::EGET_LISTBOX_SELECTED_AGAIN
) {
if (event.GUIEvent.Caller->getID() == GUI_ID_SERVER_LIST) {
acceptInput();
regenerateGui(m_screensize);
return true;
}
}
} }
return Parent ? Parent->OnEvent(event) : false; return Parent ? Parent->OnEvent(event) : false;
} }

View File

@ -36,9 +36,13 @@
enum enum
{ {
GUI_ID_CONNECT_BUTTON = 101, GUI_ID_START_BUTTON = 101,
// full list GUI_ID_CONNECT_BUTTON,
// favourites // full list/favourites
GUI_ID_SERVER_LIST,
GUI_ID_ADDFAV_BUTTON,
GUI_ID_REMFAV_BUTTON,
GUI_ID_REFRESH_BUTTON,
// custom connect // custom connect
GUI_ID_NAME_INPUT, GUI_ID_NAME_INPUT,
GUI_ID_PW_INPUT, GUI_ID_PW_INPUT,
@ -54,7 +58,15 @@ enum
enum { enum {
TAB_MP_LIST=0, TAB_MP_LIST=0,
TAB_MP_FAVOURITES, TAB_MP_FAVOURITES,
TAB_MP_CUSTOM TAB_MP_CUSTOM,
TAB_MP_CONNECT
};
struct ServerInfo {
std::wstring name;
std::wstring addr;
std::wstring mode;
bool is_favourite;
}; };
struct MultiplayerMenuData struct MultiplayerMenuData
@ -62,14 +74,16 @@ struct MultiplayerMenuData
MultiplayerMenuData(): MultiplayerMenuData():
// Generic // Generic
selected_tab(TAB_MP_LIST), selected_tab(TAB_MP_LIST),
selected_row(-1),
mmdata(NULL) mmdata(NULL)
{} {}
// These are in the native format of the gui elements
// Generic // Generic
int selected_tab; int selected_tab;
int selected_row;
// Options // Options
std::vector<ServerInfo> servers;
std::vector<ServerInfo> favourites;
// server address/port/etc is stored in here // server address/port/etc is stored in here
MainMenuData *mmdata; MainMenuData *mmdata;
}; };

View File

@ -120,6 +120,10 @@ public:
//std::cout<<"palautus=\""<<palautus<<"\""<<std::endl; //std::cout<<"palautus=\""<<palautus<<"\""<<std::endl;
return palautus; return palautus;
} }
std::wstring end()
{
return tek.substr(p,tek.size()-p);
}
bool atend(){ bool atend(){
if(p>=tek.size()) return true; if(p>=tek.size()) return true;
return false; return false;