#include #include #include TESObjectREFR* TESQuest::GetAliasedRef(uint32_t aAliasID) noexcept { TP_THIS_FUNCTION(TGetAliasedRef, BSPointerHandle*, TESQuest, BSPointerHandle*, uint32_t); POINTER_SKYRIMSE(TGetAliasedRef, getAliasedRef, 25066); BSPointerHandle result{}; TiltedPhoques::ThisCall(getAliasedRef, this, &result, aAliasID); return TESObjectREFR::GetByHandle(result.handle.iBits); } TESQuest::State TESQuest::getState() { if (flags >= 0) { if (unkFlags) return State::WaitingPromotion; else if (flags & 1) return State::Running; else return State::Stopped; } return State::WaitingForStage; } void TESQuest::SetCompleted(bool force) { TP_THIS_FUNCTION(TSetCompleted, void, TESQuest, bool); POINTER_SKYRIMSE(TSetCompleted, SetCompleted, 24991); SetCompleted(this, force); } void TESQuest::CompleteAllObjectives() { TP_THIS_FUNCTION(TCompleteAllObjectives, void, TESQuest); POINTER_SKYRIMSE(TCompleteAllObjectives, CompleteAll, 23231); CompleteAll(this); } void TESQuest::SetActive(bool toggle) { if (toggle) flags |= 0x800; else flags &= 0xF7FF; } bool TESQuest::IsStageDone(uint16_t stageIndex) { for (Stage* it : stages) { if (it->stageIndex == stageIndex) return it->IsDone(); } return false; } bool TESQuest::Kill() { using TSetStopped = void(TESQuest*, bool); POINTER_SKYRIMSE(TSetStopped, SetStopped, 24987); if (flags & Flags::Enabled) { unkFlags = 0; flags = Flags::Completed; MarkChanged(2); // SetStopped(this, false); return true; } return false; } bool TESQuest::EnsureQuestStarted(bool& success, bool force) { TP_THIS_FUNCTION(TSetRunning, bool, TESQuest, bool*, bool); POINTER_SKYRIMSE(TSetRunning, SetRunning, 25003); return SetRunning(this, &success, force); } bool TESQuest::SetStage(uint16_t newStage) { ScopedQuestOverride _; TP_THIS_FUNCTION(TSetStage, bool, TESQuest, uint16_t); POINTER_SKYRIMSE(TSetStage, SetStage, 25004); return SetStage(this, newStage); } void TESQuest::ScriptSetStage(uint16_t stageIndex) { if (currentStage == stageIndex || IsStageDone(stageIndex)) return; using Quest = TESQuest; PAPYRUS_FUNCTION(void, Quest, SetCurrentStageID, int); s_pSetCurrentStageID(this, stageIndex); } void TESQuest::SetStopped() { flags &= 0xFFFE; MarkChanged(2); } static TiltedPhoques::Initializer s_questInitHooks( []() { // kill quest init in cold blood // TiltedPhoques::Write(25003, 0xC3); });