- wget -O data/maps/stormkeep.waypoints https://gitlab.com/xonotic/xonotic-maps.pk3dir/raw/master/maps/stormkeep.waypoints
- wget -O data/maps/stormkeep.waypoints.cache https://gitlab.com/xonotic/xonotic-maps.pk3dir/raw/master/maps/stormkeep.waypoints.cache
- make
- - EXPECT=e1e069b401a7aaf28fed29e2e8cbc0c8
+ - EXPECT=436bcf411c761042d68896ae92f630d5
- HASH=$(${ENGINE} -noconfig -nohome +exec serverbench.cfg
| tee /dev/stderr
| grep '^:'
set g_balance_machinegun_burst_animtime 0.3
set g_balance_machinegun_burst_refire 0.06
set g_balance_machinegun_burst_refire2 0.45
-set g_balance_machinegun_burst_spread 0
+set g_balance_machinegun_burst_spread 0.02
set g_balance_machinegun_first 1
set g_balance_machinegun_first_ammo 1
set g_balance_machinegun_first_damage 14
set g_balance_machinegun_burst_animtime 0.75
set g_balance_machinegun_burst_refire 0.05
set g_balance_machinegun_burst_refire2 0.75
-set g_balance_machinegun_burst_spread 0
+set g_balance_machinegun_burst_spread 0.04
set g_balance_machinegun_first 1
set g_balance_machinegun_first_ammo 1
set g_balance_machinegun_first_damage 30
set g_balance_machinegun_burst_animtime 0.3
set g_balance_machinegun_burst_refire 0.06
set g_balance_machinegun_burst_refire2 0.45
-set g_balance_machinegun_burst_spread 0
+set g_balance_machinegun_burst_spread 0.02
set g_balance_machinegun_first 1
set g_balance_machinegun_first_ammo 1
set g_balance_machinegun_first_damage 14
set g_balance_machinegun_burst_animtime 0.3
set g_balance_machinegun_burst_refire 0.06
set g_balance_machinegun_burst_refire2 0.45
-set g_balance_machinegun_burst_spread 0
+set g_balance_machinegun_burst_spread 0.03
set g_balance_machinegun_first 1
set g_balance_machinegun_first_ammo 1
set g_balance_machinegun_first_damage 14
bind F11 disconnect
bind F12 screenshot
bind F4 ready
-bind ALT +showaccuracy
// Gamepad defaults. Tested with Logitech Rumblepad 2, I hope similar ones works as well.
bind JOY1 "+crouch"
seta "userbind32_press" ""; seta "userbind32_release" ""; seta "userbind32_description" ""
alias _userbind_call "${$1}"
alias +userbind "_userbind_call userbind${1}_press"
-alias -userbind "_userbind_call userbind${1}_release"
\ No newline at end of file
+alias -userbind "_userbind_call userbind${1}_release"
set g_ctf_stalemate_endcondition 1 "condition for stalemate mode to be finished: 1 = If ONE flag is no longer stale, 2 = If BOTH flags are no longer stale"
set g_ctf_stalemate_time 60 "time for each flag until stalemate mode is activated"
set g_ctf_flagcarrier_waypointforenemy_spotting 1 "show the enemy flagcarrier location if a team mate presses +use to spot them"
-set g_ctf_dropped_capture_delay 1 "dropped capture delay"
+set g_ctf_dropped_capture_delay 1.5 "autocapture delay when flag is thrown onto the base - counted from throw, not landing"
set g_ctf_dropped_capture_radius 100 "allow dropped flags to be automatically captured by base flags if the dropped flag is within this radius of it"
set g_ctf_flag_damageforcescale 2
set g_ctf_portalteleport 0 "allow flag carriers to go through portals made in portal gun without dropping the flag"
MUTATOR_HOOKFUNCTION(ca, SV_ParseServerCommand)
{
- shuffleteams_on_reset_map = !allowed_to_spawn;
+ string cmd_name = M_ARGV(0, string);
+ if (cmd_name == "shuffleteams")
+ shuffleteams_on_reset_map = !allowed_to_spawn;
return false;
}
MUTATOR_HOOKFUNCTION(ft, SV_ParseServerCommand)
{
- shuffleteams_on_reset_map = !(round_handler_IsActive() && !round_handler_IsRoundStarted());
+ string cmd_name = M_ARGV(0, string);
+ if (cmd_name == "shuffleteams")
+ shuffleteams_on_reset_map = !(round_handler_IsActive() && !round_handler_IsRoundStarted());
return false;
}
{
}
else
+ {
objerror (this, "^3Teleport destination without a targetname");
+ return; // don't link it to CSQC in this case!
+ }
teleport_dest_link(this);
}
if(n == 0)
{
// no dest!
- objerror (this, "Teleporter with nonexistant target");
+ objerror (this, "Teleporter with nonexistent target");
return;
}
else if(n == 1)
if(!autocvar_g_monsters) { Monster_Remove(this); return false; }
- if(!(this.spawnflags & MONSTERFLAG_RESPAWNED))
+ if(!(this.spawnflags & MONSTERFLAG_RESPAWNED) && !(this.flags & FL_MONSTER))
{
IL_PUSH(g_monsters, this);
if(this.mdl && this.mdl != "")
-> This will spawn as Rifle in this mutator ONLY, and as Vortex otherwise.
{
-"classname" "weapon_vortext"
+"classname" "weapon_vortex"
"new_toys" "vortex rifle"
}
-> This will spawn as either Vortex or Rifle in this mutator ONLY, and as Vortex otherwise.
{
_Movetype_PushEntityTrace(this, push);
+ // NOTE: this is a workaround for the QC's lack of a worldstartsolid trace parameter
if(trace_startsolid && failonstartsolid)
{
int oldtype = this.move_nomonsters;
- this.move_nomonsters = MOVE_NOMONSTERS;
+ this.move_nomonsters = MOVE_WORLDONLY;
_Movetype_PushEntityTrace(this, push);
this.move_nomonsters = oldtype;
if(trace_startsolid)
_Movetype_LinkEdict(this, true);
if(trace_fraction < 1)
- if(this.solid >= SOLID_TRIGGER && (!IS_ONGROUND(this) || (this.groundentity != trace_ent)))
+ if(this.solid >= SOLID_TRIGGER && trace_ent && (!IS_ONGROUND(this) || (this.groundentity != trace_ent)))
_Movetype_Impact(this, trace_ent);
return (this.origin == last_origin); // false if teleported by touch
void PlayerState_attach(entity this)
{
+ if (PS(this))
+ return;
+
this._ps = NEW(PlayerState, this);
Inventory_new(PS(this));
this.effects = spectatee.effects & EFMASK_CHEAP; // eat performance
SetResourceExplicit(this, RES_HEALTH, GetResource(spectatee, RES_HEALTH));
CS(this).impulse = 0;
+ this.disableclientprediction = 1; // no need to run prediction on a spectator
this.items = spectatee.items;
STAT(LAST_PICKUP, this) = STAT(LAST_PICKUP, spectatee);
STAT(HIT_TIME, this) = STAT(HIT_TIME, spectatee);