AOBMaker v20260910
Stability and bug-fix release, build 148. A code review started after v20260813 and is still in progress.
It covers the generator, the scanners, the CE plugin, the pipes, and the Lua tools. This release carries the
fixes found so far. Most of them fix a script, a scan, or a memory write that came out wrong with no warning.
Install
| Step
| Action
|
| 1
| Unzip anywhere. No installer, no runtime to install.
|
| 2
| Run AOBMaker.UI.exe as admin. Without it, Windows usually blocks AOBMaker from reading game memory.
|
| 3
| (optional) Deploy AOBMaker_CEPlugin.dll to your Cheat Engine folder, then add it in CE: Settings → Plugins.
|
Upgrade from v20260813
Action Item 1: deploy the new AOBMaker_CEPlugin.dll and restart CE. Many plugin fixes (crash paths inside CE,
JSON parsing, symbols, bulk import) need it.
Result: at startup, %LOCALAPPDATA%\AOBMaker\log.txt prints CE plugin, as loaded at its last init: ... below
AOBMaker's own version line. Restart CE first, then start AOBMaker. An old build in that line means CE has not
reloaded the plugin, or the old DLL is still in the CE folder.
Action Item 2: regenerate scripts already saved in your tables. Many fixes are in the generated text.
A script already in a .CT keeps the old behavior until you regenerate it.
| Regenerate
| Reason
|
| Scripts with Auto Script blocks (Multiplier, Clamp, Field / Threshold clamp, Conditional Gate, Addr Capture, Sibling Write / Copy operand)
| Several fixes stop a game crash or a wrong memory write. See Script generation: Auto Script blocks.
|
Any script with a nop count of 10 or more written without #
| CE reads the count as hex. nop 10 wrote 16 bytes and overwrote the next instruction.
|
| Mode C/E/F scripts made through the CE plugin with CE symbols on
| An exact symbol was written as a raw address, so the script breaks after the game restarts. Deploy the new plugin first, then regenerate.
|
Symbol Scanner scripts for a DLL target (e.g. GameAssembly.dll)
| The script scanned the main EXE.
|
| Custom Type scripts
| [DISABLE] always failed with a Lua error. A Scale typed with a comma (1,5) came out 10x off (15). Scale types also changed registers CE itself relies on.
|
| Auto-Refresh Value, AA Toggle, Multi-Record Apply List
| New ID/description cross-check, size and range checks, locale-independent number parsing. Auto-Refresh with a non-ASCII Config Name did not run at all.
|
| Item List scripts for 32-bit games
| Pointer slots were read as 8 bytes.
|
| Clamp scripts made on Swedish/Finnish Windows with a negative bound
| The minus sign came out as a Unicode minus (−, not -). CE cannot assemble it.
|
Action Item 3: restore the .bak if CT ID Renumber damaged a table. Earlier builds renumbered hotkey IDs and
rewrote numeric <DropDownListLink> values. Both are fixed.
Reason to upgrade even if nothing above applies: v20260813 shipped graphics libraries that do not match the UI
framework. The same mismatch crashed another app minutes into a session. If v20260813 closed by itself with no
error, this is a likely cause.
Behavior changes:
- Decimal boxes in the main window and Custom Type Scale always use
. as the decimal point. On comma-decimal
Windows, type 1.5, not 1,5. A comma is refused instead of being read as a thousands separator.
- Clamp and Field clamp have a new Signed checkbox (default on). Untick it for unsigned fields (most often byte/word).
- RIP Scan: type a bare module name in the Module box. A full path now shows
Process not found.
- Pipe API:
GenerateAob and ImportCheatTableXml accept only callers that run as the same user, at the same or
higher integrity level.
Same as v20260813, now documented:
- After you change Settings Pipe Name, restart AOBMaker. The CE plugin switches to the new name at once, but
AOBMaker keeps the old one until it restarts, so CE cannot connect in between.
- The Conditional Gate Value box takes decimal (
100 means 100), while the Offset box next to it takes hex.
If you typed a hex value into Value, double check that gate.
Fixed issues
Tags: Game crash, CE crash, Memory write (wrote where it should not), Silent (wrong result, no
warning), CE refused (script failed to assemble), Data loss (table or script content lost). Other labels
name the symptom directly.
Script generation: output and Mode D
| Before
| Now
|
Memory write. The nop count was written in decimal and CE reads it as hex. Most likely hit: Mode C on a 10+ byte instruction.
| Written as nop #10.
|
| Game crash risk. Mode D's "jmp lands mid-instruction" check did not run when the injection line sat at module offset 0 or a pasted line had no address.
| The check always runs. Mode D refuses to generate a script that would jump into the middle of an instruction.
|
Silent. Custom Type Scale typed with a comma (1,5, 3,14) became 15 / 314 on every PC, and the window said "Generated". Scale 0 or Infinity also generated a script. With 0, every value you edited in CE was written to the game as 0.
| A comma is refused with a warning. 0, Infinity, and 1e400 stop Generate.
|
CE refused. Custom Type [DISABLE] failed with '}' expected near 'type' for every kind since the feature shipped. The type stayed registered and the Lua Engine window stayed open.
| Fixed. Regenerate the script.
|
| CE crash risk. Custom Type Scale changed registers CE relies on and needed an AVX CPU.
| Uses only registers that are safe to change. Runs on any x64 CPU.
|
| Silent. An 8-byte Custom Type Offset lost the upper 32 bits, even when frozen.
| Scale / Offset / Mask accept 4-byte fields only.
|
Silent. The Symbol Scanner script ignored the target module and scanned the main EXE. A DLL target such as GameAssembly.dll found nothing or a wrong address.
| Scans the named module. Falls back to the main EXE with a printed message. The CE plugin's copy of this scan needs the new DLL (Action Item 1).
|
CE refused / Silent. A blank Inject Name gave aobscanmodule(,Game.exe,...). A space or comma in the name silently made two symbols. [ ] + - or a name of only hex digits (CAFE) broke the script. A } in Settings custom author closed the header comment. Non-ASCII custom type names were not valid Lua.
| Blank becomes INJECT. Invalid names are refused with the character and position. Author braces become parentheses. Non-ASCII names get a stable suffix.
|
Varies by PC. Header date and multiplier comments followed regional settings (2026.09.10 on German, Hijri year on ar-SA, value=1,5). Decimal boxes rejected 1.5 on comma-decimal Windows and accepted NaN.
| Same text on every PC. . decimal everywhere. Invalid input gets a red border.
|
| False warning. Mode D said the context was "not continuous" when CE symbols crossed a symbol boundary, or "Internal consistency check failed" when one line had no hex bytes. The backward read could also leave the module.
| These false warnings are gone. The backward read stops at the module start. A paste with no hex bytes on any line still fails (see Known limits).
|
| Wrong warning. Copy operand said "the copy has no effect" for every xmm destination. Offset Symbols dropped a symbol pair silently when no temp register was free.
| Warns only when the overwrite is provable, and names the instruction. Skipped Offset Symbol pairs get a warning.
|
Script generation: Auto Script blocks
| Before
| Now
|
Game crash. Multiplier + Clamp on add eax,5 left out the Clamp block. The stack returned to the game 8 bytes off.
| Clamp is emitted after the multiplier. Push and pop balance.
|
Game crash. Clamp and Multiplier accepted RSP as the value or delta (add rsp,28).
| Refused with a reason. [rsp+58] memory operands still work.
|
Memory write. Multiplier on [rsp+XX] read, and for add [rsp+58],imm wrote, the wrong stack slot after its own push.
| Offset adjusted for the push.
|
Memory write. Sibling Write / Copy operand guessed the width from the mnemonic. movlps copied 16 bytes into an 8-byte field; movdqu copied 4 of 16.
| Width comes from the real operand size. Widths it cannot copy are refused.
|
| Memory write. A long patch window that used every XMM scratch register could reuse a live game XMM register.
| The feature is skipped with a warning.
|
Silent. Flags: Clamp restored flags saved before the original instruction. Clamp and Multiplier looked only for a conditional jump in the next 5 instructions and missed setcc / cmovcc / adc / sbb (HP 500 - 120 stored 0 in one real pattern). Conditional Gate and Threshold clamp + Multiplier leaked their compare into the game's branch.
| Flags are saved after the original instruction whenever later game code may read them. Gate turns on flag saving automatically, with a warning.
|
Silent. Clamp bounds that did not fit were cut down: Max 9999 on a byte field clamped at 15. Also bounds past 2^32, float 1e40 → Infinity, NaN, Derived deltas past ±2.1 billion, and fractional Add/Subtract deltas (the UI default 0.5 became 0).
| Refused with Clamp: skipped and the allowed range. Covers Clamp, Field clamp, and Threshold clamp.
|
| Silent. Signed compare on unsigned byte/word fields reset 128–255 to Min 0.
| New Signed checkbox, plus a warning when the signed compare looks wrong.
|
Silent. Float fields read as integers: Threshold clamp on movups / vmovups / movupd wrote ~1e-43; a Conditional Gate on the injection's own float field compared raw bits; Addr Capture records showed 10.0 as 1092616192.
| Type and width come from the instruction. Unsupported float kinds are refused.
|
Silent. Addr Capture on [rsp+..] (Capture once, Dedup / Ring / Keyed) stored a pointer too low by the block's pushes.
| Adjusted for the pushes.
|
Silent. Multiplier scaled an unrelated register (a reloaded base, a push seen as a write, the cdq / sar divide idiom).
| These cases are refused, not scaled.
|
CE refused / no script. An x86 byte gate used dil. Gather with a vector index gave lea r15,[rcx+ymm2*4]. Derived bounds on 1/2-byte registers gave cmp al,r15d. Multiplier out of scratch registers failed the whole Generate.
| Valid register, or only that feature is skipped with a warning. The rest of the script still generates.
|
Multi-Record Apply List, Auto-Refresh Value, AA Toggle
| Before
| Now
|
| Memory write. Multi-Record Apply List wrote a String / Array of Byte cell longer than the field past its end and reported success. A fitting non-ASCII value made CE grow the record size, so the next value overran.
| A value that does not fit is skipped: skip '<name>' (id=N): ... does not fit. AOBMaker restores the record's size in CE after each write.
|
Memory write. Integer cells that do not fit were cut down (300 into a Byte wrote 44, 1.5 wrote 1).
| The cell is skipped, and the reason is printed in the CE Lua log.
|
| Memory write. Auto-Refresh wrote into a different record every 500 ms after a renumber or a reused CE ID. Custom-type records shown as hex read 12288 as 3000 and wrote 100 as 0x100.
| ID and description are cross-checked; a plain rename still writes, with one log line. A mirror source that moved stops. Hex custom-type records are skipped with a warning.
|
CE refused. Auto-Refresh Value with any non-ASCII letter in Config Name (血量, café) failed to enable or disable in CE ('then' expected near ...).
| Fixed. Generate the script again.
|
| Game crash risk. AA Toggle activated by ID only. After ID reuse it could enable a different AA script. A failed batch still printed success.
| ID first, then a unique-description fallback. Mismatches are printed. A failed batch raises a CE error and unticks. To skip mismatches instead, run AOBMAKER_AT_STRICT_DESC = true in CE's Lua Engine or in the table's Lua script.
|
| Silent. After a renumber, the Apply List window reported mappings "verified" on the wrong record. With duplicate descriptions, the runtime picked one silently.
| Load compares ID and description per row. The runtime counts matches and warns. To skip instead, set the Lua global MRA_STRICT_DESC = true the same way.
|
Silent. 1,000 in an integer column wrote 1. Under a decimal-comma CE Lua locale, every decimal cell was skipped (Auto-Refresh custom types too).
| Parsing ignores locale. 1,5 and 1.5 both mean 1.5. Ambiguous values like 1,000 are refused with a hint.
|
| Silent. A column with an ID but a broken type wrote a raw Dword. Custom / String columns counted unresolved addresses as "written".
| Skipped with a reason. Counts are real.
|
Silent. On re-load, text inside a description (threshold=50, kind="str", local NAME = {) or an apostrophe in a comment changed or wiped the settings.
| Quoted text is ignored when settings are read back.
|
CE refused. NaN, Infinity, 1e400 in Auto-Refresh boxes gave NaN.0. Ranges like -5-10=0 were dropped silently. AA Toggle broke on a line break or ]==] in the process name.
| Finite numbers only. Negative and exponent ranges parse. Bad bands are reported. Process names are sanitized.
|
| An Apply List form that failed to build still printed "opened." and was reused, broken, on every enable.
| The success message prints only after the build succeeds.
|
Apply List CSV: German Excel's ; file read as one column. A leading apostrophe was lost on round trip. The old script stayed in the output box after a new import.
| Detects , ; TAB and sep=. The template uses this PC's list separator. Apostrophes round-trip. Import clears the output box.
|
Item List
| Before
| Now
|
Memory read. Filter offset FFFFFFFF read ~4 GB away. An unparsable offset silently became the default. 0x18 was rejected.
| 0x accepted. Invalid offsets stop Generate and name the box.
|
Data loss. Generate discarded hand-written FIELDS and LINKED tables. A backslash in a field name dropped the next field. { / } in a filter box blanked the other filter settings on import.
| Generate reads FIELDS / LINKED from the output box. Escapes and braces round-trip.
|
Silent. 32-bit games read pointer slots as 8 bytes. vtFloat (not a CE type) left records as 4-byte integers. Comments, escaped quotes, and missing color lines broke re-import. "N items scanned" always showed maxItems.
| readPointer for slots. vtFloat maps to vtSingle. Re-import round-trips with the same defaults. Prints the real N slots scanned.
|
AA Migration
| Before
| Now
|
Code lost. An in-place patch (no newmem:) migrated to just nop 3, marked Proposed.
| Blocked with E-NO-CAVE-LANDING-ZONE and the lines at risk.
|
Disabled code re-enabled. { } block comments lost their braces. reassemble() / jmp return could land inside a { } block.
| { } blocks carry over whole. Cave boundaries skip them.
|
Memory write on disable. Orphan cave lines went to the end of the file, inside [DISABLE], and CE assembled them there.
| Wrapped in { } before the ORIGINAL CODE block. The diff matches the copied script.
|
Memory write. Opt-in "remap displacements" rewrote every operand with the old offset ([rsp-1A8], [r9-1A8]).
| Only operands on the injection base register.
|
| Feature runs twice. A script made with Strip inline comments lost its Auto Script markers. Migration copied the block and the new script added its own (x3 became x9).
| New scripts always carry the markers. Scripts saved by earlier builds still lack them (see Known limits).
|
| Silent. A struct pointer moved to another register while the injection instruction names no general register: clean "Proposed", no warning.
| Detected by field offset: W-POINTER-BASE-* warnings.
|
Silent. Rename misses: movsd / cmpsd xmm forms, r8l..r15l, symbols in a different case, TAB after the mnemonic, chained-mapping collisions. Register names inside db 'rcx' and inside {$lua} / {$ccode} text were renamed.
| All handled. Data lines and Lua / C blocks are left as-is, except symbols.
|
Silent. The restore buffer was guessed as the first extra alloc, which could rename your Address Capture buffer.
| Only known naming patterns are accepted.
|
Lines dropped. The line above the ORIGINAL CODE { with no blank line between, // comments indented with 3 spaces, registersymbol named like a skeleton label, unregistersymbol when the skeleton had dealloc, and everything after a {$lua} table line {"Item"},.
| Kept.
|
CE refused, tool said OK. Undefined labels, duplicate labels (including label(a b)), and call to your own label.
| Warnings and blockers fire. Identical duplicate label sections merge automatically.
|
Refused (E-NO-MAP). Branch / call targets like module.exe+E25DB64 (hex offset starting A-F).
| Compared correctly.
|
Misleading report. Status counted mappings, not rewritten lines. Copy report said "(none ...)" on a refused migration. Copy used a stale result after an edit. Warnings hid behind "needs no register change". Spurious collision warnings for cmp / test and save_rdx.
| Status counts rewritten lines. The report opens with the outcome. Copy is disabled while stale. Any warning gives "Proposed, with warnings".
|
CT Stability, CT ID Renumber, .CT loading
| Before
| Now
|
AOBMaker crash. A .CT with ~1,500 nesting levels crashed the Lua tool windows and ImportCheatTableXml. An oversized number in a hand-edited script crashed import.
| Nesting capped at 256 levels. Bad numbers are rejected; the window stays open.
|
Data loss. CT ID Renumber renumbered hotkey IDs, left gaps, and rewrote numeric <DropDownListLink>. It offered Apply on duplicate <ID>s. A crash mid-write could leave an unloadable .CT.
| Only record IDs change. Links are untouched. Duplicates block Apply. The write is atomic.
|
| False Broken. CT Stability marked entries Broken without a real search (partial process name, one unreadable page). Multi-injection scripts compared every entry to the last ORIGINAL CODE block (37% shown, really 98%).
| New Not verified status and ? N count. Each entry uses its own ORIGINAL CODE block.
|
Missing entries / freeze. * / ** wildcards dropped entries silently. Many spaces in an aobscan line froze the window. Multi-alloc scripts used offset 0.
| Wildcards read as ??. Parsing is immediate. Offsets are found, or a warning says so.
|
A corrupt .CT looked like "0 AOB entries found". A stale "Analyzing N/N" line hid the summary. Columns did not sort. x86 targets decoded as x64.
| Error in the status bar and the Log window. The summary stays. All 11 columns sort. Real bitness.
|
Relocation
| Before
| Now
|
| Silent. The top result could land 1 byte late, inside the instruction, when the new game build made that instruction 1 byte longer, and it still scored high.
| Top results snap to real instruction starts and are rescored.
|
Silent. EXE renamed between versions (e.g. game_v1.exe → game_v2.exe): the scan ran over the whole process, and 49 of 50 results were in system DLLs.
| Scans the main EXE and says so. A banner warns when a scan is not bounded to a module.
|
| Wrong process. A stale CE-reported PID made Relocation, CT Stability, RIP Scan, and Mode D attach to another game. The process dialog's X button counted as Confirm.
| The CE PID is used only while it is valid and matches. X cancels.
|
| The result list changed between runs and could shrink to 1–9 rows. Multiple context blocks shifted the compare window. Data inside code misdecoded later instructions.
| Stable list, counted inside the game module. Correct window and decode.
|
| Skipped contexts were silent. A raw resource key showed in the status bar. The address column did not sort. Large candidate sets merged slowly. CE's Navigate to Relocation Result still jumped after the window closed, and could act on an empty reply.
| Skipped contexts are named. Translated text. Numeric sort. Fast merge. Selection cleared on close. Empty replies are refused.
|
Scanner and RIP Scan
| Before
| Now
|
| Silent. The Mode D uniqueness scan missed matches across chunk and memory-region borders and dropped partly failed reads. An AOB could be called unique when it was not.
| Borders are covered and partial reads are scanned. log.txt warns on incomplete coverage.
|
| Silent. Value / Sequence Scan never found a value that crossed a read-chunk border (strings at every 16 MB, AC-safe at 64 KB).
| Chunks overlap.
|
| Silent. Float / Double hits showed the searched value, not the real one (99.995 shown as 100). Changing Value Type or string length after First Scan gave wrong Next Scan results.
| Real values stored. Next Scan refuses a changed type and asks for Reset.
|
Memory blowup. A Value Scan for 0 / 1 / -1 could use GBs before the result limit applied.
| The limit applies inside every scan path.
|
| AC-safe was ignored by Sequence Next Scan, and other windows kept reading the same game in parallel.
| Honored. All reads on that process are serialized during an AC-safe scan.
|
Wrong address. RIP Scan reported some 48 FF 15 / 48 FF 25 hits one byte late.
| Real instruction start.
|
| An empty Value box blamed "unreadable" memory. Next Scan dropped unreadable addresses silently. A fully blocked RIP Scan said "0 references". Cancel in RIP Scan's process picker scanned anyway. A failed re-attach kept the old target.
| Input errors are clear. N addresses unreadable. ReadProcessMemory blocked. Cancel cancels. A failed attach clears the state.
|
IL2CPP
| Before
| Now
|
Silent. With some global-metadata.dat / GameAssembly.dll files, IL2CPP symbols resolved to wrong method addresses, and addresses outside GameAssembly.dll went into define(...) lines. An empty browser reported success.
| Bad layouts are refused, not guessed. Out-of-image addresses are dropped. The browser shows the failure reason.
|
Hang / memory. A damaged global-metadata.dat / GameAssembly.dll could hang Generate for a long time or allocate GBs. Metadata v25/26/28/30 passed auto-detect, then failed.
| Ranges and memory are budgeted by file size. Those versions are rejected up front, with the reason.
|
CE plugin and pipes
| Before
| Now
|
CE crash. The plugin drove CE's disassembler from its pipe thread and could corrupt the Memory Viewer. A 512-char disassembly line overflowed a buffer. A 256-byte PipeName value read past its buffer. Any internal plugin error could close CE, and unsaved changes in your table were lost.
| The walk runs on CE's main thread. Buffers fixed. CE keeps running; the error goes to %LOCALAPPDATA%\AOBMaker\CEPlugin.log as "swallowed at the CE boundary".
|
Data loss. InjectTableFile deleted the old table file first.
| The replacement is built under a temp name, then swapped in.
|
Breaks after restart. Exact symbols (call SomeExport) were sent as raw addresses, so Mode C/E/F scripts hardcoded an address that changes each time the game starts. Long names were cut inside the offset.
| Symbols kept, quoted like CE does. Cut names fall back to hex.
|
Records lost or wrong. [ / { in a description dropped all child records. A parent with 200+ child records failed. Invalid value types saved as Error. Emoji arrived mangled. CE-side failures reported success.
| All fixed. created is the real count.
|
Security. NUL, ]==], a Color value, or a batch id inside a data field could break out of the generated Lua and run code in CE. The bridge accepted connections from other PCs. Another program on this PC could pose as the CE bridge and act with AOBMaker's Windows rights.
| Validated and escaped. Connections from other PCs are refused. AOBMaker no longer lends its identity to the pipe it connects to. The bridge still runs AA scripts (including {$LUA}) that a local caller sends, by design.
|
| CE freeze. "Send to AOBMaker" froze CE for up to ~8 s (3 s connect wait + 5 s reply wait).
| Runs on a worker and returns in ~50 ms. A second click during a send is ignored (logged only).
|
| One stalled client blocked every other client, in both directions. AOBMaker kept timed-out connections open. AOBMaker's pipe server could stop answering for the session.
| No-progress timeouts (5 s / ~6 s) drop the stalled client. The server keeps running.
|
The bridge ignored text fields in JSON with a space after : (the Python json.dumps default). A non-ANSI custom Pipe Name never connected.
| Any JSON whitespace parses. Pipe names are Unicode.
|
A cancelled bulk import, or a failed AOBScanModuleUE scan, left data in CE's memory. CEPlugin.log said "listening" on failure and garbled lines.
| Cleaned up. Accurate log.
|
UI
| Before
| Now
|
| Possible crash. v20260813 shipped graphics libraries (SkiaSharp / HarfBuzzSharp) that do not match the UI framework. The same mismatch in another app caused a heap-corruption crash minutes into a session.
| Versions now match. Please report missing glyphs or clipped CJK text.
|
| Light theme: the process picker showed no text. Log and warning text were hard to read. Headers stayed bright after a theme switch.
| Theme-aware colors in both themes.
|
Numeric boxes printed raw .NET exception text. Closing took an extra 2 s. The Value Scan merge froze the window. A second launch deleted log.prev.txt.
| Red border only. No close delay. Background merge. A rejected launch writes rejected-launch.log instead.
|
Also new
- Conditional Gate Width dropdown (auto/1/2/4/8). Addr Capture Keyed Key width (1/2/4).
- Clamp on a value that stays in memory (
cmp dword ptr [rcx+70],64) now builds a field clamp on [base+offset].
// signed:-2 end-of-line comment on small negative hex immediates. Bytes unchanged. Off when Strip comments is on.
- AA Migration: opt-in Migrate struct pointer registers, a Location column, and
W-TEXT-BYTES-MISMATCH.
- Multi-Record Apply List: orange hex input marker on columns CE writes as hex.
- Data grids: PageUp / PageDown scroll one page.
For pipe API users (see the shipped API-CEPlugin.md, API-AOBMaker-UI.md, Bulk-Records-Protocol-Spec.md):
- Send the request right after you connect.
- A caller rejected by the identity check gets
success:false, with a message that starts with Rejected:.
DisassembleRange caps at 512 lines each side.
- Batch ids must be the
batch_<digits> the plugin issues. Send End once, always.
- String
length is clamped to 0..65536.
ImportCheatTableXml ignores autoActivate and says so.
Known limits
- Windows x64 only. The tool is x64; it targets both x64 and x86 games.
- Offline AOB is not guaranteed unique. Use Mode D when you need uniqueness. Mode D cannot see zero-filled reads from Denuvo-style AC.
- Mode D: a paste where no line has hex bytes still ends in
Internal consistency check failed. Workaround: copy the disassembly from CE with the bytes column shown.
- 32-bit IL2CPP is not supported, by design.
- CT XML import covers a modeled field subset. DropDownList, DropDownListLink, ZeroTerminate, CodePage, and Color are dropped.
- Apply List CSV: a German ANSI (CP1252) CSV can misread on a PC with a different code page (e.g. zh-TW). Workaround: save as UTF-8.
- AA Migration: a script saved with Strip inline comments on by an earlier build has no Auto Script markers. Migration copies its Auto Script block as your own code, and the new script adds its own (a x3 multiplier becomes x9). Delete the copied block in the result before you use it.
- AA Migration:
rep-prefixed string instructions are not protected from register rename. Double check the diff.
- Relocation still scans the whole process for each pattern before it keeps the hits inside the game module. A large game can take a few minutes.
- Bulk import: stale batches are swept only when the next import begins. Workaround: disable and re-enable the plugin in CE.
Double check your download
The release ships a .sha256 next to the archive.
Get-FileHash .\AOBMaker-v20260910-win-x64.zip -Algorithm SHA256
Built with .NET 10 Native AOT. Single EXE, no runtime dependency.
Code review: still in progress
The code review is not finished yet. More updates may follow. No date is set for them.