This is really useful! Btw is there a way to check current item id and change it? That way we can change weapons and armor with other weapons and armor if we happen to have their id.
How to use this cheat table?
Install Cheat Engine
Double-click the .CT file in order to open it.
Click the PC icon in Cheat Engine in order to select the game process.
Keep the list.
Activate the trainer options by checking boxes or setting values from 0 to 1
This is really useful! Btw is there a way to check current item id and change it? That way we can change weapons and armor with other weapons and armor if we happen to have their id.
Selected Equipment Info script creates a variable called "bp_select" and writes a pointer to currently selected item into it. You can see that [bp_select]+20, [bp_select]+28 and [bp_select]+30 point to item slots 1-3. You can manually add an address with [bp_select]+14 and it will point to item obtained order. If you manage to find out at which offset item id is located then just add address with [bp_select]+id_offset. Item structure size is hex:38 bytes, which is 56 in decimal. From this you can figure out that item slot pointers are situated at the very end of structure.
Update: I was just playing game as normal and noticed that some attachments ids are different from those listed in my table, even though i manually compiled that list and checked that ids were correct. Seems like either attachments ids are somehow inconsistent, or they are actually some kind of pointers to global array of attachments. In any way i decided to update my original responce to warn you that same thing might happen with items. In case of attachments it is easily revertable by clearing slots and then putting new ones. But in case of items you can easily corrupt an item by changing it's id to the one you think is right, but is actually non-existent for that game session.
This is really useful! Btw is there a way to check current item id and change it? That way we can change weapons and armor with other weapons and armor if we happen to have their id.
Selected Equipment Info script creates a variable called "bp_select" and writes a pointer to currently selected item into it. You can see that [bp_select]+20, [bp_select]+28 and [bp_select]+30 point to item slots 1-3. You can manually add an address with [bp_select]+14 and it will point to item obtained order. If you manage to find out at which offset item id is located then just add address with [bp_select]+id_offset. Item structure size is hex:38 bytes, which is 56 in decimal. From this you can figure out that item slot pointers are situated at the very end of structure.
Update: I was just playing game as normal and noticed that some attachments ids are different from those listed in my table, even though i manually compiled that list and checked that ids were correct. Seems like either attachments ids are somehow inconsistent, or they are actually some kind of pointers to global array of attachments. In any way i decided to update my original responce to warn you that same thing might happen with items. In case of attachments it is easily revertable by clearing slots and then putting new ones. But in case of items you can easily corrupt an item by changing it's id to the one you think is right, but is actually non-existent for that game session.
Sadly ids are inconsistent, either for weapon/armors and attachments, and they seem to vary by a certain amount everytime you load. You can check their current value with my table under attachments section.
ID is located -18(hex) from 1st slot and is 8 bytes long.
-Added "Selected Attachment Info" script. You can examine data of currently viewable attachment.
-Added "Compile Attachments List" script. Automatically creates and updates Dropdown List for attachment names every time you Load a Savegame.
PS: Now if only there was an address where I could get consistent item IDs like with attachments. That way I could modify script to automatically update dropdown list with item names as well. I will try to look into it a bit more myself, but it would be much appreciated if anyone got any useful tips.
@The Black X, you might want either to integrate these scripts into your table (for which i give my permission, if you need it) or edit your original post to include a link to posted table, since as this topic would probably grow, newcomers wouldn't be able to easily find it.
Glad i can merge your table with mine. About the address there are few that seem list-like of ids, but still unsure. Just searching for the id of a relatively low armor/weapon array of byte seem to find some intresting ones.
I'm not sure if game version 1.0.0 is still actual, as i don't have access to newer one. So, here are some guidelines, just in case my table does not work in other versions.
Can Always Buy Skills
When the skill is not buyable it is byte:2, otherwise its byte:0. Thus you can easily find needed address(es) and either do a script or pointer version.
All Equipment Slots (Populate Values / Unlock)
Difference with the table by Mezspirit is that i use a different address to inject. The script successfully accesses items both in hangar and factory menu. I didn't check his table, so maybe his version wokrs in hangar too.
Selected Equipment Info
There seems to be two different versions of item array in game. Main array is the one you already have a pointer to:
[[["DXM-Win64-Shipping.exe"+0432A120]+1F0]+9B0]. This is where you edit values. But when you are viewing items, game creates a "shadow" sorted list. It has same per-item info as main array,however values edited here will give you nothing. On the other hand when you change selection, the cursor position changes accordingly, ie. first item in "shadow" list has index 0, second - 1, etc. I cocated cursor address and found out what instructions accessed it. All instructions accessed an address with +150 offset. By checking the corresponding routines I found out that cursor position was in some way (didnt figure out exact algorithm) trasnlated into obtained order: [item_base_pointer+14]. And then in another routine this value was compared against [item_base_pointer+14] in main array to find the corresponding item. Hope this info helps you.
This is really useful! Btw is there a way to check current item id and change it? That way we can change weapons and armor with other weapons and armor if we happen to have their id.
Selected Equipment Info script creates a variable called "bp_select" and writes a pointer to currently selected item into it. You can see that [bp_select]+20, [bp_select]+28 and [bp_select]+30 point to item slots 1-3. You can manually add an address with [bp_select]+14 and it will point to item obtained order. If you manage to find out at which offset item id is located then just add address with [bp_select]+id_offset. Item structure size is hex:38 bytes, which is 56 in decimal. From this you can figure out that item slot pointers are situated at the very end of structure.
Update: I was just playing game as normal and noticed that some attachments ids are different from those listed in my table, even though i manually compiled that list and checked that ids were correct. Seems like either attachments ids are somehow inconsistent, or they are actually some kind of pointers to global array of attachments. In any way i decided to update my original responce to warn you that same thing might happen with items. In case of attachments it is easily revertable by clearing slots and then putting new ones. But in case of items you can easily corrupt an item by changing it's id to the one you think is right, but is actually non-existent for that game session.
Tested the tables, worked like a charm
but yes, the IDs are annoying in that sometimes they are not consistent, I'm still trying to find the address for the weapons so I can swap some out/off
Also, any chance it is possible to edit the stats of the equipment or equipped armor/weapon directly?
...
Also, any chance it is possible to edit the stats of the equipment or equipped armor/weapon directly?
Most likely, yes. My guess would be to edit gamefiles, since thats where game takes item data from. However I don't have any knowledge about Unreal Engine and how it stores and operates data.
Sidenote: As I finally finished farming all allies, a new round of hell was awaiting me. I suddenly realized that I wanted 4 copies of each weapon and farming or editing manually my invertory was not an option. Hence I wrote a script that basically turns the "leftover" items into the missing ones.
Use it with caution since it may potentially screw your invertory(even though brief testing went well). So make a backup of your savefile beforehand.
Spoiler
{$Lua}
--This script relies on equipment item type(ie. head, body, auxiliary etc.)
--to determine how many copies to allow for each type. However newly obtained items
--regardless of method(ie. picked on battlefield, bought in shop) might have
--"corrupted" item type value. Therefore, before using this script, it is recommended to save and reload
--if you obtained any new items since last savegame load.
function tlength(T)
local count = 0
for _ in pairs(T) do count = count + 1 end
return count
end
function readItem(address)
local item = {}
item.Address = address
item.Pointer = readQword(address)
item.ID = readQword(address+0x8)
item.Type = readInteger(address+0x10)
item.Order = readInteger(address+0x14)
item.IsNew = readBytes(address+0x18,1)
item.Unknown = readBytes(address+0x19,7,true)
item.Slot1 = readQword(address+0x20)
item.Slot2 = readQword(address+0x28)
item.Slot3 = readQword(address+0x30)
item.amount = 1
return item
end
function writeItem(item)
writeQword(item.Address,item.Pointer)
writeQword(item.Address+0x8,item.ID)
writeInteger(item.Address+0x10,item.Type)
writeInteger(item.Address+0x14,item.Order)
writeBytes(item.Address+0x18,item.IsNew)
writeBytes(item.Address+0x19,item.Unknown)
writeQword(item.Address+0x20,item.Slot1)
writeQword(item.Address+0x28,item.Slot2)
writeQword(item.Address+0x30,item.Slot3)
end
function dublicate()
--[[
[[["DXM-Win64-Shipping.exe"+0432A120]+1F0]+9B0]
]]--
local bp_array = readQword(getAddress("DXM-Win64-Shipping.exe")+0x432A120)
bp_array = readQword(bp_array+0x1F0)
local size = readInteger(bp_array+0x9b8)-1
bp_array = readQword(bp_array+0x9b0)
local originals = {}
local dublicates = {}
local first_dublicate = nil
--[[
Allowed amount of dublicates per item category:
0:Head
1:Body
2:Left Arm
3:Right Arm
4:Legs
5:Processor
6:Ranged
7:Melee
8:Shoulder
9:Auxilliary
In this example Ranged and Melee weapons are allowed to have 4 dublicates
while all others allowed to have only 1. You can edit it as you like.
--]]
local amount = {[0]=1,[1]=1,[2]=1,[3]=1,[4]=1,[5]=1,[6]=4,[7]=4,[8]=1,[9]=1}
--Searching for items that may need to be dublicated - "originals" table
--and items that will serve as dublication material - "dublicates" table
for i=0,size do
local bp_item = bp_array+i*0x38
local item = readItem(bp_item) --read item data and present it as structure
--Check if item is already in "originals" table
if originals[item.ID] == nil then
originals[item.ID] = item
else
originals[item.ID].amount = originals[item.ID].amount + 1
--Check if we have enough dublicates of item
if originals[item.ID].amount > amount[item.Type] then
--Candidate for dublication material is detected
--Make any nessesary changes before putting it into list
item.IsNew = 0 --Dublication material candidate will be marked as newly obtained item
--Make it so that all dublication candidates will become the same item
--as the first candidate. Item may change every time the script is executed.
if #dublicates == 0 then first_dublicate = item
else
--item.Order is item obtained order, it is best to leave it as is
--unless you know what you are doing
item.Pointer = first_dublicate.Pointer
item.ID = first_dublicate.ID
item.Type = first_dublicate.Type
item.Unknown = first_dublicate.Unknown
item.Slot1 = first_dublicate.Slot1
item.Slot2 = first_dublicate.Slot2
item.Slot3 = first_dublicate.Slot3
end
--After changes are made, put candidate into list
table.insert(dublicates,item)
end
end
end
--Dublication/Filtration process
for ID,o in pairs(originals) do
::loop::
--If item got the required number of dublicates
if o.amount >= amount[o.Type] then
originals[ID] = nil --erase table entry
goto continue --move to next item in "originals" table
end
--If dublication material table is empty then move on
if #dublicates == 0 then goto continue end
d = table.remove(dublicates) --remove last element from table and get its pointer
--Rewrite dublication material data. d.Order is left intact
d.Pointer = o.Pointer
d.ID = o.ID
d.Type = o.Type
d.IsNew = o.IsNew
d.Unknown = o.Unknown
d.Slot1 = o.Slot1
d.Slot2 = o.Slot2
d.Slot3 = o.Slot3
writeItem(d) --rewrite invertory data
d = nil
o.amount = o.amount + 1
goto loop
::continue::
end
--Prepare and print resulting information
total = 0
for k,v in pairs(originals) do
total = total + (amount[v.Type]-v.amount)
end
format = [[Invertory size: %d
Unique ID's to dublicate: %d
Items amount to dublicate: %d
Leftover items amount: %d
-------------------------------------]]
print(string.format(format,size+1,tlength(originals),total,#dublicates))
end
[ENABLE]
dublicate() --call dublication function upon script activation
[DISABLE]
Is there a means of preventing a defeated Strai from disappearing when you select a drop from it? Or maybe obtaining all of the drops a Strai has, rather than just one of them?
I'm not sure if game version 1.0.0 is still actual, as i don't have access to newer one. So, here are some guidelines, just in case my table does not work in other versions.
Can Always Buy Skills
When the skill is not buyable it is byte:2, otherwise its byte:0. Thus you can easily find needed address(es) and either do a script or pointer version
Seems like this is no longer the case, I assume there was an update recently and now the skills script is giving the error:
"<<Error in line 5(assert("DXM-win64-shipping.exe"+CEF9B2, 80 BA 01 00 00 00 )): The bytes at "DXM-win64-shipping.exe+CEF9B2 are not what was expected"
The same error happened for another user as well as myself, so at least it seems consistent. However, there doesn't really seem to be a way to get the script to function again. If an updated script isn't possible, do you have a tutorial for being able to manually locate the memory region for the lab upgrades themselves and which byte to change? I'm currently not able to find where I need to go to edit.
I see people are still working on this game. Does anybody have a mini-trainer that gives unlimited durability for Blitz Shoulder Weapons? It's the only Shoulder Weapon that actually works based on part durability rather than ammunition.
...
Also, any chance it is possible to edit the stats of the equipment or equipped armor/weapon directly?
Most likely, yes. My guess would be to edit gamefiles, since thats where game takes item data from. However I don't have any knowledge about Unreal Engine and how it stores and operates data.
Sidenote: As I finally finished farming all allies, a new round of hell was awaiting me. I suddenly realized that I wanted 4 copies of each weapon and farming or editing manually my invertory was not an option. Hence I wrote a script that basically turns the "leftover" items into the missing ones.
Use it with caution since it may potentially screw your invertory(even though brief testing went well). So make a backup of your savefile beforehand.
Spoiler
{$Lua}
--This script relies on equipment item type(ie. head, body, auxiliary etc.)
--to determine how many copies to allow for each type. However newly obtained items
--regardless of method(ie. picked on battlefield, bought in shop) might have
--"corrupted" item type value. Therefore, before using this script, it is recommended to save and reload
--if you obtained any new items since last savegame load.
function tlength(T)
local count = 0
for _ in pairs(T) do count = count + 1 end
return count
end
function readItem(address)
local item = {}
item.Address = address
item.Pointer = readQword(address)
item.ID = readQword(address+0x8)
item.Type = readInteger(address+0x10)
item.Order = readInteger(address+0x14)
item.IsNew = readBytes(address+0x18,1)
item.Unknown = readBytes(address+0x19,7,true)
item.Slot1 = readQword(address+0x20)
item.Slot2 = readQword(address+0x28)
item.Slot3 = readQword(address+0x30)
item.amount = 1
return item
end
function writeItem(item)
writeQword(item.Address,item.Pointer)
writeQword(item.Address+0x8,item.ID)
writeInteger(item.Address+0x10,item.Type)
writeInteger(item.Address+0x14,item.Order)
writeBytes(item.Address+0x18,item.IsNew)
writeBytes(item.Address+0x19,item.Unknown)
writeQword(item.Address+0x20,item.Slot1)
writeQword(item.Address+0x28,item.Slot2)
writeQword(item.Address+0x30,item.Slot3)
end
function dublicate()
--[[
[[["DXM-Win64-Shipping.exe"+0432A120]+1F0]+9B0]
]]--
local bp_array = readQword(getAddress("DXM-Win64-Shipping.exe")+0x432A120)
bp_array = readQword(bp_array+0x1F0)
local size = readInteger(bp_array+0x9b8)-1
bp_array = readQword(bp_array+0x9b0)
local originals = {}
local dublicates = {}
local first_dublicate = nil
--[[
Allowed amount of dublicates per item category:
0:Head
1:Body
2:Left Arm
3:Right Arm
4:Legs
5:Processor
6:Ranged
7:Melee
8:Shoulder
9:Auxilliary
In this example Ranged and Melee weapons are allowed to have 4 dublicates
while all others allowed to have only 1. You can edit it as you like.
--]]
local amount = {[0]=1,[1]=1,[2]=1,[3]=1,[4]=1,[5]=1,[6]=4,[7]=4,[8]=1,[9]=1}
--Searching for items that may need to be dublicated - "originals" table
--and items that will serve as dublication material - "dublicates" table
for i=0,size do
local bp_item = bp_array+i*0x38
local item = readItem(bp_item) --read item data and present it as structure
--Check if item is already in "originals" table
if originals[item.ID] == nil then
originals[item.ID] = item
else
originals[item.ID].amount = originals[item.ID].amount + 1
--Check if we have enough dublicates of item
if originals[item.ID].amount > amount[item.Type] then
--Candidate for dublication material is detected
--Make any nessesary changes before putting it into list
item.IsNew = 0 --Dublication material candidate will be marked as newly obtained item
--Make it so that all dublication candidates will become the same item
--as the first candidate. Item may change every time the script is executed.
if #dublicates == 0 then first_dublicate = item
else
--item.Order is item obtained order, it is best to leave it as is
--unless you know what you are doing
item.Pointer = first_dublicate.Pointer
item.ID = first_dublicate.ID
item.Type = first_dublicate.Type
item.Unknown = first_dublicate.Unknown
item.Slot1 = first_dublicate.Slot1
item.Slot2 = first_dublicate.Slot2
item.Slot3 = first_dublicate.Slot3
end
--After changes are made, put candidate into list
table.insert(dublicates,item)
end
end
end
--Dublication/Filtration process
for ID,o in pairs(originals) do
::loop::
--If item got the required number of dublicates
if o.amount >= amount[o.Type] then
originals[ID] = nil --erase table entry
goto continue --move to next item in "originals" table
end
--If dublication material table is empty then move on
if #dublicates == 0 then goto continue end
d = table.remove(dublicates) --remove last element from table and get its pointer
--Rewrite dublication material data. d.Order is left intact
d.Pointer = o.Pointer
d.ID = o.ID
d.Type = o.Type
d.IsNew = o.IsNew
d.Unknown = o.Unknown
d.Slot1 = o.Slot1
d.Slot2 = o.Slot2
d.Slot3 = o.Slot3
writeItem(d) --rewrite invertory data
d = nil
o.amount = o.amount + 1
goto loop
::continue::
end
--Prepare and print resulting information
total = 0
for k,v in pairs(originals) do
total = total + (amount[v.Type]-v.amount)
end
format = [[Invertory size: %d
Unique ID's to dublicate: %d
Items amount to dublicate: %d
Leftover items amount: %d
-------------------------------------]]
print(string.format(format,size+1,tlength(originals),total,#dublicates))
end
[ENABLE]
dublicate() --call dublication function upon script activation
[DISABLE]
How do you use this? In your inventory or after a mission?
Hey cool table man. Adding eq slots, outer cosmetics etc all works fine, though i cant get the armor/weapon inventory replacer to work, seems like the ID's are inconsistent. Your "saved" IDs for eg: Orsa head (0000006600012592) are different than mine (000000660001258D). So, whenever i tried to use your ID's it will shows up as error object ingame.
Also is it possible to get the ID's for items you hovered? even with tabman's script, it will only "scan" the selected items in your hangar. What i wanted to do is to get the ID's for those exclusive boss equipments in the secret development shop so i can use it to replace my random armors/weapons