Merge branch 'master' into terencehill/bot_waypoints
authorMario <mario@smbclan.net>
Thu, 29 Aug 2019 04:19:38 +0000 (14:19 +1000)
committerMario <mario@smbclan.net>
Thu, 29 Aug 2019 04:19:38 +0000 (14:19 +1000)
# Conflicts:
# .gitlab-ci.yml

67 files changed:
.gitlab-ci.yml
bal-wep-mario.cfg
bal-wep-xdf.cfg
bal-wep-xonotic.cfg
bal-wep-xpm.cfg
commands.cfg
crosshairs.cfg
gamemodes-server.cfg
qcsrc/client/autocvars.qh
qcsrc/client/commands/cl_cmd.qc
qcsrc/client/defs.qh
qcsrc/client/main.qc
qcsrc/client/view.qc
qcsrc/common/csqcmodel_settings.qh
qcsrc/common/effects/qc/casings.qc
qcsrc/common/gamemodes/gamemode/clanarena/sv_clanarena.qc
qcsrc/common/gamemodes/gamemode/clanarena/sv_clanarena.qh
qcsrc/common/gamemodes/gamemode/freezetag/sv_freezetag.qc
qcsrc/common/gamemodes/gamemode/freezetag/sv_freezetag.qh
qcsrc/common/gamemodes/gamemode/lms/sv_lms.qc
qcsrc/common/gamemodes/gamemode/lms/sv_lms.qh
qcsrc/common/gamemodes/gamemode/nexball/weapon.qh
qcsrc/common/mapobjects/misc/teleport_dest.qc
qcsrc/common/mapobjects/teleporters.qc
qcsrc/common/monsters/sv_monsters.qc
qcsrc/common/mutators/mutator/buffs/cl_buffs.qh
qcsrc/common/mutators/mutator/dodging/_mod.inc
qcsrc/common/mutators/mutator/dodging/_mod.qh
qcsrc/common/mutators/mutator/dodging/cl_dodging.qc [new file with mode: 0644]
qcsrc/common/mutators/mutator/dodging/cl_dodging.qh [new file with mode: 0644]
qcsrc/common/mutators/mutator/dodging/sv_dodging.qc
qcsrc/common/mutators/mutator/multijump/multijump.qc
qcsrc/common/mutators/mutator/nades/nades.qc
qcsrc/common/mutators/mutator/nades/nades.qh
qcsrc/common/mutators/mutator/spawn_near_teammate/_mod.inc
qcsrc/common/mutators/mutator/spawn_near_teammate/_mod.qh
qcsrc/common/mutators/mutator/spawn_near_teammate/cl_spawn_near_teammate.qc [new file with mode: 0644]
qcsrc/common/mutators/mutator/spawn_near_teammate/cl_spawn_near_teammate.qh [new file with mode: 0644]
qcsrc/common/notifications/all.qh
qcsrc/common/physics/movetypes/movetypes.qc
qcsrc/common/state.qc
qcsrc/common/stats.qh
qcsrc/common/t_items.qc
qcsrc/common/weapons/all.qh
qcsrc/common/wepent.qc
qcsrc/common/wepent.qh
qcsrc/lib/csqcmodel/cl_model.qc
qcsrc/lib/csqcmodel/cl_model.qh
qcsrc/lib/csqcmodel/sv_model.qc
qcsrc/lib/csqcmodel/sv_model.qh
qcsrc/lib/replicate.qh
qcsrc/lib/spawnfunc.qh
qcsrc/menu/xonotic/dialog_multiplayer_media_screenshot.qc
qcsrc/menu/xonotic/dialog_multiplayer_profile.qc
qcsrc/menu/xonotic/dialog_settings_game_view.qc
qcsrc/menu/xonotic/dialog_settings_game_weapons.qc
qcsrc/menu/xonotic/dialog_settings_user.qc
qcsrc/server/client.qc
qcsrc/server/command/cmd.qc
qcsrc/server/defs.qh
qcsrc/server/g_world.qc
qcsrc/server/miscfunctions.qc
qcsrc/server/mutators/events.qh
qcsrc/server/weapons/spawning.qc
qcsrc/server/weapons/weaponsystem.qc
xonotic-client.cfg
xonotic-server.cfg

index 83112310c270c3b0a68d945427ab158f57981832..094013796d99ccc391e7d134aac75687d0cc615f 100644 (file)
@@ -29,7 +29,7 @@ test_sv_game:
     - 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=4eb3a666f96bd7ac7d84d0019237d23c
+    - EXPECT=0a8b491cd50a1e77d930b048c98da88f
     - HASH=$(${ENGINE} -noconfig -nohome +exec serverbench.cfg
       | tee /dev/stderr
       | grep '^:'
index 5859862778bb341b660c795645e0ff093a2c1d78..56eaa61cd94d48fdf7e432a3ef5fba88124ae2d4 100644 (file)
@@ -3,8 +3,8 @@ set g_balance_blaster_primary_animtime 0.2
 set g_balance_blaster_primary_damage 20
 set g_balance_blaster_primary_delay 0
 set g_balance_blaster_primary_edgedamage 10
-set g_balance_blaster_primary_force 300
-set g_balance_blaster_primary_force_zscale 1.25
+set g_balance_blaster_primary_force 375
+set g_balance_blaster_primary_force_zscale 1
 set g_balance_blaster_primary_lifetime 5
 set g_balance_blaster_primary_radius 60
 set g_balance_blaster_primary_refire 0.7
@@ -16,8 +16,8 @@ set g_balance_blaster_secondary_animtime 0.2
 set g_balance_blaster_secondary_damage 25
 set g_balance_blaster_secondary_delay 0
 set g_balance_blaster_secondary_edgedamage 12.5
-set g_balance_blaster_secondary_force 300
-set g_balance_blaster_secondary_force_zscale 1.2
+set g_balance_blaster_secondary_force 360
+set g_balance_blaster_secondary_force_zscale 1
 set g_balance_blaster_secondary_lifetime 5
 set g_balance_blaster_secondary_radius 70
 set g_balance_blaster_secondary_refire 0.7
@@ -448,8 +448,8 @@ set g_balance_vaporizer_secondary_animtime 0.2
 set g_balance_vaporizer_secondary_damage 25
 set g_balance_vaporizer_secondary_delay 0
 set g_balance_vaporizer_secondary_edgedamage 12.5
-set g_balance_vaporizer_secondary_force 400
-set g_balance_vaporizer_secondary_force_zscale 1.2
+set g_balance_vaporizer_secondary_force 480
+set g_balance_vaporizer_secondary_force_zscale 1
 set g_balance_vaporizer_secondary_lifetime 5
 set g_balance_vaporizer_secondary_radius 70
 set g_balance_vaporizer_secondary_refire 0.7
index 149895e664f0c388fa41e23d03d2021821a3412e..15bc65034e7f0dbf07c8c2fdb8925c34bb50f4c5 100644 (file)
@@ -3,8 +3,8 @@ set g_balance_blaster_primary_animtime 0.2
 set g_balance_blaster_primary_damage 20
 set g_balance_blaster_primary_delay 0
 set g_balance_blaster_primary_edgedamage 10
-set g_balance_blaster_primary_force 300
-set g_balance_blaster_primary_force_zscale 1.25
+set g_balance_blaster_primary_force 375
+set g_balance_blaster_primary_force_zscale 1
 set g_balance_blaster_primary_lifetime 5
 set g_balance_blaster_primary_radius 60
 set g_balance_blaster_primary_refire 0.7
@@ -16,8 +16,8 @@ set g_balance_blaster_secondary_animtime 0.2
 set g_balance_blaster_secondary_damage 25
 set g_balance_blaster_secondary_delay 0
 set g_balance_blaster_secondary_edgedamage 12.5
-set g_balance_blaster_secondary_force 300
-set g_balance_blaster_secondary_force_zscale 1.2
+set g_balance_blaster_secondary_force 360
+set g_balance_blaster_secondary_force_zscale 1
 set g_balance_blaster_secondary_lifetime 5
 set g_balance_blaster_secondary_radius 70
 set g_balance_blaster_secondary_refire 0.7
@@ -448,8 +448,8 @@ set g_balance_vaporizer_secondary_animtime 0.2
 set g_balance_vaporizer_secondary_damage 25
 set g_balance_vaporizer_secondary_delay 0
 set g_balance_vaporizer_secondary_edgedamage 12.5
-set g_balance_vaporizer_secondary_force 400
-set g_balance_vaporizer_secondary_force_zscale 1.2
+set g_balance_vaporizer_secondary_force 480
+set g_balance_vaporizer_secondary_force_zscale 1
 set g_balance_vaporizer_secondary_lifetime 5
 set g_balance_vaporizer_secondary_radius 70
 set g_balance_vaporizer_secondary_refire 0.7
index 7d552e56b98a35a77370d09f0e54ab335bedb1d8..b7de169b30ef98f6b16a7d755fef89213db5b4d8 100644 (file)
@@ -3,8 +3,8 @@ set g_balance_blaster_primary_animtime 0.2
 set g_balance_blaster_primary_damage 20
 set g_balance_blaster_primary_delay 0
 set g_balance_blaster_primary_edgedamage 10
-set g_balance_blaster_primary_force 300
-set g_balance_blaster_primary_force_zscale 1.25
+set g_balance_blaster_primary_force 375
+set g_balance_blaster_primary_force_zscale 1
 set g_balance_blaster_primary_lifetime 5
 set g_balance_blaster_primary_radius 60
 set g_balance_blaster_primary_refire 0.7
@@ -16,8 +16,8 @@ set g_balance_blaster_secondary_animtime 0.2
 set g_balance_blaster_secondary_damage 25
 set g_balance_blaster_secondary_delay 0
 set g_balance_blaster_secondary_edgedamage 12.5
-set g_balance_blaster_secondary_force 300
-set g_balance_blaster_secondary_force_zscale 1.2
+set g_balance_blaster_secondary_force 360
+set g_balance_blaster_secondary_force_zscale 1
 set g_balance_blaster_secondary_lifetime 5
 set g_balance_blaster_secondary_radius 70
 set g_balance_blaster_secondary_refire 0.7
@@ -448,8 +448,8 @@ set g_balance_vaporizer_secondary_animtime 0.2
 set g_balance_vaporizer_secondary_damage 25
 set g_balance_vaporizer_secondary_delay 0
 set g_balance_vaporizer_secondary_edgedamage 12.5
-set g_balance_vaporizer_secondary_force 400
-set g_balance_vaporizer_secondary_force_zscale 1.2
+set g_balance_vaporizer_secondary_force 480
+set g_balance_vaporizer_secondary_force_zscale 1
 set g_balance_vaporizer_secondary_lifetime 5
 set g_balance_vaporizer_secondary_radius 70
 set g_balance_vaporizer_secondary_refire 0.7
index 14a8159c03e090cc66c1855b59d566c5ca44aaad..4f947eaf89b82e14de501ffeead7d210d525c167 100644 (file)
@@ -3,8 +3,8 @@ set g_balance_blaster_primary_animtime 0.2
 set g_balance_blaster_primary_damage 20
 set g_balance_blaster_primary_delay 0
 set g_balance_blaster_primary_edgedamage 10
-set g_balance_blaster_primary_force 300
-set g_balance_blaster_primary_force_zscale 1.25
+set g_balance_blaster_primary_force 375
+set g_balance_blaster_primary_force_zscale 1
 set g_balance_blaster_primary_lifetime 5
 set g_balance_blaster_primary_radius 60
 set g_balance_blaster_primary_refire 0.7
@@ -16,8 +16,8 @@ set g_balance_blaster_secondary_animtime 0.2
 set g_balance_blaster_secondary_damage 25
 set g_balance_blaster_secondary_delay 0
 set g_balance_blaster_secondary_edgedamage 12.5
-set g_balance_blaster_secondary_force 300
-set g_balance_blaster_secondary_force_zscale 1.2
+set g_balance_blaster_secondary_force 360
+set g_balance_blaster_secondary_force_zscale 1
 set g_balance_blaster_secondary_lifetime 5
 set g_balance_blaster_secondary_radius 70
 set g_balance_blaster_secondary_refire 0.7
@@ -448,8 +448,8 @@ set g_balance_vaporizer_secondary_animtime 0.2
 set g_balance_vaporizer_secondary_damage 25
 set g_balance_vaporizer_secondary_delay 0
 set g_balance_vaporizer_secondary_edgedamage 12.5
-set g_balance_vaporizer_secondary_force 400
-set g_balance_vaporizer_secondary_force_zscale 1.2
+set g_balance_vaporizer_secondary_force 480
+set g_balance_vaporizer_secondary_force_zscale 1
 set g_balance_vaporizer_secondary_lifetime 5
 set g_balance_vaporizer_secondary_radius 70
 set g_balance_vaporizer_secondary_refire 0.7
index 798104a68c065d0d5dfd1c9265c02886f06c6237..d5da481b9794517a219a0879092a01bf01c64c0a 100644 (file)
@@ -134,7 +134,7 @@ alias debugmodel           "qc_cmd_cl     debugmodel           ${* ?}" // Spawn
 alias hud                  "qc_cmd_cl     hud                  ${* ?}" // Commands regarding/controlling the HUD system
 alias localprint           "qc_cmd_cl     localprint           ${* ?}" // Create your own centerprint sent to yourself
 //alias mv_download        "qc_cmd_cl     mv_download          ${* ?}" // Retrieve mapshot picture from the server
-alias sendcvar             "qc_cmd_cl     sendcvar             ${* ?}" // Send a cvar to the server (like weaponpriority)
+alias sendcvar             "qc_cmd_cl     sendcvar             ${* ?}" // Send a cvar to the server (like cl_weaponpriority)
 alias weapon_find          "qc_cmd_cl     weapon_find          ${* ?}" // Show spawn locations of a weapon
 
 alias exit                 "quit"
@@ -146,9 +146,6 @@ alias radar "qc_cmd_cl hud radar ${* ?}"
 alias scoreboard_columns_help "qc_cmd_cl hud scoreboard_columns_help"
 alias scoreboard_columns_set "qc_cmd_cl hud scoreboard_columns_set ${* ?}"
 
-// changes a cvar and reports it to the server (for the client to notify the server about changes)
-alias setreport "set \"$1\" \"$2\" ; sendcvar \"$1\""
-
 
 // ========================================================
 //  cmd (client-to-server command) - server/command/cmd.qc
index 8e7bc9b4f74f414ac766859647221abbdf4ddd5b..82758fa7025dc76c8d96b722603a1f4ce40aafc4 100644 (file)
@@ -48,6 +48,10 @@ 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)"
 
+// third person chase-camera crosshair
+seta crosshair_chase 1 "adjust the crosshair while in third person mode to where the shot will actually hit"
+seta crosshair_chase_playeralpha 0.25 "opacity of the player while they obstruct the view when crosshair_chase is enabled, can be a value between 0 and 1"
+
 
 // =========================
 //  Crosshair ring settings
index 7dd231fe6046b6902105aa4e2079cca389f922e4..d38cee893adbe0931b23bc73aa063440fb5655c8 100644 (file)
@@ -226,6 +226,7 @@ set g_ca_round_timelimit 180 "round time limit in seconds"
 seta g_ca_teams_override 0
 set g_ca_team_spawns 0 "when 1, players spawn from the team spawnpoints of the map, if any"
 set g_ca_teams 0
+set g_ca_weaponarena "most" "starting weapons - takes the same options as g_weaponarena"
 
 
 // ==================
@@ -370,6 +371,7 @@ set g_freezetag_frozen_maxtime 60 "frozen players will be automatically unfrozen
 seta g_freezetag_teams_override 0
 set g_freezetag_team_spawns 0 "when 1, players spawn from the team spawnpoints of the map, if any"
 set g_freezetag_teams 0
+set g_freezetag_weaponarena "most_available" "starting weapons - takes the same options as g_weaponarena"
 
 
 // ==========
@@ -433,6 +435,7 @@ set g_lms_extra_lives 0
 set g_lms_regenerate 0
 set g_lms_last_join 3  "if g_lms_join_anytime is false, new players can only join if the worst active player has more than (fraglimit - g_lms_last_join) lives"
 set g_lms_join_anytime 1       "if true, new players can join, but get same amount of lives as the worst player"
+set g_lms_weaponarena "most_available" "starting weapons - takes the same options as g_weaponarena"
 
 
 // =========
index c372be250b5ad0dae82b4b642bdc3c1d32b4e40a..a151c0c403cc5677b1851f8063bdf94294d1371c 100644 (file)
@@ -150,6 +150,8 @@ bool autocvar_crosshair_ring_reload;
 float autocvar_crosshair_ring_reload_alpha;
 float autocvar_crosshair_ring_reload_size;
 float autocvar_crosshair_size;
+bool autocvar_crosshair_chase = true;
+float crosshair_chase_playeralpha = 0.25;
 int autocvar_ekg;
 float autocvar_fov;
 bool autocvar_hud_cursormode = true;
index 56709642026df191ce3c5c3eea00cb300d838ce5..f0c1e789ab9407037d383e651e6cfe27f0be6922 100644 (file)
@@ -434,7 +434,7 @@ void LocalCommand_sendcvar(int request, int argc)
                case CMD_REQUEST_USAGE:
                {
                        LOG_INFO("Usage:^3 cl_cmd sendcvar <cvar>");
-                       LOG_INFO("  Where 'cvar' is the cvar plus arguments to send to the server.");
+                       LOG_INFO("  Where 'cvar' is the cvar to send to the server.");
                        return;
                }
        }
@@ -477,7 +477,7 @@ CLIENT_COMMAND(handlevote, "System to handle selecting a vote or option") { Loca
 CLIENT_COMMAND(hud, "Commands regarding/controlling the HUD system") { LocalCommand_hud(request, arguments); }
 CLIENT_COMMAND(localprint, "Create your own centerprint sent to yourself") { LocalCommand_localprint(request, arguments); }
 CLIENT_COMMAND(mv_download, "Retrieve mapshot picture from the server") { LocalCommand_mv_download(request, arguments); }
-CLIENT_COMMAND(sendcvar, "Send a cvar to the server (like weaponpriority)") { LocalCommand_sendcvar(request, arguments); }
+CLIENT_COMMAND(sendcvar, "Send a cvar to the server (like cl_weaponpriority)") { LocalCommand_sendcvar(request, arguments); }
 
 void LocalCommand_macro_help()
 {
index 1fa2fd42be0cff70f91729c08153f3858467972b..7720f071b912a57c8e4cc2f0088bc689271f5b17 100644 (file)
@@ -109,6 +109,69 @@ int w_deathtype;
 float w_issilent, w_random;
 vector w_org, w_backoff;
 
+float autoswitch;
+bool cvar_cl_allow_uid2name;
+float cvar_cl_autoscreenshot;
+float cvar_cl_autotaunt;
+float cvar_cl_clippedspectating;
+float cvar_cl_handicap;
+float cvar_cl_jetpack_jump;
+float cvar_cl_movement_track_canjump;
+float cvar_cl_noantilag;
+string cvar_cl_physics;
+float cvar_cl_voice_directional;
+float cvar_cl_voice_directional_taunt_attenuation;
+float cvar_cl_weaponimpulsemode;
+string cvar_g_xonoticversion;
+float cvar_cl_cts_noautoswitch;
+bool cvar_cl_weapon_switch_reload;
+bool cvar_cl_weapon_switch_fallback_to_impulse;
+
+REPLICATE(autoswitch, bool, "cl_autoswitch");
+REPLICATE(cvar_cl_allow_uid2name, bool, "cl_allow_uid2name");
+REPLICATE(cvar_cl_autoscreenshot, int, "cl_autoscreenshot");
+REPLICATE(cvar_cl_autotaunt, float, "cl_autotaunt");
+REPLICATE(cvar_cl_clippedspectating, bool, "cl_clippedspectating");
+REPLICATE(cvar_cl_handicap, float, "cl_handicap");
+REPLICATE(cvar_cl_jetpack_jump, bool, "cl_jetpack_jump");
+REPLICATE(cvar_cl_movement_track_canjump, bool, "cl_movement_track_canjump");
+REPLICATE(cvar_cl_noantilag, bool, "cl_noantilag");
+REPLICATE(cvar_cl_physics, string, "cl_physics");
+REPLICATE(cvar_cl_voice_directional, int, "cl_voice_directional");
+REPLICATE(cvar_cl_voice_directional_taunt_attenuation, float, "cl_voice_directional_taunt_attenuation");
+REPLICATE(cvar_cl_weaponimpulsemode, int, "cl_weaponimpulsemode");
+REPLICATE(cvar_g_xonoticversion, string, "g_xonoticversion");
+REPLICATE(cvar_cl_cts_noautoswitch, bool, "cl_cts_noautoswitch");
+REPLICATE(cvar_cl_weapon_switch_reload, bool, "cl_weapon_switch_reload");
+REPLICATE(cvar_cl_weapon_switch_fallback_to_impulse, bool, "cl_weapon_switch_fallback_to_impulse");
+/*
+// this is also a STAT
+// pointless sending this cvars since server can't change gun alignment during the match
+int cvar_cl_gunalign;
+REPLICATE(cvar_cl_gunalign, int, "cl_gunalign");
+
+// cvar cl_newusekeysupported doesn't exist
+float cvar_cl_newusekeysupported;
+REPLICATE(cvar_cl_newusekeysupported, bool, "cl_newusekeysupported");
+*/
+string cvar_cl_allow_uidtracking;
+REPLICATE(cvar_cl_allow_uidtracking, string, "cl_allow_uidtracking");
+
+string cvar_cl_weaponpriority;
+REPLICATE(cvar_cl_weaponpriority, string, "cl_weaponpriority");
+
+string cvar_cl_weaponpriorities[10];
+REPLICATE(cvar_cl_weaponpriorities[0], string, "cl_weaponpriority0");
+REPLICATE(cvar_cl_weaponpriorities[1], string, "cl_weaponpriority1");
+REPLICATE(cvar_cl_weaponpriorities[2], string, "cl_weaponpriority2");
+REPLICATE(cvar_cl_weaponpriorities[3], string, "cl_weaponpriority3");
+REPLICATE(cvar_cl_weaponpriorities[4], string, "cl_weaponpriority4");
+REPLICATE(cvar_cl_weaponpriorities[5], string, "cl_weaponpriority5");
+REPLICATE(cvar_cl_weaponpriorities[6], string, "cl_weaponpriority6");
+REPLICATE(cvar_cl_weaponpriorities[7], string, "cl_weaponpriority7");
+REPLICATE(cvar_cl_weaponpriorities[8], string, "cl_weaponpriority8");
+REPLICATE(cvar_cl_weaponpriorities[9], string, "cl_weaponpriority9");
+
 float bgmtime;
 
 string weaponorder_byimpulse;
index 04cafebbd3a341786d40a29acc313c9b321620c0..c8274fe62641070f01f4448acce41d07080b0e9a 100644 (file)
@@ -230,6 +230,8 @@ void Shutdown()
 
        deactivate_minigame();
        HUD_MinigameMenu_Close(NULL, NULL, NULL);
+
+       ReplicateVars(true); // destroy
 }
 
 .float has_team;
index 7c3c1068b1dff2a6a0d096405cdc7d531c307552..b1593cf3a222315b6f7d6c66514d0bb6c25932c6 100644 (file)
@@ -291,6 +291,7 @@ void viewmodel_draw(entity this)
                return;
        int mask = (intermission || (STAT(HEALTH) <= 0) || autocvar_chase_active) ? 0 : MASK_NORMAL;
        float a = ((autocvar_cl_viewmodel_alpha) ? bound(-1, autocvar_cl_viewmodel_alpha, this.m_alpha) : this.m_alpha);
+       int wepskin = this.m_skin;
        bool invehicle = player_localentnum > maxclients;
        if (invehicle) a = -1;
        Weapon wep = this.activeweapon;
@@ -304,6 +305,7 @@ void viewmodel_draw(entity this)
        {
                e.drawmask = mask;
                e.alpha = a;
+               e.skin = wepskin;
                e.colormap = 256 + c;  // colormap == 0 is black, c == 0 is white
                e.glowmod = g;
                e.csqcmodel_effects = fx;
@@ -972,6 +974,20 @@ void HUD_Crosshair(entity this)
                // wcross_origin = '0.5 0 0' * vid_conwidth + '0 0.5 0' * vid_conheight;
                if(csqcplayer.viewloc && (csqcplayer.viewloc.spawnflags & VIEWLOC_FREEAIM))
                        wcross_origin = viewloc_mousepos;
+               else if(autocvar_chase_active > 0 && autocvar_crosshair_chase)
+               {
+                       vector player_org = ((csqcplayer) ? csqcplayer.origin + csqcplayer.view_ofs : view_origin);
+                       if(csqcplayer && crosshair_chase_playeralpha && crosshair_chase_playeralpha < 1)
+                       {
+                               traceline(view_origin, view_origin + max_shot_distance * view_forward, MOVE_NORMAL, NULL);
+                               if(trace_ent == csqcplayer)
+                                       csqcplayer.alpha = crosshair_chase_playeralpha;
+                               else
+                                       csqcplayer.alpha = csqcplayer.m_alpha;
+                       }
+                       traceline(player_org, player_org + max_shot_distance * view_forward, MOVE_WORLDONLY, NULL);
+                       wcross_origin = project_3d_to_2d(trace_endpos);
+               }
                else
                        wcross_origin = project_3d_to_2d(view_origin + max_shot_distance * view_forward);
                wcross_origin.z = 0;
@@ -1562,6 +1578,10 @@ void CSQC_UpdateView(entity this, float w, float h)
 
        lasthud = hud;
 
+       ReplicateVars(false);
+       if (ReplicateVars_NOT_SENDING())
+               ReplicateVars_DELAY(0.8 + random() * 0.4); // no need to check cvars every frame
+
        HUD_Scale_Disable();
 
        if(autocvar__hud_showbinds_reload) // menu can set this one
index 7c5a218b21f15e34ba6ba43ee0d13b4a2b0a801f..96836a38e23c635d00c5c731a3478a6d46d3afb3 100644 (file)
 # define TAG_VIEWLOC_NAME tag_networkviewloc
 # define TAG_VIEWLOC_TYPE int
 .float tag_networkviewloc;
+
+# define ALPHA m_alpha
+.float m_alpha;
 #else
 # define TAG_ENTITY_NAME tag_entity
 # define TAG_ENTITY_TYPE entity
 
 # define TAG_VIEWLOC_NAME viewloc
 # define TAG_VIEWLOC_TYPE entity
+
+# define ALPHA alpha
 #endif
 
 // add properties you want networked to CSQC here
@@ -31,7 +36,7 @@
        CSQCMODEL_PROPERTY(BIT(0), int, ReadShort, WriteShort, colormap) \
        CSQCMODEL_PROPERTY(BIT(1), int, ReadInt24_t, WriteInt24_t, effects) \
        CSQCMODEL_PROPERTY(BIT(2), int, ReadByte, WriteByte, modelflags) \
-       CSQCMODEL_PROPERTY_SCALED(BIT(3), float, ReadByte, WriteByte, alpha, 254, -1, 254) \
+       CSQCMODEL_PROPERTY_SCALED(BIT(3), float, ReadByte, WriteByte, ALPHA, 254, -1, 254) \
        CSQCMODEL_PROPERTY(BIT(4), int, ReadByte, WriteByte, skin) \
        CSQCMODEL_PROPERTY(BIT(5), float, ReadApproxPastTime, WriteApproxPastTime, death_time) \
        CSQCMODEL_PROPERTY(BIT(6), float, ReadByte, WriteByte, solid) \
index 304552961c1a4a5ce1af56b8ee11f77de1ad7cf4..589e343c8df91ae795a94c1375903c429ae17296 100644 (file)
@@ -9,11 +9,14 @@
 
 REGISTER_NET_TEMP(casings)
 
-#ifdef SVQC
-
+#if defined(SVQC)
 .bool cvar_cl_casings;
+#elif defined(CSQC)
+bool cvar_cl_casings;
+#endif
 REPLICATE(cvar_cl_casings, bool, "cl_casings");
 
+#ifdef SVQC
 void SpawnCasing(vector vel, float randomvel, vector ang, vector avel, float randomavel, int casingtype, entity casingowner, .entity weaponentity)
 {
        if (!(CS(casingowner).cvar_cl_casings))
index cf2821844aa01666e3b3fb2a62df7b0d900cefc5..4721cb38015ea7cb4ea306accd3f3389eaa14d14 100644 (file)
@@ -483,11 +483,6 @@ MUTATOR_HOOKFUNCTION(ca, ClientCommand_Spectate)
        return MUT_SPECCMD_CONTINUE;
 }
 
-MUTATOR_HOOKFUNCTION(ca, WantWeapon)
-{
-       M_ARGV(2, bool) = true; // all weapons
-}
-
 MUTATOR_HOOKFUNCTION(ca, HideTeamNagger)
 {
        return true; // doesn't work well with the whole spectator as player thing
@@ -502,8 +497,8 @@ MUTATOR_HOOKFUNCTION(ca, GetPlayerStatus)
 
 MUTATOR_HOOKFUNCTION(ca, SetWeaponArena)
 {
-       // most weapons arena
-       if (M_ARGV(0, string) == "0" || M_ARGV(0, string) == "") M_ARGV(0, string) = "most";
+       if (M_ARGV(0, string) == "0" || M_ARGV(0, string) == "")
+               M_ARGV(0, string) = autocvar_g_ca_weaponarena;
 }
 
 MUTATOR_HOOKFUNCTION(ca, SV_ParseServerCommand)
index e383687fcf44dd2ed3a69efa5b4c357e1e91e746..f6420b85261b7efaa9435db2ae1e8b90e091e0e8 100644 (file)
@@ -12,6 +12,7 @@ bool autocvar_g_ca_team_spawns;
 //int autocvar_g_ca_teams;
 int autocvar_g_ca_teams_override;
 float autocvar_g_ca_warmup;
+string autocvar_g_ca_weaponarena = "most";
 
 
 int ca_teams;
index 0f37cf1e8fa4673c4c77e3553d6b55d84fd08557..b1feaa9917c2cb913ce91f9465f795d6f40305ab 100644 (file)
@@ -587,9 +587,8 @@ MUTATOR_HOOKFUNCTION(ft, TeamBalance_CheckAllowedTeams, CBC_ORDER_EXCLUSIVE)
 
 MUTATOR_HOOKFUNCTION(ft, SetWeaponArena)
 {
-       // most weapons arena
        if(M_ARGV(0, string) == "0" || M_ARGV(0, string) == "")
-               M_ARGV(0, string) = "most";
+               M_ARGV(0, string) = autocvar_g_freezetag_weaponarena;
 }
 
 MUTATOR_HOOKFUNCTION(ft, FragCenterMessage)
index df138a93d84f011bf29a51f2cf6135872773e0bb..3eb753020b35a857da4cde61e2b9b95879727c47 100644 (file)
@@ -6,6 +6,8 @@
 int autocvar_g_freezetag_point_limit;
 int autocvar_g_freezetag_point_leadlimit;
 bool autocvar_g_freezetag_team_spawns;
+string autocvar_g_freezetag_weaponarena = "most_available";
+
 void freezetag_Initialize();
 
 REGISTER_MUTATOR(ft, false)
index 6d420c7a95b82dd0701977e3608613360172408d..bd6401d172931ea66eb07776258bc26258e8c1ca 100644 (file)
@@ -429,9 +429,10 @@ MUTATOR_HOOKFUNCTION(lms, CheckRules_World)
        return true;
 }
 
-MUTATOR_HOOKFUNCTION(lms, WantWeapon)
+MUTATOR_HOOKFUNCTION(lms, SetWeaponArena)
 {
-       M_ARGV(2, bool) = true; // all weapons
+       if(M_ARGV(0, string) == "0" || M_ARGV(0, string) == "")
+               M_ARGV(0, string) = autocvar_g_lms_weaponarena;
 }
 
 MUTATOR_HOOKFUNCTION(lms, GetPlayerStatus)
index 256620a454bf7f80ad97a095a84b92b6dc094fc8..996d371fe05b84e736283ccc042251aaa60e8a3a 100644 (file)
@@ -2,8 +2,12 @@
 
 #include <common/mutators/base.qh>
 #include <common/scores.qh>
+
 .float lms_spectate_warning;
+
 #define autocvar_g_lms_lives_override cvar("g_lms_lives_override")
+string autocvar_g_lms_weaponarena = "most_available";
+
 void lms_Initialize();
 
 REGISTER_MUTATOR(lms, false)
index 1e3127eb5f7e972c130c3c62deb3a2dcc3c1d565..ccabc47a518c502e9196af25e26a632032e23773 100644 (file)
@@ -1,7 +1,7 @@
 #pragma once
 
 CLASS(BallStealer, PortoLaunch)
-/* flags     */ ATTRIB(BallStealer, spawnflags, int, WEP_TYPE_OTHER | WEP_FLAG_SPECIALATTACK | WEP_FLAG_MUTATORBLOCKED | WEP_FLAG_NOTRUEAIM);
+/* flags     */ ATTRIB(BallStealer, spawnflags, int, WEP_TYPE_OTHER | WEP_FLAG_MUTATORBLOCKED | WEP_FLAG_NOTRUEAIM);
 /* impulse   */ ATTRIB(BallStealer, impulse, int, 0);
 /* refname   */ ATTRIB(BallStealer, netname, string, "ballstealer");
 /* wepname   */ ATTRIB(BallStealer, m_name, string, _("Ball Stealer"));
index 126a20ea26ec08e254c1ee6e9d9473479b084dda..e7eedd52c413474745eab4e7c142db34f14dba34 100644 (file)
@@ -43,7 +43,10 @@ spawnfunc(info_teleport_destination)
        {
        }
        else
+       {
                objerror (this, "^3Teleport destination without a targetname");
+               return; // don't link it to CSQC in this case!
+       }
 
        teleport_dest_link(this);
 }
index 339ade52a775cc86462c7f991b82a8d5ba8ac366..da86cabce89b83c048ed8a99342e07d501dcee2b 100644 (file)
@@ -257,7 +257,7 @@ void teleport_findtarget(entity this)
        if(n == 0)
        {
                // no dest!
-               objerror (this, "Teleporter with nonexistant target");
+               objerror (this, "Teleporter with nonexistent target");
                return;
        }
        else if(n == 1)
index c707f8c38e5ede6509fd6620456bbbd7288468e7..0673cd0baf24810d20dc452ce469e73a6ae31a51 100644 (file)
@@ -1318,7 +1318,7 @@ bool Monster_Spawn(entity this, bool check_appear, int mon_id)
 
        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 != "")
index c93902291da2383ca99ee6cabda85463009ac3b3..c9dbe5add1674f004a82bff50a180f9649172c1d 100644 (file)
@@ -1,3 +1,6 @@
 #pragma once
 
 #include "buffs.qh"
+
+float cvar_cl_buffs_autoreplace;
+REPLICATE(cvar_cl_buffs_autoreplace, bool, "cl_buffs_autoreplace");
index 80a7828a703f409a707d36aac3b0e59fc8f02831..99b822d42aa134bd0a029c8273ea1a6b6b0fb379 100644 (file)
@@ -1,4 +1,7 @@
 // generated file; do not modify
+#ifdef CSQC
+    #include <common/mutators/mutator/dodging/cl_dodging.qc>
+#endif
 #ifdef SVQC
     #include <common/mutators/mutator/dodging/sv_dodging.qc>
 #endif
index fef7b8e6e4e7f289ea505ba469708bc116e3a280..d2c0d05c7acf80c030e2f1210c9494196674aec4 100644 (file)
@@ -1,4 +1,7 @@
 // generated file; do not modify
+#ifdef CSQC
+    #include <common/mutators/mutator/dodging/cl_dodging.qh>
+#endif
 #ifdef SVQC
     #include <common/mutators/mutator/dodging/sv_dodging.qh>
 #endif
diff --git a/qcsrc/common/mutators/mutator/dodging/cl_dodging.qc b/qcsrc/common/mutators/mutator/dodging/cl_dodging.qc
new file mode 100644 (file)
index 0000000..a9d10ef
--- /dev/null
@@ -0,0 +1 @@
+#include "cl_dodging.qh"
diff --git a/qcsrc/common/mutators/mutator/dodging/cl_dodging.qh b/qcsrc/common/mutators/mutator/dodging/cl_dodging.qh
new file mode 100644 (file)
index 0000000..84f7731
--- /dev/null
@@ -0,0 +1,4 @@
+#pragma once
+
+float cvar_cl_dodging_timeout;
+REPLICATE(cvar_cl_dodging_timeout, float, "cl_dodging_timeout");
index 6640cb8bf23a51a48c08cdd4662fbd89a4fcefcf..c97308d58ab1f8cd8a7db8adcd738c277baa739e 100644 (file)
 #endif
 
 #ifdef CSQC
+       float cvar_cl_dodging_timeout;
        #define PHYS_DODGING_FRAMETIME                          (1 / (frametime <= 0 ? 60 : frametime))
        #define PHYS_DODGING_TIMEOUT(s)                         STAT(DODGING_TIMEOUT)
        #define PHYS_DODGING_PRESSED_KEYS(s)            (s).pressedkeys
 #elif defined(SVQC)
+       .float cvar_cl_dodging_timeout;
        #define PHYS_DODGING_FRAMETIME                          sys_frametime
        #define PHYS_DODGING_TIMEOUT(s)                         CS(s).cvar_cl_dodging_timeout
        #define PHYS_DODGING_PRESSED_KEYS(s)            CS(s).pressedkeys
@@ -56,8 +58,6 @@ bool autocvar_sv_dodging_sound;
 #include <common/animdecide.qh>
 #include <common/physics/player.qh>
 
-.float cvar_cl_dodging_timeout;
-
 REGISTER_MUTATOR(dodging, cvar("g_dodging"))
 {
        // this just turns on the cvar.
index 081a1fdb6fd69d7767de22b0ebecd8c8445e93b4..0efd85635cc88503b9998675c59eaf2369fd347c 100644 (file)
@@ -24,6 +24,7 @@ REGISTER_MUTATOR(multijump, true);
 .bool multijump_ready;
 
 #ifdef CSQC
+bool cvar_cl_multijump;
 bool autocvar_cl_multijump = true;
 
        #define PHYS_MULTIJUMP_CLIENT(s)        autocvar_cl_multijump
@@ -114,10 +115,10 @@ MUTATOR_HOOKFUNCTION(multijump, PlayerJump)
        }
 }
 
-#ifdef SVQC
-
 REPLICATE(cvar_cl_multijump, bool, "cl_multijump");
 
+#ifdef SVQC
+
 MUTATOR_HOOKFUNCTION(multijump, BuildMutatorsString)
 {
        M_ARGV(0, string) = strcat(M_ARGV(0, string), ":multijump");
index 8dc82dbcf9c200633a7361f42a8100c025edf881..d48319a421fa599861a11ba4aaabe1dabe71ac1b 100644 (file)
@@ -10,6 +10,9 @@ float autocvar_g_nades_spread = 0.04;
 REGISTER_STAT(NADES_SMALL, int, autocvar_g_nades_nade_small)
 
 #ifdef GAMEQC
+REPLICATE(cvar_cl_nade_type, int, "cl_nade_type");
+REPLICATE(cvar_cl_pokenade_type, string, "cl_pokenade_type");
+
 entity Nade_TrailEffect(int proj, int nade_team)
 {
     switch (proj)
@@ -1546,9 +1549,6 @@ MUTATOR_HOOKFUNCTION(nades, SpectateCopy)
        STAT(VEIL_ORB_ALPHA, client) = STAT(VEIL_ORB_ALPHA, spectatee);
 }
 
-REPLICATE(cvar_cl_nade_type, int, "cl_nade_type");
-REPLICATE(cvar_cl_pokenade_type, string, "cl_pokenade_type");
-
 MUTATOR_HOOKFUNCTION(nades, BuildMutatorsString)
 {
        M_ARGV(0, string) = strcat(M_ARGV(0, string), ":Nades");
index 2729316a88b4fd8c95eb24f1afc1580b3d7126f3..d76eb941450274fb626b8f1732ef4ecebf88e4f1 100644 (file)
@@ -101,6 +101,8 @@ MUTATOR_HOOKABLE(Nade_Damage, EV_Nade_Damage);
 #endif
 
 #ifdef CSQC
+float cvar_cl_nade_type;
+string cvar_cl_pokenade_type;
 bool Projectile_isnade(int proj); // TODO: remove
 
 void DrawAmmoNades(vector myPos, vector mySize, bool draw_expanding, float expand_time); // TODO: mutator
index fe3a6ebc5d612cd64ff0fd96d5df502f956176d2..46496895afea6dd3bd9abc45cdaf2cb8db5fb452 100644 (file)
@@ -1,4 +1,7 @@
 // generated file; do not modify
+#ifdef CSQC
+    #include <common/mutators/mutator/spawn_near_teammate/cl_spawn_near_teammate.qc>
+#endif
 #ifdef SVQC
     #include <common/mutators/mutator/spawn_near_teammate/sv_spawn_near_teammate.qc>
 #endif
index b34f8f8f164c22c2bb724817ee2ca77fc3710453..c4cfe5ada918e1968cd7a713ecab726d99cf2656 100644 (file)
@@ -1,4 +1,7 @@
 // generated file; do not modify
+#ifdef CSQC
+    #include <common/mutators/mutator/spawn_near_teammate/cl_spawn_near_teammate.qh>
+#endif
 #ifdef SVQC
     #include <common/mutators/mutator/spawn_near_teammate/sv_spawn_near_teammate.qh>
 #endif
diff --git a/qcsrc/common/mutators/mutator/spawn_near_teammate/cl_spawn_near_teammate.qc b/qcsrc/common/mutators/mutator/spawn_near_teammate/cl_spawn_near_teammate.qc
new file mode 100644 (file)
index 0000000..11774ca
--- /dev/null
@@ -0,0 +1 @@
+#include "cl_spawn_near_teammate.qh"
diff --git a/qcsrc/common/mutators/mutator/spawn_near_teammate/cl_spawn_near_teammate.qh b/qcsrc/common/mutators/mutator/spawn_near_teammate/cl_spawn_near_teammate.qh
new file mode 100644 (file)
index 0000000..640a725
--- /dev/null
@@ -0,0 +1,4 @@
+#pragma once
+
+float cvar_cl_spawn_near_teammate;
+REPLICATE(cvar_cl_spawn_near_teammate, bool, "cl_spawn_near_teammate");
index dc63a70803963ceb4c7c8f2e9b49066a6dca225e..2d775d4f219386fe82fc31ab3cc09ef52c53f827 100644 (file)
@@ -856,4 +856,17 @@ REGISTRY_END(Notifications)
                LOG_SEVERE("Notification initialization failed! Read above and fix the errors!");
 }
 
+#ifdef CSQC
+.int cvar_value;
+void ReplicateVars(bool would_destroy)
+{
+       if (!would_destroy)
+               FOREACH(Notifications, it.nent_type == MSG_CHOICE, {
+                       string cvarname = sprintf("notification_%s", Get_Notif_CvarName(it));
+                       // NOTE: REPLICATE_SIMPLE can return;
+                       REPLICATE_SIMPLE(it.cvar_value, cvarname);
+               });
+}
+#endif
+
 #include "all.inc"
index b3f460ce7d99daaf5f6c1dab28832cbca57a5ad8..4539466a24feb9f10d97f6652f3eb31c519af490 100644 (file)
@@ -509,10 +509,11 @@ bool _Movetype_PushEntity(entity this, vector push, bool failonstartsolid, bool
 {
        _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)
@@ -527,7 +528,7 @@ bool _Movetype_PushEntity(entity this, vector push, bool failonstartsolid, bool
                _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
index 2a1168eae017978fe7f56d72004bda716fc49344..0f40acfc6856b65ad68446091b5a9142d3d16e13 100644 (file)
@@ -5,6 +5,9 @@ void Inventory_delete(entity this);
 
 void PlayerState_attach(entity this)
 {
+       if (PS(this))
+               return;
+
        this._ps = NEW(PlayerState, this);
 
        Inventory_new(PS(this));
@@ -38,8 +41,6 @@ void ClientState_attach(entity this)
 {
        this._cs = NEW(ClientState, this);
 
-    GetCvars(this, CS(this), 0);  // get other cvars from player
-
        // TODO: fold all of these into ClientState
 
        DecodeLevelParms(this);
index cf51ea66b3ebf7b24d86c16c89756347fa5bca0c..9fc79cdc98852451623dacbc67a5d72cbe57c49e 100644 (file)
@@ -43,8 +43,12 @@ const int MAX_CL_STATS = 256;
 #endif
 
 #ifdef SVQC
+/// all the weapons actually spawned in the map, does not include filtered items
 vector weaponsInMap;
+/// all the weapons placed by the mapper (weaponreplace applied), ignores most filters
+vector weaponsInMapAll;
 #endif
+
 REGISTER_STAT(WEAPONS, vectori)
 REGISTER_STAT(WEAPONSINMAP, vectori, weaponsInMap)
 
@@ -376,8 +380,8 @@ noref int autocvar_cl_gunalign;
 #endif
 #ifdef SVQC
 .int cvar_cl_gunalign;
-REPLICATE(cvar_cl_gunalign, int, "cl_gunalign");
 #endif
+
 REGISTER_STAT(GUNALIGN, int)
 #ifdef SVQC
 SPECTATE_COPYFIELD(_STAT(GUNALIGN))
index 4a3712a25b31a02aac9b1e8d429933fb0463ca33..a5786888c18169abdfb93a44200b9383feab5a8d 100644 (file)
@@ -356,8 +356,8 @@ bool ItemSend(entity this, entity to, int sf)
        {
                WriteShort(MSG_ENTITY, this.colormap);
                WriteByte(MSG_ENTITY, this.glowmod.x * 255.0);
-        WriteByte(MSG_ENTITY, this.glowmod.y * 255.0);
-        WriteByte(MSG_ENTITY, this.glowmod.z * 255.0);
+               WriteByte(MSG_ENTITY, this.glowmod.y * 255.0);
+               WriteByte(MSG_ENTITY, this.glowmod.z * 255.0);
        }
 
        if(sf & ISF_DROP)
@@ -402,7 +402,7 @@ bool have_pickup_item(entity this)
        return true;
 }
 
-void Item_Show (entity e, int mode)
+void Item_Show(entity e, int mode)
 {
        e.effects &= ~(EF_ADDITIVE | EF_STARDUST | EF_FULLBRIGHT | EF_NODEPTHTEST);
        e.ItemStatus &= ~ITS_STAYWEP;
@@ -479,13 +479,13 @@ float Item_ItemsTime_UpdateTime(entity e, float t);
 void Item_ItemsTime_SetTime(entity e, float t);
 void Item_ItemsTime_SetTimesForAllPlayers();
 
-void Item_Respawn (entity this)
+void Item_Respawn(entity this)
 {
        Item_Show(this, 1);
        sound(this, CH_TRIGGER, this.itemdef.m_respawnsound, VOL_BASE, ATTEN_NORM);     // play respawn sound
        setorigin(this, this.origin);
 
-    if (Item_ItemsTime_Allow(this.itemdef) || (STAT(WEAPONS, this) & WEPSET_SUPERWEAPONS))
+       if (Item_ItemsTime_Allow(this.itemdef) || (STAT(WEAPONS, this) & WEPSET_SUPERWEAPONS))
        {
                float t = Item_ItemsTime_UpdateTime(this, 0);
                Item_ItemsTime_SetTime(this, t);
@@ -499,7 +499,7 @@ void Item_Respawn (entity this)
        Send_Effect(EFFECT_ITEM_RESPAWN, CENTER_OR_VIEWOFS(this), '0 0 0', 1);
 }
 
-void Item_RespawnCountdown (entity this)
+void Item_RespawnCountdown(entity this)
 {
        if(this.item_respawncounter >= ITEM_RESPAWN_TICKS)
        {
@@ -624,7 +624,7 @@ float adjust_respawntime(float normal_respawntime) {
                }
        }
        TeamBalance_Destroy(balance);
-       
+
        if (players >= 2) {
                return normal_respawntime * (r / (players + o) + l);
        } else {
@@ -1008,8 +1008,8 @@ void Item_FindTeam(entity this)
                });
 
                e = RandomSelection_chosen_ent;
-               e.state = 0;
-               Item_Show(e, 1);
+               if (!e)
+                       return;
 
                IL_EACH(g_items, it.team == this.team,
                {
@@ -1021,11 +1021,11 @@ void Item_FindTeam(entity this)
                                        Item_Show(it, -1);
                                        it.state = 1; // state 1 = initially hidden item, apparently
                                }
+                               else
+                                       Item_Reset(it);
                                it.effects &= ~EF_NODRAW;
                        }
                });
-
-               Item_Reset(this);
        }
 }
 
@@ -1172,7 +1172,7 @@ void _StartItem(entity this, entity def, float defaultrespawntime, float default
 {
        string itemname = def.m_name;
        Model itemmodel = def.m_model;
-    Sound pickupsound = def.m_sound;
+       Sound pickupsound = def.m_sound;
        float(entity player, entity item) pickupevalfunc = def.m_pickupevalfunc;
        float pickupbasevalue = def.m_botvalue;
        int itemflags = def.m_itemflags;
@@ -1180,10 +1180,10 @@ void _StartItem(entity this, entity def, float defaultrespawntime, float default
        startitem_failed = false;
 
        this.item_model_ent = itemmodel;
-    this.item_pickupsound_ent = pickupsound;
+       this.item_pickupsound_ent = pickupsound;
 
-    if(def.m_iteminit)
-       def.m_iteminit(def, this);
+       if(def.m_iteminit)
+               def.m_iteminit(def, this);
 
        if(!this.respawntime) // both need to be set
        {
@@ -1317,7 +1317,7 @@ void _StartItem(entity this, entity def, float defaultrespawntime, float default
                        || (def.instanceOfHealth && def != ITEM_HealthSmall)
                        || (def.instanceOfArmor && def != ITEM_ArmorSmall)
                        || (itemid & (IT_KEY1 | IT_KEY2))
-               ) 
+               )
                {
                        if(!this.target || this.target == "")
                                this.target = "###item###"; // for finding the nearest item using findnearest
@@ -1360,7 +1360,7 @@ void _StartItem(entity this, entity def, float defaultrespawntime, float default
        }
 
        this.state = 0;
-       if(this.team) // broken, no idea why.
+       if(this.team)
        {
                if(!this.cnt)
                        this.cnt = 1; // item probability weight
@@ -1584,8 +1584,8 @@ spawnfunc(target_items)
        for(int j = 0; j < n; ++j)
        {
                FOREACH(Weapons, it != WEP_Null && W_UndeprecateName(argv(j)) == it.netname, {
-            it.wr_init(it);
-            break;
+                       it.wr_init(it);
+                       break;
                });
        }
 }
index 43398e6a5de5b539b9c9cea2b2bf187e10e63fcf..0be413f0fb0071fad8974f2022e50cea7a1bf838 100644 (file)
@@ -384,6 +384,13 @@ ENUMCLASS_END(WFRAME)
 vector shotorg_adjust_values(vector vecs, bool y_is_right, bool visual, int algn);
 void CL_WeaponEntity_SetModel(entity this, string name, bool _anim);
 
+#ifdef CSQC
+bool cvar_cl_accuracy_data_share;
+REPLICATE(cvar_cl_accuracy_data_share, bool, "cl_accuracy_data_share");
+bool cvar_cl_accuracy_data_receive;
+REPLICATE(cvar_cl_accuracy_data_receive, bool, "cl_accuracy_data_receive");
+#endif
+
 #ifdef SVQC
 void wframe_send(entity actor, entity weaponentity, vector a, bool restartanim);
 #endif
index 9193c4ef1638af9dd797acfe8e666ae9f2d2c1df..38ef3bd1f7d4c5303e5f639f5c6306711d1385ba 100644 (file)
@@ -73,6 +73,10 @@ MACRO_END
     PROP(false, clip_size, WEPENT_SET_NORMAL, \
        { WriteShort(chan, this.clip_size); }, \
        { (viewmodels[this.m_wepent_slot]).clip_size = ReadShort(); }) \
+    \
+    PROP(false, skin, WEPENT_SET_NORMAL, \
+       { WriteShort(chan, this.skin); }, \
+       { (viewmodels[this.m_wepent_slot]).m_skin = ReadShort(); }) \
     \
        /**/
 
index 556f58194f5ed5298d52f0aad3f4e6ca3f046e2a..6d7128c33ca27323d91cd6ba8685fb6ca61ac0e4 100644 (file)
@@ -37,6 +37,8 @@ REGISTER_NET_TEMP(CLIENT_WEPENT)
 
        .float m_alpha;
 
+       .int m_skin;
+
        // only for Porto
        .bool angles_held_status;
        .vector angles_held;
index 12be0dbaa479c099cc2df23c376a21a1924b43c7..ccf6751171f82522181d75e529d103ac5b848847 100644 (file)
@@ -277,6 +277,9 @@ NET_HANDLE(ENT_CLIENT_MODEL, bool isnew)
                this.csqcmodel_teleported = 1;
        }
 
+       if(sf & BIT(3))
+               this.alpha = this.m_alpha;
+
        if(sf & BIT(14))
                viewloc_SetTags(this);
 
index b5d9f8bd361fff927dc54f70a5632300a64d4360..6211868445b7b65d87390eb7549051f228588e55 100644 (file)
@@ -27,7 +27,8 @@
 #define CSQCMODEL_ENDIF
 #define CSQCMODEL_PROPERTY(flag,t,r,w,f) \
        .t f;
-#define CSQCMODEL_PROPERTY_SCALED(flag,t,r,w,f,s,mi,ma) CSQCMODEL_PROPERTY(flag,t,r,w,f)
+#define CSQCMODEL_PROPERTY_SCALED(flag,t,r,w,f,s,mi,ma) \
+       .t f;
        ALLPROPERTIES
 #undef CSQCMODEL_PROPERTY_SCALED
 #undef CSQCMODEL_PROPERTY
index 584bfc23ff6f0901f524f823e0b6e66465944c1d..70e2c1a15e9bf10f6a4a09bf9378a10f724ba5c8 100644 (file)
@@ -48,7 +48,11 @@ bool CSQCModel_Send(entity this, entity to, int sf)
        { \
                w(MSG_ENTITY, this.csqcmodel_##f); \
        }
-#define CSQCMODEL_PROPERTY_SCALED(flag,t,r,w,f,s,mi,ma) CSQCMODEL_PROPERTY(flag,t,r,w,f)
+#define CSQCMODEL_PROPERTY_SCALED(flag,t,r,w,f,s,mi,ma) \
+       if(sf & flag) \
+       { \
+               w(MSG_ENTITY, this.csqcmodel_##f); \
+       }
        ALLPROPERTIES
 #undef CSQCMODEL_PROPERTY_SCALED
 #undef CSQCMODEL_PROPERTY
index e963f12a1bf6ac79d9d3e45bf941e10e92927fef..f70ecea88818c8b46d0dc218faec9b0692749e67 100644 (file)
@@ -34,7 +34,9 @@ void CSQCModel_UnlinkEntity(entity e);
 #define CSQCMODEL_PROPERTY(flag,t,r,w,f) \
        .t f; \
        .t csqcmodel_##f;
-#define CSQCMODEL_PROPERTY_SCALED(flag,t,r,w,f,s,mi,ma) CSQCMODEL_PROPERTY(flag,t,r,w,f)
+#define CSQCMODEL_PROPERTY_SCALED(flag,t,r,w,f,s,mi,ma) \
+       .t f; \
+       .t csqcmodel_##f;
        ALLPROPERTIES
 #undef CSQCMODEL_PROPERTY_SCALED
 #undef CSQCMODEL_PROPERTY
index 656989782672e60c948199c0b8deb94f2f10b0a6..a88bde462934134f3585707eff76e81303e8d6c2 100644 (file)
        #define REPLICATE(...) EVAL_REPLICATE(OVERLOAD(REPLICATE, __VA_ARGS__))
        #define EVAL_REPLICATE(...) __VA_ARGS__
 
+       #if defined(SVQC)
        ACCUMULATE void ReplicateVars(entity this, entity store, string thisname, int i) {}
+       #elif defined(CSQC)
+       ACCUMULATE void ReplicateVars(bool would_destroy) {}
+       #endif
 
        #define REPLICATE_3(fld, type, var) REPLICATE_4(fld, type, var, )
        #define REPLICATE_4(fld, type, var, func) REPLICATE_##type(fld, var, func)
-       #define REPLICATE_string(fld, var, func) \
-               REPLICATE_7(fld, string, var, , \
-       { strcpy(field, it); }, \
-       { strfree(field); }, \
-       { \
-               /* also initialize to the default value of func when requesting cvars */ \
-               string s = func(field); \
-               if (s != field) \
+       #if defined(SVQC)
+               #define REPLICATE_string(fld, var, func) \
+                       REPLICATE_7(fld, string, var, , \
+               { strcpy(field, it); }, \
+               { strfree(field); }, \
                { \
-                   strcpy(field, s); \
-               } \
-       })
-       #define REPLICATE_float(fld, var, func) REPLICATE_7(fld, float, var, func,  { field = stof(it); },          , )
-       #define REPLICATE_bool(fld, var, func) REPLICATE_7(fld, bool, var, func,   { field = boolean(stoi(it)); }, , )
-       #define REPLICATE_int(fld, var, func) REPLICATE_7(fld, int, var, func,    { field = stoi(it); },          , )
+                       /* also initialize to the default value of func when requesting cvars */ \
+                       string s = func(field); \
+                       if (s != field) \
+                       { \
+                               strcpy(field, s); \
+                       } \
+               })
+               #define REPLICATE_float(fld, var, func) REPLICATE_7(fld, float, var, func,  { field = stof(it); },          , )
+               #define REPLICATE_bool(fld, var, func) REPLICATE_7(fld, bool, var, func,   { field = boolean(stoi(it)); }, , )
+               #define REPLICATE_int(fld, var, func) REPLICATE_7(fld, int, var, func,    { field = stoi(it); },          , )
 
-       #if defined(SVQC)
                #define REPLICATE_7(fld, type, var, func, create, destroy, after) \
                        void ReplicateVars(entity this, entity store, string thisname, int i) \
                        { \
                                        } \
                                        else \
                                        { \
-                                               stuffcmd(this, "cl_cmd sendcvar " var "\n"); \
+                                               stuffcmd(this, strcat("cl_cmd sendcvar ", var, "\n")); \
                                        } \
                                        if (current) { after } \
                                } \
                                store.fld = field; \
                        }
        #elif defined(CSQC)
-               // TODO
-               #define REPLICATE_7(fld, type, var, func, create, destroy, after)
+               float ReplicateVars_time;
+               #define ReplicateVars_NOT_SENDING() (time > ReplicateVars_time)
+               #define ReplicateVars_DELAY(t) ReplicateVars_time = time + t
+               #define ReplicateVars_DELAY_1FRAME() ReplicateVars_time = time
+               #define REPLICATE_string(fld, var, func) REPLICATE_7(fld, float, var, func, (fld != cvar_string(var)), { strcpy(fld, cvar_string(var)); }, { strfree(fld); })
+               #define REPLICATE_float(fld, var, func) REPLICATE_7(fld, float, var, func, (fld != cvar(var)), { fld = cvar(var); }, )
+               #define REPLICATE_bool(fld, var, func) REPLICATE_7(fld, bool, var, func, (fld != cvar(var)), { fld = cvar(var); }, )
+               #define REPLICATE_int(fld, var, func) REPLICATE_7(fld, int, var, func, (fld != cvar(var)), { fld = cvar(var); }, )
+
+               #define REPLICATE_7(fld, type, var, func, check, update, destroy) \
+                       void ReplicateVars(bool would_destroy) \
+                       { \
+                               if (would_destroy) { destroy } \
+                               else if (ReplicateVars_NOT_SENDING() && check) \
+                               { \
+                                       localcmd(strcat("cl_cmd sendcvar ", var, "\n")); \
+                                       ReplicateVars_DELAY_1FRAME(); \
+                                       update \
+                                       return; \
+                               } \
+                       }
+
+               #define REPLICATE_SIMPLE(field, cvarname) MACRO_BEGIN \
+                       if (ReplicateVars_NOT_SENDING() && field != cvar(cvarname)) \
+                       { \
+                               localcmd(strcat("cl_cmd sendcvar ", cvarname, "\n")); \
+                               ReplicateVars_DELAY_1FRAME(); \
+                               field = cvar(cvarname); \
+                               return; \
+                       } \
+               MACRO_END
        #endif
 
 #endif
index 244665cc5f3c4cf47cf3062e7dd27660701f9244..bcc1f2c693fdc7a14b07f54fbff14f62f36c8c34 100644 (file)
@@ -202,8 +202,12 @@ noref bool require_spawnfunc_prefix;
                FIELD_SCALAR(fld, target_range) \
                FIELD_SCALAR(fld, team) \
                FIELD_SCALAR(fld, trigger_reverse) \
+               FIELD_SCALAR(fld, turret_scale_aim) \
+               FIELD_SCALAR(fld, turret_scale_ammo) \
+               FIELD_SCALAR(fld, turret_scale_damage) \
                FIELD_SCALAR(fld, turret_scale_health) \
                FIELD_SCALAR(fld, turret_scale_range) \
+               FIELD_SCALAR(fld, turret_scale_refire) \
                FIELD_SCALAR(fld, turret_scale_respawn) \
                FIELD_SCALAR(fld, volume) \
                FIELD_SCALAR(fld, wait) \
index afde0914a48b981db347492f8db456e31ae4da64..08730511217002e2b2e4db884532e68b1d5bce53 100644 (file)
@@ -39,6 +39,7 @@ void XonoticScreenshotBrowserTab_fill(entity me)
 
        me.gotoRC(me, 0, 3.1);
                me.TD(me, 1, 1.9, e = makeXonoticCheckBoxEx(2, 1, "cl_autoscreenshot", _("Auto screenshot scoreboard")));
+                       e.sendCvars = true;
                me.TD(me, 1, 1, e = makeXonoticButton(_("Refresh"), '0 0 0'));
                        e.onClick = ScreenshotList_Refresh_Click;
                        e.onClickEntity = slist;
index 8705e5ff7f7df8e5d3d17b5a67ee43af18ce7f02..f87e0dbbe05f905e761c37918868870f4968837a 100644 (file)
@@ -40,8 +40,6 @@ void XonoticProfileTab_fill(entity me)
                "name \"$_cl_name\";"
                "playermodel $_cl_playermodel;"
                "playerskin $_cl_playerskin;"
-               "sendcvar cl_allow_uidtracking;"
-               "sendcvar cl_allow_uid2name;"
                , COMMANDBUTTON_APPLY);
        profileApplyButton.disableOnClick = true;
 
@@ -127,11 +125,11 @@ void XonoticProfileTab_fill(entity me)
        me.TR(me);
                me.TDempty(me, 0.25);
                me.TD(me, 1, 2.5, e = makeXonoticCheckBox(0, "cl_allow_uidtracking", _("Allow player statistics to track your client")));
-                       e.applyButton = profileApplyButton;
+                       e.sendCvars = true;
        me.TR(me);
                me.TDempty(me, 0.25);
                me.TD(me, 1, 2.5, e = makeXonoticCheckBox(0, "cl_allow_uid2name", _("Allow player statistics to use your nickname")));
-                       e.applyButton = profileApplyButton;
+                       e.sendCvars = true;
                        setDependent(e, "cl_allow_uidtracking", 1, 1);
        me.gotoRC(me, 4, 3.1); // TOP RIGHT
        //me.gotoRC(me, 12.5, 3.1); // BOTTOM RIGHT
index c1caddd7d4def04098368961477a35ba6eaa1e90..0b3a9ff6c4402253b2a30fb8ab277ab41b6a3c3d 100644 (file)
@@ -65,6 +65,7 @@ void XonoticGameViewSettingsTab_fill(entity me)
        me.TR(me);
        me.TR(me);
                me.TD(me, 1, 3, e = makeXonoticCheckBox(1, "cl_clippedspectating", _("Allow passing through walls while spectating")));
+                       e.sendCvars = true;
 
        me.gotoRC(me, 0, 3.2); me.setFirstColumn(me, me.currentColumn);
                me.TD(me, 1, 1, e = makeXonoticTextLabel(0, _("Field of view:")));
index 1d75ecb49b39b0b2ba58293137c3d88051e53b32..8eac7301abc705df0d96c214107ddb7683b5957a 100644 (file)
@@ -23,9 +23,7 @@ void XonoticGameWeaponsSettingsTab_fill(entity me)
 {
        entity e;
        entity weaponsApplyButton = makeXonoticCommandButton(_("Apply immediately"), '0 0 0',
-               "sendcvar cl_autoswitch;"
                "sendcvar cl_weaponpriority;"
-               "sendcvar cl_weaponimpulsemode;"
                , COMMANDBUTTON_APPLY);
        weaponsApplyButton.disableOnClick = true;
 
@@ -51,12 +49,12 @@ void XonoticGameWeaponsSettingsTab_fill(entity me)
                        _("Make use of the list above when cycling through weapons with the mouse wheel")));
        me.TR(me);
                me.TD(me, 1, 3, e = makeXonoticCheckBox(1, "cl_weaponimpulsemode", _("Cycle through only usable weapon selections")));
-                       e.applyButton = weaponsApplyButton;
+                       e.sendCvars = true;
        me.TR(me);
        me.TR(me);
                me.TD(me, 1, 3, e = makeXonoticCheckBox_T(0, "cl_autoswitch", _("Auto switch weapons on pickup"),
                        _("Automatically switch to newly picked up weapons if they are better than what you are carrying")));
-                       e.applyButton = weaponsApplyButton;
+                       e.sendCvars = true;
        me.TR(me);
                me.TD(me, 1, 3, e = makeXonoticCheckBox(0, "cl_unpress_attack_on_weapon_switch", _("Release attack buttons when you switch weapons")));
        me.TR(me);
index 27d6d4a82ec3a143f93ececce635ac37fba1892e..5e5b707faed5fd4d216b23a1348693d7bc2e712d 100644 (file)
@@ -17,8 +17,6 @@ entity makeXonoticUserSettingsTab()
 void XonoticUserSettingsTab_fill(entity me)
 {
        entity e, sk;
-       entity userApplyButton = makeXonoticCommandButton(_("Apply immediately"), '0 0 0', "sendcvar cl_gentle;", COMMANDBUTTON_APPLY);
-       userApplyButton.disableOnClick = true;
 
        me.TR(me);
                me.TDempty(me, 0.25);
@@ -73,9 +71,5 @@ void XonoticUserSettingsTab_fill(entity me)
        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")));
-                       e.applyButton = userApplyButton;
-
-       me.gotoRC(me, me.rows - 1, 0);
-               me.TD(me, 1, 6, userApplyButton);
-
+                       e.sendCvars = true;
 }
index 5029da7df9613f216a5ba89cedd44b70b647e801..0034c2dd9ee3b687a0b600eee0b850cc056dfb89 100644 (file)
@@ -1683,6 +1683,7 @@ void SpectateCopy(entity this, entity spectatee)
        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);
index 444e86de332bc88b2e06438716dc1bebcf1b7fcf..26b41c5b8074b1951533a7c2bb9eeb784c6c11da 100644 (file)
@@ -355,7 +355,7 @@ void ClientCommand_physics(entity caller, int request, int argc)
 
                        if (Physics_Valid(command) || command == "default")
                        {
-                               stuffcmd(caller, strcat("\nseta cl_physics ", command, "\nsendcvar cl_physics\n"));
+                               stuffcmd(caller, strcat("\nseta cl_physics ", command, "\n"));
                                sprint(caller, strcat("^2Physics set successfully changed to ^3", command, "\n"));
                                return;
                        }
@@ -910,6 +910,7 @@ void SV_ParseClientCommand(entity this, string command)
                case "prespawn": break;                            // handled by engine in host_cmd.c
                case "sentcvar": break;                            // handled by server in this file
                case "spawn": break;                               // handled by engine in host_cmd.c
+               case "color": case "topcolor": case "bottomcolor": if(teamplay) return; else break; // handled by engine in host_cmd.c
                case "c2s": Net_ClientCommand(this, command); return; // handled by net.qh
 
                default:
index b52649a34ead3389310bb9ef544b4c3e4e1bc3d2..b45e20986a76c0acba01ac6fdf4cea4137dd0c24 100644 (file)
@@ -190,9 +190,6 @@ string W_Apply_Weaponreplace(string in);
 void FixIntermissionClient(entity e);
 void FixClientCvars(entity e);
 
-// WEAPONTODO: remove this
-//WepSet weaponsInMap;
-
 .float respawn_countdown; // next number to count
 
 float bot_waypoints_for_items;
index 8680b83a58b596665d6052d2003f3317310a8aab..d33ba6e2b641d8afaa293fc378e171a220fb8099 100644 (file)
@@ -283,6 +283,7 @@ void cvar_changes_init()
                BADCVAR("g_race_qualifying_timelimit");
                BADCVAR("g_race_qualifying_timelimit_override");
                BADCVAR("g_runematch");
+               BADCVAR("g_shootfromeye");
                BADCVAR("g_snafu");
                BADCVAR("g_tdm");
                BADCVAR("g_tdm_teams");
@@ -343,6 +344,7 @@ void cvar_changes_init()
                BADCVAR("g_physics_predictall");
                BADCVAR("g_piggyback");
                BADCVAR("g_playerclip_collisions");
+               BADCVAR("g_spawn_alloweffects");
                BADCVAR("g_tdm_point_leadlimit");
                BADCVAR("g_tdm_point_limit");
                BADCVAR("leadlimit_and_fraglimit");
@@ -474,6 +476,12 @@ void cvar_changes_init()
                BADCVAR("g_grappling_hook");
                BADCVAR("g_jetpack");
 
+               // temporary for testing
+               // TODO remove before 0.8.3 release
+               BADCVAR("g_ca_weaponarena");
+               BADCVAR("g_freezetag_weaponarena");
+               BADCVAR("g_lms_weaponarena");
+
 #undef BADPRESUFFIX
 #undef BADPREFIX
 #undef BADCVAR
index 522840e763679681c641ccd3f271122db8012ea3..a59f4afa231380a58cc9f5e24fd6b7e76dd6e0b5 100644 (file)
@@ -429,6 +429,9 @@ void GetCvars(entity this, entity store, int f)
 {
        string s = string_null;
 
+       if (f == 0)
+               LOG_INFO("Warning: requesting cvar values is deprecated. Client should send them automatically using REPLICATE.\n");
+
        if (f > 0)
                s = strcat1(argv(f));
 
@@ -484,13 +487,12 @@ string playername(entity p, bool team_colorize)
         return p.netname;
 }
 
-float want_weapon(entity weaponinfo, float allguns) // WEAPONTODO: what still needs done?
+float want_weapon(entity weaponinfo, float allguns)
 {
-       int i = weaponinfo.m_id;
        int d = 0;
        bool allow_mutatorblocked = false;
 
-       if(!i)
+       if(!weaponinfo.m_id)
                return 0;
 
        bool mutator_returnvalue = MUTATOR_CALLHOOK(WantWeapon, weaponinfo, d, allguns, allow_mutatorblocked);
@@ -508,7 +510,7 @@ float want_weapon(entity weaponinfo, float allguns) // WEAPONTODO: what still ne
 
        float t = weaponinfo.weaponstartoverride;
 
-       //print(strcat("want_weapon: ", weaponinfo.netname, " - d: ", ftos(d), ", t: ", ftos(t), ". \n"));
+       //LOG_INFOF("want_weapon: %s - d: %d t: %d\n", weaponinfo.netname, d, t);
 
        // bit order in t:
        // 1: want or not
@@ -522,10 +524,90 @@ float want_weapon(entity weaponinfo, float allguns) // WEAPONTODO: what still ne
        return t;
 }
 
+/// Weapons the player normally starts with outside weapon arena.
+WepSet weapons_start()
+{
+       WepSet ret = '0 0 0';
+       FOREACH(Weapons, it != WEP_Null, {
+               int w = want_weapon(it, false);
+               if (w & 1)
+                       ret |= it.m_wepset;
+       });
+       return ret;
+}
+
+WepSet weapons_all()
+{
+       WepSet ret = '0 0 0';
+       FOREACH(Weapons, it != WEP_Null, {
+               if (!(it.spawnflags & (WEP_FLAG_MUTATORBLOCKED | WEP_FLAG_SPECIALATTACK)))
+                       ret |= it.m_wepset;
+       });
+       return ret;
+}
+
+WepSet weapons_devall()
+{
+       WepSet ret = '0 0 0';
+       FOREACH(Weapons, it != WEP_Null,
+       {
+               ret |= it.m_wepset;
+       });
+       return ret;
+}
+
+WepSet weapons_most()
+{
+       WepSet ret = '0 0 0';
+       FOREACH(Weapons, it != WEP_Null, {
+               if ((it.spawnflags & WEP_FLAG_NORMAL) && !(it.spawnflags & (WEP_FLAG_MUTATORBLOCKED | WEP_FLAG_HIDDEN | WEP_FLAG_SPECIALATTACK)))
+                       ret |= it.m_wepset;
+       });
+       return ret;
+}
+
+void weaponarena_available_all_update(entity this)
+{
+       if (weaponsInMapAll)
+       {
+               start_weapons = warmup_start_weapons = g_weaponarena_weapons = weapons_start() | (weaponsInMapAll & weapons_all());
+       }
+       else
+       {
+               // if no weapons are available on the map, just fall back to all weapons arena
+               start_weapons = warmup_start_weapons = g_weaponarena_weapons = weapons_all();
+       }
+}
+
+void weaponarena_available_devall_update(entity this)
+{
+       if (weaponsInMapAll)
+       {
+               start_weapons = warmup_start_weapons = g_weaponarena_weapons = weapons_start() | weaponsInMapAll;
+       }
+       else
+       {
+               // if no weapons are available on the map, just fall back to devall weapons arena
+               start_weapons = warmup_start_weapons = g_weaponarena_weapons = weapons_devall();
+       }
+}
+
+void weaponarena_available_most_update(entity this)
+{
+       if (weaponsInMapAll)
+       {
+               start_weapons = warmup_start_weapons = g_weaponarena_weapons = weapons_start() | (weaponsInMapAll & weapons_most());
+       }
+       else
+       {
+               // if no weapons are available on the map, just fall back to most weapons arena
+               start_weapons = warmup_start_weapons = g_weaponarena_weapons = weapons_most();
+       }
+}
+
 void readplayerstartcvars()
 {
        float i, t;
-       string s;
 
        // initialize starting values for players
        start_weapons = '0 0 0';
@@ -547,7 +629,7 @@ void readplayerstartcvars()
        g_weaponarena = 0;
        g_weaponarena_weapons = '0 0 0';
 
-       s = cvar_string("g_weaponarena");
+       string s = cvar_string("g_weaponarena");
 
        MUTATOR_CALLHOOK(SetWeaponArena, s);
        s = M_ARGV(0, string);
@@ -564,28 +646,43 @@ void readplayerstartcvars()
        {
                g_weaponarena = 1;
                g_weaponarena_list = "All Weapons";
-               FOREACH(Weapons, it != WEP_Null, {
-                       if(!(it.spawnflags & (WEP_FLAG_MUTATORBLOCKED | WEP_FLAG_SPECIALATTACK)))
-                               g_weaponarena_weapons |= (it.m_wepset);
-               });
+               g_weaponarena_weapons = weapons_all();
        }
        else if (s == "devall")
        {
                g_weaponarena = 1;
-               g_weaponarena_list = "All Weapons"; // TODO: report as more than just all weapons?
-               FOREACH(Weapons, it != WEP_Null,
-               {
-                       g_weaponarena_weapons |= (it.m_wepset);
-               });
+               g_weaponarena_list = "Dev All Weapons";
+               g_weaponarena_weapons = weapons_devall();
        }
        else if (s == "most")
        {
                g_weaponarena = 1;
                g_weaponarena_list = "Most Weapons";
-               FOREACH(Weapons, it != WEP_Null, {
-                       if ((it.spawnflags & WEP_FLAG_NORMAL) && !(it.spawnflags & (WEP_FLAG_MUTATORBLOCKED | WEP_FLAG_HIDDEN | WEP_FLAG_SPECIALATTACK)))
-                               g_weaponarena_weapons |= (it.m_wepset);
-               });
+               g_weaponarena_weapons = weapons_most();
+       }
+       else if (s == "all_available")
+       {
+               g_weaponarena = 1;
+               g_weaponarena_list = "All Available Weapons";
+
+               // this needs to run after weaponsInMapAll is initialized
+               InitializeEntity(NULL, weaponarena_available_all_update, INITPRIO_FINDTARGET);
+       }
+       else if (s == "devall_available")
+       {
+               g_weaponarena = 1;
+               g_weaponarena_list = "Dev All Available Weapons";
+
+               // this needs to run after weaponsInMapAll is initialized
+               InitializeEntity(NULL, weaponarena_available_devall_update, INITPRIO_FINDTARGET);
+       }
+       else if (s == "most_available")
+       {
+               g_weaponarena = 1;
+               g_weaponarena_list = "Most Available Weapons";
+
+               // this needs to run after weaponsInMapAll is initialized
+               InitializeEntity(NULL, weaponarena_available_most_update, INITPRIO_FINDTARGET);
        }
        else if (s == "none")
        {
@@ -654,56 +751,48 @@ void readplayerstartcvars()
                start_ammo_plasma = cvar("g_start_ammo_plasma");
                start_ammo_fuel = cvar("g_start_ammo_fuel");
                random_start_weapons_count = cvar("g_random_start_weapons_count");
-               SetResource(random_start_ammo, RES_SHELLS, cvar(
-                       "g_random_start_shells"));
-               SetResource(random_start_ammo, RES_BULLETS, cvar(
-                       "g_random_start_bullets"));
-               SetResource(random_start_ammo, RES_ROCKETS,
-                       cvar("g_random_start_rockets"));
-               SetResource(random_start_ammo, RES_CELLS, cvar(
-                       "g_random_start_cells"));
-               SetResource(random_start_ammo, RES_PLASMA, cvar(
-                       "g_random_start_plasma"));
+               SetResource(random_start_ammo, RES_SHELLS, cvar("g_random_start_shells"));
+               SetResource(random_start_ammo, RES_BULLETS, cvar("g_random_start_bullets"));
+               SetResource(random_start_ammo, RES_ROCKETS,cvar("g_random_start_rockets"));
+               SetResource(random_start_ammo, RES_CELLS, cvar("g_random_start_cells"));
+               SetResource(random_start_ammo, RES_PLASMA, cvar("g_random_start_plasma"));
        }
 
-       if (warmup_stage)
+       warmup_start_ammo_shells = start_ammo_shells;
+       warmup_start_ammo_nails = start_ammo_nails;
+       warmup_start_ammo_rockets = start_ammo_rockets;
+       warmup_start_ammo_cells = start_ammo_cells;
+       warmup_start_ammo_plasma = start_ammo_plasma;
+       warmup_start_ammo_fuel = start_ammo_fuel;
+       warmup_start_health = start_health;
+       warmup_start_armorvalue = start_armorvalue;
+       warmup_start_weapons = start_weapons;
+       warmup_start_weapons_default = start_weapons_default;
+       warmup_start_weapons_defaultmask = start_weapons_defaultmask;
+
+       if (!g_weaponarena)
        {
-               warmup_start_ammo_shells = start_ammo_shells;
-               warmup_start_ammo_nails = start_ammo_nails;
-               warmup_start_ammo_rockets = start_ammo_rockets;
-               warmup_start_ammo_cells = start_ammo_cells;
-               warmup_start_ammo_plasma = start_ammo_plasma;
-               warmup_start_ammo_fuel = start_ammo_fuel;
-               warmup_start_health = start_health;
-               warmup_start_armorvalue = start_armorvalue;
-               warmup_start_weapons = start_weapons;
-               warmup_start_weapons_default = start_weapons_default;
-               warmup_start_weapons_defaultmask = start_weapons_defaultmask;
-
-               if (!g_weaponarena && !g_ca && !g_freezetag)
-               {
-                       warmup_start_ammo_shells = cvar("g_warmup_start_ammo_shells");
-                       warmup_start_ammo_nails = cvar("g_warmup_start_ammo_nails");
-                       warmup_start_ammo_rockets = cvar("g_warmup_start_ammo_rockets");
-                       warmup_start_ammo_cells = cvar("g_warmup_start_ammo_cells");
-                       warmup_start_ammo_plasma = cvar("g_warmup_start_ammo_plasma");
-                       warmup_start_ammo_fuel = cvar("g_warmup_start_ammo_fuel");
-                       warmup_start_health = cvar("g_warmup_start_health");
-                       warmup_start_armorvalue = cvar("g_warmup_start_armor");
-                       warmup_start_weapons = '0 0 0';
-                       warmup_start_weapons_default = '0 0 0';
-                       warmup_start_weapons_defaultmask = '0 0 0';
-                       FOREACH(Weapons, it != WEP_Null, {
-                               int w = want_weapon(it, g_warmup_allguns);
-                               WepSet s = (it.m_wepset);
-                               if(w & 1)
-                                       warmup_start_weapons |= s;
-                               if(w & 2)
-                                       warmup_start_weapons_default |= s;
-                               if(w & 4)
-                                       warmup_start_weapons_defaultmask |= s;
-                       });
-               }
+               warmup_start_ammo_shells = cvar("g_warmup_start_ammo_shells");
+               warmup_start_ammo_nails = cvar("g_warmup_start_ammo_nails");
+               warmup_start_ammo_rockets = cvar("g_warmup_start_ammo_rockets");
+               warmup_start_ammo_cells = cvar("g_warmup_start_ammo_cells");
+               warmup_start_ammo_plasma = cvar("g_warmup_start_ammo_plasma");
+               warmup_start_ammo_fuel = cvar("g_warmup_start_ammo_fuel");
+               warmup_start_health = cvar("g_warmup_start_health");
+               warmup_start_armorvalue = cvar("g_warmup_start_armor");
+               warmup_start_weapons = '0 0 0';
+               warmup_start_weapons_default = '0 0 0';
+               warmup_start_weapons_defaultmask = '0 0 0';
+               FOREACH(Weapons, it != WEP_Null, {
+                       int w = want_weapon(it, g_warmup_allguns);
+                       WepSet s = it.m_wepset;
+                       if(w & 1)
+                               warmup_start_weapons |= s;
+                       if(w & 2)
+                               warmup_start_weapons_default |= s;
+                       if(w & 4)
+                               warmup_start_weapons_defaultmask |= s;
+               });
        }
 
        if (g_jetpack)
@@ -724,16 +813,16 @@ void readplayerstartcvars()
        start_ammo_cells = max(0, start_ammo_cells);
        start_ammo_plasma = max(0, start_ammo_plasma);
        start_ammo_fuel = max(0, start_ammo_fuel);
-       SetResource(random_start_ammo, RES_SHELLS, max(0,
-               GetResource(random_start_ammo, RES_SHELLS)));
-       SetResource(random_start_ammo, RES_BULLETS, max(0,
-               GetResource(random_start_ammo, RES_BULLETS)));
-       SetResource(random_start_ammo, RES_ROCKETS, max(0,
-               GetResource(random_start_ammo, RES_ROCKETS)));
-       SetResource(random_start_ammo, RES_CELLS, max(0,
-               GetResource(random_start_ammo, RES_CELLS)));
-       SetResource(random_start_ammo, RES_PLASMA, max(0,
-               GetResource(random_start_ammo, RES_PLASMA)));
+       SetResource(random_start_ammo, RES_SHELLS,
+               max(0, GetResource(random_start_ammo, RES_SHELLS)));
+       SetResource(random_start_ammo, RES_BULLETS,
+               max(0, GetResource(random_start_ammo, RES_BULLETS)));
+       SetResource(random_start_ammo, RES_ROCKETS,
+               max(0, GetResource(random_start_ammo, RES_ROCKETS)));
+       SetResource(random_start_ammo, RES_CELLS,
+               max(0, GetResource(random_start_ammo, RES_CELLS)));
+       SetResource(random_start_ammo, RES_PLASMA,
+               max(0, GetResource(random_start_ammo, RES_PLASMA)));
 
        warmup_start_ammo_shells = max(0, warmup_start_ammo_shells);
        warmup_start_ammo_nails = max(0, warmup_start_ammo_nails);
@@ -748,9 +837,9 @@ void precache_playermodel(string m)
        float globhandle, i, n;
        string f;
 
-       if(substring(m, -9,5) == "_lod1")
+       if(substring(m, -9, 5) == "_lod1")
                return;
-       if(substring(m, -9,5) == "_lod2")
+       if(substring(m, -9, 5) == "_lod2")
                return;
        precache_model(m);
        f = strcat(substring(m, 0, -5), "_lod1", substring(m, -4, -1));
index cd09b1defd7ff9051dd5d96e041fd9c303561d0d..1ca629078e4a99d27076c5292e1aade918bf5996 100644 (file)
@@ -306,6 +306,7 @@ MUTATOR_HOOKABLE(PlayerPreThink, EV_PlayerPreThink);
 MUTATOR_HOOKABLE(GetPressedKeys, EV_GetPressedKeys);
 
 /** is meant to call GetCvars_handle*(get_cvars_s, get_cvars_f, cvarfield, "cvarname") for cvars this mutator needs from the client */
+// NOTE: requesting cvar values (get_cvars_f 0) is deprecated
 #define EV_GetCvars(i, o) \
     /**/ i(float, get_cvars_f) \
     /**/ i(string, get_cvars_s) \
index ba17d3f1f893bdb2c42a7aa89fa4e674867ba548..23a3ee67d6aa5ab8d2ba95d302f2b7514ecbdc39 100644 (file)
@@ -26,22 +26,21 @@ string W_Apply_Weaponreplace(string in)
        return out;
 }
 
-void weapon_defaultspawnfunc(entity this, Weapon e)
+void weapon_defaultspawnfunc(entity this, Weapon wpn)
 {
-       Weapon wpn = e;
-       e = wpn = wpn.m_spawnfunc_hookreplace(wpn, this);
+       wpn = wpn.m_spawnfunc_hookreplace(wpn, this);
        this.classname = wpn.m_canonical_spawnfunc;
        if (!Item_IsLoot(this) && !this.m_isreplaced)
        {
-               if (e.spawnflags & WEP_FLAG_MUTATORBLOCKED)
+               if (wpn.spawnflags & WEP_FLAG_MUTATORBLOCKED)
                {
                        LOG_WARNF("Attempted to spawn a mutator-blocked weapon rejected: prvm_edict server %i", this);
                        startitem_failed = true;
                        return;
                }
 
-               string s = W_Apply_Weaponreplace(e.netname);
-               MUTATOR_CALLHOOK(SetWeaponreplace, this, e, s);
+               string s = W_Apply_Weaponreplace(wpn.netname);
+               MUTATOR_CALLHOOK(SetWeaponreplace, this, wpn, s);
                s = M_ARGV(2, string);
                if (s == "")
                {
@@ -79,6 +78,9 @@ void weapon_defaultspawnfunc(entity this, Weapon e)
                }
        }
 
+       if(!Item_IsLoot(this))
+               weaponsInMapAll |= WepSet_FromWeapon(wpn);
+
        if (!Item_IsDefinitionAllowed(wpn.m_pickup))
        {
                delete(this);
index b75881127a219008f56faaad9d086817d922ab4c..19ba40aa0b6ce6bc6913f0abb2a7ee99a80f5cb0 100644 (file)
@@ -163,6 +163,7 @@ void CL_ExteriorWeaponentity_Think(entity this)
     Weapon wep = this.owner.(weaponentity).m_weapon;
        if (wep) this.glowmod = weaponentity_glowmod(wep, this.owner, this.owner.clientcolors, this.owner.(weaponentity));
        this.colormap = this.owner.colormap;
+       this.skin = w_ent.skin;
 
        CSQCMODEL_AUTOUPDATE(this);
 }
index e7a0ec1a0a3e20b9c0d4b308f73a390cf0e0f70b..0bb2d446d5a6c5083fc6f70924151cc718dab084 100644 (file)
@@ -2,8 +2,8 @@
 // if you want to reset your client to defaults, it's probably a better idea to delete (parts of) config.cfg and restart
 
 
-// changes a cvar and reports it to the server (for the menu to notify the
-// server about changes)
+// changes a cvar and reports it to the server (for the client to notify the server about changes)
+// DEPRECATED, cvars can be set in the client code to be sent automatically (using REPLICATE)
 alias setreport "set \"$1\" \"$2\" ; sendcvar \"$1\""
 
 seta cl_firststart "" "how many times the client has been run"
@@ -75,7 +75,6 @@ sensitivity 6
 v_gamma 1
 viewsize 100
 bgmvolume 1
-volume 0.5
 // fullscreen 1024x768x32bit
 vid_bitsperpixel 32
 vid_fullscreen 1
@@ -307,8 +306,6 @@ r_glsl_offsetmapping_lod 1
 r_glsl_offsetmapping_reliefmapping 0
 r_glsl_offsetmapping_scale 0.02
 
-scr_conalpha 1
-scr_conbrightness 0.2
 scr_screenshot_jpeg 1
 scr_screenshot_jpeg_quality 0.9
 
@@ -650,9 +647,9 @@ alias _gl_flashblend_update_01 "gl_flashblend 0"
 alias _gl_flashblend_update_11 "gl_flashblend 0"
 alias gl_flashblend_update "_gl_flashblend_update_$r_shadow_realtime_dlight$r_showsurfaces"
 
-set cl_handicap 1      "multiplies damage received and divides damage dealt NOTE: reconnect or use 'sendcvar cl_handicap' to update the choice."
+set cl_handicap 1      "multiplies damage received and divides damage dealt"
 
-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_clippedspectating 1 "movement collision for spectators so that you can't pass through walls and such"
 
 seta cl_autoscreenshot 1 "Take a screenshot upon the end of a match... 0 = Disable completely, 1 = Allow sv_autoscreenshot to take a screenshot when requested, 2 = Always take an autoscreenshot anyway."
 
@@ -767,7 +764,6 @@ scr_conalpha2factor 0.3
 scr_conalpha3factor 1
 scr_conalphafactor 0.8
 scr_conbrightness 0.35
-scr_conforcewhiledisconnected 1
 scr_conscroll2_x 0.11
 scr_conscroll2_y 0.2
 scr_conscroll3_x 0
index d261e262eab2a9351d4542b7969afa1fbd72f680..158b32ecd597d837df4224d0dff3f96b29fa9515 100644 (file)
@@ -195,7 +195,7 @@ set g_pickup_items -1 "if set to 0 all items (health, armor, ammo, weapons...) a
 set g_pickup_respawntime_scaling_reciprocal 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, `reciprocal` (with `offset` and `linear` set to 0) can be used to achieve a constant number of items spawned *per player*"
 set g_pickup_respawntime_scaling_offset 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"
 set g_pickup_respawntime_scaling_linear 1 "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"
-set g_weaponarena "0"  "put in a list of weapons to enable a weapon arena mode, or try \"all\" or \"most\""
+set g_weaponarena "0"  "put in a list of weapons to enable a weapon arena mode, or try \"all\", \"most\", \"all_available\" or \"most_available\" (available only gives the weapon if the map normally has it as a pickup item)"
 set g_weaponarena_random "0"   "if set to a number, only that weapon count is given on every spawn (randomly)"
 set g_weaponarena_random_with_blaster "1"      "additionally, always provide the blaster in random weapon arena games"
 set g_spawnpoints_auto_move_out_of_solid 0 "if set to 1 you will see a warning if a spawn point was placed inside a solid"