+#include "all.qh"
#if defined(CSQC)
#include <client/announcer.qh>
#elif defined(MENUQC)
#elif defined(SVQC)
#include <common/constants.qh>
+ #include <common/net_linked.qh>
#include <common/teams.qh>
#include <server/autocvars.qh>
#include <server/constants.qh>
#include <server/defs.qh>
- #include "all.qh"
- #include <server/mutators/all.qh>
+ #include <server/mutators/_mod.qh>
#endif
// ================================================
return (
(to_client == other_client)
||
- (
- IS_SPEC(to_client)
- &&
- (to_client.enemy == other_client)
- )
+ (IS_SPEC(to_client) && (to_client.enemy == other_client))
);
case NOTIF_ONE_ONLY:
return (to_client == other_client);
if (notif.nent_icon != "") strunzone(notif.nent_icon);
if (notif.nent_durcnt != "") strunzone(notif.nent_durcnt);
if (notif.nent_string != "") strunzone(notif.nent_string);
- remove(notif);
+ delete(notif);
}
void Destroy_All_Notifications()
LOG_INFOF(
(
"^1TRAILING NEW LINE AT END OF NOTIFICATION: "
- "^7net_type = %s, net_name = %s, string = %s.\n"
+ "^7net_type = %s, net_name = %s, string = %s."
),
notiftype,
notifname,
LOG_INFOF(
(
"^1NOTIFICATION HAS TOO MANY ARGUMENTS: "
- "^7net_type = %s, net_name = %s, max args = %d.\n"
+ "^7net_type = %s, net_name = %s, max args = %d."
),
notiftype,
notifname,
LOG_INFOF(
(
"^1NOTIFICATION WITH UNKNOWN TOKEN IN ARGUMENT STRING: "
- "^7net_type = %s, net_name = %s, args arg = '%s'.\n"
+ "^7net_type = %s, net_name = %s, args arg = '%s'."
),
notiftype,
notifname,
LOG_INFOF(
(
"^1NOTIFICATION HAS TOO MANY ARGUMENTS: "
- "^7net_type = %s, net_name = %s, max hudargs = %d.\n"
+ "^7net_type = %s, net_name = %s, max hudargs = %d."
),
notiftype,
notifname,
LOG_INFOF(
(
"^1NOTIFICATION WITH UNKNOWN TOKEN IN ARGUMENT STRING: "
- "^7net_type = %s, net_name = %s, hudargs arg = '%s'.\n"
+ "^7net_type = %s, net_name = %s, hudargs arg = '%s'."
),
notiftype,
notifname,
LOG_INFOF(
(
"^1NOTIFICATION HAS TOO MANY ARGUMENTS: "
- "^7net_type = %s, net_name = %s, max durcnt = %d.\n"
+ "^7net_type = %s, net_name = %s, max durcnt = %d."
),
notiftype,
notifname,
LOG_INFOF(
(
"^1NOTIFICATION WITH UNKNOWN TOKEN IN ARGUMENT STRING: "
- "^7net_type = %s, net_name = %s, durcnt arg = '%s'.\n"
+ "^7net_type = %s, net_name = %s, durcnt arg = '%s'."
),
notiftype,
notifname,
float var_default,
float var_cvar,
MSG typeId,
- string namestring)
+ string namestring,
+ int teamnum)
{
// =====================
// Global Entity Setup
notif.nent_enabled = (var_cvar >= 1);
notif.nent_type = typeId;
notif.nent_name = strzone(namestring);
+ notif.nent_teamnum = teamnum;
// Other pre-notif-setup requisites
notif_error = false;
LOG_INFOF(
(
"^1NOTIFICATION WITH IMPROPER TYPE: "
- "^7net_type = %d, net_name = %s.\n"
+ "^7net_type = %d, net_name = %s."
),
typeId,
namestring
}
}
+#define AnnouncerFilename(snd) sprintf("announcer/%s/%s.wav", AnnouncerOption(), snd)
+
void Create_Notification_Entity_Annce(entity notif,
float var_cvar,
string namestring,
{
if(notif.nent_enabled)
{
- precache_sound(sprintf("announcer/%s/%s.wav", AnnouncerOption(), snd));
+ precache_sound(AnnouncerFilename(snd));
notif.nent_channel = channel;
notif.nent_snd = strzone(snd);
notif.nent_vol = vol;
LOG_INFOF(
(
"^1NOTIFICATION WITH NO SOUND: "
- "^7net_type = %s, net_name = %s.\n"
+ "^7net_type = %s, net_name = %s."
),
typestring,
namestring
LOG_INFOF(
(
"^1NOTIFICATION HAS ARG COUNTS BUT NO ARGS OR HUDARGS OR DURCNT: "
- "^7net_type = %s, net_name = %s, strnum = %d, flnum = %d\n"
+ "^7net_type = %s, net_name = %s, strnum = %d, flnum = %d"
),
typestring,
namestring,
LOG_INFOF(
(
"^1NOTIFICATION HAS HUDARGS BUT NO ICON: "
- "^7net_type = %s, net_name = %s.\n"
+ "^7net_type = %s, net_name = %s."
),
typestring,
namestring
}
else if(icon != "")
{
- LOG_WARNINGF(
+ LOG_WARNF(
(
"^1NOTIFICATION HAS ICON BUT NO HUDARGS: "
"^7net_type = %s, net_name = %s.\n"
if (cpid == CPID_Null && durcnt != "0 0")
{
- LOG_WARNINGF(
+ LOG_WARNF(
(
"Notification has durcnt but no cpid: "
"net_type = %s, net_name = %s."
// ======================
// Process Notif String
// ======================
- #define SET_NOTIF_STRING(string,stringname) MACRO_BEGIN { \
+ #define SET_NOTIF_STRING(string,stringname) MACRO_BEGIN \
notif.nent_string = strzone(CCR( \
Process_Notif_Line( \
typeId, \
stringname \
)) \
); \
- } MACRO_END
+ MACRO_END
if(GENTLE)
{
LOG_INFOF(
(
"^1EMPTY NOTIFICATION: "
- "^7net_type = %s, net_name = %s.\n"
+ "^7net_type = %s, net_name = %s."
),
typestring,
namestring
LOG_INFOF(
(
"^1NOTIFICATION WITH NO SUBCALLS: "
- "^7net_type = %s, net_name = %s.\n"
+ "^7net_type = %s, net_name = %s."
),
typestring,
namestring
LOG_INFOF(
(
"^1NOTIFICATION IS MISSING CHOICE PARAMS: "
- "^7net_type = %s, net_name = %s.\n"
+ "^7net_type = %s, net_name = %s."
),
typestring,
namestring
FOREACH(Notifications, it.nent_type == MSG_CHOICE, {
GetCvars_handleFloat(
this,
+ CS(this),
get_cvars_s,
get_cvars_f,
msg_choice_choices[it.nent_choice_idx],
- sprintf("notification_%s", it.nent_name)
+ sprintf("notification_%s", Get_Notif_CvarName(it))
);
});
}
/** used to output notifications.cfg file */
void Dump_Notifications(int fh, bool alsoprint)
{
- #define NOTIF_WRITE(a) MACRO_BEGIN { \
+ #define NOTIF_WRITE(a) MACRO_BEGIN \
fputs(fh, a); \
if (alsoprint) LOG_INFO(a); \
- } MACRO_END
+ MACRO_END
- #define NOTIF_WRITE_ENTITY(e, description) MACRO_BEGIN { \
+ #define NOTIF_WRITE_ENTITY(e, description) MACRO_BEGIN \
string notif_msg = sprintf( \
"seta notification_%s \"%d\" \"%s\"\n", \
- e.nent_name, e.nent_default, description \
+ Get_Notif_CvarName(e), e.nent_default, description \
); \
NOTIF_WRITE(notif_msg); \
- } MACRO_END
+ MACRO_END
- #define NOTIF_WRITE_ENTITY_CHOICE(e, descriptiona, descriptionb) MACRO_BEGIN { \
+ #define NOTIF_WRITE_ENTITY_CHOICE(e, descriptiona, descriptionb) MACRO_BEGIN \
string notif_msg = sprintf( \
"seta notification_%s \"%d\" \"%s\"\n" \
"seta notification_%s_ALLOWED \"%d\" \"%s\"\n", \
- e.nent_name, e.nent_default, descriptiona, \
- e.nent_name, e.nent_challow_def, descriptionb \
+ Get_Notif_CvarName(e), e.nent_default, descriptiona, \
+ Get_Notif_CvarName(e), e.nent_challow_def, descriptionb \
); \
NOTIF_WRITE(notif_msg); \
- } MACRO_END
+ MACRO_END
- #define NOTIF_WRITE_HARDCODED(cvar, default, description) MACRO_BEGIN { \
+ #define NOTIF_WRITE_HARDCODED(cvar, default, description) MACRO_BEGIN \
string notif_msg = sprintf( \
"seta notification_%s \"%s\" \"%s\"\n", \
cvar, default, description \
); \
NOTIF_WRITE(notif_msg); \
- } MACRO_END
+ MACRO_END
// Note: This warning only applies to the notifications.cfg file that is output...
// You ARE supposed to manually edit this function to add i.e. hard coded
int NOTIF_ANNCE_COUNT = 0; FOREACH(Notifications, it.nent_type == MSG_ANNCE, { ++NOTIF_ANNCE_COUNT; });
NOTIF_WRITE(sprintf("\n// MSG_ANNCE notifications (count = %d):\n", NOTIF_ANNCE_COUNT));
- FOREACH(Notifications, it.nent_type == MSG_ANNCE, {
+ FOREACH(Notifications, it.nent_type == MSG_ANNCE && (!it.nent_teamnum || it.nent_teamnum == NUM_TEAM_1), {
NOTIF_WRITE_ENTITY(it,
"0 = disabled, 1 = enabled if gentle mode is off, 2 = always enabled"
);
int NOTIF_INFO_COUNT = 0; FOREACH(Notifications, it.nent_type == MSG_INFO, { ++NOTIF_INFO_COUNT; });
NOTIF_WRITE(sprintf("\n// MSG_INFO notifications (count = %d):\n", NOTIF_INFO_COUNT));
- FOREACH(Notifications, it.nent_type == MSG_INFO, {
+ FOREACH(Notifications, it.nent_type == MSG_INFO && (!it.nent_teamnum || it.nent_teamnum == NUM_TEAM_1), {
NOTIF_WRITE_ENTITY(it,
"0 = off, 1 = print to console, "
"2 = print to console and chatbox (if notification_allow_chatboxprint is enabled)"
int NOTIF_CENTER_COUNT = 0; FOREACH(Notifications, it.nent_type == MSG_CENTER, { ++NOTIF_CENTER_COUNT; });
NOTIF_WRITE(sprintf("\n// MSG_CENTER notifications (count = %d):\n", NOTIF_CENTER_COUNT));
- FOREACH(Notifications, it.nent_type == MSG_CENTER, {
+ FOREACH(Notifications, it.nent_type == MSG_CENTER && (!it.nent_teamnum || it.nent_teamnum == NUM_TEAM_1), {
NOTIF_WRITE_ENTITY(it,
"0 = off, 1 = centerprint"
);
int NOTIF_MULTI_COUNT = 0; FOREACH(Notifications, it.nent_type == MSG_MULTI, { ++NOTIF_MULTI_COUNT; });
NOTIF_WRITE(sprintf("\n// MSG_MULTI notifications (count = %d):\n", NOTIF_MULTI_COUNT));
- FOREACH(Notifications, it.nent_type == MSG_MULTI, {
+ FOREACH(Notifications, it.nent_type == MSG_MULTI && (!it.nent_teamnum || it.nent_teamnum == NUM_TEAM_1), {
NOTIF_WRITE_ENTITY(it,
"Enable this multiple notification"
);
int NOTIF_CHOICE_COUNT = 0; FOREACH(Notifications, it.nent_type == MSG_CHOICE, { ++NOTIF_CHOICE_COUNT; });
NOTIF_WRITE(sprintf("\n// MSG_CHOICE notifications (count = %d):\n", NOTIF_CHOICE_COUNT));
- FOREACH(Notifications, it.nent_type == MSG_CHOICE, {
+ FOREACH(Notifications, it.nent_type == MSG_CHOICE && (!it.nent_teamnum || it.nent_teamnum == NUM_TEAM_1), {
NOTIF_WRITE_ENTITY_CHOICE(it,
"Choice for this notification 0 = off, 1 = default message, 2 = verbose message",
"Allow choice for this notification 0 = off, 1 = only in warmup mode, 2 = always"
NOTIF_WRITE_HARDCODED(
"allow_chatboxprint", "1",
- "Allow INFO notifications to be printed to chat box"
+ "Allow INFO notifications to be printed to chat box "
"0 = do not allow, "
"1 = allow only if allowed by individual notification_INFO* cvars, "
"2 = force all INFO notifications to be printed to the chatbox"
}
#ifdef CSQC
-void Local_Notification_sound(
- int soundchannel, string soundfile,
- float soundvolume, float soundposition)
+void Local_Notification_sound(int soundchannel, string soundfile, float soundvolume, float soundposition)
{
if ((soundfile != prev_soundfile) || (time >= (prev_soundtime + autocvar_cl_announcer_antispam)))
{
Debug_Notification(sprintf(
"Local_Notification_sound(%f, '%s', %f, %f);\n",
soundchannel,
- sprintf(
- "announcer/%s/%s.wav",
- AnnouncerOption(),
- soundfile
- ),
+ AnnouncerFilename(soundfile),
soundvolume,
soundposition
));
#endif
- _sound(
- NULL,
- soundchannel,
- sprintf(
- "announcer/%s/%s.wav",
- AnnouncerOption(),
- soundfile
- ),
- soundvolume,
- soundposition
- );
+ _sound(NULL, soundchannel, AnnouncerFilename(soundfile), soundvolume, soundposition);
- if (prev_soundfile) strunzone(prev_soundfile);
- prev_soundfile = strzone(soundfile);
+ strcpy(prev_soundfile, soundfile);
prev_soundtime = time;
}
else
#ifdef NOTIFICATIONS_DEBUG
Debug_Notification(sprintf(
(
- "Local_Notification_sound(NULL, %f, '%s', %f, %f) "
+ "Local_Notification_sound(%f, '%s', %f, %f) "
"^1BLOCKED BY ANTISPAM:^7 prevsnd: '%s', timediff: %f, limit: %f\n"
- ),
- soundchannel,
- sprintf(
- "announcer/%s/%s.wav",
- AnnouncerOption(),
- soundfile
),
+ soundchannel,
+ AnnouncerFilename(soundfile),
soundvolume,
soundposition,
prev_soundfile,
Get_Notif_TypeName(net_type)
));
#endif
- LOG_WARNINGF("Incorrect usage of Local_Notification: %s\n", "Null notification");
+ LOG_WARNF("Incorrect usage of Local_Notification: %s", "Null notification");
return;
}
return;
}
- string s1 = ((notif.nent_stringcount > 0) ? ...(0, string) : "");
- string s2 = ((notif.nent_stringcount > 1) ? ...(1, string) : "");
- string s3 = ((notif.nent_stringcount > 2) ? ...(2, string) : "");
- string s4 = ((notif.nent_stringcount > 3) ? ...(3, string) : "");
+ string s1 = CCR((notif.nent_stringcount > 0) ? ...(0, string) : "");
+ string s2 = CCR((notif.nent_stringcount > 1) ? ...(1, string) : "");
+ string s3 = CCR((notif.nent_stringcount > 2) ? ...(2, string) : "");
+ string s4 = CCR((notif.nent_stringcount > 3) ? ...(3, string) : "");
float f1 = ((notif.nent_floatcount > 0) ? ...((notif.nent_stringcount + 0), float) : 0);
float f2 = ((notif.nent_floatcount > 1) ? ...((notif.nent_stringcount + 1), float) : 0);
float f3 = ((notif.nent_floatcount > 2) ? ...((notif.nent_stringcount + 2), float) : 0);
case MSG_ANNCE:
{
#ifdef CSQC
- Local_Notification_sound(
- notif.nent_channel,
- notif.nent_snd,
- notif.nent_vol,
- notif.nent_position
- );
+ Local_Notification_sound(notif.nent_channel, notif.nent_snd, notif.nent_vol, notif.nent_position);
#else
backtrace("MSG_ANNCE on server?... Please notify Samual immediately!\n");
#endif
{
entity found_choice = notif.nent_optiona;
if (notif.nent_challow_var && (warmup_stage || (notif.nent_challow_var == 2))) {
- switch (cvar(sprintf("notification_%s", notif.nent_name)))
+ switch (cvar(sprintf("notification_%s", Get_Notif_CvarName(notif))))
{
case 1: break;
case 2: found_choice = notif.nent_optionb; break;
this.owner.nent_name
));
#endif
- for (int i = 0; i < this.nent_stringcount; ++i) { if (this.nent_strings[i]) strunzone(this.nent_strings[i]); }
- remove(this);
+ for (int i = 0; i < this.nent_stringcount; ++i) { strfree(this.nent_strings[i]); }
+ delete(this);
}
bool Net_Write_Notification(entity this, entity client, int sf)
#endif
string checkargs = Notification_CheckArgs(broadcast, client);
- if (checkargs != "") { LOG_WARNINGF("Incorrect usage of Kill_Notification: %s", checkargs); return; }
+ if (checkargs != "") { LOG_WARNF("Incorrect usage of Kill_Notification: %s", checkargs); return; }
entity net_notif = new_pure(net_kill_notification);
net_notif.nent_broadcast = broadcast;
net_notif.nent_net_name = ORDINAL(net_cpid);
Net_LinkEntity(net_notif, false, autocvar_notification_lifetime_runtime, Net_Write_Notification);
- FOREACH_ENTITY_CLASS(
- "net_notification",
+ IL_EACH(g_notifications,
(it.owner.nent_type == net_type || net_type == MSG_Null) && (it.owner.nent_cpid == net_cpid || net_cpid == CPID_Null),
{
it.nent_net_name = -1;
if (!notif)
{
- LOG_WARNING("Send_Notification: Could not find notification entity!");
+ LOG_WARN("Send_Notification: Could not find notification entity!");
return;
}
if (!net_name) { checkargs = sprintf("No notification provided! %s", checkargs); }
if (checkargs != "")
{
- LOG_WARNINGF("Incorrect usage of Send_Notification: %s", checkargs);
+ LOG_WARNF("Incorrect usage of Send_Notification: %s", checkargs);
return;
}
if ((notif.nent_stringcount + notif.nent_floatcount) != count)
{
- LOG_WARNINGF(
+ LOG_WARNF(
"Argument mismatch for Send_Notification(%s, ...)! "
"stringcount(%d) + floatcount(%d) != count(%d)\n"
"Check the definition and function call for accuracy...?\n",
return;
}
- if (
- server_is_dedicated
- &&
- (
- broadcast == NOTIF_ALL
- ||
- broadcast == NOTIF_ALL_EXCEPT
- )
- &&
- !(
- net_type == MSG_ANNCE
- ||
- net_type == MSG_CENTER
- )
+ if (server_is_dedicated
+ && (broadcast == NOTIF_ALL || broadcast == NOTIF_ALL_EXCEPT)
+ && !(net_type == MSG_ANNCE || net_type == MSG_CENTER)
)
{
Local_Notification_WOVA(
// 2. Manually handling each separate call on per-usage basis (See old CTF usage of verbose)
entity found_choice;
- #define RECURSE_FROM_CHOICE(ent,action) MACRO_BEGIN { \
+ #define RECURSE_FROM_CHOICE(ent,action) MACRO_BEGIN \
if (notif.nent_challow_var && (warmup_stage || (notif.nent_challow_var == 2))) { \
- switch (ent.msg_choice_choices[net_name.nent_choice_idx]) \
+ switch (CS(ent).msg_choice_choices[net_name.nent_choice_idx]) \
{ \
case 1: found_choice = notif.nent_optiona; break; \
case 2: found_choice = notif.nent_optionb; break; \
found_choice.nent_floatcount, \
s1, s2, s3, s4, \
f1, f2, f3, f4); \
- } MACRO_END
+ MACRO_END
switch (broadcast)
{
else
{
entity net_notif = new_pure(net_notification);
+ IL_PUSH(g_notifications, net_notif);
net_notif.owner = notif;
net_notif.nent_broadcast = broadcast;
net_notif.nent_client = client;