#include "NsConcertChoiceBuildManager.h" #include "EntityManager.h" const std::vector NsConcertChoiceBuildManager::crates { { "laser", 11203, 5.0, "Concert_Laser_QB_" }, { "rocket", 11204, 3.0, "Concert_Rocket_QB_" }, { "speaker", 11205, 5.0, "Concert_Speaker_QB_" }, { "spotlight", 11206, 5.0, "Concert_Spotlight_QB_" } }; void NsConcertChoiceBuildManager::OnStartup(Entity *self) { NsConcertChoiceBuildManager::SpawnCrate(self); } void NsConcertChoiceBuildManager::SpawnCrate(Entity *self) { const auto spawnNumber = self->GetVar(u"spawnNumber") % crates.size(); const auto crate = crates[spawnNumber]; const auto groups = self->GetGroups(); if (groups.empty()) return; // Groups are of the form CB_1, CB_2, etc. auto group = groups.at(0); const auto splitGroup = GeneralUtils::SplitString(group, '_'); if (splitGroup.size() < 2) return; const auto groupNumber = std::stoi(splitGroup.at(1)); EntityInfo info {}; info.lot = crate.lot; info.pos = self->GetPosition(); info.rot = self->GetRotation(); info.spawnerID = self->GetObjectID(); info.settings = { new LDFData(u"startsQBActivator", true), new LDFData(u"grpNameQBShowBricks", crate.group + std::to_string(groupNumber)), new LDFData(u"groupID", GeneralUtils::ASCIIToUTF16("Crate_" + group)), new LDFData(u"crateTime", crate.time), }; auto* spawnedCrate = EntityManager::Instance()->CreateEntity(info); EntityManager::Instance()->ConstructEntity(spawnedCrate); spawnedCrate->AddDieCallback([self]() { self->CancelAllTimers(); // Don't switch if the crate was smashed self->SetVar(u"currentCrate", LWOOBJID_EMPTY); }); self->SetVar(u"spawnNumber", spawnNumber + 1); self->SetVar(u"currentTimer", crate.time); self->SetVar(u"currentCrate", spawnedCrate->GetObjectID()); // Timer that rotates the crates self->AddCallbackTimer(crate.time, [self]() { auto crateID = self->GetVar(u"currentCrate"); if (crateID != LWOOBJID_EMPTY) { EntityManager::Instance()->DestroyEntity(crateID); self->SetVar(u"currentCrate", LWOOBJID_EMPTY); } SpawnCrate(self); }); }