⭐ 欢迎来到虫虫下载站! | 📦 资源下载 📁 资源专辑 ℹ️ 关于我们
⭐ 虫虫下载站

📄 playerobj.h

📁 Blood 2全套源码
💻 H
字号:

#ifndef __PLAYEROBJ_H__
#define __PLAYEROBJ_H__


#include <math.h>
#include "serverobj_de.h"
#include "engineobjects_de.h"
#include "BaseCharacter.h"
#include "SharedDefs.h"
#include "GameWeapons.h"
//#include "gib.h"
#include "AI_Shared.h"
#include "Music.h"
#include "SharedMovement.h"
#include "CVarTrack.h"
#include "SoundTypes.h"

enum ModelSize { MS_NORMAL=0, MS_SMALL, MS_LARGE, NUM_MODELSIZES };

// Player movement states, used to track animations playing.
#define PMOVE_NONE			0
#define PMOVE_IDLE			1
#define PMOVE_WALK			2
#define PMOVE_RUN			3
#define PMOVE_STRAFERIGHT	4
#define PMOVE_STRAFELEFT	5

#define PMOVE_JUMP			6
#define PMOVE_CROUCH		7
#define PMOVE_CRAWL			8
#define PMOVE_FIRE_STAND	9
#define PMOVE_FIRE_WALK		10
#define PMOVE_FIRE_RUN		11
#define PMOVE_FIRE_JUMP		12
#define PMOVE_FIRE_CROUCH	13
#define PMOVE_FIRE_CRAWL	14
#define PMOVE_HUMILIATION	15
#define PMOVE_DEAD			16


// Control flags
#define  CTRLFLAG_RUN			0x0001
#define  CTRLFLAG_JUMP			0x0002
#define  CTRLFLAG_CROUCH		0x0004
#define  CTRLFLAG_FORWARD		0x0008
#define  CTRLFLAG_BACKWARD		0x0010
#define  CTRLFLAG_LEFT			0x0020
#define  CTRLFLAG_RIGHT			0x0040
#define  CTRLFLAG_STRAFE		0x0080
#define  CTRLFLAG_STRAFERIGHT	0x0100	
#define  CTRLFLAG_STRAFELEFT	0x0200
#define  CTRLFLAG_FIRE			0x0400
#define  CTRLFLAG_ALTFIRE		0x0800
#define  CTRLFLAG_GRAB			0x1000
#define  CTRLFLAG_TAUNT			0x2000

#define PU_MAXSTACK				15
enum PowerupType
{
	PU_NONE = -1,
	PU_INVULNERABLE,
	PU_INVISIBLE,
	PU_TRIPLEDAMAGE,
	PU_INCORPOREAL,
	PU_SILENT,
	PU_MAXTYPES
};

class AI_Shared;

class CPlayerObj : public CBaseCharacter
{
	public:
		CPlayerObj();
		virtual		~CPlayerObj();

		void		SetClient(HCLIENT hClient) { m_hClient = hClient; m_InventoryMgr.SetClient(hClient); }
		HCLIENT		GetClient() const		{ return m_hClient; }
		DBYTE		GetCharacter() const	{ return m_nCharacter; }
		void		SetCharacter(DBYTE nCharacter);
		DBOOL		IsActivated() { return m_bActivated; }

		void		PostPropRead(ObjectCreateStruct *pStruct);
		DBOOL		InitialUpdate(int nData);
		DBOOL		Update(DVector *pMovement);
		void		ObjectTouch(HOBJECT hObj, DFLOAT fData);
		void		ObjectCrush(HOBJECT hObj, DFLOAT fData);
		void		OnMessage(DBYTE messageID, HMESSAGEREAD hMessage);
		void		OnCommandOn(DDWORD commandNum);
		void		OnCommandOff(DDWORD commandNum);
		void		OnStringKey(ArgList* pArgList);
		void		SendWonkyVisionMsg(DFLOAT fTime, DBOOL bNoMove);
		void		SendFadeMsg(DBYTE byFadeIn);
		void		SendVoiceMessage(TheVoice eVoiceType, D_WORD wIndex, DBYTE nAttackerCharacter, DBYTE nVictimCharacter);
		void		SendMessageToClient(DBYTE messageID);
		void		SendConsoleMessage(char *msg);
		HSTRING		GetPlayerName() { return m_hstrPlayerName; }
		void		GetPlayerRotation(DRotation *rRotation) { ROT_COPY(*rRotation, m_rRotation); }
		void		GetPlayerForward(DVector *vForward) { VEC_COPY(*vForward, m_vForward); }
		DFLOAT		GetEyeLevel() { return m_fEyeLevel; }
		int			GetFrags() { return m_Frags; }
		void		SetFrags(int nFrags);
		DBOOL		IsFemale() { return (m_nCharacter == CHARACTER_OPHELIA || m_nCharacter == CHARACTER_GABREILLA); }
		void		AddFrag(HSTRING hstrPlayerName, CPlayerObj* pVictim);
		int			GetMeleeKills() { return m_MeleeKills; }
		void		AddMeleeKill() { m_MeleeKills++; }
		void		RemoveFrag();
		void		SetZoomMode(DBOOL bZoom) { m_bZoomView = bZoom; m_nZoomType = 0; SendMessageToClient(SMSG_ZOOMVIEW); }
		void		SetZoomMode(DBOOL bZoom, DBYTE nType) { m_bZoomView = bZoom; m_nZoomType = nType; SendMessageToClient(SMSG_ZOOMVIEW); }
		DBOOL		GetZoomMode( ) { return m_bZoomView; }
		DBOOL		HasSoulStealingBinding() { return m_bBindingSoulStealing; }
		void		Respawn();
		void		GoToStartPoint();
		ContainerCode GetContainer() { return m_eContainerCode; }
		DDWORD		GetTeamID() { return(m_dwTeamID); }
		void		UpdateTeamID();

		DBOOL		IsPowerupActive(int nIndex)	{ return m_bPowerupActivated[nIndex]; }
		DBOOL		IsPlayerDamageOk(CPlayerObj* pPlayer2);
		DBOOL		IsPlayerDamageOk(HOBJECT hPlayer2);


		// Player reset functions
		void		ResetPlayerInventory();

		// ADDED BY ANDY 9-20-98
		void		Slow(DFLOAT time);

		// For adding more bombs to the remote list
		void		AddRemoteBomb(CProjectile* pBomb);
		void		RemoveRemoteBomb(CProjectile* pBomb);

		// Set the orb object
		void		SetOrbObject(HOBJECT hObj);

		// Added by Loki 10/06/1998
		void		Imprison(DBOOL bImprison) { m_bImprisoned = bImprison; }

		// Added by Loki 10/21/1998
		DBOOL		IsImprisoned() { return m_bImprisoned; }

		// Added by Goble 10/11/98
		DBOOL		PlayVoiceGroupEventOnClient(int iGroupEvent, DBOOL bSinglePlayerOnly = DFALSE);
		DBOOL		PlayVoiceUniqueEventOnClient(int iUniqueEvent);
		void		PlayWeaponVoiceSoundOnClient(int nWeaponType);

		void		ResetIdleTime() { m_fIdleTime = 0; }

		void		SetClientSaveData( HMESSAGEREAD hClientSaveData );

		HOBJECT		m_hCameraObj;

		DLink		m_CabalLink;
		DLink		m_MonsterLink;

		void		SetMoveVel(float vel)		{ChangeSpeedsVar(m_fMoveVel, vel);}
//		void		SetWalkVel(float vel)		{ChangeSpeedsVar(m_fWalkVel, vel);}
		void		SetJumpVel(float vel)		{ChangeSpeedsVar(m_fJumpVel, vel);}
//		void		SetSwimVel(float vel)		{ChangeSpeedsVar(m_fSwimVel, vel);}
		void		SetMoveMul(float vel)		{ChangeSpeedsVar(m_fMoveMultiplier, vel);}
		void		SetMoveAccelMul(float vel)	{ChangeSpeedsVar(m_fMoveAccelMultiplier, vel);}
		void		SetJumpVelMul(float vel)	{ChangeSpeedsVar(m_fJumpMultiplier, vel);}
		void		SetLadderVel(float vel)		{ChangeSpeedsVar(m_fLadderVel, vel);}

		void		HandleWeaponFireMessage(HMESSAGEREAD hRead);
		void		HandleWeaponStateMessage(HMESSAGEREAD hRead);
		void		HandleWeaponSoundMessage(HMESSAGEREAD hRead);
		void		DoWeaponChange(DBYTE nWeaponId);

		void		GrabFlag(HOBJECT hFlag);
		void		GiveFlag(HOBJECT hFlagStand);
		void		DropFlag(DBOOL bNotifyClient = DTRUE);

#ifdef _ADDON
		void		SoccerGoal( DBYTE nTeamID );
#endif //_ADDON

		DBOOL		IsOnGround( ) { return m_bOnGround; }
		DBOOL		IsInSlowDeath() { return(m_bInSlowDeath); }
		DBOOL		IsDead() { return(m_bDead); }

		void		DoDeath(DBOOL bHumiliation = DFALSE);
		void		TweakSaveValuesForCharacterChange(int nNewCharacter);

	protected :

		void ChangeSpeedsVar(float &var, float val)
		{
			if(var != val)
				m_PStateChangeFlags |= PSTATE_SPEEDS;
			var = val;
		}


		DDWORD		EngineMessageFn(DDWORD messageID, void *pData, DFLOAT lData);
		DDWORD		ObjectMessageFn(HOBJECT hSender, DDWORD messageID, HMESSAGEREAD hRead);
	
	private:

		void		ToggleSpectatorMode();
		void		UpdateControlFlags();
		DBOOL		HandleMovement();
		DBOOL		HandleFiring();
		void		UpdateAnim();
		void		ValidateAttributes();
		void		ProcessCheat(DBYTE nCheatCode, DBOOL bState);
		void		SetPowerupValue(DBYTE nType);
		void		ClearPowerupValues();
		void		AddPowerup(HOBJECT hSender, DBYTE nType, DFLOAT fValue = 0);
		void		CheckPowerups();
		void		ResetPowerups();
		void		CheckItemsAndSpells();
		DBOOL		ProcessTriggerMsg(HOBJECT hSender, HMESSAGEREAD hRead);
		void		GrabObject();
		DBOOL		SetAnimation(DDWORD dwAni, DBOOL bLooping);
		void		SetForceUpdateList(ForceUpdate* pFU);
		void		UpdateFragStatus();
		void		IdleTime();
		void		DoWalkAnim();
		void		DoRunAnim();
		void		DoJumpAnim();
		void		DoCrouchAnim();
		void		DoCrawlAnim();
		void		DoFireStandAnim();
		void		DoFireWalkAnim();
		void		DoFireRunAnim();
		void		DoFireJumpAnim();
		void		DoFireCrouchAnim();
		void		DoFireCrawlAnim();
		void		DoStrafeRightAnim();
		void		DoStrafeLeftAnim();
		void		DoHumiliationAnim();
		void		DoTaunt();
		DBOOL		CreateCorpse();
		DBOOL		CreateGibs(DVector vDir, int nNumGibs, int nType, DFLOAT fDamage);
		void		UpdateStats( );

		DBOOL		PlayPlayerSound(char* szSound, DFLOAT fRadius, DBYTE byVolume, DBOOL bStream, DBYTE nPriority = SOUNDPRIORITYMOD_HIGH );
		DBOOL		GetFootstepSound(char* szBuf);
		DBOOL		GetLandingSound(char* szBuf);
		void		PlayJumpSound();
		
		void		Save(HMESSAGEWRITE hWrite, DDWORD dwSaveFlags);
		void		Load(HMESSAGEREAD hWrite, DDWORD dwLoadFlags);

		void		UpdateAirLevel();
		void		HandleDeath();

		void		StartPowerupSound( PowerupType ePowerupType );
		void		EndPowerupSound( PowerupType ePowerupType );
		void		SetMultiplayerAmmo();
		void		UpdateClientPhysics();
		void		HandlePlayerPositionMessage(HMESSAGEREAD hRead);
		void		TeleportClientToServerPos();
		void SetOnGround(DBOOL bOn)		
		{
			m_bLastOnGround = m_bOnGround;
			m_bOnGround		= bOn;
		}
		HMESSAGEWRITE StartMessageToClient( DBYTE msgID );


	private:
		// Member Variables
		// Structure to hold various data items sent by the client
		DFLOAT		m_fPitch;
		DFLOAT		m_fYaw;
		DRotation	m_rRotation;	// Current view rotation
		DVector		m_vForward;		// Forward vector derived from rotation
		DVector		m_vGunMuzzlePos;
		DVector		m_vlGunMuzzlePos;
		HSTRING		m_hstrPlayerName;
		DBYTE		m_byFlags;
		DFLOAT		m_fMouseAxis0;
		DFLOAT		m_fMouseAxis1;

        AI_Shared   AIShared;       // Shared functions
	
		// animation stuff
		DBYTE		m_byMoveState;
		int			m_nInjuredLeg;
		int			m_nNodeHit;
		int			m_nCorpseType;
		int			m_nSideHit;
		DFLOAT		m_fAttackLoadTime;
		DFLOAT		m_fLoadTimeStart;

		DVector		m_vScale;			//scale
        
		DBOOL		m_bZoomView;
		DBYTE		m_nZoomType;
		DDWORD		m_CurGun;			// which gun are we currently using?
		int			m_CurGunSlot;
		DBYTE		m_CurItem;
		DBYTE		m_DropGunSlot;
		DBYTE		m_DropItemSlot;
		DBOOL		m_bFirstUpdate;
		DBOOL		m_bDemoPlayback;
		DDWORD		m_dwControlFlags;

		DBOOL		m_bFiringWeapon;	// Are we currently firing?
		DBOOL		m_bAnimating;		// Is the model playing an animation?

		DFLOAT		m_fEyeLevel;		// Player's viewpoint
		DBOOL		m_bLastCrouchCommand;
		DBOOL		m_bForcedCrouch;		// Forced to crouch by geometry
		DBOOL		m_bLastJumpCommand;
		DBOOL		m_bFalling;
		DBOOL		m_bServerFalling;
		DFLOAT		m_startFall;
		DFLOAT		m_startIdle;
		DFLOAT		m_fMinFallPos;
		DFLOAT		m_fMaxFallPos;

		HCONVAR		m_hPlrPosVar;

		DBOOL		m_bSlowMode;
		DFLOAT		m_fSlowTime;

		// Remote bombs list
		ObjectList	*m_pBombList;
		HOBJECT		m_hOrbObj;

		int			m_Frags;
		int			m_MeleeKills;
		DDWORD		m_nLastHitPoints;
		DDWORD		m_nLastDamage;
		DDWORD		m_nLastAmmo;
		DDWORD		m_nLastAltAmmo;
		DDWORD		m_nLastArmor;
		DDWORD		m_nLastFocus;

		DBYTE		m_nCharacter;	// Caleb, Ophelia, Ishmael, Gabriella
		DBYTE		m_nSkin;
		DBYTE		m_nAttribStrength;
		DBYTE		m_nAttribSpeed;
		DBYTE		m_nAttribResistance;
		DBYTE		m_nAttribMagic;
	
		DBYTE		m_nBindingStrength;
		DBYTE		m_nBindingSpeed;
		DBYTE		m_nBindingResistance;
		DBYTE		m_nBindingMagic;
		DBOOL		m_bBindingConstitution;
		DBOOL		m_bBindingBlending;
		DBOOL		m_bBindingSoulStealing;
		DBOOL		m_bBindingRegeneration;
		DFLOAT		m_fBindingRegenPeriod;
		DBOOL		m_bServerRegeneration;
		DFLOAT		m_fServerRegenPeriod;
		DBOOL		m_bBindingQuickness;
		DBOOL		m_bBindingIncreasedDamage;
		DBOOL		m_bBindingImpactResistance;

		DFLOAT		m_fBindingRegenTime;
		DFLOAT		m_fServerRegenTime;

		DBOOL		m_bSpectatorMode;
		HCLIENT		m_hClient;

        DFLOAT		m_fSmellTime;       // next smell time
        DFLOAT		m_fSmellDelay;      // Delay between smell drops
	
		DBOOL		m_bDead;
		DBOOL		m_bMovementBlocked;
		DFLOAT		m_fDeathTimer;
		DBOOL		m_bInSlowDeath;
		DFLOAT		m_fSlowDeathSafeTimer;
		DFLOAT		m_fSlowDeathStayTimer;

		// Added by Loki on 10/06/1998 - for Undead Gideon
		DBOOL		m_bImprisoned;
		DFLOAT		m_fImprisonStart;
		DFLOAT		m_fImprisonLength;

		DBOOL		m_bBurning;
		DFLOAT		m_fBurningTime;

		DBYTE		m_byAirborneCount;	// Count frames that I'm in the air

		// Powerup stuff...

		DBOOL		m_bPowerupActivated[PU_MAXTYPES];

		DFLOAT		m_fNighInvulnerableTime;
		DFLOAT		m_fInvisibleTime;
		DFLOAT		m_fTripleDamageTime;
		DFLOAT		m_fIncorporealTime;
		DFLOAT		m_fSilentTime;

		PowerupType m_ePowerupSoundStack[PU_MAXSTACK];
		DBYTE		m_nPowerupSoundStackPos;
		HSOUNDDE	m_hPowerupStartSound;
		HSOUNDDE	m_hPowerupEndSound;
		HSOUNDDE	m_hPowerupLoopSound;


		DBYTE		m_nStatsFlags;

		HSTRING		m_hstrTrigger;

		DVector		m_vLastPos;
		DVector		m_vLastVel;

		HOBJECT		m_hEnemyAttach;

		// Music
		CMusic		m_Music;

		DBOOL		m_bActivated;

		// Sound
		HSOUNDDE	m_hCurSound;
		HSOUNDDE	m_hWeapSound;

		// Multiplayer stuff
		HSTRING		m_hstrWhoKilledMeLast;
		HSTRING		m_hstrWhoIKilledLast;

		DFLOAT		m_fOldAirLevel;
		DFLOAT		m_fAirLevel;

		SurfaceType	m_eLastSurface;

		DBOOL		m_bSwimmingJump;
		DBOOL		m_bCanSwimJump;

		DBOOL		m_bNextFootstepLeft;
		DBOOL		m_bDisableFootsteps;

		// Idle stuff
		DFLOAT		m_fIdleTime;

		// Ping
		DFLOAT		m_fNextPingTime;

		// Save game stuff...
		HMESSAGEREAD m_hClientSaveData;

		HOBJECT		m_CurContainers[MAX_TRACKED_CONTAINERS];
		DDWORD		m_nCurContainers;
		DDWORD		m_PStateChangeFlags;	// Which things need to get sent to client.
		CVarTrack	m_LeashLenTrack;
		float		m_fLeashLen;
		DFLOAT		m_fBaseMoveAccel;			// The base (starting) move acceleration
		DFLOAT		m_fLadderVel;				// How fast we swim
//		DFLOAT		m_fSwimVel;					// How fast we swim
		DFLOAT		m_fMoveVel;					// How fast we run
//		DFLOAT		m_fWalkVel;					// How fast we walk
		DFLOAT		m_fJumpVel;					// How fast we jump
		DFLOAT		m_fDimsScale[NUM_MODELSIZES];	// Normal, small, large scale value

		DFLOAT		m_fMoveMultiplier;
		DFLOAT		m_fMoveAccelMultiplier;
		DFLOAT		m_fJumpMultiplier;
		DBYTE		m_byClientMoveCode;
		DBOOL		m_bOnGround;
		DBOOL		m_bLastOnGround;

		// Team stuff...
		DDWORD		m_dwTeamID;

		// Capture the flag stuff...
		HOBJECT		m_hFlagObject;
		HATTACHMENT	m_hFlagAttach;

		DBOOL		m_bDoorPush;
		DVector		m_vDoorPush;

		// To let the server know if the player is in input mode on the client
		DBOOL		m_bInputMode;

		DBOOL		m_bExternalCamera;

		// List to keep track of attached objects, like the seeing eye
		DList		m_AttachedObjectsList;

		// Time to wait until before teleporting server object to client object position
		float		m_fTeleportTime;
};


struct CharacterValues
{
	char*	szName;
	char*	szModelName;
	char*	szSkinName;
	DFLOAT	fHeightStanding;
	DFLOAT	fHeightCrouching;
	DFLOAT	fHeightDead;
	DFLOAT	fEyeLevelStanding;
	DFLOAT	fEyeLevelCrouching;
	DFLOAT	fEyeLevelDead;
};


// Provide a global so that the start point is known.
extern char msgbuf[255];
void BPrint(char *);

#endif  // __PLAYEROBJ_H__

⌨️ 快捷键说明

复制代码 Ctrl + C
搜索代码 Ctrl + F
全屏模式 F11
切换主题 Ctrl + Shift + D
显示快捷键 ?
增大字号 Ctrl + =
减小字号 Ctrl + -