Player guide

Install TaystJK

TaystJK replaces the multiplayer executable, not the retail game data. Keep the four Jedi Academy asset archives and place TaystJK beside—or deliberately separate from—them.

Before you start

You need a legal Jedi Academy installation and these files from its GameData/base directory:

assets0.pk3
assets1.pk3
assets2.pk3
assets3.pk3

Download the build for your operating system from the latest TaystJK release. Extract the whole archive; do not copy only the executable, because the renderer and game libraries beside it are also required.

Install for your platform

Choose your operating system to see its prerequisites and installation steps. Your selection is saved on this device.

Operating system

Windows

Install prerequisites

Install the latest supported Microsoft Visual C++ Redistributable:

  • Install the x64 package for TaystJK-windows-x86_64.
  • Install the x86 package for TaystJK-windows-x86.

The release archive includes the matching SDL 2 and OpenAL DLLs. Keep those files beside the TaystJK executable; do not download replacement DLLs from third-party DLL sites.

Prefer the 64-bit build for normal play, especially when using rend2. Rend2 can use enough memory to exhaust a 32-bit process’s limited address space on demanding maps or asset sets; the 64-bit build has substantially more headroom.

The 32-bit Windows build has one compatibility advantage: its bundled OpenAL Soft library and EaxMan.dll can provide EAX environmental audio in software, so EAX-capable sound hardware is not required. TaystJK does not currently ship the EaxMan64.dll needed by its 64-bit EAX path, so this feature is available only in the 32-bit build. Choose x86 if you specifically want EAX or require another 32-bit compatibility feature, and keep OpenAL32.dll and EaxMan.dll beside the executable.

Install TaystJK

This is the simplest layout when TaystJK is your only modded client.

  1. In Steam, right-click STAR WARS Jedi Knight: Jedi Academy, then choose Manage → Browse local files. Open GameData.
  2. Extract the TaystJK Windows archive into GameData.
  3. Start the executable included for your architecture, normally taystjk.x86_64.exe on 64-bit Windows.
  4. Optionally create a desktop shortcut to that executable.

For a non-Steam copy, locate the directory containing base, jamp.exe, and jasp.exe; that is the GameData directory.

Linux

Install prerequisites

The Linux client uses system-provided SDL 2, OpenGL, JPEG, PNG, zlib, and C++ runtime libraries. For the 64-bit release on Ubuntu 22.04, install them with:

sudo apt update
sudo apt install libsdl2-2.0-0 libgl1 libjpeg-turbo8 libpng16-16 zlib1g libstdc++6

Ubuntu 24.04 names the PNG package libpng16-16t64. Other distributions provide the same libraries under their own package names; for example:

# Fedora
sudo dnf install SDL2 libglvnd-glx libjpeg-turbo libpng zlib libstdc++

# Arch Linux
sudo pacman -S sdl2 libglvnd libjpeg-turbo libpng zlib

The 32-bit TaystJK build needs 32-bit versions of the same libraries. Prefer the x86_64 release unless you specifically need 32-bit compatibility. TaystJK’s Linux release job records the libraries against which the official archive is built.

If the loader still reports a missing library, run:

ldd ./taystjk.x86_64 | grep "not found"

Install the missing library from your distribution’s package manager rather than copying a loose .so file beside the executable.

Install TaystJK

This is the simplest layout when TaystJK is your only modded client.

  1. Create a clean directory such as ~/.local/share/TaystJK and extract the Linux archive there.
  2. Create ~/.local/share/TaystJK/base and copy assets0.pk3 through assets3.pk3 into it.
  3. Make the client executable if necessary: chmod +x taystjk.x86_64.
  4. Launch ./taystjk.x86_64.

If the retail files are only available through Steam, SteamCMD can download app 6020 after setting @sSteamCmdForcePlatformType windows; only the platform-neutral PK3 assets are needed from that download.

macOS

Install prerequisites

Current TaystJK releases bundle SDL 2 inside the app, along with the non-system image and compression libraries. No Homebrew package is required for the current prebuilt app. If an older archive reports a missing SDL library, replace it with the current release; brew install sdl2 is only relevant to an older system-linked build or a source build configured with UseInternalSDL2=OFF.

Install TaystJK

This is the simplest layout when TaystJK is your only modded client.

  1. Extract the TaystJK archive and copy its .app bundle to a directory you control.
  2. Put the retail base directory beside the app, or point the app at an existing Jedi Academy installation with fs_cdPath as described below.
  3. Launch the app. User data is stored under ~/Library/Application Support/TaystJK/.

The release workflow ad-hoc signs the universal app before packaging, so a normal installation does not need another codesign command. If macOS quarantines the downloaded app and refuses to open it, clear that attribute from the extracted bundle:

xattr -dr com.apple.quarantine "/path/to/taystjk.app"

Run this without sudo when the app is in a directory you own. Use sudo only if xattr reports a permissions error and you have confirmed the path is the intended TaystJK bundle. Quarantine alone is not a reason to re-sign the app. You can verify the packaged signature with:

codesign --verify --deep --strict "/path/to/taystjk.app"

If verification fails, re-extract a fresh copy of the official archive rather than blindly signing the damaged copy. The separate moveandsign.sh workflow described in the debugging guide is for locally built development binaries.

On Apple silicon, use the universal or native arm64 release. Intel Macs need the x86_64 release.

Installing several modded clients

Do not merge every client’s executables and shared libraries into one GameData directory. Different projects—or 32-bit and 64-bit builds of the same project—may ship incompatible SDL2 or OpenAL libraries.

Keep the retail assets once and give every client its own directory:

MyGames/
├── JediAcademy/
│   └── base/
│       ├── assets0.pk3
│       ├── assets1.pk3
│       ├── assets2.pk3
│       └── assets3.pk3
├── TaystJK/
│   ├── taystjk/
│   │   └── japro-assets.pk3
│   ├── taystjk.x86_64.exe
│   └── run-taystjk.bat
└── AnotherClient/
    ├── another-client files…
    └── run-client.bat

On Windows, put this beside the TaystJK executable as run-taystjk.bat:

@echo off
start "" taystjk.x86_64.exe +set fs_cdPath "../JediAcademy"

Use the executable name that actually appears in your release archive. On Linux, the equivalent launch command is:

./taystjk.x86_64 +set fs_cdPath ../JediAcademy

fs_cdPath supplies the shared retail assets while TaystJK keeps its own executable, libraries, mod directory, and user files separate.

Simpler alternative: copy base

Copy the complete retail base directory into each client’s directory. This uses more disk space, but needs no launch script and keeps each installation self-contained.

Put PK3s that should affect every client in that client’s base directory. Put TaystJK-only content in taystjk/, beside japro-assets.pk3.

Run TaystJK with another client-side mod

The TaystJK executable is the engine. The game, client-game, and UI modules are separate native libraries:

Module Windows example Linux example Purpose
Game jampgamex86_64.dll jampgamex86_64.so Server-side game rules; also used by a locally hosted game.
Client game cgamex86_64.dll cgamex86_64.so Client-side prediction, HUD, and world presentation.
UI uix86_64.dll uix86_64.so Menus and other UI behavior.

macOS uses the equivalent .dylib files. TaystJK does not currently execute QVM bytecode; both its current module API and the older dllEntry/vmMain API load native libraries. A module must match the operating system and CPU architecture of the TaystJK executable.

What fs_forcegame does

On a normal client, fs_forcegame defaults to taystjk. This keeps TaystJK’s directory at the highest filesystem priority when a server supplies a different fs_game, and keeps configs, demos, screenshots, and other generated files under taystjk/. A server cannot change fs_forcegame.

The default is therefore appropriate when you want TaystJK’s client-side files and settings while joining servers that run JA+, JA++, jaPRO, or another server-side mod. You can state it explicitly in a shortcut or launch script:

taystjk.x86_64.exe +set fs_forcegame taystjk

Use the executable name for your platform. Do not add fs_game merely to join a server; the server sends its own game directory during connection.

Native libraries are a separate concern: when a matching loose library exists in the server-selected fs_game directory, the engine tries that library before the copy in taystjk/. Keep other mods’ native client libraries out of a clean TaystJK installation unless you intend to load them.

To deliberately use another mod’s client-side libraries and assets, install them in that mod’s directory and select it at startup. For example, JA++ uses japlus/ for compatibility with JA+:

taystjk.x86_64.exe +set fs_game japlus +set fs_forcegame japlus

Setting both values loads the mod from the beginning—including a custom UI—and prevents a later server-provided fs_game from changing the directory used for files and generated output. To return to the normal TaystJK client setup, remove the fs_game japlus argument and either remove the fs_forcegame argument or set it back to taystjk.

When to use vm_legacy

TaystJK first expects the newer OpenJK-style GetModuleAPI interface and normally falls back to the older dllEntry/vmMain interface. vm_legacy skips the newer interface for selected module slots. Use it when the particular native mod library requires the older interface or crashes while the engine probes it as a newer module; it does not enable QVM support.

vm_legacy is a bitmask:

Bit Value Module
0 1 Game (jampgame), relevant to a local or dedicated server.
1 2 Client game (cgame).
2 4 UI (ui).

Add values to force more than one module. For example, an older JA++ build with a legacy custom UI can be launched with:

taystjk.x86_64.exe +set fs_game japlus +set fs_forcegame japlus +set vm_legacy 4

Use vm_legacy 6 only when both the JA++ cgame and UI libraries require the legacy interface. Use vm_legacy 0 for modern libraries, including JA++ builds that implement GetModuleAPI. Put this setting on the command line so it is applied before the UI and client-game modules load; changing it after a module has loaded does not convert that running module.

If the console reports VM_CreateLegacy: ... succeeded, the requested legacy interface loaded. If it reports an architecture mismatch, a missing entry point, or repeated load failures, recheck the mod build and directory rather than trying unrelated bit values.

First-launch checks

This layout is adapted from the longer multiple modded clients guide on JKHub.

Next steps