// ================================================ // Unified notification system, written by Samual // Last updated: February, 2013 // ================================================ // main types/groups of notifications #define MSG_INFO 1 // "Global" information messages (sent to console, and notify panel if it has an icon) #define MSG_CENTER 2 // "Personal" centerprint messages #define MSG_WEAPON 3 // "Personal" weapon messages (like "You got the Nex", sent to weapon notify panel) #define MSG_DEATH 4 // "Personal" AND "Global" death messages #define NO_MSG -12345 // Current version number of the configuration file for notifications... // This is used to check matches between the config file and the code, // and should be incremented with any new notifications or any other changes // to notification cvars, notification list, or notificiation config. #define NOTIF_VERSION 3 #define EIGHT_VARS_TO_VARARGS_VARLIST \ VARITEM(1, 0, s1) \ VARITEM(2, 0, XPD(s1, s2)) \ VARITEM(3, 0, XPD(s1, s2, s3)) \ VARITEM(4, 0, XPD(s1, s2, s3, s4)) \ VARITEM(0, 1, f1) \ VARITEM(1, 1, XPD(s1, f1)) \ VARITEM(2, 1, XPD(s1, s2, f1)) \ VARITEM(3, 1, XPD(s1, s2, s3, f1)) \ VARITEM(4, 1, XPD(s1, s2, s3, s4, f1)) \ VARITEM(0, 2, XPD(f1, f2)) \ VARITEM(1, 2, XPD(s1, f1, f2)) \ VARITEM(2, 2, XPD(s1, s2, f1, f2)) \ VARITEM(3, 2, XPD(s1, s2, s3, f1, f2)) \ VARITEM(4, 2, XPD(s1, s2, s3, s4, f1, f2)) \ VARITEM(0, 3, XPD(f1, f2, f3)) \ VARITEM(1, 3, XPD(s1, f1, f2, f3)) \ VARITEM(2, 3, XPD(s1, s2, f1, f2, f3)) \ VARITEM(3, 3, XPD(s1, s2, s3, f1, f2, f3)) \ VARITEM(4, 3, XPD(s1, s2, s3, s4, f1, f2, f3)) \ VARITEM(0, 4, XPD(f1, f2, f3, f4)) \ VARITEM(1, 4, XPD(s1, f1, f2, f3, f4)) \ VARITEM(2, 4, XPD(s1, s2, f1, f2, f3, f4)) \ VARITEM(3, 4, XPD(s1, s2, s3, f1, f2, f3, f4)) \ VARITEM(4, 4, XPD(s1, s2, s3, s4, f1, f2, f3, f4)) void Dump_Notifications(float fh, float alsoprint); void Local_Notification(float net_type, float net_name, ...count); void Local_Notification_WOVA(float net_type, float net_name, float stringcount, float floatcount, string s1, string s2, string s3, string s4, float f1, float f2, float f3, float f4); #ifdef CSQC // CLIENT ONLY void Read_Notification(float is_new); #endif #ifdef SVQC // SERVER ONLY #define NOTIF_ONE 1 #define NOTIF_ONE_ONLY 2 #define NOTIF_TEAM 3 #define NOTIF_TEAM_EXCEPT 4 #define NOTIF_ANY 5 #define NOTIF_ANY_EXCEPT 6 #define IFSTR(num) ((num < notif.nent_stringcount) ? ...(num, string) : "") #define IFFL(num) ((((notif.nent_stringcount-1) + num) < count) ? ...(((notif.nent_stringcount-1) + num), float) : 0) void Send_Notification(float broadcast, entity client, float net_type, float net_name, ...count); void Send_Notification_WOVA(float broadcast, entity client, float net_type, float net_name, string s1, string s2, string s3, string s4, float f1, float f2, float f3, float f4); void Send_CSQC_Centerprint_Generic(entity e, float id, string s, float duration, float countdown_num); #define Send_CSQC_Centerprint_Generic_Expire(e,id) Send_CSQC_Centerprint_Generic(e, id, "", 1, 0) #endif // ==================================== // Notifications List and Information // ==================================== /* List of all notifications (including identifiers and display information) Possible Tokens: default, name, infoname, centername, strnum, flnum, args, hudargs, icon, cpid, durcnt, normal, gentle Format Specifications: MSG_INFO: default: FLOAT: Default setting for whether the notification is enabled or not name: VAR: Name of notification strnum: FLOAT: Number of STRING arguments (so that networking knows how many to send/receive) flnum: FLOAT: Number of FLOAT arguments (so that networking knows how many to send/receive) args: STRING: Arguments for Local_Notification_sprintf() hudargs: STRING: Arguments for Local_Notification_HUD_Notify_Push() icon: STRING: icon string name for the hud notify panel, "" if no icon is used normal: STRING: Normal message (string for sprintf when gentle messages are NOT enabled) gentle: STRING: Gentle message (string for sprintf when gentle messages ARE enabled) MSG_CENTER: default: FLOAT: Default setting for whether the notification is enabled or not name: VAR: Name of notification strnum: FLOAT: Number of STRING arguments (so that networking knows how many to send/receive) flnum: FLOAT: Number of FLOAT arguments (so that networking knows how many to send/receive) args: STRING: Arguments for Local_Notification_sprintf() cpid: FLOAT: centerprint ID number (CPID_*), NO_CPID if no CPID is needed durcnt: XPD(FLOAT, FLOAT): Duration/Countdown: extra arguments for centerprint messages normal: STRING: Normal message (string for sprintf when gentle messages are NOT enabled) gentle: STRING: Gentle message (string for sprintf when gentle messages ARE enabled) MSG_WEAPON: MSG_DEATH: default: FLOAT: Default setting for whether the notification is enabled or not name: VAR: Name of chaining notification infoname: VAR: Name of info notification for reference centername: VAR: Name of centerprint notification for reference Messages with ^F1, ^BG, ^TC, etc etc in them will replace those strings with colors according to the cvars the user has chosen. This allows for users to create unique color profiles for their HUD, giving more customization options to HUD designers and end users who want such a feature. Check out the definitions in util.qc/util.qh/teams.qh for string CCR(...) and string TCR(...) to better understand how these code replacements work. Additionally, you can find all the definitions and explanations for the argument values and what they return down below in this file. Guidlines for notification declaration (please try and follow these): Specific rules: -ALWAYS start the string with a color, preferably background. -ALWAYS reset a color after a name (this way they don't set it for the whole string). -NEVER re-declare an event twice. -NEVER add or remove tokens from the format, it SHOULD already work. -MSG_INFO messages must ALWAYS end with a new line: \n -MSG_INFO hudargs must always be ATTACKER -> VICTIM -MSG_CENTER should NOT end with a new line General rules: -Be clean and simple with your notification naming, nothing too long for the name field... Abbreviations are your friend. :D -Keep the spacing as clean as possible... if the arguments are abnormally long, it's okay to go out of line a bit... but try and keep it clean still. -Sort the notifications in the most appropriate order for their tasks. -ARIRE unir frk jvgu lbhe bja zbgure. (gvc sbe zvxrrhfn) -- Don't pay attention to this ^_^ Final note: DO NOT PROVIDE MORE ARGUMENTS THAN NECESSARY FOR THE NOTIFICATION YOU'RE CALLING! The system is designed to save as much networking bandwidth as possible, so please dynamically control your argument sending to fit *exactly* what is required. If you send a notification with mismatching arguments, Send_Notification() will error. */ #define MULTITEAM_INFO(default,prefix,teams,strnum,flnum,args,hudargs,icon,normal,gentle) \ MSG_INFO_NOTIF(default, prefix##RED, strnum, flnum, args, hudargs, sprintf(icon, strtolower(STR_TEAM_1)), TCR(normal, COL_TEAM_1, strtoupper(STR_TEAM_1)), TCR(gentle, COL_TEAM_1, strtoupper(STR_TEAM_1))) \ MSG_INFO_NOTIF(default, prefix##BLUE, strnum, flnum, args, hudargs, sprintf(icon, strtolower(STR_TEAM_2)), TCR(normal, COL_TEAM_2, strtoupper(STR_TEAM_2)), TCR(gentle, COL_TEAM_2, strtoupper(STR_TEAM_2))) \ #if teams >= 3 \ MSG_INFO_NOTIF(default, prefix##YELLOW, strnum, flnum, args, hudargs, sprintf(icon, strtolower(STR_TEAM_3)), TCR(normal, COL_TEAM_3, strtoupper(STR_TEAM_3)), TCR(gentle, COL_TEAM_3, strtoupper(STR_TEAM_3))) \ #endif \ #if teams >= 4 \ MSG_INFO_NOTIF(default, prefix##PINK, strnum, flnum, args, hudargs, sprintf(icon, strtolower(STR_TEAM_4)), TCR(normal, COL_TEAM_4, strtoupper(STR_TEAM_4)), TCR(gentle, COL_TEAM_4, strtoupper(STR_TEAM_4))) \ #endif #define MSG_INFO_NOTIFICATIONS \ /*MSG_INFO_NOTIF(1, INFO_EMPTY, 0, 0, "", "", "", "", "")*/ \ MULTITEAM_INFO(1, INFO_CTF_FLAGRETURN_DROPPED_, 2, 0, 0, "", "", "", _("^BGThe ^TC^TT^BG flag was dropped in the base and returned itself\n"), "") \ MULTITEAM_INFO(1, INFO_CTF_FLAGRETURN_DAMAGED_, 2, 0, 0, "", "", "", _("^BGThe ^TC^TT^BG flag was destroyed and returned to base\n"), "") \ MULTITEAM_INFO(1, INFO_CTF_FLAGRETURN_SPEEDRUN_, 2, 0, 1, "f1p2dec", "", "", _("^BGThe ^TC^TT^BG flag became impatient after ^F1%.2f^BG seconds and returned itself\n"), "") \ MULTITEAM_INFO(1, INFO_CTF_FLAGRETURN_NEEDKILL_, 2, 0, 0, "", "", "", _("^BGThe ^TC^TT^BG flag fell somewhere it couldn't be reached and returned to base\n"), "") \ MULTITEAM_INFO(1, INFO_CTF_FLAGRETURN_ABORTRUN_, 2, 0, 0, "", "", "", _("^BGThe ^TC^TT^BG flag was returned to base by its owner\n"), "") \ MULTITEAM_INFO(1, INFO_CTF_FLAGRETURN_TIMEOUT_, 2, 0, 0, "", "", "", _("^BGThe ^TC^TT^BG flag has returned to the base\n"), "") \ MULTITEAM_INFO(1, INFO_CTF_PICKUP_, 2, 1, 0, "s1", "s1", "notify_%s_taken", _("^BG%s^BG got the ^TC^TT^BG flag\n"), "") \ MULTITEAM_INFO(1, INFO_CTF_RETURN_, 2, 1, 0, "s1", "s1", "notify_%s_returned", _("^BG%s^BG returned the ^TC^TT^BG flag\n"), "") \ MULTITEAM_INFO(1, INFO_CTF_LOST_, 2, 1, 0, "s1", "s1", "notify_%s_lost", _("^BG%s^BG lost the ^TC^TT^BG flag\n"), "") \ MULTITEAM_INFO(1, INFO_CTF_CAPTURE_, 2, 1, 0, "s1", "s1", "notify_%s_captured", _("^BG%s^BG captured the ^TC^TT^BG flag\n"), "") \ MULTITEAM_INFO(1, INFO_CTF_CAPTURE_TIME_, 2, 1, 1, "s1 f1p2dec", "s1", "notify_%s_captured", _("^BG%s^BG captured the ^TC^TT^BG flag in ^F1%s^BG seconds\n"), "") \ MULTITEAM_INFO(1, INFO_CTF_CAPTURE_BROKEN_, 2, 2, 2, "s1 f1p2dec s2 f2p2dec", "s1", "notify_%s_captured", _("^BG%s^BG captured the ^TC^TT^BG flag in ^F1%s^BG seconds, breaking ^BG%s^BG's previous record of ^F2%s^BG seconds\n"), "") \ MULTITEAM_INFO(1, INFO_CTF_CAPTURE_UNBROKEN_, 2, 2, 2, "s1 f1p2dec s2 f2p2dec", "s1", "notify_%s_captured", _("^BG%s^BG captured the ^TC^TT^BG flag in ^F2%s^BG seconds, failing to break ^BG%s^BG's previous record of ^F1%s^BG seconds\n"), "") \ MULTITEAM_INFO(1, INFO_DEATH_TEAMKILL_, 4, 2, 1, "s1 s2 spree_end", "s2 s1", "notify_teamkill_%s", _("^BG%s^K1 was betrayed by ^BG%s^K1%s\n"), "") \ MSG_INFO_NOTIF(1, INFO_DEATH_FIRSTBLOOD, 2, 0, "s2", "", "", _("^BG%s^K1 drew first blood\n"), _("^F1%s^K1 got the first score\n")) \ MSG_INFO_NOTIF(1, INFO_DEATH_SELF_CUSTOM, 2, 1, "s1 s2 spree_end", "s1", "notify_void", _("^BG%s^K1 %s^K1%s\n"), "") \ MSG_INFO_NOTIF(1, INFO_DEATH_SELF_GENERIC, 1, 1, "s1 spree_end", "s1", "notify_selfkill", _("^BG%s^K1 died%s\n"), "") \ MSG_INFO_NOTIF(1, INFO_DEATH_SELF_VOID, 1, 1, "s1 spree_end", "s1", "notify_void", _("^BG%s^K1 was in the wrong place%s\n"), "") \ MSG_INFO_NOTIF(1, INFO_DEATH_SELF_SUICIDE, 1, 1, "s1 spree_end", "s1", "notify_selfkill", _("^BG%s^K1 couldn't take it anymore%s\n"), "") \ MSG_INFO_NOTIF(1, INFO_DEATH_SELF_NOAMMO, 1, 1, "s1 spree_end", "s1", "notify_outofammo", _("^BG%s^K1 died%s. What's the point of living without ammo?\n"), _("^BG%s^K1 ran out of ammo%s\n")) \ MSG_INFO_NOTIF(1, INFO_DEATH_SELF_ROT, 1, 1, "s1 spree_end", "s1", "notify_death", _("^BG%s^K1 rotted away%s\n"), "") \ MSG_INFO_NOTIF(1, INFO_DEATH_SELF_CAMP, 1, 1, "s1 spree_end", "s1", "notify_camping", _("^BG%s^K1 thought they found a nice camping ground%s\n"), "") \ MSG_INFO_NOTIF(1, INFO_DEATH_SELF_BETRAYAL, 1, 1, "s1 spree_end", "s1", "notify_teamkill_red", _("^BG%s^K1 became enemies with the Lord of Teamplay%s\n"), "") \ MSG_INFO_NOTIF(1, INFO_DEATH_SELF_TEAMCHANGE, 1, 1, "s1 death_team", "", "", _("^BG%s^K1 switched to the %s\n"), "") \ MSG_INFO_NOTIF(1, INFO_DEATH_SELF_AUTOTEAMCHANGE, 1, 1, "s1 death_team", "", "", _("^BG%s^K1 was moved into the %s\n"), "") \ MSG_INFO_NOTIF(1, INFO_DEATH_SELF_FALL, 1, 1, "s1 spree_end", "s1", "notify_fall", _("^BG%s^K1 hit the ground with a crunch%s\n"), _("^BG%s^K1 hit the ground with a bit too much force%s\n")) \ MSG_INFO_NOTIF(1, INFO_DEATH_SELF_DROWN, 1, 1, "s1 spree_end", "s1", "notify_water", _("^BG%s^K1 couldn't catch their breath%s\n"), _("^BG%s^K1 was in the water for too long%s\n")) \ MSG_INFO_NOTIF(1, INFO_DEATH_SELF_FIRE, 1, 1, "s1 spree_end", "s1", "notify_death", _("^BG%s^K1 became a bit too crispy%s\n"), _("^BG%s^K1 felt a little hot%s\n")) \ MSG_INFO_NOTIF(1, INFO_DEATH_SELF_LAVA, 1, 1, "s1 spree_end", "s1", "notify_lava", _("^BG%s^K1 turned into hot slag%s\n"), _("^BG%s^K1 found a hot place%s\n")) \ MSG_INFO_NOTIF(1, INFO_DEATH_SELF_SLIME, 1, 1, "s1 spree_end", "s1", "notify_slime", _("^BG%s^K1 was slimed%s\n"), "") \ MSG_INFO_NOTIF(1, INFO_DEATH_SELF_SHOOTING_STAR, 1, 1, "s1 spree_end", "s1", "notify_shootingstar", _("^BG%s^K1 became a shooting star%s\n"), "") \ MSG_INFO_NOTIF(1, INFO_DEATH_SELF_SWAMP, 1, 1, "s1 spree_end", "s1", "notify_slime", _("^BG%s^K1 is now preserved for centuries to come%s\n"), "") \ MSG_INFO_NOTIF(1, INFO_DEATH_SELF_CHEAT, 1, 1, "s1 spree_end", "s1", "notify_selfkill", _("^BG%s^K1 unfairly eliminated themself%s\n"), "") \ MSG_INFO_NOTIF(1, INFO_DEATH_SELF_TOUCHEXPLODE, 1, 1, "s1 spree_end", "s1", "notify_death", _("^BG%s^K1 died in an accident%s\n"), "") \ MSG_INFO_NOTIF(1, INFO_DEATH_SELF_TURRET, 1, 1, "s1 spree_end", "s1", "notify_death", _("^BG%s^K1 ran into a turret%s\n"), "") \ MSG_INFO_NOTIF(1, INFO_DEATH_SELF_TURRET_EWHEEL, 1, 1, "s1 spree_end", "s1", "notify_death", _("^BG%s^K1 was blasted away by an eWheel turret%s\n"), "") \ MSG_INFO_NOTIF(1, INFO_DEATH_SELF_TURRET_FLAC, 1, 1, "s1 spree_end", "s1", "notify_death", _("^BG%s^K1 got caught up in the FLAC turret fire%s\n"), "") \ MSG_INFO_NOTIF(1, INFO_DEATH_SELF_TURRET_MACHINEGUN, 1, 1, "s1 spree_end", "s1", "notify_death", _("^BG%s^K1 was riddled full of holes by a Machinegun turret%s\n"), "") \ MSG_INFO_NOTIF(1, INFO_DEATH_SELF_TURRET_WALKER_GUN, 1, 1, "s1 spree_end", "s1", "notify_death", _("^BG%s^K1 got served a lead enrichment by a Walker turret%s\n"), "") \ MSG_INFO_NOTIF(1, INFO_DEATH_SELF_TURRET_WALKER_MEELE, 1, 1, "s1 spree_end", "s1", "notify_death", _("^BG%s^K1 was impaled by a Walker turret%s\n"), "") \ MSG_INFO_NOTIF(1, INFO_DEATH_SELF_TURRET_WALKER_ROCKET, 1, 1, "s1 spree_end", "s1", "notify_death", _("^BG%s^K1 was blasted away by a Walker turret%s\n"), "") \ MSG_INFO_NOTIF(1, INFO_DEATH_SELF_TURRET_HELLION, 1, 1, "s1 spree_end", "s1", "notify_death", _("^BG%s^K1 was blasted away by a Hellion turret%s\n"), "") \ MSG_INFO_NOTIF(1, INFO_DEATH_SELF_TURRET_HK, 1, 1, "s1 spree_end", "s1", "notify_death", _("^BG%s^K1 could not hide from the Hunter turret%s\n"), "") \ MSG_INFO_NOTIF(1, INFO_DEATH_SELF_TURRET_MLRS, 1, 1, "s1 spree_end", "s1", "notify_death", _("^BG%s^K1 got turned into smoldering gibs by an MLRS turret%s\n"), "") \ MSG_INFO_NOTIF(1, INFO_DEATH_SELF_TURRET_PLASMA, 1, 1, "s1 spree_end", "s1", "notify_death", _("^BG%s^K1 got served some superheated plasma from a turret%s\n"), "") \ MSG_INFO_NOTIF(1, INFO_DEATH_SELF_TURRET_PHASER, 1, 1, "s1 spree_end", "s1", "notify_death", _("^BG%s^K1 was phased out by a turret%s\n"), "") \ MSG_INFO_NOTIF(1, INFO_DEATH_SELF_TURRET_TESLA, 1, 1, "s1 spree_end", "s1", "notify_death", _("^BG%s^K1 was electrocuted by a Tesla turret%s\n"), "") \ MSG_INFO_NOTIF(1, INFO_DEATH_MURDER_TELEFRAG, 2, 1, "spree_inf s1 s2 spree_end", "s2 s1", "notify_telefrag", _("^BG%s%s^K1 was telefragged by ^BG%s^K1%s\n"), _("^BG%s^K1 tried to occupy ^BG%s^K1's teleport destination space\n")) \ MSG_INFO_NOTIF(1, INFO_DEATH_MURDER_FALL, 2, 1, "spree_inf s1 s2 spree_end", "s2 s1", "notify_fall", _("^BG%s%s^K1 was grounded by ^BG%s^K1%s\n"), "") \ MSG_INFO_NOTIF(1, INFO_DEATH_MURDER_DROWN, 2, 1, "spree_inf s1 s2 spree_end", "s2 s1", "notify_water", _("^BG%s%s^K1 was drowned by ^BG%s^K1%s\n"), "") \ MSG_INFO_NOTIF(1, INFO_DEATH_MURDER_LAVA, 2, 1, "spree_inf s1 s2 spree_end", "s2 s1", "notify_lava", _("^BG%s%s^K1 was cooked by ^BG%s^K1%s\n"), "") \ MSG_INFO_NOTIF(1, INFO_DEATH_MURDER_SLIME, 2, 1, "spree_inf s1 s2 spree_end", "s2 s1", "notify_slime", _("^BG%s%s^K1 was slimed by ^BG%s^K1%s\n"), "") \ MSG_INFO_NOTIF(1, INFO_DEATH_MURDER_SHOOTING_STAR, 2, 1, "spree_inf s1 s2 spree_end", "s2 s1", "notify_shootingstar", _("^BG%s%s^K1 was shot into space by ^BG%s^K1%s\n"), "") \ MSG_INFO_NOTIF(1, INFO_DEATH_MURDER_SWAMP, 2, 1, "spree_inf s1 s2 spree_end", "s2 s1", "notify_slime", _("^BG%s%s^K1 was preserved by ^BG%s^K1%s\n"), "") \ MSG_INFO_NOTIF(1, INFO_DEATH_MURDER_VOID, 2, 1, "spree_inf s1 s2 spree_end", "s2 s1", "notify_void", _("^BG%s%s^K1 was thrown into a world of hurt by ^BG%s^K1%s\n"), "") \ MSG_INFO_NOTIF(1, INFO_DEATH_MURDER_TOUCHEXPLODE, 2, 1, "spree_inf s1 s2 spree_end", "s2 s1", "notify_death", _("^BG%s%s^K1 died in an accident with ^BG%s^K1%s\n"), "") \ MSG_INFO_NOTIF(1, INFO_DEATH_MURDER_CHEAT, 2, 1, "spree_inf s1 s2 spree_end", "s2 s1", "notify_death", _("^BG%s%s^K1 was unfairly eliminated by ^BG%s^K1%s\n"), "") \ MSG_INFO_NOTIF(1, INFO_DEATH_MURDER_FIRE, 2, 1, "spree_inf s1 s2 spree_end", "s2 s1", "notify_death", _("^BG%s%s^K1 was burnt up into a crisp by ^BG%s^K1%s\n"), _("^BG%s^K1 felt a little hot from ^BG%s^K1's fire^K1%s\n")) \ MSG_INFO_NOTIF(1, INFO_DEATH_MURDER_VH_CRUSH, 2, 1, "spree_inf s1 s2 spree_end", "s2 s1", "notify_death", _("^BG%s%s^K1 was crushed by ^BG%s^K1%s\n"), "") \ MSG_INFO_NOTIF(1, INFO_DEATH_MURDER_VH_SPID_MINIGUN, 2, 1, "spree_inf s1 s2 spree_end", "s2 s1", "notify_death", _("^BG%s%s^K1 got shredded by ^BG%s^K1%s\n"), "") \ MSG_INFO_NOTIF(1, INFO_DEATH_MURDER_VH_SPID_ROCKET, 2, 1, "spree_inf s1 s2 spree_end", "s2 s1", "notify_death", _("^BG%s%s^K1 was blasted to bits by ^BG%s^K1%s\n"), "") \ MSG_INFO_NOTIF(1, INFO_DEATH_MURDER_VH_SPID_DEATH, 2, 1, "spree_inf s1 s2 spree_end", "s2 s1", "notify_death", _("^BG%s%s^K1 got caught in the blast when ^BG%s^K1%s\n"), "") \ MSG_INFO_NOTIF(1, INFO_DEATH_MURDER_VH_WAKI_GUN, 2, 1, "spree_inf s1 s2 spree_end", "s2 s1", "notify_death", _("^BG%s%s^K1 was bolted down by ^BG%s^K1%s\n"), "") \ MSG_INFO_NOTIF(1, INFO_DEATH_MURDER_VH_WAKI_ROCKET, 2, 1, "spree_inf s1 s2 spree_end", "s2 s1", "notify_death", _("^BG%s%s^K1 couldn't find shelter from ^BG%s^K1%s\n"), "") \ MSG_INFO_NOTIF(1, INFO_DEATH_MURDER_VH_WAKI_DEATH, 2, 1, "spree_inf s1 s2 spree_end", "s2 s1", "notify_death", _("^BG%s%s^K1 got caught in the blast when ^BG%s^K1%s\n"), "") \ MSG_INFO_NOTIF(1, INFO_DEATH_MURDER_VH_RAPT_CANNON, 2, 1, "spree_inf s1 s2 spree_end", "s2 s1", "notify_death", _("^BG%s%s^K1 couldn't resist ^BG%s^K1 purple blobs%s\n"), "") \ MSG_INFO_NOTIF(1, INFO_DEATH_MURDER_VH_RAPT_BOMB, 2, 1, "spree_inf s1 s2 spree_end", "s2 s1", "notify_death", _("^BG%s%s^K1 was cluster bombed by ^BG%s^K1%s\n"), "") \ MSG_INFO_NOTIF(1, INFO_DEATH_MURDER_VH_RAPT_FRAGMENT, 2, 1, "spree_inf s1 s2 spree_end", "s2 s1", "notify_death", _("^BG%s%s^K1 was cluster bombed by ^BG%s^K1%s\n"), "") \ MSG_INFO_NOTIF(1, INFO_DEATH_MURDER_VH_RAPT_DEATH, 2, 1, "spree_inf s1 s2 spree_end", "s2 s1", "notify_death", _("^BG%s%s^K1 got caught in the blast when ^BG%s^K1%s\n"), "") \ MSG_INFO_NOTIF(1, INFO_DEATH_MURDER_VH_BUMB_GUN, 2, 1, "spree_inf s1 s2 spree_end", "s2 s1", "notify_death", _("^BG%s%s^K1 foobar by ^BG%s^K1%s\n"), "") \ MSG_INFO_NOTIF(1, INFO_DEATH_MURDER_VH_BUMB_RAY, 2, 1, "spree_inf s1 s2 spree_end", "s2 s1", "notify_death", _("^BG%s%s^K1 foobar by ^BG%s^K1%s\n"), "") \ MSG_INFO_NOTIF(1, INFO_DEATH_MURDER_VH_BUMB_RAY_HEAL, 2, 1, "spree_inf s1 s2 spree_end", "s2 s1", "notify_death", _("^BG%s%s^K1 foobar by ^BG%s^K1%s\n"), "") \ MSG_INFO_NOTIF(1, INFO_DEATH_MURDER_VH_BUMB_DEATH, 2, 1, "spree_inf s1 s2 spree_end", "s2 s1", "notify_death", _("^BG%s%s^K1 foobar by ^BG%s^K1%s\n"), "") \ MULTITEAM_INFO(1, INFO_FREEZETAG_ROUND_WIN_, 4, 0, 0, "", "", "", _("^TC^TT^BG team wins the round, all other teams were frozen\n"), "") \ MSG_INFO_NOTIF(1, INFO_FREEZETAG_REVIVE, 2, 0, "s1 s2", "", "", _("^BG%s^K3 was revived by ^BG%s\n"), "") \ MSG_INFO_NOTIF(1, INFO_FREEZETAG_FREEZE, 2, 0, "s1 s2", "", "", _("^BG%s^K1 was frozen by ^BG%s\n"), "") \ MSG_INFO_NOTIF(1, INFO_FREEZETAG_SELF, 1, 0, "s1", "", "", _("^BG%s^K1 froze themself\n"), "") \ MSG_INFO_NOTIF(1, INFO_GODMODE_OFF, 0, 1, "f1", "", "", _("^BGGodmode saved you %s units of damage, cheater!\n"), "") \ MSG_INFO_NOTIF(1, INFO_JOIN_CONNECT, 1, 0, "s1", "", "", _("^BG%s^F3 connected%s\n"), "") \ MULTITEAM_INFO(1, INFO_JOIN_CONNECT_TEAM_, 4, 1, 0, "s1", "", "", _("^BG%s^F3 connected and joined the ^TC^TT\n"), "") \ MSG_INFO_NOTIF(1, INFO_JOIN_PLAY, 1, 0, "s1", "", "", _("^BG%s^F3 is now playing\n"), "") \ MSG_INFO_NOTIF(1, INFO_KEEPAWAY_DROPPED, 1, 0, "s1", "s1", "notify_balldropped", _("^BG%s^BG has dropped the ball!\n"), "") \ MSG_INFO_NOTIF(1, INFO_KEEPAWAY_PICKUP, 1, 0, "s1", "s1", "notify_ballpickedup", _("^BG%s^BG has picked up the ball!\n"), "") \ MSG_INFO_NOTIF(1, INFO_LMS_NOLIVES, 1, 0, "s1", "s1", "", _("^BG%s^F3 has no more lives left\n"), "") \ MSG_INFO_NOTIF(1, INFO_LMS_FORFEIT, 1, 0, "s1", "s1", "", _("^BG%s^F3 forfeited\n"), "") \ MSG_INFO_NOTIF(1, INFO_POWERDOWN_INVISIBILITY, 0, 0, "", "", "", _("^F2Invisibility has worn off\n"), "") \ MSG_INFO_NOTIF(1, INFO_POWERDOWN_SHIELD, 0, 0, "", "", "", _("^F2Shield has worn off\n"), "") \ MSG_INFO_NOTIF(1, INFO_POWERDOWN_SPEED, 0, 0, "", "", "", _("^F2Speed has worn off\n"), "") \ MSG_INFO_NOTIF(1, INFO_POWERDOWN_STRENGTH, 0, 0, "", "", "", _("^F2Strength has worn off\n"), "") \ MSG_INFO_NOTIF(1, INFO_POWERUP_INVISIBILITY, 0, 0, "", "", "", _("^F2You are invisible\n"), "") \ MSG_INFO_NOTIF(1, INFO_POWERUP_SHIELD, 0, 0, "", "", "", _("^F2Shield surrounds you\n"), "") \ MSG_INFO_NOTIF(1, INFO_POWERUP_SPEED, 0, 0, "", "", "", _("^F2You are on speed\n"), "") \ MSG_INFO_NOTIF(1, INFO_POWERUP_STRENGTH, 0, 0, "", "", "", _("^F2Strength infuses your weapons with devastating power\n"), "") \ MSG_INFO_NOTIF(1, INFO_QUIT_DISCONNECT, 1, 0, "s1", "s1", "", _("^BG%s^F3 disconnected\n"), "") \ MSG_INFO_NOTIF(1, INFO_QUIT_KICK_IDLING, 1, 0, "s1", "s1", "", _("^BG%s^F3 was kicked for idling\n"), "") \ MSG_INFO_NOTIF(1, INFO_QUIT_KICK_SPECTATING, 0, 0, "", "", "", _("^F2You were kicked from the server because you are a spectator and spectators aren't allowed at the moment.\n"), "") \ MSG_INFO_NOTIF(1, INFO_QUIT_SPECTATE, 1, 0, "s1", "s1", "", _("^BG%s^F3 is now spectating\n"), "") \ MSG_INFO_NOTIF(1, INFO_RACE_FAIL, 2, 0, "s1 s2", "s1", "race_newfail", "TODO\n", "") \ MSG_INFO_NOTIF(1, INFO_RACE_NEW_RECORD, 2, 0, "s1 s2", "s1", "race_newrecordserver", "TODO\n", "") \ MSG_INFO_NOTIF(1, INFO_RACE_NEW_TIME, 2, 0, "s1 s2", "s1", "race_newtime", "TODO\n", "") \ MSG_INFO_NOTIF(1, INFO_RACE_NEW_RANK, 2, 0, "s1 s2", "s1", "race_newrankyellow", "TODO\n", "") \ MULTITEAM_INFO(1, INFO_SCORES_, 4, 0, 0, "", "", "", _("^TC^TT ^BGteam scores!\n"), "") \ MSG_INFO_NOTIF(1, INFO_SPECTATE_WARNING, 0, 1, "f1", "", "", _("^F2You have to become a player within the next %s seconds, otherwise you will be kicked, because spectating isn't allowed at this time!\n"), "") \ MSG_INFO_NOTIF(1, INFO_SUPERWEAPON_BROKEN, 0, 0, "", "", "", _("^F2Superweapons have broken down\n"), "") \ MSG_INFO_NOTIF(1, INFO_SUPERWEAPON_PICKUP, 0, 0, "", "", "", _("^F2You now have a superweapon\n"), "") \ MSG_INFO_NOTIF(1, INFO_SUPERWEAPON_LOST, 0, 0, "", "", "", _("^F2Superweapons have been lost\n"), "") \ MSG_INFO_NOTIF(1, INFO_VERSION_BETA, 2, 0, "s1 s2", "", "", _("\{1}^F4NOTE: ^BGThe server is running ^F1Xonotic %s (beta)^BG, you have ^F2Xonotic %s\n"), "") \ MSG_INFO_NOTIF(1, INFO_VERSION_OLD, 2, 0, "s1 s2", "", "", _("\{1}^F4NOTE: ^BGThe server is running ^F1Xonotic %s^BG, you have ^F2Xonotic %s\n"), "") \ MSG_INFO_NOTIF(1, INFO_VERSION_OUTDATED, 2, 0, "s1 s2", "", "", _("\{1}^F4NOTE: ^F1Xonotic %s^BG is out, and you still have ^F2Xonotic %s^BG - get the update from ^F3http://www.xonotic.org/^BG!\n"), "") \ MSG_INFO_NOTIF(1, INFO_WATERMARK, 1, 0, "s1", "", "", _("^F3SVQC Build information: ^F4%s\n"), "") \ MSG_INFO_NOTIF(1, INFO_WEAPON_THINKING_WITH_PORTALS, 1, 1, "s1 spree_end", "s1", "notify_selfkill", _("^BG%s^K1 is now thinking with portals%s\n"), "") \ MSG_INFO_NOTIF(1, INFO_WEAPON_CRYLINK_SUICIDE, 1, 1, "s1 spree_end", "s1", "weaponcrylink", _("^BG%s^K1 felt the strong pull of their Crylink%s\n"), "") \ MSG_INFO_NOTIF(1, INFO_WEAPON_CRYLINK_MURDER, 2, 1, "spree_inf s1 s2 spree_end", "s2 s1", "weaponcrylink", _("^BG%s%s^K1 felt the strong pull of ^BG%s^K1's Crylink%s\n"), "") \ MSG_INFO_NOTIF(1, INFO_WEAPON_ELECTRO_SUICIDE_ORBS, 1, 1, "s1 spree_end", "s1", "weaponelectro", _("^BG%s^K1 could not remember where they put their Electro plasma%s\n"), "") \ MSG_INFO_NOTIF(1, INFO_WEAPON_ELECTRO_SUICIDE_BOLT, 1, 1, "s1 spree_end", "s1", "weaponelectro", _("^BG%s^K1 played with Electro plasma%s\n"), "") \ MSG_INFO_NOTIF(1, INFO_WEAPON_ELECTRO_MURDER_BOLT, 2, 1, "spree_inf s1 s2 spree_end", "s2 s1", "weaponelectro", _("^BG%s%s^K1 was blasted by ^BG%s^K1's Electro bolt%s\n"), "") \ MSG_INFO_NOTIF(1, INFO_WEAPON_ELECTRO_MURDER_ORBS, 2, 1, "spree_inf s1 s2 spree_end", "s2 s1", "weaponelectro", _("^BG%s%s^K1 got too close to ^BG%s^K1's Electro plasma%s\n"), "") \ MSG_INFO_NOTIF(1, INFO_WEAPON_ELECTRO_MURDER_COMBO, 2, 1, "spree_inf s1 s2 spree_end", "s2 s1", "weaponelectro", _("^BG%s%s^K1 felt the electrifying air of ^BG%s^K1's Electro combo%s\n"), "") \ MSG_INFO_NOTIF(1, INFO_WEAPON_FIREBALL_SUICIDE_FIREMINE, 1, 1, "s1 spree_end", "s1", "weaponfireball", _("^BG%s^K1 forgot about their firemine%s\n"), "") \ MSG_INFO_NOTIF(1, INFO_WEAPON_FIREBALL_SUICIDE_BLAST, 1, 1, "s1 spree_end", "s1", "weaponfireball", _("^BG%s^K1 should have used a smaller gun%s\n"), "") \ MSG_INFO_NOTIF(1, INFO_WEAPON_FIREBALL_MURDER_FIREMINE, 2, 1, "spree_inf s1 s2 spree_end", "s2 s1", "weaponfireball", _("^BG%s%s^K1 got burnt by ^BG%s^K1's firemine%s\n"), "") \ MSG_INFO_NOTIF(1, INFO_WEAPON_FIREBALL_MURDER_BLAST, 2, 1, "spree_inf s1 s2 spree_end", "s2 s1", "weaponfireball", _("^BG%s%s^K1 got too close to ^BG%s^K1's fireball%s\n"), "") \ MSG_INFO_NOTIF(1, INFO_WEAPON_MORTAR_SUICIDE_EXPLODE, 1, 1, "s1 spree_end", "s1", "weapongrenadelauncher", _("^BG%s^K1 blew themself up with their own Mortar%s\n"), "") \ MSG_INFO_NOTIF(1, INFO_WEAPON_MORTAR_SUICIDE_BOUNCE, 1, 1, "s1 spree_end", "s1", "weapongrenadelauncher", _("^BG%s^K1 didn't see their own Mortar grenade%s\n"), "") \ MSG_INFO_NOTIF(1, INFO_WEAPON_MORTAR_MURDER_EXPLODE, 2, 1, "spree_inf s1 s2 spree_end", "s2 s1", "weapongrenadelauncher", _("^BG%s%s^K1 ate ^BG%s^K1's Mortar grenade%s\n"), "") \ MSG_INFO_NOTIF(1, INFO_WEAPON_MORTAR_MURDER_BOUNCE, 2, 1, "spree_inf s1 s2 spree_end", "s2 s1", "weapongrenadelauncher", _("^BG%s%s^K1 got too close to ^BG%s^K1's Mortar grenade%s\n"), "") \ MSG_INFO_NOTIF(1, INFO_WEAPON_HAGAR_SUICIDE, 1, 1, "s1 spree_end", "s1", "weaponhagar", _("^BG%s^K1 played with tiny Hagar rockets%s\n"), "") \ MSG_INFO_NOTIF(1, INFO_WEAPON_HAGAR_MURDER_BURST, 2, 1, "spree_inf s1 s2 spree_end", "s2 s1", "weaponhagar", _("^BG%s%s^K1 was pummeled by a burst of ^BG%s^K1's Hagar rockets%s\n"), "") \ MSG_INFO_NOTIF(1, INFO_WEAPON_HAGAR_MURDER_SPRAY, 2, 1, "spree_inf s1 s2 spree_end", "s2 s1", "weaponhagar", _("^BG%s%s^K1 was pummeled by ^BG%s^K1's Hagar rockets%s\n"), "") \ MSG_INFO_NOTIF(1, INFO_WEAPON_HLAC_SUICIDE, 1, 1, "s1 spree_end", "s1", "weaponhlac", _("^BG%s^K1 got a little jumpy with their HLAC%s\n"), "") \ MSG_INFO_NOTIF(1, INFO_WEAPON_HLAC_MURDER, 2, 1, "spree_inf s1 s2 spree_end", "s2 s1", "weaponhlac", _("^BG%s%s^K1 was cut down with ^BG%s^K1's HLAC%s\n"), "") \ MSG_INFO_NOTIF(1, INFO_WEAPON_HOOK_MURDER, 2, 1, "spree_inf s1 s2 spree_end", "s2 s1", "weaponhook", _("^BG%s%s^K1 was caught in ^BG%s^K1's Hook gravity bomb%s\n"), "") \ MSG_INFO_NOTIF(1, INFO_WEAPON_LASER_SUICIDE, 1, 1, "s1 spree_end", "s1", "weaponlaser", _("^BG%s^K1 shot themself to hell with their Laser%s\n"), "") \ MSG_INFO_NOTIF(1, INFO_WEAPON_LASER_MURDER, 2, 1, "spree_inf s1 s2 spree_end", "s2 s1", "weaponlaser", _("^BG%s%s^K1 was shot to death by ^BG%s^K1's Laser%s\n"), "") \ MSG_INFO_NOTIF(1, INFO_WEAPON_MINELAYER_SUICIDE, 1, 1, "s1 spree_end", "s1", "weaponminelayer", _("^BG%s^K1 forgot about their mine%s\n"), "") \ MSG_INFO_NOTIF(1, INFO_WEAPON_MINELAYER_MURDER, 2, 1, "spree_inf s1 s2 spree_end", "s2 s1", "weaponminelayer", _("^BG%s%s^K1 got too close to ^BG%s^K1's mine%s\n"), "") \ MSG_INFO_NOTIF(1, INFO_WEAPON_MINSTANEX_MURDER, 2, 1, "spree_inf s1 s2 spree_end", "s2 s1", "weaponminstanex", _("^BG%s%s^K1 has been vaporized by ^BG%s^K1's Minstanex%s\n"), "") \ MSG_INFO_NOTIF(1, INFO_WEAPON_NEX_MURDER, 2, 1, "spree_inf s1 s2 spree_end", "s2 s1", "weaponnex", _("^BG%s%s^K1 has been vaporized by ^BG%s^K1's Nex%s\n"), "") \ MSG_INFO_NOTIF(1, INFO_WEAPON_RIFLE_MURDER_HAIL_PIERCING, 2, 1, "spree_inf s1 s2 spree_end", "s2 s1", "weaponrifle", _("^BG%s%s^K1 failed to hide from ^BG%s^K1's Rifle bullet hail%s\n"), "") \ MSG_INFO_NOTIF(1, INFO_WEAPON_RIFLE_MURDER_HAIL, 2, 1, "spree_inf s1 s2 spree_end", "s2 s1", "weaponrifle", _("^BG%s%s^K1 died in ^BG%s^K1's Rifle bullet hail%s\n"), "") \ MSG_INFO_NOTIF(1, INFO_WEAPON_RIFLE_MURDER_PIERCING, 2, 1, "spree_inf s1 s2 spree_end", "s2 s1", "weaponrifle", _("^BG%s%s^K1 failed to hide from ^BG%s^K1's Rifle%s\n"), "") \ MSG_INFO_NOTIF(1, INFO_WEAPON_RIFLE_MURDER, 2, 1, "spree_inf s1 s2 spree_end", "s2 s1", "weaponrifle", _("^BG%s%s^K1 was sniped with a Rifle by ^BG%s^K1%s\n"), "") \ MSG_INFO_NOTIF(1, INFO_WEAPON_RIFLE_MURDER_HEADSHOT, 2, 1, "spree_inf s1 s2 spree_end", "s2 s1", "notify_headshot", _("^BG%s%s^K1 was shot in the head with a Rifle by ^BG%s^K1%s\n"), "") \ MSG_INFO_NOTIF(1, INFO_WEAPON_ROCKETLAUNCHER_SUICIDE, 1, 1, "s1 spree_end", "s1", "weaponrocketlauncher", _("^BG%s^K1 blew themself up with their Rocketlauncher%s\n"), "") \ MSG_INFO_NOTIF(1, INFO_WEAPON_ROCKETLAUNCHER_MURDER_DIRECT, 2, 1, "spree_inf s1 s2 spree_end", "s2 s1", "weaponrocketlauncher", _("^BG%s%s^K1 ate ^BG%s^K1's rocket%s\n"), "") \ MSG_INFO_NOTIF(1, INFO_WEAPON_ROCKETLAUNCHER_MURDER_SPLASH, 2, 1, "spree_inf s1 s2 spree_end", "s2 s1", "weaponrocketlauncher", _("^BG%s%s^K1 got too close ^BG%s^K1's rocket%s\n"), "") \ MSG_INFO_NOTIF(1, INFO_WEAPON_SEEKER_SUICIDE, 1, 1, "s1 spree_end", "s1", "weaponseeker", _("^BG%s^K1 played with tiny Seeker rockets%s\n"), "") \ MSG_INFO_NOTIF(1, INFO_WEAPON_SEEKER_MURDER_TAG, 2, 1, "spree_inf s1 s2 spree_end", "s2 s1", "weaponseeker", _("^BG%s%s^K1 was tagged by ^BG%s^K1's Seeker%s\n"), "") \ MSG_INFO_NOTIF(1, INFO_WEAPON_SEEKER_MURDER_SPRAY, 2, 1, "spree_inf s1 s2 spree_end", "s2 s1", "weaponseeker", _("^BG%s%s^K1 was pummeled by ^BG%s^K1's Seeker rockets%s\n"), "") \ MSG_INFO_NOTIF(1, INFO_WEAPON_SHOTGUN_MURDER_SLAP, 2, 1, "spree_inf s2 s1 spree_end", "s2 s1", "notify_melee_shotgun", _("^BG%s%s^K1 slapped ^BG%s^K1 around a bit with a large Shotgun%s\n"), "") \ MSG_INFO_NOTIF(1, INFO_WEAPON_SHOTGUN_MURDER, 2, 1, "spree_inf s1 s2 spree_end", "s2 s1", "weaponshotgun", _("^BG%s%s^K1 was gunned down by ^BG%s^K1's Shotgun%s\n"), "") \ MSG_INFO_NOTIF(1, INFO_WEAPON_TUBA_SUICIDE, 1, 1, "s1 spree_end", "s1", "weapontuba", _("^BG%s^K1 hurt their own ears with the @!#%%'n Tuba%s\n"), "") \ MSG_INFO_NOTIF(1, INFO_WEAPON_TUBA_MURDER, 2, 1, "spree_inf s1 s2 spree_end", "s2 s1", "weapontuba", _("^BG%s%s^K1 died of ^BG%s^K1's great playing on the @!#%%'n Tuba%s\n"), "") \ MSG_INFO_NOTIF(1, INFO_WEAPON_ACCORDEON_SUICIDE, 1, 1, "s1 spree_end", "s1", "weapontuba", _("^BG%s^K1 hurt their own ears with the @!#%%'n Accordeon%s\n"), "") \ MSG_INFO_NOTIF(1, INFO_WEAPON_ACCORDEON_MURDER, 2, 1, "spree_inf s1 s2 spree_end", "s2 s1", "weapontuba", _("^BG%s%s^K1 died of ^BG%s^K1's great playing on the @!#%%'n Accordeon%s\n"), "") \ MSG_INFO_NOTIF(1, INFO_WEAPON_KLEINBOTTLE_SUICIDE, 1, 1, "s1 spree_end", "s1", "weapontuba", _("^BG%s^K1 hurt their own ears with the @!#%%'n Klein Bottle%s\n"), "") \ MSG_INFO_NOTIF(1, INFO_WEAPON_KLEINBOTTLE_MURDER, 2, 1, "spree_inf s1 s2 spree_end", "s2 s1", "weapontuba", _("^BG%s%s^K1 died of ^BG%s^K1's great playing on the @!#%%'n Klein Bottle%s\n"), "") \ MSG_INFO_NOTIF(1, INFO_WEAPON_UZI_MURDER_SNIPE, 2, 1, "spree_inf s1 s2 spree_end", "s2 s1", "weaponuzi", _("^BG%s%s^K1 was sniped by ^BG%s^K1's Machine Gun%s\n"), "") \ MSG_INFO_NOTIF(1, INFO_WEAPON_UZI_MURDER_SPRAY, 2, 1, "spree_inf s1 s2 spree_end", "s2 s1", "weaponuzi", _("^BG%s%s^K1 was riddled full of holes by ^BG%s^K1's Machine Gun%s\n"), "") #define MULTITEAM_CENTER(default,prefix,teams,strnum,flnum,args,cpid,durcnt,normal,gentle) \ MSG_CENTER_NOTIF(default, prefix##RED, strnum, flnum, args, cpid, durcnt, TCR(normal, COL_TEAM_1, strtoupper(STR_TEAM_1)), TCR(gentle, COL_TEAM_1, strtoupper(STR_TEAM_1))) \ MSG_CENTER_NOTIF(default, prefix##BLUE, strnum, flnum, args, cpid, durcnt, TCR(normal, COL_TEAM_2, strtoupper(STR_TEAM_2)), TCR(gentle, COL_TEAM_2, strtoupper(STR_TEAM_2))) \ #if teams >= 3 \ MSG_CENTER_NOTIF(default, prefix##YELLOW, strnum, flnum, args, cpid, durcnt, TCR(normal, COL_TEAM_3, strtoupper(STR_TEAM_3)), TCR(gentle, COL_TEAM_3, strtoupper(STR_TEAM_3))) \ #endif \ #if teams >= 4 \ MSG_CENTER_NOTIF(default, prefix##PINK, strnum, flnum, args, cpid, durcnt, TCR(normal, COL_TEAM_4, strtoupper(STR_TEAM_4)), TCR(gentle, COL_TEAM_4, strtoupper(STR_TEAM_4))) \ #endif #define MSG_CENTER_NOTIFICATIONS \ /*MSG_CENTER_NOTIF(1, CENTER_EMPTY, 0, 0, "", NO_CPID, XPD(0, 0), "null", "")*/ \ MSG_CENTER_NOTIF(1, CENTER_ASSAULT_ATTACKING, 0, 0, "", CPID_ASSAULT_ROLE, XPD(0, 0), _("^BGYou are attacking!"), "") \ MSG_CENTER_NOTIF(1, CENTER_ASSAULT_DEFENDING, 0, 0, "", CPID_ASSAULT_ROLE, XPD(0, 0), _("^BGYou are defending!"), "") \ MSG_CENTER_NOTIF(1, CENTER_CTF_CAPTURESHIELD_SHIELDED, 0, 0, "", CPID_CTF_CAPSHIELD, XPD(0, 0), _("^BGYou are now ^F1shielded^BG from the flag\n^BGfor ^F2too many unsuccessful attempts^BG to capture.\n^BGMake some defensive scores before trying again."), "") \ MSG_CENTER_NOTIF(1, CENTER_CTF_CAPTURESHIELD_FREE, 0, 0, "", CPID_CTF_CAPSHIELD, XPD(0, 0), _("^BGYou are now free.\n^BGFeel free to ^F2try to capture^BG the flag again\n^BGif you think you will succeed."), "") \ MULTITEAM_CENTER(1, CENTER_CTF_PASS_OTHER_, 2, 2, 0, "s1 s2", CPID_CTF_PASS, XPD(0, 0), _("^BG%s^BG passed the ^TC^TT^BG flag to %s"), "") \ MULTITEAM_CENTER(1, CENTER_CTF_PASS_SENT_, 2, 1, 0, "s1", CPID_CTF_PASS, XPD(0, 0), _("^BGYou passed the ^TC^TT^BG flag to %s"), "") \ MULTITEAM_CENTER(1, CENTER_CTF_PASS_RECEIVED_, 2, 1, 0, "s1", CPID_CTF_PASS, XPD(0, 0), _("^BGYou received the ^TC^TT^BG flag from %s"), "") \ MSG_CENTER_NOTIF(1, CENTER_CTF_PASS_REQUESTING, 1, 0, "s1", CPID_CTF_PASS, XPD(0, 0), _("^BGRequesting %s^BG to pass you the flag"), "") \ MSG_CENTER_NOTIF(1, CENTER_CTF_PASS_REQUESTED, 1, 0, "s1 pass_key", CPID_CTF_PASS, XPD(0, 0), _("^BG%s^BG requests you to pass the flag%s"), "") \ MULTITEAM_CENTER(1, CENTER_CTF_RETURN_, 2, 0, 0, "", CPID_CTF_LOWPRIO, XPD(0, 0), _("^BGYou returned the ^TC^TT^BG flag!"), "") \ MULTITEAM_CENTER(1, CENTER_CTF_CAPTURE_, 2, 0, 0, "", CPID_CTF_LOWPRIO, XPD(0, 0), _("^BGYou captured the ^TC^TT^BG flag!"), "") \ MULTITEAM_CENTER(1, CENTER_CTF_PICKUP_, 2, 0, 0, "", CPID_CTF_LOWPRIO, XPD(0, 0), _("^BGYou got the ^TC^TT^BG flag!"), "") \ MSG_CENTER_NOTIF(1, CENTER_CTF_PICKUP_TEAM, 1, 0, "s1", CPID_CTF_LOWPRIO, XPD(0, 0), _("^BGYour %steam mate^BG got the flag! Protect them!"), "") \ MSG_CENTER_NOTIF(1, CENTER_CTF_PICKUP_TEAM_VERBOSE, 2, 0, "s1 s2 s1", CPID_CTF_LOWPRIO, XPD(0, 0), _("^BGYour %steam mate (^BG%s%s)^BG got the flag! Protect them!"), "") \ MSG_CENTER_NOTIF(1, CENTER_CTF_PICKUP_ENEMY, 1, 0, "s1", CPID_CTF_LOWPRIO, XPD(0, 0), _("^BGThe %senemy^BG got your flag! Retrieve it!"), "") \ MSG_CENTER_NOTIF(1, CENTER_CTF_PICKUP_ENEMY_VERBOSE, 2, 0, "s1 s2 s1", CPID_CTF_LOWPRIO, XPD(0, 0), _("^BGThe %senemy (^BG%s%s)^BG got your flag! Retrieve it!"), "") \ MSG_CENTER_NOTIF(1, CENTER_CTF_STALEMATE_CARRIER, 0, 0, "", CPID_STALEMATE, XPD(0, 0), _("^BGStalemate! Enemies can now see you on radar!"), "") \ MSG_CENTER_NOTIF(1, CENTER_CTF_STALEMATE_OTHER, 0, 0, "", CPID_STALEMATE, XPD(0, 0), _("^BGStalemate! Flag carriers can now be seen by enemies on radar!"), "") \ MSG_CENTER_NOTIF(1, CENTER_CTF_FLAG_THROW_PUNISH, 0, 1, "f1", CPID_CTF_LOWPRIO, XPD(0, 0), _("^BGToo many flag throws! Throwing disabled for %s seconds."), "") \ MSG_CENTER_NOTIF(1, CENTER_DEATH_SELF_CUSTOM, 2, 0, "s2", NO_CPID, XPD(0, 0), _("^K1You were %s"), "") \ MSG_CENTER_NOTIF(1, CENTER_DEATH_SELF_GENERIC, 0, 0, "", NO_CPID, XPD(0, 0), _("^K1You killed your own dumb self!"), _("^K1You need to be more careful!")) \ MSG_CENTER_NOTIF(1, CENTER_DEATH_SELF_VOID, 0, 0, "", NO_CPID, XPD(0, 0), _("^K1Watch your step!"), "") \ MSG_CENTER_NOTIF(1, CENTER_DEATH_SELF_SUICIDE, 0, 0, "", NO_CPID, XPD(0, 0), _("^K1You committed suicide!"), _("^K1You ended it all!")) \ MSG_CENTER_NOTIF(1, CENTER_DEATH_SELF_NOAMMO, 0, 0, "", NO_CPID, XPD(0, 0), _("^K1You were killed for running out of ammo..."), _("^K1You are respawning for running out of ammo...")) \ MSG_CENTER_NOTIF(1, CENTER_DEATH_SELF_ROT, 0, 0, "", NO_CPID, XPD(0, 0), _("^K1You grew too old without taking your medicine"), _("^K1You need to preserve your health")) \ MSG_CENTER_NOTIF(1, CENTER_DEATH_SELF_CAMP, 0, 0, "", NO_CPID, XPD(0, 0), _("^K1Die camper!"), _("^K1Reconsider your tactics, camper!")) \ MSG_CENTER_NOTIF(1, CENTER_DEATH_SELF_BETRAYAL, 0, 0, "", NO_CPID, XPD(0, 0), _("^K1Don't shoot your team mates!"), _("^K1Don't go against your team mates!")) \ MSG_CENTER_NOTIF(1, CENTER_DEATH_SELF_TEAMCHANGE, 0, 1, "death_team", NO_CPID, XPD(0, 0), _("^BGYou are now on: %s"), "") \ MSG_CENTER_NOTIF(1, CENTER_DEATH_SELF_AUTOTEAMCHANGE, 0, 1, "death_team", NO_CPID, XPD(0, 0), _("^BGYou have been moved into a different team\nYou are now on: %s"), "") \ MSG_CENTER_NOTIF(1, CENTER_DEATH_SELF_FALL, 0, 0, "", NO_CPID, XPD(0, 0), _("^K1You hit the ground with a crunch!"), "") \ MSG_CENTER_NOTIF(1, CENTER_DEATH_SELF_DROWN, 0, 0, "", NO_CPID, XPD(0, 0), _("^K1You couldn't catch your breath in time!"), "") \ MSG_CENTER_NOTIF(1, CENTER_DEATH_SELF_FIRE, 0, 0, "", NO_CPID, XPD(0, 0), _("^K1You got a little bit too crispy!"), _("^K1You felt a little too hot!")) \ MSG_CENTER_NOTIF(1, CENTER_DEATH_SELF_LAVA, 0, 0, "", NO_CPID, XPD(0, 0), _("^K1You couldn't stand the heat!"), "") \ MSG_CENTER_NOTIF(1, CENTER_DEATH_SELF_SLIME, 0, 0, "", NO_CPID, XPD(0, 0), _("^K1You melted away in slime!"), "") \ MSG_CENTER_NOTIF(1, CENTER_DEATH_SELF_SHOOTING_STAR, 0, 0, "", NO_CPID, XPD(0, 0), _("^K1You became a shooting star!"), "") \ MSG_CENTER_NOTIF(1, CENTER_DEATH_SELF_SWAMP, 0, 0, "", NO_CPID, XPD(0, 0), _("^K1You got stuck in a swamp!"), "") \ MSG_CENTER_NOTIF(1, CENTER_DEATH_SELF_CHEAT, 0, 0, "", NO_CPID, XPD(0, 0), _("^K1You unfairly eliminated yourself!"), "") \ MSG_CENTER_NOTIF(1, CENTER_DEATH_SELF_TOUCHEXPLODE, 0, 0, "", NO_CPID, XPD(0, 0), _("^K1You died in an accident!"), "") \ MSG_CENTER_NOTIF(1, CENTER_DEATH_SELF_TURRET, 0, 0, "", NO_CPID, XPD(0, 0), _("^K1You were fragged by a turret!"), _("^K1You had an unfortunate run in with a turret!")) \ MSG_CENTER_NOTIF(1, CENTER_DEATH_SELF_TURRET_EWHEEL, 0, 0, "", NO_CPID, XPD(0, 0), _("^K1You were fragged by an eWheel turret!"), _("^K1You had an unfortunate run in with an eWheel turret!")) \ MSG_CENTER_NOTIF(1, CENTER_DEATH_SELF_TURRET_WALKER, 0, 0, "", NO_CPID, XPD(0, 0), _("^K1You were fragged by a Walker turret!"), _("^K1You had an unfortunate run in with a Walker turret!")) \ MSG_CENTER_NOTIF(1, CENTER_DEATH_MURDER_FRAG, 1, 1, "spree_cen s1", NO_CPID, XPD(0, 0), _("^K3%sYou fragged ^BG%s"), _("^K3%sYou scored against ^BG%s")) \ MSG_CENTER_NOTIF(1, CENTER_DEATH_MURDER_FRAGGED, 1, 0, "s1", NO_CPID, XPD(0, 0), _("^K1You were fragged by ^BG%s"), _("^K1You were scored against by ^BG%s")) \ MSG_CENTER_NOTIF(1, CENTER_DEATH_MURDER_TYPEFRAG, 1, 1, "spree_cen s1", NO_CPID, XPD(0, 0), _("^K1%sYou typefragged ^BG%s"), _("^K1%sYou scored against ^BG%s^K1 while they were typing")) \ MSG_CENTER_NOTIF(1, CENTER_DEATH_MURDER_TYPEFRAGGED, 1, 0, "s1", NO_CPID, XPD(0, 0), _("^K1You were typefragged by ^BG%s"), _("^K1You were scored against by ^BG%s^K1 while typing!")) \ MSG_CENTER_NOTIF(1, CENTER_DEATH_MURDER_FRAG_FIRST, 1, 0, "s1", NO_CPID, XPD(0, 0), _("^K3First blood! You fragged ^BG%s"), _("^K3First score! You scored against ^BG%s")) \ MSG_CENTER_NOTIF(1, CENTER_DEATH_MURDER_FRAGGED_FIRST, 1, 0, "s1", NO_CPID, XPD(0, 0), _("^K1First victim! You were fragged by ^BG%s"), _("^K1First casualty! You were scored against by ^BG%s")) \ MSG_CENTER_NOTIF(1, CENTER_DEATH_MURDER_TYPEFRAG_FIRST, 1, 0, "s1", NO_CPID, XPD(0, 0), _("^K1First blood! You typefragged ^BG%s"), _("^K1First score! You scored against ^BG%s^K1 while they were typing")) \ MSG_CENTER_NOTIF(1, CENTER_DEATH_MURDER_TYPEFRAGGED_FIRST, 1, 0, "s1", NO_CPID, XPD(0, 0), _("^K1First victim! You were typefragged by ^BG%s"), _("^K1First casualty! You were scored against by ^BG%s^K1 while typing!")) \ MSG_CENTER_NOTIF(1, CENTER_DEATH_MURDER_FRAG_VERBOSE, 1, 2, "spree_cen s1 frag_ping", NO_CPID, XPD(0, 0), _("^K3%sYou fragged ^BG%s^BG%s"), _("^K3%sYou scored against ^BG%s^BG%s")) \ MSG_CENTER_NOTIF(1, CENTER_DEATH_MURDER_FRAGGED_VERBOSE, 1, 3, "s1 frag_stats", NO_CPID, XPD(0, 0), _("^K1You were fragged by ^BG%s^BG%s"), _("^K1You were scored against by ^BG%s^BG%s")) \ MSG_CENTER_NOTIF(1, CENTER_DEATH_MURDER_TYPEFRAG_VERBOSE, 1, 2, "spree_cen s1 frag_ping", NO_CPID, XPD(0, 0), _("^K1%sYou typefragged ^BG%s^BG%s"), _("^K1%sYou scored against ^BG%s^K1 while they were typing^BG%s")) \ MSG_CENTER_NOTIF(1, CENTER_DEATH_MURDER_TYPEFRAGGED_VERBOSE, 1, 3, "s1 frag_stats", NO_CPID, XPD(0, 0), _("^K1You were typefragged by ^BG%s^BG%s"), _("^K1You were scored against by ^BG%s^K1 while typing^BG%s")) \ MSG_CENTER_NOTIF(1, CENTER_DEATH_MURDER_FRAG_FIRST_VERBOSE, 1, 1, "s1", NO_CPID, XPD(0, 0), _("^K3First blood! You fragged ^BG%s"), _("^K3First score! You scored against ^BG%s")) \ MSG_CENTER_NOTIF(1, CENTER_DEATH_MURDER_FRAGGED_FIRST_VERBOSE, 1, 3, "s1", NO_CPID, XPD(0, 0), _("^K1First victim! You were fragged by ^BG%s"), _("^K1First casualty! You were scored against by ^BG%s")) \ MSG_CENTER_NOTIF(1, CENTER_DEATH_MURDER_TYPEFRAG_FIRST_VERBOSE, 1, 1, "s1", NO_CPID, XPD(0, 0), _("^K1First blood! You typefragged ^BG%s"), _("^K1First score! You scored against ^BG%s^K1 while they were typing")) \ MSG_CENTER_NOTIF(1, CENTER_DEATH_MURDER_TYPEFRAGGED_FIRST_VERBOSE, 1, 3, "s1", NO_CPID, XPD(0, 0), _("^K1First victim! You were typefragged by ^BG%s"), _("^K1First casualty! You were scored against by ^BG%s^K1 while typing!")) \ MSG_CENTER_NOTIF(1, CENTER_DEATH_TEAMKILL_FRAG, 1, 0, "s1", NO_CPID, XPD(0, 0), _("^K1Moron! You fragged ^BG%s^K1, a team mate!"), _("^K1Moron! You went against ^BG%s^K1, a team mate!")) \ MSG_CENTER_NOTIF(1, CENTER_DEATH_TEAMKILL_FRAGGED, 1, 0, "s1", NO_CPID, XPD(0, 0), _("^K1You were fragged by ^BG%s^K1, a team mate"), _("^K1You were scored against by ^BG%s^K1, a team mate")) \ MSG_CENTER_NOTIF(1, CENTER_DISCONNECT_IDLING, 0, 1, "", CPID_IDLING, XPD(0, f1), _("^K1Stop idling!\n^BGDisconnecting in ^COUNT..."), "") \ MULTITEAM_CENTER(1, CENTER_FREEZETAG_ROUND_WIN_, 4, 0, 0, "", NO_CPID, XPD(0, 0), _("^TC^TT^BG team wins the round, all other teams were frozen"), "") \ MSG_CENTER_NOTIF(1, CENTER_FREEZETAG_SPAWN_LATE, 0, 0, "", NO_CPID, XPD(0, 0), _("^K1You spawned after the round started, you'll spawn as frozen"), "") \ MSG_CENTER_NOTIF(1, CENTER_FREEZETAG_REVIVE, 1, 0, "s1", NO_CPID, XPD(0, 0), _("^K3You revived ^BG%s"), "") \ MSG_CENTER_NOTIF(1, CENTER_FREEZETAG_REVIVED, 1, 0, "s1", NO_CPID, XPD(0, 0), _("^K3You were revived by ^BG%s"), "") \ MSG_CENTER_NOTIF(1, CENTER_FREEZETAG_SELF, 0, 0, "", NO_CPID, XPD(0, 0), _("^K1You froze yourself"), "") \ MSG_CENTER_NOTIF(1, CENTER_FREEZETAG_FREEZE, 1, 0, "s1", NO_CPID, XPD(0, 0), _("^K3You froze ^BG%s"), "") \ MSG_CENTER_NOTIF(1, CENTER_FREEZETAG_FROZEN, 1, 0, "s1", NO_CPID, XPD(0, 0), _("^K1You were frozen by ^BG%s"), "") \ MSG_CENTER_NOTIF(1, CENTER_KEEPAWAY_DROPPED, 1, 0, "s1", CPID_KEEPAWAY, XPD(0, 0), _("^BG%s^BG has dropped the ball!"), "") \ MSG_CENTER_NOTIF(1, CENTER_KEEPAWAY_PICKUP, 1, 0, "s1", CPID_KEEPAWAY, XPD(0, 0), _("^BG%s^BG has picked up the ball!"), "") \ MSG_CENTER_NOTIF(1, CENTER_KEEPAWAY_WARN, 0, 0, "", CPID_KA_WARN, XPD(0, 0), _("^BGKilling people while you don't have the ball gives no points!"), "") \ MSG_CENTER_NOTIF(1, CENTER_LMS_CAMPCHECK, 0, 0, "", CPID_LMS_CAMP, XPD(0, 0), _("^K1Don't camp!"), "") \ MSG_CENTER_NOTIF(1, CENTER_JOIN_NOSPAWNS, 0, 0, "", CPID_PREVENT_JOIN, XPD(0, 0), _("^K1No spawnpoints available!\nHope your team can fix it..."), "") \ MSG_CENTER_NOTIF(1, CENTER_JOIN_PREVENT, 0, 0, "", CPID_PREVENT_JOIN, XPD(0, 0), _("^K1You may not join the game at this time.\nThe player limit reached maximum capacity."), "") \ MSG_CENTER_NOTIF(1, CENTER_OVERTIME_TIME, 0, 1, "f1", CPID_OVERTIME, XPD(0, 0), _("^F2Now playing ^F4OVERTIME^F2!\nAdded ^F4%s ^F2minute(s) to the game!"), "") \ MSG_CENTER_NOTIF(1, CENTER_OVERTIME_FRAG, 0, 0, "", CPID_OVERTIME, XPD(0, 0), _("^F2Now playing ^F4OVERTIME^F2!\nKeep fragging until we have a winner!"), _("^F2Now playing ^F4OVERTIME^F2!\nKeep scoring until we have a winner!")) \ MSG_CENTER_NOTIF(1, CENTER_RACE_FINISHLAP, 0, 0, "", CPID_RACE_FINISHLAP, XPD(0, 0), _("^F2The race is over, finish your lap!"), "") \ MULTITEAM_CENTER(1, CENTER_TEAMCHANGE_, 4, 0, 1, "", CPID_TEAMCHANGE, XPD(0, f1), _("^BGChanging to ^TC^TT^BG in ^COUNT"), "") \ MSG_CENTER_NOTIF(1, CENTER_TEAMCHANGE_SPECTATE, 0, 1, "", CPID_TEAMCHANGE, XPD(0, f1), _("^BGSpectating in ^COUNT"), "") \ MSG_CENTER_NOTIF(1, CENTER_TEAMCHANGE_AUTO, 0, 1, "", CPID_TEAMCHANGE, XPD(0, f1), _("^BGChanging team in ^COUNT"), "") \ MSG_CENTER_NOTIF(1, CENTER_TEAMCHANGE_SUICIDE, 0, 1, "", CPID_TEAMCHANGE, XPD(0, f1), _("^K1Suicide in ^COUNT"), "") \ MSG_CENTER_NOTIF(1, CENTER_WEAPON_MARBLES_LOST, 1, 1, "s1 weapon_name", NO_CPID, XPD(0, 0), _("^K1You lost your marbles against ^BG%s^K1 using the ^BG%s!"), "") #define MSG_WEAPON_NOTIFICATIONS \ /*MSG_WEAPON_NOTIF(1, WEAPON_EMPTY, NO_MSG, NO_MSG)*/ \ MSG_WEAPON_NOTIF(1, WEAPON_THINKING_WITH_PORTALS, INFO_WEAPON_THINKING_WITH_PORTALS, CENTER_DEATH_SELF_GENERIC) \ MSG_WEAPON_NOTIF(1, WEAPON_CRYLINK_SUICIDE, INFO_WEAPON_CRYLINK_SUICIDE, CENTER_DEATH_SELF_GENERIC) \ MSG_WEAPON_NOTIF(1, WEAPON_CRYLINK_MURDER, INFO_WEAPON_CRYLINK_MURDER, NO_MSG) \ MSG_WEAPON_NOTIF(1, WEAPON_ELECTRO_SUICIDE_ORBS, INFO_WEAPON_ELECTRO_SUICIDE_ORBS, CENTER_DEATH_SELF_GENERIC) \ MSG_WEAPON_NOTIF(1, WEAPON_ELECTRO_SUICIDE_BOLT, INFO_WEAPON_ELECTRO_SUICIDE_BOLT, CENTER_DEATH_SELF_GENERIC) \ MSG_WEAPON_NOTIF(1, WEAPON_ELECTRO_MURDER_BOLT, INFO_WEAPON_ELECTRO_MURDER_BOLT, NO_MSG) \ MSG_WEAPON_NOTIF(1, WEAPON_ELECTRO_MURDER_ORBS, INFO_WEAPON_ELECTRO_MURDER_ORBS, NO_MSG) \ MSG_WEAPON_NOTIF(1, WEAPON_ELECTRO_MURDER_COMBO, INFO_WEAPON_ELECTRO_MURDER_COMBO, NO_MSG) \ MSG_WEAPON_NOTIF(1, WEAPON_FIREBALL_SUICIDE_FIREMINE, INFO_WEAPON_FIREBALL_SUICIDE_FIREMINE, CENTER_DEATH_SELF_GENERIC) \ MSG_WEAPON_NOTIF(1, WEAPON_FIREBALL_SUICIDE_BLAST, INFO_WEAPON_FIREBALL_SUICIDE_BLAST, CENTER_DEATH_SELF_GENERIC) \ MSG_WEAPON_NOTIF(1, WEAPON_FIREBALL_MURDER_FIREMINE, INFO_WEAPON_FIREBALL_MURDER_FIREMINE, NO_MSG) \ MSG_WEAPON_NOTIF(1, WEAPON_FIREBALL_MURDER_BLAST, INFO_WEAPON_FIREBALL_MURDER_BLAST, NO_MSG) \ MSG_WEAPON_NOTIF(1, WEAPON_MORTAR_SUICIDE_EXPLODE, INFO_WEAPON_MORTAR_SUICIDE_EXPLODE, CENTER_DEATH_SELF_GENERIC) \ MSG_WEAPON_NOTIF(1, WEAPON_MORTAR_SUICIDE_BOUNCE, INFO_WEAPON_MORTAR_SUICIDE_BOUNCE, CENTER_DEATH_SELF_GENERIC) \ MSG_WEAPON_NOTIF(1, WEAPON_MORTAR_MURDER_EXPLODE, INFO_WEAPON_MORTAR_MURDER_EXPLODE, NO_MSG) \ MSG_WEAPON_NOTIF(1, WEAPON_MORTAR_MURDER_BOUNCE, INFO_WEAPON_MORTAR_MURDER_BOUNCE, NO_MSG) \ MSG_WEAPON_NOTIF(1, WEAPON_HAGAR_SUICIDE, INFO_WEAPON_HAGAR_SUICIDE, CENTER_DEATH_SELF_GENERIC) \ MSG_WEAPON_NOTIF(1, WEAPON_HAGAR_MURDER_BURST, INFO_WEAPON_HAGAR_MURDER_BURST, NO_MSG) \ MSG_WEAPON_NOTIF(1, WEAPON_HAGAR_MURDER_SPRAY, INFO_WEAPON_HAGAR_MURDER_SPRAY, NO_MSG) \ MSG_WEAPON_NOTIF(1, WEAPON_HLAC_SUICIDE, INFO_WEAPON_HLAC_SUICIDE, CENTER_DEATH_SELF_GENERIC) \ MSG_WEAPON_NOTIF(1, WEAPON_HLAC_MURDER, INFO_WEAPON_HLAC_MURDER, NO_MSG) \ MSG_WEAPON_NOTIF(1, WEAPON_HOOK_MURDER, INFO_WEAPON_HOOK_MURDER, NO_MSG) \ MSG_WEAPON_NOTIF(1, WEAPON_LASER_SUICIDE, INFO_WEAPON_LASER_SUICIDE, CENTER_DEATH_SELF_GENERIC) \ MSG_WEAPON_NOTIF(1, WEAPON_LASER_MURDER, INFO_WEAPON_LASER_MURDER, NO_MSG) \ MSG_WEAPON_NOTIF(1, WEAPON_MINELAYER_SUICIDE, INFO_WEAPON_MINELAYER_SUICIDE, CENTER_DEATH_SELF_GENERIC) \ MSG_WEAPON_NOTIF(1, WEAPON_MINELAYER_MURDER, INFO_WEAPON_MINELAYER_MURDER, NO_MSG) \ MSG_WEAPON_NOTIF(1, WEAPON_MINSTANEX_MURDER, INFO_WEAPON_MINSTANEX_MURDER, NO_MSG) \ MSG_WEAPON_NOTIF(1, WEAPON_NEX_MURDER, INFO_WEAPON_NEX_MURDER, NO_MSG) \ MSG_WEAPON_NOTIF(1, WEAPON_RIFLE_MURDER_HAIL_PIERCING, INFO_WEAPON_RIFLE_MURDER_HAIL_PIERCING, NO_MSG) \ MSG_WEAPON_NOTIF(1, WEAPON_RIFLE_MURDER_HAIL, INFO_WEAPON_RIFLE_MURDER_HAIL, NO_MSG) \ MSG_WEAPON_NOTIF(1, WEAPON_RIFLE_MURDER_PIERCING, INFO_WEAPON_RIFLE_MURDER_PIERCING, NO_MSG) \ MSG_WEAPON_NOTIF(1, WEAPON_RIFLE_MURDER, INFO_WEAPON_RIFLE_MURDER, NO_MSG) \ MSG_WEAPON_NOTIF(1, WEAPON_RIFLE_MURDER_HEADSHOT, INFO_WEAPON_RIFLE_MURDER_HEADSHOT, NO_MSG) \ MSG_WEAPON_NOTIF(1, WEAPON_ROCKETLAUNCHER_SUICIDE, INFO_WEAPON_ROCKETLAUNCHER_SUICIDE, CENTER_DEATH_SELF_GENERIC) \ MSG_WEAPON_NOTIF(1, WEAPON_ROCKETLAUNCHER_MURDER_DIRECT, INFO_WEAPON_ROCKETLAUNCHER_MURDER_DIRECT, NO_MSG) \ MSG_WEAPON_NOTIF(1, WEAPON_ROCKETLAUNCHER_MURDER_SPLASH, INFO_WEAPON_ROCKETLAUNCHER_MURDER_SPLASH, NO_MSG) \ MSG_WEAPON_NOTIF(1, WEAPON_SEEKER_SUICIDE, INFO_WEAPON_SEEKER_SUICIDE, CENTER_DEATH_SELF_GENERIC) \ MSG_WEAPON_NOTIF(1, WEAPON_SEEKER_MURDER_TAG, INFO_WEAPON_SEEKER_MURDER_TAG, NO_MSG) \ MSG_WEAPON_NOTIF(1, WEAPON_SEEKER_MURDER_SPRAY, INFO_WEAPON_SEEKER_MURDER_SPRAY, NO_MSG) \ MSG_WEAPON_NOTIF(1, WEAPON_SHOTGUN_MURDER_SLAP, INFO_WEAPON_SHOTGUN_MURDER_SLAP, NO_MSG) \ MSG_WEAPON_NOTIF(1, WEAPON_SHOTGUN_MURDER, INFO_WEAPON_SHOTGUN_MURDER, NO_MSG) \ MSG_WEAPON_NOTIF(1, WEAPON_TUBA_SUICIDE, INFO_WEAPON_TUBA_SUICIDE, CENTER_DEATH_SELF_GENERIC) \ MSG_WEAPON_NOTIF(1, WEAPON_TUBA_MURDER, INFO_WEAPON_TUBA_MURDER, NO_MSG) \ MSG_WEAPON_NOTIF(1, WEAPON_ACCORDEON_SUICIDE, INFO_WEAPON_ACCORDEON_SUICIDE, CENTER_DEATH_SELF_GENERIC) \ MSG_WEAPON_NOTIF(1, WEAPON_ACCORDEON_MURDER, INFO_WEAPON_ACCORDEON_MURDER, NO_MSG) \ MSG_WEAPON_NOTIF(1, WEAPON_KLEINBOTTLE_SUICIDE, INFO_WEAPON_KLEINBOTTLE_SUICIDE, CENTER_DEATH_SELF_GENERIC) \ MSG_WEAPON_NOTIF(1, WEAPON_KLEINBOTTLE_MURDER, INFO_WEAPON_KLEINBOTTLE_MURDER, NO_MSG) \ MSG_WEAPON_NOTIF(1, WEAPON_UZI_MURDER_SNIPE, INFO_WEAPON_UZI_MURDER_SNIPE, NO_MSG) \ MSG_WEAPON_NOTIF(1, WEAPON_UZI_MURDER_SPRAY, INFO_WEAPON_UZI_MURDER_SPRAY, NO_MSG) #define MSG_DEATH_NOTIFICATIONS \ /*MSG_DEATH_NOTIF(1, DEATH_EMPTY, NO_MSG, NO_MSG)*/ \ MSG_DEATH_NOTIF(1, DEATH_SELF_CUSTOM, INFO_DEATH_SELF_GENERIC, CENTER_DEATH_SELF_CUSTOM) \ MSG_DEATH_NOTIF(1, DEATH_SELF_GENERIC, INFO_DEATH_SELF_GENERIC, CENTER_DEATH_SELF_GENERIC) \ MSG_DEATH_NOTIF(1, DEATH_SELF_VOID, INFO_DEATH_SELF_VOID, CENTER_DEATH_SELF_VOID) \ MSG_DEATH_NOTIF(1, DEATH_SELF_SUICIDE, INFO_DEATH_SELF_SUICIDE, CENTER_DEATH_SELF_SUICIDE) \ MSG_DEATH_NOTIF(1, DEATH_SELF_NOAMMO, INFO_DEATH_SELF_NOAMMO, CENTER_DEATH_SELF_NOAMMO) \ MSG_DEATH_NOTIF(1, DEATH_SELF_ROT, INFO_DEATH_SELF_ROT, CENTER_DEATH_SELF_ROT) \ MSG_DEATH_NOTIF(1, DEATH_SELF_CAMP, INFO_DEATH_SELF_CAMP, CENTER_DEATH_SELF_CAMP) \ MSG_DEATH_NOTIF(1, DEATH_SELF_BETRAYAL, INFO_DEATH_SELF_BETRAYAL, CENTER_DEATH_SELF_BETRAYAL) \ MSG_DEATH_NOTIF(1, DEATH_SELF_TEAMCHANGE, INFO_DEATH_SELF_TEAMCHANGE, CENTER_DEATH_SELF_TEAMCHANGE) \ MSG_DEATH_NOTIF(1, DEATH_SELF_AUTOTEAMCHANGE, INFO_DEATH_SELF_AUTOTEAMCHANGE, CENTER_DEATH_SELF_AUTOTEAMCHANGE) \ MSG_DEATH_NOTIF(1, DEATH_SELF_FALL, INFO_DEATH_SELF_FALL, CENTER_DEATH_SELF_FALL) \ MSG_DEATH_NOTIF(1, DEATH_SELF_DROWN, INFO_DEATH_SELF_DROWN, CENTER_DEATH_SELF_DROWN) \ MSG_DEATH_NOTIF(1, DEATH_SELF_FIRE, INFO_DEATH_SELF_FIRE, CENTER_DEATH_SELF_FIRE) \ MSG_DEATH_NOTIF(1, DEATH_SELF_LAVA, INFO_DEATH_SELF_LAVA, CENTER_DEATH_SELF_LAVA) \ MSG_DEATH_NOTIF(1, DEATH_SELF_SLIME, INFO_DEATH_SELF_SLIME, CENTER_DEATH_SELF_SLIME) \ MSG_DEATH_NOTIF(1, DEATH_SELF_SHOOTING_STAR, INFO_DEATH_SELF_SHOOTING_STAR, CENTER_DEATH_SELF_SHOOTING_STAR) \ MSG_DEATH_NOTIF(1, DEATH_SELF_SWAMP, INFO_DEATH_SELF_SWAMP, CENTER_DEATH_SELF_SWAMP) \ MSG_DEATH_NOTIF(1, DEATH_SELF_CHEAT, INFO_DEATH_SELF_CHEAT, CENTER_DEATH_SELF_CHEAT) \ MSG_DEATH_NOTIF(1, DEATH_SELF_TOUCHEXPLODE, INFO_DEATH_SELF_TOUCHEXPLODE, CENTER_DEATH_SELF_TOUCHEXPLODE) \ MSG_DEATH_NOTIF(1, DEATH_SELF_TURRET, INFO_DEATH_SELF_TURRET, CENTER_DEATH_SELF_TURRET) \ MSG_DEATH_NOTIF(1, DEATH_SELF_TURRET_EWHEEL, INFO_DEATH_SELF_TURRET_EWHEEL, CENTER_DEATH_SELF_TURRET_EWHEEL) \ MSG_DEATH_NOTIF(1, DEATH_SELF_TURRET_FLAC, INFO_DEATH_SELF_TURRET_FLAC, CENTER_DEATH_SELF_TURRET) \ MSG_DEATH_NOTIF(1, DEATH_SELF_TURRET_MACHINEGUN, INFO_DEATH_SELF_TURRET_MACHINEGUN, CENTER_DEATH_SELF_TURRET) \ MSG_DEATH_NOTIF(1, DEATH_SELF_TURRET_WALKER_GUN, INFO_DEATH_SELF_TURRET_WALKER_GUN, CENTER_DEATH_SELF_TURRET_WALKER) \ MSG_DEATH_NOTIF(1, DEATH_SELF_TURRET_WALKER_MEELE, INFO_DEATH_SELF_TURRET_WALKER_MEELE, CENTER_DEATH_SELF_TURRET_WALKER) \ MSG_DEATH_NOTIF(1, DEATH_SELF_TURRET_WALKER_ROCKET, INFO_DEATH_SELF_TURRET_WALKER_ROCKET, CENTER_DEATH_SELF_TURRET_WALKER) \ MSG_DEATH_NOTIF(1, DEATH_SELF_TURRET_HELLION, INFO_DEATH_SELF_TURRET_HELLION, CENTER_DEATH_SELF_TURRET) \ MSG_DEATH_NOTIF(1, DEATH_SELF_TURRET_HK, INFO_DEATH_SELF_TURRET_HK, CENTER_DEATH_SELF_TURRET) \ MSG_DEATH_NOTIF(1, DEATH_SELF_TURRET_MLRS, INFO_DEATH_SELF_TURRET_MLRS, CENTER_DEATH_SELF_TURRET) \ MSG_DEATH_NOTIF(1, DEATH_SELF_TURRET_PLASMA, INFO_DEATH_SELF_TURRET_PLASMA, CENTER_DEATH_SELF_TURRET) \ MSG_DEATH_NOTIF(1, DEATH_SELF_TURRET_PHASER, INFO_DEATH_SELF_TURRET_PHASER, CENTER_DEATH_SELF_TURRET) \ MSG_DEATH_NOTIF(1, DEATH_SELF_TURRET_TESLA, INFO_DEATH_SELF_TURRET_TESLA, CENTER_DEATH_SELF_TURRET) \ MSG_DEATH_NOTIF(1, DEATH_MURDER_TELEFRAG, INFO_DEATH_MURDER_TELEFRAG, NO_MSG) \ MSG_DEATH_NOTIF(1, DEATH_MURDER_FALL, INFO_DEATH_MURDER_FALL, NO_MSG) \ MSG_DEATH_NOTIF(1, DEATH_MURDER_DROWN, INFO_DEATH_MURDER_DROWN, NO_MSG) \ MSG_DEATH_NOTIF(1, DEATH_MURDER_LAVA, INFO_DEATH_MURDER_LAVA, NO_MSG) \ MSG_DEATH_NOTIF(1, DEATH_MURDER_SLIME, INFO_DEATH_MURDER_SLIME, NO_MSG) \ MSG_DEATH_NOTIF(1, DEATH_MURDER_SHOOTING_STAR, INFO_DEATH_MURDER_SHOOTING_STAR, NO_MSG) \ MSG_DEATH_NOTIF(1, DEATH_MURDER_SWAMP, INFO_DEATH_MURDER_SWAMP, NO_MSG) \ MSG_DEATH_NOTIF(1, DEATH_MURDER_VOID, INFO_DEATH_MURDER_VOID, NO_MSG) \ MSG_DEATH_NOTIF(1, DEATH_MURDER_TOUCHEXPLODE, INFO_DEATH_MURDER_TOUCHEXPLODE, NO_MSG) \ MSG_DEATH_NOTIF(1, DEATH_MURDER_CHEAT, INFO_DEATH_MURDER_CHEAT, NO_MSG) \ MSG_DEATH_NOTIF(1, DEATH_MURDER_FIRE, INFO_DEATH_MURDER_FIRE, NO_MSG) \ MSG_DEATH_NOTIF(1, DEATH_MURDER_VH_CRUSH, INFO_DEATH_MURDER_VH_CRUSH, NO_MSG) \ MSG_DEATH_NOTIF(1, DEATH_MURDER_VH_SPID_MINIGUN, INFO_DEATH_MURDER_VH_SPID_MINIGUN, NO_MSG) \ MSG_DEATH_NOTIF(1, DEATH_MURDER_VH_SPID_ROCKET, INFO_DEATH_MURDER_VH_SPID_ROCKET, NO_MSG) \ MSG_DEATH_NOTIF(1, DEATH_MURDER_VH_SPID_DEATH, INFO_DEATH_MURDER_VH_SPID_DEATH, NO_MSG) \ MSG_DEATH_NOTIF(1, DEATH_MURDER_VH_WAKI_GUN, INFO_DEATH_MURDER_VH_WAKI_GUN, NO_MSG) \ MSG_DEATH_NOTIF(1, DEATH_MURDER_VH_WAKI_ROCKET, INFO_DEATH_MURDER_VH_WAKI_ROCKET, NO_MSG) \ MSG_DEATH_NOTIF(1, DEATH_MURDER_VH_WAKI_DEATH, INFO_DEATH_MURDER_VH_WAKI_DEATH, NO_MSG) \ MSG_DEATH_NOTIF(1, DEATH_MURDER_VH_RAPT_CANNON, INFO_DEATH_MURDER_VH_RAPT_CANNON, NO_MSG) \ MSG_DEATH_NOTIF(1, DEATH_MURDER_VH_RAPT_BOMB, INFO_DEATH_MURDER_VH_RAPT_BOMB, NO_MSG) \ MSG_DEATH_NOTIF(1, DEATH_MURDER_VH_RAPT_FRAGMENT, INFO_DEATH_MURDER_VH_RAPT_FRAGMENT, NO_MSG) \ MSG_DEATH_NOTIF(1, DEATH_MURDER_VH_RAPT_DEATH, INFO_DEATH_MURDER_VH_RAPT_DEATH, NO_MSG) \ MSG_DEATH_NOTIF(1, DEATH_MURDER_VH_BUMB_GUN, INFO_DEATH_MURDER_VH_BUMB_GUN, NO_MSG) \ MSG_DEATH_NOTIF(1, DEATH_MURDER_VH_BUMB_RAY, INFO_DEATH_MURDER_VH_BUMB_RAY, NO_MSG) \ MSG_DEATH_NOTIF(1, DEATH_MURDER_VH_BUMB_RAY_HEAL, INFO_DEATH_MURDER_VH_BUMB_RAY_HEAL, NO_MSG) \ MSG_DEATH_NOTIF(1, DEATH_MURDER_VH_BUMB_DEATH, INFO_DEATH_MURDER_VH_BUMB_DEATH, NO_MSG) \ MSG_DEATH_NOTIF(1, DEATH_MURDER_FRAG, NO_MSG, CENTER_DEATH_MURDER_FRAG) \ MSG_DEATH_NOTIF(1, DEATH_MURDER_FRAGGED, NO_MSG, CENTER_DEATH_MURDER_FRAGGED) \ MSG_DEATH_NOTIF(1, DEATH_MURDER_TYPEFRAG, NO_MSG, CENTER_DEATH_MURDER_TYPEFRAG) \ MSG_DEATH_NOTIF(1, DEATH_MURDER_TYPEFRAGGED, NO_MSG, CENTER_DEATH_MURDER_TYPEFRAGGED) \ MSG_DEATH_NOTIF(1, DEATH_MURDER_FRAG_FIRST, INFO_DEATH_FIRSTBLOOD, CENTER_DEATH_MURDER_FRAG_FIRST) \ MSG_DEATH_NOTIF(1, DEATH_MURDER_FRAGGED_FIRST, NO_MSG, CENTER_DEATH_MURDER_FRAGGED_FIRST) \ MSG_DEATH_NOTIF(1, DEATH_MURDER_TYPEFRAG_FIRST, INFO_DEATH_FIRSTBLOOD, CENTER_DEATH_MURDER_TYPEFRAG_FIRST) \ MSG_DEATH_NOTIF(1, DEATH_MURDER_TYPEFRAGGED_FIRST, NO_MSG, CENTER_DEATH_MURDER_TYPEFRAGGED_FIRST) \ MSG_DEATH_NOTIF(1, DEATH_MURDER_FRAG_VERBOSE, NO_MSG, CENTER_DEATH_MURDER_FRAG_VERBOSE) \ MSG_DEATH_NOTIF(1, DEATH_MURDER_FRAGGED_VERBOSE, NO_MSG, CENTER_DEATH_MURDER_FRAGGED_VERBOSE) \ MSG_DEATH_NOTIF(1, DEATH_MURDER_TYPEFRAG_VERBOSE, NO_MSG, CENTER_DEATH_MURDER_TYPEFRAG_VERBOSE) \ MSG_DEATH_NOTIF(1, DEATH_MURDER_TYPEFRAGGED_VERBOSE, NO_MSG, CENTER_DEATH_MURDER_TYPEFRAGGED_VERBOSE) \ MSG_DEATH_NOTIF(1, DEATH_MURDER_FRAG_FIRST_VERBOSE, INFO_DEATH_FIRSTBLOOD, CENTER_DEATH_MURDER_FRAG_FIRST_VERBOSE) \ MSG_DEATH_NOTIF(1, DEATH_MURDER_FRAGGED_FIRST_VERBOSE, NO_MSG, CENTER_DEATH_MURDER_FRAGGED_FIRST_VERBOSE) \ MSG_DEATH_NOTIF(1, DEATH_MURDER_TYPEFRAG_FIRST_VERBOSE, INFO_DEATH_FIRSTBLOOD, CENTER_DEATH_MURDER_TYPEFRAG_FIRST_VERBOSE) \ MSG_DEATH_NOTIF(1, DEATH_MURDER_TYPEFRAGGED_FIRST_VERBOSE, NO_MSG, CENTER_DEATH_MURDER_TYPEFRAGGED_FIRST_VERBOSE) \ MSG_DEATH_NOTIF(1, DEATH_TEAMKILL_FRAG, NO_MSG, CENTER_DEATH_TEAMKILL_FRAG) \ MSG_DEATH_NOTIF(1, DEATH_TEAMKILL_FRAGGED, NO_MSG, CENTER_DEATH_TEAMKILL_FRAGGED) // ============================ // Notification Argument List // ============================ /* These arguments get replaced with the Local_Notification_sprintf and Local_Notification_HUD_Notify_Push functions to supply data from networked notifications to their usage in sprintf... It allows for more dynamic data to be inferred by the local notification parser, so that the server does not have to network anything too crazy on a per-client/per-situation basis. Pay attention to the CSQC/SVQC relations, some of these are redefined in slightly different ways for different programs, this is because the server does a more conservative approach to the notifs than the client. All arguments are swapped into strings, so be sure that your sprintf usage matches with proper %s placement. Argument descriptions: s1-s4: string arguments to be literally swapped into sprintf f1-f4: float arguments expanded into strings to be swapped into sprintf f1p2dec: f1 float to string with 2 decimal places f2p2dec: f2 float to string with 2 decimal places pass_key: find the keybind for "passing" or "dropping" in CTF game mode frag_ping: show the ping of a player frag_stats: show health/armor/ping of a player frag_pos: show score status and position in the match of a player spree_cen: centerprint notif for kill spree/how many kills they have spree_inf: info notif for kill spree/how many kills they have spree_end: placed at the end of murder messages to show ending of sprees spree_lost: placed at the end of suicide messages to show losing of sprees death_team: show the full name of the team a player is switching from weapon_name: return the full name of a weapon from a weaponid */ #define NOTIF_MAX_ARGS 7 #define NOTIF_MAX_HUDARGS 2 string arg_slot[NOTIF_MAX_ARGS]; #define ARG_DOUBLE 1 // enabled on CSQC and SVQC #define ARG_TRIPLE 2 // same as double, but also included with hudargs #define ARG_CSQC 3 // unique result to CSQC #define ARG_SVQC 4 // unique result to SVQC #define NOTIF_HIT_MAX(count,funcname) if(sel_num == count) { backtrace(sprintf("%s: Hit maximum arguments!\n", funcname)); break; } #define NOTIF_HIT_UNKNOWN(token,funcname) default: { backtrace(sprintf("%s: Hit unknown token in selected string! '%s'\n", funcname, selected)); break; } #define IS_SPREE_NUM(n) ((n == 3) || (n == 5) || (n == 10) || (n == 15) || (n == 20) || (n == 25) || (n == 30)) #define NOTIF_ARGUMENT_LIST \ ARG_CASE(ARG_TRIPLE, "s1", s1) \ ARG_CASE(ARG_TRIPLE, "s2", s2) \ ARG_CASE(ARG_TRIPLE, "s3", s3) \ ARG_CASE(ARG_TRIPLE, "s4", s4) \ ARG_CASE(ARG_DOUBLE, "f1", ftos(f1)) \ ARG_CASE(ARG_DOUBLE, "f2", ftos(f2)) \ ARG_CASE(ARG_DOUBLE, "f3", ftos(f3)) \ ARG_CASE(ARG_DOUBLE, "f4", ftos(f4)) \ ARG_CASE(ARG_DOUBLE, "f1p2dec", ftos_decimals(f1/100, 2)) \ ARG_CASE(ARG_DOUBLE, "f2p2dec", ftos_decimals(f2/100, 2)) \ ARG_CASE(ARG_CSQC, "pass_key", ((((tmp_s = getcommandkey("pass", "+use")) != "pass") && !(strstrofs(tmp_s, "not bound", 0) >= 0)) ? sprintf(CCR(_(" ^F1(Press %s)")), tmp_s) : "")) \ ARG_CASE(ARG_CSQC, "frag_ping", ((f2 != NO_MSG) ? sprintf(CCR(_("\n(Ping ^2%d^BG)")), f2) : "")) \ ARG_CASE(ARG_CSQC, "frag_stats", sprintf(CCR(_("\n(Health ^1%d^BG / Armor ^2%d^BG)%s")), f1, f2, ((f3 != NO_MSG) ? sprintf(CCR(_(" (Ping ^2%d^BG)")), f3) : ""))) \ /*ARG_CASE(ARG_CSQC, "frag_pos", ((Should_Print_Score_Pos(f1)) ? sprintf("\n^BG%s", Read_Score_Pos(f1)) : ""))*/ \ ARG_CASE(ARG_CSQC, "spree_cen", ((autocvar_notification_show_sprees && IS_SPREE_NUM(f1)) ? sprintf(normal_or_gentle(_("%d frag spree! "), _("%d score spree! ")), f1) : "")) \ ARG_CASE(ARG_CSQC, "spree_inf", ((autocvar_notification_show_sprees && IS_SPREE_NUM(f1)) ? sprintf(CCR(normal_or_gentle(_("%s^BG is on a %d frag spree! "), _("%s^BG is on a %d score spree! "))), s2, f1) : "")) \ ARG_CASE(ARG_CSQC, "spree_end", ((autocvar_notification_show_sprees && (f1 >= 3)) ? sprintf(normal_or_gentle(_(", ending their %d frag spree"), _(", ending their %d score spree")), f1) : "")) \ ARG_CASE(ARG_CSQC, "spree_lost", ((autocvar_notification_show_sprees && (f1 >= 3)) ? sprintf(normal_or_gentle(_(", losing their %d frag spree"), _(", losing their %d score spree")), f1) : "")) \ ARG_CASE(ARG_CSQC, "death_team", Team_ColoredFullName(f1 - 1)) \ ARG_CASE(ARG_CSQC, "weapon_name", ftos(f1)) \ ARG_CASE(ARG_SVQC, "spree_inf", ((autocvar_notification_show_sprees && IS_SPREE_NUM(f1)) ? sprintf(CCR(normal_or_gentle(_("%s^BG is on a %d frag spree! "), _("%s^BG is on a %d score spree! "))), s2, f1) : "")) \ ARG_CASE(ARG_SVQC, "spree_end", ((autocvar_notification_show_sprees && (f1 >= 3)) ? sprintf(normal_or_gentle(_(", ending their %d frag spree"), _(", ending their %d score spree")), f1) : "")) \ ARG_CASE(ARG_SVQC, "spree_lost", ((autocvar_notification_show_sprees && (f1 >= 3)) ? sprintf(normal_or_gentle(_(", losing their %d frag spree"), _(", losing their %d score spree")), f1) : "")) \ ARG_CASE(ARG_SVQC, "death_team", Team_ColoredFullName(f1)) \ ARG_CASE(ARG_SVQC, "weapon_name", ftos(f1)) // =========================== // Special CVAR Declarations // =========================== // MAKE SURE THIS IS ALWAYS SYNCHRONIZED WITH THE DUMP // NOTIFICATIONS FUNCTION IN THE .QC FILE! #define NOTIF_ADD_AUTOCVAR(name,default) var float autocvar_notification_##name = default; NOTIF_ADD_AUTOCVAR(version, NOTIF_VERSION) NOTIF_ADD_AUTOCVAR(show_sprees, TRUE) NOTIF_ADD_AUTOCVAR(errors_are_fatal, TRUE) #ifdef SVQC .float FRAG_VERBOSE; void Notification_GetCvars(void); NOTIF_ADD_AUTOCVAR(version_mismatch_server_error, TRUE) #else NOTIF_ADD_AUTOCVAR(frag_verbose, TRUE) NOTIF_ADD_AUTOCVAR(version_mismatch_client_error, FALSE) #endif // ==================================== // Initialization/Create Declarations // ==================================== #define NOTIF_FIRST 1 #define NOTIF_MAX 1024 // limit of recursive functions with ACCUMULATE_FUNCTION // error detection float notif_error; float notif_global_error; // notification entities entity msg_info_notifs[NOTIF_MAX]; entity msg_center_notifs[NOTIF_MAX]; entity msg_weapon_notifs[NOTIF_MAX]; entity msg_death_notifs[NOTIF_MAX]; // notification counts float NOTIF_INFO_COUNT; float NOTIF_CENTER_COUNT; float NOTIF_WEAPON_COUNT; float NOTIF_DEATH_COUNT; float NOTIF_CPID_COUNT; // notification entity values .float nent_default; .string nent_name; .float nent_id; .float nent_enabled; .entity nent_msginfo; .entity nent_msgcenter; .float nent_stringcount; .float nent_floatcount; .string nent_args; .string nent_hudargs; .string nent_icon; .float nent_cpid; .string nent_durcnt; // if(durcnt != "") { notif.nent_durcnt = durcnt; } .string nent_string; // networked notification values .float nent_broadcast; .entity nent_client; .float nent_net_type; .float nent_net_name; .string nent_strings[4]; .float nent_floats[4]; string Process_Notif_Line(float check_newline, string input, string notiftype, string notifname, string stringtype) { if(check_newline) if(substring(input, (strlen(input) - 1), 1) != "\n") { print(sprintf("^1MISSING/BROKEN NEW LINE AT END OF NOTIFICATION: ^7net_type = MSG_%s, net_name = %s, string = %s.\n", notiftype, notifname, stringtype)); notif_error = TRUE; return strcat(input, "\n"); } return input; } string Process_Notif_Args(float is_hudargs, string args, string notiftype, string notifname) { string selected, remaining = args; float sel_num = 0; float maxargs = (is_hudargs ? NOTIF_MAX_HUDARGS : NOTIF_MAX_ARGS); for(;(remaining != "");) { selected = car(remaining); remaining = cdr(remaining); if(sel_num == maxargs) { print(sprintf("^1NOTIFICATION HAS TOO MANY ARGUMENTS: ^7net_type = MSG_%s, net_name = %s, max %s = %d.\n", notiftype, notifname, (is_hudargs ? "hudargs" : "args"), maxargs)); notif_error = TRUE; break; } switch(strtolower(selected)) { #define ARG_CASE(prog,selected,result) \ #if (prog == ARG_TRIPLE) \ case selected: { ++sel_num; break; } \ #else \ case selected: { if(!is_hudargs) { ++sel_num; break; } } \ #endif NOTIF_ARGUMENT_LIST #undef ARG_CASE default: { print(sprintf("^1NOTIFICATION WITH UNKNOWN TOKEN IN ARGUMENT STRING: ^7net_type = MSG_%s, net_name = %s, %s = '%s'.\n", notiftype, notifname, (is_hudargs ? "hudargs" : "args"), selected)); notif_error = TRUE; break; } } } return args; } #define CREATE_NOTIF_ENTITY(default,type,name,infoname,centername,strnum,flnum,args,hudargs,icon,cpid,durcnt,normal,gentle,check_newline,subcalls) \ notif_error = FALSE; \ entity notif = spawn(); \ msg_##type##_notifs[name - 1] = notif; \ notif.classname = "msg_#type#_notification"; \ notif.nent_default = default; \ notif.nent_name = strzone(#name); \ notif.nent_id = name; \ notif.nent_enabled = autocvar_notification_##name; \ #if subcalls \ #if (infoname == NO_MSG) && (centername == NO_MSG) \ print(sprintf("^1NOTIFICATION WITH NO SUBCALLS: ^7net_type = MSG_%s, net_name = %s.\n", strtoupper(#type), #name)); \ notif_error = TRUE; \ #else \ float infoname_stringcount = 0, infoname_floatcount = 0, centername_stringcount = 0, centername_floatcount = 0; \ #if (infoname != NO_MSG) \ notif.nent_msginfo = msg_info_notifs[infoname - 1]; \ infoname_stringcount = notif.nent_msginfo.nent_stringcount; \ infoname_floatcount = notif.nent_msginfo.nent_floatcount; \ #endif \ #if (centername != NO_MSG) \ notif.nent_msgcenter = msg_center_notifs[centername - 1]; \ centername_stringcount = notif.nent_msgcenter.nent_stringcount; \ centername_floatcount = notif.nent_msgcenter.nent_floatcount; \ #endif \ notif.nent_stringcount = max(infoname_stringcount, centername_stringcount); \ notif.nent_floatcount = max(infoname_floatcount, centername_floatcount); \ #endif \ #else \ notif.nent_stringcount = strnum; \ notif.nent_floatcount = flnum; \ if(args != "") { notif.nent_args = strzone(Process_Notif_Args(FALSE, args, strtoupper(#type), #name)); } \ if(hudargs != "") { notif.nent_hudargs = strzone(Process_Notif_Args(TRUE, hudargs, strtoupper(#type), #name)); } \ if(icon != "") { notif.nent_icon = strzone(icon); } \ if(GENTLE) \ { \ if(gentle != "") { notif.nent_string = strzone(CCR(Process_Notif_Line(check_newline, gentle, strtoupper(#type), #name, "GENTLE"))); } \ else if(normal != "") { notif.nent_string = strzone(CCR(Process_Notif_Line(check_newline, normal, strtoupper(#type), #name, "NORMAL"))); } \ } \ else if(normal != "") { notif.nent_string = strzone(CCR(Process_Notif_Line(check_newline, normal, strtoupper(#type), #name, "NORMAL"))); } \ if(notif.nent_string == "") { print(sprintf("^1EMPTY NOTIFICATION: ^7net_type = MSG_%s, net_name = %s.\n", strtoupper(#type), #name)); notif_error = TRUE; } \ #endif \ if(notif_error) \ { \ notif.nent_enabled = FALSE; \ notif_global_error = TRUE; \ } #define MSG_INFO_NOTIF(default,name,strnum,flnum,args,hudargs,icon,normal,gentle) \ NOTIF_ADD_AUTOCVAR(name, default) \ float name; \ void RegisterNotification_##name() \ { \ SET_FIELD_COUNT(name, NOTIF_FIRST, NOTIF_INFO_COUNT) \ CHECK_MAX_COUNT(name, NOTIF_MAX, NOTIF_INFO_COUNT, "notifications") \ CREATE_NOTIF_ENTITY( \ default, /* default */ \ info, /* type */ \ name, /* name */ \ NO_MSG, /* infoname */ \ NO_MSG, /* centername */ \ strnum, /* strnum */ \ flnum, /* flnum */ \ args, /* args */ \ hudargs, /* hudargs */ \ icon, /* icon */ \ NO_MSG, /* cpid */ \ NO_MSG, /* durcnt */ \ normal, /* normal */ \ gentle, /* gentle */ \ 1, /* check_newline */ \ 0) /* subcalls */ \ } \ ACCUMULATE_FUNCTION(RegisterNotifications, RegisterNotification_##name) #define MSG_CENTER_NOTIF(default,name,strnum,flnum,args,cpid,durcnt,normal,gentle) \ NOTIF_ADD_AUTOCVAR(name, default) \ float name; \ float cpid; \ void RegisterNotification_##name() \ { \ SET_FIELD_COUNT(name, NOTIF_FIRST, NOTIF_CENTER_COUNT) \ SET_FIELD_COUNT(cpid, NOTIF_FIRST, NOTIF_CPID_COUNT) \ CHECK_MAX_COUNT(name, NOTIF_MAX, NOTIF_CENTER_COUNT, "notifications") \ CREATE_NOTIF_ENTITY( \ default, /* default */ \ center, /* type */ \ name, /* name */ \ NO_MSG, /* infoname */ \ NO_MSG, /* centername */ \ strnum, /* strnum */ \ flnum, /* flnum */ \ args, /* args */ \ "", /* hudargs */ \ "", /* icon */ \ cpid, /* cpid */ \ durcnt, /* durcnt */ \ normal, /* normal */ \ gentle, /* gentle */ \ 0, /* check_newline */ \ 0) /* subcalls */ \ } \ ACCUMULATE_FUNCTION(RegisterNotifications, RegisterNotification_##name) #define MSG_WEAPON_NOTIF(default,name,infoname,centername) \ NOTIF_ADD_AUTOCVAR(name, default) \ float name; \ void RegisterNotification_##name() \ { \ SET_FIELD_COUNT(name, NOTIF_FIRST, NOTIF_WEAPON_COUNT) \ CHECK_MAX_COUNT(name, NOTIF_MAX, NOTIF_WEAPON_COUNT, "notifications") \ CREATE_NOTIF_ENTITY( \ default, /* default */ \ weapon, /* type */ \ name, /* name */ \ infoname, /* infoname */ \ centername, /* centername */ \ NO_MSG, /* strnum */ \ NO_MSG, /* flnum */ \ "", /* args */ \ "", /* hudargs */ \ "", /* icon */ \ NO_MSG, /* cpid */ \ NO_MSG, /* durcnt */ \ "", /* normal */ \ "", /* gentle */ \ 0, /* check_newline */ \ 1) /* subcalls */ \ } \ ACCUMULATE_FUNCTION(RegisterNotifications, RegisterNotification_##name) #define MSG_DEATH_NOTIF(default,name,infoname,centername) \ NOTIF_ADD_AUTOCVAR(name, default) \ float name; \ void RegisterNotification_##name() \ { \ SET_FIELD_COUNT(name, NOTIF_FIRST, NOTIF_DEATH_COUNT) \ CHECK_MAX_COUNT(name, NOTIF_MAX, NOTIF_DEATH_COUNT, "notifications") \ CREATE_NOTIF_ENTITY( \ default, /* default */ \ death, /* type */ \ name, /* name */ \ infoname, /* infoname */ \ centername, /* centername */ \ NO_MSG, /* strnum */ \ NO_MSG, /* flnum */ \ "", /* args */ \ "", /* hudargs */ \ "", /* icon */ \ NO_MSG, /* cpid */ \ NO_MSG, /* durcnt */ \ "", /* normal */ \ "", /* gentle */ \ 0, /* check_newline */ \ 1) /* subcalls */ \ } \ ACCUMULATE_FUNCTION(RegisterNotifications, RegisterNotification_##name) void RegisterNotifications_First() { notif_global_error = FALSE; 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; print(sprintf("^1NOTIFICATION VERSION MISMATCH: ^7program = %s, config = %d, code = %d.\n", "foobar", autocvar_notification_version, NOTIF_VERSION)); } } void RegisterNotifications_Done() { if(notif_global_error && autocvar_notification_errors_are_fatal) { // shit happened... stop the loading of the program now error("Notification initialization failed!"); } } // NOW we actually activate the declarations ACCUMULATE_FUNCTION(RegisterNotifications, RegisterNotifications_First) MSG_INFO_NOTIFICATIONS MSG_CENTER_NOTIFICATIONS MSG_WEAPON_NOTIFICATIONS MSG_DEATH_NOTIFICATIONS ACCUMULATE_FUNCTION(RegisterNotifications, RegisterNotifications_Done) #undef MSG_INFO_NOTIF #undef MSG_CENTER_NOTIF #undef MSG_WEAPON_NOTIF #undef MSG_DEATH_NOTIF #undef NOTIF_ADD_AUTOCVAR