X-Git-Url: https://de.git.xonotic.org/?a=blobdiff_plain;f=qcsrc%2Fserver%2Fsv_main.qc;h=15f43ad9eb730f980a1c40827213b13106c84a55;hb=5d2f4a6d42d25232423fa1add7461a8f477abe0f;hp=a5f35aa89ae3bc04a0e8d51d9ab5587dea084c1d;hpb=2fb4172213439edb17c1d116747c75f9540f2017;p=xonotic%2Fxonotic-data.pk3dir.git diff --git a/qcsrc/server/sv_main.qc b/qcsrc/server/sv_main.qc index a5f35aa89..15f43ad9e 100644 --- a/qcsrc/server/sv_main.qc +++ b/qcsrc/server/sv_main.qc @@ -2,24 +2,26 @@ void CreatureFrame (void) { local entity oldself; - local float dm, maxspeed; + local float dm; oldself = self; - self = findfloat(world, iscreature, TRUE); - while (self) + for(self = world; (self = findfloat(self, iscreature, TRUE)); ) { - if (self.movetype != MOVETYPE_NOCLIP) + if (self.movetype == MOVETYPE_NOCLIP) + continue; + float vehic = (self.vehicle_flags & VHF_ISVEHICLE); + if (self.waterlevel) { - if (self.waterlevel) + if (!(self.flags & FL_INWATER)) + { + self.flags |= FL_INWATER; + self.dmgtime = 0; + } + if(!vehic) // vehicles don't drown { - if (!(self.flags & FL_INWATER)) - { - self.flags |= FL_INWATER; - self.dmgtime = 0; - } if (self.waterlevel != WATERLEVEL_SUBMERGED) { if(self.air_finished < time + 9) - PlayerSound(playersound_gasp, CHAN_PLAYER, VOICETYPE_PLAYERSOUND); + PlayerSound(playersound_gasp, CH_PLAYER, VOICETYPE_PLAYERSOUND); self.air_finished = time + 12; self.dmg = 2; } @@ -32,61 +34,64 @@ void CreatureFrame (void) self.pain_finished = time + 0.5; } } - if (self.dmgtime < time) + } + if (self.dmgtime < time) + { + self.dmgtime = time + 0.2; + if (self.watertype == CONTENT_LAVA) { - self.dmgtime = time + 0.2; - if (self.watertype == CONTENT_LAVA) + if (self.watersound_finished < time) { - if (self.watersound_finished < time) - { - self.watersound_finished = time + 0.5; - sound (self, CHAN_PLAYER, "player/lava.wav", VOL_BASE, ATTN_NORM); - } - Damage (self, world, world, 6 * self.waterlevel, DEATH_LAVA, self.origin, '0 0 0'); + self.watersound_finished = time + 0.5; + sound (self, CH_PLAYER, "player/lava.wav", VOL_BASE, ATTN_NORM); } - else if (self.watertype == CONTENT_SLIME) + Damage (self, world, world, 6 * self.waterlevel, DEATH_LAVA, self.origin, '0 0 0'); + } + else if (self.watertype == CONTENT_SLIME) + { + if (self.watersound_finished < time) { - if (self.watersound_finished < time) - { - self.watersound_finished = time + 0.5; - sound (self, CHAN_PLAYER, "player/slime.wav", VOL_BASE, ATTN_NORM); - } - Damage (self, world, world, 2 * self.waterlevel, DEATH_SLIME, self.origin, '0 0 0'); + self.watersound_finished = time + 0.5; + sound (self, CH_PLAYER, "player/slime.wav", VOL_BASE, ATTN_NORM); } + Damage (self, world, world, 2 * self.waterlevel, DEATH_SLIME, self.origin, '0 0 0'); } } - else + } + else + { + if (self.flags & FL_INWATER) { - if (self.flags & FL_INWATER) - { - // play leave water sound - self.flags &~= FL_INWATER; - self.dmgtime = 0; - } - self.air_finished = time + 12; - self.dmg = 2; + // play leave water sound + self.flags &~= FL_INWATER; + self.dmgtime = 0; } + self.air_finished = time + 12; + self.dmg = 2; + } + + if(!vehic) // vehicles don't get falling damage + { // check for falling damage - if(!self.hook.state && !g_ca && !(g_cts && !cvar("g_cts_selfdamage"))) + float velocity_len = vlen(self.velocity); + if(!self.hook.state && !g_ca && !(g_cts && !autocvar_g_cts_selfdamage)) { - dm = vlen(self.oldvelocity) - vlen(self.velocity); // dm is now the velocity DECREASE. Velocity INCREASE should never cause a sound or any damage. + dm = vlen(self.oldvelocity) - velocity_len; // dm is now the velocity DECREASE. Velocity INCREASE should never cause a sound or any damage. if (self.deadflag) - dm = (dm - cvar("g_balance_falldamage_deadminspeed")) * cvar("g_balance_falldamage_factor"); + dm = (dm - autocvar_g_balance_falldamage_deadminspeed) * autocvar_g_balance_falldamage_factor; else - dm = min((dm - cvar("g_balance_falldamage_minspeed")) * cvar("g_balance_falldamage_factor"), cvar("g_balance_falldamage_maxdamage")); + dm = min((dm - autocvar_g_balance_falldamage_minspeed) * autocvar_g_balance_falldamage_factor, autocvar_g_balance_falldamage_maxdamage); if (dm > 0) Damage (self, world, world, dm, DEATH_FALL, self.origin, '0 0 0'); } - maxspeed = cvar("g_maxspeed"); - if(maxspeed > 0 && vlen(self.velocity) > maxspeed) + if(autocvar_g_maxspeed > 0 && velocity_len > autocvar_g_maxspeed) Damage (self, world, world, 100000, DEATH_SHOOTING_STAR, self.origin, '0 0 0'); - // play stupid sounds if (g_footsteps) if (!gameover) if (self.flags & FL_ONGROUND) - if (vlen(self.velocity) > sv_maxspeed * 0.6) + if (velocity_len > autocvar_sv_maxspeed * 0.6) if (!self.deadflag) if (time < self.lastground + 0.2) { @@ -104,15 +109,15 @@ void CreatureFrame (void) if not(trace_dphitq3surfaceflags & Q3SURFACEFLAG_NOSTEPS) { if(trace_dphitq3surfaceflags & Q3SURFACEFLAG_METALSTEPS) - GlobalSound(globalsound_metalstep, CHAN_PLAYER, VOICETYPE_PLAYERSOUND); + GlobalSound(globalsound_metalstep, CH_PLAYER, VOICETYPE_PLAYERSOUND); else - GlobalSound(globalsound_step, CHAN_PLAYER, VOICETYPE_PLAYERSOUND); + GlobalSound(globalsound_step, CH_PLAYER, VOICETYPE_PLAYERSOUND); } } } - self.oldvelocity = self.velocity; } - self = findfloat(self, iscreature, TRUE); + + self.oldvelocity = self.velocity; } self = oldself; } @@ -175,43 +180,14 @@ void StartFrame (void) WarpZone_StartFrame(); - sv_gravity = cvar("sv_gravity"); - sv_maxairspeed = cvar("sv_maxairspeed"); - sv_maxspeed = cvar ("sv_maxspeed"); - sv_friction = cvar ("sv_friction"); - sv_accelerate = cvar ("sv_accelerate"); - sv_airaccelerate = cvar("sv_airaccelerate"); - sv_airaccel_sideways_friction = cvar("sv_airaccel_sideways_friction"); - sv_airaccel_qw = cvar("sv_airaccel_qw"); - sv_stopspeed = cvar ("sv_stopspeed"); - sv_airstopaccelerate = cvar("sv_airstopaccelerate"); - sv_airstrafeaccelerate = cvar("sv_airstrafeaccelerate"); - sv_maxairstrafespeed = cvar("sv_maxairstrafespeed"); - sv_airstrafeaccel_qw = cvar("sv_airstrafeaccel_qw"); - sv_aircontrol = cvar("sv_aircontrol"); - sv_aircontrol_penalty = cvar("sv_aircontrol_penalty"); - sv_aircontrol_power = cvar("sv_aircontrol_power"); - sv_warsowbunny_airforwardaccel = cvar("sv_warsowbunny_airforwardaccel"); - sv_warsowbunny_accel = cvar("sv_warsowbunny_accel"); - sv_warsowbunny_topspeed = cvar("sv_warsowbunny_topspeed"); - sv_warsowbunny_turnaccel = cvar("sv_warsowbunny_turnaccel"); - sv_warsowbunny_backtosideratio = cvar("sv_warsowbunny_backtosideratio"); - sv_airspeedlimit_nonqw = cvar("sv_airspeedlimit_nonqw"); - teamplay = cvar ("teamplay"); - sys_frametime = cvar("sys_ticrate") * cvar("slowmo"); + sys_frametime = autocvar_sys_ticrate * autocvar_slowmo; if(sys_frametime <= 0) sys_frametime = 1.0 / 60.0; // somewhat safe fallback - sv_doublejump = cvar("sv_doublejump"); if (timeoutStatus == 1) // just before the timeout (when timeoutStatus will be 2) - orig_slowmo = cvar("slowmo"); // slowmo will be restored after the timeout - - if(teams_matter && !teamplay) - teamplay = 3; - if(!teams_matter && teamplay) - teamplay = 0; + orig_slowmo = autocvar_slowmo; // slowmo will be restored after the timeout - skill = cvar("skill"); + skill = autocvar_skill; Spawnqueue_Check(); @@ -221,7 +197,7 @@ void StartFrame (void) if(game_delay_last == TRUE) if(game_delay == FALSE) - if(cvar("sv_eventlog")) + if(autocvar_sv_eventlog) GameLogEcho(":startdelay_ended"); game_delay_last = game_delay; @@ -229,7 +205,7 @@ void StartFrame (void) // if in warmup stage and limit for warmup is hit start match if (inWarmupStage) if ((g_warmup_limit > 0 && time >= g_warmup_limit) - || (g_warmup_limit == 0 && cvar("timelimit") != 0 && time >= cvar("timelimit") * 60)) + || (g_warmup_limit == 0 && autocvar_timelimit != 0 && time >= autocvar_timelimit * 60)) { ReadyRestart(); return; @@ -243,7 +219,7 @@ void StartFrame (void) RuneMatchGivePoints(); bot_serverframe(); - if(cvar("spawn_debugview")) + if(autocvar_spawn_debugview) { RandomSelection_Init(); for(self = world; (self = find(self, classname, "player")); ) @@ -261,10 +237,11 @@ void StartFrame (void) .float anglejitter; .string gametypefilter; .string cvarfilter; +float DoesQ3ARemoveThisEntity(); void SV_OnEntityPreSpawnFunction() { if(self.gametypefilter != "") - if not(isGametypeInFilter(game, teams_matter, self.gametypefilter)) + if not(isGametypeInFilter(game, teamplay, have_team_spawns, self.gametypefilter)) { remove(self); return; @@ -379,6 +356,12 @@ void SV_OnEntityPreSpawnFunction() } } + if(DoesQ3ARemoveThisEntity()) + { + remove(self); + return; + } + // support special -1 and -2 angle from radiant if (self.angles == '0 -1 0') self.angles = '-90 0 0'; @@ -406,3 +389,20 @@ void SV_OnEntityPreSpawnFunction() return; } } + +void WarpZone_PostInitialize_Callback(void) +{ + // create waypoint links for warpzones + entity e; + for(e = world; (e = find(e, classname, "trigger_warpzone")); ) + { + vector src, dst; + src = (e.absmin + e.absmax) * 0.5; + makevectors(e.warpzone_angles); + src = src + ((e.warpzone_origin - src) * v_forward) * v_forward + 16 * v_right; + dst = (e.enemy.absmin + e.enemy.absmax) * 0.5; + makevectors(e.enemy.warpzone_angles); + dst = dst + ((e.enemy.warpzone_origin - dst) * v_forward) * v_forward - 16 * v_right; + waypoint_spawnforteleporter_v(e, src, dst, 0); + } +}