File information
Last updated
Original upload
Created by
OBSE TeamUploaded by
lldeVirus scan
Safe to use
Tags for this mod
Current section
About this mod
The Oblivion Script Extender, or OBSE for short, is a modder's resource that expands the scripting capabilities of Oblivion. It does so without modifying the executable files on disk, so there are no permanent side effects.
- Requirements
-
This mod does not have any known dependencies other than the base game.
Mods requiring this file
- Permissions and credits
-
Author's instructions
http://obse.silverlock.org
https://github.com/llde/xOBSEFile credits
OBSE was created and maintained by Ian Patterson, Stephen Abel, Paul Connelly, and Madeesh Kannan (ianpatt, behippo, scruggsywuggsy the ferret, and shadeMe)
Additional contributions from Timeslip, The J, DragoonWraith, SkyRanger-1, badhair, JRoush and kyoma.
xOBSE is maintained by llde and ShadeMe.Donation Points system
Please log in to find out whether this mod is receiving Donation Points
- Mirrors
-
Name OBSE Website xOBSE GitHub - Changelogs
-
-
Version 22.11
- Fix/Changes:
- - Use correct length for stringVar serialization and ToString($) operator for multibyte strings
- - Compiler: Climate forms are now an allowed type for StandardCompiler
- - ExtractArgEx now support extracting TESClimate forms in commands. Commands using kFormType_Climate should only use ExtractArgsEx (or the expression evaluator with OBSE compiler)
- - GetClimate*, SetClimate*, SetCurrentClimate now use kFormType_Climate arguments instead of kFormType_WeatherID
- Docs:
- - Moved links to cs.uesp.net
- - Additions
-
Version 22.10
- Additions:
- - Compiler: add error when using invalid filter strings identifier (the first element of a zz::yy pair) in SetEventHandler and related functions
- - Improved Diagnostic for script errors
- - Task2 Interface for plugins to better handle Removable Tasks
- - Add GameInitialized Message (for OBSE plugins interop)
- - Added Compatibility for OBCN, similar of what was done for OBJA in 22.8 (EXPERIMENTAL)
- - Added a workaround for OBCN/OBJA to simulate know OBJA crash workaround (initialization codepath trying to access a D3DSwapchain memebers directly)
- Fix :
- - Compiler: fix SetEventHandler/RemoveEventHandler/EventHandlerExist filters when the identifier was used unquoted and defined as a variable name
- - Changes to Steam version handling, solving some of the instances of Application load error
- - Allow sorting arrays of arrays when using ar_CustomSort
- - Fix for Ref Walking documentation
- - More precise handling of replace/count/find matching part of a multibyte character (stringVar are now internally wide string, proper handling require the proper locale and codepage setted in the system)
- - Fix RemoveEventHandler for OnKeyEvent/OnControlEvent to remove all events with partial filter definition
- - Avoid rare null pointer access in ShowRuntimeError (thanks @Fox2Code)
- - Fix Menu{Tap/Hold/Release}Key commands not properly registering the button event for the UI.
- - Fix xOBSE 22.7 regression for Useful House, now unmodified IR won't reset the stack extraDataList, possible if it was modified by another IR or directly by the engine.
- - Fix CTD when GetNextRef is called in a script after returning a null reference, without a GetFirstRef call to reinitialize the scan.
- Changes:
- - Force C++20 Standard, modified some places for compliance
- API:
- - Add PatchCallsInRange
- Loader:
- - Added CS Editor checksum for visual style + DPI awareness executable
-
Version 22.9
- Commit new ExtraData to container only if ExtraCount isn't the only data present. Fix duplicated items in inventory using MOO companions
- Flush IR, when another IR is created on the same container (workaround to common instabilities as for Break Armors and Take or Equip, precursor to script based lifetime IRs ) and it's executing a DeferredAction
- Invalidate IR after SetEquip Deferred actions
- Revert GetEditorID changes for REID as Realtime Interactions depended strictly on the old beahviours. Deprecate it and add GetEditorID2 as the contract was funcky and there are better functions to operate on formIDs
- Copy ExtraDataList of the IR in case of SetEquip Actions (non deferred)
- Fix a couple of Memory leaks related to ExtraWorn data and IRs
- Fix documentation for Alchemy Types
-
Version 22.8
- Fix:
- - Fixed an issue for using RemoveItem in a Container Loop, fixing a crash with Maskar Oblivion Overhaul
- - Properly process base container item in container loops
- - Fix modifying extra data with InventoryReference when original item had no extra data (fix some instances of SetCurrentSoulLevel for instance)
- - Allow OnEventKey and OnEventControl unfiltered if no first or sencond filter are specified
- - Fix OnControl Release event never triggered for mouse controls.
- - Allow using Player in OBSE expressions as PlayerRef (mimicking vanilla compiler/evaluator)
- Changes:
- - Added compatibility with OBJA v16 (Oblivion Japanese Patch OBSE plugin version) for the Input System
- - Improve some error messages for Scripts failures in the ExpressionEvaluator, prevent some spam
- - Try to print better info about form and reference tokens (some info with RuntimeEditorID only)
- API:
- - Merge BaseExtraList with ExtraDataList
- - Added InventoryReference::InvalidateByItemAndContainer
-
Version 22.7
- Fix:
- - Moving an inventory reference to another container with RemoveMeIR copy the extradata from the temp ref.
- - Control events weren't fired properly when triggered by mouse with controls having a keyboard binding
- - Write All IR extradata to the parent container extradata
- Additions:
- - Introduce handling of swapped mouse buttons configuration
- Changes:
- - Change the loader to use the Windows and not the Console subsystems. Should fix issues with Steam Deck.
- - Add 0XBF654A48 CRC for another polish executable version
- - Bypass stricter check in the steam loader, for confusion about Steam version being applied the japanese patch (CRC marked as GOG version))
-
Version 22.6.1
- Fix: GetProjectile Regressions
- Fix: Loader crash when checking for hotfix releases
-
Version 22.6
- General: Add CRC for DRM Removed Polish Version from Cenega (GOTY Deluxe/Anthology)
- General: Launcher will give a message if a new version is available (if you are connected to internet, only executable launcher)
- Fix: Use After Free when RemoveMeIR was used with the destination container equals as the origin. Trade And Commerce Update rely on this working.
- Fix: functionality of OBSEIOInterface, fix Blockhead WASD in character creation
- Fix: xOBSE version on initializing.
- Fix: tList issue where removing last item of the iteration was causing the loop to not terminate.
- Fix: potential crash where map markers with no name would cause a CTD on save load.
- Fix: multiple command issue with multibyte string. (Japanese encoding affected)
- Fix: DeleteReference can now delete disabled clone actors
- Added: Wheel events for OnKeyEvent event handler
- Added: SetMouseSpeedX and SetMouseSpeedY (some mods use them)
- Added: SetCameraFOV2 (unbounded version of SetFOV, con_SetCameraFOV)
- Added: IsMajorRef,IsDiseased added as script and condition function.
- Added: GetFirstRef / GetFirstRefInCell added parameter to include deleted reference.
- Added: Type 90 now match only the deleted reference.
- Added: SetInvertFastTravel, IsInvertFastTravel, SetCantWait,IsCantWait, SetOwningRequiredRank, SetParentCellOwningFactionRequiredRank, GetLoadedTypeArray
- Added: HasSpell, IsMajor, GetActorLightAmount added as conditional functions
- Added: GetDisease vanilla unimplemented function replaced with IsDiseased
- PluginAPI: Added Replace to OBSECommandTableInterface
- PluginAPI: Bumped PluginInfo to 3
-
Version 22.5
- Fix: OnEventKey and OnEventControl events
- Fix: SetHarvested 0 not being saved in the savegame
- Fix: CopyIR function breaking Wax Key perk from Real Time Lockpicking
- Fix: IR SetEquipped not working.
- Fix: Containers Loop execute the associated IR delayed actions (regression from 22.0). These last two entries fix Mig Pickpocketing mod and Break Armor.
- Fix: Full interop with CSE for warnings.
- Added: IsMiscItem Command
- API: Full C++latest conformance.
- API: Separate ExpressionEvaluator from ScriptUtils
- API: Standardize PASS_COMMAND_ARGS , use macro instead of hardcoding arguments for ExtractArgs, ExtractArgsEx sometimes
- Docs: Multiple docs fixed by @laulajatar
-
Version 22.4.1
- Fix: IsCOntrolDisabled and IsKeyDisabled causing an issue with Bashing Reworked
-
Version 22.4
- General: Added the CRC for the Unofficial Japanese Patch v15 on the top of the GOG version
- Fix: ExpressionEvaluator regression that caused crash in Vampire Revolution. Also now it report the precise Command at fault.
- Fix: Loops temporary arrays are now setted with the mod id instead of 0xFF, avoiding leaking if the script crash inside the loop.
- Fix: OnControlDown, now register correctly the control id and not the key id
- Fix: PreLoad hook now properly get the address of the IOManager to pass to game code, This fix the missing black out fade on cell transition that was present in Oblivion vanilla
- Fix: Restore bugged behaviour for SetAltControl required by Enhanced Economy.
- Fix: SetAltControl , GetAltControl and RefreshControlMap marked as deprecated
- Fix: Added SetAltControl2 with the fixed behaviour to substitute SetAltControl
- Fix: Compiling a script using commands marked as deprecated give a warning in CS (and an hard error in CSE pre 11 (unreleased))
- Added: Some additions to BaseProcess, MobileObject and Actor vtbls.
- Docs: Added Actor->dispositionModifier
- Docs: Some fixes by Laulajatar
-
Version 22.3.1
- Fix: regression on OnActorEquip for some non equippable objects. Fix Maskar Oblivion Overhaul.
-
Version 22.3
- General: Updated version resources for file PE version.
- Fix: regression on On{Key,Control}Down functions for scripts that weren't running every frame (BetterSaves and MigMiscellanea quicksave were broken in 22.2)
- Added: experimental support for OnKeyEvent and OnControlEvent for Event Manager
- Docs: OnKeyEvent and OnControlEvent
-
Version 22.2
- - Better message for failed plugins in case of missing or mismatched dependancies
- - Rewrote from scratch the input handling system of OBSE switching from the old and kludgy DInput hook to a proper OSInputGlobal hook. This should overall simplify the code, be faster and more robust, and more easily to interact with OBSE plugins in the future.
- - The above change also fix these instances were input handling routines weren't working on some system if bBackground Keyboard = 0 (Oblivion.ini)
- - Backport 3 fixes for Menu functions ignoring keyboard selection tiles, from NorthenerUI + 1 fix not covered by NUI
- - Add some Error message in the ExpressionEvaluator for Array
- - Fixed an issue were using subscript operator ([]) on a string map non existant element would succeed (and provide invalid data, testexpr would return true), now it complain with an error (and testexpr fail)
- - Added an obse.ini option to avoid suppressing testexpr error messages.
- - Fixed an issue with array loading were mod index 0 were mistakenly seen as arrays beloging to discarded mods
- - Fix some error reporting issues were failing command weren't shown
- - Fix bad dereferencing CommandList.end() iterator element, in exception handler.
- - Fix OnActorEquip event being sent twice when using enchantend armours or clothing
- - Improved Script diagnostics for Expression Evaluator for Commands.
- - Documented a lot of the struct fields for OSInputGlobals, and documented at least some of it's member functions
- - Removed code for older version of Oblivion then the last version (1_2_416)
- - GetFame() is now correctly placed into Actor vtbl instead of MobileObject
- - CompareTo is now correctly in BaseFormComponent vtbl instead of being repeated in TESForm, TESModel and TesAttackDamage.
- - Decoded some virtual functions and members on game structures, thanks to COEF and OR
- - OBSEInputInterface to allow plugins to interact with the new Input System
- - OBSEEventInterface allow plugins to install event handlers and dispatch UDF
-
Version 22.1
- - Fix a serious regression in xOBSE 22.0 where using the hotkeys functions could cause crashes (thanks @Laulajatar for report). Enhanced Hotkeys users were affected by this.
- - Fix a serious regression in GetInvRefsForItem where it didn't correctly handle anymore objects with no ExtendData (for example some objects stack that should have only xCount property have the extendData compeltly null after reload), causing the game to crash. Enhanced Hotkeys users that were using a binded hotkey to equip bow and arrows were affected.
- - Made changes to improve robustness of overall ExtendData and ExtraData usages.
- - Using .0 minor revision was causing a mod with a bad obse check to fail. Using always revisions >= 1 solve this issue and should solve issues with similarly bugged mods.
- - Fix an issue with GetBaseAV3 that was causing crashes
-
Version 22.0
- - Added an AppVeyor CI. Build will be pushed from AppVeyor instead of using a local build.
- - This should also fix the slow start some people are experiencing, while keeping the CRT statically linked
- - GetByOpcode was using a linear search (O(n)) for know opcode, reimplement to constant time (O(1))
- - Add a check for parentCell in GetParentCellOwner command. Should fix a CTD when the parentCell is NULL
- - Rewrote InventoryReference and ContainerForLoop code. Should fix some memory leaks and items that weren't removed properly from the containers. Also fix a crash when iteratating the inventory in menumode while having a soultrap event handled
- -Fix an issue with GetActiveMenuElement where it wasn't working on keyboard selected elements
- - Decode more arguments for RemoveItem
- - Add 10 arguments ThisStdCall
- - ExtraContainerChanges use tList for objList field, instead of rolling specialized version of a linked list everytime
- - General fixes to tList and its Iterator class
- - Add Tile::GetContainingMenu member function, thanks @DavidJCobb
- - Some bits of PlayerCharacter from @EchoEclipse
- - Add a TasksInterface, to enqueue functions to operate on the OBSE mainloop.
-
Version 21.8
- - Code MSVC 2019 complaint, remove hash_map and remove va_start reference usage
- - Example plugin error message print the OBSE version as decimal instead of hex
- - Added the possibility to use the obse_launcher.exe to launch the steam version of Oblivion (EXPERIMENTAL, works under Proton)
- - Added the Polish Antology version by Cenega
- - Restructured INI handling in a centralized store.
- -Fixed a CTD on the OnSoulTrap handler, when using soulgems with stolen flag and other extra-data
- -Fix GetCurrentEventName returning an empty string (and other issues)
- -Fix IsReference returning always 1 in OBSE expressions
- - Add GetBaseAV3/GetBaseAV3C as correct replacments of GetBaseAV2(C) functions.
- - GetBaseAV2(C) functions are deprecated
- - IsNaked function added
- - Added more TESForm flags and decoded TESObjectCELL InvertFastTravelBeheaviour flag
- - Add shadeMe definition of Unnk1B20 structure.
- - Decoded more stuffs for TESRegion and RegionList
- - Improve GetFormFromMod
- - Add SetPlayerSkeletonPath
-
Version 21.5
- -Compiled with vs2019.
- -Fixed example plugin compilation
- -Fixed a critical bug in the Event Handler System that could cause CTD when too much handlers are used.
- -Fixed GetDistance definitions
- -Fixed HasSpell to work correctly on creature actors. Also slight optimization of the function.
- -Fixed GetSelectedSpells CTD
- -Fixed Actor Override Breath System
- -GetCombatSpell don't return every spell duplicated 4 times anymore
- -Fixed tList SetAt function that could cause issue if the allocator can return less then 8 bytes
- -Added EventHandlerExist function.
- -Added console print for GetOBSEVersion/Revision and for Plugins detection functions
- -Added the GOG version and another Polish version to the launcher
-
Version 0021 beta 4
- GetAVSkillMasteryLevel/C uses base actor value for the skill
Fixed ToggleCreatureModel to not CTD when enabling models
Fixed GetStageIDs to work with stage-less quests. And to work in general
Fixed GetStageEntries to correctly populate its result array
Fixed RemoveEventHandler to correctly handle filtered OnHealthDamage event handlers
Fixed GetLuckModifiedSkill to allow negative values, call game code to calculate the capped value (to improve compatibility with plugins that modify the formula)
GetFactions
GetLowActors
Get/SetLevCreatureTemplate, SetCalcAllLevels
OnWaterSurface/Dive, Get/SetActorSwimBreath, Get/SetActorMaxSwimBreath, OverrideActorSwimBreath
Fixed MagicEffectUsesOtherActorValue-GetMagicEffectOtherActorValue/C mix-up
Allowed SetMagicEffectResistValue/C to remove resist AVs
Fixed AV type code for No Actor Value
SetFlyCameraSpeedMult
- GetAVSkillMasteryLevel/C uses base actor value for the skill
-
Version 0021 beta 3
- Fixed compatibility with the CustomSpellIcons OBSE plugin.
- Fixed issue with the script precompiler that caused it erroneously display errors when a script ended with a commented line.
- Fixed issue with the equality operator that prevented the correct evaluation of numeric-form comparisons.
- Fixed SetSoulLevel/SetSoulGemCapacity; they apparently never worked hitherto.
- Fixed GetActorValueC to correctly return negative actor values.
- OnQuestComplete, OnMagicCast, OnMagicApply
- Get/SetSkillSpecializationC, GetRequiredSkillExpC, GetAVSkillMasteryLevel/C
- GetLuckModifiedSkill accepts an optional arg to return the uncapped result.
- Missing plugin handler warnings display the name of the delinquent plugin.
- Added attacker filter for OnHealthDamage.
- Added GetActiveMenuRef support for the enchantment recharge menu.
- PluginAPI additions: GetPluginLoaded, GetPluginVersion, PeekNextRecordInfo
-
Version 0021 beta 2
- Added a minidump to help with post-mortem debugging
- Fixed issue with RunScriptLine that caused rare CTDs during game initialization
- Fixed issue with the serialization code that caused CTDs when a game session's initial loadgame operation failed
- Fixed issue with RemoveScript that caused a CTD when called on a non-scriptable object
- Fixed issue with ExpressionParser that prevented magic effect script references from being resolved correctly when using the compiler override
- Patched vanilla bug that casued a CTD when an effect-less spell was added to the player using the AddSpell command
- Patched vanilla bug that prevented NPCs from activating containers that had onActivate blocks in their scripts
- Patched vanilla bug that permanently prevented the normal activation of unscripted objects when the Activate command was used on them
- Annealed runtime error notification messages for script errors
- GetGroundSurfaceMaterial
-
Version 0021 beta 1
- SetCombatStylePowerAttackFatigueModMult
- HasTail, GatTailModelPath
- GetLuckModifiedSkill
- sv_ToUpper, sv_ToLower
- SetCellMusicType
- Get/SetSoundAttenuation
- GetStageIDs, GetStageEntries
- Set/UnsetStageText
- SetStageDate
- UpdateContainerMenu, UpdateSpellPurchaseMenu
- LinkToDoor
- CopyRace
- SetCreatureType
- DispatchEvent
- Support for user-defined events
- ToggleSkillPerk supports Journeyman and Master Mercantile perks
- OnSoulTrap, OnSaveIni, OnMagicEffectHit2 events
- Pass string variables to vanilla commands using '$quest.stringVar' syntax
- MessageEX takes an optional duration, effective only if MenuQue plugin is running
- ModPCMovementSpeed and ModPlayerSpellEffectiveness accept an optional parameter indicating if their effects should persist in the savegame
- Fix recursive calls to *_NS commands not blocking message spam
- Combat style commands allocate memory for "advanced" settings if not already present
- Made annoying editor warning about unquoted strings/function pointers toggle-able through INI file (in the DataOBSE folder)
- Plugin API allows authors to optionally avoid dependencies on GameAPI/Utilities header files
- Patch vanilla bug in which RemoveAllItems and GotoJail commands cause equipped quest item enchantments to become permanent
- New loader injection method for the editor
- Fix issue with PluginManager that caused a CTD when a plugin registered a listener inside a dispatch callback
- Updated project to Visual Studio 2010
-
Version 0021 Final
- Fixed swimming event registrations
- Fixed format string evaluation inside compiler overridden blocks
- Fixed the %n format specifier to correctly handle deleted references
- Fixed Get/SetLevCreatureTemplate and SetCalcAllLevels command definitions
- PluginAPI addition: IsUserFunction
- Reverted the No Actor Value AV type code to its original value to preserve backward compatibility
- Added a command alias for SetFlyCameraSpeedMult (SFCSM)
- Fixed OnHealthDamage event handler filtering (for real)
- ...
-
Version 0020
- ToggleSkillPerk
- Fix compiler override using localized actor value strings
- Fix IsNthEffectItemScriptHostile returning inconsistent values
- Prevent equipping an item from generating multiple OnActorEquip events
- Prevent power-attacking generating multiple OnAttack events
- Fix GetActiveSpell returning zero if the player has not switched from the default starting spell
- Add compiler override support for script bytecode lengths exceeding 0x4000 bytes when using the CSE OBSE plugin
- Minor documentation fixes
-
The Oblivion Script Extender, or OBSE for short, is a modder's resource that expands the scripting capabilities of Oblivion. It does so without modifying the executable files on disk, so there are no permanent side effects.
Once installed, no additional steps are needed to launch Oblivion with OBSE's added functionality. You can start the game using OBSE from obse_loader.exe
Join the xOBSE Discord here!
The instructions for installing and running OBSE differ based on whether you are using a retail or Steam version of the game.
Install with Vortex
Manual Installation for the Retail (Non-Steam) version of Oblivion
Manual Installation for the Steam version of Oblivion
Manual Installation for the Steam Proton on Linux
(replace Point 2. from the previous paragraph):
Installation for Mod Organizer 2
Mod organizer users need to use special instructions to allow OBSE to function properly. Follow the instruction on this page: https://github.com/ModOrganizer2/modorganizer/wiki/Running-Oblivion-OBSE-with-MO2
Running TES: Construction Set with OBSE
Scripts written with these new commands must be written via the TESConstructionSet launched with obse_loader. Open a command prompt window, navigate to your oblivion install folder, and type "obse_loader -editor". The normal editor can open plugins with these extended scripts fine, it just can't recompile them and will give errors if you try.
WARNING: It's unadvised to install Oblivion to Program Files
Having problems? Check the Frequently Asked Questions.
The source code is available here (GitHub)!
Releases are also available on GitHub; they're the same files as what's available here.
Once installed, no additional steps are needed to launch Oblivion with OBSE's added functionality. You can start the game using OBSE from obse_loader.exe
Join the xOBSE Discord here!
The instructions for installing and running OBSE differ based on whether you are using a retail or Steam version of the game.
Install with Vortex
- Click the "Vortex" button in the top-right of this page.
- Once installed and enabled, ensure you have deployed it by clicking "Deploy Mods" on the Mods toolbar.
- Use the shortcut on the dashboard to start the game with OBSE.
Manual Installation for the Retail (Non-Steam) version of Oblivion
- Copy obse_1_2_416.dll, obse_editor_1_2.dll, obse_loader.exe and the Data folder to your Oblivion directory. This is usually in your Program Files folder, and should contain files called "Oblivion.exe" and "OblivionLauncher.exe".
- Run oblivion by running obse_loader.exe from the Oblivion directory.
Manual Installation for the Steam version of Oblivion
- Copy obse_1_2_416.dll, obse_editor_1_2.dll, obse_steam_loader.dll and the Data folder to your Oblivion directory. This is usually "C:\Program Files\Valve\Steam\SteamApps\common\oblivion".
- Launch Oblivion via Steam or by running Oblivion.exe. OBSE will automatically be run along with Oblivion when launched. To disable this, rename or move obse_steam_loader.dll. You do not need to use obse_loader.exe unless you are running the editor.
Manual Installation for the Steam Proton on Linux
(replace Point 2. from the previous paragraph):
- Backup OblivionLauncher.exe and rename obse_loader.exe to OblivionLauncher.exe
- Start the game from inside Steam Note this is needed only when using a Linux Steam and Proton. Using Windows Steam inside Wine should work out of the box,
Installation for Mod Organizer 2
Mod organizer users need to use special instructions to allow OBSE to function properly. Follow the instruction on this page: https://github.com/ModOrganizer2/modorganizer/wiki/Running-Oblivion-OBSE-with-MO2
Running TES: Construction Set with OBSE
Scripts written with these new commands must be written via the TESConstructionSet launched with obse_loader. Open a command prompt window, navigate to your oblivion install folder, and type "obse_loader -editor". The normal editor can open plugins with these extended scripts fine, it just can't recompile them and will give errors if you try.
WARNING: It's unadvised to install Oblivion to Program Files
Having problems? Check the Frequently Asked Questions.
The source code is available here (GitHub)!
Releases are also available on GitHub; they're the same files as what's available here.