]> de.git.xonotic.org Git - xonotic/xonotic-data.pk3dir.git/commitdiff
Show a welcome window with MOTD on server connection
authorterencehill <piuntn@gmail.com>
Thu, 10 Mar 2022 10:51:33 +0000 (11:51 +0100)
committerterencehill <piuntn@gmail.com>
Thu, 10 Mar 2022 12:18:18 +0000 (13:18 +0100)
Usual welcome message not removed for compatibility with previous Xonotic versions

17 files changed:
gfx/menu/luma/skinvalues.txt
gfx/menu/luminos/skinvalues.txt
gfx/menu/wickedx/skinvalues.txt
gfx/menu/xaw/skinvalues.txt
qcsrc/client/main.qc
qcsrc/common/net_linked.qh
qcsrc/menu/command/menu_cmd.qc
qcsrc/menu/skin-customizables.inc
qcsrc/menu/xonotic/_mod.inc
qcsrc/menu/xonotic/_mod.qh
qcsrc/menu/xonotic/dialog_welcome.qc [new file with mode: 0644]
qcsrc/menu/xonotic/dialog_welcome.qh [new file with mode: 0644]
qcsrc/menu/xonotic/mainwindow.qc
qcsrc/menu/xonotic/textbox.qc
qcsrc/menu/xonotic/textbox.qh
qcsrc/server/client.qc
qcsrc/server/command/cmd.qh

index eef45e9a0a44f8d0439139e9c651b1956c0553cd..1bf37b98b845915987fa4838bc3a3c7ee8408279 100644 (file)
@@ -92,9 +92,10 @@ COLOR_DIALOG_VIEW             '1 1 1'
 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'
 
index 2ffe29af0c04e785e215421c99c9a450d6b71ae5..d4fdef1cd5196031984803396f96beb9464cc814 100755 (executable)
@@ -193,6 +193,8 @@ COLOR_DIALOG_CROSSHAIR          '1 1 1'
 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'
 
index 0580e89eb1a152813fe0a25636285f84740a85ce..ca5e303dac811c1737caeab11e8347f1a163a5d1 100644 (file)
@@ -193,6 +193,8 @@ COLOR_DIALOG_CROSSHAIR          '1 1 1'
 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'
 
index af7d8ce165a92e7d6941a7692393a7ebdca387bb..aa4350cc56b49fe61f27e2884a0214d1226ab1ef 100644 (file)
@@ -37,6 +37,8 @@ COLOR_DIALOG_CROSSHAIR          '1 1 1'
 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'
 
index 7acbfe6cbafb20b4b0ee7ec41441e79828153dc7..f3f06acd5521aca43b34745b63c73714a1f12cee 100644 (file)
@@ -1286,6 +1286,18 @@ NET_HANDLE(TE_CSQC_WEAPONCOMPLAIN, bool isNew)
        }
 }
 
+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;
index 6651c6cb9b75fae79d13d8a38681883c557873a1..0b5923f17397af6831dd4bfb3eaecee5d149b76f 100644 (file)
@@ -5,6 +5,7 @@ REGISTER_NET_TEMP(TE_CSQC_RACE)
 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
index c4593e87aa1a90181c8d555513c2bc89af92a8f4..8de4bf4f033a5c178b0f402fc3db0d6cf3fa8198 100644 (file)
@@ -7,6 +7,7 @@
 
 #include <common/command/_mod.qh>
 
+.void(entity me, float argsbuf) readInputArgs;
 .entity firstChild, nextSibling;
 
 string _dumptree_space;
@@ -97,6 +98,27 @@ void GameCommand(string theCommand)
                        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;
        }
 
index 54f6283b80bb9033a2883d106bd46aabc61781f5..15bd5356b883a7905309d44506ed9ff9bc79f491 100644 (file)
@@ -70,6 +70,7 @@ SKINBEGIN
        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');
index 1c09f35866a80a4178f06c39f94a7c77573d0431..cd3b9cb471dd71a963b5d460b69b0903f76e9ff6 100644 (file)
@@ -86,6 +86,7 @@
 #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>
index 7c3ab9059b5fa6f57c1208f40f9a840d920b2a6d..a1e9e31e1c7a465e4e421fa11eaf5e853327f2ac 100644 (file)
@@ -86,6 +86,7 @@
 #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>
diff --git a/qcsrc/menu/xonotic/dialog_welcome.qc b/qcsrc/menu/xonotic/dialog_welcome.qc
new file mode 100644 (file)
index 0000000..14dabdc
--- /dev/null
@@ -0,0 +1,68 @@
+#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;
+}
diff --git a/qcsrc/menu/xonotic/dialog_welcome.qh b/qcsrc/menu/xonotic/dialog_welcome.qh
new file mode 100644 (file)
index 0000000..44458bf
--- /dev/null
@@ -0,0 +1,19 @@
+#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)
index f5d2aca98e8c622028ff506228b05af6b0a8305c..8377c561e41d4a030f2b39b5f4403869b772de1b 100644 (file)
@@ -43,6 +43,7 @@
 #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"
@@ -121,6 +122,10 @@ void MainWindow_configureMainWindow(entity me)
        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);
index 1027d0c9e10cc0950ee4fd1b827e9df6adf7c964..e2eaf2a854cecded7ce95fb55ea6b739ee0f80fd 100644 (file)
@@ -32,13 +32,14 @@ void XonoticTextBox_setText(entity me, string text)
        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++;
                }
@@ -86,5 +87,9 @@ void XonoticTextBox_resizeNotify(entity me, vector relOrigin, vector relSize, ve
 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);
 }
index b27481671af8d8c4435c96094dc225befca702b4..3289d7b4db78333adc79096bb54d7562795501af 100644 (file)
@@ -9,6 +9,9 @@ CLASS(XonoticTextBox, XonoticListBox)
        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');
index 8ae3df19380ab918478f3514035d0e0fc9a970c7..3d0fffe0a0a538f3f850d48b5a8d762e42fd89e0 100644 (file)
@@ -1055,10 +1055,9 @@ string getwelcomemessage(entity this)
                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");
@@ -1086,6 +1085,14 @@ string getwelcomemessage(entity this)
        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
@@ -1173,7 +1180,11 @@ void ClientConnect(entity this)
        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;
 
index 802afc8bde6f86e1ed3e145df61f111ea51ec715..344cba0eb0afcf657f25ffe52cac3ad15c50ed56 100644 (file)
@@ -8,5 +8,7 @@ int autocvar_sv_clientcommand_antispam_count;
 
 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);