17 Commits

Author SHA1 Message Date
c76e897e06 Fixes #3: Crash when APM toggled in intro screen 2024-06-04 20:54:54 +01:00
chucky-n-ice
349322cad0 fix: redrawing admin company buttons; hang windows to parent window; code reworked 2024-06-03 21:02:07 +02:00
chucky-n-ice
a52c2f1413 Add: join last server from intro menue 2024-06-02 18:43:06 +02:00
chucky-n-ice
15475d644d Adjusting of the code. 2024-06-02 12:57:53 +02:00
dP
472cac5e15 Fix polyrail endpoint update when removing 2024-05-16 20:20:00 +02:00
chucky-n-ice
a4c524dd06 Add: admin company buttons 2024-05-15 19:48:17 +02:00
chucky-n-ice
ab587a163a Fix: merge error (ninja build stopped) 2024-05-06 20:54:44 +02:00
chucky-n-ice
b11f5a76a9 Update branch 2024-05-06 20:21:26 +02:00
chucky-n-ice
f9a2f4e8a2 Add: Admin login for n-ice/btpro 2024-05-06 20:06:32 +02:00
e776135d7d fix: Login uri was impossible to change 2024-04-26 21:46:35 +02:00
Chucky
93871cc260 Merge branch 'citymania-org:master' into origin_14.x 2024-04-26 21:32:05 +02:00
chucky-n-ice
c7daaa1f0d Feature: login window for identified community 2024-04-23 22:06:07 +02:00
Chucky
5782b849a6 Merge branch 'citymania-org:master' into origin_14.x 2024-04-20 10:26:17 +02:00
Chucky
6603de47ff Merge branch 'citymania-org:master' into origin_14.x 2024-04-19 20:41:53 +02:00
chucky-n-ice
6afde1cb7d Fix: visual studio include error 2024-04-19 19:47:00 +02:00
d165533e9a Fix: Use Md5 new interface, and fmt 2024-04-19 19:46:36 +02:00
chucky-n-ice
269a557c6f Fault: creation of md5salt from given password 2024-04-19 19:43:44 +02:00
10 changed files with 784 additions and 223 deletions

View File

@@ -6,6 +6,7 @@
#include "cm_main.hpp"
#include "../network/core/http.h" //HttpCallback
#include "../network/network_client.h" //for servername
#include "core/geometry_func.hpp" //maxdim
#include "settings_type.h"
#include "settings_func.h" //saveconfig
@@ -29,20 +30,33 @@ namespace citymania {
bool _novahost = true;
IniFile *_inilogin = NULL;
/* admin company buttons */
bool _admin = false;
int ACB_left = 0;
int ACB_top = 0;
int ACB_width = 0;
int ACB_Location[3][15];
static const int HTTPBUFLEN = 1024;
static const int MAX_COMMUNITY_STRING_LEN = 128;
static constexpr std::string_view NICE_HTTP_LOGIN = "http://n-ice.org/openttd/gettoken_md5salt.php?user={}&password={}";
static constexpr std::string_view BTPRO_HTTP_LOGIN = "http://openttd.btpro.nl/gettoken-enc.php?user={}&password={}";
static const std::string CFG_LOGIN_FILE = "citymania.cfg";
static const std::string CFG_FILE = "citymania.cfg";
static const std::string CFG_LOGIN_KEY = "login";
static const std::string CFG_SERVER_KEY = "server";
static const char * const NOVAPOLIS_LOGIN = "citymania_login";
static const char * const NOVAPOLIS_PW = "citymania_pw";
static const char * const NICE_LOGIN = "nice_login";
static const char * const NICE_PW = "nice_pw";
static const char * const BTPRO_LOGIN = "btpro_login";
static const char * const BTPRO_PW = "btpro_pw";
static const char * const NICE_ADMIN_PW = "nice_admin_pw";
static const char * const BTPRO_ADMIN_PW = "btpro_admin_pw";
static const char * const ADMIN = "admin";
static const char * const COMMUNITY = "community";
static const char * const INI_LOGIN_KEYS[] = {
NOVAPOLIS_LOGIN,
@@ -51,8 +65,17 @@ static const char * const INI_LOGIN_KEYS[] = {
NICE_PW,
BTPRO_LOGIN,
BTPRO_PW,
NICE_ADMIN_PW,
BTPRO_ADMIN_PW,
ADMIN,
};
static const char *const INI_SERVER_KEYS[] = {
COMMUNITY,
};
/** Widget number of the commands window. */
enum CommandsToolbarWidgets {
CTW_BACKGROUND,
@@ -122,29 +145,58 @@ enum CommandsToolbarCargoOption {
};
enum LoginWindowWidgets {
LWW_NOVAPOLIS,
LWW_NICE,
LWW_BTPRO,
LWW_NOVAPOLIS_LOGIN,
LWW_NOVAPOLIS_PW,
LWW_NICE_LOGIN,
LWW_NICE_PW,
LWW_BTPRO_LOGIN,
LWW_BTPRO_PW,
LWW_USER_NAME,
LWW_USER_PW,
LWW_ADMIN_PW,
LWW_USER_LOGIN,
LWW_USER_LOGOUT,
LWW_ADMIN_LOGIN,
LWW_ADMIN_LOGOUT,
LWW_COMMUNITY,
LWW_USERNAME,
LWW_PASSWORD,
};
enum LoginWindowQueryWidgets {
LQW_NOVAPOLIS,
LQW_NICE,
LQW_BTPRO,
LQW_NOVAPOLIS_LOGIN,
LQW_NOVAPOLIS_PW,
LQW_NICE_LOGIN,
LQW_NICE_PW,
LQW_BTPRO_LOGIN,
LQW_BTPRO_PW,
LQW_USER_NAME,
LQW_USER_PW,
LQW_ADMIN_PW
};
enum AdminCompanyButtonsWidgets {
ACB_COMPANY_EMPTY,
ACB_COMPANY_LOCK,
ACB_COMPANY_UNLOCK,
ACB_COMPANY_NEWSTICKET,
ACB_COMPANY_NEWSTICKET_COMP,
ACB_COMPANY_RESET,
ACB_COMPANY_RESET_SPEC,
ACB_COMPANY_RESET_KICK,
ACB_COMPANY_KNOWN,
ACB_COMPANY_RESET_KNOWN,
ACB_COMPANY_MOVE_PLAYER,
ACB_RESET_COMPANY_TIMER_120,
ACB_RESET_COMPANY_TIMER,
ACB_RESET_COMPANY_TIMER_CANCEL,
ACB_COMPANY_SUSPEND,
ACB_COMPANY_UNSUSPEND,
ACB_COMPANY_AWARNING,
ACB_COMPANY_JOIN2,
ACB_COMPANY_LEAVE,
ACB_COMPANY_CANCEL,
ACB_COMPANY_CAPTION,
};
enum AdminCompanyButtonsQueryWidgets {
ACBQ_RESET_COMPANY_TIMER,
ACBQ_COMPANY_NEWSTICKET,
ACBQ_COMPANY_NEWSTICKET_COMP,
ACBQ_COMPANY_MOVE_PLAYER,
};
enum LastServerWidgets {
LSW_CAPTION,
LSW_BUTTON,
};
enum CommunityName {
@@ -160,17 +212,24 @@ enum IniLoginKeys {
NICEPW,
BTPROUSER,
BTPROPW,
NICEADMINPW,
BTPROADMINPW,
IS_ADMIN,
};
char _inilogindata[6][MAX_COMMUNITY_STRING_LEN];
char _inilogindata[9][MAX_COMMUNITY_STRING_LEN];
void AccountLogin(CommunityName community);
void IniReloadLogin();
void ShowAdminCompanyButtons(int companyid = INVALID_COMPANY);
bool novahost() {
return _novahost;
}
/* for company_gui */
bool GetAdmin() { return _admin; }
// void strtomd5(char * buf, char * bufend, int length){
// MD5Hash digest;
// Md5 checksum;
@@ -196,11 +255,16 @@ bool novahost() {
//ini login hadling
void IniLoginInitiate(){
void IniInitiate(){
if(_inilogin != NULL) return; //it was already set
_inilogin = new IniFile({CFG_LOGIN_KEY});
_inilogin->LoadFromDisk(CFG_LOGIN_FILE, BASE_DIR);
_inilogin->LoadFromDisk(CFG_FILE, BASE_DIR);
try {
IniReloadLogin();
}
catch (...){
return;
}
}
std::string GetLoginItem(const std::string& itemname){
@@ -209,6 +273,12 @@ std::string GetLoginItem(const std::string& itemname){
return item.value.value_or("");
}
std::string GetServerItem(const std::string &itemname) {
IniGroup &group = _inilogin->GetOrCreateGroup(CFG_SERVER_KEY);
IniItem &item = group.GetOrCreateItem(itemname);
return item.value.value_or("");
}
void IniReloadLogin(){
for(int i = 0, len = lengthof(INI_LOGIN_KEYS); i < len; i++){
auto str = GetLoginItem(INI_LOGIN_KEYS[i]);
@@ -223,10 +293,22 @@ void SetLoginItem(const std::string& itemname, const std::string& value){
IniGroup &group = _inilogin->GetOrCreateGroup(CFG_LOGIN_KEY);
IniItem &item = group.GetOrCreateItem(itemname);
item.SetValue(value);
_inilogin->SaveToDisk(fmt::format("{}{}", _personal_dir, CFG_LOGIN_FILE));
_inilogin->SaveToDisk(fmt::format("{}{}", _personal_dir, CFG_FILE));
IniReloadLogin();
}
void SetServerItem(const std::string &itemname, const std::string &value) {
IniGroup &group = _inilogin->GetOrCreateGroup(CFG_SERVER_KEY);
IniItem &item = group.GetOrCreateItem(itemname);
item.SetValue(value);
_inilogin->SaveToDisk(fmt::format("{}{}", _personal_dir, CFG_FILE));
}
/** Commands toolbar window handler. */
/*
struct CommandsToolbarWindow : Window {
@@ -566,17 +648,17 @@ void ShowCommandsToolbar()
// login window
class GetHTTPContent: public HTTPCallback {
public:
GetHTTPContent(const std::string &uri): uri{uri} {
GetHTTPContent() {
this->proccessing = false;
this->buf_last = lastof(buf);
}
bool proccessing;
bool proccessing = false;
void InitiateLoginSequence() {
void InitiateLoginSequence(const std::string& uri) {
if(this->proccessing) return;
this->proccessing = true;
this->cursor = this->buf;
NetworkHTTPSocketHandler::Connect(this->uri, this);
NetworkHTTPSocketHandler::Connect(uri, this);
}
void OnReceiveData(std::unique_ptr<char[]> data, size_t length) override {
@@ -602,7 +684,7 @@ public:
void LoginAlready(){
if(strlen(this->buf) == 4 && _networking){
NetworkClientSendChatToServer(fmt::format("!login {}", this->buf));
} else{
} else {
ShowErrorMessage(CM_STR_LOGIN_ERROR_BAD_INPUT, INVALID_STRING_ID, WL_ERROR);
}
this->proccessing = false;
@@ -614,7 +696,6 @@ private:
char buf[HTTPBUFLEN];
char *buf_last;
char *cursor;
std::string uri;
};
std::string urlencode(const std::string &s) {
@@ -656,80 +737,118 @@ void AccountLogin(CommunityName community){
uri = fmt::format(NICE_HTTP_LOGIN, GetLoginItem(NICE_LOGIN), GetLoginItem(NICE_PW));
break;
case BTPRO: {
uri = fmt::format(BTPRO_HTTP_LOGIN,
btpro_encode(GetLoginItem(BTPRO_LOGIN).c_str()),
btpro_encode(GetLoginItem(BTPRO_PW).c_str()));
uri = fmt::format(BTPRO_HTTP_LOGIN, btpro_encode(GetLoginItem(BTPRO_LOGIN).c_str()),btpro_encode(GetLoginItem(BTPRO_PW).c_str()));
break;
}
default:
return;
}
static GetHTTPContent login(uri);
login.InitiateLoginSequence();
static GetHTTPContent login{};
login.InitiateLoginSequence(uri);
}
//login window
struct LoginWindow : Window {
LoginWindowQueryWidgets query_widget;
std::int8_t _community = stoi(GetServerItem(COMMUNITY));
LoginWindow(WindowDesc *desc, WindowNumber window_number) : Window(desc)
{
this->InitNested(window_number);
// if(_novahost || !_networking){
// this->DisableWidget(LWW_NICE);
// this->DisableWidget(LWW_BTPRO);
// }
// if(!_novahost || !_networking) this->DisableWidget(LWW_NOVAPOLIS);
if ((_community == 1) || (_community == 2) || (_community == 3)) this->InitNested(window_number);
//no need for citymania
if (_community == 3) {
this->DisableWidget(LWW_ADMIN_LOGIN);
this->DisableWidget(LWW_ADMIN_LOGOUT);
this->DisableWidget(LWW_ADMIN_PW);
}
}
void SetStringParameters(int widget) const override
{
switch(widget){
case LWW_NOVAPOLIS_LOGIN:
SetDParamStr(0, _inilogindata[NOVAPOLISUSER]);
//username
case LWW_USER_NAME: {
switch (_community) {
case 1: SetDParamStr(0, _inilogindata[NICEUSER]); break;
case 2: SetDParamStr(0, _inilogindata[BTPROUSER]); break;
case 3: SetDParamStr(0, _inilogindata[NOVAPOLISUSER]); break;
}
break;
case LWW_NOVAPOLIS_PW:
SetDParam(0, (GetLoginItem(NOVAPOLIS_PW).empty() ? CM_STR_LOGIN_WINDOW_NOT_SET : CM_STR_LOGIN_WINDOW_SET));
}
//password
case LWW_USER_PW: {
switch (_community) {
case 1: SetDParam(0, (GetLoginItem(NICE_PW).empty() ? CM_STR_LOGIN_WINDOW_NOT_SET : CM_STR_LOGIN_WINDOW_SET)); break;
case 2: SetDParam(0, (GetLoginItem(BTPRO_PW).empty() ? CM_STR_LOGIN_WINDOW_NOT_SET : CM_STR_LOGIN_WINDOW_SET)); break;
case 3: SetDParam(0, (GetLoginItem(NOVAPOLIS_PW).empty() ? CM_STR_LOGIN_WINDOW_NOT_SET : CM_STR_LOGIN_WINDOW_SET)); break;
}
break;
case LWW_NICE_LOGIN:
SetDParamStr(0, _inilogindata[NICEUSER]);
}
//admin password
case LWW_ADMIN_PW: {
switch (_community) {
case 1: SetDParam(0, (GetLoginItem(NICE_ADMIN_PW).empty() ? CM_STR_LOGIN_WINDOW_NOT_SET : CM_STR_LOGIN_WINDOW_SET)); break;
case 2: SetDParam(0, (GetLoginItem(BTPRO_ADMIN_PW).empty() ? CM_STR_LOGIN_WINDOW_NOT_SET : CM_STR_LOGIN_WINDOW_SET)); break;
//case 3: SetDParam(0, (GetLoginItem(NOVAPOLIS_PW).empty() ? CM_STR_LOGIN_WINDOW_NOT_SET : CM_STR_LOGIN_WINDOW_SET)); break;
}
break;
case LWW_NICE_PW:
SetDParam(0, (GetLoginItem(NICE_PW).empty() ? CM_STR_LOGIN_WINDOW_NOT_SET : CM_STR_LOGIN_WINDOW_SET));
break;
case LWW_BTPRO_LOGIN:
SetDParamStr(0, _inilogindata[BTPROUSER]);
break;
case LWW_BTPRO_PW:
SetDParam(0, (GetLoginItem(BTPRO_PW).empty() ? CM_STR_LOGIN_WINDOW_NOT_SET : CM_STR_LOGIN_WINDOW_SET));
}
//community name
case LWW_COMMUNITY: {
switch (_community) {
case 1: SetDParam(0, CM_STR_LOGIN_WINDOW_NICE); break;
case 2: SetDParam(0, CM_STR_LOGIN_WINDOW_BTPRO); break;
case 3: SetDParam(0, CM_STR_LOGIN_WINDOW_CITYMANIA); break;
}
break;
}
}
}
void OnClick([[maybe_unused]] Point pt, int widget, [[maybe_unused]] int click_count) override
{
switch (widget) {
case LWW_NOVAPOLIS:
if(/*_novahost && */_networking) AccountLogin(CITYMANIA);
break;
case LWW_NICE:
if(_networking) AccountLogin(NICE);
break;
case LWW_BTPRO:
if(_networking) AccountLogin(BTPRO);
break;
case LWW_NOVAPOLIS_LOGIN:
case LWW_NICE_LOGIN:
case LWW_BTPRO_LOGIN:
case LWW_USER_NAME:
this->query_widget = (LoginWindowQueryWidgets)widget;
ShowQueryString(STR_EMPTY, CM_STR_LOGIN_WINDOW_CHANGE_USERNAME, MAX_COMMUNITY_STRING_LEN, this, CS_ALPHANUMERAL, QSF_NONE);
break;
case LWW_NOVAPOLIS_PW:
case LWW_NICE_PW:
case LWW_BTPRO_PW:
case LWW_USER_PW:
this->query_widget = (LoginWindowQueryWidgets)widget;
ShowQueryString(STR_EMPTY, CM_STR_LOGIN_WINDOW_CHANGE_PASSWORD, MAX_COMMUNITY_STRING_LEN, this, CS_ALPHANUMERAL, QSF_NONE);
break;
case LWW_ADMIN_PW:
this->query_widget = (LoginWindowQueryWidgets)widget;
ShowQueryString(STR_EMPTY, CM_STR_LOGIN_WINDOW_CHANGE_PASSWORD, MAX_COMMUNITY_STRING_LEN, this, CS_ALPHANUMERAL, QSF_NONE);
break;
case LWW_USER_LOGIN: {
switch (_community) {
case 1: if(_networking) AccountLogin(NICE); break;
case 2: if(_networking) AccountLogin(BTPRO); break;
case 3: if(/*_novahost && */_networking) AccountLogin(CITYMANIA); break;
}
break;
}
case LWW_USER_LOGOUT:
NetworkClientSendChatToServer("!logout"); break;
case LWW_ADMIN_LOGIN: {
switch (_community) {
case 1: {
if(_networking) NetworkClientSendChatToServer(fmt::format("!alogin {} {}", _inilogindata[NICEUSER], base64_decode(_inilogindata[NICEADMINPW])));
break;
}
case 2: {
if(_networking) NetworkClientSendChatToServer(fmt::format("!alogin {} {}", _inilogindata[BTPROUSER], base64_decode(_inilogindata[BTPROADMINPW])));
break;
}
//case 3: if(/*_novahost && */_networking) AccountLogin(CITYMANIA); break;
}
break;
}
case LWW_ADMIN_LOGOUT:
NetworkClientSendChatToServer("!alogout"); break;
}
}
@@ -737,22 +856,17 @@ struct LoginWindow : Window {
{
if (str == NULL) return;
switch(this->query_widget){
case LQW_NOVAPOLIS_LOGIN: {
SetLoginItem(NOVAPOLIS_LOGIN, str);
case LQW_USER_NAME: {
switch (_community) {
case 1: SetLoginItem(NICE_LOGIN, str); break;
case 2: SetLoginItem(BTPRO_LOGIN, str); break;
case 3: SetLoginItem(NOVAPOLIS_LOGIN, str); break;
}
break;
}
case LQW_NOVAPOLIS_PW: {
SetLoginItem(NOVAPOLIS_PW, str);
break;
}
case LQW_NICE_LOGIN:
case LQW_BTPRO_LOGIN:
case LQW_BTPRO_PW: {
auto item = urlencode(str);
SetLoginItem(INI_LOGIN_KEYS[this->query_widget - 3], item); // - LWW_NICE_LOGIN + NICE_LOGIN
break;
}
case LQW_NICE_PW: {
case LQW_USER_PW: {
switch (_community) {
case 1: {
Md5 password, salted_password;
MD5Hash digest;
@@ -769,12 +883,230 @@ struct LoginWindow : Window {
SetLoginItem(NICE_PW, second_pass);
break;
}
case 2: SetLoginItem(BTPRO_PW, str); break;
case 3: SetLoginItem(NOVAPOLIS_PW, str); break;
}
break;
}
case LQW_ADMIN_PW: {
switch (_community) {
case 1: SetLoginItem(NICE_ADMIN_PW, base64_encode((const unsigned char *)str, strlen(str))); break;
case 2: SetLoginItem(BTPRO_ADMIN_PW, base64_encode((const unsigned char *)str, strlen(str))); break;
//case 3: SetLoginItem(NOVAPOLIS_PW, str); break;
}
break;
}
default: return;
}
this->SetDirty();
}
};
struct AdminCompanyButtonsWindow : Window {
AdminCompanyButtonsQueryWidgets query_widget;
//CompanyID company;
AdminCompanyButtonsWindow(WindowDesc *desc, WindowNumber window_number) : Window(desc) {
this->InitNested(window_number);
/* disable not supported buttons for n-ice */
if (GetServerItem(COMMUNITY) == "1") {
this->DisableWidget(ACB_COMPANY_SUSPEND);
this->DisableWidget(ACB_COMPANY_UNSUSPEND);
this->DisableWidget(ACB_COMPANY_AWARNING);
}
}
static void CWCompanyResetCallback(Window* w, bool confirmed)
{
if (confirmed) NetworkClientSendChatToServer(fmt::format("!resetcompany {}",w->window_number));
}
static void CWCompanyResetSpecCallback(Window* w, bool confirmed)
{
if (confirmed) NetworkClientSendChatToServer(fmt::format("!resetcompanyspec {}",w->window_number));
}
static void CWCompanyResetKickCallback(Window* w, bool confirmed)
{
if (confirmed) NetworkClientSendChatToServer(fmt::format("!resetcompanykick {}",w->window_number));
}
virtual void OnClick([[maybe_unused]] Point pt, int widget,[[maybe_unused]] int click_count)
{
if(!_networking) return;
int _company = this->window_number;
switch (widget) {
case ACB_COMPANY_EMPTY:
NetworkClientSendChatToServer(fmt::format("!emptycompany {}",_company));
MarkWholeScreenDirty();
break;
case ACB_COMPANY_RESET_KICK:
ShowQuery(CM_STR_ACB_RESET_COMP, CM_STR_ACB_RESET_KICK_SURE, this, CWCompanyResetKickCallback);
MarkWholeScreenDirty();
break;
case ACB_COMPANY_RESET_SPEC:
ShowQuery(CM_STR_ACB_RESET_COMP, CM_STR_ACB_RESET_SPEC_SURE, this, CWCompanyResetSpecCallback);
MarkWholeScreenDirty();
break;
case ACB_COMPANY_RESET:
ShowQuery(CM_STR_ACB_RESET_COMP, CM_STR_ACB_RESET_COMP_SURE, this, CWCompanyResetCallback);
MarkWholeScreenDirty();
break;
case ACB_RESET_COMPANY_TIMER:
this->query_widget = ACBQ_RESET_COMPANY_TIMER;
SetDParam(0, _company);
ShowQueryString(STR_EMPTY, CM_STR_ACB_RESET_TIMER_VALUE, 25, this, CS_NUMERAL, QSF_NONE);
break;
case ACB_RESET_COMPANY_TIMER_120:
NetworkClientSendChatToServer(fmt::format("!resetcompanytimer {} 120",_company));
MarkWholeScreenDirty();
break;
case ACB_RESET_COMPANY_TIMER_CANCEL:
NetworkClientSendChatToServer(fmt::format("!cancelresetcompany {}",_company));
break;
case ACB_COMPANY_LOCK:
NetworkClientSendChatToServer(fmt::format("!lockcompany {}",_company));
MarkWholeScreenDirty();
break;
case ACB_COMPANY_UNLOCK:
NetworkClientSendChatToServer(fmt::format("!unlockcompany {}",_company));
MarkWholeScreenDirty();
break;
case ACB_COMPANY_KNOWN:
NetworkClientSendChatToServer(fmt::format("!known {}",_company));
MarkWholeScreenDirty();
break;
case ACB_COMPANY_RESET_KNOWN:
NetworkClientSendChatToServer(fmt::format("!resetknown {}",_company));
MarkWholeScreenDirty();
break;
case ACB_COMPANY_MOVE_PLAYER:
this->query_widget = ACBQ_COMPANY_MOVE_PLAYER;
SetDParam(0, _company);
ShowQueryString(STR_EMPTY, STR_NETWORK_SERVER_LIST_PLAYER_NAME, 250, this, CS_ALPHANUMERAL, QSF_NONE);
break;
case ACB_COMPANY_NEWSTICKET:
this->query_widget = ACBQ_COMPANY_NEWSTICKET;
SetDParam(0, _company);
ShowQueryString(STR_EMPTY, CM_STR_ACB_PLAYER_NEWSTICKET, 250, this, CS_ALPHANUMERAL, QSF_NONE);
break;
case ACB_COMPANY_NEWSTICKET_COMP:
this->query_widget = ACBQ_COMPANY_NEWSTICKET_COMP;
SetDParam(0, _company);
ShowQueryString(STR_EMPTY, CM_STR_ACB_PLAYER_NEWSTICKET, 250, this, CS_ALPHANUMERAL, QSF_NONE);
break;
case ACB_COMPANY_SUSPEND:
NetworkClientSendChatToServer(fmt::format("!suspend {}",_company));
MarkWholeScreenDirty();
break;
case ACB_COMPANY_UNSUSPEND:
NetworkClientSendChatToServer(fmt::format("!unsuspend {}",_company));
MarkWholeScreenDirty();
break;
case ACB_COMPANY_AWARNING:
NetworkClientSendChatToServer(fmt::format("!awarning {}",_company));
MarkWholeScreenDirty();
break;
case ACB_COMPANY_JOIN2:
NetworkClientSendChatToServer(fmt::format("!move #{} {}",_network_own_client_id ,_company));
MarkWholeScreenDirty();
break;
case ACB_COMPANY_LEAVE:
NetworkClientRequestMove(COMPANY_SPECTATOR);
break;
case ACB_COMPANY_CANCEL:
this->Close();
break;
}
}
void SetStringParameters(WidgetID widget) const override
{
switch (widget) {
case ACB_COMPANY_CAPTION:
SetDParam(0, this->window_number);
break;
}
}
void OnQueryTextFinished(char *str)
{
if (str == NULL) return;
switch (this->query_widget) {
default: NOT_REACHED();
case ACBQ_RESET_COMPANY_TIMER:
NetworkClientSendChatToServer(fmt::format("!resetcompanytimer {} {}",this->window_number,str));
MarkWholeScreenDirty();
break;
case ACBQ_COMPANY_NEWSTICKET: {
std::string buffer = GetString(STR_COMPANY_NAME);
NetworkClientSendChatToServer(fmt::format("!news {}: {}", buffer, str));
MarkWholeScreenDirty();
break;
}
case ACBQ_COMPANY_NEWSTICKET_COMP: {
std::string buffer = GetString(STR_COMPANY_NAME);
NetworkClientSendChatToServer(fmt::format("!news {} {}", this->window_number, str));
MarkWholeScreenDirty();
break;
}
case ACBQ_COMPANY_MOVE_PLAYER: {
NetworkClientSendChatToServer(fmt::format("!move #{} {}",str, this->window_number));
MarkWholeScreenDirty();
break;
}
}
}
};
struct JoinLastServerWindow : Window {
// CompanyID company;
JoinLastServerWindow(WindowDesc *desc, WindowNumber window_number)
: Window(desc) {
this->InitNested(window_number);
if (_settings_client.network.last_joined == "")
this->DisableWidget(LSW_BUTTON);
}
virtual void OnClick([[maybe_unused]] Point pt, int widget,[[maybe_unused]] int click_count)
{
switch (widget) {
case LSW_BUTTON: {
std::string _server = _settings_client.network.last_joined;
if (_ctrl_pressed)
NetworkClientConnectGame(_server, COMPANY_NEW_COMPANY);
else
NetworkClientConnectGame(_server, COMPANY_SPECTATOR);
}
break;
}
};
/*
void SetStringParameters(WidgetID widget) const override {
switch (widget) {
case LSW_BUTTON:
if (_server != "")
SetDParam(0, STR_JUST_NOTHING);
else {
SetDParam(0, STR_NETWORK_SERVER_LIST_CLICK_TO_SELECT_LAST);
}
break;
}
};
*/
};
static const NWidgetPart _nested_login_window_widgets[] = {
NWidget(NWID_HORIZONTAL),
NWidget(WWT_CLOSEBOX, COLOUR_GREY),
@@ -783,54 +1115,178 @@ static const NWidgetPart _nested_login_window_widgets[] = {
EndContainer(),
NWidget(WWT_PANEL, COLOUR_GREY), SetResize(1, 0),
NWidget(NWID_VERTICAL, NC_EQUALSIZE), SetPadding(10),
//novapolis
//welcome
NWidget(NWID_HORIZONTAL, NC_EQUALSIZE),
NWidget(WWT_TEXT, COLOUR_BROWN, LWW_COMMUNITY), SetMinimalSize(100, 20), SetAlignment(SA_CENTER), SetDataTip(CM_STR_LOGIN_WINDOW_WELCOME, 0), SetFill(1, 1),
EndContainer(),
NWidget(NWID_SPACER), SetMinimalSize(0, 10),
//username and pw
NWidget(NWID_HORIZONTAL),
NWidget(NWID_SPACER), SetMinimalSize(5, 0),
NWidget(WWT_TEXT, COLOUR_BROWN, LWW_USERNAME), SetDataTip(CM_STR_LOGIN_WINDOW_USERNAME, 0),
NWidget(NWID_SPACER), SetMinimalSize(5, 0),
NWidget(WWT_PUSHTXTBTN, COLOUR_BROWN, LWW_USER_NAME), SetMinimalSize(100, 15), SetFill(1, 1),
SetDataTip(CM_STR_LOGIN_WINDOW_USERNAME_DISPLAY, CM_STR_LOGIN_WINDOW_CHANGE_USERNAME_HELPTEXT),
NWidget(NWID_SPACER), SetMinimalSize(20, 0),
NWidget(WWT_TEXT, COLOUR_BROWN, LWW_PASSWORD), SetDataTip(CM_STR_LOGIN_WINDOW_PASSWORD, 0),
NWidget(NWID_SPACER), SetMinimalSize(5, 0),
NWidget(WWT_PUSHTXTBTN, COLOUR_BROWN, LWW_USER_PW), SetMinimalSize(50, 15), SetFill(1, 1),
SetDataTip(CM_STR_LOGIN_WINDOW_PASSWORD_DISPLAY, CM_STR_LOGIN_WINDOW_CHANGE_PASSWORD_HELPTEXT),
NWidget(NWID_SPACER), SetMinimalSize(5, 0),
EndContainer(),
NWidget(NWID_SPACER), SetMinimalSize(0, 5),
NWidget(NWID_SPACER), SetMinimalSize(0, 20),
//login and logout
NWidget(NWID_HORIZONTAL, NC_EQUALSIZE),
NWidget(WWT_PUSHTXTBTN, COLOUR_BROWN, LWW_NOVAPOLIS_LOGIN), SetMinimalSize(60, 20), SetFill(1, 0), SetDataTip(CM_STR_LOGIN_WINDOW_USERNAME_DISPLAY, CM_STR_LOGIN_WINDOW_CHANGE_USERNAME_HELPTEXT),
NWidget(NWID_SPACER), SetMinimalSize(20, 0),
NWidget(WWT_PUSHTXTBTN, COLOUR_BROWN, LWW_NOVAPOLIS_PW), SetMinimalSize(30, 20), SetFill(1, 0), SetDataTip(CM_STR_LOGIN_WINDOW_PASSWORD_DISPLAY, CM_STR_LOGIN_WINDOW_CHANGE_PASSWORD_HELPTEXT),
NWidget(NWID_SPACER), SetMinimalSize(5, 0),
NWidget(WWT_PUSHTXTBTN, COLOUR_ORANGE, LWW_USER_LOGIN), SetMinimalSize(40, 30), SetAlignment(SA_CENTER), SetFill(1, 1),
SetDataTip(CM_STR_TOOLBAR_COMMANDS_LOGIN_CAPTION, CM_STR_TOOLBAR_COMMANDS_LOGIN_TOOLTIP),
NWidget(NWID_SPACER), SetMinimalSize(10, 0),
NWidget(WWT_PUSHTXTBTN, COLOUR_ORANGE, LWW_USER_LOGOUT), SetMinimalSize(40, 30), SetAlignment(SA_CENTER), SetFill(1, 1),
SetDataTip(CM_STR_TOOLBAR_COMMANDS_LOGOUT_CAPTION, CM_STR_TOOLBAR_COMMANDS_LOGOUT_TOOLTIP),
NWidget(NWID_SPACER), SetMinimalSize(5, 0),
EndContainer(),
NWidget(NWID_SPACER), SetMinimalSize(0, 10),
NWidget(WWT_PUSHTXTBTN, COLOUR_PURPLE, LWW_NOVAPOLIS), SetMinimalSize(100, 30), SetFill(1, 0), SetDataTip(CM_STR_LOGIN_WINDOW_CITYMANIA, CM_STR_LOGIN_WINDOW_SIGN_IN_HELPTEXT),
NWidget(NWID_SPACER), SetMinimalSize(0, 10),
//n-ice
NWidget(NWID_HORIZONTAL, NC_EQUALSIZE),
NWidget(WWT_TEXT, COLOUR_BROWN, LWW_USERNAME), SetDataTip(CM_STR_LOGIN_WINDOW_USERNAME, 0),
NWidget(NWID_SPACER), SetMinimalSize(20, 0),
NWidget(WWT_TEXT, COLOUR_BROWN, LWW_PASSWORD), SetDataTip(CM_STR_LOGIN_WINDOW_PASSWORD, 0),
EndContainer(),
NWidget(NWID_SPACER), SetMinimalSize(0, 5),
NWidget(NWID_HORIZONTAL, NC_EQUALSIZE),
NWidget(WWT_PUSHTXTBTN, COLOUR_BROWN, LWW_NICE_LOGIN), SetMinimalSize(60, 20), SetFill(1, 0), SetDataTip(CM_STR_LOGIN_WINDOW_USERNAME_DISPLAY, CM_STR_LOGIN_WINDOW_CHANGE_USERNAME_HELPTEXT),
NWidget(NWID_SPACER), SetMinimalSize(20, 0),
NWidget(WWT_PUSHTXTBTN, COLOUR_BROWN, LWW_NICE_PW), SetMinimalSize(30, 20), SetFill(1, 0), SetDataTip(CM_STR_LOGIN_WINDOW_PASSWORD_DISPLAY, CM_STR_LOGIN_WINDOW_CHANGE_PASSWORD_HELPTEXT),
EndContainer(),
NWidget(NWID_SPACER), SetMinimalSize(0, 10),
NWidget(WWT_PUSHTXTBTN, COLOUR_LIGHT_BLUE, LWW_NICE), SetMinimalSize(100, 30), SetFill(1, 0), SetDataTip(CM_STR_LOGIN_WINDOW_NICE, CM_STR_LOGIN_WINDOW_SIGN_IN_HELPTEXT),
NWidget(NWID_SPACER), SetMinimalSize(0, 10),
//btpro
NWidget(NWID_HORIZONTAL, NC_EQUALSIZE),
NWidget(WWT_TEXT, COLOUR_BROWN, LWW_USERNAME), SetDataTip(CM_STR_LOGIN_WINDOW_USERNAME, 0),
NWidget(NWID_SPACER), SetMinimalSize(20, 0),
NWidget(WWT_TEXT, COLOUR_BROWN, LWW_PASSWORD), SetDataTip(CM_STR_LOGIN_WINDOW_PASSWORD, 0),
EndContainer(),
NWidget(NWID_SPACER), SetMinimalSize(0, 5),
NWidget(NWID_HORIZONTAL, NC_EQUALSIZE),
NWidget(WWT_PUSHTXTBTN, COLOUR_BROWN, LWW_BTPRO_LOGIN), SetMinimalSize(60, 20), SetFill(1, 0), SetDataTip(CM_STR_LOGIN_WINDOW_USERNAME_DISPLAY, CM_STR_LOGIN_WINDOW_CHANGE_USERNAME_HELPTEXT),
NWidget(NWID_SPACER), SetMinimalSize(20, 0),
NWidget(WWT_PUSHTXTBTN, COLOUR_BROWN, LWW_BTPRO_PW), SetMinimalSize(30, 20), SetFill(1, 0), SetDataTip(CM_STR_LOGIN_WINDOW_PASSWORD_DISPLAY, CM_STR_LOGIN_WINDOW_CHANGE_PASSWORD_HELPTEXT),
EndContainer(),
NWidget(NWID_SPACER), SetMinimalSize(0, 10),
NWidget(WWT_PUSHTXTBTN, COLOUR_ORANGE, LWW_BTPRO), SetMinimalSize(100, 30), SetFill(1, 0), SetDataTip(CM_STR_LOGIN_WINDOW_BTPRO, CM_STR_LOGIN_WINDOW_SIGN_IN_HELPTEXT),
EndContainer(),
EndContainer(),
};
static const NWidgetPart _nested_admin_window_widgets[] = {
NWidget(NWID_HORIZONTAL),
NWidget(WWT_CLOSEBOX, COLOUR_GREY),
NWidget(WWT_CAPTION, COLOUR_GREY), SetDataTip(CM_STR_LOGIN_WINDOW_CAPTION, 0),
NWidget(WWT_STICKYBOX, COLOUR_GREY),
EndContainer(),
NWidget(WWT_PANEL, COLOUR_GREY), SetResize(1, 0),
NWidget(NWID_VERTICAL, NC_EQUALSIZE), SetPadding(10),
//welcome
NWidget(NWID_HORIZONTAL, NC_EQUALSIZE),
NWidget(WWT_TEXT, COLOUR_BROWN, LWW_COMMUNITY), SetMinimalSize(100, 20), SetAlignment(SA_CENTER), SetDataTip(CM_STR_LOGIN_WINDOW_WELCOME, 0), SetFill(1, 1),
EndContainer(),
NWidget(NWID_SPACER), SetMinimalSize(0, 10),
//username and pw
NWidget(NWID_HORIZONTAL),
NWidget(NWID_SPACER), SetMinimalSize(5, 0),
NWidget(WWT_TEXT, COLOUR_BROWN, LWW_USERNAME), SetDataTip(CM_STR_LOGIN_WINDOW_USERNAME, 0),
NWidget(NWID_SPACER), SetMinimalSize(5, 0),
NWidget(WWT_PUSHTXTBTN, COLOUR_BROWN, LWW_USER_NAME), SetMinimalSize(100, 15), SetFill(1, 1),
SetDataTip(CM_STR_LOGIN_WINDOW_USERNAME_DISPLAY, CM_STR_LOGIN_WINDOW_CHANGE_USERNAME_HELPTEXT),
NWidget(NWID_SPACER), SetMinimalSize(20, 0),
NWidget(WWT_TEXT, COLOUR_BROWN, LWW_PASSWORD), SetDataTip(CM_STR_LOGIN_WINDOW_PASSWORD, 0),
NWidget(NWID_SPACER), SetMinimalSize(5, 0),
NWidget(WWT_PUSHTXTBTN, COLOUR_BROWN, LWW_USER_PW), SetMinimalSize(50, 15), SetFill(1, 1),
SetDataTip(CM_STR_LOGIN_WINDOW_PASSWORD_DISPLAY, CM_STR_LOGIN_WINDOW_CHANGE_PASSWORD_HELPTEXT),
NWidget(NWID_SPACER), SetMinimalSize(20, 0),
NWidget(WWT_TEXT, COLOUR_BROWN, LWW_ADMIN_PW), SetDataTip(CM_STR_LOGIN_WINDOW_ADMIN_PASSWORD, 0),
NWidget(NWID_SPACER), SetMinimalSize(5, 0),
NWidget(WWT_PUSHTXTBTN, COLOUR_BROWN, LWW_ADMIN_PW), SetMinimalSize(50, 15), SetFill(1, 1),
SetDataTip(CM_STR_LOGIN_WINDOW_PASSWORD_DISPLAY, CM_STR_LOGIN_WINDOW_CHANGE_PASSWORD_HELPTEXT),
NWidget(NWID_SPACER), SetMinimalSize(5, 0),
EndContainer(),
NWidget(NWID_SPACER), SetMinimalSize(0, 20),
//login and logout
NWidget(NWID_HORIZONTAL, NC_EQUALSIZE),
NWidget(NWID_SPACER), SetMinimalSize(5, 0),
NWidget(WWT_PUSHTXTBTN, COLOUR_ORANGE, LWW_USER_LOGIN), SetMinimalSize(40, 30), SetAlignment(SA_CENTER), SetFill(1, 1),
SetDataTip(CM_STR_TOOLBAR_COMMANDS_LOGIN_CAPTION, CM_STR_TOOLBAR_COMMANDS_LOGIN_TOOLTIP),
NWidget(NWID_SPACER), SetMinimalSize(10, 0),
NWidget(WWT_PUSHTXTBTN, COLOUR_ORANGE, LWW_USER_LOGOUT), SetMinimalSize(40, 30), SetAlignment(SA_CENTER), SetFill(1, 1),
SetDataTip(CM_STR_TOOLBAR_COMMANDS_LOGOUT_CAPTION, CM_STR_TOOLBAR_COMMANDS_LOGOUT_TOOLTIP),
NWidget(NWID_SPACER), SetMinimalSize(10, 0),
NWidget(WWT_PUSHTXTBTN, COLOUR_ORANGE, LWW_ADMIN_LOGIN), SetMinimalSize(40, 30), SetAlignment(SA_CENTER), SetFill(1, 1),
SetDataTip(CM_STR_LOGIN_WINDOW_ADMIN_LOGIN, CM_STR_TOOLBAR_COMMANDS_LOGIN_TOOLTIP),
NWidget(NWID_SPACER), SetMinimalSize(10, 0),
NWidget(WWT_PUSHTXTBTN, COLOUR_ORANGE, LWW_ADMIN_LOGOUT), SetMinimalSize(40, 30), SetAlignment(SA_CENTER), SetFill(1, 1),
SetDataTip(CM_STR_LOGIN_WINDOW_ADMIN_LOGOUT, CM_STR_TOOLBAR_COMMANDS_LOGOUT_TOOLTIP),
NWidget(NWID_SPACER), SetMinimalSize(5, 0),
EndContainer(),
NWidget(NWID_SPACER), SetMinimalSize(0, 10),
EndContainer(),
EndContainer(),
};
static const NWidgetPart _nested_admin_company_window_widgets[] = {
NWidget(NWID_HORIZONTAL),
NWidget(WWT_CAPTION,COLOUR_END, ACB_COMPANY_CAPTION),
SetDataTip(CM_STR_ACB_COMPANY_ADMIN_CAPTION, 0),
SetMinimalSize(10,17),
EndContainer(),
NWidget(WWT_PANEL, COLOUR_GREY), SetFill(0, 1),
NWidget(NWID_HORIZONTAL),
NWidget(NWID_SPACER), SetMinimalSize(5, 0), SetFill(1, 0),
NWidget(NWID_VERTICAL, NC_EQUALSIZE), SetPIP(5, 3, 5),
NWidget(WWT_PUSHTXTBTN, COLOUR_GREY, ACB_COMPANY_LOCK), SetMinimalSize(10, 13), SetFill(1, 0), SetDataTip(CM_STR_ACB_LOCK, CM_STR_ACB_LOCK_TOOLTIP),
NWidget(WWT_PUSHTXTBTN, COLOUR_GREY, ACB_COMPANY_UNLOCK), SetMinimalSize(10, 13), SetFill(1, 0), SetDataTip(CM_STR_ACB_UNLOCK, CM_STR_ACB_UNLOCK_TOOLTIP),
NWidget(WWT_PUSHTXTBTN, COLOUR_GREY, ACB_COMPANY_KNOWN), SetMinimalSize(10, 13), SetFill(1, 0), SetDataTip(CM_STR_ACB_KNOWN, CM_STR_ACB_KNOWN_TOOLTIP),
NWidget(WWT_PUSHTXTBTN, COLOUR_GREY, ACB_COMPANY_RESET_KNOWN), SetMinimalSize(10, 13), SetFill(1, 0), SetDataTip(CM_STR_ACB_RESET_KNOWN, CM_STR_ACB_RESET_KNOWN_TOOLTIP),
NWidget(WWT_PUSHTXTBTN, COLOUR_GREY, ACB_COMPANY_MOVE_PLAYER), SetMinimalSize(10, 13), SetFill(1, 0), SetDataTip(CM_STR_ACB_MOVE_PLAYER_TO, CM_STR_ACB_MOVE_PLAYER_TO_TOOLTIP),
NWidget(WWT_PUSHTXTBTN, COLOUR_GREY, ACB_COMPANY_NEWSTICKET_COMP), SetMinimalSize(10, 13), SetFill(1, 0), SetDataTip(CM_STR_ACB_COMPANY_NEWSTICKET_BUTTON_COMP, CM_STR_ACB_COMPANY_NEWSTICKET_BUTTON_COMP_TOOLTIP),
NWidget(WWT_PUSHTXTBTN, COLOUR_GREY, ACB_COMPANY_SUSPEND), SetMinimalSize(10, 13), SetFill(1, 0), SetDataTip(CM_STR_ACB_SUSPEND, CM_STR_ACB_SUSPEND_TOOLTIP),
NWidget(WWT_PUSHTXTBTN, COLOUR_GREY, ACB_COMPANY_UNSUSPEND), SetMinimalSize(10, 13), SetFill(1, 0), SetDataTip(CM_STR_ACB_UNSUSPEND, CM_STR_ACB_UNSUSPEND_TOOLTIP),
NWidget(WWT_PUSHTXTBTN, COLOUR_GREY, ACB_COMPANY_JOIN2),SetMinimalSize(10, 13), SetFill(1, 0),SetDataTip(CM_STR_ACB_COMPANY_JOIN2, CM_STR_ACB_COMPANY_JOIN2_TOOLTIP),
EndContainer(),
NWidget(NWID_SPACER), SetMinimalSize(5, 0), SetFill(1, 0),
NWidget(NWID_VERTICAL, NC_EQUALSIZE), SetPIP(5, 3, 5),
NWidget(WWT_PUSHTXTBTN, COLOUR_GREY, ACB_COMPANY_EMPTY), SetMinimalSize(10, 13), SetFill(1, 0), SetDataTip(CM_STR_ACB_EMPTY, CM_STR_ACB_EMPTY_TOOLTIP),
NWidget(WWT_PUSHTXTBTN, COLOUR_GREY, ACB_COMPANY_RESET), SetMinimalSize(10, 13), SetFill(1, 0), SetDataTip(CM_STR_ACB_RESET, CM_STR_ACB_RESET_TOOLTIP),
NWidget(WWT_PUSHTXTBTN, COLOUR_GREY, ACB_COMPANY_RESET_SPEC), SetMinimalSize(10, 13), SetFill(1, 0), SetDataTip(CM_STR_ACB_RESET_SPEC, CM_STR_ACB_RESET_SPEC_TOOLTIP),
NWidget(WWT_PUSHTXTBTN, COLOUR_GREY, ACB_COMPANY_RESET_KICK), SetMinimalSize(10, 13), SetFill(1, 0), SetDataTip(CM_STR_ACB_RESET_KICK, CM_STR_ACB_RESET_KICK_TOOLTIP),
NWidget(WWT_PUSHTXTBTN, COLOUR_GREY, ACB_RESET_COMPANY_TIMER_120), SetMinimalSize(10, 13), SetFill(1, 0), SetDataTip(CM_STR_ACB_RESET_TIMER_120, CM_STR_ACB_RESET_TIMER_120_TOOLTIP),
NWidget(WWT_PUSHTXTBTN, COLOUR_GREY, ACB_RESET_COMPANY_TIMER), SetMinimalSize(10, 13), SetFill(1, 0), SetDataTip(CM_STR_ACB_RESET_TIMER, CM_STR_ACB_RESET_TIMER_TOOLTIP),
NWidget(WWT_PUSHTXTBTN, COLOUR_GREY, ACB_RESET_COMPANY_TIMER_CANCEL), SetMinimalSize(10, 13), SetFill(1, 0), SetDataTip(CM_STR_ACB_RESET_TIMER_CANCEL, CM_STR_ACB_RESET_TIMER_CANCEL_TOOLTIP),
NWidget(WWT_PUSHTXTBTN, COLOUR_GREY, ACB_COMPANY_AWARNING), SetMinimalSize(10, 13), SetFill(1, 0), SetDataTip(CM_STR_ACB_AWARNING, CM_STR_ACB_AWARNING_TOOLTIP),
NWidget(WWT_PUSHTXTBTN, COLOUR_GREY, ACB_COMPANY_LEAVE),SetMinimalSize(10, 13), SetFill(1, 0),SetDataTip(STR_NETWORK_COMPANY_LIST_SPECTATE, STR_NETWORK_COMPANY_LIST_SPECTATE),
EndContainer(),
NWidget(NWID_SPACER), SetMinimalSize(5, 0), SetFill(1, 0),
EndContainer(),
NWidget(NWID_SPACER), SetMinimalSize(0, 5), SetFill(0, 1),
EndContainer(),
};
static const NWidgetPart _nested_last_server_widgets[] = {
NWidget(WWT_PANEL, COLOUR_BROWN), SetFill(0, 1),
//NWidget(NWID_HORIZONTAL),
// NWidget(WWT_CAPTION, COLOUR_BROWN, LSW_CAPTION), SetMinimalSize(322, 20), SetAlignment(SA_CENTER), SetDataTip(STR_NETWORK_SERVER_LIST_LAST_JOINED_SERVER, 0), SetFill(1, 1),
//EndContainer(),
NWidget(NWID_HORIZONTAL), SetPadding(4),
NWidget(WWT_PUSHTXTBTN, COLOUR_ORANGE, LSW_BUTTON), SetMinimalSize(322, 20), SetAlignment(SA_CENTER), SetDataTip(STR_NETWORK_SERVER_LIST_CLICK_TO_SELECT_LAST, CM_STR_SCS_COMPANY_NEW_JOIN_TOOLTIP), SetFill(1, 1),
EndContainer(),
EndContainer(),
};
/* Identify the current community */
void CheckCommunity() {
if (_network_server_name.find("n-ice.org") != std::string::npos) {
if (GetServerItem(COMMUNITY) != "1") {
SetServerItem(COMMUNITY, "1");
// GetCommunityServerListText();
}
} else if (_network_server_name.find("BTPro.nl") != std::string::npos) {
if (GetServerItem(COMMUNITY) != "2") {
SetServerItem(COMMUNITY, "2");
// GetCommunityServerListText();
}
} else if (_network_server_name.find("CityMania.org") != std::string::npos) {
if (GetServerItem(COMMUNITY) != "3") {
SetServerItem(COMMUNITY, "3");
// GetCommunityServerListText();
}
} else if (_network_server_name.find("reddit.com") != std::string::npos) {
if (GetServerItem(COMMUNITY) != "4") {
SetServerItem(COMMUNITY, "4");
// GetCommunityServerListText();
}
} else { // Unknown Server
SetServerItem(COMMUNITY, "0");
}
};
void CheckAdmin(){
IniInitiate();
if (GetLoginItem(ADMIN) == "1")
_admin = true;
};
static WindowDesc _login_window_desc(__FILE__, __LINE__,
WDP_CENTER, "cm_login", 0, 0,
CM_WC_LOGIN_WINDOW, WC_NONE,
@@ -838,11 +1294,75 @@ static WindowDesc _login_window_desc(__FILE__, __LINE__,
std::begin(_nested_login_window_widgets), std::end(_nested_login_window_widgets)
);
void ShowLoginWindow()
{
IniLoginInitiate();
static WindowDesc _admin_window_desc(__FILE__, __LINE__,
WDP_CENTER, "cm_login", 0, 0,
CM_WC_LOGIN_WINDOW, WC_NONE,
WDF_CONSTRUCTION,
std::begin(_nested_admin_window_widgets), std::end(_nested_admin_window_widgets)
);
static WindowDesc _admin_company_buttons_desc(__FILE__, __LINE__,
WDP_AUTO, NULL, 0, 0,
CM_WC_ADMIN_COMPANY_BUTTONS, WC_NONE,
WDF_CONSTRUCTION,
std::begin(_nested_admin_company_window_widgets), std::end(_nested_admin_company_window_widgets)
);
static WindowDesc _last_server_desc(__FILE__, __LINE__,
WDP_AUTO, NULL, 0, 0,
CM_LAST_SERVER,
WC_NONE, WDF_CONSTRUCTION, std::begin(_nested_last_server_widgets),
std::end(_nested_last_server_widgets));
void ShowLoginWindow() {
IniInitiate();
CheckCommunity();
CheckAdmin();
CloseWindowByClass(CM_WC_LOGIN_WINDOW);
AllocateWindowDescFront<LoginWindow>(&_login_window_desc, 0);
if (!_admin) AllocateWindowDescFront<LoginWindow>(&_login_window_desc, 0);
else AllocateWindowDescFront<LoginWindow>(&_admin_window_desc, 0);
};
void ShowAdminCompanyButtons(int left, int top, int width, int company2, bool draw, bool redraw) {
//IniInitiate();
//CheckCommunity();
if (!draw) {
CloseWindowById(CM_WC_ADMIN_COMPANY_BUTTONS, company2);
/* clear for company */
ACB_Location[company2 - 1][0]=0;
ACB_Location[company2 - 1][1]=0;
ACB_Location[company2 - 1][2]=0;
return;
}
if (!Company::IsValidID((CompanyID)(company2-1))) return;
if ((left == ACB_Location[company2 - 1][0]) &&
(top == ACB_Location[company2 - 1][1]) &&
(width == ACB_Location[company2 - 1][2]) &&
(!redraw))
return;
/* set for company */
ACB_Location[company2 - 1][0] = left;
ACB_Location[company2 - 1][1] = top;
ACB_Location[company2 - 1][2] = width;
CloseWindowById(CM_WC_ADMIN_COMPANY_BUTTONS, company2);
Window *w;
w = new AdminCompanyButtonsWindow(&_admin_company_buttons_desc, company2);
w->top = top;
w->left = left + width;
w->SetDirty();
};
/* last server widget */
void JoinLastServer(int left, int top, int height) {
CloseWindowByClass(CM_LAST_SERVER);
Window *d;
d = new JoinLastServerWindow(&_last_server_desc, 0);
d->top = top + height;
d->left = left;
}
} // namespace citymania

View File

@@ -5,6 +5,11 @@ namespace citymania {
void ShowCommandsToolbar();
void ShowLoginWindow();
void CheckAdmin();
void ShowAdminCompanyButtons(int left, int top, int width, int company2, bool draw, bool redraw);
void JoinLastServer(int left, int top, int height);
bool GetAdmin();
} // namespace citymania

View File

@@ -49,9 +49,12 @@
#include "citymania/cm_hotkeys.hpp"
#include "citymania/cm_main.hpp"
#include "citymania/cm_commands_gui.hpp"
#include "safeguards.h"
/* Admin company buttons */
bool Show_ACB[15];
/** Company GUI constants. */
static void DoSelectCompanyManagerFace(Window *parent);
@@ -2196,6 +2199,10 @@ static constexpr NWidgetPart _nested_company_widgets[] = {
NWidget(WWT_TEXTBTN, COLOUR_GREY, WID_C_RELOCATE_HQ), SetDataTip(STR_COMPANY_VIEW_RELOCATE_HQ, STR_COMPANY_VIEW_RELOCATE_COMPANY_HEADQUARTERS),
NWidget(NWID_SPACER),
EndContainer(),
/* Admin company buttons */
NWidget(NWID_SELECTION, INVALID_COLOUR, CM_WID_C_SELECT_ADMINBUTTONS),
NWidget(WWT_PUSHTXTBTN, COLOUR_GREY, CM_WID_C_ADMINBUTTONS), SetDataTip(CM_STR_ACB_COMPANY_ADMIN_BUTTON, CM_STR_ACB_COMPANY_ADMIN_BUTTON_TOOLTIP),
EndContainer(),
EndContainer(),
EndContainer(),
@@ -2225,14 +2232,6 @@ static constexpr NWidgetPart _nested_company_widgets[] = {
NWidget(WWT_PUSHTXTBTN, COLOUR_GREY, WID_C_COMPANY_PASSWORD), SetDataTip(STR_COMPANY_VIEW_PASSWORD, STR_COMPANY_VIEW_PASSWORD_TOOLTIP),
NWidget(WWT_PUSHTXTBTN, COLOUR_GREY, WID_C_COMPANY_JOIN), SetDataTip(STR_COMPANY_VIEW_JOIN, STR_COMPANY_VIEW_JOIN_TOOLTIP),
EndContainer(),
// NWidget(NWID_SELECTION, INVALID_COLOUR, WID_C_SELECT_MOD),
// NWidget(NWID_SPACER), SetMinimalSize(0, 0), SetFill(0, 1),
// NWidget(NWID_VERTICAL), SetPIP(4, 2, 4),
// NWidget(WWT_PUSHTXTBTN, COLOUR_GREY, WID_C_MOD_COMPANY_JOIN), SetFill(1, 0), SetDataTip(STR_MOD_COMPANY_JOIN_BUTTON, STR_NULL),
// NWidget(WWT_TEXTBTN, COLOUR_GREY, WID_C_MOD_COMPANY_TOGGLE_LOCK), SetFill(1, 0), SetDataTip(STR_MOD_TOGGLE_LOCK_BUTTON, STR_NULL),
// NWidget(WWT_TEXTBTN, COLOUR_GREY, WID_C_MOD_COMPANY_RESET), SetFill(1, 0), SetDataTip(STR_MOD_COMPANY_RESET_BUTTON, STR_NULL),
// EndContainer(),
// EndContainer(),
EndContainer(),
EndContainer(),
EndContainer(),
@@ -2257,14 +2256,6 @@ static const StringID _company_view_vehicle_count_strings[] = {
/**
* Window with general information about a company
*/
static void ResetCallback(Window *w, bool confirmed)
{
if (confirmed) {
CompanyID company2 = (CompanyID)w->window_number;
citymania::NetworkClientSendChatToServer(fmt::format("!reset {}", company2 + 1));
}
}
struct CompanyWindow : Window
{
CompanyWidgets query_widget;
@@ -2302,6 +2293,10 @@ struct CompanyWindow : Window
/* Button bar selection. */
reinit |= this->GetWidget<NWidgetStacked>(WID_C_SELECT_BUTTONS)->SetDisplayedPlane(local ? 0 : SZSP_NONE);
/* Admin company buttons: show/hide admin menue button from param of citymania.cfg */
citymania::CheckAdmin();
reinit |= this->GetWidget<NWidgetStacked>(CM_WID_C_SELECT_ADMINBUTTONS)->SetDisplayedPlane(citymania::GetAdmin() ? 0 : SZSP_NONE);
/* Build HQ button handling. */
reinit |= this->GetWidget<NWidgetStacked>(WID_C_SELECT_VIEW_BUILD_HQ)->SetDisplayedPlane((local && c->location_of_HQ == INVALID_TILE) ? CWP_VB_BUILD : CWP_VB_VIEW);
@@ -2321,17 +2316,13 @@ struct CompanyWindow : Window
if (reinit) {
this->ReInit();
/* Admin company buttons: recall buttons while join/leave company */
if (Show_ACB[this->window_number]) citymania::ShowAdminCompanyButtons(this->left, this->top, this->width, this->window_number + 1, Show_ACB[this->window_number], true);
return;
}
}
// if(!_networking) {
// this->SetWidgetDisabledState(CW_WIDGET_COMPANY_RESUME, true);
// this->SetWidgetDisabledState(CW_WIDGET_COMPANY_SUSPEND, true);
// this->SetWidgetDisabledState(CW_WIDGET_COMPANY_RESET, true);
// this->SetWidgetDisabledState(CW_WIDGET_COMPANY_JOIN2, true);
// }
/* Admin company buttons: recall buttons while moving company window */
if (Show_ACB[this->window_number]) citymania::ShowAdminCompanyButtons(this->left, this->top, this->width, this->window_number + 1, Show_ACB[this->window_number], false);
this->DrawWidgets();
}
@@ -2389,19 +2380,14 @@ struct CompanyWindow : Window
size->width = std::max(size->width, GetStringBoundingBox(STR_COMPANY_VIEW_GIVE_MONEY_BUTTON).width);
size->width = std::max(size->width, GetStringBoundingBox(STR_COMPANY_VIEW_HOSTILE_TAKEOVER_BUTTON).width);
size->width = std::max(size->width, GetStringBoundingBox(STR_COMPANY_VIEW_PASSWORD).width);
size->width = std::max(size->width, GetStringBoundingBox(STR_COMPANY_VIEW_JOIN).width);
size->width += padding.width;
break;
// case CW_WIDGET_COMPANY_RESUME:
// case CW_WIDGET_COMPANY_SUSPEND:
// case CW_WIDGET_COMPANY_RESET:
// case CW_WIDGET_COMPANY_JOIN2:
// if(!_novarole){
// size->width = 0;
// size->height = 0;
// }
// break;
/* Admin company buttons */
case CM_WID_C_ADMINBUTTONS:
size->width = std::max(size->width, GetStringBoundingBox(CM_STR_ACB_COMPANY_ADMIN_BUTTON).width);
case WID_C_HAS_PASSWORD:
if (_networking) *size = maxdim(*size, GetSpriteSize(SPR_LOCK));
break;
@@ -2624,27 +2610,12 @@ struct CompanyWindow : Window
MarkWholeScreenDirty();
break;
}
case WID_C_MOD_COMPANY_JOIN: {
if (!_novarole) return;
/* Admin company buttons: show/hide buttons */
case CM_WID_C_ADMINBUTTONS: {
CompanyID company2 = (CompanyID)this->window_number;
// this->query_widget = WID_C_MOD_COMPANY_JOIN;
citymania::NetworkClientSendChatToServer(fmt::format("!move {}", company2 + 1));
MarkWholeScreenDirty();
break;
}
case WID_C_MOD_COMPANY_RESET: {
if (!_networking) return;
this->query_widget = WID_C_MOD_COMPANY_RESET;
ShowQuery(CM_STR_XI_RESET_CAPTION, CM_STR_XI_REALY_RESET, this, ResetCallback);
MarkWholeScreenDirty();
break;
}
case WID_C_MOD_COMPANY_TOGGLE_LOCK: {
if (!_novarole) return;
CompanyID company2 = (CompanyID)this->window_number;
citymania::NetworkClientSendChatToServer(fmt::format("!lockp {}", company2 + 1));
MarkWholeScreenDirty();
if (!Show_ACB[company2]) Show_ACB[company2] = true;
else Show_ACB[company2] = false;
citymania::ShowAdminCompanyButtons(this->left, this->top, this->width,company2 + 1, Show_ACB[company2], false);
break;
}
}

View File

@@ -41,6 +41,7 @@
#include "table/sprites.h"
#include "citymania/cm_hotkeys.hpp"
#include "citymania/cm_commands_gui.hpp"
#include "safeguards.h"
@@ -297,6 +298,8 @@ struct SelectGameWindow : public Window {
DrawStringMultiLine(r.left, r.right, r.top, r.bottom, STR_INTRO_TRANSLATION, TC_FROMSTRING, SA_CENTER);
break;
}
/* last server widget */
citymania::JoinLastServer(this->left, this->top, this->height);
}
void UpdateWidgetSize(WidgetID widget, Dimension *size, [[maybe_unused]] const Dimension &padding, [[maybe_unused]] Dimension *fill, [[maybe_unused]] Dimension *resize) override

View File

@@ -5951,6 +5951,8 @@ CM_STR_TOOLBAR_COMMANDS_HINT_CAPTION :{BLACK}CB Hint
CM_STR_TOOLBAR_COMMANDS_HINT_TOOLTIP :{BLACK}Send !hint command to server(Shows town demand in CB mode).
CM_STR_TOOLBAR_COMMANDS_LOGIN_CAPTION :{BLACK}Login
CM_STR_TOOLBAR_COMMANDS_LOGIN_TOOLTIP :{BLACK}Send !login command to server.
CM_STR_TOOLBAR_COMMANDS_LOGOUT_CAPTION :{BLACK}Logout
CM_STR_TOOLBAR_COMMANDS_LOGOUT_TOOLTIP :{BLACK}Send !logout command to server.
CM_STR_TOOLBAR_COMMANDS_TIMELEFT_CAPTION :{BLACK}Timeleft
CM_STR_TOOLBAR_COMMANDS_TIMELEFT_TOOLTIP :{BLACK}Send !timeleft command to server.
CM_STR_TOOLBAR_COMMANDS_NS_CAPTION :{BLACK}CM{NUM}
@@ -6204,8 +6206,11 @@ CM_STR_LOGIN_WINDOW_NICE :{BLACK}N-ice
CM_STR_LOGIN_WINDOW_BTPRO :{BLACK}BTPro
CM_STR_LOGIN_ERROR_SIGN_IN_FAILED :{WHITE}Failed to connect
CM_STR_LOGIN_ERROR_BAD_INPUT :{WHITE}Bad username or password
CM_STR_LOGIN_WINDOW_USERNAME :{WHITE}Username
CM_STR_LOGIN_WINDOW_PASSWORD :{WHITE}Password
CM_STR_LOGIN_WINDOW_USERNAME :{WHITE}Username:
CM_STR_LOGIN_WINDOW_PASSWORD :{WHITE}Password:
CM_STR_LOGIN_WINDOW_ADMIN_LOGIN :{BLACK}A-Login
CM_STR_LOGIN_WINDOW_ADMIN_LOGOUT :{BLACK}A-Logout
CM_STR_LOGIN_WINDOW_ADMIN_PASSWORD :{WHITE}Admin:
CM_STR_LOGIN_WINDOW_SET :{WHITE}Set
CM_STR_LOGIN_WINDOW_NOT_SET :{WHITE}Not Set
CM_STR_LOGIN_WINDOW_CHANGE_USERNAME :{WHITE}Change username
@@ -6215,6 +6220,7 @@ CM_STR_LOGIN_WINDOW_CHANGE_PASSWORD_HELPTEXT :{BLACK}Change p
CM_STR_LOGIN_WINDOW_SIGN_IN_HELPTEXT :{BLACK}Sign in (you must be on the correct community server)
CM_STR_LOGIN_WINDOW_USERNAME_DISPLAY :{WHITE}{RAW_STRING}
CM_STR_LOGIN_WINDOW_PASSWORD_DISPLAY :{WHITE}{STRING}
CM_STR_LOGIN_WINDOW_WELCOME :{BLACK}Welcome to {STRING} community !
CM_STR_NETWORK_COMPANY_LIST_NEW_COMPANY :New company
CM_STR_NETWORK_COMPANY_LIST_SPECTATE :Spectate
@@ -6297,7 +6303,7 @@ CM_STR_CONFIG_SETTING_TYPE_DROPDOWN_CITYMANIA :CityMania patch
CM_BUILDING_PREVIEW_COST_ENOUGH :Cost
CM_STR_NO_BLUEPRINT_IN_SLOT :{WHITE}No blueprint in slot {NUM}
CM_STR_ABOUT_MENU_LOGIN_WINDOW :CityMania server login
CM_STR_ABOUT_MENU_LOGIN_WINDOW :Community tools
CM_STR_BUILD_INFO_OVERLAY_COST_OK :{WHITE}Cost: {CURRENCY_LONG}
CM_STR_BUILD_INFO_OVERLAY_COST_NO_MONEY :{RED}Cost: {CURRENCY_LONG}
CM_STR_BUILD_INFO_OVERLAY_STATION_ACCEPTS :{WHITE}Accepts:
@@ -6316,3 +6322,54 @@ CM_STR_SHOW_HIDDEN_ENGINES_VEHICLE_TRAIN :{BLACK}Show
CM_STR_SHOW_HIDDEN_ENGINES_VEHICLE_ROAD_VEHICLE :{BLACK}Show hidden ({NUM})
CM_STR_SHOW_HIDDEN_ENGINES_VEHICLE_SHIP :{BLACK}Show hidden ({NUM})
CM_STR_SHOW_HIDDEN_ENGINES_VEHICLE_AIRCRAFT :{BLACK}Show hidden ({NUM})
### Admin Company Buttons ###
CM_STR_ACB_COMPANY_ADMIN_CAPTION :{WHITE}Admin buttons #{NUM}
CM_STR_ACB_COMPANY_ADMIN_BUTTON :{WHITE}Admin buttons
CM_STR_ACB_COMPANY_ADMIN_BUTTON_TOOLTIP :{BLACK}Show / hide the admin buttons.
CM_STR_ACB_LOCK :{BLACK}Lock
CM_STR_ACB_LOCK_TOOLTIP :{BLACK}Lock Company. All players on it will be sent to spectators.
CM_STR_ACB_UNLOCK :{BLACK}Unlock
CM_STR_ACB_UNLOCK_TOOLTIP :{BLACK}Unlock Company making possible player(s) joining it again.
CM_STR_ACB_KNOWN :{BLACK}Known
CM_STR_ACB_KNOWN_TOOLTIP :{BLACK}Show the known player(s) of company.
CM_STR_ACB_RESET_KNOWN :{BLACK}Reset Known
CM_STR_ACB_RESET_KNOWN_TOOLTIP :{BLACK}Reset list of known players of company.
CM_STR_ACB_MOVE_PLAYER_TO :{BLACK}Move to ...
CM_STR_ACB_MOVE_PLAYER_TO_TOOLTIP :{BLACK}Move a player (number #.. or name) to company
CM_STR_ACB_COMPANY_NEWSTICKET_BUTTON :{BLACK}News
CM_STR_ACB_COMPANY_NEWSTICKET_BUTTON_TOOLTIP :{BLACK}Open a Newspapper message directed to Company
CM_STR_ACB_COMPANY_NEWSTICKET_BUTTON_COMP :{BLACK}News (P. C.)
CM_STR_ACB_COMPANY_NEWSTICKET_BUTTON_COMP_TOOLTIP :{BLACK}Open a Newspapper message only showed to Company
CM_STR_ACB_SUSPEND :{BLACK}Suspend
CM_STR_ACB_SUSPEND_TOOLTIP :{BLACK}Suspend Company actions keeping player in the company.
CM_STR_ACB_UNSUSPEND :{BLACK}Unsuspend
CM_STR_ACB_UNSUSPEND_TOOLTIP :{BLACK}Unsuspend Company actions.
CM_STR_ACB_EMPTY :{BLACK}Empty
CM_STR_ACB_EMPTY_TOOLTIP :{BLACK}Send players in company to Spectators.
CM_STR_ACB_RESET :{BLACK}Reset
CM_STR_ACB_RESET_TOOLTIP :{BLACK}Reset the company. The company must be empty.
CM_STR_ACB_RESET_SPEC :{BLACK}Reset Spec
CM_STR_ACB_RESET_SPEC_TOOLTIP :{BLACK}Reset company and send player(s) to spectators.
CM_STR_ACB_RESET_KICK :{BLACK}Reset Kick
CM_STR_ACB_RESET_KICK_TOOLTIP :{BLACK}Reset company and Kick out of the game player(s) on it.
CM_STR_ACB_RESET_TIMER_120 :{BLACK}Reset T. 2m
CM_STR_ACB_RESET_TIMER_120_TOOLTIP :{BLACK}Starts a timer to reset company when after 2 minutes countdown.
CM_STR_ACB_RESET_TIMER :{BLACK}Reset T....
CM_STR_ACB_RESET_TIMER_TOOLTIP :{BLACK}Starts a timer to reset company when time expire (time is Admin input).
CM_STR_ACB_RESET_TIMER_VALUE :{BLACK}Time to Reset (seconds):
CM_STR_ACB_RESET_TIMER_CANCEL :{BLACK}Cancel Reset
CM_STR_ACB_RESET_TIMER_CANCEL_TOOLTIP :{BLACK}Cancel the Reset timer.
CM_STR_ACB_AWARNING :{BLACK}Warning
CM_STR_ACB_AWARNING_TOOLTIP :{BLACK}Sends a Warning to company that an admin is trying to contact.
CM_STR_ACB_RESET_COMP :{BLACK}RESET Company
CM_STR_ACB_RESET_COMP_SURE :{WHITE}Sure to RESET this company?
CM_STR_ACB_RESET_SPEC_SURE :{WHITE}Sure to RESET this company, send players to SPECTATORS?
CM_STR_ACB_RESET_KICK_SURE :{WHITE}Sure to RESET this company, and KICK players on it?
CM_STR_ACB_PLAYER_NEWSTICKET :{BLACK}Type message as newspapper ticket to this Player
CM_STR_ACB_COMPANY_NEWSTICKET :{BLACK}Type message as newspapper ticket to this Company
CM_STR_ACB_COMPANY_JOIN2 :{BLACK}A. Join
CM_STR_ACB_COMPANY_JOIN2_TOOLTIP :{BLACK}Join as an admin
### Several command strings ###
CM_STR_SCS_COMPANY_NEW_JOIN_TOOLTIP :Hold CTRL and click for joining with new company.

View File

@@ -40,6 +40,7 @@
#include "../citymania/cm_client_list_gui.hpp"
#include "../citymania/cm_commands.hpp"
#include "../citymania/cm_newgrf_revisions.hpp"
#include "../citymania/cm_commands_gui.hpp" /* Admin company buttons */
#include "../safeguards.h"
@@ -1325,7 +1326,8 @@ void NetworkClientsToSpectators(CompanyID cid)
NetworkTextMessage(NETWORK_ACTION_COMPANY_SPECTATOR, CC_DEFAULT, false, ci->client_name);
ci->client_playas = COMPANY_SPECTATOR;
}
/* Admin company buttons: delete window */
citymania::ShowAdminCompanyButtons(0, 0, 0, cid+1, false, false);
cur_company.Restore();
}

View File

@@ -902,9 +902,8 @@ static CommandCost CmdRailTrackHelper(DoCommandFlag flags, TileIndex tile, TileI
bool had_success = false;
CommandCost last_error = CMD_ERROR;
for (;;) {
ret = remove ? Command<CMD_REMOVE_SINGLE_RAIL>::Do(flags, tile, TrackdirToTrack(trackdir)) : Command<CMD_BUILD_SINGLE_RAIL>::Do(flags, tile, railtype, TrackdirToTrack(trackdir), auto_remove_signals);
TileIndex last_endtile = _rail_track_endtile; // CM
ret = remove ? Command<CMD_REMOVE_SINGLE_RAIL>::Do(flags, tile, TrackdirToTrack(trackdir)) : Command<CMD_BUILD_SINGLE_RAIL>::Do(flags, tile, railtype, TrackdirToTrack(trackdir), auto_remove_signals);
if (ret.Failed()) {
last_error = ret;
if (_rail_track_endtile == INVALID_TILE) _rail_track_endtile = last_endtile; // CM

View File

@@ -282,6 +282,11 @@ void ShowStatusBar()
}
void CM_RedrawStatusBar() {
StatusBarWindow *w = dynamic_cast<StatusBarWindow*>(FindWindowById(WC_STATUS_BAR, 0));
w->ReInit();
Window *w = FindWindowById(WC_STATUS_BAR, 0);
if (w == nullptr) return;
StatusBarWindow *st = static_cast<StatusBarWindow*>(w);
st->ReInit();
}

View File

@@ -52,11 +52,8 @@ enum CompanyWidgets : WidgetID {
WID_C_COMPANY_PASSWORD, ///< Button to set company password.
WID_C_COMPANY_JOIN, ///< Button to join company.
WID_C_SELECT_MOD,
WID_C_SELECT_MOD_JOIN,
WID_C_MOD_COMPANY_JOIN,
WID_C_MOD_COMPANY_RESET,
WID_C_MOD_COMPANY_TOGGLE_LOCK,
CM_WID_C_SELECT_ADMINBUTTONS,
CM_WID_C_ADMINBUTTONS,
};
/** Widgets of the #CompanyFinancesWindow class. */

View File

@@ -732,6 +732,8 @@ enum WindowClass {
CM_WC_COMMAND_TOOLBAR,
CM_WC_LOGIN_WINDOW,
CM_WC_CB_TOWN,
CM_WC_ADMIN_COMPANY_BUTTONS,
CM_LAST_SERVER,
WC_INVALID = 0xFFFF, ///< Invalid window.
};