// sucks less than the old one
cl_decals_newsystem 1
-seta cl_cubemaps_extra 1
-
set sv_q3acompat_machineshotgunswap 0 "shorthand for swapping machinegun and shotgun (for Q3A map compatibility in mapinfo files)"
set g_movement_highspeed 1 "movement speed modification factor (only changes movement when above maxspeed)"
airfriction 5
liquidfriction 5
-effect arc_beam // beam core
- type beam
- countabsolute 1
- tex 200 200
- color 0xFFFFFF 0xFFFFFF
- size 4 4
- alpha 512 512 0
- time 0.005 0.005
-
effect arc_beam // sparks on beam
type spark
stretchfactor 1
cl_damageeffect 1
cl_spawn_point_particles 1
cl_playerdetailreduction 4.0
-cl_cubemaps_extra 1
gl_flashblend 0
gl_picmip -1
mod_q3bsp_nolightmaps 0
cl_damageeffect 0
cl_spawn_point_particles 0
cl_playerdetailreduction 4
-cl_cubemaps_extra 0
gl_flashblend 1
gl_picmip 1
mod_q3bsp_nolightmaps 1
cl_damageeffect 0
cl_spawn_point_particles 0
cl_playerdetailreduction 4
-cl_cubemaps_extra 0
gl_flashblend 0
gl_picmip 0
mod_q3bsp_nolightmaps 0
cl_damageeffect 1
cl_spawn_point_particles 1
cl_playerdetailreduction 4
-cl_cubemaps_extra 0
gl_flashblend 0
gl_picmip 0
mod_q3bsp_nolightmaps 0
cl_damageeffect 0
cl_spawn_point_particles 0
cl_playerdetailreduction 4
-cl_cubemaps_extra 0
gl_flashblend 1
gl_picmip 1337
mod_q3bsp_nolightmaps 1
cl_damageeffect 2
cl_spawn_point_particles 1
cl_playerdetailreduction 0
-cl_cubemaps_extra 1
gl_flashblend 0
gl_picmip -1
mod_q3bsp_nolightmaps 0
cl_damageeffect 2
cl_spawn_point_particles 1
cl_playerdetailreduction 0
-cl_cubemaps_extra 1
gl_flashblend 0
gl_picmip -1
mod_q3bsp_nolightmaps 0
#define MSG_INFO_NOTIFICATIONS \
MSG_INFO_NOTIF(2, INFO_CHAT_NOSPECTATORS, 0, 0, "", "", "", _("^F4NOTE: ^BGSpectator chat is not sent to players during the match"), "") \
+ MSG_INFO_NOTIF(2, INFO_COINTOSS, 1, 0, "s1", "", "", _("^F2Throwing coin... Result: %s^F2!"), "") \
+ MSG_INFO_NOTIF(1, INFO_JETPACK_NOFUEL, 0, 0, "", "", "", _("^BGYou don't have any fuel for the ^F1Jetpack"), "") \
+ MSG_INFO_NOTIF(2, INFO_SUPERSPEC_MISSING_UID, 0, 0, "", "", "", _("^F2You lack a UID, superspec options will not be saved/restored"), "") \
+ MSG_INFO_NOTIF(1, INFO_CA_JOIN_LATE, 0, 0, "", "", "", _("^F1Round already started, you will join the game in the next round"), "") \
+ MSG_INFO_NOTIF(1, INFO_CA_LEAVE, 0, 0, "", "", "", _("^F2You will spectate in the next round"), "") \
MULTITEAM_INFO(1, INFO_CTF_CAPTURE_, 2, 1, 0, "s1", "s1", "notify_%s_captured", _("^BG%s^BG captured the ^TC^TT^BG flag"), "") \
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"), "") \
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"), "") \
MSG_INFO_NOTIF(1, INFO_DEATH_SELF_VH_WAKI_ROCKET, 2, 1, "s1 s2loc spree_lost", "s1", "notify_death", _("^BG%s^K1 couldn't find shelter from a Racer rocket%s%s"), "") \
MSG_INFO_NOTIF(1, INFO_DEATH_SELF_VOID, 2, 1, "s1 s2loc spree_lost", "s1", "notify_void", _("^BG%s^K1 was in the wrong place%s%s"), "") \
MULTITEAM_INFO(1, INFO_DEATH_TEAMKILL_, 4, 3, 1, "s1 s2 s3loc spree_end", "s2 s1", "notify_teamkill_%s", _("^BG%s^K1 was betrayed by ^BG%s^K1%s%s"), "") \
- MSG_INFO_NOTIF(1, INFO_CA_JOIN_LATE, 0, 0, "", "", "", _("^F1Round already started, you will join the game in the next round"), "") \
- MSG_INFO_NOTIF(1, INFO_CA_LEAVE, 0, 0, "", "", "", _("^F2You will spectate in the next round"), "") \
MSG_INFO_NOTIF(1, INFO_DOMINATION_CAPTURE_TIME, 2, 2, "s1 s2 f1 f2", "", "", _("^BG%s^BG%s^BG (%s points every %s seconds)"), "") \
MSG_INFO_NOTIF(1, INFO_FREEZETAG_FREEZE, 2, 0, "s1 s2", "", "", _("^BG%s^K1 was frozen by ^BG%s"), "") \
MSG_INFO_NOTIF(1, INFO_FREEZETAG_REVIVED, 2, 0, "s1 s2", "", "", _("^BG%s^K3 was revived by ^BG%s"), "") \
MSG_INFO_NOTIF(1, INFO_WEAPON_KLEINBOTTLE_SUICIDE, 2, 1, "s1 s2loc spree_lost", "s1", "weapontuba", _("^BG%s^K1 hurt their own ears with the @!#%%'n Klein Bottle%s%s"), "") \
MSG_INFO_NOTIF(1, INFO_WEAPON_MACHINEGUN_MURDER_SNIPE, 3, 2, "spree_inf s1 s2 s3loc spree_end", "s2 s1", "weaponuzi", _("^BG%s%s^K1 was sniped by ^BG%s^K1's Machine Gun%s%s"), "") \
MSG_INFO_NOTIF(1, INFO_WEAPON_MACHINEGUN_MURDER_SPRAY, 3, 2, "spree_inf s1 s2 s3loc spree_end", "s2 s1", "weaponuzi", _("^BG%s%s^K1 was riddled full of holes by ^BG%s^K1's Machine Gun%s%s"), "") \
+ MSG_INFO_NOTIF(1, INFO_WEAPON_MINELAYER_LIMIT, 0, 1, "f1", "", "", _("^BGYou cannot place more than ^F2%s^BG mines at a time"), "") \
MSG_INFO_NOTIF(1, INFO_WEAPON_MINELAYER_MURDER, 3, 2, "spree_inf s1 s2 s3loc spree_end", "s2 s1", "weaponminelayer", _("^BG%s%s^K1 got too close to ^BG%s^K1's mine%s%s"), "") \
MSG_INFO_NOTIF(1, INFO_WEAPON_MINELAYER_SUICIDE, 2, 1, "s1 s2loc spree_lost", "s1", "weaponminelayer", _("^BG%s^K1 forgot about their mine%s%s"), "") \
MSG_INFO_NOTIF(1, INFO_WEAPON_MORTAR_MURDER_BOUNCE, 3, 2, "spree_inf s1 s2 s3loc spree_end", "s2 s1", "weapongrenadelauncher", _("^BG%s%s^K1 got too close to ^BG%s^K1's Mortar grenade%s%s"), "") \
MSG_CENTER_NOTIF(1, CENTER_ROUND_TIED, 0, 0, "", CPID_ROUND, "0 0", _("^BGRound tied"), "") \
MSG_CENTER_NOTIF(1, CENTER_ROUND_OVER, 0, 0, "", CPID_ROUND, "0 0", _("^BGRound over, there's no winner"), "") \
MSG_CENTER_NOTIF(1, CENTER_CAMPCHECK, 0, 0, "", CPID_CAMPCHECK, "0 0", _("^F2Don't camp!"), "") \
+ MSG_CENTER_NOTIF(1, CENTER_COINTOSS, 1, 0, "s1", NO_CPID, "0 0", _("^F2Throwing coin... Result: %s^F2!"), "") \
MSG_CENTER_NOTIF(1, CENTER_CTF_CAPTURESHIELD_FREE, 0, 0, "", CPID_CTF_CAPSHIELD, "0 0", _("^BGYou are now free.\n^BGFeel free to ^F2try to capture^BG the flag again\n^BGif you think you will succeed."), "") \
MSG_CENTER_NOTIF(1, CENTER_CTF_CAPTURESHIELD_SHIELDED, 0, 0, "", CPID_CTF_CAPSHIELD, "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."), "") \
MULTITEAM_CENTER(1, CENTER_CTF_CAPTURE_, 2, 0, 0, "", CPID_CTF_LOWPRIO, "0 0", _("^BGYou captured the ^TC^TT^BG flag!"), "") \
MSG_CENTER_NOTIF(1, CENTER_KEYHUNT_SCAN, 0, 1, "", CPID_KEYHUNT_OTHER, "f1 0", _("^BGScanning frequency range..."), "") \
MULTITEAM_CENTER(1, CENTER_KEYHUNT_START_, 4, 0, 0, "", CPID_KEYHUNT, "0 0", _("^BGYou are starting with the ^TC^TT Key"), "") \
MSG_CENTER_NOTIF(1, CENTER_KEYHUNT_WAIT, 0, 1, "missing_teams", CPID_KEYHUNT_OTHER, "0 0", _("^BGWaiting for players to join...\nNeed active players for: %s"), "") \
+ MSG_CENTER_NOTIF(1, CENTER_LMS_NOLIVES, 0, 0, "", CPID_LMS, "0 0", _("^BGYou have no lives left, you must wait until the next match"), "") \
MSG_CENTER_NOTIF(1, CENTER_MISSING_TEAMS, 0, 1, "missing_teams", CPID_MISSING_TEAMS, "-1 0", _("^BGWaiting for players to join...\nNeed active players for: %s"), "") \
MSG_CENTER_NOTIF(1, CENTER_MISSING_PLAYERS, 0, 1, "f1", CPID_MISSING_PLAYERS, "-1 0", _("^BGWaiting for %s player(s) to join..."), "") \
MSG_CENTER_NOTIF(1, CENTER_INSTAGIB_FINDAMMO, 0, 0, "", CPID_INSTAGIB_FINDAMMO,"1 9", _("^F4^COUNT^BG left to find some ammo!"), "") \
MSG_CENTER_NOTIF(1, CENTER_NIX_COUNTDOWN, 0, 2, "item_wepname", CPID_NIX, "1 f2", _("^F2^COUNT^BG until weapon change...\nNext weapon: ^F1%s"), "") \
MSG_CENTER_NOTIF(1, CENTER_NIX_NEWWEAPON, 0, 1, "item_wepname", CPID_NIX, "0 0", _("^F2Active weapon: ^F1%s"), "") \
MSG_CENTER_NOTIF(1, CENTER_NADE, 0, 0, "", NO_CPID, "0 0", _("^BGPress ^F2DROPWEAPON^BG again to toss the grenade!"), "") \
+ MSG_CENTER_NOTIF(1, CENTER_ONS_NOTSHIELDED, 0, 0, "", CPID_ONSLAUGHT, "0 0", _("^K1Your generator is NOT shielded!\n^BGRe-capture controlpoints to shield it!"), "") \
MSG_CENTER_NOTIF(1, CENTER_OVERTIME_FRAG, 0, 0, "", CPID_OVERTIME, "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_OVERTIME_CONTROLPOINT, 0, 0, "", CPID_OVERTIME, "5 0", _("^F2Now playing ^F4OVERTIME^F2!\n\nGenerators are now decaying.\nThe more control points your team holds,\nthe faster the enemy generator decays"), "") \
MSG_CENTER_NOTIF(1, CENTER_OVERTIME_TIME, 0, 1, "f1time", CPID_OVERTIME, "0 0", _("^F2Now playing ^F4OVERTIME^F2!\n^BGAdded ^F4%s^BG to the game!"), "") \
+ MSG_CENTER_NOTIF(1, CENTER_PORTO_CREATED_IN, 0, 0, "", NO_CPID, "0 0", _("^K1In^BG-portal created"), "") \
+ MSG_CENTER_NOTIF(1, CENTER_PORTO_CREATED_OUT, 0, 0, "", NO_CPID, "0 0", _("^F3Out^BG-portal created"), "") \
+ MSG_CENTER_NOTIF(1, CENTER_PORTO_FAILED, 0, 0, "", NO_CPID, "0 0", _("^K1Portal deployment failed.\n\n^F2Catch it to try again!"), "") \
MSG_CENTER_NOTIF(1, CENTER_POWERDOWN_INVISIBILITY, 0, 0, "", CPID_POWERUP, "0 0", _("^F2Invisibility has worn off"), "") \
MSG_CENTER_NOTIF(1, CENTER_POWERDOWN_SHIELD, 0, 0, "", CPID_POWERUP, "0 0", _("^F2Shield has worn off"), "") \
MSG_CENTER_NOTIF(1, CENTER_POWERDOWN_SPEED, 0, 0, "", CPID_POWERUP, "0 0", _("^F2Speed has worn off"), "") \
MSG_CENTER_NOTIF(1, CENTER_TEAMCHANGE_SPECTATE, 0, 1, "", CPID_TEAMCHANGE, "1 f1", _("^K1Spectating in ^COUNT"), "") \
MSG_CENTER_NOTIF(1, CENTER_TEAMCHANGE_SUICIDE, 0, 1, "", CPID_TEAMCHANGE, "1 f1", _("^K1Suicide in ^COUNT"), "") \
MSG_CENTER_NOTIF(1, CENTER_TIMEOUT_BEGINNING, 0, 1, "", CPID_TIMEOUT, "1 f1", _("^F4Timeout begins in ^COUNT"), "") \
- MSG_CENTER_NOTIF(1, CENTER_TIMEOUT_ENDING, 0, 1, "", CPID_TIMEOUT, "1 f1", _("^F4Timeout ends in ^COUNT"), "")
+ MSG_CENTER_NOTIF(1, CENTER_TIMEOUT_ENDING, 0, 1, "", CPID_TIMEOUT, "1 f1", _("^F4Timeout ends in ^COUNT"), "") \
+ MSG_CENTER_NOTIF(1, CENTER_WEAPON_MINELAYER_LIMIT, 0, 1, "f1", NO_CPID, "0 0", _("^BGYou cannot place more than ^F2%s^BG mines at a time"), "")
#define MULTITEAM_MULTI2(default,prefix,anncepre,infopre,centerpre) \
MSG_MULTI_NOTIF(default, prefix##RED, anncepre##RED, infopre##RED, centerpre##RED) \
MSG_MULTI_NOTIF(1, ITEM_WEAPON_NOAMMO, NO_MSG, INFO_ITEM_WEAPON_NOAMMO, CENTER_ITEM_WEAPON_NOAMMO) \
MSG_MULTI_NOTIF(1, ITEM_WEAPON_PRIMORSEC, NO_MSG, INFO_ITEM_WEAPON_PRIMORSEC, CENTER_ITEM_WEAPON_PRIMORSEC) \
MSG_MULTI_NOTIF(1, ITEM_WEAPON_UNAVAILABLE, NO_MSG, INFO_ITEM_WEAPON_UNAVAILABLE, CENTER_ITEM_WEAPON_UNAVAILABLE) \
+ MSG_MULTI_NOTIF(1, MULTI_COINTOSS, NO_MSG, INFO_COINTOSS, CENTER_COINTOSS) \
MSG_MULTI_NOTIF(1, MULTI_COUNTDOWN_BEGIN, ANNCE_BEGIN, NO_MSG, CENTER_COUNTDOWN_BEGIN) \
MSG_MULTI_NOTIF(1, MULTI_INSTAGIB_FINDAMMO, ANNCE_NUM_10, NO_MSG, CENTER_INSTAGIB_FINDAMMO_FIRST) \
MSG_MULTI_NOTIF(1, WEAPON_ACCORDEON_MURDER, NO_MSG, INFO_WEAPON_ACCORDEON_MURDER, NO_MSG) \
MSG_MULTI_NOTIF(1, WEAPON_KLEINBOTTLE_SUICIDE, NO_MSG, INFO_WEAPON_KLEINBOTTLE_SUICIDE, CENTER_DEATH_SELF_GENERIC) \
MSG_MULTI_NOTIF(1, WEAPON_MACHINEGUN_MURDER_SNIPE, NO_MSG, INFO_WEAPON_MACHINEGUN_MURDER_SNIPE, NO_MSG) \
MSG_MULTI_NOTIF(1, WEAPON_MACHINEGUN_MURDER_SPRAY, NO_MSG, INFO_WEAPON_MACHINEGUN_MURDER_SPRAY, NO_MSG) \
+ MSG_MULTI_NOTIF(1, WEAPON_MINELAYER_LIMIT, NO_MSG, INFO_WEAPON_MINELAYER_LIMIT, CENTER_WEAPON_MINELAYER_LIMIT) \
MSG_MULTI_NOTIF(1, WEAPON_MINELAYER_MURDER, NO_MSG, INFO_WEAPON_MINELAYER_MURDER, NO_MSG) \
MSG_MULTI_NOTIF(1, WEAPON_MINELAYER_SUICIDE, NO_MSG, INFO_WEAPON_MINELAYER_SUICIDE, CENTER_DEATH_SELF_GENERIC) \
MSG_MULTI_NOTIF(1, WEAPON_MORTAR_MURDER_BOUNCE, NO_MSG, INFO_WEAPON_MORTAR_MURDER_BOUNCE, NO_MSG) \
{
pointparticles( particleeffectnum("arc_overheat"),
self.beam_start, self.beam_wantdir, 1 );
- sound(self, CH_WEAPON_A, "weapons/strength_fire.wav", VOL_BASE, ATTN_NORM);
+ sound(self, CH_WEAPON_A, "weapons/arc_stop.wav", VOL_BASE, ATTN_NORM);
}
}
// only play fire sound if 1 sec has passed since player let go the fire button
if(time - self.beam_prev > 1)
{
- sound(self, CH_WEAPON_A, "weapons/lgbeam_fire.wav", VOL_BASE, ATTN_NORM);
+ sound(self, CH_WEAPON_A, "weapons/arc_fire.wav", VOL_BASE, ATTN_NORM);
}
entity beam = self.arc_beam = spawn();
if ( !self.arc_smoke_sound )
{
self.arc_smoke_sound = 1;
- sound(self, CH_SHOTS_SINGLE, "weapons/gauntletbeam_fly.wav", VOL_BASE, ATTN_NORM);
+ sound(self, CH_SHOTS_SINGLE, "weapons/arc_loop_overheat.wav", VOL_BASE, ATTN_NORM);
}
}
}
if(self.arc_BUTTON_ATCK_prev != 0)
{
+ sound(self, CH_WEAPON_A, "weapons/arc_stop.wav", VOL_BASE, ATTN_NORM);
weapon_thinkf(WFRAME_FIRE1, WEP_CVAR(arc, beam_animtime), w_ready);
ATTACK_FINISHED(self) = time + WEP_CVAR(arc, beam_refire) * W_WeaponRateFactor();
}
precache_model("models/weapons/g_arc.md3");
precache_model("models/weapons/v_arc.md3");
precache_model("models/weapons/h_arc.iqm");
- precache_sound("weapons/lgbeam_fire.wav");
- precache_sound("weapons/gauntletbeam_fly.wav");
- precache_sound("weapons/strength_fire.wav");
+ precache_sound("weapons/arc_fire.wav");
+ precache_sound("weapons/arc_loop.wav");
+ precache_sound("weapons/arc_stop.wav");
+ precache_sound("weapons/arc_loop_overheat.wav");
if(!arc_shotorigin[0])
{
arc_shotorigin[0] = shotorg_adjust_values(CL_Weapon_GetShotOrg(WEP_ARC), FALSE, FALSE, 1);
self.draw = Draw_ArcBeam;
self.entremove = Remove_ArcBeam;
self.move_time = time;
- loopsound(self, CH_SHOTS_SINGLE, "weapons/lgbeam_fly.wav", VOL_BASE, ATTEN_NORM);
+ loopsound(self, CH_SHOTS_SINGLE, "weapons/arc_loop.wav", VOL_BASE, ATTEN_NORM);
flash = spawn();
flash.owner = self;
{
case ARC_BT_MISS:
{
- self.beam_color = '-1 -1 1';
+ self.beam_color = '1 1 1';
self.beam_alpha = 0.5;
self.beam_thickness = 8;
self.beam_traileffect = particleeffectnum("arc_beam");
self.beam_muzzlelight[3] = 1;
if(self.beam_muzzleeffect >= 0)
{
- self.beam_image = "particles/lgbeam";
setmodel(flash, "models/flash.md3");
flash.alpha = self.beam_alpha;
flash.colormod = self.beam_color;
}
case ARC_BT_WALL: // grenadelauncher_muzzleflash healray_muzzleflash
{
- self.beam_color = '0.5 0.5 1';
+ self.beam_color = '1 1 1';
self.beam_alpha = 0.5;
self.beam_thickness = 8;
self.beam_traileffect = particleeffectnum("arc_beam");
}
case ARC_BT_HEAL:
{
- self.beam_color = '0 1 0';
+ self.beam_color = '1 1 1';
self.beam_alpha = 0.5;
self.beam_thickness = 8;
self.beam_traileffect = particleeffectnum("arc_beam_heal");
self.beam_image = "particles/lgbeam";
if(self.beam_muzzleeffect >= 0)
{
- self.beam_image = "particles/lgbeam";
setmodel(flash, "models/flash.md3");
flash.alpha = self.beam_alpha;
flash.colormod = self.beam_color;
}
case ARC_BT_HIT:
{
- self.beam_color = '1 0 1';
+ self.beam_color = '1 1 1';
self.beam_alpha = 0.5;
self.beam_thickness = 8;
self.beam_traileffect = particleeffectnum("arc_beam");
self.beam_image = "particles/lgbeam";
if(self.beam_muzzleeffect >= 0)
{
- self.beam_image = "particles/lgbeam";
setmodel(flash, "models/flash.md3");
flash.alpha = self.beam_alpha;
flash.colormod = self.beam_color;
}
case ARC_BT_BURST_MISS:
{
- self.beam_color = '-1 -1 1';
+ self.beam_color = '1 1 1';
self.beam_alpha = 0.5;
self.beam_thickness = 14;
self.beam_traileffect = particleeffectnum("arc_beam");
self.beam_muzzlelight[2] = 1;
self.beam_muzzlelight[3] = 1;
self.beam_image = "particles/lgbeam";
- setmodel(flash, "models/flash.md3");
- flash.alpha = self.beam_alpha;
- flash.colormod = self.beam_color;
- flash.scale = 0.5;
+ if(self.beam_muzzleeffect >= 0)
+ {
+ setmodel(flash, "models/flash.md3");
+ flash.alpha = self.beam_alpha;
+ flash.colormod = self.beam_color;
+ flash.scale = 0.5;
+ }
break;
}
case ARC_BT_BURST_WALL:
{
- self.beam_color = '0.5 0.5 1';
+ self.beam_color = '1 1 1';
self.beam_alpha = 0.5;
self.beam_thickness = 14;
self.beam_traileffect = particleeffectnum("arc_beam");
self.beam_image = "particles/lgbeam";
if(self.beam_muzzleeffect >= 0)
{
- self.beam_image = "particles/lgbeam";
setmodel(flash, "models/flash.md3");
flash.alpha = self.beam_alpha;
flash.colormod = self.beam_color;
}
case ARC_BT_BURST_HEAL:
{
- self.beam_color = '0 1 0';
+ self.beam_color = '1 1 1';
self.beam_alpha = 0.5;
self.beam_thickness = 14;
self.beam_traileffect = particleeffectnum("arc_beam_heal");
self.beam_image = "particles/lgbeam";
if(self.beam_muzzleeffect >= 0)
{
- self.beam_image = "particles/lgbeam";
setmodel(flash, "models/flash.md3");
flash.alpha = self.beam_alpha;
flash.colormod = self.beam_color;
}
case ARC_BT_BURST_HIT:
{
- self.beam_color = '1 0 1';
+ self.beam_color = '1 1 1';
self.beam_alpha = 0.5;
self.beam_thickness = 14;
self.beam_traileffect = particleeffectnum("arc_beam");
self.beam_image = "particles/lgbeam";
if(self.beam_muzzleeffect >= 0)
{
- self.beam_image = "particles/lgbeam";
setmodel(flash, "models/flash.md3");
flash.alpha = self.beam_alpha;
flash.colormod = self.beam_color;
self.beam_image = "particles/lgbeam";
if(self.beam_muzzleeffect >= 0)
{
- self.beam_image = "particles/lgbeam";
setmodel(flash, "models/flash.md3");
flash.alpha = self.beam_alpha;
flash.colormod = self.beam_color;
}
case WR_INIT:
{
- precache_sound("weapons/lgbeam_fly.wav");
+ precache_sound("weapons/arc_loop.wav");
return TRUE;
}
case WR_ZOOMRETICLE:
if(self.minelayer_mines >= WEP_CVAR(minelayer, limit))
{
// the refire delay keeps this message from being spammed
- sprint(self, strcat("minelayer: You cannot place more than ^2", ftos(WEP_CVAR(minelayer, limit)), " ^7mines at a time\n") );
+ Send_Notification(NOTIF_ONE, self, MSG_MULTI, WEAPON_MINELAYER_LIMIT, WEP_CVAR(minelayer, limit));
play2(self, "weapons/unavailable.wav");
return;
}
if(vlen(trace_endpos - self.realowner.origin) < 128)
{
W_ThrowNewWeapon(self.realowner, WEP_PORTO, 0, self.origin, self.velocity);
- centerprint(self.realowner, "^1Portal deployment failed.\n\n^2Catch it to try again!");
+ Send_Notification(NOTIF_ONE, self.realowner, MSG_CENTER, CENTER_PORTO_FAILED);
}
}
}
{
sound(self, CH_SHOTS, "porto/create.wav", VOL_BASE, ATTEN_NORM);
trace_plane_normal = norm;
- centerprint(self.realowner, "^1In^7-portal created.");
+ Send_Notification(NOTIF_ONE, self.realowner, MSG_CENTER, CENTER_PORTO_CREATED_IN);
W_Porto_Success();
}
else
{
sound(self, CH_SHOTS, "porto/create.wav", VOL_BASE, ATTEN_NORM);
trace_plane_normal = norm;
- centerprint(self.realowner, "^4Out^7-portal created.");
+ Send_Notification(NOTIF_ONE, self.realowner, MSG_CENTER, CENTER_PORTO_CREATED_OUT);
W_Porto_Success();
}
else
{
sound(self, CH_SHOTS, "porto/create.wav", VOL_BASE, ATTEN_NORM);
trace_plane_normal = norm;
- centerprint(self.realowner, "^1In^7-portal created.");
+ Send_Notification(NOTIF_ONE, self.realowner, MSG_CENTER, CENTER_PORTO_CREATED_IN);
self.right_vector = self.right_vector - 2 * trace_plane_normal * (self.right_vector * norm);
self.angles = vectoangles(self.velocity - 2 * trace_plane_normal * (self.velocity * norm));
CSQCProjectile(self, TRUE, PROJECTILE_PORTO_BLUE, TRUE); // change type
{
sound(self, CH_SHOTS, "porto/create.wav", VOL_BASE, ATTEN_NORM);
trace_plane_normal = norm;
- centerprint(self.realowner, "^4Out^7-portal created.");
+ Send_Notification(NOTIF_ONE, self.realowner, MSG_CENTER, CENTER_PORTO_CREATED_OUT);
W_Porto_Success();
}
else
s = strcat(s, ", ", _("Blood loss"));
if(cvar("g_jetpack"))
s = strcat(s, ", ", _("Jet pack"));
+ if(cvar("g_buffs"))
+ s = strcat(s, ", ", _("Buffs"));
if(cvar("g_overkill"))
s = strcat(s, ", ", _("Overkill"));
if(cvar("g_powerups") == 0)
me.TR(me);
me.TDempty(me, 0.2);
me.TD(me, 1, 1.8, e = makeXonoticCheckBox(0, "g_cloaked", _("Cloaked")));
+ me.TR(me);
+ me.TDempty(me, 0.2);
+ me.TD(me, 1, 1.8, e = makeXonoticCheckBox(0, "g_buffs", _("Buffs")));
me.TR(me);
me.TDempty(me, 0.2);
me.TD(me, 1, 1.8, e = makeXonoticCheckBox(0, "g_midair", _("Midair")));
ATTRIB(XonoticSettingsDialog, title, string, _("Settings"))
ATTRIB(XonoticSettingsDialog, color, vector, SKINCOLOR_DIALOG_SETTINGS)
ATTRIB(XonoticSettingsDialog, intendedWidth, float, 0.96)
- ATTRIB(XonoticSettingsDialog, rows, float, 17)
+ ATTRIB(XonoticSettingsDialog, rows, float, 18)
ATTRIB(XonoticSettingsDialog, columns, float, 6)
ENDCLASS(XonoticSettingsDialog)
#endif
METHOD(XonoticAudioSettingsTab, fill, void(entity))
ATTRIB(XonoticAudioSettingsTab, title, string, _("Audio"))
ATTRIB(XonoticAudioSettingsTab, intendedWidth, float, 0.9)
- ATTRIB(XonoticAudioSettingsTab, rows, float, 14.5)
+ ATTRIB(XonoticAudioSettingsTab, rows, float, 15.5)
ATTRIB(XonoticAudioSettingsTab, columns, float, 6.2) // added extra .2 for center space
ENDCLASS(XonoticAudioSettingsTab)
entity makeXonoticAudioSettingsTab();
METHOD(XonoticEffectsSettingsTab, fill, void(entity))
ATTRIB(XonoticEffectsSettingsTab, title, string, _("Effects"))
ATTRIB(XonoticEffectsSettingsTab, intendedWidth, float, 0.9)
- ATTRIB(XonoticEffectsSettingsTab, rows, float, 14.5)
+ ATTRIB(XonoticEffectsSettingsTab, rows, float, 15.5)
ATTRIB(XonoticEffectsSettingsTab, columns, float, 6.2) // added extra .2 for center space
ENDCLASS(XonoticEffectsSettingsTab)
entity makeXonoticEffectsSettingsTab();
e.configureXonoticTextSliderValues(e);
setDependentAND(e, "vid_gl20", 1, 1, "r_water", 1, 1);
me.TR(me);
- me.TD(me, 1, 1, e = makeXonoticCheckBox(0, "cl_particles", _("Particles")));
- me.TD(me, 1, 2, e = makeXonoticCheckBox(0, "cl_spawn_point_particles", _("Spawnpoint effects")));
- makeMulti(e, "cl_spawn_event_particles");
- setDependent(e, "cl_particles", 1, 1);
+ me.TD(me, 1, 1, e = makeXonoticCheckBox(0, "cl_decals", _("Decals")));
+ me.TD(me, 1, 2, e = makeXonoticCheckBox(0, "cl_decals_models", _("Decals on models")));
+ setDependent(e, "cl_decals", 1, 1);
me.TR(me);
- me.TDempty(me, 0.2);
- me.TD(me, 1, 0.8, e = makeXonoticTextLabel(0, _("Quality:")));
- setDependent(e, "cl_particles", 1, 1);
- me.TD(me, 1, 2, e = makeXonoticParticlesSlider());
- setDependent(e, "cl_particles", 1, 1);
- me.TR(me);
me.TDempty(me, 0.2);
me.TD(me, 1, 0.8, e = makeXonoticTextLabel(0, _("Distance:")));
- setDependent(e, "cl_particles", 1, 1);
- me.TD(me, 1, 2, e = makeXonoticSlider(200, 500, 20, "r_drawparticles_drawdistance"));
- setDependent(e, "cl_particles", 1, 1);
- me.TR(me);
+ setDependent(e, "cl_decals", 1, 1);
+ me.TD(me, 1, 2, e = makeXonoticSlider(200, 500, 20, "r_drawdecals_drawdistance"));
+ setDependent(e, "cl_decals", 1, 1);
+ me.TR(me);
+ me.TDempty(me, 0.2);
+ me.TD(me, 1, 0.8, e = makeXonoticTextLabel(0, _("Time:")));
+ setDependent(e, "cl_decals", 1, 1);
+ me.TD(me, 1, 2, e = makeXonoticSlider(1, 20, 1, "cl_decals_fadetime"));
+ setDependent(e, "cl_decals", 1, 1);
+ me.TR(me);
me.TDempty(me, 0.2);
me.TD(me, 1, 0.8, e = makeXonoticTextLabel(0, _("Damage effects:")));
me.TD(me, 1, 2, e = makeXonoticTextSlider("cl_damageeffect"));
me.TD(me, 1, 2.8, e = makeXonoticCheckBox(0, "r_coronas_occlusionquery", _("Fade corona according to visibility")));
setDependent(e, "r_coronas", 1, 1);
me.TR(me);
- me.TD(me, 1, 1, e = makeXonoticCheckBox(0, "cl_cubemaps_extra", _("Extra reflective effects")));
me.TR(me);
me.TD(me, 1, 1, e = makeXonoticCheckBox(0, "r_bloom", _("Bloom")));
me.TD(me, 1, 2, e = makeXonoticCheckBoxEx(0.5, 0, "hud_postprocessing_maxbluralpha", _("Extra postprocessing effects")));
me.TD(me, 1, 2, s);
me.TR(me);
me.TR(me);
- me.TD(me, 1, 1, e = makeXonoticCheckBox(0, "cl_decals", _("Decals")));
- me.TD(me, 1, 2, e = makeXonoticCheckBox(0, "cl_decals_models", _("Decals on models")));
- setDependent(e, "cl_decals", 1, 1);
+ me.TD(me, 1, 1, e = makeXonoticCheckBox(0, "cl_particles", _("Particles")));
+ me.TD(me, 1, 2, e = makeXonoticCheckBox(0, "cl_spawn_point_particles", _("Spawnpoint effects")));
+ makeMulti(e, "cl_spawn_event_particles");
+ setDependent(e, "cl_particles", 1, 1);
me.TR(me);
me.TDempty(me, 0.2);
- me.TD(me, 1, 0.8, e = makeXonoticTextLabel(0, _("Distance:")));
- setDependent(e, "cl_decals", 1, 1);
- me.TD(me, 1, 2, e = makeXonoticSlider(200, 500, 20, "r_drawdecals_drawdistance"));
- setDependent(e, "cl_decals", 1, 1);
+ me.TD(me, 1, 0.8, e = makeXonoticTextLabel(0, _("Quality:")));
+ setDependent(e, "cl_particles", 1, 1);
+ me.TD(me, 1, 2, e = makeXonoticParticlesSlider());
+ setDependent(e, "cl_particles", 1, 1);
me.TR(me);
me.TDempty(me, 0.2);
- me.TD(me, 1, 0.8, e = makeXonoticTextLabel(0, _("Time:")));
- setDependent(e, "cl_decals", 1, 1);
- me.TD(me, 1, 2, e = makeXonoticSlider(1, 20, 1, "cl_decals_fadetime"));
- setDependent(e, "cl_decals", 1, 1);
+ me.TD(me, 1, 0.8, e = makeXonoticTextLabel(0, _("Distance:")));
+ setDependent(e, "cl_particles", 1, 1);
+ me.TD(me, 1, 2, e = makeXonoticSlider(200, 500, 20, "r_drawparticles_drawdistance"));
+ setDependent(e, "cl_particles", 1, 1);
me.gotoRC(me, me.rows - 1, 0);
me.TD(me, 1, me.columns, makeXonoticCommandButton(_("Apply immediately"), '0 0 0', "vid_restart", COMMANDBUTTON_APPLY));
METHOD(XonoticGameSettingsTab, fill, void(entity))
ATTRIB(XonoticGameSettingsTab, title, string, _("Game"))
ATTRIB(XonoticGameSettingsTab, intendedWidth, float, 0.9)
- ATTRIB(XonoticGameSettingsTab, rows, float, 14.5)
+ ATTRIB(XonoticGameSettingsTab, rows, float, 15.5)
ATTRIB(XonoticGameSettingsTab, columns, float, 6.5)
ENDCLASS(XonoticGameSettingsTab)
entity makeXonoticGameSettingsTab();
void XonoticGameSettingsTab_fill(entity me)
{
entity mc;
- mc = makeXonoticTabController(me.rows - 1.5);
+ mc = makeXonoticTabController(me.rows - 2.5);
me.TR(me);
me.TDempty(me, 0.25);
METHOD(XonoticInputSettingsTab, fill, void(entity))
ATTRIB(XonoticInputSettingsTab, title, string, _("Input"))
ATTRIB(XonoticInputSettingsTab, intendedWidth, float, 0.9)
- ATTRIB(XonoticInputSettingsTab, rows, float, 14.5)
+ ATTRIB(XonoticInputSettingsTab, rows, float, 15.5)
ATTRIB(XonoticInputSettingsTab, columns, float, 6.2) // added extra .2 for center space
ENDCLASS(XonoticInputSettingsTab)
entity makeXonoticInputSettingsTab();
me.TR(me);
me.TD(me, 1, 3, e = makeXonoticHeaderLabel(_("Key Bindings")));
me.TR(me);
- me.TD(me, me.rows - 4, 3, kb);
- me.gotoRC(me, me.rows - 3, 0);
+ me.TD(me, me.rows - 3, 3, kb);
+ me.gotoRC(me, me.rows - 2, 0);
me.TD(me, 1, 1, e = makeXonoticButton(_("Change key..."), '0 0 0'));
e.onClick = KeyBinder_Bind_Change;
e.onClickEntity = kb;
METHOD(XonoticMiscSettingsTab, fill, void(entity))
ATTRIB(XonoticMiscSettingsTab, title, string, _("Misc"))
ATTRIB(XonoticMiscSettingsTab, intendedWidth, float, 0.9)
- ATTRIB(XonoticMiscSettingsTab, rows, float, 14.5)
+ ATTRIB(XonoticMiscSettingsTab, rows, float, 15.5)
ATTRIB(XonoticMiscSettingsTab, columns, float, 6.2)
ENDCLASS(XonoticMiscSettingsTab)
entity makeXonoticMiscSettingsTab();
METHOD(XonoticUserSettingsTab, fill, void(entity))
ATTRIB(XonoticUserSettingsTab, title, string, _("User"))
ATTRIB(XonoticUserSettingsTab, intendedWidth, float, 0.9)
- ATTRIB(XonoticUserSettingsTab, rows, float, 14.5)
+ ATTRIB(XonoticUserSettingsTab, rows, float, 15.5)
ATTRIB(XonoticUserSettingsTab, columns, float, 6)
ENDCLASS(XonoticUserSettingsTab)
entity makeXonoticUserSettingsTab();
METHOD(XonoticVideoSettingsTab, fill, void(entity))
ATTRIB(XonoticVideoSettingsTab, title, string, _("Video"))
ATTRIB(XonoticVideoSettingsTab, intendedWidth, float, 0.9)
- ATTRIB(XonoticVideoSettingsTab, rows, float, 14.5)
+ ATTRIB(XonoticVideoSettingsTab, rows, float, 15.5)
ATTRIB(XonoticVideoSettingsTab, columns, float, 6.2) // added extra .2 for center space
ATTRIB(XonoticVideoSettingsTab, name, string, "videosettings")
ENDCLASS(XonoticVideoSettingsTab)
mina = autocvar_g_balance_armor_regenstable;
limith = autocvar_g_balance_health_limit;
limita = autocvar_g_balance_armor_limit;
-
+
max_mod = regen_mod_max;
regen_mod = regen_mod_regen;
rot_mod = regen_mod_rot;
return 1;
}
-
float SpectateSet()
{
if(self.enemy.classname != "player")
}
*/
- //pointparticles(particleeffectnum("machinegun_impact"), self.origin + self.view_ofs + '0 0 7', '0 0 0', 1);
-
if(self.waypointsprite_attachedforcarrier)
WaypointSprite_UpdateHealth(self.waypointsprite_attachedforcarrier, '1 0 0' * healtharmor_maxdamage(self.health, self.armorvalue, autocvar_g_balance_armor_blockpercent, DEATH_WEAPON));
if (self.jetpack_stopped) { }
else if (!has_fuel)
{
- if (was_flying)
- sprint(self, "You ran out of fuel for the ^2Jetpack\n");
+ if (was_flying) // TODO: ran out of fuel message
+ Send_Notification(NOTIF_ONE, self, MSG_INFO, INFO_JETPACK_NOFUEL);
else
- sprint(self, "You don't have any fuel for the ^2Jetpack\n");
+ Send_Notification(NOTIF_ONE, self, MSG_INFO, INFO_JETPACK_NOFUEL);
self.jetpack_stopped = TRUE;
self.items &= ~IT_USING_JETPACK;
}
}
else if (self.flags & FL_ONGROUND)
{
+ // we get here if we ran out of ammo
+ if((self.items & IT_JETPACK) && self.BUTTON_HOOK && !(buttons_prev & 32) && self.ammo_fuel < 0.01)
+ Send_Notification(NOTIF_ONE, self, MSG_INFO, INFO_JETPACK_NOFUEL);
+
// walking
makevectors(self.v_angle_y * '0 1 0');
wishvel = v_forward * self.movement_x + v_right * self.movement_y;
else
{
float wishspeed0;
+ // we get here if we ran out of ammo
+ if((self.items & IT_JETPACK) && self.BUTTON_HOOK && !(buttons_prev & 32) && self.ammo_fuel < 0.01)
+ Send_Notification(NOTIF_ONE, self, MSG_INFO, INFO_JETPACK_NOFUEL);
if(maxspd_mod < 1)
{
{
if(IS_CLIENT(self))
{
- if(!IS_PLAYER(self) && !lockteams)
+ if(!IS_PLAYER(self) && !lockteams && !gameover)
{
if(self.caplayer)
return;
GetTeamCounts(self);
if(!TeamSmallerEqThanTeam(Team_TeamToNumber(selection), Team_TeamToNumber(self.team), self))
{
- sprint(self, "Cannot change to a larger/better/shinier team\n");
+ Send_Notification(NOTIF_ONE, self, MSG_INFO, INFO_TEAMCHANGE_LARGERTEAM);
return;
}
}
{
case CMD_REQUEST_COMMAND:
{
- entity client;
- string result1 = (argv(2) ? strcat("^7", argv(1), "^3!\n") : "^1HEADS^3!\n");
- string result2 = (argv(2) ? strcat("^7", argv(2), "^3!\n") : "^4TAILS^3!\n");
+ string result1 = (argv(2) ? strcat("^7", argv(1)) : "^1HEADS");
+ string result2 = (argv(2) ? strcat("^7", argv(2)) : "^4TAILS");
string choice = ((random() > 0.5) ? result1 : result2);
-
- FOR_EACH_CLIENT(client)
- centerprint(client, strcat("^3Throwing coin... Result: ", choice));
- bprint(strcat("^3Throwing coin... Result: ", choice));
+
+ Send_Notification(NOTIF_ALL, world, MSG_MULTI, MULTI_COINTOSS, choice);
return;
}
//
// print the message
//
- if (IS_PLAYER(activator) && self.message != "")
+ if(self)
+ if(IS_PLAYER(activator) && self.message != "")
+ if(IS_REAL_CLIENT(activator))
{
- if(IS_REAL_CLIENT(activator))
- {
- centerprint (activator, self.message);
- if (self.noise == "")
- play2(activator, "misc/talk.wav");
- }
+ centerprint(activator, self.message);
+ if (self.noise == "")
+ play2(activator, "misc/talk.wav");
}
//
void multi_touch()
{
- if (!(self.spawnflags & 2))
- if (!other.iscreature)
+ if(!(self.spawnflags & 2))
+ if(!other.iscreature)
return;
if(self.team)
void counter_use()
{
- self.count = self.count - 1;
+ self.count -= 1;
if (self.count < 0)
return;
- if (self.count != 0)
+ if (self.count == 0)
{
- if (IS_PLAYER(activator)
- && (self.spawnflags & SPAWNFLAG_NOMESSAGE) == 0)
- {
- if (self.count >= 4)
- centerprint (activator, "There are more to go...");
- else if (self.count == 3)
- centerprint (activator, "Only 3 more to go...");
- else if (self.count == 2)
- centerprint (activator, "Only 2 more to go...");
- else
- centerprint (activator, "Only 1 more to go...");
- }
- return;
- }
+ if(IS_PLAYER(activator) && (self.spawnflags & SPAWNFLAG_NOMESSAGE) == 0)
+ Send_Notification(NOTIF_ONE, activator, MSG_CENTER, CENTER_SEQUENCE_COMPLETED);
- if (IS_PLAYER(activator)
- && (self.spawnflags & SPAWNFLAG_NOMESSAGE) == 0)
- centerprint(activator, "Sequence completed!");
- self.enemy = activator;
- multi_trigger ();
+ self.enemy = activator;
+ multi_trigger ();
+ }
+ else
+ {
+ if(IS_PLAYER(activator) && (self.spawnflags & SPAWNFLAG_NOMESSAGE) == 0)
+ if(self.count >= 4)
+ Send_Notification(NOTIF_ONE, activator, MSG_CENTER, CENTER_SEQUENCE_COUNTER);
+ else
+ Send_Notification(NOTIF_ONE, activator, MSG_CENTER, CENTER_SEQUENCE_COUNTER_FEWMORE, self.count);
+ }
}
void counter_reset()
for(ear = magicears; ear; ear = ear.enemy)
{
msgout = trigger_magicear_processmessage(ear, source, teamsay, privatesay, msgin);
- if (!(ear.spawnflags & 64))
- if(magicear_matched)
- return msgout;
+ if(!(ear.spawnflags & 64))
+ if(magicear_matched)
+ return msgout;
msgin = msgout;
}
return msgin;
if (key_used) {
// one or more keys were given, but others are still missing!
play2(other, self.noise1);
- centerprint(other, strcat("You also need ", item_keys_keylist(self.itemkeys), "!"));
+ Send_Notification(NOTIF_ONE, other, MSG_CENTER, CENTER_DOOR_LOCKED_ALSONEED, item_keys_keylist(self.itemkeys));
other.key_door_messagetime = time + 2;
} else if (other.key_door_messagetime <= time) {
// no keys were given
play2(other, self.noise2);
- centerprint(other, strcat("You need ", item_keys_keylist(self.itemkeys), "!"));
+ Send_Notification(NOTIF_ONE, other, MSG_CENTER, CENTER_DOOR_LOCKED_NEED, item_keys_keylist(self.itemkeys));
other.key_door_messagetime = time + 2;
}
PlayerTeamScore_Add(activator, SP_ASSAULT_OBJECTIVES, ST_ASSAULT_OBJECTIVES, 1);
self.enemy.health = -1;
- entity oldself, oldactivator;
+ entity oldself, oldactivator, head;
oldself = self;
self = oldself.enemy;
if(self.message)
- {
- entity player;
- string s;
- FOR_EACH_PLAYER(player)
- {
- s = strcat(self.message, "\n");
- centerprint(player, s);
- }
- }
+ FOR_EACH_PLAYER(head)
+ centerprint(head, self.message);
oldactivator = activator;
activator = oldself;
MUTATOR_HOOKFUNCTION(assault_PlayerSpawn)
{
if(self.team == assault_attacker_team)
- centerprint(self, "You are attacking!");
+ Send_Notification(NOTIF_ONE, self, MSG_CENTER, CENTER_ASSAULT_ATTACKING);
else
- centerprint(self, "You are defending!");
+ Send_Notification(NOTIF_ONE, self, MSG_CENTER, CENTER_ASSAULT_DEFENDING);
return FALSE;
}
{
if (!overtime_msg_time)
{
- FOR_EACH_PLAYER(e)
- centerprint(e, "^3Now playing ^1OVERTIME^3!\n^3Generators start now to decay.\n^3The more control points your team holds,\n^3the faster the enemy generator decays.");
+ Send_Notification(NOTIF_ALL, world, MSG_CENTER, CENTER_OVERTIME_CONTROLPOINT);
overtime_msg_time = time;
}
// self.max_health / 300 gives 5 minutes of overtime.
self.wait = time + 5;
FOR_EACH_REALPLAYER(e)
{
- if(e.team == self.team)
+ if(SAME_TEAM(e, self))
{
- centerprint(e, "^1Your generator is NOT shielded!\n^7Re-capture controlpoints to shield it!");
+ Send_Notification(NOTIF_ONE, e, MSG_CENTER, CENTER_ONS_NOTSHIELDED);
soundto(MSG_ONE, e, CHAN_AUTO, "kh/alarm.wav", VOL_BASE, ATTEN_NONE); // FIXME: Uniqe sound?
}
}
void superspec_hello()
{
if(self.enemy.crypto_idfp == "")
- centerprint(self.enemy, "Your client have/allow no crypto id, superspec options will not be saved/restored.");
- else
- centerprint(self.enemy, sprintf("Hello %s\nSince your client has a Crypto ID, your superspec preferences will be persisted on this server.", self.enemy.netname));
+ Send_Notification(NOTIF_ONE_ONLY, self.enemy, MSG_INFO, INFO_SUPERSPEC_MISSING_UID);
remove(self);
}
+++ /dev/null
-float playerstats_db;
-string teamstats_last;
-string playerstats_last;
-string events_last;
-.float playerstats_addedglobalinfo;
-.string playerstats_id;
-
-// Note that _time isn't mentioned here. That one is special.
-#define ALL_ANTICHEATS \
- ANTICHEAT("speedhack"); \
- ANTICHEAT("speedhack_m1"); \
- ANTICHEAT("speedhack_m2"); \
- ANTICHEAT("speedhack_m3"); \
- ANTICHEAT("speedhack_m4"); \
- ANTICHEAT("speedhack_m5"); \
- ANTICHEAT("div0_strafebot_old"); \
- ANTICHEAT("div0_strafebot_new"); \
- ANTICHEAT("div0_evade"); \
- ANTICHEAT("idle_snapaim"); \
- ANTICHEAT("idle_snapaim_signal"); \
- ANTICHEAT("idle_snapaim_noise"); \
- ANTICHEAT("idle_snapaim_m2"); \
- ANTICHEAT("idle_snapaim_m3"); \
- ANTICHEAT("idle_snapaim_m4"); \
- ANTICHEAT("idle_snapaim_m7"); \
- ANTICHEAT("idle_snapaim_m10");
-
-void PlayerStats_Init() // initiated before InitGameplayMode so that scores are added properly
-{
- string uri;
- playerstats_db = -1;
- playerstats_waitforme = TRUE;
- uri = autocvar_g_playerstats_uri;
- if(uri == "")
- return;
- playerstats_db = db_create();
- if(playerstats_db >= 0)
- playerstats_waitforme = FALSE; // must wait for it at match end
-
- serverflags |= SERVERFLAG_PLAYERSTATS;
-
- PlayerStats_AddEvent(PLAYERSTATS_ALIVETIME);
- PlayerStats_AddEvent(PLAYERSTATS_AVGLATENCY);
- PlayerStats_AddEvent(PLAYERSTATS_WINS);
- PlayerStats_AddEvent(PLAYERSTATS_MATCHES);
- PlayerStats_AddEvent(PLAYERSTATS_JOINS);
- PlayerStats_AddEvent(PLAYERSTATS_SCOREBOARD_VALID);
- PlayerStats_AddEvent(PLAYERSTATS_SCOREBOARD_POS);
- PlayerStats_AddEvent(PLAYERSTATS_RANK);
-
- // accuracy stats
- entity w;
- float i;
- for(i = WEP_FIRST; i <= WEP_LAST; ++i)
- {
- w = get_weaponinfo(i);
-
- PlayerStats_AddEvent(strcat("acc-", w.netname, "-hit"));
- PlayerStats_AddEvent(strcat("acc-", w.netname, "-fired"));
-
- PlayerStats_AddEvent(strcat("acc-", w.netname, "-cnt-hit"));
- PlayerStats_AddEvent(strcat("acc-", w.netname, "-cnt-fired"));
-
- PlayerStats_AddEvent(strcat("acc-", w.netname, "-frags"));
- }
-
- PlayerStats_AddEvent("anticheat-_time");
-#define ANTICHEAT(name) \
- PlayerStats_AddEvent("anticheat-" name)
- ALL_ANTICHEATS
-#undef ANTICHEAT
-
- PlayerStats_AddEvent(PLAYERSTATS_ACHIEVEMENT_KILL_SPREE_3);
- PlayerStats_AddEvent(PLAYERSTATS_ACHIEVEMENT_KILL_SPREE_5);
- PlayerStats_AddEvent(PLAYERSTATS_ACHIEVEMENT_KILL_SPREE_10);
- PlayerStats_AddEvent(PLAYERSTATS_ACHIEVEMENT_KILL_SPREE_15);
- PlayerStats_AddEvent(PLAYERSTATS_ACHIEVEMENT_KILL_SPREE_20);
- PlayerStats_AddEvent(PLAYERSTATS_ACHIEVEMENT_KILL_SPREE_25);
- PlayerStats_AddEvent(PLAYERSTATS_ACHIEVEMENT_KILL_SPREE_30);
- PlayerStats_AddEvent(PLAYERSTATS_ACHIEVEMENT_BOTLIKE);
- PlayerStats_AddEvent(PLAYERSTATS_ACHIEVEMENT_FIRSTBLOOD);
- PlayerStats_AddEvent(PLAYERSTATS_ACHIEVEMENT_FIRSTVICTIM);
-}
-
-void PlayerStats_AddPlayer(entity e)
-{
- string s;
-
- if(playerstats_db < 0)
- return;
- if(e.playerstats_id)
- return;
-
- s = string_null;
- if(e.crypto_idfp != "" && e.cvar_cl_allow_uidtracking == 1)
- s = e.crypto_idfp;
- else if(IS_BOT_CLIENT(e))
- s = sprintf("bot#%g#%s", skill, e.cleanname);
-
- if((s == "") || find(world, playerstats_id, s)) // already have one of the ID - next one can't be tracked then!
- {
- if(IS_BOT_CLIENT(e))
- s = sprintf("bot#%d", e.playerid);
- else
- s = sprintf("player#%d", e.playerid);
- }
-
- e.playerstats_id = strzone(s);
-
- string key;
- key = sprintf("%s:*", e.playerstats_id);
-
- string p;
- p = db_get(playerstats_db, key);
- if(p == "")
- {
- if(playerstats_last)
- {
- db_put(playerstats_db, key, playerstats_last);
- strunzone(playerstats_last);
- }
- else
- db_put(playerstats_db, key, "#");
- playerstats_last = strzone(e.playerstats_id);
- }
-}
-
-void PlayerStats_AddTeam(float t)
-{
- if(playerstats_db < 0)
- return;
-
- string key;
- key = sprintf("%d", t);
-
- string p;
- p = db_get(playerstats_db, key);
- if(p == "")
- {
- if(teamstats_last)
- {
- db_put(playerstats_db, key, teamstats_last);
- strunzone(teamstats_last);
- }
- else
- db_put(playerstats_db, key, "#");
- teamstats_last = strzone(key);
- }
-}
-
-void PlayerStats_AddEvent(string event_id)
-{
- if(playerstats_db < 0)
- return;
-
- string key;
- key = sprintf("*:%s", event_id);
-
- string p;
- p = db_get(playerstats_db, key);
- if(p == "")
- {
- if(events_last)
- {
- db_put(playerstats_db, key, events_last);
- strunzone(events_last);
- }
- else
- db_put(playerstats_db, key, "#");
- events_last = strzone(event_id);
- }
-}
-
-float PlayerStats_Event(entity e, string event_id, float value)
-{
- if((e.playerstats_id == "") || playerstats_db < 0)
- return 0;
-
- string key;
- float val;
- key = sprintf("%s:%s", e.playerstats_id, event_id);
- val = stof(db_get(playerstats_db, key));
- val += value;
- db_put(playerstats_db, key, ftos(val));
- return val;
-}
-
-float PlayerStats_TeamScore(float t, string event_id, float value)
-{
- if(playerstats_db < 0)
- return 0;
-
- string key;
- float val;
- key = sprintf("team#%d:%s", t, event_id);
- val = stof(db_get(playerstats_db, key));
- val += value;
- db_put(playerstats_db, key, ftos(val));
- return val;
-}
-
-/*
- format spec:
-
- A collection of lines of the format <key> SPACE <value> NEWLINE, where
- <key> is always a single character.
-
- The following keys are defined:
-
- V: format version (always a fixed number) - this MUST be the first line!
- #: comment (MUST be ignored by any parser)
- R: release information on the server
- T: time at which the game ended
- G: game type
- O: mod name (icon request) as in server browser
- M: map name
- I: match ID (see "matchid" in g_world.qc
- S: "hostname" of the server
- C: number of "unpure" cvar changes
- U: UDP port number of the server
- D: duration of the match
- P: player ID of an existing player; this also sets the owner for all following "n", "e" and "t" lines (lower case!)
- Q: team number of an existing team (format: team#NN); this also sets the owner for all following "e" lines (lower case!)
- n: nickname of the player (optional)
- t: team ID
- i: player index
- e: followed by an event name, a space, and the event count/score
- event names can be:
- alivetime: total playing time of the player
- avglatency: average network latency compounded throughout the match
- wins: number of games won (can only be set if matches is set)
- matches: number of matches played to the end (not aborted by map switch)
- joins: number of matches joined (always 1 unless player never played during the match)
- scoreboardvalid: set to 1 if the player was there at the end of the match
- total-<scoreboardname>: total score of that scoreboard item
- scoreboard-<scoreboardname>: end-of-game score of that scoreboard item (can differ in non-team games)
- achievement-<achievementname>: achievement counters (their "count" is usually 1 if nonzero at all)
- kills-<index>: number of kills against the indexed player
- rank <number>: rank of player
- acc-<weapon netname>-hit: total damage dealt
- acc-<weapon netname>-fired: total damage that all fired projectiles *could* have dealt
- acc-<weapon netname>-cnt-hit: amount of shots that actually hit
- acc-<weapon netname>-cnt-fired: amount of fired shots
- acc-<weapon netname>-frags: amount of frags dealt by weapon
-
- Response format (not used yet): see https://gist.github.com/4284222
-*/
-
-void PlayerStats_ready(entity fh, entity pass, float status)
-{
- string t, tn;
- string p, pn;
- string e, en;
- string nn, tt;
- string s;
-
- switch(status)
- {
- case URL_READY_CANWRITE:
- url_fputs(fh, "V 7\n");
-#ifdef WATERMARK
- url_fputs(fh, sprintf("R %s\n", WATERMARK));
-#endif
- url_fputs(fh, sprintf("T %s.%06d\n", strftime(FALSE, "%s"), floor(random() * 1000000)));
- url_fputs(fh, sprintf("G %s\n", GetGametype()));
- url_fputs(fh, sprintf("O %s\n", modname));
- url_fputs(fh, sprintf("M %s\n", GetMapname()));
- url_fputs(fh, sprintf("I %s\n", matchid));
- url_fputs(fh, sprintf("S %s\n", cvar_string("hostname")));
- url_fputs(fh, sprintf("C %d\n", cvar_purechanges_count));
- url_fputs(fh, sprintf("U %d\n", cvar("port")));
- url_fputs(fh, sprintf("D %f\n", max(0, time - game_starttime)));
- if(teamplay)
- {
- for(t = teamstats_last; (tn = db_get(playerstats_db, sprintf("%d", stof(t)))) != ""; t = tn)
- {
- url_fputs(fh, sprintf("Q team#%s\n", t));
- for(e = events_last; (en = db_get(playerstats_db, sprintf("*:%s", e))) != ""; e = en)
- {
- float v;
- v = stof(db_get(playerstats_db, sprintf("team#%d:%s", stof(t), e)));
- if(v != 0)
- url_fputs(fh, sprintf("e %s %g\n", e, v));
- }
- }
- }
- for(p = playerstats_last; (pn = db_get(playerstats_db, sprintf("%s:*", p))) != ""; p = pn)
- {
- url_fputs(fh, sprintf("P %s\n", p));
- nn = db_get(playerstats_db, sprintf("%s:_playerid", p));
- if(nn != "")
- url_fputs(fh, sprintf("i %s\n", nn));
- nn = db_get(playerstats_db, sprintf("%s:_netname", p));
- if(nn != "")
- url_fputs(fh, sprintf("n %s\n", nn));
- if(teamplay)
- {
- tt = db_get(playerstats_db, sprintf("%s:_team", p));
- url_fputs(fh, sprintf("t %s\n", tt));
- }
- for(e = events_last; (en = db_get(playerstats_db, sprintf("*:%s", e))) != ""; e = en)
- {
- float v;
- v = stof(db_get(playerstats_db, sprintf("%s:%s", p, e)));
- if(v != 0)
- url_fputs(fh, sprintf("e %s %g\n", e, v));
- }
- }
- url_fputs(fh, "\n");
- url_fclose(fh);
- break;
- case URL_READY_CANREAD:
- // url_fclose is processing, we got a response for writing the data
- // this must come from HTTP
- print("Got response from player stats server:\n");
- while((s = url_fgets(fh)))
- print(" ", s, "\n");
- print("End of response.\n");
- url_fclose(fh);
- break;
- case URL_READY_CLOSED:
- // url_fclose has finished
- print("Player stats written\n");
- playerstats_waitforme = TRUE;
- db_close(playerstats_db);
- playerstats_db = -1;
- break;
- case URL_READY_ERROR:
- default:
- print("Player stats writing failed: ", ftos(status), "\n");
- playerstats_waitforme = TRUE;
- if(playerstats_db >= 0)
- {
- db_close(playerstats_db);
- playerstats_db = -1;
- }
- break;
- }
-}
-
-//#NO AUTOCVARS START
-void PlayerStats_Shutdown()
-{
- string uri;
-
- if(playerstats_db < 0)
- return;
-
- uri = autocvar_g_playerstats_uri;
- if(uri != "")
- {
- playerstats_waitforme = FALSE;
- url_multi_fopen(uri, FILE_APPEND, PlayerStats_ready, world);
- }
- else
- {
- playerstats_waitforme = TRUE;
- db_close(playerstats_db);
- playerstats_db = -1;
- }
-}
-//#NO AUTOCVARS END
-
-void PlayerStats_Accuracy(entity p)
-{
- entity a, w;
- a = p.accuracy;
- float i;
-
- for(i = WEP_FIRST; i <= WEP_LAST; ++i)
- {
- w = get_weaponinfo(i);
-
- PlayerStats_Event(p, strcat("acc-", w.netname, "-hit"), a.(accuracy_hit[i-1]));
- PlayerStats_Event(p, strcat("acc-", w.netname, "-fired"), a.(accuracy_fired[i-1]));
-
- PlayerStats_Event(p, strcat("acc-", w.netname, "-cnt-hit"), a.(accuracy_cnt_hit[i-1]));
- PlayerStats_Event(p, strcat("acc-", w.netname, "-cnt-fired"), a.(accuracy_cnt_fired[i-1]));
-
- PlayerStats_Event(p, strcat("acc-", w.netname, "-frags"), a.(accuracy_frags[i-1]));
- }
- //backtrace(strcat("adding player stat accuracy for ", p.netname, ".\n"));
-}
-
-void PlayerStats_Anticheat(entity p)
-{
- entity oldself = self;
- self = p;
-
- float t0 = PlayerStats_Event(p, "anticheat-_time", 0);
- float dt = anticheat_getvalue("_time");
- PlayerStats_Event(p, "anticheat-_time", dt);
- float f = dt / (t0 + dt);
-#define ANTICHEAT(name) do { \
- float prev = PlayerStats_Event(p, "anticheat-" name, 0); \
- float change = (anticheat_getvalue(name) - prev) * f; \
- PlayerStats_Event(p, "anticheat-" name, change); \
- } while(0)
- ALL_ANTICHEATS
-#undef ANTICHEAT
- self = oldself;
-}
-
-void PlayerStats_AddGlobalInfo(entity p)
-{
- if(playerstats_db < 0)
- return;
- if((p.playerstats_id == "") || playerstats_db < 0)
- return;
- p.playerstats_addedglobalinfo = TRUE;
-
- // add global info!
- if(p.alivetime)
- {
- PlayerStats_Event(p, PLAYERSTATS_ALIVETIME, time - p.alivetime);
- p.alivetime = 0;
- }
-
- db_put(playerstats_db, sprintf("%s:_playerid", p.playerstats_id), ftos(p.playerid));
-
- if(p.cvar_cl_allow_uid2name == 1 || IS_BOT_CLIENT(p))
- db_put(playerstats_db, sprintf("%s:_netname", p.playerstats_id), p.netname);
-
- if(teamplay)
- db_put(playerstats_db, sprintf("%s:_team", p.playerstats_id), ftos(p.team));
-
- if(stof(db_get(playerstats_db, sprintf("%d:%s", p.playerstats_id, PLAYERSTATS_ALIVETIME))) > 0)
- PlayerStats_Event(p, PLAYERSTATS_JOINS, 1);
-
- PlayerStats_Accuracy(p);
-
- PlayerStats_Anticheat(p);
-
- if(IS_REAL_CLIENT(p))
- {
- if(p.latency_cnt)
- {
- float latency = (p.latency_sum / p.latency_cnt);
- if(latency) { PlayerStats_Event(p, PLAYERSTATS_AVGLATENCY, latency); }
- }
- }
-
- strunzone(p.playerstats_id);
- p.playerstats_id = string_null;
-}
-
-.float scoreboard_pos;
-void PlayerStats_EndMatch(float finished)
-{
- entity p;
- PlayerScore_Sort(score_dummyfield, 0, 0, 0);
- PlayerScore_Sort(scoreboard_pos, 1, 1, 1);
- if(teamplay)
- PlayerScore_TeamStats();
- FOR_EACH_CLIENT(p)
- {
- // add personal score rank
- PlayerStats_Event(p, PLAYERSTATS_RANK, p.score_dummyfield);
-
- if(!p.scoreboard_pos)
- continue;
-
- // scoreboard is valid!
- PlayerStats_Event(p, PLAYERSTATS_SCOREBOARD_VALID, 1);
-
- // add scoreboard position
- PlayerStats_Event(p, PLAYERSTATS_SCOREBOARD_POS, p.scoreboard_pos);
-
- // add scoreboard data
- PlayerScore_PlayerStats(p);
-
- // if the match ended normally, add winning info
- if(finished)
- {
- PlayerStats_Event(p, PLAYERSTATS_WINS, p.winning);
- PlayerStats_Event(p, PLAYERSTATS_MATCHES, 1);
- }
- }
-}
-
-#undef ALL_ANTICHEATS
{
pickedup = TRUE;
player.items |= it;
- sprint (player, strcat("You got the ^2", item.netname, "\n"));
+ Send_Notification(NOTIF_ONE, player, MSG_INFO, INFO_ITEM_WEAPON_GOT, item.netname);
}
if (item.strength_finished)
if (!(self.owner.dmg) && (self.owner.message != ""))
{
if (IS_CLIENT(other))
- centerprint (other, self.owner.message);
+ centerprint(other, self.owner.message);
play2(other, "misc/talk.wav");
}
}
if (self.message)
{
if (IS_CLIENT(other))
- centerprint (other, self.message);
+ centerprint(other, self.message);
play2(other, "misc/talk.wav");
}
}
Soelen
Sydes
unfa
+TimePath
*Website
Jope "Sless" Withers
Mattia "Melanosuchus" Basaglia
Robert "ai" Kuroto
-TimePath
**Translators