how would you remove a tag from a character like if you wanted urchin instead of outlander? would you change it from SetTagOnPlayer to RemoveTagOnPlayer?
Almost. If you want to see the commands, then do a Change Script on the Register Commands, there you will see all the functions that Zanzer have created. For tag it's ClearTagOnPlayer iirc.
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
I have updated my python script and generated new JSON, Excel and SQLite db files. The original post (viewtopic.php?p=311868#p311868) is updated and has all the details
Update: 2023-09-15:
Fixed missing English translations (mainly in templates files)
Added Flags and Tags files
Added TimelineTemplates in addition to RootTemplates
Updated the code and data up to game version "Patch2 / Hotfix2"
Re-organized files on a google drive share (see new file and directory links in the original post)
Published the python script source code
Added SQLite3 output format (for future use)
Short description: You will find there, in a humanly readable form, information and UUID for all the BG3 things that you are looking for: armors, spells, tags, flags, status, boosts, weapons or many other objects. It is for use with Cheat Engine tables/scripts like those produced by Zander (e.g. z Baldur's Gate 3 and EvenLess (The Baldur's Gate 3 Commander and viewtopic.php?p=306939#p306939 ) for example.
As always: Have Fun!
Okay, i seem to have a problem with the UUIDs from your dumps. Let's take the tags, for example.
Say I have a barbarian character, which should have the Barbarian tag. According to your tag table, that's UUID 02913f9a-f696-40cf-dfac-0332fa2a2cb3 (third entry in the list).
However, if i check my character for that tag with IsTaggedOnPlayer("02913f9a-f696-40cf-dfac-0332fa2a2cb3"), i come up empty. That tag UUID is not on my character.
Now, if i check for the tag UUID from the RootFile name, which is 02913f9a-f696-40cf-acdf-32032afab32c, i DO get a positive return - that tag is on my barbarian. Notice how the byte pairs are swapped in the last two, uh dash segments.
02913f9a-f696-40cf-dfac-0332fa2a2cb3 <-- invalid Barbarian tag from UUID value
02913f9a-f696-40cf-acdf-32032afab32c <-- valid Barbarian tag from RootFile value
That just goes to show that I need to actually test things in-game before publishing I was planning to get some playtime in today, so I can test it then. I might have made an error in the code somewhere. I only tested the form functionality.
I think I got it fixed now. Uploaded latest version to [Link], and attached to this post.
EDIT: Just added a field to enter the amount to spawn. Field is shown if Armors, Objects, or Weapons are selected.
To the people that are downloading everything, because they think everything is needed. Only the [Link] Cheat Table and the [Link] Database are needed. The rest is just whatever else I've made, mostly made available to other CT makers
And to all the people having issues with loading/registering commands. I never have any issues when using my table that autoloads/-registers, when I ensure the cheat table is loaded before I start the game. If I load the cheat table AFTER starting the game, then I also experience the issues you're mentioning. I am guessing it's a timing issue, with loading/registering the moment it's possible.
I've added my autoloader to Zanzer's v9 table and attached it to this post. Try and see if that doesn't work. IMPORTANT to have the table loaded, and run the script at load, BEFORE launching the game.
Nothing have been changed in Zanzer's existing code. Just the Lua Script code that have been added.
You can also just add the autoloader code to your existing table, if you have added/modified it. Just add the following to the Cheat Table Lua Script (Table > Show Cheat Table Lua Script [Ctrl+Alt+L]).
bg3setting = {}
bg3setting['bg3Executable'] = { 'bg3_dx11.exe', 'bg3.exe' }
bg3setting['LoadCommandsControlID'] = 4928
bg3setting['RegisterCommandsControlID'] = 357
bg3setting['TimerInterval'] = 1000 -- Milliseconds between ticks.
--[[ MainForm.OnProcessOpened
https://github.com/cheat-engine/cheat-engine/blob/65b383535cba0325c25b95310137e13b409e75ae/Cheat%20Engine/bin/celua.txt#L377C14-L377C14
EvenLess
]]
MainForm.OnProcessOpened = function (openedPID, processHandle, caption)
local memoryRecord = AddressList.getMemoryRecordByID(bg3setting['RegisterCommandsControlID'])
memoryRecord.disableWithoutExecute()
local memoryRecord = AddressList.getMemoryRecordByID(bg3setting['LoadCommandsControlID'])
memoryRecord.disableWithoutExecute()
end
--[[ Timer. Check/execute things ad-hoc.
https://wiki.cheatengine.org/index.php?title=Tutorials:Lua:Setup_Auto_Attach
EvenLess
Continously checks/executes various tasks.
]]
local tickCounter = 0 -- Used to calculate runtime.
local function bg3Timer_callback(timer) -- Tick callback function.
local bg3Executable = bg3setting['bg3Executable']
local runtime = bg3setting['TimerInterval'] * tickCounter
--[[ Find the active game process, if any.
EvenLess
Attempt to find process ID for both bg3 executables (in their specified order).
If Game process is found, store the process ID and update settings with actual
ExecutablePath and ExecutableFile.
]]
local actualPID = nil
for i = 1, #bg3Executable do
-- Loop through the bg3Executables to get its PID, if the game is running.
actualPID = getProcessIDFromProcessName(bg3Executable[i])
if actualPID ~= nil then break end
end
--[[ If if the (actual) game process isn't opened/attached.
EvenLess
]]
local openedPID = getOpenedProcessID()
if actualPID ~= openedPID then
-- Update Register Commands to indicate "Not Ready".
local memoryRecord = AddressList.getMemoryRecordByID(bg3setting['RegisterCommandsControlID'])
memoryRecord.disableWithoutExecute()
-- Update Console Commands to indicate "Not Ready".
local memoryRecord = AddressList.getMemoryRecordByID(bg3setting['LoadCommandsControlID'])
memoryRecord.disableWithoutExecute()
--[[ If the game process IS running.
EvenLess
]]
if actualPID ~= nil then
openProcess(actualPID)
end
end
-- If "Load Console Commands" is enabled.
local memoryRecord = AddressList.getMemoryRecordByID(bg3setting['LoadCommandsControlID'])
if memoryRecord.Active == true then
local numberOfCommands = nil
local commandList = readPointer("cmdList")
if commandList ~= nil and commandList ~= 0 then
numberOfCommands = readInteger(commandList + 0x2C)
if numberOfCommands > 0 then
if numberOfCommands > 3000 then
numberOfCommands = 3000 -- just in case
end
end
commandList = readPointer(commandList + 0x20)
if commandList ~= nil and commandList ~= 0 then
-- If "Register Commands" is NOT enabled.
local memoryRecord = AddressList.getMemoryRecordByID(bg3setting['RegisterCommandsControlID'])
if memoryRecord.Active ~= true then
memoryRecord.Active = true
end
end
end
else
if actualPID == openedPID then
memoryRecord.Active = true
end
end
tickCounter = tickCounter + 1
end
-- Create the timer and attach the callback function.
local bg3Timer = createTimer(getMainForm()) -- Create timer with the main form as its parent.
bg3Timer.Interval = bg3setting['TimerInterval'] -- Set timer interval.
bg3Timer.OnTimer = bg3Timer_callback -- Set timer tick callback function.
If you in some way got the ID's of Console Commands and Register Commands changed, you need to update the ID's in the code. I usually just open the CT in Notepad++ and search for "Console Commands" and note the ID there.
I still cannot for the life of me make the window show. Everything loads fine (apparently) but when I click "Show/Hide Form", a window seemingly opens but immediately closes. Clicking the "Reset Form position" does not activate, and if I deactivate the "Show/Hide Form", it won't activate again later. I tried changing the video settings to Windowed mode, but the result is the same.
The Reset Form Position doesn't activate because it's not a toggle/switch. If you want the checkmark to show when "activating" it, just remove the one nop (which means no operation) line in the script. When you toggle the show/hide it will re-open at the previous position. Is it the latest version where I have made it always open on main screen/center?
I have updated my python script and generated new JSON, Excel and SQLite db files. The original post (viewtopic.php?p=311868#p311868) is updated and has all the details
Update: 2023-09-15:
Fixed missing English translations (mainly in templates files)
Added Flags and Tags files
Added TimelineTemplates in addition to RootTemplates
Updated the code and data up to game version "Patch2 / Hotfix2"
Re-organized files on a google drive share (see new file and directory links in the original post)
Published the python script source code
Added SQLite3 output format (for future use)
Short description: You will find there, in a humanly readable form, information and UUID for all the BG3 things that you are looking for: armors, spells, tags, flags, status, boosts, weapons or many other objects. It is for use with Cheat Engine tables/scripts like those produced by Zander (e.g. z Baldur's Gate 3 and EvenLess (The Baldur's Gate 3 Commander and viewtopic.php?p=306939#p306939 ) for example.
As always: Have Fun!
Nice I'm gonna steal your Python script to learn from
I have updated my python script and generated new JSON, Excel and SQLite db files. The original post (viewtopic.php?p=311868#p311868) is updated and has all the details
Update: 2023-09-15:
Fixed missing English translations (mainly in templates files)
Added Flags and Tags files
Added TimelineTemplates in addition to RootTemplates
Updated the code and data up to game version "Patch2 / Hotfix2"
Re-organized files on a google drive share (see new file and directory links in the original post)
Published the python script source code
Added SQLite3 output format (for future use)
Short description: You will find there, in a humanly readable form, information and UUID for all the BG3 things that you are looking for: armors, spells, tags, flags, status, boosts, weapons or many other objects. It is for use with Cheat Engine tables/scripts like those produced by Zander (e.g. z Baldur's Gate 3 and EvenLess (The Baldur's Gate 3 Commander and viewtopic.php?p=306939#p306939 ) for example.
As always: Have Fun!
Okay, i seem to have a problem with the UUIDs from your dumps. Let's take the tags, for example.
Say I have a barbarian character, which should have the Barbarian tag. According to your tag table, that's UUID 02913f9a-f696-40cf-dfac-0332fa2a2cb3 (third entry in the list).
However, if i check my character for that tag with IsTaggedOnPlayer("02913f9a-f696-40cf-dfac-0332fa2a2cb3"), i come up empty. That tag UUID is not on my character.
Now, if i check for the tag UUID from the RootFile name, which is 02913f9a-f696-40cf-acdf-32032afab32c, i DO get a positive return - that tag is on my barbarian. Notice how the byte pairs are swapped in the last two, uh dash segments.
02913f9a-f696-40cf-dfac-0332fa2a2cb3 <-- invalid Barbarian tag from UUID value
02913f9a-f696-40cf-acdf-32032afab32c <-- valid Barbarian tag from RootFile value
Maybe some kind of endianness error?
For flags and tags you actually have to use the UUID in the actual filename, and not the UUID in the filedata.
{
"Description": "They call you a savage, an animal. They don't know what it's like to need to fight, tooth and claw, just to survive. You do. ",
"DisplayDescription": "h9ead197bg1c99g4118g885cgd3b5ec2e5542;1",
"DisplayDescriptionEnglish": "The strong embrace the wild that hides inside - keen instincts, primal physicality, and most of all, an unbridled, unquenchable rage.",
"DisplayName": "he58b883ag9b2fg45adgac11g2a67dd1a1181;2",
"DisplayNameEnglish": "Barbarian",
"Name": "BARBARIAN",
"UUID": "02913f9a-f696-40cf-dfac-0332fa2a2cb3",
"Categories": "Code, Dialog, Class, CharacterSheet",
"RootFolder": "Shared\\Public\\Shared\\Tags",
"RootFile": "02913f9a-f696-40cf-acdf-32032afab32c.lsf.lsx"
},
Here you have the "UUID": "02913f9a-f696-40cf-dfac-0332fa2a2cb3", which would be the obvious UUID to use. But you actually have to use the "RootFile": "02913f9a-f696-40cf-acdf-32032afab32c.lsf.lsx" UUID. I had to more or less do what you're doing now, compare with what I had set on my character, and see what it lined up with from the files.
I noticed that your sqlite database (which includes tags now) does list the correct UUIDs. Did you manually correct them?
edit: the "error" seems to be pretty consistent as far as i can tell, and also applies to flags - the byte pairs in the last two dash segments are always flipped between what's in the dumps and what's valid in-game.
I have updated my python script and generated new JSON, Excel and SQLite db files. The original post (viewtopic.php?p=311868#p311868) is updated and has all the details
Update: 2023-09-15:
Fixed missing English translations (mainly in templates files)
Added Flags and Tags files
Added TimelineTemplates in addition to RootTemplates
Updated the code and data up to game version "Patch2 / Hotfix2"
Re-organized files on a google drive share (see new file and directory links in the original post)
Published the python script source code
Added SQLite3 output format (for future use)
Short description: You will find there, in a humanly readable form, information and UUID for all the BG3 things that you are looking for: armors, spells, tags, flags, status, boosts, weapons or many other objects. It is for use with Cheat Engine tables/scripts like those produced by Zander (e.g. z Baldur's Gate 3 and EvenLess (The Baldur's Gate 3 Commander and viewtopic.php?p=306939#p306939 ) for example.
As always: Have Fun!
Okay, i seem to have a problem with the UUIDs from your dumps. Let's take the tags, for example.
Say I have a barbarian character, which should have the Barbarian tag. According to your tag table, that's UUID 02913f9a-f696-40cf-dfac-0332fa2a2cb3 (third entry in the list).
However, if i check my character for that tag with IsTaggedOnPlayer("02913f9a-f696-40cf-dfac-0332fa2a2cb3"), i come up empty. That tag UUID is not on my character.
Now, if i check for the tag UUID from the RootFile name, which is 02913f9a-f696-40cf-acdf-32032afab32c, i DO get a positive return - that tag is on my barbarian. Notice how the byte pairs are swapped in the last two, uh dash segments.
02913f9a-f696-40cf-dfac-0332fa2a2cb3 <-- invalid Barbarian tag from UUID value
02913f9a-f696-40cf-acdf-32032afab32c <-- valid Barbarian tag from RootFile value
Maybe some kind of endianness error?
Very good point, it's a kind of bug probably but I am not sure at which level:
The invalid tag information (the UUID) comes from the RootFile content itself in "bg3-modders-multitool\UnpackedData\Shared\Public\Shared\Tags\02913f9a-f696-40cf-acdf-32032afab32c.lsf.lsx".
The name of the RootFile carries the correct tag!
That RootFile file is generated by the [Link] tool.
My scripts takes these strings "as-is" without tempering it.
"bg3-modders-multitool" is actually relying on the [Link] library for these extraction and conversion tasks.
[*] Thus, I would conclude that either the lslib library has a bug or that the "UUID" is NOT the Tag that we should use but rather the filename itself! (reminds me "This is not a pipe – Magritte’s famous painting" )
Whatever... in the meantime, we have a workaround which is using the filename as the tag. If the issue is confirmed by other samples, I will include an explicit first column with the true "tag" string in it to avoid confusion.
I noticed that your sqlite database (which includes tags now) does list the correct UUIDs. Did you manually correct them?
edit: the "error" seems to be pretty consistent as far as i can tell, and also applies to flags - the byte pairs in the last two dash segments are always flipped between what's in the dumps and what's valid in-game.
I'm not sure if you're referring to my SQLite DB or Noway3's. Yes, I added a separate field/column for the TagUUID/FlagUUID. It is just the basename of the filename (i.e. filename without extension).
And hello again i have updated my table but i dropped it in github(its easier to keep track of changes like that) i hope it wont trigger any rules in here there is no executables etc. there are images, CT file and readme
[Link]
Table is updated and should properly work with latest game version (tested on my steam game version) also on old saved game and it works properly
Item spawning could crash your game make sure to save a game after each successfull spawn
Companions Update:
Just wanted to let you know, for some reason the Runtime Code scripts for the pointers causes Cheat Engine to crash and be deleted, being denied permission to transfer Cheat Engine 7.5 onto storage (even with Administrator privilege's and allowing exceptions).
So, I had a realization that we might all just be greedy with MinimumRollResult(), and setting it to 20 guarantees a crash at some point, so I decided to test it with the following:
This rerolls any dice result including damage and takes the higher result, and sets the minimum roll for damage to 3 to prevent any potential problem exceeding the number of sides on a die roll, and the minimums of attacks, saves, and checks to 10
So far, I have had no crashes.
Update: I've got no crashing so far from using a reduced minimum result, i have upped all of the results to 19 and am trying them out now, but I am theorizing that it will also be fine, it seems rolling a 20 on everything breaks some triggers in the game because it forces a specific critical success result that might be null or otherwise borked for certain things the game does in the background.
Updated the batch command for those of you who like to play with the dice gods always being in your favor:
{$lua}
if syntaxcheck then return end
[ENABLE]
AddBoostsToPlayer("MaximizeHealing(Incoming);MaximizeHealing(Outgoing);MinimumRollResult(Damage,19);MinimumRollResult(Attack,19);MinimumRollResult(SavingThrow,19);MinimumRollResult(SkillCheck,19);MinimumRollResult(RawAbility,19);Reroll(Attack,20,false);Reroll(SkillCheck,20,false);Reroll(RawAbility,20,false);Reroll(SavingThrow,20,false);Reroll(Damage,20,false)")
[DISABLE]
I don't know about you, but I tested using these with 10, 15, and 19 minimum and they all crashed at a known crash point (when you go talk to Zevlor after the first battle at the grove).
I don't know about you, but I tested using these with 10, 15, and 19 minimum and they all crashed at a known crash point (when you go talk to Zevlor after the first battle at the grove).
Hello friends, I am working to change the hag buff as I wish to change classes and the original stat boost is useless to the new class (I want to move it from CHA to DEX).
I know how to spawn in new hair to get the Dex correctly, but I am having trouble removing the old passive. I copied over the toggle passive on player, but it appears that it will only add and remove a new instance of the boon and not edit the old one. I do not know how to create an option (maybe a dropdown?) to remove the current passive.
Anyone have a few minutes to help me out? Thanks for your time.
What is the Potion of Everlasting Vigour's buff classified as? status? passive? and does the buff use the same uuid as the item itself? I'm assuming not but I wouldn't be surprised if it did.
Spoiler
"cc426fc4-a82e-4375-8a77-31f2344b71b4",--CONS_Potion_Blood_Astarion (Potion of Everlasting Vigour)
Also if I were trying to remove it from the player character would it be
I noticed that your sqlite database (which includes tags now) does list the correct UUIDs. Did you manually correct them?
edit: the "error" seems to be pretty consistent as far as i can tell, and also applies to flags - the byte pairs in the last two dash segments are always flipped between what's in the dumps and what's valid in-game.
I'm not sure if you're referring to my SQLite DB or Noway3's. Yes, I added a separate field/column for the TagUUID/FlagUUID. It is just the basename of the filename (i.e. filename without extension).
I have now also added the same "TagUUID" and "FlagUUID" in my script (not re-inventing the wheel here).
The updated script and output files are uploaded on google drive share.
There are indeed two versions of the sqlite DB: mine is experimental and trying to catch up with Evenless' one. Sorry for the confusion. I called mine"bg3data-raw.sqlite3"
I still have to do some investigation to understand why the count of records between my DB and the one from Evenless are off by quite a lot! it's fixed (forgot to uncomment Gustav+ directories in my script!)
Last edited by Noway3 on Fri Sep 15, 2023 10:52 pm, edited 2 times in total.