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

📄 trigger.cpp

📁 Blood 2全套源码
💻 CPP
📖 第 1 页 / 共 3 页
字号:
	if (!hObj) return bRetVal;

	// first check for a trigger relay
	if (m_bTriggerRelayActivate && g_pServerDE->IsKindOf(hObjClass, hTriggerObj))
	{
		bRetVal = DTRUE;
	}
	else if (g_pServerDE->IsKindOf(hObjClass, hPlayerObj))
	{
		if (m_bPlayerActivate)
		{
			if (m_bLocked && m_hstrKeyName)
			{
				// See if he has the key we need to unlock.. Trigger should become unlocked.
				HMESSAGEWRITE hMessage = g_pServerDE->StartMessageToObject((LPBASECLASS)this, hObj, MID_KEYQUERY);
				g_pServerDE->WriteToMessageHString(hMessage, m_hstrKeyName);
				g_pServerDE->EndMessage(hMessage);
			}
			if (!m_bLocked)
				bRetVal = DTRUE;
			else
			{
				if (m_hstrLockedSound && IsPlayer(hObj))
				{
					if (GetGameType() == GAMETYPE_ACTION && g_pPlayerObj)
					{
						HSTRING hstr = g_pServerDE->FormatString(IDS_GENERAL_LOCKED);
						g_pPlayerObj->SendConsoleMessage(g_pServerDE->GetStringData(hstr));
						g_pServerDE->FreeString(hstr);
//						g_pPlayerObj->SendConsoleMessage("Locked!");
					}
					else
					{
						char *pSound = g_pServerDE->GetStringData(m_hstrLockedSound);
						PlaySoundFromObject(hObj, pSound, 200.0f, SOUNDPRIORITY_MISC_HIGH);
					}
				}
			}
		}
	}
	else if (g_pServerDE->IsKindOf(hObjClass, hAIObj))
	{
		if (m_bAIActivate)
			bRetVal = DTRUE;
	}
	else if (m_bObjectActivate)
	{
		bRetVal = DTRUE;
	}

	// If object is triggerable, see if only ActivationObjectName can trigger it.
	if (bRetVal && m_bNamedObjectActivate && m_hstrActivationObjectName)
	{
		char *pName = g_pServerDE->GetObjectName(hObj);

		if (!pName || _mbsicmp((const unsigned char*)pName, (const unsigned char*)g_pServerDE->GetStringData(m_hstrActivationObjectName)) != 0)
			bRetVal = DFALSE;
	}

	return bRetVal;
}


void Trigger::Setup(DBOOL bActive, char *pszTarget, char *pszMessage, DBOOL bTouchActivate,
					DBOOL bPlayerActivate, DBOOL bAIActivate, DBOOL bObjectActivate, 
					DBOOL bTriggerRelayActivate, DBOOL bNamedObjectActivate, 
					HSTRING hstrActivationObjectName, DBOOL bLocked,
					HSTRING hstrLockedMsg, HSTRING hstrLockedSound, HSTRING hstrUnlockedMsg, 
					HSTRING hstrUnlockedSound, HSTRING hstrKeyName)
{
	if (!g_pServerDE) return;

	SetActive(bActive);
	SetTargetName(0, pszTarget);
	SetMessageName(0, pszMessage);

	m_bTouchActivate		= bTouchActivate;
	m_bPlayerActivate		= bPlayerActivate;
	m_bAIActivate			= bAIActivate;
	m_bObjectActivate		= bObjectActivate;
	m_bTriggerRelayActivate = bTriggerRelayActivate;
	m_bNamedObjectActivate	= bNamedObjectActivate;
	m_bLocked				= bLocked;

	if (hstrActivationObjectName)
	{
		if (m_hstrActivationObjectName)
		{
			g_pServerDE->FreeString(m_hstrActivationObjectName);
		}
		m_hstrActivationObjectName = g_pServerDE->CopyString(hstrActivationObjectName);
	}

	if (hstrLockedMsg)
	{
		if (m_hstrLockedMsg)
		{
			g_pServerDE->FreeString(m_hstrLockedMsg);
		}
		m_hstrLockedMsg = g_pServerDE->CopyString(hstrLockedMsg);
	}

	if (hstrLockedSound)
	{
		if (m_hstrLockedSound)
		{
			g_pServerDE->FreeString(m_hstrLockedSound);
		}
		m_hstrLockedSound = g_pServerDE->CopyString(hstrLockedSound);
	}

	if (hstrUnlockedMsg)
	{
		if (m_hstrUnlockedMsg)
		{
			g_pServerDE->FreeString(m_hstrUnlockedMsg);
		}
		m_hstrUnlockedMsg = g_pServerDE->CopyString(hstrUnlockedMsg);
	}

	if (hstrUnlockedSound)
	{
		if (m_hstrUnlockedSound)
		{
			g_pServerDE->FreeString(m_hstrUnlockedSound);
		}
		m_hstrUnlockedSound = g_pServerDE->CopyString(hstrUnlockedSound);
	}

	if (hstrKeyName)
	{
		if (m_hstrKeyName)
		{
			g_pServerDE->FreeString(m_hstrKeyName);
		}
		m_hstrKeyName = g_pServerDE->CopyString(hstrKeyName);
	}

}


// ----------------------------------------------------------------------- //
//
//	ROUTINE:	Trigger::Save
//
//	PURPOSE:	Save the object
//
// ----------------------------------------------------------------------- //

void Trigger::Save(HMESSAGEWRITE hWrite, DDWORD dwSaveFlags)
{
	CServerDE* pServerDE = GetServerDE();
	if (!pServerDE || !hWrite) return;

	DFLOAT fTime = pServerDE->GetTime();

	pServerDE->WriteToMessageByte(hWrite, m_bActive);
	pServerDE->WriteToMessageVector(hWrite, &m_vDims);
	pServerDE->WriteToMessageFloat(hWrite, m_fTriggerResetTime);

	pServerDE->WriteToMessageHString(hWrite, m_hstrActivationSound);
	pServerDE->WriteToMessageFloat(hWrite, m_fSoundRadius);

	for (int i=0; i < MAX_TRIGGER_MESSAGES; i++)
	{
		pServerDE->WriteToMessageHString(hWrite, m_hstrTargetName[i]);
		pServerDE->WriteToMessageHString(hWrite, m_hstrMessageName[i]);
		pServerDE->WriteToMessageFloat(hWrite, m_fTriggerMessageDelay[i]);
		pServerDE->WriteToMessageByte(hWrite, m_bDelay[i]);
	}
	pServerDE->WriteToMessageFloat(hWrite, m_fMaxTriggerMessageDelay);
	pServerDE->WriteToMessageFloat(hWrite, m_fDelayStartTime - fTime);

	pServerDE->WriteToMessageByte(hWrite, m_bTouchActivate);
	pServerDE->WriteToMessageByte(hWrite, m_bPlayerActivate);
	pServerDE->WriteToMessageByte(hWrite, m_bAIActivate);
	pServerDE->WriteToMessageByte(hWrite, m_bObjectActivate);
	pServerDE->WriteToMessageByte(hWrite, m_bTriggerRelayActivate);
	pServerDE->WriteToMessageByte(hWrite, m_bNamedObjectActivate);
	pServerDE->WriteToMessageByte(hWrite, m_bLocked);

	pServerDE->WriteToMessageDWord(hWrite, m_nActivationCount);
	pServerDE->WriteToMessageDWord(hWrite, m_nCurrentActivation);

	pServerDE->WriteToMessageHString(hWrite, m_hstrLockedMsg);
	pServerDE->WriteToMessageHString(hWrite, m_hstrLockedSound);
	pServerDE->WriteToMessageHString(hWrite, m_hstrUnlockedMsg);
	pServerDE->WriteToMessageHString(hWrite, m_hstrUnlockedSound);
	pServerDE->WriteToMessageHString(hWrite, m_hstrKeyName);

	pServerDE->WriteToMessageHString(hWrite, m_hstrActivationObjectName);
}


// ----------------------------------------------------------------------- //
//
//	ROUTINE:	Trigger::Load
//
//	PURPOSE:	Load the object
//
// ----------------------------------------------------------------------- //

void Trigger::Load(HMESSAGEREAD hRead, DDWORD dwLoadFlags)
{
	CServerDE* pServerDE = GetServerDE();
	if (!pServerDE || !hRead) return;

	DFLOAT fTime = pServerDE->GetTime();

	m_bActive				= pServerDE->ReadFromMessageByte(hRead);
	pServerDE->ReadFromMessageVector(hRead, &m_vDims);
	m_fTriggerResetTime		= pServerDE->ReadFromMessageFloat(hRead);

	m_hstrActivationSound	= pServerDE->ReadFromMessageHString(hRead);
	m_fSoundRadius			= pServerDE->ReadFromMessageFloat(hRead);

	for (int i=0; i < MAX_TRIGGER_MESSAGES; i++)
	{
		m_hstrTargetName[i]		= pServerDE->ReadFromMessageHString(hRead);
		m_hstrMessageName[i]	= pServerDE->ReadFromMessageHString(hRead);
		m_fTriggerMessageDelay[i]	= pServerDE->ReadFromMessageFloat(hRead);
		m_bDelay[i]			= pServerDE->ReadFromMessageByte(hRead);
	}
	m_fMaxTriggerMessageDelay	= pServerDE->ReadFromMessageFloat(hRead);
	m_fDelayStartTime		= pServerDE->ReadFromMessageFloat(hRead) + fTime;

	m_bTouchActivate		= pServerDE->ReadFromMessageByte(hRead);
	m_bPlayerActivate		= pServerDE->ReadFromMessageByte(hRead);
	m_bAIActivate			= pServerDE->ReadFromMessageByte(hRead);
	m_bObjectActivate		= pServerDE->ReadFromMessageByte(hRead);
	m_bTriggerRelayActivate = pServerDE->ReadFromMessageByte(hRead);
	m_bNamedObjectActivate	= pServerDE->ReadFromMessageByte(hRead);
	m_bLocked				= pServerDE->ReadFromMessageByte(hRead);

	m_nActivationCount		= pServerDE->ReadFromMessageDWord(hRead);
	m_nCurrentActivation	= pServerDE->ReadFromMessageDWord(hRead);

	m_hstrLockedMsg			= pServerDE->ReadFromMessageHString(hRead);
	m_hstrLockedSound		= pServerDE->ReadFromMessageHString(hRead);
	m_hstrUnlockedMsg		= pServerDE->ReadFromMessageHString(hRead);
	m_hstrUnlockedSound		= pServerDE->ReadFromMessageHString(hRead);
	m_hstrKeyName			= pServerDE->ReadFromMessageHString(hRead);

	m_hstrActivationObjectName	= pServerDE->ReadFromMessageHString(hRead);
}



BEGIN_CLASS(BigTrigger)
END_CLASS_DEFAULT(BigTrigger, Trigger, NULL, NULL)



BEGIN_CLASS(ToggleTrigger)
	ADD_STRINGPROP(OffMessageName1, "")
	ADD_STRINGPROP(OffMessageName2, "")
	ADD_STRINGPROP(OffMessageName3, "")
	ADD_STRINGPROP(OffMessageName4, "")
	ADD_STRINGPROP(OffMessageName5, "")
	ADD_STRINGPROP(OffMessageName6, "")
	ADD_STRINGPROP(OffMessageName7, "")
	ADD_STRINGPROP(OffMessageName8, "")
	ADD_STRINGPROP(OffMessageName9, "")
	ADD_STRINGPROP(OffMessageName10, "")
	ADD_BOOLPROP(StartOn, DFALSE)
END_CLASS_DEFAULT(ToggleTrigger, Trigger, NULL, NULL)


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

ToggleTrigger::ToggleTrigger()
{
	for (int i=0;i < MAX_TRIGGER_MESSAGES; i++)
	{
		m_hstrOffMessageName[i]	= DNULL;
	}

	m_bOn = DFALSE;
}


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

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

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



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

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

	char buf[MAX_CS_FILENAME_LEN];

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

		sprintf(key, "OffMessageName%d", i+1);
		buf[0] = '\0';
		g_pServerDE->GetPropString(key, buf, MAX_CS_FILENAME_LEN);
		if (buf[0]) m_hstrOffMessageName[i] = g_pServerDE->CreateString(buf);
	}

	g_pServerDE->GetPropBool("StartOn", &m_bOn);

	return DTRUE;
}


// ------------------------------------------------------------ //
//
//	ROUTINE:	ToggleTrigger::EngineMessageFn
//
//	PURPOSE:	Handle engine messages
//
// ----------------------------------------------------------------------- //
DDWORD ToggleTrigger::EngineMessageFn(DDWORD messageID, void *pData, float fData)
{
	switch(messageID)
	{
		case MID_PRECREATE:
		{
			if (fData == PRECREATE_WORLDFILE || fData == PRECREATE_STRINGPROP)
			{
				ReadProp((ObjectCreateStruct*)pData);
			}
			break;
		}

		case MID_SAVEOBJECT:
			Save((HMESSAGEWRITE)pData, (DDWORD)fData);
			break;

		case MID_LOADOBJECT:
			Load((HMESSAGEREAD)pData, (DDWORD)fData);
			break;

		default : break;
	}

	return Trigger::EngineMessageFn(messageID, pData, fData);
}


// ----------------------------------------------------------------------- //
//
//	ROUTINE:	ToggleTrigger::SendMessages
//
//	PURPOSE:	Sends the trigger messages
//
// ----------------------------------------------------------------------- //
void ToggleTrigger::SendMessages()
{
	g_pServerDE->SetNextUpdate(m_hObject, m_fTriggerResetTime);

	for (int i=0; i < MAX_TRIGGER_MESSAGES; i++)
	{
		HSTRING hstrMessage = m_bOn ? m_hstrOffMessageName[i] : m_hstrMessageName[i];

		if (m_hstrTargetName[i] && hstrMessage)
		{
			SendTriggerMsgToObjects(this, m_hstrTargetName[i], hstrMessage);
		}

	}
	m_bOn = !m_bOn;
}


// ----------------------------------------------------------------------- //
//
//	ROUTINE:	ToggleTrigger::Save
//
//	PURPOSE:	Save the object
//
// ----------------------------------------------------------------------- //

void ToggleTrigger::Save(HMESSAGEWRITE hWrite, DDWORD dwSaveFlags)
{
	CServerDE* pServerDE = GetServerDE();
	if (!pServerDE || !hWrite) return;

	for (int i=0; i < MAX_TRIGGER_MESSAGES; i++)
	{
		pServerDE->WriteToMessageHString(hWrite, m_hstrOffMessageName[i]);
	}

	pServerDE->WriteToMessageByte(hWrite, m_bOn);
}


// ----------------------------------------------------------------------- //
//
//	ROUTINE:	ToggleTrigger::Load
//
//	PURPOSE:	Load the object
//
// ----------------------------------------------------------------------- //

void ToggleTrigger::Load(HMESSAGEREAD hRead, DDWORD dwSaveFlags)
{
	CServerDE* pServerDE = GetServerDE();
	if (!pServerDE || !hRead) return;

	for (int i=0; i < MAX_TRIGGER_MESSAGES; i++)
	{
		m_hstrOffMessageName[i]	= pServerDE->ReadFromMessageHString(hRead);
	}

	m_bOn = pServerDE->ReadFromMessageByte(hRead);
}



⌨️ 快捷键说明

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