Пример #1
0
void OldWorld::LogoutResponse(const ClientPacket *argPacket)
{
	if ( localCharacter )
	{
		characterMap.erase(characterIndex);
		localCharacter = nullptr;
	}
	accountIndex = -1;
	characterIndex = -1;
	camera.marginX = camera.marginY = 0;
	SendDisconnectRequest();
}
Пример #2
0
void World::hLogoutResponse(ClientPacket* const argPacket) {
	if (localCharacter) {
		characterMap.erase(characterIndex);
		localCharacter = nullptr;
	}

	accountIndex = -1;
	characterIndex = -1;

	//reset the camera
	camera.marginX = camera.marginY = 0;

	//because, why not? I guess...
	SendDisconnectRequest();
}
Пример #3
0
void OldWorld::CheckHeartBeat()
{
	if ( Clock::now() - lastBeat > std::chrono::seconds(3) )
	{
		if ( attemptedBeats > 2 )
		{
			SendDisconnectRequest();
			setSceneSignal(SceneSignal::DisconnectedScreen);
			Config::Get()["client.disconnectMessage"] = "Error: Lost connection to the server";
		}
		else
		{
			ServerPacket newPacket;
			newPacket.Type = PacketType::Ping;
			network.SendTo(0, &newPacket);

			attemptedBeats++;
			lastBeat = Clock::now();
		}
	}
}
Пример #4
0
void World::QuitEvent() {
	//two-step logout
	SendDisconnectRequest();
	SetSceneSignal(SceneSignal::QUIT);
}
Пример #5
0
void World::Update() {
	//create and zero the buffer
	SerialPacket* packetBuffer = reinterpret_cast<SerialPacket*>(new char[MAX_PACKET_SIZE]);
	memset(packetBuffer, 0, MAX_PACKET_SIZE);

	try {
		//suck in and process all waiting packets
		while(network.Receive(packetBuffer)) {
			HandlePacket(packetBuffer);
		}
	}
	catch(fatal_error& e) {
		throw(e);
	}
	catch(std::exception& e) {
		std::cerr << "HandlePacket Error (" << (int)(reinterpret_cast<SerialPacket*>(packetBuffer)->type) << "): " << e.what() << std::endl;
	}

	//free the buffer
	delete reinterpret_cast<char*>(packetBuffer);

	//heartbeat system
	if (heartbeatUtility.CheckHeartBeat()) {
		//escape to the disconnect screen
		SendDisconnectRequest();
		SetSceneSignal(SceneSignal::DISCONNECTEDSCREEN);
		ConfigUtility::GetSingleton()["client.disconnectMessage"] = "Error: Lost connection to the server";
	}

	//update all entities
	for (auto& it : characterMap) {
		it.second.Update();
	}
	for (auto& it : creatureMap) {
		it.second.Update();
	}

	try {
		//update the map
		UpdateMap();
	}
	catch(fatal_error& e) {
		throw(e);
	}
	catch(std::exception& e) {
		std::cerr << "UpdateMap Error: " << e.what() << std::endl;
	}

	//skip the rest without a local character
	if (!localCharacter) {
		return;
	}

	//TODO: (0) regular query interval
	if (Clock::now() - queryTime > std::chrono::seconds(3)) {
		queryTime = Clock::now();
		//query the world state (room)
		CharacterPacket characterPacket;
		memset(&characterPacket, 0, MAX_PACKET_SIZE);
		characterPacket.type = SerialPacketType::QUERY_CHARACTER_EXISTS;
		characterPacket.roomIndex = roomIndex;
		network.SendTo(Channels::SERVER, &characterPacket);

		CreaturePacket creaturePacket;
		creaturePacket.type = SerialPacketType::QUERY_CREATURE_EXISTS;
		creaturePacket.roomIndex = roomIndex;
		network.SendTo(Channels::SERVER, &creaturePacket);

		BarrierPacket barrierPacket;
		barrierPacket.type = SerialPacketType::QUERY_BARRIER_EXISTS;
		barrierPacket.roomIndex = roomIndex;
		network.SendTo(Channels::SERVER, &barrierPacket);
	}

	//cull creatures
	for (std::map<int, BaseCreature>::iterator it = creatureMap.begin(); it != creatureMap.end(); /* */) {
		if ( (localCharacter->GetOrigin() - it->second.GetOrigin()).Length() > INFLUENCE_RADIUS) {
			creatureMap.erase(it++);
		}
		else {
			it++;
		}
	}

	//cull barriers
	barrierMgr.UnloadIf([&](std::pair<const int, BaseBarrier const&> barrierIt) -> bool {
		return (localCharacter->GetOrigin() - barrierIt.second.GetOrigin()).Length() > INFLUENCE_RADIUS;
	});

	//get the collidable boxes
	std::list<BoundingBox> boxList = GenerateCollisionGrid(localCharacter, tileSheet.GetTileW(), tileSheet.GetTileH());

	//process the collisions
	//BUG: Collisions not working
	if (localCharacter->ProcessCollisionGrid(boxList)) {
		localCharacter->CorrectSprite();
		SendLocalCharacterMovement();
	}

	//update the camera
	camera.x = localCharacter->GetOrigin().x - camera.marginX;
	camera.y = localCharacter->GetOrigin().y - camera.marginY;
}