Skip to content

Commit e75c045

Browse files
authored
refactor: use GDRE for self setup (#533)
* refactor: 🚧 WIP: use GDRE * refactor: ♻️ added new --embed param * refactor: ♻️ added GDRE download step Moved the setup to a setup scene. This setup scene is loaded by the `--script`. * Revert "refactor: ♻️ added GDRE download step" This reverts commit 95ce66c. * refactor: ♻️ `--headless` * chore: 🔥 remove pck explorer license
1 parent a165641 commit e75c045

File tree

2 files changed

+55
-98
lines changed

2 files changed

+55
-98
lines changed

addons/mod_loader/mod_loader_setup.gd

Lines changed: 55 additions & 77 deletions
Original file line numberDiff line numberDiff line change
@@ -97,7 +97,8 @@ func reorder_autoloads() -> void:
9797
original_autoloads[name] = value
9898

9999
ModLoaderSetupLog.info(
100-
"Start reorder autoloads current state: %s" % JSON.stringify(original_autoloads, "\t")
100+
"Start reorder autoloads current state: %s" % JSON.stringify(original_autoloads, "\t"),
101+
LOG_NAME
101102
)
102103

103104
for autoload in original_autoloads.keys():
@@ -123,7 +124,8 @@ func reorder_autoloads() -> void:
123124
new_autoloads[name] = value
124125

125126
ModLoaderSetupLog.info(
126-
"Reorder autoloads completed - new state: %s" % JSON.stringify(new_autoloads, "\t")
127+
"Reorder autoloads completed - new state: %s" % JSON.stringify(new_autoloads, "\t"),
128+
LOG_NAME
127129
)
128130

129131

@@ -145,6 +147,10 @@ func handle_override_cfg() -> void:
145147

146148
# Creates the project.binary file, adds it to the pck and removes the no longer needed project.binary file.
147149
func handle_injection() -> void:
150+
var is_embedded: bool = not FileAccess.file_exists(path.pck)
151+
var injection_path: String = path.exe if is_embedded else path.pck
152+
var file_extension := injection_path.get_extension()
153+
148154
ModLoaderSetupLog.debug("Start injection", LOG_NAME)
149155
# Create temp dir
150156
ModLoaderSetupLog.debug('Creating temp dir at "%s"' % path.temp_dir_path, LOG_NAME)
@@ -167,83 +173,59 @@ func handle_injection() -> void:
167173
DirAccess.make_dir_recursive_absolute(path.temp_dir_path.path_join(".godot"))
168174
# Save the global class cache config file
169175
combined_global_script_class_cache_file.save(path.temp_global_script_class_cache_path)
170-
get_pck_version()
171-
# Check if .pck is embedded split it from the .exe
172-
if not FileAccess.file_exists(path.pck):
173-
split_pck()
174176

175-
inject()
177+
inject(injection_path, is_embedded)
176178

177179
# Rename vanilla
178-
DirAccess.rename_absolute(
179-
path.pck,
180-
path.pck.trim_suffix("%s.pck" % file_name.pck).path_join("%s-vanilla.pck" % file_name.pck)
181-
)
182-
ModLoaderSetupLog.debug(
183-
(
184-
'Renamed "%s" to "%s"'
185-
% [
186-
path.pck,
187-
path.pck.trim_suffix("%s.pck" % file_name.pck).path_join(
188-
"%s-vanilla.pck" % file_name.pck
189-
)
190-
]
191-
),
192-
LOG_NAME
193-
)
194-
# Rename modded
195-
DirAccess.rename_absolute(
196-
path.game_base_dir.path_join("%s-modded.pck" % file_name.pck),
197-
"%s.pck" % path.game_base_dir.path_join(file_name.pck)
198-
)
199-
ModLoaderSetupLog.debug(
200-
(
201-
'Renamed "%s" to "%s"'
202-
% [
203-
path.game_base_dir.path_join("%s-modded.pck" % file_name.pck),
204-
"%s.pck" % path.game_base_dir.path_join(file_name.pck)
205-
]
206-
),
207-
LOG_NAME
208-
)
180+
var modded_path := "%s-modded.%s" % [injection_path.get_basename(), file_extension]
181+
var vanilla_path := "%s-vanilla.%s" % [injection_path.get_basename(), file_extension]
209182

210-
clean_up()
183+
DirAccess.rename_absolute(injection_path, vanilla_path)
184+
ModLoaderSetupLog.debug('Renamed "%s" to "%s"' % [injection_path, vanilla_path], LOG_NAME)
211185

186+
# Rename modded
187+
DirAccess.rename_absolute(modded_path, injection_path)
188+
ModLoaderSetupLog.debug('Renamed "%s" to "%s"' % [modded_path, injection_path], LOG_NAME)
212189

213-
func get_pck_version() -> String:
214-
var engine_version_info := Engine.get_version_info()
215-
# Godot 4 pck version always starts with a 2 (at least for now).
216-
var pck_version := (
217-
"2.%s.%s.%s"
218-
% [engine_version_info.major, engine_version_info.minor, engine_version_info.patch]
219-
)
220-
ModLoaderSetupLog.debug("The pck version is: %s" % pck_version, LOG_NAME)
221-
return pck_version
190+
clean_up()
222191

223192

224193
# Add modified binary to the pck
225-
func inject(pck_version: String = get_pck_version()) -> void:
226-
var arguments := [
227-
"-pc",
228-
path.pck,
229-
path.temp_dir_path,
230-
path.game_base_dir.path_join("%s-modded.pck" % file_name.pck),
231-
pck_version
232-
]
233-
ModLoaderSetupLog.debug(
234-
"Injecting temp dir content into .pck: %s %s", [path.pck_explorer, arguments], LOG_NAME
194+
func inject(injection_path: String, is_embedded := false) -> void:
195+
var arguments := []
196+
arguments.push_back("--headless")
197+
arguments.push_back("--pck-patch=%s" % injection_path)
198+
if is_embedded:
199+
arguments.push_back("--embed=%s" % injection_path)
200+
arguments.push_back(
201+
"--patch-file=%s=%s" % [path.temp_project_binary_path, path.project_binary_path_internal]
235202
)
236-
# For unknown reasons the output only displays a single "[" - so only the executed arguments are logged.
237-
var _exit_code_inject := OS.execute(path.pck_explorer, arguments)
238-
239-
240-
func split_pck() -> void:
241-
var arguments := ["-s", path.exe]
242-
ModLoaderSetupLog.debug(
243-
"Splitting .pck from .exe: %s %s", [path.pck_explorer, arguments], LOG_NAME
203+
arguments.push_back(
204+
(
205+
"--patch-file=%s=%s"
206+
% [
207+
path.temp_global_script_class_cache_path,
208+
path.global_script_class_cache_path_internal
209+
]
210+
)
211+
)
212+
arguments.push_back(
213+
(
214+
"--output=%s"
215+
% path.game_base_dir.path_join(
216+
(
217+
"%s-modded.%s"
218+
% [file_name[injection_path.get_extension()], injection_path.get_extension()]
219+
)
220+
)
221+
)
244222
)
223+
245224
# For unknown reasons the output only displays a single "[" - so only the executed arguments are logged.
246-
var _exit_code_split_pck := OS.execute(path.pck_explorer, arguments)
225+
ModLoaderSetupLog.debug("Injection started: %s %s" % [path.gdre, arguments], LOG_NAME)
226+
var output := []
227+
var _exit_code_inject := OS.execute(path.gdre, arguments, output)
228+
ModLoaderSetupLog.debug("Injection completed: %s" % output, LOG_NAME)
247229

248230

249231
# Removes the temp files
@@ -268,17 +250,15 @@ func setup_file_data() -> void:
268250
path.game_base_dir = ModLoaderSetupUtils.get_local_folder_dir()
269251
# C:/path/to/game/addons/mod_loader
270252
path.mod_loader_dir = path.game_base_dir + "addons/mod_loader/"
271-
path.pck_explorer = (
272-
path.mod_loader_dir
273-
+ get_pck_explorer_path()
274-
)
275-
# ! pck explorer doesn't like trailing `/` in a path !
253+
path.gdre = path.mod_loader_dir + get_gdre_path()
276254
path.temp_dir_path = path.mod_loader_dir + "setup/temp"
277255
path.temp_project_binary_path = path.temp_dir_path + "/project.binary"
278256
path.temp_global_script_class_cache_path = (
279257
path.temp_dir_path
280258
+ "/.godot/global_script_class_cache.cfg"
281259
)
260+
path.global_script_class_cache_path_internal = "res://.godot/global_script_class_cache.cfg"
261+
path.project_binary_path_internal = "res://project.binary"
282262
# can be supplied to override the exe_name
283263
file_name.cli_arg_exe = ModLoaderSetupUtils.get_cmd_line_arg_value("--exe-name")
284264
# can be supplied to override the pck_name
@@ -347,13 +327,11 @@ func get_combined_global_script_class_cache() -> ConfigFile:
347327
return global_script_class_cache_combined
348328

349329

350-
func get_pck_explorer_path() -> String:
351-
var pck_explorer_path := "vendor/GodotPCKExplorer/GodotPCKExplorer.Console"
352-
330+
func get_gdre_path() -> String:
353331
if OS.get_name() == "Windows":
354-
return "%s.exe" % pck_explorer_path
332+
return "vendor/GDRE/gdre_tools.exe"
355333

356-
return pck_explorer_path
334+
return ""
357335

358336

359337
func restart() -> void:

addons/mod_loader/vendor/GodotPCKExplorer/GodotPCKExplorer.Console-LICENSE

Lines changed: 0 additions & 21 deletions
This file was deleted.

0 commit comments

Comments
 (0)