#pragma once #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; 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 std::vector> GetActorsByClass() { std::vector> 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::shared_ptr object = std::make_shared(); object->SetActorLocate(loc); object->SetActorRotate(rot); static_cast(object)->world_ = this; actors_map.try_emplace(name, object); return object; } void DestroyActor(std::weak_ptr ptr); template> Container GetActorsByTag(std::string tag) { Container container; for (auto& i : actors_map) { const std::list& tags = i.second->GetTags(); for (auto& j : tags) { if (j == tag) container.push_back(i); } } return container; } template std::weak_ptr GetActorByID(const std::string& id) { return actors_map[id]; } };