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

📄 flagobjects.cpp

📁 Blood 2全套源码
💻 CPP
📖 第 1 页 / 共 2 页
字号:

	MoveObjectToGround(m_hObject);


	// Flag that we are not in our stand...

	m_bInStand    = DFALSE;
	m_bOnGround   = DTRUE;
	m_bWithPlayer = DFALSE;


	// Set our next update so that we'll respawn if we're still on the ground...

	g_pServerDE->SetNextUpdate(m_hObject, 30.0f);
}


// ----------------------------------------------------------------------- //
//
//	ROUTINE:	FlagObject::OnTouchNotify()
//
//	PURPOSE:	Handles the MID_TOUCHNOTIFY engine messsage
//
// ----------------------------------------------------------------------- //

void FlagObject::OnTouchNotify(HOBJECT hToucher)
{
	// Determine if a player object touched us...

	if (!g_pServerDE->IsKindOf(g_pServerDE->GetObjectClass(hToucher), g_pServerDE->GetClass("CPlayerObj")))
	{
		return;
	}


	// Trigger this player object so they know they picked up this flag...

	TriggerPlayer(hToucher);
}


// ----------------------------------------------------------------------- //
//
//	ROUTINE:	FlagObject::TriggerPlayer
//
//	PURPOSE:	Tell the player that they got this flag
//
// ----------------------------------------------------------------------- //

void FlagObject::TriggerPlayer(HOBJECT hPlayer)
{
	HMESSAGEWRITE hMessage = g_pServerDE->StartMessageToObject(this, hPlayer, MID_TRIGGER);
	g_pServerDE->WriteToMessageHString(hMessage, m_hFlagGrabString);
	g_pServerDE->EndMessage(hMessage);
}


// ----------------------------------------------------------------------- //
//
//	ROUTINE:	FlagObject::IsOtherFlagInStand
//
//	PURPOSE:	Determines if the other flag is in it's flag stand
//
// ----------------------------------------------------------------------- //

DBOOL FlagObject::IsOtherFlagInStand()
{
	// Figure out which is the other flag...

	FlagObject* pOtherFlag = NULL;

	if (this == s_pTeam1Flag)
	{
		pOtherFlag = s_pTeam2Flag;
	}
	else if (this == s_pTeam2Flag)
	{
		pOtherFlag = s_pTeam1Flag;
	}

	if (!pOtherFlag) return(DFALSE);
	if (pOtherFlag == this) return(DFALSE);


	// Return whether or not the other flag is in it's flag stand...

	return(pOtherFlag->IsInFlagStand());
}


// *********************************************************************** //
// FlagStand

BEGIN_CLASS(FlagStand)

	ADD_STRINGPROP(ObjectName, "CTF_FlagStand")						// Item name
	ADD_LONGINTPROP(TeamID, 0)										// Team ID (1 or 2)

END_CLASS_DEFAULT(FlagStand, B2BaseClass, NULL, NULL)


// ----------------------------------------------------------------------- //
//
//	ROUTINE:	FlagStand::EngineMessageFn
//
//	PURPOSE:	Handler for engine messages
//
// ----------------------------------------------------------------------- //

DDWORD FlagStand::EngineMessageFn(DDWORD messageID, void *pData, DFLOAT fData)
{
	// Handle the engine messages we're interested in...

	switch(messageID)
	{
		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);
		}

		case MID_INITIALUPDATE:
		{
			OnInitialUpdate(pData, fData);
			break;
		}

		case MID_TOUCHNOTIFY:
		{
			OnTouchNotify((HOBJECT)pData);
			break;
		}

		default : break;
	}

	return B2BaseClass::EngineMessageFn(messageID, pData, fData);
}


// ----------------------------------------------------------------------- //
//
//	ROUTINE:	FlagStand::ReadProp
//
//	PURPOSE:	Reads FlagStand properties
//
// ----------------------------------------------------------------------- //

DBOOL FlagStand::ReadProp(ObjectCreateStruct* pStruct)
{
	// Sanity checks...

	if (!pStruct) return(DFALSE);


	// Read each prop...

	GenericProp genProp;

	if (g_pServerDE->GetPropGeneric("TeamID", &genProp) == DE_OK)
	{
		m_nTeamID = (int)genProp.m_Long;
	}


	// All done...

	return DTRUE;
}


// ----------------------------------------------------------------------- //
//
//	ROUTINE:	FlagStand::PostPropRead()
//
//	PURPOSE:	Updates the properties now that they have been read
//
// ----------------------------------------------------------------------- //

void FlagStand::PostPropRead(ObjectCreateStruct* pStruct)
{
	// Sanity checks...

	if (!pStruct) return;


	// Set the flags we want...

	pStruct->m_Flags |= /*FLAG_SOLID |*/ FLAG_TOUCH_NOTIFY | FLAG_VISIBLE | FLAG_GRAVITY;
	pStruct->m_Flags &= ~FLAG_GRAVITY;	// (temp) ???

	g_pServerDE->SetNextUpdate(m_hObject, 0.001f);


	// Set the model filename

	if (m_nTeamID == 1)
	{
		char* pFilename = "Models_Multipatch\\flagbase.abc";
		_mbscpy((unsigned char*)pStruct->m_Filename, (const unsigned char*)pFilename);
	}
	else if (m_nTeamID == 2)
	{
		char* pFilename = "Models_Multipatch\\flagbase.abc";
		_mbscpy((unsigned char*)pStruct->m_Filename, (const unsigned char*)pFilename);
	}
	

	// Set the skin filename

	if (m_nTeamID == 1)
	{
		char* pSkin = "Skins_Multipatch\\flagbaseblue.dtx";	
		_mbscpy((unsigned char*)pStruct->m_SkinName, (const unsigned char*)pSkin);
	}
	else if (m_nTeamID = 2)
	{
		char* pSkin = "Skins_Multipatch\\flagbasered.dtx";	
		_mbscpy((unsigned char*)pStruct->m_SkinName, (const unsigned char*)pSkin);
	}
}


// ----------------------------------------------------------------------- //
//
//	ROUTINE:	FlagStand::OnInitialUpdate()
//
//	PURPOSE:	Handles the MID_INITIALUPDATE engine message
//
// ----------------------------------------------------------------------- //

void FlagStand::OnInitialUpdate(void* pData, DFLOAT fData)
{
	// Set the dims...

	DVector vDims;

	g_pServerDE->GetModelAnimUserDims(m_hObject, &vDims, g_pServerDE->GetModelAnimation(m_hObject));

	if (g_pServerDE->SetObjectDims2(m_hObject, &vDims) == DE_ERROR)
	{
		g_pServerDE->SetObjectDims(m_hObject, &vDims);
	}


	// Move the flag stand to the ground...

	MoveObjectToGround(m_hObject);


	// Create our trigger string if necessary...

	if (!m_hFlagGiveString)
	{
		m_hFlagGiveString = g_pServerDE->CreateString("flaggive");
	}


	// Spawn our flag object...

	SpawnFlag();
}


// ----------------------------------------------------------------------- //
//
//	ROUTINE:	FlagStand::OnTouchNotify()
//
//	PURPOSE:	Handles the MID_TOUCHNOTIFY engine messsage
//
// ----------------------------------------------------------------------- //

void FlagStand::OnTouchNotify(HOBJECT hToucher)
{
	// Determine if a player object touched us...

	if (!g_pServerDE->IsKindOf(g_pServerDE->GetObjectClass(hToucher), g_pServerDE->GetClass("CPlayerObj")))
	{
		return;
	}


	// Trigger this player object so they know they touched a flag stand...

	TriggerPlayer(hToucher);
}


// ----------------------------------------------------------------------- //
//
//	ROUTINE:	FlagStand::ObjectMessageFn
//
//	PURPOSE:	Handle messages from objects
//
// ----------------------------------------------------------------------- //

DDWORD FlagStand::ObjectMessageFn(HOBJECT hSender, DDWORD messageID, HMESSAGEREAD hRead)
{
	switch (messageID)
	{
		case MID_TRIGGER:
		{
			break;
		}

		default: break;
	}

	return B2BaseClass::ObjectMessageFn(hSender, messageID, hRead);
}


// ----------------------------------------------------------------------- //
//
//	ROUTINE:	FlagStand::SpawnFlag
//
//	PURPOSE:	Spawns a flag object
//
// ----------------------------------------------------------------------- //

DBOOL FlagStand::SpawnFlag()
{
	// Sanity checks...

	if (m_nTeamID < 1) return(DFALSE);
	if (m_nTeamID > 2) return(DFALSE);


	// Get the position and rotation for the flag...

	DVector vPos;
	g_pServerDE->GetObjectPos(m_hObject, &vPos);
	vPos.x -= 16;
	vPos.y += 32;

	DRotation rRot;
	g_pServerDE->GetObjectRotation(m_hObject, &rRot);


	// Spawn the flag object for the team..

	if (!m_hFlagObject)
	{
		char sSpawnString[128];
		sprintf(sSpawnString, "FlagObject TeamID %i", GetTeamID());

		m_hFlagObject = SpawnObject(sSpawnString, &vPos, &rRot, NULL);
		if (!m_hFlagObject) return(DFALSE);
	}


	// All done...

	return(DTRUE);
}


// ----------------------------------------------------------------------- //
//
//	ROUTINE:	FlagStand::TriggerPlayer
//
//	PURPOSE:	Tell the player that they got this flag
//
// ----------------------------------------------------------------------- //

void FlagStand::TriggerPlayer(HOBJECT hPlayer)
{
	HMESSAGEWRITE hMessage = g_pServerDE->StartMessageToObject(this, hPlayer, MID_TRIGGER);
	g_pServerDE->WriteToMessageHString(hMessage, m_hFlagGiveString);
	g_pServerDE->EndMessage(hMessage);
}



⌨️ 快捷键说明

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