Nuclide
Software Development Kit for id Technology (BETA)
defs.h
1/*
2 * Copyright (c) 2016-2022 Vera Visions LLC.
3 *
4 * Permission to use, copy, modify, and distribute this software for any
5 * purpose with or without fee is hereby granted, provided that the above
6 * copyright notice and this permission notice appear in all copies.
7 *
8 * THE SOFTWARE IS PROVIDED "AS IS" AND THE AUTHOR DISCLAIMS ALL WARRANTIES
9 * WITH REGARD TO THIS SOFTWARE INCLUDING ALL IMPLIED WARRANTIES OF
10 * MERCHANTABILITY AND FITNESS. IN NO EVENT SHALL THE AUTHOR BE LIABLE FOR
11 * ANY SPECIAL, DIRECT, INDIRECT, OR CONSEQUENTIAL DAMAGES OR ANY DAMAGES
12 * WHATSOEVER RESULTING FROM LOSS OF MIND, USE, DATA OR PROFITS, WHETHER
13 * IN AN ACTION OF CONTRACT, NEGLIGENCE OR OTHER TORTIOUS ACTION, ARISING
14 * OUT OF OR IN CONNECTION WITH THE USE OR PERFORMANCE OF THIS SOFTWARE.
15*/
16
17#include "../platform/localize.h"
18#include "api_func.h"
19#include "../shared/api.h"
20#include "../shared/system/entityDef.h"
21#include "text.h"
22#include "textmenu.h"
23#include "font.h"
24#include "fade.h"
25#include "cmd.h"
26#include "util.h"
27#include "View.h"
28#include "Radar.h"
29#include "crosshair.h"
30#include "hud.h"
31#include "InterfaceSpriteSheet.h"
32#include "UserInfo.h"
33#include "UserInfoManager.h"
34#include "ServerInfo.h"
35#include "WadIndexer.h"
36
37var bool g_net_debug = false;
38var bool g_cheats = false;
39
40var float g_modelSpinAngle;
41var float g_modelSpinPitch;
42var float g_modelSpinRoll;
43var float g_modelBobHeight;
44var float autocvar_cg_modelSpinSpeed = 120.0f;
45var float autocvar_cg_modelSpinRoll = 0.0f;
46var float autocvar_cg_modelSpinRollSpeed = 0.0f;
47var float autocvar_cg_modelSpinPitch = 0.0f;
48var float autocvar_cg_modelSpinPitchSpeed = 0.0f;
49var float autocvar_cg_modelBobHeight = 0.0f;
50var float autocvar_cg_modelBobHeightSpeed = 0.0f;
51
52var bool autocvar_net_showUpdates = false;
53
54var bool g_clientInitialized = false;
55
56#define PRINTFLAG(x) if (autocvar_net_showUpdates || g_net_debug) \
57 print(sprintf("%f %s read update %s\n", time, classname, #x));
58
59#define READENTITY_BYTE(field, changedflag) {\
60 if (flChanged & changedflag) {\
61 field = readbyte();\
62 PRINTFLAG(changedflag); \
63 }\
64}
65
66#define READENTITY_SHORT(field, changedflag) {\
67 if (flChanged & changedflag) {\
68 field = readshort();\
69 PRINTFLAG(changedflag); \
70 }\
71}
72
73#define READENTITY_FLOAT(field, changedflag) {\
74 if (flChanged & changedflag) {\
75 field = readfloat();\
76 PRINTFLAG(changedflag); \
77 }\
78}
79
80#define READENTITY_INT(field, changedflag) {\
81 if (flChanged & changedflag) {\
82 field = readint();\
83 PRINTFLAG(changedflag); \
84 }\
85}
86
87#define READENTITY_STRING(field, changedflag) {\
88 if (flChanged & changedflag) {\
89 field = readstring();\
90 PRINTFLAG(changedflag); \
91 }\
92}
93
94#define READENTITY_COORD(field, changedflag) {\
95 if (flChanged & changedflag) {\
96 field = readcoord();\
97 PRINTFLAG(changedflag); \
98 }\
99}
100
101#define READENTITY_ANGLE(field, changedflag) {\
102 if (flChanged & changedflag) {\
103 field = readangle();\
104 PRINTFLAG(changedflag); \
105 }\
106}
107
108#define READENTITY_ENTITY(field, changedflag) {\
109 if (flChanged & changedflag) {\
110 field = findentity(world, ::entnum, readentitynum());\
111 PRINTFLAG(changedflag); \
112 }\
113}
114
115#define READENTITY_ENTNUM(field, changedflag) {\
116 if (flChanged & changedflag) {\
117 field = readentitynum();\
118 PRINTFLAG(changedflag); \
119 }\
120}
121
122#define READENTITY_COLOR(field, changedflag) {\
123 if (flChanged & changedflag) {\
124 field = readbyte() / 255;\
125 PRINTFLAG(changedflag); \
126 }\
127}
128
129#define READENTITY_MODELINDEX(field, changedflag) {\
130 if (flChanged & changedflag) {\
131 field = readshort();\
132 PRINTFLAG(changedflag); \
133 }\
134}
135
136/* undocumented printcall types */
137#define PRINT_LOW 0
138#define PRINT_MEDIUM 1
139#define PRINT_HIGH 2
140#define PRINT_CHAT 3
141
142var bool g_dlight_cached = false;
143var bool g_client_world_loaded = false;
144
145const float MASK_GLOWS = 16;
146var bool g_focus;
147bool Util_IsFocused(void);
148
149/* fonts */
150font_s FONT_16;
151font_s FONT_20;
152font_s FONT_CON;
153font_s FONT_CENTERPRINT;
154
155//var string g_shellchrome;
156var float g_shellchromeshader;
157var float g_shellchromeshader_cull;
158
159/* clientside cvars */
160var float autocvar_in_zoomSensitivity = 1.0f;
161var int autocvar_pm_stairSmoothing = TRUE;
162var int autocvar_pm_thirdPerson = FALSE;
163var int autocvar_cg_viewmodelFlip = FALSE;
164var vector autocvar_con_color = [255,150,0];
165var vector autocvar_vgui_color = [255,170,0];
166var vector autocvar_cg_viewmodelOffset = [0,0,0];
167var int autocvar_cg_viewmodelPass = 0;
168var float autocvar_cg_viewmodelFov = 90.0f;
169var float autocvar_cg_viewmodelScale = 1.0f;
170var float autocvar_cg_hudAspect = 0.0f;
171var bool autocvar_pm_crouchToggle = false;
172
173/* particle descriptors */
174var float PART_DUSTMOTE;
175var float PART_BURNING;
176
177/* misc globals */
178vector video_mins;
179vector g_vidsize;
180int g_iIntermission;
181
182/* this actually belongs in builtins.h since its an undocumented global */
183float clframetime;
184
185string(string modelname, int frame, float frametime) spriteframe = #0;
186
187void CSQC_UpdateSeat(void);
188
190void
191drawstring_r(vector p, string t, vector s, vector c, float a, float f)
192{
193 p[0] -= stringwidth(t, TRUE, s);
194 drawstring(p, t, s, c, a, f);
195}
196
197void GameMessage_Setup(string, int);
198void View_SetMuzzleflash(int);
199
200void Event_Callback(float mtime, __inout float btime);
201void View_AddEvent(void(void) pCallback, float flTime);
202void View_PlayAnimation(int);
203void View_PlayAnimation(int);
204
205void View_EnableViewmodel(void);
206void View_DisableViewmodel(void);
207void View_SetViewmodelSkin(float);
208
210void drawrect(vector pos, vector sz, float thickness, vector rgb, float al, optional float dfl)
211{
212 /* top */
213 drawfill(pos, [sz[0], thickness], rgb, al, dfl);
214 /* bottom */
215 drawfill(pos + [0, sz[1] - thickness], [sz[0], thickness], rgb, al, dfl);
216 /* left */
217 drawfill(pos + [0, thickness], [thickness, sz[1] - (thickness * 2)], rgb, al, dfl);
218 /* right */
219 drawfill(pos + [sz[0] - thickness, thickness], [thickness, sz[1] - (thickness * 2)], rgb, al, dfl);
220}
221
225void
226drawpic3d(vector worldpos, string mat, vector sz, vector rgb, float alpha)
227{
228 static bool
229 drawpic3d_visible(vector p1) {
230 vector delta;
231 float fov;
232 vector p2 = g_view.GetCameraOrigin();
233 vector ang = g_view.GetCameraAngle();
234
235 makevectors(ang);
236 delta = normalize (p1 - p2);
237 fov = delta * v_forward;
238
239 if (fov > (g_view.GetAFOV()/180)) {
240 traceline(p2, p1, MOVE_WORLDONLY, self);
241 if (trace_fraction == 1.0) {
242 return (1);
243 }
244 }
245 return (0);
246 }
247
248 if (drawpic3d_visible(worldpos) == true) {
249 vector vecProj = project(worldpos) - (sz/2);
250 drawpic(vecProj, mat, sz, rgb, alpha);
251 }
252}
253
255void
256drawcone(vector vecOrigin, vector vecAngle, int iDivisions, float flLength, float flRadius, vector vecColor, float flAlpha)
257{
258 vector c;
259 vector e0;
260 vector e1;
261 float angDelta;
262
263 static vector
264 perpendicularCross(vector v)
265 {
266 float min = fabs(v[0]);
267 vector ca = [1, 0, 0];
268
269 if (fabs(v[1]) < min) {
270 min = fabs(v.y);
271 ca = [0, 1, 0];
272 }
273
274 if (fabs(v[2]) < min) {
275 ca = [0, 0, 1];
276 }
277
278 return crossproduct(v, ca);
279 }
280
281 makevectors(vecAngle + [0, 0, 0]);
282 vecAngle = v_forward * -1;
283 c = vecOrigin + (-vecAngle * flLength);
284 e0 = perpendicularCross(vecAngle);
285 e1 = crossproduct(e0, vecAngle);
286 angDelta = 360.0 / (iDivisions-1) * (M_PI / 180.0f);
287
288 R_BeginPolygon("debugcone");
289 R_PolygonVertex(vecOrigin, [0,0], vecColor, flAlpha);
290 for (int i = 0; i < iDivisions; ++i) {
291 vector vecPoint;
292 float rad = angDelta * i;
293 vecPoint = c + (((e0 * cos(rad)) + (e1 * sin(rad))) * flRadius);
294 R_PolygonVertex(vecPoint, [0,0], vecColor, flAlpha);
295 }
296 R_EndPolygon();
297}
298
300void
301precache_cubemap(string path)
302{
303 precache_pic(strcat(path, "_bk"));
304 precache_pic(strcat(path, "_dn"));
305 precache_pic(strcat(path, "_ft"));
306 precache_pic(strcat(path, "_lf"));
307 precache_pic(strcat(path, "_rt"));
308 precache_pic(strcat(path, "_up"));
309}
310
311typedef enum
312{
313 STANCE_DEFAULT = 0,
314 STANCE_CROUCH = 1,
315 STANCE_PRONE = 2,
316} movementStance_t;
317
318struct
319{
320 /* viewmodel stuff */
321 entity m_eViewModel;
322 entity m_eMuzzleflash;
323 int m_iVMBones;
324 entity m_eViewModelL;
325 entity m_eMuzzleflashL;
326 int m_iVMBonesL;
327
328 void(void) m_pEventCall;
329 float m_flEventTime;
330 float m_flEventFrame;
331 float m_flEventMdl;
332 entity m_iEventEntity;
333
334 int m_iLastWeapon;
335 int m_iOldWeapon;
336
337 /* damage overlay */
338 float m_flDamageAlpha;
339 vector m_vecDamagePos;
340 int m_iDamageFlags;
341
342 /* +zoomin cmd */
343 int m_iZoomed;
344 float m_flZoomTime;
345
346 /* player fields */
347 entity m_ePlayer;
348 vector m_vecPredictedOrigin;
349 vector m_vecPredictedOriginOld;
350 vector m_vecPredictedVelocity;
351 float m_flPredictedFlags;
352
353 /* camera fields */
354 vector m_vecCameraOrigin;
355 vector m_vecCameraAngle;
356 float m_flCameraTime;
357
358 int m_iHUDWeaponSelected;
359 float m_flHUDWeaponSelectTime;
360
361 int m_iScoresVisible;
362
363 /* saturn controller */
364 int m_iSaturnMenu;
365
366 /* centerprint related */
367 float m_flCenterprintAlpha;
368 float m_flCenterprintTime;
369 float m_iCenterprintLines;
370 string m_strCenterprintBuffer[18];
371
372 /* chat related */
373 float m_flPrintTime;
374 string m_strPrintBuffer[5];
375 int m_iPrintLines;
376
377 bool m_iInputAttack;
378 bool m_iInputAttack2;
379 bool m_iInputReload;
380 bool m_iInputUse;
381 bool m_iInputDuck;
382 bool m_iInputSprint;
383 bool m_iInputProne;
384 bool m_iInputJump;
385 movementStance_t m_dForceStance;
386 float m_flInputBlockTime;
387
388 /* fading */
389 float m_flFadeDuration;
390 float m_flFadeHold;
391 float m_flFadeMaxAlpha;
392 float m_flFadeStyle;
393 float m_flFadeAlpha;
394 float m_flFadeTime;
395 float m_flSprintLerp;
396 vector m_vecFadeColor;
397 int m_iFadeActive;
398
399 /* shake */
400 float m_flShakeFreq;
401 float m_flShakeDuration;
402 float m_flShakeTime;
403 float m_flShakeAmp;
404
405 vector m_vecLag;
406
407 /* vehicles */
408 float m_flVehTransition;
409 vector m_vecVehEntry;
410
411 /* new XR helpers */
412 bool m_bMoveForward;
413
414 bool m_bInterfaceFocused;
415 bool m_bSpecInput;
416
417 int m_iLeanDir;
418 float m_flLeaning;
419 int m_iSprinting;
420
421 int m_iSelectedWeapon;
422 bool m_bCommandMenu;
423 ncWeapon m_weaponRef;
424
425 float m_weaponAnimSequence;
426 float m_weaponAnimTime;
427 float m_weaponModel;
428 string m_weaponClass;
429 string m_weaponFireInfo;
430} g_seats[4], *pSeat;
431
432.float modelindex2;
433.float modelindex3;
434.float modelindex4;
435
436var vector g_vecMousePos;
437var vector g_hudmins;
438var vector g_hudres;
439
440var ncRadar g_overview;
441
Tasked with managing overview/radar type widgets.
Definition: Radar.h:30
nonvirtual float GetAFOV(void)
Returns the absolute field of view of the ncView.
Definition: View.qc:229
nonvirtual vector GetCameraOrigin(void)
Returns the 3D world coordinate of the ncView.
Definition: View.qc:180
nonvirtual vector GetCameraAngle(void)
Returns the 3D direction of the ncView.
Definition: View.qc:186
This entity class represents weapon based items.
Definition: Weapon.h:305
ncView g_view
the current seat run for each draw call, for each player.
Definition: View.h:156
void GameMessage_Setup(string strMessage, int iChannel)
Places a message within a specified channel.
Definition: text.qc:262
Representation of a font.
Definition: api_func.h:39