コード例 #1
0
void SbDepthCharge::Reset()
{
	BtFloat useSize = SeaSize / 5.0f;
	BtFloat x = (BtFloat)m_index;
	BtFloat y = SeaLevel + 10.0f;
	BtFloat z = (BtFloat)m_index;
	MtVector3 v3Position(x, y, z);
	m_v3LastPosition = v3Position;
	m_timeExplode = 0;

	MtMatrix4 m4Transform;
	m4Transform.SetTranslation(v3Position);
	m_body.SetWorldTransform(m4Transform);
	m_body.SetWorldVelocity(MtVector3(0, 0, 0));
	m_body.SetWorldAngularVelocity(MtVector3(0, 0, 0));
	m_body.SetDamping(0.5f, 0.5f);
	SetActive( BtFalse );
}
コード例 #2
0
bool Engine::Network::CNetworkEngine::Update()
{
	if (m_bHost)
	{
		Engine::CActor* pcPlayer = m_pcWorld->GetActorByName("PlayerCube");
		
		float fNewLocationX = pcPlayer->GetMetricMember("LocationX");
		float fNewLocationY = pcPlayer->GetMetricMember("LocationY");
		float fNewLocationZ = pcPlayer->GetMetricMember("LocationZ");

		SendPosition(fNewLocationX, fNewLocationY, fNewLocationZ);

		float fNewRotationX = pcPlayer->GetMetricMember("RotationX");
		float fNewRotationY = pcPlayer->GetMetricMember("RotationY");
		float fNewRotationZ = pcPlayer->GetMetricMember("RotationZ");

		SendRotation(fNewRotationX, fNewRotationY, fNewRotationZ);

		//Engine::CActor* pcScoreZone1 = m_pcWorld->GetActorByName("ScoreZone1");

		//float fScore = pcScoreZone1->GetMetricMember("Score");

		//SendScore(fScore);

		float fStamina = pcPlayer->GetMetricMember("Stamina");

		SendStamina(fStamina);

		float fWalk = pcPlayer->GetMetricMember("SoundWalk");

		float fSurface = pcPlayer->GetMetricMember("LastHitSurface");

		SendSoundWalk(fWalk == 0.0f ? false : true, fSurface);

		float fSprint = pcPlayer->GetMetricMember("SoundSprint");

		SendSoundSprint(fSprint == 0.0f ? false : true);
	}
	else
	{
		Engine::CActor* pcPlayer2 = m_pcWorld->GetActorByName("PlayerCube2");

		float fNewLocationX = pcPlayer2->GetMetricMember("LocationX");
		float fNewLocationY = pcPlayer2->GetMetricMember("LocationY");
		float fNewLocationZ = pcPlayer2->GetMetricMember("LocationZ");

		SendPosition(fNewLocationX, fNewLocationY, fNewLocationZ);

		float fNewRotationX = pcPlayer2->GetMetricMember("RotationX");
		float fNewRotationY = pcPlayer2->GetMetricMember("RotationY");
		float fNewRotationZ = pcPlayer2->GetMetricMember("RotationZ");

		SendRotation(fNewRotationX, fNewRotationY, fNewRotationZ);

		//Engine::CActor* pcScoreZone2 = m_pcWorld->GetActorByName("ScoreZone2");

		//float fScore = pcScoreZone2->GetMetricMember("Score");

		//SendScore(fScore);

		float fStamina = pcPlayer2->GetMetricMember("Stamina");

		SendStamina(fStamina);

		float fWalk = pcPlayer2->GetMetricMember("SoundWalk");

		float fSurface = pcPlayer2->GetMetricMember("LastHitSurface");

		SendSoundWalk(fWalk == 0.0f ? false : true, fSurface);

		float fSprint = pcPlayer2->GetMetricMember("SoundSprint");

		SendSoundSprint(fSprint == 0.0f ? false : true);
	}

	for (m_pcPacket = m_pcPeer->Receive(); m_pcPacket; m_pcPeer->DeallocatePacket(m_pcPacket), m_pcPacket = m_pcPeer->Receive())
	{
		switch (m_pcPacket->data[0])
		{
		case ID_REMOTE_DISCONNECTION_NOTIFICATION:
			DEBUGPRINT("Another client has disconnected.\n");

			m_bConnected = false;

			break;
		case ID_REMOTE_CONNECTION_LOST:
			DEBUGPRINT("Another client has lost the connection.\n");
			break;
		case ID_REMOTE_NEW_INCOMING_CONNECTION:
			DEBUGPRINT("Another client has connected.\n");

			m_bConnected = true;

			break;
		case ID_CONNECTION_REQUEST_ACCEPTED:
		{
			DEBUGPRINT("Our connection request has been accepted.\n");

			m_bConnected = true;

			// Use a BitStream to write a custom user message
			// Bitstreams are easier to use than sending casted structures, and handle endian swapping automatically
			RakNet::BitStream bsOut;
			bsOut.Write((RakNet::MessageID)ID_GAME_VERSION);
			bsOut.Write(m_sztVersionNumber);
			m_pcPeer->Send(&bsOut, HIGH_PRIORITY, RELIABLE_ORDERED, 0, m_pcPacket->systemAddress, false);
		}
			break;
		case ID_NEW_INCOMING_CONNECTION:
			DEBUGPRINT("A connection is incoming.\n");

			m_bConnected = true;

			break;
		case ID_NO_FREE_INCOMING_CONNECTIONS:
			DEBUGPRINT("The server is full.\n");
			break;
		case ID_DISCONNECTION_NOTIFICATION:
			if (m_bHost)
			{
				DEBUGPRINT("A client has disconnected.\n");
			}
			else 
			{
				DEBUGPRINT("We have been disconnected.\n");
			}

			m_bConnected = false;

			break;
		case ID_CONNECTION_LOST:
			if (m_bHost)
			{
				DEBUGPRINT("A client lost the connection.\n");
			}
			else 
			{
				DEBUGPRINT("Connection lost.\n");
			}
			break;

		case ID_GAME_VERSION:
		{
			memcpy(m_pcSystemAddress, &(m_pcPacket->systemAddress), sizeof(RakNet::SystemAddress));

			size_t sztVersion = 0;
			RakNet::BitStream bsIn(m_pcPacket->data, m_pcPacket->length, false);
			bsIn.IgnoreBytes(sizeof(RakNet::MessageID));
			bsIn.Read(sztVersion);

			if (m_sztVersionNumber != sztVersion)
			{
				if (m_bHost)
				{
					DEBUGPRINT("Server is using version %i.  Client had version %i.  Disconnecting client.\n", m_sztVersionNumber, sztVersion);
				}
				else
				{
					DEBUGPRINT("Connected to server with matching version of %u\n", sztVersion);
				}

				m_pcPeer->CloseConnection(RakNet::AddressOrGUID(m_pcPacket), true);
			}
			else
			{
				if (m_bHost)
				{
					DEBUGPRINT("Client connected to server with matching version of %u\n", m_sztVersionNumber);

					RakNet::BitStream bsOut;
					bsOut.Write((RakNet::MessageID)ID_GAME_VERSION);
					bsOut.Write(m_sztVersionNumber);

					m_pcPeer->Send(&bsOut, HIGH_PRIORITY, RELIABLE_ORDERED, 0, m_pcPacket->systemAddress, false);
				}
				else
				{
					DEBUGPRINT("Connected to server with matching version %i.\n", m_sztVersionNumber);

					size_t sztNetworkID = 1;

					RakNet::BitStream bsOut;
					bsOut.Write((RakNet::MessageID)ID_GAME_SETUP);
					bsOut.Write(sztNetworkID);

					m_pcPeer->Send(&bsOut, HIGH_PRIORITY, RELIABLE_ORDERED, 0, m_pcPacket->systemAddress, false);
				}
			}

			
		}

			break;
		case ID_GAME_SETUP:
		{
			if (m_bHost)
			{
				Engine::CActor* pcPlayer = m_pcWorld->GetActorByName("PlayerCube");
				Engine::CActor* pcPlayer2 = m_pcWorld->GetActorByName("PlayerCube2");
				
				pcPlayer->SetDataMember("Status", "Enabled");
				pcPlayer->SetDataMember("NetworkControl", "Enabled");
				pcPlayer->SetMetricMember("LocationX", 0.0f);
				pcPlayer->SetMetricMember("LocationY", 0.0f);
				pcPlayer->SetMetricMember("LocationZ", -500.0f);
				pcPlayer->SetMetricMember("RotationX", 0.0f);
				pcPlayer->SetMetricMember("RotationY", 0.0f);
				pcPlayer->SetMetricMember("RotationZ", 0.0f);

				pcPlayer2->SetDataMember("Status", "Enabled");
				pcPlayer2->SetDataMember("NetworkControl", "Disabled");
				pcPlayer2->SetMetricMember("LocationX", 0.0f);
				pcPlayer2->SetMetricMember("LocationY", 0.0f);
				pcPlayer2->SetMetricMember("LocationZ", 500.0f);
				pcPlayer2->SetMetricMember("RotationX", 0.0f);
				pcPlayer2->SetMetricMember("RotationY", 180.0f);
				pcPlayer2->SetMetricMember("RotationZ", 0.0f);

				Engine::CActor* pcPlayer2Forward = m_pcWorld->GetActorByName("Player2Forward");

				pcPlayer2Forward->SetDataMember("Status", "Enabled");

				Engine::CActor* pcCamera = m_pcWorld->GetActorByName("Camera");
				Engine::CActor* pcCamera2 = m_pcWorld->GetActorByName("Camera2");

				pcCamera->SetDataMember("CameraStatus", "Enabled");
				pcCamera2->SetDataMember("CameraStatus", "Disabled");
				pcCamera->SetDataMember("LookAtStatus", "Enabled");
				pcCamera2->SetDataMember("LookAtStatus", "Disabled");

				Engine::CActor* pcScoreZone1 = m_pcWorld->GetActorByName("ScoreZone1");
				Engine::CActor* pcScoreZone2 = m_pcWorld->GetActorByName("ScoreZone2");

				pcScoreZone1->SetMetricMember("Score", 0.0f);
				pcScoreZone2->SetMetricMember("Score", 0.0f);
				pcScoreZone1->SetDataMember("TextStatus", "Enabled");
				pcScoreZone2->SetDataMember("TextStatus", "Enabled");

				size_t sztNetworkID = 2;

				RakNet::BitStream bsOut;
				bsOut.Write((RakNet::MessageID)ID_GAME_SETUP);
				bsOut.Write(sztNetworkID);

				m_pcPeer->Send(&bsOut, HIGH_PRIORITY, RELIABLE_ORDERED, 0, m_pcPacket->systemAddress, false);
			}
			else
			{
				Engine::CActor* pcPlayer = m_pcWorld->GetActorByName("PlayerCube");
				Engine::CActor* pcPlayer2 = m_pcWorld->GetActorByName("PlayerCube2");

				pcPlayer->SetDataMember("Status", "Enabled");
				pcPlayer->SetDataMember("NetworkControl", "Disabled");
				pcPlayer->SetMetricMember("LocationX", 0.0f);
				pcPlayer->SetMetricMember("LocationY", 0.0f);
				pcPlayer->SetMetricMember("LocationZ", -500.0f);
				pcPlayer->SetMetricMember("RotationX", 0.0f);
				pcPlayer->SetMetricMember("RotationY", 0.0f);
				pcPlayer->SetMetricMember("RotationZ", 0.0f);

				pcPlayer2->SetDataMember("Status", "Enabled");
				pcPlayer2->SetDataMember("NetworkControl", "Enabled");
				pcPlayer2->SetDataMember("Status", "Enabled");
				pcPlayer2->SetMetricMember("LocationX", 0.0f);
				pcPlayer2->SetMetricMember("LocationY", 0.0f);
				pcPlayer2->SetMetricMember("LocationZ", 500.0f);
				pcPlayer2->SetMetricMember("RotationX", 0.0f);
				pcPlayer2->SetMetricMember("RotationY", 180.0f);
				pcPlayer2->SetMetricMember("RotationZ", 0.0f);

				pcPlayer2->SetInputMember("MovePositiveX", pcPlayer->GetInputMember("MovePositiveX"));
				pcPlayer2->SetInputMember("MovePositiveY", pcPlayer->GetInputMember("MovePositiveY"));
				pcPlayer2->SetInputMember("MovePositiveZ", pcPlayer->GetInputMember("MovePositiveZ"));
				pcPlayer2->SetInputMember("MoveNegativeX", pcPlayer->GetInputMember("MoveNegativeX"));
				pcPlayer2->SetInputMember("MoveNegativeY", pcPlayer->GetInputMember("MoveNegativeY"));
				pcPlayer2->SetInputMember("MoveNegativeZ", pcPlayer->GetInputMember("MoveNegativeZ"));
				pcPlayer2->SetInputMember("Run", pcPlayer->GetInputMember("Run"));

				Engine::CActor* pcCamera = m_pcWorld->GetActorByName("Camera");
				Engine::CActor* pcCamera2 = m_pcWorld->GetActorByName("Camera2");

				pcCamera->SetDataMember("CameraStatus", "Disabled");
				pcCamera2->SetDataMember("CameraStatus", "Enabled");
				pcCamera->SetDataMember("LookAtStatus", "Disabled");
				pcCamera2->SetDataMember("LookAtStatus", "Enabled");

				Engine::CActor* pcScoreZone1 = m_pcWorld->GetActorByName("ScoreZone1");
				Engine::CActor* pcScoreZone2 = m_pcWorld->GetActorByName("ScoreZone2");

				pcScoreZone1->SetMetricMember("Score", 0.0f);
				pcScoreZone2->SetMetricMember("Score", 0.0f);
				pcScoreZone1->SetDataMember("TextStatus", "Enabled");
				pcScoreZone2->SetDataMember("TextStatus", "Enabled");

				Engine::CActor* pcStaminaBar1 = m_pcWorld->GetActorByName("StaminaBar1");

				pcStaminaBar1->SetDataMember("ActiveState", "Game");

				Engine::CActor* pcStaminaBar2 = m_pcWorld->GetActorByName("StaminaBar2");

				pcStaminaBar2->SetDataMember("ActiveState", "Game");

				Engine::CActor* pcPlayer2Forward = m_pcWorld->GetActorByName("Player2Forward");
				pcPlayer2Forward->SetDataMember("Status", "Enabled");
			}
		}

			break;
		case ID_GAME_POSITION:
		{
			if (m_bHost)
			{
				float fX = 0.0f;
				float fY = 0.0f;
				float fZ = 0.0f;
				float fLastHit = 0.0f;

				RakNet::BitStream bsIn(m_pcPacket->data, m_pcPacket->length, false);
				bsIn.IgnoreBytes(sizeof(RakNet::MessageID));
				bsIn.Read(fX);
				bsIn.Read(fY);
				bsIn.Read(fZ);

				Engine::CActor* pcPlayer2 = m_pcWorld->GetActorByName("PlayerCube2");

				pcPlayer2->SetMetricMember("LocationX", fX);
				pcPlayer2->SetMetricMember("LocationY", fY);
				pcPlayer2->SetMetricMember("LocationZ", fZ);

				m_pcWorld->ResetTimer();
			}
			else
			{
				float fX = 0.0f;
				float fY = 0.0f;
				float fZ = 0.0f;
				float fPlaySound = -1.0f;

				RakNet::BitStream bsIn(m_pcPacket->data, m_pcPacket->length, false);
				bsIn.IgnoreBytes(sizeof(RakNet::MessageID));
				bsIn.Read(fX);
				bsIn.Read(fY);
				bsIn.Read(fZ);

				Engine::CActor* pcPlayer = m_pcWorld->GetActorByName("PlayerCube");

				pcPlayer->SetMetricMember("LocationX", fX);
				pcPlayer->SetMetricMember("LocationY", fY);
				pcPlayer->SetMetricMember("LocationZ", fZ);

				m_pcWorld->ResetTimer();
			}
		}

			break;
		case ID_GAME_ROTATION:
		{
			if (m_bHost)
			{
				float fX = 0.0f;
				float fY = 0.0f;
				float fZ = 0.0f;

				RakNet::BitStream bsIn(m_pcPacket->data, m_pcPacket->length, false);
				bsIn.IgnoreBytes(sizeof(RakNet::MessageID));
				bsIn.Read(fX);
				bsIn.Read(fY);
				bsIn.Read(fZ);

				Engine::CActor* pcPlayer2 = m_pcWorld->GetActorByName("PlayerCube2");

				pcPlayer2->SetMetricMember("RotationX", fX);
				pcPlayer2->SetMetricMember("RotationY", fY);
				pcPlayer2->SetMetricMember("RotationZ", fZ);

				m_pcWorld->ResetTimer();
			}
			else
			{
				float fX = 0.0f;
				float fY = 0.0f;
				float fZ = 0.0f;

				RakNet::BitStream bsIn(m_pcPacket->data, m_pcPacket->length, false);
				bsIn.IgnoreBytes(sizeof(RakNet::MessageID));
				bsIn.Read(fX);
				bsIn.Read(fY);
				bsIn.Read(fZ);

				Engine::CActor* pcPlayer = m_pcWorld->GetActorByName("PlayerCube");

				pcPlayer->SetMetricMember("RotationX", fX);
				pcPlayer->SetMetricMember("RotationY", fY);
				pcPlayer->SetMetricMember("RotationZ", fZ);

				m_pcWorld->ResetTimer();
			}
		}

			break;
		case ID_GAME_SCORE:
		{
			if (m_bHost)
			{
				float fScore = 0.0f;

				RakNet::BitStream bsIn(m_pcPacket->data, m_pcPacket->length, false);
				bsIn.IgnoreBytes(sizeof(RakNet::MessageID));
				bsIn.Read(fScore);

				Engine::CActor* pcScoreZone2 = m_pcWorld->GetActorByName("ScoreZone2");

				pcScoreZone2->SetMetricMember("Score", fScore);

				m_pcWorld->ResetTimer();
			}
			else
			{
				float fScore = 0.0f;

				RakNet::BitStream bsIn(m_pcPacket->data, m_pcPacket->length, false);
				bsIn.IgnoreBytes(sizeof(RakNet::MessageID));
				bsIn.Read(fScore);

				Engine::CActor* pcScoreZone1 = m_pcWorld->GetActorByName("ScoreZone1");

				pcScoreZone1->SetMetricMember("Score", fScore);

				m_pcWorld->ResetTimer();
			}
		}

			break;
		case ID_GAME_STAMINA:
		{
			if (m_bHost)
			{
				float fStamina = 0.0f;

				RakNet::BitStream bsIn(m_pcPacket->data, m_pcPacket->length, false);
				bsIn.IgnoreBytes(sizeof(RakNet::MessageID));
				bsIn.Read(fStamina);

				Engine::CActor* pcPlayer2 = m_pcWorld->GetActorByName("PlayerCube2");

				pcPlayer2->SetMetricMember("Stamina", fStamina);

				m_pcWorld->ResetTimer();
			}
			else
			{
				float fStamina = 0.0f;

				RakNet::BitStream bsIn(m_pcPacket->data, m_pcPacket->length, false);
				bsIn.IgnoreBytes(sizeof(RakNet::MessageID));
				bsIn.Read(fStamina);

				Engine::CActor* pcPlayer = m_pcWorld->GetActorByName("PlayerCube");

				pcPlayer->SetMetricMember("Stamina", fStamina);

				m_pcWorld->ResetTimer();
			}
		}

			break;
		case ID_SOUND_SPRINT:
		{
			bool bSprint = false;

			RakNet::BitStream bsIn(m_pcPacket->data, m_pcPacket->length, false);
			bsIn.IgnoreBytes(sizeof(RakNet::MessageID));
			bsIn.Read(bSprint);

			if (bSprint)
			{
				if (eae6320::UserSettings::IsSoundOn())
				{
					Engine::CActor* pcPlayer = nullptr;

					if (m_bHost)
					{
						pcPlayer = m_pcWorld->GetActorByName("PlayerCube2");
					}
					else
					{
						pcPlayer = m_pcWorld->GetActorByName("PlayerCube");
					}

					float fX = pcPlayer->GetMetricMember("LocationX");
					float fY = pcPlayer->GetMetricMember("LocationY");
					float fZ = pcPlayer->GetMetricMember("LocationZ");

					Shared::Math::CVector3 v3Position(fX, fY, fZ);
					Shared::Math::CVector3 v3Velocity(0.0f, 0.0f, 0.0f);

					m_pcSoundEngine->Play3D(m_pcSprintSound, m_pcSprintChannel, v3Position, v3Velocity);
					m_pcSoundEngine->SetVolume(50.0f * eae6320::UserSettings::GetSoundVolumeLevel(), m_pcSprintChannel);
				}
			}
			else
			{
				m_pcSoundEngine->Stop(m_pcSprintChannel);
			}

			m_pcWorld->ResetTimer();
		}
			break;
		case ID_SOUND_WALK:
		{
			float fSurface = -1.0f;
			bool bWalk = false;

			RakNet::BitStream bsIn(m_pcPacket->data, m_pcPacket->length, false);
			bsIn.IgnoreBytes(sizeof(RakNet::MessageID));
			bsIn.Read(bWalk);
			bsIn.Read(fSurface);

			if (bWalk)
			{
				Engine::CActor* pcPlayer = nullptr;

				if (m_bHost)
				{
					pcPlayer = m_pcWorld->GetActorByName("PlayerCube2");
				}
				else
				{
					pcPlayer = m_pcWorld->GetActorByName("PlayerCube");
				}

				float fX = pcPlayer->GetMetricMember("LocationX");
				float fY = pcPlayer->GetMetricMember("LocationY");
				float fZ = pcPlayer->GetMetricMember("LocationZ");

				Shared::Math::CVector3 v3Position(fX, fY, fZ);
				Shared::Math::CVector3 v3Velocity(0.0f, 0.0f, 0.0f);

				switch (static_cast<int>(fSurface))
				{
				case 0:
					if (eae6320::UserSettings::IsSoundOn())
					{
						m_pcSoundEngine->Play3D(m_pcGroundSound, m_pcGroundChannel, v3Position, v3Velocity);
						m_pcSoundEngine->SetVolume(1.0f * eae6320::UserSettings::GetSoundVolumeLevel(), m_pcGroundChannel);
					}

					m_pcSoundEngine->Stop(m_pcStairChannel);

					break;
				case 1:
					if (eae6320::UserSettings::IsSoundOn())
					{
						m_pcSoundEngine->Play3D(m_pcStairSound, m_pcStairChannel, v3Position, v3Velocity);
						m_pcSoundEngine->SetVolume(1.0f * eae6320::UserSettings::GetSoundVolumeLevel(), m_pcStairChannel);
					}

					m_pcSoundEngine->Stop(m_pcGroundChannel);

					break;
				default:
					m_pcSoundEngine->Stop(m_pcGroundChannel);
					m_pcSoundEngine->Stop(m_pcStairChannel);
					break;
				}
			}
			else
			{
				m_pcSoundEngine->Stop(m_pcGroundChannel);
				m_pcSoundEngine->Stop(m_pcStairChannel);
			}

			m_pcWorld->ResetTimer();
		}

			break;
		default:
			DEBUGPRINT("Message with identifier %i has arrived.\n", m_pcPacket->data[0]);
			break;
		}
	}

	return true;
}
コード例 #3
0
void SbWidget::SetPosition( const MtVector2& v2Position )
{
	MtVector3 v3Position( v2Position.x, v2Position.y, 0 );
	m_m4WorldTransform.SetTranslation( v3Position );
}
コード例 #4
0
void Engine::Controller::CIControllerLookAtRotation::Update(Engine::CActor& i_CActor)
{
	if (!i_CActor.GetHasData("Status") || strcmp(i_CActor.GetDataMember("Status"), "Disabled") == 0)
	{
		return;
	}

	if (!i_CActor.GetHasData("LookAtStatus") || strcmp(i_CActor.GetDataMember("LookAtStatus"), "Disabled") == 0)
	{
		return;
	}

	if (i_CActor.GetHasData("ActorNameToFollow"))
	{
		const char* kcpActorNameToFollow = i_CActor.GetDataMember("ActorNameToFollow");

		Engine::CActor* pcActorToFollow = m_pcWorld->GetActorByName(kcpActorNameToFollow);

		if (pcActorToFollow == nullptr)
		{
			return;
		}

		//Get Location
		float fLocationX = 0.0f;

		if (i_CActor.GetHasMetric("LocationX"))
		{
			fLocationX = i_CActor.GetMetricMember("LocationX");
		}

		float fLocationY = 0.0f;

		if (i_CActor.GetHasMetric("LocationY"))
		{
			fLocationY = i_CActor.GetMetricMember("LocationY");
		}

		float fLocationZ = 0.0f;

		if (i_CActor.GetHasMetric("LocationZ"))
		{
			fLocationZ = i_CActor.GetMetricMember("LocationZ");
		}

		//Get Target Location
		float fLookAtX = 0.0f;

		if (i_CActor.GetHasMetric("LocationX"))
		{
			fLookAtX = pcActorToFollow->GetMetricMember("LocationX");
		}

		float fLookAtY = 0.0f;

		if (i_CActor.GetHasMetric("LocationY"))
		{
			fLookAtY = pcActorToFollow->GetMetricMember("LocationY");
		}

		float fLookAtZ = 0.0f;

		if (i_CActor.GetHasMetric("LocationZ"))
		{
			fLookAtZ = pcActorToFollow->GetMetricMember("LocationZ");
		}

		Shared::Math::CVector3 v3LookAtTarget(fLookAtX, fLookAtY, fLookAtZ);
		Shared::Math::CVector3 v3Position(fLocationX, fLocationY, fLocationZ);
		Shared::Math::CVector3 v3Up(0.0f, 1.0f, 0.0f);

		Shared::Math::CVector3 v3ZAxis = (v3LookAtTarget - v3Position).GetUnitVector();
		Shared::Math::CVector3 v3XAxis = (v3Up.GetOuterProduct(v3ZAxis)).GetUnitVector();
		Shared::Math::CVector3 v3YAxis = v3ZAxis.GetOuterProduct(v3XAxis);

		float fRotationX = 0.0f;
		float fRotationY = 0.0f;
		float fRotationZ = 0.0f;

		if (v3ZAxis.GetY() < 1.0f)
		{
			if (v3ZAxis.GetY() > -1.0f)
			{
				fRotationX = asinf(-v3ZAxis.GetY()) * 180.0f / static_cast<float>(M_PI);
				fRotationY = atan2(v3ZAxis.GetX(), v3ZAxis.GetZ()) * 180.0f / static_cast<float>(M_PI);
				fRotationZ = atan2(v3XAxis.GetY(), v3YAxis.GetY()) * 180.0f / static_cast<float>(M_PI);
			}
			else
			{
				fRotationX = static_cast<float>(M_PI) * 0.5f;
				fRotationY = atan2(-v3YAxis.GetX(), v3XAxis.GetX()) * 180.0f / static_cast<float>(M_PI);
				fRotationZ = 0.0f;
			}
		}
		else
		{
			fRotationX = static_cast<float>(M_PI) * -0.5f;
			fRotationY = atan2(-v3YAxis.GetX(), v3XAxis.GetX()) * 180.0f / static_cast<float>(M_PI);
			fRotationZ = 0.0f;
		}

		if (i_CActor.GetHasMetric("RotationX"))
		{
			i_CActor.SetMetricMember("RotationX", fRotationX);
		}

		if (i_CActor.GetHasMetric("RotationY"))
		{
			i_CActor.SetMetricMember("RotationY", fRotationY);
		}

		if (i_CActor.GetHasMetric("RotationZ"))
		{
			i_CActor.SetMetricMember("RotationZ", fRotationZ);
		}
	}
}