⭐ 欢迎来到虫虫下载站! | 📦 资源下载 📁 资源专辑 ℹ️ 关于我们
⭐ 虫虫下载站

📄 triplaser.cpp

📁 Blood 2全套源码
💻 CPP
📖 第 1 页 / 共 2 页
字号:
// ----------------------------------------------------------------------- //
//
// 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 + -