#include <common/debug.qh>
#include <common/ent_cs.qh>
#include <common/gamemodes/_mod.qh>
+#include <common/impulses/all.qh>
#include <common/mapinfo.qh>
#include <common/mapobjects/target/music.qh>
#include <common/mapobjects/trigger/viewloc.qh>
this.origin += bobmodel_ofs(view);
}
-.vector viewmodel_origin, viewmodel_angles;
.float weapon_nextthink;
.float weapon_eta_last;
.float weapon_switchdelay;
void viewmodel_draw(entity this)
{
- if(!this.activeweapon || !autocvar_r_drawviewmodel)
- return;
int mask = (intermission || (STAT(HEALTH) <= 0) || autocvar_chase_active) ? 0 : MASK_NORMAL;
float a = ((autocvar_cl_viewmodel_alpha) ? bound(-1, autocvar_cl_viewmodel_alpha, this.m_alpha) : this.m_alpha);
int wepskin = this.m_skin;
if (invehicle) a = -1;
Weapon wep = this.activeweapon;
int c = entcs_GetClientColors(current_player);
- vector g = weaponentity_glowmod(wep, NULL, c, this);
+ vector g = weaponentity_glowmod(wep, c, this);
entity me = CSQCModel_server2csqc(player_localentnum - 1);
int fx = ((me.csqcmodel_effects & EFMASK_CHEAP)
| EF_NODEPTHTEST)
{
this.name_last = name;
CL_WeaponEntity_SetModel(this, name, swap);
- this.viewmodel_origin = this.origin;
- this.viewmodel_angles = this.angles;
+ this.origin += autocvar_cl_gunoffset;
}
anim_update(this);
if ((!this.animstate_override && !this.animstate_looping) || time > this.animstate_endtime)
}
}
this.weapon_eta_last = f;
- this.origin = this.viewmodel_origin;
- this.angles = this.viewmodel_angles;
this.angles_x = (-90 * f * f);
viewmodel_animate(this);
MUTATOR_CALLHOOK(DrawViewModel, this);
vector project_3d_to_2d(vector vec)
{
vec = cs_project(vec);
- if(cs_project_is_b0rked > 0)
- {
- vec.x *= vid_conwidth / vid_width;
- vec.y *= vid_conheight / vid_height;
- }
return vec;
}
}
}
- if(almost_equals(current_viewzoom, 1))
+ if(zoomfactor == 1 || current_viewzoom > 0.999) // zoomfactor check prevents a division by 0
current_zoomfraction = 0;
else if(almost_equals(current_viewzoom, 1/zoomfactor))
current_zoomfraction = 1;
return 0;
}
+bool waiting_CAMERA_SPECTATOR_update;
void View_EventChase(entity this)
{
+ if(spectatee_status > 0 && autocvar_chase_active > 0)
+ {
+ // if chase_active is enabled by the user, spectator camera never switches to 1st person
+ // that means CAMERA_SPECTATOR 1 behaves as 0 and is redundant, so we forcedly skip it
+ if (STAT(CAMERA_SPECTATOR) == 1)
+ {
+ if (!waiting_CAMERA_SPECTATOR_update)
+ {
+ Impulse_Send(IMP_weapon_drop); // switch to CAMERA_SPECTATOR 2
+ waiting_CAMERA_SPECTATOR_update = true;
+ }
+ }
+ else waiting_CAMERA_SPECTATOR_update = false;
+ }
+
// event chase camera
if(autocvar_chase_active <= 0) // greater than 0 means it's enabled manually, and this code is skipped
{
{
if (MUTATOR_CALLHOOK(HUD_Draw_overlay))
{
- drawfill('0 0 0', vec2(vid_conwidth, vid_conheight), M_ARGV(0, vector), autocvar_hud_colorflash_alpha * M_ARGV(1, float), DRAWFLAG_ADDITIVE);
+ vector col = M_ARGV(0, vector);
+ float alpha_multipl = M_ARGV(1, float);
+ if (alpha_multipl > 0)
+ drawfill('0 0 0', vec2(vid_conwidth, vid_conheight), col, autocvar_hud_colorflash_alpha * alpha_multipl, DRAWFLAG_ADDITIVE);
}
else if(STAT(FROZEN))
{
UpdateDamage();
HUD_Crosshair(this);
HitSound();
+ Local_Notification_Queue_Process();
}
void ViewLocation_Mouse()
{
float e1 = (autocvar_hud_postprocessing_maxbluralpha != 0);
float e2 = (autocvar_hud_powerup != 0);
+ bool want_postprocessing = false;
if(autocvar_hud_postprocessing && (e1 || e2)) // TODO: Remove this code and re-do the postprocess handling in the engine, where it properly belongs.
{
// enable or disable rendering types if they are used or not
old_blurradius = blurradius;
old_bluralpha = bluralpha;
}
+ want_postprocessing = true;
}
else if(cvar_string("r_glsl_postprocess_uservec1") != "0 0 0 0") // reduce cvar_set spam as much as possible
{
cvar_set("r_glsl_postprocess_uservec2", strcat(ftos((sharpen_intensity / 5) * autocvar_hud_powerup), " ", ftos(-sharpen_intensity * autocvar_hud_powerup), " 0 0"));
old_sharpen_intensity = sharpen_intensity;
}
+ want_postprocessing = true;
}
else if(cvar_string("r_glsl_postprocess_uservec2") != "0 0 0 0") // reduce cvar_set spam as much as possible
{
cvar_set("r_glsl_postprocess_uservec2", "0 0 0 0");
old_sharpen_intensity = 0;
}
-
+ }
+ if (want_postprocessing)
+ {
if(cvar("r_glsl_postprocess") == 0)
cvar_set("r_glsl_postprocess", "2");
}
- else if(cvar("r_glsl_postprocess") == 2)
- cvar_set("r_glsl_postprocess", "0");
+ else
+ {
+ if(cvar("r_glsl_postprocess") == 2)
+ cvar_set("r_glsl_postprocess", "0");
+ }
}
void View_Lock()
setproperty(VF_FOV, fov);
}
-void CSQC_UpdateView(entity this, float w, float h)
+void CSQC_UpdateView(entity this, float w, float h, bool notmenu)
{
TC(int, w); TC(int, h);
// run viewmodel_draw before updating view_angles to the angles calculated by WarpZone_FixView
// viewmodel_draw needs to use the view_angles set by the engine on every CSQC_UpdateView call
- for(int slot = 0; slot < MAX_WEAPONSLOTS; ++slot)
- viewmodel_draw(viewmodels[slot]);
+ if(autocvar_r_drawviewmodel)
+ for(int slot = 0; slot < MAX_WEAPONSLOTS; ++slot)
+ if(viewmodels[slot].activeweapon)
+ viewmodel_draw(viewmodels[slot]);
// Render the Scene
view_origin = getpropertyvec(VF_ORIGIN);
{
if(calledhooks & HOOK_START)
{
+ int gamecount = cvar("cl_matchcount");
localcmd("\ncl_hook_gameend\n");
+ // NOTE: using localcmd here to ensure it's executed AFTER cl_hook_gameend
+ // earlier versions of the game abuse the hook to set this cvar
+ localcmd(strcat("cl_matchcount ", itos(gamecount + 1), "\n"));
+ //cvar_set("cl_matchcount", itos(gamecount + 1));
calledhooks |= HOOK_END;
}
}
// draw 2D entities
IL_EACH(g_drawables_2d, it.draw2d, it.draw2d(it));
+ IL_EACH(g_damagetext, it.draw2d, it.draw2d(it));
Draw_ShowNames_All();
#if ENABLE_DEBUGDRAW
Debug_Draw();
#endif
+ if (autocvar__scoreboard_team_selection)
+ {
+ Scoreboard_UI_Enable(1);
+ cvar_set("_scoreboard_team_selection", "0");
+ }
scoreboard_active = Scoreboard_WouldDraw();
HUD_Draw(this); // this parameter for deep vehicle function
NextFrameCommand = string_null;
}
- // we must do this check AFTER a frame was rendered, or it won't work
- if(cs_project_is_b0rked == 0)
- {
- string w0, h0;
- w0 = ftos(autocvar_vid_conwidth);
- h0 = ftos(autocvar_vid_conheight);
- //setproperty(VF_VIEWPORT, '0 0 0', '640 480 0');
- //setproperty(VF_FOV, '90 90 0');
- setproperty(VF_ORIGIN, '0 0 0');
- setproperty(VF_ANGLES, '0 0 0');
- setproperty(VF_PERSPECTIVE, 1);
- vector forward, right, up;
- MAKE_VECTORS('0 0 0', forward, right, up);
- vector v1, v2;
- cvar_set("vid_conwidth", "800");
- cvar_set("vid_conheight", "600");
- v1 = cs_project(forward);
- cvar_set("vid_conwidth", "640");
- cvar_set("vid_conheight", "480");
- v2 = cs_project(forward);
- if(v1 == v2)
- cs_project_is_b0rked = 1;
- else
- cs_project_is_b0rked = -1;
- cvar_set("vid_conwidth", w0);
- cvar_set("vid_conheight", h0);
- }
-
HUD_Mouse(local_player);
cl_notice_run();
void CSQC_Demo_Camera()
{
float speed, attenuation, dimensions;
- vector tmp, delta;
+ vector tmp;
if( autocvar_camera_reset || !camera_mode )
{
}
}
- while (mouse_angles.x < -180) mouse_angles.x = mouse_angles.x + 360;
- while (mouse_angles.x > 180) mouse_angles.x = mouse_angles.x - 360;
- while (mouse_angles.y < -180) mouse_angles.y = mouse_angles.y + 360;
- while (mouse_angles.y > 180) mouse_angles.y = mouse_angles.y - 360;
-
- // Fix difference when angles don't have the same sign
- delta = '0 0 0';
- if(mouse_angles.y < -60 && current_angles.y > 60)
- delta = '0 360 0';
- if(mouse_angles.y > 60 && current_angles.y < -60)
- delta = '0 -360 0';
-
if(autocvar_camera_look_player)
attenuation = autocvar_camera_look_attenuation;
else
attenuation = autocvar_camera_speed_attenuation;
attenuation = 1 / max(1, attenuation);
- current_angles += (mouse_angles - current_angles + delta) * attenuation;
+ current_angles += (mouse_angles - current_angles) * attenuation;
+
+ // limit current pitch angle to sane values
+ if (current_angles.x < -90) current_angles.x = -90;
+ if (current_angles.x > 90 ) current_angles.x = 90;
- while (current_angles.x < -180) current_angles.x = current_angles.x + 360;
- while (current_angles.x > 180) current_angles.x = current_angles.x - 360;
- while (current_angles.y < -180) current_angles.y = current_angles.y + 360;
- while (current_angles.y > 180) current_angles.y = current_angles.y - 360;
+ // limit mouse and current yaw angles to standard values simultaneously so that the difference
+ // between these angles is not altered
+ while (current_angles.y < -180 && mouse_angles.y < -180) {current_angles.y += 360; mouse_angles.y += 360;}
+ while (current_angles.y > 180 && mouse_angles.y > 180 ) {current_angles.y -= 360; mouse_angles.y -= 360;}
// Camera position
tmp = '0 0 0';