Merge branch 'master' into Mario/weaponarena_available
authorMario <mario@smbclan.net>
Mon, 29 Jul 2019 11:02:46 +0000 (21:02 +1000)
committerMario <mario@smbclan.net>
Mon, 29 Jul 2019 11:02:46 +0000 (21:02 +1000)
41 files changed:
.gitlab-ci.yml
qcsrc/client/main.qh
qcsrc/client/view.qc
qcsrc/client/view.qh
qcsrc/common/deathtypes/all.qh
qcsrc/common/effects/qc/damageeffects.qc
qcsrc/common/gamemodes/gamemode/ctf/sv_ctf.qh
qcsrc/common/gamemodes/gamemode/nexball/weapon.qh
qcsrc/common/minigames/minigame/bd.qc
qcsrc/common/minigames/minigame/c4.qc
qcsrc/common/minigames/minigame/nmm.qc
qcsrc/common/minigames/minigame/pong.qc
qcsrc/common/minigames/minigame/pp.qc
qcsrc/common/minigames/minigame/ps.qc
qcsrc/common/minigames/minigame/ttt.qc
qcsrc/common/monsters/monster/mage.qc
qcsrc/common/mutators/mutator/instagib/sv_instagib.qc
qcsrc/common/mutators/mutator/itemstime/itemstime.qc
qcsrc/common/mutators/mutator/nades/nades.qc
qcsrc/common/mutators/mutator/overkill/sv_overkill.qc
qcsrc/common/sounds/sound.qh
qcsrc/common/weapons/weapon.qh
qcsrc/common/weapons/weapon/blaster.qh
qcsrc/common/weapons/weapon/hook.qh
qcsrc/common/weapons/weapon/mortar.qh
qcsrc/common/weapons/weapon/porto.qc
qcsrc/common/weapons/weapon/porto.qh
qcsrc/common/weapons/weapon/tuba.qc
qcsrc/common/weapons/weapon/tuba.qh
qcsrc/common/wepent.qc
qcsrc/lib/registry.qh
qcsrc/server/autocvars.qh
qcsrc/server/bot/default/waypoints.qc
qcsrc/server/client.qc
qcsrc/server/g_world.qc
qcsrc/server/miscfunctions.qc
qcsrc/server/player.qc
qcsrc/server/race.qc
qcsrc/server/race.qh
qcsrc/server/weapons/tracing.qc
xonotic-server.cfg

index 81af16137d5ca6d759caf2ff94c2c7830e6f8a2f..83373af9b3fc27e6daebbf7bcca4c2c8fbb81c2c 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=6e591fe90a6b90e62fdfd531636dd6eb
+    - EXPECT=ce60a57e67f899e8b748c1b644082c74
     - HASH=$(${ENGINE} -noconfig -nohome +exec serverbench.cfg
       | tee /dev/stderr
       | grep '^:'
index f0f8f1d4bea5ad62563c20df43bc0ce6ad2c9f29..87951ff894ba0e689101e7eb847879908a95c8e4 100644 (file)
@@ -45,20 +45,24 @@ entity teamslots[17];    // 17 teams (including "spectator team")
 .bool ready;
 .bool eliminated;
 
-.void(entity) draw;
 IntrusiveList g_drawables;
-STATIC_INIT(g_drawables) { g_drawables = IL_NEW(); }
-.void(entity) draw2d;
 IntrusiveList g_drawables_2d;
-STATIC_INIT(g_drawables_2d) { g_drawables_2d = IL_NEW(); }
+IntrusiveList g_radarlinks;
+IntrusiveList g_radaricons;
+STATIC_INIT(main)
+{
+       g_drawables = IL_NEW();
+       g_drawables_2d = IL_NEW();
+       g_radarlinks = IL_NEW();
+       g_radaricons = IL_NEW();
+}
+
+.void(entity) draw;
+.void(entity) draw2d;
 .void(entity) entremove;
 float drawframetime;
 vector view_origin, view_forward, view_right, view_up;
 
-IntrusiveList g_radarlinks;
-STATIC_INIT(g_radarlinks) { g_radarlinks = IL_NEW(); }
-IntrusiveList g_radaricons;
-STATIC_INIT(g_radaricons) { g_radaricons = IL_NEW(); }
 
 bool button_zoom;
 bool spectatorbutton_zoom;
index 322abb87e005a628660c3abd916a8746b452ab9a..60ae3f18a2b355592671f31b29179fe8c51fa9fb 100644 (file)
@@ -392,86 +392,6 @@ STATIC_INIT(fpscounter_init)
        showfps_prevfps_time = currentTime; // we must initialize it to avoid an instant low frame sending
 }
 
-STATIC_INIT(Porto)
-{
-       entity e = new_pure(porto);
-       e.draw = Porto_Draw;
-       IL_PUSH(g_drawables, e);
-       e.dphitcontentsmask = DPCONTENTS_SOLID | DPCONTENTS_BODY | DPCONTENTS_PLAYERCLIP;
-}
-
-const int polyline_length = 16;
-.vector polyline[polyline_length];
-void Porto_Draw(entity this)
-{
-       for(int slot = 0; slot < MAX_WEAPONSLOTS; ++slot)
-       {
-               entity wepent = viewmodels[slot];
-
-               if (wepent.activeweapon != WEP_PORTO) continue;
-               if (spectatee_status) continue;
-               if (WEP_CVAR(porto, secondary)) continue;
-               if (intermission == 1) continue;
-               if (intermission == 2) continue;
-               if (STAT(HEALTH) <= 0) continue;
-
-               vector pos = view_origin;
-               vector dir = view_forward;
-               makevectors(((autocvar_chase_active) ? warpzone_save_view_angles : view_angles));
-               pos += v_right * -wepent.movedir.y
-                       +  v_up * wepent.movedir.z;
-
-               if (wepent.angles_held_status)
-               {
-                       makevectors(wepent.angles_held);
-                       dir = v_forward;
-               }
-
-               wepent.polyline[0] = pos;
-
-               int portal_number = 0, portal1_idx = 1, portal_max = 2;
-               int n = 1 + 2;  // 2 lines == 3 points
-               for (int idx = 0; idx < n && idx < polyline_length - 1; )
-               {
-                       traceline(pos, pos + 65536 * dir, true, this);
-                       dir = reflect(dir, trace_plane_normal);
-                       pos = trace_endpos;
-                       wepent.polyline[++idx] = pos;
-                       if (trace_dphitq3surfaceflags & Q3SURFACEFLAG_SLICK || trace_dphitcontents & DPCONTENTS_PLAYERCLIP)
-                       {
-                               n += 1;
-                               continue;
-                       }
-                       if (trace_dphitq3surfaceflags & Q3SURFACEFLAG_NOIMPACT)
-                       {
-                               n = max(2, idx);
-                               break;
-                       }
-                       // check size
-                       {
-                               vector ang = vectoangles2(trace_plane_normal, dir);
-                               ang.x = -ang.x;
-                               makevectors(ang);
-                               if (!CheckWireframeBox(this, pos - 48 * v_right - 48 * v_up + 16 * v_forward, 96 * v_right, 96 * v_up, 96 * v_forward))
-                               {
-                                       n = max(2, idx);
-                                       break;
-                               }
-                       }
-                       portal_number += 1;
-                       if (portal_number >= portal_max) break;
-                       if (portal_number == 1) portal1_idx = idx;
-               }
-               for (int idx = 0; idx < n - 1; ++idx)
-               {
-                       vector p = wepent.polyline[idx], q = wepent.polyline[idx + 1];
-                       if (idx == 0) p -= view_up * 16;  // line from player
-                       vector rgb = (idx < portal1_idx) ? '1 0 0' : '0 0 1';
-                       Draw_CylindricLine(p, q, 4, "", 1, 0, rgb, 0.5, DRAWFLAG_NORMAL, view_origin);
-               }
-       }
-}
-
 float drawtime;
 float avgspeed;
 vector GetCurrentFov(float fov)
@@ -679,6 +599,9 @@ float EnemyHitCheck()
 
 float TrueAimCheck(entity wepent)
 {
+       if(wepent.activeweapon.spawnflags & WEP_FLAG_NOTRUEAIM)
+               return SHOTTYPE_HITWORLD;
+       
        float nudge = 1; // added to traceline target and subtracted from result TOOD(divVerent): do we still need this? Doesn't the engine do this now for us?
        vector vecs, trueaimpoint, w_shotorg;
        vector mi, ma, dv;
@@ -692,12 +615,6 @@ float TrueAimCheck(entity wepent)
 
        switch(wepent.activeweapon) // WEAPONTODO
        {
-               case WEP_TUBA: // no aim
-               case WEP_PORTO: // shoots from eye
-               case WEP_NEXBALL: // shoots from eye
-               case WEP_HOOK: // no trueaim
-               case WEP_MORTAR: // toss curve
-                       return SHOTTYPE_HITWORLD;
                case WEP_VORTEX:
                case WEP_OVERKILL_NEX:
                case WEP_VAPORIZER:
index 12fd6eb614c5e8040e0a24995d35ad7f520107c6..f3c1f4139fff3543ca272c7a750a3cd3328422b5 100644 (file)
@@ -6,8 +6,6 @@ vector crosshair_getcolor(entity this, float health_stat);
 
 void calc_followmodel_ofs(entity view);
 
-void Porto_Draw(entity this);
-
 void CSQC_Demo_Camera();
 
 void TrueAim_Init();
index beb8e3e912221911705429fe210042762ed51cb0..2169c8bd762bd3abe5e708e1f24e1b8b99333740 100644 (file)
@@ -26,9 +26,8 @@ const int HITTYPE_SECONDARY = BITS(1) << 8;
 const int HITTYPE_SPLASH = BITS(1) << 9;
 const int HITTYPE_BOUNCE = BITS(1) << 10;
 const int HITTYPE_ARMORPIERCE = BITS(1) << 11;
-// unused yet
-const int HITTYPE_RESERVED = BITS(1) << 12;
-const int DEATH_HITTYPEMASK = HITTYPE_SECONDARY | HITTYPE_SPLASH | HITTYPE_BOUNCE | HITTYPE_ARMORPIERCE | HITTYPE_RESERVED;
+const int HITTYPE_SOUND = BITS(1) << 12;
+const int DEATH_HITTYPEMASK = HITTYPE_SECONDARY | HITTYPE_SPLASH | HITTYPE_BOUNCE | HITTYPE_ARMORPIERCE | HITTYPE_SOUND;
 // normal deaths begin
 const int DT_FIRST = BIT(13);
 
index fe509e3d4988cfce22f0e88f84b15a9402642124..17f48136a6c0a4126f1ae96bf172c89fc63b9d4d 100644 (file)
@@ -174,7 +174,6 @@ void DamageEffect(entity this, vector hitorg, float thedamage, int type, int spe
 
 NET_HANDLE(ENT_CLIENT_DAMAGEINFO, bool isNew)
 {
-       const float ATTEN_LOW = 0.2;
        float thedamage, rad, edge, thisdmg;
        bool hitplayer = false;
        int species, forcemul;
@@ -393,7 +392,7 @@ NET_HANDLE(ENT_CLIENT_DAMAGEINFO, bool isNew)
                w_random = prandom();
 
                traceline(w_org - normalize(force) * 16, w_org + normalize(force) * 16, MOVE_NOMONSTERS, NULL);
-               if(trace_fraction < 1 && hitwep != WEP_VORTEX && hitwep != WEP_VAPORIZER)
+               if(trace_fraction < 1 && !(hitwep.spawnflags & WEP_TYPE_HITSCAN))
                        w_backoff = trace_plane_normal;
                else
                        w_backoff = -1 * normalize(force);
index 679dd850257a3286db8a56d1ecf76bc67971be31..b1518bd4fc1825df24868ce50597f31cb1368d4c 100644 (file)
@@ -28,7 +28,8 @@ CLASS(Flag, Pickup)
     ATTRIB(Flag, m_mins, vector, (PL_MIN_CONST + '0 0 -13') * 1.4); // scaling be damned
     ATTRIB(Flag, m_maxs, vector, (PL_MAX_CONST + '0 0 -13') * 1.4);
 ENDCLASS(Flag)
-Flag CTF_FLAG; STATIC_INIT(Flag) { CTF_FLAG = NEW(Flag); }
+Flag CTF_FLAG;
+STATIC_INIT(Flag) { CTF_FLAG = NEW(Flag); }
 void ctf_FlagTouch(entity this, entity toucher) { ITEM_HANDLE(Pickup, CTF_FLAG, this, toucher); }
 
 // flag constants // for most of these, there is just one question to be asked: WHYYYYY?
index 73b887260c10b785d4a60c013f6dd0ef87925625..7790663ace981cee2d938bdb75f4bf11debc25db 100644 (file)
@@ -1,7 +1,7 @@
 #pragma once
 
 CLASS(BallStealer, PortoLaunch)
-/* flags     */ ATTRIB(BallStealer, spawnflags, int, WEP_TYPE_OTHER | WEP_FLAG_HIDDEN | WEP_FLAG_MUTATORBLOCKED);
+/* flags     */ ATTRIB(BallStealer, spawnflags, int, WEP_TYPE_OTHER | WEP_FLAG_HIDDEN | 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 84e43709c5c3adb9364c903ae08c27b1869a65e9..744dab71af518124cae264d9708fde3f47c189d2 100644 (file)
@@ -1311,11 +1311,16 @@ int bd_client_event(entity minigame, string event, ...)
        {
                case "activate":
                {
-                       minigame.message = bd_turn_to_string(minigame.minigame_flags);
+                       strcpy(minigame.message, bd_turn_to_string(minigame.minigame_flags));
                        bd_set_curr_pos("");
                        bd_curr_tile = BD_TILE_BRICK1;
                        return false;
                }
+               case "deactivate":
+               {
+                       strfree(minigame.message);
+                       return false;
+               }
                case "key_pressed":
                {
                        if(minigame.minigame_flags & BD_TURN_MOVE)
@@ -1370,7 +1375,7 @@ int bd_client_event(entity minigame, string event, ...)
                        {
                                if ( sf & MINIG_SF_UPDATE )
                                {
-                                       sent.message = bd_turn_to_string(sent.minigame_flags);
+                                       strcpy(sent.message, bd_turn_to_string(sent.minigame_flags));
                                        //if ( sent.minigame_flags & minigame_self.team )
                                                //minigame_prompt();
                                }
index a35ada8cdffcb90a1bbea8ce09e88277ea068a30..be65e6ac13528bc4446b8b0e1ee8768636387fff 100644 (file)
@@ -413,7 +413,12 @@ int c4_client_event(entity minigame, string event, ...)
                case "activate":
                {
                        c4_set_curr_pos("");
-                       minigame.message = c4_turn_to_string(minigame.minigame_flags);
+                       strcpy(minigame.message, c4_turn_to_string(minigame.minigame_flags));
+                       return false;
+               }
+               case "deactivate":
+               {
+                       strfree(minigame.message);
                        return false;
                }
                case "key_pressed":
@@ -490,7 +495,7 @@ int c4_client_event(entity minigame, string event, ...)
                        {
                                if ( sf & MINIG_SF_UPDATE )
                                {
-                                       sent.message = c4_turn_to_string(sent.minigame_flags);
+                                       strcpy(sent.message, c4_turn_to_string(sent.minigame_flags));
                                        if ( sent.minigame_flags & minigame_self.team )
                                                minigame_prompt();
                                }
index fbb6f4b727e762c39e563e0eeb22420846cdb845..72b65e75691ede0428b7cf4acffd85ee37c96506 100644 (file)
@@ -628,12 +628,13 @@ int nmm_client_event(entity minigame, string event, ...)
        {
                nmm_fromtile = NULL;
                nmm_init_tiles(minigame);
-               minigame.message = nmm_turn_to_string(minigame.minigame_flags);
+               strcpy(minigame.message, nmm_turn_to_string(minigame.minigame_flags));
        }
        else if ( event == "deactivate" )
        {
                nmm_fromtile = NULL;
                nmm_kill_tiles(minigame);
+               strfree(minigame.message);
        }
        else if ( event == "key_pressed" && (minigame.minigame_flags&NMM_TURN_TEAM) == minigame_self.team )
        {
@@ -755,7 +756,7 @@ int nmm_client_event(entity minigame, string event, ...)
                }
                else if ( sent.classname == "minigame" && ( ...(1,int) & MINIG_SF_UPDATE ) )
                {
-                       sent.message = nmm_turn_to_string(sent.minigame_flags);
+                       strcpy(sent.message, nmm_turn_to_string(sent.minigame_flags));
                        if ( sent.minigame_flags & minigame_self.team )
                                minigame_prompt();
                }
index 3f4810078ac243d43f21705efdbc6340df81fb18..407eb4e8fdfeafbaa12680abdc9655bb7862bbcd 100644 (file)
@@ -614,6 +614,11 @@ int pong_client_event(entity minigame, string event, ...)
        {
                case "activate":
                        return false;
+               case "deactivate":
+               {
+                       strfree(minigame.message);
+                       return false;
+               }
                case "key_pressed":
                        switch ( ...(0,int) )
                        {
@@ -664,7 +669,7 @@ int pong_client_event(entity minigame, string event, ...)
                        {
                                if ( sf & MINIG_SF_UPDATE )
                                {
-                                       sent.message = pong_message(sent.minigame_flags);
+                                       strcpy(sent.message, pong_message(sent.minigame_flags));
                                }
                        }
                        return false;
index 1dc640ce5b25908d1272a0dc5ac919c346cb209b..e8aed878aab9c31ce663bd453747d996e1a191a2 100644 (file)
@@ -439,11 +439,10 @@ string pp_turn_to_string(int turnflags)
 
        if ( turnflags & PP_TURN_WIN )
        {
+               // translator-friendly messages composed of 2 existing messages
                if ( (turnflags&PP_TURN_TEAM) != minigame_self.team )
-                       //return _("You lost the game!\nSelect \"^1Next Match^7\" on the menu for a rematch!");
-                       return _("You lost the game!");
-               //return _("You win!\nSelect \"^1Next Match^7\" on the menu to start a new match!");
-               return _("You win!");
+                       return strcat(_("You lost the game!"), "\n", _("Select \"^1Next Match^7\" on the menu for a rematch!"));
+               return strcat(_("You win!"), "\n", _("Select \"^1Next Match^7\" on the menu to start a new match!"));
        }
 
        if ( turnflags & PP_TURN_NEXT )
@@ -487,7 +486,12 @@ int pp_client_event(entity minigame, string event, ...)
                case "activate":
                {
                        pp_set_curr_pos("");
-                       minigame.message = pp_turn_to_string(minigame.minigame_flags);
+                       strcpy(minigame.message, pp_turn_to_string(minigame.minigame_flags));
+                       return false;
+               }
+               case "deactivate":
+               {
+                       strfree(minigame.message);
                        return false;
                }
                case "key_pressed":
@@ -562,7 +566,7 @@ int pp_client_event(entity minigame, string event, ...)
                        {
                                if ( sf & MINIG_SF_UPDATE )
                                {
-                                       sent.message = pp_turn_to_string(sent.minigame_flags);
+                                       strcpy(sent.message, pp_turn_to_string(sent.minigame_flags));
                                        if ( sent.minigame_flags & minigame_self.team )
                                                minigame_prompt();
                                        sent.pp_team1_score = ReadByte();
index 8bf8cabe75738713164856171a1bc75b98817aa0..4457449e86b467417e9534b724d531241b9f9cb1 100644 (file)
@@ -532,7 +532,12 @@ int ps_client_event(entity minigame, string event, ...)
                {
                        ps_set_curr_pos("");
                        ps_curr_piece = NULL;
-                       minigame.message = ps_turn_to_string(minigame.minigame_flags);
+                       strcpy(minigame.message, ps_turn_to_string(minigame.minigame_flags));
+                       return false;
+               }
+               case "deactivate":
+               {
+                       strfree(minigame.message);
                        return false;
                }
                case "key_pressed":
@@ -609,7 +614,7 @@ int ps_client_event(entity minigame, string event, ...)
                        {
                                if ( sf & MINIG_SF_UPDATE )
                                {
-                                       sent.message = ps_turn_to_string(sent.minigame_flags);
+                                       strcpy(sent.message, ps_turn_to_string(sent.minigame_flags));
                                        //if ( sent.minigame_flags & minigame_self.team )
                                                //minigame_prompt();
                                }
index 767c9cd1fe0d90f74f7c2720c63af8148736face..6bac28c930b56f6a470c980a4e91dbf8fee0e892 100644 (file)
@@ -320,11 +320,11 @@ string ttt_turn_to_string(int turnflags)
 
        if ( turnflags & TTT_TURN_WIN )
        {
+               // translator-friendly messages composed of 2 existing messages
+               // TODO: proper "you win" banner instead of hijacking the help message
                if ( (turnflags&TTT_TURN_TEAM) != minigame_self.team )
-                       //return _("You lost the game!\nSelect \"^1Next Match^7\" on the menu for a rematch!"); // TODO: proper "you win" banner instead of hijacking the help message
-                       return _("You lost the game!"); // TODO: proper "you win" banner instead of hijacking the help message
-               //return _("You win!\nSelect \"^1Next Match^7\" on the menu to start a new match!");
-               return _("You win!");
+                       strcat(_("You lost the game!"), "\n", _("Select \"^1Next Match^7\" on the menu for a rematch!"));
+               return strcat(_("You win!"), "\n", _("Select \"^1Next Match^7\" on the menu to start a new match!"));
        }
 
        if ( turnflags & TTT_TURN_NEXT )
@@ -522,7 +522,7 @@ void ttt_aimove(entity minigame)
                else
                        ttt_move(minigame,aiplayer,pos);
        }
-       minigame.message = ttt_turn_to_string(minigame.minigame_flags);
+       strcpy(minigame.message, ttt_turn_to_string(minigame.minigame_flags));
 }
 
 // Make the correct move
@@ -556,7 +556,12 @@ int ttt_client_event(entity minigame, string event, ...)
                case "activate":
                {
                        ttt_set_curr_pos("");
-                       minigame.message = ttt_turn_to_string(minigame.minigame_flags);
+                       strcpy(minigame.message, ttt_turn_to_string(minigame.minigame_flags));
+                       return false;
+               }
+               case "deactivate":
+               {
+                       strfree(minigame.message);
                        return false;
                }
                case "key_pressed":
@@ -631,7 +636,7 @@ int ttt_client_event(entity minigame, string event, ...)
                        {
                                if ( sf & MINIG_SF_UPDATE )
                                {
-                                       sent.message = ttt_turn_to_string(sent.minigame_flags);
+                                       strcpy(sent.message, ttt_turn_to_string(sent.minigame_flags));
                                        if ( sent.minigame_flags & minigame_self.team )
                                                minigame_prompt();
                                }
index 86e780e0a4657aa523489eb0b9ad82bc7bf9f698..efdd836d21e8af7bedd7de2ebffe8555031e173a 100644 (file)
@@ -36,7 +36,8 @@ CLASS(OffhandMageTeleport, OffhandWeapon)
         player.OffhandMageTeleport_key_pressed = key_pressed;
     }
 ENDCLASS(OffhandMageTeleport)
-OffhandMageTeleport OFFHAND_MAGE_TELEPORT; STATIC_INIT(OFFHAND_MAGE_TELEPORT) { OFFHAND_MAGE_TELEPORT = NEW(OffhandMageTeleport); }
+OffhandMageTeleport OFFHAND_MAGE_TELEPORT;
+STATIC_INIT(OFFHAND_MAGE_TELEPORT) { OFFHAND_MAGE_TELEPORT = NEW(OffhandMageTeleport); }
 
 float autocvar_g_monster_mage_health;
 float autocvar_g_monster_mage_damageforcescale = 0.5;
index fc571678b2c7f22ea1032f2f4a3d6e580cc83a02..63f3182ea6ba4746abb57d5491c5c97d29294adc 100644 (file)
@@ -18,7 +18,7 @@ int autocvar_g_instagib_extralives;
 float autocvar_g_instagib_speed_highspeed;
 
 IntrusiveList g_instagib_items;
-STATIC_INIT()
+STATIC_INIT(instagib)
 {
        g_instagib_items = IL_NEW();
        IL_PUSH(g_instagib_items, ITEM_VaporizerCells);
index 1379d586f10fd4da14b9f82d98571cd00bbe6c78..8d2bb318f0f2443f1200545a675f23b1d31d433c 100644 (file)
@@ -28,16 +28,12 @@ NET_HANDLE(itemstime, bool isNew)
 #endif
 
 #ifdef CSQC
-void Item_ItemsTime_Init()
-{
-    FOREACH(Items, true, {
-        ItemsTime_time[it.m_id] = -1;
-    });
-    ItemsTime_time[Items_MAX] = -1;
-}
 
 STATIC_INIT(ItemsTime_Init) {
-    Item_ItemsTime_Init();
+       FOREACH(Items, true, {
+               ItemsTime_time[it.m_id] = -1;
+       });
+       ItemsTime_time[Items_MAX] = -1;
 }
 
 int autocvar_hud_panel_itemstime = 2;
@@ -77,17 +73,11 @@ bool Item_ItemsTime_Allow(GameItem it)
 // reserve one more spot for superweapons time
 float it_times[Items_MAX + 1];
 
-void Item_ItemsTime_Init()
-{
-    FOREACH(Items, Item_ItemsTime_Allow(it), {
-        it_times[it.m_id] = -1;
-    });
-    it_times[Items_MAX] = -1;
-}
-
 STATIC_INIT(ItemsTime_Init) {
-    // items time
-    Item_ItemsTime_Init();
+       FOREACH(Items, Item_ItemsTime_Allow(it), {
+               it_times[it.m_id] = -1;
+       });
+       it_times[Items_MAX] = -1;
 }
 
 void Item_ItemsTime_ResetTimes()
index 484aaddcdadc86a8cc9a72fecdd47799f9650747..c6a853d0e11bf02ac8a7ee8c540870d88097d2e4 100644 (file)
@@ -891,15 +891,18 @@ void nade_damage(entity this, entity inflictor, entity attacker, float damage, i
                damage = this.max_health * 0.1;
        else if(DEATH_ISWEAPON(deathtype, WEP_SHOCKWAVE) || DEATH_ISWEAPON(deathtype, WEP_SHOTGUN)) // WEAPONTODO
        {
-               if(deathtype & HITTYPE_SECONDARY)
-               {
-                       damage = this.max_health * 0.1;
-                       force *= 10;
-               }
-               else
+               if(!(deathtype & HITTYPE_SECONDARY))
                        damage = this.max_health * 1.15;
        }
 
+       // melee slaps
+       entity death_weapon = DEATH_WEAPONOF(deathtype);
+       if(((deathtype & HITTYPE_SECONDARY) ? (death_weapon.spawnflags & WEP_TYPE_MELEE_SEC) : (death_weapon.spawnflags & WEP_TYPE_MELEE_PRI)))
+       {
+               damage = this.max_health * 0.1;
+               force *= 10;
+       }
+
        this.velocity += force;
        UpdateCSQCProjectile(this);
 
@@ -1247,7 +1250,8 @@ CLASS(NadeOffhand, OffhandWeapon)
                }
     }
 ENDCLASS(NadeOffhand)
-NadeOffhand OFFHAND_NADE; STATIC_INIT(OFFHAND_NADE) { OFFHAND_NADE = NEW(NadeOffhand); }
+NadeOffhand OFFHAND_NADE;
+STATIC_INIT(OFFHAND_NADE) { OFFHAND_NADE = NEW(NadeOffhand); }
 
 MUTATOR_HOOKFUNCTION(nades, ForbidThrowCurrentWeapon, CBC_ORDER_LAST)
 {
@@ -1444,7 +1448,8 @@ MUTATOR_HOOKFUNCTION(nades, PlayerDies, CBC_ORDER_LAST)
 
        if(IS_PLAYER(frag_attacker))
        {
-               float killcount_bonus = ((CS(frag_attacker).killcount >= 1) ? bound(0, autocvar_g_nades_bonus_score_minor * CS(frag_attacker).killcount, autocvar_g_nades_bonus_score_medium) : autocvar_g_nades_bonus_score_minor);
+               float killcount_bonus = ((CS(frag_attacker).killcount >= 1) ? bound(0, autocvar_g_nades_bonus_score_minor * CS(frag_attacker).killcount, autocvar_g_nades_bonus_score_medium) 
+                                                                                                                                       : autocvar_g_nades_bonus_score_minor);
 
                if (SAME_TEAM(frag_attacker, frag_target) || frag_attacker == frag_target)
                        nades_RemoveBonus(frag_attacker);
index 15a2fc2e0c972427c1270223e0f40ad178609b81..41ba2da62b0ada5c48b9d9c1baa1dcdcb7074d2a 100644 (file)
@@ -11,7 +11,7 @@ bool autocvar_g_overkill_itemwaypoints = true;
 .Weapon ok_lastwep[MAX_WEAPONSLOTS];
 
 IntrusiveList g_overkill_items;
-STATIC_INIT()
+STATIC_INIT(overkill)
 {
        g_overkill_items = IL_NEW();
        IL_PUSH(g_overkill_items, ITEM_HealthMega);
index b3eb1ea861397547734d91eaef173e8f1f9b59a1..af85fa1a332082b48d3d2d5c33345141ee274588 100644 (file)
@@ -26,6 +26,7 @@ const int CH_AMBIENT_SINGLE = 9;
 
 const float ATTEN_NONE = 0;
 const float ATTEN_MIN = 0.015625;
+const float ATTEN_LOW = 0.2;
 const float ATTEN_NORM = 0.5;
 const float ATTEN_LARGE = 1;
 const float ATTEN_IDLE = 2;
index a2623ca201b6c6444c534d937961b61e68b427f4..8c025cb19f22a382ac24b9ee6be51a1be383e79c 100644 (file)
@@ -198,6 +198,7 @@ const int WEP_FLAG_DUALWIELD      =  BIT(11); // weapon can be dual wielded
 const int WEP_FLAG_NODUAL         =  BIT(12); // weapon doesn't work well with dual wielding (fireball etc just explode on fire), doesn't currently prevent anything
 const int WEP_FLAG_PENETRATEWALLS =  BIT(13); // weapon has high calibur bullets that can penetrate thick walls (WEAPONTODO)
 const int WEP_FLAG_BLEED          =  BIT(14); // weapon pierces and causes bleeding (used for damage effects)
+const int WEP_FLAG_NOTRUEAIM      =  BIT(15); // weapon doesn't aim directly at targets
 
 // variables:
 string weaponorder_byid;
index c9825adf0b06d5f3ed4d936d1216680318f278a9..6297bdf37b5f78875414d9ee01f8df09fd5cce36 100644 (file)
@@ -50,7 +50,8 @@ SPAWNFUNC_WEAPON(weapon_laser, WEP_BLASTER)
 
 CLASS(OffhandBlaster, OffhandWeapon)
 ENDCLASS(OffhandBlaster)
-OffhandBlaster OFFHAND_BLASTER; STATIC_INIT(OFFHAND_BLASTER) { OFFHAND_BLASTER = NEW(OffhandBlaster); }
+OffhandBlaster OFFHAND_BLASTER;
+STATIC_INIT(OFFHAND_BLASTER) { OFFHAND_BLASTER = NEW(OffhandBlaster); }
 
 #ifdef SVQC
 .float blaster_damage;
index 1d15d448ec5b7442e6a6a30ead436665fad4af9e..bff975e005479ce5d12eaf5751ec11b6b06843f2 100644 (file)
@@ -4,7 +4,7 @@ CLASS(Hook, Weapon)
 /* spawnfunc */ ATTRIB(Hook, m_canonical_spawnfunc, string, "weapon_hook");
 /* ammotype  */ ATTRIB(Hook, ammo_type, int, RES_FUEL);
 /* impulse   */ ATTRIB(Hook, impulse, int, 0);
-/* flags     */ ATTRIB(Hook, spawnflags, int, WEP_FLAG_CANCLIMB | WEP_TYPE_SPLASH);
+/* flags     */ ATTRIB(Hook, spawnflags, int, WEP_FLAG_CANCLIMB | WEP_TYPE_SPLASH | WEP_FLAG_NOTRUEAIM);
 /* rating    */ ATTRIB(Hook, bot_pickupbasevalue, float, 0);
 /* color     */ ATTRIB(Hook, wpcolor, vector, '0 0.5 0');
 /* modelname */ ATTRIB(Hook, mdl, string, "hookgun");
@@ -62,7 +62,8 @@ CLASS(OffhandHook, OffhandWeapon)
     }
 #endif
 ENDCLASS(OffhandHook)
-OffhandHook OFFHAND_HOOK; STATIC_INIT(OFFHAND_HOOK) { OFFHAND_HOOK = NEW(OffhandHook); }
+OffhandHook OFFHAND_HOOK;
+STATIC_INIT(OFFHAND_HOOK) { OFFHAND_HOOK = NEW(OffhandHook); }
 
 #ifdef SVQC
 
index d83fe59dc6fd5ad6df18357689b051c617da4622..4593442379a023b0dc0c80b86e66bd2cf2c9538c 100644 (file)
@@ -4,7 +4,7 @@ CLASS(Mortar, Weapon)
 /* spawnfunc */ ATTRIB(Mortar, m_canonical_spawnfunc, string, "weapon_mortar");
 /* ammotype  */ ATTRIB(Mortar, ammo_type, int, RES_ROCKETS);
 /* impulse   */ ATTRIB(Mortar, impulse, int, 4);
-/* flags     */ ATTRIB(Mortar, spawnflags, int, WEP_FLAG_NORMAL | WEP_FLAG_RELOADABLE | WEP_FLAG_CANCLIMB | WEP_TYPE_SPLASH);
+/* flags     */ ATTRIB(Mortar, spawnflags, int, WEP_FLAG_NORMAL | WEP_FLAG_RELOADABLE | WEP_FLAG_CANCLIMB | WEP_TYPE_SPLASH | WEP_FLAG_NOTRUEAIM);
 /* rating    */ ATTRIB(Mortar, bot_pickupbasevalue, float, 7000);
 /* color     */ ATTRIB(Mortar, wpcolor, vector, '1 0 0');
 /* modelname */ ATTRIB(Mortar, mdl, string, "gl");
index 722171b9589555ffba0ce2a734153cf13245f7be..0e482d8ae82db239dbdd14160070da41befea332 100644 (file)
@@ -1,5 +1,84 @@
 #include "porto.qh"
 
+#ifdef CSQC
+STATIC_INIT(Porto)
+{
+       entity e = new_pure(porto);
+       e.draw = Porto_Draw;
+       IL_PUSH(g_drawables, e);
+       e.dphitcontentsmask = DPCONTENTS_SOLID | DPCONTENTS_BODY | DPCONTENTS_PLAYERCLIP;
+}
+
+const int polyline_length = 16;
+.vector polyline[polyline_length];
+void Porto_Draw(entity this)
+{
+       if (spectatee_status || intermission == 1 || intermission == 2 || STAT(HEALTH) <= 0 || WEP_CVAR(porto, secondary)) return;
+
+       for(int slot = 0; slot < MAX_WEAPONSLOTS; ++slot)
+       {
+               entity wepent = viewmodels[slot];
+
+               if (wepent.activeweapon != WEP_PORTO) continue;
+
+               vector pos = view_origin;
+               vector dir = view_forward;
+               makevectors(((autocvar_chase_active) ? warpzone_save_view_angles : view_angles));
+               pos += v_right * -wepent.movedir.y
+                       +  v_up * wepent.movedir.z;
+
+               if (wepent.angles_held_status)
+               {
+                       makevectors(wepent.angles_held);
+                       dir = v_forward;
+               }
+
+               wepent.polyline[0] = pos;
+
+               int portal_number = 0, portal1_idx = 1, portal_max = 2;
+               int n = 1 + 2;  // 2 lines == 3 points
+               for (int idx = 0; idx < n && idx < polyline_length - 1; )
+               {
+                       traceline(pos, pos + 65536 * dir, true, this);
+                       dir = reflect(dir, trace_plane_normal);
+                       pos = trace_endpos;
+                       wepent.polyline[++idx] = pos;
+                       if (trace_dphitq3surfaceflags & Q3SURFACEFLAG_SLICK || trace_dphitcontents & DPCONTENTS_PLAYERCLIP)
+                       {
+                               n += 1;
+                               continue;
+                       }
+                       if (trace_dphitq3surfaceflags & Q3SURFACEFLAG_NOIMPACT)
+                       {
+                               n = max(2, idx);
+                               break;
+                       }
+                       // check size
+                       {
+                               vector ang = vectoangles2(trace_plane_normal, dir);
+                               ang.x = -ang.x;
+                               makevectors(ang);
+                               if (!CheckWireframeBox(this, pos - 48 * v_right - 48 * v_up + 16 * v_forward, 96 * v_right, 96 * v_up, 96 * v_forward))
+                               {
+                                       n = max(2, idx);
+                                       break;
+                               }
+                       }
+                       portal_number += 1;
+                       if (portal_number >= portal_max) break;
+                       if (portal_number == 1) portal1_idx = idx;
+               }
+               for (int idx = 0; idx < n - 1; ++idx)
+               {
+                       vector p = wepent.polyline[idx], q = wepent.polyline[idx + 1];
+                       if (idx == 0) p -= view_up * 16;  // line from player
+                       vector rgb = (idx < portal1_idx) ? '1 0 0' : '0 0 1';
+                       Draw_CylindricLine(p, q, 4, "", 1, 0, rgb, 0.5, DRAWFLAG_NORMAL, view_origin);
+               }
+       }
+}
+#endif
+
 #ifdef SVQC
 #include <common/mapobjects/trigger/jumppads.qh>
 #include <server/weapons/throwing.qh>
index 735426feb698366006f2dad88c9a330b724e146a..29820ef06baba6f4cc88eefbee9db167cd5a6246 100644 (file)
@@ -4,7 +4,7 @@ CLASS(PortoLaunch, Weapon)
 /* spawnfunc */ ATTRIB(PortoLaunch, m_canonical_spawnfunc, string, "weapon_porto");
 /* ammotype  */ ATTRIB(PortoLaunch, ammo_type, int, RES_NONE);
 /* impulse   */ ATTRIB(PortoLaunch, impulse, int, 0);
-/* flags     */ ATTRIB(PortoLaunch, spawnflags, int, WEP_TYPE_OTHER | WEP_FLAG_SUPERWEAPON | WEP_FLAG_NODUAL);
+/* flags     */ ATTRIB(PortoLaunch, spawnflags, int, WEP_TYPE_OTHER | WEP_FLAG_SUPERWEAPON | WEP_FLAG_NODUAL | WEP_FLAG_NOTRUEAIM);
 /* rating    */ ATTRIB(PortoLaunch, bot_pickupbasevalue, float, 0);
 /* color     */ ATTRIB(PortoLaunch, wpcolor, vector, '0.5 0.5 0.5');
 /* modelname */ ATTRIB(PortoLaunch, mdl, string, "porto");
@@ -38,6 +38,10 @@ REGISTER_WEAPON(PORTO, porto, NEW(PortoLaunch));
 
 SPAWNFUNC_WEAPON(weapon_porto, WEP_PORTO)
 
+#ifdef CSQC
+void Porto_Draw(entity this);
+#endif
+
 #ifdef SVQC
 .entity porto_current;
 .vector porto_v_angle; // holds "held" view angles
index eb780808932fcd471d96d4727f6aa9cf6aae87a0..bf5fa0c98f271a2c012a49c7807c55c438fa4794 100644 (file)
@@ -268,7 +268,7 @@ void W_Tuba_NoteOn(entity actor, .entity weaponentity, float hittype)
        vector o;
        float n = W_Tuba_GetNote(actor, hittype);
 
-       hittype = 0;
+       hittype = HITTYPE_SOUND;
        if(actor.(weaponentity).tuba_instrument & 1)
                hittype |= HITTYPE_SECONDARY;
        if(actor.(weaponentity).tuba_instrument & 2)
index d932d98bd16f6d7554c32fb7f447ca9419be3c15..f0cb6d2493a471c6724dc31e3ad701f34206d4b6 100644 (file)
@@ -3,7 +3,7 @@
 CLASS(Tuba, Weapon)
 /* spawnfunc */ ATTRIB(Tuba, m_canonical_spawnfunc, string, "weapon_tuba");
 /* impulse   */ ATTRIB(Tuba, impulse, int, 1);
-/* flags     */ ATTRIB(Tuba, spawnflags, int, WEP_FLAG_HIDDEN | WEP_TYPE_SPLASH | WEP_FLAG_NODUAL);
+/* flags     */ ATTRIB(Tuba, spawnflags, int, WEP_FLAG_HIDDEN | WEP_TYPE_SPLASH | WEP_FLAG_NODUAL | WEP_FLAG_NOTRUEAIM);
 /* rating    */ ATTRIB(Tuba, bot_pickupbasevalue, float, 2000);
 /* color     */ ATTRIB(Tuba, wpcolor, vector, '0 1 0');
 /* modelname */ ATTRIB(Tuba, mdl, string, "tuba");
index 6b1797c664e9b38fa36f7eee6d6526d2eea4cd5c..9193c4ef1638af9dd797acfe8e666ae9f2d2c1df 100644 (file)
@@ -36,10 +36,10 @@ MACRO_END
     \
     PROP(false, porto_v_angle_held, WEPENT_SET_NORMAL, \
        { WriteByte(chan, this.porto_v_angle_held); if(this.porto_v_angle_held) { \
-                WriteAngle(chan, this.porto_v_angle.x); WriteAngle(chan, this.porto_v_angle.y); \
+                WriteAngle(chan, this.owner.porto_v_angle.x); WriteAngle(chan, this.owner.porto_v_angle.y); \
                } }, \
        { (viewmodels[this.m_wepent_slot]).angles_held_status = ReadByte(); if((viewmodels[this.m_wepent_slot]).angles_held_status) { \
-               (viewmodels[this.m_wepent_slot]).angles_held_x = ReadAngle(); (viewmodels[this.m_wepent_slot]).angles_held_y = ReadAngle(); (viewmodels[this.m_wepent_slot]).angles_held_z = 0; } \
+               (viewmodels[this.m_wepent_slot]).angles_held = vec2(ReadAngle(), ReadAngle()); } \
                else { (viewmodels[this.m_wepent_slot]).angles_held = '0 0 0'; } }) \
     \
     PROP(false, tuba_instrument, WEPENT_SET_NORMAL, \
index 4e8e09083f7749cb481655d64a0e01665f62b440..a48e83ac1a32593f7ccced9044b55de4308d7b79 100644 (file)
@@ -155,7 +155,7 @@ MACRO_END
 #define REGISTRY_HASH(id) Registry_hash_##id
 
 ERASEABLE
-ACCUMULATE void Registry_check(string r, string server) { }
+ACCUMULATE void Registry_check(string r, string sv) { }
 ERASEABLE
 ACCUMULATE void Registry_send_all() { }
 
@@ -170,9 +170,9 @@ void Registry_send(string id, string hash);
        STATIC_INIT(Registry_check_##id) \
        { \
                /* Note: SHA256 isn't always available, use MD4 instead */ \
-               string s = "", join = ":"; \
-               FOREACH(id, true, s = strcat(s, join, it.registered_id)); \
-               s = substring(s, strlen(join), -1); \
+               string s = ""; \
+               FOREACH(id, true, s = strcat(s, ":", it.registered_id)); \
+               s = substring(s, 1, -1); /* remove initial ":" */ \
                string h = REGISTRY_HASH(id) = strzone(digest_hex("MD4", s)); \
                LOG_DEBUGF(#id ": %s\n[%s]", h, s); \
        } \
index a763b97267b5a69dcec8883b66a4a8c71127bf70..fd5009edcace8f89097248255b59d4b51c6d48a7 100644 (file)
@@ -156,6 +156,7 @@ string autocvar_g_maplist_votable_screenshot_dir;
 bool autocvar_g_maplist_votable_suggestions;
 bool autocvar_g_maplist_votable_suggestions_override_mostrecent;
 float autocvar_g_maplist_votable_timeout;
+bool autocvar_g_maplist_ignore_sizes;
 int autocvar_g_maxplayers;
 float autocvar_g_maxplayers_spectator_blocktime;
 float autocvar_g_maxpushtime;
index 9de3779870e7c732a9193357cdaba18ecd6af1b8..d69a89400f53be33f8f2079627df8f8ff51f850e 100644 (file)
@@ -1743,7 +1743,6 @@ float botframe_autowaypoints_fix_from(entity p, float walkfromwp, entity wp, .en
 }
 
 // automatically create missing waypoints
-.entity botframe_autowaypoints_lastwp0, botframe_autowaypoints_lastwp1;
 void botframe_autowaypoints_fix(entity p, float walkfromwp, .entity fld)
 {
        float r = botframe_autowaypoints_fix_from(p, walkfromwp, p.(fld), fld);
@@ -1839,6 +1838,8 @@ LABEL(next)
        });
 }
 
+//.entity botframe_autowaypoints_lastwp0;
+.entity botframe_autowaypoints_lastwp1;
 void botframe_autowaypoints()
 {
        FOREACH_CLIENT(IS_PLAYER(it) && IS_REAL_CLIENT(it) && !IS_DEAD(it), {
index 639717a901920b53c96339daebbeae95465b7511..0498bce5295c4b94fa02e90de222e483d4cef334 100644 (file)
@@ -1034,7 +1034,6 @@ string getwelcomemessage(entity this)
 
        string versionmessage = GetClientVersionMessage(this);
        string s = strcat(versionmessage, "^8\n^8\nmatch type is ^1", gamemode_name, "^8\n");
-       s = strcat(s, "^8\nCurrent map: ^2", GetMapname(), "^8\n");
 
        if(modifications != "")
                s = strcat(s, "^8\nactive modifications: ^3", modifications, "^8\n");
index 9ef72ae832352149d3dce0b2dc11253774218bbf..07027875ee6c340f5c8e4106ec52f48b7c04e768 100644 (file)
@@ -1022,6 +1022,9 @@ bool MapHasRightSize(string map)
                LOG_TRACE(checkwp_msg, ": has waypoints");
        }
 
+       if(autocvar_g_maplist_ignore_sizes)
+               return true;
+
        // open map size restriction file
        string opensize_msg = strcat("opensize ", map);
        float fh = fopen(strcat("maps/", map, ".sizes"), FILE_READ);
index ebeb961270129f3ea53969bbc1830e5a2102113c..aa5146419a0be981ff96246e70112d3dc47f83fc 100644 (file)
@@ -746,14 +746,6 @@ void readplayerstartcvars()
                warmup_start_ammo_fuel = max(warmup_start_ammo_fuel, cvar("g_balance_fuel_rotstable"));
        }
 
-       WepSet precache_weapons = start_weapons;
-       if (g_warmup_allguns != 1)
-               precache_weapons |= warmup_start_weapons;
-       FOREACH(Weapons, it != WEP_Null, {
-               if(precache_weapons & (it.m_wepset))
-                       it.wr_init(it);
-       });
-
        start_ammo_shells = max(0, start_ammo_shells);
        start_ammo_nails = max(0, start_ammo_nails);
        start_ammo_rockets = max(0, start_ammo_rockets);
index b8d3c903c541cab860c1f596bf118037d534d017..c39f59e7213d3edad4bcbab165b01e7e091ccff5 100644 (file)
@@ -329,9 +329,8 @@ void PlayerDamage(entity this, entity inflictor, entity attacker, float damage,
                if (time < this.spawnshieldtime && autocvar_g_spawnshield_blockdamage < 1)
                        damage *= 1 - max(0, autocvar_g_spawnshield_blockdamage);
 
-               if(DEATH_ISWEAPON(deathtype, WEP_TUBA))
+               if(deathtype & HITTYPE_SOUND) // sound based attacks cause bleeding from the ears
                {
-                       // tuba causes blood to come out of the ears
                        vector ear1, ear2;
                        vector d;
                        float f;
index b3241838b039ef1523703f759856d86053e8c0b8..9a12a04866c2c251fdd333725f0a22c4af757fff 100644 (file)
 #include "../common/mutators/mutator/waypoints/waypointsprites.qh"
 
 IntrusiveList g_race_targets;
-STATIC_INIT(g_race_targets) { g_race_targets = IL_NEW(); }
+IntrusiveList g_racecheckpoints;
+STATIC_INIT(g_race)
+{
+       g_race_targets = IL_NEW();
+       g_racecheckpoints = IL_NEW();
+}
 
 void race_InitSpectator()
 {
index 4402e22568ce1f027c26f93e6cba1a0e339f278c..4dafbcf63710615df0b75b9ee07df04f4e9718d6 100644 (file)
@@ -31,9 +31,6 @@ float race_completing;
 .float race_respawn_checkpoint;
 .entity race_respawn_spotref; // try THIS spawn in case you respawn
 
-IntrusiveList g_racecheckpoints;
-STATIC_INIT(g_racecheckpoints) { g_racecheckpoints = IL_NEW(); }
-
 // definitions for functions used outside race.qc
 float race_PreviousCheckpoint(float f);
 float race_NextCheckpoint(float f);
index dfa1389721aa456db09d41381b607e5688bbc584..74420b3335b2f5513ff9ac045b626412ddb62d2d 100644 (file)
@@ -216,7 +216,7 @@ void FireRailgunBullet (entity this, .entity weaponentity, vector start, vector
        entity pseudoprojectile = NULL;
 
        vector dir = normalize(end - start);
-       float length = vlen(end - start);
+       //float max_length = vlen(end - start);
        vector force = dir * bforce;
 
        // go a little bit into the wall because we need to hit this wall later
@@ -277,22 +277,22 @@ void FireRailgunBullet (entity this, .entity weaponentity, vector start, vector
        //explosion = spawn();
 
        // Find all non-hit players the beam passed close by
+       float length = vlen(trace_endpos - start);
        if(deathtype == WEP_VAPORIZER.m_id || deathtype == WEP_VORTEX.m_id) // WEAPONTODO
        {
                FOREACH_CLIENT(IS_REAL_CLIENT(it) && it != this, {
-                       if(!it.railgunhit)
-                       if(!(IS_SPEC(it) && it.enemy == this))
+                       if (!it.railgunhit && !(IS_SPEC(it) && it.enemy == this))
                        {
-                               msg_entity = it;
                                // nearest point on the beam
-                               vector beampos = start + dir * bound(0, (msg_entity.origin - start) * dir, length);
+                               vector beampos = start + dir * bound(0, (it.origin - start) * dir, length);
 
-                               float f = bound(0, 1 - vlen(beampos - msg_entity.origin) / 512, 1);
+                               float f = bound(0, 1 - vlen(beampos - it.origin) / 512, 1);
                                if(f <= 0)
                                        continue;
 
                                if(!pseudoprojectile)
                                        pseudoprojectile = spawn(); // we need this so the sound uses the "entchannel4" volume
+                               msg_entity = it;
                                soundtoat(MSG_ONE, pseudoprojectile, beampos, CH_SHOTS, SND(NEXWHOOSH_RANDOM()), VOL_BASE * f, ATTEN_NONE);
                        }
                });
index 695d2ec0b10cecf70407a44b1d195aaee4b4c0d1..1908caab67bc3050d816f78fac8460bb29126e84 100644 (file)
@@ -212,6 +212,7 @@ set g_maplist_index 0       "this is used internally for saving position in maplist cy
 set g_maplist_selectrandom 0   "if 1, a random map will be chosen as next map - DEPRECATED in favor of g_maplist_shuffle"
 set g_maplist_shuffle 1        "new randomization method: like selectrandom, but avoid playing the same maps in short succession. This works by taking out the first element and inserting it into g_maplist with a bias to the end of the list"
 set g_maplist_check_waypoints 0        "when 1, maps are skipped if there currently are bots, but the map has no waypoints"
+set g_maplist_ignore_sizes 0 "when 1, all maps are shown in the map list regardless of player count"
 
 set g_items_mindist 4000 "starting distance for the fading of items"
 set g_items_maxdist 4500 "maximum distance at which an item can be viewed, after which it will be invisible"