#ifndef NOTIFICATIONS_H
#define NOTIFICATIONS_H
+#include <common/command/all.qh>
+
#include "constants.qh"
#include "teams.qh"
#include "util.qh"
VARITEM(3, 4, XPD(s1, s2, s3, f1, f2, f3, f4)) \
VARITEM(4, 4, XPD(s1, s2, s3, s4, f1, f2, f3, f4))
-void Destroy_All_Notifications(void);
+void Destroy_All_Notifications();
void Create_Notification_Entity(
float var_default,
float var_cvar,
void Dump_Notifications(float fh, float alsoprint);
+
+GENERIC_COMMAND(dumpnotifs, "Dump all notifications into notifications_dump.txt")
+{
+ switch(request)
+ {
+ case CMD_REQUEST_COMMAND:
+ {
+ #ifndef MENUQC
+ float fh, alsoprint = false;
+ string filename = argv(1);
+
+ if(filename == "")
+ {
+ filename = "notifications_dump.cfg";
+ alsoprint = false;
+ }
+ else if(filename == "-")
+ {
+ filename = "notifications_dump.cfg";
+ alsoprint = true;
+ }
+ fh = fopen(filename, FILE_WRITE);
+
+ if(fh >= 0)
+ {
+ Dump_Notifications(fh, alsoprint);
+ LOG_INFOF("Dumping notifications... File located in ^2data/data/%s^7.\n", filename);
+ fclose(fh);
+ }
+ else
+ {
+ LOG_INFOF("^1Error: ^7Could not open file '%s'!\n", filename);
+ }
+ #else
+ LOG_INFO(_("Notification dump command only works with cl_cmd and sv_cmd.\n"));
+ #endif
+ return;
+ }
+
+ default:
+ case CMD_REQUEST_USAGE:
+ {
+ LOG_INFO(strcat("\nUsage:^3 ", GetProgramCommandPrefix(), " dumpnotifs [filename]"));
+ LOG_INFO(" Where 'filename' is the file to write (default is notifications_dump.cfg),\n");
+ LOG_INFO(" if supplied with '-' output to console as well as default,\n");
+ LOG_INFO(" if left blank, it will only write to default.\n");
+ return;
+ }
+ }
+}
+
#ifdef NOTIFICATIONS_DEBUG
void Debug_Notification(string input);
#endif
float f1, float f2, float f3, float f4);
#ifdef CSQC // CLIENT ONLY
-void Read_Notification(float is_new);
string prev_soundfile;
float prev_soundtime;
#endif
#ifdef SVQC
.float FRAG_VERBOSE;
-void Notification_GetCvars(void);
+void Notification_GetCvars();
float autocvar_notification_server_allows_location = 1; // 0 = no, 1 = yes
#else
float autocvar_notification_item_centerprinttime = 1.5;
f2primsec: f2 float primary or secondary selection for weapons
f3primsec: f3 float primary or secondary selection for weapons
f1secs: count_seconds of f1
+ f1points: point or points depending on f1
f1ord: count_ordinal of f1
f1time: process_time of f1
f1race_time: mmssss of f1
// todo possible idea.... declare how many floats/strings each arg needs, and then dynamically increment the input
// this way, we don't need to have duplicates like i.e. s2loc and s3loc?
+string BUFF_NAME(int i);
+
#define NOTIF_ARGUMENT_LIST \
ARG_CASE(ARG_CS_SV_HA, "s1", s1) \
ARG_CASE(ARG_CS_SV_HA, "s2", s2) \
ARG_CASE(ARG_CS, "f2primsec", (f2 ? _("secondary") : _("primary"))) \
ARG_CASE(ARG_CS, "f3primsec", (f3 ? _("secondary") : _("primary"))) \
ARG_CASE(ARG_CS, "f1secs", count_seconds(f1)) \
+ ARG_CASE(ARG_CS, "f1points", (f1 == 1 ? _("point") : _("points"))) \
ARG_CASE(ARG_CS_SV, "f1ord", count_ordinal(f1)) \
ARG_CASE(ARG_CS, "f1time", process_time(2, f1)) \
ARG_CASE(ARG_CS_SV_HA, "f1race_time", mmssss(f1)) \
ARG_CASE(ARG_CS_SV, "spree_inf", (autocvar_notification_show_sprees ? notif_arg_spree_inf(1, input, s2, f2) : "")) \
ARG_CASE(ARG_CS_SV, "spree_end", (autocvar_notification_show_sprees ? notif_arg_spree_inf(-1, "", "", f1) : "")) \
ARG_CASE(ARG_CS_SV, "spree_lost", (autocvar_notification_show_sprees ? notif_arg_spree_inf(-2, "", "", f1) : "")) \
- ARG_CASE(ARG_CS_SV, "item_wepname", WEP_NAME(f1)) \
- ARG_CASE(ARG_CS_SV, "item_buffname", sprintf("%s%s", rgb_to_hexcolor(Buffs[f1].m_color), Buffs[f1].m_prettyName)) \
- ARG_CASE(ARG_CS_SV, "f3buffname", sprintf("%s%s", rgb_to_hexcolor(Buffs[f3].m_color), Buffs[f3].m_prettyName)) \
+ ARG_CASE(ARG_CS_SV, "item_wepname", Weapons_from(f1).m_name) \
+ ARG_CASE(ARG_CS_SV, "item_buffname", BUFF_NAME(f1)) \
+ ARG_CASE(ARG_CS_SV, "f3buffname", BUFF_NAME(f3)) \
ARG_CASE(ARG_CS_SV, "item_wepammo", (s1 != "" ? sprintf(_(" with %s"), s1) : "")) \
ARG_CASE(ARG_DC, "item_centime", ftos(autocvar_notification_item_centerprinttime)) \
ARG_CASE(ARG_SV, "death_team", Team_ColoredFullName(f1)) \
ARG_CASE(ARG_CS_SV_HA, "minigame1_name",find(world,netname,s1).descriptor.message) \
ARG_CASE(ARG_CS_SV_HA, "minigame1_d", find(world,netname,s1).descriptor.netname)
-#define NOTIF_HIT_MAX(count,funcname) do { \
+#define NOTIF_HIT_MAX(count,funcname) MACRO_BEGIN { \
if(sel_num == count) { backtrace(sprintf("%s: Hit maximum arguments!\n", funcname)); break; } \
-} while(0)
+} MACRO_END
#define NOTIF_HIT_UNKNOWN(token,funcname) { backtrace(sprintf("%s: Hit unknown token in selected string! '%s'\n", funcname, selected)); break; }
#define KILL_SPREE_LIST \
float NOTIF_CHOICE_COUNT;
// notification limits -- INCREASE AS NECESSARY
-const float NOTIF_ANNCE_MAX = 100;
-const float NOTIF_INFO_MAX = 350;
-const float NOTIF_CENTER_MAX = 250;
-const float NOTIF_MULTI_MAX = 200;
-const float NOTIF_CHOICE_MAX = 30;
+const float NOTIF_ANNCE_MAX = 400;
+const float NOTIF_INFO_MAX = 450;
+const float NOTIF_CENTER_MAX = 350;
+const float NOTIF_MULTI_MAX = 300;
+const float NOTIF_CHOICE_MAX = 50;
// notification entities
entity msg_annce_notifs[NOTIF_ANNCE_MAX];
void RegisterNotifications_First()
{
notif_global_error = false;
-
- #ifdef SVQC
- #define dedi (server_is_dedicated ? "a dedicated " : "")
- #else
- #define dedi ""
- #endif
-
- LOG_INFOF("Beginning notification initialization on %s%s program...\n", dedi, PROGNAME);
- #undef dedi
-
- // maybe do another implementation of this with checksums? for now, we don't need versioning
- /*if(autocvar_notification_version != NOTIF_VERSION)
- {
- #ifdef CSQC
- if(autocvar_notification_version_mismatch_client_error)
- #else
- if(autocvar_notification_version_mismatch_server_error)
- #endif
- notif_global_error = true;
-
- printf("^1NOTIFICATION VERSION MISMATCH: ^7program = %s, config = %d, code = %d.\n",
- PROGNAME, autocvar_notification_version, NOTIF_VERSION);
- }*/
}
void RegisterNotifications_Done()
{
// shit happened... stop the loading of the program now if this is unacceptable
if(autocvar_notification_errors_are_fatal)
- error("Notification initialization failed! Read above and fix the errors!\n");
+ LOG_FATAL("Notification initialization failed! Read above and fix the errors!\n");
else
- LOG_INFO("Notification initialization failed! Read above and fix the errors!\n");
+ LOG_SEVERE("Notification initialization failed! Read above and fix the errors!\n");
}
- else { LOG_INFO("Notification initialization successful!\n"); }
}
// NOW we actually activate the declarations
#include "notifications.inc"
ACCUMULATE_FUNCTION(RegisterNotifications, RegisterNotifications_Done)
+STATIC_INIT(RegisterNotifications) { CALL_ACCUMULATED_FUNCTION(RegisterNotifications); }
+
#endif