- 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=29a3c5d84ed37810d674c2c176b21e04
+ - EXPECT=d1a65371174a5210320fa85b3f059d0f
- HASH=$(${ENGINE} -noconfig -nohome +exec serverbench.cfg
| tee /dev/stderr
| grep '^:'
-Sun Feb 4 07:24:40 CET 2018
+Sat Feb 10 07:23:38 CET 2018
set g_pickup_respawntime_weapon 10
set g_pickup_respawntime_superweapon 120
set g_pickup_respawntime_ammo 10
+set g_pickup_respawntime_initial_random 2
set g_pickup_respawntimejitter_short 0
set g_pickup_respawntimejitter_medium 0
set g_pickup_respawntimejitter_long 0
// {{{ powerups
set g_balance_powerup_invincible_takedamage 0.33 // only 1/3rd damage is taken
+set g_balance_powerup_invincible_takeforce 1
set g_balance_powerup_invincible_time 30
set g_balance_powerup_strength_damage 3
set g_balance_powerup_strength_force 3
set g_pickup_respawntime_weapon 15
set g_pickup_respawntime_superweapon 120
set g_pickup_respawntime_ammo 15
+set g_pickup_respawntime_initial_random 2
set g_pickup_respawntimejitter_short 0
set g_pickup_respawntimejitter_medium 0
set g_pickup_respawntimejitter_long 0
// {{{ powerups
set g_balance_powerup_invincible_takedamage 0.2
+set g_balance_powerup_invincible_takeforce 1
set g_balance_powerup_invincible_time 30
set g_balance_powerup_strength_damage 3
set g_balance_powerup_strength_force 4
set g_pickup_respawntime_weapon 10
set g_pickup_respawntime_superweapon 120
set g_pickup_respawntime_ammo 10
+set g_pickup_respawntime_initial_random 0
set g_pickup_respawntimejitter_short 0
set g_pickup_respawntimejitter_medium 0
set g_pickup_respawntimejitter_long 0
// {{{ powerups
set g_balance_powerup_invincible_takedamage 0.33 // only 1/3rd damage is taken
+set g_balance_powerup_invincible_takeforce 0.33
set g_balance_powerup_invincible_time 30
set g_balance_powerup_strength_damage 3
set g_balance_powerup_strength_force 3
set g_pickup_respawntime_weapon 10
set g_pickup_respawntime_superweapon 120
set g_pickup_respawntime_ammo 10
+set g_pickup_respawntime_initial_random 2
set g_pickup_respawntimejitter_short 0
set g_pickup_respawntimejitter_medium 0
set g_pickup_respawntimejitter_long 0
// {{{ powerups
set g_balance_powerup_invincible_takedamage 0.25 // only 1/4th damage is taken
+set g_balance_powerup_invincible_takeforce 1
set g_balance_powerup_invincible_time 30
set g_balance_powerup_strength_damage 3
set g_balance_powerup_strength_force 3
set g_pickup_respawntime_weapon 0.1
set g_pickup_respawntime_superweapon 0.1
set g_pickup_respawntime_ammo 0.1
+set g_pickup_respawntime_initial_random 2
set g_pickup_respawntimejitter_short 0
set g_pickup_respawntimejitter_medium 0
set g_pickup_respawntimejitter_long 0
// {{{ powerups
set g_balance_powerup_invincible_takedamage 0.33 // only 1/3rd damage is taken
+set g_balance_powerup_invincible_takeforce 0.33
set g_balance_powerup_invincible_time 30
set g_balance_powerup_strength_damage 3
set g_balance_powerup_strength_force 3
set g_pickup_respawntime_weapon 10
set g_pickup_respawntime_superweapon 120
set g_pickup_respawntime_ammo 10
+set g_pickup_respawntime_initial_random 1
set g_pickup_respawntimejitter_short 0
set g_pickup_respawntimejitter_medium 0
set g_pickup_respawntimejitter_long 0
// {{{ powerups
set g_balance_powerup_invincible_takedamage 0.33 // only 1/3rd damage is taken
+set g_balance_powerup_invincible_takeforce 0.33
set g_balance_powerup_invincible_time 30
set g_balance_powerup_strength_damage 3
set g_balance_powerup_strength_force 3
set g_pickup_respawntime_weapon 10
set g_pickup_respawntime_superweapon 120
set g_pickup_respawntime_ammo 10
+set g_pickup_respawntime_initial_random 1
set g_pickup_respawntimejitter_short 0
set g_pickup_respawntimejitter_medium 0
set g_pickup_respawntimejitter_long 0
// {{{ powerups
set g_balance_powerup_invincible_takedamage 0.33 // only 1/3rd damage is taken
+set g_balance_powerup_invincible_takeforce 0.33
set g_balance_powerup_invincible_time 30
set g_balance_powerup_strength_damage 3
set g_balance_powerup_strength_force 3
# adem4ik, 2014
# Alex Talker <alextalker7@gmail.com>, 2014-2015
# Andrei Stepanov, 2014
-# Andrei Stepanov, 2014-2017
+# Andrei Stepanov, 2014-2018
# Andrey P <andrey.pyntikov@gmail.com>, 2016
# Artem Vorotnikov <artem@vorotnikov.me>, 2015
# Lord Canistra <lordcanistra@gmail.com>, 2011
"Project-Id-Version: Xonotic\n"
"Report-Msgid-Bugs-To: \n"
"POT-Creation-Date: 2017-07-09 00:35+0200\n"
-"PO-Revision-Date: 2017-09-19 19:55+0000\n"
+"PO-Revision-Date: 2018-02-07 11:27+0000\n"
"Last-Translator: Andrei Stepanov\n"
"Language-Team: Russian (http://www.transifex.com/team-xonotic/xonotic/"
"language/ru/)\n"
"Kill enemies to freeze them, stand next to frozen teammates to revive them; "
"freeze all enemies to win"
msgstr ""
-"Поражайте врагов, чтобы заморозить их всех и выиграть раунд, и "
-"Ñ\80азмоÑ\80аживайÑ\82е Ñ\81оÑ\8eзников, Ñ\81Ñ\82оÑ\8f Ñ\80Ñ\8fдом Ñ\81 ними"
+"Поражайте врагов, чтобы заморозить их всех и выиграть раунд. Размораживайте "
+"союзников, стоя рядом с ними"
#: qcsrc/common/mapinfo.qh:446
msgid "Hold the ball to get points for kills"
#: qcsrc/common/mutators/mutator/waypoints/all.inc:21
msgid "Flag carrier"
-msgstr "Ð\97наменосец"
+msgstr "Флагоносец"
#: qcsrc/common/mutators/mutator/waypoints/all.inc:22
msgid "Enemy carrier"
-msgstr "Вражеский знаменосец"
+msgstr "Вражеский флагоносец"
#: qcsrc/common/mutators/mutator/waypoints/all.inc:23
msgid "Dropped flag"
#: qcsrc/common/mutators/mutator/waypoints/all.inc:29
msgid "Return flag here"
-msgstr "Ð\92еÑ\80нÑ\83Ñ\82Ñ\8c Ñ\84лаг здеÑ\81Ñ\8c"
+msgstr "Ð\92еÑ\80нÑ\83Ñ\82Ñ\8c Ñ\84лаг оÑ\82Ñ\81Ñ\8eда"
#: qcsrc/common/mutators/mutator/waypoints/all.inc:31
#: qcsrc/common/mutators/mutator/waypoints/all.inc:32
#: qcsrc/common/notifications/all.inc:485
#, c-format
msgid "^BG%s%s^K1 was riddled full of holes by ^BG%s^K1's Machine Gun%s%s"
-msgstr "^BG%s%s^K1 был изрешечен Пулемётом ^BG%s^K1%s%s"
+msgstr "^BG%s%s^K1 был изрешечён Пулемётом ^BG%s^K1%s%s"
#: qcsrc/common/notifications/all.inc:486
#: qcsrc/common/notifications/all.inc:790
#: qcsrc/common/notifications/all.inc:573
#, c-format
msgid "^BGThe %senemy^BG got your flag! Retrieve it!"
-msgstr "^BG%sпротивник^BG забрал ваш флаг! Верните его!"
+msgstr "^BG%sÐ\9fротивник^BG забрал ваш флаг! Верните его!"
#: qcsrc/common/notifications/all.inc:574
#, c-format
msgid "^BGThe %senemy (^BG%s%s)^BG got your flag! Retrieve it!"
-msgstr "^BG%sпротивник (^BG%s%s)^BG забрал ваш флаг! Верните его!"
+msgstr "^BG%sÐ\9fротивник (^BG%s%s)^BG забрал ваш флаг! Верните его!"
#: qcsrc/common/notifications/all.inc:575
#, c-format
msgid "^BGThe %senemy^BG got the flag! Retrieve it!"
-msgstr "^BG%sпротивник^BG забрал флаг! Верните его!"
+msgstr "^BG%sÐ\9fротивник^BG забрал флаг! Верните его!"
#: qcsrc/common/notifications/all.inc:576
#, c-format
msgid "^BGThe %senemy (^BG%s%s)^BG got the flag! Retrieve it!"
-msgstr "^BG%sпротивник (^BG%s%s)^BG забрал флаг! Верните его!"
+msgstr "^BG%sÐ\9fротивник (^BG%s%s)^BG забрал флаг! Верните его!"
#: qcsrc/common/notifications/all.inc:577
#, c-format
msgid "^BGThe %senemy^BG got their flag! Retrieve it!"
-msgstr "^BG%sпротивник^BG забрал свой флаг! Верните его!"
+msgstr "^BG%sÐ\9fротивник^BG забрал свой флаг! Верните его!"
#: qcsrc/common/notifications/all.inc:578
#, c-format
msgid "^BGThe %senemy (^BG%s%s)^BG got their flag! Retrieve it!"
-msgstr "^BG%sпротивник (^BG%s%s)^BG забрал свой флаг! Верните его!"
+msgstr "^BG%sÐ\9fротивник (^BG%s%s)^BG забрал свой флаг! Верните его!"
#: qcsrc/common/notifications/all.inc:579
#, c-format
#: qcsrc/menu/xonotic/dialog_hudpanel_ammo.qc:16
msgid "Ammunition display:"
-msgstr "Ð\9fоказ патронов:"
+msgstr "Ð\9eÑ\82обÑ\80ажение патронов:"
#: qcsrc/menu/xonotic/dialog_hudpanel_ammo.qc:19
msgid "Show only current ammo type"
#: qcsrc/menu/xonotic/dialog_hudpanel_ammo.qc:22
#: qcsrc/menu/xonotic/dialog_hudpanel_weapons.qc:44
msgid "Noncurrent alpha:"
-msgstr "Ð\94Ñ\80Ñ\83гаÑ\8f пÑ\80озÑ\80аноÑ\87ть:"
+msgstr "Ð\9dеакÑ\82ивнаÑ\8f пÑ\80озÑ\80аÑ\87ноÑ\81ть:"
#: qcsrc/menu/xonotic/dialog_hudpanel_ammo.qc:26
#: qcsrc/menu/xonotic/dialog_hudpanel_weapons.qc:48
msgid "Noncurrent scale:"
-msgstr "Ð\94Ñ\80Ñ\83гой размер:"
+msgstr "Ð\9dеакÑ\82ивнÑ\8bй размер:"
#: qcsrc/menu/xonotic/dialog_hudpanel_ammo.qc:30
#: qcsrc/menu/xonotic/dialog_hudpanel_itemstime.qc:24
msgid "Align icon:"
-msgstr "Ð\92Ñ\8bÑ\80овнÑ\8fÑ\82Ñ\8c знаÑ\87ок:"
+msgstr "Ð\92Ñ\8bÑ\80овнÑ\8fÑ\82Ñ\8c знаÑ\87ки:"
#: qcsrc/menu/xonotic/dialog_hudpanel_ammo.qc:31
#: qcsrc/menu/xonotic/dialog_hudpanel_centerprint.qc:30
#: qcsrc/menu/xonotic/dialog_settings_effects.qc:65
msgid "Geometry detail:"
-msgstr "Детали геометрии:"
+msgstr "Детализация окружения:"
#: qcsrc/menu/xonotic/dialog_settings_effects.qc:67
msgid "Change the smoothness of the curves on the map (default: normal)"
#: qcsrc/menu/xonotic/dialog_credits.qh:7
msgid "Credits"
-msgstr "制作人员"
+msgstr ""
#: qcsrc/menu/xonotic/dialog_credits.qh:8
msgid "The Xonotic credits"
// per-weapon crosshairs
seta crosshair_per_weapon 1 "when 1, each gun will display a different crosshair"
+// side-scrolling crosshair
+seta crosshair_2d 54 "selects crosshair to use in side-scrolling mode (\"\" uses regular crosshair and 0 is none)"
+
// =========================
// Crosshair ring settings
float autocvar_con_notify;
float autocvar_con_notifysize;
string autocvar_crosshair;
+string autocvar_crosshair_2d = "54";
float autocvar_crosshair_alpha;
string autocvar_crosshair_color;
int autocvar_crosshair_color_special;
string wcross_style;
float wcross_alpha, wcross_resolution;
wcross_style = autocvar_crosshair;
+ if (csqcplayer.viewloc && (csqcplayer.viewloc.spawnflags & VIEWLOC_FREEAIM) && autocvar_crosshair_2d != "")
+ wcross_style = autocvar_crosshair_2d;
if (wcross_style == "0")
return;
wcross_resolution = autocvar_crosshair_size;
string sample = this.(samplefield);
if (sample != "") sample = GlobalSound_sample(sample, random());
float myscale = ((this.scale) ? this.scale : 1); // safety net
- float scale_inverse = 1 / myscale;
// TODO: change volume depending on size too?
- sound7(this, chan, sample, VOL_BASE, ATTEN_NORM, scale_inverse * 100, 0);
+ sound7(this, chan, sample, VOL_BASE, ATTEN_NORM, 100 / myscale, 0);
this.msound_delay = time + sound_delay;
}
{
return false;
}
+ switch(item.itemdef)
+ {
+ case ITEM_HealthMega: return autocvar_g_overkill_filter_healthmega;
+ case ITEM_ArmorMedium: return autocvar_g_overkill_filter_armormedium;
+ case ITEM_ArmorBig: return autocvar_g_overkill_filter_armorbig;
+ case ITEM_ArmorMega: return autocvar_g_overkill_filter_armormega;
+ }
if (!autocvar_g_powerups || !autocvar_g_overkill_powerups_replace)
{
return true;
AUTOCVAR(g_pickup_respawntime_scaling_offset, float, 0.0, "Multiply respawn time by `reciprocal / (p + offset) + linear` where `p` is the current number of players, takes effect with 2 or more players present, `offset` offsets the curve left or right - the results are not intuitive and I recommend plotting the respawn time and the number of items per player to see what's happening");
AUTOCVAR(g_pickup_respawntime_scaling_linear, float, 1.0, "Multiply respawn time by `reciprocal / (p + offset) + linear` where `p` is the current number of players, takes effect with 2 or more players present, `linear` can be used to simply scale the respawn time linearly");
+/// Adjust respawn time according to the number of players.
float adjust_respawntime(float normal_respawntime) {
float r = autocvar_g_pickup_respawntime_scaling_reciprocal;
float o = autocvar_g_pickup_respawntime_scaling_offset;
//LOG_INFOF("item %s will respawn in %f", e.classname, adjusted_respawntime);
// range: adjusted_respawntime - respawntimejitter .. adjusted_respawntime + respawntimejitter
- float actual_time = adjusted_respawntime + crandom() * e.respawntimejitter;
- Item_ScheduleRespawnIn(e, actual_time);
+ float respawn_in = adjusted_respawntime + crandom() * e.respawntimejitter;
+ Item_ScheduleRespawnIn(e, respawn_in);
}
else // if respawntime is -1, this item does not respawn
Item_Show(e, -1);
}
+AUTOCVAR(g_pickup_respawntime_initial_random, int, 1,
+ "For items that don't start spawned: 0: spawn after their normal respawntime; 1: spawn after `random * respawntime` with the *same* random; 2: same as 1 but each item has separate random");
+
+float shared_random;
+STATIC_INIT(shared_random) { shared_random = random(); }
void Item_ScheduleInitialRespawn(entity e)
{
Item_Show(e, 0);
- Item_ScheduleRespawnIn(e, max(0, game_starttime - time) + ((e.respawntimestart) ? e.respawntimestart : ITEM_RESPAWNTIME_INITIAL(e)));
+
+ float spawn_in;
+ if (autocvar_g_pickup_respawntime_initial_random == 0)
+ {
+ // range: respawntime .. respawntime + respawntimejitter
+ spawn_in = e.respawntime + random() * e.respawntimejitter;
+ }
+ else if (autocvar_g_pickup_respawntime_initial_random == 1)
+ {
+ // range:
+ // if respawntime >= ITEM_RESPAWN_TICKS: ITEM_RESPAWN_TICKS .. respawntime + respawntimejitter
+ // else: 0 .. ITEM_RESPAWN_TICKS
+ // this is to prevent powerups spawning unexpectedly without waypoints
+ spawn_in = ITEM_RESPAWN_TICKS + shared_random * (e.respawntime + e.respawntimejitter - ITEM_RESPAWN_TICKS);
+ }
+ else
+ {
+ // range: same as 1
+ spawn_in = ITEM_RESPAWN_TICKS + random() * (e.respawntime + e.respawntimejitter - ITEM_RESPAWN_TICKS);
+ }
+
+ Item_ScheduleRespawnIn(e, max(0, game_starttime - time) + ((e.respawntimestart) ? e.respawntimestart : spawn_in));
}
void GiveRandomWeapons(entity receiver, int num_weapons, string weapon_names,
const float ITEM_RESPAWN_TICKS = 10;
-#define ITEM_RESPAWNTIME_INITIAL(i) (ITEM_RESPAWN_TICKS + random() * ((i).respawntime + (i).respawntimejitter - ITEM_RESPAWN_TICKS))
- // range: 10 .. respawntime + respawntimejitter
-
.float max_armorvalue;
.float pickup_anyway;
#include <common/triggers/target/location.qc>
#include <common/triggers/target/music.qc>
#include <common/triggers/target/spawn.qc>
+#include <common/triggers/target/spawnpoint.qc>
#include <common/triggers/target/speaker.qc>
#include <common/triggers/target/voicescript.qc>
#include <common/triggers/target/location.qh>
#include <common/triggers/target/music.qh>
#include <common/triggers/target/spawn.qh>
+#include <common/triggers/target/spawnpoint.qh>
#include <common/triggers/target/speaker.qh>
#include <common/triggers/target/voicescript.qh>
#include "location.qc"
#include "music.qc"
#include "spawn.qc"
+#include "spawnpoint.qc"
#include "speaker.qc"
#include "voicescript.qc"
--- /dev/null
+#include "spawnpoint.qh"
+
+#ifdef SVQC
+void target_spawnpoint_use(entity this, entity actor, entity trigger)
+{
+ if(this.active != ACTIVE_ACTIVE)
+ return;
+
+ actor.spawnpoint_targ = this;
+}
+
+void target_spawnpoint_reset(entity this)
+{
+ this.active = ACTIVE_ACTIVE;
+}
+
+// TODO: persistent spawnflag?
+spawnfunc(target_spawnpoint)
+{
+ this.active = ACTIVE_ACTIVE;
+ this.use = target_spawnpoint_use;
+ this.reset = target_spawnpoint_reset;
+}
+#endif
--- /dev/null
+#pragma once
+
+#ifdef SVQC
+.entity spawnpoint_targ;
+#endif
bool AuxiliaryXhair_customize(entity this, entity client)
{
- //entity e = WaypointSprite_getviewentity(client);
- entity axh = client.(AuxiliaryXhair[this.cnt]);
+ entity e = WaypointSprite_getviewentity(client);
+ entity axh = e.(AuxiliaryXhair[this.cnt]);
return axh.owner == this.owner; // cheaply check if the client's axh owner is the same as our real owner
}
me.gotoRC(me, 1.25, 0);
me.TD(me, 1, 1, e = makeXonoticTextLabel(0, _("Geometry detail:")));
me.TD(me, 1, 2, e = makeXonoticTextSlider_T("r_subdivisions_tolerance",
- _("Change the smoothness of the curves on the map (default: normal)")));
+ _("Change the smoothness of the curves on the map")));
e.addValue(e, ZCTX(_("DET^Lowest")), "16");
e.addValue(e, ZCTX(_("DET^Low")), "8");
e.addValue(e, ZCTX(_("DET^Normal")), "4");
{
me.TDempty(me, 0.2);
me.TD(me, 1, 2.8, e = makeXonoticCheckBoxEx_T(3, 0, "r_showsurfaces", _("Show surfaces"),
- _("Disable textures completely for very slow hardware. This gives a huge performance boost, but looks very ugly. (default: disabled)")));
+ _("Disable textures completely for very slow hardware. This gives a huge performance boost, but looks very ugly.")));
}
me.TR(me);
me.TD(me, 1, 1, e = makeXonoticCheckBox_T(1, "mod_q3bsp_nolightmaps", _("Use lightmaps"),
- _("Use high resolution lightmaps, which will look pretty but use up some extra video memory (default: enabled)")));
+ _("Use high resolution lightmaps, which will look pretty but use up some extra video memory")));
e.applyButton = effectsApplyButton;
me.TD(me, 1, 1, e = makeXonoticCheckBox_T(0, "r_glsl_deluxemapping", _("Deluxe mapping"),
- _("Use per-pixel lighting effects (default: enabled)")));
+ _("Use per-pixel lighting effects")));
setDependentAND(e, "vid_gl20", 1, 1, "mod_q3bsp_nolightmaps", 0, 0);
me.TD(me, 1, 1, e = makeXonoticCheckBox_T(0, "r_shadow_gloss", _("Gloss"),
- _("Enable the use of glossmaps on textures supporting it (default: enabled)")));
+ _("Enable the use of glossmaps on textures supporting it")));
setDependentAND3(e, "vid_gl20", 1, 1, "mod_q3bsp_nolightmaps", 0, 0, "r_glsl_deluxemapping", 1, 1);
me.TR(me);
me.TD(me, 1, 1, e = makeXonoticCheckBox_T(0, "r_glsl_offsetmapping", _("Offset mapping"),
- _("Offset mapping effect that will make textures with bumpmaps appear like they \"pop out\" of the flat 2D surface (default: disabled)")));
+ _("Offset mapping effect that will make textures with bumpmaps appear like they \"pop out\" of the flat 2D surface")));
setDependent(e, "vid_gl20", 1, 1);
me.TD(me, 1, 1, e = makeXonoticCheckBox_T(0, "r_glsl_offsetmapping_reliefmapping", _("Relief mapping"),
- _("Higher quality offset mapping, which also has a huge impact on performance (default: disabled)")));
+ _("Higher quality offset mapping, which also has a huge impact on performance")));
setDependentAND(e, "vid_gl20", 1, 1, "r_glsl_offsetmapping", 1, 1);
me.TR(me);
me.TD(me, 1, 1, e = makeXonoticCheckBox_T(0, "r_water", _("Reflections:"),
- _("Reflection and refraction quality, has a huge impact on performance on maps with reflecting surfaces (default: disabled)")));
+ _("Reflection and refraction quality, has a huge impact on performance on maps with reflecting surfaces")));
setDependent(e, "vid_gl20", 1, 1);
me.TD(me, 1, 2, e = makeXonoticTextSlider_T("r_water_resolutionmultiplier",
- _("Resolution of reflections/refractions (default: good)")));
+ _("Resolution of reflections/refractions")));
e.addValue(e, _("Blurred"), "0.25");
e.addValue(e, ZCTX(_("REFL^Good")), "0.5");
e.addValue(e, _("Sharp"), "1");
setDependentAND(e, "vid_gl20", 1, 1, "r_water", 1, 1);
me.TR(me);
me.TD(me, 1, 1, e = makeXonoticCheckBox_T(0, "cl_decals", _("Decals"),
- _("Enable decals (bullet holes and blood) (default: enabled)")));
+ _("Enable decals (bullet holes and blood)")));
me.TD(me, 1, 2, e = makeXonoticCheckBox(0, "cl_decals_models", _("Decals on models")));
setDependent(e, "cl_decals", 1, 1);
me.TR(me);
me.TD(me, 1, 0.8, e = makeXonoticTextLabel(0, _("Distance:")));
setDependent(e, "cl_decals", 1, 1);
me.TD(me, 1, 2, e = makeXonoticSlider_T(200, 500, 20, "r_drawdecals_drawdistance",
- _("Decals further away than this will not be drawn (default: 300)")));
+ _("Decals further away than this will not be drawn")));
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_T(1, 20, 1, "cl_decals_fadetime",
- _("Time in seconds before decals fade away (default: 2)")));
+ _("Time in seconds before decals fade away")));
setDependent(e, "cl_decals", 1, 1);
me.TR(me);
me.TDempty(me, 0.2);
me.gotoRC(me, 1.25, 3.2); me.setFirstColumn(me, me.currentColumn);
me.TD(me, 1, 3, e = makeXonoticRadioButton_T(1, "r_coronas", "0", _("No dynamic lighting"),
- _("Enable corona flares around certain lights (default: enabled)")));
+ _("Enable corona flares around certain lights")));
me.TR(me);
me.TD(me, 1, 3, e = makeXonoticRadioButton_T(1, "gl_flashblend", string_null, _("Fake corona lighting"),
- _("Enable faster but uglier dynamic lights by rendering bright coronas instead of real dynamic lights (default: disabled)")));
+ _("Enable faster but uglier dynamic lights by rendering bright coronas instead of real dynamic lights")));
makeMulti(e, "r_coronas");
me.TR(me);
me.TD(me, 1, 2, e = makeXonoticRadioButton_T(1, "r_shadow_realtime_dlight", string_null, _("Realtime dynamic lighting"),
- _("Enable rendering of dynamic lights such as explosions and rocket lights (default: enabled)")));
+ _("Enable rendering of dynamic lights such as explosions and rocket lights")));
makeMulti(e, "r_coronas");
me.TD(me, 1, 1, e = makeXonoticCheckBox_T(0, "r_shadow_realtime_dlight_shadows", _("Shadows"),
- _("Enable rendering of shadows from dynamic lights (default: disabled)")));
+ _("Enable rendering of shadows from dynamic lights")));
setDependent(e, "r_shadow_realtime_dlight", 1, 1);
me.TR(me);
me.TD(me, 1, 2, e = makeXonoticCheckBox_T(0, "r_shadow_realtime_world", _("Realtime world lighting"),
- _("Enable rendering of full realtime world lighting on maps that support it. Note that this might have a big impact on performance. (default: disabled)")));
+ _("Enable rendering of full realtime world lighting on maps that support it. Note that this might have a big impact on performance.")));
me.TD(me, 1, 1, e = makeXonoticCheckBox_T(0, "r_shadow_realtime_world_shadows", _("Shadows"),
- _("Enable rendering of shadows from realtime world lights (default: disabled)")));
+ _("Enable rendering of shadows from realtime world lights")));
setDependent(e, "r_shadow_realtime_world", 1, 1);
me.TR(me);
me.TDempty(me, 0.2);
me.TD(me, 1, 1.8, e = makeXonoticCheckBox_T(0, "r_shadow_usenormalmap", _("Use normal maps"),
- _("Enable use of directional shading on textures (default: enabled)")));
+ _("Enable use of directional shading on textures")));
setDependentOR(e, "r_shadow_realtime_dlight", 1, 1, "r_shadow_realtime_world", 1, 1);
me.TD(me, 1, 1, e = makeXonoticCheckBox(0, "r_shadow_shadowmapping", _("Soft shadows")));
setDependentWeird(e, someShadowCvarIsEnabled);
me.TR(me);
me.TDempty(me, 0.2);
me.TD(me, 1, 2.8, e = makeXonoticCheckBox_T(0, "r_coronas_occlusionquery", _("Fade corona according to visibility"),
- _("Fade coronas according to visibility (default: enabled)")));
+ _("Fade coronas according to visibility")));
setDependent(e, "r_coronas", 1, 1);
me.TR(me);
me.TR(me);
me.TD(me, 1, 1, e = makeXonoticCheckBox_T(0, "r_bloom", _("Bloom"),
- _("Enable bloom effect, which brightens the neighboring pixels of very bright pixels. Has a big impact on performance. (default: disabled)")));
+ _("Enable bloom effect, which brightens the neighboring pixels of very bright pixels. Has a big impact on performance.")));
me.TD(me, 1, 2, e = makeXonoticCheckBoxEx_T(0.5, 0, "hud_postprocessing_maxbluralpha", _("Extra postprocessing effects"),
- _("Enables special postprocessing effects for when damaged or under water or using a powerup (default: disabled)")));
+ _("Enables special postprocessing effects for when damaged or under water or using a powerup")));
makeMulti(e, "hud_powerup");
setDependent(e, "vid_gl20", 1, 1);
me.TR(me);
me.TD(me, 1, 0.8, e = makeXonoticTextLabel(0, _("Quality:")));
setDependent(e, "cl_particles", 1, 1);
me.TD(me, 1, 2, e = makeXonoticSlider_T(0, 3.0, 0.25, "cl_particles_quality",
- _("Multiplier for amount of particles. Less means less particles, which in turn gives for better performance (default: 1.0)")));
+ _("Multiplier for amount of particles. Less means less particles, which in turn gives for better performance")));
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_T(200, 3000, 200, "r_drawparticles_drawdistance",
- _("Particles further away than this will not be drawn (default: 1000)")));
+ _("Particles further away than this will not be drawn")));
setDependent(e, "cl_particles", 1, 1);
me.gotoRC(me, me.rows - 1, 0);
me.gotoRC(me, 0, 3.2); me.setFirstColumn(me, me.currentColumn);
me.TD(me, 1, 1, e = makeXonoticTextLabel(0, _("Field of view:")));
me.TD(me, 1, 2, e = makeXonoticSlider_T(60, 130, 5, "fov",
- _("Field of vision in degrees (default: 100)")));
+ _("Field of vision in degrees")));
me.TR(me);
me.TR(me);
//me.TDempty(me, 0.2);
me.gotoRC(me, 11.5, 3.25); me.setFirstColumn(me, me.currentColumn);
me.TD(me, 1, 2.5, e = makeXonoticCheckBox_T(0, "cl_gentle", _("Disable gore effects and harsh language"),
- _("Replace blood and gibs with content that does not have any gore effects (default: disabled)")));
+ _("Replace blood and gibs with content that does not have any gore effects")));
e.applyButton = userApplyButton;
me.gotoRC(me, me.rows - 1, 0);
me.TD(me, 1, 1, e = makeXonoticCheckBox(0, "vid_fullscreen", _("Full screen")));
e.applyButton = videoApplyButton;
me.TD(me, 1, 2, e = makeXonoticCheckBox_T(0, "vid_vsync", _("Vertical Synchronization"),
- _("Enable vertical synchronization to prevent tearing, will cap your fps to the screen refresh rate (default: disabled)")));
+ _("Enable vertical synchronization to prevent tearing, will cap your fps to the screen refresh rate")));
me.TR(me);
if(cvar("developer"))
{
me.TD(me, 1, 3, e = makeXonoticCheckBox_T(0, "v_flipped", _("Flip view horizontally"),
- _("Poor man's left handed mode (default: off)")));
+ _("Poor man's left handed mode")));
}
me.TR(me);
me.TD(me, 1, 1, e = makeXonoticTextLabel(0, _("Anisotropy:")));
me.TD(me, 1, 2, e = makeXonoticTextSlider_T("gl_texture_anisotropy",
- _("Anisotropic filtering quality (default: 1x)")));
+ _("Anisotropic filtering quality")));
e.addValue(e, ZCTX(_("ANISO^Disabled")), "1");
e.addValue(e, _("2x"), "2");
e.addValue(e, _("4x"), "4");
me.TD(me, 1, 1, e = makeXonoticTextLabel(0, _("Antialiasing:")));
setDependent(e, "r_viewfbo", 0, 0);
me.TD(me, 1, 2, e = makeXonoticTextSlider_T("vid_samples",
- _("Enable antialiasing, which smooths the edges of 3D geometry. Note that it might decrease performance by quite a lot (default: disabled)")));
+ _("Enable antialiasing, which smooths the edges of 3D geometry. Note that it might decrease performance by quite a lot")));
e.addValue(e, ZCTX(_("AA^Disabled")), "1");
e.addValue(e, _("2x"), "2");
e.addValue(e, _("4x"), "4");
me.TR(me);
me.TD(me, 1, 1, e = makeXonoticTextLabel(0, _("Depth first:")));
me.TD(me, 1, 2, e = makeXonoticTextSlider_T("r_depthfirst",
- _("Eliminate overdraw by rendering a depth-only version of the scene before the normal rendering starts (default: disabled)")));
+ _("Eliminate overdraw by rendering a depth-only version of the scene before the normal rendering starts")));
e.addValue(e, ZCTX(_("DF^Disabled")), "0");
e.addValue(e, ZCTX(_("DF^World")), "1");
e.addValue(e, ZCTX(_("DF^All")), "2");
me.TDempty(me, 0.2);
me.TD(me, 1, 0.9, e = makeXonoticRadioButton(1, "gl_vbo", "0", ZCTX(_("VBO^Off"))));
me.TD(me, 1, 1.9, e = makeXonoticRadioButton_T(1, "gl_vbo", "3", _("Vertices, some Tris (compatible)"),
- _("Make use of Vertex Buffer Objects to store static geometry in video memory for faster rendering (default: Vertex and Triangles)")));
+ _("Make use of Vertex Buffer Objects to store static geometry in video memory for faster rendering")));
me.TR(me);
me.TDempty(me, 0.2);
me.TD(me, 1, 0.9, e = makeXonoticRadioButton_T(1, "gl_vbo", "2", _("Vertices"),
- _("Make use of Vertex Buffer Objects to store static geometry in video memory for faster rendering (default: Vertex and Triangles)")));
+ _("Make use of Vertex Buffer Objects to store static geometry in video memory for faster rendering")));
me.TD(me, 1, 1.9, e = makeXonoticRadioButton_T(1, "gl_vbo", "1", _("Vertices and Triangles"),
- _("Make use of Vertex Buffer Objects to store static geometry in video memory for faster rendering (default: Vertex and Triangles)")));
+ _("Make use of Vertex Buffer Objects to store static geometry in video memory for faster rendering")));
me.gotoRC(me, 0, 3.2); me.setFirstColumn(me, me.currentColumn);
me.TD(me, 1, 1, e = makeXonoticTextLabel(0, _("Brightness:")));
me.TD(me, 1, 2, e = makeXonoticSlider_T(0.0, 0.5, 0.02, "v_brightness",
- _("Brightness of black (default: 0)")));
+ _("Brightness of black")));
me.TR(me);
me.TD(me, 1, 1, e = makeXonoticTextLabel(0, _("Contrast:")));
me.TD(me, 1, 2, e = makeXonoticSlider_T(1.0, 3.0, 0.05, "v_contrast",
- _("Brightness of white (default: 1)")));
+ _("Brightness of white")));
me.TR(me);
me.TD(me, 1, 1, e = makeXonoticTextLabel(0, _("Gamma:")));
setDependentAND(e, "vid_gl20", 1, 1, "v_glslgamma", 1, 1);
me.TD(me, 1, 2, e = makeXonoticSlider_T(0.5, 2.0, 0.05, "v_gamma",
- _("Inverse gamma correction value, a brightness effect that does not affect white or black (default: 1.125)")));
+ _("Inverse gamma correction value, a brightness effect that does not affect white or black")));
setDependentAND(e, "vid_gl20", 1, 1, "v_glslgamma", 1, 1);
me.TR(me);
me.TD(me, 1, 1, e = makeXonoticTextLabel(0, _("Contrast boost:")));
setDependentAND(e, "vid_gl20", 1, 1, "v_glslgamma", 1, 1);
me.TD(me, 1, 2, e = makeXonoticSlider_T(1.0, 5.0, 0.1, "v_contrastboost",
- _("By how much to multiply the contrast in dark areas (default: 1)")));
+ _("By how much to multiply the contrast in dark areas")));
setDependentAND(e, "vid_gl20", 1, 1, "v_glslgamma", 1, 1);
me.TR(me);
me.TD(me, 1, 1, e = makeXonoticTextLabel(0, _("Saturation:")));
setDependent(e, "vid_gl20", 1, 1);
me.TD(me, 1, 2, e = makeXonoticSlider_T(0.5, 2.0, 0.05, "r_glsl_saturation",
- _("Saturation adjustment (0 = grayscale, 1 = normal, 2 = oversaturated), requires GLSL color control (default: 1)")));
+ _("Saturation adjustment (0 = grayscale, 1 = normal, 2 = oversaturated), requires GLSL color control")));
setDependent(e, "vid_gl20", 1, 1);
me.TR(me);
me.TR(me);
me.TD(me, 1, 1, e = makeXonoticTextLabel(0, ZCTX(_("LIT^Ambient:"))));
me.TD(me, 1, 2, e = makeXonoticSlider_T(0, 20.0, 0.25, "r_ambient",
- _("Ambient lighting, if set too high it tends to make light on maps look dull and flat (default: 4)")));
+ _("Ambient lighting, if set too high it tends to make light on maps look dull and flat")));
me.TR(me);
me.TD(me, 1, 1, e = makeXonoticTextLabel(0, _("Intensity:")));
me.TD(me, 1, 2, e = makeXonoticSlider_T(0.5, 2.0, 0.05, "r_hdr_scenebrightness",
- _("Global rendering brightness (default: 1)")));
+ _("Global rendering brightness")));
me.TR(me);
me.TR(me);
me.TD(me, 1, 3, e = makeXonoticCheckBox_T(0, "gl_finish", _("Wait for GPU to finish each frame"),
- _("Make the CPU wait for the GPU to finish each frame, can help with some strange input or video lag on some machines (default: disabled)")));
+ _("Make the CPU wait for the GPU to finish each frame, can help with some strange input or video lag on some machines")));
me.TR(me);
me.TD(me, 1, 3, e = makeXonoticCheckBox(0, "vid_gl20", _("Use OpenGL 2.0 shaders (GLSL)")));
e.applyButton = videoApplyButton;
me.TR(me);
me.TDempty(me, 0.2);
me.TD(me, 1, 2.8, e = makeXonoticCheckBox_T(0, "v_glslgamma", _("Use GLSL to handle color control"),
- _("Enable use of GLSL to apply gamma correction, note that it might decrease performance by a lot (default: disabled)")));
+ _("Enable use of GLSL to apply gamma correction, note that it might decrease performance by a lot")));
setDependent(e, "vid_gl20", 1, 1);
if(cvar("developer"))
{
void XonoticParticlesSlider_configureXonoticParticlesSlider(entity me)
{
me.configureXonoticTextSlider(me, "cl_particles_quality",
- _("Multiplier for amount of particles. Less means less particles, which in turn gives for better performance (default: 1)"));
+ _("Multiplier for amount of particles. Less means less particles, which in turn gives for better performance"));
if(cvar("developer")) { me.addValue(me, ZCTX(_("PART^OMG")), "0.25 250 0"); }
me.addValue(me, ZCTX(_("PART^Low")), "0.5 500 0");
me.addValue(me, ZCTX(_("PART^Medium")), "0.75 750 0");
void XonoticPicmipSlider_configureXonoticPicmipSlider(entity me)
{
me.configureXonoticTextSlider(me, "gl_picmip",
- _("Change the sharpness of the textures. Lowering it will effectively reduce texture memory usage, but make the textures appear very blurry. (default: good)"));
+ _("Change the sharpness of the textures. Lowering it will effectively reduce texture memory usage, but make the textures appear very blurry."));
me.autofix(me);
me.have_s3tc = GL_Have_TextureCompression();
}
float autocvar_g_balance_portal_health;
float autocvar_g_balance_portal_lifetime;
float autocvar_g_balance_powerup_invincible_takedamage;
+float autocvar_g_balance_powerup_invincible_takeforce = 0.33;
//float autocvar_g_balance_powerup_invincible_time;
float autocvar_g_balance_powerup_strength_damage;
float autocvar_g_balance_powerup_strength_force;
bool autocvar_sv_precacheplayermodels;
//float autocvar_sv_precacheweapons; // WEAPONTODO?
bool autocvar_sv_q3acompat_machineshotgunswap;
-bool autocvar_sv_ready_restart;
-bool autocvar_sv_ready_restart_after_countdown;
-bool autocvar_sv_ready_restart_repeatable;
bool autocvar_sv_servermodelsonly;
int autocvar_sv_spectate;
float autocvar_sv_spectator_speed_multiplier;
#include "../common/triggers/func/conveyor.qh"
#include "../common/triggers/teleporters.qh"
+#include "../common/triggers/target/spawnpoint.qh"
#include "../common/vehicles/all.qh"
this.viewloc = NULL;
+ //this.spawnpoint_targ = NULL; // keep it so they can return to where they were?
+
this.weaponmodel = "";
for (int slot = 0; slot < MAX_WEAPONSLOTS; ++slot)
{
this.pauserothealth_finished = time + autocvar_g_balance_pause_health_rot_spawn;
this.pauserotfuel_finished = time + autocvar_g_balance_pause_fuel_rot_spawn;
this.pauseregen_finished = time + autocvar_g_balance_pause_health_regen_spawn;
- // extend the pause of rotting if client was reset at the beginning of the countdown
- if (!autocvar_sv_ready_restart_after_countdown && time < game_starttime) { // TODO why is this cvar NOTted?
+ if (!sv_ready_restart_after_countdown && time < game_starttime)
+ {
float f = game_starttime - time;
this.spawnshieldtime += f;
this.pauserotarmor_finished += f;
this.pauserothealth_finished += f;
this.pauseregen_finished += f;
}
+
this.damageforcescale = 2;
this.death_time = 0;
this.respawn_flags = 0;
this.viewloc = NULL;
+ for(int slot = 0; slot < MAX_AXH; ++slot)
+ {
+ entity axh = this.(AuxiliaryXhair[slot]);
+ this.(AuxiliaryXhair[slot]) = NULL;
+
+ if(axh.owner == this && axh != NULL && !wasfreed(axh))
+ delete(axh);
+ }
+
+ this.spawnpoint_targ = NULL;
+
this.crouch = false;
this.view_ofs = STAT(PL_VIEW_OFS, this);
setsize(this, STAT(PL_MIN, this), STAT(PL_MAX, this));
this.(weaponentity) = spectatee.(weaponentity);
}
- for(int slot = 0; slot < MAX_AXH; ++slot)
- {
- this.(AuxiliaryXhair[slot]) = spectatee.(AuxiliaryXhair[slot]);
- }
-
anticheat_spectatecopy(this, spectatee);
this.hud = spectatee.hud;
if(spectatee.vehicle)
{
if (IS_CLIENT(caller))
{
- if (warmup_stage || autocvar_sv_ready_restart || g_race_qualifying == 2)
+ if (warmup_stage || sv_ready_restart || g_race_qualifying == 2)
{
- if (!readyrestart_happened || autocvar_sv_ready_restart_repeatable)
+ if (!readyrestart_happened || sv_ready_restart_repeatable)
{
if (time < game_starttime) // game is already restarting
return;
}
// initiate the restart-countdown-announcer entity
- if (autocvar_sv_ready_restart_after_countdown)
+ if (sv_ready_restart_after_countdown)
{
entity restart_timer = new_pure(restart_timer);
setthink(restart_timer, ReadyRestart_think);
{
FOREACH_CLIENT(IS_PLAYER(it) && IS_REAL_CLIENT(it), { CS(it).allowed_timeouts = autocvar_sv_timeout_number; });
}
- // reset map immediately if this cvar is not set
- if (!autocvar_sv_ready_restart_after_countdown) reset_map(true);
+
+ if (!sv_ready_restart_after_countdown) reset_map(true);
if (autocvar_sv_eventlog) GameLogEcho(":restart");
}
// Reset ALL scores, but only do that at the beginning of the countdown if sv_ready_restart_after_countdown is off!
// Otherwise scores could be manipulated during the countdown.
- if (!autocvar_sv_ready_restart_after_countdown) Score_ClearAll();
+ if (!sv_ready_restart_after_countdown) Score_ClearAll();
ReadyRestart_force();
}
float warmup_stage;
float g_jetpack;
+bool sv_ready_restart;
+bool sv_ready_restart_after_countdown;
+bool sv_ready_restart_repeatable;
+
float sv_clones;
float sv_foginterval;
// apply invincibility multiplier
if (targ.items & ITEM_Shield.m_itemid)
+ {
damage = damage * autocvar_g_balance_powerup_invincible_takedamage;
+ if (targ != attacker)
+ {
+ force = force * autocvar_g_balance_powerup_invincible_takeforce;
+ }
+ }
}
if (targ == attacker)
sv_maxidle_slots_countbots = cvar("sv_maxidle_slots_countbots");
sv_autotaunt = cvar("sv_autotaunt");
sv_taunt = cvar("sv_taunt");
+ sv_ready_restart = cvar("sv_ready_restart");
+ sv_ready_restart_after_countdown = cvar("sv_ready_restart_after_countdown");
+ sv_ready_restart_repeatable = cvar("sv_ready_restart_repeatable");
warmup_stage = cvar("g_warmup");
warmup_limit = cvar("g_warmup_limit");
MUTATOR_HOOKFUNCTION(as, ReadLevelCvars)
{
- // no assault warmups
+ // incompatible
warmup_stage = 0;
+ sv_ready_restart_after_countdown = 0;
}
MUTATOR_HOOKFUNCTION(as, OnEntityPreSpawn)
#include <common/net_linked.qh>
#include "../common/teams.qh"
#include "../common/triggers/subs.qh"
+#include "../common/triggers/target/spawnpoint.qh"
#include "../common/util.qh"
#include "../lib/warpzone/common.qh"
#include "../lib/warpzone/util_server.qh"
if (spot)
return spot;
+ if(this.spawnpoint_targ)
+ return this.spawnpoint_targ;
+
if(anypoint || autocvar_g_spawn_useallspawns)
teamcheck = -1;
else if(have_team_spawns > 0)
bool forbidWeaponUse(entity player)
{
- if (time < game_starttime && !autocvar_sv_ready_restart_after_countdown) return true;
+ if (time < game_starttime && !sv_ready_restart_after_countdown) return true;
if (player.player_blocked) return true;
if (game_stopped) return true;
if (STAT(FROZEN, player)) return true;