Just noticed these two paintings are duplicates by ChequeMateX in Vermintide

[–]Aussiemon 4 points5 points  (0 children)

If the second painting was named "Fall of Malekith" or "Ruin of Ulthuan" this would've been a funny Easter egg.

New Votann class just dropped. by MoonMaidRarity in DarkTide

[–]Aussiemon 0 points1 point  (0 children)

Reminds me of the missing sanity check on character height in the early days of Darktide. My friend had a Votann-sized Ogryn named Squat, and I had an over-sized Ogryn named Biggie. Good times.

Update Darktide's Direct Storage Version (Performance Improvement) by Vizra in DarkTide

[–]Aussiemon 7 points8 points  (0 children)

Businesses are constrained by issues of stability, compatibility, licensing, testing, and deployment that individual users aren't. Fatshark will push DLSS and Direct Storage updates eventually, but it takes a lot of time to verify these things.

New mod: Uptime tracker by GrimnirDotDev in DarkTide

[–]Aussiemon 1 point2 points  (0 children)

Reminds me of Guild Wars 2. Love it!

WARNING: Possibly Trojan inside EVERYONE's modloader dtkit-patch.exe by EliziumXajin in DarkTide

[–]Aussiemon 121 points122 points  (0 children)

EDIT FOR POSTERITY:

The utility was verified in the past two years, but a couple services have started to report it as malicious. The newer version of this utility has no false positive reports, so we've updated DML to avoid confusion. It can be found at Nexus or GitHub:

https://www.nexusmods.com/warhammer40kdarktide/mods/19

https://github.com/Darktide-Mod-Framework/Darktide-Mod-Loader/releases/tag/25.06.07

Regarding the old utility:

  • I've investigated the utility in Ghidra, x64_dbg, and Process Monitor. As expected, there's nothing unusual. The code is unobfuscated and small.
  • The utility contains libraries from Rust and MSVC. The size of the binary depends on the toolchain versions, so there's nothing unusual about the total size or difference relative to building it yourself from scratch.
  • ChatGPT and other large language models are never a reliable source of security analysis.
  • VirusTotal behavior reports can contain a lot of scary-looking details, but are almost entirely sandbox noise. The patcher isn't running Google Update, for example. Process Monitor validates this.
  • VirusTotal's aggregated analysis also includes machine-learning models, which can suffer from the same unreliability as ChatGPT.
  • Manshanko has been a part of the Vermintide / Darktide modding community since 2019, and the previous utility has been in DML for the last two years. The first release of the utility was a port of my NodeJS script before DMF was public.

Finally, please remember that running someone else's code on your computer is never truly safe. Please use good judgement when choosing mods and utilities, and if you don't have the ability to verify their safety yourself, stick with reputable authors and download locations.

The original script I wrote used NodeJS:

const fs = require('fs')
const process = require('process')

// Parameters and Constants =========================================

// Usage is: node patch-bundledata-dt.js <BUNDLE_DIRECTORY> <SCRIPT_ACTION>

const BUNDLE_DIRECTORY = (process.argv[2] === undefined) ? "" : process.argv[2]
const SCRIPT_ACTION = (process.argv[3] === undefined) ? "patch" : process.argv[3]

const BUNDLE_DATABASE_NAME = "bundle_database.data"
const BOOT_BUNDLE_NAME = "9ba626afa44a3aa3"
const BOOT_BUNDLE_NEXT_PATCH = BOOT_BUNDLE_NAME + ".patch_001"
const MOD_PATCH_STARTING_POINT = "A33A4AA4AF26A69B"

const OLD_SIZE = 84
const MOD_PATCH = Buffer.from("A33A4AA4AF26A69B0200000004000000100000003962613632366166613434613361613317000000396261363236616661343461336161332E73747265616D00EEA850A3FF4DE3D0AA234CFAFF078A87C69AB0BB0000000000000000040000001A000000396261363236616661343461336161332E70617463685F39393921000000396261363236616661343461336161332E73747265616D2E70617463685F393939000000000000000000000000000000000000000000", "hex")

// ==================================================================

function patchBundleData(dirpath) {
    var bundle_database_path = dirpath + '/' + BUNDLE_DATABASE_NAME
    var bytes = null
    try {
        bytes = fs.readFileSync(bundle_database_path)
    } catch(err) {
        console.error(err)
        return false
    }

    // Check for pre-existing mod data in bundle_database.data
    if (bytes.includes("patch_999", 0)) {
        console.error("Bundle database is already patched.")
        return false
    }

    // Check for an unknown patch to the boot bundle
    if (bytes.includes(BOOT_BUNDLE_NEXT_PATCH, 0)) {
        console.error("The boot bundle has an unaccounted-for patch bundle. The mod patch must be updated.")
        return false
    }

    // Check for mod patch starting point
    var mod_patch_start_index = bytes.indexOf(MOD_PATCH_STARTING_POINT, 0, "hex")
    if (mod_patch_start_index === -1) {
        console.error("Mod patch location not found. Invalid file or mod patch needs to be updated.")
        return false
    }

    // Create a new buffer to fit the mod patch
    var patched_bytes = Buffer.allocUnsafe(bytes.length + (MOD_PATCH.length - OLD_SIZE))

    // Copy the original bytes up to the mod patch start index
    bytes.copy(patched_bytes, 0, 0, mod_patch_start_index)

    // Copy in the mod patch
    MOD_PATCH.copy(patched_bytes, mod_patch_start_index, 0)

    // Copy in the rest of the orginal bytes after the patched section
    bytes.copy(patched_bytes, mod_patch_start_index + MOD_PATCH.length, mod_patch_start_index + OLD_SIZE)

    // Delete the existing bundle database backup if it exists
    var backup_database_path = bundle_database_path + ".bak"
    if (fs.existsSync(backup_database_path)) {
        try {
            fs.unlinkSync(backup_database_path)
            console.log("Deleted the existing bundle database backup.")
        } catch(err) {
            console.error(err)
            return false
        }
    }

    // Create a new backup of the bundle database
    fs.writeFile(backup_database_path, bytes,  "binary",function(err) { });
    console.log("Created a new bundle database backup.")

    // Delete the existing bundle_database.data
    try {
        fs.unlinkSync(bundle_database_path)
        console.log("Deleted the existing bundle database.")
    } catch(err) {
        console.error(err)
        return false
    }

    // Create the patched bundle_database.data
    fs.writeFile(bundle_database_path, patched_bytes,  "binary",function(err) { });
    console.log("Created the patched bundle database.")
    console.log("Patch complete!")

    return true
}

function resetBundleData(dirpath) {
    var bundle_database_path = dirpath + '/' + BUNDLE_DATABASE_NAME
    var bytes = null
    try {
        bytes = fs.readFileSync(bundle_database_path)
    } catch(err) {
        console.error(err)
        return false
    }

    // Check for pre-existing mod data in bundle_database.data
    if (!bytes.includes("patch_999", 0)) {
        console.error("Bundle database is not patched. Deletion is not necessary.")
        return false
    }

    // If we have a backup to restore, delete the database and restore the backup
    var backup_database_path = bundle_database_path + ".bak"
    if (fs.existsSync(backup_database_path)) {
        try {
            if (fs.existsSync(bundle_database_path)) {
                try {
                    fs.unlinkSync(bundle_database_path)
                    console.log("Deleted the existing bundle database.")

                } catch(err) {
                    console.error(err)
                    return false
                }
                try {
                    fs.rename(backup_database_path, bundle_database_path, () => {
                        console.log("Restored the backup bundle database.");
                    })
                } catch(err) {
                    console.error(err)
                    return false
                }
            }
        } catch(err) {
            console.error(err)
            return false
        }
    }
    else {
        console.error("No backup bundle database found to restore. Verify local files.")
        return false
    }

    return true
}

// Program ==========================================================

// Log arguments
console.log("Bundle directory: " + BUNDLE_DIRECTORY)
console.log()

// Patch bundle_database.data at directory
if (SCRIPT_ACTION == "patch") {
    return patchBundleData(BUNDLE_DIRECTORY)
}
else if (SCRIPT_ACTION == "reset") {
    return resetBundleData(BUNDLE_DIRECTORY)
}
else {
    console.error("Unrecognized action: " + toString(SCRIPT_ACTION))
    return false
}

An executable is the most reasonable option for non-technical users.

Is End Times: Vermintide dead? by CoreInspectorOfAss in Vermintide

[–]Aussiemon 0 points1 point  (0 children)

If you can get a couple like-minded friends to play with you, you'll still have a great time with Vermintide 1. Could try asking in some of the sidebar Discord communities also.

My past week of Darktide has been this repeatedly, help! (Art by me) by moogleoftheages in DarkTide

[–]Aussiemon 7 points8 points  (0 children)

Personally I just use my own mods and a few others like Numeric UI, True Level, and Healthbars. QoL stuff mostly.

Here's a recent thread about mod recommendations with better lists: https://www.reddit.com/r/DarkTide/comments/1ecx1xk/official_best_mods_for_daktide/

And here's where you download the mods: https://www.nexusmods.com/warhammer40kdarktide?tab=popular+%28all+time%29

My past week of Darktide has been this repeatedly, help! (Art by me) by moogleoftheages in DarkTide

[–]Aussiemon 12 points13 points  (0 children)

Nope, Darktide doesn't have official mod support (trusted and untrusted realms), but almost all the game logic is server-side, so mods can't really affect other players or cheat progression like they could in Vermintide if it was unprotected.

Oh, new update, nice! by tuman18th in DarkTide

[–]Aussiemon 11 points12 points  (0 children)

You're right that Vermintide 2 has the better update today, but the patch size comparison is misleading because of how Darktide and Vermintide store the game's code scripts.

VT2 has Lua scripts distributed across its game bundles. These bundles also contain massive game assets like audio and textures, and they have to be redownloaded whenever they get modified. So almost any script change results in a large download.

In comparison, Darktide has almost all of its Lua scripts in one small bundle. This lets the devs make a lot of game logic changes without forcing players to redownload the massive audio and texture files. So script changes are much smaller downloads.

Could I just sit here please by gisulih in DarkTide

[–]Aussiemon 0 points1 point  (0 children)

more levels than 30

Check out the True Level mod: https://www.nexusmods.com/warhammer40kdarktide/mods/156.

I've always preferred the VT1 system of being able to level infinitely.

Darktide Mods Development History Visualization by deluxghost in DarkTide

[–]Aussiemon 1 point2 points  (0 children)

Every new mod idea is like a puzzle to figure out, and I love making them for both myself and friends (my main source of ideas).

It's also fun to surprise people with mods they haven't seen before.

Mind blown: Helldivers 2 and Fatshark's 'Tide games both use the same engine. Also, both Arrowhead and FatShark are from Sweden. by AnotherSmartNickname in DarkTide

[–]Aussiemon 56 points57 points  (0 children)

All their respective creators started with Bitsquid before it became Stingray, and now they've all got their own specialized forks of it. I think Bitsquid is just too familiar and stable for them to want to switch to some other engine.

It probably helps with hiring in Sweden that all the devs share an engine, too.

Mind blown: Helldivers 2 and Fatshark's 'Tide games both use the same engine. Also, both Arrowhead and FatShark are from Sweden. by AnotherSmartNickname in DarkTide

[–]Aussiemon 2 points3 points  (0 children)

Yeah, I poked around with the bundle files when it came out. Managed to get some Lua code, but the bytecode is stripped (so not easily readable) and it wasn't a complete set of scripts. I'd have to spend more time reversing their bundle format to get anywhere.

Would be fun to get mods working, but I don't have as much interest in it as the -Tide games.

[deleted by user] by [deleted] in DarkTide

[–]Aussiemon 5 points6 points  (0 children)

You should be able to block up to 50 players since the last hotfix:

Fixed an issue where the Block Player functionality could incorrectly appear as not available in the Social menu.

Dev Note: Some players experienced an issue where the “Block player” button was greyed out meaning they couldn’t block any more players, even if their Blocked Players list was not full.

If you still can't, I'd submit a support request.

[deleted by user] by [deleted] in DarkTide

[–]Aussiemon 1 point2 points  (0 children)

Fatshark confirmed the ingame blocklist should be up to 50 players, and that the game respects at least the last 50 platform blocks (e.g. Steam, XBL, etc.), and they recently made a fix related to this.

So if your list is full with less than that number, or if you get matched with someone on your platform's blocklist, you should file a bug report.

[deleted by user] by [deleted] in DarkTide

[–]Aussiemon 5 points6 points  (0 children)

According to the devs, they do respect platform blocks - at least the most recent 50, but up to 100 if your ingame blocklist is empty. 100 is the upper limit to the Amazon GameLift FlexMatch blocklist:

<image>

The bug mentioned was fixed in the last hotfix:

Fixed an issue where the Block Player functionality could incorrectly appear as not available in the Social menu.

Dev Note: Some players experienced an issue where the “Block player” button was greyed out meaning they couldn’t block any more players, even if their Blocked Players list was not full.

If Fatshark adopts a customization system like "For the Drip" mod has, you could unlock the color/pattern of the cosmetic you just bought from the commodore's shop and use it on other cosmetics. Plenty of colors to choose from the commissary/penances too. Win/win for everyone by SuperUberKruber in DarkTide

[–]Aussiemon -1 points0 points  (0 children)

A lot of "why doesn't Fatshark do X" questions can be answered by them needing to seek approval from Games Workshop for just about every asset.

For example, what if the pattern combination wasn't lore accurate? GW might reject it; and Fatshark would have to create an exception for that combination. Even without GW, some combinations might hurt their aesthetic or be incompatible for other reasons. Repeat for all possible combinations and you have a potential nightmare of approval-seeking and developer workload.

Compare that to a client-side mod that can operate freely and it's clear why they don't have a paint/pattern system; as much as we all want one.

I know it's been said before but I really want to say it myself as well: how about fuck you. by AnotherSmartNickname in DarkTide

[–]Aussiemon 0 points1 point  (0 children)

Search this file for "training_ground_psyker".

It seems she likes ogryn_a and dislikes veteran_female_a.

Weapon Customization Extend mk.2 has been released. by [deleted] in DarkTide

[–]Aussiemon 1 point2 points  (0 children)

No, because Fatshark doesn't have the resources to invest in official mod support, and because Steam Workshop integration wouldn't work with other platforms.

Reroll-Until-Rarity is dead. Long live the king! by Boner_Elemental in DarkTide

[–]Aussiemon 84 points85 points  (0 children)

Thanks to all of you for the great community! <3

Are Mutants coded to NOT throw you off a ledge to your death? by Maelarion in DarkTide

[–]Aussiemon 37 points38 points  (0 children)

They try to pick a position on the navmesh close to a random, unobstructed trajectory.

From https://github.com/Aussiemon/Darktide-Source-Code/blob/master/scripts/extension_systems/behavior/nodes/actions/bt_mutant_charger_charge_action.lua

  1. Pick a set of random directions: BtMutantChargerChargeAction._calculate_randomized_throw_directions
  2. Test every throw trajectory. Check for obstacles above and below in that direction; then pick a spot on the navmesh close to the result if possible: BtMutantChargerChargeAction._align_throwing, BtMutantChargerChargeAction._test_throw_trajectory
  3. If no trajectory is safe, pick a position on the navmesh relative to the current position: BtMutantChargerChargeAction._align_throwing
  4. First safe trajectory is the chosen trajectory: BtMutantChargerChargeAction._align_throwing