diff --git a/client/entities/barrier_manager.cpp b/client/entities/barrier_manager.cpp index 0287701..4bf86e1 100644 --- a/client/entities/barrier_manager.cpp +++ b/client/entities/barrier_manager.cpp @@ -22,7 +22,7 @@ #include "barrier_manager.hpp" void BarrierManager::DrawTo(SDL_Renderer* const dest, Sint16 x, Sint16 y, double scaleX, double scaleY) { - for (auto& it : barrierMap) { + for (auto& it : elementMap) { it.second.DrawTo(dest, x, y); } } @@ -47,26 +47,38 @@ void BarrierManager::UnloadTemplateImages() { } BaseBarrier* BarrierManager::Create(int index) { - barrierMap.emplace(index, BaseBarrier(baseImage, templateImages)); - return &barrierMap[index]; + elementMap.emplace(index, BaseBarrier(baseImage, templateImages)); + return &elementMap[index]; } void BarrierManager::Unload(int i) { - barrierMap.erase(i); + elementMap.erase(i); } void BarrierManager::UnloadAll() { - barrierMap.clear(); + elementMap.clear(); +} + +void BarrierManager::UnloadIf(std::function)> fn) { + std::map::iterator it = elementMap.begin(); + while (it != elementMap.end()) { + if (fn(*it)) { + it = elementMap.erase(it); + } + else { + ++it; + } + } } int BarrierManager::Size() { - return barrierMap.size(); + return elementMap.size(); } BaseBarrier* BarrierManager::Find(int i) { - std::map::iterator it = barrierMap.find(i); + std::map::iterator it = elementMap.find(i); - if (it == barrierMap.end()) { + if (it == elementMap.end()) { return nullptr; } @@ -74,7 +86,7 @@ BaseBarrier* BarrierManager::Find(int i) { } std::map* BarrierManager::GetContainer() { - return &barrierMap; + return &elementMap; } std::map* BarrierManager::GetTemplateContainer() { diff --git a/client/entities/barrier_manager.hpp b/client/entities/barrier_manager.hpp index c458820..dcbbb27 100644 --- a/client/entities/barrier_manager.hpp +++ b/client/entities/barrier_manager.hpp @@ -42,6 +42,7 @@ public: BaseBarrier* Create(int index); void Unload(int i); void UnloadAll(); + void UnloadIf(std::function)> fn); int Size(); @@ -52,5 +53,5 @@ public: private: Image baseImage; std::map templateImages; - std::map barrierMap; + std::map elementMap; }; \ No newline at end of file diff --git a/client/scenes/world.cpp b/client/scenes/world.cpp index 8aad428..42b84f8 100644 --- a/client/scenes/world.cpp +++ b/client/scenes/world.cpp @@ -185,7 +185,27 @@ void World::Update() { return; } - //TODO: (1) regular query interval + //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::iterator it = creatureMap.begin(); it != creatureMap.end(); /* */) { if ( (localCharacter->GetOrigin() - it->second.GetOrigin()).Length() > INFLUENCE_RADIUS) { @@ -196,7 +216,10 @@ void World::Update() { } } - //TODO: cull barriers + //cull barriers + barrierMgr.UnloadIf([&](std::pair barrierIt) -> bool { + return (localCharacter->GetOrigin() - barrierIt.second.GetOrigin()).Length() > INFLUENCE_RADIUS; + }); //get the collidable boxes std::list boxList = GenerateCollisionGrid(localCharacter, tileSheet.GetTileW(), tileSheet.GetTileH()); @@ -727,6 +750,9 @@ void World::hCharacterCreate(CharacterPacket* const argPacket) { if (character->GetOwner() == accountIndex) { localCharacter = static_cast(character); + //reset queries + queryTime = Clock::now() - std::chrono::seconds(4); //back 4 seconds to trigger automatically + //focus the camera on this character's sprite camera.marginX = (camera.width / 2 - localCharacter->GetSprite()->GetClipW() / 2); camera.marginY = (camera.height/ 2 - localCharacter->GetSprite()->GetClipH() / 2); @@ -734,23 +760,6 @@ void World::hCharacterCreate(CharacterPacket* const argPacket) { //focus on this character's info characterIndex = argPacket->characterIndex; roomIndex = argPacket->roomIndex; - - //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); } //debug @@ -791,12 +800,12 @@ void World::hCharacterUnload(CharacterPacket* const argPacket) { void World::hQueryCharacterExists(CharacterPacket* const argPacket) { //prevent a double message about this player's character //TODO: why is this commented out? -// if (argPacket->accountIndex == accountIndex) { -// return; -// } + if (argPacket->accountIndex == accountIndex) { + return; + } //ignore characters in a different room (sub-optimal) - if (argPacket->roomIndex != roomIndex) { + if (argPacket->roomIndex != roomIndex || (localCharacter->GetOrigin() - argPacket->origin).Length() > INFLUENCE_RADIUS) { return; } @@ -913,10 +922,12 @@ void World::hCreatureUnload(CreaturePacket* const argPacket) { } void World::hQueryCreatureExists(CreaturePacket* const argPacket) { - std::cout << "Creature Query" << std::endl; + if (!localCharacter) { + return; + } //ignore creatures in a different room (sub-optimal) - if (argPacket->roomIndex != roomIndex) { + if (argPacket->roomIndex != roomIndex || (localCharacter->GetOrigin() - argPacket->origin).Length() > INFLUENCE_RADIUS) { return; } @@ -1021,10 +1032,12 @@ void World::hBarrierUnload(BarrierPacket* const argPacket) { } void World::hQueryBarrierExists(BarrierPacket* const argPacket) { - std::cout << "Barrier Query" << std::endl; + if (!localCharacter) { + return; + } //ignore barriers in a different room (sub-optimal) - if (argPacket->roomIndex != roomIndex) { + if (argPacket->roomIndex != roomIndex || (localCharacter->GetOrigin() - argPacket->origin).Length() > INFLUENCE_RADIUS) { return; } diff --git a/client/scenes/world.hpp b/client/scenes/world.hpp index 311d1fc..f317e7a 100644 --- a/client/scenes/world.hpp +++ b/client/scenes/world.hpp @@ -168,6 +168,7 @@ private: //TODO: (2) Heartbeat needs it's own utility typedef std::chrono::steady_clock Clock; Clock::time_point lastBeat = Clock::now(); + Clock::time_point queryTime = Clock::now() - std::chrono::seconds(4); //back 4 seconds to trigger automatically int attemptedBeats = 0; //ugly references; I hate this