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

📄 playerobj.cpp

📁 Blood 2全套源码
💻 CPP
📖 第 1 页 / 共 5 页
字号:
//----------------------------------------------------------
//
// MODULE  : PLAYEROBJ.CPP
//
// PURPOSE : The Player Object.
//
// CREATED : 7/16/97 11:34:30 AM
//
//----------------------------------------------------------

// Includes....
#include <stdio.h>
#include <mbstring.h>
#include "serverobj_de.h"
#include "BaseCharacter.h"
#include "PlayerObj.h"
#include "Commands.h"
#include "BloodServerShell.h"
#include "ObjectUtilities.h"
#include "GameInvItems.h"
#include "GameStartPoint.h"
#include "ClientServerShared.h"
#include "PhysicalAttributes.h"
#include "Trigger.h"
#include "ChosenSounds.h"
#include "SParam.h"
#include "CameraObj.h"
#include "smellhint.h"
#include "VoiceMgrDefs.h"
#include "ClientGibFX.h"
#include "ai_mgr.h"
#include <windows.h>
#include "RotatingDoor.h"
#include "SharedMovement.h"
#include "VolumeBrush.h"
#include "Physics_lt.h"
#include "TeamMgr.h"
#include "FlagObjects.h"
#include "SoundTypes.h"

#define ALPHA_NORMAL		1.0f
#define ALPHA_CLOAKED		0.99f
#define ALPHA_INVISIBLE		0.08f

// Binding defines
#define	SERVER_REGEN_TIME			4.0f
#define	SERVER_REGEN_HEALPOINTS	1
#define	BINDING_REGEN_TIME			4.0f
#define	BINDING_REGEN_HEALPOINTS	1
#define BINDING_INCREASE_DAMAGE_AMT	1.2f		
#define BINDING_QUICKNESS_FACTOR	0.5f

#define PINGPERIOD			0.5f

#define DEFAULT_LEASHLEN	450

#define TELEPORTPERIOD		3.0f

#define DEFAULT_JUMPVEL		600.0f


#define DEFAULT_BULLETS		50

CPlayerObj* g_pPlayerObj = DNULL;

BOOL	g_bLevelChangeCharacter = DFALSE;
int		g_nLevelChangeCharacter = CHARACTER_CALEB;

// Defines....
CharacterValues gCharacterValues[MAX_CHARACTERS] = {
	// Caleb
	{
		"Caleb",
		"Models\\Characters\\Caleb.abc",
		"Skins\\Characters\\Caleb1.dtx",
		82.0f,	// Standing height
		26.0f,	// Crouching height
		16.0f,	// Dead Height
		36.0f,	// Standing eyelevel
		12.0f,	// Crouching eyelevel
		0.0f	// dead eyelevel
	},
	// Ophelia
	{
		"Ophelia",
		"Models\\Characters\\Ophelia.abc",
		"Skins\\Characters\\Ophelia.dtx",
		76.0f,	// Standing height
		26.0f,	// Crouching height
		16.0f,	// Dead Height
		32.0f,	// Standing eyelevel
		12.0f,	// Crouching eyelevel
		0.0f	// dead eyelevel
	},
	// Ishmael
	{
		"Ishmael",
		"Models\\Characters\\Ishmael.abc",
		"Skins\\Characters\\Ishmael.dtx",
		82.0f,	// Standing height
		26.0f,	// Crouching height
		16.0f,	// Dead Height
		36.0f,	// Standing eyelevel
		12.0f,	// Crouching eyelevel
		0.0f	// dead eyelevel
	},
	// Gabriella
	{
		"Gabriella",
		"Models\\Characters\\Gabriella.abc",
		"Skins\\Characters\\Gabriella.dtx",
		88.0f,	// Standing height
		26.0f,	// Crouching height
		16.0f,	// Dead Height
		42.0f,	// Standing eyelevel
		12.0f,	// Crouching eyelevel
		0.0f	// dead eyelevel
	}

#ifdef _ADDON
	,
	// Male Cultist
	{
		"M_Cultist",
		"Models_ao\\Characters_ao\\m_cultist1_bb.abc",
		"Skins\\Enemies\\m_cultist1.dtx",
		82.0f,	// Standing height
		26.0f,	// Crouching height
		16.0f,	// Dead Height
		36.0f,	// Standing eyelevel
		12.0f,	// Crouching eyelevel
		0.0f	// dead eyelevel
	},
	// Female Cultist
	{
		"F_Cultist",
		"Models_ao\\Characters_ao\\f_cultist1_bb.abc",
		"Skins\\Enemies\\f_cultist1.dtx",
		76.0f,	// Standing height
		26.0f,	// Crouching height
		16.0f,	// Dead Height
		32.0f,	// Standing eyelevel
		12.0f,	// Crouching eyelevel
		0.0f	// dead eyelevel
	},
	// Soul Drudge
	{
		"SoulDrudge",
		"Models_ao\\Characters_ao\\SoulDrudge_bb.abc",
		"Skins\\Enemies\\SoulDrudge.dtx",
		85.0f,	// Standing height
		29.0f,	// Crouching height
		16.0f,	// Dead Height
		38.0f,	// Standing eyelevel
		14.0f,	// Crouching eyelevel
		0.0f	// dead eyelevel
	},
	// Prophet
	{
		"Prophet",
		"Models_ao\\Characters_ao\\Prophet_bb.abc",
		"Skins\\Enemies\\Prophet.dtx",
		81.0f,	// Standing height
		25.0f,	// Crouching height
		16.0f,	// Dead Height
		35.0f,	// Standing eyelevel
		11.0f,	// Crouching eyelevel
		0.0f	// dead eyelevel
	}
#endif

};

char *gCharacterSkins[MAX_CHARACTERS][MULTIPLAY_SKIN_MAX+1] =
{
	{
		"Skins\\Characters\\Caleb1.dtx",
		"Skins\\Characters\\CalMULTI_R.dtx",
		"Skins\\Characters\\CalMULTI_B.dtx",
		"Skins\\Characters\\CalMULTI_G.dtx",
		"Skins\\Characters\\CalMULTI_Y.dtx",
		"Skins\\Characters\\CalTEAM_B.dtx",
		"Skins\\Characters\\CalTEAM_R.dtx",
	},
	{
		"Skins\\Characters\\Ophelia.dtx",
		"Skins\\Characters\\OphMULTI_R.dtx",
		"Skins\\Characters\\OphMULTI_B.dtx",
		"Skins\\Characters\\OphMULTI_G.dtx",
		"Skins\\Characters\\OphMULTI_Y.dtx",
		"Skins\\Characters\\OphTEAM_B.dtx",
		"Skins\\Characters\\OphTEAM_R.dtx",
	},
	{
		"Skins\\Characters\\Ishmael.dtx",
		"Skins\\Characters\\IshMULTI_R.dtx",
		"Skins\\Characters\\IshMULTI_B.dtx",
		"Skins\\Characters\\IshMULTI_G.dtx",
		"Skins\\Characters\\IshMULTI_Y.dtx",
		"Skins\\Characters\\IshTEAM_B.dtx",
		"Skins\\Characters\\IshTEAM_R.dtx",
	},
	{
		"Skins\\Characters\\Gabriella.dtx",
		"Skins\\Characters\\GabMULTI_R.dtx",
		"Skins\\Characters\\GabMULTI_B.dtx",
		"Skins\\Characters\\GabMULTI_G.dtx",
		"Skins\\Characters\\GabMULTI_Y.dtx",
		"Skins\\Characters\\GabTEAM_B.dtx",
		"Skins\\Characters\\GabTEAM_R.dtx",
	},

#ifdef _ADDON
	{
		"Skins\\Enemies\\m_cultist1.dtx",	// male cultist
		"Skins_ao\\Enemies_ao\\m_Cultist5.dtx",
		"Skins_ao\\Enemies_ao\\m_Cultist4.dtx",
		"Skins_ao\\Enemies_ao\\m_Cultist6.dtx",
		"Skins\\Enemies\\m_cultist3.dtx",
		"Skins_ao\\Enemies_ao\\mc_team_b.dtx",
		"Skins_ao\\Enemies_ao\\mc_team_r.dtx",
	},
	{
		"Skins\\Enemies\\f_cultist1.dtx",	// female cultist
		"Skins\\Enemies\\f_cultist1.dtx",
		"Skins\\Enemies\\f_cultist1.dtx",
		"Skins\\Enemies\\f_cultist1.dtx",
		"Skins\\Enemies\\f_cultist1.dtx",
		"Skins_ao\\Enemies_ao\\fc_team_b.dtx",
		"Skins_ao\\Enemies_ao\\fc_team_r.dtx",
	},
	{
		"Skins\\Enemies\\souldrudge.dtx",	// soul drudge
		"Skins\\Enemies\\souldrudge.dtx",
		"Skins\\Enemies\\souldrudge.dtx",
		"Skins\\Enemies\\souldrudge.dtx",
		"Skins\\Enemies\\souldrudge.dtx",
		"Skins_ao\\Enemies_ao\\sd_team_b.dtx",
		"Skins_ao\\Enemies_ao\\sd_team_r.dtx",
	},
	{
		"Skins\\Enemies\\prophet.dtx",		// prophet
		"Skins\\Enemies\\prophet.dtx",
		"Skins\\Enemies\\prophet.dtx",
		"Skins\\Enemies\\prophet.dtx",
		"Skins\\Enemies\\prophet.dtx",
		"Skins_ao\\Enemies_ao\\p_team_b.dtx",
		"Skins_ao\\Enemies_ao\\p_team_r.dtx",
	},
#endif

};

// Table of max health and armor values based on strength & magic attributes.
//								   1       2       3       4       5       6
static DFLOAT g_fMaxHealth[6]	 = {100.0f, 100.0f, 125.0f, 150.0f, 200.0f, 250.0f};
static DFLOAT g_fMaxMegaHealth[6]= {100.0f, 150.0f, 200.0f, 250.0f, 300.0f, 400.0f};
static DFLOAT g_fMaxArmor[6]	 = {100.0f, 100.0f, 125.0f, 150.0f, 200.0f, 250.0f};
static DFLOAT g_fMaxMegaArmor[6] = {100.0f, 150.0f, 200.0f, 250.0f, 300.0f, 400.0f};

static DFLOAT s_fCreatedTime = 0.0f;


static char s_szPowerupStartSound[] = "sounds\\powerups\\specialpowerupstart1.wav";
static char s_szPowerupEndSound[] = "sounds\\powerups\\specialpowerupend1.wav";
static char *s_PowerupLoopingSounds[] =
{
	"sounds\\powerups\\invulnerabilityloop1.wav",
	"sounds\\powerups\\revenantloop1b.wav",
	"sounds\\powerups\\tripledamageloop3.wav",
	"",
	""
};

// Values to use for acceleration & velocity
//DFLOAT gMoveAccel[6] = { 3300.0f, 3750.0f, 4200.0f, 4650.0f, 4950.0f, 5250.0f };
DFLOAT gDragCoeff[6] = { 15.0f, 15.0f, 15.0f, 15.0f, 15.0f, 15.0f };

// Max velocity is gMoveAccel/gDragCoeff
DFLOAT gMoveVel[6]	 = { 220.0f, 250.0f, 280.0f, 310.0f, 330.0f, 350.0f };


#define DIST_USE		82
#define DIST_GRAB		82

#define MAX_AIR_LEVEL				100.0f
#define FULL_AIR_LOSS_TIME			15.0f
#define FULL_AIR_REGEN_TIME			2.5f

#define MAX_IDLE_TIME				60.0f

// String constants
#define	STRING_EXPIRED				" has expired."
#define	STRING_INVISIBILITY			"Invisibility"
#define STRING_WILLPOWER			"Willpower"
#define STRING_TRIPLEDAMAGE			"Triple Damage"

char msgbuf[255];

BEGIN_CLASS(CPlayerObj)
END_CLASS_DEFAULT_FLAGS(CPlayerObj, CBaseCharacter, NULL, NULL, CF_HIDDEN)


// --------------------------------------------------------------------------- //
//
//	ROUTINE:	CPlayerObj::CPlayerObj()
//
//	PURPOSE:	constructor
//
// --------------------------------------------------------------------------- //
CPlayerObj::CPlayerObj() : CBaseCharacter(OT_MODEL)
{
	m_hClient				= DNULL;
	m_bFiringWeapon			= 0;
	m_startFall				= -1;

	m_Music.Init(this);

	// Initialize client data
	m_fPitch			= 0.0f;
	m_fYaw			= 0.0f;
	m_hstrPlayerName	= DNULL;
	VEC_INIT(m_vGunMuzzlePos);
	ROT_INIT(m_rRotation);
	VEC_INIT(m_vForward);
	m_byFlags			= CDATA_SHOWGUN;
	m_fMouseAxis0		= 0.0;
	m_fMouseAxis1		= 0.0;

	m_fEyeLevel				= 0.0f;

	m_bAnimating			= DFALSE;

	m_bDemoPlayback			= DFALSE;
	m_nCharacter			= CHARACTER_CALEB;
	m_nSkin					= MULTIPLAY_SKIN_NORMAL;
	m_nAttribStrength		= 1;
	m_nAttribSpeed			= 1;
	m_nAttribResistance		= 1;
	m_nAttribMagic			= 1;

	m_nBindingStrength		= 0;
	m_nBindingSpeed			= 0;
	m_nBindingResistance	= 0;
	m_nBindingMagic			= 0;
	m_bBindingConstitution	= DFALSE;
	m_bBindingBlending		= DFALSE;
	m_bBindingSoulStealing	= DFALSE;
	m_bServerRegeneration	= DFALSE;
	m_fServerRegenPeriod	= BINDING_REGEN_TIME;
	m_bBindingRegeneration	= DFALSE;
	m_fBindingRegenPeriod	= BINDING_REGEN_TIME;
	m_bBindingQuickness		= DFALSE;
	m_bBindingIncreasedDamage = DFALSE;
	m_bBindingImpactResistance = DFALSE;

	m_bPowerupActivated[PU_INVULNERABLE] = DFALSE;
	m_bPowerupActivated[PU_INVISIBLE] = DFALSE;
	m_bPowerupActivated[PU_TRIPLEDAMAGE] = DFALSE;
	m_bPowerupActivated[PU_INCORPOREAL] = DFALSE;
	m_bPowerupActivated[PU_SILENT] = DFALSE;

	m_ePowerupSoundStack[0] = PU_NONE;
	m_nPowerupSoundStackPos	= 0;

	m_hPowerupStartSound	= DNULL;
	m_hPowerupEndSound		= DNULL;
	m_hPowerupLoopSound		= DNULL;

	m_bDead					= DFALSE;
	m_bMovementBlocked		= DFALSE;
	m_bImprisoned			= DFALSE;
	m_hCameraObj			= DNULL;

	m_hstrTrigger			= DNULL;

	m_hCurSound				= DNULL;
	m_hWeapSound			= DNULL;

	VEC_INIT(m_vLastPos);
	VEC_INIT(m_vLastVel);

	VEC_SET(m_vScale, 1.0f, 1.0f, 1.0f);

	m_hEnemyAttach			= DNULL;

	g_pPlayerObj			= this;
	
	m_bActivated			= DFALSE;

	m_byMoveState			= PMOVE_NONE;
	m_nInjuredLeg			= 0;
	m_nNodeHit				= 0;
	m_nSideHit				= 0;

	m_hstrWhoKilledMeLast	= DNULL;
	m_hstrWhoIKilledLast	= DNULL;
	m_bInSlowDeath			= DFALSE;
	m_fSlowDeathSafeTimer   = 0;
	m_fSlowDeathStayTimer   = 0;

	// ADDED BY ANDY 9-20-98
	m_bSlowMode			= DFALSE;
	m_fSlowTime			= 0.0f;

	// For remote bomb list
	m_pBombList			= 0;

	m_hOrbObj			= DNULL;

	// Added by Loki
	m_fImprisonStart	= 0.0f;
	m_fImprisonLength	= 0.0f;

	m_fOldAirLevel			= MAX_AIR_LEVEL;
	m_fAirLevel				= MAX_AIR_LEVEL;

	m_bCanSwimJump			    = DFALSE;
	m_bSwimmingJump				= DFALSE;

	m_eLastSurface		= SURFTYPE_UNKNOWN;
	m_bNextFootstepLeft = DTRUE;
	m_bDisableFootsteps = DFALSE;

	m_fNextPingTime = 0.0f;
	
	m_hClientSaveData = DNULL;
	
	ResetIdleTime();

	memset(&m_CabalLink, 0, sizeof(m_CabalLink));
	memset(&m_MonsterLink, 0, sizeof(m_MonsterLink));

	if( AI_Mgr::m_dwNumCabal == 0 )
	{
		dl_TieOff( &AI_Mgr::m_CabalHead );
	}

	if( AI_Mgr::m_dwNumMonster == 0 )
	{
		dl_TieOff( &AI_Mgr::m_MonsterHead );
	}

	m_CurGun = WEAP_NONE;
	m_CurGunSlot = 0;

	m_bBurning	= DFALSE;
	m_fBurningTime = 0.0f;

	m_byAirborneCount = 0;

	m_nCurContainers = 0;
	m_PStateChangeFlags = PSTATE_ALL;
	m_byClientMoveCode = 0;

	m_dwTeamID    = 0;
	m_hFlagObject = DNULL;
	m_hFlagAttach = DNULL;

	m_fMoveVel = 0;
	m_fLadderVel = 0;
	m_fJumpVel = 0;
	m_fLeashLen = 0;
	m_fMoveMultiplier = 0;
	m_fBaseMoveAccel = 0;
	m_fJumpMultiplier = 0;

	m_bDoorPush = 0;
	VEC_INIT( m_vDoorPush );

	m_fTeleportTime = 0;

	m_bInputMode        = DFALSE;
	m_bExternalCamera   = DFALSE;

	s_fCreatedTime = g_pServerDE->GetTime();
	m_hPlrPosVar   = DNULL;

	dl_InitList( &m_AttachedObjectsList );
}


// --------------------------------------------------------------------------- //
//
//	ROUTINE:	CPlayerObj::~CPlayerObj()
//
//	PURPOSE:	destructor
//
// --------------------------------------------------------------------------- //
CPlayerObj::~CPlayerObj()
{
	DLink *pCur, *pNext;

	CServerDE* pServerDE = GetServerDE();
	if (!pServerDE) return;

	if (m_hstrTrigger)
		pServerDE->FreeString(m_hstrTrigger);

	if (m_hstrPlayerName)

⌨️ 快捷键说明

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