Github repository (you can also see history releases here)
Save the game with the 2.99999 version should clean up the relic from old version.
2.99999 has the same code as 3.1.1b but will not be further updated
Purpose
Native incompatibility support
Modded hullmod can now be identified by vanilla hullmods to be listed as incompatible
Phase Lib
10 modifiers added to phase ships allowing for more dynamic phase gameplays
Various Effect Supports
Fighter Wing induced effect, Weapon induced effect and hullmod onInstall / onRemove implementations
Dynamic Ship Generation
Allows generating new ship or fighters on the fly
For players
Download the mod and enable it.
You can go to data/config/settings.json to disable cross mod checks
For modders
For example, adding tag “vEx_safetyoverrides” allows a player with concord to automatically enjoy the native incompatibility check, marking your hullmod to be incompatible with Safety Overrides, while a player without concord can still use your mod as usual.
Check "Implement compatibility check without coding" section and Codex for available tags.
This implementation allows your mod to get full benefit of concord checks while not requiring any dependency to concord. A player can use your mod without concord just fine.
Check the following section and Codex for available tags.
,concord_targetingunit,0,,,"auto_concord, vEx_targeting_unit",,0,,TRUE,,0,0,0,0,org.sutopia.starsector.mod.concord.adv.DataEnactDomain,,,
For your hullmod that wishes to implement CONCORD, create a new line in hullmods.csv
- id is in format of “concord_{originalHullmodId}”
- it must include “auto_concord” tag
- add tags formatted in “vEx_{topic}” or “dEx_{hullmodId}” to configure incompatibility
- the script should be the same as example code
vEx: Topic leaders, all leaders in the same topic are mutual exclusive to each other
For example, if you want to make a custom targeting unit, add tag “vEx_targeting_unit”
You can use arbitrary string as topic
dEx: Followers, share the same incompatibility with the leader hullmod
For example, if you want to make a hullmod that leans toward adaptive phase coil, add tag “dEx_adaptive_coils”
Your chosen leader must be a valid hullmod ID
If you’re overriding isApplicableToShip and applyEffectsAfterShipCreation, make sure to call super first for the library to do all the heavy weight lifting.
Similarly, be careful when overriding getUnapplicableReason
Vanilla hullmod incompatibility
Add tag formatted as “vEx_{hullmodId}”
For example, if a hullmod should be incompatible with safety override, add tag “vEx_safetyoverrides”
This will automatically list other mods’ hullmod with same restriction as incompatible
percent_range_mod: incompatible with ITU, DTC and the likephase_mutator: incompatible with both vanilla phase hullmods because they're currently incompatible with each other
Generic hullmod incompatibility
Override method
public Set getCustomMutualExclusiveTags()
All hullmods with any tag added in the set will be mutual exclusive to each other.
[/su_spoiler]
org.sutopia.starsector.mod.concord.phase.ConcordModStats
To modify a status, call
stats.getDynamic().getMod([dynamic status ID])
These effects apply to ALL ships using vanilla phase script
com.fs.starfarer.api.impl.combat.PhaseCloakStats
org.sutopia.starsector.mod.concord.api.TrackedHullmodEffect
They will be called during
public void applyEffectsAfterShipCreation(ShipAPI ship, String id)
by ConcordCaptain
org.sutopia.starsector.mod.concord.api.GlobalTransientHullmod
org.sutopia.starsector.mod.concord.api.SelectiveTransientHullmod
Implementing either of the interface for your hullmod will make it globally apply BUT does not save in save files
i.e. a player can safely remove your mod from the game if your mod is only adding hullmods
org.sutopia.starsector.mod.concord.api.WeaponInducedEffect
org.sutopia.starsector.mod.concord.api.FighterInducedEffect
Implementing the interface will allow ConcordCaptain to apply the effects for you.
The ID parameter is passed in with your weapon or wing id as suffix so it’s properly recognized by the game.
If you are introducing effects to something not owned by you, change the ID parameter to prevent overwriting others’ effects.
- Adding ship hull spec on the fly (.skin)
- Adding ship variant spec on the fly (.variant)
- Adding fighter spec on the flt (wing_data.csv)
- Added try catch for unorthodox hullmod effects
- Fixed java 8 security exception
3.5.2a 2022/03/12
- Fixed an issue with variant name accidentally adding _Hull as suffix
- Fixed transient hullmod logic, now this mod is truly removable from a save
3.5.1c 2022/03/11
- Fixed JRE8 method access issue
3.5.1a 2022/03/11
- Added Black Ops
- Added numerous APIs for spec manipulations
- Use ConcordCovert at your own risk
3.1.1a 2022/02/26
- Cleanup ConcordCaptain on player exiting market and player finishing battle to reduce memory usage
3.1.0a 2022/02/26
- Added SelectiveTransientHullmod interface
- Added WeaponInducedEffect interface
- Added FighterInducedEffect interface
- Fixed an issue with ship identification for TrackedHullmodEffect
3.0.1a 2022/02/26
- added GlobalTransientHullmod
3.0.0a 2022/02/26
- Total revamp of hullmod injection and phase injection
- Completed phase modification effect interface
2.2.2a 2022/02/22
- Fixed improper unhidden issue
- Fixed phase displaying as special system
2.2.1c 2022/02/22
- Fixed improper hidden issue
2.2.0a 2022/02/20
- Improved parsing performance for S-mod
2.1.6a 2022/02/17
- Tokenized string
- Moved two classes to separate package
- Cached blacklist
- Retired ConcordCommander, no more everyframe script
2.1.5a 2022/02/17
- Fixed my fat finger
2.1.4a 2022/02/17
- Fixed console command compatibility
- Presumably fixed progressive S-mod compatibility
2.1.0a 2022/02/17
- Fully fixed mission and campaign duplicate display
- Fully fixed S-mod display issue
- Added onInstall and onRemove interface
2.0.0a 2022/02/16
- Now supports concord implementation without library import and coding
- Now supports vanilla hullmod implicit incompatibility detection, no more placeholders
- No CSV replacement performed, compatible with [Better Deserved S-Mods]
1.4.0a 2022/02/13
- Added multi ship compatibility to prevent cheese re-add
1.3.0b 2022/02/13
- Added more informative description about the exact conflicts
- Moved the incompatible check to the applyEffectsAfterShipCreation
- Added auto re-add for vanilla incompatible injection (and theory crafting how it can break)
1.2.0 2022/02/11
- Added configuration to turn off cross mod check
- Added auto hullmod replacement with style
1.1.1 2022/02/01
- Added methods for finer getters
- More helpful default getUnapplicableReason
1.1.0 2022/01/30
- Added tag for common multi incompatibility
1.0.0 2022/01/28
- Initial release

Also, I could see how modders would want both unidirectional (non-mutual) and bidirectional (mutual) exclusions. Both for automatic via tag, and via custom methods.
So perhaps:
vEx_safetyoverrides < this hullmod will be incompatible only with safety overrides but not other incompatible hullmods
vExMutual_safetyoverrides < this hullmod plus all hullmods that are incompatible with safety overrides
With:
public Set getCustomExclusiveTags();/* just the hullmod with these tags */
public Set getCustomMutualExclusiveTags();/* hullmod with these tags and other hullmods that are blocked by these tags */
Github link with no sources. Boo. Show us the code, so we can see a bit more
Also, I could see how modders would want both unidirectional (non-mutual) and bidirectional (mutual) exclusions. Both for automatic via tag, and via custom methods.
So perhaps:
vEx_safetyoverrides < this hullmod will be incompatible only with safety overrides but not other incompatible hullmods
vExMutual_safetyoverrides < this hullmod plus all hullmods that are incompatible with safety overridesWith:
Codepublic Set
getCustomExclusiveTags();/* just the hullmod with these tags */
public SetgetCustomMutualExclusiveTags();/* hullmod with these tags and other hullmods that are blocked by these tags */
I wrapped the source in the jar but I agree that'll be easier to track, updated github with src
I can't really wrap my head around wanting to be incompatible with safety override but not other mods with such incompatibility, since that's the very purpose of this mod.
It can easily be other hullmods, for example, a modified version of ITU. In such case, you don't want other mods providing their targeting unit to be compatible with yours otherwise it can immediately create some 200% range abomination. Most mods try to avoid this by restricting such hullmods to their own faction of ships which I find uninteresting; If such hullmod is public it deters new implementations of hullmods in same fields due to them easily stack and become OP.
Hello, I have download the mod but it does not appear among the mod list to enable it.
It's current name in mod list is Mod Concord.
I've updated the name to be consistent with post title and, should now be easier to find.
At a first glance this looks like a clean implementation (tag based systems are great), but if I may ask is there a reason to use this instead of MagicLib's hullmod incompatibility features?
I think Sutopia answers it here:
However, there is currently no cross-mod compatibility check available, allowing for insane hullmod stackings.
So for example, if mod A has some variant of SO, call it SO_A, that's incompatible with SO, and mod B has a different variant of SO, say SO_B, that's also incompatible with SO, it's unlikely that SO_A and SO_B will be incompatible with each other unless the mod authors of A and B explicitly communicate and add specific exceptions to their respective hull mods' applicability code.
- When adding an incompatible vanilla hull mod, Concord doesn't let me know what hull mod(s) it's incompatible with before turning it red.
- Similarly, if all of the conflicting hull mods are removed, the red vanilla "incompatible" hull mod should go away.
- IMO the biggest issue is that the replace-vanilla-hullmod-with-incompatible-marker behavior is happening inside the isApplicableToShip method. I don't think this is the right place to do this, for two reasons. The first is that isApplicableToShip should not have side effects as it's just a boolean "checker" method. The second is that there's no guarantee that isApplicableToShip will be called after the hull mod has already been installed. In the particular case of adding a hull mod in the refit screen, this behavior works because the base game has to call isApplicableToShip on every hull mod in order to update the GUI button (turn the text orange if it's not applicable). In the general case (i.e. if a mod has its own way to add hull mods, or adds a vanilla hull mod to a ship outside of the refit screen), the sequence is check if applicable -> apply if not unapplicable, which your mod won't catch if the hull mod in question is a vanilla hull mod. MagicLib does the incompatibility check in applyEffectsAfterShipCreation, which I think is a good candidate.
I think the best solution would be for the base game to implement a similar functionality to what you've done: have a set of exclusive tags such that a ship can only have one hull mod from each exclusive tag. Modders could make their custom hull mods incompatible with vanilla hull mods by adding custom exclusive tags to vanilla hull mods on application launch. In fact, I think most of this functionality is already there (see: shipHasOtherModInCategory).
When adding an incompatible vanilla hull mod, Concord doesn't let me know what hull mod(s) it's incompatible with before turning it red.
Update coming soon (TM)
Updated
Similarly, if all of the conflicting hull mods are removed, the red vanilla "incompatible" hull mod should go away.
Not possible due to S-modding exist, so it should be up to users removing the incompatible hullmod.
I've been bugged by vanilla doing this:
I add a mod hullmod that is an ITU equivalentITU seems perfectly fine so I put ITU inITU is in but bumps out the now isApplicable false mod hullmod
Update: I kinda see what you mean. It now adds back the conflicted vanilla hullmod should mod hullmod get removed.
Put logic in applyEffectAfterShipCreation
Can do that
Done
About base game
Since fitting already is checking isApplicable, it shouldn't be expensive to do a round of temporary "Add hullmod" variants, populate and examine if the tentative add hullmod operation putting any hullmod isApplicable into false state, and thus is able to detect reverse incompatibility. Tag based is much easier to do but it would be nice to have a fail safe fallback.
Magiclib requires O(n^2) work for all the cross-incompatibilities while CONCORD only requires O(n) and much less likely to miss the function calls.
Not that it matters for most existing mods to switch over since most of them already extra guard their creations not applicable to not-same-mod ships;
The mod is mainly providing a breeding ground for future mods to not need to hold back their creations from having unnecessary restrictions in fear of "breaking the game".

Known issue: The first mod that removes the vanilla hullmod registers as the incompatible and doesn't actually populate the full list for hullmod placeholder
WIP to solve: multi incompatibility registration and logistic-like modification limit
I downloaded and enabled this mod and for some reason I'm seeing 2 of every hullmod
For missions you need to strip the ship for it to work. The underlying code relies on a hidden hullmod to dynamically change which one you see. Regardless of which one you’re using it’s the same one on the ship.
Actually, let me fix that as well (variant update). Updated
I downloaded and enabled this mod and for some reason I'm seeing 2 of every hullmod
For missions you need to strip the ship for it to work. The underlying code relies on a hidden hullmod to dynamically change which one you see. Regardless of which one you’re using it’s the same one on the ship.
Actually, let me fix that as well (variant update). Updated
Thanks.
It seems to let me install 2 of each hullmod as a result, though some will be labeled as (S) while others won't be. The green markers also do not appear unless the ship is selected in the refit section.