2
0

RoundRobinSpawner.cpp 2.3 KB

1234567891011121314151617181920212223242526272829303132333435363738394041424344454647484950515253545556575859606162636465
  1. /*
  2. * Copyright (c) Contributors to the Open 3D Engine Project. For complete copyright and license terms please see the LICENSE at the root of this distribution.
  3. *
  4. * SPDX-License-Identifier: Apache-2.0 OR MIT
  5. *
  6. */
  7. #include <AzCore/Component/TransformBus.h>
  8. #include <Source/Components/NetworkPlayerSpawnerComponent.h>
  9. #include <Source/Spawners/RoundRobinSpawner.h>
  10. namespace MultiplayerSample
  11. {
  12. bool RoundRobinSpawner::RegisterPlayerSpawner(NetworkPlayerSpawnerComponent* spawner)
  13. {
  14. if (AZStd::find(m_spawners.begin(), m_spawners.end(), spawner) == m_spawners.end())
  15. {
  16. m_spawners.push_back(spawner);
  17. return true;
  18. }
  19. return false;
  20. }
  21. AZStd::pair<Multiplayer::PrefabEntityId, AZ::Transform> RoundRobinSpawner::GetNextPlayerSpawn()
  22. {
  23. if (m_spawners.empty())
  24. {
  25. AZLOG_WARN("No active NetworkPlayerSpawnerComponents were found on player spawn request.")
  26. return AZStd::make_pair(Multiplayer::PrefabEntityId(), AZ::Transform::CreateIdentity());
  27. }
  28. if (m_spawnIndex >= m_spawners.size())
  29. {
  30. AZLOG_WARN("RoundRobinSpawner has an out-of-bounds spawner index. Resetting spawn index to 0. Did you forget to call UnregisterPlayerSpawner?")
  31. m_spawnIndex = 0;
  32. }
  33. NetworkPlayerSpawnerComponent* spawner = m_spawners[m_spawnIndex];
  34. m_spawnIndex = m_spawnIndex + 1 == m_spawners.size() ? 0 : m_spawnIndex + 1;
  35. // NetworkEntityManager currently operates against/validates AssetId or Path, opt for Path via Hint
  36. Multiplayer::PrefabEntityId prefabEntityId(AZ::Name(spawner->GetSpawnableAsset().GetHint().c_str()));
  37. return AZStd::make_pair(
  38. prefabEntityId, spawner->GetEntity()->GetTransform()->GetWorldTM());
  39. }
  40. bool RoundRobinSpawner::UnregisterPlayerSpawner(NetworkPlayerSpawnerComponent* spawner)
  41. {
  42. if (AZStd::find(m_spawners.begin(), m_spawners.end(), spawner))
  43. {
  44. m_spawners.erase(AZStd::remove(m_spawners.begin(), m_spawners.end(), spawner));
  45. // A spawner was removed, reset the next spawnIndex if it's now out-of-bounds
  46. if (m_spawnIndex >= m_spawners.size())
  47. {
  48. m_spawnIndex = 0;
  49. }
  50. return true;
  51. }
  52. return false;
  53. }
  54. } // namespace MultiplayerSample