├── .gitignore
├── ARKSurvivalEvolved.vcxproj
├── ARKSurvivalEvolved.vcxproj.filters
├── AllPointsBulletin.vcxproj
├── AllPointsBulletin.vcxproj.filters
├── AloneInTheDarkIllumination.vcxproj
├── AloneInTheDarkIllumination.vcxproj.filters
├── BlazingSails.vcxproj
├── BlazingSails.vcxproj.filters
├── Borderlands2.vcxproj
├── Borderlands2.vcxproj.filters
├── CreateNewProject.bat
├── CreateNewProject.ps1
├── DeepRockGalactic.vcxproj
├── DeepRockGalactic.vcxproj.filters
├── Engine
├── ExceptionHandler.cpp
├── ExceptionHandler.hpp
├── IGenerator.hpp
├── Logger.cpp
├── Logger.hpp
├── Main.cpp
├── NameValidator.cpp
├── NameValidator.hpp
├── NamesStore.cpp
├── NamesStore.hpp
├── ObjectsStore.cpp
├── ObjectsStore.hpp
├── Package.cpp
├── Package.hpp
├── PatternFinder.cpp
├── PatternFinder.hpp
├── PrintHelper.cpp
├── PrintHelper.hpp
├── UE1
│ ├── Flags.cpp
│ ├── Flags.hpp
│ ├── FunctionFlags.cpp
│ ├── FunctionFlags.hpp
│ ├── GenericTypes.cpp
│ ├── GenericTypes.hpp
│ ├── Package.cpp
│ ├── PropertyFlags.cpp
│ └── PropertyFlags.hpp
├── UE2
│ ├── Flags.cpp
│ ├── Flags.hpp
│ ├── FunctionFlags.cpp
│ ├── FunctionFlags.hpp
│ ├── GenericTypes.cpp
│ ├── GenericTypes.hpp
│ ├── Package.cpp
│ ├── PropertyFlags.cpp
│ └── PropertyFlags.hpp
├── UE3
│ ├── Flags.cpp
│ ├── Flags.hpp
│ ├── FunctionFlags.cpp
│ ├── FunctionFlags.hpp
│ ├── GenericTypes.cpp
│ ├── GenericTypes.hpp
│ ├── Package.cpp
│ ├── PropertyFlags.cpp
│ └── PropertyFlags.hpp
├── UE4
│ ├── Flags.cpp
│ ├── Flags.hpp
│ ├── FunctionFlags.cpp
│ ├── FunctionFlags.hpp
│ ├── GenericTypes.cpp
│ ├── GenericTypes.hpp
│ ├── Package.cpp
│ ├── PropertyFlags.cpp
│ └── PropertyFlags.hpp
├── cpplinq.hpp
└── tinyformat.h
├── Fortnite.vcxproj
├── Fortnite.vcxproj.filters
├── Hawken.vcxproj
├── Hawken.vcxproj.filters
├── LICENSE
├── Paragon.vcxproj
├── Paragon.vcxproj.filters
├── README.md
├── RocketLeague.vcxproj
├── RocketLeague.vcxproj.filters
├── SeaOfThieves.vcxproj
├── SeaOfThieves.vcxproj.filters
├── Target
├── ARKSurvivalEvolved
│ ├── EngineClasses.hpp
│ ├── Generator.cpp
│ ├── GenericTypes.cpp
│ ├── NamesStore.cpp
│ └── ObjectsStore.cpp
├── AllPointsBulletin
│ ├── EngineClasses.hpp
│ ├── Generator.cpp
│ ├── GenericTypes.cpp
│ ├── NamesStore.cpp
│ └── ObjectsStore.cpp
├── AloneInTheDarkIllumination
│ ├── EngineClasses.hpp
│ ├── Generator.cpp
│ ├── GenericTypes.cpp
│ ├── NamesStore.cpp
│ └── ObjectsStore.cpp
├── BlazingSails
│ ├── EngineClasses.hpp
│ ├── Generator.cpp
│ ├── GenericTypes.cpp
│ ├── NamesStore.cpp
│ └── ObjectsStore.cpp
├── Borderlands2
│ ├── EngineClasses.hpp
│ ├── Generator.cpp
│ ├── GenericTypes.cpp
│ ├── NamesStore.cpp
│ └── ObjectsStore.cpp
├── DeepRockGalactic
│ ├── EngineClasses.hpp
│ ├── Generator.cpp
│ ├── GenericTypes.cpp
│ ├── NamesStore.cpp
│ └── ObjectsStore.cpp
├── Fortnite
│ ├── EngineClasses.hpp
│ ├── Fortnite.rcnet
│ ├── Generator.cpp
│ ├── GenericTypes.cpp
│ ├── NamesStore.cpp
│ └── ObjectsStore.cpp
├── Hawken
│ ├── EngineClasses.hpp
│ ├── Generator.cpp
│ ├── GenericTypes.cpp
│ ├── NamesStore.cpp
│ └── ObjectsStore.cpp
├── Paragon
│ ├── EngineClasses.hpp
│ ├── Generator.cpp
│ ├── GenericTypes.cpp
│ ├── NamesStore.cpp
│ └── ObjectsStore.cpp
├── RocketLeague
│ ├── EngineClasses.hpp
│ ├── Generator.cpp
│ ├── GenericTypes.cpp
│ ├── NamesStore.cpp
│ ├── ObjectsStore.cpp
│ └── RocketLeague.rcnet
├── SeaOfThieves
│ ├── EngineClasses.hpp
│ ├── Generator.cpp
│ ├── GenericTypes.cpp
│ ├── NamesStore.cpp
│ └── ObjectsStore.cpp
├── TribesAscend
│ ├── EngineClasses.hpp
│ ├── Generator.cpp
│ ├── GenericTypes.cpp
│ ├── NamesStore.cpp
│ └── ObjectsStore.cpp
├── Unreal
│ ├── EngineClasses.hpp
│ ├── Generator.cpp
│ ├── GenericTypes.cpp
│ ├── NamesStore.cpp
│ └── ObjectsStore.cpp
├── Unreal2
│ ├── EngineClasses.hpp
│ ├── Generator.cpp
│ ├── GenericTypes.cpp
│ ├── NamesStore.cpp
│ └── ObjectsStore.cpp
├── UnrealEngine1
│ ├── EngineClasses.hpp
│ ├── Generator.cpp
│ ├── GenericTypes.cpp
│ ├── NamesStore.cpp
│ └── ObjectsStore.cpp
├── UnrealEngine2
│ ├── EngineClasses.hpp
│ ├── Generator.cpp
│ ├── GenericTypes.cpp
│ ├── NamesStore.cpp
│ └── ObjectsStore.cpp
├── UnrealEngine3
│ ├── EngineClasses.hpp
│ ├── Generator.cpp
│ ├── GenericTypes.cpp
│ ├── NamesStore.cpp
│ └── ObjectsStore.cpp
├── UnrealEngine4
│ ├── EngineClasses.hpp
│ ├── Generator.cpp
│ ├── GenericTypes.cpp
│ ├── NamesStore.cpp
│ └── ObjectsStore.cpp
├── UnrealTournament2004
│ ├── EngineClasses.hpp
│ ├── Generator.cpp
│ ├── GenericTypes.cpp
│ ├── NamesStore.cpp
│ └── ObjectsStore.cpp
├── UnrealTournament3
│ ├── EngineClasses.hpp
│ ├── Generator.cpp
│ ├── GenericTypes.cpp
│ ├── NamesStore.cpp
│ └── ObjectsStore.cpp
└── UnrealTournament4
│ ├── EngineClasses.hpp
│ ├── Generator.cpp
│ ├── GenericTypes.cpp
│ ├── NamesStore.cpp
│ └── ObjectsStore.cpp
├── TribesAscend.vcxproj
├── TribesAscend.vcxproj.filters
├── Unreal.vcxproj
├── Unreal.vcxproj.filters
├── Unreal2.vcxproj
├── Unreal2.vcxproj.filters
├── UnrealEngine1.vcxproj
├── UnrealEngine1.vcxproj.filters
├── UnrealEngine2.vcxproj
├── UnrealEngine2.vcxproj.filters
├── UnrealEngine3.vcxproj
├── UnrealEngine3.vcxproj.filters
├── UnrealEngine4.vcxproj
├── UnrealEngine4.vcxproj.filters
├── UnrealEngineSDKGenerator.sln
├── UnrealTournament2004.vcxproj
├── UnrealTournament2004.vcxproj.filters
├── UnrealTournament3.vcxproj
├── UnrealTournament3.vcxproj.filters
├── UnrealTournament4.vcxproj
└── UnrealTournament4.vcxproj.filters
/ARKSurvivalEvolved.vcxproj.filters:
--------------------------------------------------------------------------------
1 |
2 |
3 |
4 |
5 | Engine
6 |
7 |
8 |
9 |
10 |
11 |
12 |
13 |
14 |
15 |
16 | Engine
17 |
18 |
19 | Engine
20 |
21 |
22 | Engine
23 |
24 |
25 | Engine
26 |
27 |
28 | Engine\UE4
29 |
30 |
31 | Engine
32 |
33 |
34 | Engine
35 |
36 |
37 | Engine\UE4
38 |
39 |
40 | Engine\UE4
41 |
42 |
43 | Engine
44 |
45 |
46 |
47 |
48 | {5fb70966-5939-4bcf-b096-6b909315ed0d}
49 |
50 |
51 | {77ff275a-574c-4908-9ae5-345300346f41}
52 |
53 |
54 |
55 |
56 |
57 |
58 | Engine\UE4
59 |
60 |
61 | Engine
62 |
63 |
64 | Engine
65 |
66 |
67 | Engine
68 |
69 |
70 | Engine
71 |
72 |
73 | Engine
74 |
75 |
76 | Engine
77 |
78 |
79 | Engine\UE4
80 |
81 |
82 | Engine
83 |
84 |
85 | Engine
86 |
87 |
88 | Engine
89 |
90 |
91 | Engine
92 |
93 |
94 |
--------------------------------------------------------------------------------
/AllPointsBulletin.vcxproj.filters:
--------------------------------------------------------------------------------
1 |
2 |
3 |
4 |
5 | Engine
6 |
7 |
8 |
9 |
10 |
11 |
12 |
13 |
14 |
15 |
16 | Engine
17 |
18 |
19 | Engine
20 |
21 |
22 | Engine
23 |
24 |
25 | Engine
26 |
27 |
28 | Engine\UE3
29 |
30 |
31 | Engine
32 |
33 |
34 | Engine
35 |
36 |
37 | Engine\UE3
38 |
39 |
40 | Engine\UE3
41 |
42 |
43 | Engine
44 |
45 |
46 |
47 |
48 | {5fb70966-5939-4bcf-b096-6b909315ed0d}
49 |
50 |
51 | {77ff275a-574c-4908-9ae5-345300346f41}
52 |
53 |
54 |
55 |
56 |
57 |
58 | Engine\UE3
59 |
60 |
61 | Engine
62 |
63 |
64 | Engine
65 |
66 |
67 | Engine
68 |
69 |
70 | Engine
71 |
72 |
73 | Engine
74 |
75 |
76 | Engine
77 |
78 |
79 | Engine\UE3
80 |
81 |
82 | Engine
83 |
84 |
85 | Engine
86 |
87 |
88 | Engine
89 |
90 |
91 | Engine
92 |
93 |
94 |
--------------------------------------------------------------------------------
/AloneInTheDarkIllumination.vcxproj.filters:
--------------------------------------------------------------------------------
1 |
2 |
3 |
4 |
5 | Engine
6 |
7 |
8 |
9 |
10 |
11 |
12 |
13 |
14 |
15 |
16 | Engine
17 |
18 |
19 | Engine
20 |
21 |
22 | Engine
23 |
24 |
25 | Engine
26 |
27 |
28 | Engine\UE4
29 |
30 |
31 | Engine
32 |
33 |
34 | Engine
35 |
36 |
37 | Engine\UE4
38 |
39 |
40 | Engine\UE4
41 |
42 |
43 | Engine
44 |
45 |
46 |
47 |
48 | {5fb70966-5939-4bcf-b096-6b909315ed0d}
49 |
50 |
51 | {77ff275a-574c-4908-9ae5-345300346f41}
52 |
53 |
54 |
55 |
56 |
57 |
58 | Engine\UE4
59 |
60 |
61 | Engine
62 |
63 |
64 | Engine
65 |
66 |
67 | Engine
68 |
69 |
70 | Engine
71 |
72 |
73 | Engine
74 |
75 |
76 | Engine
77 |
78 |
79 | Engine\UE4
80 |
81 |
82 | Engine
83 |
84 |
85 | Engine
86 |
87 |
88 | Engine
89 |
90 |
91 | Engine
92 |
93 |
94 |
--------------------------------------------------------------------------------
/BlazingSails.vcxproj.filters:
--------------------------------------------------------------------------------
1 |
2 |
3 |
4 |
5 | Engine
6 |
7 |
8 | Engine
9 |
10 |
11 | Engine
12 |
13 |
14 | Engine
15 |
16 |
17 | Engine
18 |
19 |
20 | Engine\UE4
21 |
22 |
23 | Engine
24 |
25 |
26 | Engine
27 |
28 |
29 | Engine\UE4
30 |
31 |
32 | Engine
33 |
34 |
35 |
36 |
37 |
38 |
39 | Engine\UE4
40 |
41 |
42 | Engine
43 |
44 |
45 |
46 |
47 | {5fb70966-5939-4bcf-b096-6b909315ed0d}
48 |
49 |
50 | {77ff275a-574c-4908-9ae5-345300346f41}
51 |
52 |
53 |
54 |
55 | Engine\UE4
56 |
57 |
58 | Engine
59 |
60 |
61 | Engine
62 |
63 |
64 | Engine
65 |
66 |
67 | Engine
68 |
69 |
70 | Engine
71 |
72 |
73 | Engine
74 |
75 |
76 | Engine
77 |
78 |
79 | Engine
80 |
81 |
82 | Engine
83 |
84 |
85 | Engine
86 |
87 |
88 |
89 | Engine\UE4
90 |
91 |
92 | Engine
93 |
94 |
95 |
--------------------------------------------------------------------------------
/Borderlands2.vcxproj.filters:
--------------------------------------------------------------------------------
1 |
2 |
3 |
4 |
5 | Engine
6 |
7 |
8 |
9 |
10 |
11 |
12 |
13 |
14 |
15 |
16 | Engine
17 |
18 |
19 | Engine
20 |
21 |
22 | Engine
23 |
24 |
25 | Engine
26 |
27 |
28 | Engine\UE3
29 |
30 |
31 | Engine
32 |
33 |
34 | Engine
35 |
36 |
37 | Engine\UE3
38 |
39 |
40 | Engine\UE3
41 |
42 |
43 | Engine
44 |
45 |
46 |
47 |
48 | {5fb70966-5939-4bcf-b096-6b909315ed0d}
49 |
50 |
51 | {77ff275a-574c-4908-9ae5-345300346f41}
52 |
53 |
54 |
55 |
56 |
57 |
58 | Engine\UE3
59 |
60 |
61 | Engine
62 |
63 |
64 | Engine
65 |
66 |
67 | Engine
68 |
69 |
70 | Engine
71 |
72 |
73 | Engine
74 |
75 |
76 | Engine
77 |
78 |
79 | Engine\UE3
80 |
81 |
82 | Engine
83 |
84 |
85 | Engine
86 |
87 |
88 | Engine
89 |
90 |
91 | Engine
92 |
93 |
94 |
--------------------------------------------------------------------------------
/CreateNewProject.bat:
--------------------------------------------------------------------------------
1 | @echo off
2 |
3 | echo copy from:
4 | set /p from=
5 | echo new name:
6 | set /p to=
7 |
8 | powershell -executionpolicy unrestricted ./CreateNewProject.ps1 %from% %to%
--------------------------------------------------------------------------------
/CreateNewProject.ps1:
--------------------------------------------------------------------------------
1 | Write-Host "Create $($args[1]) from $($args[0])"
2 |
3 | $source = @"
4 | using System.IO;
5 |
6 | namespace UnrealEngineSDKGenerator
7 | {
8 | public class Program
9 | {
10 | public static void Create(string oldname, string newname)
11 | {
12 | DirectoryInfo newdir = new DirectoryInfo(Path.Combine("./Target", newname));
13 | newdir.Create();
14 | CopyFilesRecursively(new DirectoryInfo(Path.Combine("./Target", oldname)), newdir);
15 |
16 | File.WriteAllText(newname + ".vcxproj", File.ReadAllText(oldname + ".vcxproj").Replace(oldname, newname));
17 | File.WriteAllText(newname + ".vcxproj.filters", File.ReadAllText(oldname + ".vcxproj.filters").Replace(oldname, newname));
18 | }
19 |
20 | public static void CopyFilesRecursively(DirectoryInfo source, DirectoryInfo target)
21 | {
22 | foreach (DirectoryInfo dir in source.GetDirectories())
23 | CopyFilesRecursively(dir, target.CreateSubdirectory(dir.Name));
24 | foreach (FileInfo file in source.GetFiles())
25 | file.CopyTo(Path.Combine(target.FullName, file.Name));
26 | }
27 | }
28 | }
29 | "@
30 |
31 | Add-Type -TypeDefinition $Source -Language CSharp
32 |
33 | [UnrealEngineSDKGenerator.Program]::Create($args[0], $args[1])
--------------------------------------------------------------------------------
/DeepRockGalactic.vcxproj.filters:
--------------------------------------------------------------------------------
1 |
2 |
3 |
4 |
5 | Engine
6 |
7 |
8 | Engine
9 |
10 |
11 | Engine
12 |
13 |
14 | Engine
15 |
16 |
17 | Engine
18 |
19 |
20 | Engine\UE4
21 |
22 |
23 | Engine
24 |
25 |
26 | Engine
27 |
28 |
29 | Engine\UE4
30 |
31 |
32 | Engine
33 |
34 |
35 |
36 |
37 |
38 |
39 | Engine\UE4
40 |
41 |
42 |
43 |
44 | {5fb70966-5939-4bcf-b096-6b909315ed0d}
45 |
46 |
47 | {77ff275a-574c-4908-9ae5-345300346f41}
48 |
49 |
50 |
51 |
52 | Engine\UE4
53 |
54 |
55 | Engine
56 |
57 |
58 | Engine
59 |
60 |
61 | Engine
62 |
63 |
64 | Engine
65 |
66 |
67 | Engine
68 |
69 |
70 | Engine
71 |
72 |
73 | Engine
74 |
75 |
76 | Engine
77 |
78 |
79 | Engine
80 |
81 |
82 | Engine
83 |
84 |
85 |
86 | Engine\UE4
87 |
88 |
89 |
--------------------------------------------------------------------------------
/Engine/ExceptionHandler.cpp:
--------------------------------------------------------------------------------
1 | #include "ExceptionHandler.hpp"
2 |
3 | namespace ExceptionHandler
4 | {
5 | void Init()
6 | {
7 | ExceptionHandler = AddVectoredExceptionHandler(1, VectoredHandler);
8 | }
9 |
10 | void Destroy()
11 | {
12 | if (ExceptionHandler)
13 | {
14 | RemoveVectoredExceptionHandler(ExceptionHandler);
15 | }
16 | }
17 |
18 | long VectoredHandler(_EXCEPTION_POINTERS* exceptionInfo)
19 | {
20 | if(IsKnownException(exceptionInfo->ExceptionRecord->ExceptionCode))
21 | {
22 | const auto moduleAddress = reinterpret_cast(GetModuleHandleW(nullptr));
23 | const auto exceptionAddress = reinterpret_cast(exceptionInfo->ExceptionRecord->ExceptionAddress);
24 | Logger::Log("Exception code: %d\nException address: 0x%P\nAddress in the DLL: 0x%P",
25 | ExceptionCodeToString(exceptionInfo->ExceptionRecord->ExceptionCode),
26 | reinterpret_cast(exceptionAddress),
27 | reinterpret_cast(exceptionAddress - moduleAddress));
28 | }
29 | return EXCEPTION_CONTINUE_SEARCH;
30 | }
31 |
32 | std::string ExceptionCodeToString(const DWORD& exceptionCode)
33 | {
34 | switch (exceptionCode)
35 | {
36 | case EXCEPTION_ACCESS_VIOLATION:
37 | return "EXCEPTION_ACCESS_VIOLATION";
38 | case EXCEPTION_ARRAY_BOUNDS_EXCEEDED:
39 | return "EXCEPTION_ARRAY_BOUNDS_EXCEEDED";
40 | case EXCEPTION_BREAKPOINT:
41 | return "EXCEPTION_BREAKPOINT";
42 | case EXCEPTION_DATATYPE_MISALIGNMENT:
43 | return "EXCEPTION_DATATYPE_MISALIGNMENT";
44 | case EXCEPTION_FLT_DENORMAL_OPERAND:
45 | return "EXCEPTION_FLT_DENORMAL_OPERAND";
46 | case EXCEPTION_FLT_DIVIDE_BY_ZERO:
47 | return "EXCEPTION_FLT_DIVIDE_BY_ZERO";
48 | case EXCEPTION_FLT_INEXACT_RESULT:
49 | return "EXCEPTION_FLT_INEXACT_RESULT";
50 | case EXCEPTION_FLT_INVALID_OPERATION:
51 | return "EXCEPTION_FLT_INVALID_OPERATION";
52 | case EXCEPTION_FLT_OVERFLOW:
53 | return "EXCEPTION_FLT_OVERFLOW";
54 | case EXCEPTION_FLT_STACK_CHECK:
55 | return "EXCEPTION_FLT_STACK_CHECK";
56 | case EXCEPTION_FLT_UNDERFLOW:
57 | return "EXCEPTION_FLT_UNDERFLOW";
58 | case EXCEPTION_ILLEGAL_INSTRUCTION:
59 | return "EXCEPTION_ILLEGAL_INSTRUCTION";
60 | case EXCEPTION_IN_PAGE_ERROR:
61 | return "EXCEPTION_IN_PAGE_ERROR";
62 | case EXCEPTION_INT_DIVIDE_BY_ZERO:
63 | return "EXCEPTION_INT_DIVIDE_BY_ZERO";
64 | case EXCEPTION_INT_OVERFLOW:
65 | return "EXCEPTION_INT_OVERFLOW";
66 | case EXCEPTION_INVALID_DISPOSITION:
67 | return "EXCEPTION_INVALID_DISPOSITION";
68 | case EXCEPTION_NONCONTINUABLE_EXCEPTION:
69 | return "EXCEPTION_NONCONTINUABLE_EXCEPTION";
70 | case EXCEPTION_PRIV_INSTRUCTION:
71 | return "EXCEPTION_PRIV_INSTRUCTION";
72 | case EXCEPTION_SINGLE_STEP:
73 | return "EXCEPTION_SINGLE_STEP";
74 | case EXCEPTION_STACK_OVERFLOW:
75 | return "EXCEPTION_STACK_OVERFLOW";
76 | default:
77 | return "UNKNOWN EXCEPTION";
78 | }
79 | }
80 |
81 |
82 | bool IsKnownException(const DWORD& exceptionCode)
83 | {
84 | switch (exceptionCode)
85 | {
86 | case EXCEPTION_ACCESS_VIOLATION:
87 | case EXCEPTION_ARRAY_BOUNDS_EXCEEDED:
88 | case EXCEPTION_BREAKPOINT:
89 | case EXCEPTION_DATATYPE_MISALIGNMENT:
90 | case EXCEPTION_FLT_DENORMAL_OPERAND:
91 | case EXCEPTION_FLT_DIVIDE_BY_ZERO:
92 | case EXCEPTION_FLT_INEXACT_RESULT:
93 | case EXCEPTION_FLT_INVALID_OPERATION:
94 | case EXCEPTION_FLT_OVERFLOW:
95 | case EXCEPTION_FLT_STACK_CHECK:
96 | case EXCEPTION_FLT_UNDERFLOW:
97 | case EXCEPTION_ILLEGAL_INSTRUCTION:
98 | case EXCEPTION_IN_PAGE_ERROR:
99 | case EXCEPTION_INT_DIVIDE_BY_ZERO:
100 | case EXCEPTION_INT_OVERFLOW:
101 | case EXCEPTION_INVALID_DISPOSITION:
102 | case EXCEPTION_NONCONTINUABLE_EXCEPTION:
103 | case EXCEPTION_PRIV_INSTRUCTION:
104 | case EXCEPTION_SINGLE_STEP:
105 | case EXCEPTION_STACK_OVERFLOW:
106 | return true;
107 | default:
108 | return false;
109 | }
110 | }
111 | }
112 |
--------------------------------------------------------------------------------
/Engine/ExceptionHandler.hpp:
--------------------------------------------------------------------------------
1 | #pragma once
2 |
3 | #include
4 |
5 | #include "Logger.hpp"
6 |
7 | namespace ExceptionHandler
8 | {
9 | static void* ExceptionHandler;
10 |
11 | void Init();
12 | void Destroy();
13 | long VectoredHandler(struct _EXCEPTION_POINTERS *exceptionInfo);
14 | std::string ExceptionCodeToString(const DWORD& exceptionCode);
15 | bool IsKnownException(const DWORD& exceptionCode);
16 | }
--------------------------------------------------------------------------------
/Engine/Logger.cpp:
--------------------------------------------------------------------------------
1 | #include "Logger.hpp"
2 |
3 | std::ostream* Logger::stream = nullptr;
4 |
5 | void Logger::SetStream(std::ostream* _stream)
6 | {
7 | stream = _stream;
8 | }
9 |
10 | void Logger::Log(const std::string& message)
11 | {
12 | if (stream != nullptr)
13 | {
14 | (*stream) << message << '\n' << std::flush;
15 | }
16 | }
17 |
--------------------------------------------------------------------------------
/Engine/Logger.hpp:
--------------------------------------------------------------------------------
1 | #pragma once
2 |
3 | #include
4 | #include
5 | #include
6 |
7 | #include "tinyformat.h"
8 |
9 | class Logger
10 | {
11 | public:
12 |
13 | ///
14 | /// Sets the stream where the output goes to.
15 | ///
16 | /// [in] The stream.
17 | static void SetStream(std::ostream* stream);
18 |
19 | ///
20 | /// Logs the given message.
21 | ///
22 | /// The message.
23 | static void Log(const std::string& message);
24 |
25 | ///
26 | /// Formats and logs the given message.
27 | ///
28 | /// Type of the arguments.
29 | /// Describes the format to use.
30 | /// Variable arguments providing the arguments.
31 | template
32 | static void Log(const char* fmt, const Args&... args)
33 | {
34 | Log(tfm::format(fmt, args...));
35 | }
36 |
37 | private:
38 | static std::ostream *stream;
39 | };
40 |
--------------------------------------------------------------------------------
/Engine/NameValidator.cpp:
--------------------------------------------------------------------------------
1 | #include "NameValidator.hpp"
2 |
3 | #include
4 | #include
5 |
6 | #include "ObjectsStore.hpp"
7 |
8 | std::string MakeValidName(std::string&& name)
9 | {
10 | /*static std::unordered_set disallowedChars = {
11 | ' ', '!', '"', '#', '$', '%', '&', '\'', '(', ')', '*', '+', ',', '-', '.', '/',
12 | ':', ';', '<', '=', '>', '?', '@', '[', '\\', ']', '^', '`', '{', '|', '}', '~'
13 | };*/
14 |
15 | static std::unordered_set disallowedWords = {
16 | "alignas", "alignof", "and", "and_eq", "asm", "auto", "bitand", "bitor",
17 | "bool", "break", "case", "catch", "char", "char16_t", "char32_t", "class",
18 | "compl", "const", "constexpr", "const_cast", "continue", "decltype", "default",
19 | "delete", "do", "double", "dynamic_cast", "else", "enum", "explicit", "export",
20 | "extern", "false", "float", "for", "friend", "goto", "if", "inline", "int",
21 | "long", "mutable", "namespace", "new", "noexcept", "not", "not_eq", "nullptr",
22 | "operator", "or", "or_eq", "private", "protected", "public", "register",
23 | "reinterpret_cast", "return", "short", "signed", "sizeof", "static", "static_assert",
24 | "static_cast", "struct", "switch", "template", "this", "thread_local", "throw",
25 | "true", "try", "typedef", "typeid", "typename", "union", "unsigned", "using",
26 | "virtual", "void", "volatile", "wchar_t", "while", "xor", "xor_eq"
27 | };
28 |
29 | std::string valid(name);
30 |
31 |
32 |
33 |
34 | for (auto i = 0u; i < name.length(); ++i)
35 | {
36 | if (!((valid[i] >= '0' && valid[i] <= '9') ||
37 | (valid[i] >= 'A' && valid[i] <= 'Z') ||
38 | (valid[i] >= 'a' && valid[i] <= 'z')))
39 | {
40 | valid[i] = '_';
41 | }
42 |
43 | /*if (disallowedChars.find(valid[i]) != disallowedChars.end())
44 | {
45 | valid[i] = '_';
46 | }*/
47 | }
48 |
49 | if (!valid.empty())
50 | {
51 | if (std::isdigit(valid[0]) || disallowedWords.find(valid) != disallowedWords.end())
52 | {
53 | valid = '_' + valid;
54 | }
55 | }
56 |
57 | return valid;
58 | }
59 |
60 | std::string SimplifyEnumName(std::string&& name)
61 | {
62 | const auto index = name.find_last_of(':');
63 | if (index == std::string::npos)
64 | {
65 | return name;
66 | }
67 |
68 | return name.substr(index + 1);
69 | }
70 |
71 | template
72 | std::string MakeUniqueCppNameImpl(const T& t)
73 | {
74 | std::string name;
75 | if (ObjectsStore().CountObjects(t.GetName()) > 1)
76 | {
77 | name += MakeValidName(t.GetOuter().GetName()) + "_";
78 | }
79 | return name + MakeValidName(t.GetName());
80 | }
81 |
82 | std::string MakeUniqueCppName(const UEConst& c)
83 | {
84 | return MakeUniqueCppNameImpl(c);
85 | }
86 |
87 | std::string MakeUniqueCppName(const UEEnum& e)
88 | {
89 | auto name = MakeUniqueCppNameImpl(e);
90 | if (!name.empty() && name[0] != 'E')
91 | {
92 | name = 'E' + name;
93 | }
94 | return name;
95 | }
96 |
97 | std::string MakeUniqueCppName(const UEStruct& ss)
98 | {
99 | std::string name;
100 | if (ObjectsStore().CountObjects(ss.GetName()) > 1)
101 | {
102 | name += MakeValidName(ss.GetOuter().GetNameCPP()) + "_";
103 | }
104 | return name + MakeValidName(ss.GetNameCPP());
105 | }
106 |
--------------------------------------------------------------------------------
/Engine/NameValidator.hpp:
--------------------------------------------------------------------------------
1 | #pragma once
2 |
3 | #include
4 |
5 | class UEConst;
6 | class UEEnum;
7 | class UEStruct;
8 |
9 | ///
10 | /// Makes valid C++ name from the given name.
11 | ///
12 | /// The name to process.
13 | /// A valid C++ name.
14 | std::string MakeValidName(std::string&& name);
15 |
16 | std::string SimplifyEnumName(std::string&& name);
17 |
18 | std::string MakeUniqueCppName(const UEConst& c);
19 | std::string MakeUniqueCppName(const UEEnum& e);
20 | std::string MakeUniqueCppName(const UEStruct& ss);
21 |
--------------------------------------------------------------------------------
/Engine/NamesStore.cpp:
--------------------------------------------------------------------------------
1 | #include "NamesStore.hpp"
2 |
3 | NamesIterator NamesStore::begin()
4 | {
5 | return NamesIterator(*this, 0);
6 | }
7 |
8 | NamesIterator NamesStore::begin() const
9 | {
10 | return NamesIterator(*this, 0);
11 | }
12 |
13 | NamesIterator NamesStore::end()
14 | {
15 | return NamesIterator(*this);
16 | }
17 |
18 | NamesIterator NamesStore::end() const
19 | {
20 | return NamesIterator(*this);
21 | }
22 |
23 | NamesIterator::NamesIterator(const NamesStore& _store)
24 | : store(_store),
25 | index(_store.GetNamesNum())
26 | {
27 | }
28 |
29 | NamesIterator::NamesIterator(const NamesStore& _store, size_t _index)
30 | : store(_store),
31 | index(_index)
32 | {
33 | }
34 |
35 | void NamesIterator::swap(NamesIterator& other) noexcept
36 | {
37 | std::swap(index, other.index);
38 | }
39 |
40 | NamesIterator& NamesIterator::operator++()
41 | {
42 | for (++index; index < store.GetNamesNum(); ++index)
43 | {
44 | if (store.IsValid(index))
45 | {
46 | break;
47 | }
48 | }
49 | return *this;
50 | }
51 |
52 | NamesIterator NamesIterator::operator++ (int)
53 | {
54 | auto tmp(*this);
55 | ++(*this);
56 | return tmp;
57 | }
58 |
59 | bool NamesIterator::operator==(const NamesIterator& rhs) const
60 | {
61 | return index == rhs.index;
62 | }
63 |
64 | bool NamesIterator::operator!=(const NamesIterator& rhs) const
65 | {
66 | return index != rhs.index;
67 | }
68 |
69 | UENameInfo NamesIterator::operator*() const
70 | {
71 | return { index, store.GetById(index) };
72 | }
73 |
74 | UENameInfo NamesIterator::operator->() const
75 | {
76 | return { index, store.GetById(index) };
77 | }
--------------------------------------------------------------------------------
/Engine/NamesStore.hpp:
--------------------------------------------------------------------------------
1 | #pragma once
2 |
3 | #include
4 |
5 | #include "GenericTypes.hpp"
6 |
7 | class NamesIterator;
8 |
9 | class NamesStore
10 | {
11 | friend NamesIterator;
12 |
13 | public:
14 |
15 | ///
16 | /// Initializes this object.
17 | ///
18 | /// true if it succeeds, false if it fails.
19 | static bool Initialize();
20 |
21 | /// Gets the address of the global names store.
22 | /// The address of the global names store.
23 | static void* GetAddress();
24 |
25 | NamesIterator begin();
26 |
27 | NamesIterator begin() const;
28 |
29 | NamesIterator end();
30 |
31 | NamesIterator end() const;
32 |
33 | ///
34 | /// Gets the number of available names.
35 | ///
36 | /// The number of names.
37 | size_t GetNamesNum() const;
38 |
39 | ///
40 | /// Test if the given id is valid.
41 | ///
42 | /// The identifier.
43 | /// true if valid, false if not.
44 | bool IsValid(size_t id) const;
45 |
46 | ///
47 | /// Gets a name by id.
48 | ///
49 | /// The identifier.
50 | /// The name.
51 | std::string GetById(size_t id) const;
52 | };
53 |
54 | struct UENameInfo
55 | {
56 | size_t Index;
57 | std::string Name;
58 | };
59 |
60 | class NamesIterator : public std::iterator
61 | {
62 | const NamesStore& store;
63 | size_t index;
64 |
65 | public:
66 | NamesIterator(const NamesStore& store);
67 |
68 | explicit NamesIterator(const NamesStore& store, size_t index);
69 |
70 | void swap(NamesIterator& other) noexcept;
71 |
72 | NamesIterator& operator++();
73 |
74 | NamesIterator operator++ (int);
75 |
76 | bool operator==(const NamesIterator& rhs) const;
77 |
78 | bool operator!=(const NamesIterator& rhs) const;
79 |
80 | UENameInfo operator*() const;
81 |
82 | UENameInfo operator->() const;
83 | };
84 |
--------------------------------------------------------------------------------
/Engine/ObjectsStore.cpp:
--------------------------------------------------------------------------------
1 | #include "ObjectsStore.hpp"
2 | #include
3 |
4 | ObjectsIterator ObjectsStore::begin()
5 | {
6 | return ObjectsIterator(*this, 0);
7 | }
8 |
9 | ObjectsIterator ObjectsStore::begin() const
10 | {
11 | return ObjectsIterator(*this, 0);
12 | }
13 |
14 | ObjectsIterator ObjectsStore::end()
15 | {
16 | return ObjectsIterator(*this);
17 | }
18 |
19 | ObjectsIterator ObjectsStore::end() const
20 | {
21 | return ObjectsIterator(*this);
22 | }
23 |
24 | UEClass ObjectsStore::FindClass(const std::string& name) const
25 | {
26 | for (auto obj : *this)
27 | {
28 | if (obj.GetFullName() == name)
29 | {
30 | return obj.Cast();
31 | }
32 | }
33 | return UEClass(nullptr);
34 | }
35 |
36 | ObjectsIterator::ObjectsIterator(const ObjectsStore& _store)
37 | : store(_store),
38 | index(_store.GetObjectsNum())
39 | {
40 | }
41 |
42 | ObjectsIterator::ObjectsIterator(const ObjectsStore& _store, size_t _index)
43 | : store(_store),
44 | index(_index),
45 | current(_store.GetById(_index))
46 | {
47 | }
48 |
49 | ObjectsIterator::ObjectsIterator(const ObjectsIterator& other)
50 | : store(other.store),
51 | index(other.index),
52 | current(other.current)
53 | {
54 | }
55 |
56 | ObjectsIterator::ObjectsIterator(ObjectsIterator&& other) noexcept
57 | : store(other.store),
58 | index(other.index),
59 | current(other.current)
60 | {
61 | }
62 |
63 | ObjectsIterator& ObjectsIterator::operator=(const ObjectsIterator& rhs)
64 | {
65 | index = rhs.index;
66 | current = rhs.current;
67 | return *this;
68 | }
69 |
70 | void ObjectsIterator::swap(ObjectsIterator& other) noexcept
71 | {
72 | std::swap(index, other.index);
73 | std::swap(current, other.current);
74 | }
75 |
76 | ObjectsIterator& ObjectsIterator::operator++()
77 | {
78 | current = UEObject();
79 |
80 | for (++index; index < store.GetObjectsNum(); ++index)
81 | {
82 | current = store.GetById(index);
83 | if (current != nullptr && current.IsValid())
84 | {
85 | break;
86 | }
87 | }
88 | return *this;
89 | }
90 |
91 | ObjectsIterator ObjectsIterator::operator++(int)
92 | {
93 | auto tmp(*this);
94 | ++(*this);
95 | return tmp;
96 | }
97 |
98 | bool ObjectsIterator::operator==(const ObjectsIterator& rhs) const
99 | {
100 | return index == rhs.index;
101 | }
102 |
103 | bool ObjectsIterator::operator!=(const ObjectsIterator& rhs) const
104 | {
105 | return index != rhs.index;
106 | }
107 |
108 | UEObject ObjectsIterator::operator*() const
109 | {
110 | assert(current.IsValid() && "ObjectsIterator::current is not valid!");
111 |
112 | return current;
113 | }
114 |
115 | UEObject ObjectsIterator::operator->() const
116 | {
117 | return operator*();
118 | }
--------------------------------------------------------------------------------
/Engine/ObjectsStore.hpp:
--------------------------------------------------------------------------------
1 | #pragma once
2 |
3 | #include
4 |
5 | #include "GenericTypes.hpp"
6 |
7 | class ObjectsIterator;
8 |
9 | class ObjectsStore
10 | {
11 | public:
12 | ///
13 | /// Initializes this object.
14 | ///
15 | ///
16 | /// true if it succeeds, false if it fails.
17 | ///
18 | static bool Initialize();
19 |
20 | /// Gets the address of the global objects store.
21 | /// The address of the global objects store.
22 | static void* GetAddress();
23 |
24 | ObjectsIterator begin();
25 |
26 | ObjectsIterator begin() const;
27 |
28 | ObjectsIterator end();
29 |
30 | ObjectsIterator end() const;
31 |
32 | ///
33 | /// Gets the number of available objects.
34 | ///
35 | /// The number of objects.
36 | size_t GetObjectsNum() const;
37 |
38 | ///
39 | /// Gets the object by id.
40 | ///
41 | /// The identifier.
42 | /// The object.
43 | UEObject GetById(size_t id) const;
44 |
45 | ///
46 | /// Searches for the first class with the given name.
47 | ///
48 | /// The name of the class.
49 | /// The found class which is not valid if no class could be found.
50 | UEClass FindClass(const std::string& name) const;
51 |
52 | /// Count objects which have the same name and type.
53 | /// Type of the object.
54 | /// The name to search for.
55 | /// The number of objects which share a name.
56 | template
57 | size_t CountObjects(const std::string& name) const
58 | {
59 | static std::unordered_map cache;
60 |
61 | auto it = cache.find(name);
62 | if (it != std::end(cache))
63 | {
64 | return it->second;
65 | }
66 |
67 | size_t count = 0;
68 | for (auto obj : *this)
69 | {
70 | if (obj.IsA() && obj.GetName() == name)
71 | {
72 | ++count;
73 | }
74 | }
75 |
76 | cache[name] = count;
77 |
78 | return count;
79 | }
80 | };
81 |
82 | /// Holds information about an object.
83 | struct UEObjectInfo
84 | {
85 | /// Zero-based index of the object in the global objects store.
86 | size_t Index;
87 |
88 | /// The object.
89 | UEObject Object;
90 | };
91 |
92 | /// An iterator for objects.
93 | class ObjectsIterator : public std::iterator
94 | {
95 | const ObjectsStore& store;
96 | size_t index;
97 | UEObject current;
98 |
99 | public:
100 |
101 | /// Constructor.
102 | /// The store to iterate.
103 | ObjectsIterator(const ObjectsStore& store);
104 |
105 | /// Constructor.
106 | /// The store to iterate.
107 | /// Zero-based start index.
108 | explicit ObjectsIterator(const ObjectsStore& store, size_t index);
109 |
110 | ObjectsIterator(const ObjectsIterator& other);
111 | ObjectsIterator(ObjectsIterator&& other) noexcept;
112 |
113 | ObjectsIterator& operator=(const ObjectsIterator& rhs);
114 |
115 | void swap(ObjectsIterator& other) noexcept;
116 |
117 | ObjectsIterator& operator++();
118 |
119 | ObjectsIterator operator++ (int);
120 |
121 | bool operator==(const ObjectsIterator& rhs) const;
122 |
123 | bool operator!=(const ObjectsIterator& rhs) const;
124 |
125 | UEObject operator*() const;
126 |
127 | UEObject operator->() const;
128 | };
129 |
--------------------------------------------------------------------------------
/Engine/PatternFinder.cpp:
--------------------------------------------------------------------------------
1 | #include "PatternFinder.hpp"
2 |
3 | #include
4 | #include
5 |
6 | uintptr_t FindPattern(HMODULE module, const unsigned char* pattern, const char* mask)
7 | {
8 | MODULEINFO info = { };
9 | GetModuleInformation(GetCurrentProcess(), module, &info, sizeof(MODULEINFO));
10 |
11 | return FindPattern(reinterpret_cast(module), info.SizeOfImage, pattern, mask);
12 | }
13 |
14 | uintptr_t FindPattern(uintptr_t start, size_t length, const unsigned char* pattern, const char* mask)
15 | {
16 | size_t pos = 0;
17 | const auto maskLength = std::strlen(mask) - 1;
18 |
19 | const auto startAdress = start;
20 | for (auto it = startAdress; it < startAdress + length - maskLength; ++it)
21 | {
22 | if (*reinterpret_cast(it) == pattern[pos] || mask[pos] == '?')
23 | {
24 | if (mask[pos + 1] == '\0')
25 | {
26 | return it - maskLength;
27 | }
28 |
29 | pos++;
30 | }
31 | else
32 | {
33 | pos = 0;
34 | }
35 | }
36 |
37 | return -1;
38 | }
39 |
--------------------------------------------------------------------------------
/Engine/PatternFinder.hpp:
--------------------------------------------------------------------------------
1 | #pragma once
2 |
3 | #include
4 | #include
5 |
6 | ///
7 | /// Searches for the first pattern in the module.
8 | ///
9 | /// The module to scan.
10 | /// The pattern (Example: "\x12\xAB\x34")
11 | /// The mask (Example: "x?x")
12 | /// The address of the found pattern or -1 if the pattern was not found.
13 | uintptr_t FindPattern(HMODULE module, const unsigned char* pattern, const char* mask);
14 |
15 | ///
16 | /// Searches for the first pattern in the memory region.
17 | ///
18 | /// The start address of the memory region to scan.
19 | /// The length of the memory region.
20 | /// The pattern (Example: "\x12\xAB\x34")
21 | /// The mask (Example: "x?x")
22 | /// The address of the found pattern or -1 if the pattern was not found.
23 | uintptr_t FindPattern(uintptr_t start, size_t length, const unsigned char* pattern, const char* mask);
24 |
--------------------------------------------------------------------------------
/Engine/PrintHelper.cpp:
--------------------------------------------------------------------------------
1 | #include "PrintHelper.hpp"
2 |
3 | #include
4 |
5 | #include "IGenerator.hpp"
6 | #include "Package.hpp"
7 |
8 | void PrintFileHeader(std::ostream& os, const std::vector& includes, const bool isHeaderFile)
9 | {
10 | extern IGenerator* generator;
11 |
12 | if (isHeaderFile)
13 | {
14 | os << "#pragma once\n\n";
15 | }
16 |
17 | os << tfm::format("// %s (%s) SDK\n\n", generator->GetGameName(), generator->GetGameVersion())
18 | << tfm::format("#ifdef _MSC_VER\n\t#pragma pack(push, 0x%X)\n#endif\n\n", generator->GetGlobalMemberAlignment());
19 |
20 | if (!includes.empty())
21 | {
22 | for (auto&& i : includes)
23 | {
24 | if (i[0] != '<' && i[0] != '"')
25 | {
26 | os << "#include \"" << i << "\"\n";
27 | }
28 | else
29 | {
30 | os << "#include " << i << "\n";
31 | }
32 | }
33 | os << "\n";
34 | }
35 |
36 | if (!generator->GetNamespaceName().empty())
37 | {
38 | os << "namespace " << generator->GetNamespaceName() << "\n{\n";
39 | }
40 | }
41 |
42 | void PrintFileHeader(std::ostream& os, const bool isHeaderFile)
43 | {
44 | extern IGenerator* generator;
45 |
46 | PrintFileHeader(os, std::vector(), isHeaderFile);
47 | }
48 |
49 | void PrintFileFooter(std::ostream& os)
50 | {
51 | extern IGenerator* generator;
52 |
53 | if (!generator->GetNamespaceName().empty())
54 | {
55 | os << "}\n\n";
56 | }
57 |
58 | os << "#ifdef _MSC_VER\n\t#pragma pack(pop)\n#endif\n";
59 | }
60 |
61 | void PrintSectionHeader(std::ostream& os, const char* name)
62 | {
63 | os << "//---------------------------------------------------------------------------\n"
64 | << "//" << name << "\n"
65 | << "//---------------------------------------------------------------------------\n\n";
66 | }
67 |
68 | std::string GenerateFileName(const FileContentType type, const Package& package)
69 | {
70 | extern IGenerator* generator;
71 |
72 | const char* name;
73 | switch (type)
74 | {
75 | case FileContentType::Structs:
76 | name = "%s_%s_structs.hpp";
77 | break;
78 | case FileContentType::Classes:
79 | name = "%s_%s_classes.hpp";
80 | break;
81 | case FileContentType::Functions:
82 | name = "%s_%s_functions.cpp";
83 | break;
84 | case FileContentType::FunctionParameters:
85 | name = "%s_%s_parameters.hpp";
86 | break;
87 | case FileContentType::Enums:
88 | name = "%s_%s_enums.hpp";
89 | break;
90 | default:
91 | assert(false);
92 | }
93 |
94 | return tfm::format(name, generator->GetGameNameShort(), package.GetName());
95 | }
96 |
--------------------------------------------------------------------------------
/Engine/PrintHelper.hpp:
--------------------------------------------------------------------------------
1 | #pragma once
2 |
3 | #include
4 | #include
5 |
6 | void PrintFileHeader(std::ostream& os, const std::vector& includes, const bool isHeaderFile);
7 |
8 | void PrintFileHeader(std::ostream& os, const bool isHeaderFile);
9 |
10 | void PrintFileFooter(std::ostream& os);
11 |
12 | void PrintSectionHeader(std::ostream& os, const char* name);
13 |
14 | enum class FileContentType
15 | {
16 | Structs,
17 | Classes,
18 | Functions,
19 | FunctionParameters,
20 | Enums
21 | };
22 |
23 | ///
24 | /// Generates a file name composed by the game name and the package object.
25 | ///
26 | /// The type of the file.
27 | ///
28 | /// The generated file name.
29 | ///
30 | std::string GenerateFileName(const FileContentType type, const class Package& package);
31 |
--------------------------------------------------------------------------------
/Engine/UE1/FunctionFlags.cpp:
--------------------------------------------------------------------------------
1 | #include "FunctionFlags.hpp"
2 |
3 | #include
4 | #include
5 | #include
6 |
7 | std::string StringifyFlags(const UEFunctionFlags flags)
8 | {
9 | std::vector buffer;
10 |
11 | if (flags & UEFunctionFlags::Final) { buffer.push_back("Final"); }
12 | if (flags & UEFunctionFlags::Defined) { buffer.push_back("Defined"); }
13 | if (flags & UEFunctionFlags::Iterator) { buffer.push_back("Iterator"); }
14 | if (flags & UEFunctionFlags::Latent) { buffer.push_back("Latent"); }
15 | if (flags & UEFunctionFlags::PreOperator) { buffer.push_back("PreOperator"); }
16 | if (flags & UEFunctionFlags::Singular) { buffer.push_back("Singular"); }
17 | if (flags & UEFunctionFlags::Net) { buffer.push_back("Net"); }
18 | if (flags & UEFunctionFlags::NetReliable) { buffer.push_back("NetReliable"); }
19 | if (flags & UEFunctionFlags::Simulated) { buffer.push_back("Simulated"); }
20 | if (flags & UEFunctionFlags::Exec) { buffer.push_back("Exec"); }
21 | if (flags & UEFunctionFlags::Native) { buffer.push_back("Native"); }
22 | if (flags & UEFunctionFlags::Event) { buffer.push_back("Event"); }
23 | if (flags & UEFunctionFlags::Operator) { buffer.push_back("Operator"); }
24 | if (flags & UEFunctionFlags::Static) { buffer.push_back("Static"); }
25 | if (flags & UEFunctionFlags::HasOptionalParms) { buffer.push_back("HasOptionalParms"); }
26 | if (flags & UEFunctionFlags::Const) { buffer.push_back("Const"); }
27 | if (flags & UEFunctionFlags::Public) { buffer.push_back("Public"); }
28 | if (flags & UEFunctionFlags::Private) { buffer.push_back("Private"); }
29 | if (flags & UEFunctionFlags::Protected) { buffer.push_back("Protected"); }
30 | if (flags & UEFunctionFlags::Delegate) { buffer.push_back("Delegate"); }
31 | if (flags & UEFunctionFlags::NetServer) { buffer.push_back("NetServer"); }
32 | if (flags & UEFunctionFlags::HasOutParms) { buffer.push_back("HasOutParms"); }
33 | if (flags & UEFunctionFlags::HasDefaults) { buffer.push_back("HasDefaults"); }
34 | if (flags & UEFunctionFlags::NetClient) { buffer.push_back("NetClient"); }
35 | if (flags & UEFunctionFlags::DLLImport) { buffer.push_back("DLLImport"); }
36 | if (flags & UEFunctionFlags::K2Call) { buffer.push_back("K2Call"); }
37 | if (flags & UEFunctionFlags::K2Override) { buffer.push_back("K2Override"); }
38 | if (flags & UEFunctionFlags::K2Pure) { buffer.push_back("K2Pure"); }
39 |
40 | switch (buffer.size())
41 | {
42 | case 0:
43 | return std::string();
44 | case 1:
45 | return std::string(buffer[0]);
46 | default:
47 | std::ostringstream os;
48 | std::copy(buffer.begin(), buffer.end() - 1, std::ostream_iterator(os, ", "));
49 | os << *buffer.rbegin();
50 | return os.str();
51 | }
52 | }
--------------------------------------------------------------------------------
/Engine/UE1/FunctionFlags.hpp:
--------------------------------------------------------------------------------
1 | #pragma once
2 |
3 | #include
4 | #include
5 |
6 | enum class UEFunctionFlags : uint32_t
7 | {
8 | Final = 0x00000001,
9 | Defined = 0x00000002,
10 | Iterator = 0x00000004,
11 | Latent = 0x00000008,
12 | PreOperator = 0x00000010,
13 | Singular = 0x00000020,
14 | Net = 0x00000040,
15 | NetReliable = 0x00000080,
16 | Simulated = 0x00000100,
17 | Exec = 0x00000200,
18 | Native = 0x00000400,
19 | Event = 0x00000800,
20 | Operator = 0x00001000,
21 | Static = 0x00002000,
22 | HasOptionalParms = 0x00004000,
23 | Const = 0x00008000,
24 | Public = 0x00020000,
25 | Private = 0x00040000,
26 | Protected = 0x00080000,
27 | Delegate = 0x00100000,
28 | NetServer = 0x00200000,
29 | HasOutParms = 0x00400000,
30 | HasDefaults = 0x00800000,
31 | NetClient = 0x01000000,
32 | DLLImport = 0x02000000,
33 | K2Call = 0x04000000,
34 | K2Override = 0x08000000,
35 | K2Pure = 0x10000000
36 | };
37 |
38 | inline bool operator&(UEFunctionFlags lhs, UEFunctionFlags rhs)
39 | {
40 | return (static_cast>(lhs) & static_cast>(rhs)) == static_cast>(rhs);
41 | }
42 |
43 | std::string StringifyFlags(const UEFunctionFlags flags);
44 |
--------------------------------------------------------------------------------
/Engine/UE1/Package.cpp:
--------------------------------------------------------------------------------
1 | #include "../Package.hpp"
2 |
3 | bool Package::Method::Parameter::MakeType(UEPropertyFlags flags, Type& type)
4 | {
5 | if (flags & UEPropertyFlags::ReturnParm)
6 | {
7 | type = Type::Return;
8 | }
9 | else if (flags & UEPropertyFlags::OutParm)
10 | {
11 | type = Type::Out;
12 | }
13 | else if (flags & UEPropertyFlags::Parm)
14 | {
15 | type = Type::Default;
16 | }
17 | else
18 | {
19 | return false;
20 | }
21 |
22 | return true;
23 | }
--------------------------------------------------------------------------------
/Engine/UE1/PropertyFlags.cpp:
--------------------------------------------------------------------------------
1 | #include "PropertyFlags.hpp"
2 |
3 | #include
4 | #include
5 | #include
6 |
7 | std::string StringifyFlags(const UEPropertyFlags flags)
8 | {
9 | std::vector buffer;
10 |
11 | if (flags & UEPropertyFlags::Edit) { buffer.push_back("Edit"); }
12 | if (flags & UEPropertyFlags::Const) { buffer.push_back("Const"); }
13 | if (flags & UEPropertyFlags::Input) { buffer.push_back("Input"); }
14 | if (flags & UEPropertyFlags::ExportObject) { buffer.push_back("ExportObject"); }
15 | if (flags & UEPropertyFlags::OptionalParm) { buffer.push_back("OptionalParm"); }
16 | if (flags & UEPropertyFlags::Net) { buffer.push_back("Net"); }
17 | if (flags & UEPropertyFlags::EditFixedSize) { buffer.push_back("EditFixedSize"); }
18 | if (flags & UEPropertyFlags::Parm) { buffer.push_back("Parm"); }
19 | if (flags & UEPropertyFlags::OutParm) { buffer.push_back("OutParm"); }
20 | if (flags & UEPropertyFlags::SkipParm) { buffer.push_back("SkipParm"); }
21 | if (flags & UEPropertyFlags::ReturnParm) { buffer.push_back("ReturnParm"); }
22 | if (flags & UEPropertyFlags::CoerceParm) { buffer.push_back("CoerceParm"); }
23 | if (flags & UEPropertyFlags::Native) { buffer.push_back("Native"); }
24 | if (flags & UEPropertyFlags::Transient) { buffer.push_back("Transient"); }
25 | if (flags & UEPropertyFlags::Config) { buffer.push_back("Config"); }
26 | if (flags & UEPropertyFlags::Localized) { buffer.push_back("Localized"); }
27 | if (flags & UEPropertyFlags::EditConst) { buffer.push_back("EditConst"); }
28 | if (flags & UEPropertyFlags::GlobalConfig) { buffer.push_back("GlobalConfig"); }
29 | if (flags & UEPropertyFlags::Component) { buffer.push_back("Component"); }
30 | if (flags & UEPropertyFlags::AlwaysInit) { buffer.push_back("AlwaysInit"); }
31 | if (flags & UEPropertyFlags::DuplicateTransient) { buffer.push_back("DuplicateTransient"); }
32 | if (flags & UEPropertyFlags::NeedCtorLink) { buffer.push_back("NeedCtorLink"); }
33 | if (flags & UEPropertyFlags::NoExport) { buffer.push_back("NoExport"); }
34 | if (flags & UEPropertyFlags::NoImport) { buffer.push_back("NoImport"); }
35 | if (flags & UEPropertyFlags::NoClear) { buffer.push_back("NoClear"); }
36 | if (flags & UEPropertyFlags::EditInline) { buffer.push_back("EditInline"); }
37 | if (flags & UEPropertyFlags::EditInlineUse) { buffer.push_back("EditInlineUse"); }
38 | if (flags & UEPropertyFlags::Deprecated) { buffer.push_back("Deprecated"); }
39 | if (flags & UEPropertyFlags::DataBinding) { buffer.push_back("DataBinding"); }
40 | if (flags & UEPropertyFlags::SerializeText) { buffer.push_back("SerializeText"); }
41 | if (flags & UEPropertyFlags::RepNotify) { buffer.push_back("RepNotify"); }
42 | if (flags & UEPropertyFlags::Interp) { buffer.push_back("Interp"); }
43 | if (flags & UEPropertyFlags::NonTransactional) { buffer.push_back("NonTransactional"); }
44 | if (flags & UEPropertyFlags::EditorOnly) { buffer.push_back("EditorOnly"); }
45 | if (flags & UEPropertyFlags::NotForConsole) { buffer.push_back("NotForConsole"); }
46 | if (flags & UEPropertyFlags::RepRetry) { buffer.push_back("RepRetry"); }
47 | if (flags & UEPropertyFlags::PrivateWrite) { buffer.push_back("PrivateWrite"); }
48 | if (flags & UEPropertyFlags::ProtectedWrite) { buffer.push_back("ProtectedWrite"); }
49 | if (flags & UEPropertyFlags::ArchetypeProperty) { buffer.push_back("ArchetypeProperty"); }
50 | if (flags & UEPropertyFlags::EditHide) { buffer.push_back("EditHide"); }
51 | if (flags & UEPropertyFlags::EditTextBox) { buffer.push_back("EditTextBox"); }
52 | if (flags & UEPropertyFlags::CrossLevelPassive) { buffer.push_back("CrossLevelPassive"); }
53 | if (flags & UEPropertyFlags::CrossLevelActive) { buffer.push_back("CrossLevelActive"); }
54 |
55 | switch (buffer.size())
56 | {
57 | case 0:
58 | return std::string();
59 | case 1:
60 | return std::string(buffer[0]);
61 | default:
62 | std::ostringstream os;
63 | std::copy(buffer.begin(), buffer.end() - 1, std::ostream_iterator(os, ", "));
64 | os << *buffer.rbegin();
65 | return os.str();
66 | }
67 | }
--------------------------------------------------------------------------------
/Engine/UE1/PropertyFlags.hpp:
--------------------------------------------------------------------------------
1 | #pragma once
2 |
3 | #include
4 | #include
5 |
6 | enum class UEPropertyFlags : uint64_t
7 | {
8 | Edit = 0x0000000000000001,
9 | Const = 0x0000000000000002,
10 | Input = 0x0000000000000004,
11 | ExportObject = 0x0000000000000008,
12 | OptionalParm = 0x0000000000000010,
13 | Net = 0x0000000000000020,
14 | EditFixedSize = 0x0000000000000040,
15 | Parm = 0x0000000000000080,
16 | OutParm = 0x0000000000000100,
17 | SkipParm = 0x0000000000000200,
18 | ReturnParm = 0x0000000000000400,
19 | CoerceParm = 0x0000000000000800,
20 | Native = 0x0000000000001000,
21 | Transient = 0x0000000000002000,
22 | Config = 0x0000000000004000,
23 | Localized = 0x0000000000008000,
24 | EditConst = 0x0000000000020000,
25 | GlobalConfig = 0x0000000000040000,
26 | Component = 0x0000000000080000,
27 | AlwaysInit = 0x0000000000100000,
28 | DuplicateTransient = 0x0000000000200000,
29 | NeedCtorLink = 0x0000000000400000,
30 | NoExport = 0x0000000000800000,
31 | NoImport = 0x0000000001000000,
32 | NoClear = 0x0000000002000000,
33 | EditInline = 0x0000000004000000,
34 | EditInlineUse = 0x0000000010000000,
35 | Deprecated = 0x0000000020000000,
36 | DataBinding = 0x0000000040000000,
37 | SerializeText = 0x0000000080000000,
38 | RepNotify = 0x0000000100000000,
39 | Interp = 0x0000000200000000,
40 | NonTransactional = 0x0000000400000000,
41 | EditorOnly = 0x0000000800000000,
42 | NotForConsole = 0x0000001000000000,
43 | RepRetry = 0x0000002000000000,
44 | PrivateWrite = 0x0000004000000000,
45 | ProtectedWrite = 0x0000008000000000,
46 | ArchetypeProperty = 0x0000010000000000,
47 | EditHide = 0x0000020000000000,
48 | EditTextBox = 0x0000040000000000,
49 | CrossLevelPassive = 0x0000100000000000,
50 | CrossLevelActive = 0x0000200000000000
51 | };
52 |
53 | inline bool operator&(UEPropertyFlags lhs, UEPropertyFlags rhs)
54 | {
55 | return (static_cast>(lhs) & static_cast>(rhs)) == static_cast>(rhs);
56 | }
57 |
58 | std::string StringifyFlags(const UEPropertyFlags flags);
--------------------------------------------------------------------------------
/Engine/UE2/FunctionFlags.cpp:
--------------------------------------------------------------------------------
1 | #include "FunctionFlags.hpp"
2 |
3 | #include
4 | #include
5 | #include
6 |
7 | std::string StringifyFlags(const UEFunctionFlags flags)
8 | {
9 | std::vector buffer;
10 |
11 | if (flags & UEFunctionFlags::Final) { buffer.push_back("Final"); }
12 | if (flags & UEFunctionFlags::Defined) { buffer.push_back("Defined"); }
13 | if (flags & UEFunctionFlags::Iterator) { buffer.push_back("Iterator"); }
14 | if (flags & UEFunctionFlags::Latent) { buffer.push_back("Latent"); }
15 | if (flags & UEFunctionFlags::PreOperator) { buffer.push_back("PreOperator"); }
16 | if (flags & UEFunctionFlags::Singular) { buffer.push_back("Singular"); }
17 | if (flags & UEFunctionFlags::Net) { buffer.push_back("Net"); }
18 | if (flags & UEFunctionFlags::NetReliable) { buffer.push_back("NetReliable"); }
19 | if (flags & UEFunctionFlags::Simulated) { buffer.push_back("Simulated"); }
20 | if (flags & UEFunctionFlags::Exec) { buffer.push_back("Exec"); }
21 | if (flags & UEFunctionFlags::Native) { buffer.push_back("Native"); }
22 | if (flags & UEFunctionFlags::Event) { buffer.push_back("Event"); }
23 | if (flags & UEFunctionFlags::Operator) { buffer.push_back("Operator"); }
24 | if (flags & UEFunctionFlags::Static) { buffer.push_back("Static"); }
25 | if (flags & UEFunctionFlags::HasOptionalParms) { buffer.push_back("HasOptionalParms"); }
26 | if (flags & UEFunctionFlags::Const) { buffer.push_back("Const"); }
27 | if (flags & UEFunctionFlags::Public) { buffer.push_back("Public"); }
28 | if (flags & UEFunctionFlags::Private) { buffer.push_back("Private"); }
29 | if (flags & UEFunctionFlags::Protected) { buffer.push_back("Protected"); }
30 | if (flags & UEFunctionFlags::Delegate) { buffer.push_back("Delegate"); }
31 | if (flags & UEFunctionFlags::NetServer) { buffer.push_back("NetServer"); }
32 | if (flags & UEFunctionFlags::HasOutParms) { buffer.push_back("HasOutParms"); }
33 | if (flags & UEFunctionFlags::HasDefaults) { buffer.push_back("HasDefaults"); }
34 | if (flags & UEFunctionFlags::NetClient) { buffer.push_back("NetClient"); }
35 | if (flags & UEFunctionFlags::DLLImport) { buffer.push_back("DLLImport"); }
36 | if (flags & UEFunctionFlags::K2Call) { buffer.push_back("K2Call"); }
37 | if (flags & UEFunctionFlags::K2Override) { buffer.push_back("K2Override"); }
38 | if (flags & UEFunctionFlags::K2Pure) { buffer.push_back("K2Pure"); }
39 |
40 | switch (buffer.size())
41 | {
42 | case 0:
43 | return std::string();
44 | case 1:
45 | return std::string(buffer[0]);
46 | default:
47 | std::ostringstream os;
48 | std::copy(buffer.begin(), buffer.end() - 1, std::ostream_iterator(os, ", "));
49 | os << *buffer.rbegin();
50 | return os.str();
51 | }
52 | }
--------------------------------------------------------------------------------
/Engine/UE2/FunctionFlags.hpp:
--------------------------------------------------------------------------------
1 | #pragma once
2 |
3 | #include
4 | #include
5 |
6 | enum class UEFunctionFlags : uint32_t
7 | {
8 | Final = 0x00000001,
9 | Defined = 0x00000002,
10 | Iterator = 0x00000004,
11 | Latent = 0x00000008,
12 | PreOperator = 0x00000010,
13 | Singular = 0x00000020,
14 | Net = 0x00000040,
15 | NetReliable = 0x00000080,
16 | Simulated = 0x00000100,
17 | Exec = 0x00000200,
18 | Native = 0x00000400,
19 | Event = 0x00000800,
20 | Operator = 0x00001000,
21 | Static = 0x00002000,
22 | HasOptionalParms = 0x00004000,
23 | Const = 0x00008000,
24 | Public = 0x00020000,
25 | Private = 0x00040000,
26 | Protected = 0x00080000,
27 | Delegate = 0x00100000,
28 | NetServer = 0x00200000,
29 | HasOutParms = 0x00400000,
30 | HasDefaults = 0x00800000,
31 | NetClient = 0x01000000,
32 | DLLImport = 0x02000000,
33 | K2Call = 0x04000000,
34 | K2Override = 0x08000000,
35 | K2Pure = 0x10000000
36 | };
37 |
38 | inline bool operator&(UEFunctionFlags lhs, UEFunctionFlags rhs)
39 | {
40 | return (static_cast>(lhs) & static_cast>(rhs)) == static_cast>(rhs);
41 | }
42 |
43 | std::string StringifyFlags(const UEFunctionFlags flags);
44 |
--------------------------------------------------------------------------------
/Engine/UE2/Package.cpp:
--------------------------------------------------------------------------------
1 | #include "../Package.hpp"
2 |
3 | bool Package::Method::Parameter::MakeType(UEPropertyFlags flags, Type& type)
4 | {
5 | if (flags & UEPropertyFlags::ReturnParm)
6 | {
7 | type = Type::Return;
8 | }
9 | else if (flags & UEPropertyFlags::OutParm)
10 | {
11 | type = Type::Out;
12 | }
13 | else if (flags & UEPropertyFlags::Parm)
14 | {
15 | type = Type::Default;
16 | }
17 | else
18 | {
19 | return false;
20 | }
21 |
22 | return true;
23 | }
--------------------------------------------------------------------------------
/Engine/UE2/PropertyFlags.cpp:
--------------------------------------------------------------------------------
1 | #include "PropertyFlags.hpp"
2 |
3 | #include
4 | #include
5 | #include
6 |
7 | std::string StringifyFlags(const UEPropertyFlags flags)
8 | {
9 | std::vector buffer;
10 |
11 | if (flags & UEPropertyFlags::Edit) { buffer.push_back("Edit"); }
12 | if (flags & UEPropertyFlags::Const) { buffer.push_back("Const"); }
13 | if (flags & UEPropertyFlags::Input) { buffer.push_back("Input"); }
14 | if (flags & UEPropertyFlags::ExportObject) { buffer.push_back("ExportObject"); }
15 | if (flags & UEPropertyFlags::OptionalParm) { buffer.push_back("OptionalParm"); }
16 | if (flags & UEPropertyFlags::Net) { buffer.push_back("Net"); }
17 | if (flags & UEPropertyFlags::EditFixedSize) { buffer.push_back("EditFixedSize"); }
18 | if (flags & UEPropertyFlags::Parm) { buffer.push_back("Parm"); }
19 | if (flags & UEPropertyFlags::OutParm) { buffer.push_back("OutParm"); }
20 | if (flags & UEPropertyFlags::SkipParm) { buffer.push_back("SkipParm"); }
21 | if (flags & UEPropertyFlags::ReturnParm) { buffer.push_back("ReturnParm"); }
22 | if (flags & UEPropertyFlags::CoerceParm) { buffer.push_back("CoerceParm"); }
23 | if (flags & UEPropertyFlags::Native) { buffer.push_back("Native"); }
24 | if (flags & UEPropertyFlags::Transient) { buffer.push_back("Transient"); }
25 | if (flags & UEPropertyFlags::Config) { buffer.push_back("Config"); }
26 | if (flags & UEPropertyFlags::Localized) { buffer.push_back("Localized"); }
27 | if (flags & UEPropertyFlags::EditConst) { buffer.push_back("EditConst"); }
28 | if (flags & UEPropertyFlags::GlobalConfig) { buffer.push_back("GlobalConfig"); }
29 | if (flags & UEPropertyFlags::Component) { buffer.push_back("Component"); }
30 | if (flags & UEPropertyFlags::AlwaysInit) { buffer.push_back("AlwaysInit"); }
31 | if (flags & UEPropertyFlags::DuplicateTransient) { buffer.push_back("DuplicateTransient"); }
32 | if (flags & UEPropertyFlags::NeedCtorLink) { buffer.push_back("NeedCtorLink"); }
33 | if (flags & UEPropertyFlags::NoExport) { buffer.push_back("NoExport"); }
34 | if (flags & UEPropertyFlags::NoImport) { buffer.push_back("NoImport"); }
35 | if (flags & UEPropertyFlags::NoClear) { buffer.push_back("NoClear"); }
36 | if (flags & UEPropertyFlags::EditInline) { buffer.push_back("EditInline"); }
37 | if (flags & UEPropertyFlags::EditInlineUse) { buffer.push_back("EditInlineUse"); }
38 | if (flags & UEPropertyFlags::Deprecated) { buffer.push_back("Deprecated"); }
39 | if (flags & UEPropertyFlags::DataBinding) { buffer.push_back("DataBinding"); }
40 | if (flags & UEPropertyFlags::SerializeText) { buffer.push_back("SerializeText"); }
41 | if (flags & UEPropertyFlags::RepNotify) { buffer.push_back("RepNotify"); }
42 | if (flags & UEPropertyFlags::Interp) { buffer.push_back("Interp"); }
43 | if (flags & UEPropertyFlags::NonTransactional) { buffer.push_back("NonTransactional"); }
44 | if (flags & UEPropertyFlags::EditorOnly) { buffer.push_back("EditorOnly"); }
45 | if (flags & UEPropertyFlags::NotForConsole) { buffer.push_back("NotForConsole"); }
46 | if (flags & UEPropertyFlags::RepRetry) { buffer.push_back("RepRetry"); }
47 | if (flags & UEPropertyFlags::PrivateWrite) { buffer.push_back("PrivateWrite"); }
48 | if (flags & UEPropertyFlags::ProtectedWrite) { buffer.push_back("ProtectedWrite"); }
49 | if (flags & UEPropertyFlags::ArchetypeProperty) { buffer.push_back("ArchetypeProperty"); }
50 | if (flags & UEPropertyFlags::EditHide) { buffer.push_back("EditHide"); }
51 | if (flags & UEPropertyFlags::EditTextBox) { buffer.push_back("EditTextBox"); }
52 | if (flags & UEPropertyFlags::CrossLevelPassive) { buffer.push_back("CrossLevelPassive"); }
53 | if (flags & UEPropertyFlags::CrossLevelActive) { buffer.push_back("CrossLevelActive"); }
54 |
55 | switch (buffer.size())
56 | {
57 | case 0:
58 | return std::string();
59 | case 1:
60 | return std::string(buffer[0]);
61 | default:
62 | std::ostringstream os;
63 | std::copy(buffer.begin(), buffer.end() - 1, std::ostream_iterator(os, ", "));
64 | os << *buffer.rbegin();
65 | return os.str();
66 | }
67 | }
--------------------------------------------------------------------------------
/Engine/UE2/PropertyFlags.hpp:
--------------------------------------------------------------------------------
1 | #pragma once
2 |
3 | #include
4 | #include
5 |
6 | enum class UEPropertyFlags : uint64_t
7 | {
8 | Edit = 0x0000000000000001,
9 | Const = 0x0000000000000002,
10 | Input = 0x0000000000000004,
11 | ExportObject = 0x0000000000000008,
12 | OptionalParm = 0x0000000000000010,
13 | Net = 0x0000000000000020,
14 | EditFixedSize = 0x0000000000000040,
15 | Parm = 0x0000000000000080,
16 | OutParm = 0x0000000000000100,
17 | SkipParm = 0x0000000000000200,
18 | ReturnParm = 0x0000000000000400,
19 | CoerceParm = 0x0000000000000800,
20 | Native = 0x0000000000001000,
21 | Transient = 0x0000000000002000,
22 | Config = 0x0000000000004000,
23 | Localized = 0x0000000000008000,
24 | EditConst = 0x0000000000020000,
25 | GlobalConfig = 0x0000000000040000,
26 | Component = 0x0000000000080000,
27 | AlwaysInit = 0x0000000000100000,
28 | DuplicateTransient = 0x0000000000200000,
29 | NeedCtorLink = 0x0000000000400000,
30 | NoExport = 0x0000000000800000,
31 | NoImport = 0x0000000001000000,
32 | NoClear = 0x0000000002000000,
33 | EditInline = 0x0000000004000000,
34 | EditInlineUse = 0x0000000010000000,
35 | Deprecated = 0x0000000020000000,
36 | DataBinding = 0x0000000040000000,
37 | SerializeText = 0x0000000080000000,
38 | RepNotify = 0x0000000100000000,
39 | Interp = 0x0000000200000000,
40 | NonTransactional = 0x0000000400000000,
41 | EditorOnly = 0x0000000800000000,
42 | NotForConsole = 0x0000001000000000,
43 | RepRetry = 0x0000002000000000,
44 | PrivateWrite = 0x0000004000000000,
45 | ProtectedWrite = 0x0000008000000000,
46 | ArchetypeProperty = 0x0000010000000000,
47 | EditHide = 0x0000020000000000,
48 | EditTextBox = 0x0000040000000000,
49 | CrossLevelPassive = 0x0000100000000000,
50 | CrossLevelActive = 0x0000200000000000
51 | };
52 |
53 | inline bool operator&(UEPropertyFlags lhs, UEPropertyFlags rhs)
54 | {
55 | return (static_cast>(lhs) & static_cast>(rhs)) == static_cast>(rhs);
56 | }
57 |
58 | std::string StringifyFlags(const UEPropertyFlags flags);
--------------------------------------------------------------------------------
/Engine/UE3/FunctionFlags.cpp:
--------------------------------------------------------------------------------
1 | #include "FunctionFlags.hpp"
2 |
3 | #include
4 | #include
5 | #include
6 |
7 | std::string StringifyFlags(const UEFunctionFlags flags)
8 | {
9 | std::vector buffer;
10 |
11 | if (flags & UEFunctionFlags::Final) { buffer.push_back("Final"); }
12 | if (flags & UEFunctionFlags::Defined) { buffer.push_back("Defined"); }
13 | if (flags & UEFunctionFlags::Iterator) { buffer.push_back("Iterator"); }
14 | if (flags & UEFunctionFlags::Latent) { buffer.push_back("Latent"); }
15 | if (flags & UEFunctionFlags::PreOperator) { buffer.push_back("PreOperator"); }
16 | if (flags & UEFunctionFlags::Singular) { buffer.push_back("Singular"); }
17 | if (flags & UEFunctionFlags::Net) { buffer.push_back("Net"); }
18 | if (flags & UEFunctionFlags::NetReliable) { buffer.push_back("NetReliable"); }
19 | if (flags & UEFunctionFlags::Simulated) { buffer.push_back("Simulated"); }
20 | if (flags & UEFunctionFlags::Exec) { buffer.push_back("Exec"); }
21 | if (flags & UEFunctionFlags::Native) { buffer.push_back("Native"); }
22 | if (flags & UEFunctionFlags::Event) { buffer.push_back("Event"); }
23 | if (flags & UEFunctionFlags::Operator) { buffer.push_back("Operator"); }
24 | if (flags & UEFunctionFlags::Static) { buffer.push_back("Static"); }
25 | if (flags & UEFunctionFlags::HasOptionalParms) { buffer.push_back("HasOptionalParms"); }
26 | if (flags & UEFunctionFlags::Const) { buffer.push_back("Const"); }
27 | if (flags & UEFunctionFlags::Public) { buffer.push_back("Public"); }
28 | if (flags & UEFunctionFlags::Private) { buffer.push_back("Private"); }
29 | if (flags & UEFunctionFlags::Protected) { buffer.push_back("Protected"); }
30 | if (flags & UEFunctionFlags::Delegate) { buffer.push_back("Delegate"); }
31 | if (flags & UEFunctionFlags::NetServer) { buffer.push_back("NetServer"); }
32 | if (flags & UEFunctionFlags::HasOutParms) { buffer.push_back("HasOutParms"); }
33 | if (flags & UEFunctionFlags::HasDefaults) { buffer.push_back("HasDefaults"); }
34 | if (flags & UEFunctionFlags::NetClient) { buffer.push_back("NetClient"); }
35 | if (flags & UEFunctionFlags::DLLImport) { buffer.push_back("DLLImport"); }
36 | if (flags & UEFunctionFlags::K2Call) { buffer.push_back("K2Call"); }
37 | if (flags & UEFunctionFlags::K2Override) { buffer.push_back("K2Override"); }
38 | if (flags & UEFunctionFlags::K2Pure) { buffer.push_back("K2Pure"); }
39 |
40 | switch (buffer.size())
41 | {
42 | case 0:
43 | return std::string();
44 | case 1:
45 | return std::string(buffer[0]);
46 | default:
47 | std::ostringstream os;
48 | std::copy(buffer.begin(), buffer.end() - 1, std::ostream_iterator(os, ", "));
49 | os << *buffer.rbegin();
50 | return os.str();
51 | }
52 | }
--------------------------------------------------------------------------------
/Engine/UE3/FunctionFlags.hpp:
--------------------------------------------------------------------------------
1 | #pragma once
2 |
3 | #include
4 | #include
5 |
6 | enum class UEFunctionFlags : uint32_t
7 | {
8 | Final = 0x00000001,
9 | Defined = 0x00000002,
10 | Iterator = 0x00000004,
11 | Latent = 0x00000008,
12 | PreOperator = 0x00000010,
13 | Singular = 0x00000020,
14 | Net = 0x00000040,
15 | NetReliable = 0x00000080,
16 | Simulated = 0x00000100,
17 | Exec = 0x00000200,
18 | Native = 0x00000400,
19 | Event = 0x00000800,
20 | Operator = 0x00001000,
21 | Static = 0x00002000,
22 | HasOptionalParms = 0x00004000,
23 | Const = 0x00008000,
24 | Public = 0x00020000,
25 | Private = 0x00040000,
26 | Protected = 0x00080000,
27 | Delegate = 0x00100000,
28 | NetServer = 0x00200000,
29 | HasOutParms = 0x00400000,
30 | HasDefaults = 0x00800000,
31 | NetClient = 0x01000000,
32 | DLLImport = 0x02000000,
33 | K2Call = 0x04000000,
34 | K2Override = 0x08000000,
35 | K2Pure = 0x10000000
36 | };
37 |
38 | inline bool operator&(UEFunctionFlags lhs, UEFunctionFlags rhs)
39 | {
40 | return (static_cast>(lhs) & static_cast>(rhs)) == static_cast>(rhs);
41 | }
42 |
43 | std::string StringifyFlags(const UEFunctionFlags flags);
44 |
--------------------------------------------------------------------------------
/Engine/UE3/Package.cpp:
--------------------------------------------------------------------------------
1 | #include "../Package.hpp"
2 |
3 | bool Package::Method::Parameter::MakeType(UEPropertyFlags flags, Type& type)
4 | {
5 | if (flags & UEPropertyFlags::ReturnParm)
6 | {
7 | type = Type::Return;
8 | }
9 | else if (flags & UEPropertyFlags::OutParm)
10 | {
11 | type = Type::Out;
12 | }
13 | else if (flags & UEPropertyFlags::Parm)
14 | {
15 | type = Type::Default;
16 | }
17 | else
18 | {
19 | return false;
20 | }
21 |
22 | return true;
23 | }
--------------------------------------------------------------------------------
/Engine/UE3/PropertyFlags.cpp:
--------------------------------------------------------------------------------
1 | #include "PropertyFlags.hpp"
2 |
3 | #include
4 | #include
5 | #include
6 |
7 | std::string StringifyFlags(const UEPropertyFlags flags)
8 | {
9 | std::vector buffer;
10 |
11 | if (flags & UEPropertyFlags::Edit) { buffer.push_back("Edit"); }
12 | if (flags & UEPropertyFlags::Const) { buffer.push_back("Const"); }
13 | if (flags & UEPropertyFlags::Input) { buffer.push_back("Input"); }
14 | if (flags & UEPropertyFlags::ExportObject) { buffer.push_back("ExportObject"); }
15 | if (flags & UEPropertyFlags::OptionalParm) { buffer.push_back("OptionalParm"); }
16 | if (flags & UEPropertyFlags::Net) { buffer.push_back("Net"); }
17 | if (flags & UEPropertyFlags::EditFixedSize) { buffer.push_back("EditFixedSize"); }
18 | if (flags & UEPropertyFlags::Parm) { buffer.push_back("Parm"); }
19 | if (flags & UEPropertyFlags::OutParm) { buffer.push_back("OutParm"); }
20 | if (flags & UEPropertyFlags::SkipParm) { buffer.push_back("SkipParm"); }
21 | if (flags & UEPropertyFlags::ReturnParm) { buffer.push_back("ReturnParm"); }
22 | if (flags & UEPropertyFlags::CoerceParm) { buffer.push_back("CoerceParm"); }
23 | if (flags & UEPropertyFlags::Native) { buffer.push_back("Native"); }
24 | if (flags & UEPropertyFlags::Transient) { buffer.push_back("Transient"); }
25 | if (flags & UEPropertyFlags::Config) { buffer.push_back("Config"); }
26 | if (flags & UEPropertyFlags::Localized) { buffer.push_back("Localized"); }
27 | if (flags & UEPropertyFlags::EditConst) { buffer.push_back("EditConst"); }
28 | if (flags & UEPropertyFlags::GlobalConfig) { buffer.push_back("GlobalConfig"); }
29 | if (flags & UEPropertyFlags::Component) { buffer.push_back("Component"); }
30 | if (flags & UEPropertyFlags::AlwaysInit) { buffer.push_back("AlwaysInit"); }
31 | if (flags & UEPropertyFlags::DuplicateTransient) { buffer.push_back("DuplicateTransient"); }
32 | if (flags & UEPropertyFlags::NeedCtorLink) { buffer.push_back("NeedCtorLink"); }
33 | if (flags & UEPropertyFlags::NoExport) { buffer.push_back("NoExport"); }
34 | if (flags & UEPropertyFlags::NoImport) { buffer.push_back("NoImport"); }
35 | if (flags & UEPropertyFlags::NoClear) { buffer.push_back("NoClear"); }
36 | if (flags & UEPropertyFlags::EditInline) { buffer.push_back("EditInline"); }
37 | if (flags & UEPropertyFlags::EditInlineUse) { buffer.push_back("EditInlineUse"); }
38 | if (flags & UEPropertyFlags::Deprecated) { buffer.push_back("Deprecated"); }
39 | if (flags & UEPropertyFlags::DataBinding) { buffer.push_back("DataBinding"); }
40 | if (flags & UEPropertyFlags::SerializeText) { buffer.push_back("SerializeText"); }
41 | if (flags & UEPropertyFlags::RepNotify) { buffer.push_back("RepNotify"); }
42 | if (flags & UEPropertyFlags::Interp) { buffer.push_back("Interp"); }
43 | if (flags & UEPropertyFlags::NonTransactional) { buffer.push_back("NonTransactional"); }
44 | if (flags & UEPropertyFlags::EditorOnly) { buffer.push_back("EditorOnly"); }
45 | if (flags & UEPropertyFlags::NotForConsole) { buffer.push_back("NotForConsole"); }
46 | if (flags & UEPropertyFlags::RepRetry) { buffer.push_back("RepRetry"); }
47 | if (flags & UEPropertyFlags::PrivateWrite) { buffer.push_back("PrivateWrite"); }
48 | if (flags & UEPropertyFlags::ProtectedWrite) { buffer.push_back("ProtectedWrite"); }
49 | if (flags & UEPropertyFlags::ArchetypeProperty) { buffer.push_back("ArchetypeProperty"); }
50 | if (flags & UEPropertyFlags::EditHide) { buffer.push_back("EditHide"); }
51 | if (flags & UEPropertyFlags::EditTextBox) { buffer.push_back("EditTextBox"); }
52 | if (flags & UEPropertyFlags::CrossLevelPassive) { buffer.push_back("CrossLevelPassive"); }
53 | if (flags & UEPropertyFlags::CrossLevelActive) { buffer.push_back("CrossLevelActive"); }
54 |
55 | switch (buffer.size())
56 | {
57 | case 0:
58 | return std::string();
59 | case 1:
60 | return std::string(buffer[0]);
61 | default:
62 | std::ostringstream os;
63 | std::copy(buffer.begin(), buffer.end() - 1, std::ostream_iterator(os, ", "));
64 | os << *buffer.rbegin();
65 | return os.str();
66 | }
67 | }
--------------------------------------------------------------------------------
/Engine/UE3/PropertyFlags.hpp:
--------------------------------------------------------------------------------
1 | #pragma once
2 |
3 | #include
4 | #include
5 |
6 | enum class UEPropertyFlags : uint64_t
7 | {
8 | Edit = 0x0000000000000001,
9 | Const = 0x0000000000000002,
10 | Input = 0x0000000000000004,
11 | ExportObject = 0x0000000000000008,
12 | OptionalParm = 0x0000000000000010,
13 | Net = 0x0000000000000020,
14 | EditFixedSize = 0x0000000000000040,
15 | Parm = 0x0000000000000080,
16 | OutParm = 0x0000000000000100,
17 | SkipParm = 0x0000000000000200,
18 | ReturnParm = 0x0000000000000400,
19 | CoerceParm = 0x0000000000000800,
20 | Native = 0x0000000000001000,
21 | Transient = 0x0000000000002000,
22 | Config = 0x0000000000004000,
23 | Localized = 0x0000000000008000,
24 | EditConst = 0x0000000000020000,
25 | GlobalConfig = 0x0000000000040000,
26 | Component = 0x0000000000080000,
27 | AlwaysInit = 0x0000000000100000,
28 | DuplicateTransient = 0x0000000000200000,
29 | NeedCtorLink = 0x0000000000400000,
30 | NoExport = 0x0000000000800000,
31 | NoImport = 0x0000000001000000,
32 | NoClear = 0x0000000002000000,
33 | EditInline = 0x0000000004000000,
34 | EditInlineUse = 0x0000000010000000,
35 | Deprecated = 0x0000000020000000,
36 | DataBinding = 0x0000000040000000,
37 | SerializeText = 0x0000000080000000,
38 | RepNotify = 0x0000000100000000,
39 | Interp = 0x0000000200000000,
40 | NonTransactional = 0x0000000400000000,
41 | EditorOnly = 0x0000000800000000,
42 | NotForConsole = 0x0000001000000000,
43 | RepRetry = 0x0000002000000000,
44 | PrivateWrite = 0x0000004000000000,
45 | ProtectedWrite = 0x0000008000000000,
46 | ArchetypeProperty = 0x0000010000000000,
47 | EditHide = 0x0000020000000000,
48 | EditTextBox = 0x0000040000000000,
49 | CrossLevelPassive = 0x0000100000000000,
50 | CrossLevelActive = 0x0000200000000000
51 | };
52 |
53 | inline bool operator&(UEPropertyFlags lhs, UEPropertyFlags rhs)
54 | {
55 | return (static_cast>(lhs) & static_cast>(rhs)) == static_cast>(rhs);
56 | }
57 |
58 | std::string StringifyFlags(const UEPropertyFlags flags);
--------------------------------------------------------------------------------
/Engine/UE4/FunctionFlags.cpp:
--------------------------------------------------------------------------------
1 | #include "FunctionFlags.hpp"
2 |
3 | #include
4 | #include
5 | #include
6 |
7 | std::string StringifyFlags(const UEFunctionFlags flags)
8 | {
9 | std::vector buffer;
10 |
11 | if (flags & UEFunctionFlags::Final) { buffer.push_back("Final"); }
12 | if (flags & UEFunctionFlags::RequiredAPI) { buffer.push_back("RequiredAPI"); }
13 | if (flags & UEFunctionFlags::BlueprintAuthorityOnly) { buffer.push_back("BlueprintAuthorityOnly"); }
14 | if (flags & UEFunctionFlags::BlueprintCosmetic) { buffer.push_back("BlueprintCosmetic"); }
15 | if (flags & UEFunctionFlags::Net) { buffer.push_back("Net"); }
16 | if (flags & UEFunctionFlags::NetReliable) { buffer.push_back("NetReliable"); }
17 | if (flags & UEFunctionFlags::NetRequest) { buffer.push_back("NetRequest"); }
18 | if (flags & UEFunctionFlags::Exec) { buffer.push_back("Exec"); }
19 | if (flags & UEFunctionFlags::Native) { buffer.push_back("Native"); }
20 | if (flags & UEFunctionFlags::Event) { buffer.push_back("Event"); }
21 | if (flags & UEFunctionFlags::NetResponse) { buffer.push_back("NetResponse"); }
22 | if (flags & UEFunctionFlags::Static) { buffer.push_back("Static"); }
23 | if (flags & UEFunctionFlags::NetMulticast) { buffer.push_back("NetMulticast"); }
24 | if (flags & UEFunctionFlags::MulticastDelegate) { buffer.push_back("MulticastDelegate"); }
25 | if (flags & UEFunctionFlags::Public) { buffer.push_back("Public"); }
26 | if (flags & UEFunctionFlags::Private) { buffer.push_back("Private"); }
27 | if (flags & UEFunctionFlags::Protected) { buffer.push_back("Protected"); }
28 | if (flags & UEFunctionFlags::Delegate) { buffer.push_back("Delegate"); }
29 | if (flags & UEFunctionFlags::NetServer) { buffer.push_back("NetServer"); }
30 | if (flags & UEFunctionFlags::HasOutParms) { buffer.push_back("HasOutParms"); }
31 | if (flags & UEFunctionFlags::HasDefaults) { buffer.push_back("HasDefaults"); }
32 | if (flags & UEFunctionFlags::NetClient) { buffer.push_back("NetClient"); }
33 | if (flags & UEFunctionFlags::DLLImport) { buffer.push_back("DLLImport"); }
34 | if (flags & UEFunctionFlags::BlueprintCallable) { buffer.push_back("BlueprintCallable"); }
35 | if (flags & UEFunctionFlags::BlueprintEvent) { buffer.push_back("BlueprintEvent"); }
36 | if (flags & UEFunctionFlags::BlueprintPure) { buffer.push_back("BlueprintPure"); }
37 | if (flags & UEFunctionFlags::Const) { buffer.push_back("Const"); }
38 | if (flags & UEFunctionFlags::NetValidate) { buffer.push_back("NetValidate"); }
39 |
40 | switch (buffer.size())
41 | {
42 | case 0:
43 | return std::string();
44 | case 1:
45 | return std::string(buffer[0]);
46 | default:
47 | std::ostringstream os;
48 | std::copy(buffer.begin(), buffer.end() - 1, std::ostream_iterator(os, ", "));
49 | os << *buffer.rbegin();
50 | return os.str();
51 | }
52 | }
--------------------------------------------------------------------------------
/Engine/UE4/FunctionFlags.hpp:
--------------------------------------------------------------------------------
1 | #pragma once
2 |
3 | #include
4 | #include
5 |
6 | enum class UEFunctionFlags : uint32_t
7 | {
8 | Final = 0x00000001,
9 | RequiredAPI = 0x00000002,
10 | BlueprintAuthorityOnly = 0x00000004,
11 | BlueprintCosmetic = 0x00000008,
12 | Net = 0x00000040,
13 | NetReliable = 0x00000080,
14 | NetRequest = 0x00000100,
15 | Exec = 0x00000200,
16 | Native = 0x00000400,
17 | Event = 0x00000800,
18 | NetResponse = 0x00001000,
19 | Static = 0x00002000,
20 | NetMulticast = 0x00004000,
21 | MulticastDelegate = 0x00010000,
22 | Public = 0x00020000,
23 | Private = 0x00040000,
24 | Protected = 0x00080000,
25 | Delegate = 0x00100000,
26 | NetServer = 0x00200000,
27 | HasOutParms = 0x00400000,
28 | HasDefaults = 0x00800000,
29 | NetClient = 0x01000000,
30 | DLLImport = 0x02000000,
31 | BlueprintCallable = 0x04000000,
32 | BlueprintEvent = 0x08000000,
33 | BlueprintPure = 0x10000000,
34 | Const = 0x40000000,
35 | NetValidate = 0x80000000
36 | };
37 |
38 | inline bool operator&(UEFunctionFlags lhs, UEFunctionFlags rhs)
39 | {
40 | return (static_cast>(lhs) & static_cast>(rhs)) == static_cast>(rhs);
41 | }
42 |
43 | std::string StringifyFlags(const UEFunctionFlags flags);
44 |
--------------------------------------------------------------------------------
/Engine/UE4/Package.cpp:
--------------------------------------------------------------------------------
1 | #include "../Package.hpp"
2 |
3 | bool Package::Method::Parameter::MakeType(UEPropertyFlags flags, Type& type)
4 | {
5 | if (flags & UEPropertyFlags::CPF_ReturnParm)
6 | {
7 | type = Type::Return;
8 | }
9 | else if (flags & UEPropertyFlags::CPF_OutParm)
10 | {
11 | //if it is a const parameter make it a default parameter
12 | if (flags & UEPropertyFlags::CPF_ConstParm)
13 | {
14 | type = Type::Default;
15 | }
16 | else
17 | {
18 | type = Type::Out;
19 | }
20 | }
21 | else if (flags & UEPropertyFlags::CPF_Parm)
22 | {
23 | type = Type::Default;
24 | }
25 | else
26 | {
27 | return false;
28 | }
29 |
30 | return true;
31 | }
--------------------------------------------------------------------------------
/Engine/UE4/PropertyFlags.hpp:
--------------------------------------------------------------------------------
1 | #pragma once
2 |
3 | #include
4 | #include
5 |
6 | enum class UEPropertyFlags : uint64_t
7 | {
8 | Edit = 0x0000000000000001,
9 | ConstParm = 0x0000000000000002,
10 | BlueprintVisible = 0x0000000000000004,
11 | ExportObject = 0x0000000000000008,
12 | BlueprintReadOnly = 0x0000000000000010,
13 | Net = 0x0000000000000020,
14 | EditFixedSize = 0x0000000000000040,
15 | Parm = 0x0000000000000080,
16 | OutParm = 0x0000000000000100,
17 | ZeroConstructor = 0x0000000000000200,
18 | ReturnParm = 0x0000000000000400,
19 | DisableEditOnTemplate = 0x0000000000000800,
20 | Transient = 0x0000000000002000,
21 | Config = 0x0000000000004000,
22 | DisableEditOnInstance = 0x0000000000010000,
23 | EditConst = 0x0000000000020000,
24 | GlobalConfig = 0x0000000000040000,
25 | InstancedReference = 0x0000000000080000,
26 | DuplicateTransient = 0x0000000000200000,
27 | SubobjectReference = 0x0000000000400000,
28 | SaveGame = 0x0000000001000000,
29 | NoClear = 0x0000000002000000,
30 | ReferenceParm = 0x0000000008000000,
31 | BlueprintAssignable = 0x0000000010000000,
32 | Deprecated = 0x0000000020000000,
33 | IsPlainOldData = 0x0000000040000000,
34 | RepSkip = 0x0000000080000000,
35 | RepNotify = 0x0000000100000000,
36 | Interp = 0x0000000200000000,
37 | NonTransactional = 0x0000000400000000,
38 | EditorOnly = 0x0000000800000000,
39 | NoDestructor = 0x0000001000000000,
40 | AutoWeak = 0x0000004000000000,
41 | ContainsInstancedReference = 0x0000008000000000,
42 | AssetRegistrySearchable = 0x0000010000000000,
43 | SimpleDisplay = 0x0000020000000000,
44 | AdvancedDisplay = 0x0000040000000000,
45 | Protected = 0x0000080000000000,
46 | BlueprintCallable = 0x0000100000000000,
47 | BlueprintAuthorityOnly = 0x0000200000000000,
48 | TextExportTransient = 0x0000400000000000,
49 | NonPIEDuplicateTransient = 0x0000800000000000,
50 | ExposeOnSpawn = 0x0001000000000000,
51 | PersistentInstance = 0x0002000000000000,
52 | UObjectWrapper = 0x0004000000000000,
53 | HasGetValueTypeHash = 0x0008000000000000,
54 | NativeAccessSpecifierPublic = 0x0010000000000000,
55 | NativeAccessSpecifierProtected = 0x0020000000000000,
56 | NativeAccessSpecifierPrivate = 0x0040000000000000
57 | };
58 |
59 | inline bool operator&(UEPropertyFlags lhs, UEPropertyFlags rhs)
60 | {
61 | return (static_cast>(lhs) & static_cast>(rhs)) == static_cast>(rhs);
62 | }
63 |
64 | std::string StringifyFlags(const UEPropertyFlags flags);
--------------------------------------------------------------------------------
/Fortnite.vcxproj.filters:
--------------------------------------------------------------------------------
1 |
2 |
3 |
4 |
5 | Engine
6 |
7 |
8 |
9 |
10 |
11 |
12 |
13 |
14 |
15 |
16 | Engine
17 |
18 |
19 | Engine
20 |
21 |
22 | Engine
23 |
24 |
25 | Engine
26 |
27 |
28 | Engine\UE4
29 |
30 |
31 | Engine
32 |
33 |
34 | Engine
35 |
36 |
37 | Engine\UE4
38 |
39 |
40 | Engine\UE4
41 |
42 |
43 | Engine
44 |
45 |
46 |
47 |
48 | {5fb70966-5939-4bcf-b096-6b909315ed0d}
49 |
50 |
51 | {77ff275a-574c-4908-9ae5-345300346f41}
52 |
53 |
54 |
55 |
56 |
57 |
58 | Engine\UE4
59 |
60 |
61 | Engine
62 |
63 |
64 | Engine
65 |
66 |
67 | Engine
68 |
69 |
70 | Engine
71 |
72 |
73 | Engine
74 |
75 |
76 | Engine
77 |
78 |
79 | Engine\UE4
80 |
81 |
82 | Engine
83 |
84 |
85 | Engine
86 |
87 |
88 | Engine
89 |
90 |
91 | Engine
92 |
93 |
94 |
--------------------------------------------------------------------------------
/Hawken.vcxproj.filters:
--------------------------------------------------------------------------------
1 |
2 |
3 |
4 |
5 | Engine
6 |
7 |
8 |
9 |
10 |
11 |
12 |
13 |
14 |
15 |
16 | Engine
17 |
18 |
19 | Engine
20 |
21 |
22 | Engine
23 |
24 |
25 | Engine
26 |
27 |
28 | Engine\UE3
29 |
30 |
31 | Engine
32 |
33 |
34 | Engine
35 |
36 |
37 | Engine\UE3
38 |
39 |
40 | Engine\UE3
41 |
42 |
43 | Engine
44 |
45 |
46 |
47 |
48 | {5fb70966-5939-4bcf-b096-6b909315ed0d}
49 |
50 |
51 | {77ff275a-574c-4908-9ae5-345300346f41}
52 |
53 |
54 |
55 |
56 |
57 |
58 | Engine\UE3
59 |
60 |
61 | Engine
62 |
63 |
64 | Engine
65 |
66 |
67 | Engine
68 |
69 |
70 | Engine
71 |
72 |
73 | Engine
74 |
75 |
76 | Engine
77 |
78 |
79 | Engine\UE3
80 |
81 |
82 | Engine
83 |
84 |
85 | Engine
86 |
87 |
88 | Engine
89 |
90 |
91 | Engine
92 |
93 |
94 |
--------------------------------------------------------------------------------
/LICENSE:
--------------------------------------------------------------------------------
1 | MIT License
2 |
3 | Copyright (c) 2016
4 |
5 | Permission is hereby granted, free of charge, to any person obtaining a copy
6 | of this software and associated documentation files (the "Software"), to deal
7 | in the Software without restriction, including without limitation the rights
8 | to use, copy, modify, merge, publish, distribute, sublicense, and/or sell
9 | copies of the Software, and to permit persons to whom the Software is
10 | furnished to do so, subject to the following conditions:
11 |
12 | The above copyright notice and this permission notice shall be included in all
13 | copies or substantial portions of the Software.
14 |
15 | THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
16 | IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
17 | FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
18 | AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
19 | LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
20 | OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE
21 | SOFTWARE.
22 |
--------------------------------------------------------------------------------
/Paragon.vcxproj.filters:
--------------------------------------------------------------------------------
1 |
2 |
3 |
4 |
5 | Engine
6 |
7 |
8 |
9 |
10 |
11 |
12 |
13 |
14 |
15 |
16 | Engine
17 |
18 |
19 | Engine
20 |
21 |
22 | Engine
23 |
24 |
25 | Engine
26 |
27 |
28 | Engine\UE4
29 |
30 |
31 | Engine
32 |
33 |
34 | Engine
35 |
36 |
37 | Engine\UE4
38 |
39 |
40 | Engine\UE4
41 |
42 |
43 | Engine
44 |
45 |
46 |
47 |
48 | {5fb70966-5939-4bcf-b096-6b909315ed0d}
49 |
50 |
51 | {77ff275a-574c-4908-9ae5-345300346f41}
52 |
53 |
54 |
55 |
56 |
57 |
58 | Engine\UE4
59 |
60 |
61 | Engine
62 |
63 |
64 | Engine
65 |
66 |
67 | Engine
68 |
69 |
70 | Engine
71 |
72 |
73 | Engine
74 |
75 |
76 | Engine
77 |
78 |
79 | Engine\UE4
80 |
81 |
82 | Engine
83 |
84 |
85 | Engine
86 |
87 |
88 | Engine
89 |
90 |
91 | Engine
92 |
93 |
94 |
--------------------------------------------------------------------------------
/RocketLeague.vcxproj.filters:
--------------------------------------------------------------------------------
1 |
2 |
3 |
4 |
5 | Engine
6 |
7 |
8 |
9 |
10 |
11 |
12 |
13 |
14 |
15 |
16 | Engine
17 |
18 |
19 | Engine
20 |
21 |
22 | Engine
23 |
24 |
25 | Engine
26 |
27 |
28 | Engine\UE3
29 |
30 |
31 | Engine
32 |
33 |
34 | Engine
35 |
36 |
37 | Engine\UE3
38 |
39 |
40 | Engine\UE3
41 |
42 |
43 | Engine
44 |
45 |
46 |
47 |
48 | {5fb70966-5939-4bcf-b096-6b909315ed0d}
49 |
50 |
51 | {77ff275a-574c-4908-9ae5-345300346f41}
52 |
53 |
54 |
55 |
56 |
57 |
58 | Engine\UE3
59 |
60 |
61 | Engine
62 |
63 |
64 | Engine
65 |
66 |
67 | Engine
68 |
69 |
70 | Engine
71 |
72 |
73 | Engine
74 |
75 |
76 | Engine
77 |
78 |
79 | Engine\UE3
80 |
81 |
82 | Engine
83 |
84 |
85 | Engine
86 |
87 |
88 | Engine
89 |
90 |
91 | Engine
92 |
93 |
94 |
--------------------------------------------------------------------------------
/SeaOfThieves.vcxproj.filters:
--------------------------------------------------------------------------------
1 |
2 |
3 |
4 |
5 | Engine
6 |
7 |
8 |
9 |
10 |
11 |
12 |
13 |
14 |
15 |
16 | Engine
17 |
18 |
19 | Engine
20 |
21 |
22 | Engine
23 |
24 |
25 | Engine
26 |
27 |
28 | Engine\UE4
29 |
30 |
31 | Engine
32 |
33 |
34 | Engine
35 |
36 |
37 | Engine\UE4
38 |
39 |
40 | Engine\UE4
41 |
42 |
43 | Engine\UE4
44 |
45 |
46 | Engine
47 |
48 |
49 | Engine
50 |
51 |
52 |
53 |
54 | {5fb70966-5939-4bcf-b096-6b909315ed0d}
55 |
56 |
57 | {77ff275a-574c-4908-9ae5-345300346f41}
58 |
59 |
60 |
61 |
62 |
63 |
64 | Engine\UE4
65 |
66 |
67 | Engine
68 |
69 |
70 | Engine
71 |
72 |
73 | Engine
74 |
75 |
76 | Engine
77 |
78 |
79 | Engine
80 |
81 |
82 | Engine
83 |
84 |
85 | Engine\UE4
86 |
87 |
88 | Engine\UE4
89 |
90 |
91 | Engine
92 |
93 |
94 | Engine
95 |
96 |
97 | Engine
98 |
99 |
100 | Engine
101 |
102 |
103 | Engine
104 |
105 |
106 |
--------------------------------------------------------------------------------
/Target/ARKSurvivalEvolved/NamesStore.cpp:
--------------------------------------------------------------------------------
1 | #include
2 |
3 | #include "PatternFinder.hpp"
4 | #include "NamesStore.hpp"
5 |
6 | #include "EngineClasses.hpp"
7 |
8 | class FNameEntry
9 | {
10 | public:
11 | static const auto NAME_WIDE_MASK = 0x1;
12 | static const auto NAME_INDEX_SHIFT = 1;
13 |
14 | int32_t Index;
15 | char UnknownData00[0x04];
16 | FNameEntry* HashNext;
17 | union
18 | {
19 | char AnsiName[1024];
20 | wchar_t WideName[1024];
21 | };
22 |
23 | inline int32_t GetIndex() const
24 | {
25 | return Index >> NAME_INDEX_SHIFT;
26 | }
27 |
28 | inline bool IsWide() const
29 | {
30 | return Index & NAME_WIDE_MASK;
31 | }
32 |
33 | inline const char* GetAnsiName() const
34 | {
35 | return AnsiName;
36 | }
37 |
38 | inline const wchar_t* GetWideName() const
39 | {
40 | return WideName;
41 | }
42 | };
43 |
44 | template
45 | class TStaticIndirectArrayThreadSafeRead
46 | {
47 | public:
48 | int32_t Num() const
49 | {
50 | return NumElements;
51 | }
52 |
53 | bool IsValidIndex(int32_t index) const
54 | {
55 | return index >= 0 && index < Num() && GetById(index) != nullptr;
56 | }
57 |
58 | ElementType const* const& GetById(int32_t index) const
59 | {
60 | return *GetItemPtr(index);
61 | }
62 |
63 | private:
64 | ElementType const* const* GetItemPtr(int32_t Index) const
65 | {
66 | int32_t ChunkIndex = Index / ElementsPerChunk;
67 | int32_t WithinChunkIndex = Index % ElementsPerChunk;
68 | ElementType** Chunk = Chunks[ChunkIndex];
69 | return Chunk + WithinChunkIndex;
70 | }
71 |
72 | enum
73 | {
74 | ChunkTableSize = (MaxTotalElements + ElementsPerChunk - 1) / ElementsPerChunk
75 | };
76 |
77 | ElementType** Chunks[ChunkTableSize];
78 | int32_t NumElements;
79 | int32_t NumChunks;
80 | };
81 |
82 | using TNameEntryArray = TStaticIndirectArrayThreadSafeRead;
83 |
84 | TNameEntryArray* GlobalNames = nullptr;
85 |
86 | bool NamesStore::Initialize()
87 | {
88 | auto address = FindPattern(GetModuleHandleW(nullptr), reinterpret_cast("\x48\x89\x83\x00\x00\x00\x00\xE8\x00\x00\x00\x00\x48\x89\x1D"), "xxx????x????xxx");
89 | if (address == -1)
90 | {
91 | return false;
92 | }
93 |
94 | address += 12;
95 |
96 | auto offset = *reinterpret_cast(address + 3);
97 | GlobalNames = reinterpret_cast(*reinterpret_cast(address + 7 + offset));
98 |
99 | return true;
100 | }
101 |
102 | void* NamesStore::GetAddress()
103 | {
104 | return GlobalNames;
105 | }
106 |
107 | size_t NamesStore::GetNamesNum() const
108 | {
109 | return GlobalNames->Num();
110 | }
111 |
112 | bool NamesStore::IsValid(size_t id) const
113 | {
114 | return GlobalNames->IsValidIndex(static_cast(id));
115 | }
116 |
117 | std::string NamesStore::GetById(size_t id) const
118 | {
119 | return GlobalNames->GetById(static_cast(id))->GetAnsiName();
120 | }
121 |
--------------------------------------------------------------------------------
/Target/ARKSurvivalEvolved/ObjectsStore.cpp:
--------------------------------------------------------------------------------
1 | #include
2 |
3 | #include "PatternFinder.hpp"
4 | #include "ObjectsStore.hpp"
5 |
6 | #include "EngineClasses.hpp"
7 |
8 | class FUObjectArray
9 | {
10 | public:
11 | int32_t ObjFirstGCIndex;
12 | int32_t ObjLastNonGCIndex;
13 | int32_t OpenForDisregardForGC;
14 |
15 | TArray ObjObjects;
16 | TArray ObjAvailable;
17 | };
18 |
19 | FUObjectArray* GlobalObjects = nullptr;
20 |
21 | bool ObjectsStore::Initialize()
22 | {
23 | auto address = FindPattern(GetModuleHandleW(nullptr), reinterpret_cast("\x48\x8D\x05\x00\x00\x00\x00\x45\x84\xC0\x48\x89\x01"), "xxx????xxxxxx");
24 | if (address == -1)
25 | {
26 | return false;
27 | }
28 |
29 | auto offset = *reinterpret_cast(address + 3);
30 | GlobalObjects = reinterpret_cast(address + 7 + offset);
31 |
32 | return true;
33 | }
34 |
35 | void* ObjectsStore::GetAddress()
36 | {
37 | return GlobalObjects;
38 | }
39 |
40 | size_t ObjectsStore::GetObjectsNum() const
41 | {
42 | return GlobalObjects->ObjObjects.Num();
43 | }
44 |
45 | UEObject ObjectsStore::GetById(size_t id) const
46 | {
47 | return GlobalObjects->ObjObjects[id];
48 | }
49 |
--------------------------------------------------------------------------------
/Target/AllPointsBulletin/NamesStore.cpp:
--------------------------------------------------------------------------------
1 | #include
2 |
3 | #include "PatternFinder.hpp"
4 | #include "NamesStore.hpp"
5 |
6 | #include "EngineClasses.hpp"
7 |
8 | class FNameEntry
9 | {
10 | public:
11 | uint32_t Flags;
12 | char pad_0x0004[0xC];
13 | union
14 | {
15 | char Name[1024];
16 | char* NamePtr;
17 | };
18 |
19 | const char* GetName() const
20 | {
21 | return Flags & 0x4000 ? NamePtr : Name;
22 | }
23 | };
24 |
25 | TArray* GlobalNames = nullptr;
26 |
27 | bool NamesStore::Initialize()
28 | {
29 | auto address = FindPattern(GetModuleHandleW(nullptr), reinterpret_cast("\x8B\x0D\x00\x00\x00\x00\x83\x3C\x81\x00"), "xx????xxxx");
30 | if (address == -1)
31 | {
32 | return false;
33 | }
34 |
35 | GlobalNames = reinterpret_cast(*reinterpret_cast(address + 2));
36 |
37 | return true;
38 | }
39 |
40 | void* NamesStore::GetAddress()
41 | {
42 | return GlobalNames;
43 | }
44 |
45 | size_t NamesStore::GetNamesNum() const
46 | {
47 | return GlobalNames->Num();
48 | }
49 |
50 | bool NamesStore::IsValid(size_t id) const
51 | {
52 | return GlobalNames->IsValidIndex(id) && (*GlobalNames)[id] != nullptr;
53 | }
54 |
55 | std::string NamesStore::GetById(size_t id) const
56 | {
57 | return (*GlobalNames)[id]->GetName();
58 | }
59 |
--------------------------------------------------------------------------------
/Target/AllPointsBulletin/ObjectsStore.cpp:
--------------------------------------------------------------------------------
1 | #include
2 |
3 | #include "PatternFinder.hpp"
4 | #include "ObjectsStore.hpp"
5 |
6 | #include "EngineClasses.hpp"
7 |
8 | TArray* GlobalObjects = nullptr;
9 |
10 | bool ObjectsStore::Initialize()
11 | {
12 | auto address = FindPattern(GetModuleHandleW(nullptr), reinterpret_cast("\xA1\x00\x00\x00\x00\x8B\x34\xB0\x85\xF6"), "x????xxxxx");
13 | if (address == -1)
14 | {
15 | return false;
16 | }
17 |
18 | GlobalObjects = reinterpret_cast(*reinterpret_cast(address + 1));
19 |
20 | return true;
21 | }
22 |
23 | void* ObjectsStore::GetAddress()
24 | {
25 | return GlobalObjects;
26 | }
27 |
28 | size_t ObjectsStore::GetObjectsNum() const
29 | {
30 | return GlobalObjects->Num();
31 | }
32 |
33 | UEObject ObjectsStore::GetById(size_t id) const
34 | {
35 | return (*GlobalObjects)[id];
36 | }
37 |
--------------------------------------------------------------------------------
/Target/AloneInTheDarkIllumination/NamesStore.cpp:
--------------------------------------------------------------------------------
1 | #include
2 |
3 | #include "PatternFinder.hpp"
4 | #include "NamesStore.hpp"
5 |
6 | #include "EngineClasses.hpp"
7 |
8 | class FNameEntry
9 | {
10 | public:
11 | __int32 Index;
12 | char pad_0x0004[0x4];
13 | FNameEntry* HashNext;
14 | union
15 | {
16 | char AnsiName[1024];
17 | wchar_t WideName[1024];
18 | };
19 |
20 | const char* GetName() const
21 | {
22 | return AnsiName;
23 | }
24 | };
25 |
26 | template
27 | class TStaticIndirectArrayThreadSafeRead
28 | {
29 | public:
30 | int32_t Num() const
31 | {
32 | return NumElements;
33 | }
34 |
35 | bool IsValidIndex(int32_t index) const
36 | {
37 | return index >= 0 && index < Num() && GetById(index) != nullptr;
38 | }
39 |
40 | ElementType const* const& GetById(int32_t index) const
41 | {
42 | return *GetItemPtr(index);
43 | }
44 |
45 | private:
46 | ElementType const* const* GetItemPtr(int32_t Index) const
47 | {
48 | int32_t ChunkIndex = Index / ElementsPerChunk;
49 | int32_t WithinChunkIndex = Index % ElementsPerChunk;
50 | ElementType** Chunk = Chunks[ChunkIndex];
51 | return Chunk + WithinChunkIndex;
52 | }
53 |
54 | enum
55 | {
56 | ChunkTableSize = (MaxTotalElements + ElementsPerChunk - 1) / ElementsPerChunk
57 | };
58 |
59 | ElementType** Chunks[ChunkTableSize];
60 | __int32 NumElements;
61 | __int32 NumChunks;
62 | };
63 |
64 | using TNameEntryArray = TStaticIndirectArrayThreadSafeRead;
65 |
66 | TNameEntryArray* GlobalNames = nullptr;
67 |
68 | bool NamesStore::Initialize()
69 | {
70 | auto address = FindPattern(GetModuleHandleW(nullptr), reinterpret_cast("\x48\x8B\x5C\x24\x00\x48\x89\x05\x00\x00\x00\x00\x48\x83\xC4\x28\xC3"), "xxxx?xxx????xxxxx");
71 | if (address == -1)
72 | {
73 | return false;
74 | }
75 |
76 | address += 5;
77 |
78 | auto offset = *reinterpret_cast(address + 3);
79 | GlobalNames = reinterpret_cast(*reinterpret_cast(address + 7 + offset));
80 |
81 | return true;
82 | }
83 |
84 | void* NamesStore::GetAddress()
85 | {
86 | return GlobalNames;
87 | }
88 |
89 | size_t NamesStore::GetNamesNum() const
90 | {
91 | return GlobalNames->Num();
92 | }
93 |
94 | bool NamesStore::IsValid(size_t id) const
95 | {
96 | return GlobalNames->IsValidIndex(static_cast(id));
97 | }
98 |
99 | std::string NamesStore::GetById(size_t id) const
100 | {
101 | return GlobalNames->GetById(static_cast(id))->GetName();
102 | }
103 |
--------------------------------------------------------------------------------
/Target/AloneInTheDarkIllumination/ObjectsStore.cpp:
--------------------------------------------------------------------------------
1 | #include
2 |
3 | #include "PatternFinder.hpp"
4 | #include "ObjectsStore.hpp"
5 |
6 | #include "EngineClasses.hpp"
7 |
8 | class FUObjectArray
9 | {
10 | public:
11 | __int32 ObjFirstGCIndex;
12 | __int32 ObjLastNonGCIndex;
13 | __int32 OpenForDisregardForGC;
14 |
15 | TArray ObjObjects;
16 | };
17 |
18 | FUObjectArray* GlobalObjects = nullptr;
19 |
20 | bool ObjectsStore::Initialize()
21 | {
22 | auto address = FindPattern(GetModuleHandleW(nullptr), reinterpret_cast("\x48\x8D\x15\x00\x00\x00\x00\x41\x8B\xF9"), "xxx????xxx");
23 | if (address == -1)
24 | {
25 | return false;
26 | }
27 |
28 | auto offset = *reinterpret_cast(address + 3);
29 | GlobalObjects = reinterpret_cast(address + 7 + offset);
30 |
31 | return true;
32 | }
33 |
34 | void* ObjectsStore::GetAddress()
35 | {
36 | return GlobalObjects;
37 | }
38 |
39 | size_t ObjectsStore::GetObjectsNum() const
40 | {
41 | return GlobalObjects->ObjObjects.Num();
42 | }
43 |
44 | UEObject ObjectsStore::GetById(size_t id) const
45 | {
46 | return GlobalObjects->ObjObjects[id];
47 | }
48 |
--------------------------------------------------------------------------------
/Target/BlazingSails/NamesStore.cpp:
--------------------------------------------------------------------------------
1 | #include
2 |
3 | #include "PatternFinder.hpp"
4 | #include "NamesStore.hpp"
5 | #include "EngineClasses.hpp"
6 |
7 | class FNameEntry
8 | {
9 | public:
10 | __int32 Index;
11 | char pad_0x0004[0x4];
12 | FNameEntry* HashNext;
13 | union
14 | {
15 | char AnsiName[1024];
16 | wchar_t WideName[1024];
17 | };
18 |
19 | const char* GetName() const
20 | {
21 | return AnsiName;
22 | }
23 | };
24 |
25 | template
26 | class TStaticIndirectArrayThreadSafeRead
27 | {
28 | public:
29 | int32_t Num() const
30 | {
31 | return NumElements;
32 | }
33 |
34 | bool IsValidIndex(int32_t index) const
35 | {
36 | return GetById(index) != nullptr;
37 | }
38 |
39 | ElementType* GetById(int32_t index) const
40 | {
41 | if (index < 0 || index >= Num()) return nullptr;
42 |
43 | int32_t ChunkIndex = index / ElementsPerChunk;
44 | int32_t WithinChunkIndex = index % ElementsPerChunk;
45 |
46 | if (ChunkIndex < 0 || ChunkIndex >= NumChunks) return nullptr;
47 |
48 | ElementType** Chunk = Chunks[ChunkIndex];
49 |
50 | if (!Chunk) return nullptr;
51 |
52 | return Chunk[WithinChunkIndex];
53 | }
54 |
55 | private:
56 | enum
57 | {
58 | ChunkTableSize = (MaxTotalElements + ElementsPerChunk - 1) / ElementsPerChunk
59 | };
60 |
61 | ElementType** Chunks[ChunkTableSize];
62 | __int32 NumElements;
63 | __int32 NumChunks;
64 | };
65 |
66 | using TNameEntryArray = TStaticIndirectArrayThreadSafeRead;
67 |
68 | TNameEntryArray* GlobalNames = nullptr;
69 |
70 | bool NamesStore::Initialize()
71 | {
72 | // 48 89 05 ? ? ? ? 48 83 C4 28 C3
73 | const auto address = FindPattern(GetModuleHandleW(NULL), reinterpret_cast(
74 | "\x48\x89\x05\x00\x00\x00\x00\x48\x83\xC4\x28\xC3"), "xxx????xxxxx");
75 | if (address == -1)
76 | {
77 | return false;
78 | }
79 |
80 | const auto offset = *reinterpret_cast(address + 3);
81 | GlobalNames = reinterpret_cast(*reinterpret_cast(address + 7 + offset));
82 |
83 | return true;
84 | }
85 |
86 | void* NamesStore::GetAddress()
87 | {
88 | return GlobalNames;
89 | }
90 |
91 | size_t NamesStore::GetNamesNum() const
92 | {
93 | return GlobalNames->Num();
94 | }
95 |
96 | bool NamesStore::IsValid(size_t id) const
97 | {
98 | return GlobalNames->IsValidIndex(static_cast(id));
99 | }
100 |
101 | std::string NamesStore::GetById(size_t id) const
102 | {
103 | auto name = GlobalNames->GetById(static_cast(id));
104 |
105 | if (name) return name->GetName();
106 |
107 | return "__UNKNOWN_NAME__";
108 | }
109 |
--------------------------------------------------------------------------------
/Target/BlazingSails/ObjectsStore.cpp:
--------------------------------------------------------------------------------
1 | #include
2 |
3 | #include "PatternFinder.hpp"
4 | #include "ObjectsStore.hpp"
5 | #include "EngineClasses.hpp"
6 |
7 | class FUObjectItem
8 | {
9 | public:
10 | UObject* Object; //0x0000
11 | int32_t Flags; //0x0008
12 | int32_t ClusterIndex; //0x000C
13 | int32_t SerialNumber; //0x0010
14 | };
15 |
16 | class TUObjectArray
17 | {
18 | public:
19 | enum
20 | {
21 | NumElementsPerChunk = 64 * 1024, //66560 = 0x10400
22 | };
23 |
24 | FUObjectItem** Objects;
25 | FUObjectItem* PreAllocatedObjects;
26 | int32_t MaxElements;
27 | int32_t NumElements;
28 | int32_t MaxChunks;
29 | int32_t NumChunks;
30 |
31 | int32_t Num() const
32 | {
33 | return NumElements;
34 | }
35 |
36 | bool IsValidIndex(int32_t Index) const
37 | {
38 | return Index < Num() && Index >= 0;
39 | }
40 |
41 | FUObjectItem* GetObjectPtr(size_t Index) const
42 | {
43 | const int32_t ChunkIndex = Index / NumElementsPerChunk;
44 | const int32_t WithinChunkIndex = Index % NumElementsPerChunk;
45 | FUObjectItem* Chunk = Objects[ChunkIndex];
46 | return Chunk + WithinChunkIndex;
47 | }
48 |
49 | UObject* GetUObject(int32_t Index) const
50 | {
51 | UObject* result = nullptr;
52 | if(IsValidIndex(Index))
53 | {
54 | const int32_t ChunkIndex = Index / NumElementsPerChunk;
55 | const int32_t WithinChunkIndex = Index % NumElementsPerChunk;
56 | FUObjectItem* Chunk = Objects[ChunkIndex];
57 | if(Chunk != nullptr)
58 | {
59 | FUObjectItem* object = Chunk + WithinChunkIndex;
60 | if(object != nullptr)
61 | {
62 | result = object->Object;
63 | }
64 | }
65 | }
66 | return result;
67 | }
68 | };
69 |
70 | class FUObjectArray
71 | {
72 | public:
73 | /*int32_t ObjFirstGCIndex; The FindPattern searchs directly for ObjObjects
74 | int32_t ObjLastNonGCIndex;
75 | int32_t MaxObjectsNotConsideredByGC;
76 | bool OpenForDisregardForGC;*/
77 |
78 | TUObjectArray ObjObjects;
79 | };
80 |
81 | FUObjectArray* GlobalObjects = nullptr;
82 |
83 | bool ObjectsStore::Initialize()
84 | {
85 | // 48 8B 05 ? ? ? ? 48 8B 0C C8 48 8D 04 D1 EB 03 49 8B C1
86 | // 48 8D 14 40 48 8B 05 ? ? ? ? 48 8B 0C C8 48 8D 04 D1 EB 03 49 8B C1 + 4
87 | auto address = FindPattern(GetModuleHandleW(nullptr), reinterpret_cast(
88 | "\x48\x8B\x05\x00\x00\x00\x00\x48\x8B\x0C\xC8\x48\x8D\x04\xD1\xEB\x03\x49\x8B\xC1"), "xxx????xxxxxxxxxxxxx");
89 |
90 | if (address == -1)
91 | {
92 | return false;
93 | }
94 | const auto offset = *reinterpret_cast(address + 3);
95 | GlobalObjects = reinterpret_cast(address + 7 + offset);
96 |
97 | return true;
98 | }
99 |
100 | void* ObjectsStore::GetAddress()
101 | {
102 | return GlobalObjects;
103 | }
104 |
105 | size_t ObjectsStore::GetObjectsNum() const
106 | {
107 | return GlobalObjects->ObjObjects.Num();
108 | }
109 |
110 | UEObject ObjectsStore::GetById(size_t id) const
111 | {
112 | return GlobalObjects->ObjObjects.GetUObject(id);
113 | }
114 |
--------------------------------------------------------------------------------
/Target/Borderlands2/NamesStore.cpp:
--------------------------------------------------------------------------------
1 | #include
2 |
3 | #include "PatternFinder.hpp"
4 | #include "NamesStore.hpp"
5 |
6 | #include "EngineClasses.hpp"
7 |
8 | class FNameEntry
9 | {
10 | public:
11 | char UnknownData00[0x10];
12 | char Name[1024];
13 |
14 | std::string GetName() const
15 | {
16 | return Name;
17 | }
18 | };
19 |
20 | TArray* GlobalNames = nullptr;
21 |
22 | bool NamesStore::Initialize()
23 | {
24 | // 8B 0D ? ? ? ? 83 3C 81 00 74
25 | auto address = FindPattern(GetModuleHandleW(nullptr), reinterpret_cast("\x8B\x0D\x00\x00\x00\x00\x83\x3C\x81\x00\x74"), "xx????xxxxx");
26 | if (address == -1)
27 | {
28 | return false;
29 | }
30 |
31 | GlobalNames = reinterpret_cast(*reinterpret_cast(address + 2));
32 |
33 | return true;
34 | }
35 |
36 | void* NamesStore::GetAddress()
37 | {
38 | return GlobalNames;
39 | }
40 |
41 | size_t NamesStore::GetNamesNum() const
42 | {
43 | return GlobalNames->Num();
44 | }
45 |
46 | bool NamesStore::IsValid(size_t id) const
47 | {
48 | return GlobalNames->IsValidIndex(id) && (*GlobalNames)[id] != nullptr;
49 | }
50 |
51 | std::string NamesStore::GetById(size_t id) const
52 | {
53 | return (*GlobalNames)[id]->GetName();
54 | }
55 |
--------------------------------------------------------------------------------
/Target/Borderlands2/ObjectsStore.cpp:
--------------------------------------------------------------------------------
1 | #include
2 |
3 | #include "PatternFinder.hpp"
4 | #include "ObjectsStore.hpp"
5 |
6 | #include "EngineClasses.hpp"
7 |
8 | TArray* GlobalObjects = nullptr;
9 |
10 | bool ObjectsStore::Initialize()
11 | {
12 | auto address = FindPattern(GetModuleHandleW(nullptr), reinterpret_cast("\xA1\x00\x00\x00\x00\x8B\x00\x00\x8B\x00\x00\x25\x00\x02\x00\x00"), "x????x??x??xxxxx");
13 | if (address == -1)
14 | {
15 | return false;
16 | }
17 |
18 | GlobalObjects = reinterpret_cast(*reinterpret_cast(address + 1));
19 |
20 | return true;
21 | }
22 |
23 | void* ObjectsStore::GetAddress()
24 | {
25 | return GlobalObjects;
26 | }
27 |
28 | size_t ObjectsStore::GetObjectsNum() const
29 | {
30 | return GlobalObjects->Num();
31 | }
32 |
33 | UEObject ObjectsStore::GetById(size_t id) const
34 | {
35 | return (*GlobalObjects)[id];
36 | }
37 |
--------------------------------------------------------------------------------
/Target/DeepRockGalactic/NamesStore.cpp:
--------------------------------------------------------------------------------
1 | #include
2 |
3 | #include "PatternFinder.hpp"
4 | #include "NamesStore.hpp"
5 | #include "EngineClasses.hpp"
6 |
7 | class FNameEntry
8 | {
9 | public:
10 | __int32 Index;
11 | char pad_0x0004[0x4];
12 | FNameEntry* HashNext;
13 | union
14 | {
15 | char AnsiName[1024];
16 | wchar_t WideName[1024];
17 | };
18 |
19 | const char* GetName() const
20 | {
21 | return AnsiName;
22 | }
23 | };
24 |
25 | template
26 | class TStaticIndirectArrayThreadSafeRead
27 | {
28 | public:
29 | int32_t Num() const
30 | {
31 | return NumElements;
32 | }
33 |
34 | bool IsValidIndex(int32_t index) const
35 | {
36 | return GetById(index) != nullptr;
37 | }
38 |
39 | ElementType* GetById(int32_t index) const
40 | {
41 | if (index < 0 || index >= Num()) return nullptr;
42 |
43 | int32_t ChunkIndex = index / ElementsPerChunk;
44 | int32_t WithinChunkIndex = index % ElementsPerChunk;
45 |
46 | if (ChunkIndex < 0 || ChunkIndex >= NumChunks) return nullptr;
47 |
48 | ElementType** Chunk = Chunks[ChunkIndex];
49 |
50 | if (!Chunk) return nullptr;
51 |
52 | return Chunk[WithinChunkIndex];
53 | }
54 |
55 | private:
56 | enum
57 | {
58 | ChunkTableSize = (MaxTotalElements + ElementsPerChunk - 1) / ElementsPerChunk
59 | };
60 |
61 | ElementType** Chunks[ChunkTableSize];
62 | __int32 NumElements;
63 | __int32 NumChunks;
64 | };
65 |
66 | using TNameEntryArray = TStaticIndirectArrayThreadSafeRead;
67 |
68 | TNameEntryArray* GlobalNames = nullptr;
69 |
70 | bool NamesStore::Initialize()
71 | {
72 | // 48 89 05 ? ? ? ? 48 83 C4 28 C3
73 | const auto address = FindPattern(GetModuleHandleW(NULL), reinterpret_cast(
74 | "\x48\x89\x05\x00\x00\x00\x00\x48\x83\xC4\x28\xC3"), "xxx????xxxxx");
75 | if (address == -1)
76 | {
77 | return false;
78 | }
79 |
80 | const auto offset = *reinterpret_cast(address + 3);
81 | GlobalNames = reinterpret_cast(*reinterpret_cast(address + 7 + offset));
82 |
83 | return true;
84 | }
85 |
86 | void* NamesStore::GetAddress()
87 | {
88 | return GlobalNames;
89 | }
90 |
91 | size_t NamesStore::GetNamesNum() const
92 | {
93 | return GlobalNames->Num();
94 | }
95 |
96 | bool NamesStore::IsValid(size_t id) const
97 | {
98 | return GlobalNames->IsValidIndex(static_cast(id));
99 | }
100 |
101 | std::string NamesStore::GetById(size_t id) const
102 | {
103 | auto name = GlobalNames->GetById(static_cast(id));
104 |
105 | if (name) return name->GetName();
106 |
107 | return "__UNKNOWN_NAME__";
108 | }
109 |
--------------------------------------------------------------------------------
/Target/DeepRockGalactic/ObjectsStore.cpp:
--------------------------------------------------------------------------------
1 | #include
2 |
3 | #include "PatternFinder.hpp"
4 | #include "ObjectsStore.hpp"
5 | #include "EngineClasses.hpp"
6 |
7 | class FUObjectItem
8 | {
9 | public:
10 | UObject* Object; //0x0000
11 | int32_t Flags; //0x0008
12 | int32_t ClusterIndex; //0x000C
13 | int32_t SerialNumber; //0x0010
14 | };
15 |
16 | class TUObjectArray
17 | {
18 | public:
19 | enum
20 | {
21 | NumElementsPerChunk = 64 * 1024, //66560 = 0x10400
22 | };
23 |
24 | FUObjectItem** Objects;
25 | FUObjectItem* PreAllocatedObjects;
26 | int32_t MaxElements;
27 | int32_t NumElements;
28 | int32_t MaxChunks;
29 | int32_t NumChunks;
30 |
31 | int32_t Num() const
32 | {
33 | return NumElements;
34 | }
35 |
36 | bool IsValidIndex(int32_t Index) const
37 | {
38 | return Index < Num() && Index >= 0;
39 | }
40 |
41 | FUObjectItem* GetObjectPtr(size_t Index) const
42 | {
43 | const int32_t ChunkIndex = Index / NumElementsPerChunk;
44 | const int32_t WithinChunkIndex = Index % NumElementsPerChunk;
45 | FUObjectItem* Chunk = Objects[ChunkIndex];
46 | return Chunk + WithinChunkIndex;
47 | }
48 |
49 | UObject* GetUObject(int32_t Index) const
50 | {
51 | UObject* result = nullptr;
52 | if(IsValidIndex(Index))
53 | {
54 | const int32_t ChunkIndex = Index / NumElementsPerChunk;
55 | const int32_t WithinChunkIndex = Index % NumElementsPerChunk;
56 | FUObjectItem* Chunk = Objects[ChunkIndex];
57 | if(Chunk != nullptr)
58 | {
59 | FUObjectItem* object = Chunk + WithinChunkIndex;
60 | if(object != nullptr)
61 | {
62 | result = object->Object;
63 | }
64 | }
65 | }
66 | return result;
67 | }
68 | };
69 |
70 | class FUObjectArray
71 | {
72 | public:
73 | /*int32_t ObjFirstGCIndex; The FindPattern searchs directly for ObjObjects
74 | int32_t ObjLastNonGCIndex;
75 | int32_t MaxObjectsNotConsideredByGC;
76 | bool OpenForDisregardForGC;*/
77 |
78 | TUObjectArray ObjObjects;
79 | };
80 |
81 | FUObjectArray* GlobalObjects = nullptr;
82 |
83 | bool ObjectsStore::Initialize()
84 | {
85 | // 48 8B 05 ? ? ? ? 48 8B 0C C8 48 8D 04 D1 EB 03 49 8B C1
86 | // 48 8D 14 40 48 8B 05 ? ? ? ? 48 8B 0C C8 48 8D 04 D1 EB 03 49 8B C1 + 4
87 | auto address = FindPattern(GetModuleHandleW(nullptr), reinterpret_cast(
88 | "\x48\x8D\x14\x40\x48\x8B\x05\x00\x00\x00\x00\x48\x8B\x0C\xC8\x48\x8D\x04\xD1\xEB\x03\x49\x8B\xC1"), "xxxxxxx????xxxxxxxxxxxxx");
89 |
90 | if (address == -1)
91 | {
92 | return false;
93 | }
94 | address += 4;
95 | const auto offset = *reinterpret_cast(address + 3);
96 | GlobalObjects = reinterpret_cast(address + 7 + offset);
97 |
98 | return true;
99 | }
100 |
101 | void* ObjectsStore::GetAddress()
102 | {
103 | return GlobalObjects;
104 | }
105 |
106 | size_t ObjectsStore::GetObjectsNum() const
107 | {
108 | return GlobalObjects->ObjObjects.Num();
109 | }
110 |
111 | UEObject ObjectsStore::GetById(size_t id) const
112 | {
113 | return GlobalObjects->ObjObjects.GetUObject(id);
114 | }
115 |
--------------------------------------------------------------------------------
/Target/Fortnite/Fortnite.rcnet:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/igromanru/UnrealEngineSDKGenerator/8ae8f3cc5737ab62594ed1ef5f459c4f06190fbf/Target/Fortnite/Fortnite.rcnet
--------------------------------------------------------------------------------
/Target/Fortnite/NamesStore.cpp:
--------------------------------------------------------------------------------
1 | #include
2 |
3 | #include "PatternFinder.hpp"
4 | #include "NamesStore.hpp"
5 |
6 | #include "EngineClasses.hpp"
7 |
8 | class FNameEntry
9 | {
10 | public:
11 | __int32 Index;
12 | char pad_0x0004[0x4];
13 | FNameEntry* HashNext;
14 | union
15 | {
16 | char AnsiName[1024];
17 | wchar_t WideName[1024];
18 | };
19 |
20 | const char* GetName() const
21 | {
22 | return AnsiName;
23 | }
24 | };
25 |
26 | template
27 | class TStaticIndirectArrayThreadSafeRead
28 | {
29 | public:
30 | int32_t Num() const
31 | {
32 | return NumElements;
33 | }
34 |
35 | bool IsValidIndex(int32_t index) const
36 | {
37 | return index >= 0 && index < Num() && GetById(index) != nullptr;
38 | }
39 |
40 | ElementType const* const& GetById(int32_t index) const
41 | {
42 | return *GetItemPtr(index);
43 | }
44 |
45 | private:
46 | ElementType const* const* GetItemPtr(int32_t Index) const
47 | {
48 | int32_t ChunkIndex = Index / ElementsPerChunk;
49 | int32_t WithinChunkIndex = Index % ElementsPerChunk;
50 | ElementType** Chunk = Chunks[ChunkIndex];
51 | return Chunk + WithinChunkIndex;
52 | }
53 |
54 | enum
55 | {
56 | ChunkTableSize = (MaxTotalElements + ElementsPerChunk - 1) / ElementsPerChunk
57 | };
58 |
59 | ElementType** Chunks[ChunkTableSize];
60 | __int32 NumElements;
61 | __int32 NumChunks;
62 | };
63 |
64 | using TNameEntryArray = TStaticIndirectArrayThreadSafeRead;
65 |
66 | TNameEntryArray* GlobalNames = nullptr;
67 |
68 | bool NamesStore::Initialize()
69 | {
70 | const auto address = FindPattern(GetModuleHandleW(L"FortniteClient-Win64-Shipping.exe"), reinterpret_cast("\x48\x89\x1D\x00\x00\x00\x00\x48\x8B\x5C\x24\x00\x48\x83\xC4\x28\xC3\x48\x8B\x5C\x24\x00\x48\x89\x05\x00\x00\x00\x00\x48\x83\xC4\x28\xC3"), "xxx????xxxx?xxxxxxxxx?xxx????xxxxx");
71 | if (address == -1)
72 | {
73 | return false;
74 | }
75 |
76 | const auto offset = *reinterpret_cast(address + 3);
77 | GlobalNames = reinterpret_cast(*reinterpret_cast(address + 7 + offset));
78 |
79 | return true;
80 | }
81 |
82 | void* NamesStore::GetAddress()
83 | {
84 | return GlobalNames;
85 | }
86 |
87 | size_t NamesStore::GetNamesNum() const
88 | {
89 | return GlobalNames->Num();
90 | }
91 |
92 | bool NamesStore::IsValid(size_t id) const
93 | {
94 | return GlobalNames->IsValidIndex(static_cast(id));
95 | }
96 |
97 | std::string NamesStore::GetById(size_t id) const
98 | {
99 | return GlobalNames->GetById(static_cast(id))->GetName();
100 | }
101 |
--------------------------------------------------------------------------------
/Target/Fortnite/ObjectsStore.cpp:
--------------------------------------------------------------------------------
1 | #include
2 |
3 | #include "PatternFinder.hpp"
4 | #include "ObjectsStore.hpp"
5 |
6 | #include "EngineClasses.hpp"
7 |
8 | class FUObjectItem
9 | {
10 | public:
11 | UObject* Object; //0x0000
12 | __int32 Flags; //0x0008
13 | __int32 ClusterIndex; //0x000C
14 | __int32 SerialNumber; //0x0010
15 | };
16 |
17 | class TUObjectArray
18 | {
19 | public:
20 | FUObjectItem* Objects;
21 | int32_t MaxElements;
22 | int32_t NumElements;
23 | };
24 |
25 | class FUObjectArray
26 | {
27 | public:
28 | __int32 ObjFirstGCIndex; //0x0000
29 | __int32 ObjLastNonGCIndex; //0x0004
30 | __int32 MaxObjectsNotConsideredByGC; //0x0008
31 | __int32 OpenForDisregardForGC; //0x000C
32 |
33 | TUObjectArray ObjObjects; //0x0010
34 | };
35 |
36 | FUObjectArray* GlobalObjects = nullptr;
37 |
38 | bool ObjectsStore::Initialize()
39 | {
40 | const auto address = FindPattern(GetModuleHandleW(L"FortniteClient-Win64-Shipping.exe"), reinterpret_cast("\x48\x8D\x05\x00\x00\x00\x00\x48\x89\x01\x33\xC9\x84\xD2\x41\x8B\x40\x08\x49\x89\x48\x10\x0F\x45\x05\x00\x00\x00\x00\xFF\xC0\x49\x89\x48\x10\x41\x89\x40\x08"), "xxx????xxxxxxxxxxxxxxxxxx????xxxxxxxxxx");
41 | if (address == -1)
42 | {
43 | return false;
44 | }
45 |
46 | const auto offset = *reinterpret_cast(address + 3);
47 | GlobalObjects = reinterpret_cast(address + 7 + offset);
48 |
49 | return true;
50 | }
51 |
52 | void* ObjectsStore::GetAddress()
53 | {
54 | return GlobalObjects;
55 | }
56 |
57 | size_t ObjectsStore::GetObjectsNum() const
58 | {
59 | return GlobalObjects->ObjObjects.NumElements;
60 | }
61 |
62 | UEObject ObjectsStore::GetById(size_t id) const
63 | {
64 | return GlobalObjects->ObjObjects.Objects[id].Object;
65 | }
66 |
--------------------------------------------------------------------------------
/Target/Hawken/NamesStore.cpp:
--------------------------------------------------------------------------------
1 | #include
2 |
3 | #include "PatternFinder.hpp"
4 | #include "NamesStore.hpp"
5 |
6 | #include "EngineClasses.hpp"
7 |
8 | class FNameEntry
9 | {
10 | static const auto NAME_WIDE_MASK = 0x1;
11 | static const auto NAME_INDEX_SHIFT = 1;
12 |
13 | public:
14 | uint64_t Flags;
15 | uint32_t Index;
16 | FNameEntry* HashNext;
17 | union
18 | {
19 | char AnsiName[1024];
20 | wchar_t WideName[1024];
21 | };
22 |
23 | inline const int32_t GetIndex() const
24 | {
25 | return Index >> NAME_INDEX_SHIFT;
26 | }
27 |
28 | inline bool IsWide() const
29 | {
30 | return Index & NAME_WIDE_MASK;
31 | }
32 |
33 | inline const char* GetAnsiName() const
34 | {
35 | return AnsiName;
36 | }
37 |
38 | inline const wchar_t* GetWideName() const
39 | {
40 | return WideName;
41 | }
42 |
43 | std::string GetName() const
44 | {
45 | if (IsWide())
46 | {
47 | auto length = std::wcslen(WideName);
48 |
49 | std::string str(length, '\0');
50 |
51 | std::use_facet>(std::locale()).narrow(WideName, WideName + length, '?', &str[0]);
52 |
53 | return str;
54 | }
55 | else
56 | {
57 | return AnsiName;
58 | }
59 | }
60 | };
61 |
62 | TArray* GlobalNames = nullptr;
63 |
64 | bool NamesStore::Initialize()
65 | {
66 | auto address = FindPattern(GetModuleHandleW(nullptr), reinterpret_cast("\x8B\x0D\x00\x00\x00\x00\x83\x3C\x81\x00\x74"), "xx????xxxxx");
67 | if (address == -1)
68 | {
69 | return false;
70 | }
71 |
72 | GlobalNames = reinterpret_cast(*reinterpret_cast(address + 2));
73 |
74 | return true;
75 | }
76 |
77 | void* NamesStore::GetAddress()
78 | {
79 | return GlobalNames;
80 | }
81 |
82 | size_t NamesStore::GetNamesNum() const
83 | {
84 | return GlobalNames->Num();
85 | }
86 |
87 | bool NamesStore::IsValid(size_t id) const
88 | {
89 | return GlobalNames->IsValidIndex(id) && (*GlobalNames)[id] != nullptr;
90 | }
91 |
92 | std::string NamesStore::GetById(size_t id) const
93 | {
94 | return (*GlobalNames)[id]->GetName();
95 | }
96 |
--------------------------------------------------------------------------------
/Target/Hawken/ObjectsStore.cpp:
--------------------------------------------------------------------------------
1 | #include
2 |
3 | #include "PatternFinder.hpp"
4 | #include "ObjectsStore.hpp"
5 |
6 | #include "EngineClasses.hpp"
7 |
8 | TArray* GlobalObjects = nullptr;
9 |
10 | bool ObjectsStore::Initialize()
11 | {
12 | auto address = FindPattern(GetModuleHandleW(nullptr), reinterpret_cast("\xA1\x00\x00\x00\x00\x8B\x00\x00\x8B\x00\x00\x25\x00\x02\x00\x00"), "x????x??x??xxxxx");
13 | if (address == -1)
14 | {
15 | return false;
16 | }
17 |
18 | GlobalObjects = reinterpret_cast(*reinterpret_cast(address + 1));
19 |
20 | return true;
21 | }
22 |
23 | void* ObjectsStore::GetAddress()
24 | {
25 | return GlobalObjects;
26 | }
27 |
28 | size_t ObjectsStore::GetObjectsNum() const
29 | {
30 | return GlobalObjects->Num();
31 | }
32 |
33 | UEObject ObjectsStore::GetById(size_t id) const
34 | {
35 | return (*GlobalObjects)[id];
36 | }
37 |
--------------------------------------------------------------------------------
/Target/Paragon/NamesStore.cpp:
--------------------------------------------------------------------------------
1 | #include
2 |
3 | #include "PatternFinder.hpp"
4 | #include "NamesStore.hpp"
5 |
6 | #include "EngineClasses.hpp"
7 |
8 | class FNameEntry
9 | {
10 | public:
11 | __int32 Index;
12 | char pad_0x0004[0x4];
13 | FNameEntry* HashNext;
14 | union
15 | {
16 | char AnsiName[1024];
17 | wchar_t WideName[1024];
18 | };
19 |
20 | const char* GetName() const
21 | {
22 | return AnsiName;
23 | }
24 | };
25 |
26 | template
27 | class TStaticIndirectArrayThreadSafeRead
28 | {
29 | public:
30 | int32_t Num() const
31 | {
32 | return NumElements;
33 | }
34 |
35 | bool IsValidIndex(int32_t index) const
36 | {
37 | return index >= 0 && index < Num() && GetById(index) != nullptr;
38 | }
39 |
40 | ElementType const* const& GetById(int32_t index) const
41 | {
42 | return *GetItemPtr(index);
43 | }
44 |
45 | private:
46 | ElementType const* const* GetItemPtr(int32_t Index) const
47 | {
48 | int32_t ChunkIndex = Index / ElementsPerChunk;
49 | int32_t WithinChunkIndex = Index % ElementsPerChunk;
50 | ElementType** Chunk = Chunks[ChunkIndex];
51 | return Chunk + WithinChunkIndex;
52 | }
53 |
54 | enum
55 | {
56 | ChunkTableSize = (MaxTotalElements + ElementsPerChunk - 1) / ElementsPerChunk
57 | };
58 |
59 | ElementType** Chunks[ChunkTableSize];
60 | __int32 NumElements;
61 | __int32 NumChunks;
62 | };
63 |
64 | using TNameEntryArray = TStaticIndirectArrayThreadSafeRead;
65 |
66 | TNameEntryArray* GlobalNames = nullptr;
67 |
68 | bool NamesStore::Initialize()
69 | {
70 | auto address = FindPattern(GetModuleHandleW(nullptr), reinterpret_cast("\x48\x89\x05\x00\x00\x00\x00\x48\x83\xC4\x28\xC3\xE9"), "xxx????xxxxxx");
71 | if (address == -1)
72 | {
73 | return false;
74 | }
75 |
76 | auto offset = *reinterpret_cast(address + 3);
77 | GlobalNames = reinterpret_cast(*reinterpret_cast(address + 7 + offset));
78 |
79 | return true;
80 | }
81 |
82 | void* NamesStore::GetAddress()
83 | {
84 | return GlobalNames;
85 | }
86 |
87 | size_t NamesStore::GetNamesNum() const
88 | {
89 | return GlobalNames->Num();
90 | }
91 |
92 | bool NamesStore::IsValid(size_t id) const
93 | {
94 | return GlobalNames->IsValidIndex(static_cast(id));
95 | }
96 |
97 | std::string NamesStore::GetById(size_t id) const
98 | {
99 | return GlobalNames->GetById(static_cast(id))->GetName();
100 | }
101 |
--------------------------------------------------------------------------------
/Target/Paragon/ObjectsStore.cpp:
--------------------------------------------------------------------------------
1 | #include
2 |
3 | #include "PatternFinder.hpp"
4 | #include "ObjectsStore.hpp"
5 |
6 | #include "EngineClasses.hpp"
7 |
8 | class FUObjectItem
9 | {
10 | public:
11 | UObject* Object; //0x0000
12 | __int32 Flags; //0x0008
13 | __int32 ClusterIndex; //0x000C
14 | __int32 SerialNumber; //0x0010
15 | };
16 |
17 | class TUObjectArray
18 | {
19 | public:
20 | FUObjectItem* Objects;
21 | int32_t MaxElements;
22 | int32_t NumElements;
23 | };
24 |
25 | class FUObjectArray
26 | {
27 | public:
28 | __int32 ObjFirstGCIndex; //0x0000
29 | __int32 ObjLastNonGCIndex; //0x0004
30 | __int32 MaxObjectsNotConsideredByGC; //0x0008
31 | __int32 OpenForDisregardForGC; //0x000C
32 |
33 | TUObjectArray ObjObjects; //0x0010
34 | };
35 |
36 | FUObjectArray* GlobalObjects = nullptr;
37 |
38 | bool ObjectsStore::Initialize()
39 | {
40 | auto address = FindPattern(GetModuleHandleW(nullptr), reinterpret_cast("\x48\x8D\x15\x00\x00\x00\x00\x48\x8D\x4C\x24\x00\x45\x8B\xFE"), "xxx????xxxx?xxx");
41 | if (address == -1)
42 | {
43 | return false;
44 | }
45 | auto offset = *reinterpret_cast(address + 3);
46 | GlobalObjects = reinterpret_cast(address + 7 + offset);
47 |
48 | return true;
49 | }
50 |
51 | void* ObjectsStore::GetAddress()
52 | {
53 | return GlobalObjects;
54 | }
55 |
56 | size_t ObjectsStore::GetObjectsNum() const
57 | {
58 | return GlobalObjects->ObjObjects.NumElements;
59 | }
60 |
61 | UEObject ObjectsStore::GetById(size_t id) const
62 | {
63 | return GlobalObjects->ObjObjects.Objects[id].Object;
64 | }
65 |
--------------------------------------------------------------------------------
/Target/RocketLeague/NamesStore.cpp:
--------------------------------------------------------------------------------
1 | #include
2 |
3 | #include "PatternFinder.hpp"
4 | #include "NamesStore.hpp"
5 |
6 | #include "EngineClasses.hpp"
7 |
8 | class FNameEntry
9 | {
10 | static const auto NAME_WIDE_MASK = 0x1;
11 | static const auto NAME_INDEX_SHIFT = 1;
12 |
13 | public:
14 | uint64_t Flags;
15 | uint32_t Index;
16 | FNameEntry* HashNext;
17 | union
18 | {
19 | char AnsiName[1024];
20 | wchar_t WideName[1024];
21 | };
22 |
23 | inline const int32_t GetIndex() const
24 | {
25 | return Index >> NAME_INDEX_SHIFT;
26 | }
27 |
28 | inline bool IsWide() const
29 | {
30 | return Index & NAME_WIDE_MASK;
31 | }
32 |
33 | inline const char* GetAnsiName() const
34 | {
35 | return AnsiName;
36 | }
37 |
38 | inline const wchar_t* GetWideName() const
39 | {
40 | return WideName;
41 | }
42 |
43 | std::string GetName() const
44 | {
45 | if (IsWide())
46 | {
47 | auto length = std::wcslen(WideName);
48 |
49 | std::string str(length, '\0');
50 |
51 | std::use_facet>(std::locale()).narrow(WideName, WideName + length, '?', &str[0]);
52 |
53 | return str;
54 | }
55 | else
56 | {
57 | return AnsiName;
58 | }
59 | }
60 | };
61 |
62 | TArray* GlobalNames = nullptr;
63 |
64 | bool NamesStore::Initialize()
65 | {
66 | auto address = FindPattern(GetModuleHandleW(nullptr), reinterpret_cast("\x8B\x0D\x00\x00\x00\x00\x83\x3C\x81\x00\x74"), "xx????xxxxx");
67 | if (address == -1)
68 | {
69 | return false;
70 | }
71 |
72 | GlobalNames = reinterpret_cast(*reinterpret_cast(address + 2));
73 |
74 | return true;
75 | }
76 |
77 | void* NamesStore::GetAddress()
78 | {
79 | return GlobalNames;
80 | }
81 |
82 | size_t NamesStore::GetNamesNum() const
83 | {
84 | return GlobalNames->Num();
85 | }
86 |
87 | bool NamesStore::IsValid(size_t id) const
88 | {
89 | return GlobalNames->IsValidIndex(id) && (*GlobalNames)[id] != nullptr;
90 | }
91 |
92 | std::string NamesStore::GetById(size_t id) const
93 | {
94 | return (*GlobalNames)[id]->GetName();
95 | }
96 |
--------------------------------------------------------------------------------
/Target/RocketLeague/ObjectsStore.cpp:
--------------------------------------------------------------------------------
1 | #include
2 |
3 | #include "PatternFinder.hpp"
4 | #include "ObjectsStore.hpp"
5 |
6 | #include "EngineClasses.hpp"
7 |
8 | TArray* GlobalObjects = nullptr;
9 |
10 | bool ObjectsStore::Initialize()
11 | {
12 | auto address = FindPattern(GetModuleHandleW(nullptr), reinterpret_cast("\xA1\x00\x00\x00\x00\x8B\x00\x00\x8B\x00\x00\x25\x00\x02\x00\x00"), "x????x??x??xxxxx");
13 | if (address == -1)
14 | {
15 | return false;
16 | }
17 |
18 | GlobalObjects = reinterpret_cast(*reinterpret_cast(address + 1));
19 |
20 | return true;
21 | }
22 |
23 | void* ObjectsStore::GetAddress()
24 | {
25 | return GlobalObjects;
26 | }
27 |
28 | size_t ObjectsStore::GetObjectsNum() const
29 | {
30 | return GlobalObjects->Num();
31 | }
32 |
33 | UEObject ObjectsStore::GetById(size_t id) const
34 | {
35 | return (*GlobalObjects)[id];
36 | }
37 |
--------------------------------------------------------------------------------
/Target/RocketLeague/RocketLeague.rcnet:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/igromanru/UnrealEngineSDKGenerator/8ae8f3cc5737ab62594ed1ef5f459c4f06190fbf/Target/RocketLeague/RocketLeague.rcnet
--------------------------------------------------------------------------------
/Target/SeaOfThieves/NamesStore.cpp:
--------------------------------------------------------------------------------
1 | #include
2 |
3 | #include "PatternFinder.hpp"
4 | #include "NamesStore.hpp"
5 |
6 | #include "EngineClasses.hpp"
7 |
8 | // This class contains the class which allows the generator access to global names list.
9 |
10 | class FNameEntry
11 | {
12 | public:
13 | int32_t Index;
14 | char pad_0x0004[0x4];
15 | FNameEntry* HashNext;
16 | union
17 | {
18 | char AnsiName[1024];
19 | wchar_t WideName[1024];
20 | };
21 |
22 | const char* GetName() const
23 | {
24 | return AnsiName;
25 | }
26 | };
27 |
28 | template
29 | class TStaticIndirectArrayThreadSafeRead
30 | {
31 | public:
32 | int32_t Num() const
33 | {
34 | return NumElements;
35 | }
36 |
37 | bool IsValidIndex(int32_t index) const
38 | {
39 | return GetById(index) != nullptr;
40 | }
41 |
42 | ElementType* GetById(int32_t index) const
43 | {
44 | if (index < 0 || index >= Num()) return nullptr;
45 |
46 | int32_t ChunkIndex = index / ElementsPerChunk;
47 | int32_t WithinChunkIndex = index % ElementsPerChunk;
48 |
49 | if (ChunkIndex < 0 || ChunkIndex >= NumChunks) return nullptr;
50 |
51 | ElementType** Chunk = Chunks[ChunkIndex];
52 |
53 | if (!Chunk) return nullptr;
54 |
55 | return Chunk[WithinChunkIndex];
56 | }
57 |
58 | private:
59 | enum
60 | {
61 | ChunkTableSize = (MaxTotalElements + ElementsPerChunk - 1) / ElementsPerChunk
62 | };
63 |
64 | ElementType** Chunks[ChunkTableSize];
65 | __int32 NumElements;
66 | __int32 NumChunks;
67 | };
68 |
69 | using TNameEntryArray = TStaticIndirectArrayThreadSafeRead;
70 |
71 | TNameEntryArray* GlobalNames = nullptr;
72 |
73 | bool NamesStore::Initialize()
74 | {
75 | // 48 8B 1D ? ? ? ? 48 85 DB 75 ? B9 08 04 00 00
76 | const auto address = FindPattern(GetModuleHandleW(nullptr), reinterpret_cast(
77 | "\x48\x8B\x1D\x00\x00\x00\x00\x48\x85\xDB\x75\x00\xB9\x08\x04\x00\x00"), "xxx????xxxx?xxxxx");
78 | if (address == -1)
79 | {
80 | return false;
81 | }
82 | const auto offset = *reinterpret_cast(address + 3);
83 | GlobalNames = reinterpret_cast(*reinterpret_cast(address + 7 + offset));
84 |
85 | return true;
86 | }
87 |
88 | void* NamesStore::GetAddress()
89 | {
90 | return GlobalNames;
91 | }
92 |
93 | size_t NamesStore::GetNamesNum() const
94 | {
95 | return GlobalNames->Num();
96 | }
97 |
98 | bool NamesStore::IsValid(size_t id) const
99 | {
100 | return GlobalNames->IsValidIndex(static_cast(id));
101 | }
102 |
103 | std::string NamesStore::GetById(size_t id) const
104 | {
105 | auto name = GlobalNames->GetById(static_cast(id));
106 |
107 | if (name) return name->GetName();
108 |
109 | return "__UNKNOWN_NAME__";
110 | }
111 |
--------------------------------------------------------------------------------
/Target/SeaOfThieves/ObjectsStore.cpp:
--------------------------------------------------------------------------------
1 | #include
2 |
3 | #include "PatternFinder.hpp"
4 | #include "ObjectsStore.hpp"
5 |
6 | #include "EngineClasses.hpp"
7 |
8 | // This class contains the class which allows the generator access to global objects list.
9 |
10 | class FUObjectItem
11 | {
12 | public:
13 | UObject* Object; //0x0000
14 | int32_t Flags; //0x0008
15 | int32_t ClusterIndex; //0x000C
16 | int32_t SerialNumber; //0x0010
17 | };
18 |
19 | class TUObjectArray
20 | {
21 | public:
22 | FUObjectItem* Objects;
23 | int32_t MaxElements;
24 | int32_t NumElements;
25 | };
26 |
27 | class FUObjectArray
28 | {
29 | public:
30 | __int32 ObjFirstGCIndex; //0x0000
31 | __int32 ObjLastNonGCIndex; //0x0004
32 | __int32 MaxObjectsNotConsideredByGC; //0x0008
33 | __int32 OpenForDisregardForGC; //0x000C
34 |
35 | TUObjectArray ObjObjects; //0x0010
36 | };
37 |
38 | FUObjectArray* GlobalObjects = nullptr;
39 |
40 | bool ObjectsStore::Initialize()
41 | {
42 | // 89 0D ? ? ? ? 48 8B DF 48 89 5C 24
43 | const auto address = FindPattern(GetModuleHandleW(nullptr), reinterpret_cast(
44 | "\x89\x0D\x00\x00\x00\x00\x48\x8B\xDF\x48\x89\x5C\x24"), "xx????xxxxxxx");
45 | if (address == -1)
46 | {
47 | return false;
48 | }
49 | const auto offset = *reinterpret_cast(address + 2);
50 | GlobalObjects = reinterpret_cast(address + 6 + offset);
51 |
52 | return true;
53 | }
54 |
55 | void* ObjectsStore::GetAddress()
56 | {
57 | return GlobalObjects;
58 | }
59 |
60 | size_t ObjectsStore::GetObjectsNum() const
61 | {
62 | return GlobalObjects->ObjObjects.NumElements;
63 | }
64 |
65 | UEObject ObjectsStore::GetById(size_t id) const
66 | {
67 | return GlobalObjects->ObjObjects.Objects[id].Object;
68 | }
69 |
--------------------------------------------------------------------------------
/Target/TribesAscend/NamesStore.cpp:
--------------------------------------------------------------------------------
1 | #include
2 |
3 | #include "PatternFinder.hpp"
4 | #include "NamesStore.hpp"
5 |
6 | #include "EngineClasses.hpp"
7 |
8 | class FNameEntry
9 | {
10 | static const auto NAME_WIDE_MASK = 0x1;
11 | static const auto NAME_INDEX_SHIFT = 1;
12 |
13 | public:
14 | uint64_t Flags;
15 | uint32_t Index;
16 | FNameEntry* HashNext;
17 | union
18 | {
19 | char AnsiName[1024];
20 | wchar_t WideName[1024];
21 | };
22 |
23 | inline int32_t GetIndex() const
24 | {
25 | return Index >> NAME_INDEX_SHIFT;
26 | }
27 |
28 | inline bool IsWide() const
29 | {
30 | return Index & NAME_WIDE_MASK;
31 | }
32 |
33 | inline const char* GetAnsiName() const
34 | {
35 | return AnsiName;
36 | }
37 |
38 | inline const wchar_t* GetWideName() const
39 | {
40 | return WideName;
41 | }
42 |
43 | std::string GetName() const
44 | {
45 | if (IsWide())
46 | {
47 | auto length = std::wcslen(WideName);
48 |
49 | std::string str(length, '\0');
50 |
51 | std::use_facet>(std::locale()).narrow(WideName, WideName + length, '?', &str[0]);
52 |
53 | return str;
54 | }
55 | else
56 | {
57 | return AnsiName;
58 | }
59 | }
60 | };
61 |
62 | TArray* GlobalNames = nullptr;
63 |
64 | bool NamesStore::Initialize()
65 | {
66 | auto address = FindPattern(GetModuleHandleW(nullptr), reinterpret_cast("\x8B\x0D\x00\x00\x00\x00\x83\x3C\x81\x00\x74"), "xx????xxxxx");
67 | if (address == -1)
68 | {
69 | return false;
70 | }
71 |
72 | GlobalNames = reinterpret_cast(*reinterpret_cast