Advice for making a UE4 project moddable/UGC?

Hi, I’ve been working on a UE4 project where I’m trying to remake a flash game. And turn their mods into modules that you mix and match to make Modpacks with them. I also want people to be able to make their own mods for the game. The problem is some of the mods modify the same classes such as the player character and I’m not sure how to achieve my goal.

Here are the potential ways I’ve found to mod a ue4 project. The first is to use ue4 DLC/patch system using plugins as shown in the Tom Looman guide. I like the look of this one, but I’m wondering if I can use two patches to modify the same function or class without them overriding each other.
The second is to soft code as many things as possible. Through I can see you being able to maybe replace class variables with a data table that you can load from memory, how would you soft code item branching? Like if my item has two different effects depending on Player stats.
The third is to use plugins like SimpleUGC, the problem I came across with this was that I can’t find it. I tried looking it up and clicking on links on a ue4 forum page, but no luck does anyone know what happened to it?
The fourth is to package the editor with my project which I don’t really understand this one at all.

What I’m looking for in a modding solution is something that allows for the modification of the same class by multiple mods without them overriding each other and allows adding of new characters, maps etc does anyone have advice?

Sorry if this isn’t the place to post this.

Fundamentally, it’s not always possible to combine all possible modifications.
You run into the “unstoppable force, meet immovable object” problem – one must win!
If you define the API for your objects from scratch, you can use patterns that make this less problematic.

For example, you can use delegation instead of inheritance – the function to “set player velocity” or whatever, is actually a function (or method on an extension object) that takes a pointer to the base player, and a reference to the velocity to set, rather than just a method on the player. That way, you can call each mod override in turn, without having to make up an explicit inheritance chain.

As another example, you can broadcast upadtes to world state using a de-coupled event bus, where extensions listen for events of particular shapes (type, sender/receiver filters, location filter, etc.) That way, many extensions can listen for the same changes.

Of course, these changes may be hard to implement in a system that already has a strong opinion on how objects go together. And, even when you implement them, they have more runtime overhead: performance cost, memory cost, also implementation having to worry about which places are extension points. “Good moddability/extensions” is a feature, and every feature has a cost, so the trick is to achieve the right balance between “feature” and “cost” for what your needs/goals are. This is why we call it “engineering” :smiley: