📄 enhancedgideon.cpp
字号:
if (m_bNoFire)
{
SetNewState(STATE_Passive);
return;
}
m_fStimuli[SIGHT] = VEC_DIST(m_MoveObj.GetPos(),m_vTargetPos);
switch(Metacmd)
{
case 1: MC_FaceTarget();
Metacmd--;
if((m_fStimuli[SIGHT] <= (m_fSeeingDist * 0.30f)) || m_nCurMetacmd == MC_FIRE_STAND)
{
MC_Fire_Stand();
}
else
{
SetNewState(STATE_Special1);
}
break;
case 2: MC_Taunt_Bold(); break;
case 3: MC_FaceTarget();
Metacmd--;
if(m_fStimuli[SIGHT] <= (m_fSeeingDist * 0.40f))
{
SetNewState(STATE_Special1);
}
else
{
MC_Walk();
}
break;
case 4: ComputeState(); break;
}
return;
}
void EnhancedGideon::MagicPowerup()
{
DVector offset;
VEC_SET(offset, 0.0f, 0.0f, 0.0f);
if (m_bNoFire)
{
return;
}
// Display the 'powerup' effect around EnhancedGideon
HMESSAGEWRITE hMessage = m_pServerDE->StartInstantSpecialEffectMessage(&offset);
m_pServerDE->WriteToMessageByte(hMessage, SFX_OBJECTFX_ID);
m_pServerDE->WriteToMessageObject(hMessage, m_hObject);
m_pServerDE->WriteToMessageVector(hMessage, &offset);
m_pServerDE->WriteToMessageFloat(hMessage, 0.0f);
m_pServerDE->WriteToMessageDWord(hMessage, 0);
m_pServerDE->WriteToMessageDWord(hMessage, OBJFX_POWERUP_1);
m_pServerDE->WriteToMessageDWord(hMessage, 0);
m_pServerDE->EndMessage(hMessage);
}
void EnhancedGideon::MC_FadeOut()
{
if (m_bAnimating == DFALSE || m_nCurMetacmd != MC_FADEOUT)
{
m_bAnimating = DTRUE;
m_nCurMetacmd = MC_FADEOUT;
DDWORD dwFlags = m_pServerDE->GetObjectFlags(m_hObject);
dwFlags &= ~FLAG_SOLID;
m_pServerDE->SetObjectFlags(m_hObject,dwFlags);
}
else
{
DVector vColor;
DFLOAT fAlpha = 0.0f;
m_pServerDE->GetObjectColor(m_hObject,&vColor.x, &vColor.y, &vColor.z, &fAlpha);
fAlpha -= 1.0/16;
if(fAlpha <= 0.0f)
fAlpha = 0.0f;
m_pServerDE->SetObjectColor(m_hObject,vColor.x,vColor.y,vColor.z, fAlpha);
if(fAlpha <= 0.0f)
{
m_bAnimating = DFALSE;
Metacmd++;
return;
}
}
return;
}
void EnhancedGideon::AI_STATE_Teleport()
{
switch(Metacmd)
{
case 1: MC_FadeOut(); break;
case 2:
{
m_pAnim_Sound->PlaySound(m_hObject, "teleport.wav", 1000.0f, 100);
Metacmd++; break;
}
case 3:
{
IntersectQuery IQuery;
IntersectInfo IInfo;
DDWORD dwFlags;
IQuery.m_Flags = INTERSECT_OBJECTS;
IQuery.m_FilterFn = DNULL;
DVector vDir;
VEC_SET(vDir, m_pServerDE->Random(-1.0f,1.0f), 0.0f, m_pServerDE->Random(-1.0f,1.0f));
VEC_COPY(IQuery.m_From, m_MoveObj.GetPos());
VEC_ADDSCALED(IQuery.m_To, IQuery.m_From, vDir, 1500.0f);
dwFlags = m_pServerDE->GetObjectFlags(m_hObject);
dwFlags |= FLAG_SOLID;
m_pServerDE->SetObjectFlags(m_hObject,dwFlags);
if(m_pServerDE->IntersectSegment(&IQuery, &IInfo))
{
VEC_ADDSCALED(IInfo.m_Point, IInfo.m_Point, vDir, -100.0f);
m_pServerDE->MoveObject(m_hObject, &IInfo.m_Point);
}
else
{
VEC_ADDSCALED(IInfo.m_Point, IQuery.m_To, vDir, -100.0f);
m_pServerDE->MoveObject(m_hObject, &IQuery.m_To);
}
Metacmd++;
break;
}
case 4:
{
DVector vColor;
DFLOAT fAlpha = 1.0f;
m_pServerDE->GetObjectColor(m_hObject,&vColor.x, &vColor.y, &vColor.z, &fAlpha);
m_pServerDE->SetObjectColor(m_hObject,vColor.x,vColor.y,vColor.z, 1.0f);
Metacmd++;
break;
}
case 5: MC_FaceTarget(); break;
case 6: ComputeState(); break;
}
return;
}
void EnhancedGideon::AI_STATE_Special1()
{
if (!m_hTarget)
{
SetNewState(STATE_Teleport);
}
switch(Metacmd)
{
case 1: MC_FadeOut(); break;
case 2:
{
// char szSound[256];
// strcpy(szSound, SOUND_LAUGH);
// m_pAnim_Sound->GetSoundPath(szSound,m_pServerDE->IntRandom(1,3));
// PlayAISound(szSound, 1000.0f, PLAY_WAIT);
Metacmd++; break;
}
case 3:
{
IntersectQuery IQuery;
IntersectInfo IInfo;
DDWORD dwFlags;
IQuery.m_Flags = INTERSECT_OBJECTS;
IQuery.m_FilterFn = DNULL;
DVector vDir, vTarget;
VEC_SET(vDir, m_pServerDE->Random(-1.0f,1.0f), 0.2f, m_pServerDE->Random(-1.0f,1.0f));
m_pServerDE->GetObjectPos(m_hTarget,&vTarget);
dwFlags = m_pServerDE->GetObjectFlags(m_hObject);
dwFlags |= FLAG_SOLID;
m_pServerDE->SetObjectFlags(m_hObject,dwFlags);
VEC_COPY(IQuery.m_From, vTarget);
VEC_ADDSCALED(IQuery.m_To, IQuery.m_From, vDir, m_pServerDE->Random(400.0f,600.0f));
if(m_pServerDE->IntersectSegment(&IQuery, &IInfo))
{
VEC_ADDSCALED(IInfo.m_Point, IInfo.m_Point, vDir, -300.0f);
m_pServerDE->MoveObject(m_hObject, &IInfo.m_Point);
}
else
{
VEC_ADDSCALED(IInfo.m_Point, IQuery.m_To, vDir, -300.0f);
m_pServerDE->MoveObject(m_hObject, &IQuery.m_To);
}
Metacmd++;
break;
}
case 4:
{
DVector vColor;
DFLOAT fAlpha = 1.0f;
m_pServerDE->GetObjectColor(m_hObject,&vColor.x, &vColor.y, &vColor.z, &fAlpha);
m_pServerDE->SetObjectColor(m_hObject,vColor.x,vColor.y,vColor.z, 1.0f);
Metacmd++;
break;
}
case 5: MC_FaceTarget(); break;
case 6: ComputeState(); break;
}
return;
}
void EnhancedGideon::MC_Extra(const char *lpszText)
{
if(strncmp(lpszText,"powerup",7) == 0)
{
MagicPowerup();
}
else
{
sprintf(m_szFireNode,"%s",lpszText);
Fire();
}
}
DBOOL EnhancedGideon::Fire(DBOOL bAltFire)
{
DVector vPos, vDir;
DRotation rRot;
if (m_bNoFire)
{
return DFALSE;
}
// Sanity check (GK 9/18/98)
if (!m_InventoryMgr.GetCurrentWeapon())
return DFALSE;
if(!m_pServerDE->GetModelNodeTransform(m_hObject,m_szFireNode,&vPos,&rRot))
{
m_pServerDE->GetObjectPos(m_hObject,&vPos);
VEC_COPY(vDir, m_MoveObj.GetForwardVector());
}
else
{
VEC_SUB(vDir, m_vTargetPos, vPos);
}
VEC_NORM(vDir);
m_pServerDE->AlignRotation(&rRot, &vDir, DNULL);
DDWORD m_nFiredWeapon = m_InventoryMgr.FireCurrentWeapon(&vPos, &rRot, bAltFire);
return DTRUE;
}
void EnhancedGideon::Save(HMESSAGEWRITE hWrite, DDWORD dwSaveFlags)
{
CServerDE* pServerDE = BaseClass::GetServerDE();
if (!pServerDE) return;
pServerDE->WriteToMessageFloat(hWrite, m_fShieldDuration);
pServerDE->WriteToMessageFloat(hWrite, m_fLastShield);
pServerDE->WriteToMessageFloat(hWrite, m_fFullHealth);
pServerDE->WriteToMessageFloat(hWrite, m_fLastPanic);
}
void EnhancedGideon::Load(HMESSAGEREAD hRead, DDWORD dwLoadFlags)
{
CServerDE* pServerDE = BaseClass::GetServerDE();
if (!pServerDE) return;
m_fShieldDuration = pServerDE->ReadFromMessageFloat(hRead);
m_fLastShield = pServerDE->ReadFromMessageFloat(hRead);
m_fFullHealth = m_pServerDE->ReadFromMessageFloat(hRead);
m_fLastPanic = m_pServerDE->ReadFromMessageFloat(hRead);
}
void EnhancedGideon::Script_Walk()
{
if (m_bAnimating == DFALSE || m_nCurMetacmd != MC_WALK)
{
DBOOL bRet = DFALSE;
DDWORD dwFlags = m_pServerDE->GetObjectFlags(m_hObject);
dwFlags = dwFlags | FLAG_GRAVITY;
m_pServerDE->SetObjectFlags(m_hObject,dwFlags);
m_fTimeStart = m_pServerDE->GetTime();
bRet = SetAnimation( m_pAnim_Sound->m_nAnim_WALK[TYPE_MELEE]);
m_pServerDE->SetModelLooping(m_hObject, DTRUE);
if(m_nInjuredLeg)
Move(m_MoveObj.GetForwardVector(),m_fWalkSpeed/3);
else
Move(m_MoveObj.GetForwardVector(),m_fWalkSpeed);
m_bAnimating = DTRUE;
m_nCurMetacmd = MC_WALK;
}
else
{
Move(m_MoveObj.GetForwardVector(),m_fWalkSpeed);
if(m_pServerDE->GetModelPlaybackState(m_hObject) & MS_PLAYDONE)
{
StopVelocity();
m_bAnimating = DFALSE;
}
}
}
void EnhancedGideon::Script_Run()
{
if (m_bAnimating == DFALSE || m_nCurMetacmd != MC_RUN)
{
DBOOL bRet = DFALSE;
m_fTimeStart = m_pServerDE->GetTime();
bRet = SetAnimation( m_pAnim_Sound->m_nAnim_RUN[TYPE_MELEE]);
m_pServerDE->SetModelLooping(m_hObject, DTRUE);
Move(m_MoveObj.GetForwardVector(),m_fWalkSpeed);
m_bAnimating = DTRUE;
m_nCurMetacmd = MC_RUN;
}
else
{
Move(m_MoveObj.GetForwardVector(),m_fRunSpeed);
//Are we done running?
if(m_pServerDE->GetModelPlaybackState(m_hObject) & MS_PLAYDONE)
{
StopVelocity();
m_bAnimating = DFALSE;
}
}
}
void EnhancedGideon::MC_Walk()
{
if (m_bAnimating == DFALSE || m_nCurMetacmd != MC_WALK)
{
DBOOL bRet = DFALSE;
if (m_nState == STATE_Script)
{
DDWORD dwFlags = m_pServerDE->GetObjectFlags(m_hObject);
dwFlags = dwFlags | FLAG_GRAVITY;
m_pServerDE->SetObjectFlags(m_hObject,dwFlags);
}
m_fTimeStart = m_pServerDE->GetTime();
bRet = SetAnimation( m_pAnim_Sound->m_nAnim_WALK[TYPE_MELEE]);
m_pServerDE->SetModelLooping(m_hObject, DTRUE);
if(m_nInjuredLeg)
Move(m_MoveObj.GetForwardVector(),m_fWalkSpeed/3);
else
Move(m_MoveObj.GetForwardVector(),m_fWalkSpeed);
m_bAnimating = DTRUE;
m_nCurMetacmd = MC_WALK;
}
else
{
Move(m_MoveObj.GetForwardVector(),m_fWalkSpeed);
if(m_pServerDE->GetModelPlaybackState(m_hObject) & MS_PLAYDONE)
{
StopVelocity();
m_bAnimating = DFALSE;
}
}
}
void EnhancedGideon::MC_Run()
{
if (m_bAnimating == DFALSE || m_nCurMetacmd != MC_RUN)
{
DBOOL bRet = DFALSE;
if (m_nState == STATE_Script)
{
DDWORD dwFlags = m_pServerDE->GetObjectFlags(m_hObject);
dwFlags &= ~FLAG_GRAVITY;
m_pServerDE->SetObjectFlags(m_hObject,dwFlags);
}
m_fTimeStart = m_pServerDE->GetTime();
bRet = SetAnimation( m_pAnim_Sound->m_nAnim_RUN[TYPE_MELEE]);
m_pServerDE->SetModelLooping(m_hObject, DTRUE);
Move(m_MoveObj.GetForwardVector(),m_fWalkSpeed);
m_bAnimating = DTRUE;
m_nCurMetacmd = MC_RUN;
}
else
{
Move(m_MoveObj.GetForwardVector(),m_fRunSpeed);
//Are we done running?
if(m_pServerDE->GetModelPlaybackState(m_hObject) & MS_PLAYDONE)
{
StopVelocity();
m_bAnimating = DFALSE;
}
}
}
void EnhancedGideon::AI_STATE_Script()
{
m_bNoFire = DTRUE;
if (m_bUpdateScriptCmd)
{
UpdateScriptCommand();
}
DDWORD dwFlags = m_pServerDE->GetObjectFlags(m_hObject);
if (!(dwFlags & FLAG_GRAVITY))
{
dwFlags = dwFlags | FLAG_GRAVITY;
m_pServerDE->SetObjectFlags(m_hObject,dwFlags);
}
switch(m_curScriptCmd.command)
{
case AI_SCMD_SETMOVEMENT:
case AI_SCMD_PLAYSOUND:
case AI_SCMD_SETSTATE:
case AI_SCMD_TARGET:
m_bUpdateScriptCmd = DTRUE;
break;
case AI_SCMD_FOLLOWPATH:
UpdateFollowPathCmd();
break;
case AI_SCMD_WAIT:
UpdateWaitCmd();
break;
case AI_SCMD_PLAYANIMATION:
UpdatePlayAnimationCmd();
break;
case AI_SCMD_MOVETOOBJECT:
UpdateMoveToObjectCmd();
break;
case AI_SCMD_DONE:
default:
m_dwScriptFlags = 0;
m_bNoFire = DFALSE;
ComputeState();
break;
}
}
// ----------------------------------------------------------------------- //
//
// ROUTINE: CacheFiles
//
// PURPOSE: Cache resources used by the object
//
// ----------------------------------------------------------------------- //
void EnhancedGideon::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);
}
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -