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 


Defining 3-Byte Little Endian Custom Type

 
Post new topic   Reply to topic    Cheat Engine Forum Index -> Cheat Engine
View previous topic :: View next topic  
Author Message
Birdi
Expert Cheater
Reputation: 0

Joined: 08 Jun 2020
Posts: 124
Location: Migrating

PostPosted: Sun Sep 14, 2025 8:19 pm    Post subject: Defining 3-Byte Little Endian Custom Type Reply with quote

CE7.5

I've got an issue where in memory data is stored as 3 byte little endian for a set of counters.
Most of these are fine as 2 bytes, but one is meant to count up to 1,000,000.
Each 4th byte's tag ends as Hex 40, then the next counter is stored.

I've tried a few approaches in the Cheat Table Lua Script to autoload the Custom Type but it always displays as 0 for the value.
Am I missing something in this?

Code:

do
  local function register3byte(name)
    local function reader(address)
      local ok, b = pcall(readBytes, address, 4, true)
      if not ok or not b or #b < 3 then return 0 end
      local b0 = b[1] or 0
      local b1 = b[2] or 0
      local b2 = b[3] or 0
      return b0 + b1*256 + b2*65536
    end
    local function writer(address, value)
      local v = tonumber(value) or 0
      if v < 0 then v = 0 end
      if v > 0xFFFFFF then v = 0xFFFFFF end
      local ok, t = pcall(readBytes, address+3, 1, true)
      local tag = (ok and t and t[1]) and t[1] or 0x40
      local b0 = v % 256
      local b1 = math.floor(v/256)   % 256
      local b2 = math.floor(v/65536) % 256
      pcall(writeBytes, address, b0, b1, b2, tag)
    end
    local ok, err = pcall(registerCustomTypeLua, name, 4, reader, writer)
  end
  register3byte("3 Bytes")
end


Example:
00 01 0F 40 = 4byte: 1074725120, 2byte: 256, In-Game: 983296, CE: 0

_________________
Trying to learn!

Add me on Discord if you want hands-on help:
Birdi.
Back to top
View user's profile Send private message Visit poster's website
Dark Byte
Site Admin
Reputation: 470

Joined: 09 May 2003
Posts: 25781
Location: The netherlands

PostPosted: Mon Sep 15, 2025 5:53 am    Post subject: Reply with quote

Don't use address. bytes come first

Code:

do
  local function register3byte(name)
    local function reader(b0,b1,b2)
      return b0 + b1*256 + b2*65536
    end
    local function writer(value)
      local r=dwordToByteTable(value)
      r[4]=nil
      return r
    end
    local ok, err = pcall(registerCustomTypeLua, name, 3, reader, writer)
  end
  register3byte("3 Bytes")
end

_________________
Do not ask me about online cheats. I don't know any and wont help finding them.

Like my help? Join me on Patreon so i can keep helping
Back to top
View user's profile Send private message MSN Messenger
AylinCE
Grandmaster Cheater Supreme
Reputation: 37

Joined: 16 Feb 2017
Posts: 1516

PostPosted: Mon Sep 15, 2025 2:34 pm    Post subject: Reply with quote

My opinion;

Code:
do
  local function register3byte(name)
    local function reader(address)
      local ok, b = pcall(readBytes, address, 3, true)
      if not ok or not b or #b < 3 then return 0 end
      local b0 = b[1] or 0
      local b1 = b[2] or 0
      local b2 = b[3] or 0
      return b0 + b1*256 + b2*65536
    end
   
    local function writer(address, value)
      local v = tonumber(value) or 0
      if v < 0 then v = 0 end
      if v > 0xFFFFFF then v = 0xFFFFFF end
      local b0 = v % 256
      local b1 = math.floor(v/256)    % 256
      local b2 = math.floor(v/65536) % 256
      pcall(writeBytes, address, b0, b1, b2)
    end
   
    local ok, err = pcall(registerCustomTypeLua, name, 3, reader, writer)
    if not ok then
      showMessage("Failed to register 3 Bytes custom type: " .. err)
    end
  end
 
  register3byte("3 Bytes")
end

_________________
Hi Hitler Different Trainer forms for you!
https://forum.cheatengine.org/viewtopic.php?t=619279
Enthusiastic people: Always one step ahead
Do not underestimate me Master: You were a beginner in the past
Back to top
View user's profile Send private message Visit poster's website MSN Messenger
Dark Byte
Site Admin
Reputation: 470

Joined: 09 May 2003
Posts: 25781
Location: The netherlands

PostPosted: Mon Sep 15, 2025 3:15 pm    Post subject: Reply with quote

as I mentioned in the previous post, the first parameter is not the address, so this will fail
_________________
Do not ask me about online cheats. I don't know any and wont help finding them.

Like my help? Join me on Patreon so i can keep helping
Back to top
View user's profile Send private message MSN Messenger
Birdi
Expert Cheater
Reputation: 0

Joined: 08 Jun 2020
Posts: 124
Location: Migrating

PostPosted: Mon Sep 15, 2025 5:33 pm    Post subject: Reply with quote

Dark Byte wrote:
Don't use address. bytes come first

Code:

do
  local function register3byte(name)
    local function reader(b0,b1,b2)
      return b0 + b1*256 + b2*65536
    end
    local function writer(value)
      local r=dwordToByteTable(value)
      r[4]=nil
      return r
    end
    local ok, err = pcall(registerCustomTypeLua, name, 3, reader, writer)
  end
  register3byte("3 Bytes")
end


Many thanks, worked perfectly!

For the Writer section, setting the 4th Byte to Nil seems odd to me.
I see in practice it just ignores that one when writing, but my brain tells me it should be "nothing" -- is it that it writes until the end of table or until Nil is met? Just for future cases, should I need to ignore n and m bytes in an array for some reason (probably just easier to do offset +n secondary write tbh)
Edit: Well, rereading the documentation and implementation here I see that bytecount should've been the intended number of bytes and not the size.

_________________
Trying to learn!

Add me on Discord if you want hands-on help:
Birdi.
Back to top
View user's profile Send private message Visit poster's website
Csimbi
I post too much
Reputation: 97

Joined: 14 Jul 2007
Posts: 3321

PostPosted: Tue Sep 16, 2025 1:23 pm    Post subject: Reply with quote

Birdi wrote:

For the Writer section, setting the 4th Byte to Nil seems odd to me.

You do need the last octet of the DWORD to be ignored.
(it will always be 0x40 and so, you are not writing that octet)
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 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