#include <common/teams.qh>
#include <common/util.qh>
#include <common/sounds/sound.qh>
+#include <common/weapons/all.qh>
#ifdef CSQC
#include <client/autocvars.qh>
#endif
#ifdef SVQC
-.float FRAG_VERBOSE;
void Notification_GetCvars(entity this);
float autocvar_notification_server_allows_location = 1; // 0 = no, 1 = yes
#else
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
item_wepname: return full name of a weapon from weaponid
- item_wepammo: ammo display for weapon from f1
+ item_wepammo: ammo display for weapon from f1 and f2
item_centime: amount of time to display weapon message in centerprint
item_buffname: return full name of a buff from buffid
death_team: show the full name of the team a player is switching from
ARG_CASE(ARG_CS_SV_HA, "minigame1_name",find(NULL,netname,s1).descriptor.message) \
ARG_CASE(ARG_CS_SV_HA, "minigame1_d", find(NULL,netname,s1).descriptor.netname)
-#define NOTIF_HIT_MAX(count,funcname) MACRO_BEGIN { \
+#define NOTIF_HIT_MAX(count,funcname) MACRO_BEGIN \
if(sel_num == count) { backtrace(sprintf("%s: Hit maximum arguments!\n", funcname)); break; } \
-} MACRO_END
+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 \
string notif_arg_item_wepammo(float f1, float f2)
{
- if(f2 <= 0)
- return "";
string ammoitems = "";
Weapon wep = Weapons_from(f1);
switch (wep.ammo_type)
{
- case RESOURCE_SHELLS: ammoitems = ITEM_Shells.m_name; break;
- case RESOURCE_BULLETS: ammoitems = ITEM_Bullets.m_name; break;
- case RESOURCE_ROCKETS: ammoitems = ITEM_Rockets.m_name; break;
- case RESOURCE_CELLS: ammoitems = ITEM_Cells.m_name; break;
- case RESOURCE_PLASMA: ammoitems = ITEM_Plasma.m_name; break;
- case RESOURCE_FUEL: ammoitems = ITEM_JetpackFuel.m_name; break;
+ case RES_SHELLS: ammoitems = ITEM_Shells.m_name; break;
+ case RES_BULLETS: ammoitems = ITEM_Bullets.m_name; break;
+ case RES_ROCKETS: ammoitems = ITEM_Rockets.m_name; break;
+ case RES_CELLS: ammoitems = ITEM_Cells.m_name; break;
+ case RES_PLASMA: ammoitems = ITEM_Plasma.m_name; break;
+ case RES_FUEL: ammoitems = ITEM_JetpackFuel.m_name; break;
default: return ""; // doesn't use ammo
}
return sprintf(_(" with %d %s"), f2, ammoitems);
STATIC_INIT(Notifications) { FOREACH(Notifications, true, it.m_id = i); }
REGISTRY_CHECK(Notifications)
-const int NOTIF_CHOICE_MAX = 50;
+const int NOTIF_CHOICE_MAX = 20;
+// NOTE: a team choice is actually made of 4 choices (one per team) with the same nent_choice_idx
+// thus they are counted as 1 in nent_choice_count
int nent_choice_count = 0;
.int nent_choice_idx;
.int msg_choice_choices[NOTIF_CHOICE_MAX]; // set on each player containing MSG_CHOICE choices
bool notif_error;
bool notif_global_error;
-STATIC_INIT_LATE(Notif_Choices) {
- int c = 0;
- FOREACH(Notifications, it.nent_type == MSG_CHOICE, { c++; });
- if (c > NOTIF_CHOICE_MAX) {
- LOG_FATALF("Too many MSG_CHOICE notifications (%d)", c);
- }
+STATIC_INIT_LATE(Notif_Choices)
+{
+ if (nent_choice_count > NOTIF_CHOICE_MAX)
+ LOG_FATALF("Too many MSG_CHOICE notifications (%d), hit NOTIF_CHOICE_MAX (%d) limit",
+ nent_choice_count, NOTIF_CHOICE_MAX);
}
string Get_Notif_CvarName(Notification notif)
#define MSG_CHOICE_NOTIF_(teamnum, name, cvarname, default, challow, chtype, optiona, optionb) \
REGISTER(Notifications, name, m_id, new_pure(msg_choice_notification)) { \
- this.nent_choice_idx = nent_choice_count++; \
+ this.nent_choice_idx = nent_choice_count; \
+ if (!teamnum || teamnum == NUM_TEAM_4) \
+ nent_choice_count++; \
Create_Notification_Entity (this, default, ACVNN(cvarname), MSG_CHOICE, strtoupper(#name), teamnum); \
Create_Notification_Entity_Choice(this, ACVNN(cvarname), strtoupper(#name), \
challow, /* challow_def */ \