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

📄 volumebrushtypes.cpp

📁 Blood 2全套源码
💻 CPP
📖 第 1 页 / 共 2 页
字号:
// ----------------------------------------------------------------------- ////
// MODULE  : VolumeBrushTypes.cpp
//
// PURPOSE : VolumeBrushTypes implementation
//
// CREATED : 2/16/98
//
// ----------------------------------------------------------------------- //

#include <stdio.h>
#include "VolumeBrushTypes.h"
#include "BaseCharacter.h"
#include "PlayerObj.h"
#include "Commands.h"
#include "CameraObj.h"
#include "ObjectUtilities.h"
#include "SFXMsgIds.h"


// ----------------------------------------------------------------------- //
//
//	ROUTINE:	LiquidFilterFn()
//
//	PURPOSE:	Filter Liquid volume brushes out of CastRay and/or 
//				IntersectSegment calls (so vectors can go through liquid).
//
//	NOTE:		For now the assumption is if this function is called (via 
//				CastRay or IntersectSegment), FLAG_RAYHIT must be set on the 
//				object (if it is a volume brush).  So, only liquid volume
//				brushes have this flag set on them, so we can conclude that if 
//				this object is of type volume brush that it must be liquid...
//
// ----------------------------------------------------------------------- //

DBOOL LiquidFilterFn(HOBJECT hObj, void *pUserData)
{
	if (!hObj || !g_pServerDE) return DFALSE;

	HCLASS hVolumeBrush = g_pServerDE->GetClass("VolumeBrush");
	HCLASS hObjClass    = g_pServerDE->GetObjectClass(hObj);

	// Return DTRUE to keep this object (not liquid), or DFALSE to ignore
	// this object (is liquid)...
	// Maybe add a splash effect or something

	return !g_pServerDE->IsKindOf(hObjClass, hVolumeBrush);
}


// Water
BEGIN_CLASS(Water)
    ADD_STRINGPROP(SpriteSurfaceName, "Sprites\\WaterBlue.spr")   
	ADD_REALPROP_FLAG(Viscosity, 0.5f, PF_HIDDEN)
	ADD_LONGINTPROP_FLAG(Code, CC_WATER, PF_HIDDEN)
	ADD_REALPROP(Damage, 0.0f)
	ADD_LONGINTPROP(DamageType, DAMAGE_TYPE_SUFFOCATE)
	ADD_BOOLPROP_FLAG(Locked, DFALSE, PF_HIDDEN)
	ADD_BOOLPROP_FLAG(UnlockKeyRemove, DFALSE, PF_HIDDEN)
	ADD_STRINGPROP_FLAG(UnlockKeyName, "", PF_HIDDEN)
END_CLASS_DEFAULT(Water, VolumeBrush, NULL, NULL)


// Blood
BEGIN_CLASS(Blood)
    ADD_STRINGPROP(SpriteSurfaceName, "Sprites\\WaterBlood.spr")   
	ADD_REALPROP_FLAG(Viscosity, 0.8f, PF_HIDDEN)
	ADD_LONGINTPROP_FLAG(Code, CC_BLOOD, PF_HIDDEN)
	ADD_REALPROP_FLAG(Damage, 0.0f, PF_HIDDEN)
	ADD_LONGINTPROP_FLAG(DamageType, DAMAGE_TYPE_SUFFOCATE, PF_HIDDEN)
	ADD_BOOLPROP_FLAG(Locked, DFALSE, PF_HIDDEN)
	ADD_BOOLPROP_FLAG(UnlockKeyRemove, DFALSE, PF_HIDDEN)
	ADD_STRINGPROP_FLAG(UnlockKeyName, "", PF_HIDDEN)
END_CLASS_DEFAULT(Blood, VolumeBrush, NULL, NULL)


// Acid
BEGIN_CLASS(Acid)
    ADD_STRINGPROP(SpriteSurfaceName, "Sprites\\WaterAcid.spr")   
	ADD_REALPROP_FLAG(Viscosity, 0.5f, PF_HIDDEN)
	ADD_LONGINTPROP_FLAG(Code, CC_ACID, PF_HIDDEN)
	ADD_BOOLPROP_FLAG(Locked, DFALSE, PF_HIDDEN)
	ADD_BOOLPROP_FLAG(UnlockKeyRemove, DFALSE, PF_HIDDEN)
	ADD_STRINGPROP_FLAG(UnlockKeyName, "", PF_HIDDEN)
END_CLASS_DEFAULT(Acid, VolumeBrush, NULL, NULL)


// Ladders
BEGIN_CLASS(Ladder)
	ADD_BOOLPROP_FLAG(ShowSurface, DFALSE, PF_HIDDEN)
    ADD_STRINGPROP_FLAG(SpriteSurfaceName, "", PF_HIDDEN)   
	ADD_REALPROP_FLAG(SurfaceHeight, 0.0f, PF_HIDDEN)
    ADD_COLORPROP_FLAG(SurfaceColor1, 0.0f, 0.0f, 0.0f, PF_HIDDEN)   
    ADD_COLORPROP_FLAG(SurfaceColor2, 0.0f, 0.0f, 0.0f, PF_HIDDEN)   
    ADD_REALPROP_FLAG(XScaleMin, 15.0f, PF_HIDDEN)   
    ADD_REALPROP_FLAG(XScaleMax, 25.0f, PF_HIDDEN)   
    ADD_REALPROP_FLAG(YScaleMin, 15.0f, PF_HIDDEN)   
    ADD_REALPROP_FLAG(YScaleMax, 25.0f, PF_HIDDEN)   
    ADD_REALPROP_FLAG(XScaleDuration, 10.0f, PF_HIDDEN)   
    ADD_REALPROP_FLAG(YScaleDuration, 10.0f, PF_HIDDEN)   
	ADD_VECTORPROP_VAL_FLAG(Current, 0.0f, 0.0f, 0.0f, PF_HIDDEN)
	ADD_REALPROP_FLAG(Viscosity, 0.0f, PF_HIDDEN)
	ADD_LONGINTPROP_FLAG(Code, CC_LADDER, PF_HIDDEN)
	ADD_REALPROP_FLAG(Damage, 0.0f, PF_HIDDEN)
	ADD_LONGINTPROP_FLAG(DamageType, DAMAGE_TYPE_NORMAL, PF_HIDDEN)
	ADD_BOOLPROP_FLAG(Locked, DFALSE, PF_HIDDEN)
	ADD_BOOLPROP_FLAG(UnlockKeyRemove, DFALSE, PF_HIDDEN)
	ADD_STRINGPROP_FLAG(UnlockKeyName, "", PF_HIDDEN)
END_CLASS_DEFAULT(Ladder, VolumeBrush, NULL, NULL)

// ----------------------------------------------------------------------- //
//
//	ROUTINE:	Ladder::UpdatePhysics()
//
//	PURPOSE:	Update the physics of the passed in object
//
// ----------------------------------------------------------------------- //

void Ladder::UpdatePhysics(ContainerPhysics* pCPStruct)
{
//	VolumeBrush::UpdatePhysics(pCPStruct);

	CServerDE* pServerDE = GetServerDE();
	if (!pServerDE) return;

	HCLASS hBaseCharClass = pServerDE->GetClass("CBaseCharacter");

	if (pServerDE->IsKindOf(pServerDE->GetObjectClass(pCPStruct->m_hObject), hBaseCharClass))
	{
		CBaseCharacter* pCharacter = (CBaseCharacter*)pServerDE->HandleToObject(pCPStruct->m_hObject);
		if (pCharacter)
		{
			pCharacter->UpdateOnLadder(this, pCPStruct);
		}
	}
}


// Conveyor
BEGIN_CLASS(Conveyor)
	ADD_BOOLPROP_FLAG(ShowSurface, DFALSE, PF_HIDDEN)
    ADD_STRINGPROP_FLAG(SpriteSurfaceName, "", PF_HIDDEN)   
	ADD_REALPROP_FLAG(SurfaceHeight, 0.0f, PF_HIDDEN)
    ADD_COLORPROP_FLAG(SurfaceColor1, 0.0f, 0.0f, 0.0f, PF_HIDDEN)   
    ADD_COLORPROP_FLAG(SurfaceColor2, 0.0f, 0.0f, 0.0f, PF_HIDDEN)   
    ADD_REALPROP_FLAG(XScaleMin, 15.0f, PF_HIDDEN)   
    ADD_REALPROP_FLAG(XScaleMax, 25.0f, PF_HIDDEN)   
    ADD_REALPROP_FLAG(YScaleMin, 15.0f, PF_HIDDEN)   
    ADD_REALPROP_FLAG(YScaleMax, 25.0f, PF_HIDDEN)   
    ADD_REALPROP_FLAG(XScaleDuration, 10.0f, PF_HIDDEN)   
    ADD_REALPROP_FLAG(YScaleDuration, 10.0f, PF_HIDDEN)   
	ADD_REALPROP_FLAG(Viscosity, 0.0f, PF_HIDDEN)
	ADD_LONGINTPROP_FLAG(Code, CC_CONVEYOR, PF_HIDDEN)
	ADD_REALPROP_FLAG(Damage, 0.0f, PF_HIDDEN)
	ADD_LONGINTPROP_FLAG(DamageType, DAMAGE_TYPE_NORMAL, PF_HIDDEN)
	ADD_BOOLPROP_FLAG(Locked, DFALSE, PF_HIDDEN)
	ADD_BOOLPROP_FLAG(UnlockKeyRemove, DFALSE, PF_HIDDEN)
	ADD_STRINGPROP_FLAG(UnlockKeyName, "", PF_HIDDEN)
END_CLASS_DEFAULT(Conveyor, VolumeBrush, NULL, NULL)

// ----------------------------------------------------------------------- //
//
//	ROUTINE:	Conveyor::UpdatePhysics()
//
//	PURPOSE:	Update the physics of the passed in object
//
// ----------------------------------------------------------------------- //

void Conveyor::UpdatePhysics(ContainerPhysics* pCPStruct)
{
	CServerDE* pServerDE = GetServerDE();
	if (!pServerDE) return;
	CollisionInfo collisionInfo;
	DBOOL bOnGround;
	CPlayerObj *pPlayerObj;

	bOnGround = DFALSE;
	if( IsPlayer( pCPStruct->m_hObject ))
	{
		pPlayerObj = ( CPlayerObj * )pServerDE->HandleToObject( pCPStruct->m_hObject );
		bOnGround = pPlayerObj->IsOnGround( );
	}
	else if( IsBaseCharacter( pCPStruct->m_hObject ))
	{
		// See if we're standing on something
		pServerDE->GetStandingOn(pCPStruct->m_hObject, &collisionInfo);
		if( collisionInfo.m_hObject )
			bOnGround = DTRUE;
	}

	if( bOnGround )
	{
		DFLOAT fUpdateDelta = pServerDE->GetFrameTime();

		// If so, apply current to velocity
		DVector vCurrent;
		VEC_MULSCALAR(vCurrent, m_vCurrent, fUpdateDelta);

		VEC_ADD(pCPStruct->m_Velocity, pCPStruct->m_Velocity, vCurrent);
	}
}


// CraneControl
BEGIN_CLASS(CraneControl)
	ADD_BOOLPROP_FLAG(ShowSurface, DFALSE, PF_HIDDEN)
    ADD_STRINGPROP_FLAG(SpriteSurfaceName, "", PF_HIDDEN)   
	ADD_REALPROP_FLAG(SurfaceHeight, 0.0f, PF_HIDDEN)
    ADD_COLORPROP_FLAG(SurfaceColor1, 0.0f, 0.0f, 0.0f, PF_HIDDEN)   
    ADD_COLORPROP_FLAG(SurfaceColor2, 0.0f, 0.0f, 0.0f, PF_HIDDEN)   
    ADD_REALPROP_FLAG(XScaleMin, 15.0f, PF_HIDDEN)   
    ADD_REALPROP_FLAG(XScaleMax, 25.0f, PF_HIDDEN)   
    ADD_REALPROP_FLAG(YScaleMin, 15.0f, PF_HIDDEN)   
    ADD_REALPROP_FLAG(YScaleMax, 25.0f, PF_HIDDEN)   
    ADD_REALPROP_FLAG(XScaleDuration, 10.0f, PF_HIDDEN)   
    ADD_REALPROP_FLAG(YScaleDuration, 10.0f, PF_HIDDEN)   
	ADD_REALPROP_FLAG(Viscosity, 0.0f, PF_HIDDEN)
	ADD_LONGINTPROP(Code, CC_CRANECONTROL)
	ADD_REALPROP_FLAG(Damage, 0.0f, PF_HIDDEN)
	ADD_LONGINTPROP_FLAG(DamageType, DAMAGE_TYPE_NORMAL, PF_HIDDEN)
	ADD_BOOLPROP(Locked, DTRUE)
	ADD_BOOLPROP(UnlockKeyRemove, DTRUE)
	ADD_STRINGPROP(UnlockKeyName, "Lever")
END_CLASS_DEFAULT(CraneControl, VolumeBrush, NULL, NULL)

// ----------------------------------------------------------------------- //
//
//	ROUTINE:	CraneControl::UpdatePhysics()
//
//	PURPOSE:	Update the physics of the passed in object
//
// ----------------------------------------------------------------------- //

#define MIN_CRANE_YAW		(-PI*0.6f)
#define MAX_CRANE_YAW		(PI*0.6f)
#define CRANE_ROTATE_SPEED 0.03f

void CraneControl::UpdatePhysics(ContainerPhysics* pCPStruct)
{
	CServerDE* pServerDE = GetServerDE();
	if (!pServerDE) return;
//	if (m_bLocked)
//	{
		// See if they have the key we need to unlock
//		HMESSAGEWRITE hMessage = pServerDE->StartMessageToObject((LPBASECLASS)this, pCPStruct->m_hObject, MID_KEYQUERY);
//		pServerDE->WriteToMessageHString(hMessage, m_hstrKeyName);
//		pServerDE->EndMessage(hMessage);
//		return;
//	}

	HCLASS hPlayerClass = pServerDE->GetClass("CPlayerObj");

	if (pServerDE->IsKindOf(pServerDE->GetObjectClass(pCPStruct->m_hObject), hPlayerClass))
	{
		CPlayerObj* pPlayer = (CPlayerObj*)pServerDE->HandleToObject(pCPStruct->m_hObject);
		if (pPlayer)
		{
			// Create a camera which points at the crane
			if (!m_hCameraObj)
			{
				ObjectCreateStruct theStruct;
				INIT_OBJECTCREATESTRUCT(theStruct);

				_mbscpy((unsigned char*)theStruct.m_Name, (const unsigned char*)"cranecam");
    
				DRotation rRot;
				ROT_INIT(rRot);

				DVector vPos;
				pServerDE->GetObjectPos(m_hObject, &vPos);

⌨️ 快捷键说明

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