enderalse/source/Enderal DLL/src/PapyrusFunctions.h

77 lines
2.2 KiB
C
Raw Normal View History

#pragma once
#include "Util.h"
#include "PersistentFormManager.h"
namespace Papyrus::PapyrusFunctions
{
inline RE::AlchemyItem* CreatePotion(RE::StaticFunctionTag*, std::vector<RE::EffectSetting*> effects, std::vector<float> magnitudes, std::vector<uint32_t> areas, std::vector<uint32_t> durations, uint32_t arraySize)
{
RE::AlchemyItem* result = NULL;
if (effects.size() >= arraySize && magnitudes.size() >= arraySize && areas.size() >= arraySize && durations.size() >= arraySize) {
RE::tArray<RE::Effect> 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<RE::Actor*> GetPlayerFollowers(RE::StaticFunctionTag*)
{
std::vector<RE::Actor*> 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);
}
}