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