📄 volumebrushtypes.cpp
字号:
ROT_COPY(theStruct.m_Rotation, rRot);
VEC_COPY(theStruct.m_Pos, vPos);
theStruct.m_NextUpdate = 0.1f;
HCLASS pClass = pServerDE->GetClass("CameraObj");
// Check to make sure this is a valid class.
if (pClass)
{
LPBASECLASS pObject = pServerDE->CreateObject(pClass, &theStruct);
if (pObject)
{
m_hCameraObj = pServerDE->ObjectToHandle(pObject);
}
pPlayer->m_hCameraObj = m_hCameraObj;
pServerDE->SetObjectFlags(m_hCameraObj, 0);
}
else
{
return;
}
}
if (!pPlayer->m_hCameraObj) pPlayer->m_hCameraObj = m_hCameraObj;
// Try to find the crane)
if (!m_hCrane)
{
ObjectList* pTargets = pServerDE->FindNamedObjects("crane");
if (!pTargets || pTargets->m_nInList <= 0)
{
return;
}
// Use the first object
m_hCrane = pTargets->m_pFirstLink->m_hObject;
// clean up
pServerDE->RelinquishList(pTargets);
}
// Try to find the wrecking ball
if (!m_hBall)
{
ObjectList* pTargets = pServerDE->FindNamedObjects("WreckingBall");
if (!pTargets || pTargets->m_nInList <= 0)
{
return;
}
// Use the first object
m_hBall = pTargets->m_pFirstLink->m_hObject;
// clean up
pServerDE->RelinquishList(pTargets);
}
// Point the camera at the ball if we have one.
CameraObj* pCameraObj = (CameraObj*)pServerDE->HandleToObject(m_hCameraObj);
pCameraObj->SetLinkObject(m_hBall ? m_hBall : m_hCrane);
if (pPlayer->GetContainer() != CC_CRANECONTROL)
return;
if (pServerDE->IsCommandOn(pPlayer->GetClient(), COMMAND_LEFT) || pServerDE->IsCommandOn(pPlayer->GetClient(), COMMAND_STRAFELEFT))
{
m_fCamYaw -= CRANE_ROTATE_SPEED;
if (m_fCamYaw < MIN_CRANE_YAW)
m_fCamYaw = MIN_CRANE_YAW;
}
else if (pServerDE->IsCommandOn(pPlayer->GetClient(), COMMAND_RIGHT) || pServerDE->IsCommandOn(pPlayer->GetClient(), COMMAND_STRAFERIGHT))
{
m_fCamYaw += CRANE_ROTATE_SPEED;
if (m_fCamYaw > MAX_CRANE_YAW)
m_fCamYaw = MAX_CRANE_YAW;
}
DRotation rCrane;
ROT_INIT(rCrane);
pServerDE->SetupEuler(&rCrane, 0.0f, m_fCamYaw, 0.0f);
pServerDE->SetObjectRotation(m_hCrane, &rCrane);
pServerDE->SetObjectUserFlags(m_hBall, (DDWORD)m_fCamYaw);
}
}
}
// Damage brush
BEGIN_CLASS(Damage)
ADD_BOOLPROP_FLAG(ShowSurface, DFALSE, PF_HIDDEN)
ADD_STRINGPROP_FLAG(SpriteSurfaceName, "", PF_HIDDEN)
ADD_REALPROP_FLAG(SurfaceHeight, 0.0f, PF_HIDDEN)
ADD_COLORPROP_FLAG(SurfaceColor1, 0.0f, 0.0f, 0.0f, PF_HIDDEN)
ADD_COLORPROP_FLAG(SurfaceColor2, 0.0f, 0.0f, 0.0f, PF_HIDDEN)
ADD_REALPROP_FLAG(XScaleMin, 15.0f, PF_HIDDEN)
ADD_REALPROP_FLAG(XScaleMax, 25.0f, PF_HIDDEN)
ADD_REALPROP_FLAG(YScaleMin, 15.0f, PF_HIDDEN)
ADD_REALPROP_FLAG(YScaleMax, 25.0f, PF_HIDDEN)
ADD_REALPROP_FLAG(XScaleDuration, 10.0f, PF_HIDDEN)
ADD_REALPROP_FLAG(YScaleDuration, 10.0f, PF_HIDDEN)
ADD_VECTORPROP_VAL_FLAG(Current, 0.0f, 0.0f, 0.0f, PF_HIDDEN)
ADD_REALPROP_FLAG(Viscosity, 0.0f, PF_HIDDEN)
ADD_LONGINTPROP_FLAG(Code, CC_DAMAGE, PF_HIDDEN)
ADD_REALPROP(Damage, 100.0f)
ADD_LONGINTPROP(DamageType, DAMAGE_TYPE_NORMAL)
ADD_BOOLPROP_FLAG(Locked, DFALSE, PF_HIDDEN)
ADD_BOOLPROP_FLAG(UnlockKeyRemove, DFALSE, PF_HIDDEN)
ADD_STRINGPROP_FLAG(UnlockKeyName, "", PF_HIDDEN)
END_CLASS_DEFAULT(Damage, VolumeBrush, NULL, NULL)
// Minefield brush
BEGIN_CLASS(Minefield)
ADD_BOOLPROP_FLAG(ShowSurface, DFALSE, PF_HIDDEN)
ADD_STRINGPROP_FLAG(SpriteSurfaceName, "", PF_HIDDEN)
ADD_REALPROP_FLAG(SurfaceHeight, 0.0f, PF_HIDDEN)
ADD_COLORPROP_FLAG(SurfaceColor1, 0.0f, 0.0f, 0.0f, PF_HIDDEN)
ADD_COLORPROP_FLAG(SurfaceColor2, 0.0f, 0.0f, 0.0f, PF_HIDDEN)
ADD_REALPROP_FLAG(XScaleMin, 15.0f, PF_HIDDEN)
ADD_REALPROP_FLAG(XScaleMax, 25.0f, PF_HIDDEN)
ADD_REALPROP_FLAG(YScaleMin, 15.0f, PF_HIDDEN)
ADD_REALPROP_FLAG(YScaleMax, 25.0f, PF_HIDDEN)
ADD_REALPROP_FLAG(XScaleDuration, 10.0f, PF_HIDDEN)
ADD_REALPROP_FLAG(YScaleDuration, 10.0f, PF_HIDDEN)
ADD_VECTORPROP_VAL_FLAG(Current, 0.0f, 0.0f, 0.0f, PF_HIDDEN)
ADD_REALPROP_FLAG(Viscosity, 0.0f, PF_HIDDEN)
ADD_LONGINTPROP_FLAG(Code, CC_DAMAGE, PF_HIDDEN)
ADD_REALPROP_FLAG(Damage, 0.0f, PF_HIDDEN)
ADD_LONGINTPROP_FLAG(DamageType, DAMAGE_TYPE_NORMAL, PF_HIDDEN)
ADD_BOOLPROP_FLAG(Locked, DFALSE, PF_HIDDEN)
ADD_BOOLPROP_FLAG(UnlockKeyRemove, DFALSE, PF_HIDDEN)
ADD_STRINGPROP_FLAG(UnlockKeyName, "", PF_HIDDEN)
END_CLASS_DEFAULT(Minefield, VolumeBrush, NULL, NULL)
// ----------------------------------------------------------------------- //
//
// ROUTINE: Minefield::UpdatePhysics()
//
// PURPOSE: Update the physics of the passed in object
//
// ----------------------------------------------------------------------- //
void Minefield::UpdatePhysics(ContainerPhysics* pCPStruct)
{
CServerDE* pServerDE = GetServerDE();
if (!pServerDE) return;
CollisionInfo collisionInfo;
DBOOL bOnGround;
CPlayerObj *pPlayerObj;
// See if we're standing on something
pServerDE->GetStandingOn(pCPStruct->m_hObject, &collisionInfo);
bOnGround = DFALSE;
if( IsPlayer( pCPStruct->m_hObject ))
{
pPlayerObj = ( CPlayerObj * )pServerDE->HandleToObject( pCPStruct->m_hObject );
bOnGround = DTRUE;
}
else if( IsBaseCharacter( pCPStruct->m_hObject ))
{
if( collisionInfo.m_hObject )
bOnGround = DTRUE;
}
else
return;
if( bOnGround )
{
Damage( pCPStruct->m_hObject );
}
}
void Minefield::Damage( HOBJECT hObj )
{
if( !IsBaseCharacter( hObj ))
return;
CBaseCharacter *pBC = (CBaseCharacter*)g_pServerDE->HandleToObject( hObj );
if( pBC && !pBC->IsDead( ))
{
// Boom.
DVector vDir;
DVector vPos;
g_pServerDE->GetObjectPos( hObj, &vPos );
VEC_SET(vDir, 0, 1, 0);
// Do some damage, suicide-style
DamageObject( hObj,
g_pServerDE->HandleToObject( hObj ),
hObj,
500.0f, vDir, vPos,
DAMAGE_TYPE_DEATH);
AddExplosion(vPos);
}
}
void Minefield::AddExplosion(DVector &vPos)
{
CServerDE* pServerDE = BaseClass::GetServerDE();
if (!pServerDE) return;
DDWORD nType = EXP_GRENADE;
DVector vUp;
VEC_SET(vUp, 0.0f, 1.0f, 0.0f);
HMESSAGEWRITE hMessage = pServerDE->StartInstantSpecialEffectMessage(&vPos);
pServerDE->WriteToMessageByte(hMessage, SFX_EXPLOSIONFX_ID);
pServerDE->WriteToMessageVector(hMessage, &vPos);
pServerDE->WriteToMessageVector(hMessage, &vUp);
pServerDE->WriteToMessageDWord(hMessage, nType);
pServerDE->EndMessage(hMessage);
PlaySoundFromPos(&vPos, "Sounds\\Weapons\\c4\\explosion_1.wav", 1000.0f, SOUNDPRIORITY_MISC_MEDIUM);
}
DDWORD Minefield::ObjectMessageFn(HOBJECT hSender, DDWORD messageID, HMESSAGEREAD hRead)
{
CServerDE* pServerDE = GetServerDE();
switch (messageID)
{
case MID_INCONTAINER:
{
Damage( hSender );
break;
}
}
return VolumeBrush::ObjectMessageFn(hSender, messageID, hRead);
}
// freefall
BEGIN_CLASS(FreeFall)
ADD_BOOLPROP_FLAG(ShowSurface, DFALSE, PF_HIDDEN)
ADD_STRINGPROP_FLAG(SpriteSurfaceName, "", PF_HIDDEN)
ADD_REALPROP_FLAG(SurfaceHeight, 0.0f, PF_HIDDEN)
ADD_COLORPROP_FLAG(SurfaceColor1, 0.0f, 0.0f, 0.0f, PF_HIDDEN)
ADD_COLORPROP_FLAG(SurfaceColor2, 0.0f, 0.0f, 0.0f, PF_HIDDEN)
ADD_VECTORPROP_VAL_FLAG(Current, 0.0f, 0.0f, 0.0f, PF_HIDDEN)
ADD_REALPROP_FLAG(XScaleMin, 15.0f, PF_HIDDEN)
ADD_REALPROP_FLAG(XScaleMax, 25.0f, PF_HIDDEN)
ADD_REALPROP_FLAG(YScaleMin, 15.0f, PF_HIDDEN)
ADD_REALPROP_FLAG(YScaleMax, 25.0f, PF_HIDDEN)
ADD_REALPROP_FLAG(XScaleDuration, 10.0f, PF_HIDDEN)
ADD_REALPROP_FLAG(YScaleDuration, 10.0f, PF_HIDDEN)
ADD_REALPROP_FLAG(SurfaceHeight, 5.0f, PF_HIDDEN)
ADD_REALPROP_FLAG(SurfaceAlpha, 0.7f, PF_HIDDEN)
ADD_LONGINTPROP_FLAG(NumSurfacePolies, 160, PF_HIDDEN)
ADD_REALPROP_FLAG(Viscosity, 0.0f, PF_HIDDEN)
ADD_REALPROP_FLAG(Damage, 9999999.0f, PF_HIDDEN)
ADD_LONGINTPROP_FLAG(DamageType, DAMAGE_TYPE_FREEFALL, PF_HIDDEN)
ADD_LONGINTPROP_FLAG(Code, CC_FREEFALL, PF_HIDDEN)
ADD_BOOLPROP_FLAG(Locked, DFALSE, PF_HIDDEN)
ADD_BOOLPROP_FLAG(UnlockKeyRemove, DFALSE, PF_HIDDEN)
ADD_STRINGPROP_FLAG(UnlockKeyName, "", PF_HIDDEN)
END_CLASS_DEFAULT(FreeFall, VolumeBrush, NULL, NULL)
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -