Usual welcome message not removed for compatibility with previous Xonotic versions
COLOR_DIALOG_MODEL '1 1 1'
COLOR_DIALOG_CROSSHAIR '1 1 1'
COLOR_DIALOG_HUD '1 1 1'
-COLOR_DIALOG_SCREENSHOTVIEWER '1 1 1'
COLOR_DIALOG_SERVERINFO '1 1 1'
+COLOR_DIALOG_SCREENSHOTVIEWER '1 1 1'
COLOR_DIALOG_FIRSTRUN '1 1 1'
+COLOR_DIALOG_WELCOME '1 1 1'
COLOR_DIALOG_CVARS '1 0.2 0.15'
COLOR_DIALOG_HUDCONFIRM '1 0.2 0.15'
COLOR_DIALOG_HUD '1 1 1'
COLOR_DIALOG_SERVERINFO '1 1 1'
COLOR_DIALOG_SCREENSHOTVIEWER '1 1 1'
+COLOR_DIALOG_FIRSTRUN '1 1 1'
+COLOR_DIALOG_WELCOME '1 1 1'
COLOR_DIALOG_CVARS '1 0 0'
COLOR_DIALOG_HUDCONFIRM '1 0 0'
COLOR_DIALOG_HUD '1 1 1'
COLOR_DIALOG_SERVERINFO '1 1 1'
COLOR_DIALOG_SCREENSHOTVIEWER '1 1 1'
+COLOR_DIALOG_FIRSTRUN '1 1 1'
+COLOR_DIALOG_WELCOME '1 1 1'
COLOR_DIALOG_CVARS '1 0 0'
COLOR_DIALOG_HUDCONFIRM '1 0 0'
COLOR_DIALOG_HUD '1 1 1'
COLOR_DIALOG_SERVERINFO '1 1 1'
COLOR_DIALOG_SCREENSHOTVIEWER '1 1 1'
+COLOR_DIALOG_FIRSTRUN '1 1 1'
+COLOR_DIALOG_WELCOME '1 1 1'
COLOR_DIALOG_CVARS '1 0 0'
COLOR_DIALOG_HUDCONFIRM '1 0 0'
}
}
+string welcomedialog_args;
+NET_HANDLE(TE_CSQC_SERVERINFO, bool isNew)
+{
+ if(welcomedialog_args)
+ strunzone(welcomedialog_args);
+ welcomedialog_args = strcat("name \"", ReadString(), "\"");
+ welcomedialog_args = strcat(welcomedialog_args, " motd \"", MakeConsoleSafe(strreplace("\n", "\\n", ReadString())), "\"");
+ localcmd("\nmenu_cmd directmenu Welcome ", welcomedialog_args, "\n");
+ welcomedialog_args = string_null;
+ return true;
+}
+
string _getcommandkey(string cmd_name, string command, bool forcename)
{
string keys;
REGISTER_NET_TEMP(TE_CSQC_TEAMNAGGER)
REGISTER_NET_TEMP(TE_CSQC_PINGPLREPORT)
REGISTER_NET_TEMP(TE_CSQC_WEAPONCOMPLAIN)
+REGISTER_NET_TEMP(TE_CSQC_SERVERINFO)
REGISTER_NET_TEMP(TE_CSQC_VEHICLESETUP)
const int RACE_NET_CHECKPOINT_HIT_QUALIFYING = 0; // byte checkpoint, short time, short recordtime, string recordholder
#include <common/command/_mod.qh>
+.void(entity me, float argsbuf) readInputArgs;
.entity firstChild, nextSibling;
string _dumptree_space;
m_play_click_sound(MENU_SOUND_OPEN);
m_goto(strcat(filter, argv(1))); // switch to a menu item
}
+ else if(argc > 2 && !isdemo())
+ {
+ entity e = NULL;
+ float argsbuf = 0;
+ string s = strzone(argv(1)); // dialog name
+ for(int i = 0; (e = nextent(e)); )
+ if(e.classname != "vtbl" && e.name == strcat(filter, s))
+ {
+ argsbuf = buf_create();
+ if(argsbuf >= 0)
+ if(e.readInputArgs)
+ {
+ for(i = 2; i < argc; ++i)
+ bufstr_add(argsbuf, argv(i), 1);
+ e.readInputArgs(e, argsbuf);
+ m_goto(strcat(filter, s));
+ }
+ if(argsbuf >= 0)
+ buf_del(argsbuf);
+ }
+ }
return;
}
SKINVECTOR(COLOR_DIALOG_CROSSHAIR, '1 0.7 0.7');
SKINVECTOR(COLOR_DIALOG_HUD, '1 0.7 0.7');
SKINVECTOR(COLOR_DIALOG_SERVERINFO, '0.7 0.7 1');
+ SKINVECTOR(COLOR_DIALOG_WELCOME, '1 0.7 0.7');
SKINVECTOR(COLOR_DIALOG_CVARS, '1 0 0');
SKINVECTOR(COLOR_DIALOG_SCREENSHOTVIEWER, '0.7 0.7 1');
SKINVECTOR(COLOR_DIALOG_HUDCONFIRM, '1 0 0');
#include <menu/xonotic/dialog_teamselect.qc>
#include <menu/xonotic/dialog_termsofservice.qc>
#include <menu/xonotic/dialog_uid2name.qc>
+#include <menu/xonotic/dialog_welcome.qc>
#include <menu/xonotic/gametypelist.qc>
#include <menu/xonotic/hudskinlist.qc>
#include <menu/xonotic/image.qc>
#include <menu/xonotic/dialog_teamselect.qh>
#include <menu/xonotic/dialog_termsofservice.qh>
#include <menu/xonotic/dialog_uid2name.qh>
+#include <menu/xonotic/dialog_welcome.qh>
#include <menu/xonotic/gametypelist.qh>
#include <menu/xonotic/hudskinlist.qh>
#include <menu/xonotic/image.qh>
--- /dev/null
+#include "dialog_welcome.qh"
+
+#include "image.qh"
+#include "textlabel.qh"
+#include "textbox.qh"
+#include "radiobutton.qh"
+#include "commandbutton.qh"
+#include "slider.qh"
+
+void welcomeDialog_resetStrings(entity me)
+{
+ if(me.serverinfo_name)
+ strunzone(me.serverinfo_name);
+ me.serverinfo_name = strzone(_("<NO NAME>"));
+
+ if(me.serverinfo_MOTD)
+ strunzone(me.serverinfo_MOTD);
+ me.serverinfo_MOTD = strzone(_("<NO MOTD>"));
+}
+void XonoticWelcomeDialog_configureDialog(entity me)
+{
+ welcomeDialog_resetStrings(me);
+ SUPER(XonoticWelcomeDialog).configureDialog(me);
+}
+void XonoticWelcomeDialog_readInputArgs(entity me, float argsbuf)
+{
+ int i = 0;
+ string s;
+ welcomeDialog_resetStrings(me);
+ if(argsbuf >= 0)
+ while((s = bufstr_get(argsbuf, i)) != "")
+ {
+ if(s == "name")
+ {
+ if(me.serverinfo_name)
+ strunzone(me.serverinfo_name);
+ me.serverinfo_name = strzone(bufstr_get(argsbuf, i + 1));
+ ++i;
+ }
+ else if(s == "motd")
+ {
+ if(me.serverinfo_MOTD)
+ strunzone(me.serverinfo_MOTD);
+ me.serverinfo_MOTD = strzone(bufstr_get(argsbuf, i + 1));
+ ++i;
+ }
+ ++i;
+ }
+ //me.serverinfo_name_ent.setText(me.serverinfo_name_ent, me.serverinfo_name);
+ me.serverinfo_MOTD_ent.setText(me.serverinfo_MOTD_ent, me.serverinfo_MOTD);
+ me.frame.setText(me.frame, me.serverinfo_name);
+}
+
+void XonoticWelcomeDialog_fill(entity me)
+{
+ entity e;
+
+ me.TR(me);
+ me.TD(me, me.rows - 1, me.columns, me.serverinfo_MOTD_ent = makeXonoticTextBox());
+ me.serverinfo_MOTD_ent.align = 0.5;
+ me.serverinfo_MOTD_ent.allowColors = true;
+ me.serverinfo_MOTD_ent.escapedNewLines = true;
+ me.gotoRC(me, me.rows - 1, 0);
+ me.TD(me, 1, me.columns, e = makeXonoticButton(_("OK"), '0 0 0'));
+ e.onClick = Dialog_Close;
+ e.onClickEntity = me;
+ e.preferredFocusPriority = 1;
+}
--- /dev/null
+#pragma once
+
+#include "rootdialog.qh"
+CLASS(XonoticWelcomeDialog, XonoticRootDialog)
+ METHOD(XonoticWelcomeDialog, fill, void(entity));
+ ATTRIB(XonoticWelcomeDialog, title, string, _("Welcome"));
+ ATTRIB(XonoticWelcomeDialog, color, vector, SKINCOLOR_DIALOG_WELCOME);
+ ATTRIB(XonoticWelcomeDialog, intendedWidth, float, 0.8);
+ ATTRIB(XonoticWelcomeDialog, rows, float, 12);
+ ATTRIB(XonoticWelcomeDialog, columns, float, 4);
+ ATTRIB(XonoticWelcomeDialog, name, string, "Welcome");
+
+ METHOD(XonoticWelcomeDialog, configureDialog, void(entity));
+ METHOD(XonoticWelcomeDialog, readInputArgs, void(entity, float));
+ ATTRIB(XonoticWelcomeDialog, serverinfo_name, string, string_null);
+ //ATTRIB(XonoticWelcomeDialog, serverinfo_name_ent, entity, world);
+ ATTRIB(XonoticWelcomeDialog, serverinfo_MOTD, string, string_null);
+ ATTRIB(XonoticWelcomeDialog, serverinfo_MOTD_ent, entity, world);
+ENDCLASS(XonoticWelcomeDialog)
#include "dialog_multiplayer_create_mutators.qh"
#include "dialog_sandboxtools.qh"
#include "dialog_monstertools.qh"
+#include "dialog_welcome.qh"
#include "dialog_teamselect.qh"
#include "dialog_uid2name.qh"
#include "dialog_singleplayer.qh"
i.configureDialog(i);
me.addItemCentered(me, i, i.intendedWidth * eX + i.intendedHeight * eY, SKINALPHAS_MAINMENU_z);
+ i = NEW(XonoticWelcomeDialog);
+ i.configureDialog(i);
+ me.addItemCentered(me, i, i.intendedWidth * eX + i.intendedHeight * eY, SKINALPHAS_MAINMENU_z);
+
// hud_configure dialogs
i = NEW(XonoticHUDExitDialog);
string t;
buf = buf_create();
- for (int i = 0, n = tokenizebyseparator(text, "\n"); i < n; ++i)
+ string separator = (me.escapedNewLines) ? "\\n" : "\n";
+ for (int i = 0, n = tokenizebyseparator(text, separator); i < n; ++i)
{
t = substring(argv(i), 0, -1);
getWrappedLine_remaining = t;
while (getWrappedLine_remaining)
{
- t = getWrappedLine(1, me.realFontSize, draw_TextWidth_WithColors);
+ t = getWrappedLine(1, me.realFontSize, (me.allowColors) ? draw_TextWidth_WithColors : draw_TextWidth_WithoutColors);
bufstr_set(buf, line, t);
line++;
}
void XonoticTextBox_drawListBoxItem(entity me, int i, vector absSize, bool isSelected, bool isFocused)
{
string s = me.getTextBoxLine(me, i);
- draw_Text(vec2(0, 0), s, me.realFontSize, me.colorL, me.alpha, true);
+ vector color = (me.allowColors) ? '1 1 1' : me.colorL;
+ if (me.align == 0.5)
+ draw_CenterText(me.realUpperMargin * eY + 0.5 * eX, s, me.realFontSize, color, 1, me.allowColors);
+ else
+ draw_Text(vec2(0, 0), s, me.realFontSize, color, me.alpha, me.allowColors);
}
METHOD(XonoticTextBox, resizeNotify, void(entity, vector, vector, vector, vector));
METHOD(XonoticTextBox, drawListBoxItem, void(entity, int, vector, bool, bool));
ATTRIB(XonoticTextBox, allowFocusSound, float, 0);
+ ATTRIB(XonoticTextBox, align, float, 0);
+ ATTRIB(XonoticTextBox, allowColors, bool, false);
+ ATTRIB(XonoticTextBox, escapedNewLines, bool, false);
ATTRIB(XonoticTextBox, alpha, float, SKINALPHA_TEXT);
ATTRIB(XonoticTextBox, fontSize, float, SKINFONTSIZE_NORMAL);
ATTRIB(XonoticTextBox, realFontSize, vector, '0 0 0');
modifications = strcat(modifications, ", Jet pack");
modifications = substring(modifications, 2, strlen(modifications) - 2);
- string versionmessage = GetClientVersionMessage(this);
- string s = strcat(versionmessage, "^8\n^8\nserver is ^9", autocvar_hostname, "^8\n");
+ string s = GetClientVersionMessage(this);
- s = strcat(s, "^8\nmatch type is ^1", gamemode_name, "^8\n");
+ s = strcat(s, "^8\n\nmatch type is ^1", gamemode_name, "^8\n");
if(modifications != "")
s = strcat(s, "^8\nactive modifications: ^3", modifications, "^8\n");
return s;
}
+void serverinfo_welcomemessage_send(entity this)
+{
+ msg_entity = this;
+ WriteHeader(MSG_ONE, TE_CSQC_SERVERINFO);
+ WriteString(MSG_ONE, autocvar_hostname);
+ WriteString(MSG_ONE, getwelcomemessage(this));
+}
+
/**
=============
ClientConnect
CS(this).model_randomizer = random();
if (IS_REAL_CLIENT(this))
+ {
+ if (!autocvar_g_campaign)
+ serverinfo_welcomemessage_send(this);
sv_notice_join(this);
+ }
this.move_qcphysics = autocvar_sv_qcphysics;
string MapVote_Suggest(entity this, string m);
+void serverinfo_welcomemessage_send(entity this);
+
// used by common/command/generic.qc:GenericCommand_dumpcommands to list all commands into a .txt file
void ClientCommand_macro_write_aliases(float fh);