📄 cameraobj.cpp
字号:
// ----------------------------------------------------------------------- //
//
// MODULE : CameraObj.cpp
//
// PURPOSE : CameraObj object will be used to place cameras for
// scripted scenes.
//
// CREATED : 02/17/98
//
// ----------------------------------------------------------------------- //
#include "CameraObj.h"
#include "Generic_msg_de.h"
#include "ClientCastLineSFX.h"
#include "ClientServerShared.h"
#include "SfxMsgIDs.h"
#include "SharedDefs.h"
#include <mbstring.h>
DLink CameraObj::m_CameraHead;
DDWORD CameraObj::m_dwNumCameras = 0;
BEGIN_CLASS(CameraObj)
ADD_LONGINTPROP(Type, CAMTYPE_FULLSCREEN)
ADD_REALPROP(ActiveTime, -1)
ADD_BOOLPROP(AllowPlayerMovement, DFALSE)
ADD_BOOLPROP(StartActive, DFALSE)
ADD_BOOLPROP(IsListener, DTRUE)
ADD_BOOLPROP(HidePlayer, DFALSE)
ADD_BOOLPROP_FLAG(TypeActionMode, DFALSE, PF_GROUP6)
END_CLASS_DEFAULT(CameraObj, B2BaseClass, NULL, NULL)
// Used by the player object to set the view if a camera is active
HOBJECT g_hActiveCamera;
// ----------------------------------------------------------------------- //
//
// ROUTINE: CameraObj::CameraObj()
//
// PURPOSE: Initialize object
//
// ----------------------------------------------------------------------- //
CameraObj::CameraObj() : B2BaseClass(OT_NORMAL)
{
m_bActive = DFALSE;
m_bStartActive = DFALSE;
m_bIsListener = DTRUE;
m_fActiveTime = -1;
m_fDeactivateTime = 0;
m_bPlayerMovement = DFALSE;
m_nType = CAMTYPE_FULLSCREEN;
m_hRay = DNULL;
m_hLinkObject = DNULL;
m_Link.m_pData = DNULL;
m_bHidePlayer = DFALSE;
if( m_dwNumCameras == 0 )
{
dl_TieOff( &m_CameraHead );
}
}
// ----------------------------------------------------------------------- //
//
// ROUTINE: CameraObj::~CameraObj()
//
// PURPOSE: Deallocate object
//
// ----------------------------------------------------------------------- //
CameraObj::~CameraObj()
{
SetActive(DFALSE);
if( m_Link.m_pData && m_dwNumCameras > 0 )
{
dl_Remove( &m_Link );
m_dwNumCameras--;
}
}
// ----------------------------------------------------------------------- //
//
// ROUTINE: CameraObj::EngineMessageFn
//
// PURPOSE: Handle engine messages
//
// ----------------------------------------------------------------------- //
DDWORD CameraObj::EngineMessageFn(DDWORD messageID, void *pData, DFLOAT fData)
{
if (!g_pServerDE) return 0;
switch(messageID)
{
case MID_UPDATE:
{
if (!Update())
{
g_pServerDE->RemoveObject(m_hObject);
}
}
break;
case MID_LINKBROKEN:
{
HOBJECT hObj = (HOBJECT)pData;
if (m_hLinkObject == hObj)
{
m_hLinkObject = DNULL;
}
}
break;
case MID_PRECREATE:
{
DDWORD dwRet = B2BaseClass::EngineMessageFn(messageID, pData, fData);
if (fData == PRECREATE_WORLDFILE || fData == PRECREATE_STRINGPROP)
ReadProp((ObjectCreateStruct*)pData);
PostPropRead((ObjectCreateStruct*)pData);
return dwRet;
}
break;
case MID_INITIALUPDATE:
{
if (fData != INITIALUPDATE_SAVEGAME)
InitialUpdate();
// insert it into the list
if (!m_Link.m_pData)
{
dl_Insert( &m_CameraHead, &m_Link );
m_Link.m_pData = ( void * )this;
m_dwNumCameras++;
}
}
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: CameraObj::ObjectMessageFn()
//
// PURPOSE: Handler for server object messages.
//
// --------------------------------------------------------------------------- //
DDWORD CameraObj::ObjectMessageFn(HOBJECT hSender, DDWORD messageID, HMESSAGEREAD hRead)
{
CServerDE* pServerDE = GetServerDE();
switch (messageID)
{
case MID_TRIGGER:
{
HSTRING hMsg = pServerDE->ReadFromMessageHString(hRead);
if (hMsg)
{
HandleTrigger(hSender, hMsg);
pServerDE->FreeString(hMsg);
}
}
break;
}
return B2BaseClass::ObjectMessageFn(hSender, messageID, hRead);
}
// ----------------------------------------------------------------------- //
//
// ROUTINE: PostPropRead()
//
// PURPOSE: Update properties
//
// ----------------------------------------------------------------------- //
void CameraObj::PostPropRead(ObjectCreateStruct *pStruct)
{
if (!pStruct || !g_pServerDE) return;
pStruct->m_Flags = FLAG_FORCECLIENTUPDATE | FLAG_FULLPOSITIONRES | FLAG_GOTHRUWORLD;
// See if debug is on
if ( g_pServerDE->GetVarValueFloat(g_pServerDE->GetGameConVar("DebugCutScene")) == 1.0f )
{
pStruct->m_ObjectType = OT_MODEL;
pStruct->m_Flags |= FLAG_VISIBLE;
char* pFilename = "Models\\CameraObject.abc";
char* pSkin = "Skins\\CameraObject.dtx";
_mbscpy((unsigned char*)pStruct->m_Filename, (const unsigned char*)pFilename);
_mbscpy((unsigned char*)pStruct->m_SkinName, (const unsigned char*)pSkin);
}
// Set the Update!
pStruct->m_NextUpdate = 0.001f;
// m_nType = (DBYTE)pStruct->m_UserData;
}
// ----------------------------------------------------------------------- //
//
// ROUTINE: CameraObj::ReadProp
//
// PURPOSE: Set property value
//
// ----------------------------------------------------------------------- //
DBOOL CameraObj::ReadProp(ObjectCreateStruct *pStruct)
{
if (!g_pServerDE || !pStruct) return DFALSE;
GenericProp genProp;
if (g_pServerDE->GetPropGeneric("AllowPlayerMovement", &genProp) == DE_OK)
{
m_bPlayerMovement = genProp.m_Bool;
}
if (g_pServerDE->GetPropGeneric("StartActive", &genProp) == DE_OK)
{
m_bStartActive = genProp.m_Bool;
}
if (g_pServerDE->GetPropGeneric("IsListener", &genProp) == DE_OK)
{
m_bIsListener = genProp.m_Bool;
}
if (g_pServerDE->GetPropGeneric("HidePlayer", &genProp) == DE_OK)
{
m_bHidePlayer = genProp.m_Bool;
}
if (g_pServerDE->GetPropGeneric("ActiveTime", &genProp) == DE_OK)
{
m_fActiveTime = genProp.m_Float;
}
if (g_pServerDE->GetPropGeneric("Type", &genProp) == DE_OK)
{
m_nType = (DBYTE)genProp.m_Long;
}
return DTRUE;
}
// ----------------------------------------------------------------------- //
//
// ROUTINE: CameraObj::InitialUpdate
//
// PURPOSE: Initial update
//
// ----------------------------------------------------------------------- //
extern char g_szVarWorldName[];
DBOOL CameraObj::InitialUpdate()
{
DBYTE nFlags;
char szWorldName[_MAX_PATH];
if (!g_pServerDE) return DFALSE;
SetActive(m_bStartActive);
// Tell clients about the camera...
HMESSAGEWRITE hMessage = g_pServerDE->StartSpecialEffectMessage(this);
g_pServerDE->WriteToMessageByte(hMessage, SFX_CAMERA_ID);
g_pServerDE->WriteToMessageByte(hMessage, m_nType);
nFlags = 0;
if( m_bPlayerMovement )
nFlags |= CAMERASFXFLAG_ALLOWPLAYERMOVEMENT;
if( m_bHidePlayer )
nFlags |= CAMERASFXFLAG_HIDEPLAYER;
if( m_bIsListener )
{
nFlags |= CAMERASFXFLAG_ISLISTENER;
// The b2 1.0 worlds were designed around a bug with the camera that did not pass the islistener
// flag down. So this hack prevents the islistener flag for those levels.
if( g_szVarWorldName )
{
HCONVAR hTempVar = g_pServerDE->GetGameConVar(g_szVarWorldName);
if (hTempVar)
{
char* sTempString = g_pServerDE->GetVarValueString(hTempVar);
if (sTempString)
{
SAFE_STRCPY( szWorldName, sTempString);
_strlwr( szWorldName );
if( strstr( szWorldName, "worlds\\" ))
nFlags &= ~CAMERASFXFLAG_ISLISTENER;
}
}
}
}
g_pServerDE->WriteToMessageByte( hMessage, nFlags );
g_pServerDE->EndMessage(hMessage);
DDWORD dwUsrFlags = g_pServerDE->GetObjectUserFlags(m_hObject);
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -