#pragma once #include "Util.h" #include "PersistentFormManager.h" namespace Papyrus::PapyrusFunctions { inline RE::AlchemyItem* CreatePotion(RE::StaticFunctionTag*, std::vector effects, std::vector magnitudes, std::vector areas, std::vector durations, uint32_t arraySize) { RE::AlchemyItem* result = NULL; if (effects.size() >= arraySize && magnitudes.size() >= arraySize && areas.size() >= arraySize && durations.size() >= arraySize) { RE::tArray effectItems; effectItems.Allocate(effects.size()); uint16_t count = 0; for (uint16_t i = 0; i < effects.size(); ++i) { if (effects[i]) { effectItems[i].baseEffect = effects[i]; effectItems[i].effectItem.duration = durations[i]; effectItems[i].effectItem.magnitude = magnitudes[i]; effectItems[i].effectItem.area = areas[i]; count++; } } effectItems.count = count; RE::PersistentFormManager::GetSingleton()->CreatePotion(&result, &effectItems); effectItems.Clear(); } else { logger::warn("Illegal arrays for creating a potion"); } return result; } inline uint8_t GetNewGameCount(RE::StaticFunctionTag*) { return NewGameCount(); } inline RE::TESObjectREFR* GetCurrentContainer(RE::StaticFunctionTag*) { const auto handle = RE::ContainerMenu::GetTargetRefHandle(); const auto refr = RE::TESObjectREFR::LookupByHandle(handle); return refr ? refr.get() : nullptr; } inline std::vector GetPlayerFollowers(RE::StaticFunctionTag*) { std::vector result; if (const auto processLists = RE::ProcessLists::GetSingleton(); processLists) { for (auto& actorHandle : processLists->highActorHandles) { if (auto actor = actorHandle.get(); actor && actor->IsPlayerTeammate() && !actor->IsDead() && !actor->IsDisabled()) { result.push_back(actor.get()); } } } return result; } inline void Bind(VM& a_vm) { BIND(CreatePotion); logger::info("Registered CreatePotion"sv); BIND(GetNewGameCount); logger::info("Registered GetNewGameCount"sv); BIND(GetCurrentContainer); logger::info("Registered GetCurrentContainer"sv); BIND(GetPlayerFollowers); logger::info("Registered GetPlayerFollowers"sv); } }