Need help with Metro 2033 Redux

issues trying to mod max ammo cap

A dedicated forum for support, assistance, and quick help on using Cheat Engine usage.


Post Reply
dylanwade1997
Curious
Curious
Posts: 1
Joined: Wed Jul 15, 2026 10:50 pm
Answers: 0

Need help with Metro 2033 Redux

Post by dylanwade1997 »

so to preface this, I have never used cheat engine prior to trying to do this nor have i ever coded or done anything slightly related to what I'm trying to do.
I've tried several cheat tables that have options to increase ammo cap but they don't work, at least not for me. So with the guidance of chat gpt i spent 24 hours trying to teach myself how this all works to fix the issue. Now I'm 48 hours in and it's just been wall after wall. I could just turn on unlimited ammo but i'm stubborn and don't want to break the game loop of looting supplies, i don't want any other mod, other than to simply remove the silly cap on ammo(I mean come on 180 rounds?? in a world overrun by mutants?? I carry more than that when walking my dog! I would FIND somewhere to stuff those extra rounds!)

I think my issue is that the tables I've used are out of date maybe? But idk because I'm a complete noob at this. ChatGPT has me on a seemingly neverending quest to find what controls the ammo cap. This is kind of my last resort, hoping that someone out there may know better than me how to resolve this or have some experience modding this game (from what I've read the metro series seems harder than typical to figure out?) Anyway, any guidance/help at all is so very appreciated!

Edit: I'm using cheat engine 7.7 and the game version is current.


Tags:

User avatar
VampTY
Curious
Curious
Posts: 7
Joined: Sun Mar 15, 2026 1:54 am
Answers: 0
Location: Notinyourbed
x 25

Re: Need help with Metro 2033 Redux

Post by VampTY »

dylanwade1997 wrote: Wed Jul 15, 2026 11:08 pm

...

My table, working for Metro 2033 Redux and Metro։ Last Light Redux, two in one, i've added what i've used only., tested with CE 7.7.Table is kinda old, though it still works.It's for STEAM.
Image

Just paste all into your CE

Code: Select all

<?xml version="1.0" encoding="utf-8"?>
<CheatTable>
  <CheatEntries>
    <CheatEntry>
      <ID>32</ID>
      <Description>"Metro 2033 Redux Ⓜ Metro։ Last Light Redux"</Description>
      <Options moDeactivateChildrenAsWell="1"/>
      <LastState/>
      <Color>6B6B6B</Color>
      <VariableType>Auto Assembler Script</VariableType>
      <AssemblerScript>[ENABLE]
{$lua}
OpenProcess("metro.exe")
{$asm}
LuaCall(function cycleFullCompact(sender,force) local state = not(compactmenuitem.Caption == 'View Mode'); if force~=nil then state = not force end; compactmenuitem.Caption = state and 'Metro 2033 Redux Ⓜ Metro։ Last Light Redux' or 'Metro 2033 Redux Ⓜ Metro։ Last Light Redux'; getMainForm().Splitter1.Visible = state; getMainForm().Panel4.Visible    = state; getMainForm().Panel5.Visible    = state; end; function addCompactMenu() if compactmenualreadyexists then return end; local parent = getMainForm().Menu.Items; compactmenuitem = createMenuItem(parent); parent.add(compactmenuitem); compactmenuitem.Caption = 'View Mode'; compactmenuitem.OnClick = cycleFullCompact; compactmenualreadyexists = 'yes'; end; addCompactMenu(); cycleFullCompact(nil,true))
[DISABLE]
LuaCall(cycleFullCompact(nil,false))
</AssemblerScript>
      <CheatEntries>
        <CheatEntry>
          <ID>196</ID>
          <Description>"-----------/New Missions   [Developer Pack]   Shooting Range   [Score]"</Description>
          <LastState/>
          <Color>FF8080</Color>
          <VariableType>Auto Assembler Script</VariableType>
          <AssemblerScript>[ENABLE]
aobscanmodule(Player.Data_Score,$process,88 51 50 B8 01 00 00 00)
alloc(newmem,$1000,Player.Data_Score)
label(code return)
registersymbol(Player.Data_Score)
newmem:
  cmp [rcx+2c],0
  jne code
  mov [rcx+50],(int)24
  mov eax,1
  jmp return
code:
  mov [rcx+50],dl
  mov eax,1
  jmp return
Player.Data_Score:
  jmp newmem
  nop 3
return:
[DISABLE]
dealloc(newmem)
unregistersymbol(Player.Data_Score)
Player.Data_Score:
  db 88 51 50 B8 01 00 00 00
</AssemblerScript>
        </CheatEntry>
        <CheatEntry>
          <ID>185</ID>
          <Description>"Campaign/New Missions   [Durability]   FlashLight"</Description>
          <LastState/>
          <Color>004000</Color>
          <VariableType>Auto Assembler Script</VariableType>
          <AssemblerScript>[ENABLE]
aobscanmodule(Player.Use_Durability_Flashlight,$process,F3 0F 11 81 80 04 00 00)
alloc(newmem,$1000,Player.Use_Durability_Flashlight)
label(return)
registersymbol(Player.Use_Durability_Flashlight)
newmem:
  movss [rcx+480],xmm0
  mov [rcx+480],(float)1
  jmp return
Player.Use_Durability_Flashlight:
  jmp newmem
  nop 3
return:
[DISABLE]
dealloc(newmem)
unregistersymbol(Player.Use_Durability_Flashlight)
Player.Use_Durability_Flashlight:
  db F3 0F 11 81 80 04 00 00
</AssemblerScript>
        </CheatEntry>
        <CheatEntry>
          <ID>40</ID>
          <Description>"Campaign/New Missions   [Endurance]   Health"</Description>
          <LastState/>
          <Color>0000FF</Color>
          <VariableType>Auto Assembler Script</VariableType>
          <AssemblerScript>[ENABLE]
aobscanmodule(Player_Health,$process,0F 2F 80 08 03 00 00 0F 83 57)
alloc(newmem,$1000,Player_Health)
label(return)
registersymbol(Player_Health)
newmem:
  comiss xmm0,[rax+308]
  or byte ptr [rax+712],40
  jmp return
Player_Health:
  jmp newmem
  nop 2
return:
[DISABLE]
dealloc(newmem)
unregistersymbol(Player_Health)
Player_Health:
  db 0F 2F 80 08 03 00 00
</AssemblerScript>
        </CheatEntry>
        <CheatEntry>
          <ID>192</ID>
          <Description>"Campaign/New Missions   [Inventory]   Bullets/Claymore Mines/Fuel/Hand Grenades/Incendiary Grenades/Military-Grade Bullets/Sticky Grenades/Throwing Knives"</Description>
          <LastState/>
          <Color>800000</Color>
          <VariableType>Auto Assembler Script</VariableType>
          <AssemblerScript>[ENABLE]
aobscanmodule(Player.Use_Ammo_Mix_Type_W,$process,89 91 F4 04 00 00)
aobscanmodule(Player.Use_Ammo_Mix_Type_X,$process,89 91 8C 01 00 00)
aobscanmodule(Player.Use_Ammo_Mix_Type_Y,$process,89 81 CC 00 00 00 E9)
aobscanmodule(Player.Use_Ammo_Mix_Type_Z,$process,89 91 EC 06 00 00)
alloc(newmem_w,$1000,Player.Use_Ammo_Mix_Type_W)
alloc(newmem_x,$1000,Player.Use_Ammo_Mix_Type_X)
alloc(newmem_y,$1000,Player.Use_Ammo_Mix_Type_Y)
alloc(newmem_z,$1000,Player.Use_Ammo_Mix_Type_Z)
label(code_w code_x code_y code_z return_w return_x return_y return_z)
registersymbol(Player.Use_Ammo_Mix_Type_W Player.Use_Ammo_Mix_Type_X Player.Use_Ammo_Mix_Type_Y Player.Use_Ammo_Mix_Type_Z)
newmem_w:
  mov [rcx+4f4],(int)999
  jmp return_w
code_w:
  mov [rcx+4f4],edx
  jmp return_w
Player.Use_Ammo_Mix_Type_W:
  jmp newmem_w
  nop
return_w:
newmem_x:
  mov [rcx+18c],(int)999
  jmp return_x
code_x:
  mov [rcx+18c],edx
  jmp return_x
Player.Use_Ammo_Mix_Type_X:
  jmp newmem_x
  nop
return_x:
newmem_y:
  mov [rcx+cc],(int)5
  jmp return_y
code_y:
  mov [rcx+cc],eax
  jmp return_y
Player.Use_Ammo_Mix_Type_Y:
  jmp newmem_y
  nop
return_y:
newmem_z:
  mov [rcx+6ec],(int)5
  jmp return_z
code_z:
  mov [rcx+6ec],edx
  jmp return_z
Player.Use_Ammo_Mix_Type_Z:
  jmp newmem_z
  nop
return_z:
[DISABLE]
dealloc(*)
unregistersymbol(*)
Player.Use_Ammo_Mix_Type_W:
  db 89 91 F4 04 00 00
Player.Use_Ammo_Mix_Type_X:
  db 89 91 8C 01 00 00
Player.Use_Ammo_Mix_Type_Y:
  db 89 81 CC 00 00 00
Player.Use_Ammo_Mix_Type_Z:
  db 89 91 EC 06 00 00
</AssemblerScript>
        </CheatEntry>
        <CheatEntry>
          <ID>186</ID>
          <Description>"Campaign/New Missions   [Overheat]   Bastard/DShk 12.7mm HMG/Flamethrower/Hellbreath/Helsing/Tikhar"</Description>
          <LastState/>
          <Color>800080</Color>
          <VariableType>Auto Assembler Script</VariableType>
          <AssemblerScript>[ENABLE]
aobscanmodule(Player.Use_Weapon_Ability_Overheat_Type_W,$process,F3 0F 11 83 B0 0C 00 00 48 8D)
aobscanmodule(Player.Use_Weapon_Ability_Overheat_Type_X,$process,F3 0F 11 86 D0 06 00 00)
aobscanmodule(Player.Use_Weapon_Ability_Overheat_Type_Y,$process,F3 0F 11 8B F0 0B 00 00 73)
aobscanmodule(Player.Use_Weapon_Ability_Overheat_Type_Z,$process,F3 0F 11 83 14 07 00 00)
alloc(newmem_w,$1000,Player.Use_Weapon_Ability_Overheat_Type_W)
alloc(newmem_x,$1000,Player.Use_Weapon_Ability_Overheat_Type_X)
alloc(newmem_y,$1000,Player.Use_Weapon_Ability_Overheat_Type_Y)
alloc(newmem_z,$1000,Player.Use_Weapon_Ability_Overheat_Type_Z)
label(return_w return_x return_y return_z)
registersymbol(Player.Use_Weapon_Ability_Overheat_Type_W Player.Use_Weapon_Ability_Overheat_Type_X Player.Use_Weapon_Ability_Overheat_Type_Y Player.Use_Weapon_Ability_Overheat_Type_Z)
newmem_w:
  movss [rbx+cb0],xmm0
  mov [rbx+cb0],(float)0
  jmp return_w
Player.Use_Weapon_Ability_Overheat_Type_W:
  jmp newmem_w
  nop 3
return_w:
newmem_x:
  movss [rsi+6d0],xmm0
  mov [rsi+6d0],(float)0
  jmp return_x
Player.Use_Weapon_Ability_Overheat_Type_X:
  jmp newmem_x
  nop 3
return_x:
newmem_y:
  movss [rbx+bf0],xmm1
  mov [rbx+bf0],(float)12
  jmp return_y
Player.Use_Weapon_Ability_Overheat_Type_Y:
  jmp newmem_y
  nop 3
return_y:
newmem_z:
  movss [rbx+714],xmm0
  mov [rbx+714],(float)10
  jmp return_z
Player.Use_Weapon_Ability_Overheat_Type_Z:
  jmp newmem_z
  nop 3
return_z:
[DISABLE]
dealloc(*)
unregistersymbol(*)
Player.Use_Weapon_Ability_Overheat_Type_W:
  db F3 0F 11 83 B0 0C 00 00
Player.Use_Weapon_Ability_Overheat_Type_X:
  db F3 0F 11 86 D0 06 00 00
Player.Use_Weapon_Ability_Overheat_Type_Y:
  db F3 0F 11 8B F0 0B 00 00
Player.Use_Weapon_Ability_Overheat_Type_Z:
  db F3 0F 11 83 14 07 00 00
</AssemblerScript>
        </CheatEntry>
        <CheatEntry>
          <ID>133</ID>
          <Description>"Campaign/New Missions   [Timer]   Filter   [Reserve/Watch]"</Description>
          <LastState/>
          <Color>804000</Color>
          <VariableType>Auto Assembler Script</VariableType>
          <AssemblerScript>[ENABLE]
aobscanmodule(Player.Use_Durability_Timer_Type_X,$process,C0 0F 5B C0 F3 0F 5C C6 0F 2F C1 72 03 0F 28 C1 F3 0F 5C C8 F3 0F 58 C6)
aobscanmodule(Player.Use_Durability_Timer_Type_Y,$process,F3 0F 11 87 4C 04 00 00 0F)
alloc(newmem,$1000,Player.Use_Durability_Timer_Type_Y)
label(return)
registersymbol(Player.Use_Durability_Timer_Type_X Player.Use_Durability_Timer_Type_Y)
Player.Use_Durability_Timer_Type_X+10:
  db 90 90 90 90
newmem:
  movss [rdi+44c],xmm0
  mov [rdi+44c],(float)5940
  jmp return
Player.Use_Durability_Timer_Type_Y:
  jmp newmem
  nop 3
return:
[DISABLE]
dealloc(*)
unregistersymbol(*)
Player.Use_Durability_Timer_Type_X+10:
  db F3 0F 5C C8 F3 0F 58 C6
Player.Use_Durability_Timer_Type_Y:
  db F3 0F 11 87 4C 04 00 00
</AssemblerScript>
        </CheatEntry>
        <CheatEntry>
          <ID>81</ID>
          <Description>"Campaign/New Missions   [Toughness]   Gas Mask"</Description>
          <LastState/>
          <Color>0065CA</Color>
          <VariableType>Auto Assembler Script</VariableType>
          <AssemblerScript>[ENABLE]
aobscanmodule(Player.Use_Durability_Air,$process,F3 0F 10 B0 08 03 00 00)
alloc(newmem,$1000,Player.Use_Durability_Air)
label(return)
registersymbol(Player.Use_Durability_Air)
newmem:
  movss xmm6,[rax+308]
  mov [rax+308],(float)1
  jmp return
Player.Use_Durability_Air:
  jmp newmem
  nop 3
return:
[DISABLE]
dealloc(newmem)
unregistersymbol(Player.Use_Durability_Air)
Player.Use_Durability_Air:
  db F3 0F 10 B0 08 03 00 00
</AssemblerScript>
        </CheatEntry>
      </CheatEntries>
    </CheatEntry>
  </CheatEntries>
</CheatTable>

Note: The game is designed with anticheats at the end of the game, i have no idea if they've patched it somehow, all i know is that you won't be able to finish some task, that's all i remember, right at the very end, while using cheats.

Take care!


Post Reply