Skip to content

Commit c85ce96

Browse files
committed
🚧 feat: mod hook packing prototype
1 parent 2a22ac3 commit c85ce96

File tree

2 files changed

+67
-3
lines changed

2 files changed

+67
-3
lines changed
Lines changed: 65 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,65 @@
1+
extends Node
2+
3+
4+
const ModHookPreprocessorScript := preload("res://addons/mod_loader/_export_plugin/mod_hook_preprocessor.gd")
5+
static var ModHookPreprocessor
6+
7+
8+
func _ready() -> void:
9+
run_script()
10+
await get_tree().process_frame
11+
get_tree().quit()
12+
13+
14+
func run_script() -> void:
15+
ModHookPreprocessor = ModHookPreprocessorScript.new()
16+
ModHookPreprocessor.process_begin()
17+
18+
# TODO: consider mac location
19+
var res := OS.get_executable_path().get_base_dir()
20+
if OS.has_feature("editor"):
21+
res = ProjectSettings.globalize_path("res://").rsplit("/", true, 2)[0]
22+
23+
var save_base_path := res.path_join("godot_mod_loader/temp_test_mod/")
24+
print(save_base_path)
25+
DirAccess.make_dir_recursive_absolute(save_base_path)
26+
27+
var zip_writer := ZIPPacker.new()
28+
var err := zip_writer.open(save_base_path + "temp_test_mod.zip")
29+
if err != OK:
30+
printerr(err)
31+
32+
transform_scripts_recursive(ModHookPreprocessor.process_script, zip_writer, save_base_path)
33+
34+
zip_writer.close()
35+
ZIPPacker
36+
37+
38+
func transform_scripts_recursive(callback: Callable, zip_writer: ZIPPacker, save_base: String, path := "res://") -> void:
39+
var dir := DirAccess.open(path)
40+
if not dir:
41+
printt("An error occurred when trying to access the path:", path)
42+
return
43+
44+
dir.list_dir_begin()
45+
var file_name = dir.get_next()
46+
while file_name != "":
47+
if path.begins_with("res://addons") or path.begins_with("res://mods-unpacked"):
48+
file_name = dir.get_next()
49+
continue
50+
51+
if dir.current_is_dir():
52+
transform_scripts_recursive(callback, zip_writer, save_base, dir.get_current_dir() + file_name + "/")
53+
file_name = dir.get_next()
54+
continue
55+
56+
if file_name.get_extension() != "gd":
57+
file_name = dir.get_next()
58+
continue
59+
60+
var processed: String = callback.call(dir.get_current_dir() + file_name)
61+
zip_writer.start_file(path.trim_prefix("res://").path_join(file_name))
62+
zip_writer.write_file(processed.to_utf8_buffer())
63+
zip_writer.close_file()
64+
65+
file_name = dir.get_next()

addons/mod_loader/_export_plugin/mod_hook_preprocessor.gd renamed to addons/mod_loader/internal/mod_hook_preprocessor.gd

Lines changed: 2 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -25,7 +25,7 @@ func process_script(path: String) -> String:
2525
var class_prefix := str(hash(path))
2626
var method_store: Array[String] = []
2727
var mod_loader_hooks_start_string := \
28-
"\n# ModLoader Hooks - The following code has been automatically added by the Godot Mod Loader export plugin.\n"
28+
"\n# ModLoader Hooks - The following code has been automatically added by the Godot Mod Loader export plugin."
2929

3030
var getters_setters := collect_getters_and_setters(source_code)
3131

@@ -189,8 +189,7 @@ static func get_mod_loader_hook(
189189
{%METHOD_RETURN_VAR%}{%METHOD_PREFIX%}_{%METHOD_NAME%}({%METHOD_ARGS%})
190190
if ModLoaderStore.any_mod_hooked:
191191
ModLoaderMod.call_hooks({%SELF%}, [{%METHOD_ARGS%}], {%HOOK_ID_AFTER%})
192-
{%METHOD_RETURN%}
193-
""".format({
192+
{%METHOD_RETURN%}""".format({
194193
"%METHOD_PREFIX%": method_prefix,
195194
"%METHOD_NAME%": method_name,
196195
"%METHOD_PARAMS%": method_arg_string_with_defaults_and_types,

0 commit comments

Comments
 (0)