Softmodding

Place to post guides, observations, things related to modding that are not mods themselves.
PyroFire
Filter Inserter
Filter Inserter
Posts: 356
Joined: Tue Mar 08, 2016 8:18 am
Contact:

Softmodding

Post by PyroFire »

The Softmod Mod: Introduces a ``hijack.lua`` that allows you to "softmod" a mod into your save files. Just don't forget to put ``require("hijack")`` at the end of your save files ``control.lua``
This is noteably useful for both multiplayer servers as they may distribute a modded save files but have the mods embedded in the save instead of syncing with mod portal, and with scenarios.
To add your mod to the save file, extract the mod to a folder (remove versions _0.x) and put it in the save .zip, then add the name of the folder to the top of ``hijack.lua`` in ``config.mod={"name","of","mods"}``.

And that's it.

Enjoy.
Let me know of any bugs.

Pros:
- Compatability with mod portal mods. You can just extract and forget.
- Saves, and scenarios can be distributed with included mods without the need for their players to syncronize their mods with the save. They're just embedded with the save. Easy.
- This also affects multiplayers: Have an almost "Modded" server, but zero mods to sync with mod portal, as they come with the save.

Cons:
- Softmodding has limitations: It cannot extend the data.raw and it cannot register settings. Although i cannot do anything about the data, i CAN simulate the "settings" registration, so that mods don't need to account for this issue - the hijack does this internally.
- Further Limitations: Mod portal mods ("Hard Mods") typically have their own lua environment. This means variables not declared as local will be shared between mods which is not normal. There is little i can do about this.
- Further Limitations: Because of the lua environments, the "global" table is given special treatment. All mods are forced to refer to a set table within their simulated environment. This helps to reduce any potential overlap or problems with the shared lua environment.
- There is however a global ``softmod`` variable that you can use to read your environment with ``softmod.environment`` (you can write to it too - please don't) for custom handling, which should never be needed.
- Mod updates currently are not managed, and updating a mod in your save must be done manually. This cannot be avoided - but it's also fairly easy. Just replace contents of the folder. No special handling beyond that required.

This may eventually be updated to manage migrations and version changes.
I make no promises.
Attachments
softmod-wizardry.zip
(2.85 MiB) Downloaded 121 times
Last edited by PyroFire on Mon Aug 26, 2019 5:03 am, edited 1 time in total.
User avatar
Klonan
Factorio Staff
Factorio Staff
Posts: 5266
Joined: Sun Jan 11, 2015 2:09 pm
Contact:

Re: Softmodding

Post by Klonan »

Why do you need a hijack.lua?

Just add another lib to the control.lua, and have it run with the base game event handler
User avatar
eradicator
Smart Inserter
Smart Inserter
Posts: 5207
Joined: Tue Jul 12, 2016 9:03 am
Contact:

Re: Softmodding

Post by eradicator »

Klonan wrote: Sun Aug 25, 2019 8:21 am Why do you need a hijack.lua?

Just add another lib to the control.lua, and have it run with the base game event handler
Presumably because if you just rename->copy->paste->require() a bunch of random modded control.lua files then they'll overwrite each others event registrations. And hijack seems to try to automatically wrap them by overwriting _ENV.script.on_event etc. and constructing a single event handler function.

I.e. "make a bunch of random mods work together in a shared lua-state without modifying each mod"
Author of: Belt Planner, Hand Crank Generator, Screenshot Maker, /sudo and more.
Mod support languages: 日本語, Deutsch, English
My code in the post above is dedicated to the public domain under CC0.
User avatar
Deadlock989
Smart Inserter
Smart Inserter
Posts: 2529
Joined: Fri Nov 06, 2015 7:41 pm

Re: Softmodding

Post by Deadlock989 »

PyroFire wrote: Sat Aug 24, 2019 9:08 pm Cons:
- Softmodding has limitations: It cannot extend the data.raw
This is a limitation in the same way that Everest is a mountain.
PyroFire
Filter Inserter
Filter Inserter
Posts: 356
Joined: Tue Mar 08, 2016 8:18 am
Contact:

Re: Softmodding

Post by PyroFire »

eradicator wrote: Sun Aug 25, 2019 9:15 am Presumably because if you just rename->copy->paste->require() a bunch of random modded control.lua files then they'll overwrite each others event registrations. And hijack seems to try to automatically wrap them by overwriting _ENV.script.on_event etc. and constructing a single event handler function.
Exactly this.
It should contain an override for _ENV too but i didn't know about that while writing it.
User avatar
eradicator
Smart Inserter
Smart Inserter
Posts: 5207
Joined: Tue Jul 12, 2016 9:03 am
Contact:

Re: Softmodding

Post by eradicator »

PyroFire wrote: Mon Aug 26, 2019 5:01 am
eradicator wrote: Sun Aug 25, 2019 9:15 am Presumably because if you just rename->copy->paste->require() a bunch of random modded control.lua files then they'll overwrite each others event registrations. And hijack seems to try to automatically wrap them by overwriting _ENV.script.on_event etc. and constructing a single event handler function.
Exactly this.
It should contain an override for _ENV too but i didn't know about that while writing it.
I've tried something vaguely similar before, It's a very deep rabbit hole and i haven't seen the bottom yet.
Author of: Belt Planner, Hand Crank Generator, Screenshot Maker, /sudo and more.
Mod support languages: 日本語, Deutsch, English
My code in the post above is dedicated to the public domain under CC0.
PyroFire
Filter Inserter
Filter Inserter
Posts: 356
Joined: Tue Mar 08, 2016 8:18 am
Contact:

Re: Softmodding

Post by PyroFire »

eradicator wrote: Mon Aug 26, 2019 7:59 am I've tried something vaguely similar before, It's a very deep rabbit hole and i haven't seen the bottom yet.
If you were to add _ENV overrides, they would go where the softmod.environment and softmod.inscript is, or you would give _ENV a metatable that checks the _trueENV.softmod.environment and indexes/newindexes with softmod._env[softmod.environment], with a fallback index to _trueENV.
The current override for the "global" table already does something similar to this.
I don't think it's needed, but easily done.

By resetting to the previous setting, it'll eventually revert back to the defaults ("global" and inscript=false) when all the scripts are done executing.
The problem is catching all cases similar to script.raise_event where it can jump to multiple different environments.
remote.call is similar, and that should probably be overridden too for the same reason (currently isn't) so softmods that call remotes don't break.
Attachments
hijack.lua
the bottom of the rabbit hole
(9.13 KiB) Downloaded 105 times
icon256
Burner Inserter
Burner Inserter
Posts: 7
Joined: Mon Dec 18, 2017 7:55 pm
Contact:

Re: Softmodding

Post by icon256 »

Hi all,

I have experimented with this. I attempted to add several mods - each individual at at one time. Some real basic ones like playtime, and enhanced map color while some others too; and it doesn't seem to take as I followed the initial OP instructions. I even got it to not error out as I loaded the save file correctly as I added the mods to the hijack.lua config and added the mods to the zip file. Not sure if I'm doing something wrong or missing something. I want to say it had to be working at some point for the OP and since it's recent enough in august of 2019; however the thread seemed to be dead - which to me indicates that somehow this may have been obsolete or non-working to begin with. I will keep on trying this to see what it will work with, but so far, I've yet to get the any feature of the mod working. Any clue, or feedback is welcomed. Just figured I'd give some feedback since I tried it, and seems like a fantastic idea to be able to integrate regular mods into softmods if this could work. Thanks all.
User avatar
kizrak
Long Handed Inserter
Long Handed Inserter
Posts: 76
Joined: Thu Jul 19, 2018 1:27 am
Contact:

Re: Softmodding

Post by kizrak »

Not all mods are soft-moddable. Actually, very very few are. Among other things, any mod that has a data.lua, or data*.lua won't work. Also, mods that use the events on_init or on_load or on_configuration_changed (or maybe few other) won't work. And I'm sure there are a few other edge cases that would prevent a mod from being soft-modded.
icon256
Burner Inserter
Burner Inserter
Posts: 7
Joined: Mon Dec 18, 2017 7:55 pm
Contact:

Re: Softmodding

Post by icon256 »

Hi there,

Yes,I kept that all in mind from the OP about the data.lua and or event factors; and have read throughly in-depth the con list. I’m just not seeing any compatibility with any mods that I have attempted. I almost feel like I’m missing something. Maybe it’s just the mods that have those compatibility factors that I have tried so far like you said. I’m curious though now, and begs to question, which mods do actually work if you don’t mind to name a few? I’m an avid game host within the community and actually very familiar with modding / debugging lua code for many scenarios, to give you a quick background if that helps. Which is why it frustrates me to not be able to use this for simple softmodding. Thanks for quick reply.
kizrak wrote: Fri Jan 10, 2020 3:42 am Not all mods are soft-moddable. Actually, very very few are. Among other things, any mod that has a data.lua, or data*.lua won't work. Also, mods that use the events on_init or on_load or on_configuration_changed (or maybe few other) won't work. And I'm sure there are a few other edge cases that would prevent a mod from being soft-modded.
User avatar
kizrak
Long Handed Inserter
Long Handed Inserter
Posts: 76
Joined: Thu Jul 19, 2018 1:27 am
Contact:

Re: Softmodding

Post by kizrak »

Some of the very early versions of my mods https://mods.factorio.com/user/kizrak were soft-moddable, however I don't think any of newest releases for any of them are any more (if for no other reason than settings). Also, the old original deprecated long/far? reach was (can't find it anymore, but I remember using it during testing), or any modern version that doesn't have settings would probably work. Also a lot of the redmew/fishbus soft mods can be mixed-and-matched with hijack.lua (normally those soft mods don't play nice together). This is actually where most of the development for hijack came from, I was trying to integrate my own code into the redmew/fishbus frameworks and encountered issues with their/mine code un-registering the other's events. Because their "mods" are "softmods" and not on mods.factorio.com, the only way to get them is to join one of their servers, and save the map (which will include their soft-mods).

PyroFire might have more to add or know of some other mods on mods.factorio.com if he used any.

I think the bigger take away is that hijack is a concept one can use to allow multiple event handlers with less conflicts. However as I understand it (and I haven't experimented with it yet) the newest ...\Factorio\data\base\scenarios\freeplay\control.lua includes a way to do pretty much the same thing, and it was included by the Factorio Devs (sometime during 0.17.X's). That requires changing the code's event handling a bit, but is probably much better going forward. (Unless you are using some pre-0.17.32'ish(?) version that doesn't have that yet.)

If you want to see some really bad code, but my justification for the initial development of hijack, you could look through github > Auto-Zip-Inserter > saves for examples.
Honktown
Smart Inserter
Smart Inserter
Posts: 1041
Joined: Thu Oct 03, 2019 7:10 am
Contact:

Re: Softmodding

Post by Honktown »

Have you seen the comfyfactorio stuff? They have a lot of "modules" that get mixed and matched for different maps. There's a few conflicts I ran into (player_modifiers hard sets bonuses... ruining other mods or research effects). I have my own patch for that. I've had to edit my save file's lua files because some of the maps had errors or behavior I didn't like.

In terms of on_init/on_load/on_config_changed whatever events, there's ways around that, mostly in a slightly worse style, like if it's not defined in an on_tick function, then create it, but it comes out the same.
I have mods! I guess!
Link
icon256
Burner Inserter
Burner Inserter
Posts: 7
Joined: Mon Dec 18, 2017 7:55 pm
Contact:

Re: Softmodding

Post by icon256 »

Hi kizrak,

Thanks for the insight, much appreciated. I saw PyroFire pre-softmod two mods already. Been always using the latest 0.17.79 as of this message for any softmods integration. Hoping I can find some mods that will work, but I'm starting to realize this was more a good concept and pretext work in attempt to make softmods easier.
Redmew mods always seemed to be on Github so I never had to "steal" it from a save; as well explosive gaming, factorio RPG.

I will have to experiment more with the new code control.lua as you mentioned to quickly be able to softmod; however it will always be a imitation if Wubu software does not allow us to directly with data.raw, and other event handlers. Again, appreciate the insight! Happy softmodding!
kizrak wrote: Fri Jan 10, 2020 10:35 pm Some of the very early versions of my mods https://mods.factorio.com/user/kizrak were soft-moddable, however I don't think any of newest releases for any of them are any more (if for no other reason than settings). Also, the old original deprecated long/far? reach was (can't find it anymore, but I remember using it during testing), or any modern version that doesn't have settings would probably work. Also a lot of the redmew/fishbus soft mods can be mixed-and-matched with hijack.lua (normally those soft mods don't play nice together). This is actually where most of the development for hijack came from, I was trying to integrate my own code into the redmew/fishbus frameworks and encountered issues with their/mine code un-registering the other's events. Because their "mods" are "softmods" and not on mods.factorio.com, the only way to get them is to join one of their servers, and save the map (which will include their soft-mods).

PyroFire might have more to add or know of some other mods on mods.factorio.com if he used any.

I think the bigger take away is that hijack is a concept one can use to allow multiple event handlers with less conflicts. However as I understand it (and I haven't experimented with it yet) the newest ...\Factorio\data\base\scenarios\freeplay\control.lua includes a way to do pretty much the same thing, and it was included by the Factorio Devs (sometime during 0.17.X's). That requires changing the code's event handling a bit, but is probably much better going forward. (Unless you are using some pre-0.17.32'ish(?) version that doesn't have that yet.)

If you want to see some really bad code, but my justification for the initial development of hijack, you could look through github > Auto-Zip-Inserter > saves for examples.
icon256
Burner Inserter
Burner Inserter
Posts: 7
Joined: Mon Dec 18, 2017 7:55 pm
Contact:

Re: Softmodding

Post by icon256 »

Yes, I have seen comfyfactorio, though I admit, I have not checked or tried it recently within the last few months. I'll check them out again to see of any good code. Thanks all! Much appreciate it.
Honktown wrote: Fri Jan 10, 2020 11:55 pm Have you seen the comfyfactorio stuff? They have a lot of "modules" that get mixed and matched for different maps. There's a few conflicts I ran into (player_modifiers hard sets bonuses... ruining other mods or research effects). I have my own patch for that. I've had to edit my save file's lua files because some of the maps had errors or behavior I didn't like.

In terms of on_init/on_load/on_config_changed whatever events, there's ways around that, mostly in a slightly worse style, like if it's not defined in an on_tick function, then create it, but it comes out the same.
User avatar
kizrak
Long Handed Inserter
Long Handed Inserter
Posts: 76
Joined: Thu Jul 19, 2018 1:27 am
Contact:

Re: Softmodding

Post by kizrak »

I've only come across other people's soft-mods by accident, AKA joining some random public server and realizing it was running custom LUA. I really wish there was like *one* place that soft-modders could publish, like Wube has for hard mods. (And a way to search specifically for them, like some type of tag.) Or maybe there is and I just haven't stumbled upon it yet.

I'll have to look into explosive gaming, factorio RPG, and comfyfactorio --- I haven't heard of them before now.

Thanks!
User avatar
BlueTemplar
Smart Inserter
Smart Inserter
Posts: 3032
Joined: Fri Jun 08, 2018 2:16 pm
Contact:

Re: Softmodding

Post by BlueTemplar »

Doesn't "factorio softmod" in a search engine works ?
BobDiggity (mod-scenario-pack)
User avatar
steinio
Smart Inserter
Smart Inserter
Posts: 2638
Joined: Sat Mar 12, 2016 4:19 pm
Contact:

Re: Softmodding

Post by steinio »

The redmew community is a synonym for soft mod.
Check their awesome servers.

https://redmew.com/
Image

Transport Belt Repair Man

View unread Posts
Post Reply

Return to “Modding discussion”