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

📄 trigger.cpp

📁 Blood 2全套源码
💻 CPP
📖 第 1 页 / 共 3 页
字号:
// ----------------------------------------------------------------------- //
//
// MODULE  : Trigger.cpp
//
// PURPOSE : Trigger - Implementation
//
// CREATED : 10/6/97
//
// ----------------------------------------------------------------------- //

#include <stdio.h>
#include <string.h>
#include "Trigger.h"
#include "generic_msg_de.h"
#include "ObjectUtilities.h"
#include "ClientServerShared.h"
#include "PlayerObj.h"
#include <mbstring.h>

// Static variables...
static char *g_szLock    = "LOCK"; 
static char *g_szUnLock  = "UNLOCK";
static char *g_szTrigger = "TRIGGER";
static char *g_szRemove  = "REMOVE";
static char *g_szReset	 = "RESET";

extern CPlayerObj* g_pPlayerObj;
/*
	Trigger helper functions
*/

inline void SendTriggerMsgToObject(LPBASECLASS pSender, HOBJECT hObj, DBOOL bRemoveObject, HSTRING hMsg)
{
	if (!g_pServerDE) return;

	if (bRemoveObject)
	{
		g_pServerDE->SetObjectUserFlags(hObj, 0);	// Quick hack to fix airship door load/saves
		g_pServerDE->RemoveObject(hObj);
	}
	else
	{
		HMESSAGEWRITE hMessage;

		hMessage = g_pServerDE->StartMessageToObject(pSender, hObj, MID_TRIGGER);
		g_pServerDE->WriteToMessageHString(hMessage, hMsg);
		g_pServerDE->EndMessage(hMessage);
	}
}


void SendTriggerMsgToObjects(LPBASECLASS pSender, HSTRING hName, HSTRING hMsg)
{
	if (!g_pServerDE) return;

	DBOOL bRemoveObject = DFALSE;

	char* pMsg  = g_pServerDE->GetStringData(hMsg);
	char* pName = g_pServerDE->GetStringData(hName);

	if (!pMsg || !pName || !pName[0]) return;

	// See if it's a remove trigger
	if (_mbsicmp((const unsigned char*)pMsg, (const unsigned char*)g_szRemove) == 0)
	{
		bRemoveObject = DTRUE;
	}

	ObjectList*	pList = g_pServerDE->FindNamedObjects(pName);
	if (!pList) return;

	ObjectLink* pLink = pList->m_pFirstLink;
	while(pLink)
	{
		if (pLink)
		{
			SendTriggerMsgToObject(pSender, pLink->m_hObject, bRemoveObject, hMsg);
		}

		pLink = pLink->m_pNext;
	}
	
	g_pServerDE->RelinquishList(pList);
}


// Sends a trigger message to all objects of a class
void SendTriggerMsgToClass(LPBASECLASS pSender, HCLASS hClass, HSTRING hMsg)
{
	if (!g_pServerDE) return;

	DBOOL bRemoveObject = DFALSE;

	char* pMsg = g_pServerDE->GetStringData(hMsg);

	if (!pMsg || !hClass ) return;

	// See if it's a remove trigger
	if (_mbsicmp((const unsigned char*)pMsg, (const unsigned char*)g_szRemove) == 0)
	{
		bRemoveObject = DTRUE;
	}

	// Loop through active objects
	HOBJECT hObj = g_pServerDE->GetNextObject(DNULL);

	while (hObj)
	{
		if (g_pServerDE->IsKindOf(g_pServerDE->GetObjectClass(hObj), hClass))
		{
			SendTriggerMsgToObject(pSender, hObj, bRemoveObject, hMsg);
		}

		hObj = g_pServerDE->GetNextObject(hObj);
	}

	// Now loop through inactive objects
	hObj = g_pServerDE->GetNextInactiveObject(DNULL);
	while (hObj)
	{
		if (g_pServerDE->IsKindOf(g_pServerDE->GetObjectClass(hObj), hClass))
		{
			SendTriggerMsgToObject(pSender, hObj, bRemoveObject, hMsg);
		}

		hObj = g_pServerDE->GetNextInactiveObject(hObj);
	}
}


BEGIN_CLASS(Trigger)
	ADD_VECTORPROP_FLAG(Dims, PF_DIMS)
	ADD_REALPROP(ResetTime, 0.0f)
	ADD_STRINGPROP(ActivationSound, "")
	ADD_REALPROP(SoundRadius, 200.0f)
	ADD_STRINGPROP(TargetName1, "")
	ADD_STRINGPROP(MessageName1, "")
	ADD_REALPROP(MessageDelay, 0.0f)
	ADD_STRINGPROP(TargetName2, "")
	ADD_STRINGPROP(MessageName2, "")
	ADD_REALPROP(MessageDelay2, 0.0f)
	ADD_STRINGPROP(TargetName3, "")
	ADD_STRINGPROP(MessageName3, "")
	ADD_REALPROP(MessageDelay3, 0.0f)
	ADD_STRINGPROP(TargetName4, "")
	ADD_STRINGPROP(MessageName4, "")
	ADD_REALPROP(MessageDelay4, 0.0f)
	PROP_DEFINEGROUP(AdditionalTargets, PF_GROUP1)
		ADD_STRINGPROP_FLAG(TargetName5, "", PF_GROUP1)
		ADD_STRINGPROP_FLAG(MessageName5, "", PF_GROUP1)
		ADD_REALPROP_FLAG(MessageDelay5, 0.0f, PF_GROUP1)
		ADD_STRINGPROP_FLAG(TargetName6, "", PF_GROUP1)
		ADD_STRINGPROP_FLAG(MessageName6, "", PF_GROUP1)
		ADD_REALPROP_FLAG(MessageDelay6, 0.0f, PF_GROUP1)
		ADD_STRINGPROP_FLAG(TargetName7, "", PF_GROUP1)
		ADD_STRINGPROP_FLAG(MessageName7, "", PF_GROUP1)
		ADD_REALPROP_FLAG(MessageDelay7, 0.0f, PF_GROUP1)
		ADD_STRINGPROP_FLAG(TargetName8, "", PF_GROUP1)
		ADD_STRINGPROP_FLAG(MessageName8, "", PF_GROUP1)
		ADD_REALPROP_FLAG(MessageDelay8, 0.0f, PF_GROUP1)
		ADD_STRINGPROP_FLAG(TargetName9, "", PF_GROUP1)
		ADD_STRINGPROP_FLAG(MessageName9, "", PF_GROUP1)
		ADD_REALPROP_FLAG(MessageDelay9, 0.0f, PF_GROUP1)
		ADD_STRINGPROP_FLAG(TargetName10, "", PF_GROUP1)
		ADD_STRINGPROP_FLAG(MessageName10, "", PF_GROUP1)
		ADD_REALPROP_FLAG(MessageDelay10, 0.0f, PF_GROUP1)

	ADD_BOOLPROP(TouchActivate, DTRUE)
	ADD_BOOLPROP(PlayerActivate, DTRUE)
	ADD_BOOLPROP(AIActivate, DTRUE)
	ADD_BOOLPROP(ObjectActivate, DFALSE)
	ADD_BOOLPROP(TriggerRelayActivate, DTRUE)
	ADD_BOOLPROP(NamedObjectActivate, DFALSE)
	ADD_STRINGPROP(ActivationObjectName, "")
	
	ADD_LONGINTPROP(ActivationCount, 1)
	ADD_BOOLPROP(Locked, DFALSE)
//	ADD_STRINGPROP(LockedMsg, "")
	ADD_STRINGPROP(LockedSound, "")
//	ADD_STRINGPROP(UnlockedMsg, "")
	ADD_STRINGPROP(UnlockedSound, "")
	ADD_STRINGPROP(UnlockKeyName, "Key")
END_CLASS_DEFAULT(Trigger, B2BaseClass, NULL, NULL)


// ----------------------------------------------------------------------- //
//
//	ROUTINE:	Trigger::Trigger()
//
//	PURPOSE:	Initialize object
//
// ----------------------------------------------------------------------- //

Trigger::Trigger() : B2BaseClass(OT_NORMAL)
{
	m_fTriggerResetTime		= 0.0f;

	for (int i=0;i < MAX_TRIGGER_MESSAGES; i++)
	{
		m_hstrTargetName[i]		= DNULL;
		m_hstrMessageName[i]	= DNULL;
		m_fTriggerMessageDelay[i] = 0.0f;
		m_bDelay[i]				= DFALSE;
	}
	m_fMaxTriggerMessageDelay = 0.0f;
	m_fDelayStartTime		= 0.0f;

	m_hstrActivationSound	= DNULL;
	m_fSoundRadius			= 200.0f;
	m_bActive				= DTRUE;
//	m_bDelay				= DFALSE;

	m_bTouchActivate		= DTRUE;
	m_bPlayerActivate		= DTRUE;
	m_bAIActivate			= DTRUE;
	m_bObjectActivate		= DFALSE;
	m_bTriggerRelayActivate = DTRUE;
	m_bNamedObjectActivate	= DFALSE;
	m_hstrActivationObjectName = DNULL;
	VEC_INIT(m_vDims);
	m_hLastSender			= DNULL;

	m_bLocked				= DFALSE;
	m_hstrLockedMsg			= DNULL;
	m_hstrLockedSound		= DNULL;
	m_hstrUnlockedMsg		= DNULL;
	m_hstrUnlockedSound		= DNULL;
	m_hstrKeyName			= DNULL;

	m_nCurrentActivation	= 0;
	m_nActivationCount		= 1;

	m_bSending				= DFALSE;
}


// ----------------------------------------------------------------------- //
//
//	ROUTINE:	Trigger::~Trigger()
//
//	PURPOSE:	Deallocate object
//
// ----------------------------------------------------------------------- //

Trigger::~Trigger()
{
	if (!g_pServerDE) return;

	for (int i=0;i < MAX_TRIGGER_MESSAGES; i++)
	{
		if (m_hstrTargetName[i])
		{
			g_pServerDE->FreeString(m_hstrTargetName[i]);
		}

		if (m_hstrMessageName[i])
		{
			g_pServerDE->FreeString(m_hstrMessageName[i]);
		}
	}

	if (m_hstrActivationObjectName)
	{
		g_pServerDE->FreeString(m_hstrActivationObjectName);
	}

	if (m_hstrLockedMsg)
		g_pServerDE->FreeString(m_hstrLockedMsg);

	if (m_hstrLockedSound)
		g_pServerDE->FreeString(m_hstrLockedSound);

	if (m_hstrUnlockedMsg)
		g_pServerDE->FreeString(m_hstrUnlockedMsg);

	if (m_hstrUnlockedSound)
		g_pServerDE->FreeString(m_hstrUnlockedSound);

	if (m_hstrKeyName)
		g_pServerDE->FreeString(m_hstrKeyName);

	if( m_hstrActivationSound )
		g_pServerDE->FreeString( m_hstrActivationSound );
}



// ----------------------------------------------------------------------- //
//
//	ROUTINE:	Trigger::ReadProp
//
//	PURPOSE:	Set property value
//
// ----------------------------------------------------------------------- //

DBOOL Trigger::ReadProp(ObjectCreateStruct *pStruct)
{
	if (!g_pServerDE) return DFALSE;

	GenericProp genProp;

	for (int i=0; i < MAX_TRIGGER_MESSAGES; i++)
	{
		char key[40];

		sprintf(key, "TargetName%d", i+1);
		if (g_pServerDE->GetPropGeneric(key, &genProp) == DE_OK)
		{
			if (genProp.m_String[0])
				 m_hstrTargetName[i] = g_pServerDE->CreateString(genProp.m_String);
		}

		sprintf(key, "MessageName%d", i+1);
		if (g_pServerDE->GetPropGeneric(key, &genProp) == DE_OK)
		{
			if (genProp.m_String[0])
				 m_hstrMessageName[i] = g_pServerDE->CreateString(genProp.m_String);
		}

		if (i+1 > 1)
			sprintf(key, "MessageDelay%d", i+1);
		else
			sprintf(key, "MessageDelay");		// for backwards compatibility
		if (g_pServerDE->GetPropGeneric(key, &genProp) == DE_OK)
		{
			m_fTriggerMessageDelay[i] = genProp.m_Float;

			// Keep track of the max
			if (m_fTriggerMessageDelay[i] > m_fMaxTriggerMessageDelay)
				m_fMaxTriggerMessageDelay = m_fTriggerMessageDelay[i];
		}
	}

	if (g_pServerDE->GetPropGeneric("ActivationSound", &genProp) == DE_OK)
	{
		if (genProp.m_String[0])
			 m_hstrActivationSound = g_pServerDE->CreateString(genProp.m_String);
	}

	if (g_pServerDE->GetPropGeneric("ActivationObjectName", &genProp) == DE_OK)
	{
		if (genProp.m_String[0])
			 m_hstrActivationObjectName = g_pServerDE->CreateString(genProp.m_String);
	}

	if (g_pServerDE->GetPropGeneric("Dims", &genProp) == DE_OK)
	{
		VEC_COPY(m_vDims, genProp.m_Vec);
	}

	if (g_pServerDE->GetPropGeneric("ResetTime", &genProp) == DE_OK)
	{
		m_fTriggerResetTime = genProp.m_Float;
	}

//	if (g_pServerDE->GetPropGeneric("MessageDelay", &genProp) == DE_OK)
//	{
//		m_fTriggerMessageDelay = genProp.m_Float;
//	}

	if (g_pServerDE->GetPropGeneric("TouchActivate", &genProp) == DE_OK)
	{
		m_bTouchActivate = genProp.m_Bool;
	}

	if (g_pServerDE->GetPropGeneric("PlayerActivate", &genProp) == DE_OK)
	{
		m_bPlayerActivate = genProp.m_Bool;
	}

	if (g_pServerDE->GetPropGeneric("AIActivate", &genProp) == DE_OK)
	{
		m_bAIActivate = genProp.m_Bool;
	}

	if (g_pServerDE->GetPropGeneric("TriggerRelayActivate", &genProp) == DE_OK)
	{
		m_bTriggerRelayActivate = genProp.m_Bool;
	}

	if (g_pServerDE->GetPropGeneric("ObjectActivate", &genProp) == DE_OK)
	{
		m_bObjectActivate = genProp.m_Bool;
	}

	if (g_pServerDE->GetPropGeneric("NamedObjectActivate", &genProp) == DE_OK)
	{
		m_bNamedObjectActivate = genProp.m_Bool;
	}

	if (g_pServerDE->GetPropGeneric("ActivationObjectName", &genProp) == DE_OK)
	{
		if (genProp.m_String[0])
			 m_hstrActivationObjectName = g_pServerDE->CreateString(genProp.m_String);
	}

	if (g_pServerDE->GetPropGeneric("Locked", &genProp) == DE_OK)
		m_bLocked = genProp.m_Bool;

	if (g_pServerDE->GetPropGeneric("LockedMsg", &genProp) == DE_OK)
	{
		if (genProp.m_String[0])
			 m_hstrLockedMsg = g_pServerDE->CreateString(genProp.m_String);
	}

	if (g_pServerDE->GetPropGeneric("LockedSound", &genProp) == DE_OK)
	{
		if (genProp.m_String[0])
			 m_hstrLockedSound = g_pServerDE->CreateString(genProp.m_String);
	}

	if (g_pServerDE->GetPropGeneric("UnlockedMsg", &genProp) == DE_OK)
	{
		if (genProp.m_String[0])
			 m_hstrUnlockedMsg = g_pServerDE->CreateString(genProp.m_String);
	}

	if (g_pServerDE->GetPropGeneric("UnlockedSound", &genProp) == DE_OK)
	{
		if (genProp.m_String[0])
			 m_hstrUnlockedSound = g_pServerDE->CreateString(genProp.m_String);
	}

	if (g_pServerDE->GetPropGeneric("UnlockKeyName", &genProp) == DE_OK)
	{
		if (genProp.m_String[0])
			 m_hstrKeyName = g_pServerDE->CreateString(genProp.m_String);
	}

	if (g_pServerDE->GetPropGeneric("ActivationCount", &genProp) == DE_OK)
		m_nActivationCount = genProp.m_Long;

	return DTRUE;
}


// ----------------------------------------------------------------------- //
//
//	ROUTINE:	Trigger::ObjectTouch
//
//	PURPOSE:	Handle object touch
//
// ----------------------------------------------------------------------- //

void Trigger::ObjectTouch (HOBJECT hObj)
{
	if (!g_pServerDE) return;
  

⌨️ 快捷键说明

复制代码 Ctrl + C
搜索代码 Ctrl + F
全屏模式 F11
切换主题 Ctrl + Shift + D
显示快捷键 ?
增大字号 Ctrl + =
减小字号 Ctrl + -