Skip to content

Commit

Permalink
prelim 1.9.71 address update
Browse files Browse the repository at this point in the history
  • Loading branch information
ianpatt committed Mar 5, 2024
1 parent b7aaeee commit 50b9d90
Show file tree
Hide file tree
Showing 30 changed files with 7,319 additions and 7,313 deletions.
4 changes: 2 additions & 2 deletions cmake/versioning.cmake
Original file line number Diff line number Diff line change
@@ -1,10 +1,10 @@
set(SFSE_VERSION_MAJOR 0)
set(SFSE_VERSION_MINOR 2)
set(SFSE_VERSION_PATCH 3)
set(SFSE_VERSION_PATCH 4)

set(RUNTIME_VERSION_MAJOR 1)
set(RUNTIME_VERSION_MINOR 9)
set(RUNTIME_VERSION_PATCH 67)
set(RUNTIME_VERSION_PATCH 71)
set(RUNTIME_VERSION_TYPE 0)

math(
Expand Down
4 changes: 2 additions & 2 deletions sfse/GameChargen.h
Original file line number Diff line number Diff line change
Expand Up @@ -17,13 +17,13 @@ class ChargenDataModel : public IDataModel, public BSTSingletonSDM<ChargenDataMo

static ChargenDataModel* GetSingleton()
{
RelocPtr<ChargenDataModel*> singleton(0x06581DF8);
RelocPtr<ChargenDataModel*> singleton(0x06581E78);
return *singleton;
}

// Contains main UI data model wrappers, decode these later
// This function will pull data from the TESNPC into this wrapper
DEFINE_MEMBER_FN_1(Update, void, 0x018CB844, TESNPC*); // unk2 removed in 1.9.51
DEFINE_MEMBER_FN_1(Update, void, 0x018CB834, TESNPC*); // unk2 removed in 1.9.51
};
}

Expand Down
2 changes: 1 addition & 1 deletion sfse/GameConsole.cpp
Original file line number Diff line number Diff line change
@@ -1,7 +1,7 @@
#include "sfse/GameConsole.h"
#include <stdarg.h>

RelocPtr <ConsoleLog*> g_console(0x06581990);
RelocPtr <ConsoleLog*> g_console(0x06581A10);

void Console_Print(const char* fmt, ...)
{
Expand Down
2 changes: 1 addition & 1 deletion sfse/GameConsole.h
Original file line number Diff line number Diff line change
Expand Up @@ -6,7 +6,7 @@
class ConsoleLog
{
public:
DEFINE_MEMBER_FN_2(VPrint, void, 0x028D8AD8, const char* fmt, va_list args);
DEFINE_MEMBER_FN_2(VPrint, void, 0x028D8B18, const char* fmt, va_list args);
};

extern RelocPtr <ConsoleLog*> g_console;
Expand Down
2 changes: 1 addition & 1 deletion sfse/GameData.cpp
Original file line number Diff line number Diff line change
@@ -1,3 +1,3 @@
#include "sfse/GameData.h"

RelocPtr<MaterialDatabase> g_materialDatabase(0x06152120 - 0x08);
RelocPtr<MaterialDatabase> g_materialDatabase(0x061521A0 - 0x08);
2 changes: 1 addition & 1 deletion sfse/GameData.h
Original file line number Diff line number Diff line change
Expand Up @@ -132,7 +132,7 @@ class TESDataHandler :

static TESDataHandler* GetSingleton()
{
RelocPtr<TESDataHandler*> singleton(0x0614E178);
RelocPtr<TESDataHandler*> singleton(0x0614E1F8);
return *singleton;
}
};
Expand Down
1,348 changes: 674 additions & 674 deletions sfse/GameEvents.h

Large diffs are not rendered by default.

4 changes: 2 additions & 2 deletions sfse/GameForms.cpp
Original file line number Diff line number Diff line change
@@ -1,4 +1,4 @@
#include "sfse/GameForms.h"

RelocAddr<TESForm::_GetFormByNumericID> TESForm::GetFormByNumericID(0x0150ECC0);
RelocAddr<TESForm::_GetFormByEditorID> TESForm::GetFormByEditorID(0x0150EE1C);
RelocAddr<TESForm::_GetFormByNumericID> TESForm::GetFormByNumericID(0x0150ECD0);
RelocAddr<TESForm::_GetFormByEditorID> TESForm::GetFormByEditorID(0x0150EE2C);
4 changes: 2 additions & 2 deletions sfse/GameObjects.h
Original file line number Diff line number Diff line change
Expand Up @@ -172,8 +172,8 @@ class TESNPC :
u8 pronoun; // 448
u8 pad449[7]; // 449

DEFINE_MEMBER_FN_1(DeriveGeneticParentAppearance, void, 0x01B665E8, TESNPC* source);
DEFINE_MEMBER_FN_1(CopyAppearance, void, 0x01B64A20, TESNPC* source);
DEFINE_MEMBER_FN_1(DeriveGeneticParentAppearance, void, 0x01B66628, TESNPC* source);
DEFINE_MEMBER_FN_1(CopyAppearance, void, 0x01B64A60, TESNPC* source);
};
static_assert(sizeof(TESNPC) == 0x450);
static_assert(sizeof(TESNPC::HeadPartData) == 0x28);
Expand Down
2 changes: 1 addition & 1 deletion sfse/GameRTTI.cpp
Original file line number Diff line number Diff line change
Expand Up @@ -4,7 +4,7 @@

typedef void* (*_Runtime_DynamicCast_Internal)(void* srcObj, u32 arg1, const void* fromType, const void* toType, u32 arg4);

RelocAddr <_Runtime_DynamicCast_Internal> Runtime_DynamicCast_Internal(0x03576950); // __RTDynamicCast
RelocAddr <_Runtime_DynamicCast_Internal> Runtime_DynamicCast_Internal(0x03576990); // __RTDynamicCast

void* Runtime_DynamicCast(void* srcObj, const void* fromType, const void* toType)
{
Expand Down
13,158 changes: 6,579 additions & 6,579 deletions sfse/GameRTTI.inl

Large diffs are not rendered by default.

12 changes: 6 additions & 6 deletions sfse/GameReferences.h
Original file line number Diff line number Diff line change
Expand Up @@ -247,9 +247,9 @@ class TESObjectREFR : public TESForm
u8 unkE2; // E2
u8 flags; // E3

DEFINE_MEMBER_FN_0(IsInSpaceship, bool, 0x02B94804)
DEFINE_MEMBER_FN_0(IsInSpace, bool, 0x01A4C268)
DEFINE_MEMBER_FN_1(HasKeyword, bool, 0x013D22A8, BGSKeyword*);
DEFINE_MEMBER_FN_0(IsInSpaceship, bool, 0x02B94854)
DEFINE_MEMBER_FN_0(IsInSpace, bool, 0x01A4C2A8)
DEFINE_MEMBER_FN_1(HasKeyword, bool, 0x013D22B8, BGSKeyword*);
};
static_assert(offsetof(TESObjectREFR, data) == 0x80);
static_assert(offsetof(TESObjectREFR, parentCell) == 0xC0);
Expand Down Expand Up @@ -379,10 +379,10 @@ class Actor : public TESObjectREFR

// This function is very slow, do not use for realtime updates, mainly used for "entire character changed"
// The fields represent which subsets of chargen to update, usually you want (false, 0x28, false)
DEFINE_MEMBER_FN_3(UpdateAppearance, void, 0x024FD8C8, bool unk1, u32 flags, bool changeRace);
DEFINE_MEMBER_FN_3(UpdateAppearance, void, 0x024FD918, bool unk1, u32 flags, bool changeRace);

DEFINE_MEMBER_FN_0(UpdateChargenAppearance, void, 0x0235FBF4);
DEFINE_MEMBER_FN_1(SetSkinTone, void, 0x0235F85C, u32 skinToneIndex);
DEFINE_MEMBER_FN_0(UpdateChargenAppearance, void, 0x0235FC44);
DEFINE_MEMBER_FN_1(SetSkinTone, void, 0x0235F8AC, u32 skinToneIndex);

u64 unkF0[(0x240 - 0xF0) >> 3]; // F0
void* unk240; // 240
Expand Down
4 changes: 2 additions & 2 deletions sfse/GameScript.cpp
Original file line number Diff line number Diff line change
@@ -1,4 +1,4 @@
#include "GameScript.h"

RelocPtr <Script::SCRIPT_FUNCTION> g_firstScriptCommand(0x06192E90);
RelocPtr <Script::SCRIPT_FUNCTION> g_firstConsoleCommand(0x06186730);
RelocPtr <Script::SCRIPT_FUNCTION> g_firstScriptCommand(0x06192F10);
RelocPtr <Script::SCRIPT_FUNCTION> g_firstConsoleCommand(0x061867B0);
8 changes: 4 additions & 4 deletions sfse/GameSettings.cpp
Original file line number Diff line number Diff line change
@@ -1,9 +1,9 @@
#include "sfse/GameSettings.h"

RelocPtr <INISettingCollection *> SettingT<INISettingCollection>::pCollection(0x0659DB90);
RelocPtr <INIPrefSettingCollection *> SettingT<INIPrefSettingCollection>::pCollection(0x0659DBB0);
RelocPtr <RegSettingCollection *> SettingT<RegSettingCollection>::pCollection(0x0659C7A8);
RelocPtr <GameSettingCollection *> SettingT<GameSettingCollection>::pCollection(0x0657EF90);
RelocPtr <INISettingCollection *> SettingT<INISettingCollection>::pCollection(0x0659DBC8);
RelocPtr <INIPrefSettingCollection *> SettingT<INIPrefSettingCollection>::pCollection(0x0659DBE8);
RelocPtr <RegSettingCollection *> SettingT<RegSettingCollection>::pCollection(0x0659C7E8);
RelocPtr <GameSettingCollection *> SettingT<GameSettingCollection>::pCollection(0x0657F010);

u32 Setting::GetType(void) const
{
Expand Down
2 changes: 1 addition & 1 deletion sfse/GameSettings.h
Original file line number Diff line number Diff line change
Expand Up @@ -118,7 +118,7 @@ class GameSettingCollection : public SettingCollectionMap<Setting>
public:
virtual ~GameSettingCollection();

DEFINE_MEMBER_FN_1(GetSetting, Setting*, 0x015BDC44, const char*);
DEFINE_MEMBER_FN_1(GetSetting, Setting*, 0x015BDC64, const char*);
};
static_assert(sizeof(GameSettingCollection) == 0x158);

Expand Down
12 changes: 6 additions & 6 deletions sfse/GameStreams.h
Original file line number Diff line number Diff line change
Expand Up @@ -126,11 +126,11 @@ class BSResourceNiBinaryStream : public NiBinaryStream
u64 uiStreamPos; // 20
BSResource::ErrorCode eLastError; // 28

DEFINE_MEMBER_FN_1(Construct, void, 0x035254CC, const char* apName);
DEFINE_MEMBER_FN_0(Destroy, void, 0x03525570);
DEFINE_MEMBER_FN_1(Seek_Impl, void, 0x03525D78, s64 iNumBytes);
DEFINE_MEMBER_FN_1(GetBufferInfo_Impl, void, 0x035257D0, BufferInfo& info);
DEFINE_MEMBER_FN_2(DoRead_Impl, u64, 0x03525658, void* apBuffer, u64 auiBytes);
DEFINE_MEMBER_FN_2(DoWrite_Impl, u64, 0x035256BC, const void* apBuffer, u64 auiBytes);
DEFINE_MEMBER_FN_1(Construct, void, 0x0352550C, const char* apName);
DEFINE_MEMBER_FN_0(Destroy, void, 0x035255B0);
DEFINE_MEMBER_FN_1(Seek_Impl, void, 0x03525DB8, s64 iNumBytes);
DEFINE_MEMBER_FN_1(GetBufferInfo_Impl, void, 0x03525810, BufferInfo& info);
DEFINE_MEMBER_FN_2(DoRead_Impl, u64, 0x03525698, void* apBuffer, u64 auiBytes);
DEFINE_MEMBER_FN_2(DoWrite_Impl, u64, 0x035256FC, const void* apBuffer, u64 auiBytes);
};
static_assert(sizeof(BSResourceNiBinaryStream) == 0x30);
6 changes: 3 additions & 3 deletions sfse/GameTypes.cpp
Original file line number Diff line number Diff line change
@@ -1,7 +1,7 @@
#include "sfse/GameTypes.h"

RelocAddr <BSStringPool::Entry::GetEntryT> BSStringPool::Entry::GetEntry(0x031B10D0);
RelocAddr <BSStringPool::Entry::GetEntryWT> BSStringPool::Entry::GetEntryW(0x031B18E0);
RelocAddr <BSStringPool::Entry::GetEntryT> BSStringPool::Entry::GetEntry(0x031B1130);
RelocAddr <BSStringPool::Entry::GetEntryWT> BSStringPool::Entry::GetEntryW(0x031B1940);
RelocAddr <BSStringPool::Entry::ReleaseT> BSStringPool::Entry::Release(0x00833338);

RelocPtr<u32> BSCRC32::uiCRCTable(0x03FC6180);
RelocPtr<u32> BSCRC32::uiCRCTable(0x03FC6190);
4 changes: 2 additions & 2 deletions sfse/GameUI.h
Original file line number Diff line number Diff line change
Expand Up @@ -115,11 +115,11 @@ class UI :
u64 unk400[(0x4F8 - 0x400) >> 3]; // 400

// This properly locks the data structure, use this
DEFINE_MEMBER_FN_2(IsMenuOpen, bool, 0x02ED8304, const BSFixedString&);
DEFINE_MEMBER_FN_2(IsMenuOpen, bool, 0x02ED8364, const BSFixedString&);

static UI* GetSingleton()
{
RelocPtr<UI*> singleton(0x06377F88);
RelocPtr<UI*> singleton(0x06378008);
return *singleton;
}
};
Expand Down
2 changes: 1 addition & 1 deletion sfse/Hooks_Command.cpp
Original file line number Diff line number Diff line change
Expand Up @@ -11,7 +11,7 @@
#include <vector>

using _Command_Process = bool (*)(void* __this);
RelocAddr <_Command_Process> Command_Process(0x031BD5A8);
RelocAddr <_Command_Process> Command_Process(0x031BD608);
_Command_Process Command_Process_Original = nullptr;

namespace TaskInterface
Expand Down
2 changes: 1 addition & 1 deletion sfse/Hooks_Data.cpp
Original file line number Diff line number Diff line change
Expand Up @@ -9,7 +9,7 @@
#include "sfse/GameSettings.h"
#endif

RelocAddr <uintptr_t> GameDataLoad_Target(0x0243CA00 + 0x1098); // End of this function before the retn
RelocAddr <uintptr_t> GameDataLoad_Target(0x0243CA50 + 0x1098); // End of this function before the retn

void Hook_GameData_Loaded()
{
Expand Down
4 changes: 2 additions & 2 deletions sfse/Hooks_Scaleform.cpp
Original file line number Diff line number Diff line change
Expand Up @@ -20,11 +20,11 @@
#endif

typedef bool(*_IMenu_LoadMovie)(IMenu* menu, bool addEventDispatcher, bool unk2);
RelocAddr <_IMenu_LoadMovie> IMenu_LoadMovie(0x02EE12E4); // IMenu vtable +7
RelocAddr <_IMenu_LoadMovie> IMenu_LoadMovie(0x02EE1344); // IMenu vtable +7
_IMenu_LoadMovie IMenu_LoadMovie_Original = nullptr;

using _BSScaleformManager_ctor = BSScaleformManager*(*)(BSScaleformManager* __this);
RelocAddr <_BSScaleformManager_ctor> BSScaleformManager_ctor(0x02EE3980);
RelocAddr <_BSScaleformManager_ctor> BSScaleformManager_ctor(0x02EE39E0);
_BSScaleformManager_ctor BSScaleformManager_ctor_Original = nullptr;

static bool s_enableScaleformLog = false;
Expand Down
2 changes: 1 addition & 1 deletion sfse/Hooks_Script.cpp
Original file line number Diff line number Diff line change
Expand Up @@ -71,7 +71,7 @@ bool GetSFSEVersion_Execute(const SCRIPT_PARAMETER* paramInfo, const char*, TESO
}

typedef bool (*_ConsoleCommandInit)(void* unk1);
RelocAddr <_ConsoleCommandInit> ConsoleCommandInit(0x01B299F0);
RelocAddr <_ConsoleCommandInit> ConsoleCommandInit(0x01B29A30);
_ConsoleCommandInit ConsoleCommandInit_Original = nullptr;

void ConsoleCommandInit_Hook(void* unk1)
Expand Down
2 changes: 1 addition & 1 deletion sfse/Hooks_Version.cpp
Original file line number Diff line number Diff line change
Expand Up @@ -11,7 +11,7 @@ const char * kHook_ShowVersion_FormatString =
"%08x v%s [SFSE " __PREPRO_TOKEN_STR__(SFSE_VERSION_INTEGER) "."
__PREPRO_TOKEN_STR__(SFSE_VERSION_INTEGER_MINOR) "."
__PREPRO_TOKEN_STR__(SFSE_VERSION_INTEGER_BETA) "]";
RelocAddr <uintptr_t> kHook_ShowVersion_Offset(0x020BECA0 + 0x5D);
RelocAddr <uintptr_t> kHook_ShowVersion_Offset(0x020BECF0 + 0x5D);

void Hooks_Version_Apply()
{
Expand Down
14 changes: 7 additions & 7 deletions sfse/PapyrusNativeFunctions.h
Original file line number Diff line number Diff line change
Expand Up @@ -81,7 +81,7 @@ class NativeFunctionBase : public IFunction
u16 unk0A; // 0A

MEMBER_FN_PREFIX(ParameterInfo);
DEFINE_MEMBER_FN(GetParam, u64 *, 0x030DEE2C, u32 idx, BSFixedString * nameOut, u64 * typeOut);
DEFINE_MEMBER_FN(GetParam, u64 *, 0x030DEE8C, u32 idx, BSFixedString * nameOut, u64 * typeOut);
};

virtual BSFixedString * GetName(void) override { return &m_fnName; }
Expand Down Expand Up @@ -134,11 +134,11 @@ class NativeFunctionBase : public IFunction
virtual bool Run(VMValue * baseValue, VMClassRegistry * registry, u32 arg2, VMValue * resultValue, VMState * state) = 0;

MEMBER_FN_PREFIX(NativeFunctionBase);
DEFINE_MEMBER_FN(Impl_Invoke, u32, 0x030DEB04, u64 unk0, u64 unk1, VMClassRegistry * registry, VMState * unk3);
DEFINE_MEMBER_FN(Impl_Invoke, u32, 0x030DEB64, u64 unk0, u64 unk1, VMClassRegistry * registry, VMState * unk3);
// ??_7?$NativeFunction1@VActiveEffect@@XPEAVTESForm@@@BSScript@@6B@ entry 0x10
DEFINE_MEMBER_FN(Impl_Fn10, BSFixedString *, 0x030DEE94);
DEFINE_MEMBER_FN(Impl_GetParamInfo, bool, 0x030DEF30, u32 idx, void * out);
DEFINE_MEMBER_FN(Impl_Fn15, void *, 0x030DEE9C, u64 arg0, u64 arg1);
DEFINE_MEMBER_FN(Impl_Fn10, BSFixedString *, 0x030DEEF4);
DEFINE_MEMBER_FN(Impl_GetParamInfo, bool, 0x030DEF90, u32 idx, void * out);
DEFINE_MEMBER_FN(Impl_Fn15, void *, 0x030DEEFC, u64 arg0, u64 arg1);

protected:
BSFixedString m_fnName; // 10
Expand Down Expand Up @@ -172,8 +172,8 @@ class NativeFunction : public NativeFunctionBase
virtual bool HasCallback(void) override { return m_callback != 0; }

MEMBER_FN_PREFIX(NativeFunction);
DEFINE_MEMBER_FN(Impl_ctor, NativeFunction *, 0x030DE988, const char * fnName, const char * className, u8 unk0, u32 numParams);
DEFINE_MEMBER_FN(Impl_dtor, void, 0x030DEA44); // same as NativeFunctionBase dtor
DEFINE_MEMBER_FN(Impl_ctor, NativeFunction *, 0x030DE9E8, const char * fnName, const char * className, u8 unk0, u32 numParams);
DEFINE_MEMBER_FN(Impl_dtor, void, 0x030DEAA4); // same as NativeFunctionBase dtor

protected:
void * m_callback; // 50
Expand Down
2 changes: 1 addition & 1 deletion sfse/ScaleformManager.h
Original file line number Diff line number Diff line change
Expand Up @@ -13,7 +13,7 @@ class BSScaleformManager

static BSScaleformManager* GetSingleton()
{
RelocPtr<BSScaleformManager*> singleton(0x0657CA20);
RelocPtr<BSScaleformManager*> singleton(0x0657CAA0);
return *singleton;
}
};
2 changes: 1 addition & 1 deletion sfse/ScaleformMemory.cpp
Original file line number Diff line number Diff line change
@@ -1,6 +1,6 @@
#include "sfse/ScaleformMemory.h"

RelocPtr<Scaleform::MemoryHeap*> Scaleform::Memory::pGlobalHeap(0x060ACB98);
RelocPtr<Scaleform::MemoryHeap*> Scaleform::Memory::pGlobalHeap(0x060ACC18);

void* ScaleformHeap_Allocate(u64 size)
{
Expand Down
11 changes: 6 additions & 5 deletions sfse_common/sfse_version.h
Original file line number Diff line number Diff line change
Expand Up @@ -4,10 +4,10 @@
// these have to be macros so they can be used in the .rc
#define SFSE_VERSION_INTEGER 0
#define SFSE_VERSION_INTEGER_MINOR 2
#define SFSE_VERSION_INTEGER_BETA 3
#define SFSE_VERSION_VERSTRING "0, 0, 2, 3"
#define SFSE_VERSION_INTEGER_BETA 4
#define SFSE_VERSION_VERSTRING "0, 0, 2, 4"
#define SFSE_VERSION_PADDEDSTRING "0001"
#define SFSE_VERSION_RELEASEIDX 11
#define SFSE_VERSION_RELEASEIDX 12

#define MAKE_EXE_VERSION_EX(major, minor, build, sub) ((((major) & 0xFF) << 24) | (((minor) & 0xFF) << 16) | (((build) & 0xFFF) << 4) | ((sub) & 0xF))
#define MAKE_EXE_VERSION(major, minor, build) MAKE_EXE_VERSION_EX(major, minor, build, 0)
Expand Down Expand Up @@ -37,13 +37,14 @@
#define RUNTIME_VERSION_1_8_88 MAKE_EXE_VERSION(1, 8, 88) // 0x01080580 (very) small patch
#define RUNTIME_VERSION_1_9_51 MAKE_EXE_VERSION(1, 9, 51) // 0x01090330
#define RUNTIME_VERSION_1_9_67 MAKE_EXE_VERSION(1, 9, 67) // 0x01090430 beta released to main branch
#define RUNTIME_VERSION_1_9_71 MAKE_EXE_VERSION(1, 9, 71) // 0x01090470 hotfix

#define PACKED_SFSE_VERSION MAKE_EXE_VERSION(SFSE_VERSION_INTEGER, SFSE_VERSION_INTEGER_MINOR, SFSE_VERSION_INTEGER_BETA)

// information about the state of the game at the time of release
#define SFSE_TARGETING_BETA_VERSION 0
#define CURRENT_RELEASE_RUNTIME RUNTIME_VERSION_1_9_67
#define CURRENT_RELEASE_SFSE_STR "0.2.3"
#define CURRENT_RELEASE_RUNTIME RUNTIME_VERSION_1_9_71
#define CURRENT_RELEASE_SFSE_STR "0.2.4"

#if GET_EXE_VERSION_SUB(RUNTIME_VERSION) == RUNTIME_TYPE_BETHESDA
#define SAVE_FOLDER_NAME "Starfield"
Expand Down
2 changes: 2 additions & 0 deletions sfse_loader/IdentifyEXE.cpp
Original file line number Diff line number Diff line change
Expand Up @@ -290,6 +290,8 @@ bool IdentifyEXE(const char * procName, bool isEditor, std::string * dllSuffix,
_MESSAGE("version = %016I64X", version);
_MESSAGE("product name = %s", productName.c_str());

hookInfo->version = version;

if(productName == "SFSE")
{
_MESSAGE("found an SFSE component");
Expand Down
6 changes: 3 additions & 3 deletions sfse_readme.txt
Original file line number Diff line number Diff line change
@@ -1,11 +1,11 @@
Starfield Script Extender v0.2.3 pre-alpha
Starfield Script Extender v0.2.4 pre-alpha
by Ian Patterson, Stephen Abel, and Expired

The Starfield Script Extender, or SFSE for short, is a modder's resource that expands the scripting capabilities of Starfield. As the game has literally just released, it's mostly a plugin loader for now. Depending on where modders show interest, this will expand to Scaleform and Papyrus (or other things) over time.
The Starfield Script Extender, or SFSE for short, is a modder's resource that expands the scripting capabilities of Starfield. As the editor is not out, it's mostly a plugin loader for now. Depending on where modders show interest, this will expand to Scaleform and Papyrus (or other things) over time.

[ Compatibility ]

SFSE will support the latest version of Starfield available on Steam, currently 1.9.67. The Gamepass/MS Store version is unsupported. Do not email asking for support.
SFSE will support the latest version of Starfield available on Steam, currently 1.9.71. The Gamepass/MS Store version is unsupported. Do not email asking for support.

[ Installation ]

Expand Down
3 changes: 3 additions & 0 deletions sfse_whatsnew.txt
Original file line number Diff line number Diff line change
@@ -1,3 +1,6 @@
0.2.4
- support for 1.9.71

0.2.3
- support for 1.9.67

Expand Down

0 comments on commit 50b9d90

Please sign in to comment.