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

📄 cameraobj.cpp

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