900
tint-cheats - free, open-source CE tables - no paywalls, no malware, no surveys
1E90FF
1
901
[ Open ] Official site and free downloads (thereisnotime.github.io/tint-cheats)
1E90FF
Auto Assembler Script
{$LUA}
if syntaxcheck then return end
[ENABLE]
shellExecute([[https://thereisnotime.github.io/tint-cheats]])
local mr = memrec
if mr then synchronize(function() mr.Active = false end) end
[DISABLE]
902
[ Open ] Join the Telegram group
26A5E4
Auto Assembler Script
{$LUA}
if syntaxcheck then return end
[ENABLE]
shellExecute([[https://t.me/+xgtzaZBrKRA2OWI8]])
local mr = memrec
if mr then synchronize(function() mr.Active = false end) end
[DISABLE]
903
[ Open ] Join the Matrix room
00A86B
Auto Assembler Script
{$LUA}
if syntaxcheck then return end
[ENABLE]
shellExecute([[https://matrix.to/#/!GkVomrhlzPROGFzueG:matrix.org?via=matrix.org]])
local mr = memrec
if mr then synchronize(function() mr.Active = false end) end
[DISABLE]
904
=========================================================================
404040
1
10
MinutesTillDawn Trainer v1.7.1 by TINT
808080
1
13
[ F1 ] XP Boost (set value per drop)
00FF80
Auto Assembler Script
Toggle
112
Activate
Deactivate
{$LUA}
if syntaxcheck then return end
[ENABLE]
local input = inputQuery("XP Boost", "XP per drop (blank = 50):", "")
local xpVal = (input and input ~= "") and tonumber(input) or 50
if not xpVal or xpVal < 1 then xpVal = 50 end
if not MTD_initMono() then return end
_MTD_xpVal = xpVal
_MTD_xpCls = mono_findClass("", "Pickup")
local function boostXP()
if not _MTD_xpCls then _MTD_xpCls = mono_findClass("", "Pickup") end
if not _MTD_xpCls then return end
local ok, insts = pcall(mono_class_findInstancesOfClassListOnly, "", _MTD_xpCls)
if not ok or not insts then return end
for i = 1, #insts do
pcall(writeFloat, getAddress(insts[i]) + 40, _MTD_xpVal)
end
end
boostXP()
_MTD_xpTimer = createTimer(nil, false)
_MTD_xpTimer.Interval = 500
_MTD_xpTimer.OnTimer = function()
if not MTD_inRun() then return end
boostXP()
end
_MTD_xpTimer.Enabled = true
MainForm.Caption = "MinutesTillDawn Trainer [XP=" .. xpVal .. "]"
[DISABLE]
if _MTD_xpTimer then _MTD_xpTimer.destroy() _MTD_xpTimer = nil end
_MTD_xpCls = nil
MainForm.Caption = "MinutesTillDawn Trainer"
12
[ F2 ] Ammo Lock (infinite or set value)
00FF80
Auto Assembler Script
Toggle
113
Activate
Deactivate
{$LUA}
if syntaxcheck then return end
[ENABLE]
local input = inputQuery("Ammo Lock", "Lock ammo at (blank = max ammo):", "")
local lockVal = (input and input ~= "") and tonumber(input) or nil
if lockVal and (lockVal < 1 or lockVal > 999999) then lockVal = nil end
if not MTD_initMono() then return end
-- Ammo.infiniteAmmo @64 (bool) <amount>k__BackingField @72 (int)
-- Ammo.gun @24 -> Gun.gunData @56 -> GunData.maxAmmo @96
_MTD_amCls = mono_findClass("", "Ammo")
_MTD_amBase = nil
_MTD_amLock = lockVal -- nil = use maxAmmo each tick
local function refreshAm()
if not _MTD_amCls then _MTD_amCls = mono_findClass("", "Ammo") end
if not _MTD_amCls then return end
local insts = mono_class_findInstancesOfClassListOnly("", _MTD_amCls)
if insts and #insts > 0 then _MTD_amBase = getAddress(insts[1]) end
end
refreshAm()
_MTD_amTimer = createTimer(nil, false)
_MTD_amTimer.Interval = 100
_MTD_amTimer.OnTimer = function()
if not MTD_inRun() then _MTD_amBase = nil return end
if not _MTD_amBase then refreshAm() end
if not _MTD_amBase then return end
local val = _MTD_amLock
if not val then
val = 9999
local ok, gunPtr = pcall(readPointer, _MTD_amBase + 24)
if ok and gunPtr and gunPtr > 0x10000 then
local ok2, gdPtr = pcall(readPointer, gunPtr + 56)
if ok2 and gdPtr and gdPtr > 0x10000 then
local ok3, mx = pcall(readInteger, gdPtr + 96)
if ok3 and mx and mx > 0 then val = mx end
end
end
end
pcall(writeBytes, _MTD_amBase + 64, 1)
pcall(writeInteger, _MTD_amBase + 72, val)
end
_MTD_amTimer.Enabled = true
local label = lockVal and ("AMMO LOCKED=" .. lockVal) or "AMMO INFINITE"
MainForm.Caption = "MinutesTillDawn Trainer [" .. label .. "]"
[DISABLE]
if _MTD_amTimer then _MTD_amTimer.destroy() _MTD_amTimer = nil end
_MTD_amCls = nil
_MTD_amBase = nil
MainForm.Caption = "MinutesTillDawn Trainer"
9
[ F3 ] Max Pickup Range
00FF80
Auto Assembler Script
Toggle
114
Activate
Deactivate
{$LUA}
if syntaxcheck then return end
[ENABLE]
if not MTD_initMono() then return end
-- PickupRange = StatType 17. The game stores a StatMod per stat type in a contiguous
-- array of 22 StatMod objects (stride 0x30). Writing a large _multiplierBonus @28
-- makes the engine compute baseRange * (1 + 99999) = effectively infinite.
-- We locate the array each run by finding the first block of 22 consecutive StatMods.
_MTD_prSmAddr = nil
local function findPrStatMod()
local smCls = mono_findClass("","StatMod")
if not smCls then return end
local insts = mono_class_findInstancesOfClassListOnly("",smCls)
if not insts or #insts < 22 then return end
for i=1,#insts-21 do
local base = getAddress(insts[i])
local ok2 = true
for j=1,21 do
if getAddress(insts[i+j]) - base ~= j*0x30 then ok2=false break end
end
if ok2 then _MTD_prSmAddr = base + 17*0x30 break end
end
end
findPrStatMod()
_MTD_prTimer = createTimer(nil, false)
_MTD_prTimer.Interval = 500
_MTD_prTimer.OnTimer = function()
if not MTD_inRun() then _MTD_prSmAddr = nil return end
if not _MTD_prSmAddr then findPrStatMod() end
if _MTD_prSmAddr then pcall(writeFloat, _MTD_prSmAddr + 28, 99999.0) end
end
_MTD_prTimer.Enabled = true
if _MTD_prSmAddr then pcall(writeFloat, _MTD_prSmAddr + 28, 99999.0) end
MainForm.Caption = "MinutesTillDawn Trainer [MAX PICKUP RANGE]"
[DISABLE]
if _MTD_prTimer then _MTD_prTimer.destroy() _MTD_prTimer = nil end
if _MTD_prSmAddr then pcall(writeFloat, _MTD_prSmAddr + 28, 0.0) end
_MTD_prSmAddr = nil
MainForm.Caption = "MinutesTillDawn Trainer"
11
[ F4 ] Soul Vacuum (collect all drops)
00FF80
Auto Assembler Script
Toggle
115
Activate
Deactivate
{$LUA}
if syntaxcheck then return end
[ENABLE]
if not MTD_initMono() then return end
-- Runtime souls counter: same address F5 uses (SaveSystem static base +24)
local classSS = mono_findClass("", "SaveSystem")
if not classSS or classSS == 0 then error("SaveSystem class not found") end
local soulsAddr = mono_class_getStaticFieldAddress("", classSS) + 24
-- Count non-pooled Pickup instances (x != 0 means spawned/active, not fresh pool).
-- Add their count directly to the souls counter. No position writes -- touching physics
-- memory directly causes a crash when the engine spawns a new pickup from the pool.
local pkCls = mono_findClass("", "Pickup")
if not pkCls then error("Pickup class not found") end
local pkInsts = mono_class_findInstancesOfClassListOnly("", pkCls)
local vacuumed = 0
if pkInsts then
for i = 1, #pkInsts do
local base = getAddress(pkInsts[i])
local native = readPointer(base + 16)
if native and native ~= 0 then
local ptr48 = readPointer(native + 48)
if ptr48 and ptr48 ~= 0 then
local x = readFloat(ptr48 + 96)
if x and math.abs(x) > 0.001 then
vacuumed = vacuumed + 1
end
end
end
end
end
local cur = readInteger(soulsAddr) or 0
writeInteger(soulsAddr, cur + vacuumed)
print("[MTD] Soul vacuum: +" .. vacuumed .. " souls")
MainForm.Caption = "MinutesTillDawn Trainer [VACUUM: +" .. vacuumed .. " souls]"
[DISABLE]
MainForm.Caption = "MinutesTillDawn Trainer"
1
[ F5 ] Unlimited Souls
0000FF
Auto Assembler Script
Toggle
116
Activate
Deactivate
{$LUA}
if syntaxcheck then return end
[ENABLE]
if not MTD_initMono() then return end
local classSS = mono_findClass("", "SaveSystem")
if not classSS or classSS == 0 then
error("SaveSystem class not found")
end
-- Souls: hidden static Int32 at SaveSystem static base +24
-- (not SaveData.points which is the serialized copy)
local staticBase = mono_class_getStaticFieldAddress("", classSS)
_MTD_goldAddr = staticBase + 24
_MTD_timer = createTimer(nil, false)
_MTD_timer.Interval = 250
_MTD_timer.OnTimer = function()
if _MTD_goldAddr then writeInteger(_MTD_goldAddr, 99999999) end
end
_MTD_timer.Enabled = true
writeInteger(_MTD_goldAddr, 99999999)
MainForm.Caption = "MinutesTillDawn Trainer [SOULS FROZEN]"
[DISABLE]
if _MTD_timer then _MTD_timer.destroy() _MTD_timer = nil end
_MTD_goldAddr = nil
MainForm.Caption = "MinutesTillDawn Trainer"
2
[ F6 ] Freeze Hearts
0000FF
Auto Assembler Script
Toggle
117
Activate
Deactivate
{$LUA}
if syntaxcheck then return end
[ENABLE]
if not MTD_initMono() then return end
-- Class may be nil if enabled from menu; timer re-discovers on run start.
_MTD_hpCls = mono_findClass("", "PlayerHealth")
_MTD_hpBase = nil
_MTD_hpTick = 0
local function refreshHp()
if not _MTD_hpCls then _MTD_hpCls = mono_findClass("", "PlayerHealth") end
if not _MTD_hpCls then return end
local insts = mono_class_findInstancesOfClassListOnly("", _MTD_hpCls)
if insts and #insts > 0 then _MTD_hpBase = getAddress(insts[1]) end
end
refreshHp()
_MTD_hpTimer = createTimer(nil, false)
_MTD_hpTimer.Interval = 16
_MTD_hpTimer.OnTimer = function()
if not MTD_inRun() then _MTD_hpBase = nil return end
_MTD_hpTick = (_MTD_hpTick or 0) + 1
if _MTD_hpTick % 20 == 0 or not _MTD_hpBase then refreshHp() end
if not _MTD_hpBase then return end
pcall(writeBytes, _MTD_hpBase + 120, 1) -- isInvincible = true
local mx = readInteger(_MTD_hpBase + 144)
if mx and mx > 0 then writeInteger(_MTD_hpBase + 148, mx) end
end
_MTD_hpTimer.Enabled = true
if _MTD_hpBase then
pcall(writeBytes, _MTD_hpBase + 120, 1)
writeInteger(_MTD_hpBase + 148, readInteger(_MTD_hpBase + 144))
end
MainForm.Caption = "MinutesTillDawn Trainer [HEARTS FROZEN]"
[DISABLE]
if _MTD_hpTimer then _MTD_hpTimer.destroy() _MTD_hpTimer = nil end
_MTD_hpCls = nil
_MTD_hpBase = nil
_MTD_hpTick = nil
MainForm.Caption = "MinutesTillDawn Trainer"
3
[ F7 ] Freeze Timer
0000FF
Auto Assembler Script
Toggle
118
Activate
Deactivate
{$LUA}
if syntaxcheck then return end
[ENABLE]
if not MTD_initMono() then return end
_MTD_timerCls = mono_findClass("", "GameTimer")
_MTD_timerBase = nil
_MTD_timerVal = nil
_MTD_timerTick = 0
local function refreshGt()
if not _MTD_timerCls then _MTD_timerCls = mono_findClass("", "GameTimer") end
if not _MTD_timerCls then return end
local insts = mono_class_findInstancesOfClassListOnly("", _MTD_timerCls)
if insts and #insts > 0 then
local newBase = getAddress(insts[1])
if newBase ~= _MTD_timerBase then
_MTD_timerBase = newBase
_MTD_timerVal = readFloat(newBase + 32)
end
end
end
refreshGt()
_MTD_timerTimer = createTimer(nil, false)
_MTD_timerTimer.Interval = 50
_MTD_timerTimer.OnTimer = function()
if not MTD_inRun() then _MTD_timerBase = nil return end
_MTD_timerTick = (_MTD_timerTick or 0) + 1
if _MTD_timerTick % 20 == 0 or not _MTD_timerBase then refreshGt() end
if _MTD_timerBase and _MTD_timerVal then
writeFloat(_MTD_timerBase + 32, _MTD_timerVal)
end
end
_MTD_timerTimer.Enabled = true
if _MTD_timerBase and _MTD_timerVal then
writeFloat(_MTD_timerBase + 32, _MTD_timerVal)
end
MainForm.Caption = "MinutesTillDawn Trainer [TIMER FROZEN]"
[DISABLE]
if _MTD_timerTimer then _MTD_timerTimer.destroy() _MTD_timerTimer = nil end
_MTD_timerCls = nil
_MTD_timerBase = nil
_MTD_timerVal = nil
_MTD_timerTick = nil
MainForm.Caption = "MinutesTillDawn Trainer"
4
[ F8 ] Set Timer to X seconds
0000FF
Auto Assembler Script
Toggle
119
Activate
Deactivate
{$LUA}
if syntaxcheck then return end
[ENABLE]
local input = inputQuery("Set Timer", "Seconds:", "30")
if not input or input == "" then
local mr = getAddressList().getMemoryRecord(3)
if mr then mr.Active = false end
return
end
local val = tonumber(input)
if not val or val < 0 then
showMessage("Invalid value.")
local mr = getAddressList().getMemoryRecord(3)
if mr then mr.Active = false end
return
end
if not MTD_initMono() then return end
_MTD_stCls = mono_findClass("", "GameTimer")
_MTD_stBase = nil
_MTD_stFrozen = val
_MTD_stTick = 0
local function refreshSt()
if not _MTD_stCls then _MTD_stCls = mono_findClass("", "GameTimer") end
if not _MTD_stCls then return end
local insts = mono_class_findInstancesOfClassListOnly("", _MTD_stCls)
if insts and #insts > 0 then _MTD_stBase = getAddress(insts[1]) end
end
refreshSt()
_MTD_setTimerTimer = createTimer(nil, false)
_MTD_setTimerTimer.Interval = 50
_MTD_setTimerTimer.OnTimer = function()
if not MTD_inRun() then _MTD_stBase = nil return end
_MTD_stTick = (_MTD_stTick or 0) + 1
if _MTD_stTick % 20 == 0 or not _MTD_stBase then refreshSt() end
if _MTD_stBase and _MTD_stFrozen then
writeFloat(_MTD_stBase + 32, _MTD_stFrozen)
end
end
_MTD_setTimerTimer.Enabled = true
if _MTD_stBase then writeFloat(_MTD_stBase + 32, val) end
MainForm.Caption = "MinutesTillDawn Trainer [TIMER SET: " .. val .. "s]"
[DISABLE]
if _MTD_setTimerTimer then _MTD_setTimerTimer.destroy() _MTD_setTimerTimer = nil end
_MTD_stCls = nil
_MTD_stBase = nil
_MTD_stFrozen = nil
_MTD_stTick = nil
MainForm.Caption = "MinutesTillDawn Trainer"
5
[ F9 ] Speed Boost (configurable, default 4x)
0000FF
Auto Assembler Script
Toggle
120
Activate
Deactivate
{$LUA}
if syntaxcheck then return end
[ENABLE]
local mult = 4.0
if not MTD_initMono() then return end
-- Class may be nil if enabled from menu; applySpeed re-discovers on run start.
_MTD_speedCls = mono_findClass("", "PlayerController")
_MTD_speedMult = mult
_MTD_speedOrig = {}
local function applySpeed()
if not MTD_inRun() then return end
if not _MTD_speedCls then _MTD_speedCls = mono_findClass("", "PlayerController") end
if not _MTD_speedCls then return end
local insts = mono_class_findInstancesOfClassListOnly("", _MTD_speedCls)
if not insts then return end
for i = 1, #insts do
local addr = getAddress(insts[i]) + 208
if not _MTD_speedOrig[addr] then
local cur = readFloat(addr)
_MTD_speedOrig[addr] = (cur > 0.1 and cur < 100) and cur or 3.0
end
writeFloat(addr, _MTD_speedOrig[addr] * (_MTD_speedMult or 4.0))
end
end
applySpeed()
_MTD_speedTimer = createTimer(nil, false)
_MTD_speedTimer.Interval = 250
_MTD_speedTimer.OnTimer = applySpeed
_MTD_speedTimer.Enabled = true
MainForm.Caption = "MinutesTillDawn Trainer [SPEED BOOST 4x]"
[DISABLE]
if _MTD_speedTimer then _MTD_speedTimer.destroy() _MTD_speedTimer = nil end
if _MTD_speedOrig then
for addr, orig in pairs(_MTD_speedOrig) do writeFloat(addr, orig) end
_MTD_speedOrig = nil
end
_MTD_speedCls = nil
_MTD_speedMult = nil
MainForm.Caption = "MinutesTillDawn Trainer"
6
[ F10 ] Rapid Fire + Boost Damage
0000FF
Auto Assembler Script
Toggle
121
Activate
Deactivate
{$LUA}
if syntaxcheck then return end
[ENABLE]
local dmgVal = 9999
if not MTD_initMono() then return end
local cls = mono_findClass("", "Gun")
if not cls or cls == 0 then error("Gun class not found") end
local instances = mono_class_findInstancesOfClassListOnly("", cls)
if not instances or #instances == 0 then error("Gun instance not found - start a run first") end
-- GunData (ScriptableObject) via Gun.gunData @56:
-- damage @88 shotCooldown @92 maxAmmo @96 (int) reloadDuration @100
-- _MTD_rfOrig: gdPtr -> true originals (saved first time we see a GunData address).
-- Validation: skip GunDatas where shotCooldown or maxAmmo look invalid/garbage.
_MTD_rfCls = cls
_MTD_rfDmg = dmgVal
_MTD_rfOrig = {}
local seen = {}
for i = 1, #instances do
local base = getAddress(instances[i])
local gdPtr = readPointer(base + 56)
if gdPtr and gdPtr > 0x10000 and not seen[gdPtr] then
seen[gdPtr] = true
local cd = readFloat(gdPtr + 92)
local am = readInteger(gdPtr + 96)
if cd and cd >= 0.05 and cd <= 5.0 and am and am >= 1 and am <= 50 then
_MTD_rfOrig[gdPtr] = { cooldown=cd, maxAmmo=am, reload=readFloat(gdPtr+100), dmg=readFloat(gdPtr+88) }
writeFloat(gdPtr + 92, 0.01)
writeInteger(gdPtr + 96, 9999)
writeFloat(gdPtr + 100, 0.001)
writeFloat(gdPtr + 88, dmgVal)
end
end
end
_MTD_rfTimer = createTimer(nil, false)
_MTD_rfTimer.Interval = 500
_MTD_rfTimer.OnTimer = function()
if not MTD_inRun() then return end
if not _MTD_rfCls then return end
local insts = mono_class_findInstancesOfClassListOnly("", _MTD_rfCls)
if not insts then return end
local seen2 = {}
for i = 1, #insts do
local base = getAddress(insts[i])
local gdPtr = readPointer(base + 56)
if gdPtr and gdPtr > 0x10000 and not seen2[gdPtr] then
seen2[gdPtr] = true
if not _MTD_rfOrig[gdPtr] then
local cd = readFloat(gdPtr + 92)
local am = readInteger(gdPtr + 96)
if cd and cd >= 0.05 and cd <= 5.0 and am and am >= 1 and am <= 50 then
_MTD_rfOrig[gdPtr] = { cooldown=cd, maxAmmo=am, reload=readFloat(gdPtr+100), dmg=readFloat(gdPtr+88) }
else
seen2[gdPtr] = nil -- allow retry next tick if still invalid
end
end
if _MTD_rfOrig[gdPtr] then
writeFloat(gdPtr + 92, 0.01)
writeInteger(gdPtr + 96, 9999)
writeFloat(gdPtr + 100, 0.001)
writeFloat(gdPtr + 88, _MTD_rfDmg or 9999)
end
end
end
end
_MTD_rfTimer.Enabled = true
MainForm.Caption = "MinutesTillDawn Trainer [RAPID FIRE DMG=" .. dmgVal .. "]"
[DISABLE]
if _MTD_rfTimer then _MTD_rfTimer.destroy() _MTD_rfTimer = nil end
if _MTD_rfOrig then
for gdPtr, orig in pairs(_MTD_rfOrig) do
writeFloat(gdPtr + 92, orig.cooldown)
writeInteger(gdPtr + 96, orig.maxAmmo)
writeFloat(gdPtr + 100, orig.reload)
writeFloat(gdPtr + 88, orig.dmg)
end
_MTD_rfOrig = nil
end
_MTD_rfCls = nil
_MTD_rfDmg = nil
MainForm.Caption = "MinutesTillDawn Trainer"
7
[ F11 ] One-Hit Enemies
0000FF
Auto Assembler Script
Toggle
122
Activate
Deactivate
{$LUA}
if syntaxcheck then return end
[ENABLE]
if not MTD_initMono() then return end
-- Class may be nil if enabled from menu; timer re-discovers on run start.
local function applyOneHit(insts)
if not insts then return end
for i = 1, #insts do
local base = getAddress(insts[i])
local hp = readInteger(base + 84)
if hp and hp > 1 then writeInteger(base + 84, 1) end
end
end
_MTD_hkCls = mono_findClass("", "Health")
_MTD_hkInsts = _MTD_hkCls and mono_class_findInstancesOfClassListOnly("", _MTD_hkCls) or nil
_MTD_hkTick = 0
applyOneHit(_MTD_hkInsts)
_MTD_hkTimer = createTimer(nil, false)
_MTD_hkTimer.Interval = 1000
_MTD_hkTimer.OnTimer = function()
if not MTD_inRun() then _MTD_hkInsts = nil return end
_MTD_hkTick = (_MTD_hkTick or 0) + 1
if _MTD_hkTick % 5 == 0 then
if not _MTD_hkCls then _MTD_hkCls = mono_findClass("", "Health") end
if _MTD_hkCls then _MTD_hkInsts = mono_class_findInstancesOfClassListOnly("", _MTD_hkCls) end
end
applyOneHit(_MTD_hkInsts)
end
_MTD_hkTimer.Enabled = true
MainForm.Caption = "MinutesTillDawn Trainer [ONE-HIT ENEMIES ON]"
[DISABLE]
if _MTD_hkTimer then _MTD_hkTimer.destroy() _MTD_hkTimer = nil end
_MTD_hkCls = nil
_MTD_hkInsts = nil
_MTD_hkTick = nil
MainForm.Caption = "MinutesTillDawn Trainer"
998
=========================================================================
404040
1
8
[ F12 ] Disable All Cheats
808080
Auto Assembler Script
Toggle
123
Deactivate
{$LUA}
if syntaxcheck then return end
[ENABLE]
local al = getAddressList()
for i = 0, al.Count - 1 do
local mr = al.getMemoryRecord(i)
pcall(function()
if mr and not mr.isGroupHeader then mr.Active = false end
end)
end
MainForm.Caption = "MinutesTillDawn Trainer [ALL CHEATS OFF]"
[DISABLE]
--[[ MinutesTillDawn Trainer v1.7.1 by TINT
Usage:
F5 / check "Unlimited Souls" -- freeze souls at 99999999
F6 / check "Freeze Hearts" -- freeze hearts at current max (works mid-run)
F7 / check "Freeze Timer" -- freeze timer at the value it has when activated
F8 / check "Set Timer to X" -- prompt for seconds, freeze at that value
F9 / check "Speed Boost (configurable)" -- prompt for multiplier (default 4x), works diagonally
F10 / check "Rapid Fire + Boost Damage" -- prompt for damage (default 9999); rapid fire + max ammo
F11 / check "One-Hit Enemies" -- write HP=1 to all live enemies every second (incl. trees)
F12 / check "Disable All Cheats" -- panic key: disables every active cheat at once
F2 / check "Ammo Lock" -- sets infiniteAmmo flag + locks amount at custom/max value (100ms)
F3 / check "Max Pickup Range" -- StatMod[17]._multiplierBonus = 99999x (locked 500ms)
F4 / check "Soul Vacuum" -- teleports all non-pooled drops to player + adds souls direct
Table features:
- Auto-attaches to MinutesTillDawn.exe on load; polls every 2s if game not running.
- Auto-disables all active cheats when the game process exits.
- MTD_inRun() gates all timers: timers idle safely in menu/between runs, resume on run start.
- All cheats can be enabled from the menu — they self-arm and activate when a run starts.
- Sound feedback on every hotkey toggle.
- All cheats rescan for new instances on each tick (new runs / character switches work automatically).
Mono field reference:
SaveSystem static +24 -- runtime souls counter
PlayerHealth._hp +148 -- current HP | _maxHP +144
GameTimer backing field +32 -- run timer (float)
PlayerController.movementSpeed +208 -- base speed scalar
GunData.shotCooldown +92 damage +88 maxAmmo +96 reloadDuration +100
Health HP +84 -- enemy HP
StatsHolder (via PC->stats @80) -- small floats 0.3-6.0 include pickup range
Pickup native+48 -> ptr48+96/+100/+104 -- transform x/y/z (vacuum teleport target)
Ammo.infiniteAmmo @64 (bool) <amount>k__BackingField @72 (int) .gun @24
GunData.maxAmmo @96 .gun via Gun.gunData @56
SaveData.points @72 -- between-run souls (serialized copy; use static+24 for live)
]]
-- ── Mono init guard ─────────────────────────────────────────────────────────
-- Call at the top of every cheat ENABLE. Returns false (and updates caption)
-- if the game is not running, so cheats auto-saved as Active=1 don't error.
function MTD_initMono()
local pid = getProcessIDFromProcessName("MinutesTillDawn.exe")
if not pid or pid == 0 then
MainForm.Caption = "MinutesTillDawn Trainer [start the game first]"
return false
end
openProcess(pid)
if LaunchMonoDataCollector() == 0 then
MainForm.Caption = "MinutesTillDawn Trainer [Mono init failed]"
return false
end
return true
end
-- ── Auto-attach watchdog ─────────────────────────────────────────────────────
-- Polls every 2s for MinutesTillDawn.exe. Attaches when found.
-- On game close: disables all active cheats and resets to "waiting" state.
local _MTD_attached = false
local _MTD_pid = 0 -- PID we are currently attached to
_MTD_pcStaticAddr = nil -- PlayerController.Instance static ptr; nil = not yet found
-- Returns true only when a run is active (PC.Instance != null).
-- Lazy-inits _MTD_pcStaticAddr once per process attach via Mono reflection.
-- Timers call this to skip writes while in menu / between runs.
function MTD_inRun()
if not _MTD_pcStaticAddr then
local ok, cls = pcall(mono_findClass, "Assembly-CSharp", "PlayerController")
if not ok or not cls or cls == 0 then
ok, cls = pcall(mono_findClass, "", "PlayerController")
end
if not ok or not cls or cls == 0 then return false end
local ok2, fields = pcall(mono_class_enumFields, cls)
if not ok2 or not fields then return false end
for i = 1, #fields do
if fields[i].name == "Instance" and fields[i].staticAddress then
_MTD_pcStaticAddr = fields[i].staticAddress
break
end
end
if not _MTD_pcStaticAddr then return false end
end
local ok, ptr = pcall(readPointer, _MTD_pcStaticAddr)
return ok and ptr ~= nil and ptr ~= 0
end
local function MTD_disableAll()
local al = getAddressList()
for i = 0, al.Count - 1 do
local mr = al.getMemoryRecord(i)
pcall(function()
if mr and not mr.isGroupHeader then mr.Active = false end
end)
end
_MTD_pcStaticAddr = nil -- force re-init on next process attach
end
local _MTD_watchTimer = createTimer(nil, false)
_MTD_watchTimer.Interval = 2000
_MTD_watchTimer.OnTimer = function()
local pid = getProcessIDFromProcessName("MinutesTillDawn.exe")
if pid and pid ~= 0 then
-- Re-attach if: first time, or the instance we were on exited and a new one took over
if not _MTD_attached or _MTD_pid ~= pid then
if _MTD_attached then MTD_disableAll() end -- clean up stale cheats before switching
openProcess(pid)
_MTD_attached = true
_MTD_pid = pid
MainForm.Caption = "MinutesTillDawn Trainer [ATTACHED pid=" .. pid .. "]"
end
else
if _MTD_attached then
MTD_disableAll()
_MTD_attached = false
_MTD_pid = 0
MainForm.Caption = "MinutesTillDawn Trainer [WAITING FOR GAME...]"
end
end
end
_MTD_watchTimer.Enabled = true
-- Try immediately on load
local _pid0 = getProcessIDFromProcessName("MinutesTillDawn.exe")
if _pid0 and _pid0 ~= 0 then
openProcess(_pid0)
_MTD_attached = true
_MTD_pid = _pid0
MainForm.Caption = "MinutesTillDawn Trainer [ATTACHED pid=" .. _pid0 .. "]"
else
MainForm.Caption = "MinutesTillDawn Trainer [WAITING FOR GAME...]"
end