z Baldur's Gate 3

Upload your cheat tables here (No requests)
BRegisNotarius
Noobzor
Noobzor
Posts: 6
Joined: Fri Feb 25, 2022 9:09 pm
Reputation: 1

Re: z Baldur's Gate 3

Post by BRegisNotarius »

Does anyone know if the DamageBonus UUID can add damage per dice rolled? like adding 1d8 lightning damage per damage dice rolled on a spell? I just want the bonus to scale with the spellslots

How to use this cheat table?
  1. Install Cheat Engine
  2. Double-click the .CT file in order to open it.
  3. Click the PC icon in Cheat Engine in order to select the game process.
  4. Keep the list.
  5. Activate the trainer options by checking boxes or setting values from 0 to 1

ItzKogu
What is cheating?
What is cheating?
Posts: 2
Joined: Sun Aug 06, 2023 7:16 pm
Reputation: 0

Re: z Baldur's Gate 3

Post by ItzKogu »

Is there a way to teleport my character to the House of Hope? As the portal is glitched for me...

0826tiger
What is cheating?
What is cheating?
Posts: 1
Joined: Sun Mar 15, 2020 9:43 pm
Reputation: 0

Re: z Baldur's Gate 3

Post by 0826tiger »

EvenLess wrote:
Fri Aug 04, 2023 11:42 pm
I have added a LOT of items to the Item Spawner. Primarily Legendary and Very Rare, and some Rare and Uncommon. I have sorted and color-coded them.
All this is in the attached bg3_items_spells.CT table, which is based Zanzer's bg3.CT v4.1.1.3624901 (2) table.

You can also use one of the attached tables that only contains the items (bg3_armor.CT, bg3_weapon.CT, and bg3_object.CT). They contain a LOT more items, but are not as pretty and sorted as the ones I manually added in the bg3_items_spells.CT table.
To use these you must load Zanzer's bg3.CT table first, then and Activate Console Commands, then Register Commands, before being able to use the Item Spawner.
Then from the already opened Cheat Engine, with Zanzer's bg3.CT loaded, open my bg3_armor.CT, or bg3_weapon.CT, or bg3_object.CT and merge it into Zanzer's bg3.CT.
Image

These (incomplete) lists are based on all the items found in the armor.txt, weapon.txt, and armor.txt files, found in the following unpacked folders, and a list of those are added in the bg_items.txt (CSV) file:
  • Gustav\Public\Gustav\Stats\Generated\Data
  • Gustav\Public\GustavDev\Stats\Generated\Data
  • Shared\Public\Shared\Stats\Generated\Data
  • Shared\Public\SharedDev\Stats\Generated\Data
I've attached another, more complete and more searchable list, as bg3_items_v2.txt (CSV) file. This one contains all items found in the all the RootTemplates-files. This does include a lot of items that cannot be added to inventory, from the looks of it. It does not contain all files, I've discovered, but it is the most complete list so far.

If you want to find more items yourself, I created a small guide in another post, but have added it here as well, to have all the tidbits gathered in one post. The guide is based on the [Link] (which CKeylos also pointed out.
  1. Download and extract the latest version of Norbyte's ExportTool [Link].
  2. Download and extract the latest version of ShinyHobo's BG3-Modders-Multitool [Link].
    I extracted the BG3-Modders-Multitool to the base directory of Norbyte's ExportTool, as the Multitool requires divine.exe from this.
  3. Open the multitool (bg3-modders-multitool.exe).
  4. Add the paths to divine.exe and bg3.exe by clicking the asterisk in the lower right hand corner after opening the Multitool.
    Image
  5. Unpack .pak Files and select at least Gustav.pak and Shared.pak. I recommend also unpacking English.pak as this contains the translations you see in-game.
    Image
    This step takes a while and takes up a around 30 GB of disk space.
  6. Index Files. This step also takes a while.
    Image
  7. Index Search to search for things. If you search for the in-game name, you should get results from English.loca. The line here contains a "handle" (ID). Use this handle to do a new search, and you will find the files that contain references to this handle. These files likely contains the UUID/MapKey.
    Image
  8. For more control/advanced use, use the ConverterApp.exe to batch convert all .lsf-files (binary) to .lsj-files (json) to make them more readable. Also use ConvertApp.exe to convert English.loca (binary) to xml.
    Image
    Image
The way I created the lists and the item Cheat Tables, was with a few PowerShell scripts I wrote.

The first script, which only inventories the before-mentioned .txt-files, is pretty fast to run. It creates both the CSV and the 3 item Cheat Tables. Remember to update paths to your locations.
bg3_items.ps1

Code: Select all

# Get the path for the My Documents folder.
$DocumentsFolder = [System.Environment]::GetFolderPath('MyDocuments')

# The default location where Cheat Engine saves cheat tables.
$CheatTablesFolder = Join-Path -Path $DocumentsFolder -ChildPath 'My Cheat Tables'

$ItemsCsvFile = 'bg3_items.csv'
$ItemsCsvPath = Join-Path -Path $CheatTablesFolder -ChildPath $ItemsCsvFile
$ItemsCtFile = 'bg3_armor.CT'
$ItemsCtPath = Join-Path -Path $CheatTablesFolder -ChildPath $ItemsCtFile

# Base-path of the unpacked data/.pak-files.
$BasePath = 'C:\Games\BG3-Tools\UnpackedData'
# Get tools to extract with here:
# https://github.com/Norbyte/lslib/releases/latest
# https://github.com/ShinyHobo/BG3-Modders-Multitool/releases/latest

# Sub-paths to the armor, object, and weapon .txt-files.
$ArmorFiles = @(
     'Shared\Public\Shared\Stats\Generated\Data\Armor.txt'
    ,'Shared\Public\SharedDev\Stats\Generated\Data\Armor.txt'
    ,'Gustav\Public\Gustav\Stats\Generated\Data\Armor.txt'
    ,'Gustav\Public\GustavDev\Stats\Generated\Data\Armor.txt'
)
$WeaponFiles = @(
     'Shared\Public\Shared\Stats\Generated\Data\Weapon.txt'
    ,'Shared\Public\SharedDev\Stats\Generated\Data\Weapon.txt'
    ,'Gustav\Public\Gustav\Stats\Generated\Data\Weapon.txt'
    ,'Gustav\Public\GustavDev\Stats\Generated\Data\Weapon.txt'
)
$ObjectFiles = @(
     'Shared\Public\Shared\Stats\Generated\Data\Object.txt'
    ,'Shared\Public\SharedDev\Stats\Generated\Data\Object.txt'
    ,'Gustav\Public\Gustav\Stats\Generated\Data\Object.txt'
    ,'Gustav\Public\GustavDev\Stats\Generated\Data\Object.txt'
)

# Combine to one.
#$Files = $ArmorFiles + $WeaponFiles + $ObjectFiles
$Files = $ArmorFiles + $WeaponFiles + $ObjectFiles

$RarityColor = @{
    'RARITY_UNKNOWN' = 'C0C0C0'
    'Uncommon'       = '00FF00'
    'Rare'           = 'FFFF00'
    'VeryRare'       = 'FF00FF'
    'Legendary'      = '4080FF'
}

$CheatTableHead = @"
<?xml version="1.0" encoding="utf-8"?>
<CheatTable CheatEngineTableVersion="45">
    <CheatEntries>
        <CheatEntry>
            <ID>@@CE_ID@@</ID>
            <Description>"Item Spawner"</Description>
            <Options moHideChildren="1"/>
            <GroupHeader>1</GroupHeader>
            <CheatEntries>
"@
$CheatTableFoot = @"
            </CheatEntries>
        </CheatEntry>
    </CheatEntries>
    <UserdefinedSymbols>
        <SymbolEntry>
            <Name>playerCharactersPtr</Name>
            <Address>1D4526F0000</Address>
        </SymbolEntry>
    </UserdefinedSymbols>
    <DisassemblerComments>
        <DisassemblerComment>
            <Address>"bg3.exe"+25C0F20</Address>
            <Comment>Zanzer</Comment>
        </DisassemblerComment>
    </DisassemblerComments>
</CheatTable>
"@
$CheatEntryTemplate = @"
                <CheatEntry>
                    <ID>@@CE_ID@@</ID>
                    <Description>"@@ITEM_NAME@@"</Description>
                    <Color>@@RARITY_COLOR@@</Color>
                    <VariableType>Auto Assembler Script</VariableType>
                    <AssemblerScript Async="1">[ENABLE]
{`$lua}
if syntaxcheck then return end

local uuid = "@@ITEM_UUID@@"

local cmdCall = getAddress("cmdCall")
local cmdAddr = getAddress("cmdAddr")
local cmdArgs = getAddress("cmdArgs")
local cmdStr1 = getAddress("cmdStr1")
PrepareCall("GetHostCharacter")
executeCodeEx(0, nil, cmdCall)

writePointer(cmdArgs + 0x18, readPointer(cmdArgs + 0x08))
PrepareCall("CreateAtObject")
writePointer(cmdArgs + 0x08, cmdStr1)
writeString(cmdStr1, uuid)
writeBytes(cmdStr1 + #uuid, 0)
writeQword(cmdArgs + 0x28, 0)
writeQword(cmdArgs + 0x38, 0)
writeQword(cmdArgs + 0x48, 0)
writeQword(cmdArgs + 0x58, 0)
executeCodeEx(0, nil, cmdCall)

{`$asm}
assert(true)
[DISABLE]
                    </AssemblerScript>
                </CheatEntry>
"@

# Regular Expression to check if the UUID looks right.
$RegexUUID = [regex]'^[a-z0-9]{8}-[a-z0-9]{4}-[a-z0-9]{4}-[a-z0-9]{4}-[a-z0-9]{12}$'

# Create an empty array to store all the items.
$Items = ''

# Create an empty string variable to store the content of the files.
$Content = ''
# Loop through the files and read their contents into one big string.
foreach ($File in $Files) {
    # Combine base-path and sub-path to the full path.
    $FullPath = Join-Path -Path $BasePath -ChildPath $File
    $Content += Get-Content -Raw -Path $FullPath
}
# Split the content string into an array of lines.
$Line = $Content -split '\n'

# Create an empty array to store the item objects in.
$Items = @()
# Ensure the Item variable is empty for the first iteration.
Clear-Variable -Name Item -ErrorAction SilentlyContinue
# Loop through all the lines.
for ($l = 0; $l -lt $Line.Count; $l++) {
    # Check if the current line is the start of a new item entry.
    if ($Line[$l] -match '^new entry "(?<Name>\w+)"') {
        # Store the items "name" in a new variable, so it does not get overwritten by following mathes.
        $ItemName = $Matches.Name
        # Check if we already have an item object, and if that item object contains a valid UUID.
        if ($Item -and $Item.UUID -match $RegexUUID) {
            # Store the previous item object in the array.
            $Items += New-Object -TypeName psobject -Property $Item
        }
        # Create a fresh hashtable and populate it with the default values.
        $Item = [ordered]@{
            Name   = $ItemName
            UUID   = $null
            Type   = 'TYPE_UNKNOWN'
            Rarity = 'RARITY_UNKNOWN'
        }
    }
    else {
        # Not a new item entry, so look for the current item entrys data.
        # Check if the current line is the item type.
        if ($Line[$l] -match 'type "(?<Type>\w+)"') {
            # Update the hashtable with the found value.
            $Item.Type = $Matches.Type
        }
        # Check if the current line is the item rarity.
        if ($Line[$l] -match '^data "Rarity" "(?<Rarity>\w+)"') {
            # Update the hashtable with the found value.
            $Item.Rarity = $Matches.Rarity
        }
        # Check if the current line is the item UUID.
        if ($Line[$l] -match '^data "RootTemplate" "(?<UUID>[a-f0-9-]+)"') {
            # Update the hashtable with the found value.
            $Item.UUID = $Matches.UUID
        }
    }
}

# Export the items to a the items CSV-file. Using semi-colon (;) as delimiter, simply because the CSV file will automatically be shown in colums, in spreadsheet programs.
$Items | Sort-Object -Property Name | Export-Csv -Force -NoTypeInformation -Encoding Default -Delimiter ';' -Path $ItemsCsvPath

# Build the Cheat Table.
foreach ($t in ($Items | Select-Object -ExpandProperty Type -Unique)) {
    $CtFile = "bg3_$($t.ToLower()).CT"
    $CtPath = Join-Path -Path $CheatTablesFolder -ChildPath $CtFile
    $CheatID = 1
    $CheatTableHead.Replace('@@CE_ID@@', $CheatID) | Out-File -Force -Encoding default -FilePath $CtPath
    foreach ($i in ($Items | Where-Object { $_.Type -eq $t} | Sort-Object -Property Name)) {
        $CheatID++
        $CheatEntryTemplate.Replace('@@CE_ID@@', $CheatID).Replace('@@ITEM_NAME@@', $i.Name).Replace('@@RARITY_COLOR@@', $RarityColor."$($i.Rarity)").Replace('@@ITEM_UUID@@', $i.UUID) | Out-File -Append -Encoding default -FilePath $CtPath
    }
    $CheatTableFoot | Out-File -Append -Encoding default -FilePath $CtPath
}
The second script was an attempt to find ALL items, as it looked like all items were stored in the RootTemplates-files. I also wanted the localized names, so the script will also find that and add to the list. This script is VERY SLOW. First run (which generated the attached bg3_items_v2.txt-file) took more than 14 hours to complete (14 hours, 5 minutes, 2 seconds and 404 milliseconds to be exact).
It requires all the binary .lsf-files to be converted .lsj JSON-files. Easily done using the ConverterApp.exe that is included in Norbyte's ExportTool.
bg3_items_v2.ps1

Code: Select all

$VerbosePreference = 'SilentlyContinue'
$VerbosePreference = 'Continue'
$Stopwatch = New-Object -TypeName System.Diagnostics.Stopwatch
$Stopwatch.Start()

$DocumentsFolder = [System.Environment]::GetFolderPath('MyDocuments')
$CheatTablesFolder = Join-Path -Path $DocumentsFolder -ChildPath 'My Cheat Tables'
$CsvFile = 'bg3_allitems.csv'
$CsvPath = Join-Path -Path $CheatTablesFolder -ChildPath $CsvFile

$BasePath = 'C:\Games\BG3-Tools\UnpackedData'

$LocalizationPath = "$($BasePath)\English\Localization\English\english.xml"

$RootTemplates = @(
     "$($BasePath)\Shared\Public\Shared\RootTemplates"
    ,"$($BasePath)\Shared\Public\SharedDev\RootTemplates"
    ,"$($BasePath)\Gustav\Public\Gustav\RootTemplates"
    ,"$($BasePath)\Gustav\Public\GustavDev\RootTemplates"
)

$LocalizationData = [xml](Get-Content -Encoding Default -Path $LocalizationPath)

$RegexUUID = [regex]'^[a-z0-9]{8}-[a-z0-9]{4}-[a-z0-9]{4}-[a-z0-9]{4}-[a-z0-9]{12}$'

function Get-TemplateData {
	[CmdletBinding()]
    param (
        [Parameter(Mandatory = $true)]
        [System.IO.FileInfo]
        $Path
        ,
        [Parameter(Mandatory = $true)]
        [guid]
        $Id
    )
    Write-Verbose -Message "Fn: Get-TemplateData -Id '$($Id)'"
    $Template = Join-Path -Path $Path -ChildPath "$($Id).lsj"
    $Success = $false
    if (Test-Path -Path $Template) {
        $Success = $true
        try {
            $Data = Get-Content -Raw -Encoding Default -Path $Template | ConvertFrom-Json
        }
        catch {
            $Success = $false
        }
    }
    if ($Success) {
        return $Data.save.regions.Templates.GameObjects[0]
    }
}


$Items = @()
$Files = Get-ChildItem -Path $RootTemplates -Filter *.lsj
Write-Output '"UUID";"Name";"Stats";"DisplayName";"Description"' | Out-File -Force -Encoding default -FilePath $CsvPath
foreach ($f in $Files) {
    $TemplatePath = $f.Directory.FullName
    $TemplateId   = $f.BaseName
    $Item = [ordered]@{
        UUID        = $f.BaseName
        Name        = $null
        Stats       = $null
        DisplayName = $null
        Description = $null
    }
    Write-Verbose -Message "L1: Read '$($f.BaseName)'."
    do {
        $Data = Get-TemplateData -Path $TemplatePath -Id $TemplateId
        if ('Name' -notin $Data.psobject.Properties.Name) {
            Write-Verbose -Message "L2: Name missing for '$($f.BaseName)'."
            break
        }
        foreach ($p in $Data.psobject.Properties.Name) {
            switch ($p) {
                'Name' {
                    if ($null -eq $Item.Name) {
                        Write-Verbose -Message "L3: Adding Name '$($Data.Name.value)'."
                        $Item.Name = $Data.Name.value
                    }
                }
                'Stats' {
                    if ($null -eq $Item.Stats) {
                        Write-Verbose -Message "L3: Adding Stats '$($Data.Stats.value)'."
                        $Item.Stats = $Data.Stats.value
                    }
                }
                'DisplayName' {
                    if ($null -eq $Item.DisplayName) {
                        $LocalizedName = ($LocalizationData.contentList.content | Where-Object {
                            $_.contentuid -eq $Data.DisplayName.handle
                        }).'#text'
                        Write-Verbose -Message "L3: Adding DisplayName '$($LocalizedName)'."
                        $Item.DisplayName = $LocalizedName
                    }
                }
                'Description' {
                    if ($null -eq $Item.Description) {
                        $LocalizedName = ($LocalizationData.contentList.content | Where-Object {
                            $_.contentuid -eq $Data.Description.handle
                        }).'#text'
                        Write-Verbose -Message "L3: Adding Description '$($LocalizedName)'."
                        $Item.Description = $LocalizedName
                    }
                }
            }
        }
        $TemplateId = $Data.ParentTemplateId.value
    } while ($Data.psobject.Properties.Name -contains 'ParentTemplateId' -and $Data.ParentTemplateId.value -match $RegexUUID)
    Write-Verbose -Message "L1: Done '$($f.BaseName)'."
    if ($null -eq $Item.DisplayName) {
        Write-Verbose -Message "L1: DisplayName missing for '$($f.BaseName)'."
        continue
    }
    $ItemObject = New-Object -TypeName psobject -Property $Item
    $ItemObject | ConvertTo-Csv -NoTypeInformation -Delimiter ';' | Select-Object -Skip 1 | Out-File -Append -Encoding default -FilePath $CsvPath
    #$Items += $ItemObject
}

#$Items | Export-Csv -Force -NoTypeInformation -Encoding Default -Delimiter ';' -Path $CsvPath

$Stopwatch.Stop()
$Stopwatch.Elapsed
Disclaimer!
Zanzer deserves all the credit for the Cheat Tables.
this is awesome!!!

Xsist77
Noobzor
Noobzor
Posts: 6
Joined: Sun Oct 22, 2017 11:08 am
Reputation: 0

Re: z Baldur's Gate 3

Post by Xsist77 »

does anyone know if spawning items (armor/weapons) can adversely affect or bug out the story or some quests down he road?

wannabecheater
Cheater
Cheater
Posts: 41
Joined: Fri Sep 28, 2018 1:23 pm
Reputation: 11

Re: z Baldur's Gate 3

Post by wannabecheater »

Just a heads up the resource cheat (sorcery pts etc) seem to reset once you restart the game. It does persist between save/loads though.

Psi
What is cheating?
What is cheating?
Posts: 2
Joined: Fri Aug 11, 2023 11:15 pm
Reputation: 0

Re: z Baldur's Gate 3

Post by Psi »

Hi all, sorry for the newbie question but if I want to add spells with upcasting I should do this?

[ENABLE]
{$lua}
if syntaxcheck then return end

local spell = "Projectile_MagicMissile",
"Projectile_MagicMissile_2",
"Projectile_MagicMissile_3",
"Projectile_MagicMissile_4",
"Projectile_MagicMissile_5",
"Projectile_MagicMissile_6"

local cmdCall = getAddress("cmdCall")
local cmdArgs = getAddress("cmdArgs")
local cmdStr1 = getAddress("cmdStr1")
local cmdStr2 = getAddress("cmdStr2")

AdrienRemaz
Noobzor
Noobzor
Posts: 6
Joined: Tue Jan 16, 2018 6:58 am
Reputation: 0

Re: z Baldur's Gate 3

Post by AdrienRemaz »

Xsist77 wrote:
Fri Aug 11, 2023 10:58 pm
does anyone know if spawning items (armor/weapons) can adversely affect or bug out the story or some quests down he road?
You can spawn story items and it won't affect anything; you'll just get a duplicate if it's a reward.

Unrelated, reporting game update to 3636828

Spacemutiny
Noobzor
Noobzor
Posts: 6
Joined: Fri Aug 11, 2023 2:06 pm
Reputation: 0

Re: z Baldur's Gate 3

Post by Spacemutiny »

Can anyone tell me if you can spawn enemies using this? Thanks :)

DevilBlack
Noobzor
Noobzor
Posts: 11
Joined: Sun Aug 07, 2022 9:14 am
Reputation: 0

Re: z Baldur's Gate 3

Post by DevilBlack »

Okay so I was looking at merged.lsf here :

and I found CRE_OprheusStoryChapter2 for CRE_YouthTraining_BeatenBoy. I assume these are the items he should be carrying. Now can anyone help me find the UUID for the item or for the boy to spawn & kill him please?

Zanzer
RCE Fanatics
RCE Fanatics
Posts: 1104
Joined: Fri Mar 03, 2017 10:48 pm
Reputation: 3569

Re: z Baldur's Gate 3

Post by Zanzer »

ItzKogu wrote:
Fri Aug 11, 2023 10:45 pm
Is there a way to teleport my character to the House of Hope? As the portal is glitched for me...
SetFlag

Code: Select all

"a0c94538-68d6-8b85-2378-fdaa4f4803aa", --Debug_Teleport_LOW_HoHBoudoir
"22c9f918-0a6f-6784-d8f4-d21b0f814e52", --Debug_Teleport_LOW_HoHEntrance
"fa19501c-b8cf-0cd5-26aa-7779206a68cc", --Debug_Teleport_LOW_HoHFeastHall

DoDannyBoy
What is cheating?
What is cheating?
Posts: 4
Joined: Fri Aug 11, 2023 11:24 pm
Reputation: 0

Re: z Baldur's Gate 3

Post by DoDannyBoy »

Hello! I've been trying to scour the forums for any information on summoning NPCs but I can't seem to find any (I specifically want to summon Dammon at Last Light Inn). Could anyone direct me to info on this or potentially just help me directly? Thank you!

BlakeSneed
Noobzor
Noobzor
Posts: 10
Joined: Fri Aug 11, 2023 4:14 pm
Reputation: 0

Re: z Baldur's Gate 3

Post by BlakeSneed »

I used "restore party" to fix something (Gale bug) and now I have infinite casts in a turn. Did anyone else experience this?

Spacemutiny
Noobzor
Noobzor
Posts: 6
Joined: Fri Aug 11, 2023 2:06 pm
Reputation: 0

Re: z Baldur's Gate 3

Post by Spacemutiny »

DoDannyBoy wrote:
Fri Aug 11, 2023 11:28 pm
Hello! I've been trying to scour the forums for any information on summoning NPCs but I can't seem to find any (I specifically want to summon Dammon at Last Light Inn). Could anyone direct me to info on this or potentially just help me directly? Thank you!
I’ve been asking if you can spawn enemies but no one is answering me lol. I assume it would be the same procedure to spawn NPC’s hopefully someone can help.

ItzKogu
What is cheating?
What is cheating?
Posts: 2
Joined: Sun Aug 06, 2023 7:16 pm
Reputation: 0

Re: z Baldur's Gate 3

Post by ItzKogu »

Zanzer wrote:
Fri Aug 11, 2023 11:24 pm
ItzKogu wrote:
Fri Aug 11, 2023 10:45 pm
Is there a way to teleport my character to the House of Hope? As the portal is glitched for me...
SetFlag

Code: Select all

"a0c94538-68d6-8b85-2378-fdaa4f4803aa", --Debug_Teleport_LOW_HoHBoudoir
"22c9f918-0a6f-6784-d8f4-d21b0f814e52", --Debug_Teleport_LOW_HoHEntrance
"fa19501c-b8cf-0cd5-26aa-7779206a68cc", --Debug_Teleport_LOW_HoHFeastHall
Thank you so much, my last save was 4 hours ago, and you saved me. I love you!

jjsaf
What is cheating?
What is cheating?
Posts: 3
Joined: Fri Aug 11, 2023 11:36 pm
Reputation: 0

Re: z Baldur's Gate 3

Post by jjsaf »

Hi! Thank you to all for this tool. I am going to ask a rookie question here, what is the 'console command' exactly? Is this in the actual BG3 game while its running or can I input the commands into the c engine client itself? The checkboxes provided are relatively easy to use but I wasn't sure about the add ability commands. Thanks.

Post Reply

Who is online

Users browsing this forum: bluemoon27112, EroFemboy, Fabian, Google Adsense [Bot], Jackaroo, ndck@ModEngine