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

📄 volumebrushtypes.cpp

📁 Blood 2全套源码
💻 CPP
📖 第 1 页 / 共 2 页
字号:
				ROT_COPY(theStruct.m_Rotation, rRot);
				VEC_COPY(theStruct.m_Pos, vPos);
    
				theStruct.m_NextUpdate = 0.1f;
    
				HCLASS pClass = pServerDE->GetClass("CameraObj");
    
				// Check to make sure this is a valid class.
				if (pClass)
				{    
    				LPBASECLASS pObject = pServerDE->CreateObject(pClass, &theStruct);
        
					if (pObject)
					{
						m_hCameraObj = pServerDE->ObjectToHandle(pObject);
					}
					pPlayer->m_hCameraObj = m_hCameraObj;
					pServerDE->SetObjectFlags(m_hCameraObj, 0);
				} 
				else
				{
					return;
				}
			}
			if (!pPlayer->m_hCameraObj) pPlayer->m_hCameraObj = m_hCameraObj;

			// Try to find the crane)
			if (!m_hCrane)
			{
    			ObjectList* pTargets = pServerDE->FindNamedObjects("crane");
        
				if (!pTargets || pTargets->m_nInList <= 0) 
				{
					return;
				}

				// Use the first object
				m_hCrane = pTargets->m_pFirstLink->m_hObject;

				// clean up	
				pServerDE->RelinquishList(pTargets);
			}

			// Try to find the wrecking ball
			if (!m_hBall)
			{
    			ObjectList* pTargets = pServerDE->FindNamedObjects("WreckingBall");
        
				if (!pTargets || pTargets->m_nInList <= 0) 
				{
					return;
				}

				// Use the first object
				m_hBall = pTargets->m_pFirstLink->m_hObject;

				// clean up	
				pServerDE->RelinquishList(pTargets);
			}

			// Point the camera at the ball if we have one.
			CameraObj* pCameraObj = (CameraObj*)pServerDE->HandleToObject(m_hCameraObj);
			pCameraObj->SetLinkObject(m_hBall ? m_hBall : m_hCrane);

			if (pPlayer->GetContainer() != CC_CRANECONTROL)
				return;


			if (pServerDE->IsCommandOn(pPlayer->GetClient(), COMMAND_LEFT) || pServerDE->IsCommandOn(pPlayer->GetClient(), COMMAND_STRAFELEFT))
			{
				m_fCamYaw -= CRANE_ROTATE_SPEED;
				if (m_fCamYaw < MIN_CRANE_YAW)
					m_fCamYaw = MIN_CRANE_YAW;
			}
			else if (pServerDE->IsCommandOn(pPlayer->GetClient(), COMMAND_RIGHT) || pServerDE->IsCommandOn(pPlayer->GetClient(), COMMAND_STRAFERIGHT))
			{
				m_fCamYaw += CRANE_ROTATE_SPEED;
				if (m_fCamYaw > MAX_CRANE_YAW)
					m_fCamYaw = MAX_CRANE_YAW;
			}
			DRotation rCrane;
			ROT_INIT(rCrane);
			pServerDE->SetupEuler(&rCrane, 0.0f, m_fCamYaw, 0.0f);
			pServerDE->SetObjectRotation(m_hCrane, &rCrane);
			pServerDE->SetObjectUserFlags(m_hBall, (DDWORD)m_fCamYaw);
		}
	}
}



// Damage brush
BEGIN_CLASS(Damage)
	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_DAMAGE, PF_HIDDEN)
	ADD_REALPROP(Damage, 100.0f)
	ADD_LONGINTPROP(DamageType, DAMAGE_TYPE_NORMAL)
	ADD_BOOLPROP_FLAG(Locked, DFALSE, PF_HIDDEN)
	ADD_BOOLPROP_FLAG(UnlockKeyRemove, DFALSE, PF_HIDDEN)
	ADD_STRINGPROP_FLAG(UnlockKeyName, "", PF_HIDDEN)
END_CLASS_DEFAULT(Damage, VolumeBrush, NULL, NULL)


// Minefield brush
BEGIN_CLASS(Minefield)
	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_DAMAGE, 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(Minefield, VolumeBrush, NULL, NULL)


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

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

	// See if we're standing on something
	pServerDE->GetStandingOn(pCPStruct->m_hObject, &collisionInfo);

	bOnGround = DFALSE;
	if( IsPlayer( pCPStruct->m_hObject ))
	{
		pPlayerObj = ( CPlayerObj * )pServerDE->HandleToObject( pCPStruct->m_hObject );
		bOnGround = DTRUE;
	}
	else if( IsBaseCharacter( pCPStruct->m_hObject ))
	{
		if( collisionInfo.m_hObject )
			bOnGround = DTRUE;
	}
	else
		return;

	if( bOnGround )
	{
		Damage( pCPStruct->m_hObject );
	}
}

void Minefield::Damage( HOBJECT hObj )
{
	if( !IsBaseCharacter( hObj ))
		return;

	CBaseCharacter *pBC = (CBaseCharacter*)g_pServerDE->HandleToObject( hObj );
	if( pBC && !pBC->IsDead( ))
	{
		// Boom.
		DVector vDir;
		DVector vPos;
		g_pServerDE->GetObjectPos( hObj, &vPos );
		VEC_SET(vDir, 0, 1, 0);

		// Do some damage, suicide-style
		DamageObject( hObj, 
					 g_pServerDE->HandleToObject( hObj ), 
					 hObj, 
					 500.0f, vDir, vPos, 
					 DAMAGE_TYPE_DEATH);
		AddExplosion(vPos);
	}
}

void Minefield::AddExplosion(DVector &vPos)
{
	CServerDE* pServerDE = BaseClass::GetServerDE();
	if (!pServerDE) return;

	DDWORD		nType = EXP_GRENADE;
	DVector		vUp;
	VEC_SET(vUp, 0.0f, 1.0f, 0.0f);

	HMESSAGEWRITE hMessage = pServerDE->StartInstantSpecialEffectMessage(&vPos);
	pServerDE->WriteToMessageByte(hMessage, SFX_EXPLOSIONFX_ID);

	pServerDE->WriteToMessageVector(hMessage, &vPos);
	pServerDE->WriteToMessageVector(hMessage, &vUp);
	pServerDE->WriteToMessageDWord(hMessage, nType);

	pServerDE->EndMessage(hMessage);

	PlaySoundFromPos(&vPos, "Sounds\\Weapons\\c4\\explosion_1.wav", 1000.0f, SOUNDPRIORITY_MISC_MEDIUM);
}

DDWORD Minefield::ObjectMessageFn(HOBJECT hSender, DDWORD messageID, HMESSAGEREAD hRead)
{
	CServerDE* pServerDE = GetServerDE();
	switch (messageID)
	{
		case MID_INCONTAINER:
		{
			Damage( hSender );
			break;
		}
	}
	
	return VolumeBrush::ObjectMessageFn(hSender, messageID, hRead);
}




// freefall
BEGIN_CLASS(FreeFall)
	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_VECTORPROP_VAL_FLAG(Current, 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(SurfaceHeight, 5.0f, PF_HIDDEN)
	ADD_REALPROP_FLAG(SurfaceAlpha, 0.7f, PF_HIDDEN)
	ADD_LONGINTPROP_FLAG(NumSurfacePolies, 160, PF_HIDDEN)
	ADD_REALPROP_FLAG(Viscosity, 0.0f, PF_HIDDEN)
	ADD_REALPROP_FLAG(Damage, 9999999.0f, PF_HIDDEN)
	ADD_LONGINTPROP_FLAG(DamageType, DAMAGE_TYPE_FREEFALL, PF_HIDDEN)
	ADD_LONGINTPROP_FLAG(Code, CC_FREEFALL, 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(FreeFall, VolumeBrush, NULL, NULL)


⌨️ 快捷键说明

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