diff --git a/engine/client/cl_cam.c b/engine/client/cl_cam.c index 431f94d31..97900d9b9 100644 --- a/engine/client/cl_cam.c +++ b/engine/client/cl_cam.c @@ -405,7 +405,7 @@ void Cam_Track(playerview_t *pv, usercmd_t *cmd) if (cl_hightrack.value && !pv->cam_locked) Cam_CheckHighTarget(pv); - if (!pv->cam_auto || cls.state != ca_active) + if (!pv->cam_auto || cls.state != ca_active || cl.worldmodel || cl.worldmodel->needload) return; if (pv->cam_locked && (!cl.players[pv->cam_spec_track].name[0] || cl.players[pv->cam_spec_track].spectator)) diff --git a/engine/client/cl_ents.c b/engine/client/cl_ents.c index df5e7715b..bc0937dc9 100644 --- a/engine/client/cl_ents.c +++ b/engine/client/cl_ents.c @@ -127,7 +127,7 @@ static void CL_ClearDlight(dlight_t *dl, int key) dl->color[0] = 1; dl->color[1] = 1; dl->color[2] = 1; - dl->corona = bound(0, r_flashblend.value * 0.25, 1); + dl->corona = bound(0, 1 * 0.25, 1); dl->coronascale = bound(0, r_flashblendscale.value, 1); #ifdef RTLIGHTS dl->lightcolourscales[0] = r_shadow_realtime_dlight_ambient.value; @@ -795,10 +795,13 @@ void CLFTE_ParseEntities(void) newp->servertime = MSG_ReadFloat(); - cl.oldgametime = cl.gametime; - cl.oldgametimemark = cl.gametimemark; - cl.gametime = newp->servertime; - cl.gametimemark = realtime; + if (cl.gametime != newp->servertime) + { + cl.oldgametime = cl.gametime; + cl.oldgametimemark = cl.gametimemark; + cl.gametime = newp->servertime; + cl.gametimemark = realtime; + } /*clear all entities*/ newp->num_entities = 0; @@ -2869,9 +2872,9 @@ static void CL_TransitionPacketEntities(int newsequence, packet_entities_t *newp snew = &newpack->entities[newpnum]; sold = NULL; - for ( ; oldpnumnum_entities ; oldpnum++) + for ( ; oldpnumnum_entities ; oldpnum) { - sold = &oldpack->entities[oldpnum]; + sold = &oldpack->entities[oldpnum++]; if (sold->number >= snew->number) { if (sold->number > snew->number) diff --git a/engine/client/cl_input.c b/engine/client/cl_input.c index 3d15b36ff..9d9445dbe 100644 --- a/engine/client/cl_input.c +++ b/engine/client/cl_input.c @@ -38,6 +38,7 @@ cvar_t cl_sparemsec = CVARC("cl_sparemsec", "10", CL_SpareMsec_Callback); cvar_t cl_queueimpulses = CVAR("cl_queueimpulses", "0"); cvar_t cl_smartjump = CVAR("cl_smartjump", "1"); cvar_t cl_run = CVARD("cl_run", "0", "Enables autorun, inverting the state of the +speed key."); +cvar_t cl_fastaccel = CVARD("cl_fastaccel", "1", "Begin moving at full speed instantly, instead of waiting a frame or so."); cvar_t cl_prydoncursor = CVAR("cl_prydoncursor", ""); //for dp protocol cvar_t cl_instantrotate = CVARF("cl_instantrotate", "1", CVAR_SEMICHEAT); @@ -408,10 +409,12 @@ Returns 0.25 if a key was pressed and released during the frame, 1.0 if held for the entire time =============== */ -float CL_KeyState (kbutton_t *key, int pnum) +float CL_KeyState (kbutton_t *key, int pnum, qboolean noslowstart) { float val; qboolean impulsedown, impulseup, down; + + noslowstart = noslowstart && cl_fastaccel.ival; impulsedown = key->state[pnum] & 2; impulseup = key->state[pnum] & 4; @@ -421,7 +424,7 @@ float CL_KeyState (kbutton_t *key, int pnum) if (impulsedown && !impulseup) { if (down) - val = 0.5; // pressed and held this frame + val = noslowstart?1.0:0.5; // pressed and held this frame else val = 0; // I_Error (); } @@ -531,8 +534,8 @@ void CL_AdjustAngles (int pnum, double frametime) quant = cl_yawspeed.ival; if (cl.fpd & FPD_LIMIT_YAW || !ruleset_allow_frj.ival) quant = bound(-900, quant, 900); - cl.playerview[pnum].viewanglechange[YAW] -= speed*quant * CL_KeyState (&in_right, pnum); - cl.playerview[pnum].viewanglechange[YAW] += speed*quant * CL_KeyState (&in_left, pnum); + cl.playerview[pnum].viewanglechange[YAW] -= speed*quant * CL_KeyState (&in_right, pnum, false); + cl.playerview[pnum].viewanglechange[YAW] += speed*quant * CL_KeyState (&in_left, pnum, false); } if (in_klook.state[pnum] & 1) { @@ -540,12 +543,12 @@ void CL_AdjustAngles (int pnum, double frametime) quant = cl_pitchspeed.ival; if (cl.fpd & FPD_LIMIT_PITCH || !ruleset_allow_frj.ival) quant = bound(-700, quant, 700); - cl.playerview[pnum].viewanglechange[PITCH] -= speed*quant * CL_KeyState (&in_forward, pnum); - cl.playerview[pnum].viewanglechange[PITCH] += speed*quant * CL_KeyState (&in_back, pnum); + cl.playerview[pnum].viewanglechange[PITCH] -= speed*quant * CL_KeyState (&in_forward, pnum, false); + cl.playerview[pnum].viewanglechange[PITCH] += speed*quant * CL_KeyState (&in_back, pnum, false); } - up = CL_KeyState (&in_lookup, pnum); - down = CL_KeyState(&in_lookdown, pnum); + up = CL_KeyState (&in_lookup, pnum, false); + down = CL_KeyState(&in_lookdown, pnum, false); quant = cl_pitchspeed.ival; if (!ruleset_allow_frj.ival) @@ -576,22 +579,22 @@ void CL_BaseMove (usercmd_t *cmd, int pnum, float extra, float wantfps) if (in_strafe.state[pnum] & 1) { - cmd->sidemove += scale*cl_sidespeed.value * CL_KeyState (&in_right, pnum); - cmd->sidemove -= scale*cl_sidespeed.value * CL_KeyState (&in_left, pnum); + cmd->sidemove += scale*cl_sidespeed.value * CL_KeyState (&in_right, pnum, true); + cmd->sidemove -= scale*cl_sidespeed.value * CL_KeyState (&in_left, pnum, true); } - cmd->sidemove += scale*cl_sidespeed.value * CL_KeyState (&in_moveright, pnum); - cmd->sidemove -= scale*cl_sidespeed.value * CL_KeyState (&in_moveleft, pnum); + cmd->sidemove += scale*cl_sidespeed.value * CL_KeyState (&in_moveright, pnum, true); + cmd->sidemove -= scale*cl_sidespeed.value * CL_KeyState (&in_moveleft, pnum, true); if(in_xflip.ival) cmd->sidemove *= -1; - cmd->upmove += scale*cl_upspeed.value * CL_KeyState (&in_up, pnum); - cmd->upmove -= scale*cl_upspeed.value * CL_KeyState (&in_down, pnum); + cmd->upmove += scale*cl_upspeed.value * CL_KeyState (&in_up, pnum, true); + cmd->upmove -= scale*cl_upspeed.value * CL_KeyState (&in_down, pnum, true); if (! (in_klook.state[pnum] & 1) ) { - cmd->forwardmove += scale*cl_forwardspeed.value * CL_KeyState (&in_forward, pnum); - cmd->forwardmove -= scale*(*cl_backspeed.string?cl_backspeed.value:cl_forwardspeed.value) * CL_KeyState (&in_back, pnum); + cmd->forwardmove += scale*cl_forwardspeed.value * CL_KeyState (&in_forward, pnum, true); + cmd->forwardmove -= scale*(*cl_backspeed.string?cl_backspeed.value:cl_forwardspeed.value) * CL_KeyState (&in_back, pnum, true); } } @@ -1910,6 +1913,7 @@ void CL_InitInput (void) Cmd_AddCommand("in_restart", IN_Restart); Cmd_AddCommand("sendcvar", CL_SendCvar_f); + Cvar_Register (&cl_fastaccel, inputnetworkcvargroup); Cvar_Register (&in_xflip, inputnetworkcvargroup); Cvar_Register (&cl_nodelta, inputnetworkcvargroup); diff --git a/engine/client/cl_main.c b/engine/client/cl_main.c index 98cd2968a..31107eece 100644 --- a/engine/client/cl_main.c +++ b/engine/client/cl_main.c @@ -786,6 +786,7 @@ void CL_CheckForResend (void) } else CL_ConnectToDarkPlaces("", &connectinfo.adr); + connectinfo.trying = false; } else CL_SendConnectPacket (NULL, 8192-16, pext1, pext2, false); @@ -4592,7 +4593,7 @@ void CL_StartCinematicOrMenu(void) #ifndef CLIENTONLY if (!sv.state) #endif - if (!cls.demoinfile && !cls.state && !Media_PlayingFullScreen()) + if (!cls.demoinfile && !cls.state && !*cls.servername && !Media_PlayingFullScreen()) { int ol_depth; int idcin_depth; @@ -4621,7 +4622,7 @@ void CL_StartCinematicOrMenu(void) } #endif - if (!cls.demoinfile && !*cls.servername && !Media_Playing()) + if (!cls.demoinfile && !cls.state && !*cls.servername && !Media_PlayingFullScreen()) { #ifndef CLIENTONLY if (!sv.state) @@ -4713,8 +4714,8 @@ void CL_ExecInitialConfigs(char *resetcommand) //if the renderer is already up and running, be prepared to reload content to match the new conback/font/etc if (qrenderer != QR_NONE) Cbuf_AddText ("vid_reload\n", RESTRICT_LOCAL); - if (Key_Dest_Has(kdm_menu)) - Cbuf_AddText ("closemenu\ntogglemenu\n", RESTRICT_LOCAL); //make sure the menu has the right content loaded. +// if (Key_Dest_Has(kdm_menu)) +// Cbuf_AddText ("closemenu\ntogglemenu\n", RESTRICT_LOCAL); //make sure the menu has the right content loaded. Cbuf_Execute (); //if the server initialisation causes a problem, give it a place to abort to diff --git a/engine/client/cl_parse.c b/engine/client/cl_parse.c index 67eca8949..d9897ee4a 100644 --- a/engine/client/cl_parse.c +++ b/engine/client/cl_parse.c @@ -4463,15 +4463,16 @@ void CL_MuzzleFlash (int destsplit) dl->radius = 200 + (rand()&31); dl->minlight = 32; - dl->die = cl.time + 0.5; + dl->die = cl.time + 0.1; dl->color[0] = 1.3; - dl->color[1] = 0.9; - dl->color[2] = 0.5; + dl->color[1] = 1.3; + dl->color[2] = 1.3; dl->channelfade[0] = 1.5; dl->channelfade[1] = 0.75; dl->channelfade[2] = 0.375; dl->decay = 500; + dl->lightcolourscales[2] = 4; } #ifdef Q2CLIENT diff --git a/engine/client/cl_pred.c b/engine/client/cl_pred.c index 728ec2007..2f731cd7d 100644 --- a/engine/client/cl_pred.c +++ b/engine/client/cl_pred.c @@ -431,7 +431,7 @@ void CL_PredictUsercmd (int pnum, int entnum, player_state_t *from, player_state //Used when cl_nopred is 1 to determine whether we are on ground, otherwise stepup smoothing code produces ugly jump physics -void CL_CatagorizePosition (playerview_t *pv) +void CL_CatagorizePosition (playerview_t *pv, float *org) { if (cl.spectator) { @@ -439,7 +439,7 @@ void CL_CatagorizePosition (playerview_t *pv) return; } VectorClear (pmove.velocity); - VectorCopy (pv->simorg, pmove.origin); + VectorCopy (org, pmove.origin); pmove.numtouch = 0; PM_CategorizePosition (); pv->onground = pmove.onground; @@ -497,7 +497,7 @@ void CL_CalcCrouch (playerview_t *pv) // in air or moving down pv->oldz = orgz; pv->crouch += host_frametime * 150; - if (orgz - pv->oldz <= 0) + if (orgz - pv->oldz < 0) pv->crouch -= orgz - pv->oldz; //if the view moved down, remove that amount from our crouching to avoid unneeded bobbing if (pv->crouch > 0) pv->crouch = 0; @@ -805,7 +805,7 @@ void CL_PredictMovePNum (int seat) usercmd_t *cmdto; double fromtime, totime; int oldphysent; - double simtime; + double simtime; //this is server time if nopred is set (lerp-only), and local time if we're predicting extern cvar_t cl_netfps; lerpents_t *le; qboolean nopred; @@ -999,6 +999,8 @@ void CL_PredictMovePNum (int seat) if (pe->entities[i].number == pv->viewentity) { CL_EntStateToPlayerState(fromstate, &pe->entities[i]); + if (nopred) + fromtime -= (pe->entities[i].u.q1.msec / 1000.0f); //correct the time to match stale players break; } } @@ -1008,14 +1010,13 @@ void CL_PredictMovePNum (int seat) if (pe->entities[i].number == pv->viewentity) { CL_EntStateToPlayerState(tostate, &pe->entities[i]); - + if (nopred) + totime -= (pe->entities[i].u.q1.msec / 1000.0f); //correct the time to match stale players. FIXME: this can push the simtime into the 'future' resulting in stuttering if (cls.fteprotocolextensions2 & PEXT2_REPLACEMENTDELTAS) { - cl.players[pv->playernum].stats[STAT_WEAPONFRAME] = pe->entities[i].u.q1.weaponframe; - cl.players[pv->playernum].statsf[STAT_WEAPONFRAME] = pe->entities[i].u.q1.weaponframe; - - pv->stats[STAT_WEAPONFRAME] = pe->entities[i].u.q1.weaponframe; - pv->statsf[STAT_WEAPONFRAME] = pe->entities[i].u.q1.weaponframe; + //putting weapon frames in there was probably a stupid idea. + pv->stats[STAT_WEAPONFRAME] = cl.players[pv->playernum].stats[STAT_WEAPONFRAME] = pe->entities[i].u.q1.weaponframe; + pv->statsf[STAT_WEAPONFRAME] = cl.players[pv->playernum].statsf[STAT_WEAPONFRAME] = pe->entities[i].u.q1.weaponframe; pv->pmovetype = tostate->pm_type; } break; @@ -1150,9 +1151,8 @@ void CL_PredictMovePNum (int seat) } } } - CL_CatagorizePosition(pv); - } + CL_CatagorizePosition(pv, tostate->origin); if (le) { diff --git a/engine/client/client.h b/engine/client/client.h index bd814a585..e3951c210 100644 --- a/engine/client/client.h +++ b/engine/client/client.h @@ -951,7 +951,7 @@ void CL_WriteToServer (usercmd_t *cmd); void CL_BaseMove (usercmd_t *cmd, int pnum, float extra, float wantfps); -float CL_KeyState (kbutton_t *key, int pnum); +float CL_KeyState (kbutton_t *key, int pnum, qboolean noslowstart); char *Key_KeynumToString (int keynum); int Key_StringToKeynum (const char *str, int *modifier); char *Key_GetBinding(int keynum); @@ -1370,7 +1370,6 @@ qboolean Media_PlayingFullScreen(void); void Media_Init(void); qboolean Media_PlayFilm(char *name, qboolean enqueue); qboolean Media_StopFilm(qboolean all); -qboolean Media_Playing(void); struct cin_s *Media_StartCin(char *name); texid_tf Media_UpdateForShader(cin_t *cin); void Media_ShutdownCin(cin_t *cin); diff --git a/engine/client/m_mp3.c b/engine/client/m_mp3.c index cb853ecda..57b30bfd3 100644 --- a/engine/client/m_mp3.c +++ b/engine/client/m_mp3.c @@ -2451,13 +2451,6 @@ cin_t *Media_StartCin(char *name) return cin; } -qboolean Media_Playing(void) -{ - if (videoshader) - return true; - return false; -} - struct pendingfilms_s { struct pendingfilms_s *next; diff --git a/engine/client/m_options.c b/engine/client/m_options.c index bc3c8f467..a36af4161 100644 --- a/engine/client/m_options.c +++ b/engine/client/m_options.c @@ -2760,30 +2760,31 @@ static qboolean Mods_AddMod(void *usr, ftemanifest_t *man) void M_Menu_Mods_f (void) { - modmenu_t *mods; + modmenu_t mods; menucustom_t *c; menu_t *menu; - - Key_Dest_Add(kdm_menu); - menu = M_CreateMenu(sizeof(modmenu_t)); - mods = menu->data; - MC_AddPicture(menu, 16, 4, 32, 144, "gfx/qplaque.lmp"); - MC_AddCenterPicture(menu, 0, 24, "gfx/p_option.lmp"); + memset(&mods, 0, sizeof(mods)); + FS_EnumerateKnownGames(Mods_AddMod, &mods); - c = MC_AddCustom(menu, 64, 32, mods, 0); - menu->cursoritem = (menuoption_t*)c; - c->draw = Mods_Draw; - c->key = Mods_Key; - menu->remove = Mods_Remove; - - FS_EnumerateKnownGames(Mods_AddMod, menu->data); - - if (mods->nummanifests == 1) + if (mods.nummanifests == 1) { - ftemanifest_t *man = mods->manifests[0]; - mods->manifests[0] = NULL; - M_RemoveMenu(menu); - FS_ChangeGame(man, true); + FS_ChangeGame(mods.manifests[0], true); + Z_Free(mods.manifests); + } + else + { + Key_Dest_Add(kdm_menu); + + menu = M_CreateMenu(sizeof(modmenu_t)); + *(modmenu_t*)menu->data = mods; + MC_AddPicture(menu, 16, 4, 32, 144, "gfx/qplaque.lmp"); + MC_AddCenterPicture(menu, 0, 24, "gfx/p_option.lmp"); + + c = MC_AddCustom(menu, 64, 32, menu->data, 0); + menu->cursoritem = (menuoption_t*)c; + c->draw = Mods_Draw; + c->key = Mods_Key; + menu->remove = Mods_Remove; } } \ No newline at end of file diff --git a/engine/client/p_script.c b/engine/client/p_script.c index e85e4a19f..c7d96a783 100644 --- a/engine/client/p_script.c +++ b/engine/client/p_script.c @@ -263,6 +263,8 @@ typedef struct part_type_s { float dl_radius; float dl_time; vec4_t dl_decay; + float dl_corona_intensity; + float dl_corona_scale; //PT_NODLSHADOW int dl_cubemapnum; vec3_t stain_rgb; @@ -825,8 +827,10 @@ static void P_ResetToDefaults(part_type_t *ptype) ptype->rotationstartmin = -M_PI; //start with a random angle ptype->rotationstartrand = M_PI-ptype->rotationstartmin; ptype->spawnchance = 1; - ptype->dl_time = 5000; + ptype->dl_time = 0; VectorSet(ptype->dl_rgb, 1, 1, 1); + ptype->dl_corona_intensity = 1; + ptype->dl_corona_scale = 0.5; ptype->randsmax = 1; ptype->s2 = 1; @@ -1208,7 +1212,7 @@ static void P_ParticleEffect_f(void) else if (!strcmp(var, "blue")) ptype->rgb[2] = atof(value)/255; else if (!strcmp(var, "rgb")) - { + { //byte version ptype->rgb[0] = ptype->rgb[1] = ptype->rgb[2] = atof(value)/255; if (Cmd_Argc()>3) { @@ -1216,6 +1220,15 @@ static void P_ParticleEffect_f(void) ptype->rgb[2] = atof(Cmd_Argv(3))/255; } } + else if (!strcmp(var, "rgbf")) + { //float version + ptype->rgb[0] = ptype->rgb[1] = ptype->rgb[2] = atof(value); + if (Cmd_Argc()>3) + { + ptype->rgb[1] = atof(Cmd_Argv(2)); + ptype->rgb[2] = atof(Cmd_Argv(3)); + } + } else if (!strcmp(var, "reddelta")) { @@ -1236,7 +1249,7 @@ static void P_ParticleEffect_f(void) ptype->rgbchangetime = ptype->die; } else if (!strcmp(var, "rgbdelta")) - { + { //byte version ptype->rgbchange[0] = ptype->rgbchange[1] = ptype->rgbchange[2] = atof(value)/255; if (Cmd_Argc()>3) { @@ -1246,6 +1259,17 @@ static void P_ParticleEffect_f(void) if (!ptype->rgbchangetime) ptype->rgbchangetime = ptype->die; } + else if (!strcmp(var, "rgbdeltaf")) + { //float version + ptype->rgbchange[0] = ptype->rgbchange[1] = ptype->rgbchange[2] = atof(value); + if (Cmd_Argc()>3) + { + ptype->rgbchange[1] = atof(Cmd_Argv(2)); + ptype->rgbchange[2] = atof(Cmd_Argv(3)); + } + if (!ptype->rgbchangetime) + ptype->rgbchangetime = ptype->die; + } else if (!strcmp(var, "rgbdeltatime")) ptype->rgbchangetime = atof(value); @@ -1256,7 +1280,7 @@ static void P_ParticleEffect_f(void) else if (!strcmp(var, "bluerand")) ptype->rgbrand[2] = atof(value)/255; else if (!strcmp(var, "rgbrand")) - { + { //byte version ptype->rgbrand[0] = ptype->rgbrand[1] = ptype->rgbrand[2] = atof(value)/255; if (Cmd_Argc()>3) { @@ -1264,6 +1288,15 @@ static void P_ParticleEffect_f(void) ptype->rgbrand[2] = atof(Cmd_Argv(3))/255; } } + else if (!strcmp(var, "rgbrandf")) + { //float version + ptype->rgbrand[0] = ptype->rgbrand[1] = ptype->rgbrand[2] = atof(value); + if (Cmd_Argc()>3) + { + ptype->rgbrand[1] = atof(Cmd_Argv(2)); + ptype->rgbrand[2] = atof(Cmd_Argv(3)); + } + } else if (!strcmp(var, "rgbrandsync")) { @@ -1569,8 +1602,15 @@ static void P_ParticleEffect_f(void) ptype->dl_decay[1] = atof(Cmd_Argv(2)); ptype->dl_decay[2] = atof(Cmd_Argv(3)); } + else if (!strcmp(var, "lightcorona")) + { + ptype->dl_corona_intensity = atof(value); + ptype->dl_corona_scale = atof(Cmd_Argv(2)); + } else if (!strcmp(var, "lighttime")) ptype->dl_time = atof(value); + else if (!strcmp(var, "lightshadows")) + ptype->flags = (ptype->flags & ~PT_NODLSHADOW) | (atof(value)?0:PT_NODLSHADOW); else if (!strcmp(var, "lightcubemap")) ptype->dl_cubemapnum = atoi(value); else if (!strcmp(var, "spawnstain")) @@ -1738,6 +1778,7 @@ qboolean PScript_Query(int typenum, int body, char *outstr, int outstrlen) Q_strncatz(outstr, va("lighttime %g\n", ptype->dl_time), outstrlen); Q_strncatz(outstr, va("lightshadows %g\n", (ptype->flags & PT_NODLSHADOW)?0.0f:1.0f), outstrlen); Q_strncatz(outstr, va("lightcubemap %i\n", ptype->dl_cubemapnum), outstrlen); + Q_strncatz(outstr, va("lightcorona %g %g\n", ptype->dl_corona_intensity, ptype->dl_corona_scale), outstrlen); } if (ptype->stain_radius) Q_strncatz(outstr, va("spawnstain %g %g %g %g\n", ptype->stain_radius, ptype->stain_rgb[0], ptype->stain_rgb[1], ptype->stain_rgb[2]), outstrlen); @@ -2252,6 +2293,11 @@ static void P_ImportEffectInfo_f(void) ptype->flags = (ptype->flags & ~PT_NODLSHADOW) | (!atoi(arg[1])?PT_NODLSHADOW:0); else if (!strcmp(arg[0], "lightcubemapnum") && args == 2) ptype->dl_cubemapnum = atoi(arg[1]); + else if (!strcmp(arg[0], "lightcorona") && args == 3) + { + ptype->dl_corona_intensity = atof(arg[1]); + ptype->dl_corona_scale = atof(arg[2]); + } #if 1 else if (!strcmp(arg[0], "staincolor") && args == 3) Con_DPrintf("Particle effect %s not supported\n", arg[0]); @@ -3201,10 +3247,12 @@ static void PScript_EffectSpawned(part_type_t *ptype, vec3_t org, vec3_t dir, in if (ptype->dl_radius) { dlight_t *dl = CL_NewDlight(dlkey, org, ptype->dl_radius, ptype->dl_time, ptype->dl_rgb[0], ptype->dl_rgb[1], ptype->dl_rgb[2]); - dl->channelfade[0] = ptype->dl_decay[0]; - dl->channelfade[1] = ptype->dl_decay[1]; - dl->channelfade[2] = ptype->dl_decay[2]; - dl->decay = ptype->dl_decay[3]; + dl->channelfade[0] = ptype->dl_decay[0]; + dl->channelfade[1] = ptype->dl_decay[1]; + dl->channelfade[2] = ptype->dl_decay[2]; + dl->decay = ptype->dl_decay[3]; + dl->corona = ptype->dl_corona_intensity; + dl->coronascale = ptype->dl_corona_scale; if (ptype->flags & PT_NODLSHADOW) dl->flags |= LFLAG_NOSHADOWS; if (ptype->dl_cubemapnum) diff --git a/engine/client/pr_skelobj.c b/engine/client/pr_skelobj.c index ec13fcd2b..4291e0a8b 100644 --- a/engine/client/pr_skelobj.c +++ b/engine/client/pr_skelobj.c @@ -1437,7 +1437,7 @@ void rag_updatedeltaent(entity_t *ent, lerpents_t *le) skorel.numbones = sko->numbones; //FIXME: provide some way for the animation to auto-trigger ragdoll (so framegroups can work automagically) - if ((ent->framestate.g[FS_REG].frame[0] & 32767) || (ent->framestate.g[FS_REG].frame[1] & 32767)) + if ((ent->framestate.g[FS_REG].frame[0] & 0x8000) || (ent->framestate.g[FS_REG].frame[1] & 0x8000)) sko->numanimated = 0; else if (sko->doll) sko->numanimated = sko->doll->numdefaultanimated; @@ -1445,6 +1445,8 @@ void rag_updatedeltaent(entity_t *ent, lerpents_t *le) skorel.model = sko->model; if (sko->numanimated || sko->doll != mod->dollinfo) { +// sko->type = SKEL_ABSOLUTE; +// Alias_ForceConvertBoneData(skorel.type, skorel.bonematrix, skorel.numbones, bones, sko->type, sko->bonematrix, sko->numbones); skel_copy_toabs(sko, &skorel, 0, sko->numbones); } diff --git a/engine/client/r_partset.c b/engine/client/r_partset.c index 005536a1d..c7f33df8e 100644 --- a/engine/client/r_partset.c +++ b/engine/client/r_partset.c @@ -1645,11 +1645,14 @@ char *particle_set_high = "blend add\n" "spawnmode spiral\n" "spawnvel -50\n" +"lighttime 0\n" +"lightshadows 0\n" +"lightradius 150\n" +"lightrgb 0.75 0.37 0.18\n" "}\n" ///////////////////////////////////////// //vore missiles - "r_part tr_vorespike\n" "{\n" "texture \"particles/fteparticlefont.tga\"\n" @@ -1666,18 +1669,90 @@ char *particle_set_high = "friction 0\n" "scalefactor 1\n" "blend add\n" - +"lighttime 0\n" +"lightshadows 0\n" "lightradius 150\n" "lightrgb 0.75 0.37 0.75\n" "}\n" //rygel's pack sucks "r_trail \"progs/v_spike.mdl\" tr_vorespike\n" +//enforcer laser effect +"r_part tr_enforcerlaser\n" +"{\n" +"type texturedspark\n" +"texture \"particles/fteparticlefont.tga\"\n" +"tcoords 1 97 95 191 256\n" +"scale 15\n" +"step 4\n" +"alpha 0.3\n" +"die 0.5\n" +"rgb 255 69 0\n" +"veladd -32\n" +"spawnmode spiral\n" +"spawnvel 16\n" +"randomvel 32\n" +"friction 0\n" +"scalefactor 1\n" +"blend add\n" +"lighttime 0.2\n" +"lightshadows 0\n" +"lightradius 150\n" +"lightrgb 1 0.27 0\n" +"lightrgbfade 5 1 0\n" +"lightcorona 2 0.25\n" +"}\n" +"r_trail \"progs/laser.mdl\" tr_enforcerlaser\n" + ///////////////////////////////////////// //scrag missiles. just use the default trail cos we're lazy -//r_part tr_wizspike -//{ -//} +"r_part tr_wizspike\n" +"{\n" +"texture \"particles/fteparticlefont.tga\"\n" +"tcoords 1 97 95 191 256\n" +"scale 15\n" +"step 1\n" +"alpha 0.6\n" +"die 0.2\n" +"rgb 25 200 25\n" +"veladd 0\n" +"randomvel 2\n" +"friction 4\n" +"scalefactor 0.825\n" +"spawnmode spiral\n" +"spawnvel 25\n" +"blend add\n" +"lighttime 0\n" +"lightshadows 0\n" +"lightradius 150\n" +"lightrgb 0.1 0.7 0.1\n" +"}\n" + +"r_part shambercharging\n" +"{\n" +"spawnmode ball\n" +"count 200\n" +"spawnorg 128\n" +"spawnvel -256\n" +"texture \"particles/fteparticlefont.tga\"\n" +"tcoords 1 1 63 63 256 2 64\n" +"scale 4\n" +"alpha 1\n" +"die 0.5\n" +"orgadd -64\n" +"rotationspeed 90\n" +"rotationstart 0 360\n" +"rgb 100 100 250\n" +"rgbrand 0 0 0\n" +"gravity 0\n" +"scalefactor 0.4\n" +"lighttime 0\n" +"lightshadows 0\n" +"lightradius 400\n" +"lightrgb 2 2 2\n" +"}\n" +"r_effect progs/s_light.mdl shambercharging 0\n" + "r_part te_blood\n" "{\n" @@ -1691,19 +1766,13 @@ char *particle_set_high = "veladd 10\n" "rotationspeed 90\n" "rotationstart 0 360\n" -"rgb 64 128 128\n" -"rgbdelta -64 -128 -128\n" +"rgb 32 64 64\n" +"rgbdelta -32 -64 -64\n" "gravity 200\n" "scalefactor 0.8\n" -// scaledelta -10 "}\n" -"r_part pe_73\n" -"{\n" -"assoc te_blood\n" -"}\n" - -"r_part te_lightningblood\n" +"r_part high.pe_73\n" "{\n" "texture fte_bloodparticle\n" "blend subtract\n" @@ -1715,8 +1784,43 @@ char *particle_set_high = "veladd 10\n" "rotationspeed 90\n" "rotationstart 0 360\n" -"rgb 0 128 128\n" -"rgbdelta 0 -128 -128\n" +"rgb 32 64 64\n" +"rgbdelta -32 -64 -64\n" +"gravity 200\n" +"scalefactor 0.8\n" +"}\n" + +"r_part te_lightningblood\n" +"{\n" +"texture fte_bloodparticle\n" +"blend subtract\n" +"count 1\n" +"scale 32\n" +"alpha 0\n" +"die 1\n" +"randomvel 32\n" +"veladd 5\n" +"rotationspeed 90\n" +"rotationstart 0 360\n" +"rgb 64 128 128\n" +"rgbdelta -64 -128 -128\n" +"gravity 200\n" +"scalefactor 0.8\n" +"}\n" +"r_part high.pe_225\n" +"{\n" +"texture fte_bloodparticle\n" +"blend subtract\n" +"count 0.5\n" +"scale 32\n" +"alpha 0\n" +"die 1\n" +"randomvel 32\n" +"veladd 5\n" +"rotationspeed 90\n" +"rotationstart 0 360\n" +"rgb 64 128 128\n" +"rgbdelta -64 -128 -128\n" "gravity 200\n" "scalefactor 0.8\n" "}\n" diff --git a/engine/client/r_surf.c b/engine/client/r_surf.c index 992d99d38..8a5bf04c9 100644 --- a/engine/client/r_surf.c +++ b/engine/client/r_surf.c @@ -2732,6 +2732,12 @@ void Surf_BuildModelLightmaps (model_t *m) int j; lightmapinfo_t *lm, *dlm; qbyte *deluxemap; + + if (*m->name == '*') + { + if (!cl.worldmodel || cl.worldmodel->needload) + return; + } //fixup surface lightmaps, and paint for (i=0; inummodelsurfaces; i++) { diff --git a/engine/client/renderer.c b/engine/client/renderer.c index 862e1abaf..e910664ad 100644 --- a/engine/client/renderer.c +++ b/engine/client/renderer.c @@ -164,8 +164,8 @@ cvar_t scr_conalpha = CVARC ("scr_conalpha", "0.7", cvar_t scr_consize = CVAR ("scr_consize", "0.5"); cvar_t scr_conspeed = CVAR ("scr_conspeed", "2000"); // 10 - 170 -cvar_t scr_fov = CVARFC("fov", "90", - CVAR_ARCHIVE, +cvar_t scr_fov = CVARFDC("fov", "108", + CVAR_ARCHIVE, "field of vision, 1-170 degrees, standard fov is 90, nquake.", SCR_Fov_Callback); cvar_t scr_printspeed = SCVAR ("scr_printspeed", "8"); cvar_t scr_showpause = SCVAR ("showpause", "1"); diff --git a/engine/common/com_mesh.c b/engine/common/com_mesh.c index d6fe699dd..4d6daafb7 100644 --- a/engine/common/com_mesh.c +++ b/engine/common/com_mesh.c @@ -857,6 +857,7 @@ struct const float *usebonepose; int bonecount; #endif + qboolean usebones; vecV_t *acoords1; vecV_t *acoords2; @@ -1279,7 +1280,7 @@ int Alias_BlendBoneData(galiasinfo_t *inf, framestate_t *fstate, float *result, { skellerps_t lerps[FS_COUNT], *lerp; size_t bone, endbone = 0; - size_t numgroups = Alias_FindRawSkelData(inf, fstate, lerps, 0, inf->numbones); + size_t numgroups = Alias_FindRawSkelData(inf, fstate, lerps, firstbone, lastbone); float *pose, *matrix; int k, b; @@ -1593,7 +1594,7 @@ qboolean Alias_GAliasBuildMesh(mesh_t *mesh, vbo_t **vbop, galiasinfo_t *inf, in if (meshcache.ent == e) { - if (meshcache.vertgroup == inf->shares_verts && meshcache.ent == e) + if (meshcache.vertgroup == inf->shares_verts && meshcache.ent == e && usebones == meshcache.usebones) { mesh->xyz_array = meshcache.acoords1; mesh->xyz2_array = meshcache.acoords2; @@ -1608,7 +1609,7 @@ qboolean Alias_GAliasBuildMesh(mesh_t *mesh, vbo_t **vbop, galiasinfo_t *inf, in } } #else - if (usebones && meshcache.bonecachetype != -1) + if (usebones) { mesh->bonenums = inf->ofs_skel_idx; mesh->boneweights = inf->ofs_skel_weight; @@ -1651,6 +1652,8 @@ qboolean Alias_GAliasBuildMesh(mesh_t *mesh, vbo_t **vbop, galiasinfo_t *inf, in *vbop = NULL; if (inf->ofs_skel_xyz && !inf->ofs_skel_weight) { + usebones = false; + //if we have skeletal xyz info, but no skeletal weights, then its a partial model that cannot possibly be animated. meshcache.usebonepose = NULL; mesh->xyz_array = inf->ofs_skel_xyz; @@ -1729,6 +1732,8 @@ qboolean Alias_GAliasBuildMesh(mesh_t *mesh, vbo_t **vbop, galiasinfo_t *inf, in else #endif { + usebones = false; + frame1 = e->framestate.g[FS_REG].frame[0]; frame2 = e->framestate.g[FS_REG].frame[1]; lerp = e->framestate.g[FS_REG].lerpfrac; @@ -1853,6 +1858,7 @@ qboolean Alias_GAliasBuildMesh(mesh_t *mesh, vbo_t **vbop, galiasinfo_t *inf, in meshcache.vbop = *vbop; #ifdef SKELETALMODELS + meshcache.usebones = usebones; if (usebones) { mesh->bonenums = inf->ofs_skel_idx; diff --git a/engine/common/q1bsp.c b/engine/common/q1bsp.c index bcd4a5f6d..3936fd5c1 100644 --- a/engine/common/q1bsp.c +++ b/engine/common/q1bsp.c @@ -882,6 +882,10 @@ qboolean Q1BSP_Trace(model_t *model, int forcehullnum, int frame, vec3_t axis[3] // calculate an offset value to center the origin VectorSubtract (hull->clip_mins, mins, offset); + +// offset[0] = 0; +// offset[1] = 0; + if (axis) { vec3_t tmp; diff --git a/engine/gl/gl_alias.c b/engine/gl/gl_alias.c index 8a7032683..0a66898e1 100644 --- a/engine/gl/gl_alias.c +++ b/engine/gl/gl_alias.c @@ -604,8 +604,8 @@ static shader_t *GL_ChooseSkin(galiasinfo_t *inf, model_t *model, int surfnum, e return shader; //the shader can do its own colourmapping. if (shader->prog && shader->prog->permu[PERMUTATION_UPPERLOWER].handle.glsl && !h2playertranslations) { //this shader can do permutations. this means we can generate only a black image, with separate top+bottom textures. - tc = 0xff000000; - bc = 0xff000000; + tc = 0xfe000000; + bc = 0xfe000000; generateupperlower = true; } } diff --git a/engine/gl/gl_ngraph.c b/engine/gl/gl_ngraph.c index 6b21ed2a7..c0fe61bb4 100644 --- a/engine/gl/gl_ngraph.c +++ b/engine/gl/gl_ngraph.c @@ -27,6 +27,9 @@ extern qbyte *draw_chars; // 8*8 graphic characters static texid_t netgraphtexture; // netgraph texture static shader_t *netgraphshader; +static int timehistory[NET_TIMINGS]; +static int findex; + #define NET_GRAPHHEIGHT 32 static qbyte ngraph_texels[NET_GRAPHHEIGHT][NET_TIMINGS]; @@ -99,11 +102,25 @@ void R_NetGraph (void) unsigned ngraph_pixels[NET_GRAPHHEIGHT][NET_TIMINGS]; x = 0; - lost = CL_CalcNet(r_netgraph.value); - for (a=0 ; aservertime - cl.servertime)*NET_GRAPHHEIGHT*5:0); + for (a=0 ; acorona <= 0) continue; - if (l->flags & LFLAG_FLASHBLEND) - { - if (!r_flashblend.value) - continue; - //dlights emitting from the local player are not visible as flashblends - if (l->key == r_refdef.playerview->viewentity) - continue; //was a glow - if (l->key == -(r_refdef.playerview->viewentity)) - continue; //was a muzzleflash - coronastyle = false; - } - else - coronastyle = true; + //dlights emitting from the local player are not visible as flashblends + if (l->key == r_refdef.playerview->viewentity) + continue; //was a glow + if (l->key == -(r_refdef.playerview->viewentity)) + continue; //was a muzzleflash + + coronastyle = (l->flags & (LFLAG_NORMALMODE|LFLAG_REALTIMEMODE)); + flashstyle = ((l->flags & LFLAG_FLASHBLEND) && r_flashblend.ival); + + if (!coronastyle && !flashstyle) + continue; + if (coronastyle && flashstyle) + flashstyle = false; cscale = l->coronascale; - intensity = l->corona * 0.25; + intensity = l->corona;// * 0.25; if (coronastyle) intensity *= r_coronas.value; else diff --git a/engine/partcfgs/high.cfg b/engine/partcfgs/high.cfg index 011e8fca2..3b8955af5 100644 --- a/engine/partcfgs/high.cfg +++ b/engine/partcfgs/high.cfg @@ -348,11 +348,14 @@ r_part tr_knightspike blend add spawnmode spiral spawnvel -50 + lighttime 0 + lightshadows 0 + lightradius 150 + lightrgb 0.75 0.37 0.18 } ///////////////////////////////////////// //vore missiles - r_part tr_vorespike { texture "particles/fteparticlefont.tga" @@ -369,18 +372,90 @@ r_part tr_vorespike friction 0 scalefactor 1 blend add - + lighttime 0 + lightshadows 0 lightradius 150 lightrgb 0.75 0.37 0.75 } //rygel's pack sucks r_trail "progs/v_spike.mdl" tr_vorespike +//enforcer laser effect +r_part tr_enforcerlaser +{ + type texturedspark + texture "particles/fteparticlefont.tga" + tcoords 1 97 95 191 256 + scale 15 + step 4 + alpha 0.3 + die 0.5 + rgb 255 69 0 + veladd -32 + spawnmode spiral + spawnvel 16 + randomvel 32 + friction 0 + scalefactor 1 + blend add + lighttime 0.2 + lightshadows 0 + lightradius 150 + lightrgb 1 0.27 0 + lightrgbfade 5 1 0 + lightcorona 2 0.25 +} +r_trail "progs/laser.mdl" tr_enforcerlaser + ///////////////////////////////////////// //scrag missiles. just use the default trail cos we're lazy -//r_part tr_wizspike -//{ -//} +r_part tr_wizspike +{ + texture "particles/fteparticlefont.tga" + tcoords 1 97 95 191 256 + scale 15 + step 1 + alpha 0.6 + die 0.2 + rgb 25 200 25 + veladd 0 + randomvel 2 + friction 4 + scalefactor 0.825 + spawnmode spiral + spawnvel 25 + blend add + lighttime 0 + lightshadows 0 + lightradius 150 + lightrgb 0.1 0.7 0.1 +} + +r_part shambercharging +{ + spawnmode ball + count 200 + spawnorg 128 + spawnvel -256 + texture "particles/fteparticlefont.tga" + tcoords 1 1 63 63 256 2 64 + scale 4 + alpha 1 + die 0.5 + orgadd -64 + rotationspeed 90 + rotationstart 0 360 + rgb 100 100 250 + rgbrand 0 0 0 + gravity 0 + scalefactor 0.4 + lighttime 0 + lightshadows 0 + lightradius 400 + lightrgb 2 2 2 +} +r_effect progs/s_light.mdl shambercharging 0 + r_part te_blood { @@ -394,19 +469,13 @@ r_part te_blood veladd 10 rotationspeed 90 rotationstart 0 360 - rgb 64 128 128 - rgbdelta -64 -128 -128 + rgb 32 64 64 + rgbdelta -32 -64 -64 gravity 200 scalefactor 0.8 -// scaledelta -10 } -r_part pe_73 -{ - assoc te_blood -} - -r_part te_lightningblood +r_part high.pe_73 { texture fte_bloodparticle blend subtract @@ -418,8 +487,43 @@ r_part te_lightningblood veladd 10 rotationspeed 90 rotationstart 0 360 - rgb 0 128 128 - rgbdelta 0 -128 -128 + rgb 32 64 64 + rgbdelta -32 -64 -64 + gravity 200 + scalefactor 0.8 +} + +r_part te_lightningblood +{ + texture fte_bloodparticle + blend subtract + count 1 + scale 32 + alpha 0 + die 1 + randomvel 32 + veladd 5 + rotationspeed 90 + rotationstart 0 360 + rgb 64 128 128 + rgbdelta -64 -128 -128 + gravity 200 + scalefactor 0.8 +} +r_part high.pe_225 +{ + texture fte_bloodparticle + blend subtract + count 0.5 + scale 32 + alpha 0 + die 1 + randomvel 32 + veladd 5 + rotationspeed 90 + rotationstart 0 360 + rgb 64 128 128 + rgbdelta -64 -128 -128 gravity 200 scalefactor 0.8 } diff --git a/engine/server/net_preparse.c b/engine/server/net_preparse.c index 0ce89116e..ca63980c1 100644 --- a/engine/server/net_preparse.c +++ b/engine/server/net_preparse.c @@ -1619,7 +1619,7 @@ void NPP_QWFlush(void) org[0] = (*(short*)&buffer[multicastpos])/8.0f; org[1] = (*(short*)&buffer[multicastpos+2])/8.0f; org[2] = (*(short*)&buffer[multicastpos+4])/8.0f; - count = buffer[2]*20; + count = bound(0, buffer[2]*20, 255); if (minortype == TEQW_LIGHTNINGBLOOD) colour = 225; else