4.15.0 Preview 1 is out and so is SkookumScript 3.0.3838!

Hi everybody - here is the latest greatest release of our plugin, supporting 4.15.0 Preview 1 and more!

What’s new?

Skookum UE4 Plugin

  • obliterated the old SkookumScriptComponent from existence
  • changed sequence of raw data resolving: static raw data is resolved first, the synamic raw is resolved whenever a new blueprint asset is loaded/created/modified
  • fixed bug where raw data of dynamic classes was uninitialized after re-load of compiled binaries
  • added sanity check to make sure compiled binaries are loaded before atomics are being bound
  • switched on overlay archive file for Engine-Generated and Project-Generated-C++ overlays
  • changed runtime library settings from DLL to static to remove VS2015 DLL dependencies from plugin DLLs
  • fixed bug where a newly added routine would not immediately show up in the Blueprint editor
  • fixed bug where overlay path was not set correctly in the plugin after project skookification
  • IDE executable now detected in new location in plugin folder, loads newer of either plugin IDE and debug IDE
  • fixed bug where SkookumScriptGenerator did not generate a meta file for UStruct
  • SkookumScriptGenerator will now generate leaner, trimmed down Project-Generated-C++ overlay archives
  • plugin is now initialized earlier in the engine initialization sequence, during the PreLoadingScreen phase, to allow binaries to be loaded and blueprint nodes to be exposed before the PreDefault phase in which the game module might load
  • blueprint exposed Sk routines now get exposed twice, once early on right after loading of the binaries but before loading of the game module so that Blueprint graphs referenced by the game module compile properly (during this phase some parameter types might not yet be known, so they are being substituted with one of their parent classes if that’s the case) and a seond time after engine is initialized to re-expose them with their final fully derived types (at this time fully derived types are enforced with asserts)
  • the binding of atomics is now split into two phases: one right after loading of the binaries where built-in and engine bindings are applied, and a second phase after the game module is initialized (or on world pre-init if no game module is present)
  • made exposing of blueprint functions more robust against initialization order
  • moved final Blueprint exposure pass to FSkookumScriptRuntime::on_editor_map_opened()
  • made final Blueprint exposure pass more forgiving - allow recovery upcasting even in final pass (after asserting though)
  • changed loading phase of library-mode uplugin file to PreLoadingScreen as well
  • static class mappings can be amended in editor builds now as well if the UE4 class name is the same as the Sk class name (i.e. when it is a C++ class)
  • fixed compile errors/warnings in UE4Game Development build
  • changed order of includes for plugin files to (1) plugin (2) UE4 (3) AgogCore/SkookumScript to fix preprocessor redefinition warnings
  • fixed bug where registration of static ue classes would not register project specific ue classes if called once before the project module was loaded


  • the branch command has been slightly changed to make it more robust and powerful:
    • branch now takes an expression not a code block any more, so you can say branch _boom without brackets
    • branch can now spawn arbitrarily large expressions
    • under the hood, the new branch uses a closure to capture any local variables the branched expression is using
    • there is a small caveat: The new branch no longer allows rebinding of captured variables as this was a dangerous and misleading feature of the old branch that could lead to crashes. You can still assign to captured variables though!
    • branch now returns an invoked coroutine instance
  • closures now disallow rebinding of captured variables
  • new incremental live update command (requires new SkookumIDE)
  • allow durational receivers for when and unless
  • fixed crash during coroutine update by allowing active invoked expressions to stay around until end of Sk session
  • i.e. during a live update, coroutines that are already running remain unchanged and will pick up the updated changes when they get invoked the next time
  • renamed SkookumRemoteBase.hpp, SkookumRemoteRuntimeBase.hpp, SkookumRuntimeBase.hpp, SkookumScript.hpp to SkRemoteBase.hpp, SkRemoteRuntimeBase.hpp, SkRuntimeBase.hpp, Sk.hpp respectively
  • renamed SkookumRemoteBase, SkookumRemoteRuntimeBase, SkookumRuntimeBase to SkRemoteBase, SkRemoteRuntimeBase, SkRuntimeBase respectively
  • initialization level refactor: Introduced enum eInitializationLevel, SkookumScript now has 5 clearly defined levels of initialization
  • renamed initialization/deinitialization functions to correspond to the respective initialization levels
  • based on the current initialization level, certain operations are allowed/disallowed with SkookumScript
  • replaced Flag_evaluate with Flag_paused to make it clearer that this is now an optional/deprecated flag
  • added extra deinitialization call for symmetry
  • replaced include guards with #pragma once
  • added override keyword to some virtual functions
  • added name lookup fallback when method/coroutine is not found by vtable index (for cases when live update sent over a new routine but vtable indices have not been updated yet)
  • added SkBrain::register_builtin_bindings() to allow built-in bindings to be bound separately from SkBrain::initialize_post_load()
  • used proper crossplatform macro for representing uint64_t’s: UINT64_C
  • added Boolean type to userdata union for debugging pleasure
  • fixed bug in data member index computation during parse
  • fixed issue with data members with closure type
  • ensured that coroutines and coroutine closures return InvokedCoroutine
  • incremented binary id version


  • added A_FORCEINLINE macro
  • changed variable argument constructor into variadic template function with single constructor for all elements
  • created new variants of AFunction and AFunctionArg that can be constructed from a capturing lambda
  • added APArrayLogicalFree
  • added CRC64 checksum calculation functions

Note that we dropped support for UE 4.12 with this update. We currently support 4.13, 4.14 and 4.15 Preview 1.

How to get it?

Get the new plugin from our GitHub repository or as a good old precompiled zip file for Epic Games Launcher users.

Also expect it on the Unreal Marketplace soon!

As usual, don’t hesitate to ask us for help if you encounter any issues!



What does this mean exactly? How would I use it?

This means you can now say _wait(5) when dude.@dead? or _wait(5) unless dude.@dead? in a coroutine which is another way of expressing if dude.@dead? _wait(5) or if not dude.@dead? _wait(5). This is really just a bug fix since that should have been possible to begin with.

1 Like

We use the term durational to refer to some hunk of code that has one or more coroutines and thus may take time (more than one frame) to complete - it has a duration. Sometimes we also say “non-immediate” as a counter to the term below.

Conversely we use the term immediate to refer to some hunk of code that do not take time (within the same frame) - it completes immediately. This usually means only methods, though it can also include code with coroutines inside a branch that turn them into immediate calls and other similar constructs.

1 Like