Skip to content
Draft
Show file tree
Hide file tree
Changes from all commits
Commits
Show all changes
75 commits
Select commit Hold shift + click to select a range
eb49cce
clean empty project
Xiloe Aug 3, 2026
a0341f4
uteditor proper class name
Xiloe Aug 3, 2026
a76debd
add 0.57 exported files from UE Explorer
Xiloe Aug 3, 2026
fbd8e29
add gfxui
Xiloe Aug 3, 2026
bad73f3
test package
Xiloe Aug 4, 2026
6d63ae0
more tests
Xiloe Aug 4, 2026
e4b76ea
more tests
Xiloe Aug 4, 2026
73d9150
stubgen
Xiloe Aug 4, 2026
378976f
stock udk project
Xiloe Aug 4, 2026
92b737e
replace dirs
Xiloe Aug 5, 2026
5b35553
cli
Xiloe Aug 5, 2026
9168d7f
stubgen
Xiloe Aug 5, 2026
962eee9
stubgen fixes
Xiloe Aug 5, 2026
1917b43
stubgen fixes
Xiloe Aug 5, 2026
4b9355f
stubgen fixes
Xiloe Aug 5, 2026
00b037b
stubgen fixes
Xiloe Aug 5, 2026
bad1c57
class header fix
Xiloe Aug 5, 2026
65db1ec
interfaces fix
Xiloe Aug 5, 2026
07a46e6
fix dependson
Xiloe Aug 5, 2026
1bd1c2d
fix maps
Xiloe Aug 5, 2026
3fa3457
more fixes
Xiloe Aug 5, 2026
a86ffbf
full gen
Xiloe Aug 8, 2026
bcf2bec
full dump for 0.57
Xiloe Aug 8, 2026
3ddb30a
Simple Core mod + Utils and empty Multiplayer mod
Xiloe Aug 8, 2026
f2ddf17
test
Xiloe Aug 8, 2026
60202fc
fix compilation errors
Xiloe Aug 8, 2026
82821d6
UPKG files
Xiloe Aug 8, 2026
e6024d8
Base Mod Only Cassie
SupImCinnamon Aug 8, 2026
58929aa
stuff
Xiloe Aug 8, 2026
803bba8
GM commands replicated on the server properly
Xiloe Aug 8, 2026
04b63cf
helper script to dump stuff, stable basic siege mp
Xiloe Aug 12, 2026
e9b55b0
PlayerGUID, Precache list dupe fix, AI Reconnect
Xiloe Aug 14, 2026
6754d01
remove useless stuff
Xiloe Aug 14, 2026
c5f28f6
spec
Xiloe Aug 14, 2026
237d15a
loadouts
Xiloe Aug 15, 2026
915cbda
auto purch, loadouts
Xiloe Aug 16, 2026
1383388
spec
Xiloe Aug 16, 2026
6cead35
spec "ui"
Xiloe Aug 16, 2026
9ca41a6
ui funsies
Xiloe Aug 17, 2026
ec02fd0
UIHudPlayer reimplementation, healthbars, icons, UIHudTeams red health
Xiloe Aug 20, 2026
2df79fc
ui utils, cleanup
Xiloe Aug 20, 2026
11f17d0
Remove Mid Air Inaccuracy
SupImCinnamon Aug 23, 2026
2fcb565
Base 1P
SupImCinnamon Aug 24, 2026
be4c24c
streaks, burn cards hud
Xiloe Aug 24, 2026
c542eea
Fixed horse and model visibility
SupImCinnamon Aug 24, 2026
45e1345
Merge branch 'rewrite' into first-person-spectator
SupImCinnamon Aug 24, 2026
50e08b7
Fixed 3P not working on some abilities
SupImCinnamon Aug 24, 2026
4d3f428
Fixed emotes
SupImCinnamon Aug 26, 2026
3dde309
skills ui + some ai documentation
Xiloe Aug 26, 2026
6a474da
skills ui + some ai documentation
Xiloe Aug 26, 2026
02744fb
simplify some comments
Xiloe Aug 26, 2026
dd73be5
Merge branch 'SupImCinnamon-first-person-spectator' into rewrite
Xiloe Aug 26, 2026
c8d16ac
fixed ult animation, cooldown cancellation anims, teams ult%
Xiloe Aug 27, 2026
15475e9
remove ds store and dump rooster
Xiloe Aug 27, 2026
7a9004e
CI: windows build workflow, installer https fallback, fix UDK make hang
Xiloe Sep 2, 2026
d6f8070
CI: Remove useless TG_SKIP_MAKE flag
Xiloe Sep 2, 2026
356bf24
CI: lean workflow, working installer cache, nu-version-agnostic checksum
Xiloe Sep 2, 2026
398cfda
CI: pin nushell 0.115.1 (setup-nu rejects 'latest')
Xiloe Sep 2, 2026
2525b79
CI: restore rclone for installer download (cdn.xiloe.fr 403s runner IPs)
Xiloe Sep 2, 2026
5c51ae4
Fix windows path separator mismatch in bundle path traversal check
Xiloe Sep 2, 2026
5a26c8d
Fix backslash escaping in windows path normalization
Xiloe Sep 2, 2026
ca9c9f5
Restore lowercase hash normalization and end-of-run bundle file log
Xiloe Sep 2, 2026
a8b36b4
CI: create a GitHub release (v{version}-run{N}) with the built mod on…
Xiloe Sep 2, 2026
e9dc97b
remove "run"
Xiloe Sep 2, 2026
68f6540
change title
Xiloe Sep 2, 2026
abcd4cc
change release title in workflow
Xiloe Sep 3, 2026
9b81849
CI: hyphenate release asset filename (GitHub turns spaces into dots)
Xiloe Sep 3, 2026
d3c7137
CI: revert asset rename, keep original filename with spaces
Xiloe Sep 3, 2026
557bb60
test: Tempest Integration
KANA720 Sep 3, 2026
0034eb9
Tempest Test
KANA720 Sep 4, 2026
3713bf0
chore: bump to 1.0.1
KANA720 Sep 4, 2026
8e554a4
remove the rclone bs
Xiloe Sep 4, 2026
ce7699e
refactor: deepen spectator HUD + game-mode seams
Xiloe Sep 4, 2026
6ce901e
fix: restore ServerVerifyVehiclePhys name — server RPC names are whit…
Xiloe Sep 4, 2026
3abd5f4
fix nu deprecated downcase
Xiloe Sep 4, 2026
File filter

Filter by extension

Filter by extension


Conversations
Failed to load comments.
Loading
Jump to
The table of contents is too big for display.
Diff view
Diff view
  •  
  •  
  •  
The diff you're trying to view is too large. We only load the first 3000 changed files.
132 changes: 132 additions & 0 deletions .github/workflows/build.yml
Original file line number Diff line number Diff line change
@@ -0,0 +1,132 @@
name: Build Tempest Mod

on:
push:
branches:
- "**"

permissions:
contents: write

# Avoid piling up redundant runs when you push several times in a row.
concurrency:
group: build-${{ github.ref }}
cancel-in-progress: true

jobs:
build:
runs-on: windows-latest

steps:
- name: Checkout
uses: actions/checkout@v4

- name: Install Nushell
uses: hustcer/setup-nu@v3
with:
version: "0.115.1"

- name: Resolve Nu cache dir
id: nu_cache_dir
shell: bash
run: echo "path=$(nu -c '$nu.cache-dir')" >> "$GITHUB_OUTPUT"

# Static key on purpose: the installer itself never changes, and tool.nu
# verifies its checksum on every cache hit anyway. Keying on
# hashFiles('tool.nu') would bust the cache on every tool.nu edit.
- name: Cache UDK installer download
uses: actions/cache@v4
with:
path: ${{ steps.nu_cache_dir.outputs.path }}
key: udk-installer-UDKInstall-2013-02-BETA

# cdn.xiloe.fr 403s GitHub runner IPs (Cloudflare), so CI downloads from
# R2 via rclone; tool.nu still falls back to the CDN for local runs.
- name: Install rclone
shell: pwsh
run: choco install rclone -y --no-progress

# The runner has no interactive desktop (session 0): if UDK.com's child
# process hits an error, Windows Error Reporting pops a modal dialog
# nobody can click and the job hangs until timeout. Silence it.
- name: Disable Windows Error Reporting UI
shell: pwsh
run: |
Set-ItemProperty 'HKLM:\SOFTWARE\Microsoft\Windows\Windows Error Reporting' -Name Disabled -Value 1 -Type DWord
Set-ItemProperty 'HKLM:\SOFTWARE\Microsoft\Windows\Windows Error Reporting' -Name DontShowUI -Value 1 -Type DWord

# Defender live-scans the 1.8GB installer on every read pass, which made
# the checksum step look like a hang. Exclude everything we touch.
- name: Exclude workspace from Windows Defender
shell: pwsh
run: |
Set-MpPreference -DisableRealtimeMonitoring $true
Add-MpPreference -ExclusionPath $env:GITHUB_WORKSPACE
Add-MpPreference -ExclusionPath (nu -c '$nu.cache-dir').Trim()
Add-MpPreference -ExclusionProcess 'nu.exe', '7z.exe', 'UDK.com', 'UDK.exe', 'certutil.exe', 'timeout.exe' -ErrorAction SilentlyContinue

- name: Run tool.nu
# Hard timeout so a hung UDK.com fails the step and the log-dump runs
# instead of wedging until the job-level timeout.
shell: bash
env:
R2_ACCESS_KEY_ID: ${{ secrets.R2_ACCESS_KEY_ID }}
R2_SECRET_ACCESS_KEY: ${{ secrets.R2_SECRET_ACCESS_KEY }}
R2_ENDPOINT: ${{ secrets.R2_ENDPOINT }}
run: |
cat > run-tool.ps1 <<'EOF'
# Children inherit the process error mode: with SEM_FAILCRITICALERRORS
# | SEM_NOGPFAULTERRORBOX | SEM_NOOPENFILEERRORBOX a missing-DLL
# loader dialog becomes a fast failure instead of an invisible
# session-0 modal that hangs the job forever.
Add-Type -Namespace Win32 -Name Kernel32 -MemberDefinition @'
[DllImport("kernel32.dll", SetLastError = true)]
public static extern uint SetErrorMode(uint mode);
'@
[Win32.Kernel32]::SetErrorMode(0x8007) | Out-Null
nu tool.nu
exit $LASTEXITCODE
EOF
timeout 1800 pwsh -NoProfile -File run-tool.ps1

- name: Dump diagnostics on failure
if: failure()
shell: pwsh
run: |
Write-Host '=== UDK processes still alive ==='
Get-Process -Name 'UDK', 'UDK.com', 'nu' -ErrorAction SilentlyContinue |
ForEach-Object { Write-Host "$($_.ProcessName) PID=$($_.Id) start=$($_.StartTime) CPU=$($_.CPU)s MainWindow='$($_.MainWindowTitle)'" }
Get-ChildItem UDKGame/Logs -ErrorAction SilentlyContinue | ForEach-Object {
Write-Host "=== $($_.Name) ==="
Get-Content $_.FullName -Tail 80
}

- name: Upload built mod
uses: actions/upload-artifact@v4
with:
name: tempest-mod-${{ github.sha }}
path: output/*.tempest
if-no-files-found: error

- name: Read mod version
id: mod_version
shell: bash
run: echo "version=$(nu -c 'open manifest.toml | get mod.version')" >> "$GITHUB_OUTPUT"

- name: Create release
shell: bash
env:
GH_TOKEN: ${{ github.token }}
run: |
TAG="v${{ steps.mod_version.outputs.version }}.${{ github.run_number }}"
TITLE="Tempest Core ${{ steps.mod_version.outputs.version }}.${{ github.run_number }}"
# Run numbers are unique per workflow but reused on rerun: if the
# release already exists we just refresh its asset instead of failing.
if gh release view "$TAG" --repo "$GITHUB_REPOSITORY" > /dev/null 2>&1; then
echo "Release $TAG already exists (rerun), refreshing asset"
else
gh release create "$TAG" --target "$GITHUB_SHA" --title "$TITLE" \
--notes "Automated build of commit $GITHUB_SHA" --latest \
--repo "$GITHUB_REPOSITORY"
fi
gh release upload "$TAG" output/*.tempest --clobber --repo "$GITHUB_REPOSITORY"
6 changes: 6 additions & 0 deletions .gitignore
Original file line number Diff line number Diff line change
Expand Up @@ -3,8 +3,14 @@
!bundle.yaml
!filelist.txt
!tool.nu
!tool/
!tool/**
!manifest.toml
!README.md
!.github/
!.github/**
!exported/
!exported/**
!Config/
!Config/*
!Development/
Expand Down
4 changes: 2 additions & 2 deletions Config/DefaultEngine.ini
Original file line number Diff line number Diff line change
@@ -1,9 +1,9 @@
[Engine.ScriptPackages]
+NativePackages=TgMod
+NativePackages=TmCore
+NativePackages=TempestMp

[Engine.GameEngine]
MaxSmoothedFrameRate=300.000000

[Engine.Engine]
GameViewportClientClassName=TgMod.TgModGameViewportClient
GameViewportClientClassName=TmCore.TmGameViewportClient
5 changes: 5 additions & 0 deletions Config/DefaultGame.ini
Original file line number Diff line number Diff line change
@@ -0,0 +1,5 @@
[Engine.GameInfo]
PlayerControllerClassName=TgGame.TgPlayerController

[TgGame.TgClientSettings]
AutoPurchase=false
1 change: 1 addition & 0 deletions Config/DefaultInput.ini
Original file line number Diff line number Diff line change
@@ -1,5 +1,6 @@
[TgGame.TgPlayerInput]
+Bindings=(Name="F1", Command="OnRelease Switchlevel Shootingrange_P?game=Shootingrange")
+Bindings=(Name="F12", Command="OnRelease popscene")

[Engine.Console]
.TypeKey=F2
28 changes: 14 additions & 14 deletions Development/Src/AkAudio/Classes/ActorFactoryAkAmbientSound.uc
100755 → 100644
Original file line number Diff line number Diff line change
@@ -1,14 +1,14 @@
class ActorFactoryAkAmbientSound extends ActorFactory
native
config(Editor)
editinlinenew
collapsecategories
hidecategories(Object,Object);
var() AkEvent AmbientEvent;
defaultproperties
{
MenuName="Add AkAmbientSound"
NewActorClass=Class'AkAmbientSound'
}
class ActorFactoryAkAmbientSound extends ActorFactory
native
config(Editor)
editinlinenew
collapsecategories
hidecategories(Object,Object);

var () AkEvent AmbientEvent;

defaultproperties
{
MenuName="Add AkAmbientSound"
NewActorClass=Class'AkAmbientSound'
}
35 changes: 15 additions & 20 deletions Development/Src/AkAudio/Classes/AkAmbientSound.uc
100755 → 100644
Original file line number Diff line number Diff line change
@@ -1,20 +1,15 @@
class AkAmbientSound extends Keypoint
native
hidecategories(Navigation);

var bool bAutoPlay;
var() bool StopWhenOwnerIsDestroyed;
var private transient bool bIsPlaying;
var() AkEvent PlayEvent;

// Export UAkAmbientSound::execStartPlayback(FFrame&, void* const)
native function StartPlayback();

// Export UAkAmbientSound::execStopPlayback(FFrame&, void* const)
native function StopPlayback();

defaultproperties
{
bAutoPlay=true
StopWhenOwnerIsDestroyed=true
}
class AkAmbientSound extends Keypoint
native
hidecategories(Navigation)
config(Engine);

var bool bAutoPlay;
var () bool StopWhenOwnerIsDestroyed;
var private transient bool bIsPlaying;
var () AkEvent PlayEvent;

defaultproperties
{
bAutoPlay=true
StopWhenOwnerIsDestroyed=true
}
20 changes: 10 additions & 10 deletions Development/Src/AkAudio/Classes/AkComponent.uc
100755 → 100644
Original file line number Diff line number Diff line change
@@ -1,10 +1,10 @@
class AkComponent extends ActorComponent
native
editinlinenew
collapsecategories
hidecategories(Object,ActorComponent);
var() name BoneName;
var AkEvent AutoPlayEvent;
var bool bStopWhenOwnerDestroyed;
var transient bool bRegisteredWithWwise;
class AkComponent extends ActorComponent
native
editinlinenew
collapsecategories
hidecategories(Object,ActorComponent)
config(Engine);

var () name BoneName;
var AkEvent AutoPlayEvent;
var bool bStopWhenOwnerDestroyed;
43 changes: 19 additions & 24 deletions Development/Src/AkAudio/Classes/InterpTrackAkEvent.uc
100755 → 100644
Original file line number Diff line number Diff line change
@@ -1,24 +1,19 @@
class InterpTrackAkEvent extends InterpTrack
native
collapsecategories
hidecategories(Object);

struct native AkEventTrackKey
{
var float Time;
var() AkEvent Event;

structdefaultproperties
{
Time=0.0000000
Event=none
}
};

var array<AkEventTrackKey> AkEvents;

defaultproperties
{
TrackInstClass=Class'AkAudio.InterpTrackInstAkEvent'
TrackTitle="AkEvent"
}
class InterpTrackAkEvent extends InterpTrack
native
collapsecategories
hidecategories(Object)
config(Engine);

struct AkEventTrackKey {
var float Time;
var () AkEvent Event;
structdefaultproperties {}
};

var array<AkEventTrackKey> AkEvents;

defaultproperties
{
TrackInstClass=Class'InterpTrackInstAkEvent'
TrackTitle="AkEvent"
}
25 changes: 13 additions & 12 deletions Development/Src/AkAudio/Classes/InterpTrackAkRTPC.uc
100755 → 100644
Original file line number Diff line number Diff line change
@@ -1,12 +1,13 @@
class InterpTrackAkRTPC extends InterpTrackFloatBase
native
collapsecategories
hidecategories(Object);

var() string Param;

defaultproperties
{
TrackInstClass=Class'AkAudio.InterpTrackInstAkRTPC'
TrackTitle="AkRTPC"
}
class InterpTrackAkRTPC extends InterpTrackFloatBase
native
collapsecategories
hidecategories(Object)
config(Engine);

var () string Param;

defaultproperties
{
TrackInstClass=Class'InterpTrackInstAkRTPC'
TrackTitle="AkRTPC"
}
9 changes: 5 additions & 4 deletions Development/Src/AkAudio/Classes/InterpTrackInstAkEvent.uc
100755 → 100644
Original file line number Diff line number Diff line change
@@ -1,4 +1,5 @@
class InterpTrackInstAkEvent extends InterpTrackInst
native;

var float LastUpdatePosition;
class InterpTrackInstAkEvent extends InterpTrackInst
native
config(Engine);

var float LastUpdatePosition;
5 changes: 3 additions & 2 deletions Development/Src/AkAudio/Classes/InterpTrackInstAkRTPC.uc
100755 → 100644
Original file line number Diff line number Diff line change
@@ -1,2 +1,3 @@
class InterpTrackInstAkRTPC extends InterpTrackInst
native;
class InterpTrackInstAkRTPC extends InterpTrackInst
native
config(Engine);
24 changes: 12 additions & 12 deletions Development/Src/AkAudio/Classes/SeqAct_AkClearBanks.uc
100755 → 100644
Original file line number Diff line number Diff line change
@@ -1,12 +1,12 @@
class SeqAct_AkClearBanks extends SequenceAction
native
forcescriptorder(true)
hidecategories(Object);
defaultproperties
{
InputLinks(0)=(LinkDesc="ClearBanks",bHasImpulse=false,QueuedActivations=0,bDisabled=false,bDisabledPIE=false,LinkedOp=none,DrawY=0,bHidden=false,ActivateDelay=0.0000000,bMoving=false,bClampedMax=false,bClampedMin=false)
//VariableLinks=none
ObjName="AkClearBanks"
ObjCategory="Wwise"
}
class SeqAct_AkClearBanks extends SequenceAction
native
forcescriptorder(true)
hidecategories(Object)
config(Engine);

defaultproperties
{
InputLinks[0]=(LinkDesc="ClearBanks",bHasImpulse=false,QueuedActivations=0,bDisabled=false,bDisabledPIE=false,LinkedOp=none,DrawY=0,bHidden=false,ActivateDelay=0.0000000,bMoving=false,bClampedMax=false,bClampedMin=false)
VariableLinks=none
ObjName="AkClearBanks"
}
Loading
Loading