#pragma once #include #include #include #include #include #include "RTTI.h" #include "Game/Actors/Actor.hpp" class GameInstance; GENERATE_META(World); class World : public ISave { GameInstance& game_instance_; std::unordered_map> actors_map_; std::mutex m_actors_map_; public: World(GameInstance& game_instance); ~World() override; virtual void BeginPlay(); virtual void Tick(double delta_time); GameInstance& GetGameInstance() const { return game_instance_; } #pragma region ISave std::shared_ptr save() override; void load(std::shared_ptr save) override; #pragma endregion template class Container = std::vector> Container> GetActorsByClass() { std::scoped_lock lock(m_actors_map_); Container> list; for (auto i = actors_map_.cbegin(); i != actors_map_.cend(); ++i) { if (RTTI::dyn_cast(i->second.get())) list.push_back(std::static_pointer_cast(i->second)); } return list; } template std::weak_ptr SpawnActorFormClass(std::string name, const Vector3D& loc = { 0, 0, 0 }, const Vector3D& rot = { 0, 0, 0 }) { std::scoped_lock lock(m_actors_map_); std::shared_ptr object = std::make_shared(); object->SetActorLocate(loc); object->SetActorRotate(rot); std::static_pointer_cast(object)->world_ = std::static_pointer_cast(shared_from_this()); std::static_pointer_cast(object)->name_ = name; actors_map_.try_emplace(name, object); return object; } void DestroyActor(std::weak_ptr ptr); template class Container = std::vector> Container> GetActorsByTag(std::string tag) { std::scoped_lock lock(m_actors_map_); Container> container; for (auto& i : actors_map_) { if (RTTI::dyn_cast(i.second.get())) { const std::list& tags = i.second->GetTags(); for (auto& j : tags) { if (j == tag) container.push_back(i.second); } } } return container; } template std::weak_ptr GetActorByName(const std::string& name) { std::scoped_lock lock(m_actors_map_); auto it = actors_map_.find(name); if (it == actors_map_.end() || it->second == nullptr) return {}; return std::static_pointer_cast(it->second); } };