Horizon Forbidden West [Engine:Decima]

Upload your cheat tables here (No requests)
Post Reply
User avatar
SunBeam
Administration
Administration
Posts: 4782
Joined: Sun Feb 04, 2018 7:16 pm
Reputation: 4412

Horizon Forbidden West [Engine:Decima]

Post by SunBeam »

Kindly DO NOT POST this table on other forums/communities (e.g.: Nexus, OCD, 3DM forums). Much like you prefer those places, I prefer FRF and I have created this exclusively for this community. If you want to spread the news and let others enjoy all of this, help them, etc. then please link them to this post on FRF instead. Thank you for respecting my choice!

Lastly, since this has been a continuous nuisance: I DO NOT ALLOW TRANSLATING MY TABLES TO ANY LANGUAGE AND SOME RANDOM GUY POSTING THEM FOR OTHERS WHO DON'T KNOW ENGLISH. My mother tongue isn't English, but I learned it anyway. If I could do it, so can you.

I DO NOT ALLOW ANY OF MY TABLES POSTED ON 3DM FORUMS. Why? Simple. Because the Chinese users have the habit of taking tables from FRF, translating them to Chinese and posting them there WITHOUT EXPLICITLY ASKING FOR PERMISSION. They say the people don't know how to read English, but the outcome is simple: the poster gets all the praise, including donations for translating other people's work T_T The original author is therefore a thing of the past, as the focus becomes the Chinese wording, rather than what they are using from the table. Remember the translator did not create the options in the table! So no, one more time, from now on till forever: YOU ARE NOT ALLOWED TO POST ANY OF MY TABLES, IN ANY FORM OR SHAPE, ON 3DM FORUMS. It's high time I've addressed this because it seems the mentality there is toxic, knows no shame or gives any respect to table makers.


[ 05 Apr 24 - Update #4 ]

Game Name: Horizon Forbidden West
Game Vendor: Steam
Game Version: HRZ2-PCR / 15:08 - Wed Apr 03 2024 (1.1.47) | [ should be compatible with 1.0.37, 1.0.38 and 1.0.43.0 ]
Game Process: HorizonForbiddenWest.exe



Image

------------------------------------------------------------------------------------------------------------------------------------------------
Features: (in the screenshot above you can see a listing of the sections and which options I am regularly using)
------------------------------------------------------------------------------------------------------------------------------------------------

Please note the whole table is HIGHLY customizable so you can tailor it to your needs and style. You will be given extended explanations below, so please fucking take the time to READ through it all. Starting with Update #3, the options have been categorized, for easier management and use.

[ Player ] > Invulnerability [+Hacked Machines]
Aloy becomes invulnerable via LocalPlayer->Entity->Destructibility->mInvulnerable Property being set to 0x1. This happens the moment you get hit. Similarly, any hacked machines you own will become invulnerable as well. It doesn't matter if you're mounted or on foot, as long as the ControlledEntity belongs to the HackedMachines AIGroup (0x5), they will be invulnerable. If you don't like to play with immunity to hits or elemental effects and/or the same applied to your hacked machines, then comment lines 15 and/or 39 in the script (right-click the script > Change script) by placing // at the start of the line. Reload a save-game and you're set. From that point onwards, you get hit, but Health doesn't decrease (all other elemental attacks will affect you).

NOTE: It appears the mInvulnerable bools for you and your hacked machines are stored in your save-game. If it happens that, after a save/reload, you can't disable it, then:
  • disable the script
  • head into [ Pointers/Structures ]
  • click the [-] in front of "LocalPlayer ['PlayerGame']" (do not tick the checkbox next to it!)
  • click the [-] in front of "[0048] Humanoid['Entity']" (do not tick the checkbox next to it!)
  • click the [-] in front of "[00D0] Destructibility" (do not tick the checkbox next to it!)
  • double-click the 1 value your see for "[0070] mInvulnerable" and set it to 0
  • mount your hacked machine
  • click the [-] in front of "[0080] Mount['ControlledEntity']" (do not tick the checkbox next to it!) under the "[0048] Humanoid['Entity']" tree
  • click the [-] in front of "[00D0] Destructibility" (do not tick the checkbox next to it!) under the "[0080] Mount['ControlledEntity']" tree
  • double-click the 1 value your see for "[0070] mInvulnerable" and set it to 0
Save the game after this and you're set.

--

[ Player ] > Set Mounted Controlled Entity Invulnerable
While mounted, click to RUN this script and set your mount's Destructibility->mInvulnerable setting to 0x1. If you want this reset, then disable the script (disabling doesn't run anything), right-click the script > Change script, head to line 17 and set it to writeBytes( Destructibility + 0x70, 0 ). Re-run the script while mounted. It will disable invulnerability for your mount.

NOTE: This is not a freeze script. You just use it to set a property on activation/run of script. So don't let me hear you "I enabled the script, but my mount doesn't stay invulnerable". Use the script above for that.

--

[ Player ] > Infinite Oxygen & Stamina
Sets the DebugSettings->mInfiniteOxygen developer setting to 1. The outcome: no oxygen bar is displayed anymore in the middle of your screen as you dive underwater, nor does that oxygen bar deplete. You can inspect all the exposed DebugSettings flags in [ Pointers/Structures ] by clicking the [-] in front of g_DebugSettings (do not tick the checkbox next to it!). This affects Weapon Stamina by not allowing it to deplete when you use the various skills!

--

[ Player ] > Fly-Jump
Will hook the update of fall state of the player's HumanoidMover component and perform several actions when this hook is hit:
  • it will constantly update the mPositionFallingFrom XYZ with the player entity's mPosition values
  • it will constantly update the mLastPositionThatWasTouchingGround XYZ with the player entity's mPosition values
Doing this will disable taking damage from falling. The game thinks you're constantly falling from the current XYZ position, so there's no timer to calculate that would be applied to falling damage (it remains 0).
  • it will constantly write 1 to mIsOnGround and mIsSupported properties of HumanoidMover
This makes the game think you're always on the ground surface and on ground that supports the player (so not attached to a wall). Because of this setting you can perform multiple jumps (give it 1 second pause before you hit Space key again) and can control whether or not to fall slowly to the ground.
  • it will constantly write 0 to mTimeSinceWeLastTouchedTheGround and mTimeInFallingState properties of HumanoidMover
This will make the game think you've never left the ground and did not spend time falling.
  • it apply on a specific key press a value calculated based on the HumanoidMoverResource->mMaxFallSpeed and a divisor to HumanoidMover->mVerticalVelocity property
Once you activate the script, you can use T and Y keys to boost your player up or down in the air. If you want to hike up to a mountain, toggle running (Shift key pressed 1 time or held pressed, depending on your accessibility settings), then keep T pressed to ascend as you move :) Release T key once you're above the landing spot you like to fall to it. The keys can be modified inside the script (right-click script > Change script > see lines 45 and 56).

Lastly, you can control several aspects with the 2 sub-settings that appear once you enable this script:
  • Disable On Ground Updates?
    Double-click the 'No' and pick 'Yes' from the drop-down. This will skip ground update checks, meaning mIsOnGround and mIsSupported are not forced anymore to 1. The outcome of this: the player won't be detected as standing on the ground, meaning now you can use ziplines (attach to them),
  • Fast Fall?
    Double-click the 'Yes' and pick 'No' from the drop-down. This will not let the HumanoidMover::Update function continue execution and instantly exit after all settings have been applied. The outcome of this is slow descent of the player towards the ground. Press space key several times ( 0.5-1 second delay apart) and gain some height. Then watch Aloy slowly lose altitude. Because this function exits fast, the velocity can't be applied. That means pressing T key won't boost you upwards.
NOTE: Using this option as it's implemented, without changing the two settings above, will not make it possible for you to attach ziplines or even use the glider. Why? The game thinks you're on the ground and you don't have enough time to hold space pressed to deploy the glider. Read below to know how to still achieve this.

Combinations and outcomes:
  • Disable On Ground Updates? = No; Fast Fall? = Yes (defaults)
    Can't attach to ziplines (on attach you immediately detach). Can use the glider only for a small distance. To make use of it, you NEED to press Space first so Aloy jumps, then hold T key to boost up, then hold Space to deploy glider. There will be fast falling, no falling animation and no damage sound when hitting the ground (your fall hits a cushion break near the ground; like falling on a pillow).
  • Disable On Ground Updates? = Yes; Fast Fall? = Yes
    Can attach to ziplines. Can use the glider only for a small distance. To make use of it, you NEED to press Space first so Aloy jumps, then hold T key to boost up, then hold Space to deploy glider. There will be fast falling, no falling animation and no damage sound when hitting the ground (your fall hits a cushion break near the ground; like falling on a pillow).
  • Disable On Ground Updates? = Yes; Fast Fall? = No
    Can attach to ziplines. Can use the glider normally. You can still press Space first so Aloy jumps, then hold T key to boost up, then hold Space to deploy glider and glide nicely to your destination. There will be fast falling, falling animation this time around (Aloy shaking arms and legs as you gain considerable height and as she falls) and there will be damage sound when hitting the ground from great heights. No damage incurred though.

    NOTE: You can press T key and hold it to gain height while using the Shieldwing Glider ;) The BEST way to UNFOG the map :P Just make sure not to cross boundaries where normally you'd get via underwater caverns, as this would not load in the rock walls you're supposed to drill/explode away.
  • Disable On Ground Updates? = No; Fast Fall? = No
    Because there is slow falling, attaching to ziplines will constantly detach and re-attach you :) Can use the glider only for a small distance. To make use of it, you NEED to press Space several times to gain height, then double-tap and hold Space to deploy glider. There won't be any falling animation and no damage sound when hitting the ground from great heights. Use this as a bunny-hop feature, if you want, to reach locations (press Space bar 0.5 seconds apart to gain height).

    NOTE: There is a known bug in the game where acquiring the Plainsong Drone may be impossible, due to it not stopping where it should or moving too fast:
    • moving too fast: close the game and restart from your last save (there's some camp fire nearby)
    • not stopping where it should: it usually stops above the middle door, between the turrets

    For the latter part, use Fly-Jump with 1-No, 2-No and bunny hop around the sides so you can meet the drone where it stops. I could only attach to it going towards the door, towards the mountain. Doing it from the mountain didn't work for me because the drone is a bit oblique. Combine it with "Player : Undetected (IsAliveForAI = false)" so you're not bothered while doing it. Takes a bit of trying, but you can get it.

    Here's my run:


In any scenario you can still attach to yellow surfaces (e.g.: highlighted mountain walls or wooden ledges). I usually leave it on default settings, hit Shift to start running (I set "Toggle Sprint" to "On" in Settings > Accessibility) and hold T to gain height. Stop holding when I'm comfortable and press T every now and then when I need to. This can also be used when you're doing some parkour up a wall and fall off of it. Press/hold T key to spring you back up and continue from there, if you like wall-climbing that much. You can bypass invisible walls set in front of some area or quest that is not yet accessible, however I do NOT recommend it as you may break progression! And then come whining back you've bricked your progress and look for some solution. Bottom line: please use it with moderation and common sense.

--

[ Player ] > Undetected (IsAliveForAI = false)
This hooks PlayerHumanoid::IsAliveForAI function, returning false on each tick. The outcome of this is you're considered dead to any AI the detection radius you enter in. Regarded as full stealth, if you will. You can now easily Silent Strike machines -or- combined with fly-jump, Strike From Above.

--

[ Player ] > Undetected By AIFaction (AIFaction = "Neutral")
Grayed out. Not yet implemented. The original idea of this script was to allow you to swap AIFactions. That meant you could set your Player to any faction you'd like. For example, setting to EnemyToAll faction will make you an enemy of everyone, including your mount/hacked machine. During testing, it was funny to see the immediate assault of my mount. Then I thought: "why not change to Neutral faction?" -> which leads to the title of this not-yet-implemented script. Neutral leads to being alive (as opposed to the script above), but zero reaction from anyone, including wildlife. The caveat is you wouldn't be able use Silent Strike or Strike From Above, as the Neutral AIFaction doesn't have abilities :) Now you know what it's supposed to do and why it's there, in gray color.

<< Haven't gotten to resume work on it. >>

--

[ Weapon ] > Infinite Ammo
Sets the DebugSettings->mInfiniteAmmo developer setting to 1. The outcome: any tools you use won't deplete inventory quantity, bow clip ammo will be set to 2 and replenished to 2 (shoot, gets set to 1, then set back to 2) as you fire arrows. You can inspect all the exposed DebugSettings flags in [ Pointers/Structures ] by clicking the [-] in front of g_DebugSettings. DO NOT TICK THE CHECKBOX! The effect of that is freezing a value and you don't want that.

--

[ Weapon ] > Infinite Size Clip
Sets the DebugSettings->InfiniteSizeClip developer setting to 1. The outcome: any tools you use won't deplete inventory quantity, bow clip ammo will not deplete and you get the extra of burst fire with the default setting (as if you had the Triple Notch skill purchased) and fast firing. NO, I cannot split settings apart; that's how the developer setting works, you're gonna have to live with it. You can inspect all the exposed DebugSettings flags in [ Pointers/Structures ] by clicking the [-] in front of g_DebugSettings. DO NOT TICK THE CHECKBOX! The effect of that is freezing a value and you don't want that.

--

[ Weapon ] > Set Burst Size To 20
This script SETS a series of values, does not freeze them. You will have to re-run it for each weapon you use (activate, check in-game by shooting your weapon, deactivate, swap weapon, activate, etc.). Repeat till you have set all your weapons' burst sizes to 20. You can control the amount by editing line 35 in the script (right-click script > Change script). Yes, a game save reload will have you redo all this. The outcome: your current weapon -YES, EVEN ATTACHED ONES- will get a fired burst size of 20 projectiles or ejectors, as the game calls them. For bows, this means firing 20 arrows. For attached weapons, this means click 1 time and the weapon will automatically fire 20 times on its own (saw this effect with the Slitherfang thingie). For this script to have any effect on your weapon, you need to have Triple Notch skill purchased -or- Weapon : Infinite Size Clip script active! Just so you don't say I didn't tell you. And if I hear anyone bitch, I will know they didn't read the given explanations...

--

[ Weapon ] > Set (Remove) Recoil & Spread Image
This script SETS a series of values, does not freeze them. You will have to re-run it for each weapon you use (activate, check in-game by shooting your weapon, deactivate, swap weapon, activate, etc.). Repeat till you have set all your weapons' recoil and spread removed. Yes, a game save reload will have you redo all this. The outcome: your current weapon's Accuracy and Spread settings are modified to give best accuracy and no spread (removal of recoil & spread and increased accuracy). Thank me later! :P

--

[ Weapon ] > Always Charged
Ah, yes, this one. When you activate it, fire 1 time with your current weapon. Repeat for any other weapons you want to use. While this script is active, what will happen is after first shot fired, the bow will go into charged mode and remain like that (in tension). Note that for weapons where movement affects the reticle, this wont bypass that aspect. For example, your Sharpshoot Bow fires all projectiles (1 or many, if you have enabled "Weapon : Infinite Size Clip" + "Weapon : Set Burst Size To 20") directly in the middle of the reticle, whereas if you move, the reticle expands and you'll do a burst shot. There is a sub-setting to this script, once activated, -- "Keep Charged On Swap/Holster?" -- to control whether or not you want the charge state to be preserved while swapping or holstering weapons (or any action -like E-picking up of items- that leads to holstering the weapon). If you double-click its Value and set it to 'No', then you will have to repeat the steps above: fire 1 time, weapon stays charged after that till you swap with another or gets holstered. Because of constantly sending the weapon into charged mode, you will hear the bow string sound effect playing every now and then! Can't do anything about it, I don't mind it and play with it as is. If your OCD is too strong, don't use the option, please.

Technicalities: achieved by hooking 2 functions -> WeaponCharge::DissipateCharge and WeaponCharge::Init. To send to charged state, I fiddled with the WeaponCharge->mChargeState enum (CHARGE_CHARGED = 0x3), WeaponCharge->mChargeMagnitude float and WeaponCharge->mDischargeWhileFiring float properties, as well as adjusting the WeaponChargeResource->CurveResource float value so reticle contracts faster. To prevent reset, I am forcing WeaponCharge->mChargeMagnitude to staty at 1.0f in WeaponCharge::Init, among two more settings.

KNOWN ISSUE: You will crash if you pick-up an attachable weapon (e.g.: Ravager Cannon) and E-drop it or hit Mouse 1 to start a melee attack, which drops the item. Set "Keep Charged On Swap/Holster?" to No, so the state of the weapon you carry is properly reset on drop.

--

[ Weapon ] > Kill Focus Consumption
This script sets to 0 the BulletTimeComponent->fConsumptionRate when BulletComponent::CanBulletTime function is run. The outcome: with weapon drawn (right-click held), press and hold Shift to concentrate. You will see the Focus white bar won't be consumed anymore (won't decrease).

--

[ Inventory & Stash ] Image

Due to the complexity and amount of details for these scripts, you may continue reading in the post below: viewtopic.php?p=343624#p343624.

--

[ Valor ] > Set To Max
This script SETS a value, does not freeze it. Disable and re-enable every time you need it, if you need it. Else, skip to next script. The outcome: will get your Valor bar to full state, taking into account the upgrade levels you've unlocked along the way. This is done by getting the CombatRewardsComponent from Player->Inventory, getting the upgrade level value via CombatRewardsComponent::GetLevel and calculating the offset where to read the MaxValor float. Then this value is updated into CombatRewardsComponent->Valor

--

[ Valor ] > Always Update To Max
This script hooks CombatRewardsComponent::MsgEntityUpdate function running every tick. While hit, it will perform the operations above, allowing the subtraction (floar in [rdx+1C]) value to get consumed. Could've set it to 0, but keep reading. The outcome: Valor stays at and is refreshed to max all the time. No consumption. Note that this sets the Valor value, does not run the function that updates Valor. Why mention this? Because I don't want to hear "yeah, but the white ruby-like stealth indicator on the HUD does not become purple". You now know why. This doesn't affect functionality, but thought I'd explain it for the strong OCD people. Now.. because I let the value get consumed, although it gets reset back to Max, in scenarios where you hold bow drawn, run Pullcaster against a box to drag it or enter some chat with an NPC, Stealth Stalker -- let's use this as refence -- gets disabled. Once you finish any of those actions, Stealth Stalker is re-enabled. Well.. if I don't let the [rdx+1C] float get consumed and set it to 0, in any of those scenarios, Stealth Stalker wouldn't get re-enabled. So I would've had to disable the script, let Valor deplete a bit, then you'd see re-enablement automatically. Why bother with it like that, right?

--

[ Challenges ] > Freeze Timer [Hunting Grounds, Melee Pits]
This script will hook Challenge::OnStarted tick function. When hit, the CurrentWorldTick float value is updated constantly into Challenge->mTick and Challenge->mStartedTimestamp float properties. The outcome: the game updates the starting time of the challenge to always be in the current frame tick. Result: timer is frozen and set to max. You will finish the challenge with 00:00 time. For OCD people: if you don't want this latter aspect, then disable script (if enabled), right-click the script > Change script > comment lines 40 and 64 by writing // at the start of it. Re-enable script and start a challenge. Timer now stays frozen and at max, but on completion you will see how long it took you (instead of 00:00).

--

[ Challenges ] > Instant Complete [Hunting Grounds, Melee Pits, Machine Strike]
This script SETS a value, does not freeze it. Disable and re-enable it every time you need it. What it does is to get the ChallengeManager from GameModule and run Challenge::Stop function with argument 0x3 (Challenge->mReason == TRIAL_SUCCESS enum value). The outcome: instant completion of a Trial. You only need to activate the trial and run this. No need to actually walk to the ledge and start the Trial timer. Just E on the NPC, pick Trial, start it, run script. Similarly, if you care zero for Machine Strike board game, start the challenge and enable this. Boom, shakalaka!

--

[ Challenges ] > Edit Hovered|Selected Board Unit [Machine Strike]
Activate the script anytime during a match. You can now either hover mouse -OR- click on a BoardUnit and check back to CE to set various properties for it. Expand "BoardGameBoardUnit" item by clicking the [-] in front of it (DO NOT TICK THE CHECKBOX, IT FREEZES THE VALUE!), then expand "mProperties" by clicking the [-] in front of it (DO NOT TICK THE CHECKBOX, IT FREEZES THE VALUE!). In here, change the values you want for an immediate in-game effect. If you just want a Health increase, then mHealth under BoardGameBoardUnit is what you need to change (not "mBaseHealth [use mHealth]").

The grayed out "BoardGameUnit" item can also be expanded to check-up on the BoardUnit's base properties. DO NOT CHANGE THESE AS THIS IS THE BASE TEMPLATE! If you do that, then ALL players will benefit from it. On the hindsight, if your OCD wants longer games cuz you like Machine Strike, be my guest and fuck around with the template. Change whatever you need in "BoardGameUnit", forfeit current game and replay. You will see the game pieces will now start with updated stats :) Again, the player's pieces of the BoardGameUnit template types you've changed will benefit from this too.

--

[ Game Progression ] > Add Custom XP Image
Set all "XP Amount" levels to the value you want: click the first one, hold Shift, click the last one - so all are selected. Press Enter and input the amount you want (e.g.: 500). All will change to that value. Then click the checkbox in front of "<- Click to Add XP" and check in-game. You will see this:

Image

--

[ Game Progression ] > Set Player Level
This script SETS a value, does not freeze it. Disable and re-enable it every time you need it. Activate script, specify level you want in the input field and you'll level up. Achieved via running CharacterProgressionComponent::SetCurrentLevel function.

--

[ Game Progression ] > Game Mode Normal <-> NG+
This script SETS a value, does not freeze it. Disable and re-enable it every time you need it. Normal to New Game Plus (and vice-versa) conversion script. Achieved by setting GameModule->mNewGamePlus property to 0x1. Since the status is not constantly read/used, you will need to trigger by saving at a Campfire: save game, load game.

--

[ Game Progression ] > Disable All Bound Checks
Should disable all out of bounds messages and checks. As per the feedback, there will be areas where you will be stuck with a "compiling shaders" message. Can't do anything about it, that's that.

--

[ World Map ] > Remove Fog Of War Image
Activate the script and hit M to show the map. All fog is removed. Please keep in mind this doesn't also uncover all of the location icons and no, I won't research any further on this.

--

[ Game World ] > View Time Of Day Properties Image
Allows you to set Time Of Day, which is 24h based, so change the float to any value within this range. Enable Day-Night Cycle set to "No" will disable day/night cycle and lock the time to what you've set it to. It will freeze the time of day.

NOTE: The script is reading data. It doesn't constantly refresh the pointer, so if something is off and you can't see the proper values or ??, then disable and re-enable it. It means you might've exited the game world or transitioned and GameWorldState was reinitialized.

--

HorizonForbiddenWest.CT
Update #4
(297.02 KiB) Downloaded 17595 times

BR,
Sun

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

User avatar
SunBeam
Administration
Administration
Posts: 4782
Joined: Sun Feb 04, 2018 7:16 pm
Reputation: 4412

Re: Horizon Forbidden West [Engine:Decima]

Post by SunBeam »

[ Inventory & Stash ]
Required to be enabled as it assembles a series of helpers for the subsequent scripts.

Inventory : Item & Resource Properties
The script hooks InventoryMenuController::HighlightItem function allowing several aspects to be exposed in the table. This is done on a per-click basis on items in your Inventory. It will not work while previewing the Stash, Merchant stores or anywhere else (I can add those too). Once enabled, hit I key, go to a page of your Inventory and click an item. Switch back to CE and inspect the results by clicking the checkbox in front of the "InventoryItem" and "InventoryItemResource" trees. Don't worry, these are headers, they don't freeze the value.

What can I edit?
InventoryItem's "0050: Quantity" and all of InventoryItemResource, where available (where no "??"). Please note that changing Rarity from X to Y really has no impact over the game's calculus.

What can I NOT edit?
The InventoryItem name is computed, it's not stored in a single place, especially with items whose descriptions comprise several stats. So changing it in the table won't change it in-game.

What else?
MaxStackQuantity is often showing wrong values and that is because the calculation takes into account some FactDatabase entries which are not really computed in the table. That why it's marked as "[unreliable]". In some places it will fit, in others it won't (e.g.: show less).

Why is this useful other than editing some stats?
Because it can be used in conjunction with the other sub-sections/scripts in this section. Continue reading.

Inventory : Dump Item Info [incl. Stash]
This will dump to disk the entire content of your Inventory and Stash to disk, on your Desktop, in a file called _ExportedInventory.csv.

Start by clicking the checkbox and a sub-section will expand:

Image

For those of you who will use this with Excel, leave the "Format Output For Excel Use?" setting as it is. For those of you who want to just use Notepad++ or some other CSV processing tool, set it to "No". The difference between them is the ADDRESSES are prefixed with =" and suffixed with ", so that Excel doesn't automatically convert addresses to random numbers. See the example (top is "Yes", bottom is "No"):

Image

For "No", if you open the CSV in Excel, it will automatically interpret some of the Addresses as numbers with error scale.

Alright, that aside, the important things:
  • This list contains YOUR Inventory. Sharing it with another person won't help them get the items in theirs. It will help though from other points of consideration. Keep reading.
  • The list will need to be re-dumped as you gain more items. It shows a moment in time of your Inventory.
  • No, you cannot share an ADDRESS from this list (e.g.: InventoryItemResource Address) with another user so they try it on their end. The addresses are dynamic and only for your gameplay. So it makes no sense to tell someone "here's my address, you try it". It just won't work. You'll see in a second why I keep bringing up addresses.
  • The only identifier element that SHOULD be a constant between users is the InventoryItemResource UUID Value. What this means is, for example, if my Metal Shards' InventoryItemResource UUID Value is 1A3624210EDAD8F7ECE02B1B2539BE81, so will yours.

    Image
  • You can use any of the Addresses to inspect in memory or add to your CE. Again, this will work only for the current moment in time you're looking at your inventory. If you reboot the game, you need to do it again, so don't add addresses randomly to your CE table, save table and then expect them to work after a reboot.

    For example, if you want to edit the Metal Shards amount, since it's not an object you can click on to use the "Inventory : Item & Resource Properties" script on, you do this:
    • dump list
    • Ctrl+F > Metal Shards
    • click the cell on the "Amount Address" column and hit Ctrl+C
    • in CE, click Add Address Manually and paste what you copied in the Address field
    • if, on pasting, you see =" in front of the value and " at the back of it, remove them (doesn't happen for me, but dunno)
    • leave Type as 4 bytes and give it a Description if you want: Metal Shards
    • click OK and you're done
    Image

    There you go. A new address has been added to your CE and you can now edit that amount.
Inventory : Add Item By InventoryItemResource
Expand this and you will see several options:

Image

With this you can specify an InventoryItemResource address and Quantity to gain, as well as control whether or not you want it sent to Stash, if your main Inventory is full (if "No" item will just be discarded). Where to get an InventoryItemResource address?

Before that.. keep reading. As you can tell, you can't add items to your inventory like you did in Assassin's Creed games with some hash and bla bla. Doesn't work like that here. The game creates entities for all its objects based on streamed parameters, thus creating the templates an object needs to be constructed by. What does that mean? It means you would have to construct the InventoryItemResource yourselves. And you won't be able to. Neither am I. However.. for all of the ALREADY EXISTING such InventoryItemResource templates (in the current gameplay; NOTE the game constructs them only when it needs them, so you won't find InventoryItemResource templates for ALL the game objects in one place), you can use them to gain more.. or less. Add -or- Remove. That's what these sections are for.

Practical example:
  • activate "Inventory : Item & Resource Properties" script -OR- dump your info via "Inventory : Dump Item Info [incl. Stash]" script
  • if the first scenario, open Inventory, click on an item
    • expand "InventoryItemResource" section and underneath you will see a 2nd "InventoryItemResource" entry that has a Value
    • double-click it so you can edit it and copy it
    • paste it in "Inventory : Add Item By InventoryItemResource" > "InventoryItemResource" field by double-click it and Ctrl+V over the 0000000000000000 value
    • set Quantity to whatever amount and click "<- Click to Add Item"
    Image

    So now I will get 1 x Ancient Metal Eye.
  • if the second scenario, then Ctrl+F your item in the dump and Ctrl+C on its corresponding "InventoryItemResource Address" cell
    • paste it in Inventory : Add Item By InventoryItemResource > InventoryItemResource field
    • set Quantity to whatever amount and click "<- Click to Add Item"
    Image

    So now I get 50 x Charger Horn.
Inventory : Remove Item By InventoryItemResource
Similarly to the above, you can also remove items by their InventoryItemResource address. The process is identical to the one above: identify the InventoryItemResource Address, paste it in the "InventoryItemResource" field, replacing the 0000000000000000, give an amount and click the "<- Click to Remove Item" checkbox.

Inventory : Remove All Items
Will wipe out your Inventory (Stash is not included). Use it for experimenting, if you wish.


--- Now that you've read the above, here comes the interesting part ---


InventoryItemResource : Dump All From Memory
This script will dump to your Desktop a file called _ExportedInventoryItemResource.csv. In this file you will find a listing of all the InventoryItemResource instances that exist in memory at your current time of play. Depending where you are, what you're doing, which shop you visited (which populated items), which quest you've recently done and so on and so forth.. you will find in that list more or less items. At the time I've tested this, it exported 826 instances. In some other part or map region of the game, I got 869 instances. My point: it's going to be different for everyone. The list will look like this:

Image

You will use the part in yellow.

Start by checking the table out, filter by Display Name or Rarity, find the them you want. That you don't have. Note that the list contains everything, including Resources of inventory items you already have. Again, what's loaded in memory at dump time, not "everything" as in "all templates in the game". Once you found your line of choice, copy the "InventoryItemResource Address" from A column. What to do with it now? Expand "Inventory : Add Item By InventoryItemResource", double-click the Value of the purple line and change the 0000000000000000 to your copied value from A column in Excel. Set Quantity to the amount you want (for Outfits, Weapons, Tools, etc. -- really set it to 1; makes no sense to own more than that). Then click "<- Click to Add Item" checkbox and you will get the InventoryItem.

That's the only way to do it until someone finds a better way.

NO, you cannot use someone else's file. It will not work, don't try it.

Demonstrative video of how I get a Legendary Outfit:



Demonstrative video in the post of how I add various upgrade resources: viewtopic.php?p=346312#p346312.

Lastly, there's no guarantee the item you get will break progression, especially if you are supposed to get it from some quest (the quest might not end if you already have the item). So use with caution! I cannot help you if come back whining you've messed something up.

Enjoy,
Sun

bluemoon27112
Cheater
Cheater
Posts: 35
Joined: Wed Feb 21, 2024 8:57 pm
Reputation: 1

Re: Horizon Forbidden West [Engine:Decima]

Post by bluemoon27112 »

thank you SunBeam

nl2336
Noobzor
Noobzor
Posts: 8
Joined: Sat Feb 24, 2024 1:55 pm
Reputation: 0

Re: Horizon Forbidden West [Engine:Decima]

Post by nl2336 »

i think you deserve a cookie!!!! thanks

13xforever
Noobzor
Noobzor
Posts: 5
Joined: Sun May 02, 2021 10:01 am
Reputation: 6

Re: Horizon Forbidden West [Engine:Decima]

Post by 13xforever »

You can enable an accessibility option to remove oxygen requirement underwater

7zW9S5s6
Cheater
Cheater
Posts: 37
Joined: Mon Jul 26, 2021 9:38 am
Reputation: 8

Re: Horizon Forbidden West [Engine:Decima]

Post by 7zW9S5s6 »

Ultra hard mad respect for that and this table <3

nl2336
Noobzor
Noobzor
Posts: 8
Joined: Sat Feb 24, 2024 1:55 pm
Reputation: 0

Re: Horizon Forbidden West [Engine:Decima]

Post by nl2336 »

can you play ultra hard on first playthrough??? i thought it was ng+ only :(

User avatar
Csimbi
RCE Fanatics
RCE Fanatics
Posts: 885
Joined: Sat Apr 29, 2017 9:04 pm
Reputation: 1220

Re: Horizon Forbidden West [Engine:Decima]

Post by Csimbi »

Huh. I did not know this game came out already. Nicely done!
How similar is it to the previous game? I could rebuild my table, too.
Last edited by Csimbi on Thu Mar 21, 2024 6:00 pm, edited 1 time in total.

User avatar
Send
Table Makers
Table Makers
Posts: 396
Joined: Fri Feb 02, 2018 5:58 pm
Reputation: 251

Re: Horizon Forbidden West [Engine:Decima]

Post by Send »

Csimbi wrote:
Thu Mar 21, 2024 5:45 pm
Huh. I did not know this game came out already. Nicely done!
Released 12 hrs earlier than DD2, today.



Thanks Sun!

User avatar
SunBeam
Administration
Administration
Posts: 4782
Joined: Sun Feb 04, 2018 7:16 pm
Reputation: 4412

Re: Horizon Forbidden West [Engine:Decima]

Post by SunBeam »

Csimbi wrote:
Thu Mar 21, 2024 5:45 pm
Huh. I did not know this game came out already. Nicely done!
How similar is it to the previous game? I could rebuild my table, too.
It's.. there :) Just some changes in the DebugSettings and other parts, plus game's compiler is different this time around, so a bit tricky to find everything due to inlines and other optimization.
Send wrote:
Thu Mar 21, 2024 5:52 pm
Released 12 hrs earlier than DD2, today.
Don't think they picked the right day to release DD2 :) We'll see the numbers after 1 week :P

deitrius
What is cheating?
What is cheating?
Posts: 1
Joined: Fri Jan 21, 2022 4:42 pm
Reputation: 1

Re: Horizon Forbidden West [Engine:Decima]

Post by deitrius »

Serioously @Sunbeam, you fing rock.....A table this fast,, and all your other tables. Just wanted to say thanks (for everything) :)

User avatar
STN
Founder
Founder
Posts: 4437
Joined: Thu Mar 02, 2017 7:48 pm
Reputation: 3440

Re: Horizon Forbidden West [Engine:Decima]

Post by STN »

Sunbeam showing them who’s the boss again 😁

Noice cheat engine table, curious what you do with dragon dogma 2 next and how soon the thieves steal from FRF (inspired hehe)

User avatar
Cielos
RCE Fanatics
RCE Fanatics
Posts: 834
Joined: Fri Mar 03, 2017 4:35 am
Reputation: 1797

Re: Horizon Forbidden West [Engine:Decima]

Post by Cielos »

a game speed manipulating script:

Code: Select all

<?xml version="1.0" encoding="utf-8"?>
<CheatTable>
  <CheatEntries>
    <CheatEntry>
      <ID>6</ID>
      <Description>"enable"</Description>
      <Options moHideChildren="1" moDeactivateChildrenAsWell="1"/>
      <LastState Activated="1"/>
      <Color>808000</Color>
      <VariableType>Auto Assembler Script</VariableType>
      <AssemblerScript Async="1">[ENABLE]
//code from here to '[DISABLE]' will be used to enable the cheat
define(slowmokey1default,06)
define(slowmospeed1default,(float)0.25)
define(slowmokey2default,05)
define(slowmospeed2default,(float)0.5)

aobscanmodule(currentArrowReadAOB,HorizonForbiddenWest.exe,8B ** ** 48 ** ** ** 83 ** ** 00 74 ** 48 ** ** ** 00 75)
registersymbol(currentArrowReadAOB)

label(pCArrows)
registersymbol(pCArrows)

alloc(newmem,2048,currentArrowReadAOB) //"HorizonForbiddenWest.exe"+129942D)
label(returnhere)
label(originalcode_currentArrowReadAOB)
registersymbol(originalcode_currentArrowReadAOB)
label(exit)

newmem: //this is allocated memory, you have read,write,execute access
//place your code here
push rdx
mov rdx,pCArrows
mov [rdx],rax
pop rdx

originalcode_currentArrowReadAOB:
readmem(currentArrowReadAOB,7)
//mov ebx,[rax+28]
//mov rax,[rdi+30]

exit:
jmp returnhere

///
pCArrows:
///

currentArrowReadAOB: //"HorizonForbiddenWest.exe"+129942D:
jmp newmem
nop 2
returnhere:

///**************************************///
aobscanmodule(gameSpeedCWriteAOB,HorizonForbiddenWest.exe,C5 FA * * * * 00 00 C5 * * * 33 * C5 * * * C5 * * * * * * * * * * * * * * * * * * * * * * * * * C3)
registersymbol(gameSpeedCWriteAOB)

label(pGameSpeed)
registersymbol(pGameSpeed)
label(dCustGameSpeed)
registersymbol(dCustGameSpeed)
label(dSlowMoKey1ID)
registersymbol(dSlowMoKey1ID)
label(bSlowMoKey1Pressed)
registersymbol(bSlowMoKey1Pressed)
label(dCustGameSpeed1)
registersymbol(dCustGameSpeed1)
label(dSlowMoKey2ID)
registersymbol(dSlowMoKey2ID)
label(bSlowMoKey2Pressed)
registersymbol(bSlowMoKey2Pressed)
label(dCustGameSpeed2)
registersymbol(dCustGameSpeed2)

alloc(newmem2,2048,gameSpeedCWriteAOB) //"HorizonForbiddenWest.exe"+D5B252)
label(returnhere2)
label(originalcode2_gameSpeedCWriteAOB)
registersymbol(originalcode2_gameSpeedCWriteAOB)
label(exit2)

newmem2: //this is allocated memory, you have read,write,execute access
//place your code here
push rax
db 48 8D
readmem(gameSpeedCWriteAOB+3,5)
//lea rax,[rcx+80]
push rax
mov rax,pGameSpeed
pop [rax]
mov rax,dCustGameSpeed
mulss xmm0,[rax]
mov rax,bSlowMoKey1Pressed
cmp byte ptr [rax],1
je @f
mov rax,bSlowMoKey2Pressed
cmp byte ptr [rax],1
je @f
jmp end2

@@:
mulss xmm0,[rax+4]


end2:
pop rax

originalcode2_gameSpeedCWriteAOB:
readmem(gameSpeedCWriteAOB,8)
//vmovss [rcx+00000080],xmm0

exit2:
jmp returnhere2

///
pGameSpeed:
dq 0
dCustGameSpeed:
dd (float)1
dSlowMoKey1ID:
dd slowmokey1default
bSlowMoKey1Pressed:
dd 0
dCustGameSpeed1:
dd slowmospeed1default
dSlowMoKey2ID:
dd slowmokey2default
bSlowMoKey2Pressed:
dd 0
dCustGameSpeed2:
dd slowmospeed2default
///

gameSpeedCWriteAOB: //"HorizonForbiddenWest.exe"+D5B252:
jmp newmem2
nop 3
returnhere2:

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


 
 
[DISABLE]
//code from here till the end of the code will be used to disable the cheat
dealloc(newmem)
currentArrowReadAOB: //"HorizonForbiddenWest.exe"+129942D:
readmem(originalcode_currentArrowReadAOB,7)
//db 8B 58 28 48 8B 47 30
//mov ebx,[rax+28]
//mov rax,[rdi+30]
unregistersymbol(originalcode_currentArrowReadAOB)

unregistersymbol(pCArrows)

///**************************************///
dealloc(newmem2)
gameSpeedCWriteAOB: //"HorizonForbiddenWest.exe"+D5B252:
readmem(originalcode2_gameSpeedCWriteAOB,8)
//db C5 FA 11 81 80 00 00 00
//vmovss [rcx+00000080],xmm0
unregistersymbol(originalcode2_gameSpeedCWriteAOB)

unregistersymbol(pGameSpeed)
unregistersymbol(dCustGameSpeed)
unregistersymbol(dSlowMoKey1ID)
unregistersymbol(dSlowMoKey2ID)
unregistersymbol(bSlowMoKey1Pressed)
unregistersymbol(dCustGameSpeed1)
unregistersymbol(bSlowMoKey2Pressed)
unregistersymbol(dCustGameSpeed2)

///**************************************///
</AssemblerScript>
      <CheatEntries>
        <CheatEntry>
          <ID>16635</ID>
          <Description>"game speed mod"</Description>
          <Options moHideChildren="1"/>
          <LastState Activated="1"/>
          <Color>808000</Color>
          <VariableType>Auto Assembler Script</VariableType>
          <AssemblerScript Async="1">[ENABLE]
//code from here to '[DISABLE]' will be used to enable the cheat
define(slowmokey1default,12)
define(slowmospeed1default,(float)0.35)
define(slowmokey2default,06)
define(slowmospeed2default,(float)0.5)

///
dCustGameSpeed:
dd (float)1
dSlowMoKey1ID:
dd slowmokey1default
bSlowMoKey1Pressed:
dd 0
dCustGameSpeed1:
dd slowmospeed1default
dSlowMoKey2ID:
dd slowmokey2default
bSlowMoKey2Pressed:
dd 0
dCustGameSpeed2:
dd slowmospeed2default
///

///********************************************///
//modified from ShyTwig16's lua keylistener script
//http://fearlessrevolution.com/viewtopic.php?f=4&amp;t=6041&amp;start=60#p62657
{$lua}
local function slowMoKeysLuaThread(threadr2)
	while SlowMoKeysLuaThreadLoop do
        sleep(100)
	    addrr2 = getAddressSafe('bSlowMoKey1Pressed')
	    addrr3 = getAddressSafe('bSlowMoKey2Pressed')
	    addrr4 = getAddressSafe('dSlowMoKey1ID')
	    addrr5 = getAddressSafe('dSlowMoKey2ID')
		if addrr2 and addrr4 then
            if ( isKeyPressed( readInteger(addrr4) ) ) then
			    writeBytes(addrr2, 1)
            else
                writeBytes(addrr2, 0)
            end
		end
		if addrr3 and addrr5 then
            if ( isKeyPressed( readInteger(addrr5) ) ) then
			    writeBytes(addrr3, 1)
            else
                writeBytes(addrr3, 0)
            end
		end
	end
	threadr2.terminate()
end
----------------------------------
if syntaxcheck then return end
SlowMoKeysLuaThreadLoop = true
createThread(slowMoKeysLuaThread)
{$asm}

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




[DISABLE]
//code from here till the end of the code will be used to disable the cheat
{$lua}
if syntaxcheck then return end
SlowMoKeysLuaThreadLoop = false
{$asm}

///********************************************///
dCustGameSpeed:
dd (float)1
</AssemblerScript>
          <CheatEntries>
            <CheatEntry>
              <ID>16755</ID>
              <Description>"custom game speed multiplier"</Description>
              <LastState Value="1" RealAddress="7FF7625D0069"/>
              <Color>008000</Color>
              <VariableType>Float</VariableType>
              <Address>dCustGameSpeed</Address>
              <Hotkeys>
                <Hotkey>
                  <Action>Set Value</Action>
                  <Keys>
                    <Key>96</Key>
                    <Key>111</Key>
                  </Keys>
                  <Value>0.2</Value>
                  <ID>0</ID>
                </Hotkey>
                <Hotkey>
                  <Action>Set Value</Action>
                  <Keys>
                    <Key>96</Key>
                    <Key>106</Key>
                  </Keys>
                  <Value>0.4</Value>
                  <ID>1</ID>
                </Hotkey>
                <Hotkey>
                  <Action>Set Value</Action>
                  <Keys>
                    <Key>96</Key>
                    <Key>109</Key>
                  </Keys>
                  <Value>0.6</Value>
                  <ID>2</ID>
                </Hotkey>
                <Hotkey>
                  <Action>Set Value</Action>
                  <Keys>
                    <Key>96</Key>
                    <Key>107</Key>
                  </Keys>
                  <Value>0.8</Value>
                  <ID>3</ID>
                </Hotkey>
                <Hotkey>
                  <Action>Set Value</Action>
                  <Keys>
                    <Key>96</Key>
                    <Key>110</Key>
                  </Keys>
                  <Value>1</Value>
                  <ID>4</ID>
                </Hotkey>
              </Hotkeys>
            </CheatEntry>
            <CheatEntry>
              <ID>16641</ID>
              <Description>"mod key1's speed override mod key2's speed"</Description>
              <LastState Value="" RealAddress="00000000"/>
              <Color>808080</Color>
              <GroupHeader>1</GroupHeader>
            </CheatEntry>
            <CheatEntry>
              <ID>16637</ID>
              <Description>"mod key1"</Description>
              <DropDownList ReadOnly="1" DescriptionOnly="1" DisplayValueAsItem="1">10:SHIFT key
11:CTRL key
12:ALT key
14:CAPS LOCK key
02:Right Mouse Button
04:Middle Mouse Button
05:X1 Mouse Button
06:X2 Moust Button
09:TAB key
</DropDownList>
              <LastState Value="12" RealAddress="7FF7625D006D"/>
              <ShowAsHex>1</ShowAsHex>
              <Color>008000</Color>
              <VariableType>Byte</VariableType>
              <Address>dSlowMoKey1ID</Address>
              <CheatEntries>
                <CheatEntry>
                  <ID>16638</ID>
                  <Description>"speed multiplier"</Description>
                  <LastState Value="0.349999994" RealAddress="7FF7625D0075"/>
                  <Color>008000</Color>
                  <VariableType>Float</VariableType>
                  <Address>+8</Address>
                </CheatEntry>
              </CheatEntries>
            </CheatEntry>
            <CheatEntry>
              <ID>16639</ID>
              <Description>"mod key2"</Description>
              <DropDownList ReadOnly="1" DescriptionOnly="1" DisplayValueAsItem="1">10:SHIFT key
11:CTRL key
12:ALT key
14:CAPS LOCK key
02:Right Mouse Button
04:Middle Mouse Button
05:X1 Mouse Button
06:X2 Moust Button
09:TAB key
</DropDownList>
              <LastState Value="06" RealAddress="7FF7625D0079"/>
              <ShowAsHex>1</ShowAsHex>
              <Color>008000</Color>
              <VariableType>Byte</VariableType>
              <Address>dSlowMoKey2ID</Address>
              <CheatEntries>
                <CheatEntry>
                  <ID>16640</ID>
                  <Description>"speed multiplier"</Description>
                  <LastState Value="0.5" RealAddress="7FF7625D0081"/>
                  <Color>008000</Color>
                  <VariableType>Float</VariableType>
                  <Address>+8</Address>
                </CheatEntry>
              </CheatEntries>
            </CheatEntry>
          </CheatEntries>
        </CheatEntry>
      </CheatEntries>
    </CheatEntry>
  </CheatEntries>
</CheatTable>


xboxgame
Noobzor
Noobzor
Posts: 5
Joined: Sun Aug 27, 2017 12:21 pm
Reputation: 0

Re: Horizon Forbidden West [Engine:Decima]

Post by xboxgame »

"a game speed manipulating script:"

Thanks :)

User avatar
SunBeam
Administration
Administration
Posts: 4782
Joined: Sun Feb 04, 2018 7:16 pm
Reputation: 4412

Re: Horizon Forbidden West [Engine:Decima]

Post by SunBeam »

Updated with some more stuff. Cheers! See you next week.

Post Reply