📄 undeadgideon.cpp
字号:
if(m_pServerDE->GetModelPlaybackState(m_hObject) & MS_PLAYDONE)
{
m_InventoryMgr.ChangeWeapon(WEAP_GIDEON_SPEAR);
m_bAnimating = DFALSE;
Metacmd++;
return;
}
}
return;
}
// ----------------------------------------------------------------------- //
// ROUTINE : UndeadGideon::ComputeState
// DESCRIPTION : Compute actual substate
// RETURN TYPE : void
// ----------------------------------------------------------------------- //
void UndeadGideon::ComputeState(int nStimType)
{
int nStim = nStimType;
if(nStimType == -1)
nStim = ComputeStimuli();
DFLOAT fHeight = (DFLOAT)fabs(m_vTargetPos.y - m_MoveObj.GetPos().y);
if(nStim == 0)
{
switch(m_nState)
{
case STATE_Idle: SetNewState(STATE_Idle); break;
case STATE_SearchVisualTarget: SetNewState(STATE_Idle); break;
case STATE_SearchSmellTarget: SetNewState(STATE_Idle); break;
default: SetNewState(STATE_SearchSmellTarget); break;
}
}
else
{
if(nStimType == STIM_SMELL)
SetNewState(STATE_SearchSmellTarget);
else if(m_fStimuli[SIGHT] <= 0.85f || fHeight > m_vDims.y)
SetNewState(STATE_AttackFar);
else
SetNewState(STATE_AttackClose);
}
return;
}
// ----------------------------------------------------------------------- //
// ROUTINE : UndeadGideon::AI_STATE_AttackClose
// DESCRIPTION :
// RETURN TYPE : void
// ----------------------------------------------------------------------- //
void UndeadGideon::AI_STATE_AttackClose()
{
DFLOAT fHeight = (DFLOAT)fabs(m_vTargetPos.y - m_MoveObj.GetPos().y);
//SCHLEGZ 4/22/98 4:51:21 PM: sanity check
if(m_hTarget == DNULL && m_nCurMetacmd != MC_FIRE_STAND)
{
if(fHeight <= m_vDims.y)
SetNewState(STATE_SearchVisualTarget);
else
ComputeState();
return;
}
m_fStimuli[SIGHT] = VEC_DIST(m_MoveObj.GetPos(),m_vTargetPos);
DBOOL bAbove = (m_vTargetPos.y - m_MoveObj.GetPos().y) > 0;
MC_FaceTarget();
Metacmd--;
switch(Metacmd)
{
case 1: MC_FaceTarget(); break;
case 2: if(m_fStimuli[SIGHT] <= 405.0f || m_nCurMetacmd == MC_FIRE_STAND
|| (bAbove && fHeight > m_vDims.y))
{
MC_Fire_Stand();
}
else
{
if(m_fStimuli[SIGHT] >= (m_fSeeingDist * 0.33))
ComputeState();
else
MC_Walk();
}
break;
case 3: ComputeState(); break;
}
return;
}
// ----------------------------------------------------------------------- //
// ROUTINE : UndeadGideon::AI_STATE_AttackFar
// DESCRIPTION :
// RETURN TYPE : void
// ----------------------------------------------------------------------- //
void UndeadGideon::AI_STATE_AttackFar()
{
DFLOAT fHeight = (DFLOAT)fabs(m_vTargetPos.y - m_MoveObj.GetPos().y);
//SCHLEGZ 4/22/98 4:51:21 PM: sanity check
if(m_hTarget == DNULL && m_nCurMetacmd != MC_FIRE_STAND && m_nCurMetacmd != MC_JUMP)
{
if(fHeight <= m_vDims.y)
SetNewState(STATE_SearchVisualTarget);
else
ComputeState();
return;
}
m_fStimuli[SIGHT] = VEC_DIST(m_MoveObj.GetPos(),m_vTargetPos);
DBOOL bAbove = (m_vTargetPos.y - m_MoveObj.GetPos().y) > 0;
MC_FaceTarget();
Metacmd--;
switch(Metacmd)
{
case 1: if(m_fStimuli[SIGHT] <= (m_fSeeingDist * 0.75) || m_nCurMetacmd == MC_FIRE_STAND
|| (bAbove && fHeight > m_vDims.y))
{
MC_Fire_Stand();
}
else
{
if(m_fStimuli[SIGHT] < (m_fSeeingDist * 0.20))
ComputeState();
else
MC_Walk();
}
break;
case 2: if((m_fStimuli[SIGHT] < (m_fSeeingDist * 0.20)) && m_nCurMetacmd != MC_JUMP
|| (bAbove && fHeight > m_vDims.y))
{
ComputeState();
}
else if(m_fStimuli[SIGHT] < (m_fSeeingDist * 0.30) || m_nCurMetacmd == MC_JUMP
|| IsLedge(m_MoveObj.GetForwardVector()))
{
MC_Jump();
}
else
MC_Walk();
break;
case 3: ComputeState(); break;
}
return;
}
void UndeadGideon::Save(HMESSAGEWRITE hWrite, DDWORD dwSaveFlags)
{
m_pServerDE->WriteToMessageFloat(hWrite, m_fFullHealth);
}
void UndeadGideon::Load(HMESSAGEREAD hRead, DDWORD dwLoadFlags)
{
m_fFullHealth = m_pServerDE->ReadFromMessageFloat(hRead);
}
DBOOL UndeadGideon::Fire(DBOOL bAltFire)
{
DVector vPos, vDir;
DRotation rRot;
// Sanity check (GK 9/18/98)
if (!m_InventoryMgr.GetCurrentWeapon())
return DFALSE;
m_pServerDE->GetModelNodeTransform(m_hObject,"head",&vPos,&rRot);
VEC_SUB(vDir, m_vTargetPos, vPos);
VEC_NORM(vDir);
vDir.x = m_MoveObj.GetForwardVector().x;
vDir.z = m_MoveObj.GetForwardVector().z;
m_pServerDE->AlignRotation(&rRot, &vDir, DNULL);
DDWORD m_nFiredWeapon = m_InventoryMgr.FireCurrentWeapon(&vPos, &rRot, bAltFire);
return DTRUE;
}
void UndeadGideon::MC_Dodge_Left()
{
if (m_bAnimating == DFALSE || m_nCurMetacmd != MC_DODGE_LEFT)
{
SetAnimation(m_pAnim_Sound->m_nAnim_JUMP[TYPE_MELEE]);
m_pServerDE->SetModelLooping(m_hObject, DFALSE);
DVector vVel, vLeft;
VEC_MULSCALAR(vLeft, m_MoveObj.GetRightVector(), -1.0f);
vVel.y = m_MoveObj.GetUpVector().y * m_fJumpSpeed;
vVel.x = vLeft.x * m_fRunSpeed;
vVel.z = vLeft.z * m_fRunSpeed;
Move(vVel, MATH_EPSILON);
m_nCurMetacmd = MC_DODGE_LEFT;
m_bAnimating = DTRUE;
}
else
{
CollisionInfo collisionInfo;
DVector vVel;
m_pServerDE->GetVelocity(m_hObject,&vVel);
m_pServerDE->GetStandingOn(m_hObject, &collisionInfo);
if ((collisionInfo.m_hObject == m_pServerDE->GetWorldObject()) && (vVel.y <= 0.0f))
{
DVector vVel;
VEC_INIT(vVel);
Move(vVel, MATH_EPSILON);
m_bAnimating = DFALSE;
Metacmd++;
}
}
return;
}
void UndeadGideon::MC_Dodge_Right()
{
if (m_bAnimating == DFALSE || m_nCurMetacmd != MC_DODGE_RIGHT)
{
SetAnimation(m_pAnim_Sound->m_nAnim_JUMP[TYPE_MELEE]);
m_pServerDE->SetModelLooping(m_hObject, DFALSE);
DVector vVel;
vVel.y = m_MoveObj.GetUpVector().y * m_fJumpSpeed;
vVel.x = m_MoveObj.GetRightVector().x * m_fRunSpeed;
vVel.z = m_MoveObj.GetRightVector().z * m_fRunSpeed;
Move(vVel, MATH_EPSILON);
m_nCurMetacmd = MC_DODGE_RIGHT;
m_bAnimating = DTRUE;
}
else
{
CollisionInfo collisionInfo;
DVector vVel;
m_pServerDE->GetVelocity(m_hObject,&vVel);
m_pServerDE->GetStandingOn(m_hObject, &collisionInfo);
if ((collisionInfo.m_hObject == m_pServerDE->GetWorldObject()) && (vVel.y <= 0.0f))
{
DVector vVel;
VEC_INIT(vVel);
Move(vVel, MATH_EPSILON);
m_bAnimating = DFALSE;
Metacmd++;
}
}
return;
}
void UndeadGideon::AI_STATE_Dodge()
{
switch(Metacmd)
{
case 1: m_nDodgeFlags = CalculateDodge(m_vTrackObjPos);
Metacmd++; break;
case 2: if(m_nDodgeFlags & RIGHT)
MC_Dodge_Right();
else if(m_nDodgeFlags & LEFT)
MC_Dodge_Left();
else
Metacmd++;
break;
case 3: SetNewState(STATE_Idle); break;
}
return;
}
// ----------------------------------------------------------------------- //
//
// ROUTINE: CacheFiles
//
// PURPOSE: Cache resources used by the object
//
// ----------------------------------------------------------------------- //
void UndeadGideon::CacheFiles()
{
// Sanity checks...
CServerDE* pServerDE = GetServerDE();
if (!pServerDE) return;
if(!(pServerDE->GetServerFlags() & SS_CACHING))
{
return;
}
if (!m_hObject) return;
// Get the model filenames...
char sModel[256] = { "" };
char sSkin[256] = { "" };
pServerDE->GetModelFilenames(m_hObject, sModel, 255, sSkin, 255);
// Cache models...
pServerDE->CacheFile(FT_MODEL, sModel);
// Cache textures...
pServerDE->CacheFile(FT_TEXTURE, sSkin);
// Cache sounds...
SetCacheDirectory("sounds\\enemies\\undeadgid");
CacheSoundFileRange("foot", 1, 3);
CacheSoundFileRange("spit", 1, 3);
CacheSoundFileRange("stab", 1, 3);
}
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -