Plugin Documentation

PackCraft
Zip, Tar and compressed Tar archives at runtime

Create, open, append to and extract Zip, Tar, Tar + GZip, Tar + LZ4 and Tar + Oodle archives from disk or memory — with async Blueprint nodes, progress callbacks and raw buffer compression.

v1.0
UE 4.27 & 5.8
Win64 (verified)
Category Other
Alpha XP

Overview

PackCraft packs and unpacks archives while your game or tool is running: export and import save games, mods, user content, logs or downloaded data packs. Pick an archiver class, then create or open an archive in a file or in memory, add entries from files or byte arrays, list them and extract them. One-node async actions archive or extract whole directories with progress reporting.

  • Zip (Zip64 for archives written to disk), Tar, Tar + GZip, Tar + LZ4 and Tar + Oodle (UE 5) archivers sharing one set of nodes.
  • Archives in files or entirely in memory; append entries to existing zip files.
  • Async Archive Directory / Archive Files / Unarchive Directory / Unarchive Files nodes with success, progress and failure pins.
  • Entry listing by index or name with sizes, directory flag and creation time.
  • Compression levels 0–10 per entry.
  • Raw GZip, LZ4 and Oodle buffer compression on a background thread.
  • Central error event on an engine subsystem plus a dedicated log category.

Requirements

RequirementDetails
Unreal Engine4.27 and 5.8 (verified clean on both)
ModulesPackCraft (Runtime)
DependenciesNone
LanguageBlueprints and C++
PlatformsNo platform restriction in the plugin descriptor. Win64 is verified by Alpha XP; other platforms are supported by the code, not verified by Alpha XP. Oodle formats require UE 5.

Installation

  1. Close the editor and copy the PackCraft folder into your project's Plugins/ folder (create it if needed), or install the plugin from Fab into your engine.
  2. Open the project. For a C++ project, let the editor rebuild the plugin module when prompted, or build the project from your IDE.
  3. Enable PackCraft in Edit > Plugins (search for “PackCraft”) and restart the editor.
  4. C++ only: add "PackCraft" to PublicDependencyModuleNames in your module's .Build.cs.
Verifying the install In a Blueprint graph, search for Archive Directory under PackCraft|Async.

Quick start

Blueprint — one node

  1. Add Archive Directory (category PackCraft|Async).
  2. Set Archiver Class to Pack Craft Zip, Archive Path to the zip to create, Directory Path to the folder to pack.
  3. Handle the On Success, On Progress and On Fail pins.
  4. Use Unarchive Directory or Unarchive Files to extract again.

Blueprint — step by step

  1. Create Archiver with the archiver class you need, and keep the result in a variable.
  2. Create Archive in Storage (or Create Archive in Memory / Open Archive from Storage).
  3. Add Entry from Storage for each file, or Add Entry from Memory for a byte array.
  4. Close Archive to write the archive.

C++

#include "PackCraftBase.h"
#include "ArchiverZip/PackCraftZip.h"
#include "Misc/Paths.h"

void UMySaveExporter::ExportSlot()
{
    const FString ArchivePath = FPaths::ProjectSavedDir() / TEXT("Backup.zip");

    UPackCraftBase* Writer = UPackCraftBase::CreateArchiver(this, UPackCraftZip::StaticClass());
    if (Writer->CreateArchiveInStorage(ArchivePath))
    {
        Writer->AddEntryFromStorage(TEXT("SaveGames/Slot1.sav"), FPaths::ProjectSavedDir() / TEXT("SaveGames/Slot1.sav"));
        Writer->CloseArchive();
    }

    UPackCraftBase* Reader = UPackCraftBase::CreateArchiver(this, UPackCraftZip::StaticClass());
    if (Reader->OpenArchiveFromStorage(ArchivePath))
    {
        FPackCraftEntry Entry;
        TArray64<uint8> Data;
        if (Reader->GetArchiveEntryInfoByName(TEXT("SaveGames/Slot1.sav"), Entry) && Reader->ExtractEntryToMemory(Entry, Data))
        {
            UE_LOG(LogTemp, Log, TEXT("Extracted %lld bytes"), Data.Num());
        }
        Reader->CloseArchive();
    }
}

Archiver classes

ClassTypeDescription
UPackCraftZipClassZip archives (Zip64 when written to disk); also opens an existing zip to append entries.
UPackCraftTarClassTar archives.
UPackCraftGZipClassTar archives compressed with GZip (.tar.gz / .tgz).
UPackCraftLZ4ClassTar archives compressed with LZ4.
UPackCraftOodleClassTar archives compressed with Oodle (UE 5 only).
UPackCraftBaseClassAbstract base of the archiver classes; all archive nodes are defined here.
UPackCraftRawClassRaw buffer compression and decompression (GZip, LZ4, Oodle on UE 5).
UPackCraftSubsystemClassEngine subsystem that broadcasts every archiver error.
UPackCraftUtilitiesClassUtility functions.
UPackCraftArchiveAsyncTask / UPackCraftUnarchiveAsyncTaskClassAsync Blueprint actions behind the Archive / Unarchive nodes.

Async archive nodes

Latent nodes in PackCraft|Async. Each takes an Archiver Class and keeps its archiver alive until it finishes.

NodeTypeDescription
Archive DirectoryAsyncCreates an archive file of the chosen archiver class from a directory (optionally including the directory itself as the parent entry).
Archive FilesAsyncCreates an archive file from a list of file paths.
Unarchive DirectoryAsyncOpens an archive file and extracts one directory entry (or every entry when Entry Name is empty) into a directory.
Unarchive FilesAsyncOpens an archive file and extracts the named entries into a directory.
On SuccessEventOutput pin: the operation finished (Percentage 100).
On ProgressEventOutput pin: progress in percent while files are added or extracted.
On FailEventOutput pin: the operation failed; details go to the log and the subsystem's On Error event.

Archive nodes

Callable on an archiver created with Create Archiver (categories PackCraft|Create, Open, Close, Get, Add, Extract). Most return a success flag. Asynchronous variants run on a background thread and call their delegates on the game thread.

NodeTypeDescription
Create ArchiverCallableCreates an archiver of the chosen class (Zip, Tar, GZip, LZ4, Oodle); the output is typed to that class.
Create Archive in StorageCallableStarts a new archive at a file path. The file is written when the archive is closed.
Create Archive in MemoryCallableStarts a new archive in memory with an optional initial allocation size.
Open Archive from StorageCallableOpens an existing archive file for reading.
Open Archive from MemoryCallableOpens an archive from a byte array for reading.
Open Archive from Storage to AppendCallableZip archiver only: opens an existing zip file to add more entries.
Close ArchiveCallableFinalises and closes the archive (writes the file for archives created in storage).
Get Archive DataCallableReturns the bytes of an archive created in memory.
Get Archive EntriesCallableReturns the number of entries.
Get Archive Entry Info by NameCallableFinds an entry by its name and returns its information.
Get Archive Entry Info by IndexCallableReturns the information of the entry at an index.
Add Entry from StorageCallableAdds a file from disk under an entry name, with a compression level.
Add Entries from StorageCallableAdds a list of files asynchronously with result and progress delegates.
Add Entries from Storage DirectoryCallableAdds a whole directory recursively and asynchronously, optionally keeping the directory as the parent entry.
Add Entry from MemoryCallableAdds an entry from a byte array.
Extract Entry to StorageCallableExtracts one entry (file or directory) to a path, optionally overwriting.
Extract Entries to StorageCallableExtracts a list of entries into a directory asynchronously with result and progress delegates.
Extract Entries to Storage DirectoryCallableExtracts a directory entry (or everything) into a directory asynchronously.
Extract Entry to MemoryCallableExtracts a file entry into a byte array.

Raw compression, utilities and errors

NodeTypeDescription
Compress Raw Data AsyncCallableCompresses a byte array with GZip, LZ4 or Oodle on a background thread; the result delegate runs on the game thread.
Uncompress Raw Data AsyncCallableDecompresses a byte array produced by the same format on a background thread.
Parse DirectoriesCallableReturns every parent directory of a path (“A/B/File.txt” gives “A/” and “A/B/”).
On ErrorEventPackCraft Subsystem event broadcast with an error code and message whenever an archiver reports an error.

Types

TypeKindDescription
FPackCraftEntryStructEntry information: Index, Name, bIsDirectory, UncompressedSize, CompressedSize, CreationTime. Obtain it from the Get Archive Entry Info nodes; do not fill it manually.
EPackCraftCompressionLevelEnum0 (no compression) to 10 (best compression); default 6.
EPackCraftRawFormatEnumOodle, GZip, LZ4.
EPackCraftErrorCodeEnumNot Initialized, Unsupported Mode, Unsupported Location, Extract Error, Add Error, Close Error, Get Error, Invalid Argument.

Troubleshooting

SymptomCause and fix
Oodle archives or raw Oodle compression fail on UE 4.27Oodle is available on UE 5 only; on 4.27 the log reports that the Oodle format is not supported. Use Zip, GZip or LZ4 there.
The archive file is never writtenArchives created in storage are finalised and written by Close Archive. Call it when you have added every entry (the async archive nodes do this for you).
“Only 'Write' mode is supported for adding entries”The archive was opened for reading. Create a new archive, or use Open Archive from Storage to Append on a Zip archiver.
“It is impossible to extract directory entry into memory”Directory entries have no data. Extract them with Extract Entry to Storage, or skip entries whose bIsDirectory is set.
“Array with int32 size … cannot fit int64 size data”Blueprint byte arrays hold at most 2 GB. Use the C++ TArray64 overloads for larger data.
No more entries can be added after Get Archive Data on a ZipGetting the data of an in-memory zip finalises it. Add every entry first, then call Get Archive Data.
Where do errors go?Every error is logged to LogPackCraft and broadcast by the On Error event of the PackCraft Subsystem (an engine subsystem).

Credits

© 2026 Alpha XP — alphaxp.net · Support: support@alphaxp.net. Built and verified for Unreal Engine 4.27 and 5.8.