alias +hook +button6
alias -hook -button6
alias use "impulse 21"
-alias +use use // always send that impulse AND press the key (+use is engine internal command and executes anyway)
-set cl_newusekeysupported 1 // indicates that we always send the use impulse too, so they do not need to be synthesized
alias ready "cmd ready"
alias lockteams "sv_cmd lockteams"
alias unlockteams "sv_cmd unlockteams"
bind r reload
bind BACKSPACE dropweapon
bind g dropweapon
-bind f use
+bind f +use
// misc
bind e +hook
prvm_leaktest_ignore_classnames "ctf_team dom_team tdm_team"
sv_allowdownloads_inarchive 1 // for csprogs.dat
+sv_allowdownloads 0 // download protocol is evil
set g_jump_grunt 0 "Do you make a grunting noise every time you jump? Is it the same grunting noise every time?"
seta cl_clippedspectating 1 "movement collision for spectators so that you can't pass through walls and such. (client setting) NOTE: reconnect or use sendcvar command to update the choice."
+seta cl_autoscreenshot 0 "client option to automatically take a screenshot once the map has ended (see also sv_autoscreenshot)"
+
// must be at the bottom of this file:
// alias for switching the teamselect menu
alias menu_showteamselect "menu_cmd directmenu TeamSelect"
me.TR(me);
me.TDempty(me, 0.2);
me.TD(me, 1, 0.9, e = makeXonoticRadioButton(1, "r_viewfbo", "0", _("None")));
- me.TD(me, 1, 0.9, e = makeXonoticRadioButton(1, "r_viewfbo", "1", _("8bpp")));
+ me.TD(me, 1, 0.9, e = makeXonoticRadioButton(1, "r_viewfbo", "1", _("8bit")));
me.TR(me);
me.TDempty(me, 0.2);
- me.TD(me, 1, 0.9, e = makeXonoticRadioButton(1, "r_viewfbo", "2", _("16bpp HDR")));
- me.TD(me, 1, 0.9, e = makeXonoticRadioButton(1, "r_viewfbo", "3", _("32bpp HDR")));
+ me.TD(me, 1, 0.9, e = makeXonoticRadioButton(1, "r_viewfbo", "2", _("16bit HDR")));
+ me.TD(me, 1, 0.9, e = makeXonoticRadioButton(1, "r_viewfbo", "3", _("32bit HDR")));
me.TR(me);
me.TR(me);
me.TD(me, 1, 1, e = makeXonoticTextLabel(0, _("Depth first:")));
MUTATOR_CALLHOOK(PlayerPreThink);
- if(!self.cvar_cl_newusekeysupported)
+ if(!self.cvar_cl_newusekeysupported) // FIXME remove this - it was a stupid idea to begin with, we can JUST use the button
{
if(self.BUTTON_USE && !self.usekeypressed)
PlayerUseKey();
.float cvar_cl_handicap;
.float cvar_cl_playerdetailreduction;
.float cvar_cl_clippedspectating;
+.float cvar_cl_autoscreenshot;
.float cvar_cl_movement_track_canjump;
.float cvar_cl_newusekeysupported;
}
else if (attacker.classname == "player")
{
- if(teamplay && attacker.team == targ.team)
+ if(!IsDifferentTeam(attacker, targ))
{
if(attacker.team == COLOR_TEAM1)
type = KILL_TEAM_RED;
damage = 0;
force = '0 0 0';
}
- else if(teamplay && attacker.team == targ.team)
+ else if(!IsDifferentTeam(attacker, targ))
{
if(autocvar_teamplay_mode == 1)
damage = 0;
if (lag)
{
// take players back into the past
- player = player_list;
- while (player)
- {
- antilag_takeback(player, time - lag);
- player = player.nextplayer;
- }
+ FOR_EACH_PLAYER(player)
+ if(player != forent)
+ {
+ antilag_takeback(player, time - lag);
+ if(player.vehicle)
+ antilag_takeback(player.vehicle, time - lag);
+ }
+
}
// do the trace
// restore players to current positions
if (lag)
{
- player = player_list;
- while (player)
- {
- antilag_restore(player);
- player = player.nextplayer;
- }
+ FOR_EACH_PLAYER(player)
+ if(player != forent)
+ {
+ antilag_restore(player);
+ if(player.vehicle)
+ antilag_restore(player.vehicle);
+ }
+
}
// restore shooter solid type
{
FixIntermissionClient(self);
- if(autocvar_sv_autoscreenshot)
- if(self.autoscreenshot > 0)
- if(time > self.autoscreenshot)
+ if( (autocvar_sv_autoscreenshot || self.cvar_cl_autoscreenshot)
+ && ((self.autoscreenshot > 0) && (time > self.autoscreenshot)) )
{
self.autoscreenshot = -1;
if(clienttype(self) == CLIENTTYPE_REAL)
self.hitsound = FALSE;
self.typehitsound = FALSE;
antilag_record(self, altime);
+ if(self.vehicle)
+ antilag_record(self.vehicle, altime);
}
}
get_cvars_s = s;
MUTATOR_CALLHOOK(GetCvars);
GetCvars_handleFloat(s, f, autoswitch, "cl_autoswitch");
+ GetCvars_handleFloat(s, f, cvar_cl_autoscreenshot, "cl_autoscreenshot");
GetCvars_handleFloat(s, f, cvar_cl_playerdetailreduction, "cl_playerdetailreduction");
GetCvars_handleString(s, f, cvar_g_xonoticversion, "g_xonoticversion");
GetCvars_handleFloat(s, f, cvar_cl_handicap, "cl_handicap");
void ka_RespawnBall(void);
void ka_DropEvent(entity);
void ka_TimeScoring(void);
+void ka_EventLog(string, entity);
entity ka_ball;
other.effects |= autocvar_g_keepaway_ballcarrier_effects;
// messages and sounds
+ ka_EventLog("pickup", other);
Send_KillNotification(other.netname, "", "", KA_PICKUPBALL, MSG_KA);
WriteByte(MSG_BROADCAST, SVC_CENTERPRINT);
WriteString(MSG_BROADCAST, strcat(other.netname, "^7 has picked up the ball!"));
plyr.effects &~= autocvar_g_keepaway_ballcarrier_effects;
// messages and sounds
+ ka_EventLog("dropped", plyr);
Send_KillNotification(plyr.netname, "", "", KA_DROPBALL, MSG_KA);
WriteByte(MSG_BROADCAST, SVC_CENTERPRINT);
WriteString(MSG_BROADCAST, strcat(plyr.netname, "^7 has dropped the ball!"));
}
}
+void ka_EventLog(string mode, entity actor) // use an alias for easy changing and quick editing later
+{
+ if(autocvar_sv_eventlog)
+ GameLogEcho(strcat(":ka:", mode, ((actor != world) ? (strcat(":", ftos(actor.playerid))) : "")));
+}
+
MUTATOR_HOOKFUNCTION(ka_Scoring)
{
if((frag_attacker != frag_target) && (frag_attacker.classname == "player"))
float turret_tesla_firecheck()
{
- if not (turret_stdproc_firecheck())
- return 0;
+ // g_turrets_targetscan_maxdelay forces a target re-scan at least this often
+ float do_target_scan;
+
+ if((self.target_select_time + autocvar_g_turrets_targetscan_maxdelay) < time)
+ do_target_scan = 1;
+
+ // Old target (if any) invalid?
+ if(self.target_validate_time < time)
+ if (turret_validate_target(self, self.enemy, self.target_validate_flags) <= 0)
+ {
+ self.enemy = world;
+ self.target_validate_time = time + 0.5;
+ do_target_scan = 1;
+ }
- self.target_select_flags = TFL_TARGETSELECT_PLAYERS | TFL_TARGETSELECT_MISSILES | TFL_TARGETSELECT_RANGELIMTS | TFL_TARGETSELECT_TEAMCHECK;
+ // But never more often then g_turrets_targetscan_mindelay!
+ if (self.target_select_time + autocvar_g_turrets_targetscan_mindelay > time)
+ do_target_scan = 0;
- self.enemy = turret_select_target();
+ if(do_target_scan)
+ {
+ self.enemy = turret_select_target();
+ self.target_select_time = time;
+ }
+
+ if not (turret_stdproc_firecheck())
+ return 0;
if(self.enemy)
return 1;
return 0;
-
}
+
void turret_tesla_fire()
{
- entity e,t;
- float d,r,i;
+ entity e, t;
+ float d, r, i;
//w_deathtypestring = "discoverd how a tesla coil works";
return 1;
}
+
racer_align4point();
-
- crosshair_trace(player);
-
+ vh_crosshair_trace(player);
racer.angles_x *= -1;
// Yaw
player.BUTTON_ATCK = player.BUTTON_ATCK2 = 0;
return 1;
}
- crosshair_trace(player);
+ vh_crosshair_trace(player);
vector vang;
vang = raptor.angles;
if not (self.owner.BUTTON_ATCK2)
return;
- crosshair_trace(self.owner);
+ vh_crosshair_trace(self.owner);
v = gettaginfo(self.tur_head,gettagindex(self.tur_head,"tag_fire"));
rocket = vehicles_projectile("spiderbot_rocket_launch", "weapons/rocket_fire.wav",
dont before calling.
**/
+void vh_crosshair_trace(entity player)
+{
+ float lag;
+ entity pl;
+
+ lag = ANTILAG_LATENCY(self);
+ if(lag < 0.001)
+ lag = 0;
+ if(clienttype(self) != CLIENTTYPE_REAL)
+ lag = 0;
+ if(autocvar_g_antilag == 0 || self.cvar_cl_noantilag)
+ lag = 0; // only do hitscan, but no antilag
+
+ if(lag)
+ FOR_EACH_PLAYER(pl)
+ if(pl != self)
+ {
+ antilag_takeback(pl, time - lag);
+ if(pl.vehicle)
+ antilag_takeback(pl.vehicle, time - lag);
+
+ }
+
+ crosshair_trace(player);
+
+ if(lag)
+ FOR_EACH_PLAYER(pl)
+ if(pl != self)
+ {
+ antilag_restore(pl);
+ if(pl.vehicle)
+ antilag_restore(pl.vehicle);
+ }
+}
.entity lock_target;
.float lock_strength;
.float lock_time;
if(trace_ent.deadflag != DEAD_NO)
trace_ent = world;
- if not (trace_ent.vehicle_flags & VHF_ISVEHICLE || trace_ent.turrcaps_flags & TFL_TURRCAPS_ISTURRET)
+ if not (trace_ent.vehicle_flags & VHF_ISVEHICLE || trace_ent.turrcaps_flags & TFL_TURRCAPS_ISTURRET || trace_ent.classname == "player")
trace_ent = world;
}
{
if(vlen(trace_endpos - fireBallisticBullet_trace_callback_ent.origin) > 16)
zcurveparticles_from_tracetoss(fireBallisticBullet_trace_callback_eff, fireBallisticBullet_trace_callback_ent.origin, trace_endpos, fireBallisticBullet_trace_callback_ent.velocity);
+ WarpZone_trace_forent = world;
+ self.owner = world;
}
void fireBallisticBullet(vector start, vector dir, float spread, float pSpeed, float lifetime, float damage, float headshotbonus, float force, float dtype, float tracereffects, float gravityfactor, float bulletconstant)
if(lag)
FOR_EACH_PLAYER(pl)
- antilag_takeback(pl, time - lag);
+ if(pl != self)
+ {
+ antilag_takeback(pl, time - lag);
+ if(pl.vehicle)
+ antilag_takeback(pl.vehicle, time - lag);
+
+ }
+
oldself = self;
self = proj;
trace_fraction = 0;
fireBallisticBullet_trace_callback_ent = self;
fireBallisticBullet_trace_callback_eff = eff;
- // FIXME can we somehow do this with just ONE trace?
- WarpZone_TraceToss(self, self.owner);
- if(self.owner && WarpZone_trace_firstzone)
- {
- self.owner = world;
- self.velocity = v0;
- self.gravity = g0;
- continue;
- }
WarpZone_TraceToss_ThroughZone(self, self.owner, world, fireBallisticBullet_trace_callback);
self.velocity = v0;
self.gravity = g0;
if(lag)
FOR_EACH_PLAYER(pl)
- antilag_restore(pl);
+ if(pl != self)
+ {
+ antilag_restore(pl);
+ if(pl.vehicle)
+ antilag_restore(pl.vehicle);
+ }
+
remove(proj);
entity wz;
vector vf, vr, vu;
+ WarpZone_trace_forent = forent;
WarpZone_trace_firstzone = world;
WarpZone_trace_lastzone = world;
WarpZone_Trace_InitTransform();
}
else
{
- tracebox(org, mi, ma, end, nomonsters, forent);
+ tracebox(org, mi, ma, end, nomonsters, WarpZone_trace_forent);
if(cb)
cb(org, trace_endpos, end);
return;
nomonsters_adjusted = nomonsters;
break;
}
- if((contentshack = (forent.dphitcontentsmask && !(forent.dphitcontentsmask & DPCONTENTS_SOLID))))
- BITSET_ASSIGN(forent.dphitcontentsmask, DPCONTENTS_SOLID);
+ if((contentshack = (WarpZone_trace_forent.dphitcontentsmask && !(WarpZone_trace_forent.dphitcontentsmask & DPCONTENTS_SOLID))))
+ BITSET_ASSIGN(WarpZone_trace_forent.dphitcontentsmask, DPCONTENTS_SOLID);
// if starting in warpzone, first transform
wz = WarpZone_Find(org + mi, org + ma);
trace_ent = world;
break;
}
- tracebox(org, mi, ma, end, nomonsters_adjusted, forent);
+ tracebox(org, mi, ma, end, nomonsters_adjusted, WarpZone_trace_forent);
if(cb)
cb(org, trace_endpos, end);
if(sol < 0)
break;
if(trace_ent.classname != "trigger_warpzone")
{
- if((nomonsters == MOVE_NOTHING) || ((nomonsters == MOVE_WORLDONLY) && trace_ent) || (contentshack && (trace_dphitcontents & forent.dphitcontentsmask) == DPCONTENTS_SOLID))
+ if((nomonsters == MOVE_NOTHING) || ((nomonsters == MOVE_WORLDONLY) && trace_ent) || (contentshack && (trace_dphitcontents & WarpZone_trace_forent.dphitcontentsmask) == DPCONTENTS_SOLID))
{
// continue the trace, ignoring this hit (we only care for warpzones)
org = trace_endpos + normalize(end - org);
end = WarpZone_TransformOrigin(wz, end);
// we got warped, so let's step back a bit
- tracebox(org, mi, ma, org + normalize(org - end) * 32, nomonsters_adjusted, forent);
+ tracebox(org, mi, ma, org + normalize(org - end) * 32, nomonsters_adjusted, WarpZone_trace_forent);
org = trace_endpos;
}
WarpZone_MakeAllOther();
:fail
if(contentshack)
- BITCLR_ASSIGN(forent.dphitcontentsmask, DPCONTENTS_SOLID);
+ BITCLR_ASSIGN(WarpZone_trace_forent.dphitcontentsmask, DPCONTENTS_SOLID);
trace_startsolid = sol;
v_forward = vf;
v_right = vr;
o0 = e.origin;
v0 = e.velocity;
+ WarpZone_trace_forent = forent;
WarpZone_trace_firstzone = world;
WarpZone_trace_lastzone = world;
WarpZone_Trace_InitTransform();
WarpZone_tracetoss_time = 0;
if(!warpzone_warpzones_exist)
{
- tracetoss(e, forent);
+ tracetoss(e, WarpZone_trace_forent);
if(cb)
cb(e.origin, trace_endpos, trace_endpos);
dt = vlen(e.origin - o0) / vlen(e.velocity);
trace_ent = world;
break;
}
- tracetoss(e, forent);
+ tracetoss(e, WarpZone_trace_forent);
if(cb)
cb(e.origin, trace_endpos, trace_endpos);
dt = vlen(trace_endpos - e.origin) / vlen(e.velocity);
// we got warped, so let's step back a bit
e.velocity = -e.velocity;
- tracetoss(e, forent);
+ tracetoss(e, WarpZone_trace_forent);
dt = vlen(trace_endpos - e.origin) / vlen(e.velocity);
WarpZone_tracetoss_time -= dt;
e.origin = trace_endpos;
void WarpZone_MakeAllOther();
#define MOVE_NOTHING -1
+entity WarpZone_trace_forent; // temp, callback is allowed to change it
typedef void(vector start, vector hit, vector end) WarpZone_trace_callback_t; // called on every elementary trace
const var WarpZone_trace_callback_t WarpZone_trace_callback_t_null;
entity WarpZone_trace_transform; // transform accumulator during a trace