📄 fanatic.cpp
字号:
case 4: if(m_fStimuli[SIGHT] > (m_fSeeingDist * 0.75))
{
MC_FaceTarget();
Metacmd--;
if(!IsLedge(m_MoveObj.GetForwardVector()) && fHeight <= m_vDims.y
&& m_nCurMetacmd != MC_FIRE_CROUCH)
{
if(m_nInjuredLeg)
MC_Walk();
else
MC_Fire_Run();
}
else
{
MC_Fire_Crouch();
}
}
else
Metacmd++;
break;
case 5: ComputeState(); break;
}
return;
}
// ----------------------------------------------------------------------- //
// ROUTINE : Fanatic::AI_STATE_Escape
// DESCRIPTION :
// RETURN TYPE : void
// ----------------------------------------------------------------------- //
void Fanatic::AI_STATE_Escape_RunAway()
{
int nStimType = ComputeStimuli();
if(nStimType > 0)
{
SetNewState(STATE_Special1);
return;
}
DFLOAT fDim = (DFLOAT)sqrt((m_vDims.x * m_vDims.x) + (m_vDims.z * m_vDims.z)) + 0.1f;
switch(Metacmd)
{
case 1: m_hTrackObject = FindObjectInRadius(m_pServerDE->GetClass("ExitHint"), m_fSeeingDist, FIND_VISIBLE | FIND_AVOID_TARGET);
if(m_hTrackObject)
{
m_pServerDE->GetObjectPos(m_hTrackObject,&m_vTrackObjPos);
DVector vPos;
VEC_SET(vPos, m_vTrackObjPos.x, m_MoveObj.GetPos().y, m_vTrackObjPos.z);
if(VEC_DIST(vPos, m_MoveObj.GetPos()) <= fDim)
SetNewState(STATE_Special1);
else
{
MC_FacePos(m_vTrackObjPos);
if(!m_MoveObj.CalculatePath(m_vTrackObjPos))
SetNewState(STATE_Special1);
}
}
else
SetNewState(STATE_Special1);
break;
case 2:
{
DVector* pvPos = m_MoveObj.GetNextPathPoint();
if(pvPos)
MC_FacePos(*pvPos);
else
SetNewState(STATE_Escape_RunAway);
break;
}
case 3:
{
DVector vPoint = *m_MoveObj.GetNextPathPoint();
vPoint.y = m_MoveObj.GetPos().y;
if(VEC_DIST(vPoint, m_MoveObj.GetPos()) <= fDim/2)
{
if(!m_MoveObj.MoveToNextPathPoint())
{
MC_FacePos(m_vTargetPos);
}
else
{
Metacmd = 2;
}
}
else
MC_Run();
break;
}
case 4: ComputeState(); break;
}
return;
}
// ----------------------------------------------------------------------- //
// ROUTINE : Fanatic::AI_STATE_Escape
// DESCRIPTION :
// RETURN TYPE : void
// ----------------------------------------------------------------------- //
void Fanatic::AI_STATE_Escape_Hide()
{
switch(Metacmd)
{
case 1: m_hTrackObject = FindObjectInRadius(m_pServerDE->GetClass("ExitHint"), m_fSeeingDist);
if(m_hTrackObject)
{
m_pServerDE->GetObjectPos(m_hTrackObject,&m_vDestPos);
SetNewState(STATE_RunToPos);
}
else
SetNewState(STATE_AttackClose);
break;
}
return;
}
// ----------------------------------------------------------------------- //
// ROUTINE : Fanatic::AI_STATE_Dodge
// DESCRIPTION :
// RETURN TYPE : void
// ----------------------------------------------------------------------- //
void Fanatic::AI_STATE_Dodge()
{
switch(Metacmd)
{
case 1: m_nDodgeFlags = CalculateDodge(m_vTrackObjPos);
Metacmd++; break;
case 2: if(m_nDodgeFlags & ROLL)
{
if(m_nDodgeFlags & RIGHT)
MC_Roll_Right();
else if(m_nDodgeFlags & LEFT)
MC_Roll_Left();
else if(m_nDodgeFlags & FORWARD)
MC_Roll_Forward();
else
MC_Roll_Backward();
}
else
{
Metacmd++;
}
break;
case 3: ComputeState(); break;
}
return;
}
// ----------------------------------------------------------------------- //
// ROUTINE : Fanatic::AI_STATE_Special
// DESCRIPTION :
// RETURN TYPE : void
// ----------------------------------------------------------------------- //
void Fanatic::AI_STATE_Special1()
{
switch(Metacmd)
{
case 1: MC_Special();
break;
case 2:
{
m_pServerDE->SetModelNodeHideStatus(m_hObject, "torso_extra1", DTRUE);
m_damage.SetHitPoints(50.0f);
m_damage.SetArmorPoints(50.0f);
m_fStartTime = m_pServerDE->GetTime();
//create the smoke object
ObjectCreateStruct ocStruct;
INIT_OBJECTCREATESTRUCT(ocStruct);
ocStruct.m_ObjectType = OT_NORMAL;
ocStruct.m_NextUpdate = 0.01f;
g_pServerDE->GetModelNodeTransform(m_hObject, "torso_extra1",&ocStruct.m_Pos,&ocStruct.m_Rotation);
ocStruct.m_Flags = FLAG_FORCECLIENTUPDATE;
HCLASS hClass = g_pServerDE->GetClass("BaseClass");
BaseClass* pObj = g_pServerDE->CreateObject(hClass, &ocStruct);
if(pObj)
{
m_hSmokeSource = pObj->m_hObject;
}
Metacmd++;
break;
}
case 3: m_fStimuli[SIGHT] = VEC_DIST(m_MoveObj.GetPos(),m_vTargetPos);
if(m_fStimuli[SIGHT] <= 100.0f ||
m_pServerDE->GetTime() - m_fStartTime >= 30.0f)
{
Metacmd++;
}
else
{
MC_FaceTarget();
Metacmd--;
MC_Run();
}
break;
case 4:
{
ObjectCreateStruct ocStruct;
INIT_OBJECTCREATESTRUCT(ocStruct);
ROT_COPY(ocStruct.m_Rotation, m_MoveObj.GetRotation());
VEC_COPY(ocStruct.m_Pos, m_MoveObj.GetPos());
CProjectile *pProject = NULL;
HCLASS hClass = m_pServerDE->GetClass("CHowitzerShell");
DFLOAT fVelocity = 250.0f;
int nRadius = 200;
if (hClass)
{
DVector vDown;
VEC_MULSCALAR(vDown, m_MoveObj.GetUpVector(), -1.0f);
if (pProject = (CProjectile*)m_pServerDE->CreateObject(hClass, &ocStruct))
pProject->Setup(&vDown, WEAP_HOWITZER, 50.0f, fVelocity, nRadius, m_hObject);
}
CreateGibs(m_MoveObj.GetUpVector(), ((int)m_damage.GetMass())>>5,
DAMAGE_TYPE_EXPLODE, 50.0f);
if(m_hAttach && m_hSmokeSource)
{
m_pServerDE->RemoveAttachment(m_hAttach);
m_pServerDE->RemoveObject(m_hSmokeSource);
m_hSmokeSource = DNULL;
m_hAttach = DNULL;
}
m_bRemoveMe = DTRUE;
Metacmd++;
break;
}
case 5: break;
}
return;
}
// ----------------------------------------------------------------------- //
// ROUTINE : Fanatic::AI_STATE_Dying
// DESCRIPTION :
// RETURN TYPE : void
// ----------------------------------------------------------------------- //
void Fanatic::AI_STATE_Dying()
{
if(m_fStartTime)
{
ObjectCreateStruct ocStruct;
INIT_OBJECTCREATESTRUCT(ocStruct);
ROT_COPY(ocStruct.m_Rotation, m_MoveObj.GetRotation());
VEC_COPY(ocStruct.m_Pos, m_MoveObj.GetPos());
CProjectile *pProject = NULL;
HCLASS hClass = m_pServerDE->GetClass("CHowitzerShell");
DFLOAT fVelocity = 250.0f;
int nRadius = 200;
if (hClass)
{
DVector vDown;
VEC_MULSCALAR(vDown, m_MoveObj.GetUpVector(), -1.0f);
if (pProject = (CProjectile*)m_pServerDE->CreateObject(hClass, &ocStruct))
pProject->Setup(&vDown, WEAP_HOWITZER, 50.0f, fVelocity, nRadius, m_hObject);
}
CreateGibs(m_MoveObj.GetUpVector(), ((int)m_damage.GetMass())>>5,
DAMAGE_TYPE_EXPLODE, 50.0f);
if(m_hAttach && m_hSmokeSource)
{
m_pServerDE->RemoveAttachment(m_hAttach);
m_pServerDE->RemoveObject(m_hSmokeSource);
m_hSmokeSource = DNULL;
m_hAttach = DNULL;
}
m_bRemoveMe = DTRUE;
}
else
AI_Mgr::AI_STATE_Dying();
return;
}
void Fanatic::Save(HMESSAGEWRITE hWrite, DDWORD dwSaveFlags)
{
CServerDE* pServerDE = BaseClass::GetServerDE();
if (!pServerDE) return;
pServerDE->WriteToMessageFloat(hWrite, m_fStartTime);
}
void Fanatic::Load(HMESSAGEREAD hRead, DDWORD dwLoadFlags)
{
CServerDE* pServerDE = BaseClass::GetServerDE();
if (!pServerDE) return;
m_fStartTime = pServerDE->ReadFromMessageFloat(hRead);
if(m_fStartTime)
{
//create the smoke object
ObjectCreateStruct ocStruct;
INIT_OBJECTCREATESTRUCT(ocStruct);
ocStruct.m_ObjectType = OT_NORMAL;
ocStruct.m_NextUpdate = 0.01f;
g_pServerDE->GetModelNodeTransform(m_hObject, "torso_extra1",&ocStruct.m_Pos,&ocStruct.m_Rotation);
ocStruct.m_Flags = FLAG_FORCECLIENTUPDATE;
HCLASS hClass = g_pServerDE->GetClass("BaseClass");
BaseClass* pObj = g_pServerDE->CreateObject(hClass, &ocStruct);
if(pObj)
{
m_hSmokeSource = pObj->m_hObject;
}
m_bStartSmoke = DTRUE;
}
}
// ----------------------------------------------------------------------- //
//
// ROUTINE: CacheFiles
//
// PURPOSE: Cache resources used by the object
//
// ----------------------------------------------------------------------- //
void Fanatic::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\\fanatic");
CacheSoundFileRange("death", 1, 3);
CacheSoundFileRange("fear", 1, 3);
CacheSoundFileRange("fire", 1, 3);
CacheSoundFileRange("idle", 1, 3);
CacheSoundFileRange("pain", 1, 3);
CacheSoundFileRange("scream", 1, 3);
CacheSoundFileRange("spot", 1, 3);
CacheSoundFile("footstep");
}
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -