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