Cheat Engine Forum Index Cheat Engine
The Official Site of Cheat Engine
 
 FAQFAQ   SearchSearch   MemberlistMemberlist   UsergroupsUsergroups   RegisterRegister 
 ProfileProfile   Log in to check your private messagesLog in to check your private messages   Log inLog in 


how can i modify all except 1 using shared opcode?

 
Post new topic   Reply to topic    Cheat Engine Forum Index -> Cheat Engine Lua Scripting
View previous topic :: View next topic  
Author Message
mordax
Expert Cheater
Reputation: 1

Joined: 16 Apr 2010
Posts: 138

PostPosted: Sat Sep 21, 2024 8:10 am    Post subject: how can i modify all except 1 using shared opcode? Reply with quote

Hiya, can someone please help with lua. i have tried chatGPT, but it can't seem to get it to work. it's rather simple thing, but i don't know how to write lua from head.

i understand the code once i see it, but i can't figure out where issue is.
i basically want to do 1 hit kills, but it doesn't seem to be working.

so there is shared opcode that changes health for player + npcs
i already have asm script to filter out player. my method is to set a flag for first found address as that's always player, then rest are NPCs. its been working consistently so far.
without exposing too much about the game, here is part of my asm script that works for filtering out player.

Code:

newmem:

  cmp byte [capture_flag], 1
  je check_if_player

  mov byte [capture_flag], 1 
  mov rax, _health1
  mov [rax], rcx           

check_if_player:
  mov rax, _health1
  cmp rcx, [rax]           
  je skip_npc_update           


skip_npc_update:
  mov eax, [rcx+000000AA]   
  jmp return

findphealthcmp:
  jmp newmem
  nop
return:


i then add custom address into cheat list which is "_health1" and this is player health. it displays it fine and i can modify it.
but i'm having hard time writing lua that would modify all NPC healths to randomly low numbers, not just 1 or 0, but something like between 1 and 10.
i can easily modify this to set all NPC health to 0 or 1, but i want to be more creative and set it to randomly low value. i have consulted with chatGPT and it confirmed it can only be done via lua, but it fails to give me working script.

can someone please give me working example on how to do such thing via lua?
my opcode is "breakpoint on read", it doesn't write values, just reads.
by using that opcode, i can set all NPC health to specific value via assembly script, but for randomly generated values i need to use lua and i can't get it to work.

can someone please help with this part? working sample would be enough. part that would use the opcode to modify all other addresses except the player.

i hope this is clear enough on what i'm trying to do. Thanks.
Back to top
View user's profile Send private message
Bloodybone
Newbie cheater
Reputation: 0

Joined: 07 Dec 2016
Posts: 21
Location: Germany

PostPosted: Sat Sep 21, 2024 9:49 am    Post subject: Reply with quote

I would actually use assembly instead of lua because if you want to use lua you would either have to cache all of the npcs addresses or call lua from assembly with for example a {$luacode} block. I would do something like this instead:

Code:
//...
label(minValue)
label(maxValue)
label(randomSeed)
label(npcend)

newmem:

  cmp byte [capture_flag], 1
  je check_if_player

  mov byte [capture_flag], 1
  mov rax, _health1
  mov [rax], rcx           

check_if_player:
  mov rax, _health1
  cmp rcx, [rax]           
  je skip_npc_update           

  // Save Registers, align Stack ...
  push rbx
  push rcx
  push rdx
  push r8
  push r9
  push r10
  push r11
  push rbp
  mov rbp,rsp
  and spl,F0
  sub rsp,20
  mov rbx,rcx
  mov eax, [rbx+000000AA]
  cmp eax,[maxValue] // Check if npc health is already below max
  jle npcend
  // Create Random Number
  cmp dword ptr [randomSeed],0
  jne short @f
    // Create Seed
    call ntdll.NtGetTickCount
    mov [randomSeed],eax
  @@:
  lea rcx,[randomSeed]
  call ntdll.RtlRandomEx
  xor rdx,rdx
  mov ecx,[maxValue]
  inc ecx // make maxValue inclusive
  sub ecx,[minValue]
  div ecx
  add edx,[minValue]
  mov [rbx+000000AA],edx
  npcend:
  mov rsp,rbp
  pop rbp
  pop r11
  pop r10
  pop r9
  pop r8
  pop rdx
  pop rcx
  pop rbx

skip_npc_update:
  mov eax, [rcx+000000AA]   
  jmp return

minValue:
dd 0

maxValue:
dd #10

randomSeed:
dd 0

findphealthcmp:
  jmp newmem
  nop
return:


This code is assuming that health is an integer not float
If you want to add minValue and maxValue to the table, register them with registersymbol()
Back to top
View user's profile Send private message
mordax
Expert Cheater
Reputation: 1

Joined: 16 Apr 2010
Posts: 138

PostPosted: Sat Sep 21, 2024 10:06 am    Post subject: Reply with quote

Bloodybone wrote:
I would actually use assembly instead of lua because if you want to use lua you would either have to cache all of the npcs addresses or call lua from assembly with for example a {$luacode} block. I would do something like this instead:

Code:
//...
label(minValue)
label(maxValue)
label(randomSeed)
label(npcend)

newmem:

  cmp byte [capture_flag], 1
  je check_if_player

  mov byte [capture_flag], 1
  mov rax, _health1
  mov [rax], rcx           

check_if_player:
  mov rax, _health1
  cmp rcx, [rax]           
  je skip_npc_update           

  // Save Registers, align Stack ...
  push rbx
  push rcx
  push rdx
  push r8
  push r9
  push r10
  push r11
  push rbp
  mov rbp,rsp
  and spl,F0
  sub rsp,20
  mov rbx,rcx
  mov eax, [rbx+000000AA]
  cmp eax,[maxValue] // Check if npc health is already below max
  jle npcend
  // Create Random Number
  cmp dword ptr [randomSeed],0
  jne short @f
    // Create Seed
    call ntdll.NtGetTickCount
    mov [randomSeed],eax
  @@:
  lea rcx,[randomSeed]
  call ntdll.RtlRandomEx
  xor rdx,rdx
  mov ecx,[maxValue]
  inc ecx // make maxValue inclusive
  sub ecx,[minValue]
  div ecx
  add edx,[minValue]
  mov [rbx+000000AA],edx
  npcend:
  mov rsp,rbp
  pop rbp
  pop r11
  pop r10
  pop r9
  pop r8
  pop rdx
  pop rcx
  pop rbx

skip_npc_update:
  mov eax, [rcx+000000AA]   
  jmp return

minValue:
dd 0

maxValue:
dd #10

randomSeed:
dd 0

findphealthcmp:
  jmp newmem
  nop
return:


This code is assuming that health is a integer not float
If you want to add minValue and maxValue to the table, register them with registersymbol()


thanks, but i think i got it working via lua. problem with asm is that it kept crashing my game and my lua isn't that good. i don't know every syntax and chatgpt sometimes just gets stuck in loop and don't know how to fix it. if i just say "this crashed game" it can't seem to realize what part crashes the game.

now i just have issues that lua needs to execute AFTER asm is enabled, which is bit of an issue as it keeps spamming in the output field that something is invalid (since asm is not enabled). trying to solve that part right now with custom trigger to make lua inactive.

i will try the asm method at some point, since it seems easier and i can toggle it off.
Back to top
View user's profile Send private message
Display posts from previous:   
Post new topic   Reply to topic    Cheat Engine Forum Index -> Cheat Engine Lua Scripting All times are GMT - 6 Hours
Page 1 of 1

 
Jump to:  
You cannot post new topics in this forum
You cannot reply to topics in this forum
You cannot edit your posts in this forum
You cannot delete your posts in this forum
You cannot vote in polls in this forum
You cannot attach files in this forum
You can download files in this forum


Powered by phpBB © 2001, 2005 phpBB Group

CE Wiki   IRC (#CEF)   Twitter
Third party websites