Skip to content

Instantly share code, notes, and snippets.

@apple1417
apple1417 / blmod.md
Last active January 19, 2026 16:59
.blmod file format spec

.blmod file format (v1)

The .blmod file format is designed as a replacement to the .blcm format, and to be generic enough that it could be applied to the existing .bl3hotfix/.wlhotfix file format, or possible future ones.

The main thing it's designed around is mods which consist of text files holding one "command" per line. Commands can be arbitrary strings (as long as they don't contain newlines). These commands can then be grouped into categories, which users can enable/disable to configure their mods - i.e. what BLCMM does.

<?xml version="1.0" encoding="utf-8"?>
<CheatTable CheatEngineTableVersion="42">
<CheatEntries>
<CheatEntry>
<ID>3118</ID>
<Description>"SyncLoadCount"</Description>
<ShowAsSigned>0</ShowAsSigned>
<VariableType>4 Bytes</VariableType>
<Address>Talos1-Win64-Shipping.exe+9C96D54</Address>
</CheatEntry>
@apple1417
apple1417 / Readme.md
Last active July 6, 2024 00:57
All Willow SDK Mods

Downloaded 2024-06-06 at about 10am UTC.

URLs and names are originally sourced from https://bl-sdk.github.io/mods.json. Several needed manual fixups to point directly at the archive to download.

Five mods couldn't get a valid url, and thus are left empty:

  • BL2 Exodus + TPS Exodus - these point to Nexus mods, which don't allow downloads without registering, not something you can do from a script.
  • Chronos, HitSounds, PizzaForFastball - these point at an __init__.py directly and have no archive. I made an archive containing their mod folder, to let the next scripts work better with them.

The urls in archives.csv should work for the rest.

<?xml version="1.0" encoding="utf-8"?>
<CheatTable CheatEngineTableVersion="42">
<CheatEntries>
<CheatEntry>
<ID>2890</ID>
<Description>"World"</Description>
<ShowAsHex>1</ShowAsHex>
<ShowAsSigned>0</ShowAsSigned>
<VariableType>Array of byte</VariableType>
<ByteLength>0</ByteLength>
@apple1417
apple1417 / dump_gvas_t1r.py
Last active April 12, 2025 00:32
Talos 2/Talos 1 Reawaked GVAS save file dumpers
#! /usr/bin/env python3
# ruff: noqa: D102, D103
from __future__ import annotations
import struct
from collections.abc import Mapping, Sequence
from dataclasses import dataclass, field
from datetime import datetime, timedelta
from enum import Enum
@apple1417
apple1417 / proton_debugging.md
Created May 8, 2023 05:04
Debugging Games Running Under Proton in VSCode

Debugging Games Running Under Proton

These are the steps I've been following to debug games under proton (or rather debug a mod loaded into the game via dll shadowing). It works ok, it's not amazing, but it's the best I've managed to work out.

To start, use a known good build and just get the game running stably. You don't want to be messing with proton options at the same time.

Once the game runs, add PROTON_DUMP_DEBUG_COMMANDS=1 %command% to your launch args, and run it once. This will create a bunch of files in /tmp/proton_$USER/, which dump the entire proton

@apple1417
apple1417 / blackmarkets.py
Last active May 13, 2023 06:03
simulate bl3 black market locations/pools
import struct
from datetime import datetime, timedelta
# See this sheet for what locations these actually line up to
# https://docs.google.com/spreadsheets/d/1RFsSUkvAmFWdS_b5Umfl9hDRUfcTLcRcA3kBUAN1nFY/edit#gid=0
SPAWNERS = (
"/Game/PatchDLC/SubmapPatch/Maps/Zone_0/Prologue/Prologue_SubmapPatch.Prologue_SubmapPatch:PersistentLevel.OakSpawner_0",
"/Game/PatchDLC/SubmapPatch/Maps/Zone_0/Prologue/Prologue_SubmapPatch.Prologue_SubmapPatch:PersistentLevel.OakSpawner_0",
"/Game/PatchDLC/SubmapPatch/Maps/Zone_0/Prologue/Prologue_SubmapPatch.Prologue_SubmapPatch:PersistentLevel.OakSpawner_1",
"/Game/PatchDLC/SubmapPatch/Maps/Zone_0/Sacrifice/Sacrifice_SubmapPatch.Sacrifice_SubmapPatch:PersistentLevel.OakSpawner_5",
@apple1417
apple1417 / unreal_introspection.md
Last active May 22, 2025 19:00
Crash Course in Unreal Engine Introspection

In Dismissal of Datatables

Datatables have a multitude of issues, making them completely unsuitable for data mining, reverse engineering and modding. Rather than using datatables, you should always go back to the source, and extract values (or mod them to new ones) from there.

/* Move findbar to top right */
.browserContainer > findbar {
position: absolute;
top: -1px;
right: 0px;
contain: content;
border-radius: 0 0 var(--toolbarbutton-border-radius) var(--toolbarbutton-border-radius);
}
/* Hide status */