📄 triplaser.cpp
字号:
// ----------------------------------------------------------------------- //
//
// MODULE : TripLaser.cpp
//
// PURPOSE : TripLaser - Implementation
//
// CREATED : 10/23/97
//
// ----------------------------------------------------------------------- //
#include "TripLaser.h"
#include "Generic_msg_de.h"
#include "ClientServerShared.h"
#include "Trigger.h"
#include "ObjectUtilities.h"
#include <mbstring.h>
#include "SoundTypes.h"
// Static global variables..
static char *g_szTriggerOn = "TRIGGER";
static char *g_szTriggerOff = "TRIGGEROFF";
static char *g_szTriggerKill = "KILL";
#define DAMAGE_UPDATE_DELTA 0.1f
void CreateEndObject(DVector &vPos);
BEGIN_CLASS(TripLaser)
ADD_STRINGPROP_FLAG(Filename, "Models\\default.abc", PF_HIDDEN)
ADD_STRINGPROP_FLAG(Skin, "Skins\\ammo\\beamred.dtx", PF_HIDDEN)
ADD_VECTORPROP_VAL_FLAG(Dims, 1.0f, 20.0f, 1.0f, PF_DIMS | PF_LOCALDIMS)
ADD_COLORPROP(Color, 255.0f, 0.0f, 0.0f)
ADD_REALPROP(Alpha, 0.5f)
ADD_BOOLPROP(StartOn, DFALSE)
ADD_STRINGPROP(TouchTriggerTarget, "")
ADD_STRINGPROP(TouchTriggerMessage, "")
ADD_STRINGPROP(Sound, "")
ADD_STRINGPROP(TouchSound, "")
ADD_REALPROP(Damage, 10.0f)
END_CLASS_DEFAULT(TripLaser, B2BaseClass, NULL, NULL)
// ----------------------------------------------------------------------- //
//
// ROUTINE: TripLaser::TripLaser
//
// PURPOSE: Initialize
//
// ----------------------------------------------------------------------- //
TripLaser::TripLaser() : B2BaseClass(OT_MODEL)
{
VEC_INIT(m_vDims);
VEC_SET(m_vColor, 255.0f, 0.0f, 0.0f);
m_fAlpha = 0.8f;
VEC_INIT(m_vEndPoints[0]);
VEC_INIT(m_vEndPoints[1]);
m_dwFlags = 0;
m_hstrTriggerTarget = DNULL;
m_hstrTriggerMessage = DNULL;
m_hstrSound = DNULL;
m_hstrTouchSound = DNULL;
m_hSound = DNULL;
m_bTriggered = DFALSE;
m_fDamage = 10.0f;
m_fDamageTime = 0.0f;
m_bRemove = DFALSE;
}
// ----------------------------------------------------------------------- //
//
// ROUTINE: TripLaser::~TripLaser()
//
// PURPOSE: Deallocate object
//
// ----------------------------------------------------------------------- //
TripLaser::~TripLaser()
{
CServerDE* pServerDE = GetServerDE();
if (m_hstrTriggerTarget)
{
pServerDE->FreeString(m_hstrTriggerTarget);
m_hstrTriggerTarget = DNULL;
}
if (m_hstrTriggerMessage)
{
pServerDE->FreeString(m_hstrTriggerMessage);
m_hstrTriggerMessage = DNULL;
}
if (m_hstrSound)
{
pServerDE->FreeString(m_hstrSound);
m_hstrSound = DNULL;
}
if (m_hstrTouchSound)
{
pServerDE->FreeString(m_hstrTouchSound);
m_hstrTouchSound = DNULL;
}
if (m_hSound)
{
pServerDE->KillSound(m_hSound);
}
}
// ----------------------------------------------------------------------- //
//
// ROUTINE: TripLaser::EngineMessageFn
//
// PURPOSE: Handle engine messages
//
// ----------------------------------------------------------------------- //
DDWORD TripLaser::EngineMessageFn(DDWORD messageID, void *pData, DFLOAT fData)
{
switch(messageID)
{
case MID_UPDATE:
{
Update();
break;
}
case MID_PRECREATE:
{
DDWORD dwRet = B2BaseClass::EngineMessageFn(messageID, pData, fData);
ObjectCreateStruct *pStruct = (ObjectCreateStruct*)pData;
if (fData == PRECREATE_WORLDFILE || fData == PRECREATE_STRINGPROP)
ReadProp(pStruct);
_mbscpy((unsigned char*)pStruct->m_Filename, (const unsigned char*)"Models\\default.abc");
_mbscpy((unsigned char*)pStruct->m_SkinName, (const unsigned char*)"Skins\\ammo\\beamred.dtx");
return dwRet;
break;
}
case MID_INITIALUPDATE:
{
if (fData != INITIALUPDATE_SAVEGAME)
InitialUpdate();
break;
}
case MID_TOUCHNOTIFY:
{
HandleTouch((HOBJECT)pData);
break;
}
case MID_SAVEOBJECT:
Save((HMESSAGEWRITE)pData, (DDWORD)fData);
break;
case MID_LOADOBJECT:
Load((HMESSAGEREAD)pData, (DDWORD)fData);
break;
default : break;
}
return B2BaseClass::EngineMessageFn(messageID, pData, fData);
}
// --------------------------------------------------------------------------- //
//
// ROUTINE: TripLaser::ObjectMessageFn()
//
// PURPOSE: Handler for server object messages.
//
// --------------------------------------------------------------------------- //
DDWORD TripLaser::ObjectMessageFn(HOBJECT hSender, DDWORD messageID, HMESSAGEREAD hRead)
{
CServerDE* pServerDE = GetServerDE();
switch (messageID)
{
case MID_TRIGGER:
HSTRING hMsg = pServerDE->ReadFromMessageHString(hRead);
TriggerMsg(hSender, hMsg);
pServerDE->FreeString(hMsg);
break;
}
return B2BaseClass::ObjectMessageFn(hSender, messageID, hRead);
}
// ----------------------------------------------------------------------- //
//
// ROUTINE: TripLaser::ReadProp
//
// PURPOSE: Set property value
//
// ----------------------------------------------------------------------- //
DBOOL TripLaser::ReadProp(ObjectCreateStruct *pStruct)
{
CServerDE* pServerDE = GetServerDE();
if (!pServerDE || !pStruct) return DFALSE;
pServerDE->GetPropVector("Dims", &m_vDims);
pServerDE->GetPropVector("Color", &m_vColor);
pServerDE->GetPropReal("Alpha", &m_fAlpha);
pServerDE->GetPropBool("StartOn", &m_bTriggered);
pServerDE->GetPropReal("Damage", &m_fDamage);
char buf[MAX_CS_FILENAME_LEN];
buf[0] = '\0';
pServerDE->GetPropString("TouchTriggerTarget", buf, MAX_CS_FILENAME_LEN);
if (buf[0]) m_hstrTriggerTarget = pServerDE->CreateString(buf);
buf[0] = '\0';
pServerDE->GetPropString("TouchTriggerMessage", buf, MAX_CS_FILENAME_LEN);
if (buf[0]) m_hstrTriggerMessage = pServerDE->CreateString(buf);
buf[0] = '\0';
pServerDE->GetPropString("Sound", buf, MAX_CS_FILENAME_LEN);
if (buf[0]) m_hstrSound = pServerDE->CreateString(buf);
buf[0] = '\0';
pServerDE->GetPropString("TouchSound", buf, MAX_CS_FILENAME_LEN);
if (buf[0]) m_hstrTouchSound = pServerDE->CreateString(buf);
return DTRUE;
}
// ----------------------------------------------------------------------- //
//
// ROUTINE: TripLaser::InitialUpdate
//
// PURPOSE: Update - If this is called, the laser is switching off.
//
// ----------------------------------------------------------------------- //
void TripLaser::Update()
{
CServerDE* pServerDE = GetServerDE();
if (!pServerDE) return;
// Flicker the light back on for a short time..
if (!m_bTriggered)
{
DDWORD dwFlags = pServerDE->GetObjectFlags(m_hObject);
// Already visible - hide it
if (dwFlags & FLAG_VISIBLE)
{
pServerDE->SetObjectFlags(m_hObject, m_dwFlags);
if (m_bRemove)
pServerDE->RemoveObject(m_hObject);
else
pServerDE->SetNextUpdate(m_hObject, 0.0f);
}
else
{
pServerDE->SetObjectFlags(m_hObject, m_dwFlags | FLAG_VISIBLE);
DFLOAT fNextUpdate = pServerDE->Random(0.2f, 0.3f);
pServerDE->SetNextUpdate(m_hObject, fNextUpdate);
}
}
}
// ----------------------------------------------------------------------- //
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -