Page 9 of 12

Re: NieR Automata

Posted: Mon May 15, 2017 2:06 am
by kratitos
Requesting attack speed mod :p

Re: NieR Automata

Posted: Mon May 15, 2017 10:31 pm
by 1e85d56a8
Here's a compilation of all the stuff posted so far and a few extra things:
- added coordinates for 2B
- added information about coordinates and fov
- added camera settings
- slightly modified the inf HP script

Re: NieR Automata

Posted: Tue May 16, 2017 9:25 am
by bachou
saved as .ct, can't load

Re: NieR Automata

Posted: Tue May 16, 2017 9:33 am
by STN
bachou wrote:
Tue May 16, 2017 9:25 am
saved as .ct, can't load
Try now, edited his post and uploaded the ct.

Re: NieR Automata

Posted: Tue May 16, 2017 1:37 pm
by alex_hama
Great work STN,
I was wondering if you can chose the height and animation of the 2nd jump of the double jump, there are basically 3 that I noticed so far i wish to use only one of them. Also, hope you can provide the condition (dusty,dry,wet) option to your table.

Re: NieR Automata

Posted: Tue May 16, 2017 3:28 pm
by Kira
Is it possible to create a hack where we can use character at end game where there are not normally available? Like 2B on the final chapter.

Re: NieR Automata

Posted: Wed May 17, 2017 10:30 am
by Nimbo
Is it possible to get infinite HP in the forest arena ? In this arena the player controls a Robomachine so the table is not working

Re: NieR Automata

Posted: Wed May 17, 2017 5:21 pm
by Apache81
NieR:Automata (Steam Version)
CE Version : 6.6
Table Version : 1.1

Added "Hack Minigame Infinite Lives" script

Please, report any issue !!! :-)


P.S. feel free to add the new script to the combined table :-)

Re: NieR Automata

Posted: Thu May 18, 2017 5:48 am
by MrBuggz
Eldius wrote:
Sat May 13, 2017 12:08 am
If you're using the highlighted items script from Eddy.

Push start, Item Tab, Highlight an item you want to change. I usually use an enhancement item since I never use those.

Find the item you want to change to, using zarrock666 Item ID List on page 7.
So as an example, previously mentioned you can use 983 for item_uq_dlcCloth1.
I set the quantity as 1, I'm not sure if anything will bug out if you use higher than that due to it being a Key Item.
Then go in game and you'll have the item under Key Items Revealing Outfit
Of course you need the dlc for that outfit as Sauce has said.

So for any other item just replace the 983 step above for whatever number id you want.
Changing quantity should be fine as long as it's not a Key Item.
I am sorry but can anyone explain this a little further? Where do i put the 983 number? And do i just highlight the item or do i have to actually select it before typing in the new ID? and for the CE active check boxes when do I tick those to become active? Before or after I input the numbers in whatever location? The more specific the details/instructions the better! Still learning CE....Any and all help appreciated!

Re: NieR Automata

Posted: Fri May 19, 2017 12:32 pm
by Cielos
made 2 simple scripts, Ignore Funds (Shop) and Ignore Funds & Materials (Upgrade).

///
EDIT1:
- updated the Ignore Funds (Shop) scrip to Ignore Funds (Shop/Fuse), as title suggests, it supports the Fuse in Maintenance shop now.
- also added a modified script made by other member in this thread, Undead, which still allows the health to be reduced on hit, but won't let you be killed, so that you can still use the restorative items if you want.
EDIT2:
- forgot to include the actual script for Undead...
///

Ignore Funds (Shop/Fuse)
- allows you to buy/fuse anything in shop regardless of your remaining funds, tested on Item shop, Weapon shop, and Maintenance shop.
- allows you to buy up to 99 items in Item shop regardless of your remaining funds.
- funds still drop until it reaches zero when purchase.
- copy & paste the following ONto the table you're using.

Code: Select all

<?xml version="1.0" encoding="utf-8"?>
<CheatTable>
  <CheatEntries>
    <CheatEntry>
      <ID>47138</ID>
      <Description>"Ignore Funds (Shop/Fuse)"</Description>
      <LastState Activated="1"/>
      <VariableType>Auto Assembler Script</VariableType>
      <AssemblerScript>[ENABLE]
//code from here to '[DISABLE]' will be used to enable the cheat
aobscanmodule(cJmpIfNotEnoughFundsOnWeaponBuyAOB,NieRAutomata.exe,41 39 12 7C 1D)
registersymbol(cJmpIfNotEnoughFundsOnWeaponBuyAOB)

cJmpIfNotEnoughFundsOnWeaponBuyAOB+3: //"NieRAutomata.exe"+731D65:
db 90 90

///*************************************///

aobscanmodule(cJmpIfEnoughFundsOnWeaponBuyAOB,NieRAutomata.exe,39 01 7D ** E8)
registersymbol(cJmpIfEnoughFundsOnWeaponBuyAOB)

cJmpIfEnoughFundsOnWeaponBuyAOB+2: //"NieRAutomata.exe"+730D70:
db EB

///*************************************///

aobscanmodule(cJmpIfEnoughFundsOnMaintenanceBuyAOB,NieRAutomata.exe,3B C3 0F 8E ** ** ** ** 8B ** ** ** ** ** EB)
registersymbol(cJmpIfEnoughFundsOnMaintenanceBuyAOB)

cJmpIfEnoughFundsOnMaintenanceBuyAOB+2: //"NieRAutomata.exe"+731EC6:
db 90 E9

///*************************************///

aobscanmodule(flagChkForQuantityIncInBuyAOB,NieRAutomata.exe,85 C0 0F 84 ** ** ** ** 44 ** ** ** ** ** ** 41 ** ** 44)
registersymbol(flagChkForQuantityIncInBuyAOB)

flagChkForQuantityIncInBuyAOB+1: //"NieRAutomata.exe"+7318C6:
db E4

///*************************************///

aobscanmodule(cJmpIfNotEnoughFundsOnFuseInMaintenanceAOB,NieRAutomata.exe,3B 01 0F 8F ** ** ** ** BA)
registersymbol(cJmpIfNotEnoughFundsOnFuseInMaintenanceAOB)

alloc(originalcode_ignorefunds,2048,cJmpIfNotEnoughFundsOnFuseInMaintenanceAOB+2) //"NieRAutomata.exe"+730F84)
registersymbol(originalcode_ignorefunds)

originalcode_ignorefunds:
readmem(cJmpIfNotEnoughFundsOnFuseInMaintenanceAOB+2,6)
//jg NieRAutomata.exe+731098

cJmpIfNotEnoughFundsOnFuseInMaintenanceAOB+2: //"NieRAutomata.exe"+730F84:
db 90 90 90 90 90 90




[DISABLE]
//code from here till the end of the code will be used to disable the cheat
cJmpIfNotEnoughFundsOnWeaponBuyAOB+3: //"NieRAutomata.exe"+731D65:
db 7C 1D
//Alt: jl NieRAutomata.exe+731D84

///*************************************///

cJmpIfEnoughFundsOnWeaponBuyAOB+2: //"NieRAutomata.exe"+730D70:
db 7D
//Alt: jnl

///*************************************///

cJmpIfEnoughFundsOnMaintenanceBuyAOB+2: //"NieRAutomata.exe"+731EC6:
db 0F 8E
//Alt: jng

///*************************************///

flagChkForQuantityIncInBuyAOB+1: //"NieRAutomata.exe"+7318C6:
db C0

///*************************************///

cJmpIfNotEnoughFundsOnFuseInMaintenanceAOB+2: //"NieRAutomata.exe"+730F84:
readmem(originalcode_ignorefunds,6)
//db 0F 8F 0E 01 00 00
//Alt: jg NieRAutomata.exe+731098

dealloc(originalcode_ignorefunds)
unregistersymbol(originalcode_ignorefunds)
</AssemblerScript>
    </CheatEntry>
  </CheatEntries>
</CheatTable>
Ignore Funds & Materials (Upgrade)
- allows you to upgrade any weapons or pods, regardless of your remaining funds and materials, tested on Weapon shop and Maintenance shop.
- funds and materials still drop until they reach zero when upgrade.
- copy & paste the following ONto the table you're using.

Code: Select all

<?xml version="1.0" encoding="utf-8"?>
<CheatTable>
  <CheatEntries>
    <CheatEntry>
      <ID>47143</ID>
      <Description>"Ignore Funds &amp; Materials (Upgrade)"</Description>
      <LastState Activated="1"/>
      <VariableType>Auto Assembler Script</VariableType>
      <AssemblerScript>[ENABLE]
//code from here to '[DISABLE]' will be used to enable the cheat
aobscanmodule(setFlagAfterMaterialChkOnWeaponUpgradeAOB,NieRAutomata.exe,41 8B C6 48 83 C4 28 41 5E 5B C3)
registersymbol(setFlagAfterMaterialChkOnWeaponUpgradeAOB)

alloc(newmem,2048,setFlagAfterMaterialChkOnWeaponUpgradeAOB) //"NieRAutomata.exe"+5EE620)
label(returnhere)
label(originalcode)
label(exit)

newmem: //this is allocated memory, you have read,write,execute access
//place your code here
mov eax,1

originalcode:
//mov eax,r14d
add rsp,28

exit:
jmp returnhere

///

setFlagAfterMaterialChkOnWeaponUpgradeAOB: //"NieRAutomata.exe"+5EE620:
jmp newmem
nop
nop
returnhere:

///***************************************///

aobscanmodule(setFlagAfterFundsChkOnWeaponUpgradeAOB,NieRAutomata.exe,40 0F 9E C7 8B C7 48 83 C4 20 5F C3)
registersymbol(setFlagAfterFundsChkOnWeaponUpgradeAOB)

setFlagAfterFundsChkOnWeaponUpgradeAOB: //"NieRAutomata.exe"+734107:
db 90 40 B7 01

///***************************************///

aobscanmodule(setFlagAfterMaterialChkOnPodUpgradeAOB,NieRAutomata.exe,48 ** ** ** ** 8B C5 48 83 C4 28 5D 5B C3)
registersymbol(setFlagAfterMaterialChkOnPodUpgradeAOB)

alloc(newmem4,2048,setFlagAfterMaterialChkOnPodUpgradeAOB+5) //"NieRAutomata.exe"+5EE8C6)
label(returnhere4)
label(originalcode4)
label(exit4)

newmem4: //this is allocated memory, you have read,write,execute access
//place your code here
mov eax,1

originalcode4:
//mov eax,ebp
add rsp,28

exit4:
jmp returnhere4

///

setFlagAfterMaterialChkOnPodUpgradeAOB+5: //"NieRAutomata.exe"+5EE8C6:
jmp newmem4
nop
returnhere4:

///***************************************///

aobscanmodule(setFlagAfterFundsChkOnPodUpgradeAOB,NieRAutomata.exe,0F 9E C2 8B C2 48 83 C4 28 C3)
registersymbol(setFlagAfterFundsChkOnPodUpgradeAOB)

setFlagAfterFundsChkOnPodUpgradeAOB: //"NieRAutomata.exe"+7344F8:
db 90 B2 01





[DISABLE]
//code from here till the end of the code will be used to disable the cheat
dealloc(newmem)
setFlagAfterMaterialChkOnWeaponUpgradeAOB: //"NieRAutomata.exe"+5EE620:
db 41 8B C6 48 83 C4 28
//Alt: mov eax,r14d
//Alt: add rsp,28

///***************************************///

setFlagAfterFundsChkOnWeaponUpgradeAOB: //"NieRAutomata.exe"+734107:
db 40 0F 9E C7
//Alt: setle dil

///***************************************///

dealloc(newmem4)
setFlagAfterMaterialChkOnPodUpgradeAOB+5: //"NieRAutomata.exe"+5EE8C6:
db 8B C5 48 83 C4 28
//Alt: mov eax,ebp
//Alt: add rsp,28

///***************************************///

setFlagAfterFundsChkOnPodUpgradeAOB: //"NieRAutomata.exe"+7344F8:
db 0F 9E C2
//Alt: setle dl
</AssemblerScript>
    </CheatEntry>
  </CheatEntries>
</CheatTable>
Undead
- original script by TheByteSize
- health still drop until it reaches the min Health % specified but you won't die.
- min Health % default: 30
- note that the % is calculate on the max health BASE without adding the "Max HP Up +?" Plug-in Chips.
- default min Health % can be changed by editing the script, line 3.

Code: Select all

<?xml version="1.0" encoding="utf-8"?>
<CheatTable>
  <CheatEntries>
    <CheatEntry>
      <ID>47153</ID>
      <Description>"Undead .2"</Description>
      <Options moHideChildren="1"/>
      <LastState Activated="1"/>
      <VariableType>Auto Assembler Script</VariableType>
      <AssemblerScript>[ENABLE]
//code from here to '[DISABLE]' will be used to enable the cheat
define(minhealthpercentdefault,#30)

aobscanmodule(NRA_Inf_HP_AOB,NieRAutomata.exe,29 BB 68 06 01 00) // should be unique
registersymbol(NRA_Inf_HP_AOB)

label(dMinHealthPercent)
registersymbol(dMinHealthPercent)

alloc(newmem,2048,NRA_Inf_HP_AOB) //"NieRAutomata.exe"+1FA423)
label(returnhere)
label(originalcode)
label(exit)

newmem: //this is allocated memory, you have read,write,execute access
//place your code here
/*
mov eax,[rbx+10668]
sub eax,edi
cmp eax,[dMinHealth]
jge @f
mov eax,[dMinHealth]
add eax,edi
mov [rbx+10668],eax
*/
mov rcx,dMinHealthPercent
push [rbx+85c] //max
fild dword ptr [rbx+85c]
fimul dword ptr [rcx]
fidiv dword ptr [rcx+4]
fistp [rsp]
mov eax,[rbx+10668]
sub eax,edi
cmp eax,[rsp]
jge @f
mov eax,[rsp]
add eax,edi
mov [rbx+10668],eax
@@:
add rsp,8

originalcode:
sub [rbx+00010668],edi

exit:
jmp returnhere

///
dMinHealthPercent:
dd minhealthpercentdefault
dd #100
///

NRA_Inf_HP_AOB: //"NieRAutomata.exe"+1FA423:
jmp newmem
nop
returnhere:


 
 
[DISABLE]
//code from here till the end of the code will be used to disable the cheat
dealloc(newmem)
NRA_Inf_HP_AOB: //"NieRAutomata.exe"+1FA423:
db 29 BB 68 06 01 00
//Alt: sub [rbx+00010668],edi

unregistersymbol(dMinHealthPercent)
</AssemblerScript>
      <CheatEntries>
        <CheatEntry>
          <ID>47154</ID>
          <Description>"min Health %"</Description>
          <LastState Value="30" RealAddress="13FFC0052"/>
          <VariableType>4 Bytes</VariableType>
          <Address>dMinHealthPercent</Address>
        </CheatEntry>
      </CheatEntries>
    </CheatEntry>
  </CheatEntries>
</CheatTable>
made based on a crack game, may or may not work on steam.

Re: NieR Automata

Posted: Fri May 19, 2017 6:06 pm
by Lendie
Anybody able to make a script like the one for Highlighted Items, but instead for Hightlighted Weapons ?

Re: NieR Automata

Posted: Sat May 20, 2017 8:12 pm
by Cielos
Kira wrote:
Tue May 16, 2017 3:28 pm
Is it possible to create a hack where we can use character at end game where there are not normally available? Like 2B on the final chapter.
find these two address, after you changed the value, save and reload.
the first address is the head accessory type, 0 is default, 1, is a white flower, and so on...

Code: Select all

<?xml version="1.0" encoding="utf-8"?>
<CheatTable>
  <CheatEntries>
    <CheatEntry>
      <ID>47160</ID>
      <Description>"head type?"</Description>
      <DropDownList DisplayValueAsItem="1">0:default
1:white flower
</DropDownList>
      <LastState Value="5" RealAddress="141984348"/>
      <VariableType>4 Bytes</VariableType>
      <Address>NieRAutomata.exe+1984348</Address>
    </CheatEntry>
  </CheatEntries>
</CheatTable>
the second one is the body type, 0 is default, 1 is dlc outfit, 2 is full armor, 3 is armor without helmet, from 4 on SEEMS to be just using the default body.

Code: Select all

<?xml version="1.0" encoding="utf-8"?>
<CheatTable>
  <CheatEntries>
    <CheatEntry>
      <ID>47158</ID>
      <Description>"body type?"</Description>
      <DropDownList DisplayValueAsItem="1">0:default
1:dlc
2:full armor
3:armor (no helmet)
</DropDownList>
      <LastState Value="0" RealAddress="141984354"/>
      <VariableType>4 Bytes</VariableType>
      <Address>NieRAutomata.exe+1984354</Address>
    </CheatEntry>
  </CheatEntries>
</CheatTable>
I think some addresses around these 2 addresses should control other appearance as well, so, if these 2 doesn't hold the value that represent the "final chaper 2B", they may be resides around these 2 addresses..

I myself am still very early in the game... so what you can do is, load the save with 2B in final chapter, see what values these 2 addresses are. if they are different than the default values, try load another save in earlier chapters, change the values to the one you jot down, do a save and reload and see the result.
if it's not the case, you can try comparing the values around these 2 address in different situation (e.g., load the save in final chapter while 2B has a different appearance, view the addresses in the memory view, copy the values around (couple of lines should be enough from the look of it), then load a save with 2B in a "normal" appearance, copy the values again, and....compare them....), you may find something there.
in any case, please share the results.

this is just the preliminary steps. after we confirm the static address(es) that "control" the appearance, we can start back-tracing and try to change 2B to other characters as well.
just still too early to say though, right now, I simply don't have enough info and patient to investigate more.. and the game is out for quite a while already, it's not like we are in a hurry anymore..
anyway, good luck~

P.S.
as you can see these 2 are just static addresses, if they can't even change the outfit after save and reload, please let me know and I'll try to write a script to fetch the pointers.
PPS
back up your saves first~

Re: NieR Automata

Posted: Sun May 21, 2017 5:59 am
by HeavyGrinder
Hi there, is there any chance to give 2b the 'hacking' ability so that we can unlock the locked chests in the first playthrough? :O


Thanks! ;p

Re: NieR Automata

Posted: Sun May 21, 2017 4:44 pm
by alex_hama
A2 berserk for 2B would be nice too.

Re: NieR Automata

Posted: Sun May 21, 2017 9:57 pm
by Cielos
made a experimental script: Evade Attack (which is kind of a by-product actually...).
when activated, hold Alt and attack (light, heavy, or pod's projectile) would use the evade attack without the need to have a successful evade first.
copy and paste the following ONto the table:

Code: Select all

<?xml version="1.0" encoding="utf-8"?>
<CheatTable>
  <CheatEntries>
    <CheatEntry>
      <ID>47192</ID>
      <Description>"Evade Attack (Alt)"</Description>
      <Options moHideChildren="1"/>
      <LastState Activated="1"/>
      <VariableType>Auto Assembler Script</VariableType>
      <AssemblerScript>[ENABLE]
//code from here to '[DISABLE]' will be used to enable the cheat
aobscanmodule(somePlayerInfoBaseFetchAOB,NieRAutomata.exe,48 8B 17 48 8B CF FF ** ** 48 85 C0)
registersymbol(somePlayerInfoBaseFetchAOB)

label(somePlayerInfoBase)
registersymbol(somePlayerInfoBase)

alloc(newmem2,2048,somePlayerInfoBaseFetchAOB) //"NieRAutomata.exe"+640054)
label(returnhere2)
label(originalcode2)
label(exit2)

newmem2: //this is allocated memory, you have read,write,execute access
//place your code here
mov [somePlayerInfoBase],rdi

originalcode2:
mov rdx,[rdi]
mov rcx,rdi

exit2:
jmp returnhere2

///
somePlayerInfoBase:
///

somePlayerInfoBaseFetchAOB: //"NieRAutomata.exe"+640054:
jmp newmem2
nop
returnhere2:

///***************************************************///

aobscanmodule(playerStanceWriteAOB,NieRAutomata.exe,89 FA 89 83 ** ** ** ** 8B 83)
registersymbol(playerStanceWriteAOB)

label(wEvadeMoveKeyPressed)
registersymbol(wEvadeMoveKeyPressed)
label(somePlayerInfo)
registersymbol(somePlayerInfo)

alloc(newmem,2048,playerStanceWriteAOB) //"NieRAutomata.exe"+2F43A92)
label(returnhere)
label(originalcode)
label(exit)

newmem: //this is allocated memory, you have read,write,execute access
//place your code here

mov [somePlayerInfo],rbx

//cmp edi,6
//je @f
//test edi,edi
//jz @f

cmp edi,10
je @f
jmp originalcode

@@:
mov rdx,somePlayerInfoBase
cmp [rdx],rbx
jne @f
cmp word ptr [wEvadeMoveKeyPressed],1
jne @f
mov word ptr [wEvadeMoveKeyPressed],2
mov edi,13

@@:

originalcode:
mov edx,edi
mov [rbx+00000990],eax

exit:
jmp returnhere

///
wEvadeMoveKeyPressed:
dd 0
somePlayerInfo:
///

playerStanceWriteAOB: //"NieRAutomata.exe"+2F43A92:
jmp newmem
nop
nop
nop
returnhere:

///***************************************************///

label(bEndThread_evadeMove_keylistener_mem)
registersymbol(bEndThread_evadeMove_keylistener_mem)

alloc(evadeMove_keylistener_mem,2048,"NieRAutomata.exe")
registersymbol(evadeMove_keylistener_mem)
createthread(evadeMove_keylistener_mem)
label(keylistenerstart)
label(keylistenerend)
label(keylistenerexit)

evadeMove_keylistener_mem:
sub rsp,28

keylistenerstart:
mov rcx,12    //ALT key
push rcx
call GetAsyncKeyState
add rsp,08
shr ax,#15
cmp ax,1
jne @f
cmp word ptr [wEvadeMoveKeyPressed],2
je keylistenerend
mov [wEvadeMoveKeyPressed],ax
jmp keylistenerend

@@:
xor ax,ax
mov [wEvadeMoveKeyPressed],ax

keylistenerend:
mov rcx,#100
call Sleep
cmp dword ptr [bEndThread_evadeMove_keylistener_mem],1
jne keylistenerstart

keylistenerexit:
add rsp,28
mov dword ptr [bEndThread_evadeMove_keylistener_mem],2
ret

///
bEndThread_evadeMove_keylistener_mem:
dd 0
///



[DISABLE]
//code from here till the end of the code will be used to disable the cheat
//obtained from SubBeam's ACS script - start//
{$lua}

if( syntaxcheck == false ) then --actual execution
  local starttime = getTickCount()

if readInteger( "bEndThread_evadeMove_keylistener_mem" ) == 0 then --could be 2 already
  writeInteger( "bEndThread_evadeMove_keylistener_mem", 1 ) --tell the thread to kill itself
end

while( getTickCount() &lt; starttime + 1000 ) and ( readInteger( "bEndThread_evadeMove_keylistener_mem" ) ~=2 ) do --wait till it has finished
  sleep( 20 )
end

if( getTickCount() &gt; starttime + 1000 ) then --could happen when the window is shown
  showMessage( 'Disabling the thread failed!' )
  error( 'Thread disabling failed!' )
end
  sleep( 1 )
end

{$asm}
//obtained from SubBeam's ACS script - end//

//bEndThread_evadeMove_keylistener_mem:
//dd 1

///***************************************************///

dealloc(newmem2)
somePlayerInfoBaseFetchAOB: //"NieRAutomata.exe"+640054:
db 48 8B 17 48 8B CF
//Alt: mov rdx,[rdi]
//Alt: mov rcx,rdi

unregistersymbol(somePlayerInfoBase)

///***************************************************///

dealloc(newmem)
playerStanceWriteAOB: //"NieRAutomata.exe"+2F43A92:
db 89 FA 89 83 90 09 00 00
//Alt: mov edx,edi
//Alt: mov [rbx+00000990],eax

unregistersymbol(somePlayerInfo)
unregistersymbol(wEvadeMoveKeyPressed)

///***************************************************///

unregistersymbol(bEndThread_evadeMove_keylistener_mem)

dealloc(evadeMove_keylistener_mem)
unregistersymbol(evadeMove_keylistener_mem)
</AssemblerScript>
      <CheatEntries>
        <CheatEntry>
          <ID>47195</ID>
          <Description>""</Description>
          <Options moHideChildren="1"/>
          <LastState Value="" RealAddress="00000000"/>
          <GroupHeader>1</GroupHeader>
          <CheatEntries>
            <CheatEntry>
              <ID>47193</ID>
              <Description>"stance"</Description>
              <ShowAsHex>1</ShowAsHex>
              <VariableType>4 Bytes</VariableType>
              <Address>somePlayerInfoBase</Address>
              <Offsets>
                <Offset>670</Offset>
              </Offsets>
            </CheatEntry>
          </CheatEntries>
        </CheatEntry>
      </CheatEntries>
    </CheatEntry>
  </CheatEntries>
</CheatTable>