#pragma once #include "reboot.h" #include "GameplayStatics.h" #include "FortLootPackage.h" #include "FortPickup.h" void SpawnBGAs() // hahah not "proper", there's a function that we can hook and it gets called on each spawner whenever playlist gets set, but it's fine. { static auto BGAConsumableSpawnerClass = FindObject("/Script/FortniteGame.BGAConsumableSpawner"); if (!BGAConsumableSpawnerClass) return; auto AllBGAConsumableSpawners = UGameplayStatics::GetAllActorsOfClass(GetWorld(), BGAConsumableSpawnerClass); LOG_INFO(LogDev, "AllBGAConsumableSpawners.Num(): {}", (int)AllBGAConsumableSpawners.Num()); for (int i = 0; i < AllBGAConsumableSpawners.Num(); i++) { auto BGAConsumableSpawner = AllBGAConsumableSpawners.at(i); auto SpawnLocation = BGAConsumableSpawner->GetActorLocation(); SpawnLocation.Z += 100; static auto SpawnLootTierGroupOffset = BGAConsumableSpawner->GetOffset("SpawnLootTierGroup"); auto& SpawnLootTierGroup = BGAConsumableSpawner->Get(SpawnLootTierGroupOffset); auto LootDrops = PickLootDrops(SpawnLootTierGroup, false); for (auto& LootDrop : LootDrops) { static auto ConsumableClassOffset = LootDrop.ItemDefinition->GetOffset("ConsumableClass"); auto ConsumableClassSoft = LootDrop.ItemDefinition->GetPtr>(ConsumableClassOffset); static auto BlueprintGeneratedClassClass = FindObject("/Script/Engine.BlueprintGeneratedClass"); auto StrongConsumableClass = ConsumableClassSoft->Get(BlueprintGeneratedClassClass, true); if (!StrongConsumableClass) { LOG_INFO(LogDev, "Invalid consumable class!"); continue; } auto ConsumableActor = GetWorld()->SpawnActor(StrongConsumableClass, SpawnLocation); } } AllBGAConsumableSpawners.Free(); LOG_INFO(LogDev, "Spawned BGAS!"); }