示例#1
0
void NPC::StopWandering()
{	// stops a mob from wandering, takes him off grid and sends him back to spawn point
	roamer=false;
	CastToNPC()->SetGrid(0);
	SendPosition();
	mlog(QUESTS__PATHING, "Stop Wandering requested.");
	return;
}
示例#2
0
void NPC::StopWandering()
{	// stops a mob from wandering, takes him off grid and sends him back to spawn point
	roamer=false;
	CastToNPC()->SetGrid(0);
	SendPosition();
	Log.Out(Logs::Detail, Logs::Pathing, "Stop Wandering requested.");
	return;
}
示例#3
0
void NPC::NextGuardPosition() {
	if (!CalculateNewPosition2(guard_x, guard_y, guard_z, GetMovespeed())) {
		SetHeading(guard_heading);
		mlog(AI__WAYPOINTS, "Unable to move to next guard position. Probably rooted.");
	}
	else if((x_pos == guard_x) && (y_pos == guard_y) && (z_pos == guard_z))
	{
		if(moved)
		{
			moved=false;
			SetMoving(false);
			SendPosition();
		}
	}
}
示例#4
0
文件: app_test.c 项目: d3x0r/SACK
int main( int argc, char **argv )
{
#undef atoi
	if( argc < 2 )
	{
		printf( "%s {S|H|M} \n"
				" S - show\n"
				" H - hide\n"
             " M - requires 4 additional parameters < x y width height >\n", argv[0] );
      return 0;
	}
	else if( argv[1][0] == 'S' || argv[1][0] == 's' )
      SendShow();
	else if( argv[1][0] == 'H' || argv[1][0] == 'h' )
      SendHide();
	else if( argv[1][0] == 'M' || argv[1][0] == 'm' )
		SendPosition( atoi( argv[2] ), atoi( argv[3] ), atoi( argv[4] ), atoi( argv[5] ) );
   WakeableSleep( 250 );
   return 0;
}
示例#5
0
void NPC::PauseWandering(int pausetime)
{	// causes wandering to stop but is resumable
	// 0 pausetime means pause until resumed
	// otherwise automatically resume when time is up
	if (GetGrid() != 0)
	{
		DistractedFromGrid = true;
		Log.Out(Logs::Detail, Logs::Pathing, "Paused Wandering requested. Grid %d. Resuming in %d ms (0=not until told)", GetGrid(), pausetime);
		SendPosition();
		if (pausetime<1)
		{	// negative grid number stops him dead in his tracks until ResumeWandering()
			SetGrid( 0 - GetGrid());
		}
		else
		{	// specified waiting time, he'll resume after that
			AIwalking_timer->Start(pausetime*1000); // set the timer
		}
	} else {
		Log.Out(Logs::General, Logs::Error, "NPC not on grid - can't pause wandering: %lu", (unsigned long)GetNPCTypeID());
	}
	return;
}
void Object::SendObject(Player *player)
{
    //first send the create info
    SendCreateInfo(player);

    //send Object Effects (if any)
    SendObjectEffects(player);

    //send Relationship
    SendRelationship(player);

    //Send Position
    SendPosition(player);

    //Send Auxdata
	SendAuxDataPacket(player);

    //Send Navigation
    SendNavigation(player);

    OnCreate(player);
}
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;
}
示例#8
0
bool Mob::CalculateNewPosition(float x, float y, float z, float speed, bool checkZ) {
	if(GetID()==0)
		return true;

	float nx = x_pos;
	float ny = y_pos;
	float nz = z_pos;

	// if NPC is rooted
	if (speed == 0.0) {
		SetHeading(CalculateHeadingToTarget(x, y));
		if(moved){
			SendPosition();
			SetMoving(false);
			moved=false;
		}
		SetRunAnimSpeed(0);
		mlog(AI__WAYPOINTS, "Rooted while calculating new position to (%.3f, %.3f, %.3f)", x, y, z);
		return true;
	}

	float old_test_vector=test_vector;
	tar_vx = x - nx;
	tar_vy = y - ny;
	tar_vz = z - nz;

	if (tar_vx == 0 && tar_vy == 0)
		return false;
	pRunAnimSpeed = (uint8)(speed*NPC_RUNANIM_RATIO);
	speed *= NPC_SPEED_MULTIPLIER;

	mlog(AI__WAYPOINTS, "Calculating new position to (%.3f, %.3f, %.3f) vector (%.3f, %.3f, %.3f) rate %.3f RAS %d", x, y, z, tar_vx, tar_vy, tar_vz, speed, pRunAnimSpeed);

	// --------------------------------------------------------------------------
	// 2: get unit vector
	// --------------------------------------------------------------------------
	test_vector=sqrtf (x*x + y*y + z*z);
	tar_vector = speed / sqrtf (tar_vx*tar_vx + tar_vy*tar_vy + tar_vz*tar_vz);
	heading = CalculateHeadingToTarget(x, y);

	if (tar_vector >= 1.0) {
		if(IsNPC()) {
			entity_list.ProcessMove(CastToNPC(), x, y, z);
		}

		x_pos = x;
		y_pos = y;
		z_pos = z;
		mlog(AI__WAYPOINTS, "Close enough, jumping to waypoint");
	}
	else {
		float new_x = x_pos + tar_vx*tar_vector;
		float new_y = y_pos + tar_vy*tar_vector;
		float new_z = z_pos + tar_vz*tar_vector;
		if(IsNPC()) {
			entity_list.ProcessMove(CastToNPC(), new_x, new_y, new_z);
		}

		x_pos = new_x;
		y_pos = new_y;
		z_pos = new_z;
		mlog(AI__WAYPOINTS, "Next position (%.3f, %.3f, %.3f)", x_pos, y_pos, z_pos);
	}

	uint8 NPCFlyMode = 0;

	if(IsNPC()) {
		if(CastToNPC()->GetFlyMode() == 1 || CastToNPC()->GetFlyMode() == 2)
			NPCFlyMode = 1;
	}

	//fix up pathing Z
	if(!NPCFlyMode && checkZ && zone->HasMap() && RuleB(Map, FixPathingZWhenMoving))
	{
		if(!RuleB(Watermap, CheckForWaterWhenMoving) || !zone->HasWaterMap() ||
			(zone->HasWaterMap() && !zone->watermap->InWater(x_pos, y_pos, z_pos)))
		{
			Map::Vertex dest(x_pos, y_pos, z_pos);

			float newz = zone->zonemap->FindBestZ(dest, nullptr) + 2.0f;

			mlog(AI__WAYPOINTS, "BestZ returned %4.3f at %4.3f, %4.3f, %4.3f", newz,x_pos,y_pos,z_pos);

			if( (newz > -2000) && ABS(newz - dest.z) < RuleR(Map, FixPathingZMaxDeltaMoving)) // Sanity check.
			{
				if(ABS(x - x_pos) < 0.5 && ABS(y - y_pos) < 0.5)
				{
					if(ABS(z - z_pos) <= RuleR(Map, FixPathingZMaxDeltaMoving))
						z_pos = z;
					else
						z_pos = newz + 1;
				}
				else
					z_pos = newz+1;
			}
		}
	}

	//OP_MobUpdate
	if((old_test_vector!=test_vector) || tar_ndx>20){ //send update
		tar_ndx=0;
		this->SetMoving(true);
		moved=true;
		delta_x=(x_pos-nx);
		delta_y=(y_pos-ny);
		delta_z=(z_pos-nz);
		delta_heading=0;//(heading-nh)*8;
		SendPosUpdate();
	}
	tar_ndx++;

	// now get new heading
	SetAppearance(eaStanding, false); // make sure they're standing
	pLastChange = Timer::GetCurrentTime();
	return true;
}
void Player::SetCalculatePlayerPosition()
{
	float speedXDeltaTime = m_speed * (float)GLOBAL::GetInstance().GetDeltaTime();
	// Check collision between player and static boxes

	OBB playerOBB;
	playerOBB.m_radius = -1.0f;
	if (GetBoundingBoxes().size() > 0)
	{
		playerOBB = GetBoundingBoxes()[0];
	}
	std::vector<OBB> collidingBoxes = CollisionManager::GetInstance()->CalculateLocalPlayerCollisionWithStaticBoxes(playerOBB, m_speed, m_direction);

	for (unsigned int i = 0; i < collidingBoxes.size(); i++)
	{
		if (m_direction.x == 1 || m_direction.x == -1 || m_direction.z == 1 || m_direction.z == -1)
		{
			Sphere playerSphere = Sphere(m_position, m_playerSphere.m_radius - 0.1f);
			playerSphere.m_position.x = m_position.x;
			playerSphere.m_position.z = m_position.z - 1.0f * speedXDeltaTime;
			bool down = CollisionManager::GetInstance()->CheckCollisionWithAllStaticObjects(playerSphere);
			playerSphere.m_position.x = m_position.x;
			playerSphere.m_position.z = m_position.z + 1.0f * speedXDeltaTime;
			bool up = CollisionManager::GetInstance()->CheckCollisionWithAllStaticObjects(playerSphere);
			playerSphere.m_position.x = m_position.x + 1.0f * speedXDeltaTime;
			playerSphere.m_position.z = m_position.z;
			bool right = CollisionManager::GetInstance()->CheckCollisionWithAllStaticObjects(playerSphere);
			playerSphere.m_position.x = m_position.x - 1.0f * speedXDeltaTime;
			playerSphere.m_position.z = m_position.z;
			bool left = CollisionManager::GetInstance()->CheckCollisionWithAllStaticObjects(playerSphere);

			if ((down && m_direction.z == -1) || (up && m_direction.z == 1) || (right && m_direction.x == 1) || (left && m_direction.x == -1))
			{
				SetDirection(DirectX::XMFLOAT3(0.0f, 0.0f, 0.0f));
			}
		}
		else if (collidingBoxes.size() > 1)
		{

			if (CheckSidesIfMultipleCollisions() == true)
			{
				SetDirection(DirectX::XMFLOAT3(0.0f, 0.0f, 0.0f));
				//SetPosition(DirectX::XMFLOAT3(m_position.x - m_direction.x * (float)GLOBAL::GetInstance().GetDeltaTime(), m_position.y, m_position.z - m_direction.z * (float)GLOBAL::GetInstance().GetDeltaTime()));
			}
			else
			{
				CalculatePlayerCubeCollision(collidingBoxes[i]);
			}
		}
		else
		{
			CalculatePlayerCubeCollision(collidingBoxes[i]);
		}
	}

	std::vector<Sphere> collidingSpheres = CollisionManager::GetInstance()->CalculateLocalPlayerCollisionWithStaticSpheres(m_playerSphere, m_speed, m_direction);
	// Check collision between player and static spheres
	for (unsigned int i = 0; i < collidingSpheres.size(); i++)
	{
		float r = collidingSpheres[i].m_radius;
		float deltaZ = m_position.z - collidingSpheres[i].m_position.z;
		float deltaX = m_position.x - collidingSpheres[i].m_position.x;
		float angle = atan2f(deltaZ, deltaX);

		float circleX = cosf(angle) * r;
		float circleY = sinf(angle) * r;

		float dz = collidingSpheres[i].m_position.z - m_position.z;
		float dx = collidingSpheres[i].m_position.x - m_position.x;
		float angle1 = atan2(dz, dx);
		float angle2 = atan2(m_direction.z, m_direction.x);
		float offset = angle1 - angle2;
		

		// Special cases ftw. Dont ask!
		if (angle1 < 0 && angle2 < 0)
		{
			offset *= -1;
		}		
		if (angle2 >= 0 && angle1 < 0)
		{
			offset *= -1;
		}
		if (angle2 >= DirectX::XM_PIDIV2 && angle1 <= -DirectX::XM_PIDIV2)
		{
			offset *= -1;
		}
		if (angle2 <= -DirectX::XM_PIDIV2 && angle1 >= DirectX::XM_PIDIV2)
		{
			offset *= -1;
		}

		// Circle equation:
		// circleX * X + circleY * Y = Radius * Radius
		// Bryt ut så att y blir ensam
		// Y = (Radius * Radius - circleX * X) / circleY		
		float yValue = (r * r - circleX * (circleX + offset)) / circleY;
		
		DirectX::XMFLOAT3 dir = DirectX::XMFLOAT3((circleX + offset) - circleX, 0, yValue - circleY);
		// Normalize
		float length = sqrt(dir.x * dir.x + dir.z * dir.z);
		dir.x = dir.x / length;
		dir.z = dir.z / length;
		SetDirection(dir);
	}
	if (collidingSpheres.size() > 1 || collidingSpheres.size() >= 1 && collidingBoxes.size() >= 1)
	{
		SetDirection(DirectX::XMFLOAT3(0.0f, 0.0f, 0.0f));
	}

	SendPosition(DirectX::XMFLOAT3(m_position.x + m_direction.x * speedXDeltaTime, m_position.y + m_direction.y * speedXDeltaTime, m_position.z + m_direction.z * speedXDeltaTime));
}
void Player::UpdateMe()
{
	float angle = atan2(m_dashDirection.z, m_dashDirection.x);
	DirectX::XMFLOAT3 position = DirectX::XMFLOAT3(m_position.x, 2.0f, m_position.z);
	m_trail->Update(position, angle);

	//Required for ambient 3D sounds
	if (m_sound != nullptr){
		m_sound->UpdateAmbientSound(m_position.x, m_position.y, m_position.z);
	}

	if (m_updateVisibility)
	{
		m_updateVisibility = false;
		GraphicsEngine::UpdateVisibilityPolygon(Point(m_position.x, m_position.z), (float)GLOBAL::GetInstance().GetDeltaTime());
	}

	// Check values from server
	if (Network::GetInstance()->IsConnected())
	{
		SetHealth(Network::GetInstance()->GetMyPlayer().currentHP);
		SetMaxHealth(Network::GetInstance()->GetMyPlayer().maxHP);
		SetIsAlive(Network::GetInstance()->GetMyPlayer().isAlive);
		SetTeam(Network::GetInstance()->GetMyPlayer().team);
		SetGuID(Network::GetInstance()->GetMyPlayer().guid);
		//SetPosition(DirectX::XMFLOAT3(Network::GetInstance()->GetMyPlayer().x, Network::GetInstance()->GetMyPlayer().y, Network::GetInstance()->GetMyPlayer().z));
	}

	float directionAngle = DirectX::XMVector3AngleBetweenVectors(DirectX::XMLoadFloat3(&m_attackDir), DirectX::XMLoadFloat3(&m_direction)).m128_f32[0];

	if (directionAngle > (3.14f * 0.625f))
	{
		m_speed = m_originalSpeed * 0.85f;
	}
	else
	{
		SetSpeed(m_originalSpeed);
	}
	
	for (unsigned int i = 0; i < m_stickyTrapList.size(); i++)
	{		
		if (Collisions::SphereSphereCollision(m_playerSphere, m_stickyTrapList[i]->GetStickyTrapSphere()))
		{
			SetSpeed(m_speed * STICKY_TRAP_SLOW_PRECENTAGE);
			break;
		}
	}


	UpdateBlood();

	// Don't update player if he is dead
	if (!m_isAlive || Network::GetInstance()->GetMatchOver())
	{
		m_ability = m_noAbility;
		// Animation None ?
		UpdateAbilities();
		UpdateAbilityBar();
		AnimatedObject::ChangeAnimationState(AnimationState::None);
		if (m_sound != nullptr && m_soundEmitter != nullptr){
			m_sound->StopAmbientSound(m_soundEmitter);
		}

		return;
	}

	// Check for dash
	if (Network::GetInstance()->HaveDashed())
	{		
		// Calc distance
		float dx = Network::GetInstance()->GetDashLocation().x - m_position.x;
		float dz = Network::GetInstance()->GetDashLocation().z - m_position.z;
		m_dashDistanceLeft = sqrt(dx * dx + dz * dz);

		// Calc dir
		DirectX::XMVECTOR tempVector = DirectX::XMLoadFloat3(&DirectX::XMFLOAT3(dx, 0, dz));
		tempVector = DirectX::XMVector3Normalize(tempVector);
		DirectX::XMStoreFloat3(&m_dashDirection, tempVector);

		m_isDashing = true;

		m_trail->StartEmiting();
	}

	// Dash movement
	if (m_isDashing)
	{
		float distance = DASH_SPEED * m_speed * (float)GLOBAL::GetInstance().GetDeltaTime();

		Sphere playerSphere = m_playerSphere;
		playerSphere.m_position.x += m_dashDistanceLeft * m_dashDirection.x;
		playerSphere.m_position.z += m_dashDistanceLeft * m_dashDirection.z;		

		if (!CollisionManager::GetInstance()->CheckCollisionWithAllStaticObjects(playerSphere))
		{
			if (distance >= m_dashDistanceLeft)
			{
				m_position.x += m_dashDistanceLeft * m_dashDirection.x;
				m_position.z += m_dashDistanceLeft * m_dashDirection.z;
				m_dashDistanceLeft = 0.0f;
				m_isDashing = false;

				Network::GetInstance()->SendAnimationState(AnimationState::None);

				m_trail->StopEmiting();
			}
			else
			{
				m_position.x += (DASH_SPEED * m_speed * (float)GLOBAL::GetInstance().GetDeltaTime()) * m_dashDirection.x;
				m_position.z += (DASH_SPEED * m_speed * (float)GLOBAL::GetInstance().GetDeltaTime()) * m_dashDirection.z;
				m_dashDistanceLeft -= distance;
			}

			// If we dashed, update shadow shapes.
			GraphicsEngine::UpdateVisibilityPolygon(Point(m_position.x, m_position.z), (float)GLOBAL::GetInstance().GetDeltaTime());
			// Force network to send pos
			Network::GetInstance()->SendLatestPos();
		}

		else
		{
			m_isDashing = false;

			Network::GetInstance()->SendAnimationState(AnimationState::None);

			m_trail->StopEmiting();
		}

		SendPosition(m_position);
	}

	// Move.
	if ((CalculateDirection() || Network::GetInstance()->ConnectedNow()) && !m_isDashing)
	{
		SetCalculatePlayerPosition();

		// If we moved, update shadow shapes.

		GraphicsEngine::UpdateVisibilityPolygon(Point(m_position.x, m_position.z), (float)GLOBAL::GetInstance().GetDeltaTime());

		//Update sound (walking)
	
		m_sound->StartAmbientSound(m_soundEmitter);
		m_soundEmitter->m_pos.x = position.x;
		m_soundEmitter->m_pos.y = position.y;
		m_soundEmitter->m_pos.z = position.z;
	}
	else{
		m_sound->StopAmbientSound(m_soundEmitter);
	}
	m_playerSphere.m_position = m_position;
	
	// Check if the player have made an invalid move
	if (Network::GetInstance()->MadeInvalidMove())
	{
		PlayerNet myPlayer = Network::GetInstance()->GetMyPlayer();
		SendPosition(DirectX::XMFLOAT3(myPlayer.x, myPlayer.y, myPlayer.z));
		Network::GetInstance()->UpdatedMoveFromInvalidMove();

		m_updateVisibility = true;
	}

	// Check if the player need to respawn
	if (Network::GetInstance()->HasRespawned())
	{
		PlayerNet myPlayer = Network::GetInstance()->GetMyPlayer();
		SendPosition(DirectX::XMFLOAT3(myPlayer.x, myPlayer.y, myPlayer.z));
		Network::GetInstance()->SetHaveRespawned();

		m_updateVisibility = true;
	}

	if (Settings::GetInstance()->m_apeToggle)
	{
		if (InputManager::GetInstance()->IsKeyClicked(VkKeyScan(VK_SPACE)))
		{
			m_onPressed = !m_onPressed;
			GLOBAL::GetInstance().APE_ON = !m_onPressed;
		}
	}
	else
	{
		if (InputManager::GetInstance()->IsKeyPressed(VkKeyScan(VK_SPACE)))
		{
			if (Settings::GetInstance()->m_apeEnabled)
			{
				m_onPressed = false;
				GLOBAL::GetInstance().APE_ON = true;
			}
			else
			{
				m_onPressed = true;
				GLOBAL::GetInstance().APE_ON = false;
			}
		}
		else
		{
			if (Settings::GetInstance()->m_apeEnabled)
			{
				m_onPressed = true;
				GLOBAL::GetInstance().APE_ON = false;
			}
			else
			{
				m_onPressed = false;
				GLOBAL::GetInstance().APE_ON = true;
			}
		}
	}

	m_ability = m_noAbility;
	CheckForSpecialAttack();
	if (m_onPressed)
	{
		// Range attack
		if (InputManager::GetInstance()->IsRightMousePressed())
		{
			// Check cd so m_ability does not get set if u have cooldown preventing other abilities to be casted.
			if (m_rangeAttack->GetStacks() > 0 || m_rangeAttack->GetStacks() == -1)
			{
				m_ability = m_rangeAttack;
			}
			else
			{
				StillCDText();
			}
		}
		// Melee attack
		if (InputManager::GetInstance()->IsLeftMousePressed())
		{
			if ((float)m_meleeAttack->GetCooldown() <= 0.0f)
			{
				m_ability = m_meleeAttack;
			}
			else
			{
				StillCDText();
			}
		}
	}
	else
	{		
		// Range attack
		if (InputManager::GetInstance()->IsRightMouseClicked())
		{
			// Check cd so m_ability does not get set if u have cooldown preventing other abilities to be casted.
			if (m_rangeAttack->GetStacks() > 0 || m_rangeAttack->GetStacks() == -1)
			{
				m_ability = m_rangeAttack;
			}
			else
			{
				StillCDText();
			}
		}
		// Melee attack
		if (InputManager::GetInstance()->IsLeftMouseClicked())
		{
			if ((float)m_meleeAttack->GetCooldown() <= 0.0f)
			{
				m_ability = m_meleeAttack;
			}
			else
			{
				StillCDText();
			}
		}
	}

	// Count down cooldowns
	UpdateAbilities();
	throwDistance = CollisionManager::GetInstance()->CalculateMouseDistanceFromPlayer(m_position);
	if (m_ability != m_noAbility && m_globalCooldown <= 0.0f)
	{
		if (m_ability->Execute(throwDistance))
		{
			// Play ability animation if we did any
			DoAnimation();

			// Set global cooldown
			m_globalCooldown = m_maxGlobalCooldown;
		}
	}

	DealtDamageStruct temp = Network::GetInstance()->GetDealtDamage();
	m_floatingText->SetDealtDamageText(temp.m_position ,temp.m_damage);
	UpdateAbilityBar();

}
示例#11
0
文件: zoning.cpp 项目: Corysia/Server
void Client::ZonePC(uint32 zoneID, uint32 instance_id, float x, float y, float z, float heading, uint8 ignorerestrictions, ZoneMode zm) {
	bool ReadyToZone = true;
	int iZoneNameLength = 0;
	const char*	pShortZoneName = nullptr;
	char* pZoneName = nullptr;

	pShortZoneName = database.GetZoneName(zoneID);
	database.GetZoneLongName(pShortZoneName, &pZoneName);

	SetPortExemption(true);

	if(!pZoneName) {
		Message(13, "Invalid zone number specified");
		safe_delete_array(pZoneName);
		return;
	}
	iZoneNameLength = strlen(pZoneName);

	switch(zm) {
		case EvacToSafeCoords:
		case ZoneToSafeCoords:
			x = zone->safe_x();
			y = zone->safe_y();
			z = zone->safe_z();
			SetHeading(heading);
			break;
		case GMSummon:
			zonesummon_x = x_pos = x;
			zonesummon_y = y_pos = y;
			zonesummon_z = z_pos = z;
			SetHeading(heading);

			zonesummon_id = zoneID;
			zonesummon_ignorerestrictions = 1;
			break;
		case ZoneSolicited:
			zonesummon_x = x;
			zonesummon_y = y;
			zonesummon_z = z;
			SetHeading(heading);

			zonesummon_id = zoneID;
			zonesummon_ignorerestrictions = ignorerestrictions;
			break;
		case GateToBindPoint:
			x = x_pos = m_pp.binds[0].x;
			y = y_pos = m_pp.binds[0].y;
			z = z_pos = m_pp.binds[0].z;
			heading = m_pp.binds[0].heading;
			break;
		case ZoneToBindPoint:
			x = x_pos = m_pp.binds[0].x;
			y = y_pos = m_pp.binds[0].y;
			z = z_pos = m_pp.binds[0].z;
			heading = m_pp.binds[0].heading;

			zonesummon_ignorerestrictions = 1;
			LogFile->write(EQEMuLog::Debug, "Player %s has died and will be zoned to bind point in zone: %s at LOC x=%f, y=%f, z=%f, heading=%f", GetName(), pZoneName, m_pp.binds[0].x, m_pp.binds[0].y, m_pp.binds[0].z, m_pp.binds[0].heading);
			break;
		case SummonPC:
			zonesummon_x = x_pos = x;
			zonesummon_y = y_pos = y;
			zonesummon_z = z_pos = z;
			SetHeading(heading);
			break;
		case Rewind:
			LogFile->write(EQEMuLog::Debug, "%s has requested a /rewind from %f, %f, %f, to %f, %f, %f in %s", GetName(), x_pos, y_pos, z_pos, rewind_x, rewind_y, rewind_z, zone->GetShortName());
			zonesummon_x = x_pos = x;
			zonesummon_y = y_pos = y;
			zonesummon_z = z_pos = z;
			SetHeading(heading);
			break;
		default:
			LogFile->write(EQEMuLog::Error, "Client::ZonePC() received a reguest to perform an unsupported client zone operation.");
			ReadyToZone = false;
			break;
	}

	if(ReadyToZone) {
		zone_mode = zm;
		if(zm == ZoneToBindPoint) {
			EQApplicationPacket* outapp = new EQApplicationPacket(OP_ZonePlayerToBind, sizeof(ZonePlayerToBind_Struct) + iZoneNameLength);
			ZonePlayerToBind_Struct* gmg = (ZonePlayerToBind_Struct*) outapp->pBuffer;

			// If we are SoF and later and are respawning from hover, we want the real zone ID, else zero to use the old hack.
			//
			if((GetClientVersionBit() & BIT_SoFAndLater) && (!RuleB(Character, RespawnFromHover) || !IsHoveringForRespawn()))
				gmg->bind_zone_id = 0;
			else
				gmg->bind_zone_id = zoneID;

			gmg->x = x;
			gmg->y = y;
			gmg->z = z;
			gmg->heading = heading;
			strcpy(gmg->zone_name, pZoneName);

			outapp->priority = 6;
			FastQueuePacket(&outapp);
			safe_delete(outapp);
		}
		else if(zm == ZoneSolicited || zm == ZoneToSafeCoords) {
			EQApplicationPacket* outapp = new EQApplicationPacket(OP_RequestClientZoneChange, sizeof(RequestClientZoneChange_Struct));
			RequestClientZoneChange_Struct* gmg = (RequestClientZoneChange_Struct*) outapp->pBuffer;

			gmg->zone_id = zoneID;
			gmg->x = x;
			gmg->y = y;
			gmg->z = z;
			gmg->heading = heading;
			gmg->instance_id = instance_id;
			gmg->type = 0x01;				//an observed value, not sure of meaning

			outapp->priority = 6;
			FastQueuePacket(&outapp);
			safe_delete(outapp);
		}
		else if(zm == EvacToSafeCoords) {
			EQApplicationPacket* outapp = new EQApplicationPacket(OP_RequestClientZoneChange, sizeof(RequestClientZoneChange_Struct));
			RequestClientZoneChange_Struct* gmg = (RequestClientZoneChange_Struct*) outapp->pBuffer;

			// if we are in the same zone we want to evac to, client will not send OP_ZoneChange back to do an actual
			// zoning of the client, so we have to send a viable zoneid that the client *could* zone to to make it believe
			// we are leaving the zone, even though we are not. We have to do this because we are missing the correct op code
			// and struct that should be used for evac/succor.
			// 213 is Plane of War
			// 76 is orignial Plane of Hate
			// WildcardX 27 January 2008. Tested this for 6.2 and Titanium clients.

			if(this->GetZoneID() == 1)
				gmg->zone_id = 2;
			else if(this->GetZoneID() == 2)
				gmg->zone_id = 1;
			else
				gmg->zone_id = 1;

			gmg->x = x;
			gmg->y = y;
			gmg->z = z;
			gmg->heading = heading;
			gmg->instance_id = instance_id;
			gmg->type = 0x01;				// '0x01' was an observed value for the type field, not sure of meaning

			// we hide the real zoneid we want to evac/succor to here
			zonesummon_id = zoneID;

			outapp->priority = 6;
			FastQueuePacket(&outapp);
			safe_delete(outapp);
		}
		else {
			if(zoneID == GetZoneID()) {
				//properly handle proximities
				entity_list.ProcessMove(this, x_pos, y_pos, z_pos);
				proximity_x = x_pos;
				proximity_y = y_pos;
				proximity_z = z_pos;

				//send out updates to people in zone.
				SendPosition();
			}

			EQApplicationPacket* outapp = new EQApplicationPacket(OP_RequestClientZoneChange, sizeof(RequestClientZoneChange_Struct));
			RequestClientZoneChange_Struct* gmg = (RequestClientZoneChange_Struct*) outapp->pBuffer;

			gmg->zone_id = zoneID;
			gmg->x = x;
			gmg->y = y;
			gmg->z = z;
			gmg->heading = heading;
			gmg->instance_id = instance_id;
			gmg->type = 0x01;	//an observed value, not sure of meaning
			outapp->priority = 6;
			FastQueuePacket(&outapp);
			safe_delete(outapp);
		}

		_log(NET__DEBUG, "Player %s has requested a zoning to LOC x=%f, y=%f, z=%f, heading=%f in zoneid=%i", GetName(), x, y, z, heading, zoneID);
		//Clear zonesummon variables if we're zoning to our own zone
		//Client wont generate a zone change packet to the server in this case so
		//They aren't needed and it keeps behavior on next zone attempt from being undefined.
		if(zoneID == zone->GetZoneID() && instance_id == zone->GetInstanceID())
		{
			if(zm != EvacToSafeCoords && zm != ZoneToSafeCoords && zm != ZoneToBindPoint)
			{
				zonesummon_x = 0;
				zonesummon_y = 0;
				zonesummon_z = 0;
				zonesummon_id = 0;
				zonesummon_ignorerestrictions = 0;
				zone_mode = ZoneUnsolicited;
			}
		}
	}

	safe_delete_array(pZoneName);
}