Reboot v3

This commit is contained in:
Alessandro Autiero
2023-05-24 23:19:36 +02:00
parent 760e336bc0
commit eb6381912c
129 changed files with 396379 additions and 1380 deletions

View File

@@ -0,0 +1,26 @@
import 'package:get/get.dart';
import 'package:reboot_launcher/src/model/fortnite_build.dart';
class BuildController extends GetxController {
List<FortniteBuild>? builds;
FortniteBuild? _selectedBuild;
final List<Function()> _listeners;
late RxBool cancelledDownload;
BuildController() : _listeners = [] {
cancelledDownload = RxBool(false);
}
FortniteBuild get selectedBuild => _selectedBuild ?? builds!.elementAt(0);
set selectedBuild(FortniteBuild build) {
_selectedBuild = build;
for (var listener in _listeners) {
listener();
}
}
void addOnBuildChangedListener(Function() listener) => _listeners.add(listener);
void removeOnBuildChangedListener() => _listeners.clear();
}

View File

@@ -0,0 +1,91 @@
import 'dart:async';
import 'dart:collection';
import 'dart:convert';
import 'package:fluent_ui/fluent_ui.dart';
import 'package:get/get.dart';
import 'package:get_storage/get_storage.dart';
import 'package:reboot_launcher/src/model/fortnite_version.dart';
import 'package:reboot_launcher/src/model/game_instance.dart';
import '../../model/update_status.dart';
const String kDefaultPlayerName = "Player";
class GameController extends GetxController {
late final GetStorage _storage;
late final TextEditingController username;
late final TextEditingController password;
late final RxBool showPassword;
late final TextEditingController customLaunchArgs;
late final Rx<List<FortniteVersion>> versions;
late final Rxn<FortniteVersion> _selectedVersion;
late final RxBool started;
late final Rx<UpdateStatus> updateStatus;
GameInstance? instance;
GameController() {
_storage = GetStorage("reboot_game");
Iterable decodedVersionsJson = jsonDecode(_storage.read("versions") ?? "[]");
var decodedVersions = decodedVersionsJson
.map((entry) => FortniteVersion.fromJson(entry))
.toList();
versions = Rx(decodedVersions);
versions.listen((data) => _saveVersions());
var decodedSelectedVersionName = _storage.read("version");
var decodedSelectedVersion = decodedVersions.firstWhereOrNull(
(element) => element.name == decodedSelectedVersionName);
_selectedVersion = Rxn(decodedSelectedVersion);
username = TextEditingController(text: _storage.read("username") ?? kDefaultPlayerName);
username.addListener(() => _storage.write("username", username.text));
password = TextEditingController(text: _storage.read("password") ?? "");
password.addListener(() => _storage.write("password", password.text));
showPassword = RxBool(false);
customLaunchArgs = TextEditingController(text: _storage.read("custom_launch_args" ?? ""));
customLaunchArgs.addListener(() => _storage.write("custom_launch_args", customLaunchArgs.text));
started = RxBool(false);
updateStatus = Rx(UpdateStatus.waiting);
}
FortniteVersion? getVersionByName(String name) {
return versions.value.firstWhereOrNull((element) => element.name == name);
}
void addVersion(FortniteVersion version) {
var empty = versions.value.isEmpty;
versions.update((val) => val?.add(version));
if(empty){
selectedVersion = version;
}
}
FortniteVersion removeVersionByName(String versionName) {
var version = versions.value.firstWhere((element) => element.name == versionName);
removeVersion(version);
return version;
}
void removeVersion(FortniteVersion version) {
versions.update((val) => val?.remove(version));
}
Future<void> _saveVersions() async {
var serialized = jsonEncode(versions.value.map((entry) => entry.toJson()).toList());
await _storage.write("versions", serialized);
}
bool get hasVersions => versions.value.isNotEmpty;
bool get hasNoVersions => versions.value.isEmpty;
FortniteVersion? get selectedVersion => _selectedVersion();
set selectedVersion(FortniteVersion? version) {
_selectedVersion(version);
_storage.write("version", version?.name);
}
void updateVersion(FortniteVersion version, Function(FortniteVersion) function) {
versions.update((val) => function(version));
}
}

View File

@@ -0,0 +1,28 @@
import 'package:fluent_ui/fluent_ui.dart';
import 'package:get/get.dart';
import 'package:get_storage/get_storage.dart';
import '../../model/game_instance.dart';
const String kDefaultServerName = "Reboot Game Server";
class HostingController extends GetxController {
late final GetStorage _storage;
late final TextEditingController name;
late final TextEditingController category;
late final RxBool discoverable;
late final RxBool started;
GameInstance? instance;
HostingController() {
_storage = GetStorage("reboot_hosting");
name = TextEditingController(text: _storage.read("name") ?? kDefaultServerName);
name.addListener(() => _storage.write("name", name.text));
category = TextEditingController(text: _storage.read("category") ?? "");
category.addListener(() => _storage.write("category", category.text));
discoverable = RxBool(_storage.read("discoverable") ?? false);
discoverable.listen((value) => _storage.write("discoverable", value));
started = RxBool(false);
}
}

View File

@@ -0,0 +1,78 @@
import 'dart:io';
import 'package:fluent_ui/fluent_ui.dart';
import 'package:get/get.dart';
import 'package:get_storage/get_storage.dart';
import 'package:jaguar/jaguar.dart';
import '../../model/server_type.dart';
import '../../util/server.dart';
class ServerController extends GetxController {
static const String _serverName = "127.0.0.1";
static const String _serverPort = "3551";
late final GetStorage _storage;
late final TextEditingController host;
late final TextEditingController port;
late final Rx<ServerType> type;
late final RxBool warning;
late RxBool started;
late RxBool detached;
HttpServer? remoteServer;
ServerController() {
_storage = GetStorage("reboot_server");
started = RxBool(false);
type = Rx(ServerType.values.elementAt(_storage.read("type") ?? 0));
type.listen((value) {
host.text = _readHost();
port.text = _readPort();
_storage.write("type", value.index);
if(!started.value) {
return;
}
stop();
});
host = TextEditingController(text: _readHost());
host.addListener(() => _storage.write("${type.value.id}_host", host.text));
port = TextEditingController(text: _readPort());
port.addListener(() => _storage.write("${type.value.id}_port", port.text));
warning = RxBool(_storage.read("lawin_value") ?? true);
warning.listen((value) => _storage.write("lawin_value", value));
detached = RxBool(_storage.read("detached") ?? false);
warning.listen((value) => _storage.write("detached", value));
}
String _readHost() {
String? value = _storage.read("${type.value.id}_host");
return value != null && value.isNotEmpty ? value
: type.value != ServerType.remote ? _serverName : "";
}
String _readPort() {
return _storage.read("${type.value.id}_port") ?? _serverPort;
}
Future<bool> stop() async {
started.value = false;
try{
switch(type()){
case ServerType.embedded:
stopServer();
break;
case ServerType.remote:
await remoteServer?.close(force: true);
remoteServer = null;
break;
case ServerType.local:
break;
}
return true;
}catch(_){
started.value = true;
return false;
}
}
}

View File

@@ -0,0 +1,79 @@
import 'package:fluent_ui/fluent_ui.dart';
import 'package:get/get.dart';
import 'package:get_storage/get_storage.dart';
import 'package:reboot_launcher/main.dart';
import 'package:reboot_launcher/src/util/os.dart';
import 'package:reboot_launcher/src/util/server.dart';
import 'dart:ui';
import '../../util/reboot.dart';
class SettingsController extends GetxController {
static const String _kDefaultIp = "127.0.0.1";
static const bool _kDefaultAutoUpdate = true;
late final GetStorage _storage;
late final String originalDll;
late final TextEditingController updateUrl;
late final TextEditingController rebootDll;
late final TextEditingController consoleDll;
late final TextEditingController authDll;
late final TextEditingController matchmakingIp;
late final RxBool autoUpdate;
late double width;
late double height;
late double? offsetX;
late double? offsetY;
late double scrollingDistance;
SettingsController() {
_storage = GetStorage("reboot_settings");
updateUrl = TextEditingController(text: _storage.read("update_url") ?? rebootDownloadUrl);
updateUrl.addListener(() => _storage.write("update_url", updateUrl.text));
rebootDll = _createController("reboot", "reboot.dll");
consoleDll = _createController("console", "console.dll");
authDll = _createController("cobalt", "cobalt.dll");
matchmakingIp = TextEditingController(text: _storage.read("ip") ?? _kDefaultIp);
matchmakingIp.addListener(() async {
var text = matchmakingIp.text;
_storage.write("ip", text);
writeMatchmakingIp(text);
});
width = _storage.read("width") ?? kDefaultWindowWidth;
height = _storage.read("height") ?? kDefaultWindowHeight;
offsetX = _storage.read("offset_x");
offsetY = _storage.read("offset_y");
autoUpdate = RxBool(_storage.read("auto_update") ?? _kDefaultAutoUpdate);
autoUpdate.listen((value) async => _storage.write("auto_update", value));
scrollingDistance = 0.0;
}
TextEditingController _createController(String key, String name) {
var controller = TextEditingController(text: _storage.read(key) ?? _controllerDefaultPath(name));
controller.addListener(() => _storage.write(key, controller.text));
return controller;
}
void saveWindowSize() {
_storage.write("width", window.physicalSize.width);
_storage.write("height", window.physicalSize.height);
}
void saveWindowOffset(Offset position) {
_storage.write("offset_x", position.dx);
_storage.write("offset_y", position.dy);
}
void reset(){
updateUrl.text = rebootDownloadUrl;
rebootDll.text = _controllerDefaultPath("reboot.dll");
consoleDll.text = _controllerDefaultPath("console.dll");
authDll.text = _controllerDefaultPath("cobalt.dll");
matchmakingIp.text = _kDefaultIp;
writeMatchmakingIp(_kDefaultIp);
autoUpdate.value = _kDefaultAutoUpdate;
}
String _controllerDefaultPath(String name) => "${assetsDirectory.path}\\dlls\\$name";
}

View File

@@ -0,0 +1,6 @@
import 'package:get_storage/get_storage.dart';
final GetStorage _storage = GetStorage("reboot_update");
int? get updateTime => _storage.read("last_update_v2");
set updateTime(int? updateTime) => _storage.write("last_update_v2", updateTime);