Simple idea for the mod-loader interface:
If a mod requires another mod to function (check to see if it calls a JAR(s) that aren't in starsector_core and isn't in the mods /jars path) then:
If the JAR(s) aren't loaded by any other mod currently selected then:
If the JAR(s) are available in another mod that isn't currently selected then:
Alert the end-user that the mod requires the JAR(s) via a UI message, and the JAR is present in (other mod).
Else:
Alert the end-user that the mod won't function unless the JAR(s) are present.
This should cut down on the problems we see with people trying to load up a mod that requires another mod, which is likely to get worse over time.
As an alternative, although this is a little more complicated:
Mods could declare a "dependentOn" JSONArray that indicates a mod that they're dependent upon. Activating the mod will also activate the mod it's dependent upon, if present, or halt, with a UI message indicating that it's not present.
So, for example, a mod that requires LazyLib, LightShow and the FX Core would have a JSON entry in it like:
dependentOn:[
"lw_lazylib",
"$$$_lightshowVanilla",
"xxx_ss_FX_mod",
]
This issue's getting more and more prevalent; while it used to be merely sufficient to presume that "all mods will probably use LazyLib, so therefore LazyLib will be loaded" I think that we'll eventually have growing pains with this issue as more mods intended to support different behaviors but do nothing by themselves become available.
For example, I think that I'd separate the core of the AI Overhaul from the part that forces AI profiles, etc., if this kind of thing wasn't potentially causing confusion, which would probably help people wanting to develop sub-AI behaviors, etc, as they wouldn't need to wrestle with everything in that code, just a few things.