📄 worldmodeldebris.cpp
字号:
// ----------------------------------------------------------------------- //
//
// MODULE : WorldModelDebris.cpp
//
// PURPOSE : A WorldModelDebris object
//
// CREATED : 2/27/98
//
// ----------------------------------------------------------------------- //
// Includes...
#include "WorldModelDebris.h"
#include "ObjectUtilities.h"
#include "Rotating.h"
#include <stdio.h>
BEGIN_CLASS(WorldModelDebris)
ADD_ROTATING_AGGREGATE()
ADD_VISIBLE_FLAG(0, PF_HIDDEN)
ADD_SOLID_FLAG(0, PF_HIDDEN)
ADD_GRAVITY_FLAG(0, PF_HIDDEN)
ADD_VECTORPROP_VAL(InitialVelocity, 0, 0, 0)
ADD_REALPROP(GravityMultiplier, 1.0f)
END_CLASS_DEFAULT(WorldModelDebris, CDestructableBrush, NULL, NULL)
// ----------------------------------------------------------------------- //
//
// ROUTINE: WorldModelDebris::WorldModelDebris()
//
// PURPOSE: Initialize object
//
// ----------------------------------------------------------------------- //
WorldModelDebris::WorldModelDebris() : CDestructableBrush()
{
AddAggregate(&m_Rotating);
m_bOn = DFALSE;
m_fGravityMultiplier = 1.0f;
VEC_INIT(m_vInitialVelocity);
}
// ----------------------------------------------------------------------- //
//
// ROUTINE: WorldModelDebris::~WorldModelDebris()
//
// PURPOSE: Destructor
//
// ----------------------------------------------------------------------- //
WorldModelDebris::~WorldModelDebris()
{
}
// ----------------------------------------------------------------------- //
//
// ROUTINE: WorldModelDebris::Setup
//
// PURPOSE: Set up a WorldModelDebris with the information needed
//
// ----------------------------------------------------------------------- //
void WorldModelDebris::Start()
{
// if (!pvRotationPeriods || !pvVel) return;
// Make sure it's healed
m_damage.Heal(10000);
// Start rotating
m_Rotating.SetSpinUp();
m_bOn = DTRUE;
DDWORD dwFlags = FLAG_VISIBLE | FLAG_GRAVITY | FLAG_RAYHIT | FLAG_SOLID;
g_pServerDE->SetObjectFlags(m_hObject, dwFlags);
g_pServerDE->SetVelocity(m_hObject, &m_vInitialVelocity);
g_pServerDE->SetBlockingPriority(m_hObject, 100);
g_pServerDE->SetForceIgnoreLimit(m_hObject, 0.0f);
g_pServerDE->SetNextUpdate(m_hObject, 0.01f);
}
// --------------------------------------------------------------------------- //
//
// ROUTINE: WorldModelDebris::EngineMessageFn()
//
// PURPOSE: Handler for engine messages
//
// --------------------------------------------------------------------------- //
DDWORD WorldModelDebris::EngineMessageFn(DDWORD messageID, void *pData, float fData)
{
switch (messageID)
{
case MID_UPDATE:
{
Update();
break;
}
case MID_PRECREATE:
{
DDWORD dwRet = CDestructableBrush::EngineMessageFn(messageID, pData, fData);
if (fData == PRECREATE_WORLDFILE || fData == PRECREATE_STRINGPROP)
ReadProp((ObjectCreateStruct*)pData);
return dwRet;
}
case MID_INITIALUPDATE:
{
if (fData != INITIALUPDATE_SAVEGAME)
{
m_Rotating.Init(m_hObject);
m_Rotating.SetOff();
}
break;
}
case MID_SAVEOBJECT:
Save((HMESSAGEWRITE)pData, (DDWORD)fData);
break;
case MID_LOADOBJECT:
Load((HMESSAGEREAD)pData, (DDWORD)fData);
break;
default : break;
}
return CDestructableBrush::EngineMessageFn(messageID, pData, fData);
}
// --------------------------------------------------------------------------- //
//
// ROUTINE: WorldModelDebris::ReadProp()
//
// PURPOSE: Reads WorldModelDebris properties
//
// --------------------------------------------------------------------------- //
void WorldModelDebris::ReadProp(ObjectCreateStruct *pStruct)
{
GenericProp gen;
if (g_pServerDE->GetPropGeneric("GravityMultiplier", &gen) == LT_OK)
{
m_fGravityMultiplier = gen.m_Float;
}
if (g_pServerDE->GetPropGeneric("InitialVelocity", &gen) == LT_OK)
{
VEC_COPY(m_vInitialVelocity, gen.m_Vec);
}
}
// ----------------------------------------------------------------------- //
//
// ROUTINE: WorldModelDebris::Update
//
// PURPOSE: Update the WorldModelDebris
//
// ----------------------------------------------------------------------- //
void WorldModelDebris::Update()
{
CollisionInfo collisionInfo;
if (m_bOn)
{
// Set acceleration based on gravity multiplier..
DVector vGravity;
g_pServerDE->GetGlobalForce(&vGravity);
VEC_MULSCALAR(vGravity, vGravity, (m_fGravityMultiplier - 1.0f));
g_pServerDE->SetAcceleration(m_hObject, &vGravity);
g_pServerDE->SetNextUpdate(m_hObject, 0.01f);
g_pServerDE->GetStandingOn(m_hObject, &collisionInfo);
if (collisionInfo.m_hObject)
{
m_bOn = DFALSE;
m_Rotating.SetSpinDown();
}
}
else
{
g_pServerDE->SetNextUpdate(m_hObject, 0.0f);
}
}
// ----------------------------------------------------------------------- //
//
// ROUTINE: WorldModelDebris::Save
//
// PURPOSE: Save the object
//
// ----------------------------------------------------------------------- //
void WorldModelDebris::Save(HMESSAGEWRITE hWrite, DDWORD dwSaveGame)
{
CServerDE* pServerDE = GetServerDE();
if (!pServerDE || !hWrite) return;
pServerDE->WriteToMessageVector(hWrite, &m_vInitialVelocity);
pServerDE->WriteToMessageByte(hWrite, m_bOn);
pServerDE->WriteToMessageFloat(hWrite, m_fGravityMultiplier);
}
// ----------------------------------------------------------------------- //
//
// ROUTINE: WorldModelDebris::Load
//
// PURPOSE: Load the object
//
// ----------------------------------------------------------------------- //
void WorldModelDebris::Load(HMESSAGEREAD hRead, DDWORD dwLoadGame)
{
CServerDE* pServerDE = GetServerDE();
if (!pServerDE || !hRead) return;
pServerDE->ReadFromMessageVector(hRead, &m_vInitialVelocity);
m_bOn = (DBOOL)pServerDE->ReadFromMessageByte(hRead);
m_fGravityMultiplier = pServerDE->ReadFromMessageFloat(hRead);
}
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -