I've changed the implementation so the service iterator accepts partial name matches too. So, modA1 defines "HealthService_A1", modA2 defines "HealthService_A2", modB searches for "HealthService" and finds both.
I had to remove the convenience method ServiceIterator.ServiceExists(). Now the only way to know if there are no Services found is to count how many times Next() returns not NULL.
I updated the PR, and here is the standalone preview:
service-new.zip
There are four directories in this archive, each is meant to be loaded separately, with service directory first.
You do not have the required permissions to view the files attached to this post.
Alright, I gave this a thorough testing, and it seems to work as anticipated, which is very useful for cross mod messaging indeed. I hope Graf will consider merging this.
I think the goal is to modularize addons. If there is a standard for addon-to-addon communication it makes it possible to establish a generic framework for them, or even any number of them, while making some parts of addons optional and reducing overall addon cross-dependency while increasing cross compatibility. That's just my guess, though.
That guess is actually 100% accurate. Here's an example.
m8f's TargetSpy modification has a service that searches for MaxHealth named services that allows overriding the display of a monster's maximum health. As his mod is doing the searching anything with MaxHealth, this is how its set up.
I'll throw another use case on the stack since I rolled my own trying to solve a similar issue.
I have a "modular" mod pack, which I've designed so players can load the entire mod as one unified whole, or easily separate out just the parts they want. But of course this causes problems if one of these "sub-mods" depends on another one that isn't loaded.
For example, one of my modules gives the player a flashlight inventory item. Another module gives monsters some enhanced AI mechanics, including the ability to use the same flashlight item as the player. But if the AI mod is loaded and the flashlight isn't, errors occur.
So I wrote a system in the "core" submod (common routines used by all the mods) that allows the AI mod to send "intents" such as "toggle flashlight" to a global "bulletin board", and the flashlight to look for these intents and toggle accordingly.
Details spoilered since my implementation is irrelevant to the one discussed in this thread, but just for context.
// More likely to activate in darker areas if (random[aillm](0,192) > lightlevel) { UaS.SendIntent("LLM_Toggle", "On", owner); } else { UaS.SendIntent("LLM_Toggle", "Off", owner); }
oi = UaS.GetIntent("LLM_Toggle", owner); if (oi) { if (oi.Payload ~== "On") { activated = true; } else if (oi.Payload ~== "Off") { activated = false; } else { ToggleSwitch(); } oi.Clear(); }
oi = UaS.GetIntent("LLM_ModeSwitch", owner); if (oi) { int m = oi.Payload.ToInt(10); switch(m) { case 0: modeLaser = 0; modeLight = 1; break; case 1: modeLaser = 1; modeLight = 0; break; case 2: modeLaser = 1; modeLight = 1; break; case 3: modeLaser = 0; modeLight = 3; break; } oi.Clear(); } }
If this was implemented into GZDoom I could save some code and probably be more efficient. I think one main thing I like about mine is that it includes several fields like separating the intent name and payload string, sender/receiver pointers, timeouts, etc. Not sure how generically useful those might be or if they can be achieved with MC's system.