@@ -30,7 +30,12 @@ static func handle_script_extensions() -> void:
30
30
# a script extending script B if A is an ancestor of B.
31
31
class InheritanceSorting :
32
32
var stack_cache := {}
33
-
33
+ var load_order_table := {}
34
+ var unpacked_dir = _ModLoaderPath .get_unpacked_mods_dir_path ()
35
+
36
+ func _init ():
37
+ _populate_load_order_table ()
38
+
34
39
# Comparator function. return true if a should go before b. This may
35
40
# enforce conditions beyond the stated inheritance relationship.
36
41
func _check_inheritances (extension_a : String , extension_b : String ) -> bool :
@@ -72,17 +77,17 @@ class InheritanceSorting:
72
77
# Secondary comparator function for resolving scripts extending the same vanilla script
73
78
# Will return whether a comes before b in the load order
74
79
func compare_mods_order (extension_a :String , extension_b :String )-> bool :
75
- var mod_a_id = extension_a . trim_prefix ( _ModLoaderPath . get_unpacked_mods_dir_path ()). get_slice ( "/" , 0 )
76
- var mod_b_id = extension_b . trim_prefix ( _ModLoaderPath . get_unpacked_mods_dir_path ()). get_slice ( "/" , 0 )
80
+ var mod_a_id : String = ModLoaderUtils . get_string_in_between ( extension_a , unpacked_dir , "/" )
81
+ var mod_b_id : String = ModLoaderUtils . get_string_in_between ( extension_b , unpacked_dir , "/" )
77
82
83
+ return load_order_table [mod_a_id ] < load_order_table [mod_b_id ]
84
+
85
+ # Populate a load order dictionary for faster access and comparison between mod ids
86
+ func _populate_load_order_table () -> void :
87
+ var mod_index := 0
78
88
for mod in ModLoaderStore .mod_load_order :
79
- if mod .dir_name == mod_a_id :
80
- return true
81
- elif mod .dir_name == mod_b_id :
82
- return false
83
-
84
- # Should never happen
85
- return extension_a < extension_b
89
+ load_order_table [mod .dir_name ] = mod_index
90
+ mod_index += 1
86
91
87
92
88
93
static func apply_extension (extension_path : String ) -> Script :
0 commit comments