]> de.git.xonotic.org Git - xonotic/darkplaces.git/blobdiff - cl_main.c
Replaced all calls to str[n]cat and strncpy by calls to strlcat and strlcpy respectively
[xonotic/darkplaces.git] / cl_main.c
index 2c0c4ffe6b320faa222912d683ae4e06c39e03c7..46cd234efdb0a8f6e74db6f09c6ae7e4a3b44a61 100644 (file)
--- a/cl_main.c
+++ b/cl_main.c
@@ -25,6 +25,7 @@ Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA  02111-1307, USA.
 #include "image.h"
 #include "csprogs.h"
 #include "r_shadow.h"
+#include "libcurl.h"
 
 // we need to declare some mouse variables here, because the menu system
 // references them even when on a unix system.
@@ -49,8 +50,10 @@ cvar_t m_side = {CVAR_SAVE, "m_side","0.8","mouse side speed multiplier"};
 
 cvar_t freelook = {CVAR_SAVE, "freelook", "1","mouse controls pitch instead of forward/back"};
 
+#ifdef AUTODEMO_BROKEN
 cvar_t cl_autodemo = {0, "cl_autodemo", "0", "records every game played, using the date/time and map name to name the demo file" };
 cvar_t cl_autodemo_nameformat = {0, "cl_autodemo_nameformat", "%Y-%m-%d_%H-%M", "The format of the cl_autodemo filename, followed by the map name" };
+#endif
 
 cvar_t r_draweffects = {0, "r_draweffects", "1","renders temporary sprite effects"};
 
@@ -64,8 +67,9 @@ cvar_t cl_stainmaps = {CVAR_SAVE, "cl_stainmaps", "1","stains lightmaps, much fa
 cvar_t cl_stainmaps_clearonload = {CVAR_SAVE, "cl_stainmaps_clearonload", "1","clear stainmaps on map restart"};
 
 cvar_t cl_beams_polygons = {CVAR_SAVE, "cl_beams_polygons", "1","use beam polygons instead of models"};
-cvar_t cl_beams_relative = {CVAR_SAVE, "cl_beams_relative", "1","beams are relative to owner (smooth sweeps)"};
-cvar_t cl_beams_lightatend = {CVAR_SAVE, "cl_beams_lightatend", "0","make a light at the end of the beam"};
+cvar_t cl_beams_quakepositionhack = {CVAR_SAVE, "cl_beams_quakepositionhack", "1", "makes your lightning gun appear to fire from your waist (as in Quake and QuakeWorld)"};
+cvar_t cl_beams_instantaimhack = {CVAR_SAVE, "cl_beams_instantaimhack", "1", "makes your lightning gun aiming update instantly"};
+cvar_t cl_beams_lightatend = {CVAR_SAVE, "cl_beams_lightatend", "0", "make a light at the end of the beam"};
 
 cvar_t cl_noplayershadow = {CVAR_SAVE, "cl_noplayershadow", "0","hide player shadow"};
 
@@ -210,7 +214,7 @@ void CL_SetInfo(const char *key, const char *value, qboolean send, qboolean allo
                return;
        }
        InfoString_SetValue(cls.userinfo, sizeof(cls.userinfo), key, value);
-       if (cls.state == ca_connected)
+       if (cls.state == ca_connected && cls.netcon)
        {
                if (cls.protocol == PROTOCOL_QUAKEWORLD)
                {
@@ -394,6 +398,9 @@ void CL_EstablishConnection(const char *host)
        // stop demo loop in case this fails
        CL_Disconnect();
 
+       // if downloads are running, cancel their finishing action
+       Curl_Clear_forthismap();
+
        // make sure the client ports are open before attempting to connect
        NetConn_UpdateSockets();
 
@@ -912,7 +919,7 @@ void CL_LinkNetworkEntity(entity_t *e)
 
                // movement lerp
                // if it's the player entity, update according to client movement
-               if (e == cl.entities + cl.playerentity && cl.movement)// && !e->csqc)
+               if (e == cl.entities + cl.playerentity && cl.movement_predicted)// && !e->csqc)
                {
                        lerp = (cl.time - cl.movement_time[1]) / (cl.movement_time[0] - cl.movement_time[1]);
                        lerp = bound(0, lerp, 1);
@@ -1381,11 +1388,44 @@ static void CL_RelinkEffects(void)
        }
 }
 
+void CL_Beam_CalculatePositions(const beam_t *b, vec3_t start, vec3_t end)
+{
+       VectorCopy(b->start, start);
+       VectorCopy(b->end, end);
+
+       // if coming from the player, update the start position
+       if (b->entity == cl.viewentity)
+       {
+               if (cl_beams_quakepositionhack.integer && !chase_active.integer)
+               {
+                       // LordHavoc: this is a stupid hack from Quake that makes your
+                       // lightning appear to come from your waist and cover less of your
+                       // view
+                       // in Quake this hack was applied to all players (causing the
+                       // infamous crotch-lightning), but in darkplaces and QuakeWorld it
+                       // only applies to your own lightning, and only in first person
+                       Matrix4x4_OriginFromMatrix(&cl.entities[cl.viewentity].render.matrix, start);
+               }
+               if (cl_beams_instantaimhack.integer)
+               {
+                       vec3_t dir, localend;
+                       vec_t len;
+                       // LordHavoc: this updates the beam direction to match your
+                       // viewangles
+                       VectorSubtract(end, start, dir);
+                       len = VectorLength(dir);
+                       VectorNormalize(dir);
+                       VectorSet(localend, len, 0, 0);
+                       Matrix4x4_Transform(&r_view.matrix, localend, end);
+               }
+       }
+}
+
 void CL_RelinkBeams(void)
 {
        int i;
        beam_t *b;
-       vec3_t dist, org;
+       vec3_t dist, org, start, end;
        float d;
        entity_t *ent;
        float yaw, pitch;
@@ -1402,24 +1442,14 @@ void CL_RelinkBeams(void)
                        continue;
                }
 
-               // if coming from the player, update the start position
-               //if (b->entity == cl.viewentity)
-               //      Matrix4x4_OriginFromMatrix(&cl.entities[cl.viewentity].render.matrix, b->start);
-               if (cl_beams_relative.integer >= 1 && b->entity && (b->entity == cl.viewentity || cl_beams_relative.integer >= 2) && cl.entities[b->entity].state_current.active && b->relativestartvalid)
-               {
-                       entity_render_t *r = &cl.entities[b->entity].render;
-                       //Matrix4x4_OriginFromMatrix(&r->matrix, origin);
-                       //Matrix4x4_CreateFromQuakeEntity(&matrix, r->origin[0], r->origin[1], r->origin[2] + 16, r->angles[0], r->angles[1], r->angles[2], 1);
-                       Matrix4x4_Transform(&r->matrix, b->relativestart, b->start);
-                       Matrix4x4_Transform(&r->matrix, b->relativeend, b->end);
-               }
+               CL_Beam_CalculatePositions(b, start, end);
 
                if (b->lightning)
                {
                        if (cl_beams_lightatend.integer)
                        {
                                // FIXME: create a matrix from the beam start/end orientation
-                               Matrix4x4_CreateTranslate(&tempmatrix, b->end[0], b->end[1], b->end[2]);
+                               Matrix4x4_CreateTranslate(&tempmatrix, end[0], end[1], end[2]);
                                CL_AllocDlight (NULL, &tempmatrix, 200, 0.3, 0.7, 1, 0, 0, 0, -1, true, 1, 0.25, 1, 0, 0, LIGHTFLAG_NORMALMODE | LIGHTFLAG_REALTIMEMODE);
                        }
                        if (cl_beams_polygons.integer)
@@ -1427,8 +1457,8 @@ void CL_RelinkBeams(void)
                }
 
                // calculate pitch and yaw
-               VectorSubtract (b->end, b->start, dist);
-
+               // (this is similar to the QuakeC builtin function vectoangles)
+               VectorSubtract(end, start, dist);
                if (dist[1] == 0 && dist[0] == 0)
                {
                        yaw = 0;
@@ -1450,7 +1480,7 @@ void CL_RelinkBeams(void)
                }
 
                // add new entities for the lightning
-               VectorCopy (b->start, org);
+               VectorCopy (start, org);
                d = VectorNormalizeLength(dist);
                while (d > 0)
                {
@@ -1725,8 +1755,10 @@ void CL_Init (void)
        Cmd_AddCommand ("playdemo", CL_PlayDemo_f, "watch a demo file");
        Cmd_AddCommand ("timedemo", CL_TimeDemo_f, "play back a demo as fast as possible and save statistics to benchmark.log");
 
+#ifdef AUTODEMO_BROKEN
        Cvar_RegisterVariable (&cl_autodemo);
        Cvar_RegisterVariable (&cl_autodemo_nameformat);
+#endif
 
        Cmd_AddCommand ("fog", CL_Fog_f, "set global fog parameters (density red green blue)");
 
@@ -1742,7 +1774,8 @@ void CL_Init (void)
        Cvar_RegisterVariable(&cl_stainmaps);
        Cvar_RegisterVariable(&cl_stainmaps_clearonload);
        Cvar_RegisterVariable(&cl_beams_polygons);
-       Cvar_RegisterVariable(&cl_beams_relative);
+       Cvar_RegisterVariable(&cl_beams_quakepositionhack);
+       Cvar_RegisterVariable(&cl_beams_instantaimhack);
        Cvar_RegisterVariable(&cl_beams_lightatend);
        Cvar_RegisterVariable(&cl_noplayershadow);