fuck you!

This commit is contained in:
Yoshman29
2022-12-16 21:10:02 +01:00
parent ae7a945f81
commit d9c6acb234
8 changed files with 391 additions and 15 deletions
+3 -2
View File
@@ -96,7 +96,7 @@
<!-- _________________________________ Engine Settings _______________________________ -->
<!-- Comment this out to disable updates !-->
<define name="UPDATE_CHECKING" />
<!-- <define name="UPDATE_CHECKING" /> -->
<!-- Comment this out to disable titlescreen.xml !-->
<haxedef name="TITLESCREEN_XML" />
@@ -151,7 +151,7 @@
<haxeflag name="--macro" value="include('flixel')" />
<haxeflag name="--macro" value="include('away3d')" />
<haxeflag name="--macro" value="include('flx3d')" />
<haxeflag name="--macro" value="include('sys')" unless="html5"/>
<haxeflag name="--macro" value="include('sys')" unless="web"/>
<!-- HAXE STUFF !-->
<haxeflag name="--macro" value="include('DateTools')" />
@@ -164,6 +164,7 @@
<haxeflag name="--macro" value="include('haxe.extern')" />
<haxeflag name="--macro" value="exclude('scripting')" />
</section>
<haxeflag name="--macro" value="exclude('funkin.updating')" unless="UPDATE_CHECKING"/>
<!-- MACROS & DOCUMENTATION !-->
<haxeflag name="--macro" value="funkin.macros.BuildCounterMacro.getBuildNumber()" />
+1 -1
View File
@@ -1 +1 @@
1507
1513
+4
View File
@@ -175,12 +175,16 @@ class TitleState extends MusicBeatState
new FlxTimer().start(2, function(tmr:FlxTimer)
{
#if UPDATE_CHECKING
var report = funkin.updating.UpdateUtil.checkForUpdates();
if (report.newUpdate) {
FlxG.switchState(new funkin.updating.UpdateScreen(report));
} else {
FlxG.switchState(new MainMenuState());
}
#else
FlxG.switchState(new MainMenuState());
#end
});
}
+17
View File
@@ -45,11 +45,13 @@ class AssetsLibraryList extends AssetLibrary {
}
// TODO: do base folder scanning
#if MODS_FOLDER
if (l is ModsAssetLibrary) {
var lib = cast(l, ModsAssetLibrary);
for(e in lib.getFiles(folder))
content.push(e);
}
#end
}
return content;
}
@@ -95,6 +97,21 @@ class AssetsLibraryList extends AssetLibrary {
}
}
public override function isLocal(id:String, type:String) {
return true;
// for(l in libraries) {
// var lib:AssetLibrary = l;
// if (lib is openfl.utils.AssetLibrary) {
// var openflLib = cast(lib, openfl.utils.AssetLibrary);
// @:privateAccess
// if (openflLib.__proxy != null) lib = openflLib.__proxy;
// }
// if (lib.exists(id, type) && lib.isLocal(id, type))
// return true;
// }
// return false;
}
public function new(?base:AssetLibrary) {
super();
if (base == null)
-6
View File
@@ -151,8 +151,6 @@ class Main extends Sprite
#if USE_SOURCE_ASSETS
trace("Used lime test windows. Switching into source assets.");
Paths.assetsTree.addLibrary(ModsFolder.loadLibraryFromFolder('assets', './../../../../assets/', true));
#else
Assets.registerLibrary('assets', Paths.assetsTree.base);
#end
var buildNum:Int = Std.parseInt(File.getContent("./../../../../buildnumber.txt"));
@@ -161,12 +159,8 @@ class Main extends Sprite
} else {
#if USE_ADAPTED_ASSETS
Paths.assetsTree.addLibrary(ModsFolder.loadLibraryFromFolder('assets', './assets/', true));
#else
Assets.registerLibrary('assets', Paths.assetsTree.base);
#end
}
#else
Assets.registerLibrary('assets', Paths.assetsTree.base);
#end
-6
View File
@@ -1,21 +1,15 @@
package funkin.system;
import sys.thread.Thread;
import flixel.FlxBasic;
import funkin.scripting.DummyScript;
import flixel.FlxState;
import flixel.FlxSubState;
import funkin.scripting.events.*;
import funkin.scripting.Script;
import funkin.interfaces.IBeatReceiver;
import funkin.system.Conductor.BPMChangeEvent;
import funkin.system.Conductor;
import flixel.FlxG;
import flixel.addons.transition.FlxTransitionableState;
import flixel.addons.ui.FlxUIState;
import flixel.math.FlxRect;
import flixel.math.FlxMath;
import flixel.util.FlxTimer;
import funkin.options.PlayerSettings;
class MusicBeatState extends FlxUIState implements IBeatReceiver
+266
View File
@@ -0,0 +1,266 @@
package funkin.system;
#if (!macro && sys)
import openfl.display.BitmapData;
#end
import haxe.Exception;
import haxe.Json;
import haxe.crypto.Crc32;
import haxe.zip.Writer;
import haxe.zip.Tools;
import haxe.zip.Entry;
import haxe.zip.Uncompress;
import haxe.zip.Reader;
import haxe.zip.Compress;
import sys.FileSystem;
import sys.io.File;
import sys.thread.Thread;
using StringTools;
// import ZipUtils; ZipUtils.uncompressZip(ZipUtils.openZip("E:\\Desktop\\test\\termination lua.ycemod"), "E:\\Desktop\\test\\uncompressed\\");
// import ZipUtils; var e = ZipUtils.createZipFile("gjnsdghs.ycemod"); ZipUtils.writeFolderToZip(e, "./mods/Friday Night Funkin'/", "Friday Night Funkin'/"); e.flush(); e.close();
class ZipUtils {
public static var bannedNames:Array<String> = [".git", ".gitignore", ".github", ".vscode", ".gitattributes", "readme.txt"];
/**
* [Description] Uncompresses `zip` into the `destFolder` folder
* @param zip
* @param destFolder
*/
public static function uncompressZip(zip:Reader, destFolder:String, ?prefix:String, ?prog:ZipProgress):ZipProgress {
// we never know
FileSystem.createDirectory(destFolder);
var fields = zip.read();
try {
if (prefix != null) {
var f = fields;
fields = new List<Entry>();
for(field in f) {
if (field.fileName.startsWith(prefix)) {
fields.push(field);
}
}
}
if (prog == null)
prog = new ZipProgress();
prog.fileCount = fields.length;
for(k=>field in fields) {
prog.curFile = k;
var isFolder = field.fileName.endsWith("/") && field.fileSize == 0;
if (isFolder) {
FileSystem.createDirectory('${destFolder}/${field.fileName}');
} else {
var split = [for(e in field.fileName.split("/")) e.trim()];
split.pop();
FileSystem.createDirectory('${destFolder}/${split.join("/")}');
var data = unzip(field);
File.saveBytes('${destFolder}/${field.fileName}', data);
}
}
prog.curFile = fields.length;
prog.done = true;
} catch(e) {
prog.done = true;
prog.error = e;
}
return prog;
}
#if (!macro && sys)
public static function uncompressZipAsync(zip:Reader, destFolder:String, ?prog:ZipProgress, ?prefix:String):ZipProgress {
if (prog == null)
prog = new ZipProgress();
Thread.create(function() {
uncompressZip(zip, destFolder, prefix, prog);
});
return prog;
}
#end
/**
* [Description] Returns a `zip.Reader` instance from path.
* @param zipPath
* @return Reader
*/
public static function openZip(zipPath:String):Reader {
return new ZipReader(File.read(zipPath));
}
/**
* [Description] Copy of haxe's Zip unzip function cause lime replaced it.
* @param f Zip entry
*/
public static function unzip(f:Entry) {
if (!f.compressed)
return f.data;
var c = new haxe.zip.Uncompress(-15);
var s = haxe.io.Bytes.alloc(f.fileSize);
var r = c.execute(f.data, 0, s, 0);
c.close();
if (!r.done || r.read != f.data.length || r.write != f.fileSize)
throw "Invalid compressed data for " + f.fileName;
f.compressed = false;
f.dataSize = f.fileSize;
f.data = s;
return f.data;
}
/**
* [Description] Creates a ZIP file at the specified location and returns the Writer.
* @param path
* @return Writer
*/
public static function createZipFile(path:String):ZipWriter {
var output = File.write(path);
return new ZipWriter(output);
}
/**
[Description] Writes the entirety of a folder to a zip file.
@param zip ZIP file to write to
@param path Folder path
@param prefix (Additional) allows you to set a prefix in the zip itself.
**/
public static function writeFolderToZip(zip:ZipWriter, path:String, ?prefix:String, ?prog:ZipProgress, ?whitelist:Array<String>):ZipProgress {
if (prefix == null) prefix = "";
if (whitelist == null) whitelist = [];
if (prog == null) prog = new ZipProgress();
try {
var curPath:Array<String> = ['$path'];
var destPath:Array<String> = [];
if (prefix != "") {
prefix = prefix.replace("\\", "/");
while(prefix.charAt(0) == "/") prefix = prefix.substr(1);
while(prefix.charAt(prefix.length-1) == "/") prefix = prefix.substr(0, prefix.length-1);
destPath.push(prefix);
}
var files:Array<StrNameLabel> = [];
var doFolder:Void->Void = null;
(doFolder = function() {
var path = curPath.join("/");
var zipPath = destPath.join("/");
for(e in FileSystem.readDirectory(path)) {
if (bannedNames.contains(e.toLowerCase()) && !whitelist.contains(e.toLowerCase())) continue;
if (FileSystem.isDirectory('$path/$e')) {
// is directory, so loop into that function again
for(p in [curPath, destPath]) p.push(e);
doFolder();
for(p in [curPath, destPath]) p.pop();
} else {
// is file, put it in the list
var zipPath = '$zipPath/$e';
while(zipPath.charAt(0) == "/") zipPath = zipPath.substr(1);
files.push(new StrNameLabel('$path/$e', zipPath));
}
}
})();
prog.fileCount = files.length;
for(k=>file in files) {
prog.curFile = k;
var fileContent = File.getBytes(file.name);
var fileInfo = FileSystem.stat(file.name);
var entry:Entry = {
fileName: file.label,
fileSize: fileInfo.size,
fileTime: Date.now(),
dataSize: 0,
data: fileContent,
crc32: Crc32.make(fileContent), // TODO???
compressed: false
};
Tools.compress(entry, 1);
zip.writeFile(entry);
}
zip.writeCDR();
} catch(e) {
prog.error = e;
}
prog.done = true;
return prog;
}
public static function writeFolderToZipAsync(zip:ZipWriter, path:String, ?prefix:String):ZipProgress {
var zipProg = new ZipProgress();
Thread.create(function() {
writeFolderToZip(zip, path, prefix, zipProg);
});
return zipProg;
}
/**
* [Description] Converts an `Array<Entry>` to a `List<Entry>`.
* @param array
* @return List<Entry>
*/
public static function arrayToList(array:Array<Entry>):List<Entry> {
var list = new List<Entry>();
for(e in array) list.push(e);
return list;
}
}
class ZipProgress {
public var error:Exception = null;
public var curFile:Int = 0;
public var fileCount:Int = 0;
public var done:Bool = false;
public var percentage(get, null):Float;
private function get_percentage() {
return fileCount <= 0 ? 0 : curFile / fileCount;
}
public function new() {}
}
class ZipReader extends Reader {
public var files:List<Entry>;
public override function read() {
if (files != null) return files;
try {
var files = super.read();
return this.files = files;
} catch(e) {
}
return new List<Entry>();
}
}
class ZipWriter extends Writer {
public function flush() {
o.flush();
}
public function writeFile(entry:Entry) {
writeEntryHeader(entry);
o.writeFullBytes(entry.data, 0, entry.data.length);
}
public function close() {
o.close();
}
}
class StrNameLabel {
public var name:String;
public var label:String;
public function new(name:String, label:String) {
this.name = name;
this.label = label;
}
}
+100
View File
@@ -1,5 +1,15 @@
package funkin.updating;
import haxe.zip.Reader;
import funkin.system.ZipUtils;
import haxe.io.Path;
import openfl.utils.ByteArray;
import sys.io.File;
import sys.io.FileOutput;
import openfl.events.Event;
import openfl.events.ProgressEvent;
import openfl.net.URLRequest;
import openfl.net.URLLoader;
import sys.FileSystem;
import funkin.github.GitHubRelease;
@@ -15,13 +25,98 @@ class AsyncUpdater {
}
#end
#if windows
public var executableGitHubName:String = "update-windows.exe";
public var executableName:String = "CodenameEngine.exe";
#end
#if linux
public var executableGitHubName:String = "update-linux";
public var executableName:String = "CodenameEngine";
#end
public var releases:Array<GitHubRelease>;
public var progress:UpdaterProgress = new UpdaterProgress();
public var path:String;
public var downloadStream:URLLoader;
public function installUpdates() {
prepareInstallationEnvironment();
downloadFiles();
}
public function installFiles(files:Array<String>) {
progress.step = INSTALLING;
for(e in files) {
var path = '$path$e';
trace('extracting file ${path}');
var reader = ZipUtils.openZip(path);
progress.curZipProgress = new ZipProgress();
ZipUtils.uncompressZip(reader, './', null, progress.curZipProgress);
}
}
public function downloadFiles() {
var files:Array<String> = [];
var fileNames:Array<String> = [];
var exePath:String = "";
for(r in releases) {
for(e in r.assets) {
if (e.name.toLowerCase() == "update-assets.zip") {
files.push(e.browser_download_url);
fileNames.push('${Path.withoutExtension(e.name)}-${r.tag_name}.${Path.extension(e.name)}');
} else if (e.name.toLowerCase() == executableGitHubName) {
exePath = e.browser_download_url;
}
}
}
progress.curFile = 0;
progress.files = files.length;
progress.step = DOWNLOADING_ASSETS;
trace('starting assets download');
doFile([for(e in files) e], [for(e in fileNames) e], function() {
progress.curFile = 0;
progress.files = 1;
progress.step = DOWNLOADING_EXECUTABLE;
trace('starting exe download');
// doFile([exePath], [executableName], function() {
trace('done, starting installation');
installFiles(fileNames);
// });
});
}
public function doFile(files:Array<String>, fileNames:Array<String>, onFinish:Void->Void) {
var f = files.shift();
if (f == null) {
onFinish();
return;
}
var fn = fileNames.shift();
trace('downloading $f ($fn)');
progress.curFile++;
downloadStream = new URLLoader();
downloadStream.dataFormat = BINARY;
downloadStream.addEventListener(ProgressEvent.PROGRESS, function(e) {
progress.bytesLoaded = e.bytesLoaded;
progress.bytesTotal = e.bytesTotal;
trace('${progress.bytesLoaded} / ${progress.bytesTotal}');
});
downloadStream.addEventListener(Event.COMPLETE, function(e) {
var fileOutput:FileOutput = File.write('$path$fn', true);
var data:ByteArray = new ByteArray();
downloadStream.data.readBytes(data, 0, downloadStream.data.length - downloadStream.data.position);
fileOutput.writeBytes(data, 0, data.length);
fileOutput.flush();
fileOutput.close();
doFile(files, fileNames, onFinish);
});
downloadStream.load(new URLRequest(f));
}
public function prepareInstallationEnvironment() {
@@ -39,6 +134,11 @@ class AsyncUpdater {
class UpdaterProgress {
public var step:UpdaterStep = PREPARING;
public var curFile:Int = 0;
public var files:Int = 0;
public var bytesLoaded:Float = 0;
public var bytesTotal:Float = 0;
public var curZipProgress:ZipProgress = null;
public function new() {}
}