📄 trigger.cpp
字号:
// ----------------------------------------------------------------------- //
//
// 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 + -