1
0
mirror of https://github.com/Raymonf/whack.git synced 2024-11-30 18:54:27 +01:00

Initial commit (galliumhook and WTT)

This commit is contained in:
Raymonf 2022-09-28 18:37:28 -04:00
commit e46416e546
No known key found for this signature in database
GPG Key ID: 438459BF619B037A
289 changed files with 30881 additions and 0 deletions

6
README.md Normal file
View File

@ -0,0 +1,6 @@
# whack
A collection of tools and other hacky things I've made for myself. User beware!
* galliumhook - injects `mercuryhook.dll` (whatever that may be) forces created windows to be 1080x1920 regardless of screen resolution
* Translation/WTT - translation tool that exports message tables to and imports from toml files [(readme)](WTT/README.md)

398
Translation/.gitignore vendored Normal file
View File

@ -0,0 +1,398 @@
## Ignore Visual Studio temporary files, build results, and
## files generated by popular Visual Studio add-ons.
##
## Get latest from https://github.com/github/gitignore/blob/main/VisualStudio.gitignore
# User-specific files
*.rsuser
*.suo
*.user
*.userosscache
*.sln.docstates
# User-specific files (MonoDevelop/Xamarin Studio)
*.userprefs
# Mono auto generated files
mono_crash.*
# Build results
[Dd]ebug/
[Dd]ebugPublic/
[Rr]elease/
[Rr]eleases/
x64/
x86/
[Ww][Ii][Nn]32/
[Aa][Rr][Mm]/
[Aa][Rr][Mm]64/
bld/
[Bb]in/
[Oo]bj/
[Ll]og/
[Ll]ogs/
# Visual Studio 2015/2017 cache/options directory
.vs/
# Uncomment if you have tasks that create the project's static files in wwwroot
#wwwroot/
# Visual Studio 2017 auto generated files
Generated\ Files/
# MSTest test Results
[Tt]est[Rr]esult*/
[Bb]uild[Ll]og.*
# NUnit
*.VisualState.xml
TestResult.xml
nunit-*.xml
# Build Results of an ATL Project
[Dd]ebugPS/
[Rr]eleasePS/
dlldata.c
# Benchmark Results
BenchmarkDotNet.Artifacts/
# .NET Core
project.lock.json
project.fragment.lock.json
artifacts/
# ASP.NET Scaffolding
ScaffoldingReadMe.txt
# StyleCop
StyleCopReport.xml
# Files built by Visual Studio
*_i.c
*_p.c
*_h.h
*.ilk
*.meta
*.obj
*.iobj
*.pch
*.pdb
*.ipdb
*.pgc
*.pgd
*.rsp
*.sbr
*.tlb
*.tli
*.tlh
*.tmp
*.tmp_proj
*_wpftmp.csproj
*.log
*.tlog
*.vspscc
*.vssscc
.builds
*.pidb
*.svclog
*.scc
# Chutzpah Test files
_Chutzpah*
# Visual C++ cache files
ipch/
*.aps
*.ncb
*.opendb
*.opensdf
*.sdf
*.cachefile
*.VC.db
*.VC.VC.opendb
# Visual Studio profiler
*.psess
*.vsp
*.vspx
*.sap
# Visual Studio Trace Files
*.e2e
# TFS 2012 Local Workspace
$tf/
# Guidance Automation Toolkit
*.gpState
# ReSharper is a .NET coding add-in
_ReSharper*/
*.[Rr]e[Ss]harper
*.DotSettings.user
# TeamCity is a build add-in
_TeamCity*
# DotCover is a Code Coverage Tool
*.dotCover
# AxoCover is a Code Coverage Tool
.axoCover/*
!.axoCover/settings.json
# Coverlet is a free, cross platform Code Coverage Tool
coverage*.json
coverage*.xml
coverage*.info
# Visual Studio code coverage results
*.coverage
*.coveragexml
# NCrunch
_NCrunch_*
.*crunch*.local.xml
nCrunchTemp_*
# MightyMoose
*.mm.*
AutoTest.Net/
# Web workbench (sass)
.sass-cache/
# Installshield output folder
[Ee]xpress/
# DocProject is a documentation generator add-in
DocProject/buildhelp/
DocProject/Help/*.HxT
DocProject/Help/*.HxC
DocProject/Help/*.hhc
DocProject/Help/*.hhk
DocProject/Help/*.hhp
DocProject/Help/Html2
DocProject/Help/html
# Click-Once directory
publish/
# Publish Web Output
*.[Pp]ublish.xml
*.azurePubxml
# Note: Comment the next line if you want to checkin your web deploy settings,
# but database connection strings (with potential passwords) will be unencrypted
*.pubxml
*.publishproj
# Microsoft Azure Web App publish settings. Comment the next line if you want to
# checkin your Azure Web App publish settings, but sensitive information contained
# in these scripts will be unencrypted
PublishScripts/
# NuGet Packages
*.nupkg
# NuGet Symbol Packages
*.snupkg
# The packages folder can be ignored because of Package Restore
**/[Pp]ackages/*
# except build/, which is used as an MSBuild target.
!**/[Pp]ackages/build/
# Uncomment if necessary however generally it will be regenerated when needed
#!**/[Pp]ackages/repositories.config
# NuGet v3's project.json files produces more ignorable files
*.nuget.props
*.nuget.targets
# Microsoft Azure Build Output
csx/
*.build.csdef
# Microsoft Azure Emulator
ecf/
rcf/
# Windows Store app package directories and files
AppPackages/
BundleArtifacts/
Package.StoreAssociation.xml
_pkginfo.txt
*.appx
*.appxbundle
*.appxupload
# Visual Studio cache files
# files ending in .cache can be ignored
*.[Cc]ache
# but keep track of directories ending in .cache
!?*.[Cc]ache/
# Others
ClientBin/
~$*
*~
*.dbmdl
*.dbproj.schemaview
*.jfm
*.pfx
*.publishsettings
orleans.codegen.cs
# Including strong name files can present a security risk
# (https://github.com/github/gitignore/pull/2483#issue-259490424)
#*.snk
# Since there are multiple workflows, uncomment next line to ignore bower_components
# (https://github.com/github/gitignore/pull/1529#issuecomment-104372622)
#bower_components/
# RIA/Silverlight projects
Generated_Code/
# Backup & report files from converting an old project file
# to a newer Visual Studio version. Backup files are not needed,
# because we have git ;-)
_UpgradeReport_Files/
Backup*/
UpgradeLog*.XML
UpgradeLog*.htm
ServiceFabricBackup/
*.rptproj.bak
# SQL Server files
*.mdf
*.ldf
*.ndf
# Business Intelligence projects
*.rdl.data
*.bim.layout
*.bim_*.settings
*.rptproj.rsuser
*- [Bb]ackup.rdl
*- [Bb]ackup ([0-9]).rdl
*- [Bb]ackup ([0-9][0-9]).rdl
# Microsoft Fakes
FakesAssemblies/
# GhostDoc plugin setting file
*.GhostDoc.xml
# Node.js Tools for Visual Studio
.ntvs_analysis.dat
node_modules/
# Visual Studio 6 build log
*.plg
# Visual Studio 6 workspace options file
*.opt
# Visual Studio 6 auto-generated workspace file (contains which files were open etc.)
*.vbw
# Visual Studio 6 auto-generated project file (contains which files were open etc.)
*.vbp
# Visual Studio 6 workspace and project file (working project files containing files to include in project)
*.dsw
*.dsp
# Visual Studio 6 technical files
*.ncb
*.aps
# Visual Studio LightSwitch build output
**/*.HTMLClient/GeneratedArtifacts
**/*.DesktopClient/GeneratedArtifacts
**/*.DesktopClient/ModelManifest.xml
**/*.Server/GeneratedArtifacts
**/*.Server/ModelManifest.xml
_Pvt_Extensions
# Paket dependency manager
.paket/paket.exe
paket-files/
# FAKE - F# Make
.fake/
# CodeRush personal settings
.cr/personal
# Python Tools for Visual Studio (PTVS)
__pycache__/
*.pyc
# Cake - Uncomment if you are using it
# tools/**
# !tools/packages.config
# Tabs Studio
*.tss
# Telerik's JustMock configuration file
*.jmconfig
# BizTalk build output
*.btp.cs
*.btm.cs
*.odx.cs
*.xsd.cs
# OpenCover UI analysis results
OpenCover/
# Azure Stream Analytics local run output
ASALocalRun/
# MSBuild Binary and Structured Log
*.binlog
# NVidia Nsight GPU debugger configuration file
*.nvuser
# MFractors (Xamarin productivity tool) working folder
.mfractor/
# Local History for Visual Studio
.localhistory/
# Visual Studio History (VSHistory) files
.vshistory/
# BeatPulse healthcheck temp database
healthchecksdb
# Backup folder for Package Reference Convert tool in Visual Studio 2017
MigrationBackup/
# Ionide (cross platform F# VS Code tools) working folder
.ionide/
# Fody - auto-generated XML schema
FodyWeavers.xsd
# VS Code files for those working on multiple tools
.vscode/*
!.vscode/settings.json
!.vscode/tasks.json
!.vscode/launch.json
!.vscode/extensions.json
*.code-workspace
# Local History for Visual Studio Code
.history/
# Windows Installer files from build outputs
*.cab
*.msi
*.msix
*.msm
*.msp
# JetBrains Rider
*.sln.iml

13
Translation/.idea/.idea.UAssetAPI/.idea/.gitignore generated vendored Normal file
View File

@ -0,0 +1,13 @@
# Default ignored files
/shelf/
/workspace.xml
# Rider ignored files
/modules.xml
/contentModel.xml
/.idea.UAssetAPI.iml
/projectSettingsUpdater.xml
# Editor-based HTTP Client requests
/httpRequests/
# Datasource local storage ignored files
/dataSources/
/dataSources.local.xml

View File

@ -0,0 +1,4 @@
<?xml version="1.0" encoding="UTF-8"?>
<project version="4">
<component name="Encoding" addBOMForNewFiles="with BOM under Windows, with no BOM otherwise" />
</project>

View File

@ -0,0 +1,8 @@
<?xml version="1.0" encoding="UTF-8"?>
<project version="4">
<component name="UserContentModel">
<attachedFolders />
<explicitIncludes />
<explicitExcludes />
</component>
</project>

View File

@ -0,0 +1,6 @@
<?xml version="1.0" encoding="UTF-8"?>
<project version="4">
<component name="VcsDirectoryMappings">
<mapping directory="$PROJECT_DIR$" vcs="Git" />
</component>
</project>

21
Translation/LICENSE Normal file
View File

@ -0,0 +1,21 @@
MIT License
Copyright (c) 2022 Atenfyr (UAssetAPI), Raymonf (WTT)
Permission is hereby granted, free of charge, to any person obtaining a copy
of this software and associated documentation files (the "Software"), to deal
in the Software without restriction, including without limitation the rights
to use, copy, modify, merge, publish, distribute, sublicense, and/or sell
copies of the Software, and to permit persons to whom the Software is
furnished to do so, subject to the following conditions:
The above copyright notice and this permission notice shall be included in all
copies or substantial portions of the Software.
THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE
SOFTWARE.

25
Translation/README.md Normal file
View File

@ -0,0 +1,25 @@
# WTT
Based on [UAssetAPI](https://github.com/atenfyr/UAssetAPI).
It replaces existing strings, so you can't add new ones. Tested on version 3.7.10.
**Beware:** There is no error handling since this tool was originally meant for my personal use.
### Compilation
Compile like a normal .NET 6 application. WTT.sln has everything you will need if you use Visual Studio.
### Usage
When it asks, put in the path to your `Message` directory. Usually, this would be `C:\whatever\WindowsNoEditor\Mercury\Content\Message`.
Then, choose a mode:
* **bulk_export** - bulk export all the `uasset` files in the path given as toml files in the same directory
* **bulk_import** - bulk import all the `toml` files
* directory of TOML files: where your TOML files are
* uasset directory: where your uasset files are (useful as a way to back up the original uasset files)
* output uasset directory: where your new uasset files will be put
* **e** - export single toml file from uasset
* **i** - import single uasset file from toml

View File

@ -0,0 +1,201 @@
using System;
using System.Diagnostics;
using System.IO;
namespace UAssetAPI
{
public class AC7XorKey
{
public int NameKey;
public int Offset;
public int pk1;
public int pk2;
public void SkipCount(int count)
{
int num = count % 217;
pk1 += num;
if (pk1 >= 217)
{
pk1 -= 217;
}
int num2 = count % 1024;
pk2 += num2;
if (pk2 >= 1024)
{
pk2 -= 1024;
}
}
public AC7XorKey(int nameKey, int offset)
{
NameKey = nameKey;
Offset = offset;
}
}
public class AC7Decrypt
{
private static byte[] AC7FullKey = new byte[0];
public AC7Decrypt()
{
if (AC7FullKey.Length == 0) AC7FullKey = Properties.Resources.AC7Key;
}
/// <summary>
/// Decrypts an Ace Combat 7 encrypted asset on disk.
/// </summary>
/// <param name="input">The path to an encrypted asset on disk.</param>
/// <param name="output">The path that the decrypted asset should be saved to.</param>
public void Decrypt(string input, string output)
{
AC7XorKey xorKey = GetXorKey(Path.GetFileNameWithoutExtension(input));
byte[] doneData = DecryptUAssetBytes(File.ReadAllBytes(input), xorKey);
File.WriteAllBytes(output, doneData);
try
{
byte[] doneData2 = DecryptUexpBytes(File.ReadAllBytes(Path.ChangeExtension(input, "uexp")), xorKey);
File.WriteAllBytes(Path.ChangeExtension(output, "uexp"), doneData2);
}
catch { }
}
/// <summary>
/// Encrypts an Ace Combat 7 encrypted asset on disk.
/// </summary>
/// <param name="input">The path to a decrypted asset on disk.</param>
/// <param name="output">The path that the encrypted asset should be saved to.</param>
public void Encrypt(string input, string output)
{
AC7XorKey xorKey = GetXorKey(Path.GetFileNameWithoutExtension(output));
byte[] doneData = EncryptUAssetBytes(File.ReadAllBytes(input), xorKey);
File.WriteAllBytes(output, doneData);
try
{
byte[] doneData2 = EncryptUexpBytes(File.ReadAllBytes(Path.ChangeExtension(input, "uexp")), xorKey);
File.WriteAllBytes(Path.ChangeExtension(output, "uexp"), doneData2);
}
catch { }
}
public byte[] DecryptUAssetBytes(byte[] uasset, AC7XorKey xorkey)
{
if (xorkey == null) throw new NullReferenceException("Null key provided");
byte[] array = new byte[uasset.Length];
BitConverter.GetBytes(UAsset.UASSET_MAGIC).CopyTo(array, 0);
for (int i = 4; i < array.Length; i++)
{
array[i] = GetXorByte(uasset[i], ref xorkey);
}
return array;
}
public byte[] EncryptUAssetBytes(byte[] uasset, AC7XorKey xorkey)
{
if (xorkey == null) throw new NullReferenceException("Null key provided");
byte[] array = new byte[uasset.Length];
BitConverter.GetBytes(UAsset.ACE7_MAGIC).CopyTo(array, 0);
for (int i = 4; i < array.Length; i++)
{
array[i] = GetXorByte(uasset[i], ref xorkey);
}
return array;
}
public byte[] DecryptUexpBytes(byte[] uexp, AC7XorKey xorkey)
{
if (xorkey == null) throw new NullReferenceException("Null key provided");
byte[] array = new byte[uexp.Length];
for (int i = 0; i < array.Length; i++)
{
array[i] = GetXorByte(uexp[i], ref xorkey);
}
BitConverter.GetBytes(UAsset.UASSET_MAGIC).CopyTo(array, array.Length - 4);
return array;
}
public byte[] EncryptUexpBytes(byte[] uexp, AC7XorKey xorkey)
{
if (xorkey == null) throw new NullReferenceException("Null key provided");
byte[] array = new byte[uexp.Length];
for (int i = 0; i < uexp.Length; i++)
{
array[i] = GetXorByte(uexp[i], ref xorkey);
}
return array;
}
/// <summary>
/// Generates an encryption key for a particular asset on disk.
/// </summary>
/// <param name="fname">The name of the asset being encrypted on disk without the extension.</param>
/// <returns>An encryption key for the asset.</returns>
public static AC7XorKey GetXorKey(string fname)
{
AC7XorKey key = new AC7XorKey(CalcNameKey(fname), 4);
CalcPKeyFromNKey(key.NameKey, key.Offset, out key.pk1, out key.pk2);
return key;
}
private static int CalcNameKey(string fname)
{
fname = fname.ToUpper();
int num = 0;
for (int i = 0; i < fname.Length; i++)
{
int num2 = (byte)fname[i];
num ^= num2;
num2 = num * 8;
num2 ^= num;
int num3 = num + num;
num2 = ~num2;
num2 = (num2 >> 7) & 1;
num = num2 | num3;
}
return num;
}
private static void CalcPKeyFromNKey(int nkey, int dataoffset, out int pk1, out int pk2)
{
long num = (uint)((long)nkey * 7L);
System.Numerics.BigInteger bigInteger = new System.Numerics.BigInteger(5440514381186227205L);
num += dataoffset;
System.Numerics.BigInteger bigInteger2 = bigInteger * num;
long num2 = (long)(bigInteger2 >> 70);
long num3 = num2 >> 63;
num2 += num3;
num3 = num2 * 217;
num -= num3;
pk1 = (int)(num & 0xFFFFFFFFu);
long num4 = (uint)((long)nkey * 11L);
num4 += dataoffset;
num2 = 0L;
num2 &= 0x3FF;
num4 += num2;
num4 &= 0x3FF;
long num5 = num4 - num2;
pk2 = (int)(num5 & 0xFFFFFFFFu);
}
private static byte GetXorByte(byte tagb, ref AC7XorKey xorkey)
{
if (xorkey == null)
{
return tagb;
}
tagb = (byte)((uint)(tagb ^ AC7FullKey[xorkey.pk1 * 1024 + xorkey.pk2]) ^ 0x77u);
xorkey.pk1++;
xorkey.pk2++;
if (xorkey.pk1 >= 217)
{
xorkey.pk1 = 0;
}
if (xorkey.pk2 >= 1024)
{
xorkey.pk2 = 0;
}
return tagb;
}
}
}

View File

@ -0,0 +1,207 @@
using System;
using System.Collections.Generic;
using System.IO;
using System.Text;
using UAssetAPI.Kismet.Bytecode;
using UAssetAPI.UnrealTypes;
namespace UAssetAPI
{
public class AssetBinaryReader : BinaryReader
{
public UAsset Asset;
public AssetBinaryReader(Stream stream, UAsset asset) : base(stream)
{
Asset = asset;
}
private byte[] ReverseIfBigEndian(byte[] data)
{
if (!BitConverter.IsLittleEndian) Array.Reverse(data);
return data;
}
public override short ReadInt16()
{
return BitConverter.ToInt16(ReverseIfBigEndian(base.ReadBytes(2)), 0);
}
public override ushort ReadUInt16()
{
return BitConverter.ToUInt16(ReverseIfBigEndian(base.ReadBytes(2)), 0);
}
public override int ReadInt32()
{
return BitConverter.ToInt32(ReverseIfBigEndian(base.ReadBytes(4)), 0);
}
public override uint ReadUInt32()
{
return BitConverter.ToUInt32(ReverseIfBigEndian(base.ReadBytes(4)), 0);
}
public override long ReadInt64()
{
return BitConverter.ToInt64(ReverseIfBigEndian(base.ReadBytes(8)), 0);
}
public override ulong ReadUInt64()
{
return BitConverter.ToUInt64(ReverseIfBigEndian(base.ReadBytes(8)), 0);
}
public override float ReadSingle()
{
return BitConverter.ToSingle(ReverseIfBigEndian(base.ReadBytes(4)), 0);
}
public override double ReadDouble()
{
return BitConverter.ToDouble(ReverseIfBigEndian(base.ReadBytes(8)), 0);
}
public override string ReadString()
{
return ReadFString()?.Value;
}
public virtual Guid? ReadPropertyGuid()
{
if (Asset.EngineVersion >= UE4Version.VER_UE4_PROPERTY_GUID_IN_PROPERTY_TAG)
{
bool hasPropertyGuid = ReadBoolean();
if (hasPropertyGuid) return new Guid(ReadBytes(16));
}
return null;
}
public virtual FString ReadFString()
{
int length = this.ReadInt32();
switch (length)
{
case 0:
return null;
default:
if (length < 0)
{
byte[] data = this.ReadBytes(-length * 2);
return new FString(Encoding.Unicode.GetString(data, 0, data.Length - 2), Encoding.Unicode);
}
else
{
byte[] data = this.ReadBytes(length);
return new FString(Encoding.ASCII.GetString(data, 0, data.Length - 1), Encoding.ASCII);
}
}
}
public virtual FString ReadNameMapString(out uint hashes)
{
FString str = this.ReadFString();
hashes = 0;
if (Asset.EngineVersion >= UE4Version.VER_UE4_NAME_HASHES_SERIALIZED && !string.IsNullOrEmpty(str.Value))
{
hashes = this.ReadUInt32();
}
return str;
}
public virtual FName ReadFName()
{
int nameMapPointer = this.ReadInt32();
int number = this.ReadInt32();
return new FName(Asset, nameMapPointer, number);
}
public string XFERSTRING()
{
List<byte> readData = new List<byte>();
while (true)
{
byte newVal = this.ReadByte();
if (newVal == 0) break;
readData.Add(newVal);
}
return Encoding.ASCII.GetString(readData.ToArray());
}
public string XFERUNICODESTRING()
{
List<byte> readData = new List<byte>();
while (true)
{
byte newVal1 = this.ReadByte();
byte newVal2 = this.ReadByte();
if (newVal1 == 0 && newVal2 == 0) break;
readData.Add(newVal1);
readData.Add(newVal2);
}
return Encoding.Unicode.GetString(readData.ToArray());
}
public void XFERTEXT()
{
}
public FName XFERNAME()
{
return this.ReadFName();
}
public FName XFER_FUNC_NAME()
{
return this.XFERNAME();
}
public FPackageIndex XFERPTR()
{
return new FPackageIndex(this.ReadInt32());
}
public FPackageIndex XFER_FUNC_POINTER()
{
return this.XFERPTR();
}
public KismetPropertyPointer XFER_PROP_POINTER()
{
if (Asset.EngineVersion >= KismetPropertyPointer.XFER_PROP_POINTER_SWITCH_TO_SERIALIZING_AS_FIELD_PATH_VERSION)
{
int numEntries = this.ReadInt32();
FName[] allNames = new FName[numEntries];
for (int i = 0; i < numEntries; i++)
{
allNames[i] = this.ReadFName();
}
FPackageIndex owner = this.XFER_OBJECT_POINTER();
return new KismetPropertyPointer(new FFieldPath(allNames, owner));
}
else
{
return new KismetPropertyPointer(this.XFERPTR());
}
}
public FPackageIndex XFER_OBJECT_POINTER()
{
return this.XFERPTR();
}
public KismetExpression[] ReadExpressionArray(EExprToken endToken)
{
List<KismetExpression> newData = new List<KismetExpression>();
KismetExpression currExpression = null;
while (currExpression == null || currExpression.Token != endToken)
{
if (currExpression != null) newData.Add(currExpression);
currExpression = ExpressionSerializer.ReadExpression(this);
}
return newData.ToArray();
}
}
}

View File

@ -0,0 +1,176 @@
using System;
using System.IO;
using System.Text;
using UAssetAPI.Kismet.Bytecode;
using UAssetAPI.UnrealTypes;
namespace UAssetAPI
{
public class AssetBinaryWriter : BinaryWriter
{
public UAsset Asset;
public AssetBinaryWriter(UAsset asset) : base()
{
Asset = asset;
}
public AssetBinaryWriter(Stream stream, UAsset asset) : base(stream)
{
Asset = asset;
}
public AssetBinaryWriter(Stream stream, Encoding encoding, UAsset asset) : base(stream, encoding)
{
Asset = asset;
}
public AssetBinaryWriter(Stream stream, Encoding encoding, bool leaveOpen, UAsset asset) : base(stream, encoding, leaveOpen)
{
Asset = asset;
}
private byte[] ReverseIfBigEndian(byte[] data)
{
if (!BitConverter.IsLittleEndian) Array.Reverse(data);
return data;
}
public override void Write(short value)
{
this.Write(ReverseIfBigEndian(BitConverter.GetBytes(value)));
}
public override void Write(ushort value)
{
this.Write(ReverseIfBigEndian(BitConverter.GetBytes(value)));
}
public override void Write(int value)
{
this.Write(ReverseIfBigEndian(BitConverter.GetBytes(value)));
}
public override void Write(uint value)
{
this.Write(ReverseIfBigEndian(BitConverter.GetBytes(value)));
}
public override void Write(long value)
{
this.Write(ReverseIfBigEndian(BitConverter.GetBytes(value)));
}
public override void Write(ulong value)
{
this.Write(ReverseIfBigEndian(BitConverter.GetBytes(value)));
}
public override void Write(float value)
{
this.Write(ReverseIfBigEndian(BitConverter.GetBytes(value)));
}
public override void Write(double value)
{
this.Write(ReverseIfBigEndian(BitConverter.GetBytes(value)));
}
public override void Write(string value)
{
Write(new FString(value));
}
public virtual int Write(FString value)
{
switch (value?.Value)
{
case null:
this.Write((int)0);
return sizeof(int);
default:
string nullTerminatedStr = value.Value + "\0";
this.Write(value.Encoding is UnicodeEncoding ? -nullTerminatedStr.Length : nullTerminatedStr.Length);
byte[] actualStrData = value.Encoding.GetBytes(nullTerminatedStr);
this.Write(actualStrData);
return actualStrData.Length + 4;
}
}
public virtual void Write(FName name)
{
this.Write(name.Index);
this.Write(name.Number);
}
public virtual void WritePropertyGuid(Guid? guid)
{
if (Asset.EngineVersion >= UE4Version.VER_UE4_PROPERTY_GUID_IN_PROPERTY_TAG)
{
Write(guid != null);
if (guid != null) Write(((Guid)guid).ToByteArray());
}
}
public int XFERSTRING(string val)
{
long startMetric = this.BaseStream.Position;
this.Write(Encoding.ASCII.GetBytes(val + "\0"));
return (int)(this.BaseStream.Position - startMetric);
}
public int XFERUNICODESTRING(string val)
{
long startMetric = this.BaseStream.Position;
this.Write(Encoding.Unicode.GetBytes(val + "\0"));
return (int)(this.BaseStream.Position - startMetric);
}
public int XFERNAME(FName val)
{
this.Write(val);
return 12; // FScriptName's iCode offset is 12 bytes, not 8
}
public int XFER_FUNC_NAME(FName val)
{
return this.XFERNAME(val);
}
private static readonly int PointerSize = sizeof(ulong);
public int XFERPTR(FPackageIndex val)
{
this.Write(val.Index);
return PointerSize; // For the iCode offset, we return the size of a pointer in memory rather than the size of an FPackageIndex on disk
}
public int XFER_FUNC_POINTER(FPackageIndex val)
{
return this.XFERPTR(val);
}
public int XFER_PROP_POINTER(KismetPropertyPointer val)
{
if (Asset.EngineVersion >= KismetPropertyPointer.XFER_PROP_POINTER_SWITCH_TO_SERIALIZING_AS_FIELD_PATH_VERSION)
{
this.Write(val.New.Path.Length);
for (int i = 0; i < val.New.Path.Length; i++)
{
this.XFERNAME(val.New.Path[i]);
}
this.XFER_OBJECT_POINTER(val.New.ResolvedOwner);
}
else
{
this.XFERPTR(val.Old);
}
return PointerSize;
}
public int XFER_OBJECT_POINTER(FPackageIndex val)
{
return this.XFERPTR(val);
}
}
}

View File

@ -0,0 +1,233 @@
using System;
using System.Diagnostics;
using System.Text;
using UAssetAPI.UnrealTypes;
namespace UAssetAPI
{
public static class CRCGenerator
{
public static uint GenerateHash(FString text)
{
return GenerateHash(text?.Value, text?.Encoding);
}
public static uint GenerateHash(string text)
{
return GenerateHash(text, Encoding.ASCII);
}
public static uint GenerateHash(string text, Encoding encoding)
{
uint algor1 = Strihash_DEPRECATED(text, encoding);
uint algor2 = StrCrc32(text);
return (algor1 & 0xFFFF) | ((algor2 & 0xFFFF) << 16);
}
private static char ToUpper(char input)
{
return (char)((uint)input - ((((uint)input - 'a' < 26u) ? 1 : 0) << 5));
}
private static uint Strihash_DEPRECATED(string text, Encoding encoding)
{
uint hash = 0;
for (int i = 0; i < text.Length; i++)
{
char B = ToUpper(text[i]);
byte[] rawDataForCharacter = encoding.GetBytes(new char[1] { B });
foreach (byte rawByte in rawDataForCharacter)
{
hash = ((hash >> 8) & 0x00FFFFFF) ^ CRCTable_DEPRECATED[(hash ^ rawByte) & 0x000000FF];
}
}
return hash;
}
// Accurate as-is for both WIDECHAR and ANSICHAR
private static uint StrCrc32(string text, uint CRC = 0)
{
CRC = ~CRC;
for (int i = 0; i < text.Length; i++)
{
char Ch = text[i];
CRC = (CRC >> 8) ^ CRCTablesSB8[0, (CRC ^ Ch) & 0xFF];
Ch >>= 8;
CRC = (CRC >> 8) ^ CRCTablesSB8[0, (CRC ^ Ch) & 0xFF];
Ch >>= 8;
CRC = (CRC >> 8) ^ CRCTablesSB8[0, (CRC ^ Ch) & 0xFF];
Ch >>= 8;
CRC = (CRC >> 8) ^ CRCTablesSB8[0, (CRC ^ Ch) & 0xFF];
}
return ~CRC;
}
private static readonly uint[] CRCTable_DEPRECATED = new uint[256]
{
0x00000000, 0x04C11DB7, 0x09823B6E, 0x0D4326D9, 0x130476DC, 0x17C56B6B, 0x1A864DB2, 0x1E475005, 0x2608EDB8, 0x22C9F00F, 0x2F8AD6D6, 0x2B4BCB61, 0x350C9B64, 0x31CD86D3, 0x3C8EA00A, 0x384FBDBD,
0x4C11DB70, 0x48D0C6C7, 0x4593E01E, 0x4152FDA9, 0x5F15ADAC, 0x5BD4B01B, 0x569796C2, 0x52568B75, 0x6A1936C8, 0x6ED82B7F, 0x639B0DA6, 0x675A1011, 0x791D4014, 0x7DDC5DA3, 0x709F7B7A, 0x745E66CD,
0x9823B6E0, 0x9CE2AB57, 0x91A18D8E, 0x95609039, 0x8B27C03C, 0x8FE6DD8B, 0x82A5FB52, 0x8664E6E5, 0xBE2B5B58, 0xBAEA46EF, 0xB7A96036, 0xB3687D81, 0xAD2F2D84, 0xA9EE3033, 0xA4AD16EA, 0xA06C0B5D,
0xD4326D90, 0xD0F37027, 0xDDB056FE, 0xD9714B49, 0xC7361B4C, 0xC3F706FB, 0xCEB42022, 0xCA753D95, 0xF23A8028, 0xF6FB9D9F, 0xFBB8BB46, 0xFF79A6F1, 0xE13EF6F4, 0xE5FFEB43, 0xE8BCCD9A, 0xEC7DD02D,
0x34867077, 0x30476DC0, 0x3D044B19, 0x39C556AE, 0x278206AB, 0x23431B1C, 0x2E003DC5, 0x2AC12072, 0x128E9DCF, 0x164F8078, 0x1B0CA6A1, 0x1FCDBB16, 0x018AEB13, 0x054BF6A4, 0x0808D07D, 0x0CC9CDCA,
0x7897AB07, 0x7C56B6B0, 0x71159069, 0x75D48DDE, 0x6B93DDDB, 0x6F52C06C, 0x6211E6B5, 0x66D0FB02, 0x5E9F46BF, 0x5A5E5B08, 0x571D7DD1, 0x53DC6066, 0x4D9B3063, 0x495A2DD4, 0x44190B0D, 0x40D816BA,
0xACA5C697, 0xA864DB20, 0xA527FDF9, 0xA1E6E04E, 0xBFA1B04B, 0xBB60ADFC, 0xB6238B25, 0xB2E29692, 0x8AAD2B2F, 0x8E6C3698, 0x832F1041, 0x87EE0DF6, 0x99A95DF3, 0x9D684044, 0x902B669D, 0x94EA7B2A,
0xE0B41DE7, 0xE4750050, 0xE9362689, 0xEDF73B3E, 0xF3B06B3B, 0xF771768C, 0xFA325055, 0xFEF34DE2, 0xC6BCF05F, 0xC27DEDE8, 0xCF3ECB31, 0xCBFFD686, 0xD5B88683, 0xD1799B34, 0xDC3ABDED, 0xD8FBA05A,
0x690CE0EE, 0x6DCDFD59, 0x608EDB80, 0x644FC637, 0x7A089632, 0x7EC98B85, 0x738AAD5C, 0x774BB0EB, 0x4F040D56, 0x4BC510E1, 0x46863638, 0x42472B8F, 0x5C007B8A, 0x58C1663D, 0x558240E4, 0x51435D53,
0x251D3B9E, 0x21DC2629, 0x2C9F00F0, 0x285E1D47, 0x36194D42, 0x32D850F5, 0x3F9B762C, 0x3B5A6B9B, 0x0315D626, 0x07D4CB91, 0x0A97ED48, 0x0E56F0FF, 0x1011A0FA, 0x14D0BD4D, 0x19939B94, 0x1D528623,
0xF12F560E, 0xF5EE4BB9, 0xF8AD6D60, 0xFC6C70D7, 0xE22B20D2, 0xE6EA3D65, 0xEBA91BBC, 0xEF68060B, 0xD727BBB6, 0xD3E6A601, 0xDEA580D8, 0xDA649D6F, 0xC423CD6A, 0xC0E2D0DD, 0xCDA1F604, 0xC960EBB3,
0xBD3E8D7E, 0xB9FF90C9, 0xB4BCB610, 0xB07DABA7, 0xAE3AFBA2, 0xAAFBE615, 0xA7B8C0CC, 0xA379DD7B, 0x9B3660C6, 0x9FF77D71, 0x92B45BA8, 0x9675461F, 0x8832161A, 0x8CF30BAD, 0x81B02D74, 0x857130C3,
0x5D8A9099, 0x594B8D2E, 0x5408ABF7, 0x50C9B640, 0x4E8EE645, 0x4A4FFBF2, 0x470CDD2B, 0x43CDC09C, 0x7B827D21, 0x7F436096, 0x7200464F, 0x76C15BF8, 0x68860BFD, 0x6C47164A, 0x61043093, 0x65C52D24,
0x119B4BE9, 0x155A565E, 0x18197087, 0x1CD86D30, 0x029F3D35, 0x065E2082, 0x0B1D065B, 0x0FDC1BEC, 0x3793A651, 0x3352BBE6, 0x3E119D3F, 0x3AD08088, 0x2497D08D, 0x2056CD3A, 0x2D15EBE3, 0x29D4F654,
0xC5A92679, 0xC1683BCE, 0xCC2B1D17, 0xC8EA00A0, 0xD6AD50A5, 0xD26C4D12, 0xDF2F6BCB, 0xDBEE767C, 0xE3A1CBC1, 0xE760D676, 0xEA23F0AF, 0xEEE2ED18, 0xF0A5BD1D, 0xF464A0AA, 0xF9278673, 0xFDE69BC4,
0x89B8FD09, 0x8D79E0BE, 0x803AC667, 0x84FBDBD0, 0x9ABC8BD5, 0x9E7D9662, 0x933EB0BB, 0x97FFAD0C, 0xAFB010B1, 0xAB710D06, 0xA6322BDF, 0xA2F33668, 0xBCB4666D, 0xB8757BDA, 0xB5365D03, 0xB1F740B4
};
private static readonly uint[,] CRCTablesSB8 = new uint[8, 256]
{
{
0x00000000, 0x77073096, 0xee0e612c, 0x990951ba, 0x076dc419, 0x706af48f, 0xe963a535, 0x9e6495a3, 0x0edb8832, 0x79dcb8a4, 0xe0d5e91e, 0x97d2d988, 0x09b64c2b, 0x7eb17cbd, 0xe7b82d07, 0x90bf1d91,
0x1db71064, 0x6ab020f2, 0xf3b97148, 0x84be41de, 0x1adad47d, 0x6ddde4eb, 0xf4d4b551, 0x83d385c7, 0x136c9856, 0x646ba8c0, 0xfd62f97a, 0x8a65c9ec, 0x14015c4f, 0x63066cd9, 0xfa0f3d63, 0x8d080df5,
0x3b6e20c8, 0x4c69105e, 0xd56041e4, 0xa2677172, 0x3c03e4d1, 0x4b04d447, 0xd20d85fd, 0xa50ab56b, 0x35b5a8fa, 0x42b2986c, 0xdbbbc9d6, 0xacbcf940, 0x32d86ce3, 0x45df5c75, 0xdcd60dcf, 0xabd13d59,
0x26d930ac, 0x51de003a, 0xc8d75180, 0xbfd06116, 0x21b4f4b5, 0x56b3c423, 0xcfba9599, 0xb8bda50f, 0x2802b89e, 0x5f058808, 0xc60cd9b2, 0xb10be924, 0x2f6f7c87, 0x58684c11, 0xc1611dab, 0xb6662d3d,
0x76dc4190, 0x01db7106, 0x98d220bc, 0xefd5102a, 0x71b18589, 0x06b6b51f, 0x9fbfe4a5, 0xe8b8d433, 0x7807c9a2, 0x0f00f934, 0x9609a88e, 0xe10e9818, 0x7f6a0dbb, 0x086d3d2d, 0x91646c97, 0xe6635c01,
0x6b6b51f4, 0x1c6c6162, 0x856530d8, 0xf262004e, 0x6c0695ed, 0x1b01a57b, 0x8208f4c1, 0xf50fc457, 0x65b0d9c6, 0x12b7e950, 0x8bbeb8ea, 0xfcb9887c, 0x62dd1ddf, 0x15da2d49, 0x8cd37cf3, 0xfbd44c65,
0x4db26158, 0x3ab551ce, 0xa3bc0074, 0xd4bb30e2, 0x4adfa541, 0x3dd895d7, 0xa4d1c46d, 0xd3d6f4fb, 0x4369e96a, 0x346ed9fc, 0xad678846, 0xda60b8d0, 0x44042d73, 0x33031de5, 0xaa0a4c5f, 0xdd0d7cc9,
0x5005713c, 0x270241aa, 0xbe0b1010, 0xc90c2086, 0x5768b525, 0x206f85b3, 0xb966d409, 0xce61e49f, 0x5edef90e, 0x29d9c998, 0xb0d09822, 0xc7d7a8b4, 0x59b33d17, 0x2eb40d81, 0xb7bd5c3b, 0xc0ba6cad,
0xedb88320, 0x9abfb3b6, 0x03b6e20c, 0x74b1d29a, 0xead54739, 0x9dd277af, 0x04db2615, 0x73dc1683, 0xe3630b12, 0x94643b84, 0x0d6d6a3e, 0x7a6a5aa8, 0xe40ecf0b, 0x9309ff9d, 0x0a00ae27, 0x7d079eb1,
0xf00f9344, 0x8708a3d2, 0x1e01f268, 0x6906c2fe, 0xf762575d, 0x806567cb, 0x196c3671, 0x6e6b06e7, 0xfed41b76, 0x89d32be0, 0x10da7a5a, 0x67dd4acc, 0xf9b9df6f, 0x8ebeeff9, 0x17b7be43, 0x60b08ed5,
0xd6d6a3e8, 0xa1d1937e, 0x38d8c2c4, 0x4fdff252, 0xd1bb67f1, 0xa6bc5767, 0x3fb506dd, 0x48b2364b, 0xd80d2bda, 0xaf0a1b4c, 0x36034af6, 0x41047a60, 0xdf60efc3, 0xa867df55, 0x316e8eef, 0x4669be79,
0xcb61b38c, 0xbc66831a, 0x256fd2a0, 0x5268e236, 0xcc0c7795, 0xbb0b4703, 0x220216b9, 0x5505262f, 0xc5ba3bbe, 0xb2bd0b28, 0x2bb45a92, 0x5cb36a04, 0xc2d7ffa7, 0xb5d0cf31, 0x2cd99e8b, 0x5bdeae1d,
0x9b64c2b0, 0xec63f226, 0x756aa39c, 0x026d930a, 0x9c0906a9, 0xeb0e363f, 0x72076785, 0x05005713, 0x95bf4a82, 0xe2b87a14, 0x7bb12bae, 0x0cb61b38, 0x92d28e9b, 0xe5d5be0d, 0x7cdcefb7, 0x0bdbdf21,
0x86d3d2d4, 0xf1d4e242, 0x68ddb3f8, 0x1fda836e, 0x81be16cd, 0xf6b9265b, 0x6fb077e1, 0x18b74777, 0x88085ae6, 0xff0f6a70, 0x66063bca, 0x11010b5c, 0x8f659eff, 0xf862ae69, 0x616bffd3, 0x166ccf45,
0xa00ae278, 0xd70dd2ee, 0x4e048354, 0x3903b3c2, 0xa7672661, 0xd06016f7, 0x4969474d, 0x3e6e77db, 0xaed16a4a, 0xd9d65adc, 0x40df0b66, 0x37d83bf0, 0xa9bcae53, 0xdebb9ec5, 0x47b2cf7f, 0x30b5ffe9,
0xbdbdf21c, 0xcabac28a, 0x53b39330, 0x24b4a3a6, 0xbad03605, 0xcdd70693, 0x54de5729, 0x23d967bf, 0xb3667a2e, 0xc4614ab8, 0x5d681b02, 0x2a6f2b94, 0xb40bbe37, 0xc30c8ea1, 0x5a05df1b, 0x2d02ef8d
},
{
0x00000000, 0x191b3141, 0x32366282, 0x2b2d53c3, 0x646cc504, 0x7d77f445, 0x565aa786, 0x4f4196c7, 0xc8d98a08, 0xd1c2bb49, 0xfaefe88a, 0xe3f4d9cb, 0xacb54f0c, 0xb5ae7e4d, 0x9e832d8e, 0x87981ccf,
0x4ac21251, 0x53d92310, 0x78f470d3, 0x61ef4192, 0x2eaed755, 0x37b5e614, 0x1c98b5d7, 0x05838496, 0x821b9859, 0x9b00a918, 0xb02dfadb, 0xa936cb9a, 0xe6775d5d, 0xff6c6c1c, 0xd4413fdf, 0xcd5a0e9e,
0x958424a2, 0x8c9f15e3, 0xa7b24620, 0xbea97761, 0xf1e8e1a6, 0xe8f3d0e7, 0xc3de8324, 0xdac5b265, 0x5d5daeaa, 0x44469feb, 0x6f6bcc28, 0x7670fd69, 0x39316bae, 0x202a5aef, 0x0b07092c, 0x121c386d,
0xdf4636f3, 0xc65d07b2, 0xed705471, 0xf46b6530, 0xbb2af3f7, 0xa231c2b6, 0x891c9175, 0x9007a034, 0x179fbcfb, 0x0e848dba, 0x25a9de79, 0x3cb2ef38, 0x73f379ff, 0x6ae848be, 0x41c51b7d, 0x58de2a3c,
0xf0794f05, 0xe9627e44, 0xc24f2d87, 0xdb541cc6, 0x94158a01, 0x8d0ebb40, 0xa623e883, 0xbf38d9c2, 0x38a0c50d, 0x21bbf44c, 0x0a96a78f, 0x138d96ce, 0x5ccc0009, 0x45d73148, 0x6efa628b, 0x77e153ca,
0xbabb5d54, 0xa3a06c15, 0x888d3fd6, 0x91960e97, 0xded79850, 0xc7cca911, 0xece1fad2, 0xf5facb93, 0x7262d75c, 0x6b79e61d, 0x4054b5de, 0x594f849f, 0x160e1258, 0x0f152319, 0x243870da, 0x3d23419b,
0x65fd6ba7, 0x7ce65ae6, 0x57cb0925, 0x4ed03864, 0x0191aea3, 0x188a9fe2, 0x33a7cc21, 0x2abcfd60, 0xad24e1af, 0xb43fd0ee, 0x9f12832d, 0x8609b26c, 0xc94824ab, 0xd05315ea, 0xfb7e4629, 0xe2657768,
0x2f3f79f6, 0x362448b7, 0x1d091b74, 0x04122a35, 0x4b53bcf2, 0x52488db3, 0x7965de70, 0x607eef31, 0xe7e6f3fe, 0xfefdc2bf, 0xd5d0917c, 0xcccba03d, 0x838a36fa, 0x9a9107bb, 0xb1bc5478, 0xa8a76539,
0x3b83984b, 0x2298a90a, 0x09b5fac9, 0x10aecb88, 0x5fef5d4f, 0x46f46c0e, 0x6dd93fcd, 0x74c20e8c, 0xf35a1243, 0xea412302, 0xc16c70c1, 0xd8774180, 0x9736d747, 0x8e2de606, 0xa500b5c5, 0xbc1b8484,
0x71418a1a, 0x685abb5b, 0x4377e898, 0x5a6cd9d9, 0x152d4f1e, 0x0c367e5f, 0x271b2d9c, 0x3e001cdd, 0xb9980012, 0xa0833153, 0x8bae6290, 0x92b553d1, 0xddf4c516, 0xc4eff457, 0xefc2a794, 0xf6d996d5,
0xae07bce9, 0xb71c8da8, 0x9c31de6b, 0x852aef2a, 0xca6b79ed, 0xd37048ac, 0xf85d1b6f, 0xe1462a2e, 0x66de36e1, 0x7fc507a0, 0x54e85463, 0x4df36522, 0x02b2f3e5, 0x1ba9c2a4, 0x30849167, 0x299fa026,
0xe4c5aeb8, 0xfdde9ff9, 0xd6f3cc3a, 0xcfe8fd7b, 0x80a96bbc, 0x99b25afd, 0xb29f093e, 0xab84387f, 0x2c1c24b0, 0x350715f1, 0x1e2a4632, 0x07317773, 0x4870e1b4, 0x516bd0f5, 0x7a468336, 0x635db277,
0xcbfad74e, 0xd2e1e60f, 0xf9ccb5cc, 0xe0d7848d, 0xaf96124a, 0xb68d230b, 0x9da070c8, 0x84bb4189, 0x03235d46, 0x1a386c07, 0x31153fc4, 0x280e0e85, 0x674f9842, 0x7e54a903, 0x5579fac0, 0x4c62cb81,
0x8138c51f, 0x9823f45e, 0xb30ea79d, 0xaa1596dc, 0xe554001b, 0xfc4f315a, 0xd7626299, 0xce7953d8, 0x49e14f17, 0x50fa7e56, 0x7bd72d95, 0x62cc1cd4, 0x2d8d8a13, 0x3496bb52, 0x1fbbe891, 0x06a0d9d0,
0x5e7ef3ec, 0x4765c2ad, 0x6c48916e, 0x7553a02f, 0x3a1236e8, 0x230907a9, 0x0824546a, 0x113f652b, 0x96a779e4, 0x8fbc48a5, 0xa4911b66, 0xbd8a2a27, 0xf2cbbce0, 0xebd08da1, 0xc0fdde62, 0xd9e6ef23,
0x14bce1bd, 0x0da7d0fc, 0x268a833f, 0x3f91b27e, 0x70d024b9, 0x69cb15f8, 0x42e6463b, 0x5bfd777a, 0xdc656bb5, 0xc57e5af4, 0xee530937, 0xf7483876, 0xb809aeb1, 0xa1129ff0, 0x8a3fcc33, 0x9324fd72
},
{
0x00000000, 0x01c26a37, 0x0384d46e, 0x0246be59, 0x0709a8dc, 0x06cbc2eb, 0x048d7cb2, 0x054f1685, 0x0e1351b8, 0x0fd13b8f, 0x0d9785d6, 0x0c55efe1, 0x091af964, 0x08d89353, 0x0a9e2d0a, 0x0b5c473d,
0x1c26a370, 0x1de4c947, 0x1fa2771e, 0x1e601d29, 0x1b2f0bac, 0x1aed619b, 0x18abdfc2, 0x1969b5f5, 0x1235f2c8, 0x13f798ff, 0x11b126a6, 0x10734c91, 0x153c5a14, 0x14fe3023, 0x16b88e7a, 0x177ae44d,
0x384d46e0, 0x398f2cd7, 0x3bc9928e, 0x3a0bf8b9, 0x3f44ee3c, 0x3e86840b, 0x3cc03a52, 0x3d025065, 0x365e1758, 0x379c7d6f, 0x35dac336, 0x3418a901, 0x3157bf84, 0x3095d5b3, 0x32d36bea, 0x331101dd,
0x246be590, 0x25a98fa7, 0x27ef31fe, 0x262d5bc9, 0x23624d4c, 0x22a0277b, 0x20e69922, 0x2124f315, 0x2a78b428, 0x2bbade1f, 0x29fc6046, 0x283e0a71, 0x2d711cf4, 0x2cb376c3, 0x2ef5c89a, 0x2f37a2ad,
0x709a8dc0, 0x7158e7f7, 0x731e59ae, 0x72dc3399, 0x7793251c, 0x76514f2b, 0x7417f172, 0x75d59b45, 0x7e89dc78, 0x7f4bb64f, 0x7d0d0816, 0x7ccf6221, 0x798074a4, 0x78421e93, 0x7a04a0ca, 0x7bc6cafd,
0x6cbc2eb0, 0x6d7e4487, 0x6f38fade, 0x6efa90e9, 0x6bb5866c, 0x6a77ec5b, 0x68315202, 0x69f33835, 0x62af7f08, 0x636d153f, 0x612bab66, 0x60e9c151, 0x65a6d7d4, 0x6464bde3, 0x662203ba, 0x67e0698d,
0x48d7cb20, 0x4915a117, 0x4b531f4e, 0x4a917579, 0x4fde63fc, 0x4e1c09cb, 0x4c5ab792, 0x4d98dda5, 0x46c49a98, 0x4706f0af, 0x45404ef6, 0x448224c1, 0x41cd3244, 0x400f5873, 0x4249e62a, 0x438b8c1d,
0x54f16850, 0x55330267, 0x5775bc3e, 0x56b7d609, 0x53f8c08c, 0x523aaabb, 0x507c14e2, 0x51be7ed5, 0x5ae239e8, 0x5b2053df, 0x5966ed86, 0x58a487b1, 0x5deb9134, 0x5c29fb03, 0x5e6f455a, 0x5fad2f6d,
0xe1351b80, 0xe0f771b7, 0xe2b1cfee, 0xe373a5d9, 0xe63cb35c, 0xe7fed96b, 0xe5b86732, 0xe47a0d05, 0xef264a38, 0xeee4200f, 0xeca29e56, 0xed60f461, 0xe82fe2e4, 0xe9ed88d3, 0xebab368a, 0xea695cbd,
0xfd13b8f0, 0xfcd1d2c7, 0xfe976c9e, 0xff5506a9, 0xfa1a102c, 0xfbd87a1b, 0xf99ec442, 0xf85cae75, 0xf300e948, 0xf2c2837f, 0xf0843d26, 0xf1465711, 0xf4094194, 0xf5cb2ba3, 0xf78d95fa, 0xf64fffcd,
0xd9785d60, 0xd8ba3757, 0xdafc890e, 0xdb3ee339, 0xde71f5bc, 0xdfb39f8b, 0xddf521d2, 0xdc374be5, 0xd76b0cd8, 0xd6a966ef, 0xd4efd8b6, 0xd52db281, 0xd062a404, 0xd1a0ce33, 0xd3e6706a, 0xd2241a5d,
0xc55efe10, 0xc49c9427, 0xc6da2a7e, 0xc7184049, 0xc25756cc, 0xc3953cfb, 0xc1d382a2, 0xc011e895, 0xcb4dafa8, 0xca8fc59f, 0xc8c97bc6, 0xc90b11f1, 0xcc440774, 0xcd866d43, 0xcfc0d31a, 0xce02b92d,
0x91af9640, 0x906dfc77, 0x922b422e, 0x93e92819, 0x96a63e9c, 0x976454ab, 0x9522eaf2, 0x94e080c5, 0x9fbcc7f8, 0x9e7eadcf, 0x9c381396, 0x9dfa79a1, 0x98b56f24, 0x99770513, 0x9b31bb4a, 0x9af3d17d,
0x8d893530, 0x8c4b5f07, 0x8e0de15e, 0x8fcf8b69, 0x8a809dec, 0x8b42f7db, 0x89044982, 0x88c623b5, 0x839a6488, 0x82580ebf, 0x801eb0e6, 0x81dcdad1, 0x8493cc54, 0x8551a663, 0x8717183a, 0x86d5720d,
0xa9e2d0a0, 0xa820ba97, 0xaa6604ce, 0xaba46ef9, 0xaeeb787c, 0xaf29124b, 0xad6fac12, 0xacadc625, 0xa7f18118, 0xa633eb2f, 0xa4755576, 0xa5b73f41, 0xa0f829c4, 0xa13a43f3, 0xa37cfdaa, 0xa2be979d,
0xb5c473d0, 0xb40619e7, 0xb640a7be, 0xb782cd89, 0xb2cddb0c, 0xb30fb13b, 0xb1490f62, 0xb08b6555, 0xbbd72268, 0xba15485f, 0xb853f606, 0xb9919c31, 0xbcde8ab4, 0xbd1ce083, 0xbf5a5eda, 0xbe9834ed
},
{
0x00000000, 0xb8bc6765, 0xaa09c88b, 0x12b5afee, 0x8f629757, 0x37def032, 0x256b5fdc, 0x9dd738b9, 0xc5b428ef, 0x7d084f8a, 0x6fbde064, 0xd7018701, 0x4ad6bfb8, 0xf26ad8dd, 0xe0df7733, 0x58631056,
0x5019579f, 0xe8a530fa, 0xfa109f14, 0x42acf871, 0xdf7bc0c8, 0x67c7a7ad, 0x75720843, 0xcdce6f26, 0x95ad7f70, 0x2d111815, 0x3fa4b7fb, 0x8718d09e, 0x1acfe827, 0xa2738f42, 0xb0c620ac, 0x087a47c9,
0xa032af3e, 0x188ec85b, 0x0a3b67b5, 0xb28700d0, 0x2f503869, 0x97ec5f0c, 0x8559f0e2, 0x3de59787, 0x658687d1, 0xdd3ae0b4, 0xcf8f4f5a, 0x7733283f, 0xeae41086, 0x525877e3, 0x40edd80d, 0xf851bf68,
0xf02bf8a1, 0x48979fc4, 0x5a22302a, 0xe29e574f, 0x7f496ff6, 0xc7f50893, 0xd540a77d, 0x6dfcc018, 0x359fd04e, 0x8d23b72b, 0x9f9618c5, 0x272a7fa0, 0xbafd4719, 0x0241207c, 0x10f48f92, 0xa848e8f7,
0x9b14583d, 0x23a83f58, 0x311d90b6, 0x89a1f7d3, 0x1476cf6a, 0xaccaa80f, 0xbe7f07e1, 0x06c36084, 0x5ea070d2, 0xe61c17b7, 0xf4a9b859, 0x4c15df3c, 0xd1c2e785, 0x697e80e0, 0x7bcb2f0e, 0xc377486b,
0xcb0d0fa2, 0x73b168c7, 0x6104c729, 0xd9b8a04c, 0x446f98f5, 0xfcd3ff90, 0xee66507e, 0x56da371b, 0x0eb9274d, 0xb6054028, 0xa4b0efc6, 0x1c0c88a3, 0x81dbb01a, 0x3967d77f, 0x2bd27891, 0x936e1ff4,
0x3b26f703, 0x839a9066, 0x912f3f88, 0x299358ed, 0xb4446054, 0x0cf80731, 0x1e4da8df, 0xa6f1cfba, 0xfe92dfec, 0x462eb889, 0x549b1767, 0xec277002, 0x71f048bb, 0xc94c2fde, 0xdbf98030, 0x6345e755,
0x6b3fa09c, 0xd383c7f9, 0xc1366817, 0x798a0f72, 0xe45d37cb, 0x5ce150ae, 0x4e54ff40, 0xf6e89825, 0xae8b8873, 0x1637ef16, 0x048240f8, 0xbc3e279d, 0x21e91f24, 0x99557841, 0x8be0d7af, 0x335cb0ca,
0xed59b63b, 0x55e5d15e, 0x47507eb0, 0xffec19d5, 0x623b216c, 0xda874609, 0xc832e9e7, 0x708e8e82, 0x28ed9ed4, 0x9051f9b1, 0x82e4565f, 0x3a58313a, 0xa78f0983, 0x1f336ee6, 0x0d86c108, 0xb53aa66d,
0xbd40e1a4, 0x05fc86c1, 0x1749292f, 0xaff54e4a, 0x322276f3, 0x8a9e1196, 0x982bbe78, 0x2097d91d, 0x78f4c94b, 0xc048ae2e, 0xd2fd01c0, 0x6a4166a5, 0xf7965e1c, 0x4f2a3979, 0x5d9f9697, 0xe523f1f2,
0x4d6b1905, 0xf5d77e60, 0xe762d18e, 0x5fdeb6eb, 0xc2098e52, 0x7ab5e937, 0x680046d9, 0xd0bc21bc, 0x88df31ea, 0x3063568f, 0x22d6f961, 0x9a6a9e04, 0x07bda6bd, 0xbf01c1d8, 0xadb46e36, 0x15080953,
0x1d724e9a, 0xa5ce29ff, 0xb77b8611, 0x0fc7e174, 0x9210d9cd, 0x2aacbea8, 0x38191146, 0x80a57623, 0xd8c66675, 0x607a0110, 0x72cfaefe, 0xca73c99b, 0x57a4f122, 0xef189647, 0xfdad39a9, 0x45115ecc,
0x764dee06, 0xcef18963, 0xdc44268d, 0x64f841e8, 0xf92f7951, 0x41931e34, 0x5326b1da, 0xeb9ad6bf, 0xb3f9c6e9, 0x0b45a18c, 0x19f00e62, 0xa14c6907, 0x3c9b51be, 0x842736db, 0x96929935, 0x2e2efe50,
0x2654b999, 0x9ee8defc, 0x8c5d7112, 0x34e11677, 0xa9362ece, 0x118a49ab, 0x033fe645, 0xbb838120, 0xe3e09176, 0x5b5cf613, 0x49e959fd, 0xf1553e98, 0x6c820621, 0xd43e6144, 0xc68bceaa, 0x7e37a9cf,
0xd67f4138, 0x6ec3265d, 0x7c7689b3, 0xc4caeed6, 0x591dd66f, 0xe1a1b10a, 0xf3141ee4, 0x4ba87981, 0x13cb69d7, 0xab770eb2, 0xb9c2a15c, 0x017ec639, 0x9ca9fe80, 0x241599e5, 0x36a0360b, 0x8e1c516e,
0x866616a7, 0x3eda71c2, 0x2c6fde2c, 0x94d3b949, 0x090481f0, 0xb1b8e695, 0xa30d497b, 0x1bb12e1e, 0x43d23e48, 0xfb6e592d, 0xe9dbf6c3, 0x516791a6, 0xccb0a91f, 0x740cce7a, 0x66b96194, 0xde0506f1
},
{
0x00000000, 0x3d6029b0, 0x7ac05360, 0x47a07ad0, 0xf580a6c0, 0xc8e08f70, 0x8f40f5a0, 0xb220dc10, 0x30704bc1, 0x0d106271, 0x4ab018a1, 0x77d03111, 0xc5f0ed01, 0xf890c4b1, 0xbf30be61, 0x825097d1,
0x60e09782, 0x5d80be32, 0x1a20c4e2, 0x2740ed52, 0x95603142, 0xa80018f2, 0xefa06222, 0xd2c04b92, 0x5090dc43, 0x6df0f5f3, 0x2a508f23, 0x1730a693, 0xa5107a83, 0x98705333, 0xdfd029e3, 0xe2b00053,
0xc1c12f04, 0xfca106b4, 0xbb017c64, 0x866155d4, 0x344189c4, 0x0921a074, 0x4e81daa4, 0x73e1f314, 0xf1b164c5, 0xccd14d75, 0x8b7137a5, 0xb6111e15, 0x0431c205, 0x3951ebb5, 0x7ef19165, 0x4391b8d5,
0xa121b886, 0x9c419136, 0xdbe1ebe6, 0xe681c256, 0x54a11e46, 0x69c137f6, 0x2e614d26, 0x13016496, 0x9151f347, 0xac31daf7, 0xeb91a027, 0xd6f18997, 0x64d15587, 0x59b17c37, 0x1e1106e7, 0x23712f57,
0x58f35849, 0x659371f9, 0x22330b29, 0x1f532299, 0xad73fe89, 0x9013d739, 0xd7b3ade9, 0xead38459, 0x68831388, 0x55e33a38, 0x124340e8, 0x2f236958, 0x9d03b548, 0xa0639cf8, 0xe7c3e628, 0xdaa3cf98,
0x3813cfcb, 0x0573e67b, 0x42d39cab, 0x7fb3b51b, 0xcd93690b, 0xf0f340bb, 0xb7533a6b, 0x8a3313db, 0x0863840a, 0x3503adba, 0x72a3d76a, 0x4fc3feda, 0xfde322ca, 0xc0830b7a, 0x872371aa, 0xba43581a,
0x9932774d, 0xa4525efd, 0xe3f2242d, 0xde920d9d, 0x6cb2d18d, 0x51d2f83d, 0x167282ed, 0x2b12ab5d, 0xa9423c8c, 0x9422153c, 0xd3826fec, 0xeee2465c, 0x5cc29a4c, 0x61a2b3fc, 0x2602c92c, 0x1b62e09c,
0xf9d2e0cf, 0xc4b2c97f, 0x8312b3af, 0xbe729a1f, 0x0c52460f, 0x31326fbf, 0x7692156f, 0x4bf23cdf, 0xc9a2ab0e, 0xf4c282be, 0xb362f86e, 0x8e02d1de, 0x3c220dce, 0x0142247e, 0x46e25eae, 0x7b82771e,
0xb1e6b092, 0x8c869922, 0xcb26e3f2, 0xf646ca42, 0x44661652, 0x79063fe2, 0x3ea64532, 0x03c66c82, 0x8196fb53, 0xbcf6d2e3, 0xfb56a833, 0xc6368183, 0x74165d93, 0x49767423, 0x0ed60ef3, 0x33b62743,
0xd1062710, 0xec660ea0, 0xabc67470, 0x96a65dc0, 0x248681d0, 0x19e6a860, 0x5e46d2b0, 0x6326fb00, 0xe1766cd1, 0xdc164561, 0x9bb63fb1, 0xa6d61601, 0x14f6ca11, 0x2996e3a1, 0x6e369971, 0x5356b0c1,
0x70279f96, 0x4d47b626, 0x0ae7ccf6, 0x3787e546, 0x85a73956, 0xb8c710e6, 0xff676a36, 0xc2074386, 0x4057d457, 0x7d37fde7, 0x3a978737, 0x07f7ae87, 0xb5d77297, 0x88b75b27, 0xcf1721f7, 0xf2770847,
0x10c70814, 0x2da721a4, 0x6a075b74, 0x576772c4, 0xe547aed4, 0xd8278764, 0x9f87fdb4, 0xa2e7d404, 0x20b743d5, 0x1dd76a65, 0x5a7710b5, 0x67173905, 0xd537e515, 0xe857cca5, 0xaff7b675, 0x92979fc5,
0xe915e8db, 0xd475c16b, 0x93d5bbbb, 0xaeb5920b, 0x1c954e1b, 0x21f567ab, 0x66551d7b, 0x5b3534cb, 0xd965a31a, 0xe4058aaa, 0xa3a5f07a, 0x9ec5d9ca, 0x2ce505da, 0x11852c6a, 0x562556ba, 0x6b457f0a,
0x89f57f59, 0xb49556e9, 0xf3352c39, 0xce550589, 0x7c75d999, 0x4115f029, 0x06b58af9, 0x3bd5a349, 0xb9853498, 0x84e51d28, 0xc34567f8, 0xfe254e48, 0x4c059258, 0x7165bbe8, 0x36c5c138, 0x0ba5e888,
0x28d4c7df, 0x15b4ee6f, 0x521494bf, 0x6f74bd0f, 0xdd54611f, 0xe03448af, 0xa794327f, 0x9af41bcf, 0x18a48c1e, 0x25c4a5ae, 0x6264df7e, 0x5f04f6ce, 0xed242ade, 0xd044036e, 0x97e479be, 0xaa84500e,
0x4834505d, 0x755479ed, 0x32f4033d, 0x0f942a8d, 0xbdb4f69d, 0x80d4df2d, 0xc774a5fd, 0xfa148c4d, 0x78441b9c, 0x4524322c, 0x028448fc, 0x3fe4614c, 0x8dc4bd5c, 0xb0a494ec, 0xf704ee3c, 0xca64c78c
},
{
0x00000000, 0xcb5cd3a5, 0x4dc8a10b, 0x869472ae, 0x9b914216, 0x50cd91b3, 0xd659e31d, 0x1d0530b8, 0xec53826d, 0x270f51c8, 0xa19b2366, 0x6ac7f0c3, 0x77c2c07b, 0xbc9e13de, 0x3a0a6170, 0xf156b2d5,
0x03d6029b, 0xc88ad13e, 0x4e1ea390, 0x85427035, 0x9847408d, 0x531b9328, 0xd58fe186, 0x1ed33223, 0xef8580f6, 0x24d95353, 0xa24d21fd, 0x6911f258, 0x7414c2e0, 0xbf481145, 0x39dc63eb, 0xf280b04e,
0x07ac0536, 0xccf0d693, 0x4a64a43d, 0x81387798, 0x9c3d4720, 0x57619485, 0xd1f5e62b, 0x1aa9358e, 0xebff875b, 0x20a354fe, 0xa6372650, 0x6d6bf5f5, 0x706ec54d, 0xbb3216e8, 0x3da66446, 0xf6fab7e3,
0x047a07ad, 0xcf26d408, 0x49b2a6a6, 0x82ee7503, 0x9feb45bb, 0x54b7961e, 0xd223e4b0, 0x197f3715, 0xe82985c0, 0x23755665, 0xa5e124cb, 0x6ebdf76e, 0x73b8c7d6, 0xb8e41473, 0x3e7066dd, 0xf52cb578,
0x0f580a6c, 0xc404d9c9, 0x4290ab67, 0x89cc78c2, 0x94c9487a, 0x5f959bdf, 0xd901e971, 0x125d3ad4, 0xe30b8801, 0x28575ba4, 0xaec3290a, 0x659ffaaf, 0x789aca17, 0xb3c619b2, 0x35526b1c, 0xfe0eb8b9,
0x0c8e08f7, 0xc7d2db52, 0x4146a9fc, 0x8a1a7a59, 0x971f4ae1, 0x5c439944, 0xdad7ebea, 0x118b384f, 0xe0dd8a9a, 0x2b81593f, 0xad152b91, 0x6649f834, 0x7b4cc88c, 0xb0101b29, 0x36846987, 0xfdd8ba22,
0x08f40f5a, 0xc3a8dcff, 0x453cae51, 0x8e607df4, 0x93654d4c, 0x58399ee9, 0xdeadec47, 0x15f13fe2, 0xe4a78d37, 0x2ffb5e92, 0xa96f2c3c, 0x6233ff99, 0x7f36cf21, 0xb46a1c84, 0x32fe6e2a, 0xf9a2bd8f,
0x0b220dc1, 0xc07ede64, 0x46eaacca, 0x8db67f6f, 0x90b34fd7, 0x5bef9c72, 0xdd7beedc, 0x16273d79, 0xe7718fac, 0x2c2d5c09, 0xaab92ea7, 0x61e5fd02, 0x7ce0cdba, 0xb7bc1e1f, 0x31286cb1, 0xfa74bf14,
0x1eb014d8, 0xd5ecc77d, 0x5378b5d3, 0x98246676, 0x852156ce, 0x4e7d856b, 0xc8e9f7c5, 0x03b52460, 0xf2e396b5, 0x39bf4510, 0xbf2b37be, 0x7477e41b, 0x6972d4a3, 0xa22e0706, 0x24ba75a8, 0xefe6a60d,
0x1d661643, 0xd63ac5e6, 0x50aeb748, 0x9bf264ed, 0x86f75455, 0x4dab87f0, 0xcb3ff55e, 0x006326fb, 0xf135942e, 0x3a69478b, 0xbcfd3525, 0x77a1e680, 0x6aa4d638, 0xa1f8059d, 0x276c7733, 0xec30a496,
0x191c11ee, 0xd240c24b, 0x54d4b0e5, 0x9f886340, 0x828d53f8, 0x49d1805d, 0xcf45f2f3, 0x04192156, 0xf54f9383, 0x3e134026, 0xb8873288, 0x73dbe12d, 0x6eded195, 0xa5820230, 0x2316709e, 0xe84aa33b,
0x1aca1375, 0xd196c0d0, 0x5702b27e, 0x9c5e61db, 0x815b5163, 0x4a0782c6, 0xcc93f068, 0x07cf23cd, 0xf6999118, 0x3dc542bd, 0xbb513013, 0x700de3b6, 0x6d08d30e, 0xa65400ab, 0x20c07205, 0xeb9ca1a0,
0x11e81eb4, 0xdab4cd11, 0x5c20bfbf, 0x977c6c1a, 0x8a795ca2, 0x41258f07, 0xc7b1fda9, 0x0ced2e0c, 0xfdbb9cd9, 0x36e74f7c, 0xb0733dd2, 0x7b2fee77, 0x662adecf, 0xad760d6a, 0x2be27fc4, 0xe0beac61,
0x123e1c2f, 0xd962cf8a, 0x5ff6bd24, 0x94aa6e81, 0x89af5e39, 0x42f38d9c, 0xc467ff32, 0x0f3b2c97, 0xfe6d9e42, 0x35314de7, 0xb3a53f49, 0x78f9ecec, 0x65fcdc54, 0xaea00ff1, 0x28347d5f, 0xe368aefa,
0x16441b82, 0xdd18c827, 0x5b8cba89, 0x90d0692c, 0x8dd55994, 0x46898a31, 0xc01df89f, 0x0b412b3a, 0xfa1799ef, 0x314b4a4a, 0xb7df38e4, 0x7c83eb41, 0x6186dbf9, 0xaada085c, 0x2c4e7af2, 0xe712a957,
0x15921919, 0xdececabc, 0x585ab812, 0x93066bb7, 0x8e035b0f, 0x455f88aa, 0xc3cbfa04, 0x089729a1, 0xf9c19b74, 0x329d48d1, 0xb4093a7f, 0x7f55e9da, 0x6250d962, 0xa90c0ac7, 0x2f987869, 0xe4c4abcc
},
{
0x00000000, 0xa6770bb4, 0x979f1129, 0x31e81a9d, 0xf44f2413, 0x52382fa7, 0x63d0353a, 0xc5a73e8e, 0x33ef4e67, 0x959845d3, 0xa4705f4e, 0x020754fa, 0xc7a06a74, 0x61d761c0, 0x503f7b5d, 0xf64870e9,
0x67de9cce, 0xc1a9977a, 0xf0418de7, 0x56368653, 0x9391b8dd, 0x35e6b369, 0x040ea9f4, 0xa279a240, 0x5431d2a9, 0xf246d91d, 0xc3aec380, 0x65d9c834, 0xa07ef6ba, 0x0609fd0e, 0x37e1e793, 0x9196ec27,
0xcfbd399c, 0x69ca3228, 0x582228b5, 0xfe552301, 0x3bf21d8f, 0x9d85163b, 0xac6d0ca6, 0x0a1a0712, 0xfc5277fb, 0x5a257c4f, 0x6bcd66d2, 0xcdba6d66, 0x081d53e8, 0xae6a585c, 0x9f8242c1, 0x39f54975,
0xa863a552, 0x0e14aee6, 0x3ffcb47b, 0x998bbfcf, 0x5c2c8141, 0xfa5b8af5, 0xcbb39068, 0x6dc49bdc, 0x9b8ceb35, 0x3dfbe081, 0x0c13fa1c, 0xaa64f1a8, 0x6fc3cf26, 0xc9b4c492, 0xf85cde0f, 0x5e2bd5bb,
0x440b7579, 0xe27c7ecd, 0xd3946450, 0x75e36fe4, 0xb044516a, 0x16335ade, 0x27db4043, 0x81ac4bf7, 0x77e43b1e, 0xd19330aa, 0xe07b2a37, 0x460c2183, 0x83ab1f0d, 0x25dc14b9, 0x14340e24, 0xb2430590,
0x23d5e9b7, 0x85a2e203, 0xb44af89e, 0x123df32a, 0xd79acda4, 0x71edc610, 0x4005dc8d, 0xe672d739, 0x103aa7d0, 0xb64dac64, 0x87a5b6f9, 0x21d2bd4d, 0xe47583c3, 0x42028877, 0x73ea92ea, 0xd59d995e,
0x8bb64ce5, 0x2dc14751, 0x1c295dcc, 0xba5e5678, 0x7ff968f6, 0xd98e6342, 0xe86679df, 0x4e11726b, 0xb8590282, 0x1e2e0936, 0x2fc613ab, 0x89b1181f, 0x4c162691, 0xea612d25, 0xdb8937b8, 0x7dfe3c0c,
0xec68d02b, 0x4a1fdb9f, 0x7bf7c102, 0xdd80cab6, 0x1827f438, 0xbe50ff8c, 0x8fb8e511, 0x29cfeea5, 0xdf879e4c, 0x79f095f8, 0x48188f65, 0xee6f84d1, 0x2bc8ba5f, 0x8dbfb1eb, 0xbc57ab76, 0x1a20a0c2,
0x8816eaf2, 0x2e61e146, 0x1f89fbdb, 0xb9fef06f, 0x7c59cee1, 0xda2ec555, 0xebc6dfc8, 0x4db1d47c, 0xbbf9a495, 0x1d8eaf21, 0x2c66b5bc, 0x8a11be08, 0x4fb68086, 0xe9c18b32, 0xd82991af, 0x7e5e9a1b,
0xefc8763c, 0x49bf7d88, 0x78576715, 0xde206ca1, 0x1b87522f, 0xbdf0599b, 0x8c184306, 0x2a6f48b2, 0xdc27385b, 0x7a5033ef, 0x4bb82972, 0xedcf22c6, 0x28681c48, 0x8e1f17fc, 0xbff70d61, 0x198006d5,
0x47abd36e, 0xe1dcd8da, 0xd034c247, 0x7643c9f3, 0xb3e4f77d, 0x1593fcc9, 0x247be654, 0x820cede0, 0x74449d09, 0xd23396bd, 0xe3db8c20, 0x45ac8794, 0x800bb91a, 0x267cb2ae, 0x1794a833, 0xb1e3a387,
0x20754fa0, 0x86024414, 0xb7ea5e89, 0x119d553d, 0xd43a6bb3, 0x724d6007, 0x43a57a9a, 0xe5d2712e, 0x139a01c7, 0xb5ed0a73, 0x840510ee, 0x22721b5a, 0xe7d525d4, 0x41a22e60, 0x704a34fd, 0xd63d3f49,
0xcc1d9f8b, 0x6a6a943f, 0x5b828ea2, 0xfdf58516, 0x3852bb98, 0x9e25b02c, 0xafcdaab1, 0x09baa105, 0xfff2d1ec, 0x5985da58, 0x686dc0c5, 0xce1acb71, 0x0bbdf5ff, 0xadcafe4b, 0x9c22e4d6, 0x3a55ef62,
0xabc30345, 0x0db408f1, 0x3c5c126c, 0x9a2b19d8, 0x5f8c2756, 0xf9fb2ce2, 0xc813367f, 0x6e643dcb, 0x982c4d22, 0x3e5b4696, 0x0fb35c0b, 0xa9c457bf, 0x6c636931, 0xca146285, 0xfbfc7818, 0x5d8b73ac,
0x03a0a617, 0xa5d7ada3, 0x943fb73e, 0x3248bc8a, 0xf7ef8204, 0x519889b0, 0x6070932d, 0xc6079899, 0x304fe870, 0x9638e3c4, 0xa7d0f959, 0x01a7f2ed, 0xc400cc63, 0x6277c7d7, 0x539fdd4a, 0xf5e8d6fe,
0x647e3ad9, 0xc209316d, 0xf3e12bf0, 0x55962044, 0x90311eca, 0x3646157e, 0x07ae0fe3, 0xa1d90457, 0x579174be, 0xf1e67f0a, 0xc00e6597, 0x66796e23, 0xa3de50ad, 0x05a95b19, 0x34414184, 0x92364a30
},
{
0x00000000, 0xccaa009e, 0x4225077d, 0x8e8f07e3, 0x844a0efa, 0x48e00e64, 0xc66f0987, 0x0ac50919, 0xd3e51bb5, 0x1f4f1b2b, 0x91c01cc8, 0x5d6a1c56, 0x57af154f, 0x9b0515d1, 0x158a1232, 0xd92012ac,
0x7cbb312b, 0xb01131b5, 0x3e9e3656, 0xf23436c8, 0xf8f13fd1, 0x345b3f4f, 0xbad438ac, 0x767e3832, 0xaf5e2a9e, 0x63f42a00, 0xed7b2de3, 0x21d12d7d, 0x2b142464, 0xe7be24fa, 0x69312319, 0xa59b2387,
0xf9766256, 0x35dc62c8, 0xbb53652b, 0x77f965b5, 0x7d3c6cac, 0xb1966c32, 0x3f196bd1, 0xf3b36b4f, 0x2a9379e3, 0xe639797d, 0x68b67e9e, 0xa41c7e00, 0xaed97719, 0x62737787, 0xecfc7064, 0x205670fa,
0x85cd537d, 0x496753e3, 0xc7e85400, 0x0b42549e, 0x01875d87, 0xcd2d5d19, 0x43a25afa, 0x8f085a64, 0x562848c8, 0x9a824856, 0x140d4fb5, 0xd8a74f2b, 0xd2624632, 0x1ec846ac, 0x9047414f, 0x5ced41d1,
0x299dc2ed, 0xe537c273, 0x6bb8c590, 0xa712c50e, 0xadd7cc17, 0x617dcc89, 0xeff2cb6a, 0x2358cbf4, 0xfa78d958, 0x36d2d9c6, 0xb85dde25, 0x74f7debb, 0x7e32d7a2, 0xb298d73c, 0x3c17d0df, 0xf0bdd041,
0x5526f3c6, 0x998cf358, 0x1703f4bb, 0xdba9f425, 0xd16cfd3c, 0x1dc6fda2, 0x9349fa41, 0x5fe3fadf, 0x86c3e873, 0x4a69e8ed, 0xc4e6ef0e, 0x084cef90, 0x0289e689, 0xce23e617, 0x40ace1f4, 0x8c06e16a,
0xd0eba0bb, 0x1c41a025, 0x92cea7c6, 0x5e64a758, 0x54a1ae41, 0x980baedf, 0x1684a93c, 0xda2ea9a2, 0x030ebb0e, 0xcfa4bb90, 0x412bbc73, 0x8d81bced, 0x8744b5f4, 0x4beeb56a, 0xc561b289, 0x09cbb217,
0xac509190, 0x60fa910e, 0xee7596ed, 0x22df9673, 0x281a9f6a, 0xe4b09ff4, 0x6a3f9817, 0xa6959889, 0x7fb58a25, 0xb31f8abb, 0x3d908d58, 0xf13a8dc6, 0xfbff84df, 0x37558441, 0xb9da83a2, 0x7570833c,
0x533b85da, 0x9f918544, 0x111e82a7, 0xddb48239, 0xd7718b20, 0x1bdb8bbe, 0x95548c5d, 0x59fe8cc3, 0x80de9e6f, 0x4c749ef1, 0xc2fb9912, 0x0e51998c, 0x04949095, 0xc83e900b, 0x46b197e8, 0x8a1b9776,
0x2f80b4f1, 0xe32ab46f, 0x6da5b38c, 0xa10fb312, 0xabcaba0b, 0x6760ba95, 0xe9efbd76, 0x2545bde8, 0xfc65af44, 0x30cfafda, 0xbe40a839, 0x72eaa8a7, 0x782fa1be, 0xb485a120, 0x3a0aa6c3, 0xf6a0a65d,
0xaa4de78c, 0x66e7e712, 0xe868e0f1, 0x24c2e06f, 0x2e07e976, 0xe2ade9e8, 0x6c22ee0b, 0xa088ee95, 0x79a8fc39, 0xb502fca7, 0x3b8dfb44, 0xf727fbda, 0xfde2f2c3, 0x3148f25d, 0xbfc7f5be, 0x736df520,
0xd6f6d6a7, 0x1a5cd639, 0x94d3d1da, 0x5879d144, 0x52bcd85d, 0x9e16d8c3, 0x1099df20, 0xdc33dfbe, 0x0513cd12, 0xc9b9cd8c, 0x4736ca6f, 0x8b9ccaf1, 0x8159c3e8, 0x4df3c376, 0xc37cc495, 0x0fd6c40b,
0x7aa64737, 0xb60c47a9, 0x3883404a, 0xf42940d4, 0xfeec49cd, 0x32464953, 0xbcc94eb0, 0x70634e2e, 0xa9435c82, 0x65e95c1c, 0xeb665bff, 0x27cc5b61, 0x2d095278, 0xe1a352e6, 0x6f2c5505, 0xa386559b,
0x061d761c, 0xcab77682, 0x44387161, 0x889271ff, 0x825778e6, 0x4efd7878, 0xc0727f9b, 0x0cd87f05, 0xd5f86da9, 0x19526d37, 0x97dd6ad4, 0x5b776a4a, 0x51b26353, 0x9d1863cd, 0x1397642e, 0xdf3d64b0,
0x83d02561, 0x4f7a25ff, 0xc1f5221c, 0x0d5f2282, 0x079a2b9b, 0xcb302b05, 0x45bf2ce6, 0x89152c78, 0x50353ed4, 0x9c9f3e4a, 0x121039a9, 0xdeba3937, 0xd47f302e, 0x18d530b0, 0x965a3753, 0x5af037cd,
0xff6b144a, 0x33c114d4, 0xbd4e1337, 0x71e413a9, 0x7b211ab0, 0xb78b1a2e, 0x39041dcd, 0xf5ae1d53, 0x2c8e0fff, 0xe0240f61, 0x6eab0882, 0xa201081c, 0xa8c40105, 0x646e019b, 0xeae10678, 0x264b06e6
}
};
}
}

File diff suppressed because it is too large Load Diff

View File

@ -0,0 +1,217 @@
using Newtonsoft.Json;
using System.IO;
using System.Linq;
using UAssetAPI.JSON;
using UAssetAPI.UnrealTypes;
namespace UAssetAPI
{
/// <summary>
/// Represents an interface that a UClass (<see cref="ClassExport"/>) implements.
/// </summary>
public struct SerializedInterfaceReference
{
public int Class;
public int PointerOffset;
public bool bImplementedByK2;
public SerializedInterfaceReference(int @class, int pointerOffset, bool bImplementedByK2)
{
Class = @class;
PointerOffset = pointerOffset;
this.bImplementedByK2 = bImplementedByK2;
}
}
/// <summary>
/// Represents an object class.
/// </summary>
public class ClassExport : StructExport
{
/// <summary>
/// Map of all functions by name contained in this class
/// </summary>
[JsonConverter(typeof(TMapJsonConverter<FName, FPackageIndex>))]
public TMap<FName, FPackageIndex> FuncMap;
/// <summary>
/// Class flags; See <see cref="EClassFlags"/> for more information
/// </summary>
public EClassFlags ClassFlags;
/// <summary>
/// The required type for the outer of instances of this class
/// </summary>
public FPackageIndex ClassWithin;
/// <summary>
/// Which Name.ini file to load Config variables out of
/// </summary>
public FName ClassConfigName;
/// <summary>
/// The list of interfaces which this class implements, along with the pointer property that is located at the offset of the interface's vtable.
/// If the interface class isn't native, the property will be empty.
/// </summary>
public SerializedInterfaceReference[] Interfaces;
/// <summary>
/// This is the blueprint that caused the generation of this class, or null if it is a native compiled-in class
/// </summary>
public FPackageIndex ClassGeneratedBy;
/// <summary>
/// Does this class use deprecated script order?
/// </summary>
public bool bDeprecatedForceScriptOrder;
/// <summary>
/// Used to check if the class was cooked or not
/// </summary>
public bool bCooked;
/// <summary>
/// The class default object; used for delta serialization and object initialization
/// </summary>
public FPackageIndex ClassDefaultObject;
public ClassExport(Export super) : base(super)
{
}
public ClassExport(UAsset asset, byte[] extras) : base(asset, extras)
{
}
public ClassExport()
{
}
public override void Read(AssetBinaryReader reader, int nextStarting)
{
base.Read(reader, nextStarting);
int numFuncIndexEntries = reader.ReadInt32();
FuncMap = new TMap<FName, FPackageIndex>();
for (int i = 0; i < numFuncIndexEntries; i++)
{
FName functionName = reader.ReadFName();
FPackageIndex functionExport = FPackageIndex.FromRawIndex(reader.ReadInt32());
FuncMap.Add(functionName, functionExport);
}
ClassFlags = (EClassFlags)reader.ReadUInt32();
if (Asset.EngineVersion < UE4Version.VER_UE4_CLASS_NOTPLACEABLE_ADDED)
{
ClassFlags ^= EClassFlags.CLASS_NotPlaceable;
}
ClassWithin = new FPackageIndex(reader.ReadInt32());
ClassConfigName = reader.ReadFName();
Asset.AddNameReference(ClassConfigName.Value);
int numInterfaces = 0;
long interfacesStart = 0;
if (Asset.EngineVersion < UE4Version.VER_UE4_UCLASS_SERIALIZE_INTERFACES_AFTER_LINKING)
{
interfacesStart = reader.BaseStream.Position;
numInterfaces = reader.ReadInt32();
reader.BaseStream.Seek(interfacesStart + sizeof(int) + numInterfaces * (sizeof(int) * 3), SeekOrigin.Begin);
}
// Linking procedure here; I don't think anything is really serialized during this
ClassGeneratedBy = new FPackageIndex(reader.ReadInt32());
long currentOffset = reader.BaseStream.Position;
if (Asset.EngineVersion < UE4Version.VER_UE4_UCLASS_SERIALIZE_INTERFACES_AFTER_LINKING)
{
reader.BaseStream.Seek(interfacesStart, SeekOrigin.Begin);
}
numInterfaces = reader.ReadInt32();
Interfaces = new SerializedInterfaceReference[numInterfaces];
for (int i = 0; i < numInterfaces; i++)
{
Interfaces[i] = new SerializedInterfaceReference(reader.ReadInt32(), reader.ReadInt32(), reader.ReadInt32() == 1);
}
if (Asset.EngineVersion < UE4Version.VER_UE4_UCLASS_SERIALIZE_INTERFACES_AFTER_LINKING)
{
reader.BaseStream.Seek(currentOffset, SeekOrigin.Begin);
}
bDeprecatedForceScriptOrder = reader.ReadInt32() == 1;
reader.ReadInt64(); // None
if (Asset.EngineVersion >= UE4Version.VER_UE4_ADD_COOKED_TO_UCLASS)
{
bCooked = reader.ReadInt32() == 1;
}
ClassDefaultObject = new FPackageIndex(reader.ReadInt32());
// CDO serialization usually comes after this export has finished serializing
}
public override void Write(AssetBinaryWriter writer)
{
base.Write(writer);
writer.Write(FuncMap.Count);
for (int i = 0; i < FuncMap.Count; i++)
{
writer.Write(FuncMap.Keys.ElementAt(i));
writer.Write(FuncMap[i].Index);
}
EClassFlags serializingClassFlags = ClassFlags;
if (Asset.EngineVersion < UE4Version.VER_UE4_CLASS_NOTPLACEABLE_ADDED)
{
serializingClassFlags ^= EClassFlags.CLASS_NotPlaceable;
}
writer.Write((uint)serializingClassFlags);
writer.Write(ClassWithin.Index);
writer.Write(ClassConfigName);
if (Asset.EngineVersion < UE4Version.VER_UE4_UCLASS_SERIALIZE_INTERFACES_AFTER_LINKING)
{
SerializeInterfaces(writer);
}
// Linking procedure here; I don't think anything is really serialized during this
writer.Write(ClassGeneratedBy.Index);
if (Asset.EngineVersion >= UE4Version.VER_UE4_UCLASS_SERIALIZE_INTERFACES_AFTER_LINKING)
{
SerializeInterfaces(writer);
}
writer.Write(bDeprecatedForceScriptOrder ? 1 : 0);
writer.Write(new FName(writer.Asset, "None"));
if (Asset.EngineVersion >= UE4Version.VER_UE4_ADD_COOKED_TO_UCLASS)
{
writer.Write(bCooked ? 1 : 0);
}
writer.Write(ClassDefaultObject.Index);
}
private void SerializeInterfaces(BinaryWriter writer)
{
writer.Write(Interfaces.Length);
for (int i = 0; i < Interfaces.Length; i++)
{
writer.Write(Interfaces[i].Class);
writer.Write(Interfaces[i].PointerOffset);
writer.Write(Interfaces[i].bImplementedByK2 ? 1 : 0);
}
}
}
}

View File

@ -0,0 +1,108 @@
using System;
using System.Collections.Generic;
using UAssetAPI.PropertyTypes.Objects;
using UAssetAPI.PropertyTypes.Structs;
using UAssetAPI.UnrealTypes;
namespace UAssetAPI
{
/// <summary>
/// Imported spreadsheet table.
/// </summary>
public class UDataTable
{
public List<StructPropertyData> Data;
public UDataTable()
{
Data = new List<StructPropertyData>();
}
public UDataTable(List<StructPropertyData> data)
{
Data = data;
}
}
/// <summary>
/// Export for an imported spreadsheet table. See <see cref="UDataTable"/>.
/// </summary>
public class DataTableExport : NormalExport
{
public UDataTable Table;
public DataTableExport(Export super) : base(super)
{
}
public DataTableExport(UDataTable data, UAsset asset, byte[] extras) : base(asset, extras)
{
Table = data;
}
public DataTableExport()
{
}
public override void Read(AssetBinaryReader reader, int nextStarting)
{
base.Read(reader, nextStarting);
// Find an ObjectProperty named RowStruct
FName decidedStructType = FName.DefineDummy(reader.Asset, "Generic");
foreach (PropertyData thisData in Data)
{
if (thisData.Name.Value.Value == "RowStruct" && thisData is ObjectPropertyData thisObjData && thisObjData.Value.IsImport())
{
decidedStructType = thisObjData.ToImport(reader.Asset).ObjectName;
break;
}
}
reader.ReadInt32();
Table = new UDataTable();
int numEntries = reader.ReadInt32();
for (int i = 0; i < numEntries; i++)
{
FName rowName = reader.ReadFName();
var nextStruct = new StructPropertyData(rowName)
{
StructType = decidedStructType
};
nextStruct.Read(reader, false, 1);
Table.Data.Add(nextStruct);
}
}
public override void Write(AssetBinaryWriter writer)
{
base.Write(writer);
// Find an ObjectProperty named RowStruct
FName decidedStructType = FName.DefineDummy(writer.Asset, "Generic");
foreach (PropertyData thisData in Data)
{
if (thisData.Name.Value.Value == "RowStruct" && thisData is ObjectPropertyData thisObjData)
{
decidedStructType = thisObjData.ToImport(writer.Asset).ObjectName;
break;
}
}
writer.Write((int)0);
writer.Write(Table.Data.Count);
for (int i = 0; i < Table.Data.Count; i++)
{
var thisDataTableEntry = Table.Data[i];
thisDataTableEntry.StructType = decidedStructType;
writer.Write(thisDataTableEntry.Name);
thisDataTableEntry.Write(writer, false);
}
}
}
}

View File

@ -0,0 +1,155 @@
using System;
using System.Collections.Generic;
using System.IO;
using UAssetAPI.UnrealTypes;
namespace UAssetAPI
{
/// <summary>How this enum is declared in C++. Affects the internal naming of enum values.</summary>
public enum ECppForm
{
Regular,
Namespaced,
EnumClass
}
/// <summary>
/// Reflection data for an enumeration.
/// </summary>
public class UEnum
{
/// <summary>List of pairs of all enum names and values.</summary>
public List<Tuple<FName, long>> Names;
/// <summary>How the enum was originally defined.</summary>
public ECppForm CppForm = ECppForm.Regular;
public void Read(AssetBinaryReader reader, UAsset asset)
{
if (asset.EngineVersion < UE4Version.VER_UE4_TIGHTLY_PACKED_ENUMS)
{
int numEntries = reader.ReadInt32();
for (int i = 0; i < numEntries; i++)
{
FName tempName = reader.ReadFName();
Names.Add(new Tuple<FName, long>(tempName, i));
}
}
else if (asset.GetCustomVersion<FCoreObjectVersion>() < FCoreObjectVersion.EnumProperties)
{
int numEntries = reader.ReadInt32();
for (int i = 0; i < numEntries; i++)
{
FName tempName = reader.ReadFName();
byte tempVal = reader.ReadByte();
Names.Add(new Tuple<FName, long>(tempName, tempVal));
}
}
else
{
int numEntries = reader.ReadInt32();
for (int i = 0; i < numEntries; i++)
{
FName tempName = reader.ReadFName();
long tempVal = reader.ReadInt64();
Names.Add(new Tuple<FName, long>(tempName, tempVal));
}
}
if (asset.EngineVersion < UE4Version.VER_UE4_ENUM_CLASS_SUPPORT)
{
bool bIsNamespace = reader.ReadInt32() == 1;
CppForm = bIsNamespace ? ECppForm.Namespaced : ECppForm.Regular;
}
else
{
CppForm = (ECppForm)reader.ReadByte();
}
}
public void Write(AssetBinaryWriter writer, UAsset asset)
{
writer.Write(Names.Count);
if (asset.EngineVersion < UE4Version.VER_UE4_TIGHTLY_PACKED_ENUMS)
{
var namesForSerialization = new Dictionary<long, FName>();
for (int i = 0; i < Names.Count; i++) namesForSerialization.Add(Names[i].Item2, Names[i].Item1);
for (int i = 0; i < Names.Count; i++)
{
if (namesForSerialization.ContainsKey(i)) writer.Write(namesForSerialization[i]);
}
}
else if (asset.GetCustomVersion<FCoreObjectVersion>() < FCoreObjectVersion.EnumProperties)
{
for (int i = 0; i < Names.Count; i++)
{
writer.Write(Names[i].Item1);
writer.Write((byte)Names[i].Item2);
}
}
else
{
for (int i = 0; i < Names.Count; i++)
{
writer.Write(Names[i].Item1);
writer.Write(Names[i].Item2);
}
}
if (asset.EngineVersion < UE4Version.VER_UE4_ENUM_CLASS_SUPPORT)
{
writer.Write(CppForm == ECppForm.Namespaced ? 1 : 0);
}
else
{
writer.Write((byte)CppForm);
}
}
public UEnum()
{
Names = new List<Tuple<FName, long>>();
}
}
/// <summary>
/// Export data for an enumeration. See <see cref="UEnum"/>.
/// </summary>
public class EnumExport : NormalExport
{
/// <summary>The enum that is stored in this export.</summary>
public UEnum Enum;
public EnumExport(Export super) : base(super)
{
}
public EnumExport(UAsset asset, byte[] extras) : base(asset, extras)
{
}
public EnumExport()
{
}
public override void Read(AssetBinaryReader reader, int nextStarting)
{
base.Read(reader, nextStarting);
reader.ReadInt32();
Enum = new UEnum();
Enum.Read(reader, Asset);
}
public override void Write(AssetBinaryWriter writer)
{
base.Write(writer);
writer.Write((int)0);
Enum.Write(writer, Asset);
}
}
}

View File

@ -0,0 +1,199 @@
using Newtonsoft.Json;
using System;
using System.Collections.Generic;
using System.IO;
using System.Linq;
using System.Reflection;
using System.Text;
using UAssetAPI.UnrealTypes;
namespace UAssetAPI
{
[AttributeUsage(AttributeTargets.Field)]
internal class DisplayIndexOrderAttribute : Attribute
{
internal int DisplayingIndex = 0;
internal DisplayIndexOrderAttribute(int displayingIndex)
{
DisplayingIndex = displayingIndex;
}
}
/// <summary>
/// UObject resource type for objects that are contained within this package and can be referenced by other packages.
/// </summary>
[JsonObject(MemberSerialization.OptOut)]
public class Export : FObjectResource, ICloneable
{
///<summary>Location of this export's class (import/other export). 0 = this export is a UClass</summary>
[DisplayIndexOrder(2)]
public FPackageIndex ClassIndex;
///<summary>Location of this export's parent class (import/other export). 0 = this export is not derived from UStruct</summary>
[DisplayIndexOrder(3)]
public FPackageIndex SuperIndex;
///<summary>Location of this export's template (import/other export). 0 = there is some problem</summary>
[DisplayIndexOrder(4)]
public FPackageIndex TemplateIndex;
///<summary>The object flags for the UObject represented by this resource. Only flags that match the RF_Load combination mask will be loaded from disk and applied to the UObject.</summary>
[DisplayIndexOrder(5)]
public EObjectFlags ObjectFlags;
///<summary>The number of bytes to serialize when saving/loading this export's UObject.</summary>
[DisplayIndexOrder(6)]
public long SerialSize;
///<summary>The location (into the FLinker's underlying file reader archive) of the beginning of the data for this export's UObject. Used for verification only.</summary>
[DisplayIndexOrder(7)]
public long SerialOffset;
///<summary>Was this export forced into the export table via OBJECTMARK_ForceTagExp?</summary>
[DisplayIndexOrder(8)]
public bool bForcedExport;
///<summary>Should this export not be loaded on clients?</summary>
[DisplayIndexOrder(9)]
public bool bNotForClient;
///<summary>Should this export not be loaded on servers?</summary>
[DisplayIndexOrder(10)]
public bool bNotForServer;
///<summary>If this object is a top level package (which must have been forced into the export table via OBJECTMARK_ForceTagExp), this is the GUID for the original package file. Deprecated</summary>
[DisplayIndexOrder(11)]
public Guid PackageGuid;
///<summary>If this export is a top-level package, this is the flags for the original package</summary>
[DisplayIndexOrder(12)]
public EPackageFlags PackageFlags;
///<summary>Should this export be always loaded in editor game?</summary>
[DisplayIndexOrder(13)]
public bool bNotAlwaysLoadedForEditorGame;
///<summary>Is this export an asset?</summary>
[DisplayIndexOrder(14)]
public bool bIsAsset;
/// <summary>
/// The export table must serialize as a fixed size, this is used to index into a long list, which is later loaded into the array. -1 means dependencies are not present. These are contiguous blocks, so CreateBeforeSerializationDependencies starts at FirstExportDependency + SerializationBeforeSerializationDependencies.
/// </summary>
internal int FirstExportDependencyOffset;
internal int SerializationBeforeSerializationDependenciesSize;
internal int CreateBeforeSerializationDependenciesSize;
internal int SerializationBeforeCreateDependenciesSize;
internal int CreateBeforeCreateDependenciesSize;
[DisplayIndexOrder(15)]
public List<FPackageIndex> SerializationBeforeSerializationDependencies = new List<FPackageIndex>();
[DisplayIndexOrder(16)]
public List<FPackageIndex> CreateBeforeSerializationDependencies = new List<FPackageIndex>();
[DisplayIndexOrder(17)]
public List<FPackageIndex> SerializationBeforeCreateDependencies = new List<FPackageIndex>();
[DisplayIndexOrder(18)]
public List<FPackageIndex> CreateBeforeCreateDependencies = new List<FPackageIndex>();
/// <summary>
/// Miscellaneous, unparsed export data, stored as a byte array.
/// </summary>
public byte[] Extras;
/// <summary>
/// The asset that this export is parsed with.
/// </summary>
[JsonIgnore]
public UAsset Asset;
public Export(UAsset asset, byte[] extras)
{
Asset = asset;
Extras = extras;
}
public Export()
{
}
public virtual void Read(AssetBinaryReader reader, int nextStarting = 0)
{
}
public virtual void Write(AssetBinaryWriter writer)
{
}
private static FieldInfo[] _allFields = null;
private static void InitAllFields()
{
if (_allFields != null) return;
_allFields = UAPUtils.GetOrderedFields<Export>();
}
public static FieldInfo[] GetAllObjectExportFields()
{
InitAllFields();
return _allFields;
}
public static string[] GetAllFieldNames()
{
InitAllFields();
string[] allFieldNames = new string[_allFields.Length];
for (int i = 0; i < _allFields.Length; i++)
{
allFieldNames[i] = _allFields[i].Name;
}
return allFieldNames;
}
public FName GetExportClassType()
{
return this.ClassIndex.IsImport() ? this.ClassIndex.ToImport(Asset).ObjectName : FName.DefineDummy(Asset, this.ClassIndex.Index.ToString());
}
public override string ToString()
{
InitAllFields();
var sb = new StringBuilder();
foreach (var info in _allFields)
{
var value = info.GetValue(this) ?? "(null)";
sb.AppendLine(info.Name + ": " + value.ToString());
}
return sb.ToString();
}
public object Clone()
{
var res = (Export)MemberwiseClone();
res.SerializationBeforeSerializationDependencies = this.SerializationBeforeSerializationDependencies.ToList();
res.CreateBeforeSerializationDependencies = this.CreateBeforeSerializationDependencies.ToList();
res.SerializationBeforeCreateDependencies = this.SerializationBeforeCreateDependencies.ToList();
res.CreateBeforeCreateDependencies = this.CreateBeforeCreateDependencies.ToList();
res.Extras = (byte[])this.Extras.Clone();
res.PackageGuid = new Guid(this.PackageGuid.ToByteArray());
return res;
}
/// <summary>
/// Creates a child export instance with the same export details as the current export.
/// </summary>
/// <typeparam name="T">The type of child export to create.</typeparam>
/// <returns>An instance of the child export type provided with the export details copied over.</returns>
public T ConvertToChildExport<T>() where T : Export, new()
{
InitAllFields();
Export res = new T();
res.SerializationBeforeSerializationDependencies = this.SerializationBeforeSerializationDependencies.ToList();
res.CreateBeforeSerializationDependencies = this.CreateBeforeSerializationDependencies.ToList();
res.SerializationBeforeCreateDependencies = this.SerializationBeforeCreateDependencies.ToList();
res.CreateBeforeCreateDependencies = this.CreateBeforeCreateDependencies.ToList();
res.Asset = this.Asset;
res.Extras = this.Extras;
res.ObjectName = this.ObjectName;
res.OuterIndex = this.OuterIndex;
foreach (var info in _allFields)
{
info.SetValue(res, info.GetValue(this));
}
return (T)res;
}
}
}

View File

@ -0,0 +1,46 @@
using System.Linq;
using UAssetAPI.FieldTypes;
using UAssetAPI.UnrealTypes;
namespace UAssetAPI
{
/// <summary>
/// Export data for a <see cref="UField"/>.
/// </summary>
public class FieldExport : NormalExport
{
public UField Field;
public FieldExport(Export super) : base(super)
{
}
public FieldExport(UAsset asset, byte[] extras) : base(asset, extras)
{
}
public FieldExport()
{
}
public override void Read(AssetBinaryReader reader, int nextStarting)
{
base.Read(reader, nextStarting);
reader.ReadInt32();
Field = new UField();
Field.Read(reader);
}
public override void Write(AssetBinaryWriter writer)
{
base.Write(writer);
writer.Write((int)0);
Field.Write(writer);
}
}
}

View File

@ -0,0 +1,42 @@
using System.IO;
using UAssetAPI.UnrealTypes;
namespace UAssetAPI
{
/// <summary>
/// Export data for a blueprint function.
/// </summary>
public class FunctionExport : StructExport
{
public EFunctionFlags FunctionFlags;
public FunctionExport(Export super) : base(super)
{
Asset = super.Asset;
Extras = super.Extras;
}
public FunctionExport(UAsset asset, byte[] extras) : base(asset, extras)
{
}
public FunctionExport()
{
}
public override void Read(AssetBinaryReader reader, int nextStarting)
{
base.Read(reader, nextStarting);
FunctionFlags = (EFunctionFlags)reader.ReadUInt32();
// TODO
}
public override void Write(AssetBinaryWriter writer)
{
base.Write(writer);
writer.Write((uint)FunctionFlags);
// TODO
}
}
}

View File

@ -0,0 +1,101 @@
using System.Collections.Generic;
using System.IO;
using UAssetAPI.UnrealTypes;
namespace UAssetAPI
{
public class NamespacedString
{
public FString Namespace;
public FString Value;
public NamespacedString(FString Namespace, FString Value)
{
this.Namespace = Namespace;
this.Value = Value;
}
public NamespacedString()
{
}
}
public class LevelExport : NormalExport
{
public List<int> IndexData;
public NamespacedString LevelType;
public ulong FlagsProbably;
public List<int> MiscCategoryData;
public LevelExport(Export super) : base(super)
{
}
public LevelExport(UAsset asset, byte[] extras) : base(asset, extras)
{
}
public LevelExport()
{
}
public override void Read(AssetBinaryReader reader, int nextStarting)
{
base.Read(reader, nextStarting);
reader.ReadInt32();
int numIndexEntries = reader.ReadInt32();
IndexData = new List<int>();
for (int i = 0; i < numIndexEntries; i++)
{
IndexData.Add(reader.ReadInt32());
}
var nms = reader.ReadFString();
reader.ReadInt32(); // null
var val = reader.ReadFString();
LevelType = new NamespacedString(nms, val);
reader.ReadInt64(); // null
FlagsProbably = reader.ReadUInt64();
MiscCategoryData = new List<int>();
while (reader.BaseStream.Position < nextStarting - 1)
{
MiscCategoryData.Add(reader.ReadInt32());
}
reader.ReadByte();
}
public override void Write(AssetBinaryWriter writer)
{
base.Write(writer);
writer.Write((int)0);
writer.Write(IndexData.Count);
for (int i = 0; i < IndexData.Count; i++)
{
writer.Write(IndexData[i]);
}
writer.Write(LevelType.Namespace);
writer.Write((int)0);
writer.Write(LevelType.Value);
writer.Write((long)0);
writer.Write(FlagsProbably);
for (int i = 0; i < MiscCategoryData.Count; i++)
{
writer.Write(MiscCategoryData[i]);
}
writer.Write((byte)0);
}
}
}

View File

@ -0,0 +1,116 @@
using System.Collections.Generic;
using UAssetAPI.PropertyTypes.Objects;
using UAssetAPI.UnrealTypes;
namespace UAssetAPI
{
/// <summary>
/// A regular export, with no special serialization. Serialized as a None-terminated property list.
/// </summary>
public class NormalExport : Export
{
public List<PropertyData> Data;
/// <summary>
/// Gets or sets the value associated with the specified key. This operation loops linearly, so it may not be suitable for high-performance environments.
/// </summary>
/// <param name="key">The key associated with the value to get or set.</param>
public PropertyData this[FName key]
{
get
{
for (int i = 0; i < Data.Count; i++)
{
if (Data[i].Name == key) return Data[i];
}
return null;
}
set
{
for (int i = 0; i < Data.Count; i++)
{
if (Data[i].Name == key)
{
Data[i] = value;
Data[i].Name = key;
break;
}
}
}
}
/// <summary>
/// Gets or sets the value associated with the specified key. This operation loops linearly, so it may not be suitable for high-performance environments.
/// </summary>
/// <param name="key">The key associated with the value to get or set.</param>
public PropertyData this[string key]
{
get
{
return this[FName.FromString(Asset, key)];
}
set
{
this[FName.FromString(Asset, key)] = value;
}
}
/// <summary>
/// Gets or sets the value at the specified index.
/// </summary>
/// <param name="index">The index of the value to get or set.</param>
public PropertyData this[int index]
{
get
{
return Data[index];
}
set
{
Data[index] = value;
}
}
public NormalExport(Export super)
{
Asset = super.Asset;
Extras = super.Extras;
}
public NormalExport(UAsset asset, byte[] extras) : base(asset, extras)
{
}
public NormalExport(List<PropertyData> data, UAsset asset, byte[] extras) : base(asset, extras)
{
Data = data;
}
public NormalExport()
{
}
public override void Read(AssetBinaryReader reader, int nextStarting = 0)
{
Data = new List<PropertyData>();
PropertyData bit;
while ((bit = MainSerializer.Read(reader, true)) != null)
{
Data.Add(bit);
}
}
public override void Write(AssetBinaryWriter writer)
{
for (int j = 0; j < Data.Count; j++)
{
PropertyData current = Data[j];
MainSerializer.Write(current, writer, true);
}
writer.Write(new FName(writer.Asset, "None"));
}
}
}

View File

@ -0,0 +1,46 @@
using System.Linq;
using UAssetAPI.FieldTypes;
using UAssetAPI.UnrealTypes;
namespace UAssetAPI
{
/// <summary>
/// Export data for a <see cref="UProperty"/>.
/// </summary>
public class PropertyExport : NormalExport
{
public UProperty Property;
public PropertyExport(Export super) : base(super)
{
}
public PropertyExport(UAsset asset, byte[] extras) : base(asset, extras)
{
}
public PropertyExport()
{
}
public override void Read(AssetBinaryReader reader, int nextStarting)
{
base.Read(reader, nextStarting);
reader.ReadInt32();
FName exportClassType = this.GetExportClassType();
Property = MainSerializer.ReadUProperty(reader, exportClassType);
}
public override void Write(AssetBinaryWriter writer)
{
base.Write(writer);
writer.Write((int)0);
MainSerializer.WriteUProperty(Property, writer);
}
}
}

View File

@ -0,0 +1,34 @@
using System.IO;
using UAssetAPI.UnrealTypes;
namespace UAssetAPI
{
/// <summary>
/// An export that could not be properly parsed by UAssetAPI, and is instead represented as an array of bytes as a fallback.
/// </summary>
public class RawExport : Export
{
public byte[] Data;
public RawExport(Export super)
{
Asset = super.Asset;
Extras = super.Extras;
}
public RawExport(byte[] data, UAsset asset, byte[] extras) : base(asset, extras)
{
Data = data;
}
public RawExport()
{
}
public override void Write(AssetBinaryWriter writer)
{
writer.Write(Data);
}
}
}

View File

@ -0,0 +1,77 @@
using Newtonsoft.Json;
using System.Linq;
using UAssetAPI.UnrealTypes;
namespace UAssetAPI
{
/// <summary>
/// A string table. Holds Key->SourceString pairs of text.
/// </summary>
public class FStringTable : TMap<FString, FString>
{
[JsonProperty]
public FString TableNamespace;
public FStringTable(FString tableNamespace) : base()
{
TableNamespace = tableNamespace;
}
public FStringTable() : base()
{
}
}
/// <summary>
/// Export data for a string table. See <see cref="FStringTable"/>.
/// </summary>
public class StringTableExport : NormalExport
{
[JsonProperty]
public FStringTable Table;
public StringTableExport(Export super) : base(super)
{
}
public StringTableExport(FStringTable data, UAsset asset, byte[] extras) : base(asset, extras)
{
Table = data;
}
public StringTableExport()
{
}
public override void Read(AssetBinaryReader reader, int nextStarting)
{
base.Read(reader, nextStarting);
reader.ReadInt32();
Table = new FStringTable(reader.ReadFString());
int numEntries = reader.ReadInt32();
for (int i = 0; i < numEntries; i++)
{
Table.Add(reader.ReadFString(), reader.ReadFString());
}
}
public override void Write(AssetBinaryWriter writer)
{
base.Write(writer);
writer.Write((int)0);
writer.Write(Table.TableNamespace);
writer.Write(Table.Count);
for (int i = 0; i < Table.Count; i++)
{
writer.Write(Table.Keys.ElementAt(i));
writer.Write(Table[i]);
}
}
}
}

View File

@ -0,0 +1,179 @@
using System;
using System.Collections.Generic;
using System.Diagnostics;
using System.IO;
using UAssetAPI.FieldTypes;
using UAssetAPI.Kismet.Bytecode;
using UAssetAPI.UnrealTypes;
namespace UAssetAPI
{
/// <summary>
/// Base export for all UObject types that contain fields.
/// </summary>
public class StructExport : FieldExport
{
/// <summary>
/// Struct this inherits from, may be null
/// </summary>
public FPackageIndex SuperStruct;
/// <summary>
/// List of child fields
/// </summary>
public FPackageIndex[] Children;
/// <summary>
/// Properties serialized with this struct definition
/// </summary>
public FProperty[] LoadedProperties;
/// <summary>
/// The bytecode instructions contained within this struct.
/// </summary>
public KismetExpression[] ScriptBytecode;
/// <summary>
/// Bytecode size in total in deserialized memory. Filled out in lieu of <see cref="ScriptBytecode"/> if an error occurs during bytecode parsing.
/// </summary>
public int ScriptBytecodeSize;
/// <summary>
/// Raw binary bytecode data. Filled out in lieu of <see cref="ScriptBytecode"/> if an error occurs during bytecode parsing.
/// </summary>
public byte[] ScriptBytecodeRaw;
/// <summary>
/// A static bool that determines whether or not the serializer will attempt to parse Kismet bytecode.
/// </summary>
private static readonly bool ParseBytecode = true;
public StructExport(Export super) : base(super)
{
}
public StructExport(UAsset asset, byte[] extras) : base(asset, extras)
{
}
public StructExport()
{
}
public override void Read(AssetBinaryReader reader, int nextStarting)
{
base.Read(reader, nextStarting);
SuperStruct = new FPackageIndex(reader.ReadInt32());
int numIndexEntries = reader.ReadInt32();
Children = new FPackageIndex[numIndexEntries];
for (int i = 0; i < numIndexEntries; i++)
{
Children[i] = new FPackageIndex(reader.ReadInt32());
}
if (Asset.GetCustomVersion<FCoreObjectVersion>() >= FCoreObjectVersion.FProperties)
{
int numProps = reader.ReadInt32();
LoadedProperties = new FProperty[numProps];
for (int i = 0; i < numProps; i++)
{
LoadedProperties[i] = MainSerializer.ReadFProperty(reader);
}
}
else
{
LoadedProperties = new FProperty[0];
}
ScriptBytecodeSize = reader.ReadInt32(); // # of bytes in total in deserialized memory
int scriptStorageSize = reader.ReadInt32(); // # of bytes in total
long startedReading = reader.BaseStream.Position;
bool willParseRaw = true;
try
{
if (ParseBytecode && Asset.EngineVersion >= UE4Version.VER_UE4_16)
{
var tempCode = new List<Kismet.Bytecode.KismetExpression>();
while ((reader.BaseStream.Position - startedReading) < scriptStorageSize)
{
tempCode.Add(ExpressionSerializer.ReadExpression(reader));
}
ScriptBytecode = tempCode.ToArray();
willParseRaw = false;
}
}
catch (Exception ex)
{
#if DEBUG
Debug.WriteLine(ex.StackTrace);
#endif
}
if (willParseRaw)
{
reader.BaseStream.Seek(startedReading, SeekOrigin.Begin);
ScriptBytecode = null;
ScriptBytecodeRaw = reader.ReadBytes(scriptStorageSize);
}
}
public override void Write(AssetBinaryWriter writer)
{
base.Write(writer);
writer.Write(SuperStruct.Index);
writer.Write(Children.Length);
for (int i = 0; i < Children.Length; i++)
{
writer.Write(Children[i].Index);
}
if (Asset.GetCustomVersion<FCoreObjectVersion>() >= FCoreObjectVersion.FProperties)
{
writer.Write(LoadedProperties.Length);
for (int i = 0; i < LoadedProperties.Length; i++)
{
MainSerializer.WriteFProperty(LoadedProperties[i], writer);
}
}
if (ScriptBytecode == null)
{
writer.Write(ScriptBytecodeSize);
writer.Write(ScriptBytecodeRaw.Length);
writer.Write(ScriptBytecodeRaw);
}
else
{
long lengthOffset1 = writer.BaseStream.Position;
writer.Write((int)0); // total iCode offset; to be filled out after serialization
long lengthOffset2 = writer.BaseStream.Position;
writer.Write((int)0); // size on disk; to be filled out after serialization
int totalICodeOffset = 0;
long startMetric = writer.BaseStream.Position;
for (int i = 0; i < ScriptBytecode.Length; i++)
{
totalICodeOffset += ExpressionSerializer.WriteExpression(ScriptBytecode[i], writer);
}
long endMetric = writer.BaseStream.Position;
// Write out total size in bytes
long totalLength = endMetric - startMetric;
long here = writer.BaseStream.Position;
writer.Seek((int)lengthOffset1, SeekOrigin.Begin);
writer.Write(totalICodeOffset);
writer.Seek((int)lengthOffset2, SeekOrigin.Begin);
writer.Write((int)totalLength);
writer.Seek((int)here, SeekOrigin.Begin);
}
}
}
}

View File

@ -0,0 +1,19 @@
using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Threading.Tasks;
using UAssetAPI.UnrealTypes;
namespace UAssetAPI.FieldTypes
{
/// <summary>
/// The type of array that this property represents. This is represented an integer in the engine.
/// </summary>
public enum EArrayDim : int
{
NotAnArray = 0,
TArray = 1,
CArray = 2
}
}

View File

@ -0,0 +1,45 @@
using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Threading.Tasks;
using UAssetAPI.UnrealTypes;
namespace UAssetAPI.FieldTypes
{
/// <summary>Secondary condition to check before considering the replication of a lifetime property.</summary>
public enum ELifetimeCondition : byte
{
/// <summary>This property has no condition, and will send anytime it changes</summary>
COND_None = 0,
/// <summary>This property will only attempt to send on the initial bunch</summary>
COND_InitialOnly = 1,
/// <summary>This property will only send to the actor's owner</summary>
COND_OwnerOnly = 2,
/// <summary>This property send to every connection EXCEPT the owner</summary>
COND_SkipOwner = 3,
/// <summary>This property will only send to simulated actors</summary>
COND_SimulatedOnly = 4,
/// <summary>This property will only send to autonomous actors</summary>
COND_AutonomousOnly = 5,
/// <summary>This property will send to simulated OR bRepPhysics actors</summary>
COND_SimulatedOrPhysics = 6,
/// <summary>This property will send on the initial packet, or to the actors owner</summary>
COND_InitialOrOwner = 7,
/// <summary>This property has no particular condition, but wants the ability to toggle on/off via SetCustomIsActiveOverride</summary>
COND_Custom = 8,
/// <summary>This property will only send to the replay connection, or to the actors owner</summary>
COND_ReplayOrOwner = 9,
/// <summary>This property will only send to the replay connection</summary>
COND_ReplayOnly = 10,
/// <summary>This property will send to actors only, but not to replay connections</summary>
COND_SimulatedOnlyNoReplay = 11,
/// <summary>This property will send to simulated Or bRepPhysics actors, but not to replay connections</summary>
COND_SimulatedOrPhysicsNoReplay = 12,
/// <summary>This property will not send to the replay connection</summary>
COND_SkipReplay = 13,
/// <summary>This property will never be replicated</summary>
COND_Never = 15,
COND_Max = 16
};
}

View File

@ -0,0 +1,371 @@
using System.IO;
using UAssetAPI.UnrealTypes;
namespace UAssetAPI.FieldTypes
{
/// <summary>
/// Base class of reflection data objects.
/// </summary>
public class FField
{
public FName SerializedType;
public FName Name;
public EObjectFlags Flags;
public virtual void Read(AssetBinaryReader reader)
{
Name = reader.ReadFName();
Flags = (EObjectFlags)reader.ReadUInt32();
}
public virtual void Write(AssetBinaryWriter writer)
{
writer.Write(Name);
writer.Write((uint)Flags);
}
public FField()
{
}
}
/// <summary>
/// An UnrealScript variable.
/// </summary>
public abstract class FProperty : FField
{
public EArrayDim ArrayDim;
public int ElementSize;
public EPropertyFlags PropertyFlags;
public ushort RepIndex;
public FName RepNotifyFunc;
public ELifetimeCondition BlueprintReplicationCondition;
public object RawValue;
public void SetObject(object value)
{
RawValue = value;
}
public T GetObject<T>()
{
return (T)RawValue;
}
public override void Read(AssetBinaryReader reader)
{
base.Read(reader);
ArrayDim = (EArrayDim)reader.ReadInt32();
ElementSize = reader.ReadInt32();
PropertyFlags = (EPropertyFlags)reader.ReadUInt64();
RepIndex = reader.ReadUInt16();
RepNotifyFunc = reader.ReadFName();
BlueprintReplicationCondition = (ELifetimeCondition)reader.ReadByte();
}
public override void Write(AssetBinaryWriter writer)
{
base.Write(writer);
writer.Write((int)ArrayDim);
writer.Write(ElementSize);
writer.Write((ulong)PropertyFlags);
writer.Write(RepIndex);
writer.Write(RepNotifyFunc);
writer.Write((byte)BlueprintReplicationCondition);
}
public FProperty()
{
}
}
public class FEnumProperty : FProperty
{
///<summary>A pointer to the UEnum represented by this property</summary>
public FPackageIndex Enum;
///<summary>The FNumericProperty which represents the underlying type of the enum</summary>
public FProperty UnderlyingProp;
public override void Read(AssetBinaryReader reader)
{
base.Read(reader);
Enum = new FPackageIndex(reader.ReadInt32());
UnderlyingProp = MainSerializer.ReadFProperty(reader);
}
public override void Write(AssetBinaryWriter writer)
{
base.Write(writer);
writer.Write(Enum.Index);
MainSerializer.WriteFProperty(UnderlyingProp, writer);
}
}
public class FArrayProperty : FProperty
{
public FProperty Inner;
public override void Read(AssetBinaryReader reader)
{
base.Read(reader);
Inner = MainSerializer.ReadFProperty(reader);
}
public override void Write(AssetBinaryWriter writer)
{
base.Write(writer);
MainSerializer.WriteFProperty(Inner, writer);
}
}
public class FSetProperty : FProperty
{
public FProperty ElementProp;
public override void Read(AssetBinaryReader reader)
{
base.Read(reader);
ElementProp = MainSerializer.ReadFProperty(reader);
}
public override void Write(AssetBinaryWriter writer)
{
base.Write(writer);
MainSerializer.WriteFProperty(ElementProp, writer);
}
}
public class FObjectProperty : FProperty
{
// UClass*
public FPackageIndex PropertyClass;
public override void Read(AssetBinaryReader reader)
{
base.Read(reader);
PropertyClass = new FPackageIndex(reader.ReadInt32());
}
public override void Write(AssetBinaryWriter writer)
{
base.Write(writer);
writer.Write(PropertyClass.Index);
}
}
public class FSoftObjectProperty : FObjectProperty
{
}
public class FClassProperty : FObjectProperty
{
// UClass*
public FPackageIndex MetaClass;
public override void Read(AssetBinaryReader reader)
{
base.Read(reader);
MetaClass = new FPackageIndex(reader.ReadInt32());
}
public override void Write(AssetBinaryWriter writer)
{
base.Write(writer);
writer.Write(MetaClass.Index);
}
}
public class FSoftClassProperty : FObjectProperty
{
// UClass*
public FPackageIndex MetaClass;
public override void Read(AssetBinaryReader reader)
{
base.Read(reader);
MetaClass = new FPackageIndex(reader.ReadInt32());
}
public override void Write(AssetBinaryWriter writer)
{
base.Write(writer);
writer.Write(MetaClass.Index);
}
}
public class FDelegateProperty : FProperty
{
// UFunction*
public FPackageIndex SignatureFunction;
public override void Read(AssetBinaryReader reader)
{
base.Read(reader);
SignatureFunction = new FPackageIndex(reader.ReadInt32());
}
public override void Write(AssetBinaryWriter writer)
{
base.Write(writer);
writer.Write(SignatureFunction.Index);
}
}
public class FMulticastDelegateProperty : FDelegateProperty
{
}
public class FMulticastInlineDelegateProperty : FMulticastDelegateProperty
{
}
public class FInterfaceProperty : FProperty
{
// UFunction*
public FPackageIndex InterfaceClass;
public override void Read(AssetBinaryReader reader)
{
base.Read(reader);
InterfaceClass = new FPackageIndex(reader.ReadInt32());
}
public override void Write(AssetBinaryWriter writer)
{
base.Write(writer);
writer.Write(InterfaceClass.Index);
}
}
public class FMapProperty : FProperty
{
public FProperty KeyProp;
public FProperty ValueProp;
public override void Read(AssetBinaryReader reader)
{
base.Read(reader);
KeyProp = MainSerializer.ReadFProperty(reader);
ValueProp = MainSerializer.ReadFProperty(reader);
}
public override void Write(AssetBinaryWriter writer)
{
base.Write(writer);
MainSerializer.WriteFProperty(KeyProp, writer);
MainSerializer.WriteFProperty(ValueProp, writer);
}
}
public class FBoolProperty : FProperty
{
/// <summary>Size of the bitfield/bool property. Equal to ElementSize but used to check if the property has been properly initialized (0-8, where 0 means uninitialized).</summary>
public byte FieldSize;
/// <summary>Offset from the memeber variable to the byte of the property (0-7).</summary>
public byte ByteOffset;
/// <summary>Mask of the byte with the property value.</summary>
public byte ByteMask;
/// <summary>Mask of the field with the property value. Either equal to ByteMask or 255 in case of 'bool' type.</summary>
public byte FieldMask;
public bool NativeBool;
public bool Value;
public override void Read(AssetBinaryReader reader)
{
base.Read(reader);
byte BoolSize = (byte)ElementSize;
FieldSize = reader.ReadByte();
ByteOffset = reader.ReadByte();
ByteMask = reader.ReadByte();
FieldMask = reader.ReadByte();
NativeBool = reader.ReadBoolean();
Value = reader.ReadBoolean();
}
public override void Write(AssetBinaryWriter writer)
{
base.Write(writer);
writer.Write(FieldSize);
writer.Write(ByteOffset);
writer.Write(ByteMask);
writer.Write(FieldMask);
writer.Write(NativeBool);
writer.Write(Value);
}
}
public class FByteProperty : FProperty
{
/// <summary>A pointer to the UEnum represented by this property</summary>
public FPackageIndex Enum;
public override void Read(AssetBinaryReader reader)
{
base.Read(reader);
Enum = new FPackageIndex(reader.ReadInt32());
}
public override void Write(AssetBinaryWriter writer)
{
base.Write(writer);
writer.Write(Enum.Index);
}
}
public class FStructProperty : FProperty
{
// UScriptStruct*
public FPackageIndex Struct;
public override void Read(AssetBinaryReader reader)
{
base.Read(reader);
Struct = new FPackageIndex(reader.ReadInt32());
}
public override void Write(AssetBinaryWriter writer)
{
base.Write(writer);
writer.Write(Struct.Index);
}
}
public class FNumericProperty : FProperty
{
public override void Read(AssetBinaryReader reader)
{
base.Read(reader);
}
public override void Write(AssetBinaryWriter writer)
{
base.Write(writer);
}
}
/// <summary>
/// This is a UAssetAPI-specific property that represents anything that we don't have special serialization for
/// </summary>
public class FGenericProperty : FProperty
{
public override void Read(AssetBinaryReader reader)
{
base.Read(reader);
}
public override void Write(AssetBinaryWriter writer)
{
base.Write(writer);
}
}
}

View File

@ -0,0 +1,423 @@
using UAssetAPI.UnrealTypes;
namespace UAssetAPI.FieldTypes
{
/// <summary>
/// Base class of reflection data objects.
/// </summary>
public class UField
{
/// <summary>
/// Next Field in the linked list. Removed entirely in the custom version FFrameworkObjectVersion::RemoveUField_Next in favor of a regular array
/// </summary>
[DisplayIndexOrder(0)]
public FPackageIndex Next;
public virtual void Read(AssetBinaryReader reader)
{
if (reader.Asset.GetCustomVersion<FFrameworkObjectVersion>() < FFrameworkObjectVersion.RemoveUField_Next)
{
Next = new FPackageIndex(reader.ReadInt32());
}
}
public virtual void Write(AssetBinaryWriter writer)
{
if (writer.Asset.GetCustomVersion<FFrameworkObjectVersion>() < FFrameworkObjectVersion.RemoveUField_Next)
{
writer.Write(Next.Index);
}
}
public UField()
{
}
}
/// <summary>
/// An UnrealScript variable.
/// </summary>
public abstract class UProperty : UField
{
[DisplayIndexOrder(1)]
public EArrayDim ArrayDim;
[DisplayIndexOrder(2)]
public int ElementSize;
[DisplayIndexOrder(3)]
public EPropertyFlags PropertyFlags;
[DisplayIndexOrder(4)]
public FName RepNotifyFunc;
[DisplayIndexOrder(5)]
public ELifetimeCondition BlueprintReplicationCondition;
public object RawValue;
public void SetObject(object value)
{
RawValue = value;
}
public T GetObject<T>()
{
return (T)RawValue;
}
public override void Read(AssetBinaryReader reader)
{
base.Read(reader);
ArrayDim = (EArrayDim)reader.ReadInt32();
PropertyFlags = (EPropertyFlags)reader.ReadUInt64();
RepNotifyFunc = reader.ReadFName();
if (reader.Asset.GetCustomVersion<FReleaseObjectVersion>() >= FReleaseObjectVersion.PropertiesSerializeRepCondition)
{
BlueprintReplicationCondition = (ELifetimeCondition)reader.ReadByte();
}
}
public override void Write(AssetBinaryWriter writer)
{
base.Write(writer);
writer.Write((int)ArrayDim);
writer.Write((ulong)PropertyFlags);
writer.Write(RepNotifyFunc);
if (writer.Asset.GetCustomVersion<FReleaseObjectVersion>() >= FReleaseObjectVersion.PropertiesSerializeRepCondition)
{
writer.Write((byte)BlueprintReplicationCondition);
}
}
public UProperty()
{
}
}
public class UEnumProperty : UProperty
{
///<summary>A pointer to the UEnum represented by this property</summary>
[DisplayIndexOrder(6)]
public FPackageIndex Enum;
///<summary>The FNumericProperty which represents the underlying type of the enum</summary>
[DisplayIndexOrder(7)]
public FPackageIndex UnderlyingProp;
public override void Read(AssetBinaryReader reader)
{
base.Read(reader);
Enum = new FPackageIndex(reader.ReadInt32());
UnderlyingProp = new FPackageIndex(reader.ReadInt32());
}
public override void Write(AssetBinaryWriter writer)
{
base.Write(writer);
writer.Write(Enum.Index);
writer.Write(UnderlyingProp.Index);
}
}
public class UArrayProperty : UProperty
{
[DisplayIndexOrder(6)]
public FPackageIndex Inner;
public override void Read(AssetBinaryReader reader)
{
base.Read(reader);
Inner = new FPackageIndex(reader.ReadInt32());
}
public override void Write(AssetBinaryWriter writer)
{
base.Write(writer);
writer.Write(Inner.Index);
}
}
public class USetProperty : UProperty
{
[DisplayIndexOrder(6)]
public FPackageIndex ElementProp;
public override void Read(AssetBinaryReader reader)
{
base.Read(reader);
ElementProp = new FPackageIndex(reader.ReadInt32());
}
public override void Write(AssetBinaryWriter writer)
{
base.Write(writer);
writer.Write(ElementProp.Index);
}
}
public class UObjectProperty : UProperty
{
// UClass*
[DisplayIndexOrder(6)]
public FPackageIndex PropertyClass;
public override void Read(AssetBinaryReader reader)
{
base.Read(reader);
PropertyClass = new FPackageIndex(reader.ReadInt32());
}
public override void Write(AssetBinaryWriter writer)
{
base.Write(writer);
writer.Write(PropertyClass.Index);
}
}
public class USoftObjectProperty : UObjectProperty
{
}
public class ULazyObjectProperty : UObjectProperty
{
}
public class UClassProperty : UObjectProperty
{
// UClass*
[DisplayIndexOrder(7)]
public FPackageIndex MetaClass;
public override void Read(AssetBinaryReader reader)
{
base.Read(reader);
MetaClass = new FPackageIndex(reader.ReadInt32());
}
public override void Write(AssetBinaryWriter writer)
{
base.Write(writer);
writer.Write(MetaClass.Index);
}
}
public class USoftClassProperty : UObjectProperty
{
// UClass*
[DisplayIndexOrder(7)]
public FPackageIndex MetaClass;
public override void Read(AssetBinaryReader reader)
{
base.Read(reader);
MetaClass = new FPackageIndex(reader.ReadInt32());
}
public override void Write(AssetBinaryWriter writer)
{
base.Write(writer);
writer.Write(MetaClass.Index);
}
}
public class UDelegateProperty : UProperty
{
// UFunction*
[DisplayIndexOrder(6)]
public FPackageIndex SignatureFunction;
public override void Read(AssetBinaryReader reader)
{
base.Read(reader);
SignatureFunction = new FPackageIndex(reader.ReadInt32());
}
public override void Write(AssetBinaryWriter writer)
{
base.Write(writer);
writer.Write(SignatureFunction.Index);
}
}
public class UMulticastDelegateProperty : UDelegateProperty
{
}
public class UMulticastInlineDelegateProperty : UMulticastDelegateProperty
{
}
public class UInterfaceProperty : UProperty
{
// UFunction*
[DisplayIndexOrder(6)]
public FPackageIndex InterfaceClass;
public override void Read(AssetBinaryReader reader)
{
base.Read(reader);
InterfaceClass = new FPackageIndex(reader.ReadInt32());
}
public override void Write(AssetBinaryWriter writer)
{
base.Write(writer);
writer.Write(InterfaceClass.Index);
}
}
public class UMapProperty : UProperty
{
[DisplayIndexOrder(6)]
public FPackageIndex KeyProp;
[DisplayIndexOrder(7)]
public FPackageIndex ValueProp;
public override void Read(AssetBinaryReader reader)
{
base.Read(reader);
KeyProp = new FPackageIndex(reader.ReadInt32());
ValueProp = new FPackageIndex(reader.ReadInt32());
}
public override void Write(AssetBinaryWriter writer)
{
base.Write(writer);
writer.Write(KeyProp.Index);
writer.Write(ValueProp.Index);
}
}
public class UBoolProperty : UProperty
{
[DisplayIndexOrder(6)]
public bool NativeBool;
public override void Read(AssetBinaryReader reader)
{
base.Read(reader);
ElementSize = reader.ReadByte();
NativeBool = reader.ReadBoolean();
}
public override void Write(AssetBinaryWriter writer)
{
base.Write(writer);
writer.Write((byte)ElementSize);
writer.Write(NativeBool);
}
}
public class UByteProperty : UProperty
{
/// <summary>A pointer to the UEnum represented by this property</summary>
[DisplayIndexOrder(6)]
public FPackageIndex Enum;
public override void Read(AssetBinaryReader reader)
{
base.Read(reader);
Enum = new FPackageIndex(reader.ReadInt32());
}
public override void Write(AssetBinaryWriter writer)
{
base.Write(writer);
writer.Write(Enum.Index);
}
}
public class UStructProperty : UProperty
{
// UScriptStruct*
[DisplayIndexOrder(6)]
public FPackageIndex Struct;
public override void Read(AssetBinaryReader reader)
{
base.Read(reader);
Struct = new FPackageIndex(reader.ReadInt32());
}
public override void Write(AssetBinaryWriter writer)
{
base.Write(writer);
writer.Write(Struct.Index);
}
}
public class UNumericProperty : UProperty
{
}
public class UDoubleProperty : UNumericProperty
{
}
public class UFloatProperty : UNumericProperty
{
}
public class UIntProperty : UNumericProperty
{
}
public class UInt8Property : UNumericProperty
{
}
public class UInt16Property : UNumericProperty
{
}
public class UInt64Property : UNumericProperty
{
}
public class UUInt8Property : UNumericProperty
{
}
public class UUInt16Property : UNumericProperty
{
}
public class UUInt64Property : UNumericProperty
{
}
public class UNameProperty : UProperty
{
}
public class UStrProperty : UProperty
{
}
/// <summary>
/// This is a UAssetAPI-specific property that represents anything that we don't have special serialization for
/// </summary>
public class UGenericProperty : UProperty
{
}
}

View File

@ -0,0 +1,30 @@
using UAssetAPI.UnrealTypes;
namespace UAssetAPI
{
/// <summary>
/// UObject resource type for objects that are referenced by this package, but contained within another package.
/// </summary>
public class Import : FObjectResource
{
public FName ClassPackage;
public FName ClassName;
public Import(string classPackage, string className, FPackageIndex outerIndex, string objectName, UAsset asset) : base(new FName(asset, objectName), outerIndex)
{
ClassPackage = new FName(asset, classPackage);
ClassName = new FName(asset, className);
}
public Import(FName classPackage, FName className, FPackageIndex outerIndex, FName objectName) : base(objectName, outerIndex)
{
ClassPackage = classPackage;
ClassName = className;
}
public Import()
{
}
}
}

View File

@ -0,0 +1,43 @@
using Newtonsoft.Json;
using System;
using System.Collections.Generic;
using System.Diagnostics;
using UAssetAPI.UnrealTypes;
namespace UAssetAPI
{
public class FNameJsonConverter : JsonConverter
{
public Dictionary<FName, string> ToBeFilled;
public int currentI = 0;
public override bool CanConvert(Type objectType)
{
return objectType == typeof(FName);
}
public override void WriteJson(JsonWriter writer, object value, JsonSerializer serializer)
{
var realVal = (FName)value;
writer.WriteValue(realVal.DummyValue == null ? (realVal is null ? "null" : realVal.ToString()) : string.Empty);
}
public override bool CanRead
{
get { return true; }
}
public override object ReadJson(JsonReader reader, Type objectType, object existingValue, JsonSerializer serializer)
{
if (reader.Value == null) return null;
var res = FName.DefineDummy(null, "temp", ++currentI);
ToBeFilled[res] = Convert.ToString(reader.Value);
return res;
}
public FNameJsonConverter(Dictionary<FName, string> dict) : base()
{
ToBeFilled = dict;
}
}
}

View File

@ -0,0 +1,29 @@
using Newtonsoft.Json;
using System;
using UAssetAPI.UnrealTypes;
namespace UAssetAPI.JSON
{
public class FPackageIndexJsonConverter : JsonConverter
{
public override bool CanConvert(Type objectType)
{
return objectType == typeof(FPackageIndex);
}
public override void WriteJson(JsonWriter writer, object value, JsonSerializer serializer)
{
writer.WriteValue((value as FPackageIndex).Index);
}
public override bool CanRead
{
get { return true; }
}
public override object ReadJson(JsonReader reader, Type objectType, object existingValue, JsonSerializer serializer)
{
return new FPackageIndex(Convert.ToInt32(reader.Value));
}
}
}

View File

@ -0,0 +1,55 @@
using Newtonsoft.Json;
using System;
using System.Diagnostics;
using UAssetAPI.UnrealTypes;
namespace UAssetAPI.JSON
{
public class FSignedZeroJsonConverter : JsonConverter
{
private static readonly decimal negativeZero = decimal.Negate(decimal.Zero);
private static bool IsNegativeZero(double x)
{
return x == 0.0 && double.IsNegativeInfinity(1.0 / x);
}
public override bool CanConvert(Type objectType)
{
return objectType == typeof(decimal) || objectType == typeof(float) || objectType == typeof(double);
}
public override void WriteJson(JsonWriter writer, object value, JsonSerializer serializer)
{
double us = Convert.ToDouble(value);
if (us == 0)
{
writer.WriteValue(IsNegativeZero(us) ? "-0" : "+0");
}
else
{
writer.WriteValue(us);
}
}
public override bool CanRead
{
get { return true; }
}
public override object ReadJson(JsonReader reader, Type objectType, object existingValue, JsonSerializer serializer)
{
if (reader.Value is null) return 0;
if (reader.Value is string)
{
if (reader.Value == null || reader.Value.Equals("+0")) return Convert.ChangeType(0.0, objectType);
if (reader.Value.Equals("-0")) return Convert.ChangeType(negativeZero, objectType);
}
object res = Convert.ChangeType(reader.Value, objectType);
if (res is null) return 0;
return res;
}
}
}

View File

@ -0,0 +1,30 @@
using Newtonsoft.Json;
using System;
using UAssetAPI.UnrealTypes;
namespace UAssetAPI.JSON
{
public class FStringJsonConverter : JsonConverter
{
public override bool CanConvert(Type objectType)
{
return objectType == typeof(FString);
}
public override void WriteJson(JsonWriter writer, object value, JsonSerializer serializer)
{
writer.WriteValue((value as FString)?.Value);
}
public override bool CanRead
{
get { return true; }
}
public override object ReadJson(JsonReader reader, Type objectType, object existingValue, JsonSerializer serializer)
{
if (reader.Value == null) return null;
return new FString(Convert.ToString(reader.Value));
}
}
}

View File

@ -0,0 +1,66 @@
using Newtonsoft.Json;
using Newtonsoft.Json.Linq;
using System;
using System.Collections;
using System.Collections.Specialized;
using UAssetAPI.UnrealTypes;
namespace UAssetAPI.JSON
{
public class FStringTableJsonConverter : JsonConverter
{
public override bool CanConvert(Type objectType)
{
return objectType == typeof(FStringTable);
}
public override void WriteJson(JsonWriter writer, object value, JsonSerializer serializer)
{
var realVal = (FStringTable)value;
ICollection keys = ((IOrderedDictionary)value).Keys;
ICollection values = ((IOrderedDictionary)value).Values;
IEnumerator valueEnumerator = values.GetEnumerator();
writer.WriteStartObject();
writer.WritePropertyName("TableNamespace");
writer.WriteValue(realVal.TableNamespace?.Value);
writer.WritePropertyName("Value");
writer.WriteStartArray();
foreach (object key in keys)
{
valueEnumerator.MoveNext();
writer.WriteStartArray();
serializer.Serialize(writer, key);
serializer.Serialize(writer, valueEnumerator.Current);
writer.WriteEndArray();
}
writer.WriteEndArray();
writer.WriteEndObject();
}
public override bool CanRead
{
get { return true; }
}
public override object ReadJson(JsonReader reader, Type objectType, object existingValue, JsonSerializer serializer)
{
var dictionary = new FStringTable();
JObject tableJson = JObject.Load(reader);
dictionary.TableNamespace = new FString(tableJson["TableNamespace"].ToObject<string>());
JArray tokens = (JArray)tableJson["Value"];
foreach (var eachToken in tokens)
{
FString key = eachToken[0].ToObject<FString>(serializer);
FString value = eachToken[1].ToObject<FString>(serializer);
dictionary.Add(key, value);
}
return dictionary;
}
}
}

View File

@ -0,0 +1,81 @@
using Newtonsoft.Json;
using Newtonsoft.Json.Linq;
using System;
using System.Collections;
using System.Collections.Specialized;
/*
The code in this file is modified from mattmc3's dotmore @ https://github.com/mattmc3/dotmore/tree/b032bbf871d46bffd698c9b7a233c533d9d2f0ebs for usage in UAssetAPI.
The MIT License (MIT)
Copyright (c) 2014 mattmc3
Permission is hereby granted, free of charge, to any person obtaining a copy
of this software and associated documentation files (the "Software"), to deal
in the Software without restriction, including without limitation the rights
to use, copy, modify, merge, publish, distribute, sublicense, and/or sell
copies of the Software, and to permit persons to whom the Software is
furnished to do so, subject to the following conditions:
The above copyright notice and this permission notice shall be included in all
copies or substantial portions of the Software.
THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE
SOFTWARE.
*/
using UAssetAPI.UnrealTypes;
namespace UAssetAPI.JSON
{
public class TMapJsonConverter<TKey, TValue> : JsonConverter
{
public override bool CanConvert(Type objectType)
{
return typeof(IOrderedDictionary).IsAssignableFrom(objectType);
}
public override void WriteJson(JsonWriter writer, object value, JsonSerializer serializer)
{
ICollection keys = ((IOrderedDictionary)value).Keys;
ICollection values = ((IOrderedDictionary)value).Values;
IEnumerator valueEnumerator = values.GetEnumerator();
writer.WriteStartArray();
foreach (object key in keys)
{
valueEnumerator.MoveNext();
writer.WriteStartArray();
serializer.Serialize(writer, key);
serializer.Serialize(writer, valueEnumerator.Current);
writer.WriteEndArray();
}
writer.WriteEndArray();
}
public override bool CanRead
{
get { return true; }
}
public override object ReadJson(JsonReader reader, Type objectType, object existingValue, JsonSerializer serializer)
{
var dictionary = new TMap<TKey, TValue>();
JToken tokens = JToken.Load(reader);
foreach (var eachToken in tokens)
{
TKey key = eachToken[0].ToObject<TKey>(serializer);
TValue value = eachToken[1].ToObject<TValue>(serializer);
dictionary.Add(key, value);
}
return dictionary;
}
}
}

View File

@ -0,0 +1,27 @@
using Newtonsoft.Json;
using Newtonsoft.Json.Serialization;
using System;
using System.Collections.Generic;
using UAssetAPI.UnrealTypes;
namespace UAssetAPI.JSON
{
public class UAssetContractResolver : DefaultContractResolver
{
public Dictionary<FName, string> ToBeFilled;
protected override JsonConverter ResolveContractConverter(Type objectType)
{
if (typeof(FName).IsAssignableFrom(objectType))
{
return new FNameJsonConverter(ToBeFilled);
}
return base.ResolveContractConverter(objectType);
}
public UAssetContractResolver(Dictionary<FName, string> toBeFilled) : base()
{
ToBeFilled = toBeFilled;
}
}
}

View File

@ -0,0 +1,29 @@
namespace UAssetAPI.Kismet.Bytecode
{
/// <summary>
/// Kinds of text literals
/// </summary>
public enum EBlueprintTextLiteralType : byte
{
/// <summary>
/// Text is an empty string. The bytecode contains no strings, and you should use FText::GetEmpty() to initialize the FText instance.
/// </summary>
Empty,
/// <summary>
/// Text is localized. The bytecode will contain three strings - source, key, and namespace - and should be loaded via FInternationalization
/// </summary>
LocalizedText,
/// <summary>
/// Text is culture invariant. The bytecode will contain one string, and you should use FText::AsCultureInvariant to initialize the FText instance.
/// </summary>
InvariantText,
/// <summary>
/// Text is a literal FString. The bytecode will contain one string, and you should use FText::FromString to initialize the FText instance.
/// </summary>
LiteralString,
/// <summary>
/// Text is from a string table. The bytecode will contain an object pointer (not used) and two strings - the table ID, and key - and should be found via FText::FromStringTable
/// </summary>
StringTableEntry
}
}

View File

@ -0,0 +1,186 @@
namespace UAssetAPI.Kismet.Bytecode
{
/// <summary>
/// Evaluatable expression item types.
/// </summary>
public enum EExprToken
{
/// <summary>A local variable.</summary>
EX_LocalVariable = 0x00,
/// <summary>An object variable.</summary>
EX_InstanceVariable = 0x01,
/// <summary>Default variable for a class context.</summary>
EX_DefaultVariable = 0x02,
/// <summary>Return from function.</summary>
EX_Return = 0x04,
/// <summary>Goto a local address in code.</summary>
EX_Jump = 0x06,
/// <summary>Goto if not expression.</summary>
EX_JumpIfNot = 0x07,
/// <summary>Assertion.</summary>
EX_Assert = 0x09,
/// <summary>No operation.</summary>
EX_Nothing = 0x0B,
/// <summary>Assign an arbitrary size value to a variable.</summary>
EX_Let = 0x0F,
/// <summary>Class default object context.</summary>
EX_ClassContext = 0x12,
/// <summary>Metaclass cast.</summary>
EX_MetaCast = 0x13,
/// <summary>Let boolean variable.</summary>
EX_LetBool = 0x14,
/// <summary>end of default value for optional function parameter</summary>
EX_EndParmValue = 0x15,
/// <summary>End of function call parameters.</summary>
EX_EndFunctionParms = 0x16,
/// <summary>Self object.</summary>
EX_Self = 0x17,
/// <summary>Skippable expression.</summary>
EX_Skip = 0x18,
/// <summary>Call a function through an object context.</summary>
EX_Context = 0x19,
/// <summary>Call a function through an object context (can fail silently if the context is NULL; only generated for functions that don't have output or return values).</summary>
EX_Context_FailSilent = 0x1A,
/// <summary>A function call with parameters.</summary>
EX_VirtualFunction = 0x1B,
/// <summary>A prebound function call with parameters.</summary>
EX_FinalFunction = 0x1C,
/// <summary>Int constant.</summary>
EX_IntConst = 0x1D,
/// <summary>Floating point constant.</summary>
EX_FloatConst = 0x1E,
/// <summary>String constant.</summary>
EX_StringConst = 0x1F,
/// <summary>An object constant.</summary>
EX_ObjectConst = 0x20,
/// <summary>A name constant.</summary>
EX_NameConst = 0x21,
/// <summary>A rotation constant.</summary>
EX_RotationConst = 0x22,
/// <summary>A vector constant.</summary>
EX_VectorConst = 0x23,
/// <summary>A byte constant.</summary>
EX_ByteConst = 0x24,
/// <summary>Zero.</summary>
EX_IntZero = 0x25,
/// <summary>One.</summary>
EX_IntOne = 0x26,
/// <summary>Bool True.</summary>
EX_True = 0x27,
/// <summary>Bool False.</summary>
EX_False = 0x28,
/// <summary>FText constant</summary>
EX_TextConst = 0x29,
/// <summary>NoObject.</summary>
EX_NoObject = 0x2A,
/// <summary>A transform constant</summary>
EX_TransformConst = 0x2B,
/// <summary>Int constant that requires 1 byte.</summary>
EX_IntConstByte = 0x2C,
/// <summary>A null interface (similar to EX_NoObject, but for interfaces)</summary>
EX_NoInterface = 0x2D,
/// <summary>Safe dynamic class casting.</summary>
EX_DynamicCast = 0x2E,
/// <summary>An arbitrary UStruct constant</summary>
EX_StructConst = 0x2F,
/// <summary>End of UStruct constant</summary>
EX_EndStructConst = 0x30,
/// <summary>Set the value of arbitrary array</summary>
EX_SetArray = 0x31,
EX_EndArray = 0x32,
/// <summary>FProperty constant.</summary>
EX_PropertyConst = 0x33,
/// <summary>Unicode string constant.</summary>
EX_UnicodeStringConst = 0x34,
/// <summary>64-bit integer constant.</summary>
EX_Int64Const = 0x35,
/// <summary>64-bit unsigned integer constant.</summary>
EX_UInt64Const = 0x36,
/// <summary>A casting operator for primitives which reads the type as the subsequent byte</summary>
EX_PrimitiveCast = 0x38,
EX_SetSet = 0x39,
EX_EndSet = 0x3A,
EX_SetMap = 0x3B,
EX_EndMap = 0x3C,
EX_SetConst = 0x3D,
EX_EndSetConst = 0x3E,
EX_MapConst = 0x3F,
EX_EndMapConst = 0x40,
/// <summary>Context expression to address a property within a struct</summary>
EX_StructMemberContext = 0x42,
/// <summary>Assignment to a multi-cast delegate</summary>
EX_LetMulticastDelegate = 0x43,
/// <summary>Assignment to a delegate</summary>
EX_LetDelegate = 0x44,
/// <summary>Special instructions to quickly call a virtual function that we know is going to run only locally</summary>
EX_LocalVirtualFunction = 0x45,
/// <summary>Special instructions to quickly call a final function that we know is going to run only locally</summary>
EX_LocalFinalFunction = 0x46,
/// <summary>local out (pass by reference) function parameter</summary>
EX_LocalOutVariable = 0x48,
EX_DeprecatedOp4A = 0x4A,
/// <summary>const reference to a delegate or normal function object</summary>
EX_InstanceDelegate = 0x4B,
/// <summary>push an address on to the execution flow stack for future execution when a EX_PopExecutionFlow is executed. Execution continues on normally and doesn't change to the pushed address.</summary>
EX_PushExecutionFlow = 0x4C,
/// <summary>continue execution at the last address previously pushed onto the execution flow stack.</summary>
EX_PopExecutionFlow = 0x4D,
/// <summary>Goto a local address in code, specified by an integer value.</summary>
EX_ComputedJump = 0x4E,
/// <summary>continue execution at the last address previously pushed onto the execution flow stack, if the condition is not true.</summary>
EX_PopExecutionFlowIfNot = 0x4F,
/// <summary>Breakpoint. Only observed in the editor, otherwise it behaves like EX_Nothing.</summary>
EX_Breakpoint = 0x50,
/// <summary>Call a function through a native interface variable</summary>
EX_InterfaceContext = 0x51,
/// <summary>Converting an object reference to native interface variable</summary>
EX_ObjToInterfaceCast = 0x52,
/// <summary>Last byte in script code</summary>
EX_EndOfScript = 0x53,
/// <summary>Converting an interface variable reference to native interface variable</summary>
EX_CrossInterfaceCast = 0x54,
/// <summary>Converting an interface variable reference to an object</summary>
EX_InterfaceToObjCast = 0x55,
/// <summary>Trace point. Only observed in the editor, otherwise it behaves like EX_Nothing.</summary>
EX_WireTracepoint = 0x5A,
/// <summary>A CodeSizeSkipOffset constant</summary>
EX_SkipOffsetConst = 0x5B,
/// <summary>Adds a delegate to a multicast delegate's targets</summary>
EX_AddMulticastDelegate = 0x5C,
/// <summary>Clears all delegates in a multicast target</summary>
EX_ClearMulticastDelegate = 0x5D,
/// <summary>Trace point. Only observed in the editor, otherwise it behaves like EX_Nothing.</summary>
EX_Tracepoint = 0x5E,
/// <summary>assign to any object ref pointer</summary>
EX_LetObj = 0x5F,
/// <summary>assign to a weak object pointer</summary>
EX_LetWeakObjPtr = 0x60,
/// <summary>bind object and name to delegate</summary>
EX_BindDelegate = 0x61,
/// <summary>Remove a delegate from a multicast delegate's targets</summary>
EX_RemoveMulticastDelegate = 0x62,
/// <summary>Call multicast delegate</summary>
EX_CallMulticastDelegate = 0x63,
EX_LetValueOnPersistentFrame = 0x64,
EX_ArrayConst = 0x65,
EX_EndArrayConst = 0x66,
EX_SoftObjectConst = 0x67,
/// <summary>static pure function from on local call space</summary>
EX_CallMath = 0x68,
EX_SwitchValue = 0x69,
/// <summary>Instrumentation event</summary>
EX_InstrumentationEvent = 0x6A,
EX_ArrayGetByRef = 0x6B,
/// <summary>Sparse data variable</summary>
EX_ClassSparseDataVariable = 0x6C,
EX_FieldPathConst = 0x6D,
EX_Max = 0x100,
};
public enum ECastToken {
ObjectToInterface = 0x46,
ObjectToBool = 0x47,
InterfaceToBool = 0x49,
Max = 0xFF,
};
}

View File

@ -0,0 +1,22 @@
namespace UAssetAPI.Kismet.Bytecode
{
public enum EScriptInstrumentationType : byte {
Class = 0,
ClassScope,
Instance,
Event,
InlineEvent,
ResumeEvent,
PureNodeEntry,
NodeDebugSite,
NodeEntry,
NodeExit,
PushState,
RestoreState,
ResetState,
SuspendState,
PopState,
TunnelEndOfThread,
Stop
}
}

View File

@ -0,0 +1,311 @@
using System;
using UAssetAPI.Kismet.Bytecode.Expressions;
using UAssetAPI.UnrealTypes;
namespace UAssetAPI.Kismet.Bytecode
{
public static class ExpressionSerializer
{
public static KismetExpression ReadExpression(AssetBinaryReader reader)
{
KismetExpression res = null;
EExprToken token = (EExprToken)reader.ReadByte();
switch (token)
{
case EExprToken.EX_LocalVariable:
res = new EX_LocalVariable();
break;
case EExprToken.EX_InstanceVariable:
res = new EX_InstanceVariable();
break;
case EExprToken.EX_DefaultVariable:
res = new EX_DefaultVariable();
break;
case EExprToken.EX_Return:
res = new EX_Return();
break;
case EExprToken.EX_Jump:
res = new EX_Jump();
break;
case EExprToken.EX_JumpIfNot:
res = new EX_JumpIfNot();
break;
case EExprToken.EX_Assert:
res = new EX_Assert();
break;
case EExprToken.EX_Nothing:
res = new EX_Nothing();
break;
case EExprToken.EX_Let:
res = new EX_Let();
break;
case EExprToken.EX_ClassContext:
res = new EX_ClassContext();
break;
case EExprToken.EX_MetaCast:
res = new EX_MetaCast();
break;
case EExprToken.EX_LetBool:
res = new EX_LetBool();
break;
case EExprToken.EX_EndParmValue:
res = new EX_EndParmValue();
break;
case EExprToken.EX_EndFunctionParms:
res = new EX_EndFunctionParms();
break;
case EExprToken.EX_Self:
res = new EX_Self();
break;
case EExprToken.EX_Skip:
res = new EX_Skip();
break;
case EExprToken.EX_Context:
res = new EX_Context();
break;
case EExprToken.EX_Context_FailSilent:
res = new EX_Context_FailSilent();
break;
case EExprToken.EX_VirtualFunction:
res = new EX_VirtualFunction();
break;
case EExprToken.EX_FinalFunction:
res = new EX_FinalFunction();
break;
case EExprToken.EX_IntConst:
res = new EX_IntConst();
break;
case EExprToken.EX_FloatConst:
res = new EX_FloatConst();
break;
case EExprToken.EX_StringConst:
res = new EX_StringConst();
break;
case EExprToken.EX_ObjectConst:
res = new EX_ObjectConst();
break;
case EExprToken.EX_NameConst:
res = new EX_NameConst();
break;
case EExprToken.EX_RotationConst:
res = new EX_RotationConst();
break;
case EExprToken.EX_VectorConst:
res = new EX_VectorConst();
break;
case EExprToken.EX_ByteConst:
res = new EX_ByteConst();
break;
case EExprToken.EX_IntZero:
res = new EX_IntZero();
break;
case EExprToken.EX_IntOne:
res = new EX_IntOne();
break;
case EExprToken.EX_True:
res = new EX_True();
break;
case EExprToken.EX_False:
res = new EX_False();
break;
case EExprToken.EX_TextConst:
res = new EX_TextConst();
break;
case EExprToken.EX_NoObject:
res = new EX_NoObject();
break;
case EExprToken.EX_TransformConst:
res = new EX_TransformConst();
break;
case EExprToken.EX_IntConstByte:
res = new EX_IntConstByte();
break;
case EExprToken.EX_NoInterface:
res = new EX_NoInterface();
break;
case EExprToken.EX_DynamicCast:
res = new EX_DynamicCast();
break;
case EExprToken.EX_StructConst:
res = new EX_StructConst();
break;
case EExprToken.EX_EndStructConst:
res = new EX_EndStructConst();
break;
case EExprToken.EX_SetArray:
res = new EX_SetArray();
break;
case EExprToken.EX_EndArray:
res = new EX_EndArray();
break;
case EExprToken.EX_PropertyConst:
res = new EX_PropertyConst();
break;
case EExprToken.EX_UnicodeStringConst:
res = new EX_UnicodeStringConst();
break;
case EExprToken.EX_Int64Const:
res = new EX_Int64Const();
break;
case EExprToken.EX_UInt64Const:
res = new EX_UInt64Const();
break;
case EExprToken.EX_PrimitiveCast:
res = new EX_PrimitiveCast();
break;
case EExprToken.EX_SetSet:
res = new EX_SetSet();
break;
case EExprToken.EX_EndSet:
res = new EX_EndSet();
break;
case EExprToken.EX_SetMap:
res = new EX_SetMap();
break;
case EExprToken.EX_EndMap:
res = new EX_EndMap();
break;
case EExprToken.EX_SetConst:
res = new EX_SetConst();
break;
case EExprToken.EX_EndSetConst:
res = new EX_EndSetConst();
break;
case EExprToken.EX_MapConst:
res = new EX_MapConst();
break;
case EExprToken.EX_EndMapConst:
res = new EX_EndMapConst();
break;
case EExprToken.EX_StructMemberContext:
res = new EX_StructMemberContext();
break;
case EExprToken.EX_LetMulticastDelegate:
res = new EX_LetMulticastDelegate();
break;
case EExprToken.EX_LetDelegate:
res = new EX_LetDelegate();
break;
case EExprToken.EX_LocalVirtualFunction:
res = new EX_LocalVirtualFunction();
break;
case EExprToken.EX_LocalFinalFunction:
res = new EX_LocalFinalFunction();
break;
case EExprToken.EX_LocalOutVariable:
res = new EX_LocalOutVariable();
break;
case EExprToken.EX_DeprecatedOp4A:
res = new EX_DeprecatedOp4A();
break;
case EExprToken.EX_InstanceDelegate:
res = new EX_InstanceDelegate();
break;
case EExprToken.EX_PushExecutionFlow:
res = new EX_PushExecutionFlow();
break;
case EExprToken.EX_PopExecutionFlow:
res = new EX_PopExecutionFlow();
break;
case EExprToken.EX_ComputedJump:
res = new EX_ComputedJump();
break;
case EExprToken.EX_PopExecutionFlowIfNot:
res = new EX_PopExecutionFlowIfNot();
break;
case EExprToken.EX_Breakpoint:
res = new EX_Breakpoint();
break;
case EExprToken.EX_InterfaceContext:
res = new EX_InterfaceContext();
break;
case EExprToken.EX_ObjToInterfaceCast:
res = new EX_ObjToInterfaceCast();
break;
case EExprToken.EX_EndOfScript:
res = new EX_EndOfScript();
break;
case EExprToken.EX_CrossInterfaceCast:
res = new EX_CrossInterfaceCast();
break;
case EExprToken.EX_InterfaceToObjCast:
res = new EX_InterfaceToObjCast();
break;
case EExprToken.EX_WireTracepoint:
res = new EX_WireTracepoint();
break;
case EExprToken.EX_SkipOffsetConst:
res = new EX_SkipOffsetConst();
break;
case EExprToken.EX_AddMulticastDelegate:
res = new EX_AddMulticastDelegate();
break;
case EExprToken.EX_ClearMulticastDelegate:
res = new EX_ClearMulticastDelegate();
break;
case EExprToken.EX_Tracepoint:
res = new EX_Tracepoint();
break;
case EExprToken.EX_LetObj:
res = new EX_LetObj();
break;
case EExprToken.EX_LetWeakObjPtr:
res = new EX_LetWeakObjPtr();
break;
case EExprToken.EX_BindDelegate:
res = new EX_BindDelegate();
break;
case EExprToken.EX_RemoveMulticastDelegate:
res = new EX_RemoveMulticastDelegate();
break;
case EExprToken.EX_CallMulticastDelegate:
res = new EX_CallMulticastDelegate();
break;
case EExprToken.EX_LetValueOnPersistentFrame:
res = new EX_LetValueOnPersistentFrame();
break;
case EExprToken.EX_ArrayConst:
res = new EX_ArrayConst();
break;
case EExprToken.EX_EndArrayConst:
res = new EX_EndArrayConst();
break;
case EExprToken.EX_SoftObjectConst:
res = new EX_SoftObjectConst();
break;
case EExprToken.EX_CallMath:
res = new EX_CallMath();
break;
case EExprToken.EX_SwitchValue:
res = new EX_SwitchValue();
break;
case EExprToken.EX_InstrumentationEvent:
res = new EX_InstrumentationEvent();
break;
case EExprToken.EX_ArrayGetByRef:
res = new EX_ArrayGetByRef();
break;
case EExprToken.EX_ClassSparseDataVariable:
res = new EX_ClassSparseDataVariable();
break;
case EExprToken.EX_FieldPathConst:
res = new EX_FieldPathConst();
break;
default:
throw new NotImplementedException("Unimplemented token " + token);
}
if (res != null)
{
res.Read(reader);
}
return res;
}
public static int WriteExpression(KismetExpression expr, AssetBinaryWriter writer)
{
writer.Write((byte)expr.Token);
return expr.Write(writer) + sizeof(byte);
}
}
}

View File

@ -0,0 +1,56 @@
using Newtonsoft.Json;
using UAssetAPI.UnrealTypes;
namespace UAssetAPI.Kismet.Bytecode.Expressions
{
/// <summary>
/// A single Kismet bytecode instruction, corresponding to the <see cref="EExprToken.EX_AddMulticastDelegate"/> instruction.
/// </summary>
public class EX_AddMulticastDelegate : KismetExpression
{
/// <summary>
/// The token of this expression.
/// </summary>
public override EExprToken Token { get { return EExprToken.EX_AddMulticastDelegate; } }
/// <summary>
/// Delegate property to assign to.
/// </summary>
[JsonProperty]
public KismetExpression Delegate;
/// <summary>
/// Delegate to add to the MC delegate for broadcast.
/// </summary>
[JsonProperty]
public KismetExpression DelegateToAdd;
public EX_AddMulticastDelegate()
{
}
/// <summary>
/// Reads out the expression from a BinaryReader.
/// </summary>
/// <param name="reader">The BinaryReader to read from.</param>
public override void Read(AssetBinaryReader reader)
{
Delegate = ExpressionSerializer.ReadExpression(reader);
DelegateToAdd = ExpressionSerializer.ReadExpression(reader);
}
/// <summary>
/// Writes the expression to a BinaryWriter.
/// </summary>
/// <param name="writer">The BinaryWriter to write from.</param>
/// <returns>The iCode offset of the data that was written.</returns>
public override int Write(AssetBinaryWriter writer)
{
int offset = 0;
offset += ExpressionSerializer.WriteExpression(Delegate, writer);
offset += ExpressionSerializer.WriteExpression(DelegateToAdd, writer);
return offset;
}
}
}

View File

@ -0,0 +1,62 @@
using Newtonsoft.Json;
using UAssetAPI.UnrealTypes;
namespace UAssetAPI.Kismet.Bytecode.Expressions
{
/// <summary>
/// A single Kismet bytecode instruction, corresponding to the <see cref="EExprToken.EX_ArrayConst"/> instruction.
/// </summary>
public class EX_ArrayConst : KismetExpression<KismetExpression[]>
{
/// <summary>
/// The token of this expression.
/// </summary>
public override EExprToken Token { get { return EExprToken.EX_ArrayConst; } }
/// <summary>
/// Pointer to this constant's inner property (FProperty*).
/// </summary>
[JsonProperty]
public KismetPropertyPointer InnerProperty;
/// <summary>
/// Array constant entries.
/// </summary>
[JsonProperty]
public KismetExpression[] Elements;
public EX_ArrayConst()
{
}
/// <summary>
/// Reads out the expression from a BinaryReader.
/// </summary>
/// <param name="reader">The BinaryReader to read from.</param>
public override void Read(AssetBinaryReader reader)
{
InnerProperty = reader.XFER_PROP_POINTER();
int numEntries = reader.ReadInt32(); // Number of elements
Elements = reader.ReadExpressionArray(EExprToken.EX_EndArrayConst);
}
/// <summary>
/// Writes the expression to a BinaryWriter.
/// </summary>
/// <param name="writer">The BinaryWriter to write from.</param>
/// <returns>The iCode offset of the data that was written.</returns>
public override int Write(AssetBinaryWriter writer)
{
int offset = 0;
offset += writer.XFER_PROP_POINTER(InnerProperty);
writer.Write(Elements.Length); offset += sizeof(int);
for (int i = 0; i < Elements.Length; i++)
{
offset += ExpressionSerializer.WriteExpression(Elements[i], writer);
}
offset += ExpressionSerializer.WriteExpression(new EX_EndArrayConst(), writer);
return offset;
}
}
}

View File

@ -0,0 +1,56 @@
using Newtonsoft.Json;
using UAssetAPI.UnrealTypes;
namespace UAssetAPI.Kismet.Bytecode.Expressions
{
/// <summary>
/// A single Kismet bytecode instruction, corresponding to the <see cref="EExprToken.EX_ArrayGetByRef"/> instruction.
/// </summary>
public class EX_ArrayGetByRef : KismetExpression
{
/// <summary>
/// The token of this expression.
/// </summary>
public override EExprToken Token { get { return EExprToken.EX_ArrayGetByRef; } }
/// <summary>
/// The array variable.
/// </summary>
[JsonProperty]
public KismetExpression ArrayVariable;
/// <summary>
/// The index to access in the array.
/// </summary>
[JsonProperty]
public KismetExpression ArrayIndex;
public EX_ArrayGetByRef()
{
}
/// <summary>
/// Reads out the expression from a BinaryReader.
/// </summary>
/// <param name="reader">The BinaryReader to read from.</param>
public override void Read(AssetBinaryReader reader)
{
ArrayVariable = ExpressionSerializer.ReadExpression(reader);
ArrayIndex = ExpressionSerializer.ReadExpression(reader);
}
/// <summary>
/// Writes the expression to a BinaryWriter.
/// </summary>
/// <param name="writer">The BinaryWriter to write from.</param>
/// <returns>The iCode offset of the data that was written.</returns>
public override int Write(AssetBinaryWriter writer)
{
int offset = 0;
offset += ExpressionSerializer.WriteExpression(ArrayVariable, writer);
offset += ExpressionSerializer.WriteExpression(ArrayIndex, writer);
return offset;
}
}
}

View File

@ -0,0 +1,64 @@
using Newtonsoft.Json;
using UAssetAPI.UnrealTypes;
namespace UAssetAPI.Kismet.Bytecode.Expressions
{
/// <summary>
/// A single Kismet bytecode instruction, corresponding to the <see cref="EExprToken.EX_Assert"/> instruction.
/// </summary>
public class EX_Assert : KismetExpression
{
/// <summary>
/// The token of this expression.
/// </summary>
public override EExprToken Token { get { return EExprToken.EX_Assert; } }
/// <summary>
/// Line number.
/// </summary>
[JsonProperty]
public ushort LineNumber;
/// <summary>
/// Whether or not this assertion is in debug mode.
/// </summary>
[JsonProperty]
public bool DebugMode;
/// <summary>
/// Expression to assert.
/// </summary>
[JsonProperty]
public KismetExpression AssertExpression;
public EX_Assert()
{
}
/// <summary>
/// Reads out the expression from a BinaryReader.
/// </summary>
/// <param name="reader">The BinaryReader to read from.</param>
public override void Read(AssetBinaryReader reader)
{
LineNumber = reader.ReadUInt16();
DebugMode = reader.ReadBoolean();
AssertExpression = ExpressionSerializer.ReadExpression(reader);
}
/// <summary>
/// Writes the expression to a BinaryWriter.
/// </summary>
/// <param name="writer">The BinaryWriter to write from.</param>
/// <returns>The iCode offset of the data that was written.</returns>
public override int Write(AssetBinaryWriter writer)
{
int offset = 0;
writer.Write(LineNumber); offset += sizeof(ushort);
writer.Write(DebugMode); offset += sizeof(bool);
offset += ExpressionSerializer.WriteExpression(AssertExpression, writer);
return offset;
}
}
}

View File

@ -0,0 +1,64 @@
using Newtonsoft.Json;
using UAssetAPI.UnrealTypes;
namespace UAssetAPI.Kismet.Bytecode.Expressions
{
/// <summary>
/// A single Kismet bytecode instruction, corresponding to the <see cref="EExprToken.EX_BindDelegate"/> instruction.
/// </summary>
public class EX_BindDelegate : KismetExpression
{
/// <summary>
/// The token of this expression.
/// </summary>
public override EExprToken Token { get { return EExprToken.EX_BindDelegate; } }
/// <summary>
/// The name of the function assigned to the delegate.
/// </summary>
[JsonProperty]
public FName FunctionName;
/// <summary>
/// Delegate property to assign to.
/// </summary>
[JsonProperty]
public KismetExpression Delegate;
/// <summary>
/// Object to bind.
/// </summary>
[JsonProperty]
public KismetExpression ObjectTerm;
public EX_BindDelegate()
{
}
/// <summary>
/// Reads out the expression from a BinaryReader.
/// </summary>
/// <param name="reader">The BinaryReader to read from.</param>
public override void Read(AssetBinaryReader reader)
{
FunctionName = reader.XFER_FUNC_NAME();
Delegate = ExpressionSerializer.ReadExpression(reader);
ObjectTerm = ExpressionSerializer.ReadExpression(reader);
}
/// <summary>
/// Writes the expression to a BinaryWriter.
/// </summary>
/// <param name="writer">The BinaryWriter to write from.</param>
/// <returns>The iCode offset of the data that was written.</returns>
public override int Write(AssetBinaryWriter writer)
{
int offset = 0;
offset += writer.XFER_FUNC_NAME(FunctionName);
offset += ExpressionSerializer.WriteExpression(Delegate, writer);
offset += ExpressionSerializer.WriteExpression(ObjectTerm, writer);
return offset;
}
}
}

View File

@ -0,0 +1,37 @@
namespace UAssetAPI.Kismet.Bytecode.Expressions
{
/// <summary>
/// A single Kismet bytecode instruction, corresponding to the <see cref="EExprToken.EX_Breakpoint"/> instruction.
/// </summary>
public class EX_Breakpoint : KismetExpression
{
/// <summary>
/// The token of this expression.
/// </summary>
public override EExprToken Token { get { return EExprToken.EX_Breakpoint; } }
public EX_Breakpoint()
{
}
/// <summary>
/// Reads out the expression from a BinaryReader.
/// </summary>
/// <param name="reader">The BinaryReader to read from.</param>
public override void Read(AssetBinaryReader reader)
{
}
/// <summary>
/// Writes the expression to a BinaryWriter.
/// </summary>
/// <param name="writer">The BinaryWriter to write from.</param>
/// <returns>The iCode offset of the data that was written.</returns>
public override int Write(AssetBinaryWriter writer)
{
return 0;
}
}
}

View File

@ -0,0 +1,38 @@
namespace UAssetAPI.Kismet.Bytecode.Expressions
{
/// <summary>
/// A single Kismet bytecode instruction, corresponding to the <see cref="EExprToken.EX_ByteConst"/> instruction.
/// </summary>
public class EX_ByteConst : KismetExpression<byte>
{
/// <summary>
/// The token of this expression.
/// </summary>
public override EExprToken Token { get { return EExprToken.EX_ByteConst; } }
public EX_ByteConst()
{
}
/// <summary>
/// Reads out the expression from a BinaryReader.
/// </summary>
/// <param name="reader">The BinaryReader to read from.</param>
public override void Read(AssetBinaryReader reader)
{
Value = reader.ReadByte();
}
/// <summary>
/// Writes the expression to a BinaryWriter.
/// </summary>
/// <param name="writer">The BinaryWriter to write from.</param>
/// <returns>The iCode offset of the data that was written.</returns>
public override int Write(AssetBinaryWriter writer)
{
writer.Write(Value);
return sizeof(byte);
}
}
}

View File

@ -0,0 +1,37 @@
namespace UAssetAPI.Kismet.Bytecode.Expressions
{
/// <summary>
/// A single Kismet bytecode instruction, corresponding to the <see cref="EExprToken.EX_CallMath"/> instruction.
/// </summary>
public class EX_CallMath : EX_FinalFunction
{
/// <summary>
/// The token of this expression.
/// </summary>
public override EExprToken Token { get { return EExprToken.EX_CallMath; } }
public EX_CallMath() : base()
{
}
/// <summary>
/// Reads out the expression from a BinaryReader.
/// </summary>
/// <param name="reader">The BinaryReader to read from.</param>
public override void Read(AssetBinaryReader reader)
{
base.Read(reader);
}
/// <summary>
/// Writes the expression to a BinaryWriter.
/// </summary>
/// <param name="writer">The BinaryWriter to write from.</param>
/// <returns>The iCode offset of the data that was written.</returns>
public override int Write(AssetBinaryWriter writer)
{
return base.Write(writer);
}
}
}

View File

@ -0,0 +1,58 @@
using Newtonsoft.Json;
using UAssetAPI.UnrealTypes;
namespace UAssetAPI.Kismet.Bytecode.Expressions
{
/// <summary>
/// A single Kismet bytecode instruction, corresponding to the <see cref="EExprToken.EX_CallMulticastDelegate"/> instruction.
/// </summary>
public class EX_CallMulticastDelegate : EX_FinalFunction
{
/// <summary>
/// The token of this expression.
/// </summary>
public override EExprToken Token { get { return EExprToken.EX_CallMulticastDelegate; } }
/// <summary>
/// Delegate property.
/// </summary>
[JsonProperty]
public KismetExpression Delegate;
public EX_CallMulticastDelegate()
{
}
/// <summary>
/// Reads out the expression from a BinaryReader.
/// </summary>
/// <param name="reader">The BinaryReader to read from.</param>
public override void Read(AssetBinaryReader reader)
{
StackNode = reader.XFER_FUNC_POINTER();
Delegate = ExpressionSerializer.ReadExpression(reader);
Parameters = reader.ReadExpressionArray(EExprToken.EX_EndFunctionParms);
}
/// <summary>
/// Writes the expression to a BinaryWriter.
/// </summary>
/// <param name="writer">The BinaryWriter to write from.</param>
/// <returns>The iCode offset of the data that was written.</returns>
public override int Write(AssetBinaryWriter writer)
{
int offset = 0;
offset += writer.XFER_FUNC_POINTER(StackNode);
offset += ExpressionSerializer.WriteExpression(Delegate, writer);
for (int i = 0; i < Parameters.Length; i++)
{
offset += ExpressionSerializer.WriteExpression(Parameters[i], writer);
}
offset += ExpressionSerializer.WriteExpression(new EX_EndFunctionParms(), writer);
return offset;
}
}
}

View File

@ -0,0 +1,37 @@
namespace UAssetAPI.Kismet.Bytecode.Expressions
{
/// <summary>
/// A single Kismet bytecode instruction, corresponding to the <see cref="EExprToken.EX_ClassContext"/> instruction.
/// </summary>
public class EX_ClassContext : EX_Context
{
/// <summary>
/// The token of this expression.
/// </summary>
public override EExprToken Token { get { return EExprToken.EX_ClassContext; } }
public EX_ClassContext()
{
}
/// <summary>
/// Reads out the expression from a BinaryReader.
/// </summary>
/// <param name="reader">The BinaryReader to read from.</param>
public override void Read(AssetBinaryReader reader)
{
base.Read(reader);
}
/// <summary>
/// Writes the expression to a BinaryWriter.
/// </summary>
/// <param name="writer">The BinaryWriter to write from.</param>
/// <returns>The iCode offset of the data that was written.</returns>
public override int Write(AssetBinaryWriter writer)
{
return base.Write(writer);
}
}
}

View File

@ -0,0 +1,46 @@
using Newtonsoft.Json;
using UAssetAPI.UnrealTypes;
namespace UAssetAPI.Kismet.Bytecode.Expressions
{
/// <summary>
/// A single Kismet bytecode instruction, corresponding to the <see cref="EExprToken.EX_ClassSparseDataVariable"/> instruction.
/// </summary>
public class EX_ClassSparseDataVariable : KismetExpression
{
/// <summary>
/// The token of this expression.
/// </summary>
public override EExprToken Token { get { return EExprToken.EX_ClassSparseDataVariable; } }
/// <summary>
/// A pointer to the variable in question.
/// </summary>
[JsonProperty]
public KismetPropertyPointer Variable;
public EX_ClassSparseDataVariable()
{
}
/// <summary>
/// Reads out the expression from a BinaryReader.
/// </summary>
/// <param name="reader">The BinaryReader to read from.</param>
public override void Read(AssetBinaryReader reader)
{
Variable = reader.XFER_PROP_POINTER();
}
/// <summary>
/// Writes the expression to a BinaryWriter.
/// </summary>
/// <param name="writer">The BinaryWriter to write from.</param>
/// <returns>The iCode offset of the data that was written.</returns>
public override int Write(AssetBinaryWriter writer)
{
return writer.XFER_PROP_POINTER(Variable);
}
}
}

View File

@ -0,0 +1,46 @@
using Newtonsoft.Json;
using UAssetAPI.UnrealTypes;
namespace UAssetAPI.Kismet.Bytecode.Expressions
{
/// <summary>
/// A single Kismet bytecode instruction, corresponding to the <see cref="EExprToken.EX_ClearMulticastDelegate"/> instruction.
/// </summary>
public class EX_ClearMulticastDelegate : KismetExpression
{
/// <summary>
/// The token of this expression.
/// </summary>
public override EExprToken Token { get { return EExprToken.EX_ClearMulticastDelegate; } }
/// <summary>
/// Delegate property to clear.
/// </summary>
[JsonProperty]
public KismetExpression DelegateToClear;
public EX_ClearMulticastDelegate()
{
}
/// <summary>
/// Reads out the expression from a BinaryReader.
/// </summary>
/// <param name="reader">The BinaryReader to read from.</param>
public override void Read(AssetBinaryReader reader)
{
DelegateToClear = ExpressionSerializer.ReadExpression(reader);
}
/// <summary>
/// Writes the expression to a BinaryWriter.
/// </summary>
/// <param name="writer">The BinaryWriter to write from.</param>
/// <returns>The iCode offset of the data that was written.</returns>
public override int Write(AssetBinaryWriter writer)
{
return ExpressionSerializer.WriteExpression(DelegateToClear, writer);
}
}
}

View File

@ -0,0 +1,46 @@
using Newtonsoft.Json;
using UAssetAPI.UnrealTypes;
namespace UAssetAPI.Kismet.Bytecode.Expressions
{
/// <summary>
/// A single Kismet bytecode instruction, corresponding to the <see cref="EExprToken.EX_ComputedJump"/> instruction.
/// </summary>
public class EX_ComputedJump : KismetExpression
{
/// <summary>
/// The token of this expression.
/// </summary>
public override EExprToken Token { get { return EExprToken.EX_ComputedJump; } }
/// <summary>
/// An integer expression corresponding to the offset to jump to.
/// </summary>
[JsonProperty]
public KismetExpression CodeOffsetExpression;
public EX_ComputedJump()
{
}
/// <summary>
/// Reads out the expression from a BinaryReader.
/// </summary>
/// <param name="reader">The BinaryReader to read from.</param>
public override void Read(AssetBinaryReader reader)
{
CodeOffsetExpression = ExpressionSerializer.ReadExpression(reader);
}
/// <summary>
/// Writes the expression to a BinaryWriter.
/// </summary>
/// <param name="writer">The BinaryWriter to write from.</param>
/// <returns>The iCode offset of the data that was written.</returns>
public override int Write(AssetBinaryWriter writer)
{
return ExpressionSerializer.WriteExpression(CodeOffsetExpression, writer);
}
}
}

View File

@ -0,0 +1,72 @@
using Newtonsoft.Json;
using UAssetAPI.UnrealTypes;
namespace UAssetAPI.Kismet.Bytecode.Expressions
{
/// <summary>
/// A single Kismet bytecode instruction, corresponding to the <see cref="EExprToken.EX_Context"/> instruction.
/// </summary>
public class EX_Context : KismetExpression
{
/// <summary>
/// The token of this expression.
/// </summary>
public override EExprToken Token { get { return EExprToken.EX_Context; } }
/// <summary>
/// Object expression.
/// </summary>
[JsonProperty]
public KismetExpression ObjectExpression;
/// <summary>
/// Code offset for NULL expressions.
/// </summary>
[JsonProperty]
public uint Offset;
/// <summary>
/// Property corresponding to the r-value data, in case the l-value needs to be mem-zero'd. FField*
/// </summary>
[JsonProperty]
public KismetPropertyPointer RValuePointer;
/// <summary>
/// Context expression.
/// </summary>
[JsonProperty]
public KismetExpression ContextExpression;
public EX_Context()
{
}
/// <summary>
/// Reads out the expression from a BinaryReader.
/// </summary>
/// <param name="reader">The BinaryReader to read from.</param>
public override void Read(AssetBinaryReader reader)
{
ObjectExpression = ExpressionSerializer.ReadExpression(reader);
Offset = reader.ReadUInt32();
RValuePointer = reader.XFER_PROP_POINTER();
ContextExpression = ExpressionSerializer.ReadExpression(reader);
}
/// <summary>
/// Writes the expression to a BinaryWriter.
/// </summary>
/// <param name="writer">The BinaryWriter to write from.</param>
/// <returns>The iCode offset of the data that was written.</returns>
public override int Write(AssetBinaryWriter writer)
{
int offset = 0;
offset += ExpressionSerializer.WriteExpression(ObjectExpression, writer);
writer.Write(Offset); offset += sizeof(uint);
offset += writer.XFER_PROP_POINTER(RValuePointer);
offset += ExpressionSerializer.WriteExpression(ContextExpression, writer);
return offset;
}
}
}

View File

@ -0,0 +1,37 @@
namespace UAssetAPI.Kismet.Bytecode.Expressions
{
/// <summary>
/// A single Kismet bytecode instruction, corresponding to the <see cref="EExprToken.EX_Context_FailSilent"/> instruction.
/// </summary>
public class EX_Context_FailSilent : EX_Context
{
/// <summary>
/// The token of this expression.
/// </summary>
public override EExprToken Token { get { return EExprToken.EX_Context_FailSilent; } }
public EX_Context_FailSilent()
{
}
/// <summary>
/// Reads out the expression from a BinaryReader.
/// </summary>
/// <param name="reader">The BinaryReader to read from.</param>
public override void Read(AssetBinaryReader reader)
{
base.Read(reader);
}
/// <summary>
/// Writes the expression to a BinaryWriter.
/// </summary>
/// <param name="writer">The BinaryWriter to write from.</param>
/// <returns>The iCode offset of the data that was written.</returns>
public override int Write(AssetBinaryWriter writer)
{
return base.Write(writer);
}
}
}

View File

@ -0,0 +1,56 @@
using Newtonsoft.Json;
using UAssetAPI.UnrealTypes;
namespace UAssetAPI.Kismet.Bytecode.Expressions
{
/// <summary>
/// A single Kismet bytecode instruction, corresponding to the <see cref="EExprToken.EX_CrossInterfaceCast"/> instruction.
/// </summary>
public class EX_CrossInterfaceCast : KismetExpression
{
/// <summary>
/// The token of this expression.
/// </summary>
public override EExprToken Token { get { return EExprToken.EX_CrossInterfaceCast; } }
/// <summary>
/// A pointer to the interface class to convert to.
/// </summary>
[JsonProperty]
public FPackageIndex ClassPtr;
/// <summary>
/// The target of this expression.
/// </summary>
[JsonProperty]
public KismetExpression Target;
public EX_CrossInterfaceCast()
{
}
/// <summary>
/// Reads out the expression from a BinaryReader.
/// </summary>
/// <param name="reader">The BinaryReader to read from.</param>
public override void Read(AssetBinaryReader reader)
{
ClassPtr = reader.XFER_OBJECT_POINTER();
Target = ExpressionSerializer.ReadExpression(reader);
}
/// <summary>
/// Writes the expression to a BinaryWriter.
/// </summary>
/// <param name="writer">The BinaryWriter to write from.</param>
/// <returns>The iCode offset of the data that was written.</returns>
public override int Write(AssetBinaryWriter writer)
{
int offset = 0;
offset += writer.XFER_OBJECT_POINTER(ClassPtr);
offset += ExpressionSerializer.WriteExpression(Target, writer);
return offset;
}
}
}

View File

@ -0,0 +1,46 @@
using Newtonsoft.Json;
using UAssetAPI.UnrealTypes;
namespace UAssetAPI.Kismet.Bytecode.Expressions
{
/// <summary>
/// A single Kismet bytecode instruction, corresponding to the <see cref="EExprToken.EX_DefaultVariable"/> instruction.
/// </summary>
public class EX_DefaultVariable : KismetExpression
{
/// <summary>
/// The token of this expression.
/// </summary>
public override EExprToken Token { get { return EExprToken.EX_DefaultVariable; } }
/// <summary>
/// A pointer to the variable in question.
/// </summary>
[JsonProperty]
public KismetPropertyPointer Variable;
public EX_DefaultVariable()
{
}
/// <summary>
/// Reads out the expression from a BinaryReader.
/// </summary>
/// <param name="reader">The BinaryReader to read from.</param>
public override void Read(AssetBinaryReader reader)
{
Variable = reader.XFER_PROP_POINTER();
}
/// <summary>
/// Writes the expression to a BinaryWriter.
/// </summary>
/// <param name="writer">The BinaryWriter to write from.</param>
/// <returns>The iCode offset of the data that was written.</returns>
public override int Write(AssetBinaryWriter writer)
{
return writer.XFER_PROP_POINTER(Variable);
}
}
}

View File

@ -0,0 +1,37 @@
namespace UAssetAPI.Kismet.Bytecode.Expressions
{
/// <summary>
/// A single Kismet bytecode instruction, corresponding to the <see cref="EExprToken.EX_DeprecatedOp4A"/> instruction.
/// </summary>
public class EX_DeprecatedOp4A : KismetExpression
{
/// <summary>
/// The token of this expression.
/// </summary>
public override EExprToken Token { get { return EExprToken.EX_DeprecatedOp4A; } }
public EX_DeprecatedOp4A()
{
}
/// <summary>
/// Reads out the expression from a BinaryReader.
/// </summary>
/// <param name="reader">The BinaryReader to read from.</param>
public override void Read(AssetBinaryReader reader)
{
}
/// <summary>
/// Writes the expression to a BinaryWriter.
/// </summary>
/// <param name="writer">The BinaryWriter to write from.</param>
/// <returns>The iCode offset of the data that was written.</returns>
public override int Write(AssetBinaryWriter writer)
{
return 0;
}
}
}

View File

@ -0,0 +1,56 @@
using Newtonsoft.Json;
using UAssetAPI.UnrealTypes;
namespace UAssetAPI.Kismet.Bytecode.Expressions
{
/// <summary>
/// A single Kismet bytecode instruction, corresponding to the <see cref="EExprToken.EX_DynamicCast"/> instruction.
/// </summary>
public class EX_DynamicCast : KismetExpression
{
/// <summary>
/// The token of this expression.
/// </summary>
public override EExprToken Token { get { return EExprToken.EX_DynamicCast; } }
/// <summary>
/// A pointer to the relevant class (UClass*).
/// </summary>
[JsonProperty]
public FPackageIndex ClassPtr;
/// <summary>
/// The target expression.
/// </summary>
[JsonProperty]
public KismetExpression TargetExpression;
public EX_DynamicCast()
{
}
/// <summary>
/// Reads out the expression from a BinaryReader.
/// </summary>
/// <param name="reader">The BinaryReader to read from.</param>
public override void Read(AssetBinaryReader reader)
{
ClassPtr = reader.XFER_OBJECT_POINTER();
TargetExpression = ExpressionSerializer.ReadExpression(reader);
}
/// <summary>
/// Writes the expression to a BinaryWriter.
/// </summary>
/// <param name="writer">The BinaryWriter to write from.</param>
/// <returns>The iCode offset of the data that was written.</returns>
public override int Write(AssetBinaryWriter writer)
{
int offset = 0;
offset += writer.XFER_OBJECT_POINTER(ClassPtr);
offset += ExpressionSerializer.WriteExpression(TargetExpression, writer);
return offset;
}
}
}

View File

@ -0,0 +1,37 @@
namespace UAssetAPI.Kismet.Bytecode.Expressions
{
/// <summary>
/// A single Kismet bytecode instruction, corresponding to the <see cref="EExprToken.EX_EndArray"/> instruction.
/// </summary>
public class EX_EndArray : KismetExpression
{
/// <summary>
/// The token of this expression.
/// </summary>
public override EExprToken Token { get { return EExprToken.EX_EndArray; } }
public EX_EndArray()
{
}
/// <summary>
/// Reads out the expression from a BinaryReader.
/// </summary>
/// <param name="reader">The BinaryReader to read from.</param>
public override void Read(AssetBinaryReader reader)
{
}
/// <summary>
/// Writes the expression to a BinaryWriter.
/// </summary>
/// <param name="writer">The BinaryWriter to write from.</param>
/// <returns>The iCode offset of the data that was written.</returns>
public override int Write(AssetBinaryWriter writer)
{
return 0;
}
}
}

View File

@ -0,0 +1,37 @@
namespace UAssetAPI.Kismet.Bytecode.Expressions
{
/// <summary>
/// A single Kismet bytecode instruction, corresponding to the <see cref="EExprToken.EX_EndArrayConst"/> instruction.
/// </summary>
public class EX_EndArrayConst : KismetExpression
{
/// <summary>
/// The token of this expression.
/// </summary>
public override EExprToken Token { get { return EExprToken.EX_EndArrayConst; } }
public EX_EndArrayConst()
{
}
/// <summary>
/// Reads out the expression from a BinaryReader.
/// </summary>
/// <param name="reader">The BinaryReader to read from.</param>
public override void Read(AssetBinaryReader reader)
{
}
/// <summary>
/// Writes the expression to a BinaryWriter.
/// </summary>
/// <param name="writer">The BinaryWriter to write from.</param>
/// <returns>The iCode offset of the data that was written.</returns>
public override int Write(AssetBinaryWriter writer)
{
return 0;
}
}
}

View File

@ -0,0 +1,37 @@
namespace UAssetAPI.Kismet.Bytecode.Expressions
{
/// <summary>
/// A single Kismet bytecode instruction, corresponding to the <see cref="EExprToken.EX_EndFunctionParms"/> instruction.
/// </summary>
public class EX_EndFunctionParms : KismetExpression
{
/// <summary>
/// The token of this expression.
/// </summary>
public override EExprToken Token { get { return EExprToken.EX_EndFunctionParms; } }
public EX_EndFunctionParms()
{
}
/// <summary>
/// Reads out the expression from a BinaryReader.
/// </summary>
/// <param name="reader">The BinaryReader to read from.</param>
public override void Read(AssetBinaryReader reader)
{
}
/// <summary>
/// Writes the expression to a BinaryWriter.
/// </summary>
/// <param name="writer">The BinaryWriter to write from.</param>
/// <returns>The iCode offset of the data that was written.</returns>
public override int Write(AssetBinaryWriter writer)
{
return 0;
}
}
}

View File

@ -0,0 +1,37 @@
namespace UAssetAPI.Kismet.Bytecode.Expressions
{
/// <summary>
/// A single Kismet bytecode instruction, corresponding to the <see cref="EExprToken.EX_EndMap"/> instruction.
/// </summary>
public class EX_EndMap : KismetExpression
{
/// <summary>
/// The token of this expression.
/// </summary>
public override EExprToken Token { get { return EExprToken.EX_EndMap; } }
public EX_EndMap()
{
}
/// <summary>
/// Reads out the expression from a BinaryReader.
/// </summary>
/// <param name="reader">The BinaryReader to read from.</param>
public override void Read(AssetBinaryReader reader)
{
}
/// <summary>
/// Writes the expression to a BinaryWriter.
/// </summary>
/// <param name="writer">The BinaryWriter to write from.</param>
/// <returns>The iCode offset of the data that was written.</returns>
public override int Write(AssetBinaryWriter writer)
{
return 0;
}
}
}

View File

@ -0,0 +1,37 @@
namespace UAssetAPI.Kismet.Bytecode.Expressions
{
/// <summary>
/// A single Kismet bytecode instruction, corresponding to the <see cref="EExprToken.EX_EndMapConst"/> instruction.
/// </summary>
public class EX_EndMapConst : KismetExpression
{
/// <summary>
/// The token of this expression.
/// </summary>
public override EExprToken Token { get { return EExprToken.EX_EndMapConst; } }
public EX_EndMapConst()
{
}
/// <summary>
/// Reads out the expression from a BinaryReader.
/// </summary>
/// <param name="reader">The BinaryReader to read from.</param>
public override void Read(AssetBinaryReader reader)
{
}
/// <summary>
/// Writes the expression to a BinaryWriter.
/// </summary>
/// <param name="writer">The BinaryWriter to write from.</param>
/// <returns>The iCode offset of the data that was written.</returns>
public override int Write(AssetBinaryWriter writer)
{
return 0;
}
}
}

View File

@ -0,0 +1,37 @@
namespace UAssetAPI.Kismet.Bytecode.Expressions
{
/// <summary>
/// A single Kismet bytecode instruction, corresponding to the <see cref="EExprToken.EX_EndOfScript"/> instruction.
/// </summary>
public class EX_EndOfScript : KismetExpression
{
/// <summary>
/// The token of this expression.
/// </summary>
public override EExprToken Token { get { return EExprToken.EX_EndOfScript; } }
public EX_EndOfScript()
{
}
/// <summary>
/// Reads out the expression from a BinaryReader.
/// </summary>
/// <param name="reader">The BinaryReader to read from.</param>
public override void Read(AssetBinaryReader reader)
{
}
/// <summary>
/// Writes the expression to a BinaryWriter.
/// </summary>
/// <param name="writer">The BinaryWriter to write from.</param>
/// <returns>The iCode offset of the data that was written.</returns>
public override int Write(AssetBinaryWriter writer)
{
return 0;
}
}
}

View File

@ -0,0 +1,37 @@
namespace UAssetAPI.Kismet.Bytecode.Expressions
{
/// <summary>
/// A single Kismet bytecode instruction, corresponding to the <see cref="EExprToken.EX_EndParmValue"/> instruction.
/// </summary>
public class EX_EndParmValue : KismetExpression
{
/// <summary>
/// The token of this expression.
/// </summary>
public override EExprToken Token { get { return EExprToken.EX_EndParmValue; } }
public EX_EndParmValue()
{
}
/// <summary>
/// Reads out the expression from a BinaryReader.
/// </summary>
/// <param name="reader">The BinaryReader to read from.</param>
public override void Read(AssetBinaryReader reader)
{
}
/// <summary>
/// Writes the expression to a BinaryWriter.
/// </summary>
/// <param name="writer">The BinaryWriter to write from.</param>
/// <returns>The iCode offset of the data that was written.</returns>
public override int Write(AssetBinaryWriter writer)
{
return 0;
}
}
}

View File

@ -0,0 +1,37 @@
namespace UAssetAPI.Kismet.Bytecode.Expressions
{
/// <summary>
/// A single Kismet bytecode instruction, corresponding to the <see cref="EExprToken.EX_EndSet"/> instruction.
/// </summary>
public class EX_EndSet : KismetExpression
{
/// <summary>
/// The token of this expression.
/// </summary>
public override EExprToken Token { get { return EExprToken.EX_EndSet; } }
public EX_EndSet()
{
}
/// <summary>
/// Reads out the expression from a BinaryReader.
/// </summary>
/// <param name="reader">The BinaryReader to read from.</param>
public override void Read(AssetBinaryReader reader)
{
}
/// <summary>
/// Writes the expression to a BinaryWriter.
/// </summary>
/// <param name="writer">The BinaryWriter to write from.</param>
/// <returns>The iCode offset of the data that was written.</returns>
public override int Write(AssetBinaryWriter writer)
{
return 0;
}
}
}

View File

@ -0,0 +1,37 @@
namespace UAssetAPI.Kismet.Bytecode.Expressions
{
/// <summary>
/// A single Kismet bytecode instruction, corresponding to the <see cref="EExprToken.EX_EndSetConst"/> instruction.
/// </summary>
public class EX_EndSetConst : KismetExpression
{
/// <summary>
/// The token of this expression.
/// </summary>
public override EExprToken Token { get { return EExprToken.EX_EndSetConst; } }
public EX_EndSetConst()
{
}
/// <summary>
/// Reads out the expression from a BinaryReader.
/// </summary>
/// <param name="reader">The BinaryReader to read from.</param>
public override void Read(AssetBinaryReader reader)
{
}
/// <summary>
/// Writes the expression to a BinaryWriter.
/// </summary>
/// <param name="writer">The BinaryWriter to write from.</param>
/// <returns>The iCode offset of the data that was written.</returns>
public override int Write(AssetBinaryWriter writer)
{
return 0;
}
}
}

View File

@ -0,0 +1,37 @@
namespace UAssetAPI.Kismet.Bytecode.Expressions
{
/// <summary>
/// A single Kismet bytecode instruction, corresponding to the <see cref="EExprToken.EX_EndStructConst"/> instruction.
/// </summary>
public class EX_EndStructConst : KismetExpression
{
/// <summary>
/// The token of this expression.
/// </summary>
public override EExprToken Token { get { return EExprToken.EX_EndStructConst; } }
public EX_EndStructConst()
{
}
/// <summary>
/// Reads out the expression from a BinaryReader.
/// </summary>
/// <param name="reader">The BinaryReader to read from.</param>
public override void Read(AssetBinaryReader reader)
{
}
/// <summary>
/// Writes the expression to a BinaryWriter.
/// </summary>
/// <param name="writer">The BinaryWriter to write from.</param>
/// <returns>The iCode offset of the data that was written.</returns>
public override int Write(AssetBinaryWriter writer)
{
return 0;
}
}
}

View File

@ -0,0 +1,37 @@
namespace UAssetAPI.Kismet.Bytecode.Expressions
{
/// <summary>
/// A single Kismet bytecode instruction, corresponding to the <see cref="EExprToken.EX_False"/> instruction.
/// </summary>
public class EX_False : KismetExpression
{
/// <summary>
/// The token of this expression.
/// </summary>
public override EExprToken Token { get { return EExprToken.EX_False; } }
public EX_False()
{
}
/// <summary>
/// Reads out the expression from a BinaryReader.
/// </summary>
/// <param name="reader">The BinaryReader to read from.</param>
public override void Read(AssetBinaryReader reader)
{
}
/// <summary>
/// Writes the expression to a BinaryWriter.
/// </summary>
/// <param name="writer">The BinaryWriter to write from.</param>
/// <returns>The iCode offset of the data that was written.</returns>
public override int Write(AssetBinaryWriter writer)
{
return 0;
}
}
}

View File

@ -0,0 +1,37 @@
namespace UAssetAPI.Kismet.Bytecode.Expressions
{
/// <summary>
/// A single Kismet bytecode instruction, corresponding to the <see cref="EExprToken.EX_FieldPathConst"/> instruction.
/// </summary>
public class EX_FieldPathConst : KismetExpression<KismetExpression>
{
/// <summary>
/// The token of this expression.
/// </summary>
public override EExprToken Token { get { return EExprToken.EX_FieldPathConst; } }
public EX_FieldPathConst()
{
}
/// <summary>
/// Reads out the expression from a BinaryReader.
/// </summary>
/// <param name="reader">The BinaryReader to read from.</param>
public override void Read(AssetBinaryReader reader)
{
Value = ExpressionSerializer.ReadExpression(reader);
}
/// <summary>
/// Writes the expression to a BinaryWriter.
/// </summary>
/// <param name="writer">The BinaryWriter to write from.</param>
/// <returns>The iCode offset of the data that was written.</returns>
public override int Write(AssetBinaryWriter writer)
{
return ExpressionSerializer.WriteExpression(Value, writer);
}
}
}

View File

@ -0,0 +1,63 @@
using Newtonsoft.Json;
using System.Collections.Generic;
using UAssetAPI.UnrealTypes;
namespace UAssetAPI.Kismet.Bytecode.Expressions
{
/// <summary>
/// A single Kismet bytecode instruction, corresponding to the <see cref="EExprToken.EX_FinalFunction"/> instruction.
/// </summary>
public class EX_FinalFunction : KismetExpression
{
/// <summary>
/// The token of this expression.
/// </summary>
public override EExprToken Token { get { return EExprToken.EX_FinalFunction; } }
/// <summary>
/// Stack node.
/// </summary>
[JsonProperty]
public FPackageIndex StackNode;
/// <summary>
/// List of parameters for this function.
/// </summary>
[JsonProperty]
public KismetExpression[] Parameters;
public EX_FinalFunction()
{
}
/// <summary>
/// Reads out the expression from a BinaryReader.
/// </summary>
/// <param name="reader">The BinaryReader to read from.</param>
public override void Read(AssetBinaryReader reader)
{
StackNode = reader.XFER_FUNC_POINTER();
Parameters = reader.ReadExpressionArray(EExprToken.EX_EndFunctionParms);
}
/// <summary>
/// Writes the expression to a BinaryWriter.
/// </summary>
/// <param name="writer">The BinaryWriter to write from.</param>
/// <returns>The iCode offset of the data that was written.</returns>
public override int Write(AssetBinaryWriter writer)
{
int offset = 0;
offset += writer.XFER_FUNC_POINTER(StackNode);
for (int i = 0; i < Parameters.Length; i++)
{
offset += ExpressionSerializer.WriteExpression(Parameters[i], writer);
}
offset += ExpressionSerializer.WriteExpression(new EX_EndFunctionParms(), writer);
return offset;
}
}
}

View File

@ -0,0 +1,49 @@
using Newtonsoft.Json;
using UAssetAPI.JSON;
using UAssetAPI.UnrealTypes;
namespace UAssetAPI.Kismet.Bytecode.Expressions
{
/// <summary>
/// A single Kismet bytecode instruction, corresponding to the <see cref="EExprToken.EX_FloatConst"/> instruction.
/// </summary>
public class EX_FloatConst : KismetExpression
{
/// <summary>
/// The token of this expression.
/// </summary>
public override EExprToken Token { get { return EExprToken.EX_FloatConst; } }
/// <summary>
/// The value of this float constant expression.
/// </summary>
[JsonProperty]
[JsonConverter(typeof(FSignedZeroJsonConverter))]
public float Value;
public EX_FloatConst()
{
}
/// <summary>
/// Reads out the expression from a BinaryReader.
/// </summary>
/// <param name="reader">The BinaryReader to read from.</param>
public override void Read(AssetBinaryReader reader)
{
Value = reader.ReadSingle();
}
/// <summary>
/// Writes the expression to a BinaryWriter.
/// </summary>
/// <param name="writer">The BinaryWriter to write from.</param>
/// <returns>The iCode offset of the data that was written.</returns>
public override int Write(AssetBinaryWriter writer)
{
writer.Write(Value);
return sizeof(float);
}
}
}

View File

@ -0,0 +1,46 @@
using Newtonsoft.Json;
using UAssetAPI.UnrealTypes;
namespace UAssetAPI.Kismet.Bytecode.Expressions
{
/// <summary>
/// A single Kismet bytecode instruction, corresponding to the <see cref="EExprToken.EX_InstanceDelegate"/> instruction.
/// </summary>
public class EX_InstanceDelegate : KismetExpression
{
/// <summary>
/// The token of this expression.
/// </summary>
public override EExprToken Token { get { return EExprToken.EX_InstanceDelegate; } }
/// <summary>
/// The name of the function assigned to the delegate.
/// </summary>
[JsonProperty]
public FName FunctionName;
public EX_InstanceDelegate()
{
}
/// <summary>
/// Reads out the expression from a BinaryReader.
/// </summary>
/// <param name="reader">The BinaryReader to read from.</param>
public override void Read(AssetBinaryReader reader)
{
FunctionName = reader.XFER_FUNC_NAME();
}
/// <summary>
/// Writes the expression to a BinaryWriter.
/// </summary>
/// <param name="writer">The BinaryWriter to write from.</param>
/// <returns>The iCode offset of the data that was written.</returns>
public override int Write(AssetBinaryWriter writer)
{
return writer.XFER_FUNC_NAME(FunctionName);
}
}
}

View File

@ -0,0 +1,46 @@
using Newtonsoft.Json;
using UAssetAPI.UnrealTypes;
namespace UAssetAPI.Kismet.Bytecode.Expressions
{
/// <summary>
/// A single Kismet bytecode instruction, corresponding to the <see cref="EExprToken.EX_InstanceVariable"/> instruction.
/// </summary>
public class EX_InstanceVariable : KismetExpression
{
/// <summary>
/// The token of this expression.
/// </summary>
public override EExprToken Token { get { return EExprToken.EX_InstanceVariable; } }
/// <summary>
/// A pointer to the variable in question.
/// </summary>
[JsonProperty]
public KismetPropertyPointer Variable;
public EX_InstanceVariable()
{
}
/// <summary>
/// Reads out the expression from a BinaryReader.
/// </summary>
/// <param name="reader">The BinaryReader to read from.</param>
public override void Read(AssetBinaryReader reader)
{
Variable = reader.XFER_PROP_POINTER();
}
/// <summary>
/// Writes the expression to a BinaryWriter.
/// </summary>
/// <param name="writer">The BinaryWriter to write from.</param>
/// <returns>The iCode offset of the data that was written.</returns>
public override int Write(AssetBinaryWriter writer)
{
return writer.XFER_PROP_POINTER(Variable);
}
}
}

View File

@ -0,0 +1,58 @@
using Newtonsoft.Json;
using System;
using UAssetAPI.UnrealTypes;
namespace UAssetAPI.Kismet.Bytecode.Expressions
{
/// <summary>
/// A single Kismet bytecode instruction, corresponding to the <see cref="EExprToken.EX_InstrumentationEvent"/> instruction.
/// </summary>
public class EX_InstrumentationEvent : KismetExpression
{
/// <summary>
/// The token of this expression.
/// </summary>
public override EExprToken Token { get { return EExprToken.EX_InstrumentationEvent; } }
[JsonProperty]
public EScriptInstrumentationType EventType;
[JsonProperty]
public FName EventName;
public EX_InstrumentationEvent()
{
}
/// <summary>
/// Reads out the expression from a BinaryReader.
/// </summary>
/// <param name="reader">The BinaryReader to read from.</param>
public override void Read(AssetBinaryReader reader)
{
EventType = (EScriptInstrumentationType)reader.ReadByte();
if (EventType.Equals(EScriptInstrumentationType.InlineEvent))
{
EventName = reader.XFER_FUNC_NAME();
}
}
/// <summary>
/// Writes the expression to a BinaryWriter.
/// </summary>
/// <param name="writer">The BinaryWriter to write from.</param>
/// <returns>The iCode offset of the data that was written.</returns>
public override int Write(AssetBinaryWriter writer)
{
writer.Write((byte)EventType);
if (EventType.Equals(EScriptInstrumentationType.InlineEvent)) {
writer.XFER_FUNC_NAME(EventName);
return 1 + 2 * sizeof(int);
} else {
return 1;
}
}
}
}

View File

@ -0,0 +1,38 @@
namespace UAssetAPI.Kismet.Bytecode.Expressions
{
/// <summary>
/// A single Kismet bytecode instruction, corresponding to the <see cref="EExprToken.EX_Int64Const"/> instruction.
/// </summary>
public class EX_Int64Const : KismetExpression<long>
{
/// <summary>
/// The token of this expression.
/// </summary>
public override EExprToken Token { get { return EExprToken.EX_Int64Const; } }
public EX_Int64Const()
{
}
/// <summary>
/// Reads out the expression from a BinaryReader.
/// </summary>
/// <param name="reader">The BinaryReader to read from.</param>
public override void Read(AssetBinaryReader reader)
{
Value = reader.ReadInt64();
}
/// <summary>
/// Writes the expression to a BinaryWriter.
/// </summary>
/// <param name="writer">The BinaryWriter to write from.</param>
/// <returns>The iCode offset of the data that was written.</returns>
public override int Write(AssetBinaryWriter writer)
{
writer.Write(Value);
return sizeof(long);
}
}
}

View File

@ -0,0 +1,38 @@
namespace UAssetAPI.Kismet.Bytecode.Expressions
{
/// <summary>
/// A single Kismet bytecode instruction, corresponding to the <see cref="EExprToken.EX_IntConst"/> instruction.
/// </summary>
public class EX_IntConst : KismetExpression<int>
{
/// <summary>
/// The token of this expression.
/// </summary>
public override EExprToken Token { get { return EExprToken.EX_IntConst; } }
public EX_IntConst()
{
}
/// <summary>
/// Reads out the expression from a BinaryReader.
/// </summary>
/// <param name="reader">The BinaryReader to read from.</param>
public override void Read(AssetBinaryReader reader)
{
Value = reader.ReadInt32();
}
/// <summary>
/// Writes the expression to a BinaryWriter.
/// </summary>
/// <param name="writer">The BinaryWriter to write from.</param>
/// <returns>The iCode offset of the data that was written.</returns>
public override int Write(AssetBinaryWriter writer)
{
writer.Write(Value);
return sizeof(int);
}
}
}

View File

@ -0,0 +1,38 @@
namespace UAssetAPI.Kismet.Bytecode.Expressions
{
/// <summary>
/// A single Kismet bytecode instruction, corresponding to the <see cref="EExprToken.EX_IntConstByte"/> instruction.
/// </summary>
public class EX_IntConstByte : KismetExpression<byte>
{
/// <summary>
/// The token of this expression.
/// </summary>
public override EExprToken Token { get { return EExprToken.EX_IntConstByte; } }
public EX_IntConstByte()
{
}
/// <summary>
/// Reads out the expression from a BinaryReader.
/// </summary>
/// <param name="reader">The BinaryReader to read from.</param>
public override void Read(AssetBinaryReader reader)
{
Value = reader.ReadByte();
}
/// <summary>
/// Writes the expression to a BinaryWriter.
/// </summary>
/// <param name="writer">The BinaryWriter to write from.</param>
/// <returns>The iCode offset of the data that was written.</returns>
public override int Write(AssetBinaryWriter writer)
{
writer.Write(Value);
return sizeof(byte);
}
}
}

View File

@ -0,0 +1,37 @@
namespace UAssetAPI.Kismet.Bytecode.Expressions
{
/// <summary>
/// A single Kismet bytecode instruction, corresponding to the <see cref="EExprToken.EX_IntOne"/> instruction.
/// </summary>
public class EX_IntOne : KismetExpression
{
/// <summary>
/// The token of this expression.
/// </summary>
public override EExprToken Token { get { return EExprToken.EX_IntOne; } }
public EX_IntOne()
{
}
/// <summary>
/// Reads out the expression from a BinaryReader.
/// </summary>
/// <param name="reader">The BinaryReader to read from.</param>
public override void Read(AssetBinaryReader reader)
{
}
/// <summary>
/// Writes the expression to a BinaryWriter.
/// </summary>
/// <param name="writer">The BinaryWriter to write from.</param>
/// <returns>The iCode offset of the data that was written.</returns>
public override int Write(AssetBinaryWriter writer)
{
return 0;
}
}
}

View File

@ -0,0 +1,37 @@
namespace UAssetAPI.Kismet.Bytecode.Expressions
{
/// <summary>
/// A single Kismet bytecode instruction, corresponding to the <see cref="EExprToken.EX_IntZero"/> instruction.
/// </summary>
public class EX_IntZero : KismetExpression
{
/// <summary>
/// The token of this expression.
/// </summary>
public override EExprToken Token { get { return EExprToken.EX_IntZero; } }
public EX_IntZero()
{
}
/// <summary>
/// Reads out the expression from a BinaryReader.
/// </summary>
/// <param name="reader">The BinaryReader to read from.</param>
public override void Read(AssetBinaryReader reader)
{
}
/// <summary>
/// Writes the expression to a BinaryWriter.
/// </summary>
/// <param name="writer">The BinaryWriter to write from.</param>
/// <returns>The iCode offset of the data that was written.</returns>
public override int Write(AssetBinaryWriter writer)
{
return 0;
}
}
}

View File

@ -0,0 +1,46 @@
using Newtonsoft.Json;
using UAssetAPI.UnrealTypes;
namespace UAssetAPI.Kismet.Bytecode.Expressions
{
/// <summary>
/// A single Kismet bytecode instruction, corresponding to the <see cref="EExprToken.EX_InterfaceContext"/> instruction.
/// </summary>
public class EX_InterfaceContext : KismetExpression
{
/// <summary>
/// The token of this expression.
/// </summary>
public override EExprToken Token { get { return EExprToken.EX_InterfaceContext; } }
/// <summary>
/// Interface value.
/// </summary>
[JsonProperty]
public KismetExpression InterfaceValue;
public EX_InterfaceContext()
{
}
/// <summary>
/// Reads out the expression from a BinaryReader.
/// </summary>
/// <param name="reader">The BinaryReader to read from.</param>
public override void Read(AssetBinaryReader reader)
{
InterfaceValue = ExpressionSerializer.ReadExpression(reader);
}
/// <summary>
/// Writes the expression to a BinaryWriter.
/// </summary>
/// <param name="writer">The BinaryWriter to write from.</param>
/// <returns>The iCode offset of the data that was written.</returns>
public override int Write(AssetBinaryWriter writer)
{
return ExpressionSerializer.WriteExpression(InterfaceValue, writer);
}
}
}

View File

@ -0,0 +1,56 @@
using Newtonsoft.Json;
using UAssetAPI.UnrealTypes;
namespace UAssetAPI.Kismet.Bytecode.Expressions
{
/// <summary>
/// A single Kismet bytecode instruction, corresponding to the <see cref="EExprToken.EX_InterfaceToObjCast"/> instruction.
/// </summary>
public class EX_InterfaceToObjCast : KismetExpression
{
/// <summary>
/// The token of this expression.
/// </summary>
public override EExprToken Token { get { return EExprToken.EX_InterfaceToObjCast; } }
/// <summary>
/// The interface class to convert to.
/// </summary>
[JsonProperty]
public FPackageIndex ClassPtr;
/// <summary>
/// The target of this expression.
/// </summary>
[JsonProperty]
public KismetExpression Target;
public EX_InterfaceToObjCast()
{
}
/// <summary>
/// Reads out the expression from a BinaryReader.
/// </summary>
/// <param name="reader">The BinaryReader to read from.</param>
public override void Read(AssetBinaryReader reader)
{
ClassPtr = reader.XFER_OBJECT_POINTER();
Target = ExpressionSerializer.ReadExpression(reader);
}
/// <summary>
/// Writes the expression to a BinaryWriter.
/// </summary>
/// <param name="writer">The BinaryWriter to write from.</param>
/// <returns>The iCode offset of the data that was written.</returns>
public override int Write(AssetBinaryWriter writer)
{
int offset = 0;
offset += writer.XFER_OBJECT_POINTER(ClassPtr);
offset += ExpressionSerializer.WriteExpression(Target, writer);
return offset;
}
}
}

View File

@ -0,0 +1,47 @@
using Newtonsoft.Json;
using UAssetAPI.UnrealTypes;
namespace UAssetAPI.Kismet.Bytecode.Expressions
{
/// <summary>
/// A single Kismet bytecode instruction, corresponding to the <see cref="EExprToken.EX_Jump"/> instruction.
/// </summary>
public class EX_Jump : KismetExpression
{
/// <summary>
/// The token of this expression.
/// </summary>
public override EExprToken Token { get { return EExprToken.EX_Jump; } }
/// <summary>
/// The offset to jump to.
/// </summary>
[JsonProperty]
public uint CodeOffset;
public EX_Jump()
{
}
/// <summary>
/// Reads out the expression from a BinaryReader.
/// </summary>
/// <param name="reader">The BinaryReader to read from.</param>
public override void Read(AssetBinaryReader reader)
{
CodeOffset = reader.ReadUInt32();
}
/// <summary>
/// Writes the expression to a BinaryWriter.
/// </summary>
/// <param name="writer">The BinaryWriter to write from.</param>
/// <returns>The iCode offset of the data that was written.</returns>
public override int Write(AssetBinaryWriter writer)
{
writer.Write(CodeOffset);
return sizeof(uint);
}
}
}

View File

@ -0,0 +1,57 @@
using Newtonsoft.Json;
using UAssetAPI.UnrealTypes;
namespace UAssetAPI.Kismet.Bytecode.Expressions
{
/// <summary>
/// A single Kismet bytecode instruction, corresponding to the <see cref="EExprToken.EX_JumpIfNot"/> instruction.
/// Conditional equivalent of the <see cref="EExprToken.EX_Jump"/> expression.
/// </summary>
public class EX_JumpIfNot : KismetExpression
{
/// <summary>
/// The token of this expression.
/// </summary>
public override EExprToken Token { get { return EExprToken.EX_JumpIfNot; } }
/// <summary>
/// The offset to jump to if the provided expression evaluates to false.
/// </summary>
[JsonProperty]
public uint CodeOffset;
/// <summary>
/// Expression to evaluate to determine whether or not a jump should be performed.
/// </summary>
[JsonProperty]
public KismetExpression BooleanExpression;
public EX_JumpIfNot()
{
}
/// <summary>
/// Reads out the expression from a BinaryReader.
/// </summary>
/// <param name="reader">The BinaryReader to read from.</param>
public override void Read(AssetBinaryReader reader)
{
CodeOffset = reader.ReadUInt32();
BooleanExpression = ExpressionSerializer.ReadExpression(reader);
}
/// <summary>
/// Writes the expression to a BinaryWriter.
/// </summary>
/// <param name="writer">The BinaryWriter to write from.</param>
/// <returns>The iCode offset of the data that was written.</returns>
public override int Write(AssetBinaryWriter writer)
{
int offset = 0;
writer.Write(CodeOffset); offset += sizeof(uint);
offset += ExpressionSerializer.WriteExpression(BooleanExpression, writer);
return offset;
}
}
}

View File

@ -0,0 +1,56 @@
using Newtonsoft.Json;
using UAssetAPI.UnrealTypes;
namespace UAssetAPI.Kismet.Bytecode.Expressions
{
/// <summary>
/// A single Kismet bytecode instruction, corresponding to the <see cref="EExprToken.EX_Let"/> instruction.
/// </summary>
public class EX_Let : KismetExpression
{
/// <summary>
/// The token of this expression.
/// </summary>
public override EExprToken Token { get { return EExprToken.EX_Let; } }
/// <summary>
/// A pointer to the variable.
/// </summary>
[JsonProperty]
public KismetPropertyPointer Value;
[JsonProperty]
public KismetExpression Variable;
[JsonProperty]
public KismetExpression Expression;
public EX_Let()
{
}
/// <summary>
/// Reads out the expression from a BinaryReader.
/// </summary>
/// <param name="reader">The BinaryReader to read from.</param>
public override void Read(AssetBinaryReader reader)
{
Value = reader.XFER_PROP_POINTER();
Variable = ExpressionSerializer.ReadExpression(reader);
Expression = ExpressionSerializer.ReadExpression(reader);
}
/// <summary>
/// Writes the expression to a BinaryWriter.
/// </summary>
/// <param name="writer">The BinaryWriter to write from.</param>
/// <returns>The iCode offset of the data that was written.</returns>
public override int Write(AssetBinaryWriter writer)
{
int offset = 0;
offset += writer.XFER_PROP_POINTER(Value);
offset += ExpressionSerializer.WriteExpression(Variable, writer);
offset += ExpressionSerializer.WriteExpression(Expression, writer);
return offset;
}
}
}

View File

@ -0,0 +1,55 @@
using Newtonsoft.Json;
using UAssetAPI.UnrealTypes;
namespace UAssetAPI.Kismet.Bytecode.Expressions
{
/// <summary>
/// A single Kismet bytecode instruction, corresponding to the <see cref="EExprToken.EX_LetBool"/> instruction.
/// </summary>
public class EX_LetBool : KismetExpression
{
/// <summary>
/// The token of this expression.
/// </summary>
public override EExprToken Token { get { return EExprToken.EX_LetBool; } }
/// <summary>
/// Variable expression.
/// </summary>
[JsonProperty]
public KismetExpression VariableExpression;
/// <summary>
/// Assignment expression.
/// </summary>
[JsonProperty]
public KismetExpression AssignmentExpression;
public EX_LetBool()
{
}
/// <summary>
/// Reads out the expression from a BinaryReader.
/// </summary>
/// <param name="reader">The BinaryReader to read from.</param>
public override void Read(AssetBinaryReader reader)
{
VariableExpression = ExpressionSerializer.ReadExpression(reader);
AssignmentExpression = ExpressionSerializer.ReadExpression(reader);
}
/// <summary>
/// Writes the expression to a BinaryWriter.
/// </summary>
/// <param name="writer">The BinaryWriter to write from.</param>
/// <returns>The iCode offset of the data that was written.</returns>
public override int Write(AssetBinaryWriter writer)
{
int offset = 0;
offset += ExpressionSerializer.WriteExpression(VariableExpression, writer);
offset += ExpressionSerializer.WriteExpression(AssignmentExpression, writer);
return offset;
}
}
}

View File

@ -0,0 +1,56 @@
using Newtonsoft.Json;
using UAssetAPI.UnrealTypes;
namespace UAssetAPI.Kismet.Bytecode.Expressions
{
/// <summary>
/// A single Kismet bytecode instruction, corresponding to the <see cref="EExprToken.EX_LetDelegate"/> instruction.
/// </summary>
public class EX_LetDelegate : KismetExpression
{
/// <summary>
/// The token of this expression.
/// </summary>
public override EExprToken Token { get { return EExprToken.EX_LetDelegate; } }
/// <summary>
/// Variable expression.
/// </summary>
[JsonProperty]
public KismetExpression VariableExpression;
/// <summary>
/// Assignment expression.
/// </summary>
[JsonProperty]
public KismetExpression AssignmentExpression;
public EX_LetDelegate()
{
}
/// <summary>
/// Reads out the expression from a BinaryReader.
/// </summary>
/// <param name="reader">The BinaryReader to read from.</param>
public override void Read(AssetBinaryReader reader)
{
VariableExpression = ExpressionSerializer.ReadExpression(reader);
AssignmentExpression = ExpressionSerializer.ReadExpression(reader);
}
/// <summary>
/// Writes the expression to a BinaryWriter.
/// </summary>
/// <param name="writer">The BinaryWriter to write from.</param>
/// <returns>The iCode offset of the data that was written.</returns>
public override int Write(AssetBinaryWriter writer)
{
int offset = 0;
offset += ExpressionSerializer.WriteExpression(VariableExpression, writer);
offset += ExpressionSerializer.WriteExpression(AssignmentExpression, writer);
return offset;
}
}
}

View File

@ -0,0 +1,56 @@
using Newtonsoft.Json;
using UAssetAPI.UnrealTypes;
namespace UAssetAPI.Kismet.Bytecode.Expressions
{
/// <summary>
/// A single Kismet bytecode instruction, corresponding to the <see cref="EExprToken.EX_LetMulticastDelegate"/> instruction.
/// </summary>
public class EX_LetMulticastDelegate : KismetExpression
{
/// <summary>
/// The token of this expression.
/// </summary>
public override EExprToken Token { get { return EExprToken.EX_LetMulticastDelegate; } }
/// <summary>
/// Variable expression.
/// </summary>
[JsonProperty]
public KismetExpression VariableExpression;
/// <summary>
/// Assignment expression.
/// </summary>
[JsonProperty]
public KismetExpression AssignmentExpression;
public EX_LetMulticastDelegate()
{
}
/// <summary>
/// Reads out the expression from a BinaryReader.
/// </summary>
/// <param name="reader">The BinaryReader to read from.</param>
public override void Read(AssetBinaryReader reader)
{
VariableExpression = ExpressionSerializer.ReadExpression(reader);
AssignmentExpression = ExpressionSerializer.ReadExpression(reader);
}
/// <summary>
/// Writes the expression to a BinaryWriter.
/// </summary>
/// <param name="writer">The BinaryWriter to write from.</param>
/// <returns>The iCode offset of the data that was written.</returns>
public override int Write(AssetBinaryWriter writer)
{
int offset = 0;
offset += ExpressionSerializer.WriteExpression(VariableExpression, writer);
offset += ExpressionSerializer.WriteExpression(AssignmentExpression, writer);
return offset;
}
}
}

View File

@ -0,0 +1,56 @@
using Newtonsoft.Json;
using UAssetAPI.UnrealTypes;
namespace UAssetAPI.Kismet.Bytecode.Expressions
{
/// <summary>
/// A single Kismet bytecode instruction, corresponding to the <see cref="EExprToken.EX_LetObj"/> instruction.
/// </summary>
public class EX_LetObj : KismetExpression
{
/// <summary>
/// The token of this expression.
/// </summary>
public override EExprToken Token { get { return EExprToken.EX_LetObj; } }
/// <summary>
/// Variable expression.
/// </summary>
[JsonProperty]
public KismetExpression VariableExpression;
/// <summary>
/// Assignment expression.
/// </summary>
[JsonProperty]
public KismetExpression AssignmentExpression;
public EX_LetObj()
{
}
/// <summary>
/// Reads out the expression from a BinaryReader.
/// </summary>
/// <param name="reader">The BinaryReader to read from.</param>
public override void Read(AssetBinaryReader reader)
{
VariableExpression = ExpressionSerializer.ReadExpression(reader);
AssignmentExpression = ExpressionSerializer.ReadExpression(reader);
}
/// <summary>
/// Writes the expression to a BinaryWriter.
/// </summary>
/// <param name="writer">The BinaryWriter to write from.</param>
/// <returns>The iCode offset of the data that was written.</returns>
public override int Write(AssetBinaryWriter writer)
{
int offset = 0;
offset += ExpressionSerializer.WriteExpression(VariableExpression, writer);
offset += ExpressionSerializer.WriteExpression(AssignmentExpression, writer);
return offset;
}
}
}

View File

@ -0,0 +1,56 @@
using Newtonsoft.Json;
using UAssetAPI.UnrealTypes;
namespace UAssetAPI.Kismet.Bytecode.Expressions
{
/// <summary>
/// A single Kismet bytecode instruction, corresponding to the <see cref="EExprToken.EX_LetValueOnPersistentFrame"/> instruction.
/// </summary>
public class EX_LetValueOnPersistentFrame : KismetExpression
{
/// <summary>
/// The token of this expression.
/// </summary>
public override EExprToken Token { get { return EExprToken.EX_LetValueOnPersistentFrame; } }
/// <summary>
/// Destination property pointer.
/// </summary>
[JsonProperty]
public KismetPropertyPointer DestinationProperty;
/// <summary>
/// Assignment expression.
/// </summary>
[JsonProperty]
public KismetExpression AssignmentExpression;
public EX_LetValueOnPersistentFrame()
{
}
/// <summary>
/// Reads out the expression from a BinaryReader.
/// </summary>
/// <param name="reader">The BinaryReader to read from.</param>
public override void Read(AssetBinaryReader reader)
{
DestinationProperty = reader.XFER_PROP_POINTER();
AssignmentExpression = ExpressionSerializer.ReadExpression(reader);
}
/// <summary>
/// Writes the expression to a BinaryWriter.
/// </summary>
/// <param name="writer">The BinaryWriter to write from.</param>
/// <returns>The iCode offset of the data that was written.</returns>
public override int Write(AssetBinaryWriter writer)
{
int offset = 0;
offset += writer.XFER_PROP_POINTER(DestinationProperty);
offset += ExpressionSerializer.WriteExpression(AssignmentExpression, writer);
return offset;
}
}
}

View File

@ -0,0 +1,56 @@
using Newtonsoft.Json;
using UAssetAPI.UnrealTypes;
namespace UAssetAPI.Kismet.Bytecode.Expressions
{
/// <summary>
/// A single Kismet bytecode instruction, corresponding to the <see cref="EExprToken.EX_LetWeakObjPtr"/> instruction.
/// </summary>
public class EX_LetWeakObjPtr : KismetExpression
{
/// <summary>
/// The token of this expression.
/// </summary>
public override EExprToken Token { get { return EExprToken.EX_LetWeakObjPtr; } }
/// <summary>
/// Variable expression.
/// </summary>
[JsonProperty]
public KismetExpression VariableExpression;
/// <summary>
/// Assignment expression.
/// </summary>
[JsonProperty]
public KismetExpression AssignmentExpression;
public EX_LetWeakObjPtr()
{
}
/// <summary>
/// Reads out the expression from a BinaryReader.
/// </summary>
/// <param name="reader">The BinaryReader to read from.</param>
public override void Read(AssetBinaryReader reader)
{
VariableExpression = ExpressionSerializer.ReadExpression(reader);
AssignmentExpression = ExpressionSerializer.ReadExpression(reader);
}
/// <summary>
/// Writes the expression to a BinaryWriter.
/// </summary>
/// <param name="writer">The BinaryWriter to write from.</param>
/// <returns>The iCode offset of the data that was written.</returns>
public override int Write(AssetBinaryWriter writer)
{
int offset = 0;
offset += ExpressionSerializer.WriteExpression(VariableExpression, writer);
offset += ExpressionSerializer.WriteExpression(AssignmentExpression, writer);
return offset;
}
}
}

View File

@ -0,0 +1,37 @@
namespace UAssetAPI.Kismet.Bytecode.Expressions
{
/// <summary>
/// A single Kismet bytecode instruction, corresponding to the <see cref="EExprToken.EX_LocalFinalFunction"/> instruction.
/// </summary>
public class EX_LocalFinalFunction : EX_FinalFunction
{
/// <summary>
/// The token of this expression.
/// </summary>
public override EExprToken Token { get { return EExprToken.EX_LocalFinalFunction; } }
public EX_LocalFinalFunction() : base()
{
}
/// <summary>
/// Reads out the expression from a BinaryReader.
/// </summary>
/// <param name="reader">The BinaryReader to read from.</param>
public override void Read(AssetBinaryReader reader)
{
base.Read(reader);
}
/// <summary>
/// Writes the expression to a BinaryWriter.
/// </summary>
/// <param name="writer">The BinaryWriter to write from.</param>
/// <returns>The iCode offset of the data that was written.</returns>
public override int Write(AssetBinaryWriter writer)
{
return base.Write(writer);
}
}
}

View File

@ -0,0 +1,46 @@
using Newtonsoft.Json;
using UAssetAPI.UnrealTypes;
namespace UAssetAPI.Kismet.Bytecode.Expressions
{
/// <summary>
/// A single Kismet bytecode instruction, corresponding to the <see cref="EExprToken.EX_LocalOutVariable"/> instruction.
/// </summary>
public class EX_LocalOutVariable : KismetExpression
{
/// <summary>
/// The token of this expression.
/// </summary>
public override EExprToken Token { get { return EExprToken.EX_LocalOutVariable; } }
/// <summary>
/// A pointer to the variable in question.
/// </summary>
[JsonProperty]
public KismetPropertyPointer Variable;
public EX_LocalOutVariable()
{
}
/// <summary>
/// Reads out the expression from a BinaryReader.
/// </summary>
/// <param name="reader">The BinaryReader to read from.</param>
public override void Read(AssetBinaryReader reader)
{
Variable = reader.XFER_PROP_POINTER();
}
/// <summary>
/// Writes the expression to a BinaryWriter.
/// </summary>
/// <param name="writer">The BinaryWriter to write from.</param>
/// <returns>The iCode offset of the data that was written.</returns>
public override int Write(AssetBinaryWriter writer)
{
return writer.XFER_PROP_POINTER(Variable);
}
}
}

View File

@ -0,0 +1,46 @@
using Newtonsoft.Json;
using UAssetAPI.UnrealTypes;
namespace UAssetAPI.Kismet.Bytecode.Expressions
{
/// <summary>
/// A single Kismet bytecode instruction, corresponding to the <see cref="EExprToken.EX_LocalVariable"/> instruction.
/// </summary>
public class EX_LocalVariable : KismetExpression
{
/// <summary>
/// The token of this expression.
/// </summary>
public override EExprToken Token { get { return EExprToken.EX_LocalVariable; } }
/// <summary>
/// A pointer to the variable in question.
/// </summary>
[JsonProperty]
public KismetPropertyPointer Variable;
public EX_LocalVariable()
{
}
/// <summary>
/// Reads out the expression from a BinaryReader.
/// </summary>
/// <param name="reader">The BinaryReader to read from.</param>
public override void Read(AssetBinaryReader reader)
{
Variable = reader.XFER_PROP_POINTER();
}
/// <summary>
/// Writes the expression to a BinaryWriter.
/// </summary>
/// <param name="writer">The BinaryWriter to write from.</param>
/// <returns>The iCode offset of the data that was written.</returns>
public override int Write(AssetBinaryWriter writer)
{
return writer.XFER_PROP_POINTER(Variable);
}
}
}

View File

@ -0,0 +1,37 @@
namespace UAssetAPI.Kismet.Bytecode.Expressions
{
/// <summary>
/// A single Kismet bytecode instruction, corresponding to the <see cref="EExprToken.EX_LocalVirtualFunction"/> instruction.
/// </summary>
public class EX_LocalVirtualFunction : EX_VirtualFunction
{
/// <summary>
/// The token of this expression.
/// </summary>
public override EExprToken Token { get { return EExprToken.EX_LocalVirtualFunction; } }
public EX_LocalVirtualFunction() : base()
{
}
/// <summary>
/// Reads out the expression from a BinaryReader.
/// </summary>
/// <param name="reader">The BinaryReader to read from.</param>
public override void Read(AssetBinaryReader reader)
{
base.Read(reader);
}
/// <summary>
/// Writes the expression to a BinaryWriter.
/// </summary>
/// <param name="writer">The BinaryWriter to write from.</param>
/// <returns>The iCode offset of the data that was written.</returns>
public override int Write(AssetBinaryWriter writer)
{
return base.Write(writer);
}
}
}

View File

@ -0,0 +1,70 @@
using Newtonsoft.Json;
using UAssetAPI.UnrealTypes;
namespace UAssetAPI.Kismet.Bytecode.Expressions
{
/// <summary>
/// A single Kismet bytecode instruction, corresponding to the <see cref="EExprToken.EX_MapConst"/> instruction.
/// </summary>
public class EX_MapConst : KismetExpression
{
/// <summary>
/// The token of this expression.
/// </summary>
public override EExprToken Token { get { return EExprToken.EX_MapConst; } }
/// <summary>
/// Pointer to this constant's key property (FProperty*).
/// </summary>
[JsonProperty]
public KismetPropertyPointer KeyProperty;
/// <summary>
/// Pointer to this constant's value property (FProperty*).
/// </summary>
[JsonProperty]
public KismetPropertyPointer ValueProperty;
/// <summary>
/// Set constant entries.
/// </summary>
[JsonProperty]
public KismetExpression[] Elements;
public EX_MapConst()
{
}
/// <summary>
/// Reads out the expression from a BinaryReader.
/// </summary>
/// <param name="reader">The BinaryReader to read from.</param>
public override void Read(AssetBinaryReader reader)
{
KeyProperty = reader.XFER_PROP_POINTER();
ValueProperty = reader.XFER_PROP_POINTER();
int numEntries = reader.ReadInt32(); // Number of elements
Elements = reader.ReadExpressionArray(EExprToken.EX_EndMapConst);
}
/// <summary>
/// Writes the expression to a BinaryWriter.
/// </summary>
/// <param name="writer">The BinaryWriter to write from.</param>
/// <returns>The iCode offset of the data that was written.</returns>
public override int Write(AssetBinaryWriter writer)
{
int offset = 0;
offset += writer.XFER_PROP_POINTER(KeyProperty);
offset += writer.XFER_PROP_POINTER(ValueProperty);
writer.Write(Elements.Length); offset += sizeof(int);
for (int i = 0; i < Elements.Length; i++)
{
offset += ExpressionSerializer.WriteExpression(Elements[i], writer);
}
offset += ExpressionSerializer.WriteExpression(new EX_EndMapConst(), writer);
return offset;
}
}
}

View File

@ -0,0 +1,56 @@
using Newtonsoft.Json;
using UAssetAPI.UnrealTypes;
namespace UAssetAPI.Kismet.Bytecode.Expressions
{
/// <summary>
/// A single Kismet bytecode instruction, corresponding to the <see cref="EExprToken.EX_MetaCast"/> instruction.
/// </summary>
public class EX_MetaCast : KismetExpression
{
/// <summary>
/// The token of this expression.
/// </summary>
public override EExprToken Token { get { return EExprToken.EX_MetaCast; } }
/// <summary>
/// A pointer to the relevant class (UClass*).
/// </summary>
[JsonProperty]
public FPackageIndex ClassPtr;
/// <summary>
/// The target expression.
/// </summary>
[JsonProperty]
public KismetExpression TargetExpression;
public EX_MetaCast()
{
}
/// <summary>
/// Reads out the expression from a BinaryReader.
/// </summary>
/// <param name="reader">The BinaryReader to read from.</param>
public override void Read(AssetBinaryReader reader)
{
ClassPtr = reader.XFER_OBJECT_POINTER();
TargetExpression = ExpressionSerializer.ReadExpression(reader);
}
/// <summary>
/// Writes the expression to a BinaryWriter.
/// </summary>
/// <param name="writer">The BinaryWriter to write from.</param>
/// <returns>The iCode offset of the data that was written.</returns>
public override int Write(AssetBinaryWriter writer)
{
int offset = 0;
offset += writer.XFER_OBJECT_POINTER(ClassPtr);
offset += ExpressionSerializer.WriteExpression(TargetExpression, writer);
return offset;
}
}
}

View File

@ -0,0 +1,39 @@
using UAssetAPI.UnrealTypes;
namespace UAssetAPI.Kismet.Bytecode.Expressions
{
/// <summary>
/// A single Kismet bytecode instruction, corresponding to the <see cref="EExprToken.EX_NameConst"/> instruction.
/// </summary>
public class EX_NameConst : KismetExpression<FName>
{
/// <summary>
/// The token of this expression.
/// </summary>
public override EExprToken Token { get { return EExprToken.EX_NameConst; } }
public EX_NameConst()
{
}
/// <summary>
/// Reads out the expression from a BinaryReader.
/// </summary>
/// <param name="reader">The BinaryReader to read from.</param>
public override void Read(AssetBinaryReader reader)
{
Value = reader.XFERNAME();
}
/// <summary>
/// Writes the expression to a BinaryWriter.
/// </summary>
/// <param name="writer">The BinaryWriter to write from.</param>
/// <returns>The iCode offset of the data that was written.</returns>
public override int Write(AssetBinaryWriter writer)
{
return writer.XFERNAME(Value);
}
}
}

Some files were not shown because too many files have changed in this diff Show More