X-Git-Url: https://git.xonotic.org/?a=blobdiff_plain;f=cl_main.c;h=46cd234efdb0a8f6e74db6f09c6ae7e4a3b44a61;hb=1627b53f0037ce6bf3d7fd9606e0629f2d2f1240;hp=2c0c4ffe6b320faa222912d683ae4e06c39e03c7;hpb=544356c7bb6288760533142b8ab402f4d8d966ef;p=xonotic%2Fdarkplaces.git diff --git a/cl_main.c b/cl_main.c index 2c0c4ffe..46cd234e 100644 --- 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);