diff --git a/engine/client/cl_input.c b/engine/client/cl_input.c index 7ee6585f5..3490dd28a 100644 --- a/engine/client/cl_input.c +++ b/engine/client/cl_input.c @@ -153,7 +153,6 @@ int in_impulse[MAX_SPLITS][IN_IMPULSECACHE]; int in_nextimpulse[MAX_SPLITS]; int in_impulsespending[MAX_SPLITS]; -float cursor_screen[2]; qboolean cursor_active; @@ -865,8 +864,9 @@ void CL_FinishMove (usercmd_t *cmd, int msecs, int pnum) cmd->impulse = 0; } -void CL_UpdatePrydonCursor(usercmd_t *from, float cursor_screen[2], vec3_t cursor_start, vec3_t cursor_impact, int *entnum) +void CL_UpdatePrydonCursor(usercmd_t *from, int pnum) { + unsigned int hit; vec3_t cursor_end; vec3_t temp; @@ -876,22 +876,22 @@ void CL_UpdatePrydonCursor(usercmd_t *from, float cursor_screen[2], vec3_t curso if (!cl_prydoncursor.ival) { //center the cursor - cursor_screen[0] = 0; - cursor_screen[1] = 0; + from->cursor_screen[0] = 0; + from->cursor_screen[1] = 0; } else { - cursor_screen[0] = mousecursor_x/(vid.width/2.0f) - 1; - cursor_screen[1] = mousecursor_y/(vid.height/2.0f) - 1; - if (cursor_screen[0] < -1) - cursor_screen[0] = -1; - if (cursor_screen[1] < -1) - cursor_screen[1] = -1; + from->cursor_screen[0] = mousecursor_x/(vid.width/2.0f) - 1; + from->cursor_screen[1] = mousecursor_y/(vid.height/2.0f) - 1; + if (from->cursor_screen[0] < -1) + from->cursor_screen[0] = -1; + if (from->cursor_screen[1] < -1) + from->cursor_screen[1] = -1; - if (cursor_screen[0] > 1) - cursor_screen[0] = 1; - if (cursor_screen[1] > 1) - cursor_screen[1] = 1; + if (from->cursor_screen[0] > 1) + from->cursor_screen[0] = 1; + if (from->cursor_screen[1] > 1) + from->cursor_screen[1] = 1; } /* @@ -917,20 +917,22 @@ void CL_UpdatePrydonCursor(usercmd_t *from, float cursor_screen[2], vec3_t curso } */ - VectorClear(cursor_start); - temp[0] = (cursor_screen[0]+1)/2; - temp[1] = (-cursor_screen[1]+1)/2; + VectorClear(from->cursor_start); + temp[0] = (from->cursor_screen[0]+1)/2; + temp[1] = (-from->cursor_screen[1]+1)/2; temp[2] = 1; - VectorCopy(r_origin, cursor_start); - Matrix4x4_CM_UnProject(temp, cursor_end, cl.playerview[0].viewangles, cursor_start, r_refdef.fov_x, r_refdef.fov_y); + VectorCopy(r_origin, from->cursor_start); + Matrix4x4_CM_UnProject(temp, cursor_end, cl.playerview[pnum].viewangles, from->cursor_start, r_refdef.fov_x, r_refdef.fov_y); CL_SetSolidEntities(); //don't bother with players, they don't exist in NQ... - TraceLineN(cursor_start, cursor_end, cursor_impact, cursor_impact_normal); - - *entnum = 0; + hit = TraceLineN(from->cursor_start, cursor_end, from->cursor_impact, cursor_impact_normal); + if (hit) + from->cursor_entitynumber = hit-1; + else + from->cursor_entitynumber = 0; // P_RunParticleEffect(cursor_impact, vec3_origin, 15, 16); } @@ -983,22 +985,17 @@ void CLNQ_SendMove (usercmd_t *cmd, int pnum, sizebuf_t *buf) if (cls.protocol_nq >= CPNQ_DP6 || (cls.fteprotocolextensions2 & PEXT2_PRYDONCURSOR)) { - vec3_t cursor_start, cursor_impact; - int cursor_entitynumber; - - CL_UpdatePrydonCursor(cmd, cursor_screen, cursor_start, cursor_impact, &cursor_entitynumber); - MSG_WriteLong (buf, cmd->buttons); MSG_WriteByte (buf, cmd->impulse); - MSG_WriteShort (buf, cursor_screen[0] * 32767.0f); - MSG_WriteShort (buf, cursor_screen[1] * 32767.0f); - MSG_WriteFloat (buf, cursor_start[0]); - MSG_WriteFloat (buf, cursor_start[1]); - MSG_WriteFloat (buf, cursor_start[2]); - MSG_WriteFloat (buf, cursor_impact[0]); - MSG_WriteFloat (buf, cursor_impact[1]); - MSG_WriteFloat (buf, cursor_impact[2]); - MSG_WriteEntity (buf, cursor_entitynumber); + MSG_WriteShort (buf, cmd->cursor_screen[0] * 32767.0f); + MSG_WriteShort (buf, cmd->cursor_screen[1] * 32767.0f); + MSG_WriteFloat (buf, cmd->cursor_start[0]); + MSG_WriteFloat (buf, cmd->cursor_start[1]); + MSG_WriteFloat (buf, cmd->cursor_start[2]); + MSG_WriteFloat (buf, cmd->cursor_impact[0]); + MSG_WriteFloat (buf, cmd->cursor_impact[1]); + MSG_WriteFloat (buf, cmd->cursor_impact[2]); + MSG_WriteEntity (buf, cmd->cursor_entitynumber); } else { @@ -1453,22 +1450,21 @@ qboolean CLQW_SendCmd (sizebuf_t *buf) memset(&independantphysics[plnum], 0, sizeof(independantphysics[plnum])); } - if ((cls.fteprotocolextensions2 & PEXT2_PRYDONCURSOR) && (*cl_prydoncursor.string && cl_prydoncursor.ival >= 0) && cls.state == ca_active) + cmd = &cl.outframes[curframe].cmd[0]; + if (cmd->cursor_screen[0] || cmd->cursor_screen[1] || cmd->cursor_entitynumber || + cmd->cursor_start[0] || cmd->cursor_start[1] || cmd->cursor_start[2] || + cmd->cursor_impact[0] || cmd->cursor_impact[1] || cmd->cursor_impact[2]) { - vec3_t cursor_start, cursor_impact; - int cursor_entitynumber = 0; - cmd = &cl.outframes[curframe].cmd[0]; - CL_UpdatePrydonCursor(cmd, cursor_screen, cursor_start, cursor_impact, &cursor_entitynumber); MSG_WriteByte (buf, clc_prydoncursor); - MSG_WriteShort(buf, cursor_screen[0] * 32767.0f); - MSG_WriteShort(buf, cursor_screen[1] * 32767.0f); - MSG_WriteFloat(buf, cursor_start[0]); - MSG_WriteFloat(buf, cursor_start[1]); - MSG_WriteFloat(buf, cursor_start[2]); - MSG_WriteFloat(buf, cursor_impact[0]); - MSG_WriteFloat(buf, cursor_impact[1]); - MSG_WriteFloat(buf, cursor_impact[2]); - MSG_WriteEntity(buf, cursor_entitynumber); + MSG_WriteShort(buf, cmd->cursor_screen[0] * 32767.0f); + MSG_WriteShort(buf, cmd->cursor_screen[1] * 32767.0f); + MSG_WriteFloat(buf, cmd->cursor_start[0]); + MSG_WriteFloat(buf, cmd->cursor_start[1]); + MSG_WriteFloat(buf, cmd->cursor_start[2]); + MSG_WriteFloat(buf, cmd->cursor_impact[0]); + MSG_WriteFloat(buf, cmd->cursor_impact[1]); + MSG_WriteFloat(buf, cmd->cursor_impact[2]); + MSG_WriteEntity(buf, cmd->cursor_entitynumber); } MSG_WriteByte (buf, clc_move); @@ -1782,6 +1778,19 @@ void CL_SendCmd (double frametime, qboolean mainloop) return; } cursor_active = false; + + cmd = &independantphysics[0]; + if (((cls.fteprotocolextensions2 & PEXT2_PRYDONCURSOR)||(cls.protocol == CP_NETQUAKE && cls.protocol_nq >= CPNQ_DP6)) && + (*cl_prydoncursor.string && cl_prydoncursor.ival >= 0) && cls.state == ca_active) + CL_UpdatePrydonCursor(cmd, 0); + else + { + Vector2Clear(cmd->cursor_screen); + VectorClear(cmd->cursor_start); + VectorClear(cmd->cursor_impact); + cmd->cursor_entitynumber = 0; + } + switch (cls.protocol) { #ifdef NQPROT diff --git a/engine/client/client.h b/engine/client/client.h index 3457d94c0..7605efc55 100644 --- a/engine/client/client.h +++ b/engine/client/client.h @@ -975,7 +975,7 @@ extern unsigned int cl_maxstris; extern char emodel_name[], pmodel_name[], prespawn_name[], modellist_name[], soundlist_name[]; -qboolean TraceLineN (vec3_t start, vec3_t end, vec3_t impact, vec3_t normal); +unsigned int TraceLineN (vec3_t start, vec3_t end, vec3_t impact, vec3_t normal); // // cl_input diff --git a/engine/client/p_script.c b/engine/client/p_script.c index ecbb5a43b..24673b799 100644 --- a/engine/client/p_script.c +++ b/engine/client/p_script.c @@ -5737,7 +5737,7 @@ static void PScript_DrawParticleTypes (void) void (*sparkfanparticles)(int count, particle_t **plist, plooks_t *type)=GL_DrawTrifanParticle; void (*sparktexturedparticles)(int count, particle_t **plist, plooks_t *type)=GL_DrawTexturedSparkParticle; - qboolean (*tr) (vec3_t start, vec3_t end, vec3_t impact, vec3_t normal); + unsigned int (*tr) (vec3_t start, vec3_t end, vec3_t impact, vec3_t normal); void *pdraw, *bdraw; void (*tdraw)(scenetris_t *t, particle_t *p, plooks_t *type); diff --git a/engine/client/pr_csqc.c b/engine/client/pr_csqc.c index 4347ed1db..32cfc3642 100644 --- a/engine/client/pr_csqc.c +++ b/engine/client/pr_csqc.c @@ -176,6 +176,10 @@ extern sfx_t *cl_sfx_r_exp3; globalfloat(input_weapon, "input_weapon"); /*unused float filled by getinputstate, read by runplayerphysics*/ \ globalfloat(input_servertime, "input_servertime"); /*float filled by getinputstate, read by runplayerphysics*/ \ globalfloat(input_clienttime, "input_clienttime"); /*float filled by getinputstate, read by runplayerphysics*/ \ + globalvector(input_cursor_screen, "input_cursor_screen"); /*float filled by getinputstate*/ \ + globalvector(input_cursor_start, "input_cursor_trace_start"); /*float filled by getinputstate*/ \ + globalvector(input_cursor_impact, "input_cursor_trace_endpos"); /*float filled by getinputstate*/ \ + globalfloat(input_cursor_entitynumber, "input_cursor_entitynumber"); /*float filled by getinputstate*/ \ typedef struct { @@ -2518,6 +2522,18 @@ static void cs_set_input_state (usercmd_t *cmd) *csqcg.input_servertime = cmd->servertime/1000.0f; if (csqcg.input_clienttime) *csqcg.input_clienttime = cmd->fclienttime/1000.0f; + + if (csqcg.input_cursor_screen) + { + Vector2Copy(cmd->cursor_screen, csqcg.input_cursor_screen); + csqcg.input_cursor_screen[2] = 0; + } + if (csqcg.input_cursor_start) + VectorCopy(cmd->cursor_start, csqcg.input_cursor_start); + if (csqcg.input_cursor_impact) + VectorCopy(cmd->cursor_impact, csqcg.input_cursor_impact); + if (csqcg.input_cursor_entitynumber) + *csqcg.input_cursor_entitynumber = cmd->cursor_entitynumber; } static void cs_get_input_state (usercmd_t *cmd) @@ -2547,6 +2563,15 @@ static void cs_get_input_state (usercmd_t *cmd) cmd->weapon = *csqcg.input_weapon; if (csqcg.input_servertime) cmd->servertime = *csqcg.input_servertime*1000; + + if (csqcg.input_cursor_screen) + Vector2Copy(csqcg.input_cursor_screen, cmd->cursor_screen); + if (csqcg.input_cursor_start) + VectorCopy(csqcg.input_cursor_start, cmd->cursor_start); + if (csqcg.input_cursor_impact) + VectorCopy(csqcg.input_cursor_impact, cmd->cursor_impact); + if (csqcg.input_cursor_entitynumber) + cmd->cursor_entitynumber = *csqcg.input_cursor_entitynumber; } //#343 diff --git a/engine/client/r_part.c b/engine/client/r_part.c index 913ecc897..e64e90020 100644 --- a/engine/client/r_part.c +++ b/engine/client/r_part.c @@ -197,14 +197,17 @@ void P_Shutdown(void) pe = NULL; } -qboolean TraceLineN (vec3_t start, vec3_t end, vec3_t impact, vec3_t normal) +//0 says hit nothing. +//1 says hit world +//>1 says hit some entity +unsigned int TraceLineN (vec3_t start, vec3_t end, vec3_t impact, vec3_t normal) { trace_t trace; float len, bestlen; int i; vec3_t delta, ts, te; physent_t *pe; - qboolean clipped=false; + int result=0; vec3_t axis[3]; memset (&trace, 0, sizeof(trace)); @@ -214,7 +217,7 @@ qboolean TraceLineN (vec3_t start, vec3_t end, vec3_t impact, vec3_t normal) VectorCopy (end, impact); - for (i=0 ; i< pmove.numphysent ; i++) + for (i=0 ; i < pmove.numphysent ; i++) { pe = &pmove.physents[i]; if (pe->nonsolid) @@ -243,7 +246,7 @@ qboolean TraceLineN (vec3_t start, vec3_t end, vec3_t impact, vec3_t normal) VectorAdd (pe->origin, trace.endpos, impact); } - clipped=true; + result = pe->info+1; } if (trace.startsolid) { @@ -261,14 +264,7 @@ qboolean TraceLineN (vec3_t start, vec3_t end, vec3_t impact, vec3_t normal) } } - if (clipped) - { - return true; - } - else - { - return false; - } + return result; } //handy utility... diff --git a/engine/common/mathlib.h b/engine/common/mathlib.h index 73d1478bd..27da9753b 100644 --- a/engine/common/mathlib.h +++ b/engine/common/mathlib.h @@ -87,6 +87,7 @@ extern vec3_t vec3_origin; #define VectorEquals(a,b) ((a)[0] == (b)[0] && (a)[1] == (b)[1] && (a)[2] == (b)[2]) #define VectorAvg(a,b,c) ((c)[0]=((a)[0]+(b)[0])*0.5f,(c)[1]=((a)[1]+(b)[1])*0.5f, (c)[2]=((a)[2]+(b)[2])*0.5f) #define VectorInterpolate(a, bness, b, c) FloatInterpolate((a)[0], bness, (b)[0], (c)[0]),FloatInterpolate((a)[1], bness, (b)[1], (c)[1]),FloatInterpolate((a)[2], bness, (b)[2], (c)[2]) +#define Vector2Clear(a) ((a)[0]=(a)[1]=0) #define Vector2Copy(a,b) do{(b)[0]=(a)[0];(b)[1]=(a)[1];}while(0) #define Vector2Set(r,x,y) do{(r)[0] = x; (r)[1] = y;}while(0) #define Vector2Interpolate(a, bness, b, c) FloatInterpolate((a)[0], bness, (b)[0], (c)[0]),FloatInterpolate((a)[1], bness, (b)[1], (c)[1]) diff --git a/engine/common/pr_bgcmd.c b/engine/common/pr_bgcmd.c index 8173fbccd..b15c8c7c6 100644 --- a/engine/common/pr_bgcmd.c +++ b/engine/common/pr_bgcmd.c @@ -55,8 +55,9 @@ static void PF_Warningf(pubprogfuncs_t *prinst, const char *fmt, ...) vsnprintf (string, sizeof(string)-1, fmt, argptr); va_end (argptr); + if (developer.ival) + PR_StackTrace(prinst, false); Con_Printf("%s", string); - PR_StackTrace(prinst, false); } char *PF_VarString (pubprogfuncs_t *prinst, int first, struct globalvars_s *pr_globals) diff --git a/engine/common/protocol.h b/engine/common/protocol.h index 717e0ab2d..61db0d2f7 100644 --- a/engine/common/protocol.h +++ b/engine/common/protocol.h @@ -1048,6 +1048,11 @@ typedef struct usercmd_s int servertime; float fservertime; float fclienttime; + + vec2_t cursor_screen; + vec3_t cursor_start; + vec3_t cursor_impact; + int cursor_entitynumber; } usercmd_t; typedef struct q2usercmd_s diff --git a/engine/server/pr_cmds.c b/engine/server/pr_cmds.c index 4c37d644c..522fb0753 100644 --- a/engine/server/pr_cmds.c +++ b/engine/server/pr_cmds.c @@ -10439,12 +10439,17 @@ void PR_DumpPlatform_f(void) {"noise3", ".string", QW|NQ}, {"end_sys_fields", "void", QW|NQ|CS|MENU}, - {"time", "float", MENU, "The current local time. Increases while paused."}, - {"input_timelength", "float", QW|NQ}, - {"input_angles", "vector", QW|NQ}, - {"input_movevalues", "vector", QW|NQ}, - {"input_buttons", "float", QW|NQ}, - {"input_impulse", "float", QW|NQ}, + {"time", "float", MENU, "The current local time. Increases while paused."}, + {"input_timelength", "float", QW|NQ}, + {"input_angles", "vector", QW|NQ}, + {"input_movevalues", "vector", QW|NQ}, + {"input_buttons", "float", QW|NQ}, + {"input_impulse", "float", QW|NQ}, + + {"input_cursor_screen", "vector", CS/*|QW|NQ*/}, + {"input_cursor_trace_start", "vector", CS/*|QW|NQ*/}, + {"input_cursor_trace_endpos", "vector", CS/*|QW|NQ*/}, + {"input_cursor_trace_entnum", "float", CS/*|QW|NQ*/}, #define comfieldfloat(name,desc) {#name, ".float", FL, desc}, #define comfieldvector(name,desc) {#name, ".vector", FL, desc}, diff --git a/engine/server/sv_user.c b/engine/server/sv_user.c index 85c4816ca..ed76d0d97 100644 --- a/engine/server/sv_user.c +++ b/engine/server/sv_user.c @@ -6458,7 +6458,7 @@ void SV_ReadPrydonCursor(void) entnum = MSGSV_ReadEntity(host_client); if (entnum >= sv.world.max_edicts) { - Con_DPrintf("SV_ReadPrydonCursor: client send bad cursor_entitynumber\n"); + Con_DPrintf("SV_ReadPrydonCursor: client sent bad cursor_entitynumber\n"); entnum = 0; } // as requested by FrikaC, cursor_trace_ent is reset to world if the