Redscript
HomeGitHubDiscord
  • Home
  • Getting Started
    • Downloads
    • Setup for VSCode
    • Setup for JetBrains IDEs
    • How to start REDscripting
      • Step 1: Mod structure
      • Step 2: Finding the right class
  • Language
    • Intro
      • REDscript in 2 minutes
      • How to create a hook
        • Things to hook
    • Language Features
      • Intrinsics
      • Loops
      • Strings
      • Modules
      • Annotations
      • Conditional compilation
      • Configurable user hints
    • Built-in Types
    • Built-in Functions
      • Math
      • Random
      • Utilities
  • References and examples
    • Common Patterns
      • Safe downcasting
      • Class constructors
      • Hash maps
      • Heterogeneous array literals
      • Scriptable systems (singletons)
      • DelaySystem and DelayCallback
      • Generic callbacks
      • Persistence
    • Logging
    • UI Scripting
      • Logging Widget Trees
      • Popups
    • Vehicle system
    • Weapons
    • Codeware callbacks
      • Scriptables comparison
    • Libraries
    • Gameplay
      • Sleeping and Skipping Time
  • Help
    • Community
    • Troubleshooting
Powered by GitBook
On this page
  1. References and examples

Codeware callbacks

How we can use events for control flow

PreviousWeaponsNextScriptables comparison

Last updated 1 year ago

Was this helpful?

CtrlK
  • Example
  • OnLoad
  • OnKeyInput
  • Unregistering callbacks

Was this helpful?

Unlike How to create a hook, a callback can be be registered through Codeware callback system.

This method depends on Codeware. You can't use it alone.

Example

class ExampleService extends ScriptableService {
  // instance variables
  private let callbackSystem: wref<CallbackSystem>;
  private let found: Bool = false;
  
  // This function is always executed
  private func OnLoad() {
    this.callbackSystem = GameInstance.GetCallbackSystem();
    this.callbackSystem.RegisterCallback(n"Input/Key", this, n"OnKeyInput", true);
    
    LogChannel(n"DEBUG", s"ExampleService loaded");
  } 
  
  // Will always listen, but only react once
  private cb func OnKeyInput(event: ref<KeyInputEvent>) {
    if this.found {
      return;
    }    
    LogChannel(n"DEBUG", s"You pressed your key, going dormant now: \(event.GetAction()) \(event.GetKey())");
    this.found = true;
  }

}

Let's go over it bit by bit:

OnLoad

This function is always executed, because our ExampleService inherits from ScriptableService.

  • It sets the instance variable callbackSystem, making sure that we don't have to get it each time we want to use it.

  • It binds to the Input/Key callback, telling Codeware to run the function OnKeyInput each time

  • It prints to log

OnKeyInput

You can see that this function is a callback from the cb func rather than just func

This function will be executed every time the registered event (Input/Key) is triggered.

Since we are checking our internal variable found before running any logic, this will only become active once.

Unregistering callbacks

Once you're done with your logic, you can unregister your callback again.

As of v0.5.19 (Mar 31 2024), unregistering Input/Key will crash the game (link to github issue). Unregistering other kinds of callback works, though.

private cb func OnKeyInput(event: ref<KeyInputEvent>) {
  LogChannel(n"DEBUG", s"Input: \(event.GetAction()) \(event.GetKey())");
  this.callbackSystem.UnregisterCallback(n"Input/Key", this, n"OnKeyInput");
}