OpenMoHAA ..
Loading...
Searching...
No Matches
player.h
1/*
2===========================================================================
3Copyright (C) 2024 the OpenMoHAA team
4
5This file is part of OpenMoHAA source code.
6
7OpenMoHAA source code is free software; you can redistribute it
8and/or modify it under the terms of the GNU General Public License as
9published by the Free Software Foundation; either version 2 of the License,
10or (at your option) any later version.
11
12OpenMoHAA source code is distributed in the hope that it will be
13useful, but WITHOUT ANY WARRANTY; without even the implied warranty of
14MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
15GNU General Public License for more details.
16
17You should have received a copy of the GNU General Public License
18along with OpenMoHAA source code; if not, write to the Free Software
19Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA
20===========================================================================
21*/
22// player.h: Class definition of the player.
23
24#pragma once
25
26#include "g_local.h"
27#include "../corepp/vector.h"
28#include "entity.h"
29#include "weapon.h"
30#include "sentient.h"
31#include "navigate.h"
32#include "misc.h"
33#include "bspline.h"
34#include "camera.h"
35#include "specialfx.h"
36#include "characterstate.h"
37#include "actor.h"
38#include "vehicle.h"
39#include "dm_manager.h"
40#include "scriptdelegate.h"
41
42extern Event EV_Player_EndLevel;
43extern Event EV_Player_GiveCheat;
44extern Event EV_Player_GodCheat;
45extern Event EV_Player_NoTargetCheat;
46extern Event EV_Player_NoClipCheat;
47extern Event EV_Player_GameVersion;
48extern Event EV_Player_Fov;
49extern Event EV_Player_WhatIs;
50extern Event EV_Player_Respawn;
51extern Event EV_Player_WatchActor;
52extern Event EV_Player_StopWatchingActor;
53extern Event EV_Player_DoStats;
54extern Event EV_Player_EnterIntermission;
55extern Event EV_GetViewangles;
56extern Event EV_SetViewangles;
57extern Event EV_Player_AutoJoinDMTeam;
58extern Event EV_Player_JoinDMTeam;
59extern Event EV_Player_Respawn;
60extern Event EV_Player_PrimaryDMWeapon;
61extern Event EV_Player_StuffText;
62
63enum painDirection_t {
64 PAIN_NONE,
65 PAIN_FRONT,
66 PAIN_LEFT,
67 PAIN_RIGHT,
68 PAIN_REAR
69};
70
71typedef enum {
72 ANIMSLOT_PAIN = 4,
73 ANIMSLOT_TESTANIM = 7
74} playerAnimSlot_t;
75
76typedef enum {
77 PVT_NONE_SET,
78 PVT_ALLIED_START,
79 PVT_ALLIED_AIRBORNE,
80 PVT_ALLIED_MANON,
81 PVT_ALLIED_SAS,
82 PVT_ALLIED_PILOT,
83 PVT_ALLIED_ARMY,
84 PVT_ALLIED_RANGER,
85 PVT_ALLIED_AMERICAN,
86 PVT_ALLIED_BRITISH,
87 PVT_ALLIED_RUSSIAN,
88 PVT_ALLIED_END,
89 PVT_AXIS_START,
90 PVT_AXIS_AXIS1,
91 PVT_AXIS_GERMAN = PVT_AXIS_AXIS1,
92 PVT_AXIS_AXIS2,
93 PVT_AXIS_ITALIAN = PVT_AXIS_AXIS2,
94 PVT_AXIS_AXIS3,
95 PVT_AXIS_AXIS4,
96 PVT_AXIS_AXIS5,
97 PVT_AXIS_END
98} voicetype_t;
99
100typedef enum jailstate_e {
101 JAILSTATE_NONE,
102 JAILSTATE_ESCAPE,
103 JAILSTATE_ASSIST_ESCAPE
104} jailstate_t;
105
106typedef enum nationality_e {
107 NA_NONE,
108 NA_AMERICAN,
109 NA_BRITISH,
110 NA_RUSSIAN,
111 NA_GERMAN,
112 NA_ITALIAN
113} nationality_t;
114
115typedef void (Player::*movecontrolfunc_t)(void);
116
117typedef struct vma_s {
118 str name;
119 float speed;
120} vma_t;
121
122#define MAX_SPEED_MULTIPLIERS 4
123#define MAX_ANIM_SLOT 16
124#define MAX_TRAILS 2
125
126class VoteUpload;
127
128class Player : public Sentient
129{
130 friend class Camera;
131 friend class Vehicle;
132 friend class TurretGun;
133 friend class VehicleTurretGun;
134
135private:
136 static Condition<Player> m_conditions[];
137 static movecontrolfunc_t MoveStartFuncs[];
138
139 StateMap *statemap_Legs;
140 StateMap *statemap_Torso;
141
142 State *currentState_Legs;
143 State *currentState_Torso;
144
145 str last_torso_anim_name;
146 str last_leg_anim_name;
147 str partAnim[2];
148 int m_iPartSlot[2];
149 float m_fPartBlends[2];
150 str partOldAnim[2];
151 float partBlendMult[2];
152 str m_sPainAnim;
153 float m_fPainBlend;
154
155 bool animdone_Legs;
156 bool animdone_Torso;
157 bool animdone_Pain;
158 Container<Conditional *> legs_conditionals;
159 Container<Conditional *> torso_conditionals;
160 Conditional *m_pLegsPainCond;
161 Conditional *m_pTorsoPainCond;
162
163 float m_fLastDeltaTime;
164
165 movecontrol_t movecontrol;
166 int m_iMovePosFlags;
167 int last_camera_type;
168
169 Vector oldvelocity;
170 Vector old_v_angle;
171 Vector oldorigin;
172 float animspeed;
173 float airspeed;
174 Vector m_vPushVelocity;
175
176 // blend
177 float blend[4];
178 float fov;
179 float selectedfov;
180 qboolean m_iInZoomMode;
181
182 // aiming direction
183 Vector v_angle;
184
185 int buttons;
186 int new_buttons;
187 int server_new_buttons;
188
189 float respawn_time;
190 int last_attack_button;
191
192 // damage blend
193 float damage_blood;
194 float damage_alpha;
195 Vector damage_blend;
196 Vector damage_from;
197 Vector damage_angles;
198 float damage_count;
199 float damage_yaw;
200 float next_painsound_time;
201 str waitForState;
202
203 SafePtr<Camera> camera;
204 SafePtr<Camera> actor_camera;
205 SimpleActorPtr actor_to_watch;
206
207 qboolean actor_camera_right;
208 qboolean starting_actor_camera_right;
209
210 // music stuff
211 int music_current_mood;
212 int music_fallback_mood;
213 float music_current_volume;
214 float music_saved_volume;
215 float music_volume_fade_time;
216
217 int reverb_type;
218 float reverb_level;
219
220 qboolean gibbed;
221 float pain;
222 painDirection_t pain_dir;
223 meansOfDeath_t pain_type;
224 int pain_location;
225 bool take_pain;
226 int nextpaintime;
227 float m_fMineDist;
228 float m_fMineCheckTime;
229 str m_sDmPrimary;
230 bool m_bIsInJail;
231 bool knockdown;
232
233 bool canfall;
234 bool falling;
235 int feetfalling;
236 Vector falldir;
237
238 bool mediumimpact;
239 bool hardimpact;
240
241 qboolean music_forced;
242
243 usercmd_t last_ucmd;
244 usereyes_t last_eyeinfo;
245
246 // movement variables
247 float animheight;
248 Vector yaw_forward;
249 Vector yaw_left;
250
251 SafePtr<Entity> atobject;
252 float atobject_dist;
253 Vector atobject_dir;
254
255 SafePtr<Entity> toucheduseanim;
256 int useanim_numloops;
257 SafePtr<Entity> useitem_in_use;
258
259 float move_left_vel;
260 float move_right_vel;
261 float move_backward_vel;
262 float move_forward_vel;
263 float move_up_vel;
264 float move_down_vel;
265 int moveresult;
266
267 float damage_multiplier;
268
269 //
270 // Talking
271 //
272 voicetype_t m_voiceType;
273 float m_fTalkTime;
274
275 int num_deaths;
276 int num_kills;
277 int num_won_matches;
278 int num_lost_matches;
279 int num_team_kills;
280 int m_iLastNumTeamKills;
281
282 bool m_bTempSpectator;
283 bool m_bSpectator;
284 bool m_bSpectatorSwitching;
285 bool m_bAllowFighting;
286 bool m_bReady;
287 int m_iPlayerSpectating;
288
289 teamtype_t dm_team;
290 class SafePtr<DM_Team> current_team;
291 float m_fTeamSelectTime;
292 class PlayerStart *m_pLastSpawnpoint;
293
294 //
295 // Vote
297 bool voted;
298 int votecount;
299 float m_fAllowVoteTime;
300 float m_fNextVoteOptionTime;
301
302 float m_fWeapSelectTime;
303 float fAttackerDispTime;
304 SafePtr<Entity> pAttackerDistPointer;
305
306 int m_iInfoClient;
307 int m_iInfoClientHealth;
308 float m_fInfoClientTime;
309 bool m_bDeathSpectator;
310 jailstate_t m_jailstate;
311
312#ifdef OPM_FEATURES
313 bool m_bShowingHint;
314#endif
315
316public:
317 MulticastDelegate<void(const str& text)> delegate_stufftext;
318 MulticastDelegate<void()> delegate_spawned;
319
320 static ScriptDelegate scriptDelegate_connected;
321 static ScriptDelegate scriptDelegate_disconnecting;
322 static ScriptDelegate scriptDelegate_spawned;
323 static ScriptDelegate scriptDelegate_damage;
324 static ScriptDelegate scriptDelegate_kill;
325 static ScriptDelegate scriptDelegate_textMessage;
326
327public:
328 int m_iNumObjectives;
329 int m_iObjectivesCompleted;
330
331 str m_sPerferredWeaponOverride;
332
333 float m_fHealRate;
334 Vector m_vViewPos;
335 Vector m_vViewAng;
336 Vector mvTrail[MAX_TRAILS];
337 Vector mvTrailEyes[MAX_TRAILS];
338 int mCurTrailOrigin;
339 int mLastTrailTime;
340 int m_iNumHitsTaken;
341 int m_iNumEnemiesKilled;
342 int m_iNumObjectsDestroyed;
343 int m_iNumShotsFired;
344 int m_iNumHits;
345 int m_iNumHeadShots;
346 int m_iNumTorsoShots;
347 int m_iNumLeftLegShots;
348 int m_iNumRightLegShots;
349 int m_iNumGroinShots;
350 int m_iNumLeftArmShots;
351 int m_iNumRightArmShots;
352
353 float m_fLastSprintTime;
354 bool m_bHasJumped;
355 float m_fLastInvulnerableTime;
356 int m_iInvulnerableTimeRemaining;
357 float m_fInvulnerableTimeElapsed;
358 float m_fSpawnTimeLeft;
359 bool m_bRespawnWhenReady;
360 bool m_bReadyToRespawn;
361
362 //
363 // Added in OPM
364 //
365 str m_sStateFile; // custom statefile
366 bool m_bFrozen; // if player is frozen
367 float speed_multiplier[MAX_SPEED_MULTIPLIERS];
368 ScriptThreadLabel m_killedLabel;
369 bool m_bConnected;
370 str m_lastcommand;
371
372 VoteUpload *voteUpload;
373
374#ifdef OPM_FEATURES
375 str m_sVision; // current vision
376 //
377 // View model animation
378 //
379 bool animDoneVM;
380 con_map<str, vma_t> vmalist;
381 str m_sVMAcurrent;
382 str m_sVMcurrent;
383 float m_fVMAtime;
384 dtiki_t *m_fpsTiki;
385#endif
386
387private:
388 int m_iInstantMessageTime;
389 int m_iTextChatTime;
390
391public:
392 qboolean CondTrue(Conditional& condition);
393 qboolean CondChance(Conditional& condition);
394 qboolean CondHealth(Conditional& condition);
395 qboolean CondPain(Conditional& condition);
396 qboolean CondBlocked(Conditional& condition);
397 qboolean CondOnGround(Conditional& condition);
398 qboolean CondHasWeapon(Conditional& condition);
399 qboolean CondNewWeapon(Conditional& condition);
400 qboolean CondImmediateSwitch(Conditional& condition);
401 qboolean CondUseWeapon(Conditional& condition);
402 qboolean CondUseWeaponClass(Conditional& condition);
403 qboolean CondWeaponActive(Conditional& condition);
404 qboolean CondWeaponClassActive(Conditional& condition);
405 qboolean CondWeaponCurrentFireAnim(Conditional& condition); // mohaas
406 qboolean CondWeaponReadyToFire(Conditional& condition);
407 qboolean CondWeaponClassReadyToFire(Conditional& condition);
408 qboolean CondUsingVehicle(Conditional& condition);
409 qboolean CondVehicleType(Conditional& condition);
410 qboolean CondIsPassenger(Conditional& condition);
411 qboolean CondIsDriver(Conditional& condition);
412 qboolean CondUsingTurret(Conditional& condition);
413 qboolean CondIsEscaping(Conditional& condition); // mohaab
414 qboolean CondAbleToDefuse(Conditional& condition); // mohaab
415 qboolean CondCanPlaceLandmine(Conditional& condition); // mohaab
416 qboolean CondOnLandmine(Conditional& condition); // mohaab
417 qboolean CondNearLandmine(Conditional& condition); // mohaab
418 void MeasureLandmineDistances(); // mohaab
419 qboolean CondIsAssistingEscape(Conditional& condition); // mohaab
420 qboolean CondTurretType(Conditional& condition);
421 qboolean CondWeaponReadyToFireNoSound(Conditional& condition);
422 qboolean CondPutAwayMain(Conditional& condition);
423 qboolean CondPutAwayOffHand(Conditional& condition);
424 qboolean CondAnyWeaponActive(Conditional& condition);
425 qboolean CondAttackBlocked(Conditional& condition);
426 qboolean CondBlockDelay(Conditional& condition);
427 qboolean CondMuzzleClear(Conditional& condition);
428 qboolean CondWeaponHasAmmo(Conditional& condition);
429 qboolean CondWeaponHasAmmoInClip(Conditional& condition);
430 qboolean CondReload(Conditional& condition);
431 qboolean CondWeaponsHolstered(Conditional& condition);
432 qboolean CondWeaponIsItem(Conditional& condition);
433 qboolean CondNewWeaponIsItem(Conditional& condition);
434 qboolean CondSemiAuto(Conditional& condition);
435 qboolean CondMinChargeTime(Conditional& condition);
436 qboolean CondMaxChargeTime(Conditional& condition);
437 qboolean CondPositionType(Conditional& condition);
438 qboolean CondMovementType(Conditional& condition);
439 qboolean CondRun(Conditional& condition);
440 qboolean CondUse(Conditional& condition);
441 qboolean CondTurnLeft(Conditional& condition);
442 qboolean CondTurnRight(Conditional& condition);
443 qboolean CondForward(Conditional& condition);
444 qboolean CondBackward(Conditional& condition);
445 qboolean CondStrafeLeft(Conditional& condition);
446 qboolean CondStrafeRight(Conditional& condition);
447 qboolean CondJump(Conditional& condition);
448 qboolean CondCrouch(Conditional& condition);
449 qboolean CondJumpFlip(Conditional& condition);
450 qboolean CondAnimDoneLegs(Conditional& condition);
451 qboolean CondAnimDoneTorso(Conditional& condition);
452 qboolean CondActionAnimDone(Conditional& condition);
453 qboolean CondCanTurn(Conditional& condition);
454 qboolean CondLeftVelocity(Conditional& condition);
455 qboolean CondRightVelocity(Conditional& condition);
456 qboolean CondBackwardVelocity(Conditional& condition);
457 qboolean CondForwardVelocity(Conditional& condition);
458 qboolean CondUpVelocity(Conditional& condition);
459 qboolean CondDownVelocity(Conditional& condition);
460 qboolean CondHasVelocity(Conditional& condition);
461 qboolean Cond22DegreeSlope(Conditional& condition);
462 qboolean Cond45DegreeSlope(Conditional& condition);
463 qboolean CondRightLegHigh(Conditional& condition);
464 qboolean CondLeftLegHigh(Conditional& condition);
465 qboolean CondCanFall(Conditional& condition);
466 qboolean CondAtDoor(Conditional& condition);
467 qboolean CondFalling(Conditional& condition);
468 qboolean CondMediumImpact(Conditional& condition);
469 qboolean CondHardImpact(Conditional& condition);
470 qboolean CondDead(Conditional& condition);
471 qboolean CondPainType(Conditional& condition);
472 qboolean CondPainDirection(Conditional& condition);
473 qboolean CondPainLocation(Conditional& condition);
474 qboolean CondPainThreshold(Conditional& condition);
475 qboolean CondKnockDown(Conditional& condition);
476 qboolean CondLegsState(Conditional& condition);
477 qboolean CondTorsoState(Conditional& condition);
478 qboolean CondAtUseAnim(Conditional& condition);
479 qboolean CondTouchUseAnim(Conditional& condition);
480 qboolean CondUseAnimFinished(Conditional& condition);
481 qboolean CondAtUseObject(Conditional& condition);
482 qboolean CondLoopUseObject(Conditional& condition);
483 qboolean CondPush(Conditional& condition);
484 qboolean CondPull(Conditional& condition);
485 qboolean CondLadder(Conditional& condition);
486 qboolean CondLookingUp(Conditional& condition);
487 qboolean CondTopOfLadder(Conditional& condition);
488 qboolean CondOnLadder(Conditional& condition);
489 qboolean CondCanClimbUpLadder(Conditional& condition);
490 qboolean CondCanClimbDownLadder(Conditional& condition);
491 qboolean CondCanGetOffLadderTop(Conditional& condition);
492 qboolean CondCanGetOffLadderBottom(Conditional& condition);
493 qboolean CondCanStand(Conditional& condition);
494 qboolean CondFacingUpSlope(Conditional& condition);
495 qboolean CondFacingDownSlope(Conditional& condition);
496 qboolean CondSolidForward(Conditional& condition);
497 qboolean CondStateName(Conditional& condition);
498 qboolean CondGroundEntity(Conditional& condition);
499 qboolean CondCheckHeight(Conditional& condition);
500 qboolean CondViewInWater(Conditional& condition);
501 qboolean CondDuckedViewInWater(Conditional& condition);
502 qboolean CondCheckMovementSpeed(Conditional& condition); // mohaas
503 qboolean CondAttackPrimary(Conditional& condition);
504 qboolean CondAttackSecondary(Conditional& condition);
505 qboolean CondAttackButtonPrimary(Conditional& condition);
506 qboolean CondAttackButtonSecondary(Conditional& condition);
507
508 //
509 // Added in OPM
510 //====
511 qboolean CondClientCommand(Conditional& condition);
512 qboolean CondVariable(Conditional& condition);
513#ifdef OPM_FEATURES
514 qboolean CondAnimDoneVM(Conditional& condition);
515 qboolean CondVMAnim(Conditional& condition);
516#endif
517 //====
518
519 // movecontrol functions
520 void StartPush(void);
521 void StartClimbLadder(void);
522 void StartUseAnim(void);
523 void StartLoopUseAnim(void);
524 void SetupUseObject(void);
525
526 void StartUseObject(Event *ev);
527 void FinishUseObject(Event *ev);
528 void FinishUseAnim(Event *ev);
529 void Turn(Event *ev);
530 void TurnUpdate(Event *ev);
531 void TurnLegs(Event *ev);
532
533 CLASS_PROTOTYPE(Player);
534
535 Player();
536 ~Player();
537 void Init(void);
538
539 void InitSound(void);
540 void InitEdict(void);
541 void InitClient(void);
542 void InitPhysics(void);
543 void InitPowerups(void);
544 void InitWorldEffects(void);
545 void InitMaxAmmo(void);
546 void InitWeapons(void);
547 void InitView(void);
548 void InitModel(void);
549 void InitState(void);
550 void InitHealth(void);
551 void InitInventory(void);
552 void InitDeathmatch(void);
553 void InitStats(void);
554 //=======
555 // Added in 2.30
556 bool QueryLandminesAllowed() const;
557 void EnsurePlayerHasAllowedWeapons();
558 void EquipWeapons();
559 //=======
560 void EquipWeapons_ver8();
561 void ChooseSpawnPoint(void);
562
563 void EndLevel(Event *ev);
564 void Respawn(Event *ev);
565
566 void SetDeltaAngles(void) override;
567 void setAngles(Vector ang) override;
568 void SetViewangles(Event *ev);
569 void GetViewangles(Event *ev);
570
571 void DoUse(Event *ev);
572 void Obituary(Entity *attacker, Entity *inflictor, int meansofdeath, int iLocation);
573 void Killed(Event *ev) override;
574 void Dead(Event *ev);
575 void Pain(Event *ev);
576
577 // ladder stuff
578 void AttachToLadder(Event *ev);
579 void UnattachFromLadder(Event *ev);
580 void TweakLadderPos(Event *ev);
581 void EnsureOverLadder(Event *ev);
582 void EnsureForwardOffLadder(Event *ev);
583 void TouchStuff(pmove_t *pm);
584
585 //====
586 // Added in 2.30
587 void EventForceLandmineMeasure(Event *ev) override;
588 str GetCurrentDMWeaponType() const;
589 //====
590
591 void GetMoveInfo(pmove_t *pm);
592 void SetMoveInfo(pmove_t *pm, usercmd_t *ucmd);
593 pmtype_t GetMovePlayerMoveType(void);
594 void ClientMove(usercmd_t *ucmd);
595 void VehicleMove(usercmd_t *ucmd);
596 void TurretMove(usercmd_t *ucmd);
597 void CheckMoveFlags(void);
598 void ClientInactivityTimer(void);
599 void ClientThink(void) override;
600 void UpdateEnemies(void);
601
602 void InitLegsStateTable(void);
603 void InitTorsoStateTable(void);
604 void LoadStateTable(void);
605 void ResetState(Event *ev);
606 void EvaluateState(State *forceTorso = NULL, State *forceLegs = NULL);
607
608 void CheckGround(void) override;
609 void UpdateViewAngles(usercmd_t *cmd);
610 qboolean AnimMove(Vector& move, Vector *endpos = NULL);
611 qboolean TestMove(Vector& pos, Vector *endpos = NULL);
612 qboolean CheckMove(Vector& move, Vector *endpos = NULL);
613
614 float CheckMoveDist(Vector& delta);
615 float TestMoveDist(Vector& pos);
616
617 void EndAnim_Legs(Event *ev);
618 void EndAnim_Torso(Event *ev);
619 void EndAnim_Pain(Event *ev);
620 void SetPartAnim(const char *anim, bodypart_t slot = legs);
621 void StopPartAnimating(bodypart_t part);
622 void PausePartAnim(bodypart_t part);
623 int CurrentPartAnim(bodypart_t part) const;
624 void AdjustAnimBlends(void);
625 void PlayerAnimDelta(float *vDelta);
626 void TouchedUseAnim(Entity *ent);
627
628 void SelectPreviousItem(Event *ev);
629 void SelectNextItem(Event *ev);
630 void SelectPreviousWeapon(Event *ev);
631 void SelectNextWeapon(Event *ev);
632 void DropCurrentWeapon(Event *ev);
633 void PlayerReload(Event *ev);
634 void EventCorrectWeaponAttachments(Event *ev);
635
636 void GiveCheat(Event *ev);
637 void GiveWeaponCheat(Event *ev);
638 void GiveAllCheat(Event *ev);
639 void GiveNewWeaponsCheat(Event *ev); // Added in 2.0
640 void GodCheat(Event *ev);
641 void FullHeal(Event *ev);
642 void NoTargetCheat(Event *ev);
643 void NoclipCheat(Event *ev);
644 void Kill(Event *ev);
645 void SpawnEntity(Event *ev);
646 void SpawnActor(Event *ev);
647 void ListInventoryEvent(Event *ev);
648 void EventGetIsEscaping(Event *ev);
649 void EventJailEscapeStop(Event *ev);
650 void EventJailAssistEscape(Event *ev);
651 void EventJailEscape(Event *ev);
652 void EventTeleport(Event *ev);
653 void EventFace(Event *ev);
654 void EventCoord(Event *ev);
655 void EventTestAnim(Event *ev);
656
657 void GameVersion(Event *ev);
658
659 void EventSetSelectedFov(Event *ev);
660 void SetSelectedFov(float newFov);
661 void GetPlayerView(Vector *pos, Vector *angle);
662
663 float CalcRoll(void);
664 void WorldEffects(void);
665 void AddBlend(float r, float g, float b, float a);
666 void CalcBlend(void) override;
667 void DamageFeedback(void);
668
669 void CopyStats(Player *player);
670 void UpdateStats(void);
671 void UpdateMusic(void);
672 void UpdateReverb(void);
673 void UpdateMisc(void);
674
675 void SetReverb(str type, float level);
676 void SetReverb(int type, float level);
677 void SetReverb(Event *ev);
678
679 Camera *CurrentCamera(void);
680 void SetCamera(Camera *ent, float switchTime);
681 void CameraCut(void);
682 void CameraCut(Camera *ent);
683
684 void SetPlayerView(
685 Camera *camera,
686 Vector position,
687 float cameraoffset,
688 Vector ang,
689 Vector vel,
690 float camerablend[4],
691 float camerafov
692 );
693 void SetupView(void);
694
695 void ProcessPmoveEvents(int event);
696
697 void PlayerAngles(void);
698 void FinishMove(void);
699 void EndFrame(void) override;
700
701 void TestThread(Event *ev);
702 Vector EyePosition(void) override;
703 Vector GunTarget(bool bNoCollision, const vec3_t position, const vec3_t forward) override;
704
705 void GotKill(Event *ev);
706 void SetPowerupTimer(Event *ev);
707 void UpdatePowerupTimer(Event *ev);
708
709 void WhatIs(Event *ev);
710 void ActorInfo(Event *ev);
711 void Taunt(Event *ev);
712
713 void ChangeMusic(const char *current, const char *fallback, qboolean force);
714 void ChangeMusicVolume(float volume, float fade_time);
715 void RestoreMusicVolume(float fade_time);
716
717 void Archive(Archiver& arc) override;
718 void ArchivePersistantData(Archiver& arc);
719
720 void KillEnt(Event *ev);
721 void RemoveEnt(Event *ev);
722 void KillClass(Event *ev);
723 void RemoveClass(Event *ev);
724
725 void addOrigin(Vector org) override;
726
727 void Jump(Event *ev);
728 void JumpXY(Event *ev);
729
730 void SetViewAngles(Vector angles) override;
731 void SetTargetViewAngles(Vector angles) override;
732
733 Vector GetViewAngles(void) override { return v_angle; };
734
735 void SetFov(float newFov);
736 float GetFov() const;
737
738 void ToggleZoom(int iZoom);
739 void ZoomOff(void);
740 void ZoomOffEvent(Event *ev);
741 qboolean IsZoomed(void);
742 void SafeZoomed(Event *ev);
743 void DumpState(Event *ev);
744 void ForceLegsState(Event *ev);
745 void ForceTorsoState(Event *ev);
746
747 Vector GetAngleToTarget(Entity *ent, str tag, float yawclamp, float pitchclamp, Vector baseangles);
748
749 void AutoAim(void);
750 void AcquireTarget(void);
751 void RemoveTarget(Entity *ent_to_remove);
752
753 void DebugWeaponTags(int controller_tag, Weapon *weapon, str weapon_tagname);
754 void NextPainTime(Event *ev);
755 void SetTakePain(Event *ev);
756
757 void SetMouthAngle(Event *ev);
758
759 void EnterVehicle(Event *ev);
760 void ExitVehicle(Event *ev);
761 void EnterTurret(TurretGun *ent);
762 void EnterTurret(Event *ev);
763 void ExitTurret(void);
764 void ExitTurret(Event *ev);
765 void Holster(Event *ev);
766 void HolsterToggle(Event *ev);
767
768 void RemoveFromVehiclesAndTurretsInternal(void); // Added in 2.30
769 void RemoveFromVehiclesAndTurrets(void);
770 void WatchActor(Event *ev);
771 void StopWatchingActor(Event *ev);
772 painDirection_t Pain_string_to_int(str pain);
773
774 inline Vector GetVAngles(void) { return v_angle; }
775
776 void GetStateAnims(Container<const char *> *c) override;
777 void VelocityModified(void) override;
778 int GetKnockback(int original_knockback, qboolean blocked);
779 int GetMoveResult(void);
780 void ReceivedItem(Item *item) override;
781 void RemovedItem(Item *item) override;
782 void AmmoAmountChanged(Ammo *ammo, int inclip = 0) override;
783
784 void WaitForState(Event *ev);
785 void SkipCinematic(Event *ev);
786 void SetDamageMultiplier(Event *ev);
787 void LogStats(Event *ev);
788 void Loaded(void);
789 void PlayerShowModel(Event *ev);
790 void showModel(void) override;
791 void ResetHaveItem(Event *ev);
792
793 void ModifyHeight(Event *ev);
794 // Added in 2.40
795 void ModifyHeightFloat(Event *ev);
796
797 void SetMovePosFlags(Event *ev);
798 void GetPositionForScript(Event *ev);
799 void GetMovementForScript(Event *ev);
800 void EventStuffText(Event *ev);
801 void EventSetVoiceType(Event *ev);
802 void GetTeamDialogPrefix(str& outPrefix);
803 void PlayInstantMessageSound(const char *name);
804 void EventDMMessage(Event *ev);
805 //====
806 // Added in 2.30
807 str GetBattleLanguageCondition() const;
808 str GetBattleLanguageDirection() const;
809 str GetBattleLanguageLocation() const;
810 str GetBattleLanguageLocalFolks();
811 str GetBattleLanguageWeapon() const;
812 str GetBattleLanguageDistance() const;
813 str GetBattleLanguageDistanceMeters(float dist) const;
814 str GetBattleLanguageDistanceFeet(float dist) const;
815 str GetBattleLanguageTarget() const;
816 str TranslateBattleLanguageTokens(const char *string);
817 //====
818 void EventIPrint(Event *ev);
819 void EventGetUseHeld(Event *ev);
820 void EventGetFireHeld(Event *ev);
821 void EventGetPrimaryFireHeld(Event *ev);
822 void EventGetSecondaryFireHeld(Event *ev);
823 void Score(Event *ev);
824 void Join_DM_Team(Event *ev);
825 void Auto_Join_DM_Team(Event *ev);
826 void Leave_DM_Team(Event *ev);
827 teamtype_t GetTeam() const;
828 void SetTeam(teamtype_t team);
829 bool IsSpectator(void);
830 void BeginFight(void);
831 void EndFight(void);
832 void Spectator(void);
833 void Spectator(Event *ev);
834 void SetPlayerSpectate(bool bNext);
835 void SetPlayerSpectateRandom(void); // Added in 2.0
836 bool IsValidSpectatePlayer(Player *pPlayer);
837 void GetSpectateFollowOrientation(Player *pPlayer, Vector& vPos, Vector& vAng);
838 void UpdateStatus(const char *s);
839 void SetDM_Team(DM_Team *team);
840 DM_Team *GetDM_Team();
841 void WarpToPoint(Entity *spawnpoint);
842
843 void ArmorDamage(Event *ev) override;
844 void HUDPrint(const char *s);
845 void Disconnect(void);
846
847 // team stuff
848 int GetNumKills() const;
849 int GetNumDeaths() const;
850 void AddKills(int num);
851 void AddDeaths(int num);
852 void CallVote(Event *ev);
853 void Vote(Event *ev);
854 void RetrieveVoteOptions(Event *ev); // Added in 2.0
855 void EventPrimaryDMWeapon(Event *ev);
856 void EventSecondaryDMWeapon(Event *ev);
857 void ResetScore();
858 void DeadBody(Event *ev);
859 void Gib();
860 void WonMatch(void);
861 void LostMatch(void);
862 int GetMatchesWon() const;
863 int GetMatchesLost() const;
864
865 //====
866 // Added in 2.30
867 void GetIsSpectator(Event *ev);
868 void EventSetInJail(Event *ev);
869 bool IsInJail() const;
870 void EventGetInJail(Event *ev);
871 void GetNationalityPrefix(Event *ev);
872 //====
873 void GetIsDisguised(Event *ev);
874 void GetHasDisguise(Event *ev);
875 void SetHasDisguise(Event *ev);
876 void SetObjectiveCount(Event *ev);
877
878 void EventDMDeathDrop(Event *ev);
879 void EventStopwatch(Event *ev);
880 void KilledPlayerInDeathmatch(Player *killed, meansOfDeath_t meansofdeath);
881 void SetStopwatch(int iDuration, stopWatchType_t type = SWT_NORMAL);
882 void BeginTempSpectator(void);
883 void EndSpectator(void);
884
885 PlayerStart *GetLastSpawnpoint() const { return m_pLastSpawnpoint; }
886
887 void Stats(Event *ev);
888 void ArmWithWeapons(Event *ev); // Added in 2.30
889 void EventGetCurrentDMWeaponType(Event *ev); // Added in 2.30
890 void PhysicsOn(Event *ev);
891 void PhysicsOff(Event *ev);
892
893 void Think() override;
894 bool IsReady(void) const;
895
896 void EventGetReady(Event *ev);
897 void EventSetReady(Event *ev);
898 void EventSetNotReady(Event *ev);
899 void EventGetDMTeam(Event *ev);
900 void EventGetNetName(Event *ev); // Added in 2.30
901 void EventSetViewModelAnim(Event *ev);
902 void EventEnterIntermission(Event *ev);
903 void EventSetPerferredWeapon(Event *ev);
904
905 bool BlocksAIMovement();
906
907 //====
908 // Added in 2.0
909 void TickSprint();
910 float GetRunSpeed() const;
911 void FireWeapon(int number, firemode_t mode) override;
912 void SetInvulnerable();
913 void TickInvulnerable();
914 void SetVulnerable();
915 bool IsInvulnerable();
916 void CancelInvulnerable();
917 void InitInvulnerable();
918 void TickTeamSpawn();
919 bool ShouldForceSpectatorOnDeath() const;
920 bool HasVehicle() const override;
921 void setContentsSolid() override;
922 void UserSelectWeapon(bool bWait);
923 void PickWeaponEvent(Event *ev);
924 bool AllowTeamRespawn() const;
925 void EventUseWeaponClass(Event *ev) override;
926 void EventAddKills(Event *ev);
927 bool CanKnockback(float minHealth) const;
928 //====
929
930 //====
931 // Added in 2.30
932 void EventKillAxis(Event *ev);
933 void EventGetTurret(Event *ev);
934 void EventGetVehicle(Event *ev);
935 //====
936
937 void FindAlias(str& output, str name, AliasListNode_t **node);
938
939 bool HasVotedYes() const;
940 bool HasVotedNo() const;
941
942 //=============================
943 // Added in OPM
944 //=============================
945
946 void ResetClient();
947 qboolean CheckCanSwitchTeam(teamtype_t team);
948
949 qboolean ViewModelAnim(str anim, qboolean force_restart, qboolean bFullAnim);
950 virtual void Spawned(void);
951
952 void RemoveOwnedProjectiles();
953
954 void AddDeaths(Event *ev);
955 void AdminRights(Event *ev);
956 void BindWeap(Event *ev);
957 void Dive(Event *ev);
958 void EventSetTeam(Event *ev);
959 void FreezeControls(Event *ev);
960 void GetConnState(Event *ev);
961 void GetDamageMultiplier(Event *ev);
962 void GetKills(Event *ev);
963 void GetDeaths(Event *ev);
964 void GetKillHandler(Event *ev);
965 void GetMoveSpeedScale(Event *ev);
966 void GetLegsState(Event *ev);
967 void GetStateFile(Event *ev);
968 void GetTorsoState(Event *ev);
969 void GetUserInfo(Event *ev);
970 void Inventory(Event *ev);
971 void InventorySet(Event *ev);
972 void IsAdmin(Event *ev);
973 void JoinDMTeamReal(Event *ev);
974 void JoinDMTeam(Event *ev);
975 void LeanLeftHeld(Event *ev);
976 void LeanRightHeld(Event *ev);
977 void PlayLocalSound(Event *ev);
978 void RunHeld(Event *ev);
979 void SecFireHeld(Event *ev);
980 void SetAnimSpeed(Event *ev);
981 void SetKillHandler(Event *ev);
982 void SetSpeed(Event *ev);
983 void SetStateFile(Event *ev);
984 void HideEntity(Event *ev);
985 void ShowEntity(Event *ev);
986 void StopLocalSound(Event *ev);
987 void Userinfo(Event *ev);
988
989#ifdef OPM_FEATURES
990 void InitModelFps();
991 void ThinkFPS();
992 void EventGetViewModelAnim(Event *ev);
993 void EventGetViewModelAnimFinished(Event *ev);
994 void EventGetViewModelAnimValid(Event *ev);
995
996 void EventEarthquake(Event *ev);
997 void SetClientFlag(Event *ev);
998 void SetEntityShader(Event *ev);
999 void SetLocalSoundRate(Event *ev);
1000 void SetVMASpeed(Event *ev);
1001 void VisionGetNaked(Event *ev);
1002 void VisionSetBlur(Event *ev);
1003 void VisionSetNaked(Event *ev);
1004#endif
1005
1006 bool IsPrimaryWeaponValid() const;
1007
1008 void PostAnimate() override;
1009 void Postthink() override;
1010 void GibEvent(Event *ev);
1011 qboolean canUse();
1012 qboolean canUse(Entity *entity, bool requiresLookAt);
1013 int getUseableEntities(int *touch, int maxcount, bool requiresLookAt = true);
1014};
1015
1016inline void Player::Archive(Archiver& arc)
1017{
1018 str tempStr;
1019
1020 Sentient::Archive(arc);
1021
1022 arc.ArchiveInteger(&m_iPartSlot[0]);
1023 arc.ArchiveInteger(&m_iPartSlot[1]);
1024
1025 arc.ArchiveFloat(&m_fPartBlends[0]);
1026 arc.ArchiveFloat(&m_fPartBlends[1]);
1027 arc.ArchiveFloat(&partBlendMult[0]);
1028 arc.ArchiveFloat(&partBlendMult[1]);
1029
1030 arc.ArchiveString(&last_torso_anim_name);
1031 arc.ArchiveString(&last_leg_anim_name);
1032 arc.ArchiveString(&partAnim[0]);
1033 arc.ArchiveString(&partAnim[1]);
1034 arc.ArchiveString(&partOldAnim[0]);
1035 arc.ArchiveString(&partOldAnim[1]);
1036
1037 arc.ArchiveString(&m_sPerferredWeaponOverride);
1038
1039 arc.ArchiveBool(&animdone_Legs);
1040 arc.ArchiveBool(&animdone_Torso);
1041
1042 arc.ArchiveInteger(&m_iMovePosFlags);
1043 ArchiveEnum(movecontrol, movecontrol_t);
1044 arc.ArchiveInteger(&last_camera_type);
1045
1046 arc.ArchiveVector(&oldvelocity);
1047 arc.ArchiveVector(&old_v_angle);
1048 arc.ArchiveVector(&oldorigin);
1049 arc.ArchiveFloat(&animspeed);
1050 arc.ArchiveFloat(&airspeed);
1051
1052 arc.ArchiveVector(&m_vPushVelocity);
1053
1054 arc.ArchiveRaw(blend, sizeof(blend));
1055 arc.ArchiveFloat(&fov);
1056 arc.ArchiveFloat(&selectedfov);
1057 arc.ArchiveInteger(&m_iInZoomMode);
1058
1059 arc.ArchiveVector(&v_angle);
1060 arc.ArchiveVector(&m_vViewPos);
1061 arc.ArchiveVector(&m_vViewAng);
1062
1063 arc.ArchiveInteger(&buttons);
1064 arc.ArchiveInteger(&new_buttons);
1065 arc.ArchiveInteger(&server_new_buttons);
1066 arc.ArchiveFloat(&respawn_time);
1067
1068 arc.ArchiveInteger(&last_attack_button);
1069
1070 arc.ArchiveFloat(&damage_blood);
1071 arc.ArchiveFloat(&damage_alpha);
1072 arc.ArchiveVector(&damage_blend);
1073 arc.ArchiveVector(&damage_from);
1074 arc.ArchiveVector(&damage_angles);
1075 arc.ArchiveFloat(&damage_count);
1076 arc.ArchiveFloat(&next_painsound_time);
1077
1078 arc.ArchiveSafePointer(&camera);
1079 arc.ArchiveSafePointer(&actor_camera);
1080 arc.ArchiveSafePointer(&actor_to_watch);
1081
1082 arc.ArchiveBoolean(&actor_camera_right);
1083 arc.ArchiveBoolean(&starting_actor_camera_right);
1084
1085 arc.ArchiveInteger(&music_current_mood);
1086 arc.ArchiveInteger(&music_fallback_mood);
1087
1088 arc.ArchiveFloat(&music_current_volume);
1089 arc.ArchiveFloat(&music_saved_volume);
1090 arc.ArchiveFloat(&music_volume_fade_time);
1091
1092 arc.ArchiveInteger(&reverb_type);
1093 arc.ArchiveFloat(&reverb_level);
1094
1095 arc.ArchiveBoolean(&gibbed);
1096 arc.ArchiveFloat(&pain);
1097
1098 ArchiveEnum(pain_dir, painDirection_t);
1099 ArchiveEnum(pain_type, meansOfDeath_t);
1100
1101 arc.ArchiveInteger(&pain_location);
1102 arc.ArchiveBool(&take_pain);
1103 arc.ArchiveInteger(&nextpaintime);
1104
1105 arc.ArchiveFloat(&m_fHealRate);
1106
1107 arc.ArchiveBool(&knockdown);
1108 arc.ArchiveBool(&canfall);
1109 arc.ArchiveBool(&falling);
1110
1111 arc.ArchiveInteger(&feetfalling);
1112 arc.ArchiveVector(&falldir);
1113
1114 arc.ArchiveBool(&mediumimpact);
1115 arc.ArchiveBool(&hardimpact);
1116
1117 arc.ArchiveBoolean(&music_forced);
1118
1119 arc.ArchiveRaw(&last_ucmd, sizeof(usercmd_t));
1120 arc.ArchiveRaw(&last_eyeinfo, sizeof(usereyes_t));
1121
1122 arc.ArchiveFloat(&animheight);
1123
1124 arc.ArchiveVector(&yaw_forward);
1125 arc.ArchiveVector(&yaw_left);
1126
1127 arc.ArchiveSafePointer(&atobject);
1128 arc.ArchiveFloat(&atobject_dist);
1129 arc.ArchiveVector(&atobject_dir);
1130
1131 arc.ArchiveSafePointer(&toucheduseanim);
1132 arc.ArchiveInteger(&useanim_numloops);
1133 arc.ArchiveSafePointer(&useitem_in_use);
1134
1135 arc.ArchiveFloat(&move_left_vel);
1136 arc.ArchiveFloat(&move_right_vel);
1137 arc.ArchiveFloat(&move_backward_vel);
1138 arc.ArchiveFloat(&move_forward_vel);
1139 arc.ArchiveFloat(&move_up_vel);
1140 arc.ArchiveFloat(&move_down_vel);
1141 arc.ArchiveInteger(&moveresult);
1142
1143 arc.ArchiveFloat(&damage_multiplier);
1144
1145 arc.ArchiveString(&waitForState);
1146 arc.ArchiveInteger(&m_iNumObjectives);
1147 arc.ArchiveInteger(&m_iObjectivesCompleted);
1148
1149 for (int i = 0; i < MAX_TRAILS; i++) {
1150 arc.ArchiveVector(&mvTrail[i]);
1151 }
1152
1153 for (int i = 0; i < MAX_TRAILS; i++) {
1154 arc.ArchiveVector(&mvTrailEyes[i]);
1155 }
1156
1157 arc.ArchiveInteger(&mCurTrailOrigin);
1158 arc.ArchiveInteger(&mLastTrailTime);
1159
1160 arc.ArchiveInteger(&m_iNumHitsTaken);
1161 arc.ArchiveInteger(&m_iNumEnemiesKilled);
1162 arc.ArchiveInteger(&m_iNumObjectsDestroyed);
1163 arc.ArchiveInteger(&m_iNumShotsFired);
1164 arc.ArchiveInteger(&m_iNumHits);
1165 arc.ArchiveInteger(&m_iNumHeadShots);
1166 arc.ArchiveInteger(&m_iNumTorsoShots);
1167 arc.ArchiveInteger(&m_iNumLeftLegShots);
1168 arc.ArchiveInteger(&m_iNumRightLegShots);
1169 arc.ArchiveInteger(&m_iNumGroinShots);
1170 arc.ArchiveInteger(&m_iNumLeftArmShots);
1171 arc.ArchiveInteger(&m_iNumRightArmShots);
1172
1173 // Added in 2.30
1174 //====
1175 ArchiveEnum(m_jailstate, jailstate_t);
1176 arc.ArchiveString(&m_sDmPrimary);
1177 arc.ArchiveBool(&m_bIsInJail);
1178 //====
1179
1180 arc.ArchiveFloat(&m_fLastDeltaTime);
1181
1182 // Added in 2.0
1183 //====
1184 arc.ArchiveFloat(&m_fLastSprintTime);
1185 arc.ArchiveBool(&m_bHasJumped);
1186 //====
1187
1188 if (arc.Saving()) {
1189 if (currentState_Legs) {
1190 tempStr = currentState_Legs->getName();
1191 } else {
1192 tempStr = "NULL";
1193 }
1194 arc.ArchiveString(&tempStr);
1195
1196 if (currentState_Torso) {
1197 tempStr = currentState_Torso->getName();
1198 } else {
1199 tempStr = "NULL";
1200 }
1201 arc.ArchiveString(&tempStr);
1202 } else {
1203 statemap_Legs = GetStatemap(
1204 str(g_statefile->string) + "_Legs.st", (Condition<Class> *)m_conditions, &legs_conditionals, false
1205 );
1206 statemap_Torso = GetStatemap(
1207 str(g_statefile->string) + "_Torso.st", (Condition<Class> *)m_conditions, &torso_conditionals, false
1208 );
1209
1210 arc.ArchiveString(&tempStr);
1211 if (tempStr != "NULL") {
1212 currentState_Legs = statemap_Legs->FindState(tempStr);
1213 } else {
1214 currentState_Legs = NULL;
1215 }
1216 arc.ArchiveString(&tempStr);
1217 if (tempStr != "NULL") {
1218 currentState_Torso = statemap_Torso->FindState(tempStr);
1219 } else {
1220 currentState_Torso = NULL;
1221 }
1222
1223 for (int i = 1; i <= legs_conditionals.NumObjects(); i++) {
1224 Conditional *c = legs_conditionals.ObjectAt(i);
1225
1226 if (Q_stricmp(c->getName(), "PAIN") && !c->parmList.NumObjects()) {
1227 m_pLegsPainCond = c;
1228 break;
1229 }
1230 }
1231
1232 for (int i = 1; i <= torso_conditionals.NumObjects(); i++) {
1233 Conditional *c = torso_conditionals.ObjectAt(i);
1234
1235 if (Q_stricmp(c->getName(), "PAIN") && !c->parmList.NumObjects()) {
1236 m_pTorsoPainCond = c;
1237 break;
1238 }
1239 }
1240 }
1241
1242 if (arc.Loading()) {
1243 UpdateWeapons();
1244 SetViewAngles(v_angle);
1245 }
1246
1247 //
1248 // Added in OPM
1249 //
1250 arc.ArchiveBool(&m_bFrozen);
1251
1252 for (int i = 0; i < MAX_SPEED_MULTIPLIERS; i++) {
1253 arc.ArchiveFloat(&speed_multiplier[i]);
1254 }
1255
1256#ifdef OPM_FEATURES
1257 if (arc.Loading()) {
1258 InitModelFps();
1259 }
1260
1261 arc.ArchiveBool(&animDoneVM);
1262 arc.ArchiveFloat(&m_fVMAtime);
1263#endif
1264}
1265
1266inline Camera *Player::CurrentCamera(void)
1267{
1268 return camera;
1269}
1270
1271inline void Player::CameraCut(void)
1272{
1273 //
1274 // toggle the camera cut bit
1275 //
1276 client->ps.camera_flags = ((client->ps.camera_flags & CF_CAMERA_CUT_BIT) ^ CF_CAMERA_CUT_BIT)
1277 | (client->ps.camera_flags & ~CF_CAMERA_CUT_BIT);
1278}
1279
1280inline void Player::CameraCut(Camera *ent)
1281{
1282 if (ent == camera) {
1283 // if the camera we are currently looking through cut, than toggle the cut bits
1284 CameraCut();
1285 }
1286}
1287
1288inline void Player::SetCamera(Camera *ent, float switchTime)
1289{
1290 camera = ent;
1291 client->ps.camera_time = switchTime;
1292 if (switchTime <= 0.0f) {
1293 CameraCut();
1294 }
1295}
Definition ammo.h:41
Definition archive.h:86
Definition camera.h:181
Definition characterstate.h:82
Definition g_local.h:81
Definition dm_manager.h:38
Definition item.h:47
Definition playerstart.h:34
Definition player.h:129
Definition scriptdelegate.h:100
Definition gamescript.h:165
Definition characterstate.h:291
Definition characterstate.h:208
Definition clientvote.h:28
Definition weapon.h:99
Definition uiconsole.h:28
Definition characterstate.h:76
Definition bg_public.h:287
Definition player.h:117