📄 playerobj.cpp
字号:
//----------------------------------------------------------
//
// 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 + -