From: terencehill Date: Thu, 31 Mar 2022 16:32:53 +0000 (+0200) Subject: Merge branch 'master' into terencehill/welcome_dialog_translatable X-Git-Tag: xonotic-v0.8.5~81^2~6 X-Git-Url: https://de.git.xonotic.org/?p=xonotic%2Fxonotic-data.pk3dir.git;a=commitdiff_plain;h=82e5c474d4af81e54797d363adcf331548262144 Merge branch 'master' into terencehill/welcome_dialog_translatable # Conflicts: # qcsrc/client/main.qc # qcsrc/server/client.qc --- 82e5c474d4af81e54797d363adcf331548262144 diff --cc qcsrc/client/main.qc index 0741acc21a,75fb7169e1..c7f4d576c7 --- a/qcsrc/client/main.qc +++ b/qcsrc/client/main.qc @@@ -1286,82 -1314,43 +1314,101 @@@ NET_HANDLE(TE_CSQC_WEAPONCOMPLAIN, boo } } +string translate_modifications(string s) +{ + return build_mutator_list(s); +} + +string translate_weaponarena(string s) +{ + if (s == "") return s; + if (s == "All Weapons Arena") return _("All Weapons Arena"); + if (s == "Dev All Weapons Arena") return s; // development option, do not translate + if (s == "Most Weapons Arena") return _("Most Weapons Arena"); + if (s == "All Available Weapons Arena") return _("All Available Weapons Arena"); + if (s == "Dev All Available Weapons Arena") return s; // development option, do not translate + if (s == "Most Available Weapons Arena") return _("Most Available Weapons Arena"); + if (s == "No Weapons Arena") return _("No Weapons Arena"); + + int n = tokenizebyseparator(s, " & "); + string wpn_list = ""; + for (int i = 0; i < n; i++) + { + Weapon wep = Weapon_from_name(argv(i)); + if (wep == WEP_Null) + LOG_INFO("^3Warning: ^7server sent an invalid weapon name\n"); + wpn_list = cons_mid(wpn_list, " & ", wep.m_name); + } + return sprintf(_("%s Arena"), wpn_list); +} + +string GetVersionMessage(string hostversion, bool version_mismatch, bool version_check) +{ + string xonotic_hostversion = strcat("Xonotic ", hostversion); + if (version_mismatch) + { + if(!version_check) + return strcat(sprintf(_("This is %s"), xonotic_hostversion), "\n^3", + _("Your client version is outdated."), "\n\n\n", + _("### YOU WON'T BE ABLE TO PLAY ON THIS SERVER ###"), "\n\n\n", + _("Please update!")); + else + return strcat(sprintf(_("This is %s"), xonotic_hostversion), "\n^3", + _("This server is using an outdated Xonotic version."), "\n\n\n", + _("### THIS SERVER IS INCOMPATIBLE AND THUS YOU CANNOT JOIN ###")); + } + return sprintf(_("Welcome to %s"), xonotic_hostversion); +} + - NET_HANDLE(TE_CSQC_SERVERINFO, bool isNew) + bool net_handle_ServerWelcome() { + bool campaign = ReadByte(); + if (campaign) + { + string campaign_title = ReadString(); + int campaign_level = ReadByte(); + string campaign_msg = ReadString(); + string welcomedialog_args; + welcomedialog_args = strcat("HOSTNAME \"", campaign_title, "\""); + string key = getcommandkey(_("jump"), "+jump"); + string msg = strcat( + CCR("^F1"), sprintf(_("Level %d:"), campaign_level), + sprintf(CCR(" ^BG%s\n^3\n"), campaign_msg), + sprintf(CCR(_("^BGPress ^F2%s^BG to enter the game")), key)); + msg = MakeConsoleSafe(strreplace("\n", "\\n", msg)); + welcomedialog_args = strcat(welcomedialog_args, " WELCOME \"", msg, "\""); + localcmd("\nmenu_cmd directmenu Welcome ", welcomedialog_args, "\n"); + return true; + } + bool force_centerprint = ReadByte(); string hostname = ReadString(); - string ver = ReadString(); - string modifications = ReadString(); + + string hostversion = ReadString(); + bool version_mismatch = ReadByte(); + bool version_check = ReadByte(); + string ver = GetVersionMessage(hostversion, version_mismatch, version_check); + + string modifications = translate_modifications(ReadString()); + string weaponarena_list = translate_weaponarena(ReadString()); string cache_mutatormsg = ReadString(); - string mutator_msg = ReadString(); string motd = ReadString(); string msg = ""; msg = strcat(msg, ver); - msg = strcat(msg, "^8\n\n", _("match type is "), " ^1", MapInfo_Type_ToText(gametype), "^8\n"); + msg = strcat(msg, "^8\n\n", strcat(_("Gametype:"), " ^1", MapInfo_Type_ToText(gametype)), "^8\n"); + + modifications = cons_mid(modifications, ", ", weaponarena_list); if(modifications != "") - msg = strcat(msg, "^8\n", _("active modifications:"), " ^3", modifications, "^8\n"); + msg = strcat(msg, "^8\n", _("Active modifications:"), " ^3", modifications, "^8\n"); + if (cache_mutatormsg != "") - msg = strcat(msg, "\n\n^8", _("special gameplay tips:"), " ^7", cache_mutatormsg); + msg = strcat(msg, "\n\n^8", _("Special gameplay tips:"), " ^7", cache_mutatormsg); + string mutator_msg = ""; + MUTATOR_CALLHOOK(BuildGameplayTipsString, mutator_msg); + mutator_msg = M_ARGV(0, string); msg = strcat(msg, mutator_msg); // trust that the mutator will do proper formatting + if (motd != "") msg = strcat(msg, "\n\n^8", _("MOTD:"), " ^7", motd); diff --cc qcsrc/server/client.qc index c27ba948cf,a5f508851b..6422f0dd56 --- a/qcsrc/server/client.qc +++ b/qcsrc/server/client.qc @@@ -1021,12 -1021,38 +1021,25 @@@ void ClientPreConnect(entity this void SendWelcomemessage(entity this, bool force_centerprint) { msg_entity = this; - WriteHeader(MSG_ONE, TE_CSQC_SERVERINFO); - WriteByte(MSG_ONE, force_centerprint); - WriteString(MSG_ONE, autocvar_hostname); - WriteString(MSG_ONE, autocvar_g_xonoticversion); - WriteByte(MSG_ONE, CS(this).version_mismatch); - WriteByte(MSG_ONE, (CS(this).version < autocvar_gameversion)); + WriteHeader(MSG_ONE, TE_CSQC_SERVERWELCOME); + SendWelcomemessage_msg_type(this, force_centerprint, MSG_ONE); + } + + void SendWelcomemessage_msg_type(entity this, bool force_centerprint, int msg_type) + { + WriteByte(msg_type, boolean(autocvar_g_campaign)); + if (boolean(autocvar_g_campaign)) + { + WriteString(msg_type, Campaign_GetTitle()); + WriteByte(msg_type, Campaign_GetLevelNum()); + WriteString(msg_type, Campaign_GetMessage()); + return; + } + WriteByte(msg_type, force_centerprint); + WriteString(msg_type, autocvar_hostname); - WriteString(msg_type, GetClientVersionMessage(this)); ++ WriteString(msg_type, autocvar_g_xonoticversion); ++ WriteByte(msg_type, CS(this).version_mismatch); ++ WriteByte(msg_type, (CS(this).version < autocvar_gameversion)); MUTATOR_CALLHOOK(BuildMutatorsPrettyString, ""); string modifications = M_ARGV(0, string); @@@ -1038,33 -1071,25 +1051,22 @@@ if(g_weapon_stay && !g_cts) modifications = strcat(modifications, ", Weapons stay"); if(autocvar_g_jetpack) - modifications = strcat(modifications, ", Jet pack"); + modifications = strcat(modifications, ", Jetpack"); modifications = substring(modifications, 2, strlen(modifications) - 2); - WriteString(MSG_ONE, modifications); + WriteString(msg_type, modifications); - WriteString(MSG_ONE, g_weaponarena_list); ++ WriteString(msg_type, g_weaponarena_list); + if(cache_lastmutatormsg != autocvar_g_mutatormsg) { strcpy(cache_lastmutatormsg, autocvar_g_mutatormsg); strcpy(cache_mutatormsg, cache_lastmutatormsg); } - WriteString(MSG_ONE, cache_mutatormsg); + WriteString(msg_type, cache_mutatormsg); - WriteString(MSG_ONE, strreplace("\\n", "\n", autocvar_sv_motd)); - } - - void SendWelcomemessage_onConnection_think(entity this) - { - SendWelcomemessage(this, false); - } - string mutator_msg = ""; - MUTATOR_CALLHOOK(BuildGameplayTipsString, mutator_msg); - mutator_msg = M_ARGV(0, string); -- - void SendWelcomemessage_onConnection(entity this) - { - // give the client time to sent its version - defer(this, 0.5, SendWelcomemessage_onConnection_think); - WriteString(msg_type, mutator_msg); // trust that the mutator will do proper formatting + WriteString(msg_type, strreplace("\\n", "\n", autocvar_sv_motd)); } /**