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