#pragma once #include #include #include #include "RTTI.h" #include "Game/Actors/Actor.hpp" #include "Game/Actors/Mesh/Mesh.hpp" class GameInstance; GENERATE_META(World); class World : public ISave { GameInstance& game_instance; // Actors only std::list actors; 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> Container GetActorsByClass() { Container list; for (auto i = actors.cbegin(); i != actors.cend(); ++i) { if (T* cast_object = RTTI::dyn_cast(*i)) list.push_back(cast_object); } return list; } template T* SpawnActorFormClass(const Vector3D& loc = { 0, 0, 0 }, const Vector3D& rot = { 0, 0, 0 }) { T* object = new T(); object->SetActorLocate(loc); object->SetActorRotate(rot); static_cast(object)->world_ = this; actors.push_back(object); return object; } template> Container GetActorsByTag(std::string tag) { Container container; for (auto& i : actors) { const std::list& tags = i->GetTags(); for (auto& j : tags) { if (j == tag) container.push_back(i); } } return container; } };