mirror of
https://github.com/Auties00/Reboot-Launcher.git
synced 2026-01-13 03:02:22 +01:00
9.0.2
This commit is contained in:
@@ -5,7 +5,6 @@ import 'package:reboot_cli/src/game.dart';
|
|||||||
import 'package:reboot_cli/src/reboot.dart';
|
import 'package:reboot_cli/src/reboot.dart';
|
||||||
import 'package:reboot_cli/src/server.dart';
|
import 'package:reboot_cli/src/server.dart';
|
||||||
import 'package:reboot_common/common.dart';
|
import 'package:reboot_common/common.dart';
|
||||||
import 'package:reboot_common/src/model/fortnite_version.dart';
|
|
||||||
import 'package:reboot_common/src/util/matchmaker.dart' as matchmaker;
|
import 'package:reboot_common/src/util/matchmaker.dart' as matchmaker;
|
||||||
|
|
||||||
late String? username;
|
late String? username;
|
||||||
@@ -46,7 +45,7 @@ void main(List<String> args) async {
|
|||||||
if(result["update"]) {
|
if(result["update"]) {
|
||||||
stdout.writeln("Updating reboot dll...");
|
stdout.writeln("Updating reboot dll...");
|
||||||
try {
|
try {
|
||||||
await downloadRebootDll(rebootDownloadUrl, 0);
|
await downloadRebootDll(kRebootDownloadUrl);
|
||||||
}catch(error){
|
}catch(error){
|
||||||
stderr.writeln("Cannot update reboot dll: $error");
|
stderr.writeln("Cannot update reboot dll: $error");
|
||||||
}
|
}
|
||||||
|
|||||||
@@ -1,10 +1,8 @@
|
|||||||
import 'dart:convert';
|
|
||||||
import 'dart:io';
|
import 'dart:io';
|
||||||
|
|
||||||
import 'package:process_run/process_run.dart';
|
import 'package:process_run/process_run.dart';
|
||||||
import 'package:reboot_common/common.dart';
|
|
||||||
|
|
||||||
import 'package:reboot_cli/cli.dart';
|
import 'package:reboot_cli/cli.dart';
|
||||||
|
import 'package:reboot_common/common.dart';
|
||||||
|
|
||||||
Process? _gameProcess;
|
Process? _gameProcess;
|
||||||
Process? _launcherProcess;
|
Process? _launcherProcess;
|
||||||
@@ -24,7 +22,7 @@ Future<void> startGame() async {
|
|||||||
stdout.writeln("No username was specified, using $username by default. Use --username to specify one");
|
stdout.writeln("No username was specified, using $username by default. Use --username to specify one");
|
||||||
}
|
}
|
||||||
|
|
||||||
_gameProcess = await Process.start(executable.path, createRebootArgs(username!, "", host, ""))
|
_gameProcess = await Process.start(executable.path, createRebootArgs(username!, "", host, host, ""))
|
||||||
..exitCode.then((_) => _onClose())
|
..exitCode.then((_) => _onClose())
|
||||||
..outLines.forEach((line) => _onGameOutput(line, dll, host, verbose));
|
..outLines.forEach((line) => _onGameOutput(line, dll, host, verbose));
|
||||||
_injectOrShowError("cobalt.dll");
|
_injectOrShowError("cobalt.dll");
|
||||||
@@ -54,12 +52,12 @@ void _onGameOutput(String line, String dll, bool hosting, bool verbose) {
|
|||||||
stdout.writeln(line);
|
stdout.writeln(line);
|
||||||
}
|
}
|
||||||
|
|
||||||
if (line.contains(shutdownLine)) {
|
if (line.contains(kShutdownLine)) {
|
||||||
_onClose();
|
_onClose();
|
||||||
return;
|
return;
|
||||||
}
|
}
|
||||||
|
|
||||||
if(cannotConnectErrors.any((element) => line.contains(element))){
|
if(kCannotConnectErrors.any((element) => line.contains(element))){
|
||||||
stderr.writeln("The backend doesn't work! Token expired");
|
stderr.writeln("The backend doesn't work! Token expired");
|
||||||
_onClose();
|
_onClose();
|
||||||
return;
|
return;
|
||||||
|
|||||||
@@ -7,7 +7,7 @@ Future<bool> startServerCli(String? host, String? port, ServerType type) async {
|
|||||||
stdout.writeln("Starting backend server...");
|
stdout.writeln("Starting backend server...");
|
||||||
switch(type){
|
switch(type){
|
||||||
case ServerType.local:
|
case ServerType.local:
|
||||||
var result = await pingAuthenticator(host ?? kDefaultAuthenticatorHost, port ?? kDefaultAuthenticatorPort);
|
var result = await pingAuthenticator(host ?? kDefaultAuthenticatorHost, port ?? kDefaultAuthenticatorPort.toString());
|
||||||
if(result == null){
|
if(result == null){
|
||||||
throw Exception("Local backend server is not running");
|
throw Exception("Local backend server is not running");
|
||||||
}
|
}
|
||||||
@@ -17,7 +17,7 @@ Future<bool> startServerCli(String? host, String? port, ServerType type) async {
|
|||||||
case ServerType.embedded:
|
case ServerType.embedded:
|
||||||
stdout.writeln("Starting an embedded server...");
|
stdout.writeln("Starting an embedded server...");
|
||||||
await server.startEmbeddedAuthenticator(false);
|
await server.startEmbeddedAuthenticator(false);
|
||||||
var result = await pingAuthenticator(host ?? kDefaultAuthenticatorHost, port ?? kDefaultAuthenticatorPort);
|
var result = await pingAuthenticator(host ?? kDefaultAuthenticatorHost, port ?? kDefaultAuthenticatorPort.toString());
|
||||||
if(result == null){
|
if(result == null){
|
||||||
throw Exception("Cannot start embedded server");
|
throw Exception("Cannot start embedded server");
|
||||||
}
|
}
|
||||||
|
|||||||
@@ -5,7 +5,7 @@ version: "1.0.0"
|
|||||||
publish_to: 'none'
|
publish_to: 'none'
|
||||||
|
|
||||||
environment:
|
environment:
|
||||||
sdk: ">=2.19.0 <=3.3.3"
|
sdk: ">=2.19.0 <=3.3.4"
|
||||||
|
|
||||||
dependencies:
|
dependencies:
|
||||||
reboot_common:
|
reboot_common:
|
||||||
|
|||||||
@@ -1,11 +1,7 @@
|
|||||||
export 'package:reboot_common/src/constant/authenticator.dart';
|
export 'package:reboot_common/src/constant/authenticator.dart';
|
||||||
export 'package:reboot_common/src/constant/game.dart';
|
export 'package:reboot_common/src/constant/game.dart';
|
||||||
export 'package:reboot_common/src/constant/matchmaker.dart';
|
export 'package:reboot_common/src/constant/matchmaker.dart';
|
||||||
export 'package:reboot_common/src/constant/os.dart';
|
|
||||||
export 'package:reboot_common/src/constant/supabase.dart';
|
export 'package:reboot_common/src/constant/supabase.dart';
|
||||||
|
|
||||||
|
|
||||||
export 'package:reboot_common/src/model/archive.dart';
|
|
||||||
export 'package:reboot_common/src/model/fortnite_build.dart';
|
export 'package:reboot_common/src/model/fortnite_build.dart';
|
||||||
export 'package:reboot_common/src/model/fortnite_version.dart';
|
export 'package:reboot_common/src/model/fortnite_version.dart';
|
||||||
export 'package:reboot_common/src/model/game_instance.dart';
|
export 'package:reboot_common/src/model/game_instance.dart';
|
||||||
@@ -13,12 +9,11 @@ export 'package:reboot_common/src/model/server_result.dart';
|
|||||||
export 'package:reboot_common/src/model/server_type.dart';
|
export 'package:reboot_common/src/model/server_type.dart';
|
||||||
export 'package:reboot_common/src/model/update_status.dart';
|
export 'package:reboot_common/src/model/update_status.dart';
|
||||||
export 'package:reboot_common/src/model/update_timer.dart';
|
export 'package:reboot_common/src/model/update_timer.dart';
|
||||||
|
|
||||||
export 'package:reboot_common/src/util/authenticator.dart';
|
export 'package:reboot_common/src/util/authenticator.dart';
|
||||||
export 'package:reboot_common/src/util/build.dart';
|
export 'package:reboot_common/src/util/build.dart';
|
||||||
|
export 'package:reboot_common/src/util/dll.dart';
|
||||||
export 'package:reboot_common/src/util/matchmaker.dart';
|
export 'package:reboot_common/src/util/matchmaker.dart';
|
||||||
export 'package:reboot_common/src/util/network.dart';
|
export 'package:reboot_common/src/util/network.dart';
|
||||||
export 'package:reboot_common/src/util/patcher.dart';
|
export 'package:reboot_common/src/util/patcher.dart';
|
||||||
export 'package:reboot_common/src/util/path.dart';
|
export 'package:reboot_common/src/util/path.dart';
|
||||||
export 'package:reboot_common/src/util/process.dart';
|
export 'package:reboot_common/src/util/process.dart';
|
||||||
export 'package:reboot_common/src/util/reboot.dart';
|
|
||||||
|
|||||||
@@ -1,2 +1,2 @@
|
|||||||
const String kDefaultAuthenticatorHost = "127.0.0.1";
|
const String kDefaultAuthenticatorHost = "127.0.0.1";
|
||||||
const String kDefaultAuthenticatorPort = "3551";
|
const int kDefaultAuthenticatorPort = 3551;
|
||||||
@@ -1,12 +1,13 @@
|
|||||||
const String kDefaultPlayerName = "Player";
|
const String kDefaultPlayerName = "Player";
|
||||||
const String kDefaultGameServerHost = "127.0.0.1";
|
const String kDefaultGameServerHost = "127.0.0.1";
|
||||||
const String kDefaultGameServerPort = "7777";
|
const String kDefaultGameServerPort = "7777";
|
||||||
const String shutdownLine = "FOnlineSubsystemGoogleCommon::Shutdown()";
|
const String kConsoleLine = "Region ";
|
||||||
const List<String> corruptedBuildErrors = [
|
const String kShutdownLine = "FOnlineSubsystemGoogleCommon::Shutdown()";
|
||||||
|
const List<String> kCorruptedBuildErrors = [
|
||||||
"when 0 bytes remain",
|
"when 0 bytes remain",
|
||||||
"Pak chunk signature verification failed!"
|
"Pak chunk signature verification failed!"
|
||||||
];
|
];
|
||||||
const List<String> cannotConnectErrors = [
|
const List<String> kCannotConnectErrors = [
|
||||||
"port 3551 failed: Connection refused",
|
"port 3551 failed: Connection refused",
|
||||||
"Unable to login to Fortnite servers",
|
"Unable to login to Fortnite servers",
|
||||||
"HTTP 400 response from ",
|
"HTTP 400 response from ",
|
||||||
|
|||||||
@@ -1,2 +1,2 @@
|
|||||||
const String kDefaultMatchmakerHost = "127.0.0.1";
|
const String kDefaultMatchmakerHost = "127.0.0.1";
|
||||||
const String kDefaultMatchmakerPort = "8080";
|
const int kDefaultMatchmakerPort = 8080;
|
||||||
@@ -1 +0,0 @@
|
|||||||
const int appBarWidth = 2;
|
|
||||||
@@ -1,2 +1,2 @@
|
|||||||
const String supabaseUrl = 'https://pocjparoguvaeeyjapjb.supabase.co';
|
const String supabaseUrl = 'https://drxuhdtyigthmjfhjgfl.supabase.co';
|
||||||
const String supabaseAnonKey = 'eyJhbGciOiJIUzI1NiIsInR5cCI6IkpXVCJ9.eyJpc3MiOiJzdXBhYmFzZSIsInJlZiI6InBvY2pwYXJvZ3V2YWVleWphcGpiIiwicm9sZSI6ImFub24iLCJpYXQiOjE2OTUzMTM4NTUsImV4cCI6MjAxMDg4OTg1NX0.BffJtbQvX1NVUy-9Nj4GVzUJXPK_1GyezDE0V5MRiao';
|
const String supabaseAnonKey = 'eyJhbGciOiJIUzI1NiIsInR5cCI6IkpXVCJ9.eyJpc3MiOiJzdXBhYmFzZSIsInJlZiI6ImRyeHVoZHR5aWd0aG1qZmhqZ2ZsIiwicm9sZSI6ImFub24iLCJpYXQiOjE2ODUzMDU4NjYsImV4cCI6MjAwMDg4MTg2Nn0.unuO67xf9CZgHi-3aXmC5p3RAktUfW7WwqDY-ccFN1M';
|
||||||
@@ -1,18 +0,0 @@
|
|||||||
import 'dart:io';
|
|
||||||
import 'dart:isolate';
|
|
||||||
|
|
||||||
class ArchiveDownloadProgress {
|
|
||||||
final double progress;
|
|
||||||
final int? minutesLeft;
|
|
||||||
final bool extracting;
|
|
||||||
|
|
||||||
ArchiveDownloadProgress(this.progress, this.minutesLeft, this.extracting);
|
|
||||||
}
|
|
||||||
|
|
||||||
class ArchiveDownloadOptions {
|
|
||||||
String archiveUrl;
|
|
||||||
Directory destination;
|
|
||||||
SendPort port;
|
|
||||||
|
|
||||||
ArchiveDownloadOptions(this.archiveUrl, this.destination, this.port);
|
|
||||||
}
|
|
||||||
@@ -1,6 +1,60 @@
|
|||||||
|
import 'dart:io';
|
||||||
|
import 'dart:isolate';
|
||||||
|
|
||||||
class FortniteBuild {
|
class FortniteBuild {
|
||||||
|
final String identifier;
|
||||||
final String version;
|
final String version;
|
||||||
final String link;
|
final String link;
|
||||||
|
final FortniteBuildSource source;
|
||||||
|
|
||||||
FortniteBuild({required this.version, required this.link});
|
FortniteBuild({required this.identifier, required this.version, required this.link, required this.source});
|
||||||
|
}
|
||||||
|
|
||||||
|
enum FortniteBuildSource {
|
||||||
|
manifest,
|
||||||
|
archive
|
||||||
|
}
|
||||||
|
|
||||||
|
class FortniteBuildDownloadProgress {
|
||||||
|
final double progress;
|
||||||
|
final int? minutesLeft;
|
||||||
|
final bool extracting;
|
||||||
|
|
||||||
|
FortniteBuildDownloadProgress(this.progress, this.minutesLeft, this.extracting);
|
||||||
|
}
|
||||||
|
|
||||||
|
class FortniteBuildDownloadOptions {
|
||||||
|
FortniteBuild build;
|
||||||
|
Directory destination;
|
||||||
|
SendPort port;
|
||||||
|
|
||||||
|
FortniteBuildDownloadOptions(this.build, this.destination, this.port);
|
||||||
|
}
|
||||||
|
|
||||||
|
class FortniteBuildManifestChunk {
|
||||||
|
List<int> chunksIds;
|
||||||
|
String file;
|
||||||
|
int fileSize;
|
||||||
|
|
||||||
|
FortniteBuildManifestChunk._internal(this.chunksIds, this.file, this.fileSize);
|
||||||
|
|
||||||
|
factory FortniteBuildManifestChunk.fromJson(json) => FortniteBuildManifestChunk._internal(
|
||||||
|
List<int>.from(json["ChunksIds"] as List),
|
||||||
|
json["File"],
|
||||||
|
json["FileSize"]
|
||||||
|
);
|
||||||
|
}
|
||||||
|
|
||||||
|
class FortniteBuildManifestFile {
|
||||||
|
String name;
|
||||||
|
List<FortniteBuildManifestChunk> chunks;
|
||||||
|
int size;
|
||||||
|
|
||||||
|
FortniteBuildManifestFile._internal(this.name, this.chunks, this.size);
|
||||||
|
|
||||||
|
factory FortniteBuildManifestFile.fromJson(json) => FortniteBuildManifestFile._internal(
|
||||||
|
json["Name"],
|
||||||
|
List<FortniteBuildManifestChunk>.from(json["Chunks"].map((chunk) => FortniteBuildManifestChunk.fromJson(chunk))),
|
||||||
|
json["Size"]
|
||||||
|
);
|
||||||
}
|
}
|
||||||
|
|||||||
@@ -8,35 +8,18 @@ class GameInstance {
|
|||||||
final int? eacPid;
|
final int? eacPid;
|
||||||
int? observerPid;
|
int? observerPid;
|
||||||
bool hosting;
|
bool hosting;
|
||||||
|
bool launched;
|
||||||
bool tokenError;
|
bool tokenError;
|
||||||
bool linkedHosting;
|
GameInstance? child;
|
||||||
|
|
||||||
GameInstance(this.versionName, this.gamePid, this.launcherPid, this.eacPid, this.hosting, this.linkedHosting)
|
GameInstance({
|
||||||
: tokenError = false,
|
required this.versionName,
|
||||||
assert(!linkedHosting || !hosting, "Only a game instance can have a linked hosting server");
|
required this.gamePid,
|
||||||
|
required this.launcherPid,
|
||||||
GameInstance._fromJson(this.versionName, this.gamePid, this.launcherPid, this.eacPid, this.observerPid,
|
required this.eacPid,
|
||||||
this.hosting, this.tokenError, this.linkedHosting);
|
required this.hosting,
|
||||||
|
required this.child
|
||||||
static GameInstance? fromJson(Map<String, dynamic>? json) {
|
}): tokenError = false, launched = false;
|
||||||
if(json == null) {
|
|
||||||
return null;
|
|
||||||
}
|
|
||||||
|
|
||||||
var gamePid = json["game"];
|
|
||||||
if(gamePid == null) {
|
|
||||||
return null;
|
|
||||||
}
|
|
||||||
|
|
||||||
var version = json["versionName"];
|
|
||||||
var launcherPid = json["launcher"];
|
|
||||||
var eacPid = json["eac"];
|
|
||||||
var observerPid = json["observer"];
|
|
||||||
var hosting = json["hosting"];
|
|
||||||
var tokenError = json["tokenError"];
|
|
||||||
var linkedHosting = json["linkedHosting"];
|
|
||||||
return GameInstance._fromJson(version, gamePid, launcherPid, eacPid, observerPid, hosting, tokenError, linkedHosting);
|
|
||||||
}
|
|
||||||
|
|
||||||
void kill() {
|
void kill() {
|
||||||
Process.killPid(gamePid, ProcessSignal.sigabrt);
|
Process.killPid(gamePid, ProcessSignal.sigabrt);
|
||||||
@@ -49,16 +32,6 @@ class GameInstance {
|
|||||||
if(observerPid != null) {
|
if(observerPid != null) {
|
||||||
Process.killPid(observerPid!, ProcessSignal.sigabrt);
|
Process.killPid(observerPid!, ProcessSignal.sigabrt);
|
||||||
}
|
}
|
||||||
|
child?.kill();
|
||||||
}
|
}
|
||||||
|
|
||||||
Map<String, dynamic> toJson() => {
|
|
||||||
'versionName': versionName,
|
|
||||||
'game': gamePid,
|
|
||||||
'launcher': launcherPid,
|
|
||||||
'eac': eacPid,
|
|
||||||
'observer': observerPid,
|
|
||||||
'hosting': hosting,
|
|
||||||
'tokenError': tokenError,
|
|
||||||
'linkedHosting': linkedHosting
|
|
||||||
};
|
|
||||||
}
|
}
|
||||||
|
|||||||
@@ -6,30 +6,27 @@ import 'package:shelf_proxy/shelf_proxy.dart';
|
|||||||
|
|
||||||
final authenticatorDirectory = Directory("${assetsDirectory.path}\\authenticator");
|
final authenticatorDirectory = Directory("${assetsDirectory.path}\\authenticator");
|
||||||
final authenticatorStartExecutable = File("${authenticatorDirectory.path}\\lawinserver.exe");
|
final authenticatorStartExecutable = File("${authenticatorDirectory.path}\\lawinserver.exe");
|
||||||
final authenticatorKillExecutable = File("${authenticatorDirectory.path}\\kill.bat");
|
|
||||||
|
|
||||||
Future<int> startEmbeddedAuthenticator(bool detached) async => startBackgroundProcess(
|
Future<int> startEmbeddedAuthenticator(bool detached) async => startBackgroundProcess(
|
||||||
executable: authenticatorStartExecutable,
|
executable: authenticatorStartExecutable,
|
||||||
window: detached
|
window: detached
|
||||||
);
|
);
|
||||||
|
|
||||||
Future<HttpServer> startRemoteAuthenticatorProxy(Uri uri) async => await serve(proxyHandler(uri), kDefaultAuthenticatorHost, int.parse(kDefaultAuthenticatorPort));
|
Future<HttpServer> startRemoteAuthenticatorProxy(Uri uri) async {
|
||||||
|
print("CALLED: $uri");
|
||||||
|
return await serve(proxyHandler(uri), kDefaultAuthenticatorHost, kDefaultAuthenticatorPort);
|
||||||
|
}
|
||||||
|
|
||||||
Future<bool> isAuthenticatorPortFree() async => isPortFree(int.parse(kDefaultAuthenticatorPort));
|
Future<bool> isAuthenticatorPortFree() async => await pingAuthenticator(kDefaultAuthenticatorHost, kDefaultAuthenticatorPort.toString()) == null;
|
||||||
|
|
||||||
Future<bool> freeAuthenticatorPort() async {
|
Future<bool> freeAuthenticatorPort() async {
|
||||||
await Process.run(authenticatorKillExecutable.path, []);
|
await killProcessByPort(kDefaultAuthenticatorPort);
|
||||||
var standardResult = await isAuthenticatorPortFree();
|
final standardResult = await isAuthenticatorPortFree();
|
||||||
if(standardResult) {
|
if(standardResult) {
|
||||||
return true;
|
return true;
|
||||||
}
|
}
|
||||||
|
|
||||||
var elevatedResult = await runElevatedProcess(authenticatorKillExecutable.path, "");
|
|
||||||
if(!elevatedResult) {
|
|
||||||
return false;
|
return false;
|
||||||
}
|
|
||||||
|
|
||||||
return await isAuthenticatorPortFree();
|
|
||||||
}
|
}
|
||||||
|
|
||||||
Future<Uri?> pingAuthenticator(String host, String port, [bool https=false]) async {
|
Future<Uri?> pingAuthenticator(String host, String port, [bool https=false]) async {
|
||||||
@@ -48,7 +45,7 @@ Future<Uri?> pingAuthenticator(String host, String port, [bool https=false]) asy
|
|||||||
var response = await request.close();
|
var response = await request.close();
|
||||||
return response.statusCode == 200 || response.statusCode == 404 ? uri : null;
|
return response.statusCode == 200 || response.statusCode == 404 ? uri : null;
|
||||||
}catch(_){
|
}catch(_){
|
||||||
return https || declaredScheme != null ? null : await pingAuthenticator(host, port, true);
|
return https || declaredScheme != null || isLocalHost(host) ? null : await pingAuthenticator(host, port, true);
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|||||||
@@ -2,24 +2,62 @@ import 'dart:async';
|
|||||||
import 'dart:convert';
|
import 'dart:convert';
|
||||||
import 'dart:io';
|
import 'dart:io';
|
||||||
import 'dart:isolate';
|
import 'dart:isolate';
|
||||||
|
import 'dart:typed_data';
|
||||||
|
|
||||||
|
import 'package:dio/dio.dart';
|
||||||
import 'package:path/path.dart' as path;
|
import 'package:path/path.dart' as path;
|
||||||
import 'package:reboot_common/common.dart';
|
import 'package:reboot_common/common.dart';
|
||||||
import 'package:dio/dio.dart';
|
|
||||||
|
const String kStopBuildDownloadSignal = "kill";
|
||||||
|
|
||||||
final Dio _dio = Dio();
|
final Dio _dio = Dio();
|
||||||
final String _manifestSourceUrl = "https://raw.githubusercontent.com/simplyblk/Fortnitebuilds/main/README.md";
|
final String _archiveSourceUrl = "https://raw.githubusercontent.com/simplyblk/Fortnitebuilds/main/README.md";
|
||||||
final RegExp _rarProgressRegex = RegExp("^((100)|(\\d{1,2}(.\\d*)?))%\$");
|
final RegExp _rarProgressRegex = RegExp("^((100)|(\\d{1,2}(.\\d*)?))%\$");
|
||||||
|
const String _manifestSourceUrl = "https://manifest.fnbuilds.services";
|
||||||
|
const int _maxDownloadErrors = 30;
|
||||||
|
|
||||||
Future<List<FortniteBuild>> fetchBuilds(ignored) async {
|
Future<List<FortniteBuild>> fetchBuilds(ignored) async {
|
||||||
var response = await _dio.get<String>(
|
final results = await Future.wait([_fetchManifestBuilds(), _fetchArchiveBuilds()]);
|
||||||
_manifestSourceUrl,
|
final data = <FortniteBuild>[];
|
||||||
|
for(final result in results) {
|
||||||
|
data.addAll(result);
|
||||||
|
}
|
||||||
|
|
||||||
|
return data;
|
||||||
|
}
|
||||||
|
|
||||||
|
Future<List<FortniteBuild>> _fetchManifestBuilds() async {
|
||||||
|
try {
|
||||||
|
final response = await _dio.get<String>("$_manifestSourceUrl/versions.json");
|
||||||
|
final body = response.data;
|
||||||
|
return jsonDecode(body!).map((version) {
|
||||||
|
final nameParts = version.split("-");
|
||||||
|
if(nameParts.length < 2) {
|
||||||
|
return null;
|
||||||
|
}
|
||||||
|
|
||||||
|
final name = nameParts[1];
|
||||||
|
return FortniteBuild(
|
||||||
|
identifier: name,
|
||||||
|
version: "Fortnite ${name}",
|
||||||
|
link: "$_manifestSourceUrl/$name/$name.manifest",
|
||||||
|
source: FortniteBuildSource.manifest
|
||||||
|
);
|
||||||
|
}).whereType<FortniteBuild>().toList();
|
||||||
|
}catch(_) {
|
||||||
|
return [];
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
Future<List<FortniteBuild>> _fetchArchiveBuilds() async {
|
||||||
|
final response = await _dio.get<String>(
|
||||||
|
_archiveSourceUrl,
|
||||||
options: Options(
|
options: Options(
|
||||||
responseType: ResponseType.plain
|
responseType: ResponseType.plain
|
||||||
)
|
)
|
||||||
);
|
);
|
||||||
if (response.statusCode != 200) {
|
if (response.statusCode != 200) {
|
||||||
throw Exception("Erroneous status code: ${response.statusCode}");
|
return [];
|
||||||
}
|
}
|
||||||
|
|
||||||
var results = <FortniteBuild>[];
|
var results = <FortniteBuild>[];
|
||||||
@@ -40,52 +78,136 @@ Future<List<FortniteBuild>> fetchBuilds(ignored) async {
|
|||||||
|
|
||||||
var version = parts.first.trim();
|
var version = parts.first.trim();
|
||||||
version = version.substring(0, version.indexOf("-"));
|
version = version.substring(0, version.indexOf("-"));
|
||||||
results.add(FortniteBuild(version: "Fortnite $version", link: link));
|
results.add(FortniteBuild(
|
||||||
|
identifier: version,
|
||||||
|
version: "Fortnite $version",
|
||||||
|
link: link,
|
||||||
|
source: FortniteBuildSource.archive
|
||||||
|
));
|
||||||
}
|
}
|
||||||
|
|
||||||
return results;
|
return results;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
||||||
Future<void> downloadArchiveBuild(ArchiveDownloadOptions options) async {
|
Future<void> downloadArchiveBuild(FortniteBuildDownloadOptions options) async {
|
||||||
var stopped = _setupLifecycle(options);
|
try {
|
||||||
var outputDir = Directory("${options.destination.path}\\.build");
|
final stopped = _setupLifecycle(options);
|
||||||
outputDir.createSync(recursive: true);
|
switch(options.build.source) {
|
||||||
options.destination.createSync(recursive: true);
|
case FortniteBuildSource.archive:
|
||||||
var fileName = options.archiveUrl.substring(options.archiveUrl.lastIndexOf("/") + 1);
|
final outputDir = Directory("${options.destination.path}\\.build");
|
||||||
var extension = path.extension(fileName);
|
await outputDir.create(recursive: true);
|
||||||
var tempFile = File("${outputDir.path}\\$fileName");
|
final fileName = options.build.link.substring(options.build.link.lastIndexOf("/") + 1);
|
||||||
if(tempFile.existsSync()) {
|
final extension = path.extension(fileName);
|
||||||
tempFile.deleteSync(recursive: true);
|
final tempFile = File("${outputDir.path}\\$fileName");
|
||||||
|
if(await tempFile.exists()) {
|
||||||
|
await tempFile.delete(recursive: true);
|
||||||
}
|
}
|
||||||
|
|
||||||
var startTime = DateTime.now().millisecondsSinceEpoch;
|
final startTime = DateTime.now().millisecondsSinceEpoch;
|
||||||
var response = _downloadFile(options, tempFile, startTime);
|
final response = _downloadArchive(options, tempFile, startTime);
|
||||||
await Future.any([stopped.future, response]);
|
await Future.any([stopped.future, response]);
|
||||||
if(!stopped.isCompleted) {
|
if(!stopped.isCompleted) {
|
||||||
var awaitedResponse = await response;
|
var awaitedResponse = await response;
|
||||||
if (!awaitedResponse.statusCode.toString().startsWith("20")) {
|
if (!awaitedResponse.statusCode.toString().startsWith("20")) {
|
||||||
throw Exception("Erroneous status code: ${awaitedResponse.statusCode}");
|
options.port.send("Erroneous status code: ${awaitedResponse.statusCode}");
|
||||||
|
return;
|
||||||
}
|
}
|
||||||
|
|
||||||
await _extract(stopped, extension, tempFile, options);
|
await _extractArchive(stopped, extension, tempFile, options);
|
||||||
}
|
}
|
||||||
|
|
||||||
delete(outputDir);
|
delete(outputDir);
|
||||||
|
break;
|
||||||
|
case FortniteBuildSource.manifest:
|
||||||
|
final response = await _dio.get<String>(options.build.link);
|
||||||
|
final manifest = FortniteBuildManifestFile.fromJson(jsonDecode(response.data!));
|
||||||
|
|
||||||
|
final totalBytes = manifest.size;
|
||||||
|
final outputDir = options.destination;
|
||||||
|
await outputDir.create(recursive: true);
|
||||||
|
|
||||||
|
final startTime = DateTime.now().millisecondsSinceEpoch;
|
||||||
|
final codec = GZipCodec();
|
||||||
|
var completedBytes = 0;
|
||||||
|
var lastPercentage = 0.0;
|
||||||
|
|
||||||
|
final writers = manifest.chunks.map((chunkedFile) async {
|
||||||
|
final outputFile = File('${outputDir.path}/${chunkedFile.file}');
|
||||||
|
if(outputFile.existsSync()) {
|
||||||
|
if(outputFile.lengthSync() != chunkedFile.fileSize) {
|
||||||
|
await outputFile.delete();
|
||||||
|
} else {
|
||||||
|
completedBytes += chunkedFile.fileSize;
|
||||||
|
final percentage = completedBytes * 100 / totalBytes;
|
||||||
|
if(percentage - lastPercentage > 0.1) {
|
||||||
|
_onProgress(
|
||||||
|
startTime,
|
||||||
|
DateTime.now().millisecondsSinceEpoch,
|
||||||
|
percentage,
|
||||||
|
false,
|
||||||
|
options
|
||||||
|
);
|
||||||
|
}
|
||||||
|
return;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
await outputFile.parent.create(recursive: true);
|
||||||
|
for(final chunkId in chunkedFile.chunksIds) {
|
||||||
|
final response = await _dio.get<Uint8List>(
|
||||||
|
"$_manifestSourceUrl/${options.build.identifier}/$chunkId.chunk",
|
||||||
|
options: Options(
|
||||||
|
responseType: ResponseType.bytes,
|
||||||
|
headers: {
|
||||||
|
"Accept-Encoding": "gzip"
|
||||||
|
}
|
||||||
|
),
|
||||||
|
);
|
||||||
|
var responseBody = response.data;
|
||||||
|
if(responseBody == null) {
|
||||||
|
continue;
|
||||||
|
}
|
||||||
|
|
||||||
|
final decodedBody = codec.decode(responseBody);
|
||||||
|
await outputFile.writeAsBytes(
|
||||||
|
decodedBody,
|
||||||
|
mode: FileMode.append,
|
||||||
|
flush: true
|
||||||
|
);
|
||||||
|
completedBytes += decodedBody.length;
|
||||||
|
|
||||||
|
final percentage = completedBytes * 100 / totalBytes;
|
||||||
|
if(percentage - lastPercentage > 0.1) {
|
||||||
|
_onProgress(
|
||||||
|
startTime,
|
||||||
|
DateTime.now().millisecondsSinceEpoch,
|
||||||
|
percentage,
|
||||||
|
false,
|
||||||
|
options
|
||||||
|
);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
});
|
||||||
|
await Future.any([stopped.future, Future.wait(writers)]);
|
||||||
|
options.port.send(FortniteBuildDownloadProgress(100, 0, true));
|
||||||
|
break;
|
||||||
|
}
|
||||||
|
}catch(error, stackTrace) {
|
||||||
|
options.port.send("$error\n$stackTrace");
|
||||||
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
Future<Response> _downloadFile(ArchiveDownloadOptions options, File tempFile, int startTime, [int? byteStart = null]) {
|
Future<Response> _downloadArchive(FortniteBuildDownloadOptions options, File tempFile, int startTime, [int? byteStart = null, int errorsCount = 0]) async {
|
||||||
var received = byteStart ?? 0;
|
var received = byteStart ?? 0;
|
||||||
return _dio.download(
|
try {
|
||||||
options.archiveUrl,
|
return await _dio.download(
|
||||||
|
options.build.link,
|
||||||
tempFile.path,
|
tempFile.path,
|
||||||
onReceiveProgress: (data, length) {
|
onReceiveProgress: (data, length) {
|
||||||
received = data;
|
received = data;
|
||||||
var now = DateTime.now();
|
final percentage = (received / length) * 100;
|
||||||
var progress = (received / length) * 100;
|
_onProgress(startTime, DateTime.now().millisecondsSinceEpoch, percentage, false, options);
|
||||||
var msLeft = startTime + (now.millisecondsSinceEpoch - startTime) * length / received - now.millisecondsSinceEpoch;
|
|
||||||
var minutesLeft = (msLeft / 1000 / 60).round();
|
|
||||||
options.port.send(ArchiveDownloadProgress(progress, minutesLeft, false));
|
|
||||||
},
|
},
|
||||||
deleteOnError: false,
|
deleteOnError: false,
|
||||||
options: Options(
|
options: Options(
|
||||||
@@ -93,10 +215,17 @@ Future<Response> _downloadFile(ArchiveDownloadOptions options, File tempFile, in
|
|||||||
"Range": "bytes=${byteStart}-"
|
"Range": "bytes=${byteStart}-"
|
||||||
}
|
}
|
||||||
)
|
)
|
||||||
).catchError((error) => _downloadFile(options, tempFile, startTime, received));
|
);
|
||||||
|
}catch(error) {
|
||||||
|
if(errorsCount >= _maxDownloadErrors) {
|
||||||
|
throw error;
|
||||||
|
}
|
||||||
|
|
||||||
|
return await _downloadArchive(options, tempFile, startTime, received, errorsCount + 1);
|
||||||
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
Future<void> _extract(Completer<dynamic> stopped, String extension, File tempFile, ArchiveDownloadOptions options) async {
|
Future<void> _extractArchive(Completer<dynamic> stopped, String extension, File tempFile, FortniteBuildDownloadOptions options) async {
|
||||||
var startTime = DateTime.now().millisecondsSinceEpoch;
|
var startTime = DateTime.now().millisecondsSinceEpoch;
|
||||||
Process? process;
|
Process? process;
|
||||||
switch (extension.toLowerCase()) {
|
switch (extension.toLowerCase()) {
|
||||||
@@ -106,25 +235,20 @@ Future<void> _extract(Completer<dynamic> stopped, String extension, File tempFil
|
|||||||
["a", "-bsp1", '-o"${options.destination.path}"', tempFile.path]
|
["a", "-bsp1", '-o"${options.destination.path}"', tempFile.path]
|
||||||
);
|
);
|
||||||
process.stdout.listen((bytes) {
|
process.stdout.listen((bytes) {
|
||||||
var now = DateTime.now().millisecondsSinceEpoch;
|
final now = DateTime.now().millisecondsSinceEpoch;
|
||||||
var data = utf8.decode(bytes);
|
final data = utf8.decode(bytes);
|
||||||
if(data == "Everything is Ok") {
|
if(data == "Everything is Ok") {
|
||||||
options.port.send(ArchiveDownloadProgress(100, 0, true));
|
options.port.send(FortniteBuildDownloadProgress(100, 0, true));
|
||||||
return;
|
return;
|
||||||
}
|
}
|
||||||
|
|
||||||
var element = data.trim().split(" ")[0];
|
final element = data.trim().split(" ")[0];
|
||||||
if(!element.endsWith("%")) {
|
if(!element.endsWith("%")) {
|
||||||
return;
|
return;
|
||||||
}
|
}
|
||||||
|
|
||||||
var percentage = int.parse(element.substring(0, element.length - 1));
|
final percentage = int.parse(element.substring(0, element.length - 1)).toDouble();
|
||||||
if(percentage == 0) {
|
_onProgress(startTime, now, percentage, true, options);
|
||||||
options.port.send(ArchiveDownloadProgress(percentage.toDouble(), null, true));
|
|
||||||
return;
|
|
||||||
}
|
|
||||||
|
|
||||||
_onProgress(startTime, now, percentage, options);
|
|
||||||
});
|
});
|
||||||
break;
|
break;
|
||||||
case ".rar":
|
case ".rar":
|
||||||
@@ -133,34 +257,29 @@ Future<void> _extract(Completer<dynamic> stopped, String extension, File tempFil
|
|||||||
["x", "-o+", tempFile.path, "*.*", options.destination.path]
|
["x", "-o+", tempFile.path, "*.*", options.destination.path]
|
||||||
);
|
);
|
||||||
process.stdout.listen((event) {
|
process.stdout.listen((event) {
|
||||||
var now = DateTime.now().millisecondsSinceEpoch;
|
final now = DateTime.now().millisecondsSinceEpoch;
|
||||||
var data = utf8.decode(event);
|
final data = utf8.decode(event);
|
||||||
data.replaceAll("\r", "")
|
data.replaceAll("\r", "")
|
||||||
.replaceAll("\b", "")
|
.replaceAll("\b", "")
|
||||||
.trim()
|
.trim()
|
||||||
.split("\n")
|
.split("\n")
|
||||||
.forEach((entry) {
|
.forEach((entry) {
|
||||||
if(entry == "All OK") {
|
if(entry == "All OK") {
|
||||||
options.port.send(ArchiveDownloadProgress(100, 0, true));
|
options.port.send(FortniteBuildDownloadProgress(100, 0, true));
|
||||||
return;
|
return;
|
||||||
}
|
}
|
||||||
|
|
||||||
var element = _rarProgressRegex.firstMatch(entry)?.group(1);
|
final element = _rarProgressRegex.firstMatch(entry)?.group(1);
|
||||||
if(element == null) {
|
if(element == null) {
|
||||||
return;
|
return;
|
||||||
}
|
}
|
||||||
|
|
||||||
var percentage = int.parse(element);
|
final percentage = int.parse(element).toDouble();
|
||||||
if(percentage == 0) {
|
_onProgress(startTime, now, percentage, true, options);
|
||||||
options.port.send(ArchiveDownloadProgress(percentage.toDouble(), null, true));
|
|
||||||
return;
|
|
||||||
}
|
|
||||||
|
|
||||||
_onProgress(startTime, now, percentage, options);
|
|
||||||
});
|
});
|
||||||
});
|
});
|
||||||
process.stderr.listen((event) {
|
process.stderr.listen((event) {
|
||||||
var data = utf8.decode(event);
|
final data = utf8.decode(event);
|
||||||
options.port.send(data);
|
options.port.send(data);
|
||||||
});
|
});
|
||||||
break;
|
break;
|
||||||
@@ -171,17 +290,22 @@ Future<void> _extract(Completer<dynamic> stopped, String extension, File tempFil
|
|||||||
await Future.any([stopped.future, process.exitCode]);
|
await Future.any([stopped.future, process.exitCode]);
|
||||||
}
|
}
|
||||||
|
|
||||||
void _onProgress(int startTime, int now, int percentage, ArchiveDownloadOptions options) {
|
void _onProgress(int startTime, int now, double percentage, bool extracting, FortniteBuildDownloadOptions options) {
|
||||||
var msLeft = startTime + (now - startTime) * 100 / percentage - now;
|
if(percentage == 0) {
|
||||||
var minutesLeft = (msLeft / 1000 / 60).round();
|
options.port.send(FortniteBuildDownloadProgress(percentage, null, extracting));
|
||||||
options.port.send(ArchiveDownloadProgress(percentage.toDouble(), minutesLeft, true));
|
return;
|
||||||
|
}
|
||||||
|
|
||||||
|
final msLeft = startTime + (now - startTime) * 100 / percentage - now;
|
||||||
|
final minutesLeft = (msLeft / 1000 / 60).round();
|
||||||
|
options.port.send(FortniteBuildDownloadProgress(percentage, minutesLeft, extracting));
|
||||||
}
|
}
|
||||||
|
|
||||||
Completer<dynamic> _setupLifecycle(ArchiveDownloadOptions options) {
|
Completer<dynamic> _setupLifecycle(FortniteBuildDownloadOptions options) {
|
||||||
var stopped = Completer();
|
var stopped = Completer();
|
||||||
var lifecyclePort = ReceivePort();
|
var lifecyclePort = ReceivePort();
|
||||||
lifecyclePort.listen((message) {
|
lifecyclePort.listen((message) {
|
||||||
if(message == "kill") {
|
if(message == kStopBuildDownloadSignal && !stopped.isCompleted) {
|
||||||
stopped.complete();
|
stopped.complete();
|
||||||
}
|
}
|
||||||
});
|
});
|
||||||
|
|||||||
64
common/lib/src/util/dll.dart
Normal file
64
common/lib/src/util/dll.dart
Normal file
@@ -0,0 +1,64 @@
|
|||||||
|
import 'dart:io';
|
||||||
|
|
||||||
|
import 'package:archive/archive_io.dart';
|
||||||
|
import 'package:http/http.dart' as http;
|
||||||
|
import 'package:path/path.dart' as path;
|
||||||
|
import 'package:reboot_common/common.dart';
|
||||||
|
|
||||||
|
bool _watcher = false;
|
||||||
|
final File rebootDllFile = File("${assetsDirectory.path}\\dlls\\reboot.dll");
|
||||||
|
const String kRebootDownloadUrl =
|
||||||
|
"https://nightly.link/Milxnor/Project-Reboot-3.0/workflows/msbuild/master/Release.zip";
|
||||||
|
|
||||||
|
Future<bool> hasRebootDllUpdate(int? lastUpdateMs, {int hours = 24, bool force = false}) async {
|
||||||
|
final lastUpdate = await _getLastUpdate(lastUpdateMs);
|
||||||
|
final exists = await rebootDllFile.exists();
|
||||||
|
final now = DateTime.now();
|
||||||
|
return force || !exists || (hours > 0 && lastUpdate != null && now.difference(lastUpdate).inHours > hours);
|
||||||
|
}
|
||||||
|
|
||||||
|
Future<void> downloadCriticalDll(String name, String outputPath) async {
|
||||||
|
final response = await http.get(Uri.parse("https://github.com/Auties00/reboot_launcher/tree/master/gui/assets/dlls/$name"));
|
||||||
|
final output = File(outputPath);
|
||||||
|
await output.parent.create(recursive: true);
|
||||||
|
await output.writeAsBytes(response.bodyBytes);
|
||||||
|
}
|
||||||
|
|
||||||
|
Future<int> downloadRebootDll(String url) async {
|
||||||
|
Directory? outputDir;
|
||||||
|
final now = DateTime.now();
|
||||||
|
try {
|
||||||
|
final response = await http.get(Uri.parse(url));
|
||||||
|
outputDir = await installationDirectory.createTemp("reboot_out");
|
||||||
|
final tempZip = File("${outputDir.path}\\reboot.zip");
|
||||||
|
await tempZip.writeAsBytes(response.bodyBytes);
|
||||||
|
await extractFileToDisk(tempZip.path, outputDir.path);
|
||||||
|
final rebootDll = File(outputDir.listSync().firstWhere((element) => path.extension(element.path) == ".dll").path);
|
||||||
|
await rebootDllFile.writeAsBytes(await rebootDll.readAsBytes());
|
||||||
|
return now.millisecondsSinceEpoch;
|
||||||
|
} finally{
|
||||||
|
if(outputDir != null) {
|
||||||
|
delete(outputDir);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
Future<DateTime?> _getLastUpdate(int? lastUpdateMs) async {
|
||||||
|
return lastUpdateMs != null
|
||||||
|
? DateTime.fromMillisecondsSinceEpoch(lastUpdateMs)
|
||||||
|
: null;
|
||||||
|
}
|
||||||
|
|
||||||
|
Stream<String> watchDlls() async* {
|
||||||
|
if(_watcher) {
|
||||||
|
return;
|
||||||
|
}
|
||||||
|
|
||||||
|
_watcher = true;
|
||||||
|
await for(final event in rebootDllFile.parent.watch(events: FileSystemEvent.delete | FileSystemEvent.move)) {
|
||||||
|
print(event);
|
||||||
|
if (event.path.endsWith(".dll")) {
|
||||||
|
yield event.path;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
@@ -2,7 +2,6 @@ import 'dart:async';
|
|||||||
import 'dart:io';
|
import 'dart:io';
|
||||||
|
|
||||||
import 'package:ini/ini.dart';
|
import 'package:ini/ini.dart';
|
||||||
|
|
||||||
import 'package:reboot_common/common.dart';
|
import 'package:reboot_common/common.dart';
|
||||||
import 'package:sync/semaphore.dart';
|
import 'package:sync/semaphore.dart';
|
||||||
|
|
||||||
@@ -75,21 +74,16 @@ Future<void> writeMatchmakingIp(String text) async {
|
|||||||
await matchmakerConfigFile.writeAsString(config.toString(), flush: true);
|
await matchmakerConfigFile.writeAsString(config.toString(), flush: true);
|
||||||
}
|
}
|
||||||
|
|
||||||
Future<bool> isMatchmakerPortFree() async => isPortFree(int.parse(kDefaultMatchmakerPort));
|
Future<bool> isMatchmakerPortFree() async => await pingMatchmaker(kDefaultMatchmakerHost, kDefaultMatchmakerPort.toString()) == null;
|
||||||
|
|
||||||
Future<bool> freeMatchmakerPort() async {
|
Future<bool> freeMatchmakerPort() async {
|
||||||
await Process.run(matchmakerKillExecutable.path, []);
|
await killProcessByPort(kDefaultMatchmakerPort);
|
||||||
var standardResult = await isMatchmakerPortFree();
|
final standardResult = await isMatchmakerPortFree();
|
||||||
if(standardResult) {
|
if(standardResult) {
|
||||||
return true;
|
return true;
|
||||||
}
|
}
|
||||||
|
|
||||||
var elevatedResult = await runElevatedProcess(matchmakerKillExecutable.path, "");
|
|
||||||
if(!elevatedResult) {
|
|
||||||
return false;
|
return false;
|
||||||
}
|
|
||||||
|
|
||||||
return await isMatchmakerPortFree();
|
|
||||||
}
|
}
|
||||||
|
|
||||||
Future<Uri?> pingMatchmaker(String host, String port, [bool wss=false]) async {
|
Future<Uri?> pingMatchmaker(String host, String port, [bool wss=false]) async {
|
||||||
@@ -124,7 +118,7 @@ Future<Uri?> pingMatchmaker(String host, String port, [bool wss=false]) async {
|
|||||||
await socket.close();
|
await socket.close();
|
||||||
return result ? uri : null;
|
return result ? uri : null;
|
||||||
}catch(_){
|
}catch(_){
|
||||||
return wss || declaredScheme != null ? null : await pingMatchmaker(host, port, true);
|
return wss || declaredScheme != null || isLocalHost(host) ? null : await pingMatchmaker(host, port, true);
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|||||||
@@ -1,22 +1,95 @@
|
|||||||
import 'dart:io';
|
import 'dart:ffi';
|
||||||
|
|
||||||
import 'package:reboot_common/common.dart';
|
import 'package:ffi/ffi.dart';
|
||||||
|
import 'package:win32/win32.dart';
|
||||||
|
|
||||||
|
const _AF_INET = 2;
|
||||||
|
const _TCP_TABLE_OWNER_PID_LISTENER = 3;
|
||||||
|
|
||||||
|
final _getExtendedTcpTable = DynamicLibrary.open('iphlpapi.dll').lookupFunction<
|
||||||
|
Int32 Function(Pointer, Pointer<Uint32>, Int32, Int32, Int32, Int32),
|
||||||
|
int Function(Pointer, Pointer<Uint32>, int, int, int, int)>('GetExtendedTcpTable');
|
||||||
|
|
||||||
|
class _MIB_TCPROW_OWNER_PID extends Struct {
|
||||||
|
@Uint32()
|
||||||
|
external int dwState;
|
||||||
|
|
||||||
|
@Uint32()
|
||||||
|
external int dwLocalAddr;
|
||||||
|
|
||||||
|
@Uint32()
|
||||||
|
external int dwLocalPort;
|
||||||
|
|
||||||
|
@Uint32()
|
||||||
|
external int dwRemoteAddr;
|
||||||
|
|
||||||
|
@Uint32()
|
||||||
|
external int dwRemotePort;
|
||||||
|
|
||||||
|
@Uint32()
|
||||||
|
external int dwOwningPid;
|
||||||
|
}
|
||||||
|
|
||||||
|
class _MIB_TCPTABLE_OWNER_PID extends Struct {
|
||||||
|
@Uint32()
|
||||||
|
external int dwNumEntries;
|
||||||
|
|
||||||
|
@Array(1)
|
||||||
|
external Array<_MIB_TCPROW_OWNER_PID> table;
|
||||||
|
}
|
||||||
|
|
||||||
bool isLocalHost(String host) => host.trim() == "127.0.0.1"
|
bool isLocalHost(String host) => host.trim() == "127.0.0.1"
|
||||||
|| host.trim().toLowerCase() == "localhost"
|
|| host.trim().toLowerCase() == "localhost"
|
||||||
|| host.trim() == "0.0.0.0";
|
|| host.trim() == "0.0.0.0";
|
||||||
|
|
||||||
Future<bool> isPortFree(int port) async {
|
bool killProcessByPort(int port) {
|
||||||
try {
|
var pTcpTable = calloc<_MIB_TCPTABLE_OWNER_PID>();
|
||||||
final server = await ServerSocket.bind(InternetAddress.anyIPv4, port);
|
final dwSize = calloc<DWORD>();
|
||||||
await server.close();
|
dwSize.value = 0;
|
||||||
return true;
|
|
||||||
} catch (e) {
|
int result = _getExtendedTcpTable(
|
||||||
|
nullptr,
|
||||||
|
dwSize,
|
||||||
|
FALSE,
|
||||||
|
_AF_INET,
|
||||||
|
_TCP_TABLE_OWNER_PID_LISTENER,
|
||||||
|
0
|
||||||
|
);
|
||||||
|
if (result == ERROR_INSUFFICIENT_BUFFER) {
|
||||||
|
pTcpTable = calloc<_MIB_TCPTABLE_OWNER_PID>(dwSize.value);
|
||||||
|
result = _getExtendedTcpTable(
|
||||||
|
pTcpTable,
|
||||||
|
dwSize,
|
||||||
|
FALSE,
|
||||||
|
_AF_INET,
|
||||||
|
_TCP_TABLE_OWNER_PID_LISTENER,
|
||||||
|
0
|
||||||
|
);
|
||||||
|
}
|
||||||
|
|
||||||
|
if (result == NO_ERROR) {
|
||||||
|
final table = pTcpTable.ref;
|
||||||
|
for (int i = 0; i < table.dwNumEntries; i++) {
|
||||||
|
final row = table.table[i];
|
||||||
|
final localPort = _htons(row.dwLocalPort);
|
||||||
|
if (localPort == port) {
|
||||||
|
final pid = row.dwOwningPid;
|
||||||
|
calloc.free(pTcpTable);
|
||||||
|
calloc.free(dwSize);
|
||||||
|
final hProcess = OpenProcess(PROCESS_TERMINATE, FALSE, pid);
|
||||||
|
if (hProcess != NULL) {
|
||||||
|
final result = TerminateProcess(hProcess, 0);
|
||||||
|
CloseHandle(hProcess);
|
||||||
|
return result != 0;
|
||||||
|
}
|
||||||
return false;
|
return false;
|
||||||
}
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
calloc.free(pTcpTable);
|
||||||
|
calloc.free(dwSize);
|
||||||
|
return false;
|
||||||
}
|
}
|
||||||
|
|
||||||
Future<void> resetWinNat() async {
|
int _htons(int port) => ((port & 0xFF) << 8) | ((port >> 8) & 0xFF);
|
||||||
var binary = File("${assetsDirectory.path}\\misc\\winnat.bat");
|
|
||||||
await runElevatedProcess(binary.path, "");
|
|
||||||
}
|
|
||||||
@@ -1,8 +1,8 @@
|
|||||||
import 'dart:io';
|
import 'dart:io';
|
||||||
import 'dart:isolate';
|
import 'dart:isolate';
|
||||||
|
|
||||||
import 'package:reboot_common/common.dart';
|
|
||||||
import 'package:path/path.dart' as path;
|
import 'package:path/path.dart' as path;
|
||||||
|
import 'package:reboot_common/common.dart';
|
||||||
|
|
||||||
Directory get installationDirectory =>
|
Directory get installationDirectory =>
|
||||||
File(Platform.resolvedExecutable).parent;
|
File(Platform.resolvedExecutable).parent;
|
||||||
|
|||||||
@@ -4,10 +4,13 @@ import 'dart:async';
|
|||||||
import 'dart:ffi';
|
import 'dart:ffi';
|
||||||
import 'dart:io';
|
import 'dart:io';
|
||||||
import 'dart:isolate';
|
import 'dart:isolate';
|
||||||
|
import 'dart:math';
|
||||||
|
|
||||||
import 'package:ffi/ffi.dart';
|
import 'package:ffi/ffi.dart';
|
||||||
import 'package:win32/win32.dart';
|
import 'package:win32/win32.dart';
|
||||||
|
|
||||||
|
import '../constant/game.dart';
|
||||||
|
|
||||||
final _ntdll = DynamicLibrary.open('ntdll.dll');
|
final _ntdll = DynamicLibrary.open('ntdll.dll');
|
||||||
final _kernel32 = DynamicLibrary.open('kernel32.dll');
|
final _kernel32 = DynamicLibrary.open('kernel32.dll');
|
||||||
final _CreateRemoteThread = _kernel32.lookupFunction<
|
final _CreateRemoteThread = _kernel32.lookupFunction<
|
||||||
@@ -84,23 +87,23 @@ Future<void> injectDll(int pid, String dll) async {
|
|||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
Future<bool> runElevatedProcess(String executable, String args) async {
|
bool runElevatedProcess(String executable, String args) {
|
||||||
var shellInput = calloc<SHELLEXECUTEINFO>();
|
final shellInput = calloc<SHELLEXECUTEINFO>();
|
||||||
shellInput.ref.lpFile = executable.toNativeUtf16();
|
shellInput.ref.lpFile = executable.toNativeUtf16();
|
||||||
shellInput.ref.lpParameters = args.toNativeUtf16();
|
shellInput.ref.lpParameters = args.toNativeUtf16();
|
||||||
shellInput.ref.nShow = SW_HIDE;
|
shellInput.ref.nShow = SW_HIDE;
|
||||||
shellInput.ref.fMask = ES_AWAYMODE_REQUIRED;
|
shellInput.ref.fMask = ES_AWAYMODE_REQUIRED;
|
||||||
shellInput.ref.lpVerb = "runas".toNativeUtf16();
|
shellInput.ref.lpVerb = "runas".toNativeUtf16();
|
||||||
shellInput.ref.cbSize = sizeOf<SHELLEXECUTEINFO>();
|
shellInput.ref.cbSize = sizeOf<SHELLEXECUTEINFO>();
|
||||||
var shellResult = ShellExecuteEx(shellInput);
|
final result = ShellExecuteEx(shellInput) == 1;
|
||||||
return shellResult == 1;
|
free(shellInput);
|
||||||
|
return result;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
||||||
void _startBackgroundProcess(_BackgroundProcessParameters params) {
|
void _startBackgroundProcess(_BackgroundProcessParameters params) {
|
||||||
var args = params.args;
|
var args = params.args;
|
||||||
var concatenatedArgs = args == null ? "" : " ${args.map((entry) => '"$entry"').join(" ")}";
|
var concatenatedArgs = args == null ? "" : " ${args.map((entry) => '"$entry"').join(" ")}";
|
||||||
var executablePath = TEXT("${params.executable.path}$concatenatedArgs");
|
var executablePath = TEXT('cmd.exe /k "${params.executable.path}"$concatenatedArgs');
|
||||||
var startupInfo = calloc<STARTUPINFO>();
|
var startupInfo = calloc<STARTUPINFO>();
|
||||||
var processInfo = calloc<PROCESS_INFORMATION>();
|
var processInfo = calloc<PROCESS_INFORMATION>();
|
||||||
var windowFlag = params.window ? CREATE_NEW_CONSOLE : CREATE_NO_WINDOW;
|
var windowFlag = params.window ? CREATE_NEW_CONSOLE : CREATE_NO_WINDOW;
|
||||||
@@ -204,3 +207,56 @@ Future<bool> watchProcess(int pid) async {
|
|||||||
isolate.kill(priority: Isolate.immediate);
|
isolate.kill(priority: Isolate.immediate);
|
||||||
return result;
|
return result;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
List<String> createRebootArgs(String username, String password, bool host, bool headless, String additionalArgs) {
|
||||||
|
if(password.isEmpty) {
|
||||||
|
username = '${_parseUsername(username, host)}@projectreboot.dev';
|
||||||
|
}
|
||||||
|
|
||||||
|
password = password.isNotEmpty ? password : "Rebooted";
|
||||||
|
var args = [
|
||||||
|
"-epicapp=Fortnite",
|
||||||
|
"-epicenv=Prod",
|
||||||
|
"-epiclocale=en-us",
|
||||||
|
"-epicportal",
|
||||||
|
"-skippatchcheck",
|
||||||
|
"-nobe",
|
||||||
|
"-fromfl=eac",
|
||||||
|
"-fltoken=3db3ba5dcbd2e16703f3978d",
|
||||||
|
"-caldera=eyJhbGciOiJFUzI1NiIsInR5cCI6IkpXVCJ9.eyJhY2NvdW50X2lkIjoiYmU5ZGE1YzJmYmVhNDQwN2IyZjQwZWJhYWQ4NTlhZDQiLCJnZW5lcmF0ZWQiOjE2Mzg3MTcyNzgsImNhbGRlcmFHdWlkIjoiMzgxMGI4NjMtMmE2NS00NDU3LTliNTgtNGRhYjNiNDgyYTg2IiwiYWNQcm92aWRlciI6IkVhc3lBbnRpQ2hlYXQiLCJub3RlcyI6IiIsImZhbGxiYWNrIjpmYWxzZX0.VAWQB67RTxhiWOxx7DBjnzDnXyyEnX7OljJm-j2d88G_WgwQ9wrE6lwMEHZHjBd1ISJdUO1UVUqkfLdU5nofBQ",
|
||||||
|
"-AUTH_LOGIN=$username",
|
||||||
|
"-AUTH_PASSWORD=${password.isNotEmpty ? password : "Rebooted"}",
|
||||||
|
"-AUTH_TYPE=epic"
|
||||||
|
];
|
||||||
|
|
||||||
|
if(host && headless){
|
||||||
|
args.addAll([
|
||||||
|
"-nullrhi",
|
||||||
|
"-nosplash",
|
||||||
|
"-nosound",
|
||||||
|
]);
|
||||||
|
}
|
||||||
|
|
||||||
|
if(additionalArgs.isNotEmpty){
|
||||||
|
args.addAll(additionalArgs.split(" "));
|
||||||
|
}
|
||||||
|
|
||||||
|
return args;
|
||||||
|
}
|
||||||
|
|
||||||
|
String _parseUsername(String username, bool host) {
|
||||||
|
if(host) {
|
||||||
|
return "Player${Random().nextInt(1000)}";
|
||||||
|
}
|
||||||
|
|
||||||
|
if (username.isEmpty) {
|
||||||
|
return kDefaultPlayerName;
|
||||||
|
}
|
||||||
|
|
||||||
|
username = username.replaceAll(RegExp("[^A-Za-z0-9]"), "").trim();
|
||||||
|
if(username.isEmpty){
|
||||||
|
return kDefaultPlayerName;
|
||||||
|
}
|
||||||
|
|
||||||
|
return username;
|
||||||
|
}
|
||||||
@@ -1,100 +0,0 @@
|
|||||||
import 'dart:io';
|
|
||||||
import 'dart:math';
|
|
||||||
|
|
||||||
import 'package:archive/archive_io.dart';
|
|
||||||
import 'package:crypto/crypto.dart';
|
|
||||||
import 'package:http/http.dart' as http;
|
|
||||||
import 'package:path/path.dart' as path;
|
|
||||||
import 'package:reboot_common/common.dart';
|
|
||||||
|
|
||||||
const String rebootDownloadUrl =
|
|
||||||
"https://nightly.link/Milxnor/Project-Reboot-3.0/workflows/msbuild/main/Release.zip";
|
|
||||||
final File rebootDllFile = File("${assetsDirectory.path}\\dlls\\reboot.dll");
|
|
||||||
|
|
||||||
List<String> createRebootArgs(String username, String password, bool host, String additionalArgs) {
|
|
||||||
if(password.isEmpty) {
|
|
||||||
username = '${_parseUsername(username, host)}@projectreboot.dev';
|
|
||||||
}
|
|
||||||
|
|
||||||
password = password.isNotEmpty ? password : "Rebooted";
|
|
||||||
var args = [
|
|
||||||
"-epicapp=Fortnite",
|
|
||||||
"-epicenv=Prod",
|
|
||||||
"-epiclocale=en-us",
|
|
||||||
"-epicportal",
|
|
||||||
"-skippatchcheck",
|
|
||||||
"-nobe",
|
|
||||||
"-fromfl=eac",
|
|
||||||
"-fltoken=3db3ba5dcbd2e16703f3978d",
|
|
||||||
"-caldera=eyJhbGciOiJFUzI1NiIsInR5cCI6IkpXVCJ9.eyJhY2NvdW50X2lkIjoiYmU5ZGE1YzJmYmVhNDQwN2IyZjQwZWJhYWQ4NTlhZDQiLCJnZW5lcmF0ZWQiOjE2Mzg3MTcyNzgsImNhbGRlcmFHdWlkIjoiMzgxMGI4NjMtMmE2NS00NDU3LTliNTgtNGRhYjNiNDgyYTg2IiwiYWNQcm92aWRlciI6IkVhc3lBbnRpQ2hlYXQiLCJub3RlcyI6IiIsImZhbGxiYWNrIjpmYWxzZX0.VAWQB67RTxhiWOxx7DBjnzDnXyyEnX7OljJm-j2d88G_WgwQ9wrE6lwMEHZHjBd1ISJdUO1UVUqkfLdU5nofBQ",
|
|
||||||
"-AUTH_LOGIN=$username",
|
|
||||||
"-AUTH_PASSWORD=${password.isNotEmpty ? password : "Rebooted"}",
|
|
||||||
"-AUTH_TYPE=epic"
|
|
||||||
];
|
|
||||||
|
|
||||||
if(host){
|
|
||||||
args.addAll([
|
|
||||||
"-nullrhi",
|
|
||||||
"-nosplash",
|
|
||||||
"-nosound",
|
|
||||||
]);
|
|
||||||
}
|
|
||||||
|
|
||||||
if(additionalArgs.isNotEmpty){
|
|
||||||
args.addAll(additionalArgs.split(" "));
|
|
||||||
}
|
|
||||||
|
|
||||||
return args;
|
|
||||||
}
|
|
||||||
|
|
||||||
String _parseUsername(String username, bool host) {
|
|
||||||
if(host) {
|
|
||||||
return "Player${Random().nextInt(1000)}";
|
|
||||||
}
|
|
||||||
|
|
||||||
if (username.isEmpty) {
|
|
||||||
return kDefaultPlayerName;
|
|
||||||
}
|
|
||||||
|
|
||||||
username = username.replaceAll(RegExp("[^A-Za-z0-9]"), "").trim();
|
|
||||||
if(username.isEmpty){
|
|
||||||
return kDefaultPlayerName;
|
|
||||||
}
|
|
||||||
|
|
||||||
return username;
|
|
||||||
}
|
|
||||||
|
|
||||||
|
|
||||||
Future<int> downloadRebootDll(String url, int? lastUpdateMs, {int hours = 24, bool force = false}) async {
|
|
||||||
Directory? outputDir;
|
|
||||||
var now = DateTime.now();
|
|
||||||
try {
|
|
||||||
var lastUpdate = await _getLastUpdate(lastUpdateMs);
|
|
||||||
var exists = await rebootDllFile.exists();
|
|
||||||
if (!force && lastUpdate != null && now.difference(lastUpdate).inHours <= hours && exists) {
|
|
||||||
return lastUpdateMs!;
|
|
||||||
}
|
|
||||||
|
|
||||||
var response = await http.get(Uri.parse(rebootDownloadUrl));
|
|
||||||
outputDir = await installationDirectory.createTemp("reboot_out");
|
|
||||||
var tempZip = File("${outputDir.path}\\reboot.zip");
|
|
||||||
await tempZip.writeAsBytes(response.bodyBytes);
|
|
||||||
await extractFileToDisk(tempZip.path, outputDir.path);
|
|
||||||
var rebootDll = File(outputDir.listSync().firstWhere((element) => path.extension(element.path) == ".dll").path);
|
|
||||||
if (!exists || sha1.convert(await rebootDllFile.readAsBytes()) != sha1.convert(await rebootDll.readAsBytes())) {
|
|
||||||
await rebootDllFile.writeAsBytes(await rebootDll.readAsBytes());
|
|
||||||
}
|
|
||||||
|
|
||||||
return now.millisecondsSinceEpoch;
|
|
||||||
} finally{
|
|
||||||
if(outputDir != null) {
|
|
||||||
delete(outputDir);
|
|
||||||
}
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
Future<DateTime?> _getLastUpdate(int? lastUpdateMs) async {
|
|
||||||
return lastUpdateMs != null
|
|
||||||
? DateTime.fromMillisecondsSinceEpoch(lastUpdateMs)
|
|
||||||
: null;
|
|
||||||
}
|
|
||||||
@@ -4,7 +4,7 @@ version: "1.0.0"
|
|||||||
publish_to: 'none'
|
publish_to: 'none'
|
||||||
|
|
||||||
environment:
|
environment:
|
||||||
sdk: ">=2.19.0 <=3.3.3"
|
sdk: ">=2.19.0 <=3.3.4"
|
||||||
|
|
||||||
dependencies:
|
dependencies:
|
||||||
dio: ^5.3.2
|
dio: ^5.3.2
|
||||||
|
|||||||
@@ -1,4 +1,5 @@
|
|||||||
import 'dart:io';
|
import 'dart:io';
|
||||||
|
|
||||||
import 'package:reboot_common/common.dart';
|
import 'package:reboot_common/common.dart';
|
||||||
import 'package:supabase/supabase.dart';
|
import 'package:supabase/supabase.dart';
|
||||||
|
|
||||||
@@ -19,7 +20,7 @@ void main(List<String> args) async {
|
|||||||
Process.killPid(launcherPid, ProcessSignal.sigabrt);
|
Process.killPid(launcherPid, ProcessSignal.sigabrt);
|
||||||
Process.killPid(eacPid, ProcessSignal.sigabrt);
|
Process.killPid(eacPid, ProcessSignal.sigabrt);
|
||||||
if(hosting) {
|
if(hosting) {
|
||||||
await supabase.from('hosts')
|
await supabase.from("hosting")
|
||||||
.delete()
|
.delete()
|
||||||
.match({'id': uuid});
|
.match({'id': uuid});
|
||||||
}
|
}
|
||||||
@@ -4,7 +4,7 @@ version: "1.0.0"
|
|||||||
publish_to: 'none'
|
publish_to: 'none'
|
||||||
|
|
||||||
environment:
|
environment:
|
||||||
sdk: ">=2.19.0 <=3.3.3"
|
sdk: ">=2.19.0 <=3.3.4"
|
||||||
|
|
||||||
dependencies:
|
dependencies:
|
||||||
supabase: ^1.9.1
|
supabase: ^1.9.1
|
||||||
1
dependencies/authenticator
vendored
1
dependencies/authenticator
vendored
Submodule dependencies/authenticator deleted from 2ea81cbde5
1
dependencies/matchmaker
vendored
1
dependencies/matchmaker
vendored
Submodule dependencies/matchmaker deleted from 0047d0db97
2
dependencies/reboot/.gitattributes
vendored
2
dependencies/reboot/.gitattributes
vendored
@@ -1,2 +0,0 @@
|
|||||||
# Auto detect text files and perform LF normalization
|
|
||||||
* text=auto
|
|
||||||
@@ -1,47 +0,0 @@
|
|||||||
name: MSBuild
|
|
||||||
|
|
||||||
on:
|
|
||||||
push:
|
|
||||||
branches: [ "master" ]
|
|
||||||
pull_request:
|
|
||||||
branches: [ "master" ]
|
|
||||||
|
|
||||||
env:
|
|
||||||
# Path to the solution file relative to the root of the project.
|
|
||||||
SOLUTION_FILE_PATH: .
|
|
||||||
|
|
||||||
# Configuration type to build.
|
|
||||||
# You can convert this to a build matrix if you need coverage of multiple configuration types.
|
|
||||||
# https://docs.github.com/actions/learn-github-actions/managing-complex-workflows#using-a-build-matrix
|
|
||||||
BUILD_CONFIGURATION: Release
|
|
||||||
|
|
||||||
permissions:
|
|
||||||
contents: read
|
|
||||||
|
|
||||||
jobs:
|
|
||||||
build:
|
|
||||||
runs-on: windows-latest
|
|
||||||
|
|
||||||
steps:
|
|
||||||
- uses: actions/checkout@v3
|
|
||||||
|
|
||||||
- name: Add MSBuild to PATH
|
|
||||||
uses: microsoft/setup-msbuild@v1.0.2
|
|
||||||
|
|
||||||
- name: Restore NuGet packages
|
|
||||||
working-directory: ${{env.GITHUB_WORKSPACE}}
|
|
||||||
run: nuget restore ${{env.SOLUTION_FILE_PATH}}
|
|
||||||
|
|
||||||
- name: Build
|
|
||||||
working-directory: ${{env.GITHUB_WORKSPACE}}
|
|
||||||
# Add additional options to the MSBuild command line here (like platform or verbosity level).
|
|
||||||
# See https://docs.microsoft.com/visualstudio/msbuild/msbuild-command-line-reference
|
|
||||||
run: msbuild /m /p:Configuration=${{env.BUILD_CONFIGURATION}} ${{env.SOLUTION_FILE_PATH}}
|
|
||||||
|
|
||||||
- name: Upload Release Artifact
|
|
||||||
uses: actions/upload-artifact@v3
|
|
||||||
with:
|
|
||||||
name: Release
|
|
||||||
path: ${{env.SOLUTION_FILE_PATH}}/x64/Release
|
|
||||||
if-no-files-found: warn
|
|
||||||
retention-days: 60
|
|
||||||
387
dependencies/reboot/.gitignore
vendored
387
dependencies/reboot/.gitignore
vendored
@@ -1,387 +0,0 @@
|
|||||||
## Ignore Visual Studio temporary files, build results, and
|
|
||||||
## files generated by popular Visual Studio add-ons.
|
|
||||||
##
|
|
||||||
## Get latest from https://github.com/github/gitignore/blob/master/VisualStudio.gitignore
|
|
||||||
|
|
||||||
# User-specific files
|
|
||||||
*.rsuser
|
|
||||||
*.suo
|
|
||||||
*.user
|
|
||||||
*.userosscache
|
|
||||||
*.sln.docstates
|
|
||||||
|
|
||||||
# User-specific files (MonoDevelop/Xamarin Studio)
|
|
||||||
*.userprefs
|
|
||||||
|
|
||||||
# Mono auto generated files
|
|
||||||
mono_crash.*
|
|
||||||
|
|
||||||
# Build results
|
|
||||||
[Dd]ebug/
|
|
||||||
[Dd]ebugPublic/
|
|
||||||
[Rr]elease/
|
|
||||||
[Rr]eleases/
|
|
||||||
x64/
|
|
||||||
x86/
|
|
||||||
[Ww][Ii][Nn]32/
|
|
||||||
[Aa][Rr][Mm]/
|
|
||||||
[Aa][Rr][Mm]64/
|
|
||||||
bld/
|
|
||||||
[Bb]in/
|
|
||||||
[Oo]bj/
|
|
||||||
[Oo]ut/
|
|
||||||
[Ll]og/
|
|
||||||
[Ll]ogs/
|
|
||||||
|
|
||||||
# Visual Studio 2015/2017 cache/options directory
|
|
||||||
.vs/
|
|
||||||
# Uncomment if you have tasks that create the project's static files in wwwroot
|
|
||||||
#wwwroot/
|
|
||||||
|
|
||||||
# Visual Studio 2017 auto generated files
|
|
||||||
Generated\ Files/
|
|
||||||
|
|
||||||
# MSTest test Results
|
|
||||||
[Tt]est[Rr]esult*/
|
|
||||||
[Bb]uild[Ll]og.*
|
|
||||||
|
|
||||||
# NUnit
|
|
||||||
*.VisualState.xml
|
|
||||||
TestResult.xml
|
|
||||||
nunit-*.xml
|
|
||||||
|
|
||||||
# Build Results of an ATL Project
|
|
||||||
[Dd]ebugPS/
|
|
||||||
[Rr]eleasePS/
|
|
||||||
dlldata.c
|
|
||||||
|
|
||||||
# Benchmark Results
|
|
||||||
BenchmarkDotNet.Artifacts/
|
|
||||||
|
|
||||||
# .NET Core
|
|
||||||
project.lock.json
|
|
||||||
project.fragment.lock.json
|
|
||||||
artifacts/
|
|
||||||
|
|
||||||
# ASP.NET Scaffolding
|
|
||||||
ScaffoldingReadMe.txt
|
|
||||||
|
|
||||||
# StyleCop
|
|
||||||
StyleCopReport.xml
|
|
||||||
|
|
||||||
# Files built by Visual Studio
|
|
||||||
*_i.c
|
|
||||||
*_p.c
|
|
||||||
*_h.h
|
|
||||||
*.ilk
|
|
||||||
*.meta
|
|
||||||
*.obj
|
|
||||||
*.iobj
|
|
||||||
*.pch
|
|
||||||
*.pdb
|
|
||||||
*.ipdb
|
|
||||||
*.pgc
|
|
||||||
*.pgd
|
|
||||||
*.rsp
|
|
||||||
*.sbr
|
|
||||||
*.tlb
|
|
||||||
*.tli
|
|
||||||
*.tlh
|
|
||||||
*.tmp
|
|
||||||
*.tmp_proj
|
|
||||||
*_wpftmp.csproj
|
|
||||||
*.log
|
|
||||||
*.vspscc
|
|
||||||
*.vssscc
|
|
||||||
.builds
|
|
||||||
*.pidb
|
|
||||||
*.svclog
|
|
||||||
*.scc
|
|
||||||
|
|
||||||
# Chutzpah Test files
|
|
||||||
_Chutzpah*
|
|
||||||
|
|
||||||
# Visual C++ cache files
|
|
||||||
ipch/
|
|
||||||
*.aps
|
|
||||||
*.ncb
|
|
||||||
*.opendb
|
|
||||||
*.opensdf
|
|
||||||
*.sdf
|
|
||||||
*.cachefile
|
|
||||||
*.VC.db
|
|
||||||
*.VC.VC.opendb
|
|
||||||
|
|
||||||
# Visual Studio profiler
|
|
||||||
*.psess
|
|
||||||
*.vsp
|
|
||||||
*.vspx
|
|
||||||
*.sap
|
|
||||||
|
|
||||||
# Visual Studio Trace Files
|
|
||||||
*.e2e
|
|
||||||
|
|
||||||
# TFS 2012 Local Workspace
|
|
||||||
$tf/
|
|
||||||
|
|
||||||
# Guidance Automation Toolkit
|
|
||||||
*.gpState
|
|
||||||
|
|
||||||
# ReSharper is a .NET coding add-in
|
|
||||||
_ReSharper*/
|
|
||||||
*.[Rr]e[Ss]harper
|
|
||||||
*.DotSettings.user
|
|
||||||
|
|
||||||
# TeamCity is a build add-in
|
|
||||||
_TeamCity*
|
|
||||||
|
|
||||||
# DotCover is a Code Coverage Tool
|
|
||||||
*.dotCover
|
|
||||||
|
|
||||||
# AxoCover is a Code Coverage Tool
|
|
||||||
.axoCover/*
|
|
||||||
!.axoCover/settings.json
|
|
||||||
|
|
||||||
# Coverlet is a free, cross platform Code Coverage Tool
|
|
||||||
coverage*.json
|
|
||||||
coverage*.xml
|
|
||||||
coverage*.info
|
|
||||||
|
|
||||||
# Visual Studio code coverage results
|
|
||||||
*.coverage
|
|
||||||
*.coveragexml
|
|
||||||
|
|
||||||
# NCrunch
|
|
||||||
_NCrunch_*
|
|
||||||
.*crunch*.local.xml
|
|
||||||
nCrunchTemp_*
|
|
||||||
|
|
||||||
# MightyMoose
|
|
||||||
*.mm.*
|
|
||||||
AutoTest.Net/
|
|
||||||
|
|
||||||
# Web workbench (sass)
|
|
||||||
.sass-cache/
|
|
||||||
|
|
||||||
# Installshield output folder
|
|
||||||
[Ee]xpress/
|
|
||||||
|
|
||||||
# DocProject is a documentation generator add-in
|
|
||||||
DocProject/buildhelp/
|
|
||||||
DocProject/Help/*.HxT
|
|
||||||
DocProject/Help/*.HxC
|
|
||||||
DocProject/Help/*.hhc
|
|
||||||
DocProject/Help/*.hhk
|
|
||||||
DocProject/Help/*.hhp
|
|
||||||
DocProject/Help/Html2
|
|
||||||
DocProject/Help/html
|
|
||||||
|
|
||||||
# Click-Once directory
|
|
||||||
publish/
|
|
||||||
|
|
||||||
# Publish Web Output
|
|
||||||
*.[Pp]ublish.xml
|
|
||||||
*.azurePubxml
|
|
||||||
# Note: Comment the next line if you want to checkin your web deploy settings,
|
|
||||||
# but database connection strings (with potential passwords) will be unencrypted
|
|
||||||
*.pubxml
|
|
||||||
*.publishproj
|
|
||||||
|
|
||||||
# Microsoft Azure Web App publish settings. Comment the next line if you want to
|
|
||||||
# checkin your Azure Web App publish settings, but sensitive information contained
|
|
||||||
# in these scripts will be unencrypted
|
|
||||||
PublishScripts/
|
|
||||||
|
|
||||||
# NuGet Packages
|
|
||||||
*.nupkg
|
|
||||||
# NuGet Symbol Packages
|
|
||||||
*.snupkg
|
|
||||||
# The packages folder can be ignored because of Package Restore
|
|
||||||
**/[Pp]ackages/*
|
|
||||||
# except build/, which is used as an MSBuild target.
|
|
||||||
!**/[Pp]ackages/build/
|
|
||||||
# Uncomment if necessary however generally it will be regenerated when needed
|
|
||||||
#!**/[Pp]ackages/repositories.config
|
|
||||||
# NuGet v3's project.json files produces more ignorable files
|
|
||||||
*.nuget.props
|
|
||||||
*.nuget.targets
|
|
||||||
|
|
||||||
# Microsoft Azure Build Output
|
|
||||||
csx/
|
|
||||||
*.build.csdef
|
|
||||||
|
|
||||||
# Microsoft Azure Emulator
|
|
||||||
ecf/
|
|
||||||
rcf/
|
|
||||||
|
|
||||||
# Windows Store app package directories and files
|
|
||||||
AppPackages/
|
|
||||||
BundleArtifacts/
|
|
||||||
Package.StoreAssociation.xml
|
|
||||||
_pkginfo.txt
|
|
||||||
*.appx
|
|
||||||
*.appxbundle
|
|
||||||
*.appxupload
|
|
||||||
|
|
||||||
# Visual Studio cache files
|
|
||||||
# files ending in .cache can be ignored
|
|
||||||
*.[Cc]ache
|
|
||||||
# but keep track of directories ending in .cache
|
|
||||||
!?*.[Cc]ache/
|
|
||||||
|
|
||||||
# Others
|
|
||||||
ClientBin/
|
|
||||||
~$*
|
|
||||||
*~
|
|
||||||
*.dbmdl
|
|
||||||
*.dbproj.schemaview
|
|
||||||
*.jfm
|
|
||||||
*.pfx
|
|
||||||
*.publishsettings
|
|
||||||
orleans.codegen.cs
|
|
||||||
|
|
||||||
# Including strong name files can present a security risk
|
|
||||||
# (https://github.com/github/gitignore/pull/2483#issue-259490424)
|
|
||||||
#*.snk
|
|
||||||
|
|
||||||
# Since there are multiple workflows, uncomment next line to ignore bower_components
|
|
||||||
# (https://github.com/github/gitignore/pull/1529#issuecomment-104372622)
|
|
||||||
#bower_components/
|
|
||||||
|
|
||||||
# RIA/Silverlight projects
|
|
||||||
Generated_Code/
|
|
||||||
|
|
||||||
# Backup & report files from converting an old project file
|
|
||||||
# to a newer Visual Studio version. Backup files are not needed,
|
|
||||||
# because we have git ;-)
|
|
||||||
_UpgradeReport_Files/
|
|
||||||
Backup*/
|
|
||||||
UpgradeLog*.XML
|
|
||||||
UpgradeLog*.htm
|
|
||||||
ServiceFabricBackup/
|
|
||||||
*.rptproj.bak
|
|
||||||
|
|
||||||
# SQL Server files
|
|
||||||
*.mdf
|
|
||||||
*.ldf
|
|
||||||
*.ndf
|
|
||||||
|
|
||||||
# Business Intelligence projects
|
|
||||||
*.rdl.data
|
|
||||||
*.bim.layout
|
|
||||||
*.bim_*.settings
|
|
||||||
*.rptproj.rsuser
|
|
||||||
*- [Bb]ackup.rdl
|
|
||||||
*- [Bb]ackup ([0-9]).rdl
|
|
||||||
*- [Bb]ackup ([0-9][0-9]).rdl
|
|
||||||
|
|
||||||
# Microsoft Fakes
|
|
||||||
FakesAssemblies/
|
|
||||||
|
|
||||||
# GhostDoc plugin setting file
|
|
||||||
*.GhostDoc.xml
|
|
||||||
|
|
||||||
# Node.js Tools for Visual Studio
|
|
||||||
.ntvs_analysis.dat
|
|
||||||
node_modules/
|
|
||||||
|
|
||||||
# Visual Studio 6 build log
|
|
||||||
*.plg
|
|
||||||
|
|
||||||
# Visual Studio 6 workspace options file
|
|
||||||
*.opt
|
|
||||||
|
|
||||||
# Visual Studio 6 auto-generated workspace file (contains which files were open etc.)
|
|
||||||
*.vbw
|
|
||||||
|
|
||||||
# Visual Studio LightSwitch build output
|
|
||||||
**/*.HTMLClient/GeneratedArtifacts
|
|
||||||
**/*.DesktopClient/GeneratedArtifacts
|
|
||||||
**/*.DesktopClient/ModelManifest.xml
|
|
||||||
**/*.Server/GeneratedArtifacts
|
|
||||||
**/*.Server/ModelManifest.xml
|
|
||||||
_Pvt_Extensions
|
|
||||||
|
|
||||||
# Paket dependency manager
|
|
||||||
.paket/paket.exe
|
|
||||||
paket-files/
|
|
||||||
|
|
||||||
# FAKE - F# Make
|
|
||||||
.fake/
|
|
||||||
|
|
||||||
# CodeRush personal settings
|
|
||||||
.cr/personal
|
|
||||||
|
|
||||||
# Python Tools for Visual Studio (PTVS)
|
|
||||||
__pycache__/
|
|
||||||
*.pyc
|
|
||||||
|
|
||||||
# Cake - Uncomment if you are using it
|
|
||||||
# tools/**
|
|
||||||
# !tools/packages.config
|
|
||||||
|
|
||||||
# Tabs Studio
|
|
||||||
*.tss
|
|
||||||
|
|
||||||
# Telerik's JustMock configuration file
|
|
||||||
*.jmconfig
|
|
||||||
|
|
||||||
# BizTalk build output
|
|
||||||
*.btp.cs
|
|
||||||
*.btm.cs
|
|
||||||
*.odx.cs
|
|
||||||
*.xsd.cs
|
|
||||||
|
|
||||||
# OpenCover UI analysis results
|
|
||||||
OpenCover/
|
|
||||||
|
|
||||||
# Azure Stream Analytics local run output
|
|
||||||
ASALocalRun/
|
|
||||||
|
|
||||||
# MSBuild Binary and Structured Log
|
|
||||||
*.binlog
|
|
||||||
|
|
||||||
# NVidia Nsight GPU debugger configuration file
|
|
||||||
*.nvuser
|
|
||||||
|
|
||||||
# MFractors (Xamarin productivity tool) working folder
|
|
||||||
.mfractor/
|
|
||||||
|
|
||||||
# Local History for Visual Studio
|
|
||||||
.localhistory/
|
|
||||||
|
|
||||||
# BeatPulse healthcheck temp database
|
|
||||||
healthchecksdb
|
|
||||||
|
|
||||||
# Backup folder for Package Reference Convert tool in Visual Studio 2017
|
|
||||||
MigrationBackup/
|
|
||||||
|
|
||||||
# Ionide (cross platform F# VS Code tools) working folder
|
|
||||||
.ionide/
|
|
||||||
|
|
||||||
# Fody - auto-generated XML schema
|
|
||||||
FodyWeavers.xsd
|
|
||||||
.vs/Project Reboot 3.0/v17/Browse.VC.db
|
|
||||||
.vs/Project Reboot 3.0/v17/.suo
|
|
||||||
.vs/Project Reboot 3.0/v17/fileList.bin
|
|
||||||
.vs/Project Reboot 3.0/v17/ipch/AutoPCH/389a1fa1f6dcd16f/DLLMAIN.ipch
|
|
||||||
.vs/Project Reboot 3.0/v17/ipch/AutoPCH/6b05e7771d6ded15/UTIL.ipch
|
|
||||||
Project Reboot 3.0/x64/Release/Project Reboot 3.0.tlog/CL.read.1.tlog
|
|
||||||
Project Reboot 3.0/x64/Release/Project Reboot 3.0.tlog/link.read.1.tlog
|
|
||||||
Project Reboot 3.0/x64/Release/Project Reboot 3.0.tlog/CL.write.1.tlog
|
|
||||||
Project Reboot 3.0e/x64/Release/vc143.pdb
|
|
||||||
x64/Release/Project Reboot 3.0.pdb
|
|
||||||
Project Reboot 3.0/x64/Release/Project Reboot 3.0.log
|
|
||||||
Project Reboot 3.0/x64/Release/Project Reboot 3.0.ipdb
|
|
||||||
Project Reboot 3.0/x64/Release/Project Reboot 3.0.iobj
|
|
||||||
.vs/Project Reboot 3.0/v17/Browse.VC.db
|
|
||||||
.vs/Project Reboot 3.0/v17/.suo
|
|
||||||
.vs/Project Reboot 3.0/v17/.suo
|
|
||||||
*.db
|
|
||||||
*.bin
|
|
||||||
*.ipch
|
|
||||||
*.ipdb
|
|
||||||
*.iobj
|
|
||||||
*.tlog
|
|
||||||
*.ifc
|
|
||||||
*.pdb
|
|
||||||
29
dependencies/reboot/LICENSE
vendored
29
dependencies/reboot/LICENSE
vendored
@@ -1,29 +0,0 @@
|
|||||||
BSD 3-Clause License
|
|
||||||
|
|
||||||
Copyright (c) 2023, Milxnor
|
|
||||||
All rights reserved.
|
|
||||||
|
|
||||||
Redistribution and use in source and binary forms, with or without
|
|
||||||
modification, are permitted provided that the following conditions are met:
|
|
||||||
|
|
||||||
1. Redistributions of source code must retain the above copyright notice, this
|
|
||||||
list of conditions and the following disclaimer.
|
|
||||||
|
|
||||||
2. Redistributions in binary form must reproduce the above copyright notice,
|
|
||||||
this list of conditions and the following disclaimer in the documentation
|
|
||||||
and/or other materials provided with the distribution.
|
|
||||||
|
|
||||||
3. Neither the name of the copyright holder nor the names of its
|
|
||||||
contributors may be used to endorse or promote products derived from
|
|
||||||
this software without specific prior written permission.
|
|
||||||
|
|
||||||
THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS"
|
|
||||||
AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
|
|
||||||
IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE
|
|
||||||
DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT HOLDER OR CONTRIBUTORS BE LIABLE
|
|
||||||
FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL
|
|
||||||
DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR
|
|
||||||
SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER
|
|
||||||
CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY,
|
|
||||||
OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE
|
|
||||||
OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
|
|
||||||
31
dependencies/reboot/Project Reboot 3.0.sln
vendored
31
dependencies/reboot/Project Reboot 3.0.sln
vendored
@@ -1,31 +0,0 @@
|
|||||||
|
|
||||||
Microsoft Visual Studio Solution File, Format Version 12.00
|
|
||||||
# Visual Studio Version 17
|
|
||||||
VisualStudioVersion = 17.2.32630.192
|
|
||||||
MinimumVisualStudioVersion = 10.0.40219.1
|
|
||||||
Project("{8BC9CEB8-8B4A-11D0-8D11-00A0C91BC942}") = "Project Reboot 3.0", "Project Reboot 3.0\Project Reboot 3.0.vcxproj", "{69618184-B9DB-4982-B4FE-F83E9BDD0555}"
|
|
||||||
EndProject
|
|
||||||
Global
|
|
||||||
GlobalSection(SolutionConfigurationPlatforms) = preSolution
|
|
||||||
Debug|x64 = Debug|x64
|
|
||||||
Debug|x86 = Debug|x86
|
|
||||||
Release|x64 = Release|x64
|
|
||||||
Release|x86 = Release|x86
|
|
||||||
EndGlobalSection
|
|
||||||
GlobalSection(ProjectConfigurationPlatforms) = postSolution
|
|
||||||
{69618184-B9DB-4982-B4FE-F83E9BDD0555}.Debug|x64.ActiveCfg = Debug|x64
|
|
||||||
{69618184-B9DB-4982-B4FE-F83E9BDD0555}.Debug|x64.Build.0 = Debug|x64
|
|
||||||
{69618184-B9DB-4982-B4FE-F83E9BDD0555}.Debug|x86.ActiveCfg = Debug|Win32
|
|
||||||
{69618184-B9DB-4982-B4FE-F83E9BDD0555}.Debug|x86.Build.0 = Debug|Win32
|
|
||||||
{69618184-B9DB-4982-B4FE-F83E9BDD0555}.Release|x64.ActiveCfg = Release|x64
|
|
||||||
{69618184-B9DB-4982-B4FE-F83E9BDD0555}.Release|x64.Build.0 = Release|x64
|
|
||||||
{69618184-B9DB-4982-B4FE-F83E9BDD0555}.Release|x86.ActiveCfg = Release|Win32
|
|
||||||
{69618184-B9DB-4982-B4FE-F83E9BDD0555}.Release|x86.Build.0 = Release|Win32
|
|
||||||
EndGlobalSection
|
|
||||||
GlobalSection(SolutionProperties) = preSolution
|
|
||||||
HideSolutionNode = FALSE
|
|
||||||
EndGlobalSection
|
|
||||||
GlobalSection(ExtensibilityGlobals) = postSolution
|
|
||||||
SolutionGuid = {ABF83670-C6F5-441C-9B62-254EF634207B}
|
|
||||||
EndGlobalSection
|
|
||||||
EndGlobal
|
|
||||||
@@ -1,103 +0,0 @@
|
|||||||
#pragma once
|
|
||||||
|
|
||||||
#include "Object.h"
|
|
||||||
#include "GameplayAbilitySpec.h"
|
|
||||||
#include "AttributeSet.h"
|
|
||||||
|
|
||||||
struct PadHex10 { char Pad[0x10]; };
|
|
||||||
struct PadHex18 { char Pad[0x18]; };
|
|
||||||
struct PadHexA8 { char Pad[0xA8]; };
|
|
||||||
struct PadHexB0 { char Pad[0xB0]; };
|
|
||||||
|
|
||||||
// using FPredictionKey = PadHex18;
|
|
||||||
// using FGameplayEventData = PadHexA8;
|
|
||||||
|
|
||||||
// using FPredictionKey = PadHex10;
|
|
||||||
using FGameplayEventData = PadHexB0;
|
|
||||||
|
|
||||||
// using FGameplayEventData = __int64;
|
|
||||||
|
|
||||||
struct FPredictionKey // todo move
|
|
||||||
{
|
|
||||||
// __int64 real;
|
|
||||||
|
|
||||||
static UStruct* GetStruct()
|
|
||||||
{
|
|
||||||
static auto Struct = FindObject<UStruct>("/Script/GameplayAbilities.PredictionKey");
|
|
||||||
return Struct;
|
|
||||||
}
|
|
||||||
|
|
||||||
static int GetStructSize() { return GetStruct()->GetPropertiesSize(); }
|
|
||||||
};
|
|
||||||
|
|
||||||
struct FGameplayEffectContextHandle
|
|
||||||
{
|
|
||||||
unsigned char UnknownData00[0x18]; // 0x0000(0x0018) MISSED OFFSET
|
|
||||||
};
|
|
||||||
|
|
||||||
struct FActiveGameplayEffectHandle
|
|
||||||
{
|
|
||||||
int Handle; // 0x0000(0x0004) (ZeroConstructor, IsPlainOldData)
|
|
||||||
bool bPassedFiltersAndWasExecuted; // 0x0004(0x0001) (ZeroConstructor, IsPlainOldData)
|
|
||||||
unsigned char UnknownData00[0x3]; // 0x0005(0x0003) MISSED OFFSET
|
|
||||||
};
|
|
||||||
|
|
||||||
struct FGameplayAbilitySpecContainer : public FFastArraySerializer
|
|
||||||
{
|
|
||||||
TArray<FGameplayAbilitySpec>& GetItems()
|
|
||||||
{
|
|
||||||
static auto ItemsOffset = FindOffsetStruct("/Script/GameplayAbilities.GameplayAbilitySpecContainer", "Items");
|
|
||||||
return *(TArray<FGameplayAbilitySpec>*)(__int64(this) + ItemsOffset);
|
|
||||||
}
|
|
||||||
};
|
|
||||||
|
|
||||||
class UAbilitySystemComponent : public UObject
|
|
||||||
{
|
|
||||||
public:
|
|
||||||
static inline FGameplayAbilitySpecHandle* (*GiveAbilityOriginal)(UAbilitySystemComponent*, FGameplayAbilitySpecHandle*, __int64 inSpec);
|
|
||||||
static inline bool (*InternalTryActivateAbilityOriginal)(UAbilitySystemComponent*, FGameplayAbilitySpecHandle Handle, PadHex10 InPredictionKey, UObject** OutInstancedAbility, void* OnGameplayAbilityEndedDelegate, const FGameplayEventData* TriggerEventData);
|
|
||||||
static inline bool (*InternalTryActivateAbilityOriginal2)(UAbilitySystemComponent*, FGameplayAbilitySpecHandle Handle, PadHex18 InPredictionKey, UObject** OutInstancedAbility, void* OnGameplayAbilityEndedDelegate, const FGameplayEventData* TriggerEventData);
|
|
||||||
|
|
||||||
void ClientActivateAbilityFailed(FGameplayAbilitySpecHandle AbilityToActivate, int16_t PredictionKey)
|
|
||||||
{
|
|
||||||
struct { FGameplayAbilitySpecHandle AbilityToActivate; int16_t PredictionKey; } UAbilitySystemComponent_ClientActivateAbilityFailed_Params{ AbilityToActivate, PredictionKey };
|
|
||||||
static auto fn = FindObject<UFunction>(L"/Script/GameplayAbilities.AbilitySystemComponent.ClientActivateAbilityFailed");
|
|
||||||
|
|
||||||
this->ProcessEvent(fn, &UAbilitySystemComponent_ClientActivateAbilityFailed_Params);
|
|
||||||
}
|
|
||||||
|
|
||||||
TArray<UAttributeSet*>& GetSpawnedAttributes()
|
|
||||||
{
|
|
||||||
static auto SpawnedAttributesOffset = GetOffset("SpawnedAttributes");
|
|
||||||
return Get<TArray<UAttributeSet*>>(SpawnedAttributesOffset);
|
|
||||||
}
|
|
||||||
|
|
||||||
FGameplayAbilitySpecContainer* GetActivatableAbilities()
|
|
||||||
{
|
|
||||||
static auto ActivatableAbilitiesOffset = this->GetOffset("ActivatableAbilities");
|
|
||||||
return GetPtr<FGameplayAbilitySpecContainer>(ActivatableAbilitiesOffset);
|
|
||||||
}
|
|
||||||
|
|
||||||
UAttributeSet* AddDefaultSubobjectSet(UAttributeSet* Subobject)
|
|
||||||
{
|
|
||||||
GetSpawnedAttributes().Add(Subobject);
|
|
||||||
return Subobject;
|
|
||||||
}
|
|
||||||
|
|
||||||
void ServerEndAbility(FGameplayAbilitySpecHandle AbilityToEnd, FGameplayAbilityActivationInfo* ActivationInfo, FPredictionKey* PredictionKey);
|
|
||||||
void ClientEndAbility(FGameplayAbilitySpecHandle AbilityToEnd, FGameplayAbilityActivationInfo* ActivationInfo);
|
|
||||||
void ClientCancelAbility(FGameplayAbilitySpecHandle AbilityToCancel, FGameplayAbilityActivationInfo* ActivationInfo);
|
|
||||||
bool HasAbility(UObject* DefaultAbility);
|
|
||||||
FActiveGameplayEffectHandle ApplyGameplayEffectToSelf(UClass* GameplayEffectClass, float Level, const FGameplayEffectContextHandle& EffectContext = FGameplayEffectContextHandle());
|
|
||||||
// FGameplayEffectContextHandle MakeEffectContext();
|
|
||||||
void RemoveActiveGameplayEffectBySourceEffect(UClass* GEClass, int StacksToRemove, UAbilitySystemComponent* Instigator);
|
|
||||||
void ConsumeAllReplicatedData(FGameplayAbilitySpecHandle AbilityHandle, FPredictionKey* AbilityOriginalPredictionKey);
|
|
||||||
FGameplayAbilitySpecHandle GiveAbilityEasy(UClass* AbilityClass, UObject* SourceObject = nullptr, bool bDoNotRegive = true);
|
|
||||||
FGameplayAbilitySpec* FindAbilitySpecFromHandle(FGameplayAbilitySpecHandle Handle);
|
|
||||||
void RemoveActiveGameplayEffectBySourceEffect(UClass* GameplayEffect, UAbilitySystemComponent* InstigatorAbilitySystemComponent, int StacksToRemove);
|
|
||||||
void ClearAbility(const FGameplayAbilitySpecHandle& Handle);
|
|
||||||
|
|
||||||
static void InternalServerTryActivateAbilityHook(UAbilitySystemComponent* AbilitySystemComponent, FGameplayAbilitySpecHandle Handle, bool InputPressed, const FPredictionKey* PredictionKey, const FGameplayEventData* TriggerEventData);
|
|
||||||
};
|
|
||||||
|
|
||||||
void LoopSpecs(UAbilitySystemComponent* AbilitySystemComponent, std::function<void(FGameplayAbilitySpec*)> func);
|
|
||||||
@@ -1,270 +0,0 @@
|
|||||||
#include "AbilitySystemComponent.h"
|
|
||||||
#include "NetSerialization.h"
|
|
||||||
#include "Actor.h"
|
|
||||||
#include "FortPawn.h"
|
|
||||||
#include "FortPlayerController.h"
|
|
||||||
#include "FortPlayerStateAthena.h"
|
|
||||||
|
|
||||||
void LoopSpecs(UAbilitySystemComponent* AbilitySystemComponent, std::function<void(FGameplayAbilitySpec*)> func)
|
|
||||||
{
|
|
||||||
static auto ActivatableAbilitiesOffset = AbilitySystemComponent->GetOffset("ActivatableAbilities");
|
|
||||||
auto ActivatableAbilities = AbilitySystemComponent->GetPtr<FFastArraySerializer>(ActivatableAbilitiesOffset);
|
|
||||||
|
|
||||||
static auto ItemsOffset = FindOffsetStruct("/Script/GameplayAbilities.GameplayAbilitySpecContainer", "Items");
|
|
||||||
auto Items = (TArray<FGameplayAbilitySpec>*)(__int64(ActivatableAbilities) + ItemsOffset);
|
|
||||||
|
|
||||||
static auto SpecSize = FGameplayAbilitySpec::GetStructSize();
|
|
||||||
|
|
||||||
if (ActivatableAbilities && Items)
|
|
||||||
{
|
|
||||||
for (int i = 0; i < Items->Num(); ++i)
|
|
||||||
{
|
|
||||||
auto CurrentSpec = Items->AtPtr(i, SpecSize); // (FGameplayAbilitySpec*)(__int64(Items->Data) + (static_cast<long long>(SpecSize) * i));
|
|
||||||
func(CurrentSpec);
|
|
||||||
}
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
FActiveGameplayEffectHandle UAbilitySystemComponent::ApplyGameplayEffectToSelf(UClass* GameplayEffectClass, float Level, const FGameplayEffectContextHandle& EffectContext)
|
|
||||||
{
|
|
||||||
static auto BP_ApplyGameplayEffectToSelfFn = FindObject<UFunction>(L"/Script/GameplayAbilities.AbilitySystemComponent.BP_ApplyGameplayEffectToSelf");
|
|
||||||
|
|
||||||
struct
|
|
||||||
{
|
|
||||||
UClass* GameplayEffectClass; // (Parm, ZeroConstructor, IsPlainOldData)
|
|
||||||
float Level; // (Parm, ZeroConstructor, IsPlainOldData)
|
|
||||||
FGameplayEffectContextHandle EffectContext; // (Parm)
|
|
||||||
FActiveGameplayEffectHandle ReturnValue; // (Parm, OutParm, ReturnParm)
|
|
||||||
}UAbilitySystemComponent_BP_ApplyGameplayEffectToSelf_Params{GameplayEffectClass, Level, EffectContext};
|
|
||||||
|
|
||||||
this->ProcessEvent(BP_ApplyGameplayEffectToSelfFn, &UAbilitySystemComponent_BP_ApplyGameplayEffectToSelf_Params);
|
|
||||||
|
|
||||||
return UAbilitySystemComponent_BP_ApplyGameplayEffectToSelf_Params.ReturnValue;
|
|
||||||
}
|
|
||||||
|
|
||||||
/* FGameplayEffectContextHandle UAbilitySystemComponent::MakeEffectContext()
|
|
||||||
{
|
|
||||||
static auto MakeEffectContextFn = FindObject<UFunction>("/Script/GameplayAbilities.AbilitySystemComponent.MakeEffectContext");
|
|
||||||
FGameplayEffectContextHandle ContextHandle;
|
|
||||||
this->ProcessEvent(MakeEffectContextFn, &ContextHandle);
|
|
||||||
return ContextHandle;
|
|
||||||
} */
|
|
||||||
|
|
||||||
void UAbilitySystemComponent::ServerEndAbility(FGameplayAbilitySpecHandle AbilityToEnd, FGameplayAbilityActivationInfo* ActivationInfo, FPredictionKey* PredictionKey)
|
|
||||||
{
|
|
||||||
static auto ServerEndAbilityFn = FindObject<UFunction>(L"/Script/GameplayAbilities.AbilitySystemComponent.ServerEndAbility");
|
|
||||||
|
|
||||||
auto Params = Alloc<void>(ServerEndAbilityFn->GetPropertiesSize());
|
|
||||||
|
|
||||||
if (!Params)
|
|
||||||
return;
|
|
||||||
|
|
||||||
static auto AbilityToEndOffset = FindOffsetStruct("/Script/GameplayAbilities.AbilitySystemComponent.ServerEndAbility", "AbilityToEnd");
|
|
||||||
static auto ActivationInfoOffset = FindOffsetStruct("/Script/GameplayAbilities.AbilitySystemComponent.ServerEndAbility", "ActivationInfo");
|
|
||||||
static auto PredictionKeyOffset = FindOffsetStruct("/Script/GameplayAbilities.AbilitySystemComponent.ServerEndAbility", "PredictionKey");
|
|
||||||
|
|
||||||
*(FGameplayAbilitySpecHandle*)(__int64(Params) + AbilityToEndOffset) = AbilityToEnd;
|
|
||||||
CopyStruct((FGameplayAbilityActivationInfo*)(__int64(Params) + ActivationInfoOffset), ActivationInfo, FGameplayAbilityActivationInfo::GetStructSize());
|
|
||||||
CopyStruct((FPredictionKey*)(__int64(Params) + PredictionKeyOffset), PredictionKey, FPredictionKey::GetStructSize());
|
|
||||||
|
|
||||||
this->ProcessEvent(ServerEndAbilityFn, Params);
|
|
||||||
|
|
||||||
VirtualFree(Params, 0, MEM_RELEASE);
|
|
||||||
}
|
|
||||||
|
|
||||||
void UAbilitySystemComponent::ClientEndAbility(FGameplayAbilitySpecHandle AbilityToEnd, FGameplayAbilityActivationInfo* ActivationInfo)
|
|
||||||
{
|
|
||||||
static auto ClientEndAbilityFn = FindObject<UFunction>(L"/Script/GameplayAbilities.AbilitySystemComponent.ClientEndAbility");
|
|
||||||
|
|
||||||
auto Params = Alloc(ClientEndAbilityFn->GetPropertiesSize());
|
|
||||||
|
|
||||||
static auto AbilityToEndOffset = FindOffsetStruct("/Script/GameplayAbilities.AbilitySystemComponent.ClientEndAbility", "AbilityToEnd");
|
|
||||||
static auto ActivationInfoOffset = FindOffsetStruct("/Script/GameplayAbilities.AbilitySystemComponent.ClientEndAbility", "ActivationInfo");
|
|
||||||
|
|
||||||
*(FGameplayAbilitySpecHandle*)(__int64(Params) + AbilityToEndOffset) = AbilityToEnd;
|
|
||||||
CopyStruct((FGameplayAbilityActivationInfo*)(__int64(Params) + ActivationInfoOffset), ActivationInfo, FGameplayAbilityActivationInfo::GetStructSize());
|
|
||||||
|
|
||||||
this->ProcessEvent(ClientEndAbilityFn, Params);
|
|
||||||
|
|
||||||
VirtualFree(Params, 0, MEM_RELEASE);
|
|
||||||
}
|
|
||||||
|
|
||||||
void UAbilitySystemComponent::ClientCancelAbility(FGameplayAbilitySpecHandle AbilityToCancel, FGameplayAbilityActivationInfo* ActivationInfo)
|
|
||||||
{
|
|
||||||
static auto ClientCancelAbilityFn = FindObject<UFunction>(L"/Script/GameplayAbilities.AbilitySystemComponent.ClientCancelAbility");
|
|
||||||
|
|
||||||
auto Params = Alloc(ClientCancelAbilityFn->GetPropertiesSize());
|
|
||||||
|
|
||||||
static auto AbilityToCancelOffset = FindOffsetStruct("/Script/GameplayAbilities.AbilitySystemComponent.ClientCancelAbility", "AbilityToCancel");
|
|
||||||
static auto ActivationInfoOffset = FindOffsetStruct("/Script/GameplayAbilities.AbilitySystemComponent.ClientCancelAbility", "ActivationInfo");
|
|
||||||
|
|
||||||
*(FGameplayAbilitySpecHandle*)(__int64(Params) + AbilityToCancelOffset) = AbilityToCancel;
|
|
||||||
CopyStruct((FGameplayAbilityActivationInfo*)(__int64(Params) + ActivationInfoOffset), ActivationInfo, FGameplayAbilityActivationInfo::GetStructSize());
|
|
||||||
|
|
||||||
this->ProcessEvent(ClientCancelAbilityFn, Params);
|
|
||||||
|
|
||||||
VirtualFree(Params, 0, MEM_RELEASE);
|
|
||||||
}
|
|
||||||
|
|
||||||
bool UAbilitySystemComponent::HasAbility(UObject* DefaultAbility)
|
|
||||||
{
|
|
||||||
auto ActivatableAbilities = GetActivatableAbilities();
|
|
||||||
|
|
||||||
auto& Items = ActivatableAbilities->GetItems();
|
|
||||||
|
|
||||||
for (int i = 0; i < Items.Num(); ++i)
|
|
||||||
{
|
|
||||||
auto Spec = Items.AtPtr(i, FGameplayAbilitySpec::GetStructSize());
|
|
||||||
|
|
||||||
if (Spec->GetAbility() == DefaultAbility)
|
|
||||||
return true;
|
|
||||||
}
|
|
||||||
|
|
||||||
return false;
|
|
||||||
}
|
|
||||||
|
|
||||||
void UAbilitySystemComponent::RemoveActiveGameplayEffectBySourceEffect(UClass* GEClass, int StacksToRemove, UAbilitySystemComponent* Instigator)
|
|
||||||
{
|
|
||||||
static auto RemoveActiveGameplayEffectBySourceEffectFn = FindObject<UFunction>(L"/Script/GameplayAbilities.AbilitySystemComponent.RemoveActiveGameplayEffectBySourceEffect");
|
|
||||||
struct { UClass* GameplayEffect; UObject* InstigatorAbilitySystemComponent; int StacksToRemove; } UAbilitySystemComponent_RemoveActiveGameplayEffectBySourceEffect_Params{ GEClass, Instigator, StacksToRemove };
|
|
||||||
|
|
||||||
this->ProcessEvent(RemoveActiveGameplayEffectBySourceEffectFn, &UAbilitySystemComponent_RemoveActiveGameplayEffectBySourceEffect_Params);
|
|
||||||
}
|
|
||||||
|
|
||||||
void UAbilitySystemComponent::ConsumeAllReplicatedData(FGameplayAbilitySpecHandle AbilityHandle, FPredictionKey* AbilityOriginalPredictionKey)
|
|
||||||
{
|
|
||||||
// static auto AbilityTargetDataMapOffset = ActivatableAbilitiesOffset + FGameplayAbilitySpecContainerSize ?
|
|
||||||
|
|
||||||
return;
|
|
||||||
}
|
|
||||||
|
|
||||||
void UAbilitySystemComponent::InternalServerTryActivateAbilityHook(UAbilitySystemComponent* AbilitySystemComponent, FGameplayAbilitySpecHandle Handle, bool InputPressed, const FPredictionKey* PredictionKey, const FGameplayEventData* TriggerEventData) // https://github.com/EpicGames/UnrealEngine/blob/4.23/Engine/Plugins/Runtime/GameplayAbilities/Source/GameplayAbilities/Private/AbilitySystemComponent_Abilities.cpp#L1445
|
|
||||||
{
|
|
||||||
using UGameplayAbility = UObject;
|
|
||||||
|
|
||||||
auto Spec = AbilitySystemComponent->FindAbilitySpecFromHandle(Handle);
|
|
||||||
|
|
||||||
static auto PredictionKeyStruct = FindObject<UStruct>(L"/Script/GameplayAbilities.PredictionKey");
|
|
||||||
static auto PredictionKeySize = PredictionKeyStruct->GetPropertiesSize();
|
|
||||||
static auto CurrentOffset = FindOffsetStruct("/Script/GameplayAbilities.PredictionKey", "Current");
|
|
||||||
|
|
||||||
if (!Spec)
|
|
||||||
{
|
|
||||||
LOG_INFO(LogAbilities, "InternalServerTryActivateAbility. Rejecting ClientActivation of ability with invalid SpecHandle!");
|
|
||||||
AbilitySystemComponent->ClientActivateAbilityFailed(Handle, *(int16_t*)(__int64(PredictionKey) + CurrentOffset));
|
|
||||||
return;
|
|
||||||
}
|
|
||||||
|
|
||||||
AbilitySystemComponent->ConsumeAllReplicatedData(Handle, (FPredictionKey*)PredictionKey);
|
|
||||||
|
|
||||||
/* const */ UGameplayAbility * AbilityToActivate = Spec->GetAbility();
|
|
||||||
|
|
||||||
if (!AbilityToActivate)
|
|
||||||
{
|
|
||||||
LOG_ERROR(LogAbilities, "InternalServerTryActiveAbility. Rejecting ClientActivation of unconfigured spec ability!");
|
|
||||||
AbilitySystemComponent->ClientActivateAbilityFailed(Handle, *(int16_t*)(__int64(PredictionKey) + CurrentOffset));
|
|
||||||
return;
|
|
||||||
}
|
|
||||||
|
|
||||||
static auto InputPressedOffset = FindOffsetStruct("/Script/GameplayAbilities.GameplayAbilitySpec", "InputPressed");
|
|
||||||
|
|
||||||
UGameplayAbility* InstancedAbility = nullptr;
|
|
||||||
SetBitfield((PlaceholderBitfield*)(__int64(Spec) + InputPressedOffset), 1, true); // InputPressed = true
|
|
||||||
|
|
||||||
bool res = false;
|
|
||||||
|
|
||||||
if (PredictionKeySize == 0x10)
|
|
||||||
res = UAbilitySystemComponent::InternalTryActivateAbilityOriginal(AbilitySystemComponent, Handle, *(PadHex10*)PredictionKey, &InstancedAbility, nullptr, TriggerEventData);
|
|
||||||
else if (PredictionKeySize == 0x18)
|
|
||||||
res = UAbilitySystemComponent::InternalTryActivateAbilityOriginal2(AbilitySystemComponent, Handle, *(PadHex18*)PredictionKey, &InstancedAbility, nullptr, TriggerEventData);
|
|
||||||
else
|
|
||||||
LOG_ERROR(LogAbilities, "Prediction key size does not match with any of them!");
|
|
||||||
|
|
||||||
if (!res)
|
|
||||||
{
|
|
||||||
LOG_INFO(LogAbilities, "InternalServerTryActivateAbility. Rejecting ClientActivation of {}. InternalTryActivateAbility failed: ", AbilityToActivate->GetName());
|
|
||||||
|
|
||||||
AbilitySystemComponent->ClientActivateAbilityFailed(Handle, *(int16_t*)(__int64(PredictionKey) + CurrentOffset));
|
|
||||||
SetBitfield((PlaceholderBitfield*)(__int64(Spec) + InputPressedOffset), 1, false); // InputPressed = false
|
|
||||||
|
|
||||||
AbilitySystemComponent->GetActivatableAbilities()->MarkItemDirty(Spec);
|
|
||||||
}
|
|
||||||
else
|
|
||||||
{
|
|
||||||
// LOG_INFO(LogAbilities, "InternalServerTryActivateAbility. Activated {}", AbilityToActivate->GetName());
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
FGameplayAbilitySpecHandle UAbilitySystemComponent::GiveAbilityEasy(UClass* AbilityClass, UObject* SourceObject, bool bDoNotRegive)
|
|
||||||
{
|
|
||||||
if (!AbilityClass)
|
|
||||||
{
|
|
||||||
LOG_WARN(LogAbilities, "Invalid AbilityClass passed into GiveAbilityEasy!");
|
|
||||||
return FGameplayAbilitySpecHandle();
|
|
||||||
}
|
|
||||||
|
|
||||||
// LOG_INFO(LogDev, "Making spec!");
|
|
||||||
|
|
||||||
auto DefaultAbility = AbilityClass->CreateDefaultObject();
|
|
||||||
|
|
||||||
if (!DefaultAbility)
|
|
||||||
return FGameplayAbilitySpecHandle();
|
|
||||||
|
|
||||||
if (bDoNotRegive && HasAbility(DefaultAbility))
|
|
||||||
return FGameplayAbilitySpecHandle();
|
|
||||||
|
|
||||||
auto NewSpec = MakeNewSpec((UClass*)DefaultAbility, SourceObject, true);
|
|
||||||
|
|
||||||
// LOG_INFO(LogDev, "Made spec!");
|
|
||||||
|
|
||||||
FGameplayAbilitySpecHandle Handle;
|
|
||||||
|
|
||||||
GiveAbilityOriginal(this, &Handle, __int64(NewSpec));
|
|
||||||
|
|
||||||
return Handle;
|
|
||||||
}
|
|
||||||
|
|
||||||
FGameplayAbilitySpec* UAbilitySystemComponent::FindAbilitySpecFromHandle(FGameplayAbilitySpecHandle Handle)
|
|
||||||
{
|
|
||||||
FGameplayAbilitySpec* SpecToReturn = nullptr;
|
|
||||||
|
|
||||||
auto compareHandles = [&Handle, &SpecToReturn](FGameplayAbilitySpec* Spec) {
|
|
||||||
auto& CurrentHandle = Spec->GetHandle();
|
|
||||||
|
|
||||||
if (CurrentHandle.Handle == Handle.Handle)
|
|
||||||
{
|
|
||||||
SpecToReturn = Spec;
|
|
||||||
return;
|
|
||||||
}
|
|
||||||
};
|
|
||||||
|
|
||||||
LoopSpecs(this, compareHandles);
|
|
||||||
|
|
||||||
return SpecToReturn;
|
|
||||||
}
|
|
||||||
|
|
||||||
void UAbilitySystemComponent::RemoveActiveGameplayEffectBySourceEffect(UClass* GameplayEffect, UAbilitySystemComponent* InstigatorAbilitySystemComponent, int StacksToRemove)
|
|
||||||
{
|
|
||||||
static auto RemoveActiveGameplayEffectBySourceEffectFn = FindObject<UFunction>(L"/Script/GameplayAbilities.AbilitySystemComponent.RemoveActiveGameplayEffectBySourceEffect");
|
|
||||||
|
|
||||||
struct
|
|
||||||
{
|
|
||||||
UClass* GameplayEffect; // (Parm, ZeroConstructor, IsPlainOldData, NoDestructor, UObjectWrapper, HasGetValueTypeHash, NativeAccessSpecifierPublic)
|
|
||||||
UAbilitySystemComponent* InstigatorAbilitySystemComponent; // (Parm, ZeroConstructor, InstancedReference, IsPlainOldData, NoDestructor, HasGetValueTypeHash, NativeAccessSpecifierPublic)
|
|
||||||
int StacksToRemove; // (Parm, ZeroConstructor, IsPlainOldData, NoDestructor, HasGetValueTypeHash, NativeAccessSpecifierPublic)
|
|
||||||
} UAbilitySystemComponent_RemoveActiveGameplayEffectBySourceEffect_Params{GameplayEffect, InstigatorAbilitySystemComponent, StacksToRemove};
|
|
||||||
|
|
||||||
this->ProcessEvent(RemoveActiveGameplayEffectBySourceEffectFn, &UAbilitySystemComponent_RemoveActiveGameplayEffectBySourceEffect_Params);
|
|
||||||
}
|
|
||||||
|
|
||||||
void UAbilitySystemComponent::ClearAbility(const FGameplayAbilitySpecHandle& Handle)
|
|
||||||
{
|
|
||||||
if (!Addresses::ClearAbility)
|
|
||||||
{
|
|
||||||
LOG_INFO(LogDev, "Invalid clear ability!");
|
|
||||||
return;
|
|
||||||
}
|
|
||||||
|
|
||||||
static void (*ClearAbilityOriginal)(UAbilitySystemComponent* AbilitySystemComponent, const FGameplayAbilitySpecHandle& Handle) = decltype(ClearAbilityOriginal)(Addresses::ClearAbility);
|
|
||||||
ClearAbilityOriginal(this, Handle);
|
|
||||||
}
|
|
||||||
314
dependencies/reboot/Project Reboot 3.0/Actor.cpp
vendored
314
dependencies/reboot/Project Reboot 3.0/Actor.cpp
vendored
@@ -1,314 +0,0 @@
|
|||||||
#include "Actor.h"
|
|
||||||
|
|
||||||
#include "Transform.h"
|
|
||||||
|
|
||||||
#include "reboot.h"
|
|
||||||
#include "GameplayStatics.h"
|
|
||||||
|
|
||||||
bool AActor::HasAuthority()
|
|
||||||
{
|
|
||||||
static auto RoleOffset = GetOffset("Role");
|
|
||||||
return Get<uint8_t>(RoleOffset) == 3;
|
|
||||||
}
|
|
||||||
|
|
||||||
bool AActor::IsTearOff()
|
|
||||||
{
|
|
||||||
static auto bTearOffOffset = GetOffset("bTearOff");
|
|
||||||
static auto bTearOffFieldMask = GetFieldMask(GetProperty("bTearOff"));
|
|
||||||
return ReadBitfieldValue(bTearOffOffset, bTearOffFieldMask);
|
|
||||||
}
|
|
||||||
|
|
||||||
/* FORCEINLINE */ ENetDormancy& AActor::GetNetDormancy()
|
|
||||||
{
|
|
||||||
static auto NetDormancyOffset = GetOffset("NetDormancy");
|
|
||||||
return Get<ENetDormancy>(NetDormancyOffset);
|
|
||||||
}
|
|
||||||
|
|
||||||
int32& AActor::GetNetTag()
|
|
||||||
{
|
|
||||||
static auto NetTagOffset = GetOffset("NetTag");
|
|
||||||
return Get<int32>(NetTagOffset);
|
|
||||||
}
|
|
||||||
|
|
||||||
FTransform AActor::GetTransform()
|
|
||||||
{
|
|
||||||
FTransform Ret;
|
|
||||||
static auto fn = FindObject<UFunction>(L"/Script/Engine.Actor.GetTransform");
|
|
||||||
this->ProcessEvent(fn, &Ret);
|
|
||||||
return Ret;
|
|
||||||
}
|
|
||||||
|
|
||||||
/*
|
|
||||||
|
|
||||||
UWorld* AActor::GetWorld()
|
|
||||||
{
|
|
||||||
return GetWorld(); // for real
|
|
||||||
}
|
|
||||||
|
|
||||||
*/
|
|
||||||
|
|
||||||
void AActor::SetNetDormancy(ENetDormancy Dormancy)
|
|
||||||
{
|
|
||||||
static auto SetNetDormancyFn = FindObject<UFunction>(L"/Script/Engine.Actor.SetNetDormancy");
|
|
||||||
this->ProcessEvent(SetNetDormancyFn, &Dormancy);
|
|
||||||
}
|
|
||||||
|
|
||||||
AActor* AActor::GetOwner()
|
|
||||||
{
|
|
||||||
static auto GetOwnerFunction = FindObject<UFunction>(L"/Script/Engine.Actor.GetOwner");
|
|
||||||
|
|
||||||
AActor* Owner = nullptr;
|
|
||||||
this->ProcessEvent(GetOwnerFunction, &Owner);
|
|
||||||
|
|
||||||
return Owner;
|
|
||||||
}
|
|
||||||
|
|
||||||
void AActor::K2_DestroyActor()
|
|
||||||
{
|
|
||||||
static auto DestroyActorFn = FindObject<UFunction>("/Script/Engine.Actor.K2_DestroyActor");
|
|
||||||
|
|
||||||
this->ProcessEvent(DestroyActorFn);
|
|
||||||
}
|
|
||||||
|
|
||||||
UActorComponent* AActor::GetComponentByClass(class UClass* ComponentClass)
|
|
||||||
{
|
|
||||||
static auto fn = FindObject<UFunction>("/Script/Engine.Actor.GetComponentByClass");
|
|
||||||
struct
|
|
||||||
{
|
|
||||||
class UClass* ComponentClass; // (Parm, ZeroConstructor, IsPlainOldData, NoDestructor, UObjectWrapper, HasGetValueTypeHash, NativeAccessSpecifierPublic)
|
|
||||||
UActorComponent* ReturnValue; // (ExportObject, Parm, OutParm, ZeroConstructor, ReturnParm, InstancedReference, IsPlainOldData, NoDestructor, HasGetValueTypeHash, NativeAccessSpecifierPublic)
|
|
||||||
} AActor_GetComponentByClass_Params{ComponentClass};
|
|
||||||
|
|
||||||
this->ProcessEvent(fn, &AActor_GetComponentByClass_Params);
|
|
||||||
|
|
||||||
return AActor_GetComponentByClass_Params.ReturnValue;
|
|
||||||
}
|
|
||||||
|
|
||||||
float AActor::GetDistanceTo(AActor* OtherActor)
|
|
||||||
{
|
|
||||||
static auto fn = FindObject<UFunction>("/Script/Engine.Actor.GetDistanceTo");
|
|
||||||
|
|
||||||
struct { AActor* OtherActor; float ReturnValue; } AActor_GetDistanceTo_Params{OtherActor};
|
|
||||||
|
|
||||||
this->ProcessEvent(fn, &AActor_GetDistanceTo_Params);
|
|
||||||
|
|
||||||
return AActor_GetDistanceTo_Params.ReturnValue;
|
|
||||||
}
|
|
||||||
|
|
||||||
FVector AActor::GetActorScale3D()
|
|
||||||
{
|
|
||||||
static auto GetActorScale3DFn = FindObject<UFunction>("/Script/Engine.Actor.GetActorScale3D");
|
|
||||||
|
|
||||||
FVector Scale3D;
|
|
||||||
this->ProcessEvent(GetActorScale3DFn, &Scale3D);
|
|
||||||
|
|
||||||
return Scale3D;
|
|
||||||
}
|
|
||||||
|
|
||||||
FVector AActor::GetActorLocation()
|
|
||||||
{
|
|
||||||
static auto K2_GetActorLocationFn = FindObject<UFunction>("/Script/Engine.Actor.K2_GetActorLocation");
|
|
||||||
FVector ret;
|
|
||||||
this->ProcessEvent(K2_GetActorLocationFn, &ret);
|
|
||||||
|
|
||||||
return ret;
|
|
||||||
}
|
|
||||||
|
|
||||||
FVector AActor::GetActorForwardVector()
|
|
||||||
{
|
|
||||||
static auto GetActorForwardVectorFn = FindObject<UFunction>("/Script/Engine.Actor.GetActorForwardVector");
|
|
||||||
FVector ret;
|
|
||||||
this->ProcessEvent(GetActorForwardVectorFn, &ret);
|
|
||||||
|
|
||||||
return ret;
|
|
||||||
}
|
|
||||||
|
|
||||||
FVector AActor::GetActorRightVector()
|
|
||||||
{
|
|
||||||
static auto GetActorRightVectorFn = FindObject<UFunction>("/Script/Engine.Actor.GetActorRightVector");
|
|
||||||
FVector ret;
|
|
||||||
this->ProcessEvent(GetActorRightVectorFn, &ret);
|
|
||||||
|
|
||||||
return ret;
|
|
||||||
}
|
|
||||||
|
|
||||||
FVector AActor::GetActorUpVector()
|
|
||||||
{
|
|
||||||
static auto GetActorUpVectorFn = FindObject<UFunction>("/Script/Engine.Actor.GetActorUpVector");
|
|
||||||
FVector ret;
|
|
||||||
this->ProcessEvent(GetActorUpVectorFn, &ret);
|
|
||||||
|
|
||||||
return ret;
|
|
||||||
}
|
|
||||||
|
|
||||||
FRotator AActor::GetActorRotation()
|
|
||||||
{
|
|
||||||
static auto K2_GetActorRotationFn = FindObject<UFunction>(L"/Script/Engine.Actor.K2_GetActorRotation");
|
|
||||||
FRotator ret;
|
|
||||||
this->ProcessEvent(K2_GetActorRotationFn, &ret);
|
|
||||||
|
|
||||||
return ret;
|
|
||||||
}
|
|
||||||
|
|
||||||
void AActor::FlushNetDormancy()
|
|
||||||
{
|
|
||||||
static auto fn = FindObject<UFunction>(L"/Script/Engine.Actor.FlushNetDormancy");
|
|
||||||
this->ProcessEvent(fn);
|
|
||||||
}
|
|
||||||
|
|
||||||
bool AActor::TeleportTo(const FVector& DestLocation, const FRotator& DestRotation)
|
|
||||||
{
|
|
||||||
static auto fn = FindObject<UFunction>(L"/Script/Engine.Actor.K2_TeleportTo");
|
|
||||||
struct
|
|
||||||
{
|
|
||||||
struct FVector DestLocation; // (Parm, ZeroConstructor, IsPlainOldData, NoDestructor, HasGetValueTypeHash, NativeAccessSpecifierPublic)
|
|
||||||
struct FRotator DestRotation; // (Parm, ZeroConstructor, IsPlainOldData, NoDestructor, NativeAccessSpecifierPublic)
|
|
||||||
bool ReturnValue; // (Parm, OutParm, ZeroConstructor, ReturnParm, IsPlainOldData, NoDestructor, HasGetValueTypeHash, NativeAccessSpecifierPublic)
|
|
||||||
} AActor_K2_TeleportTo_Params{DestLocation, DestRotation};
|
|
||||||
this->ProcessEvent(fn, &AActor_K2_TeleportTo_Params);
|
|
||||||
return AActor_K2_TeleportTo_Params.ReturnValue;
|
|
||||||
}
|
|
||||||
|
|
||||||
bool AActor::IsActorBeingDestroyed()
|
|
||||||
{
|
|
||||||
static auto bActorIsBeingDestroyedOffset = GetOffset("bActorIsBeingDestroyed");
|
|
||||||
static auto bActorIsBeingDestroyedFieldMask = GetFieldMask(GetProperty("bActorIsBeingDestroyed"));
|
|
||||||
return ReadBitfieldValue(bActorIsBeingDestroyedOffset, bActorIsBeingDestroyedFieldMask);
|
|
||||||
}
|
|
||||||
|
|
||||||
bool AActor::IsNetStartup()
|
|
||||||
{
|
|
||||||
static auto bNetStartupOffset = GetOffset("bNetStartup");
|
|
||||||
static auto bNetStartupFieldMask = GetFieldMask(GetProperty("bNetStartup"));
|
|
||||||
return ReadBitfieldValue(bNetStartupOffset, bNetStartupFieldMask);
|
|
||||||
}
|
|
||||||
|
|
||||||
void AActor::SetOwner(AActor* Owner)
|
|
||||||
{
|
|
||||||
static auto SetOwnerFn = FindObject<UFunction>(L"/Script/Engine.Actor.SetOwner");
|
|
||||||
this->ProcessEvent(SetOwnerFn, &Owner);
|
|
||||||
}
|
|
||||||
|
|
||||||
void AActor::ForceNetUpdate()
|
|
||||||
{
|
|
||||||
static auto ForceNetUpdateFn = FindObject<UFunction>(L"/Script/Engine.Actor.ForceNetUpdate");
|
|
||||||
this->ProcessEvent(ForceNetUpdateFn);
|
|
||||||
}
|
|
||||||
|
|
||||||
bool AActor::IsNetStartupActor()
|
|
||||||
{
|
|
||||||
return IsNetStartup(); // The implementation on this function depends on the version.
|
|
||||||
}
|
|
||||||
|
|
||||||
bool AActor::IsPendingKillPending()
|
|
||||||
{
|
|
||||||
return IsActorBeingDestroyed() || !IsValidChecked(this);
|
|
||||||
}
|
|
||||||
|
|
||||||
float& AActor::GetNetUpdateFrequency()
|
|
||||||
{
|
|
||||||
static auto NetUpdateFrequencyOffset = GetOffset("NetUpdateFrequency");
|
|
||||||
return Get<float>(NetUpdateFrequencyOffset);
|
|
||||||
}
|
|
||||||
|
|
||||||
float& AActor::GetMinNetUpdateFrequency()
|
|
||||||
{
|
|
||||||
static auto MinNetUpdateFrequencyOffset = GetOffset("MinNetUpdateFrequency");
|
|
||||||
return Get<float>(MinNetUpdateFrequencyOffset);
|
|
||||||
}
|
|
||||||
|
|
||||||
const AActor* AActor::GetNetOwner() const
|
|
||||||
{
|
|
||||||
static int GetNetOwnerOffset = 0x448; // 1.11
|
|
||||||
const AActor* (*GetNetOwnerOriginal)(const AActor*) = decltype(GetNetOwnerOriginal)(this->VFTable[GetNetOwnerOffset / 8]);
|
|
||||||
return GetNetOwnerOriginal(this);
|
|
||||||
}
|
|
||||||
|
|
||||||
void AActor::GetActorEyesViewPoint(FVector* OutLocation, FRotator* OutRotation) const
|
|
||||||
{
|
|
||||||
static auto GetActorEyesViewPointFn = FindObject<UFunction>(L"/Script/Engine.Actor.GetActorEyesViewPoint");
|
|
||||||
struct
|
|
||||||
{
|
|
||||||
FVector OutLocation; // (Parm, OutParm, ZeroConstructor, IsPlainOldData, NoDestructor, HasGetValueTypeHash, NativeAccessSpecifierPublic)
|
|
||||||
FRotator OutRotation; // (Parm, OutParm, ZeroConstructor, IsPlainOldData, NoDestructor, NativeAccessSpecifierPublic)
|
|
||||||
} AActor_GetActorEyesViewPoint_Params{};
|
|
||||||
this->ProcessEvent(GetActorEyesViewPointFn, &AActor_GetActorEyesViewPoint_Params);
|
|
||||||
|
|
||||||
*OutLocation = AActor_GetActorEyesViewPoint_Params.OutLocation;
|
|
||||||
*OutRotation = AActor_GetActorEyesViewPoint_Params.OutRotation;
|
|
||||||
}
|
|
||||||
|
|
||||||
AActor* AActor::GetClosestActor(UClass* ActorClass, float DistMax, std::function<bool(AActor*)> AdditionalCheck)
|
|
||||||
{
|
|
||||||
float TargetDist = FLT_MAX;
|
|
||||||
AActor* TargetActor = nullptr;
|
|
||||||
|
|
||||||
TArray<AActor*> AllActors = UGameplayStatics::GetAllActorsOfClass(GetWorld(), ActorClass);
|
|
||||||
auto ActorLocation = GetActorLocation();
|
|
||||||
|
|
||||||
for (int i = 0; i < AllActors.Num(); ++i)
|
|
||||||
{
|
|
||||||
auto Actor = AllActors.at(i);
|
|
||||||
|
|
||||||
if (!Actor || Actor == this)
|
|
||||||
continue;
|
|
||||||
|
|
||||||
if (!AdditionalCheck(Actor))
|
|
||||||
continue;
|
|
||||||
|
|
||||||
auto CurrentActorLocation = Actor->GetActorLocation();
|
|
||||||
|
|
||||||
int Dist = float(sqrtf(powf(CurrentActorLocation.X - ActorLocation.X, 2.0) + powf(CurrentActorLocation.Y - ActorLocation.Y, 2.0) + powf(CurrentActorLocation.Z - ActorLocation.Z, 2.0))) / 100.f;
|
|
||||||
|
|
||||||
if (Dist <= DistMax && Dist < TargetDist)
|
|
||||||
{
|
|
||||||
TargetDist = Dist;
|
|
||||||
TargetActor = Actor;
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
AllActors.Free();
|
|
||||||
|
|
||||||
return TargetActor;
|
|
||||||
}
|
|
||||||
|
|
||||||
bool AActor::IsAlwaysRelevant()
|
|
||||||
{
|
|
||||||
static auto bAlwaysRelevantOffset = GetOffset("bAlwaysRelevant");
|
|
||||||
static auto bAlwaysRelevantFieldMask = GetFieldMask(GetProperty("bAlwaysRelevant"));
|
|
||||||
return ReadBitfieldValue(bAlwaysRelevantOffset, bAlwaysRelevantFieldMask);
|
|
||||||
}
|
|
||||||
|
|
||||||
bool AActor::UsesOwnerRelevancy()
|
|
||||||
{
|
|
||||||
static auto bNetUseOwnerRelevancyOffset = GetOffset("bNetUseOwnerRelevancy");
|
|
||||||
static auto bNetUseOwnerRelevancyFieldMask = GetFieldMask(GetProperty("bNetUseOwnerRelevancy"));
|
|
||||||
return ReadBitfieldValue(bNetUseOwnerRelevancyOffset, bNetUseOwnerRelevancyFieldMask);
|
|
||||||
}
|
|
||||||
|
|
||||||
bool AActor::IsOnlyRelevantToOwner()
|
|
||||||
{
|
|
||||||
static auto bOnlyRelevantToOwnerOffset = GetOffset("bOnlyRelevantToOwner");
|
|
||||||
static auto bOnlyRelevantToOwnerFieldMask = GetFieldMask(GetProperty("bOnlyRelevantToOwner"));
|
|
||||||
return ReadBitfieldValue(bOnlyRelevantToOwnerOffset, bOnlyRelevantToOwnerFieldMask);
|
|
||||||
}
|
|
||||||
|
|
||||||
bool AActor::CanBeDamaged()
|
|
||||||
{
|
|
||||||
static auto bCanBeDamagedOffset = GetOffset("bCanBeDamaged");
|
|
||||||
static auto bCanBeDamagedFieldMask = GetFieldMask(GetProperty("bCanBeDamaged"));
|
|
||||||
return ReadBitfieldValue(bCanBeDamagedOffset, bCanBeDamagedFieldMask);
|
|
||||||
}
|
|
||||||
|
|
||||||
void AActor::SetCanBeDamaged(bool NewValue)
|
|
||||||
{
|
|
||||||
static auto bCanBeDamagedOffset = GetOffset("bCanBeDamaged");
|
|
||||||
static auto bCanBeDamagedFieldMask = GetFieldMask(GetProperty("bCanBeDamaged"));
|
|
||||||
SetBitfieldValue(bCanBeDamagedOffset, bCanBeDamagedFieldMask, NewValue);
|
|
||||||
}
|
|
||||||
|
|
||||||
UClass* AActor::StaticClass()
|
|
||||||
{
|
|
||||||
static auto Class = FindObject<UClass>(L"/Script/Engine.Actor");
|
|
||||||
return Class;
|
|
||||||
}
|
|
||||||
70
dependencies/reboot/Project Reboot 3.0/Actor.h
vendored
70
dependencies/reboot/Project Reboot 3.0/Actor.h
vendored
@@ -1,70 +0,0 @@
|
|||||||
#pragma once
|
|
||||||
|
|
||||||
#include "Object.h"
|
|
||||||
#include "anticheat.h"
|
|
||||||
|
|
||||||
enum class ENetDormancy : uint8_t
|
|
||||||
{
|
|
||||||
DORM_Never = 0,
|
|
||||||
DORM_Awake = 1,
|
|
||||||
DORM_DormantAll = 2,
|
|
||||||
DORM_DormantPartial = 3,
|
|
||||||
DORM_Initial = 4,
|
|
||||||
DORN_MAX = 5,
|
|
||||||
ENetDormancy_MAX = 6
|
|
||||||
};
|
|
||||||
|
|
||||||
class AActor : public UObject
|
|
||||||
{
|
|
||||||
public:
|
|
||||||
struct FTransform GetTransform();
|
|
||||||
|
|
||||||
// class UWorld* GetWorld();
|
|
||||||
bool HasAuthority();
|
|
||||||
bool IsTearOff();
|
|
||||||
/* FORCEINLINE */ ENetDormancy& GetNetDormancy();
|
|
||||||
int32& GetNetTag();
|
|
||||||
void SetNetDormancy(ENetDormancy Dormancy);
|
|
||||||
AActor* GetOwner();
|
|
||||||
struct FVector GetActorScale3D();
|
|
||||||
struct FVector GetActorLocation();
|
|
||||||
struct FVector GetActorForwardVector();
|
|
||||||
struct FVector GetActorRightVector();
|
|
||||||
struct FVector GetActorUpVector();
|
|
||||||
void K2_DestroyActor();
|
|
||||||
class UActorComponent* GetComponentByClass(class UClass* ComponentClass);
|
|
||||||
float GetDistanceTo(AActor* OtherActor);
|
|
||||||
struct FRotator GetActorRotation();
|
|
||||||
void FlushNetDormancy();
|
|
||||||
bool TeleportTo(const FVector& DestLocation, const FRotator& DestRotation);
|
|
||||||
bool IsActorBeingDestroyed();
|
|
||||||
bool IsNetStartup();
|
|
||||||
bool IsAlwaysRelevant();
|
|
||||||
bool UsesOwnerRelevancy();
|
|
||||||
bool IsOnlyRelevantToOwner();
|
|
||||||
bool CanBeDamaged();
|
|
||||||
void SetCanBeDamaged(bool NewValue);
|
|
||||||
void SetOwner(AActor* Owner);
|
|
||||||
void ForceNetUpdate();
|
|
||||||
bool IsNetStartupActor();
|
|
||||||
bool IsPendingKillPending();
|
|
||||||
float& GetNetUpdateFrequency();
|
|
||||||
float& GetMinNetUpdateFrequency();
|
|
||||||
const AActor* GetNetOwner() const;
|
|
||||||
void GetActorEyesViewPoint(FVector* OutLocation, FRotator* OutRotation) const;
|
|
||||||
AActor* GetClosestActor(UClass* ActorClass, float DistMax, std::function<bool(AActor*)> AdditionalCheck = [&](AActor*) { return true; });
|
|
||||||
|
|
||||||
bool IsRelevancyOwnerFor(const AActor* ReplicatedActor, const AActor* ActorOwner, const AActor* ConnectionActor) const
|
|
||||||
{
|
|
||||||
// we should call virtual function but eh
|
|
||||||
// return (ActorOwner == this);
|
|
||||||
|
|
||||||
static auto IsRelevancyOwnerForOffset = 0x428;
|
|
||||||
bool (*IsRelevancyOwnerForOriginal)(const AActor* Actor, const AActor * ReplicatedActor, const AActor * ActorOwner, const AActor * ConnectionActor) =
|
|
||||||
decltype(IsRelevancyOwnerForOriginal)(this->VFTable[IsRelevancyOwnerForOffset / 8]);
|
|
||||||
|
|
||||||
return IsRelevancyOwnerForOriginal(this, ReplicatedActor, ActorOwner, ConnectionActor);
|
|
||||||
}
|
|
||||||
|
|
||||||
static class UClass* StaticClass();
|
|
||||||
};
|
|
||||||
@@ -1,32 +0,0 @@
|
|||||||
#pragma once
|
|
||||||
|
|
||||||
#include "Channel.h"
|
|
||||||
#include "NetworkGuid.h"
|
|
||||||
|
|
||||||
class UActorChannel : public UChannel
|
|
||||||
{
|
|
||||||
public:
|
|
||||||
double& GetLastUpdateTime()
|
|
||||||
{
|
|
||||||
static auto LastUpdateTimeOffset = GetOffset("Actor") + 8 + 4 + 4 + 8; // checked on 4.19
|
|
||||||
return Get<double>(LastUpdateTimeOffset);
|
|
||||||
}
|
|
||||||
|
|
||||||
double& GetRelevantTime()
|
|
||||||
{
|
|
||||||
static auto RelevantTimeOffset = GetOffset("Actor") + 8 + 4 + 4; // checked on 4.19
|
|
||||||
return Get<double>(RelevantTimeOffset);
|
|
||||||
}
|
|
||||||
|
|
||||||
AActor*& GetActor()
|
|
||||||
{
|
|
||||||
static auto ActorOffset = GetOffset("Actor");
|
|
||||||
return Get<AActor*>(ActorOffset);
|
|
||||||
}
|
|
||||||
|
|
||||||
void Close()
|
|
||||||
{
|
|
||||||
static void (*ActorChannelClose)(UActorChannel*) = decltype(ActorChannelClose)(Addresses::ActorChannelClose);
|
|
||||||
ActorChannelClose(this);
|
|
||||||
}
|
|
||||||
};
|
|
||||||
@@ -1,11 +0,0 @@
|
|||||||
#include "ActorComponent.h"
|
|
||||||
|
|
||||||
#include "reboot.h"
|
|
||||||
|
|
||||||
AActor* UActorComponent::GetOwner()
|
|
||||||
{
|
|
||||||
auto GetOwnerFn = FindObject<UFunction>(L"/Script/Engine.ActorComponent.GetOwner");
|
|
||||||
AActor* Owner;
|
|
||||||
this->ProcessEvent(GetOwnerFn, &Owner);
|
|
||||||
return Owner;
|
|
||||||
}
|
|
||||||
@@ -1,9 +0,0 @@
|
|||||||
#pragma once
|
|
||||||
|
|
||||||
#include "Actor.h"
|
|
||||||
|
|
||||||
class UActorComponent : public UObject
|
|
||||||
{
|
|
||||||
public:
|
|
||||||
AActor* GetOwner();
|
|
||||||
};
|
|
||||||
@@ -1,73 +0,0 @@
|
|||||||
// Copyright 1998-2018 Epic Games, Inc. All Rights Reserved.
|
|
||||||
|
|
||||||
#pragma once
|
|
||||||
|
|
||||||
#include "inc.h"
|
|
||||||
|
|
||||||
/**
|
|
||||||
* Does a boolean AND of the ::Value static members of each type, but short-circuits if any Type::Value == false.
|
|
||||||
*/
|
|
||||||
template <typename... Types>
|
|
||||||
struct TAnd;
|
|
||||||
|
|
||||||
template <bool LHSValue, typename... RHS>
|
|
||||||
struct TAndValue
|
|
||||||
{
|
|
||||||
enum { Value = TAnd<RHS...>::Value };
|
|
||||||
};
|
|
||||||
|
|
||||||
template <typename... RHS>
|
|
||||||
struct TAndValue<false, RHS...>
|
|
||||||
{
|
|
||||||
enum { Value = false };
|
|
||||||
};
|
|
||||||
|
|
||||||
template <typename LHS, typename... RHS>
|
|
||||||
struct TAnd<LHS, RHS...> : TAndValue<LHS::Value, RHS...>
|
|
||||||
{
|
|
||||||
};
|
|
||||||
|
|
||||||
template <>
|
|
||||||
struct TAnd<>
|
|
||||||
{
|
|
||||||
enum { Value = true };
|
|
||||||
};
|
|
||||||
|
|
||||||
/**
|
|
||||||
* Does a boolean OR of the ::Value static members of each type, but short-circuits if any Type::Value == true.
|
|
||||||
*/
|
|
||||||
template <typename... Types>
|
|
||||||
struct TOr;
|
|
||||||
|
|
||||||
template <bool LHSValue, typename... RHS>
|
|
||||||
struct TOrValue
|
|
||||||
{
|
|
||||||
enum { Value = TOr<RHS...>::Value };
|
|
||||||
};
|
|
||||||
|
|
||||||
template <typename... RHS>
|
|
||||||
struct TOrValue<true, RHS...>
|
|
||||||
{
|
|
||||||
enum { Value = true };
|
|
||||||
};
|
|
||||||
|
|
||||||
template <typename LHS, typename... RHS>
|
|
||||||
struct TOr<LHS, RHS...> : TOrValue<LHS::Value, RHS...>
|
|
||||||
{
|
|
||||||
};
|
|
||||||
|
|
||||||
template <>
|
|
||||||
struct TOr<>
|
|
||||||
{
|
|
||||||
enum { Value = false };
|
|
||||||
};
|
|
||||||
|
|
||||||
/**
|
|
||||||
* Does a boolean NOT of the ::Value static members of the type.
|
|
||||||
*/
|
|
||||||
template <typename Type>
|
|
||||||
struct TNot
|
|
||||||
{
|
|
||||||
enum { Value = !Type::Value };
|
|
||||||
};
|
|
||||||
|
|
||||||
415
dependencies/reboot/Project Reboot 3.0/Array.h
vendored
415
dependencies/reboot/Project Reboot 3.0/Array.h
vendored
@@ -1,415 +0,0 @@
|
|||||||
#pragma once
|
|
||||||
|
|
||||||
#include "inc.h"
|
|
||||||
#include "addresses.h"
|
|
||||||
|
|
||||||
#include "MemoryOps.h"
|
|
||||||
#include "ContainerAllocationPolicies.h"
|
|
||||||
|
|
||||||
struct FMemory
|
|
||||||
{
|
|
||||||
static inline void* (*Realloc)(void* Original, SIZE_T Count, uint32_t Alignment /* = DEFAULT_ALIGNMENT */);
|
|
||||||
};
|
|
||||||
|
|
||||||
template <typename T = __int64>
|
|
||||||
static T* AllocUnreal(size_t Size)
|
|
||||||
{
|
|
||||||
return (T*)FMemory::Realloc(0, Size, 0);
|
|
||||||
}
|
|
||||||
|
|
||||||
template<typename InElementType> //, typename InAllocatorType>
|
|
||||||
class TArray
|
|
||||||
{
|
|
||||||
// protected:
|
|
||||||
public:
|
|
||||||
friend class FString;
|
|
||||||
|
|
||||||
using ElementAllocatorType = InElementType*;
|
|
||||||
using SizeType = int32;
|
|
||||||
|
|
||||||
ElementAllocatorType Data = nullptr; // AllocatorInstance;
|
|
||||||
SizeType ArrayNum;
|
|
||||||
SizeType ArrayMax;
|
|
||||||
|
|
||||||
public:
|
|
||||||
|
|
||||||
inline InElementType& At(int i, size_t Size = sizeof(InElementType)) const { return *(InElementType*)(__int64(Data) + (static_cast<long long>(Size) * i)); }
|
|
||||||
inline InElementType& at(int i, size_t Size = sizeof(InElementType)) const { return *(InElementType*)(__int64(Data) + (static_cast<long long>(Size) * i)); }
|
|
||||||
inline InElementType* AtPtr(int i, size_t Size = sizeof(InElementType)) const { return (InElementType*)(__int64(Data) + (static_cast<long long>(Size) * i)); }
|
|
||||||
|
|
||||||
bool IsValidIndex(int i) { return i > 0 && i < ArrayNum; }
|
|
||||||
|
|
||||||
ElementAllocatorType& GetData() const { return Data; }
|
|
||||||
ElementAllocatorType& GetData() { return Data; }
|
|
||||||
|
|
||||||
void Reserve(int Number, size_t Size = sizeof(InElementType))
|
|
||||||
{
|
|
||||||
// LOG_INFO(LogDev, "ArrayNum {}", ArrayNum);
|
|
||||||
// Data = (InElementType*)FMemory::Realloc(Data, (ArrayMax = ArrayNum + Number) * Size, 0);
|
|
||||||
Data = /* (ArrayMax - ArrayNum) >= ArrayNum ? Data : */ (InElementType*)FMemory::Realloc(Data, (ArrayMax = Number + ArrayNum) * Size, 0);
|
|
||||||
}
|
|
||||||
|
|
||||||
int CalculateSlackReserve(SizeType NumElements, SIZE_T NumBytesPerElement) const
|
|
||||||
{
|
|
||||||
return DefaultCalculateSlackReserve(NumElements, NumBytesPerElement, false);
|
|
||||||
}
|
|
||||||
|
|
||||||
void ResizeArray(SizeType NewNum, SIZE_T NumBytesPerElement)
|
|
||||||
{
|
|
||||||
const SizeType CurrentMax = ArrayMax;
|
|
||||||
SizeType v3 = NewNum;
|
|
||||||
if (NewNum)
|
|
||||||
{
|
|
||||||
/* SizeType v6 = (unsigned __int64)FMemory::QuantizeSize(4 * NewNum, 0) >> 2;
|
|
||||||
// if (v3 > (int)v6)
|
|
||||||
// LODWORD(v6) = 0x7FFFFFFF;
|
|
||||||
v3 = v6; */
|
|
||||||
}
|
|
||||||
|
|
||||||
if (v3 != CurrentMax && (Data || v3))
|
|
||||||
Data = (InElementType*)FMemory::Realloc(Data, NumBytesPerElement * v3, 0);
|
|
||||||
|
|
||||||
ArrayNum = v3; // ?
|
|
||||||
ArrayMax = v3;
|
|
||||||
}
|
|
||||||
|
|
||||||
void RefitArray(SIZE_T NumBytesPerElement = sizeof(InElementType))
|
|
||||||
{
|
|
||||||
auto newNum = ArrayNum;
|
|
||||||
|
|
||||||
// newNum = FMemory::QuantizeSize(NumBytesPerElement * newNum, 0) >> 4
|
|
||||||
|
|
||||||
ArrayMax = newNum;
|
|
||||||
|
|
||||||
if (Data || ArrayNum)
|
|
||||||
{
|
|
||||||
Data = false ? (InElementType*)VirtualAlloc(0, newNum * NumBytesPerElement, MEM_COMMIT | MEM_RESERVE, PAGE_EXECUTE_READWRITE) :
|
|
||||||
(InElementType*)FMemory::Realloc(Data, newNum * NumBytesPerElement, 0);
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
int AddUninitialized2(SIZE_T NumBytesPerElement = sizeof(InElementType))
|
|
||||||
{
|
|
||||||
const int OldArrayNum = ArrayNum;
|
|
||||||
|
|
||||||
ArrayNum = OldArrayNum + 1;
|
|
||||||
|
|
||||||
if (OldArrayNum + 1 > ArrayMax)
|
|
||||||
{
|
|
||||||
RefitArray(NumBytesPerElement);
|
|
||||||
// ResizeArray(ArrayNum, NumBytesPerElement);
|
|
||||||
}
|
|
||||||
|
|
||||||
return OldArrayNum;
|
|
||||||
}
|
|
||||||
|
|
||||||
void CopyFromArray(TArray<InElementType>& OtherArray, SIZE_T NumBytesPerElement = sizeof(InElementType))
|
|
||||||
{
|
|
||||||
if (!OtherArray.ArrayNum && !ArrayMax) // so if the new array has nothing, and we currently have nothing allocated, then we can just return
|
|
||||||
{
|
|
||||||
ArrayMax = 0;
|
|
||||||
return;
|
|
||||||
}
|
|
||||||
|
|
||||||
ResizeArray(OtherArray.ArrayNum, NumBytesPerElement);
|
|
||||||
memcpy(this->Data, OtherArray.Data, NumBytesPerElement * OtherArray.ArrayNum);
|
|
||||||
}
|
|
||||||
|
|
||||||
/*
|
|
||||||
FORCENOINLINE void ResizeForCopy(SizeType NewMax, SizeType PrevMax, int ElementSize = sizeof(InElementType))
|
|
||||||
{
|
|
||||||
if (NewMax)
|
|
||||||
{
|
|
||||||
NewMax = CalculateSlackReserve(NewMax, ElementSize);
|
|
||||||
}
|
|
||||||
if (NewMax != PrevMax)
|
|
||||||
{
|
|
||||||
int ReserveCount = NewMax - PrevMax; // IDK TODO Milxnor
|
|
||||||
Reserve(ReserveCount, ElementSize);
|
|
||||||
// AllocatorInstance.ResizeAllocation(0, NewMax, ElementSize);
|
|
||||||
}
|
|
||||||
|
|
||||||
ArrayMax = NewMax;
|
|
||||||
}
|
|
||||||
|
|
||||||
template <typename OtherElementType, typename OtherSizeType>
|
|
||||||
void CopyToEmpty(const OtherElementType* OtherData, OtherSizeType OtherNum, SizeType PrevMax, SizeType ExtraSlack, int ElementSize = sizeof(InElementType))
|
|
||||||
{
|
|
||||||
SizeType NewNum = (SizeType)OtherNum;
|
|
||||||
// checkf((OtherSizeType)NewNum == OtherNum, TEXT("Invalid number of elements to add to this array type: %llu"), (unsigned long long)NewNum);
|
|
||||||
|
|
||||||
// checkSlow(ExtraSlack >= 0);
|
|
||||||
ArrayNum = NewNum;
|
|
||||||
|
|
||||||
if (OtherNum || ExtraSlack || PrevMax)
|
|
||||||
{
|
|
||||||
ResizeForCopy(NewNum + ExtraSlack, PrevMax);
|
|
||||||
ConstructItems<InElementType>(GetData(), OtherData, OtherNum);
|
|
||||||
}
|
|
||||||
else
|
|
||||||
{
|
|
||||||
ArrayMax = 0; // AllocatorInstance.GetInitialCapacity();
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
FORCEINLINE TArray(const TArray& Other)
|
|
||||||
{
|
|
||||||
CopyToEmpty(Other.Data, Other.Num(), 0, 0);
|
|
||||||
}
|
|
||||||
*/
|
|
||||||
|
|
||||||
TArray() : Data(nullptr), ArrayNum(0), ArrayMax(0) {}
|
|
||||||
|
|
||||||
inline int Num() const { return ArrayNum; }
|
|
||||||
inline int size() const { return ArrayNum; }
|
|
||||||
|
|
||||||
/* FORCENOINLINE void ResizeTo(int32 NewMax)
|
|
||||||
{
|
|
||||||
if (NewMax)
|
|
||||||
{
|
|
||||||
NewMax = AllocatorInstance.CalculateSlackReserve(NewMax, sizeof(ElementType));
|
|
||||||
}
|
|
||||||
if (NewMax != ArrayMax)
|
|
||||||
{
|
|
||||||
ArrayMax = NewMax;
|
|
||||||
AllocatorInstance.ResizeAllocation(ArrayNum, ArrayMax, sizeof(ElementType));
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
void Empty(int32 Slack = 0)
|
|
||||||
{
|
|
||||||
// DestructItems(GetData(), ArrayNum);
|
|
||||||
|
|
||||||
// checkSlow(Slack >= 0);
|
|
||||||
ArrayNum = 0;
|
|
||||||
|
|
||||||
if (ArrayMax != Slack)
|
|
||||||
{
|
|
||||||
ResizeTo(Slack);
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
void Reset(int32 NewSize = 0)
|
|
||||||
{
|
|
||||||
// If we have space to hold the excepted size, then don't reallocate
|
|
||||||
if (NewSize <= ArrayMax)
|
|
||||||
{
|
|
||||||
// DestructItems(GetData(), ArrayNum);
|
|
||||||
ArrayNum = 0;
|
|
||||||
}
|
|
||||||
else
|
|
||||||
{
|
|
||||||
Empty(NewSize);
|
|
||||||
}
|
|
||||||
} */
|
|
||||||
|
|
||||||
void RemoveAtImpl(int32 Index, int32 Count, bool bAllowShrinking)
|
|
||||||
{
|
|
||||||
if (Count)
|
|
||||||
{
|
|
||||||
// CheckInvariants();
|
|
||||||
// checkSlow((Count >= 0) & (Index >= 0) & (Index + Count <= ArrayNum));
|
|
||||||
|
|
||||||
// DestructItems(GetData() + Index, Count); // TODO milxnor
|
|
||||||
|
|
||||||
// Skip memmove in the common case that there is nothing to move.
|
|
||||||
int32 NumToMove = ArrayNum - Index - Count;
|
|
||||||
if (NumToMove)
|
|
||||||
{
|
|
||||||
/* FMemory::Memmove
|
|
||||||
(
|
|
||||||
(uint8*)AllocatorInstance.GetAllocation() + (Index) * sizeof(ElementType),
|
|
||||||
(uint8*)AllocatorInstance.GetAllocation() + (Index + Count) * sizeof(ElementType),
|
|
||||||
NumToMove * sizeof(ElementType)
|
|
||||||
); */
|
|
||||||
// memmove(Data + (Index) * sizeof(InElementType), Data + (Index + Count) * sizeof(InElementType), NumToMove * sizeof(InElementType)); // i think this wrong
|
|
||||||
}
|
|
||||||
ArrayNum -= Count;
|
|
||||||
|
|
||||||
if (bAllowShrinking)
|
|
||||||
{
|
|
||||||
// ResizeShrink(); // TODO milxnor
|
|
||||||
}
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
|
|
||||||
FORCEINLINE SizeType CalculateSlackGrow(SizeType NumElements, SizeType NumAllocatedElements, SIZE_T NumBytesPerElement) const
|
|
||||||
{
|
|
||||||
return ArrayMax - NumElements;
|
|
||||||
}
|
|
||||||
|
|
||||||
template <typename CountType>
|
|
||||||
FORCEINLINE void RemoveAt(int32 Index, CountType Count, bool bAllowShrinking = true)
|
|
||||||
{
|
|
||||||
// static_assert(!TAreTypesEqual<CountType, bool>::Value, "TArray::RemoveAt: unexpected bool passed as the Count argument");
|
|
||||||
RemoveAtImpl(Index, Count, bAllowShrinking);
|
|
||||||
}
|
|
||||||
|
|
||||||
FORCENOINLINE void ResizeGrow(int32 OldNum, size_t Size = sizeof(InElementType))
|
|
||||||
{
|
|
||||||
// LOG_INFO(LogMemory, "FMemory::Realloc: {}", __int64(FMemory::Realloc));
|
|
||||||
|
|
||||||
ArrayMax = ArrayNum; // CalculateSlackGrow(/* ArrayNum */ OldNum, ArrayMax, Size);
|
|
||||||
// AllocatorInstance.ResizeAllocation(OldNum, ArrayMax, sizeof(ElementType));
|
|
||||||
// LOG_INFO(LogMemory, "ArrayMax: {} Size: {}", ArrayMax, Size);
|
|
||||||
Data = (InElementType*)FMemory::Realloc(Data, ArrayNum * Size, 0);
|
|
||||||
}
|
|
||||||
|
|
||||||
FORCEINLINE int32 AddUninitialized(int32 Count = 1, size_t Size = sizeof(InElementType))
|
|
||||||
{
|
|
||||||
// CheckInvariants();
|
|
||||||
|
|
||||||
if (Count < 0)
|
|
||||||
{
|
|
||||||
return 0;
|
|
||||||
}
|
|
||||||
|
|
||||||
const int32 OldNum = ArrayNum;
|
|
||||||
if ((ArrayNum += Count) > ArrayMax)
|
|
||||||
{
|
|
||||||
ResizeGrow(OldNum, Size);
|
|
||||||
}
|
|
||||||
return OldNum;
|
|
||||||
}
|
|
||||||
|
|
||||||
FORCEINLINE int32 Emplace(const InElementType& New, size_t Size = sizeof(InElementType))
|
|
||||||
{
|
|
||||||
const int32 Index = AddUninitialized(1, Size); // resizes array
|
|
||||||
memcpy_s((InElementType*)(__int64(Data) + (Index * Size)), Size, (void*)&New, Size);
|
|
||||||
// new(GetData() + Index) ElementType(Forward<ArgsType>(Args)...);
|
|
||||||
return Index;
|
|
||||||
}
|
|
||||||
|
|
||||||
/* int Add(const InElementType& New, int Size = sizeof(InElementType))
|
|
||||||
{
|
|
||||||
return Emplace(New, Size);
|
|
||||||
} */
|
|
||||||
|
|
||||||
int AddPtr(InElementType* New, size_t Size = sizeof(InElementType))
|
|
||||||
{
|
|
||||||
// LOG_INFO(LogDev, "ArrayMax: {}", ArrayMax);
|
|
||||||
|
|
||||||
if ((ArrayNum + 1) > ArrayMax)
|
|
||||||
{
|
|
||||||
Reserve(1, Size);
|
|
||||||
}
|
|
||||||
|
|
||||||
if (Data)
|
|
||||||
{
|
|
||||||
memcpy_s((InElementType*)(__int64(Data) + (ArrayNum * Size)), Size, (void*)New, Size);
|
|
||||||
++ArrayNum;
|
|
||||||
return ArrayNum; // - 1;
|
|
||||||
}
|
|
||||||
|
|
||||||
return -1;
|
|
||||||
}
|
|
||||||
|
|
||||||
int Add(const InElementType& New, size_t Size = sizeof(InElementType))
|
|
||||||
{
|
|
||||||
// LOG_INFO(LogDev, "ArrayMax: {}", ArrayMax);
|
|
||||||
|
|
||||||
if ((ArrayNum + 1) > ArrayMax)
|
|
||||||
{
|
|
||||||
Reserve(1, Size);
|
|
||||||
}
|
|
||||||
|
|
||||||
if (Data)
|
|
||||||
{
|
|
||||||
memcpy_s((InElementType*)(__int64(Data) + (ArrayNum * Size)), Size, (void*)&New, Size);
|
|
||||||
++ArrayNum;
|
|
||||||
return ArrayNum; // - 1;
|
|
||||||
}
|
|
||||||
|
|
||||||
return -1;
|
|
||||||
}
|
|
||||||
|
|
||||||
void FreeGood(SizeType Size = sizeof(InElementType))
|
|
||||||
{
|
|
||||||
if (Data)
|
|
||||||
{
|
|
||||||
if (true)
|
|
||||||
{
|
|
||||||
static void (*FreeOriginal)(void* Original) = decltype(FreeOriginal)(Addresses::Free);
|
|
||||||
|
|
||||||
if (FreeOriginal)
|
|
||||||
FreeOriginal(Data);
|
|
||||||
}
|
|
||||||
else
|
|
||||||
{
|
|
||||||
VirtualFree(Data, 0, MEM_RELEASE);
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
Data = nullptr;
|
|
||||||
ArrayNum = 0;
|
|
||||||
ArrayMax = 0;
|
|
||||||
}
|
|
||||||
|
|
||||||
void FreeReal(SizeType Size = sizeof(InElementType))
|
|
||||||
{
|
|
||||||
if (!IsBadReadPtr(Data, 8) && ArrayNum > 0 && sizeof(InElementType) > 0)
|
|
||||||
{
|
|
||||||
for (int i = 0; i < ArrayNum; ++i)
|
|
||||||
{
|
|
||||||
auto current = AtPtr(i, Size);
|
|
||||||
|
|
||||||
RtlSecureZeroMemory(current, Size);
|
|
||||||
}
|
|
||||||
|
|
||||||
// VirtualFree(Data, _msize(Data), MEM_RELEASE);
|
|
||||||
// VirtualFree(Data, sizeof(InElementType) * ArrayNum, MEM_RELEASE); // ik this does nothing
|
|
||||||
|
|
||||||
/* static void (*FreeOriginal)(void*) = decltype(FreeOriginal)(Addresses::Free);
|
|
||||||
|
|
||||||
if (FreeOriginal)
|
|
||||||
{
|
|
||||||
FreeOriginal(Data);
|
|
||||||
}
|
|
||||||
else */
|
|
||||||
{
|
|
||||||
auto res = VirtualFree(Data, 0, MEM_RELEASE);
|
|
||||||
// auto res = VirtualFree(Data, sizeof(InElementType) * ArrayNum, MEM_RELEASE);
|
|
||||||
LOG_INFO(LogDev, "Free: {} aa: 0x{:x}", res, res ? 0 : GetLastError());
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
Data = nullptr;
|
|
||||||
ArrayNum = 0;
|
|
||||||
ArrayMax = 0;
|
|
||||||
}
|
|
||||||
|
|
||||||
void Free()
|
|
||||||
{
|
|
||||||
if (Data && ArrayNum > 0 && sizeof(InElementType) > 0)
|
|
||||||
{
|
|
||||||
// VirtualFree(Data, _msize(Data), MEM_RELEASE);
|
|
||||||
VirtualFree(Data, sizeof(InElementType) * ArrayNum, MEM_RELEASE); // ik this does nothing
|
|
||||||
// VirtualFree(Data, 0, MEM_RELEASE);
|
|
||||||
}
|
|
||||||
|
|
||||||
Data = nullptr;
|
|
||||||
ArrayNum = 0;
|
|
||||||
ArrayMax = 0;
|
|
||||||
}
|
|
||||||
|
|
||||||
bool Remove(const int Index, size_t Size = sizeof(InElementType))
|
|
||||||
{
|
|
||||||
// return false;
|
|
||||||
|
|
||||||
if (Index < ArrayNum)
|
|
||||||
{
|
|
||||||
if (Index != ArrayNum - 1)
|
|
||||||
{
|
|
||||||
memcpy_s(&at(Index, Size), Size, &at(ArrayNum - 1, Size), Size);
|
|
||||||
// Data[Index] = Data[ArrayNum - 1];
|
|
||||||
}
|
|
||||||
|
|
||||||
--ArrayNum;
|
|
||||||
|
|
||||||
return true;
|
|
||||||
}
|
|
||||||
|
|
||||||
return false;
|
|
||||||
}
|
|
||||||
};
|
|
||||||
@@ -1,61 +0,0 @@
|
|||||||
#pragma once
|
|
||||||
|
|
||||||
#include "log.h"
|
|
||||||
#include "inc.h"
|
|
||||||
|
|
||||||
/*
|
|
||||||
#ifdef PROD
|
|
||||||
#define UE_DEBUG_BREAK() ((void)0)
|
|
||||||
#else
|
|
||||||
#define UE_DEBUG_BREAK() ((void)(FWindowsPlatformMisc::IsDebuggerPresent() && (__debugbreak(), 1)))
|
|
||||||
#endif
|
|
||||||
|
|
||||||
#ifndef PROD
|
|
||||||
#define _DebugBreakAndPromptForRemote() \
|
|
||||||
if (!FPlatformMisc::IsDebuggerPresent()) { FPlatformMisc::PromptForRemoteDebugging(false); } UE_DEBUG_BREAK();
|
|
||||||
#else
|
|
||||||
#define _DebugBreakAndPromptForRemote()
|
|
||||||
#endif
|
|
||||||
|
|
||||||
#define CA_ASSUME( Expr ) // Todo move to Misc/CoreMiscDefines.h
|
|
||||||
|
|
||||||
namespace FDebug
|
|
||||||
{
|
|
||||||
template <typename FmtType, typename... Types>
|
|
||||||
static void LogAssertFailedMessage(const char* Expr, const char* File, int32 Line, const FmtType& Fmt, Types... Args)
|
|
||||||
{
|
|
||||||
// static_assert(TIsArrayOrRefOfType<FmtType, TCHAR>::Value, "Formatting string must be a TCHAR array.");
|
|
||||||
// tatic_assert(TAnd<TIsValidVariadicFunctionArg<Types>...>::Value, "Invalid argument(s) passed to FDebug::LogAssertFailedMessage");
|
|
||||||
|
|
||||||
LOG_ERROR(LogDev, "Assert failed message {} {}", File, Line);
|
|
||||||
// LogAssertFailedMessageImpl(Expr, File, Line, Fmt, Args...);
|
|
||||||
}
|
|
||||||
|
|
||||||
void __cdecl AssertFailed(const char* Expr, const char* File, int32 Line, const wchar_t* Format = TEXT(""), ...)
|
|
||||||
{
|
|
||||||
LOG_ERROR(LogDev, "Assert failed {} {}", File, Line);
|
|
||||||
|
|
||||||
/*
|
|
||||||
if (GIsCriticalError)
|
|
||||||
{
|
|
||||||
return;
|
|
||||||
}
|
|
||||||
|
|
||||||
// This is not perfect because another thread might crash and be handled before this assert
|
|
||||||
// but this static varible will report the crash as an assert. Given complexity of a thread
|
|
||||||
// aware solution, this should be good enough. If crash reports are obviously wrong we can
|
|
||||||
// look into fixing this.
|
|
||||||
bHasAsserted = true;
|
|
||||||
|
|
||||||
TCHAR DescriptionString[4096];
|
|
||||||
GET_VARARGS(DescriptionString, ARRAY_COUNT(DescriptionString), ARRAY_COUNT(DescriptionString) - 1, Format, Format);
|
|
||||||
|
|
||||||
TCHAR ErrorString[MAX_SPRINTF];
|
|
||||||
FCString::Sprintf(ErrorString, TEXT("%s"), ANSI_TO_TCHAR(Expr));
|
|
||||||
GError->Logf(TEXT("Assertion failed: %s") FILE_LINE_DESC TEXT("\n%s\n"), ErrorString, ANSI_TO_TCHAR(File), Line, DescriptionString);
|
|
||||||
|
|
||||||
}
|
|
||||||
}
|
|
||||||
*/
|
|
||||||
|
|
||||||
// #define check(expr) { if(UNLIKELY(!(expr))) { FDebug::LogAssertFailedMessage( #expr, __FILE__, __LINE__, TEXT("") ); _DebugBreakAndPromptForRemote(); FDebug::AssertFailed( #expr, __FILE__, __LINE__ ); CA_ASSUME(false); } }
|
|
||||||
@@ -1,26 +0,0 @@
|
|||||||
#pragma once
|
|
||||||
|
|
||||||
#include "PersistentObjectPtr.h"
|
|
||||||
#include "StringAssetReference.h"
|
|
||||||
|
|
||||||
#include "reboot.h"
|
|
||||||
|
|
||||||
class FAssetPtr : public TPersistentObjectPtr<FStringAssetReference>
|
|
||||||
{
|
|
||||||
public:
|
|
||||||
};
|
|
||||||
|
|
||||||
template<class T = UObject>
|
|
||||||
class TAssetPtr
|
|
||||||
{
|
|
||||||
public:
|
|
||||||
FAssetPtr AssetPtr;
|
|
||||||
|
|
||||||
T* Get()
|
|
||||||
{
|
|
||||||
if (!AssetPtr.ObjectID.AssetLongPathname.IsValid())
|
|
||||||
return nullptr;
|
|
||||||
|
|
||||||
return FindObject<T>(AssetPtr.ObjectID.AssetLongPathname.ToString());
|
|
||||||
}
|
|
||||||
};
|
|
||||||
@@ -1,44 +0,0 @@
|
|||||||
#pragma once
|
|
||||||
|
|
||||||
#include "BuildingGameplayActor.h"
|
|
||||||
#include "AthenaBarrierObjective.h"
|
|
||||||
|
|
||||||
struct FBarrierFlagDisplayData
|
|
||||||
{
|
|
||||||
static UStruct* GetStruct()
|
|
||||||
{
|
|
||||||
static auto Struct = FindObject<UStruct>("/Script/FortniteGame.BarrierFlagDisplayData");
|
|
||||||
return Struct;
|
|
||||||
}
|
|
||||||
|
|
||||||
static int GetStructSize() { return GetStruct()->GetPropertiesSize(); }
|
|
||||||
|
|
||||||
UStaticMesh* GetHeadMesh()
|
|
||||||
{
|
|
||||||
static auto HeadMeshOffset = FindOffsetStruct("/Script/FortniteGame.BarrierFlagDisplayData", "HeadMesh");
|
|
||||||
return *(UStaticMesh**)(__int64(this) + HeadMeshOffset);
|
|
||||||
}
|
|
||||||
|
|
||||||
FVector& GetMeshScale()
|
|
||||||
{
|
|
||||||
static auto MeshScaleOffset = FindOffsetStruct("/Script/FortniteGame.BarrierFlagDisplayData", "MeshScale");
|
|
||||||
return *(FVector*)(__int64(this) + MeshScaleOffset);
|
|
||||||
}
|
|
||||||
};
|
|
||||||
|
|
||||||
class AAthenaBarrierFlag : public ABuildingGameplayActor
|
|
||||||
{
|
|
||||||
public:
|
|
||||||
EBarrierFoodTeam& GetFoodTeam()
|
|
||||||
{
|
|
||||||
static auto FoodTeamOffset = GetOffset("FoodTeam");
|
|
||||||
return Get<EBarrierFoodTeam>(FoodTeamOffset);
|
|
||||||
}
|
|
||||||
|
|
||||||
FBarrierFlagDisplayData* GetDisplayData(EBarrierFoodTeam FoodTeam)
|
|
||||||
{
|
|
||||||
static auto FoodDisplayDataOffset = GetOffset("FoodDisplayData");
|
|
||||||
auto FoodDisplayData = Get<FBarrierFlagDisplayData*>(FoodDisplayDataOffset); // Array of size 2
|
|
||||||
return &FoodDisplayData[(int)FoodTeam];
|
|
||||||
}
|
|
||||||
};
|
|
||||||
@@ -1,59 +0,0 @@
|
|||||||
#pragma once
|
|
||||||
|
|
||||||
#include "BuildingGameplayActor.h"
|
|
||||||
|
|
||||||
using UStaticMesh = UObject;
|
|
||||||
using UMaterialInterface = UObject;
|
|
||||||
|
|
||||||
enum class EBarrierFoodTeam : uint8_t
|
|
||||||
{
|
|
||||||
Burger = 0,
|
|
||||||
Tomato = 1,
|
|
||||||
MAX = 2
|
|
||||||
};
|
|
||||||
|
|
||||||
struct FBarrierObjectiveDisplayData
|
|
||||||
{
|
|
||||||
UStaticMesh* HeadMesh; // 0x0000(0x0008) (Edit, ZeroConstructor, IsPlainOldData, NoDestructor, HasGetValueTypeHash, NativeAccessSpecifierPublic)
|
|
||||||
FVector MeshScale; // 0x0008(0x000C) (Edit, ZeroConstructor, IsPlainOldData, NoDestructor, HasGetValueTypeHash, NativeAccessSpecifierPublic)
|
|
||||||
FVector MeshRelativeOffset; // 0x0014(0x000C) (Edit, ZeroConstructor, IsPlainOldData, NoDestructor, HasGetValueTypeHash, NativeAccessSpecifierPublic)
|
|
||||||
TArray<UMaterialInterface*> MaterialsToSwap; // 0x0020(0x0010) (Edit, ZeroConstructor, NativeAccessSpecifierPublic)
|
|
||||||
};
|
|
||||||
|
|
||||||
class AAthenaBarrierObjective : public ABuildingGameplayActor
|
|
||||||
{
|
|
||||||
public:
|
|
||||||
void SetHeadMesh(UStaticMesh* NewMesh, const FVector& NewScale, const FVector& NewOffset, const TArray<UMaterialInterface*>& MaterialsToSwap)
|
|
||||||
{
|
|
||||||
static auto SetHeadMeshFn = FindObject<UFunction>("/Script/FortniteGame.AthenaBarrierObjective.SetHeadMesh");
|
|
||||||
|
|
||||||
struct
|
|
||||||
{
|
|
||||||
UStaticMesh* NewMesh; // (Parm, ZeroConstructor, IsPlainOldData, NoDestructor, HasGetValueTypeHash, NativeAccessSpecifierPublic)
|
|
||||||
FVector NewScale; // (Parm, ZeroConstructor, IsPlainOldData, NoDestructor, HasGetValueTypeHash, NativeAccessSpecifierPublic)
|
|
||||||
FVector NewOffset; // (Parm, ZeroConstructor, IsPlainOldData, NoDestructor, HasGetValueTypeHash, NativeAccessSpecifierPublic)
|
|
||||||
TArray<UMaterialInterface*> MaterialsToSwap; // (ConstParm, Parm, OutParm, ZeroConstructor, ReferenceParm, NativeAccessSpecifierPublic)
|
|
||||||
} AAthenaBarrierObjective_SetHeadMesh_Params{ NewMesh, NewScale, NewOffset, MaterialsToSwap };
|
|
||||||
|
|
||||||
this->ProcessEvent(SetHeadMeshFn, &AAthenaBarrierObjective_SetHeadMesh_Params);
|
|
||||||
}
|
|
||||||
|
|
||||||
EBarrierFoodTeam& GetFoodTeam()
|
|
||||||
{
|
|
||||||
static auto FoodTeamOffset = GetOffset("FoodTeam");
|
|
||||||
return Get<EBarrierFoodTeam>(FoodTeamOffset);
|
|
||||||
}
|
|
||||||
|
|
||||||
FBarrierObjectiveDisplayData* GetFoodDisplayData(EBarrierFoodTeam FoodTeam)
|
|
||||||
{
|
|
||||||
static auto FoodDisplayDataOffset = GetOffset("FoodDisplayData");
|
|
||||||
auto FoodDisplayData = Get<FBarrierObjectiveDisplayData*>(FoodDisplayDataOffset); // Array size of 2
|
|
||||||
return &FoodDisplayData[(int)FoodTeam];
|
|
||||||
}
|
|
||||||
|
|
||||||
static UClass* StaticClass()
|
|
||||||
{
|
|
||||||
static auto Class = FindObject<UClass>("/Script/FortniteGame.AthenaBarrierObjective");
|
|
||||||
return Class;
|
|
||||||
}
|
|
||||||
};
|
|
||||||
@@ -1,8 +0,0 @@
|
|||||||
#pragma once
|
|
||||||
|
|
||||||
#include "BuildingGameplayActor.h"
|
|
||||||
|
|
||||||
class AAthenaBigBaseWall : public ABuildingGameplayActor
|
|
||||||
{
|
|
||||||
public:
|
|
||||||
};
|
|
||||||
@@ -1,161 +0,0 @@
|
|||||||
#include "AthenaMarkerComponent.h"
|
|
||||||
#include "FortPlayerControllerAthena.h"
|
|
||||||
#include "Text.h"
|
|
||||||
#include "KismetTextLibrary.h"
|
|
||||||
|
|
||||||
void UAthenaMarkerComponent::ServerAddMapMarkerHook(UAthenaMarkerComponent* MarkerComponent, FFortClientMarkerRequest MarkerRequest)
|
|
||||||
{
|
|
||||||
auto Owner = MarkerComponent->GetOwner();
|
|
||||||
|
|
||||||
AFortPlayerControllerAthena* PlayerController = Cast<AFortPlayerControllerAthena>(Owner);
|
|
||||||
|
|
||||||
if (!PlayerController)
|
|
||||||
return;
|
|
||||||
|
|
||||||
AFortPlayerStateAthena* PlayerState = Cast<AFortPlayerStateAthena>(PlayerController->GetPlayerState());
|
|
||||||
|
|
||||||
if (!PlayerState)
|
|
||||||
return;
|
|
||||||
|
|
||||||
auto MarkerRequestPtr = &MarkerRequest;
|
|
||||||
|
|
||||||
bool useRealloc = false;
|
|
||||||
auto MarkerData = Alloc<FFortWorldMarkerData>(FFortWorldMarkerData::GetStructSize(), useRealloc);
|
|
||||||
|
|
||||||
static auto IconOffset = FindOffsetStruct("/Script/FortniteGame.MarkedActorDisplayInfo", "Icon");
|
|
||||||
static auto DisplayNameOffset = FindOffsetStruct("/Script/FortniteGame.MarkedActorDisplayInfo", "DisplayName");
|
|
||||||
static auto WorldPositionOffset = FindOffsetStruct("/Script/FortniteGame.FortWorldMarkerData", "WorldPosition", false);
|
|
||||||
static auto bIncludeSquadOffset = FindOffsetStruct("/Script/FortniteGame.FortWorldMarkerData", "bIncludeSquad", false);
|
|
||||||
static auto WorldPositionOffsetOffset = FindOffsetStruct("/Script/FortniteGame.FortWorldMarkerData", "WorldPositionOffset", false);
|
|
||||||
|
|
||||||
FMarkerID MarkerID{};
|
|
||||||
MarkerID.PlayerID = PlayerState->GetPlayerID();
|
|
||||||
MarkerID.InstanceID = MarkerRequestPtr->GetInstanceID();
|
|
||||||
|
|
||||||
MarkerData->GetMarkerType() = MarkerRequestPtr->GetMarkerType();
|
|
||||||
MarkerData->GetOwner() = PlayerState;
|
|
||||||
MarkerData->GetWorldNormal() = MarkerRequestPtr->GetWorldNormal();
|
|
||||||
|
|
||||||
if (WorldPositionOffset != -1)
|
|
||||||
MarkerData->GetWorldPosition() = MarkerRequestPtr->GetWorldPosition();
|
|
||||||
if (WorldPositionOffset != -1)
|
|
||||||
MarkerData->GetWorldPositionOffset() = MarkerRequestPtr->GetWorldPositionOffset();
|
|
||||||
if (bIncludeSquadOffset != -1)
|
|
||||||
MarkerData->DoesIncludeSquad() = MarkerRequestPtr->DoesIncludeSquad();
|
|
||||||
|
|
||||||
MarkerData->GetMarkerID() = MarkerID;
|
|
||||||
MarkerData->GetMarkedActorClass().SoftObjectPtr.WeakPtr.ObjectIndex = -1;
|
|
||||||
MarkerData->GetMarkedActorClass().SoftObjectPtr.TagAtLastTest = 0;
|
|
||||||
MarkerData->GetMarkedActorClass().SoftObjectPtr.WeakPtr.ObjectSerialNumber = 0;
|
|
||||||
MarkerData->GetMarkedActor().SoftObjectPtr.WeakPtr.ObjectIndex = -1;
|
|
||||||
MarkerData->GetMarkedActor().SoftObjectPtr.TagAtLastTest = 0;
|
|
||||||
MarkerData->GetMarkedActor().SoftObjectPtr.WeakPtr.ObjectSerialNumber = 0;
|
|
||||||
((TSoftObjectPtr<UObject>*)(__int64(MarkerData->GetCustomDisplayInfo()) + IconOffset))->SoftObjectPtr.WeakPtr.ObjectIndex = -1;
|
|
||||||
((TSoftObjectPtr<UObject>*)(__int64(MarkerData->GetCustomDisplayInfo()) + IconOffset))->SoftObjectPtr.TagAtLastTest = 0;
|
|
||||||
((TSoftObjectPtr<UObject>*)(__int64(MarkerData->GetCustomDisplayInfo()) + IconOffset))->SoftObjectPtr.WeakPtr.ObjectSerialNumber = 0;
|
|
||||||
*(FText*)(__int64(MarkerData->GetCustomDisplayInfo()) + DisplayNameOffset) = UKismetTextLibrary::Conv_StringToText(L"");
|
|
||||||
|
|
||||||
static auto PlayerTeamOffset = PlayerState->GetOffset("PlayerTeam");
|
|
||||||
auto PlayerTeam = PlayerState->Get<UObject*>(PlayerTeamOffset);
|
|
||||||
|
|
||||||
if (!PlayerTeam)
|
|
||||||
return;
|
|
||||||
|
|
||||||
static auto TeamMembersOffset = PlayerTeam->GetOffset("TeamMembers");
|
|
||||||
auto& TeamMembers = PlayerTeam->Get<TArray<AController*>>(TeamMembersOffset);
|
|
||||||
|
|
||||||
for (int i = 0; i < TeamMembers.Num(); ++i)
|
|
||||||
{
|
|
||||||
if (TeamMembers.at(i) == PlayerController)
|
|
||||||
continue;
|
|
||||||
|
|
||||||
auto CurrentTeamMemberPC = Cast<AFortPlayerControllerAthena>(TeamMembers.at(i));
|
|
||||||
|
|
||||||
if (!CurrentTeamMemberPC)
|
|
||||||
continue;
|
|
||||||
|
|
||||||
auto CurrentTeamMemberMarkerComponent = CurrentTeamMemberPC->GetMarkerComponent();// (UAthenaMarkerComponent*)CurrentTeamMemberPC->GetComponentByClass(UAthenaMarkerComponent::StaticClass());
|
|
||||||
|
|
||||||
if (!CurrentTeamMemberMarkerComponent)
|
|
||||||
continue;
|
|
||||||
|
|
||||||
static auto ClientAddMarkerFn = FindObject<UFunction>(L"/Script/FortniteGame.AthenaMarkerComponent.ClientAddMarker");
|
|
||||||
|
|
||||||
if (ClientAddMarkerFn)
|
|
||||||
{
|
|
||||||
CurrentTeamMemberMarkerComponent->ProcessEvent(ClientAddMarkerFn, MarkerData);
|
|
||||||
}
|
|
||||||
else
|
|
||||||
{
|
|
||||||
// We are assuming it is not the TArray and it is FFortWorldMarkerContainer
|
|
||||||
|
|
||||||
static auto MarkerStreamOffset = CurrentTeamMemberMarkerComponent->GetOffset("MarkerStream");
|
|
||||||
auto MarkerStream = CurrentTeamMemberMarkerComponent->GetPtr<FFastArraySerializer>(MarkerStreamOffset);
|
|
||||||
|
|
||||||
static auto MarkersOffset = FindOffsetStruct("/Script/FortniteGame.FortWorldMarkerContainer", "Markers");
|
|
||||||
|
|
||||||
if (MarkersOffset != -1)
|
|
||||||
{
|
|
||||||
// We are assuming it is a FFastArraySerializerItem
|
|
||||||
((FFastArraySerializerItem*)MarkerData)->MostRecentArrayReplicationKey = -1;
|
|
||||||
((FFastArraySerializerItem*)MarkerData)->ReplicationID = -1;
|
|
||||||
((FFastArraySerializerItem*)MarkerData)->ReplicationKey = -1;
|
|
||||||
|
|
||||||
auto Markers = (TArray<FFortWorldMarkerData>*)(__int64(MarkerStream) + MarkersOffset);
|
|
||||||
Markers->AddPtr(MarkerData, FFortWorldMarkerData::GetStructSize());
|
|
||||||
MarkerStream->MarkArrayDirty();
|
|
||||||
}
|
|
||||||
}
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
void UAthenaMarkerComponent::ServerRemoveMapMarkerHook(UAthenaMarkerComponent* MarkerComponent, FMarkerID MarkerID, uint8_t CancelReason)
|
|
||||||
{
|
|
||||||
auto Owner = MarkerComponent->GetOwner();
|
|
||||||
|
|
||||||
AFortPlayerControllerAthena* PlayerController = Cast<AFortPlayerControllerAthena>(Owner);
|
|
||||||
|
|
||||||
if (!PlayerController)
|
|
||||||
return;
|
|
||||||
|
|
||||||
AFortPlayerStateAthena* PlayerState = Cast<AFortPlayerStateAthena>(PlayerController->GetPlayerState());
|
|
||||||
|
|
||||||
if (!PlayerState)
|
|
||||||
return;
|
|
||||||
|
|
||||||
static auto PlayerTeamOffset = PlayerState->GetOffset("PlayerTeam");
|
|
||||||
auto PlayerTeam = PlayerState->Get<UObject*>(PlayerTeamOffset);
|
|
||||||
|
|
||||||
if (!PlayerTeam)
|
|
||||||
return;
|
|
||||||
|
|
||||||
static auto TeamMembersOffset = PlayerTeam->GetOffset("TeamMembers");
|
|
||||||
auto& TeamMembers = PlayerTeam->Get<TArray<AController*>>(TeamMembersOffset);
|
|
||||||
|
|
||||||
for (int i = 0; i < TeamMembers.Num(); ++i)
|
|
||||||
{
|
|
||||||
if (TeamMembers.at(i) == PlayerController)
|
|
||||||
continue;
|
|
||||||
|
|
||||||
auto CurrentTeamMemberPC = Cast<AFortPlayerControllerAthena>(TeamMembers.at(i));
|
|
||||||
|
|
||||||
if (!CurrentTeamMemberPC)
|
|
||||||
continue;
|
|
||||||
|
|
||||||
auto CurrentTeamMemberMarkerComponent = CurrentTeamMemberPC->GetMarkerComponent();
|
|
||||||
|
|
||||||
if (!CurrentTeamMemberMarkerComponent)
|
|
||||||
continue;
|
|
||||||
|
|
||||||
static auto ClientCancelMarkerFn = FindObject<UFunction>("/Script/FortniteGame.AthenaMarkerComponent.ClientCancelMarker");
|
|
||||||
|
|
||||||
if (ClientCancelMarkerFn)
|
|
||||||
{
|
|
||||||
CurrentTeamMemberMarkerComponent->ProcessEvent(ClientCancelMarkerFn, &MarkerID);
|
|
||||||
}
|
|
||||||
else
|
|
||||||
{
|
|
||||||
// UnmarkActorOnClient ?
|
|
||||||
}
|
|
||||||
}
|
|
||||||
}
|
|
||||||
@@ -1,141 +0,0 @@
|
|||||||
#pragma once
|
|
||||||
|
|
||||||
#include "ActorComponent.h"
|
|
||||||
#include "Vector.h"
|
|
||||||
#include "SoftObjectPtr.h"
|
|
||||||
#include "FortPlayerState.h"
|
|
||||||
|
|
||||||
struct FMarkerID { int PlayerID; int InstanceID; };
|
|
||||||
|
|
||||||
struct FFortClientMarkerRequest
|
|
||||||
{
|
|
||||||
char pad[0x20]; // real idk
|
|
||||||
|
|
||||||
int& GetInstanceID()
|
|
||||||
{
|
|
||||||
static auto InstanceIDOffset = FindOffsetStruct("/Script/FortniteGame.FortClientMarkerRequest", "InstanceID", false) == -1 ?
|
|
||||||
FindOffsetStruct("/Script/FortniteGame.FortClientMarkerRequest", "InstanceId") : FindOffsetStruct("/Script/FortniteGame.FortClientMarkerRequest", "InstanceID");
|
|
||||||
|
|
||||||
return *(int*)(__int64(this) + InstanceIDOffset);
|
|
||||||
}
|
|
||||||
|
|
||||||
bool& DoesIncludeSquad()
|
|
||||||
{
|
|
||||||
static auto bIncludeSquadOffset = FindOffsetStruct("/Script/FortniteGame.FortClientMarkerRequest", "bIncludeSquad");
|
|
||||||
return *(bool*)(__int64(this) + bIncludeSquadOffset);
|
|
||||||
}
|
|
||||||
|
|
||||||
bool& UsesHoveredMarkerDetail()
|
|
||||||
{
|
|
||||||
static auto bUseHoveredMarkerDetailOffset = FindOffsetStruct("/Script/FortniteGame.FortClientMarkerRequest", "bUseHoveredMarkerDetail");
|
|
||||||
return *(bool*)(__int64(this) + bUseHoveredMarkerDetailOffset);
|
|
||||||
}
|
|
||||||
|
|
||||||
FVector& GetWorldPosition()
|
|
||||||
{
|
|
||||||
static auto WorldPositionOffset = FindOffsetStruct("/Script/FortniteGame.FortClientMarkerRequest", "WorldPosition");
|
|
||||||
return *(FVector*)(__int64(this) + WorldPositionOffset);
|
|
||||||
}
|
|
||||||
|
|
||||||
uint8_t& GetMarkerType()
|
|
||||||
{
|
|
||||||
static auto MarkerTypeOffset = FindOffsetStruct("/Script/FortniteGame.FortClientMarkerRequest", "MarkerType");
|
|
||||||
return *(uint8_t*)(__int64(this) + MarkerTypeOffset);
|
|
||||||
}
|
|
||||||
|
|
||||||
FVector& GetWorldPositionOffset()
|
|
||||||
{
|
|
||||||
static auto WorldPositionOffsetOffset = FindOffsetStruct("/Script/FortniteGame.FortClientMarkerRequest", "WorldPositionOffset");
|
|
||||||
return *(FVector*)(__int64(this) + WorldPositionOffsetOffset);
|
|
||||||
}
|
|
||||||
|
|
||||||
FVector& GetWorldNormal()
|
|
||||||
{
|
|
||||||
static auto WorldNormalOffset = FindOffsetStruct("/Script/FortniteGame.FortClientMarkerRequest", "WorldNormal");
|
|
||||||
return *(FVector*)(__int64(this) + WorldNormalOffset);
|
|
||||||
}
|
|
||||||
};
|
|
||||||
|
|
||||||
struct FFortWorldMarkerData
|
|
||||||
{
|
|
||||||
static UStruct* GetStruct()
|
|
||||||
{
|
|
||||||
static auto Struct = FindObject<UStruct>(L"/Script/FortniteGame.FortWorldMarkerData");
|
|
||||||
return Struct;
|
|
||||||
}
|
|
||||||
|
|
||||||
static int GetStructSize() { return GetStruct()->GetPropertiesSize(); }
|
|
||||||
|
|
||||||
FMarkerID& GetMarkerID()
|
|
||||||
{
|
|
||||||
static auto MarkerIDOffset = FindOffsetStruct("/Script/FortniteGame.FortWorldMarkerData", "MarkerID");
|
|
||||||
return *(FMarkerID*)(__int64(this) + MarkerIDOffset);
|
|
||||||
}
|
|
||||||
|
|
||||||
UObject*& GetMarkerInstance()
|
|
||||||
{
|
|
||||||
static auto MarkerInstanceOffset = FindOffsetStruct("/Script/FortniteGame.FortWorldMarkerData", "MarkerInstance");
|
|
||||||
return *(UObject**)(__int64(this) + MarkerInstanceOffset);
|
|
||||||
}
|
|
||||||
|
|
||||||
FVector& GetWorldPosition()
|
|
||||||
{
|
|
||||||
static auto WorldPositionOffset = FindOffsetStruct("/Script/FortniteGame.FortWorldMarkerData", "WorldPosition");
|
|
||||||
return *(FVector*)(__int64(this) + WorldPositionOffset);
|
|
||||||
}
|
|
||||||
|
|
||||||
bool& DoesIncludeSquad()
|
|
||||||
{
|
|
||||||
static auto bIncludeSquadOffset = FindOffsetStruct("/Script/FortniteGame.FortWorldMarkerData", "bIncludeSquad");
|
|
||||||
return *(bool*)(__int64(this) + bIncludeSquadOffset);
|
|
||||||
}
|
|
||||||
|
|
||||||
FVector& GetWorldPositionOffset()
|
|
||||||
{
|
|
||||||
static auto WorldPositionOffsetOffset = FindOffsetStruct("/Script/FortniteGame.FortWorldMarkerData", "WorldPositionOffset");
|
|
||||||
return *(FVector*)(__int64(this) + WorldPositionOffsetOffset);
|
|
||||||
}
|
|
||||||
|
|
||||||
FVector& GetWorldNormal()
|
|
||||||
{
|
|
||||||
static auto WorldNormalOffset = FindOffsetStruct("/Script/FortniteGame.FortWorldMarkerData", "WorldNormal");
|
|
||||||
return *(FVector*)(__int64(this) + WorldNormalOffset);
|
|
||||||
}
|
|
||||||
|
|
||||||
TSoftObjectPtr<AActor>& GetMarkedActor()
|
|
||||||
{
|
|
||||||
static auto MarkedActorOffset = FindOffsetStruct("/Script/FortniteGame.FortWorldMarkerData", "MarkedActor");
|
|
||||||
return *(TSoftObjectPtr<AActor>*)(__int64(this) + MarkedActorOffset);
|
|
||||||
}
|
|
||||||
|
|
||||||
uint8_t& GetMarkerType()
|
|
||||||
{
|
|
||||||
static auto MarkerTypeOffset = FindOffsetStruct("/Script/FortniteGame.FortWorldMarkerData", "MarkerType");
|
|
||||||
return *(uint8_t*)(__int64(this) + MarkerTypeOffset);
|
|
||||||
}
|
|
||||||
|
|
||||||
TSoftObjectPtr<UClass>& GetMarkedActorClass()
|
|
||||||
{
|
|
||||||
static auto MarkedActorClassOffset = FindOffsetStruct("/Script/FortniteGame.FortWorldMarkerData", "MarkedActorClass");
|
|
||||||
return *(TSoftObjectPtr<UClass>*)(__int64(this) + MarkedActorClassOffset);
|
|
||||||
}
|
|
||||||
|
|
||||||
AFortPlayerState*& GetOwner()
|
|
||||||
{
|
|
||||||
static auto OwnerOffset = FindOffsetStruct("/Script/FortniteGame.FortWorldMarkerData", "Owner");
|
|
||||||
return *(AFortPlayerState**)(__int64(this) + OwnerOffset);
|
|
||||||
}
|
|
||||||
|
|
||||||
void* GetCustomDisplayInfo()
|
|
||||||
{
|
|
||||||
static auto CustomDisplayInfoOffset = FindOffsetStruct("/Script/FortniteGame.FortWorldMarkerData", "CustomDisplayInfo");
|
|
||||||
return (void*)(__int64(this) + CustomDisplayInfoOffset);
|
|
||||||
}
|
|
||||||
};
|
|
||||||
|
|
||||||
class UAthenaMarkerComponent : public UActorComponent
|
|
||||||
{
|
|
||||||
public:
|
|
||||||
static void ServerAddMapMarkerHook(UAthenaMarkerComponent* MarkerComponent, FFortClientMarkerRequest MarkerRequest);
|
|
||||||
static void ServerRemoveMapMarkerHook(UAthenaMarkerComponent* MarkerComponent, FMarkerID MarkerID, uint8_t CancelReason);
|
|
||||||
};
|
|
||||||
@@ -1,55 +0,0 @@
|
|||||||
#pragma once
|
|
||||||
|
|
||||||
#include "reboot.h"
|
|
||||||
|
|
||||||
struct FAthenaMatchTeamStats
|
|
||||||
{
|
|
||||||
static UStruct* GetStruct()
|
|
||||||
{
|
|
||||||
static auto Struct = FindObject<UStruct>(L"/Script/FortniteGame.AthenaMatchTeamStats");
|
|
||||||
return Struct;
|
|
||||||
}
|
|
||||||
|
|
||||||
static auto GetStructSize() { return GetStruct()->GetPropertiesSize(); }
|
|
||||||
|
|
||||||
int Place; // 0x0000(0x0004) (Edit, BlueprintVisible, BlueprintReadOnly, ZeroConstructor, IsPlainOldData, NoDestructor, HasGetValueTypeHash, NativeAccessSpecifierPublic)
|
|
||||||
int TotalPlayers; // 0x0004(0x0004) (Edit, BlueprintVisible, BlueprintReadOnly, ZeroConstructor, IsPlainOldData, NoDestructor, HasGetValueTypeHash, NativeAccessSpecifierPublic)
|
|
||||||
|
|
||||||
int& GetPlace()
|
|
||||||
{
|
|
||||||
return Place;
|
|
||||||
}
|
|
||||||
|
|
||||||
int& GetTotalPlayers()
|
|
||||||
{
|
|
||||||
return TotalPlayers;
|
|
||||||
}
|
|
||||||
};
|
|
||||||
|
|
||||||
class UAthenaPlayerMatchReport : public UObject
|
|
||||||
{
|
|
||||||
public:
|
|
||||||
bool& HasTeamStats()
|
|
||||||
{
|
|
||||||
static auto bHasTeamStatsOffset = GetOffset("bHasTeamStats");
|
|
||||||
return Get<bool>(bHasTeamStatsOffset);
|
|
||||||
}
|
|
||||||
|
|
||||||
bool& HasMatchStats()
|
|
||||||
{
|
|
||||||
static auto bHasMatchStatsOffset = GetOffset("bHasMatchStats");
|
|
||||||
return Get<bool>(bHasMatchStatsOffset);
|
|
||||||
}
|
|
||||||
|
|
||||||
FAthenaMatchTeamStats* GetTeamStats()
|
|
||||||
{
|
|
||||||
static auto TeamStatsOffset = GetOffset("TeamStats");
|
|
||||||
return GetPtr<FAthenaMatchTeamStats>(TeamStatsOffset);
|
|
||||||
}
|
|
||||||
|
|
||||||
static UClass* StaticClass()
|
|
||||||
{
|
|
||||||
static auto Class = FindObject<UClass>("/Script/FortniteGame.AthenaPlayerMatchReport");
|
|
||||||
return Class;
|
|
||||||
}
|
|
||||||
};
|
|
||||||
@@ -1,21 +0,0 @@
|
|||||||
#pragma once
|
|
||||||
|
|
||||||
#include "ActorComponent.h"
|
|
||||||
|
|
||||||
#include "reboot.h"
|
|
||||||
|
|
||||||
class UAthenaResurrectionComponent : public UActorComponent
|
|
||||||
{
|
|
||||||
public:
|
|
||||||
TWeakObjectPtr<AActor>& GetResurrectionLocation()
|
|
||||||
{
|
|
||||||
static auto ResurrectionLocationOffset = GetOffset("ResurrectionLocation");
|
|
||||||
return Get<TWeakObjectPtr<AActor>>(ResurrectionLocationOffset);
|
|
||||||
}
|
|
||||||
|
|
||||||
int& GetClosestSpawnMachineIndex()
|
|
||||||
{
|
|
||||||
static auto ClosestSpawnMachineIndexOffset = GetOffset("ClosestSpawnMachineIndex");
|
|
||||||
return Get<int>(ClosestSpawnMachineIndexOffset);
|
|
||||||
}
|
|
||||||
};
|
|
||||||
@@ -1,48 +0,0 @@
|
|||||||
#pragma once
|
|
||||||
|
|
||||||
#include "reboot.h"
|
|
||||||
|
|
||||||
class UAttributeSet : public UObject
|
|
||||||
{
|
|
||||||
public:
|
|
||||||
};
|
|
||||||
|
|
||||||
struct FGameplayAttribute
|
|
||||||
{
|
|
||||||
FString AttributeName;
|
|
||||||
void* Attribute; // Property
|
|
||||||
UStruct* AttributeOwner;
|
|
||||||
|
|
||||||
std::string GetAttributeName()
|
|
||||||
{
|
|
||||||
return AttributeName.ToString();
|
|
||||||
}
|
|
||||||
|
|
||||||
std::string GetAttributePropertyName()
|
|
||||||
{
|
|
||||||
if (!Attribute)
|
|
||||||
return "INVALIDATTRIBUTE";
|
|
||||||
|
|
||||||
return GetFNameOfProp(Attribute)->ToString();
|
|
||||||
}
|
|
||||||
};
|
|
||||||
|
|
||||||
struct FGameplayAttributeData
|
|
||||||
{
|
|
||||||
float& GetBaseValue()
|
|
||||||
{
|
|
||||||
static auto BaseValueOffset = FindOffsetStruct("/Script/GameplayAbilities.GameplayAttributeData", "BaseValue");
|
|
||||||
return *(float*)(__int64(this) + BaseValueOffset);
|
|
||||||
}
|
|
||||||
|
|
||||||
float& GetCurrentValue()
|
|
||||||
{
|
|
||||||
static auto CurrentValueOffset = FindOffsetStruct("/Script/GameplayAbilities.GameplayAttributeData", "CurrentValue");
|
|
||||||
return *(float*)(__int64(this) + CurrentValueOffset);
|
|
||||||
}
|
|
||||||
};
|
|
||||||
|
|
||||||
struct FFortGameplayAttributeData : public FGameplayAttributeData
|
|
||||||
{
|
|
||||||
|
|
||||||
};
|
|
||||||
125
dependencies/reboot/Project Reboot 3.0/BGA.h
vendored
125
dependencies/reboot/Project Reboot 3.0/BGA.h
vendored
@@ -1,125 +0,0 @@
|
|||||||
#pragma once
|
|
||||||
|
|
||||||
#include "reboot.h"
|
|
||||||
#include "GameplayStatics.h"
|
|
||||||
#include "FortLootPackage.h"
|
|
||||||
#include "FortPickup.h"
|
|
||||||
#include "BuildingGameplayActor.h"
|
|
||||||
#include "KismetSystemLibrary.h"
|
|
||||||
|
|
||||||
static inline void SpawnBGAs() // hahah not "proper", there's a function that we can hook and it gets called on each spawner whenever playlist gets set, but it's fine.
|
|
||||||
{
|
|
||||||
static auto BGAConsumableSpawnerClass = FindObject<UClass>(L"/Script/FortniteGame.BGAConsumableSpawner");
|
|
||||||
|
|
||||||
if (!BGAConsumableSpawnerClass)
|
|
||||||
return;
|
|
||||||
|
|
||||||
auto GameState = Cast<AFortGameStateAthena>(GetWorld()->GetGameState());
|
|
||||||
|
|
||||||
auto AllBGAConsumableSpawners = UGameplayStatics::GetAllActorsOfClass(GetWorld(), BGAConsumableSpawnerClass);
|
|
||||||
|
|
||||||
LOG_INFO(LogDev, "AllBGAConsumableSpawners.Num(): {}", (int)AllBGAConsumableSpawners.Num());
|
|
||||||
|
|
||||||
for (int i = 0; i < AllBGAConsumableSpawners.Num(); ++i)
|
|
||||||
{
|
|
||||||
auto BGAConsumableSpawner = AllBGAConsumableSpawners.at(i);
|
|
||||||
auto SpawnLocation = BGAConsumableSpawner->GetActorLocation();
|
|
||||||
|
|
||||||
static auto bAlignSpawnedActorsToSurfaceOffset = BGAConsumableSpawner->GetOffset("bAlignSpawnedActorsToSurface");
|
|
||||||
const bool bAlignSpawnedActorsToSurface = BGAConsumableSpawner->Get<bool>(bAlignSpawnedActorsToSurfaceOffset);
|
|
||||||
|
|
||||||
FTransform SpawnTransform{};
|
|
||||||
SpawnTransform.Translation = SpawnLocation;
|
|
||||||
SpawnTransform.Scale3D = FVector{ 1, 1, 1 };
|
|
||||||
SpawnTransform.Rotation = FQuat();
|
|
||||||
|
|
||||||
if (FBuildingGameplayActorSpawnDetails::GetStruct())
|
|
||||||
{
|
|
||||||
// todo handle?
|
|
||||||
|
|
||||||
auto MapInfo = GameState->GetMapInfo();
|
|
||||||
}
|
|
||||||
|
|
||||||
static auto SpawnLootTierGroupOffset = BGAConsumableSpawner->GetOffset("SpawnLootTierGroup");
|
|
||||||
auto& SpawnLootTierGroup = BGAConsumableSpawner->Get<FName>(SpawnLootTierGroupOffset);
|
|
||||||
|
|
||||||
auto LootDrops = PickLootDrops(SpawnLootTierGroup, GameState->GetWorldLevel());
|
|
||||||
|
|
||||||
for (int z = 0; z < LootDrops.size(); z++)
|
|
||||||
{
|
|
||||||
auto& LootDrop = LootDrops.at(z);
|
|
||||||
|
|
||||||
static auto ConsumableClassOffset = LootDrop->GetItemDefinition()->GetOffset("ConsumableClass");
|
|
||||||
auto ConsumableClassSoft = LootDrop->GetItemDefinition()->GetPtr<TSoftObjectPtr<UClass>>(ConsumableClassOffset);
|
|
||||||
|
|
||||||
static auto BlueprintGeneratedClassClass = FindObject<UClass>(L"/Script/Engine.BlueprintGeneratedClass");
|
|
||||||
auto StrongConsumableClass = ConsumableClassSoft->Get(BlueprintGeneratedClassClass, true);
|
|
||||||
|
|
||||||
if (!StrongConsumableClass)
|
|
||||||
{
|
|
||||||
LOG_INFO(LogDev, "Invalid consumable class!");
|
|
||||||
continue;
|
|
||||||
}
|
|
||||||
|
|
||||||
bool bDeferConstruction = true; // hm?
|
|
||||||
|
|
||||||
auto ConsumableActor = GetWorld()->SpawnActor<ABuildingGameplayActor>(StrongConsumableClass, SpawnTransform, CreateSpawnParameters(ESpawnActorCollisionHandlingMethod::AdjustIfPossibleButAlwaysSpawn, bDeferConstruction));
|
|
||||||
|
|
||||||
if (ConsumableActor)
|
|
||||||
{
|
|
||||||
FTransform FinalSpawnTransform = SpawnTransform;
|
|
||||||
|
|
||||||
if (bAlignSpawnedActorsToSurface)
|
|
||||||
{
|
|
||||||
// I DONT KNOW
|
|
||||||
|
|
||||||
/* FHitResult* NewHit = Alloc<FHitResult>(FHitResult::GetStructSize());
|
|
||||||
|
|
||||||
FVector StartLocation = FinalSpawnTransform.Translation;
|
|
||||||
FVector EndLocation = StartLocation - FVector(0, 0, 1000);
|
|
||||||
|
|
||||||
bool bTraceComplex = true; // idk
|
|
||||||
FName ProfileName = UKismetStringLibrary::Conv_StringToName(L"FindGroundLocationAt");
|
|
||||||
|
|
||||||
UKismetSystemLibrary::LineTraceSingleByProfile(ConsumableActor, StartLocation, EndLocation, ProfileName, bTraceComplex,
|
|
||||||
TArray<AActor*>(), EDrawDebugTrace::None, &NewHit, true, FLinearColor(), FLinearColor(), 0);
|
|
||||||
|
|
||||||
// UKismetSystemLibrary::LineTraceSingle(ConsumableActor, StartLocation, EndLocation,
|
|
||||||
// ETraceTypeQuery::TraceTypeQuery1, bTraceComplex, TArray<AActor*>(), EDrawDebugTrace::None, true, FLinearColor(), FLinearColor(), 0, &NewHit);
|
|
||||||
|
|
||||||
bool IsBlockingHit = NewHit && NewHit->IsBlockingHit(); // Should we check ret of linetracesingle?
|
|
||||||
|
|
||||||
if (IsBlockingHit)
|
|
||||||
{
|
|
||||||
FinalSpawnTransform.Translation = NewHit->GetLocation();
|
|
||||||
}
|
|
||||||
else
|
|
||||||
{
|
|
||||||
FinalSpawnTransform.Translation = FVector(0, 0, 0);
|
|
||||||
}
|
|
||||||
|
|
||||||
*/
|
|
||||||
}
|
|
||||||
|
|
||||||
if (FinalSpawnTransform.Translation.CompareVectors(FVector(0, 0, 0)))
|
|
||||||
{
|
|
||||||
LOG_WARN(LogGame, "Invalid BGA spawn location!");
|
|
||||||
// ConsumableActor->K2_DestroyActor(); // ??
|
|
||||||
continue;
|
|
||||||
}
|
|
||||||
|
|
||||||
if (bDeferConstruction)
|
|
||||||
UGameplayStatics::FinishSpawningActor(ConsumableActor, FinalSpawnTransform);
|
|
||||||
|
|
||||||
// ConsumableActor->InitializeBuildingActor(nullptr, nullptr, true); // idk UFortKismetLibrary::SpawnBuildingGameplayActor does this
|
|
||||||
|
|
||||||
LOG_INFO(LogDev, "[{}/{}] Spawned BGA {} at {} {} {}", z, LootDrops.size(), ConsumableActor->GetName(), FinalSpawnTransform.Translation.X, FinalSpawnTransform.Translation.Y, FinalSpawnTransform.Translation.Z);
|
|
||||||
break; // ?
|
|
||||||
}
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
AllBGAConsumableSpawners.Free();
|
|
||||||
|
|
||||||
LOG_INFO(LogDev, "Spawned BGAS!");
|
|
||||||
}
|
|
||||||
@@ -1,26 +0,0 @@
|
|||||||
#include "BP_IslandScripting.h"
|
|
||||||
|
|
||||||
void ABP_IslandScripting_C::Initialize()
|
|
||||||
{
|
|
||||||
static auto UpdateMapOffset = GetOffset("UpdateMap", false);
|
|
||||||
|
|
||||||
if (UpdateMapOffset != -1)
|
|
||||||
{
|
|
||||||
Get<bool>(UpdateMapOffset) = true;
|
|
||||||
this->OnRep_UpdateMap();
|
|
||||||
}
|
|
||||||
|
|
||||||
/*
|
|
||||||
|
|
||||||
// This spawns the beam.
|
|
||||||
|
|
||||||
this->IsDeimosActive() = true;
|
|
||||||
this->OnRep_IsDeimosActive();
|
|
||||||
*/
|
|
||||||
}
|
|
||||||
|
|
||||||
ABP_IslandScripting_C* ABP_IslandScripting_C::GetIslandScripting()
|
|
||||||
{
|
|
||||||
auto AllIslandScriptings = UGameplayStatics::GetAllActorsOfClass(GetWorld(), StaticClass());
|
|
||||||
return AllIslandScriptings.Num() > 0 ? (ABP_IslandScripting_C*)AllIslandScriptings.at(0) : nullptr;
|
|
||||||
}
|
|
||||||
@@ -1,37 +0,0 @@
|
|||||||
#pragma once
|
|
||||||
|
|
||||||
#include "reboot.h"
|
|
||||||
|
|
||||||
#include "GameplayStatics.h"
|
|
||||||
|
|
||||||
class ABP_IslandScripting_C : public AActor // AFortAlwaysRelevantReplicatedActor
|
|
||||||
{
|
|
||||||
public:
|
|
||||||
bool& IsDeimosActive()
|
|
||||||
{
|
|
||||||
static auto IsDeimosActiveOffset = GetOffset("IsDeimosActive");
|
|
||||||
return Get<bool>(IsDeimosActiveOffset);
|
|
||||||
}
|
|
||||||
|
|
||||||
void OnRep_IsDeimosActive()
|
|
||||||
{
|
|
||||||
static auto OnRep_IsDeimosActiveFn = FindObject<UFunction>("/Game/Athena/Prototype/Blueprints/Island/BP_IslandScripting.BP_IslandScripting_C.OnRep_IsDeimosActive");
|
|
||||||
this->ProcessEvent(OnRep_IsDeimosActiveFn);
|
|
||||||
}
|
|
||||||
|
|
||||||
void OnRep_UpdateMap()
|
|
||||||
{
|
|
||||||
static auto OnRep_UpdateMapFn = FindObject<UFunction>("/Game/Athena/Prototype/Blueprints/Island/BP_IslandScripting.BP_IslandScripting_C.OnRep_UpdateMap");
|
|
||||||
this->ProcessEvent(OnRep_UpdateMapFn);
|
|
||||||
}
|
|
||||||
|
|
||||||
void Initialize();
|
|
||||||
|
|
||||||
static ABP_IslandScripting_C* GetIslandScripting();
|
|
||||||
|
|
||||||
static UClass* StaticClass()
|
|
||||||
{
|
|
||||||
/* static */ auto Class = FindObject<UClass>("/Game/Athena/Prototype/Blueprints/Island/BP_IslandScripting.BP_IslandScripting_C");
|
|
||||||
return Class;
|
|
||||||
}
|
|
||||||
};
|
|
||||||
143
dependencies/reboot/Project Reboot 3.0/BinaryHeap.h
vendored
143
dependencies/reboot/Project Reboot 3.0/BinaryHeap.h
vendored
@@ -1,143 +0,0 @@
|
|||||||
#pragma once
|
|
||||||
|
|
||||||
#include "inc.h"
|
|
||||||
|
|
||||||
#include "ReversePredicate.h"
|
|
||||||
|
|
||||||
namespace AlgoImpl
|
|
||||||
{
|
|
||||||
/**
|
|
||||||
* Gets the index of the left child of node at Index.
|
|
||||||
*
|
|
||||||
* @param Index Node for which the left child index is to be returned.
|
|
||||||
* @returns Index of the left child.
|
|
||||||
*/
|
|
||||||
FORCEINLINE int32 HeapGetLeftChildIndex(int32 Index)
|
|
||||||
{
|
|
||||||
return Index * 2 + 1;
|
|
||||||
}
|
|
||||||
|
|
||||||
/**
|
|
||||||
* Checks if node located at Index is a leaf or not.
|
|
||||||
*
|
|
||||||
* @param Index Node index.
|
|
||||||
* @returns true if node is a leaf, false otherwise.
|
|
||||||
*/
|
|
||||||
FORCEINLINE bool HeapIsLeaf(int32 Index, int32 Count)
|
|
||||||
{
|
|
||||||
return HeapGetLeftChildIndex(Index) >= Count;
|
|
||||||
}
|
|
||||||
|
|
||||||
/**
|
|
||||||
* Gets the parent index for node at Index.
|
|
||||||
*
|
|
||||||
* @param Index node index.
|
|
||||||
* @returns Parent index.
|
|
||||||
*/
|
|
||||||
FORCEINLINE int32 HeapGetParentIndex(int32 Index)
|
|
||||||
{
|
|
||||||
return (Index - 1) / 2;
|
|
||||||
}
|
|
||||||
|
|
||||||
/**
|
|
||||||
* Fixes a possible violation of order property between node at Index and a child.
|
|
||||||
*
|
|
||||||
* @param Heap Pointer to the first element of a binary heap.
|
|
||||||
* @param Index Node index.
|
|
||||||
* @param Count Size of the heap.
|
|
||||||
* @param Projection The projection to apply to the elements.
|
|
||||||
* @param Predicate A binary predicate object used to specify if one element should precede another.
|
|
||||||
*/
|
|
||||||
template <typename RangeValueType, typename ProjectionType, typename PredicateType>
|
|
||||||
FORCEINLINE void HeapSiftDown(RangeValueType* Heap, int32 Index, const int32 Count, const ProjectionType& Projection, const PredicateType& Predicate)
|
|
||||||
{
|
|
||||||
while (!HeapIsLeaf(Index, Count))
|
|
||||||
{
|
|
||||||
const int32 LeftChildIndex = HeapGetLeftChildIndex(Index);
|
|
||||||
const int32 RightChildIndex = LeftChildIndex + 1;
|
|
||||||
|
|
||||||
int32 MinChildIndex = LeftChildIndex;
|
|
||||||
if (RightChildIndex < Count)
|
|
||||||
{
|
|
||||||
MinChildIndex = Predicate(Invoke(Projection, Heap[LeftChildIndex]), Invoke(Projection, Heap[RightChildIndex])) ? LeftChildIndex : RightChildIndex;
|
|
||||||
}
|
|
||||||
|
|
||||||
if (!Predicate(Invoke(Projection, Heap[MinChildIndex]), Invoke(Projection, Heap[Index])))
|
|
||||||
{
|
|
||||||
break;
|
|
||||||
}
|
|
||||||
|
|
||||||
Swap(Heap[Index], Heap[MinChildIndex]);
|
|
||||||
Index = MinChildIndex;
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
/**
|
|
||||||
* Fixes a possible violation of order property between node at NodeIndex and a parent.
|
|
||||||
*
|
|
||||||
* @param Heap Pointer to the first element of a binary heap.
|
|
||||||
* @param RootIndex How far to go up?
|
|
||||||
* @param NodeIndex Node index.
|
|
||||||
* @param Projection The projection to apply to the elements.
|
|
||||||
* @param Predicate A binary predicate object used to specify if one element should precede another.
|
|
||||||
*
|
|
||||||
* @return The new index of the node that was at NodeIndex
|
|
||||||
*/
|
|
||||||
template <class RangeValueType, typename ProjectionType, class PredicateType>
|
|
||||||
FORCEINLINE int32 HeapSiftUp(RangeValueType* Heap, int32 RootIndex, int32 NodeIndex, const ProjectionType& Projection, const PredicateType& Predicate)
|
|
||||||
{
|
|
||||||
while (NodeIndex > RootIndex)
|
|
||||||
{
|
|
||||||
int32 ParentIndex = HeapGetParentIndex(NodeIndex);
|
|
||||||
if (!Predicate(Invoke(Projection, Heap[NodeIndex]), Invoke(Projection, Heap[ParentIndex])))
|
|
||||||
{
|
|
||||||
break;
|
|
||||||
}
|
|
||||||
|
|
||||||
Swap(Heap[NodeIndex], Heap[ParentIndex]);
|
|
||||||
NodeIndex = ParentIndex;
|
|
||||||
}
|
|
||||||
|
|
||||||
return NodeIndex;
|
|
||||||
}
|
|
||||||
|
|
||||||
/**
|
|
||||||
* Builds an implicit min-heap from a range of elements.
|
|
||||||
* This is the internal function used by Heapify overrides.
|
|
||||||
*
|
|
||||||
* @param First pointer to the first element to heapify
|
|
||||||
* @param Num the number of items to heapify
|
|
||||||
* @param Projection The projection to apply to the elements.
|
|
||||||
* @param Predicate A binary predicate object used to specify if one element should precede another.
|
|
||||||
*/
|
|
||||||
template <typename RangeValueType, typename ProjectionType, typename PredicateType>
|
|
||||||
FORCEINLINE void HeapifyInternal(RangeValueType* First, SIZE_T Num, ProjectionType Projection, PredicateType Predicate)
|
|
||||||
{
|
|
||||||
for (int32 Index = HeapGetParentIndex(Num - 1); Index >= 0; Index--)
|
|
||||||
{
|
|
||||||
HeapSiftDown(First, Index, Num, Projection, Predicate);
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
/**
|
|
||||||
* Performs heap sort on the elements.
|
|
||||||
* This is the internal sorting function used by HeapSort overrides.
|
|
||||||
*
|
|
||||||
* @param First pointer to the first element to sort
|
|
||||||
* @param Num the number of elements to sort
|
|
||||||
* @param Predicate predicate class
|
|
||||||
*/
|
|
||||||
template <typename RangeValueType, typename ProjectionType, class PredicateType>
|
|
||||||
void HeapSortInternal(RangeValueType* First, SIZE_T Num, ProjectionType Projection, PredicateType Predicate)
|
|
||||||
{
|
|
||||||
TReversePredicate< PredicateType > ReversePredicateWrapper(Predicate); // Reverse the predicate to build a max-heap instead of a min-heap
|
|
||||||
HeapifyInternal(First, Num, Projection, ReversePredicateWrapper);
|
|
||||||
|
|
||||||
for (int32 Index = Num - 1; Index > 0; Index--)
|
|
||||||
{
|
|
||||||
Swap(First[0], First[Index]);
|
|
||||||
|
|
||||||
HeapSiftDown(First, 0, Index, Projection, ReversePredicateWrapper);
|
|
||||||
}
|
|
||||||
}
|
|
||||||
}
|
|
||||||
329
dependencies/reboot/Project Reboot 3.0/BitArray.h
vendored
329
dependencies/reboot/Project Reboot 3.0/BitArray.h
vendored
@@ -1,329 +0,0 @@
|
|||||||
#pragma once
|
|
||||||
|
|
||||||
#include "ContainerAllocationPolicies.h"
|
|
||||||
|
|
||||||
static FORCEINLINE uint32 CountLeadingZeros(uint32 Value)
|
|
||||||
{
|
|
||||||
unsigned long Log2;
|
|
||||||
if (_BitScanReverse(&Log2, Value) != 0)
|
|
||||||
{
|
|
||||||
return 31 - Log2;
|
|
||||||
}
|
|
||||||
|
|
||||||
return 32;
|
|
||||||
}
|
|
||||||
|
|
||||||
#define NumBitsPerDWORD ((int32)32)
|
|
||||||
#define NumBitsPerDWORDLogTwo ((int32)5)
|
|
||||||
|
|
||||||
class TBitArray
|
|
||||||
{
|
|
||||||
public:
|
|
||||||
TInlineAllocator<4>::ForElementType<unsigned int> Data;
|
|
||||||
int NumBits;
|
|
||||||
int MaxBits;
|
|
||||||
|
|
||||||
struct FRelativeBitReference
|
|
||||||
{
|
|
||||||
public:
|
|
||||||
FORCEINLINE explicit FRelativeBitReference(int32 BitIndex)
|
|
||||||
: DWORDIndex(BitIndex >> NumBitsPerDWORDLogTwo)
|
|
||||||
, Mask(1 << (BitIndex & (NumBitsPerDWORD -1)))
|
|
||||||
{
|
|
||||||
}
|
|
||||||
|
|
||||||
int32 DWORDIndex;
|
|
||||||
uint32 Mask;
|
|
||||||
};
|
|
||||||
|
|
||||||
public:
|
|
||||||
struct FBitReference
|
|
||||||
{
|
|
||||||
FORCEINLINE FBitReference(uint32& InData, uint32 InMask)
|
|
||||||
: Data(InData)
|
|
||||||
, Mask(InMask)
|
|
||||||
{
|
|
||||||
}
|
|
||||||
FORCEINLINE const FBitReference(const uint32& InData, const uint32 InMask)
|
|
||||||
: Data(const_cast<uint32&>(InData))
|
|
||||||
, Mask(InMask)
|
|
||||||
{
|
|
||||||
}
|
|
||||||
|
|
||||||
FORCEINLINE void SetBit(const bool Value)
|
|
||||||
{
|
|
||||||
Value ? Data |= Mask : Data &= ~Mask;
|
|
||||||
|
|
||||||
// 10011101 - Data // 10011101 - Data
|
|
||||||
// 00000010 - Mask - true | // 00000010 - Mask - false
|
|
||||||
// 10011111 - |= // 11111101 - ~
|
|
||||||
// // 10011111 - &=
|
|
||||||
}
|
|
||||||
|
|
||||||
FORCEINLINE operator bool() const
|
|
||||||
{
|
|
||||||
return (Data & Mask) != 0;
|
|
||||||
}
|
|
||||||
FORCEINLINE void operator=(const bool Value)
|
|
||||||
{
|
|
||||||
this->SetBit(Value);
|
|
||||||
}
|
|
||||||
|
|
||||||
private:
|
|
||||||
uint32& Data;
|
|
||||||
uint32 Mask;
|
|
||||||
};
|
|
||||||
|
|
||||||
public:
|
|
||||||
class FBitIterator : public FRelativeBitReference
|
|
||||||
{
|
|
||||||
private:
|
|
||||||
int32 Index;
|
|
||||||
const TBitArray& IteratedArray;
|
|
||||||
|
|
||||||
public:
|
|
||||||
FORCEINLINE const FBitIterator(const TBitArray& ToIterate, const int32 StartIndex) // Begin
|
|
||||||
: IteratedArray(ToIterate)
|
|
||||||
, Index(StartIndex)
|
|
||||||
, FRelativeBitReference(StartIndex)
|
|
||||||
{
|
|
||||||
}
|
|
||||||
FORCEINLINE const FBitIterator(const TBitArray& ToIterate) // End
|
|
||||||
: IteratedArray(ToIterate)
|
|
||||||
, Index(ToIterate.NumBits)
|
|
||||||
, FRelativeBitReference(ToIterate.NumBits)
|
|
||||||
{
|
|
||||||
}
|
|
||||||
|
|
||||||
FORCEINLINE explicit operator bool() const
|
|
||||||
{
|
|
||||||
return Index < IteratedArray.Num();
|
|
||||||
}
|
|
||||||
FORCEINLINE FBitIterator& operator++()
|
|
||||||
{
|
|
||||||
++Index;
|
|
||||||
this->Mask <<= 1;
|
|
||||||
if (!this->Mask)
|
|
||||||
{
|
|
||||||
this->Mask = 1;
|
|
||||||
++this->DWORDIndex;
|
|
||||||
}
|
|
||||||
return *this;
|
|
||||||
}
|
|
||||||
FORCEINLINE bool operator*() const
|
|
||||||
{
|
|
||||||
// Thesis: Once there are more elements in the BitArray than InlineData can hold it'll just allocate all of
|
|
||||||
// them through SecondaryElements, leaving InlineData all true
|
|
||||||
|
|
||||||
if (IteratedArray.NumBits < IteratedArray.Data.NumInlineBits())
|
|
||||||
{
|
|
||||||
return (bool)FBitReference(IteratedArray.Data.GetInlineElement(this->DWORDIndex), this->Mask);
|
|
||||||
}
|
|
||||||
else
|
|
||||||
{
|
|
||||||
return (bool)FBitReference(IteratedArray.Data.GetSecondaryElement(this->DWORDIndex), this->Mask);
|
|
||||||
}
|
|
||||||
}
|
|
||||||
FORCEINLINE bool operator==(const FBitIterator& OtherIt) const
|
|
||||||
{
|
|
||||||
return Index == OtherIt.Index;
|
|
||||||
}
|
|
||||||
FORCEINLINE bool operator!=(const FBitIterator& OtherIt) const
|
|
||||||
{
|
|
||||||
return Index </*=*/ OtherIt.Index;
|
|
||||||
}
|
|
||||||
FORCEINLINE bool operator < (const int32 Other) const
|
|
||||||
{
|
|
||||||
return Index < Other;
|
|
||||||
}
|
|
||||||
FORCEINLINE bool operator > (const int32 Other) const
|
|
||||||
{
|
|
||||||
return Index < Other;
|
|
||||||
}
|
|
||||||
|
|
||||||
FORCEINLINE int32 GetIndex() const
|
|
||||||
{
|
|
||||||
return Index;
|
|
||||||
}
|
|
||||||
};
|
|
||||||
|
|
||||||
class FSetBitIterator : public FRelativeBitReference
|
|
||||||
{
|
|
||||||
private:
|
|
||||||
const TBitArray& IteratedArray;
|
|
||||||
|
|
||||||
uint32 UnvisitedBitMask;
|
|
||||||
int32 CurrentBitIndex;
|
|
||||||
int32 BaseBitIndex;
|
|
||||||
|
|
||||||
public:
|
|
||||||
FORCEINLINE FSetBitIterator(const TBitArray& ToIterate, int32 StartIndex)
|
|
||||||
: FRelativeBitReference(StartIndex)
|
|
||||||
, IteratedArray(const_cast<TBitArray&>(ToIterate))
|
|
||||||
, UnvisitedBitMask((~0U) << (StartIndex & (NumBitsPerDWORD - 1)))
|
|
||||||
, CurrentBitIndex(StartIndex)
|
|
||||||
, BaseBitIndex(StartIndex & ~(NumBitsPerDWORD - 1))
|
|
||||||
{
|
|
||||||
if (StartIndex != IteratedArray.NumBits)
|
|
||||||
{
|
|
||||||
FindNextSetBit();
|
|
||||||
}
|
|
||||||
}
|
|
||||||
FORCEINLINE FSetBitIterator(const TBitArray& ToIterate)
|
|
||||||
: FRelativeBitReference(ToIterate.NumBits)
|
|
||||||
, IteratedArray(const_cast<TBitArray&>(ToIterate))
|
|
||||||
, UnvisitedBitMask(0)
|
|
||||||
, CurrentBitIndex(ToIterate.NumBits)
|
|
||||||
, BaseBitIndex(ToIterate.NumBits)
|
|
||||||
{
|
|
||||||
}
|
|
||||||
|
|
||||||
FORCEINLINE FSetBitIterator& operator++()
|
|
||||||
{
|
|
||||||
UnvisitedBitMask &= ~this->Mask;
|
|
||||||
|
|
||||||
FindNextSetBit();
|
|
||||||
|
|
||||||
return *this;
|
|
||||||
}
|
|
||||||
FORCEINLINE bool operator*() const
|
|
||||||
{
|
|
||||||
return true;
|
|
||||||
}
|
|
||||||
|
|
||||||
FORCEINLINE bool operator==(const FSetBitIterator& Other) const
|
|
||||||
{
|
|
||||||
return CurrentBitIndex == Other.CurrentBitIndex;
|
|
||||||
}
|
|
||||||
FORCEINLINE bool operator!=(const FSetBitIterator& Other) const
|
|
||||||
{
|
|
||||||
return CurrentBitIndex </*=*/ Other.CurrentBitIndex;
|
|
||||||
}
|
|
||||||
|
|
||||||
FORCEINLINE explicit operator bool() const
|
|
||||||
{
|
|
||||||
return CurrentBitIndex < IteratedArray.NumBits;
|
|
||||||
}
|
|
||||||
|
|
||||||
FORCEINLINE int32 GetIndex() const
|
|
||||||
{
|
|
||||||
return CurrentBitIndex;
|
|
||||||
}
|
|
||||||
|
|
||||||
private:
|
|
||||||
|
|
||||||
void FindNextSetBit()
|
|
||||||
{
|
|
||||||
//InlineData is the first 16-bytes of TBitArray
|
|
||||||
const uint32* ArrayData = (IteratedArray.Data.SecondaryData ? IteratedArray.Data.SecondaryData : (uint32*)&IteratedArray.Data.InlineData);
|
|
||||||
|
|
||||||
if (!ArrayData)
|
|
||||||
return;
|
|
||||||
|
|
||||||
const int32 ArrayNum = IteratedArray.NumBits;
|
|
||||||
const int32 LastDWORDIndex = (ArrayNum - 1) / NumBitsPerDWORD;
|
|
||||||
|
|
||||||
uint32 RemainingBitMask = ArrayData[this->DWORDIndex] & UnvisitedBitMask;
|
|
||||||
|
|
||||||
while (!RemainingBitMask)
|
|
||||||
{
|
|
||||||
++this->DWORDIndex;
|
|
||||||
BaseBitIndex += NumBitsPerDWORD;
|
|
||||||
|
|
||||||
if (this->DWORDIndex > LastDWORDIndex)
|
|
||||||
{
|
|
||||||
CurrentBitIndex = ArrayNum;
|
|
||||||
return;
|
|
||||||
}
|
|
||||||
|
|
||||||
RemainingBitMask = ArrayData[this->DWORDIndex];
|
|
||||||
UnvisitedBitMask = ~0;
|
|
||||||
}
|
|
||||||
|
|
||||||
const uint32 NewRemainingBitMask = RemainingBitMask & (RemainingBitMask - 1);
|
|
||||||
|
|
||||||
this->Mask = NewRemainingBitMask ^ RemainingBitMask;
|
|
||||||
|
|
||||||
CurrentBitIndex = BaseBitIndex + NumBitsPerDWORD - 1 - CountLeadingZeros(this->Mask);
|
|
||||||
|
|
||||||
if (CurrentBitIndex > ArrayNum)
|
|
||||||
{
|
|
||||||
CurrentBitIndex = ArrayNum;
|
|
||||||
}
|
|
||||||
}
|
|
||||||
};
|
|
||||||
|
|
||||||
public:
|
|
||||||
FORCEINLINE FBitIterator Iterator(int32 StartIndex)
|
|
||||||
{
|
|
||||||
return FBitIterator(*this, StartIndex);
|
|
||||||
}
|
|
||||||
FORCEINLINE FSetBitIterator SetBitIterator(int32 StartIndex)
|
|
||||||
{
|
|
||||||
return FSetBitIterator(*this, StartIndex);
|
|
||||||
}
|
|
||||||
|
|
||||||
FORCEINLINE FBitIterator begin()
|
|
||||||
{
|
|
||||||
return FBitIterator(*this, 0);
|
|
||||||
}
|
|
||||||
FORCEINLINE const FBitIterator begin() const
|
|
||||||
{
|
|
||||||
return FBitIterator(*this, 0);
|
|
||||||
}
|
|
||||||
FORCEINLINE FBitIterator end()
|
|
||||||
{
|
|
||||||
return FBitIterator(*this);
|
|
||||||
}
|
|
||||||
FORCEINLINE const FBitIterator end() const
|
|
||||||
{
|
|
||||||
return FBitIterator(*this);
|
|
||||||
}
|
|
||||||
|
|
||||||
FORCEINLINE FSetBitIterator SetBitsItBegin()
|
|
||||||
{
|
|
||||||
return FSetBitIterator(*this, 0);
|
|
||||||
}
|
|
||||||
FORCEINLINE const FSetBitIterator SetBitsItBegin() const
|
|
||||||
{
|
|
||||||
return FSetBitIterator(*this, 0);
|
|
||||||
}
|
|
||||||
FORCEINLINE const FSetBitIterator SetBitsItEnd()
|
|
||||||
{
|
|
||||||
return FSetBitIterator(*this);
|
|
||||||
}
|
|
||||||
FORCEINLINE const FSetBitIterator SetBitsItEnd() const
|
|
||||||
{
|
|
||||||
return FSetBitIterator(*this);
|
|
||||||
}
|
|
||||||
|
|
||||||
FORCEINLINE int32 Num() const
|
|
||||||
{
|
|
||||||
return NumBits;
|
|
||||||
}
|
|
||||||
FORCEINLINE int32 Max() const
|
|
||||||
{
|
|
||||||
return MaxBits;
|
|
||||||
}
|
|
||||||
FORCEINLINE bool IsSet(int32 Index) const
|
|
||||||
{
|
|
||||||
return *FBitIterator(*this, Index);
|
|
||||||
}
|
|
||||||
FORCEINLINE void Set(const int32 Index, const bool Value, bool bIsSettingAllZero = false)
|
|
||||||
{
|
|
||||||
const int32 DWORDIndex = (Index >> ((int32)5));
|
|
||||||
const int32 Mask = (1 << (Index & (((int32)32) - 1)));
|
|
||||||
|
|
||||||
if (!bIsSettingAllZero)
|
|
||||||
NumBits = Index >= NumBits ? Index < MaxBits ? Index + 1 : NumBits : NumBits;
|
|
||||||
|
|
||||||
FBitReference(Data[DWORDIndex], Mask).SetBit(Value);
|
|
||||||
}
|
|
||||||
FORCEINLINE void ZeroAll()
|
|
||||||
{
|
|
||||||
for (int i = 0; i < MaxBits; ++i)
|
|
||||||
{
|
|
||||||
Set(i, false, true);
|
|
||||||
}
|
|
||||||
}
|
|
||||||
};
|
|
||||||
@@ -1,120 +0,0 @@
|
|||||||
#include "BuildingActor.h"
|
|
||||||
|
|
||||||
#include "FortWeapon.h"
|
|
||||||
#include "BuildingSMActor.h"
|
|
||||||
#include "FortPlayerControllerAthena.h"
|
|
||||||
#include "FortPawn.h"
|
|
||||||
#include "FortWeaponMeleeItemDefinition.h"
|
|
||||||
#include "CurveTable.h"
|
|
||||||
#include "DataTable.h"
|
|
||||||
#include "FortResourceItemDefinition.h"
|
|
||||||
#include "FortKismetLibrary.h"
|
|
||||||
#include "DataTableFunctionLibrary.h"
|
|
||||||
|
|
||||||
void ABuildingActor::OnDamageServerHook(ABuildingActor* BuildingActor, float Damage, FGameplayTagContainer DamageTags,
|
|
||||||
FVector Momentum, /* FHitResult */ __int64 HitInfo, APlayerController* InstigatedBy, AActor* DamageCauser,
|
|
||||||
/* FGameplayEffectContextHandle */ __int64 EffectContext)
|
|
||||||
{
|
|
||||||
// LOG_INFO(LogDev, "Befor3e");
|
|
||||||
|
|
||||||
auto BuildingSMActor = Cast<ABuildingSMActor>(BuildingActor);
|
|
||||||
auto PlayerController = Cast<AFortPlayerControllerAthena>(InstigatedBy);
|
|
||||||
// auto Pawn = PlayerController ? PlayerController->GetMyFortPawn() : nullptr;
|
|
||||||
auto Weapon = Cast<AFortWeapon>(DamageCauser);
|
|
||||||
|
|
||||||
if (!BuildingSMActor)
|
|
||||||
return OnDamageServerOriginal(BuildingActor, Damage, DamageTags, Momentum, HitInfo, InstigatedBy, DamageCauser, EffectContext);
|
|
||||||
|
|
||||||
if (BuildingSMActor->IsDestroyed())
|
|
||||||
return OnDamageServerOriginal(BuildingActor, Damage, DamageTags, Momentum, HitInfo, InstigatedBy, DamageCauser, EffectContext);
|
|
||||||
|
|
||||||
/*
|
|
||||||
|
|
||||||
static auto LastDamageAmountOffset = BuildingSMActor->GetOffset("LastDamageAmount");
|
|
||||||
static auto LastDamageHitOffset = BuildingSMActor->GetOffset("LastDamageHit", false) != -1 ? BuildingSMActor->GetOffset("LastDamageHit") : BuildingSMActor->GetOffset("LastDamageHitImpulseDir"); // idc
|
|
||||||
|
|
||||||
const float PreviousLastDamageAmount = BuildingSMActor->Get<float>(LastDamageAmountOffset);
|
|
||||||
const float PreviousLastDamageHit = BuildingSMActor->Get<float>(LastDamageHitOffset);
|
|
||||||
const float CurrentBuildingHealth = BuildingActor->GetHealth();
|
|
||||||
|
|
||||||
BuildingSMActor->Get<float>(LastDamageAmountOffset) = Damage;
|
|
||||||
BuildingSMActor->Get<float>(LastDamageHitOffset) = CurrentBuildingHealth;
|
|
||||||
|
|
||||||
*/
|
|
||||||
|
|
||||||
if (!PlayerController || !Weapon)
|
|
||||||
return OnDamageServerOriginal(BuildingActor, Damage, DamageTags, Momentum, HitInfo, InstigatedBy, DamageCauser, EffectContext);
|
|
||||||
|
|
||||||
// if (!Pawn)
|
|
||||||
// return OnDamageServerOriginal(BuildingActor, Damage, DamageTags, Momentum, HitInfo, InstigatedBy, DamageCauser, EffectContext);
|
|
||||||
|
|
||||||
auto WorldInventory = PlayerController->GetWorldInventory();
|
|
||||||
|
|
||||||
if (!WorldInventory)
|
|
||||||
return OnDamageServerOriginal(BuildingActor, Damage, DamageTags, Momentum, HitInfo, InstigatedBy, DamageCauser, EffectContext);
|
|
||||||
|
|
||||||
auto WeaponData = Cast<UFortWeaponMeleeItemDefinition>(Weapon->GetWeaponData());
|
|
||||||
|
|
||||||
if (!WeaponData)
|
|
||||||
return OnDamageServerOriginal(BuildingActor, Damage, DamageTags, Momentum, HitInfo, InstigatedBy, DamageCauser, EffectContext);
|
|
||||||
|
|
||||||
UFortResourceItemDefinition* ItemDef = UFortKismetLibrary::K2_GetResourceItemDefinition(BuildingSMActor->GetResourceType());
|
|
||||||
|
|
||||||
if (!ItemDef)
|
|
||||||
return OnDamageServerOriginal(BuildingActor, Damage, DamageTags, Momentum, HitInfo, InstigatedBy, DamageCauser, EffectContext);
|
|
||||||
|
|
||||||
static auto BuildingResourceAmountOverrideOffset = BuildingSMActor->GetOffset("BuildingResourceAmountOverride");
|
|
||||||
auto& BuildingResourceAmountOverride = BuildingSMActor->Get<FCurveTableRowHandle>(BuildingResourceAmountOverrideOffset);
|
|
||||||
|
|
||||||
int ResourceCount = 0;
|
|
||||||
|
|
||||||
if (BuildingResourceAmountOverride.RowName.IsValid())
|
|
||||||
{
|
|
||||||
// auto AssetManager = Cast<UFortAssetManager>(GEngine->AssetManager);
|
|
||||||
// auto GameState = Cast<AFortGameStateAthena>(GetWorld()->GetGameStateAthena);
|
|
||||||
UCurveTable* CurveTable = nullptr; // GameState->CurrentPlaylistInfo.BasePlaylist ? GameState->CurrentPlaylistInfo.BasePlaylist->ResourceRates.Get() : nullptr;
|
|
||||||
|
|
||||||
// LOG_INFO(LogDev, "Before1");
|
|
||||||
|
|
||||||
if (!CurveTable)
|
|
||||||
CurveTable = FindObject<UCurveTable>(L"/Game/Athena/Balance/DataTables/AthenaResourceRates.AthenaResourceRates");
|
|
||||||
|
|
||||||
{
|
|
||||||
// auto curveMap = ((UDataTable*)CurveTable)->GetRowMap();
|
|
||||||
|
|
||||||
// LOG_INFO(LogDev, "Before {}", __int64(CurveTable));
|
|
||||||
|
|
||||||
float Out = UDataTableFunctionLibrary::EvaluateCurveTableRow(CurveTable, BuildingResourceAmountOverride.RowName, 0.f);
|
|
||||||
|
|
||||||
// LOG_INFO(LogDev, "Out: {}", Out);
|
|
||||||
|
|
||||||
const float DamageThatWillAffect = /* PreviousLastDamageHit > 0 && Damage > PreviousLastDamageHit ? PreviousLastDamageHit : */ Damage;
|
|
||||||
|
|
||||||
float skid = Out / (BuildingActor->GetMaxHealth() / DamageThatWillAffect);
|
|
||||||
|
|
||||||
ResourceCount = round(skid);
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
if (ResourceCount <= 0)
|
|
||||||
{
|
|
||||||
return OnDamageServerOriginal(BuildingActor, Damage, DamageTags, Momentum, HitInfo, InstigatedBy, DamageCauser, EffectContext);
|
|
||||||
}
|
|
||||||
|
|
||||||
bool bIsWeakspot = Damage == 100.0f;
|
|
||||||
PlayerController->ClientReportDamagedResourceBuilding(BuildingSMActor, BuildingSMActor->GetResourceType(), ResourceCount, false, bIsWeakspot);
|
|
||||||
|
|
||||||
bool bShouldUpdate = false;
|
|
||||||
WorldInventory->AddItem(ItemDef, &bShouldUpdate, ResourceCount);
|
|
||||||
|
|
||||||
if (bShouldUpdate)
|
|
||||||
WorldInventory->Update();
|
|
||||||
|
|
||||||
return OnDamageServerOriginal(BuildingActor, Damage, DamageTags, Momentum, HitInfo, InstigatedBy, DamageCauser, EffectContext);
|
|
||||||
}
|
|
||||||
|
|
||||||
UClass* ABuildingActor::StaticClass()
|
|
||||||
{
|
|
||||||
static auto Class = FindObject<UClass>(L"/Script/FortniteGame.BuildingActor");
|
|
||||||
return Class;
|
|
||||||
}
|
|
||||||
@@ -1,99 +0,0 @@
|
|||||||
#pragma once
|
|
||||||
|
|
||||||
#include "Actor.h"
|
|
||||||
#include "reboot.h" // we want to prevent this but im to lazy to make cpp file
|
|
||||||
#include "PlayerController.h"
|
|
||||||
|
|
||||||
#include "GameplayTagContainer.h"
|
|
||||||
|
|
||||||
class ABuildingActor : public AActor
|
|
||||||
{
|
|
||||||
public:
|
|
||||||
void InitializeBuildingActor(UObject* Controller, ABuildingActor* BuildingOwner, bool bUsePlayerBuildAnimations, UObject* ReplacedBuilding = nullptr)
|
|
||||||
{
|
|
||||||
struct {
|
|
||||||
UObject* BuildingOwner; // ABuildingActor
|
|
||||||
UObject* SpawningController;
|
|
||||||
bool bUsePlayerBuildAnimations; // I think this is not on some versions
|
|
||||||
UObject* ReplacedBuilding; // this also not on like below 18.00
|
|
||||||
} IBAParams{ BuildingOwner, Controller, bUsePlayerBuildAnimations, ReplacedBuilding };
|
|
||||||
|
|
||||||
static auto fn = FindObject<UFunction>("/Script/FortniteGame.BuildingActor.InitializeKismetSpawnedBuildingActor");
|
|
||||||
this->ProcessEvent(fn, &IBAParams);
|
|
||||||
}
|
|
||||||
|
|
||||||
bool IsDestroyed()
|
|
||||||
{
|
|
||||||
static auto bDestroyedOffset = GetOffset("bDestroyed");
|
|
||||||
static auto bDestroyedFieldMask = GetFieldMask(GetProperty("bDestroyed"));
|
|
||||||
return ReadBitfieldValue(bDestroyedOffset, bDestroyedFieldMask);
|
|
||||||
}
|
|
||||||
|
|
||||||
void SilentDie()
|
|
||||||
{
|
|
||||||
static auto SilentDieFn = FindObject<UFunction>(L"/Script/FortniteGame.BuildingActor.SilentDie");
|
|
||||||
bool bPropagateSilentDeath = false; // idfk
|
|
||||||
this->ProcessEvent(SilentDieFn, &bPropagateSilentDeath);
|
|
||||||
}
|
|
||||||
|
|
||||||
float GetMaxHealth()
|
|
||||||
{
|
|
||||||
float MaxHealth = 0;
|
|
||||||
static auto fn = FindObject<UFunction>(L"/Script/FortniteGame.BuildingActor.GetMaxHealth");
|
|
||||||
this->ProcessEvent(fn, &MaxHealth);
|
|
||||||
return MaxHealth;
|
|
||||||
}
|
|
||||||
|
|
||||||
float GetHealthPercent() // aka GetHealth() / GetMaxHealth()
|
|
||||||
{
|
|
||||||
float HealthPercent = 0;
|
|
||||||
static auto fn = FindObject<UFunction>(L"/Script/FortniteGame.BuildingActor.GetHealthPercent");
|
|
||||||
this->ProcessEvent(fn, &HealthPercent);
|
|
||||||
return HealthPercent;
|
|
||||||
}
|
|
||||||
|
|
||||||
float GetHealth()
|
|
||||||
{
|
|
||||||
float Health = 0;
|
|
||||||
static auto fn = FindObject<UFunction>("/Script/FortniteGame.BuildingActor.GetHealth");
|
|
||||||
this->ProcessEvent(fn, &Health);
|
|
||||||
return Health;
|
|
||||||
}
|
|
||||||
|
|
||||||
void SetTeam(unsigned char InTeam)
|
|
||||||
{
|
|
||||||
static auto fn = nullptr; // FindObject<UFunction>(L"/Script/FortniteGame.BuildingActor.SetTeam");
|
|
||||||
|
|
||||||
if (!fn)
|
|
||||||
{
|
|
||||||
static auto TeamOffset = GetOffset("Team");
|
|
||||||
Get<uint8_t>(TeamOffset) = InTeam;
|
|
||||||
|
|
||||||
static auto TeamIndexOffset = GetOffset("TeamIndex", false);
|
|
||||||
|
|
||||||
if (TeamIndexOffset != -1)
|
|
||||||
Get<uint8_t>(TeamIndexOffset) = InTeam;
|
|
||||||
}
|
|
||||||
else
|
|
||||||
{
|
|
||||||
this->ProcessEvent(fn, &InTeam);
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
bool IsPlayerBuildable()
|
|
||||||
{
|
|
||||||
static auto bIsPlayerBuildableOffset = GetOffset("bIsPlayerBuildable");
|
|
||||||
static auto bIsPlayerBuildableFieldMask = GetFieldMask(GetProperty("bIsPlayerBuildable"));
|
|
||||||
return ReadBitfieldValue(bIsPlayerBuildableOffset, bIsPlayerBuildableFieldMask);
|
|
||||||
}
|
|
||||||
|
|
||||||
static inline void (*OnDamageServerOriginal)(ABuildingActor* BuildingActor, float Damage, FGameplayTagContainer DamageTags,
|
|
||||||
FVector Momentum, /* FHitResult */ __int64 HitInfo, APlayerController* InstigatedBy, AActor* DamageCauser,
|
|
||||||
/* FGameplayEffectContextHandle */ __int64 EffectContext);
|
|
||||||
|
|
||||||
static void OnDamageServerHook(ABuildingActor* BuildingActor, float Damage, FGameplayTagContainer DamageTags,
|
|
||||||
FVector Momentum, /* FHitResult */ __int64 HitInfo, APlayerController* InstigatedBy, AActor* DamageCauser,
|
|
||||||
/* FGameplayEffectContextHandle */ __int64 EffectContext);
|
|
||||||
|
|
||||||
static UClass* StaticClass();
|
|
||||||
};
|
|
||||||
@@ -1,49 +0,0 @@
|
|||||||
#include "BuildingContainer.h"
|
|
||||||
#include "FortPickup.h"
|
|
||||||
#include "FortLootPackage.h"
|
|
||||||
#include "FortGameModeAthena.h"
|
|
||||||
#include "gui.h"
|
|
||||||
|
|
||||||
bool ABuildingContainer::SpawnLoot(AFortPawn* Pawn)
|
|
||||||
{
|
|
||||||
if (!Pawn)
|
|
||||||
return false;
|
|
||||||
|
|
||||||
this->ForceNetUpdate();
|
|
||||||
|
|
||||||
auto GameMode = Cast<AFortGameModeAthena>(GetWorld()->GetGameMode());
|
|
||||||
|
|
||||||
FVector LocationToSpawnLoot = this->GetActorLocation() + this->GetActorForwardVector() * this->GetLootSpawnLocation_Athena().X + this->GetActorRightVector() * this->GetLootSpawnLocation_Athena().Y + this->GetActorUpVector() * this->GetLootSpawnLocation_Athena().Z;
|
|
||||||
|
|
||||||
auto RedirectedLootTier = GameMode->RedirectLootTier(GetSearchLootTierGroup());
|
|
||||||
|
|
||||||
// LOG_INFO(LogInteraction, "RedirectedLootTier: {}", RedirectedLootTier.ToString());
|
|
||||||
|
|
||||||
auto GameState = Cast<AFortGameStateAthena>(GetWorld()->GetGameState());
|
|
||||||
|
|
||||||
auto LootDrops = PickLootDrops(RedirectedLootTier, GameState->GetWorldLevel(), -1, bDebugPrintLooting);
|
|
||||||
|
|
||||||
// LOG_INFO(LogInteraction, "LootDrops.size(): {}", LootDrops.size());
|
|
||||||
|
|
||||||
for (auto& lootDrop : LootDrops)
|
|
||||||
{
|
|
||||||
PickupCreateData CreateData;
|
|
||||||
CreateData.bToss = true;
|
|
||||||
// CreateData.PawnOwner = Pawn;
|
|
||||||
CreateData.ItemEntry = lootDrop.ItemEntry;
|
|
||||||
CreateData.SpawnLocation = LocationToSpawnLoot;
|
|
||||||
CreateData.SourceType = EFortPickupSourceTypeFlag::GetContainerValue();
|
|
||||||
CreateData.bRandomRotation = true;
|
|
||||||
CreateData.bShouldFreeItemEntryWhenDeconstructed = true;
|
|
||||||
|
|
||||||
auto NewPickup = AFortPickup::SpawnPickup(CreateData);
|
|
||||||
}
|
|
||||||
|
|
||||||
if (!this->IsDestroyed())
|
|
||||||
{
|
|
||||||
this->ForceNetUpdate();
|
|
||||||
// a buncha other stuff
|
|
||||||
}
|
|
||||||
|
|
||||||
return true;
|
|
||||||
}
|
|
||||||
@@ -1,73 +0,0 @@
|
|||||||
#pragma once
|
|
||||||
|
|
||||||
#include "BuildingSMActor.h"
|
|
||||||
#include "FortPawn.h"
|
|
||||||
|
|
||||||
class ABuildingContainer : public ABuildingSMActor
|
|
||||||
{
|
|
||||||
public:
|
|
||||||
bool ShouldDestroyOnSearch()
|
|
||||||
{
|
|
||||||
static auto bDestroyContainerOnSearchOffset = GetOffset("bDestroyContainerOnSearch");
|
|
||||||
static auto bDestroyContainerOnSearchFieldMask = GetFieldMask(GetProperty("bDestroyContainerOnSearch"));
|
|
||||||
return this->ReadBitfieldValue(bDestroyContainerOnSearchOffset, bDestroyContainerOnSearchFieldMask);
|
|
||||||
}
|
|
||||||
|
|
||||||
FName& GetSearchLootTierGroup()
|
|
||||||
{
|
|
||||||
static auto SearchLootTierGroupOffset = this->GetOffset("SearchLootTierGroup");
|
|
||||||
return Get<FName>(SearchLootTierGroupOffset);
|
|
||||||
}
|
|
||||||
|
|
||||||
bool IsAlreadySearched()
|
|
||||||
{
|
|
||||||
static auto bAlreadySearchedOffset = this->GetOffset("bAlreadySearched");
|
|
||||||
static auto bAlreadySearchedFieldMask = GetFieldMask(this->GetProperty("bAlreadySearched"));
|
|
||||||
return this->ReadBitfieldValue(bAlreadySearchedOffset, bAlreadySearchedFieldMask);
|
|
||||||
}
|
|
||||||
|
|
||||||
FVector& GetLootSpawnLocation_Athena()
|
|
||||||
{
|
|
||||||
static auto LootSpawnLocation_AthenaOffset = this->GetOffset("LootSpawnLocation_Athena");
|
|
||||||
return this->Get<FVector>(LootSpawnLocation_AthenaOffset);
|
|
||||||
}
|
|
||||||
|
|
||||||
void SetAlreadySearched(bool bNewValue, bool bOnRep = true)
|
|
||||||
{
|
|
||||||
static auto bAlreadySearchedOffset = this->GetOffset("bAlreadySearched");
|
|
||||||
static auto bAlreadySearchedFieldMask = GetFieldMask(this->GetProperty("bAlreadySearched"));
|
|
||||||
this->SetBitfieldValue(bAlreadySearchedOffset, bAlreadySearchedFieldMask, bNewValue);
|
|
||||||
|
|
||||||
if (bOnRep)
|
|
||||||
{
|
|
||||||
static auto OnRep_bAlreadySearchedFn = FindObject<UFunction>(L"/Script/FortniteGame.BuildingContainer.OnRep_bAlreadySearched");
|
|
||||||
this->ProcessEvent(OnRep_bAlreadySearchedFn);
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
FVector& GetLootSpawnLocation()
|
|
||||||
{
|
|
||||||
static auto LootSpawnLocationOffset = GetOffset("LootSpawnLocation");
|
|
||||||
return Get<FVector>(LootSpawnLocationOffset);
|
|
||||||
}
|
|
||||||
|
|
||||||
float& GetLootNoiseRange()
|
|
||||||
{
|
|
||||||
static auto LootNoiseRangeOffset = GetOffset("LootNoiseRange");
|
|
||||||
return Get<float>(LootNoiseRangeOffset);
|
|
||||||
}
|
|
||||||
|
|
||||||
void BounceContainer()
|
|
||||||
{
|
|
||||||
static auto BounceContainerFn = FindObject<UFunction>("/Script/FortniteGame.BuildingContainer.BounceContainer");
|
|
||||||
this->ProcessEvent(BounceContainerFn);
|
|
||||||
}
|
|
||||||
|
|
||||||
bool SpawnLoot(AFortPawn* Pawn);
|
|
||||||
|
|
||||||
static UClass* StaticClass()
|
|
||||||
{
|
|
||||||
static auto Class = FindObject<UClass>("/Script/FortniteGame.BuildingContainer");
|
|
||||||
return Class;
|
|
||||||
}
|
|
||||||
};
|
|
||||||
@@ -1,30 +0,0 @@
|
|||||||
#include "BuildingFoundation.h"
|
|
||||||
#include "FortGameModeAthena.h"
|
|
||||||
|
|
||||||
void ABuildingFoundation::SetDynamicFoundationTransformHook(UObject* Context, FFrame& Stack, void* Ret)
|
|
||||||
{
|
|
||||||
FTransform NewTransform;
|
|
||||||
Stack.StepCompiledIn(&NewTransform);
|
|
||||||
|
|
||||||
auto BuildingFoundation = (ABuildingFoundation*)Context;
|
|
||||||
|
|
||||||
LOG_INFO(LogDev, "Bruh: {}", BuildingFoundation->GetName());
|
|
||||||
|
|
||||||
SetFoundationTransform(BuildingFoundation, NewTransform);
|
|
||||||
|
|
||||||
return SetDynamicFoundationTransformOriginal(Context, Stack, Ret);
|
|
||||||
}
|
|
||||||
|
|
||||||
void ABuildingFoundation::SetDynamicFoundationEnabledHook(UObject* Context, FFrame& Stack, void* Ret)
|
|
||||||
{
|
|
||||||
bool bEnabled;
|
|
||||||
Stack.StepCompiledIn(&bEnabled);
|
|
||||||
|
|
||||||
// LOG_INFO(LogDev, "{} TELL MILXNOR IF THIS PRINTS: {}", Context->GetFullName(), bEnabled);
|
|
||||||
|
|
||||||
auto BuildingFoundation = (ABuildingFoundation*)Context;
|
|
||||||
|
|
||||||
ShowFoundation(BuildingFoundation, bEnabled);
|
|
||||||
|
|
||||||
return SetDynamicFoundationEnabledOriginal(Context, Stack, Ret);
|
|
||||||
}
|
|
||||||
@@ -1,40 +0,0 @@
|
|||||||
#pragma once
|
|
||||||
|
|
||||||
#include "BuildingSMActor.h"
|
|
||||||
#include "Stack.h"
|
|
||||||
|
|
||||||
/* enum class EDynamicFoundationType : uint8
|
|
||||||
{
|
|
||||||
Static = 0,
|
|
||||||
StartEnabled_Stationary = 1,
|
|
||||||
StartEnabled_Dynamic = 2,
|
|
||||||
StartDisabled = 3,
|
|
||||||
EDynamicFoundationType_MAX = 4,
|
|
||||||
};
|
|
||||||
|
|
||||||
enum class EDynamicFoundationEnabledState : uint8_t
|
|
||||||
{
|
|
||||||
Unknown = 0,
|
|
||||||
Enabled = 1,
|
|
||||||
Disabled = 2,
|
|
||||||
EDynamicFoundationEnabledState_MAX = 3
|
|
||||||
};
|
|
||||||
|
|
||||||
enum class EDynamicFoundationType : uint8_t
|
|
||||||
{
|
|
||||||
Static = 0,
|
|
||||||
StartEnabled_Stationary = 1,
|
|
||||||
StartEnabled_Dynamic = 2,
|
|
||||||
StartDisabled = 3,
|
|
||||||
EDynamicFoundationType_MAX = 4
|
|
||||||
}; */
|
|
||||||
|
|
||||||
class ABuildingFoundation : public ABuildingSMActor
|
|
||||||
{
|
|
||||||
public:
|
|
||||||
static inline void (*SetDynamicFoundationEnabledOriginal)(UObject* Context, FFrame& Stack, void* Ret);
|
|
||||||
static inline void (*SetDynamicFoundationTransformOriginal)(UObject* Context, FFrame& Stack, void* Ret);
|
|
||||||
|
|
||||||
static void SetDynamicFoundationTransformHook(UObject* Context, FFrame& Stack, void* Ret);
|
|
||||||
static void SetDynamicFoundationEnabledHook(UObject* Context, FFrame& Stack, void* Ret);
|
|
||||||
};
|
|
||||||
@@ -1,8 +0,0 @@
|
|||||||
#pragma once
|
|
||||||
|
|
||||||
#include "BuildingActor.h"
|
|
||||||
|
|
||||||
class ABuildingGameplayActor : public ABuildingActor
|
|
||||||
{
|
|
||||||
public:
|
|
||||||
};
|
|
||||||
@@ -1,139 +0,0 @@
|
|||||||
#include "BuildingGameplayActorSpawnMachine.h"
|
|
||||||
|
|
||||||
#include "FortPlayerControllerAthena.h"
|
|
||||||
#include "GameplayStatics.h"
|
|
||||||
#include "AthenaResurrectionComponent.h"
|
|
||||||
#include "FortGameStateAthena.h"
|
|
||||||
#include "FortGameModeAthena.h"
|
|
||||||
|
|
||||||
void ABuildingGameplayActorSpawnMachine::FinishResurrection(int SquadId)
|
|
||||||
{
|
|
||||||
static void (*FinishResurrectionOriginal)(ABuildingGameplayActorSpawnMachine* SpawnMachine, int SquadId) = decltype(FinishResurrectionOriginal)(Addresses::FinishResurrection);
|
|
||||||
|
|
||||||
if (FinishResurrectionOriginal)
|
|
||||||
{
|
|
||||||
FinishResurrectionOriginal(this, SquadId);
|
|
||||||
}
|
|
||||||
else
|
|
||||||
{
|
|
||||||
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
void ABuildingGameplayActorSpawnMachine::RebootingDelegateHook(ABuildingGameplayActorSpawnMachine* SpawnMachine)
|
|
||||||
{
|
|
||||||
auto GameMode = Cast<AFortGameModeAthena>(GetWorld()->GetGameMode());
|
|
||||||
|
|
||||||
LOG_INFO(LogDev, "RebootingDelegateHook!");
|
|
||||||
|
|
||||||
if (!SpawnMachine->GetResurrectLocation())
|
|
||||||
{
|
|
||||||
LOG_WARN(LogRebooting, "Reboot van did not have a resurrection location!");
|
|
||||||
return;
|
|
||||||
}
|
|
||||||
|
|
||||||
LOG_INFO(LogDev, "PlayerIdsForResurrection.Num(): {}", SpawnMachine->GetPlayerIdsForResurrection().Num());
|
|
||||||
|
|
||||||
if (SpawnMachine->GetPlayerIdsForResurrection().Num() <= 0)
|
|
||||||
return;
|
|
||||||
|
|
||||||
auto GameState = Cast<AFortGameStateAthena>(GetWorld()->GetGameState());
|
|
||||||
|
|
||||||
AFortPlayerControllerAthena* PlayerController = nullptr;
|
|
||||||
|
|
||||||
if (auto TeamArrayContainer = GameState->GetTeamsArrayContainer())
|
|
||||||
{
|
|
||||||
auto& SquadArray = TeamArrayContainer->SquadsArray.at(SpawnMachine->GetSquadId());
|
|
||||||
|
|
||||||
for (int i = 0; i < SquadArray.Num(); ++i)
|
|
||||||
{
|
|
||||||
auto StrongPlayerState = SquadArray.at(i).Get();
|
|
||||||
|
|
||||||
if (!StrongPlayerState)
|
|
||||||
continue;
|
|
||||||
|
|
||||||
PlayerController = Cast<AFortPlayerControllerAthena>(StrongPlayerState->GetOwner());
|
|
||||||
|
|
||||||
if (!PlayerController)
|
|
||||||
continue;
|
|
||||||
|
|
||||||
if (PlayerController->InternalIndex == SpawnMachine->GetInstigatorPC().ObjectIndex)
|
|
||||||
continue;
|
|
||||||
|
|
||||||
break;
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
if (!PlayerController)
|
|
||||||
return;
|
|
||||||
|
|
||||||
auto PlayerState = Cast<AFortPlayerStateAthena>(PlayerController->GetPlayerState());
|
|
||||||
|
|
||||||
if (!PlayerState)
|
|
||||||
return;
|
|
||||||
|
|
||||||
auto ResurrectionComponent = PlayerController->GetResurrectionComponent();
|
|
||||||
|
|
||||||
if (!ResurrectionComponent)
|
|
||||||
return;
|
|
||||||
|
|
||||||
static auto FortPlayerStartClass = FindObject<UClass>(L"/Script/FortniteGame.FortPlayerStart");
|
|
||||||
|
|
||||||
if (true) // i dont think we actually need this
|
|
||||||
{
|
|
||||||
ResurrectionComponent->GetResurrectionLocation().ObjectIndex = SpawnMachine->GetResurrectLocation()->InternalIndex;
|
|
||||||
ResurrectionComponent->GetResurrectionLocation().ObjectSerialNumber = GetItemByIndex(SpawnMachine->GetResurrectLocation()->InternalIndex)->SerialNumber;
|
|
||||||
}
|
|
||||||
|
|
||||||
auto StrongResurrectionLocation = ResurrectionComponent->GetResurrectionLocation().Get();
|
|
||||||
|
|
||||||
LOG_INFO(LogDev, "StrongResurrectionLocation: {} IsRespawnDataAvailable: {}", __int64(StrongResurrectionLocation), PlayerState->GetRespawnData()->IsRespawnDataAvailable());
|
|
||||||
|
|
||||||
if (!StrongResurrectionLocation)
|
|
||||||
return;
|
|
||||||
|
|
||||||
PlayerState->GetRespawnData()->IsRespawnDataAvailable() = false;
|
|
||||||
PlayerController->SetPlayerIsWaiting(true);
|
|
||||||
// PlayerController->ServerRestartPlayer();
|
|
||||||
|
|
||||||
bool bEnterSkydiving = false; // TODO get from like curve table iirc idk or the variable
|
|
||||||
PlayerController->RespawnPlayerAfterDeath(bEnterSkydiving);
|
|
||||||
|
|
||||||
AFortPlayerPawn* NewPawn = Cast<AFortPlayerPawn>(PlayerController->GetMyFortPawn());
|
|
||||||
|
|
||||||
LOG_INFO(LogDev, "NewPawn: {}", __int64(NewPawn));
|
|
||||||
|
|
||||||
if (!NewPawn) // Failed to restart player
|
|
||||||
{
|
|
||||||
LOG_INFO(LogRebooting, "Failed to restart the player!");
|
|
||||||
return;
|
|
||||||
}
|
|
||||||
|
|
||||||
PlayerController->ClientClearDeathNotification();
|
|
||||||
|
|
||||||
NewPawn->SetHealth(100);
|
|
||||||
NewPawn->SetMaxHealth(100);
|
|
||||||
|
|
||||||
static auto RebootCounterOffset = PlayerState->GetOffset("RebootCounter");
|
|
||||||
PlayerState->Get<int>(RebootCounterOffset)++;
|
|
||||||
|
|
||||||
static auto OnRep_RebootCounterFn = FindObject<UFunction>(L"/Script/FortniteGame.FortPlayerStateAthena.OnRep_RebootCounter");
|
|
||||||
PlayerState->ProcessEvent(OnRep_RebootCounterFn);
|
|
||||||
|
|
||||||
auto OnPlayerPawnResurrectedFn = SpawnMachine->FindFunction("OnPlayerPawnResurrected");
|
|
||||||
SpawnMachine->ProcessEvent(OnPlayerPawnResurrectedFn, &NewPawn);
|
|
||||||
|
|
||||||
static void (*AddToAlivePlayersOriginal)(AFortGameModeAthena* GameMode, AFortPlayerControllerAthena* Player) = decltype(AddToAlivePlayersOriginal)(Addresses::AddToAlivePlayers);
|
|
||||||
|
|
||||||
if (AddToAlivePlayersOriginal)
|
|
||||||
{
|
|
||||||
AddToAlivePlayersOriginal(GameMode, PlayerController);
|
|
||||||
}
|
|
||||||
|
|
||||||
bool IsFinalPlayerToBeRebooted = true;
|
|
||||||
|
|
||||||
if (IsFinalPlayerToBeRebooted)
|
|
||||||
{
|
|
||||||
SpawnMachine->FinishResurrection(PlayerState->GetSquadId());
|
|
||||||
}
|
|
||||||
}
|
|
||||||
@@ -1,49 +0,0 @@
|
|||||||
#pragma once
|
|
||||||
|
|
||||||
#include "BuildingGameplayActor.h"
|
|
||||||
#include "OnlineReplStructs.h"
|
|
||||||
#include "WeakObjectPtr.h"
|
|
||||||
|
|
||||||
class ABuildingGameplayActorSpawnMachine : public ABuildingGameplayActor
|
|
||||||
{
|
|
||||||
public:
|
|
||||||
TArray<FUniqueNetIdRepl>& GetPlayerIdsForResurrection()
|
|
||||||
{
|
|
||||||
static auto PlayerIdsForResurrectionOffset = GetOffset("PlayerIdsForResurrection");
|
|
||||||
return Get<TArray<FUniqueNetIdRepl>>(PlayerIdsForResurrectionOffset);
|
|
||||||
}
|
|
||||||
|
|
||||||
AActor*& GetResurrectLocation() // actually AFortPlayerStart
|
|
||||||
{
|
|
||||||
static auto ResurrectLocationOffset = GetOffset("ResurrectLocation");
|
|
||||||
return Get<AActor*>(ResurrectLocationOffset);
|
|
||||||
}
|
|
||||||
|
|
||||||
uint8& GetActiveTeam()
|
|
||||||
{
|
|
||||||
static auto ActiveTeamOffset = GetOffset("ActiveTeam");
|
|
||||||
return Get<uint8>(ActiveTeamOffset);
|
|
||||||
}
|
|
||||||
|
|
||||||
uint8& GetSquadId()
|
|
||||||
{
|
|
||||||
static auto SquadIdOffset = GetOffset("SquadId");
|
|
||||||
return Get<uint8>(SquadIdOffset);
|
|
||||||
}
|
|
||||||
|
|
||||||
TWeakObjectPtr<class AFortPlayerControllerAthena> GetInstigatorPC()
|
|
||||||
{
|
|
||||||
static auto InstigatorPCOffset = GetOffset("InstigatorPC");
|
|
||||||
return Get<TWeakObjectPtr<class AFortPlayerControllerAthena>>(InstigatorPCOffset);
|
|
||||||
}
|
|
||||||
|
|
||||||
void FinishResurrection(int SquadId);
|
|
||||||
|
|
||||||
static void RebootingDelegateHook(ABuildingGameplayActorSpawnMachine* SpawnMachine);
|
|
||||||
|
|
||||||
static UClass* StaticClass()
|
|
||||||
{
|
|
||||||
static auto Class = FindObject<UClass>(L"/Script/FortniteGame.BuildingGameplayActorSpawnMachine");
|
|
||||||
return Class;
|
|
||||||
}
|
|
||||||
};
|
|
||||||
@@ -1,14 +0,0 @@
|
|||||||
#pragma once
|
|
||||||
|
|
||||||
#include "BuildingGameplayActor.h"
|
|
||||||
|
|
||||||
class ABuildingItemWeaponUpgradeActor : public ABuildingGameplayActor // ABuildingItemCollectorActor
|
|
||||||
{
|
|
||||||
public:
|
|
||||||
|
|
||||||
static class UClass* StaticClass()
|
|
||||||
{
|
|
||||||
static UClass* Class = FindObject<UClass>(L"/Script/FortniteGame.BuildingItemWeaponUpgradeActor");
|
|
||||||
return Class;
|
|
||||||
}
|
|
||||||
};
|
|
||||||
@@ -1,8 +0,0 @@
|
|||||||
#pragma once
|
|
||||||
|
|
||||||
#include "BuildingActor.h"
|
|
||||||
|
|
||||||
class ABuildingRift : public ABuildingActor
|
|
||||||
{
|
|
||||||
public:
|
|
||||||
};
|
|
||||||
@@ -1,7 +0,0 @@
|
|||||||
#include "BuildingSMActor.h"
|
|
||||||
|
|
||||||
UClass* ABuildingSMActor::StaticClass()
|
|
||||||
{
|
|
||||||
static auto Class = FindObject<UClass>(L"/Script/FortniteGame.BuildingSMActor");
|
|
||||||
return Class;
|
|
||||||
}
|
|
||||||
@@ -1,64 +0,0 @@
|
|||||||
#pragma once
|
|
||||||
|
|
||||||
#include "BuildingActor.h"
|
|
||||||
#include "PlayerState.h"
|
|
||||||
|
|
||||||
enum class EFortResourceType : uint8_t
|
|
||||||
{
|
|
||||||
Wood = 0,
|
|
||||||
Stone = 1,
|
|
||||||
Metal = 2,
|
|
||||||
Permanite = 3,
|
|
||||||
None = 4,
|
|
||||||
EFortResourceType_MAX = 5
|
|
||||||
};
|
|
||||||
|
|
||||||
class ABuildingSMActor : public ABuildingActor
|
|
||||||
{
|
|
||||||
public:
|
|
||||||
bool IsPlayerPlaced()
|
|
||||||
{
|
|
||||||
static auto bPlayerPlacedOffset = GetOffset("bPlayerPlaced");
|
|
||||||
static auto bPlayerPlacedFieldMask = GetFieldMask(this->GetProperty("bPlayerPlaced"));
|
|
||||||
return ReadBitfieldValue(bPlayerPlacedOffset, bPlayerPlacedFieldMask);
|
|
||||||
}
|
|
||||||
|
|
||||||
void SetPlayerPlaced(bool NewValue)
|
|
||||||
{
|
|
||||||
static auto bPlayerPlacedOffset = GetOffset("bPlayerPlaced");
|
|
||||||
static auto bPlayerPlacedFieldMask = GetFieldMask(this->GetProperty("bPlayerPlaced"));
|
|
||||||
this->SetBitfieldValue(bPlayerPlacedOffset, bPlayerPlacedFieldMask, NewValue);
|
|
||||||
}
|
|
||||||
|
|
||||||
APlayerState*& GetEditingPlayer()
|
|
||||||
{
|
|
||||||
static auto EditingPlayerOffset = GetOffset("EditingPlayer");
|
|
||||||
return Get<APlayerState*>(EditingPlayerOffset);
|
|
||||||
}
|
|
||||||
|
|
||||||
int& GetCurrentBuildingLevel()
|
|
||||||
{
|
|
||||||
static auto CurrentBuildingLevelOffset = GetOffset("CurrentBuildingLevel");
|
|
||||||
return Get<int>(CurrentBuildingLevelOffset);
|
|
||||||
}
|
|
||||||
|
|
||||||
EFortResourceType& GetResourceType()
|
|
||||||
{
|
|
||||||
static auto ResourceTypeOffset = GetOffset("ResourceType");
|
|
||||||
return Get<EFortResourceType>(ResourceTypeOffset);
|
|
||||||
}
|
|
||||||
|
|
||||||
void SetEditingPlayer(APlayerState* NewEditingPlayer) // actually AFortPlayerStateZone
|
|
||||||
{
|
|
||||||
if (// AActor::HasAuthority() &&
|
|
||||||
(!GetEditingPlayer() || !NewEditingPlayer)
|
|
||||||
)
|
|
||||||
{
|
|
||||||
SetNetDormancy((ENetDormancy)(2 - (NewEditingPlayer != 0)));
|
|
||||||
// they do something here
|
|
||||||
GetEditingPlayer() = NewEditingPlayer;
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
static UClass* StaticClass();
|
|
||||||
};
|
|
||||||
@@ -1,17 +0,0 @@
|
|||||||
#include "BuildingStructuralSupportSystem.h"
|
|
||||||
|
|
||||||
#include "reboot.h"
|
|
||||||
|
|
||||||
bool UBuildingStructuralSupportSystem::IsWorldLocValid(const FVector& WorldLoc)
|
|
||||||
{
|
|
||||||
static auto IsWorldLocValidFn = FindObject<UFunction>("/Script/FortniteGame.BuildingStructuralSupportSystem.IsWorldLocValid");
|
|
||||||
|
|
||||||
if (!IsWorldLocValidFn)
|
|
||||||
return true;
|
|
||||||
|
|
||||||
struct { FVector WorldLoc; bool Ret; } Params{ WorldLoc };
|
|
||||||
|
|
||||||
this->ProcessEvent(IsWorldLocValidFn, &Params);
|
|
||||||
|
|
||||||
return Params.Ret;
|
|
||||||
}
|
|
||||||
@@ -1,10 +0,0 @@
|
|||||||
#pragma once
|
|
||||||
|
|
||||||
#include "Object.h"
|
|
||||||
#include "Vector.h"
|
|
||||||
|
|
||||||
class UBuildingStructuralSupportSystem : public UObject
|
|
||||||
{
|
|
||||||
public:
|
|
||||||
bool IsWorldLocValid(const FVector& WorldLoc);
|
|
||||||
};
|
|
||||||
@@ -1,4 +0,0 @@
|
|||||||
#include "BuildingTrap.h"
|
|
||||||
|
|
||||||
#include "GameplayStatics.h"
|
|
||||||
#include "FortPlayerStateAthena.h"
|
|
||||||
@@ -1,9 +0,0 @@
|
|||||||
#pragma once
|
|
||||||
|
|
||||||
#include "BuildingSMActor.h"
|
|
||||||
|
|
||||||
class ABuildingTrap : public ABuildingSMActor
|
|
||||||
{
|
|
||||||
public:
|
|
||||||
|
|
||||||
};
|
|
||||||
@@ -1,15 +0,0 @@
|
|||||||
#include "BuildingWeapons.h"
|
|
||||||
|
|
||||||
#include "reboot.h"
|
|
||||||
|
|
||||||
void AFortWeap_EditingTool::OnRep_EditActor()
|
|
||||||
{
|
|
||||||
static auto OnRep_EditActorFn = FindObject<UFunction>("/Script/FortniteGame.FortWeap_EditingTool.OnRep_EditActor");
|
|
||||||
this->ProcessEvent(OnRep_EditActorFn);
|
|
||||||
}
|
|
||||||
|
|
||||||
UClass* AFortWeap_EditingTool::StaticClass()
|
|
||||||
{
|
|
||||||
static auto Class = FindObject<UClass>(L"/Script/FortniteGame.FortWeap_EditingTool");
|
|
||||||
return Class;
|
|
||||||
}
|
|
||||||
@@ -1,26 +0,0 @@
|
|||||||
#pragma once
|
|
||||||
|
|
||||||
#include "BuildingSMActor.h"
|
|
||||||
#include "FortWeapon.h"
|
|
||||||
|
|
||||||
class AFortWeap_BuildingToolBase : public AFortWeapon
|
|
||||||
{
|
|
||||||
};
|
|
||||||
|
|
||||||
class AFortWeap_BuildingTool : public AFortWeap_BuildingToolBase
|
|
||||||
{
|
|
||||||
};
|
|
||||||
|
|
||||||
class AFortWeap_EditingTool : public AFortWeap_BuildingToolBase
|
|
||||||
{
|
|
||||||
public:
|
|
||||||
ABuildingSMActor*& GetEditActor()
|
|
||||||
{
|
|
||||||
static auto EditActorOffset = GetOffset("EditActor");
|
|
||||||
return Get<ABuildingSMActor*>(EditActorOffset);
|
|
||||||
}
|
|
||||||
|
|
||||||
void OnRep_EditActor();
|
|
||||||
|
|
||||||
static UClass* StaticClass();
|
|
||||||
};
|
|
||||||
27
dependencies/reboot/Project Reboot 3.0/Channel.h
vendored
27
dependencies/reboot/Project Reboot 3.0/Channel.h
vendored
@@ -1,27 +0,0 @@
|
|||||||
#pragma once
|
|
||||||
|
|
||||||
#include "Object.h"
|
|
||||||
|
|
||||||
class UChannel : public UObject
|
|
||||||
{
|
|
||||||
public:
|
|
||||||
void StartBecomingDormant()
|
|
||||||
{
|
|
||||||
void (*StartBecomingDormantOriginal)(UChannel* Channel) = decltype(StartBecomingDormantOriginal)(this->VFTable[0x298 / 8]);
|
|
||||||
StartBecomingDormantOriginal(this);
|
|
||||||
}
|
|
||||||
|
|
||||||
bool IsPendingDormancy()
|
|
||||||
{
|
|
||||||
static auto BitfieldOffset = GetOffset("Connection") + 8;
|
|
||||||
return ((PlaceholderBitfield*)(__int64(this) + BitfieldOffset))->Seventh;
|
|
||||||
}
|
|
||||||
|
|
||||||
bool IsDormant()
|
|
||||||
{
|
|
||||||
static auto BitfieldOffset = GetOffset("Connection") + 8;
|
|
||||||
return ((PlaceholderBitfield*)(__int64(this) + BitfieldOffset))->Third;
|
|
||||||
}
|
|
||||||
|
|
||||||
int32 IsNetReady(bool Saturate);
|
|
||||||
};
|
|
||||||
@@ -1,21 +0,0 @@
|
|||||||
#include "CheatManager.h"
|
|
||||||
|
|
||||||
#include "reboot.h"
|
|
||||||
|
|
||||||
void UCheatManager::Teleport()
|
|
||||||
{
|
|
||||||
static auto TeleportFn = FindObject<UFunction>(L"/Script/Engine.CheatManager.Teleport");
|
|
||||||
this->ProcessEvent(TeleportFn);
|
|
||||||
}
|
|
||||||
|
|
||||||
void UCheatManager::DestroyTarget()
|
|
||||||
{
|
|
||||||
static auto DestroyTargetFn = FindObject<UFunction>("/Script/Engine.CheatManager.DestroyTarget");
|
|
||||||
this->ProcessEvent(DestroyTargetFn);
|
|
||||||
}
|
|
||||||
|
|
||||||
UClass* UCheatManager::StaticClass()
|
|
||||||
{
|
|
||||||
static auto Class = FindObject<UClass>(L"/Script/Engine.CheatManager");
|
|
||||||
return Class;
|
|
||||||
}
|
|
||||||
@@ -1,12 +0,0 @@
|
|||||||
#pragma once
|
|
||||||
|
|
||||||
#include "Object.h"
|
|
||||||
|
|
||||||
class UCheatManager : public UObject
|
|
||||||
{
|
|
||||||
public:
|
|
||||||
void Teleport();
|
|
||||||
void DestroyTarget();
|
|
||||||
|
|
||||||
static UClass* StaticClass();
|
|
||||||
};
|
|
||||||
53
dependencies/reboot/Project Reboot 3.0/Class.cpp
vendored
53
dependencies/reboot/Project Reboot 3.0/Class.cpp
vendored
@@ -1,53 +0,0 @@
|
|||||||
#pragma once
|
|
||||||
|
|
||||||
#include "Class.h"
|
|
||||||
#include "reboot.h"
|
|
||||||
|
|
||||||
UObject* UClass::CreateDefaultObject()
|
|
||||||
{
|
|
||||||
static std::unordered_map<std::string, UObject*> defaultAbilities; // normal class name, default ability.
|
|
||||||
|
|
||||||
static int LastNum1 = 151;
|
|
||||||
|
|
||||||
if (LastNum1 != Globals::AmountOfListens)
|
|
||||||
{
|
|
||||||
LastNum1 = Globals::AmountOfListens;
|
|
||||||
defaultAbilities.clear();
|
|
||||||
}
|
|
||||||
|
|
||||||
auto name = this->GetFullName();
|
|
||||||
|
|
||||||
if (name.contains("Default__"))
|
|
||||||
return this;
|
|
||||||
|
|
||||||
auto defaultafqaf = defaultAbilities.find(name);
|
|
||||||
|
|
||||||
UObject* DefaultObject = nullptr;
|
|
||||||
|
|
||||||
if (defaultafqaf != defaultAbilities.end())
|
|
||||||
{
|
|
||||||
DefaultObject = defaultafqaf->second;
|
|
||||||
}
|
|
||||||
else
|
|
||||||
{
|
|
||||||
// skunked class to default
|
|
||||||
auto ending = name.substr(name.find_last_of(".") + 1);
|
|
||||||
auto path = name.substr(0, name.find_last_of(".") + 1);
|
|
||||||
|
|
||||||
path = path.substr(path.find_first_of(" ") + 1);
|
|
||||||
|
|
||||||
auto DefaultAbilityName = std::format("{0}Default__{1}", path, ending);
|
|
||||||
|
|
||||||
// std::cout << "DefaultAbilityName: " << DefaultAbilityName << '\n';
|
|
||||||
|
|
||||||
DefaultObject = FindObject(DefaultAbilityName);
|
|
||||||
defaultAbilities.emplace(name, DefaultObject);
|
|
||||||
}
|
|
||||||
|
|
||||||
return DefaultObject;
|
|
||||||
}
|
|
||||||
|
|
||||||
int UStruct::GetPropertiesSize()
|
|
||||||
{
|
|
||||||
return *(int*)(__int64(this) + Offsets::PropertiesSize);
|
|
||||||
}
|
|
||||||
85
dependencies/reboot/Project Reboot 3.0/Class.h
vendored
85
dependencies/reboot/Project Reboot 3.0/Class.h
vendored
@@ -1,85 +0,0 @@
|
|||||||
#pragma once
|
|
||||||
|
|
||||||
#include "Object.h"
|
|
||||||
|
|
||||||
#include "addresses.h"
|
|
||||||
#include "UnrealString.h"
|
|
||||||
#include "Map.h"
|
|
||||||
|
|
||||||
struct UField : UObject
|
|
||||||
{
|
|
||||||
UField* Next;
|
|
||||||
// void* pad; void* pad2;
|
|
||||||
};
|
|
||||||
|
|
||||||
struct UFieldPadding : UObject
|
|
||||||
{
|
|
||||||
UField* Next;
|
|
||||||
void* pad; void* pad2;
|
|
||||||
};
|
|
||||||
|
|
||||||
template <typename PropertyType = void>
|
|
||||||
static inline PropertyType* GetNext(void* Field)
|
|
||||||
{
|
|
||||||
return Fortnite_Version >= 12.10 ? *(PropertyType**)(__int64(Field) + 0x20) : ((UField*)Field)->Next;
|
|
||||||
}
|
|
||||||
|
|
||||||
static inline FName* GetFNameOfProp(void* Property)
|
|
||||||
{
|
|
||||||
FName* NamePrivate = nullptr;
|
|
||||||
|
|
||||||
if (Fortnite_Version >= 12.10)
|
|
||||||
NamePrivate = (FName*)(__int64(Property) + 0x28);
|
|
||||||
else
|
|
||||||
NamePrivate = &((UField*)Property)->NamePrivate;
|
|
||||||
|
|
||||||
return NamePrivate;
|
|
||||||
}
|
|
||||||
|
|
||||||
class UStruct : public UField
|
|
||||||
{
|
|
||||||
public:
|
|
||||||
int GetPropertiesSize();
|
|
||||||
|
|
||||||
UStruct* GetSuperStruct() { return *(UStruct**)(__int64(this) + Offsets::SuperStruct); } // idk if this is in UStruct
|
|
||||||
|
|
||||||
TArray<uint8_t> GetScript() { return *(TArray<uint8_t>*)(__int64(this) + Offsets::Script); }
|
|
||||||
};
|
|
||||||
|
|
||||||
class UClass : public UStruct
|
|
||||||
{
|
|
||||||
public:
|
|
||||||
UObject* CreateDefaultObject();
|
|
||||||
};
|
|
||||||
|
|
||||||
class UFunction : public UStruct
|
|
||||||
{
|
|
||||||
public:
|
|
||||||
void*& GetFunc() { return *(void**)(__int64(this) + Offsets::Func); }
|
|
||||||
};
|
|
||||||
|
|
||||||
class UEnum : public UField
|
|
||||||
{
|
|
||||||
public:
|
|
||||||
int64 GetValue(const std::string& EnumMemberName)
|
|
||||||
{
|
|
||||||
auto Names = (TArray<TPair<FName, int64>>*)(__int64(this) + sizeof(UField) + sizeof(FString));
|
|
||||||
|
|
||||||
for (int i = 0; i < Names->Num(); ++i)
|
|
||||||
{
|
|
||||||
auto& Pair = Names->At(i);
|
|
||||||
auto& Name = Pair.Key();
|
|
||||||
auto Value = Pair.Value();
|
|
||||||
|
|
||||||
if (Name.ComparisonIndex.Value)
|
|
||||||
{
|
|
||||||
auto nameStr = Name.ToString();
|
|
||||||
|
|
||||||
if (nameStr.contains(EnumMemberName))
|
|
||||||
return Value;
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
return -1;
|
|
||||||
}
|
|
||||||
};
|
|
||||||
@@ -1,117 +0,0 @@
|
|||||||
#pragma once
|
|
||||||
|
|
||||||
#include "NumericLimits.h"
|
|
||||||
|
|
||||||
template <int NumElements>
|
|
||||||
class TInlineAllocator
|
|
||||||
{
|
|
||||||
private:
|
|
||||||
template <int Size, int Alignment>
|
|
||||||
struct alignas(Alignment) TAlignedBytes
|
|
||||||
{
|
|
||||||
unsigned char Pad[Size];
|
|
||||||
};
|
|
||||||
|
|
||||||
template <typename ElementType>
|
|
||||||
struct TTypeCompatibleBytes : public TAlignedBytes<sizeof(ElementType), alignof(ElementType)>
|
|
||||||
{
|
|
||||||
};
|
|
||||||
|
|
||||||
public:
|
|
||||||
template <typename ElementType>
|
|
||||||
class ForElementType
|
|
||||||
{
|
|
||||||
friend class TBitArray;
|
|
||||||
|
|
||||||
private:
|
|
||||||
TTypeCompatibleBytes<ElementType> InlineData[NumElements];
|
|
||||||
|
|
||||||
ElementType* SecondaryData;
|
|
||||||
|
|
||||||
public:
|
|
||||||
|
|
||||||
FORCEINLINE int32 NumInlineBytes() const
|
|
||||||
{
|
|
||||||
return sizeof(ElementType) * NumElements;
|
|
||||||
}
|
|
||||||
FORCEINLINE int32 NumInlineBits() const
|
|
||||||
{
|
|
||||||
return NumInlineBytes() * 8;
|
|
||||||
}
|
|
||||||
|
|
||||||
FORCEINLINE ElementType& operator[](int32 Index)
|
|
||||||
{
|
|
||||||
return *(ElementType*)(&InlineData[Index]);
|
|
||||||
}
|
|
||||||
FORCEINLINE const ElementType& operator[](int32 Index) const
|
|
||||||
{
|
|
||||||
return *(ElementType*)(&InlineData[Index]);
|
|
||||||
}
|
|
||||||
|
|
||||||
FORCEINLINE void operator=(void* InElements)
|
|
||||||
{
|
|
||||||
SecondaryData = InElements;
|
|
||||||
}
|
|
||||||
|
|
||||||
FORCEINLINE ElementType& GetInlineElement(int32 Index)
|
|
||||||
{
|
|
||||||
return *(ElementType*)(&InlineData[Index]);
|
|
||||||
}
|
|
||||||
FORCEINLINE const ElementType& GetInlineElement(int32 Index) const
|
|
||||||
{
|
|
||||||
return *(ElementType*)(&InlineData[Index]);
|
|
||||||
}
|
|
||||||
FORCEINLINE ElementType& GetSecondaryElement(int32 Index)
|
|
||||||
{
|
|
||||||
return SecondaryData[Index];
|
|
||||||
}
|
|
||||||
FORCEINLINE const ElementType& GetSecondaryElement(int32 Index) const
|
|
||||||
{
|
|
||||||
return SecondaryData[Index];
|
|
||||||
}
|
|
||||||
ElementType* GetInlineElements() const
|
|
||||||
{
|
|
||||||
return (ElementType*)InlineData;
|
|
||||||
}
|
|
||||||
FORCEINLINE ElementType* GetAllocation() const
|
|
||||||
{
|
|
||||||
return IfAThenAElseB<ElementType>(SecondaryData, GetInlineElements());
|
|
||||||
}
|
|
||||||
};
|
|
||||||
};
|
|
||||||
|
|
||||||
|
|
||||||
FORCEINLINE /*FMEMORY_INLINE_FUNCTION_DECORATOR*/ size_t /*FMemory::*/QuantizeSize(SIZE_T Count, uint32 Alignment)
|
|
||||||
{
|
|
||||||
return Count;
|
|
||||||
/*
|
|
||||||
if (!FMEMORY_INLINE_GMalloc)
|
|
||||||
{
|
|
||||||
return Count;
|
|
||||||
}
|
|
||||||
return FMEMORY_INLINE_GMalloc->QuantizeSize(Count, Alignment); */
|
|
||||||
}
|
|
||||||
|
|
||||||
enum
|
|
||||||
{
|
|
||||||
DEFAULT_ALIGNMENT = 0
|
|
||||||
};
|
|
||||||
|
|
||||||
template <typename SizeType>
|
|
||||||
FORCEINLINE SizeType DefaultCalculateSlackReserve(SizeType NumElements, SIZE_T BytesPerElement, bool bAllowQuantize, uint32 Alignment = DEFAULT_ALIGNMENT)
|
|
||||||
{
|
|
||||||
SizeType Retval = NumElements;
|
|
||||||
// checkSlow(NumElements > 0);
|
|
||||||
if (bAllowQuantize)
|
|
||||||
{
|
|
||||||
auto Count = SIZE_T(Retval) * SIZE_T(BytesPerElement);
|
|
||||||
Retval = (SizeType)(QuantizeSize(Count, Alignment) / BytesPerElement);
|
|
||||||
// NumElements and MaxElements are stored in 32 bit signed integers so we must be careful not to overflow here.
|
|
||||||
if (NumElements > Retval)
|
|
||||||
{
|
|
||||||
Retval = TNumericLimits<SizeType>::Max();
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
return Retval;
|
|
||||||
}
|
|
||||||
@@ -1,17 +0,0 @@
|
|||||||
#include "Controller.h"
|
|
||||||
|
|
||||||
#include "reboot.h"
|
|
||||||
|
|
||||||
AActor* AController::GetViewTarget()
|
|
||||||
{
|
|
||||||
static auto GetViewTargetFn = FindObject<UFunction>("/Script/Engine.Controller.GetViewTarget");
|
|
||||||
AActor* ViewTarget = nullptr;
|
|
||||||
this->ProcessEvent(GetViewTargetFn, &ViewTarget);
|
|
||||||
return ViewTarget;
|
|
||||||
}
|
|
||||||
|
|
||||||
void AController::Possess(class APawn* Pawn)
|
|
||||||
{
|
|
||||||
auto PossessFn = FindFunction("Possess");
|
|
||||||
this->ProcessEvent(PossessFn, &Pawn);
|
|
||||||
}
|
|
||||||
@@ -1,28 +0,0 @@
|
|||||||
#pragma once
|
|
||||||
|
|
||||||
#include "Actor.h"
|
|
||||||
|
|
||||||
class AController : public AActor
|
|
||||||
{
|
|
||||||
public:
|
|
||||||
AActor* GetViewTarget();
|
|
||||||
void Possess(class APawn* Pawn);
|
|
||||||
|
|
||||||
FName& GetStateName()
|
|
||||||
{
|
|
||||||
static auto StateNameOffset = GetOffset("StateName");
|
|
||||||
return Get<FName>(StateNameOffset);
|
|
||||||
}
|
|
||||||
|
|
||||||
class APawn*& GetPawn()
|
|
||||||
{
|
|
||||||
static auto PawnOffset = this->GetOffset("Pawn");
|
|
||||||
return this->Get<class APawn*>(PawnOffset);
|
|
||||||
}
|
|
||||||
|
|
||||||
class APlayerState*& GetPlayerState()
|
|
||||||
{
|
|
||||||
static auto PlayerStateOffset = this->GetOffset("PlayerState");
|
|
||||||
return this->Get<class APlayerState*>(PlayerStateOffset);
|
|
||||||
}
|
|
||||||
};
|
|
||||||
@@ -1,94 +0,0 @@
|
|||||||
#pragma once
|
|
||||||
|
|
||||||
#include "Object.h"
|
|
||||||
#include "NameTypes.h"
|
|
||||||
|
|
||||||
#include "reboot.h"
|
|
||||||
#include "DataTable.h"
|
|
||||||
|
|
||||||
enum class ECurveTableMode : unsigned char
|
|
||||||
{
|
|
||||||
Empty,
|
|
||||||
SimpleCurves,
|
|
||||||
RichCurves
|
|
||||||
};
|
|
||||||
|
|
||||||
struct FSimpleCurveKey
|
|
||||||
{
|
|
||||||
float Time; // 0x0000(0x0004) (Edit, ZeroConstructor, IsPlainOldData, NoDestructor, HasGetValueTypeHash, NativeAccessSpecifierPublic)
|
|
||||||
float Value; // 0x0004(0x0004) (Edit, ZeroConstructor, IsPlainOldData, NoDestructor, HasGetValueTypeHash, NativeAccessSpecifierPublic)
|
|
||||||
};
|
|
||||||
|
|
||||||
struct FIndexedCurve
|
|
||||||
{
|
|
||||||
|
|
||||||
};
|
|
||||||
|
|
||||||
struct FRealCurve : public FIndexedCurve
|
|
||||||
{
|
|
||||||
};
|
|
||||||
|
|
||||||
struct FSimpleCurve : public FRealCurve
|
|
||||||
{
|
|
||||||
TArray<FSimpleCurveKey>& GetKeys()
|
|
||||||
{
|
|
||||||
static auto KeysOffset = FindOffsetStruct("/Script/Engine.SimpleCurve", "Keys");
|
|
||||||
return *(TArray<FSimpleCurveKey>*)(__int64(this) + KeysOffset);
|
|
||||||
}
|
|
||||||
};
|
|
||||||
|
|
||||||
class UCurveTable : public UObject
|
|
||||||
{
|
|
||||||
public:
|
|
||||||
static int GetCurveTableSize()
|
|
||||||
{
|
|
||||||
static auto CurveTableClass = FindObject<UClass>("/Script/Engine.CurveTable");
|
|
||||||
return CurveTableClass->GetPropertiesSize();
|
|
||||||
}
|
|
||||||
|
|
||||||
ECurveTableMode GetCurveTableMode() const
|
|
||||||
{
|
|
||||||
static auto CurveTableModeOffset = GetCurveTableSize() - 8;
|
|
||||||
return *(ECurveTableMode*)(__int64(this) + CurveTableModeOffset);
|
|
||||||
}
|
|
||||||
|
|
||||||
void* GetKey(const FName& RowName, int Index)
|
|
||||||
{
|
|
||||||
auto CurveTableMode = GetCurveTableMode();
|
|
||||||
|
|
||||||
// LOG_INFO(LogDev, "RowName {} CurveTableMode {} Size {}", RowName.ComparisonIndex.Value ? RowName.ToString() : "InvalidComparision", (int)CurveTableMode, GetCurveTableSize());
|
|
||||||
|
|
||||||
if (CurveTableMode == ECurveTableMode::SimpleCurves)
|
|
||||||
{
|
|
||||||
auto& RowMap = ((UDataTable*)this)->GetRowMap<FSimpleCurve>(); // its the same offset so
|
|
||||||
auto Curve = RowMap.Find(RowName);
|
|
||||||
auto& Keys = Curve->GetKeys();
|
|
||||||
return Keys.Num() > Index ? &Curve->GetKeys().at(Index) : nullptr;
|
|
||||||
}
|
|
||||||
else if (CurveTableMode == ECurveTableMode::RichCurves)
|
|
||||||
{
|
|
||||||
LOG_INFO(LogDev, "RICHCURVE UNIMPLEMENTED!");
|
|
||||||
}
|
|
||||||
|
|
||||||
return nullptr;
|
|
||||||
}
|
|
||||||
|
|
||||||
float GetValueOfKey(void* Key)
|
|
||||||
{
|
|
||||||
if (!Key)
|
|
||||||
return 0.f;
|
|
||||||
|
|
||||||
auto CurveTableMode = GetCurveTableMode();
|
|
||||||
|
|
||||||
if (CurveTableMode == ECurveTableMode::SimpleCurves) return ((FSimpleCurveKey*)Key)->Value;
|
|
||||||
else if (CurveTableMode == ECurveTableMode::RichCurves) return 0.f;
|
|
||||||
|
|
||||||
return 0.f;
|
|
||||||
}
|
|
||||||
};
|
|
||||||
|
|
||||||
struct FCurveTableRowHandle
|
|
||||||
{
|
|
||||||
UCurveTable* CurveTable;
|
|
||||||
FName RowName;
|
|
||||||
};
|
|
||||||
@@ -1,16 +0,0 @@
|
|||||||
#include "Channel.h"
|
|
||||||
#include "NetConnection.h"
|
|
||||||
|
|
||||||
int32 UChannel::IsNetReady(bool Saturate)
|
|
||||||
{
|
|
||||||
static auto NumOutRecOffset = 0x4C;
|
|
||||||
|
|
||||||
if (*(int*)(__int64(this) + NumOutRecOffset) < 255)
|
|
||||||
{
|
|
||||||
static auto ConnectionOffset = GetOffset("Connection");
|
|
||||||
auto Connection = Get<UNetConnection*>(ConnectionOffset);
|
|
||||||
return Connection->IsNetReady(Saturate);
|
|
||||||
}
|
|
||||||
|
|
||||||
return 0;
|
|
||||||
}
|
|
||||||
@@ -1,49 +0,0 @@
|
|||||||
#pragma once
|
|
||||||
|
|
||||||
#include "Object.h"
|
|
||||||
#include "reboot.h"
|
|
||||||
|
|
||||||
#include "Map.h"
|
|
||||||
|
|
||||||
struct FTableRowBase
|
|
||||||
{
|
|
||||||
unsigned char UnknownData00[0x8]; // this is actually structural padding
|
|
||||||
};
|
|
||||||
|
|
||||||
class UDataTable : public UObject
|
|
||||||
{
|
|
||||||
public:
|
|
||||||
template <typename RowDataType = uint8_t>
|
|
||||||
TMap<FName, RowDataType*>& GetRowMap()
|
|
||||||
{
|
|
||||||
static auto RowStructOffset = FindOffsetStruct("/Script/Engine.DataTable", "RowStruct");
|
|
||||||
|
|
||||||
return *(TMap<FName, RowDataType*>*)(__int64(this) + (RowStructOffset + sizeof(UObject*))); // because after rowstruct is rowmap
|
|
||||||
}
|
|
||||||
|
|
||||||
static UClass* StaticClass()
|
|
||||||
{
|
|
||||||
static auto Class = FindObject<UClass>(L"/Script/Engine.DataTable");
|
|
||||||
return Class;
|
|
||||||
}
|
|
||||||
};
|
|
||||||
|
|
||||||
struct FDataTableRowHandle
|
|
||||||
{
|
|
||||||
UDataTable* DataTable; // 0x0000(0x0008) (Edit, BlueprintVisible, ZeroConstructor, IsPlainOldData, NoDestructor, HasGetValueTypeHash, NativeAccessSpecifierPublic)
|
|
||||||
FName RowName; // 0x0008(0x0008) (Edit, BlueprintVisible, ZeroConstructor, IsPlainOldData, NoDestructor, HasGetValueTypeHash, NativeAccessSpecifierPublic)
|
|
||||||
};
|
|
||||||
|
|
||||||
template <typename StructType = uint8>
|
|
||||||
struct RowNameAndRowData
|
|
||||||
{
|
|
||||||
FName RowName;
|
|
||||||
StructType* RowData;
|
|
||||||
};
|
|
||||||
|
|
||||||
struct FDataTableCategoryHandle
|
|
||||||
{
|
|
||||||
UDataTable* DataTable; // 0x0000(0x0008) (Edit, BlueprintVisible, ZeroConstructor, IsPlainOldData, NoDestructor, HasGetValueTypeHash, NativeAccessSpecifierPublic)
|
|
||||||
FName ColumnName; // 0x0008(0x0008) (Edit, BlueprintVisible, ZeroConstructor, IsPlainOldData, NoDestructor, HasGetValueTypeHash, NativeAccessSpecifierPublic)
|
|
||||||
FName RowContents; // 0x0010(0x0008) (Edit, BlueprintVisible, ZeroConstructor, IsPlainOldData, NoDestructor, HasGetValueTypeHash, NativeAccessSpecifierPublic)
|
|
||||||
};
|
|
||||||
@@ -1,29 +0,0 @@
|
|||||||
#include "DataTableFunctionLibrary.h"
|
|
||||||
|
|
||||||
#include "reboot.h"
|
|
||||||
|
|
||||||
float UDataTableFunctionLibrary::EvaluateCurveTableRow(UCurveTable* CurveTable, FName RowName, float InXY,
|
|
||||||
const FString& ContextString, EEvaluateCurveTableResult* OutResult)
|
|
||||||
{
|
|
||||||
static auto fn = FindObject<UFunction>(L"/Script/Engine.DataTableFunctionLibrary.EvaluateCurveTableRow");
|
|
||||||
|
|
||||||
float wtf{};
|
|
||||||
EEvaluateCurveTableResult wtf1{};
|
|
||||||
|
|
||||||
struct { UCurveTable* CurveTable; FName RowName; float InXY; EEvaluateCurveTableResult OutResult; float OutXY; FString ContextString; }
|
|
||||||
UDataTableFunctionLibrary_EvaluateCurveTableRow_Params{CurveTable, RowName, InXY, wtf1, wtf, ContextString};
|
|
||||||
|
|
||||||
static auto DefaultClass = StaticClass();
|
|
||||||
DefaultClass->ProcessEvent(fn, &UDataTableFunctionLibrary_EvaluateCurveTableRow_Params);
|
|
||||||
|
|
||||||
if (OutResult)
|
|
||||||
*OutResult = UDataTableFunctionLibrary_EvaluateCurveTableRow_Params.OutResult;
|
|
||||||
|
|
||||||
return UDataTableFunctionLibrary_EvaluateCurveTableRow_Params.OutXY;
|
|
||||||
}
|
|
||||||
|
|
||||||
UClass* UDataTableFunctionLibrary::StaticClass()
|
|
||||||
{
|
|
||||||
static auto Class = FindObject<UClass>(L"/Script/Engine.DataTableFunctionLibrary");
|
|
||||||
return Class;
|
|
||||||
}
|
|
||||||
@@ -1,21 +0,0 @@
|
|||||||
#pragma once
|
|
||||||
|
|
||||||
#include "Object.h"
|
|
||||||
#include "CurveTable.h"
|
|
||||||
#include "UnrealString.h"
|
|
||||||
|
|
||||||
enum class EEvaluateCurveTableResult : uint8_t
|
|
||||||
{
|
|
||||||
RowFound = 0,
|
|
||||||
RowNotFound = 1,
|
|
||||||
EEvaluateCurveTableResult_MAX = 2
|
|
||||||
};
|
|
||||||
|
|
||||||
class UDataTableFunctionLibrary : public UObject
|
|
||||||
{
|
|
||||||
public:
|
|
||||||
static float EvaluateCurveTableRow(UCurveTable* CurveTable, FName RowName, float InXY,
|
|
||||||
const FString& ContextString = FString(), EEvaluateCurveTableResult* OutResult = nullptr);
|
|
||||||
|
|
||||||
static UClass* StaticClass();
|
|
||||||
};
|
|
||||||
39
dependencies/reboot/Project Reboot 3.0/Decay.h
vendored
39
dependencies/reboot/Project Reboot 3.0/Decay.h
vendored
@@ -1,39 +0,0 @@
|
|||||||
#pragma once
|
|
||||||
|
|
||||||
#include "inc.h"
|
|
||||||
|
|
||||||
#include "RemoveReference.h"
|
|
||||||
#include "RemoveCV.h"
|
|
||||||
|
|
||||||
namespace UE4Decay_Private
|
|
||||||
{
|
|
||||||
template <typename T>
|
|
||||||
struct TDecayNonReference
|
|
||||||
{
|
|
||||||
typedef typename TRemoveCV<T>::Type Type;
|
|
||||||
};
|
|
||||||
|
|
||||||
template <typename T>
|
|
||||||
struct TDecayNonReference<T[]>
|
|
||||||
{
|
|
||||||
typedef T* Type;
|
|
||||||
};
|
|
||||||
|
|
||||||
template <typename T, uint32 N>
|
|
||||||
struct TDecayNonReference<T[N]>
|
|
||||||
{
|
|
||||||
typedef T* Type;
|
|
||||||
};
|
|
||||||
|
|
||||||
template <typename RetType, typename... Params>
|
|
||||||
struct TDecayNonReference<RetType(Params...)>
|
|
||||||
{
|
|
||||||
typedef RetType(*Type)(Params...);
|
|
||||||
};
|
|
||||||
}
|
|
||||||
|
|
||||||
template <typename T>
|
|
||||||
struct TDecay
|
|
||||||
{
|
|
||||||
typedef typename UE4Decay_Private::TDecayNonReference<typename TRemoveReference<T>::Type>::Type Type;
|
|
||||||
};
|
|
||||||
@@ -1,19 +0,0 @@
|
|||||||
#pragma once
|
|
||||||
|
|
||||||
#include "DelegateBase.h"
|
|
||||||
#include "DelegateSignatureImpl.inl"
|
|
||||||
|
|
||||||
#define FUNC_CONCAT( ... ) __VA_ARGS__
|
|
||||||
|
|
||||||
#define FUNC_DECLARE_DELEGATE( DelegateName, ReturnType, ... ) \
|
|
||||||
typedef TBaseDelegate/*<__VA_ARGS__>*/ DelegateName;
|
|
||||||
|
|
||||||
#define FUNC_DECLARE_DYNAMIC_DELEGATE( TWeakPtr, DynamicDelegateName, ExecFunction, FuncParamList, FuncParamPassThru, ... ) \
|
|
||||||
class DynamicDelegateName : public TBaseDynamicDelegate<TWeakPtr, __VA_ARGS__> \
|
|
||||||
{ \
|
|
||||||
public: \
|
|
||||||
DynamicDelegateName() \
|
|
||||||
{ \
|
|
||||||
} \
|
|
||||||
\
|
|
||||||
};
|
|
||||||
@@ -1,28 +0,0 @@
|
|||||||
#pragma once
|
|
||||||
|
|
||||||
#include "inc.h"
|
|
||||||
|
|
||||||
#include "TypeCompatibleBytes.h"
|
|
||||||
#include "ContainerAllocationPolicies.h"
|
|
||||||
|
|
||||||
#if !defined(_WIN32) || defined(_WIN64)
|
|
||||||
// Let delegates store up to 32 bytes which are 16-byte aligned before we heap allocate
|
|
||||||
typedef TAlignedBytes<16, 16> FAlignedInlineDelegateType;
|
|
||||||
#if USE_SMALL_DELEGATES
|
|
||||||
typedef FHeapAllocator FDelegateAllocatorType;
|
|
||||||
#else
|
|
||||||
typedef TInlineAllocator<2> FDelegateAllocatorType;
|
|
||||||
#endif
|
|
||||||
#else
|
|
||||||
// ... except on Win32, because we can't pass 16-byte aligned types by value, as some delegates are
|
|
||||||
// so we'll just keep it heap-allocated, which are always sufficiently aligned.
|
|
||||||
typedef TAlignedBytes<16, 8> FAlignedInlineDelegateType;
|
|
||||||
typedef FHeapAllocator FDelegateAllocatorType;
|
|
||||||
#endif
|
|
||||||
|
|
||||||
class FDelegateBase
|
|
||||||
{
|
|
||||||
public:
|
|
||||||
FDelegateAllocatorType::ForElementType<FAlignedInlineDelegateType> DelegateAllocator;
|
|
||||||
int32 DelegateSize;
|
|
||||||
};
|
|
||||||
@@ -1,7 +0,0 @@
|
|||||||
#pragma once
|
|
||||||
|
|
||||||
#include "Delegate.h"
|
|
||||||
#include "ObjectMacros.h"
|
|
||||||
|
|
||||||
#define DECLARE_DELEGATE( DelegateName ) FUNC_DECLARE_DELEGATE( DelegateName, void )
|
|
||||||
#define DECLARE_DYNAMIC_DELEGATE( DelegateName ) /* BODY_MACRO_COMBINE(CURRENT_FILE_ID,_,__LINE__,_DELEGATE) */ FUNC_DECLARE_DYNAMIC_DELEGATE( FWeakObjectPtr, DelegateName, DelegateName##_DelegateWrapper, , FUNC_CONCAT( *this ), void )
|
|
||||||
@@ -1,16 +0,0 @@
|
|||||||
#pragma once
|
|
||||||
|
|
||||||
template <bool Const, typename Class, typename FuncType>
|
|
||||||
struct TMemFunPtrType;
|
|
||||||
|
|
||||||
template <typename Class, typename RetType, typename... ArgTypes>
|
|
||||||
struct TMemFunPtrType<false, Class, RetType(ArgTypes...)>
|
|
||||||
{
|
|
||||||
typedef RetType(Class::* Type)(ArgTypes...);
|
|
||||||
};
|
|
||||||
|
|
||||||
template <typename Class, typename RetType, typename... ArgTypes>
|
|
||||||
struct TMemFunPtrType<true, Class, RetType(ArgTypes...)>
|
|
||||||
{
|
|
||||||
typedef RetType(Class::* Type)(ArgTypes...) const;
|
|
||||||
};
|
|
||||||
@@ -1,63 +0,0 @@
|
|||||||
#pragma once
|
|
||||||
|
|
||||||
#include "DelegateBase.h"
|
|
||||||
#include "ScriptDelegates.h"
|
|
||||||
|
|
||||||
#include "DelegateInstanceInterface.h"
|
|
||||||
#include "RemoveReference.h"
|
|
||||||
#include "TypeWrapper.h"
|
|
||||||
|
|
||||||
// template <typename WrappedRetValType, typename... ParamTypes> // (Milxnor) IDK IM SCUFFED
|
|
||||||
class TBaseDelegate : public FDelegateBase
|
|
||||||
{
|
|
||||||
public:
|
|
||||||
// (Milxnor) YEAH NO
|
|
||||||
|
|
||||||
/*
|
|
||||||
typedef typename TUnwrapType<WrappedRetValType>::Type RetValType;
|
|
||||||
|
|
||||||
template <typename UserClass, typename... VarTypes>
|
|
||||||
FUNCTION_CHECK_RETURN_START
|
|
||||||
inline static TBaseDelegate<RetValType, ParamTypes...> CreateRaw(UserClass* InUserObject, typename TMemFunPtrType<false, UserClass, RetValType(ParamTypes..., VarTypes...)>::Type InFunc, VarTypes... Vars)
|
|
||||||
FUNCTION_CHECK_RETURN_END
|
|
||||||
{
|
|
||||||
// UE_STATIC_DEPRECATE(4.23, TIsConst<UserClass>::Value, "Binding a delegate with a const object pointer and non-const function is deprecated.");
|
|
||||||
|
|
||||||
TBaseDelegate<RetValType, ParamTypes...> Result;
|
|
||||||
TBaseRawMethodDelegateInstance<false, UserClass, TFuncType, VarTypes...>::Create(Result, InUserObject, InFunc, Vars...);
|
|
||||||
return Result;
|
|
||||||
}
|
|
||||||
template <typename UserClass, typename... VarTypes>
|
|
||||||
FUNCTION_CHECK_RETURN_START
|
|
||||||
inline static TBaseDelegate<RetValType, ParamTypes...> CreateRaw(UserClass* InUserObject, typename TMemFunPtrType<true, UserClass, RetValType(ParamTypes..., VarTypes...)>::Type InFunc, VarTypes... Vars)
|
|
||||||
FUNCTION_CHECK_RETURN_END
|
|
||||||
{
|
|
||||||
TBaseDelegate<RetValType, ParamTypes...> Result;
|
|
||||||
TBaseRawMethodDelegateInstance<true, UserClass, TFuncType, VarTypes...>::Create(Result, InUserObject, InFunc, Vars...);
|
|
||||||
return Result;
|
|
||||||
}
|
|
||||||
|
|
||||||
|
|
||||||
template <typename UserClass, typename... VarTypes>
|
|
||||||
inline void BindRaw(UserClass* InUserObject, typename TMemFunPtrType<false, UserClass, RetValType(ParamTypes..., VarTypes...)>::Type InFunc, VarTypes... Vars)
|
|
||||||
{
|
|
||||||
// UE_STATIC_DEPRECATE(4.23, TIsConst<UserClass>::Value, "Binding a delegate with a const object pointer and non-const function is deprecated.");
|
|
||||||
|
|
||||||
*this = CreateRaw(const_cast<typename TRemoveConst<UserClass>::Type*>(InUserObject), InFunc, Vars...);
|
|
||||||
}
|
|
||||||
template <typename UserClass, typename... VarTypes>
|
|
||||||
inline void BindRaw(UserClass* InUserObject, typename TMemFunPtrType<true, UserClass, RetValType(ParamTypes..., VarTypes...)>::Type InFunc, VarTypes... Vars)
|
|
||||||
{
|
|
||||||
*this = CreateRaw(InUserObject, InFunc, Vars...);
|
|
||||||
} */
|
|
||||||
};
|
|
||||||
|
|
||||||
template <typename TWeakPtr, typename RetValType, typename... ParamTypes>
|
|
||||||
class TBaseDynamicDelegate : public TScriptDelegate<TWeakPtr>
|
|
||||||
{
|
|
||||||
public:
|
|
||||||
/**
|
|
||||||
* Default constructor
|
|
||||||
*/
|
|
||||||
TBaseDynamicDelegate() { }
|
|
||||||
};
|
|
||||||
@@ -1,15 +0,0 @@
|
|||||||
#pragma once
|
|
||||||
|
|
||||||
template <bool Predicate, typename Result = void>
|
|
||||||
class TEnableIf;
|
|
||||||
|
|
||||||
template <typename Result>
|
|
||||||
class TEnableIf<true, Result>
|
|
||||||
{
|
|
||||||
public:
|
|
||||||
typedef Result Type;
|
|
||||||
};
|
|
||||||
|
|
||||||
template <typename Result>
|
|
||||||
class TEnableIf<false, Result>
|
|
||||||
{ };
|
|
||||||
17
dependencies/reboot/Project Reboot 3.0/Engine.h
vendored
17
dependencies/reboot/Project Reboot 3.0/Engine.h
vendored
@@ -1,17 +0,0 @@
|
|||||||
#pragma once
|
|
||||||
|
|
||||||
#include "World.h"
|
|
||||||
#include "NetDriver.h"
|
|
||||||
|
|
||||||
#include "UnrealString.h"
|
|
||||||
|
|
||||||
class UEngine : public UObject
|
|
||||||
{
|
|
||||||
public:
|
|
||||||
static inline UNetDriver* (*Engine_CreateNetDriver)(UEngine* Engine, UWorld* InWorld, FName NetDriverDefinition);
|
|
||||||
|
|
||||||
UNetDriver* CreateNetDriver(UWorld* InWorld, FName NetDriverDefinition) { return Engine_CreateNetDriver(this, InWorld, NetDriverDefinition); }
|
|
||||||
};
|
|
||||||
|
|
||||||
// static inline bool (*CreateNamedNetDriver)(UWorld* InWorld, FName NetDriverName, FName NetDriverDefinition);
|
|
||||||
// static inline UNetDriver* CreateNetDriver_Local(UEngine* Engine, FWorldContext& Context, FName NetDriverDefinition)
|
|
||||||
@@ -1,33 +0,0 @@
|
|||||||
#include "EngineTypes.h"
|
|
||||||
|
|
||||||
#include "reboot.h"
|
|
||||||
|
|
||||||
UStruct* FHitResult::GetStruct()
|
|
||||||
{
|
|
||||||
static auto Struct = FindObject<UStruct>("/Script/Engine.HitResult");
|
|
||||||
return Struct;
|
|
||||||
}
|
|
||||||
|
|
||||||
int FHitResult::GetStructSize()
|
|
||||||
{
|
|
||||||
return GetStruct()->GetPropertiesSize();
|
|
||||||
}
|
|
||||||
|
|
||||||
bool FHitResult::IsBlockingHit()
|
|
||||||
{
|
|
||||||
// return true;
|
|
||||||
static auto bBlockingHitOffset = FindOffsetStruct("/Script/Engine.HitResult", "bBlockingHit");
|
|
||||||
static auto bBlockingHitFieldMask = GetFieldMask(FindPropertyStruct("/Script/Engine.HitResult", "bBlockingHit"));
|
|
||||||
return ReadBitfield((PlaceholderBitfield*)(__int64(this) + bBlockingHitOffset), bBlockingHitFieldMask);
|
|
||||||
}
|
|
||||||
|
|
||||||
FVector& FHitResult::GetLocation()
|
|
||||||
{
|
|
||||||
static auto LocationOffset = FindOffsetStruct("/Script/Engine.HitResult", "Location");
|
|
||||||
return *(FVector*)(__int64(this) + LocationOffset);
|
|
||||||
}
|
|
||||||
|
|
||||||
void FHitResult::CopyFromHitResult(FHitResult* Other)
|
|
||||||
{
|
|
||||||
this->GetLocation() = Other->GetLocation();
|
|
||||||
}
|
|
||||||
@@ -1,95 +0,0 @@
|
|||||||
#pragma once
|
|
||||||
|
|
||||||
#include "Object.h"
|
|
||||||
#include "Vector.h"
|
|
||||||
|
|
||||||
#include "DelegateCombinations.h"
|
|
||||||
|
|
||||||
enum class ESpawnActorCollisionHandlingMethod : uint8
|
|
||||||
{
|
|
||||||
Undefined,
|
|
||||||
AlwaysSpawn,
|
|
||||||
AdjustIfPossibleButAlwaysSpawn,
|
|
||||||
AdjustIfPossibleButDontSpawnIfColliding,
|
|
||||||
DontSpawnIfColliding
|
|
||||||
};
|
|
||||||
|
|
||||||
struct FHitResult
|
|
||||||
{
|
|
||||||
static class UStruct* GetStruct();
|
|
||||||
static int GetStructSize();
|
|
||||||
|
|
||||||
bool IsBlockingHit();
|
|
||||||
FVector& GetLocation();
|
|
||||||
void CopyFromHitResult(FHitResult* Other);
|
|
||||||
};
|
|
||||||
|
|
||||||
struct FTimerHandle
|
|
||||||
{
|
|
||||||
FTimerHandle()
|
|
||||||
: Handle(0)
|
|
||||||
{
|
|
||||||
}
|
|
||||||
|
|
||||||
/** True if this handle was ever initialized by the timer manager */
|
|
||||||
bool IsValid() const
|
|
||||||
{
|
|
||||||
return Handle != 0;
|
|
||||||
}
|
|
||||||
|
|
||||||
/** Explicitly clear handle */
|
|
||||||
void Invalidate()
|
|
||||||
{
|
|
||||||
Handle = 0;
|
|
||||||
}
|
|
||||||
|
|
||||||
bool operator==(const FTimerHandle& Other) const
|
|
||||||
{
|
|
||||||
return Handle == Other.Handle;
|
|
||||||
}
|
|
||||||
|
|
||||||
bool operator!=(const FTimerHandle& Other) const
|
|
||||||
{
|
|
||||||
return Handle != Other.Handle;
|
|
||||||
}
|
|
||||||
|
|
||||||
/* FString ToString() const
|
|
||||||
{
|
|
||||||
return FString::Printf(TEXT("%llu"), Handle);
|
|
||||||
} */
|
|
||||||
|
|
||||||
// private:
|
|
||||||
static const uint32 IndexBits = 24;
|
|
||||||
static const uint32 SerialNumberBits = 40;
|
|
||||||
|
|
||||||
static_assert(IndexBits + SerialNumberBits == 64, "The space for the timer index and serial number should total 64 bits");
|
|
||||||
|
|
||||||
static const int32 MaxIndex = (int32)1 << IndexBits;
|
|
||||||
static const uint64 MaxSerialNumber = (uint64)1 << SerialNumberBits;
|
|
||||||
|
|
||||||
void SetIndexAndSerialNumber(int32 Index, uint64 SerialNumber)
|
|
||||||
{
|
|
||||||
// check(Index >= 0 && Index < MaxIndex);
|
|
||||||
// check(SerialNumber < MaxSerialNumber);
|
|
||||||
Handle = (SerialNumber << IndexBits) | (uint64)(uint32)Index;
|
|
||||||
}
|
|
||||||
|
|
||||||
FORCEINLINE int32 GetIndex() const
|
|
||||||
{
|
|
||||||
return (int32)(Handle & (uint64)(MaxIndex - 1));
|
|
||||||
}
|
|
||||||
|
|
||||||
FORCEINLINE uint64 GetSerialNumber() const
|
|
||||||
{
|
|
||||||
return Handle >> IndexBits;
|
|
||||||
}
|
|
||||||
|
|
||||||
uint64 Handle;
|
|
||||||
|
|
||||||
/* friend uint32 GetTypeHash(const FTimerHandle& InHandle)
|
|
||||||
{
|
|
||||||
return GetTypeHash(InHandle.Handle);
|
|
||||||
} */
|
|
||||||
};
|
|
||||||
|
|
||||||
DECLARE_DYNAMIC_DELEGATE(FTimerDynamicDelegate);
|
|
||||||
@@ -1,8 +0,0 @@
|
|||||||
#pragma once
|
|
||||||
|
|
||||||
#include "Object.h"
|
|
||||||
|
|
||||||
class UEnvQuery : public UObject // UDataAsset
|
|
||||||
{
|
|
||||||
public:
|
|
||||||
};
|
|
||||||
@@ -1,18 +0,0 @@
|
|||||||
#pragma once
|
|
||||||
|
|
||||||
#include "NameTypes.h"
|
|
||||||
|
|
||||||
enum class EAIParamType : uint8
|
|
||||||
{
|
|
||||||
Float,
|
|
||||||
Int,
|
|
||||||
Bool
|
|
||||||
// MAX UMETA(Hidden)
|
|
||||||
};
|
|
||||||
|
|
||||||
struct FEnvNamedValue // i dont thin kthis ever changes
|
|
||||||
{
|
|
||||||
FName ParamName;
|
|
||||||
EAIParamType ParamType;
|
|
||||||
float Value;
|
|
||||||
};
|
|
||||||
@@ -1 +0,0 @@
|
|||||||
#pragma once
|
|
||||||
Some files were not shown because too many files have changed in this diff Show More
Reference in New Issue
Block a user