#enfusion_scripting
1 messages ยท Page 20 of 1
You have the option to tell us to make it better, no need for that.
And we do not keep those hacks, and in many cases will block them when found.
I agree with you on this entirely, but you're still missing my point. Simply telling modders "this is the right way to do and benefits everyone" is not incentivizing anyone, no matter how right it is. People misuse public property despite being well aware it's paid for from their taxes. It's human nature. They need to have a direct incentive.
You still fail to see my point.
It's not about that
Code, for context:
class MySystem : WorldSystem {
override event protected void OnInit() {
Print("MySystem::OnInit");
}
override event protected void OnDiag(float timeSlice) {
Print("MySystem::OnDiag");
RenderDebug(); // Calls DbgUI
}
}
Result, at runtime in the Workbench:
I am not saying "Do it right, use our APIs"
I am saying, if you see an issue. And you ignore reporting or telling us. You will suffer more.
Clearly there is some unspoken flag or feature that must be enabled, which I'm not seeing anywhere in the Discord search or documentation
And will get no support from us. Which will make it worse
Your mod will always be prone to breaking, and your mod will break others.
It's a lose - lose situation
The game changes a lot currently as you are modding an actively developed game
So doing what you say which could work in older non updated games will cause you suffering here
And that behavior, saying from experience with our devs will make our devs here in community not even attempt to help you sort out an issue.
What exactly are you trying to do?
This is simply not true. None of my workarounds caused any regressions so far (even despite 1.6 being so impactful), but I had to introduce a dozen of workarounds for a new bug. Which I reported during exp, still not fixed. If I were to follow your reasoning here, I should just tell my players "it's reported, just bear with the fact you'll crash on every scenario exit for the next months".
It is true, we see those things on our side.
On crashes and so
But we won't go an ban mods or so for that.
Many cases we leave it be to not break tons of mods
And those things I told you there, are things we can't really solve on our side. Except for taking away the possibility of doing that.
I want to iterate faster. A debug menu with buttons that run my custom code will help me move faster. I'm told that DbgUI satisfies my need, and that OnDiag is called every time the UI is rendered, but it seems that it's never called. So, I'm confused.
Which is not possible
woah throw back ๐
This was 3 or 4years ago, when there was no documentation, I accept I may have been very wrong!
Your post is the only documentation I can find on the subject, sadly
That info is very wrong
OnDiag gets called for Systems Diags
Which will only activate for your system when you explicitely enable it through debug menu
You have to enable it through here
Then Systems
Then enable Systems diag
And then move around the window that shows there, and enable your system diag
Use the combo
LCtrl + Win + LAlt
That one will have zero conflicts with windows 11 / 10
See how other systems have made their diags if you want to see the proper usage
Please confirm: so, the recommended workflow for my use case is:
- In the System's
OnInitevent, I should register the DiagMenu flag - When the DiagMenu flag is enabled, the engine will automatically begin calling the
OnDiagevent on every frame, which is where I should write myDbgUIcalls to populate what I need.
1.- No
Just do stuff on OnDiag for the rendering
and it will be enabled when you enable it on the system diag menu
It will automatically show there for the update points your system is enabled to
2.- No
Same reason as above
Yes, DbgUI is the one to use in OnDiag
For future people who search for this in the Discord history, like I tried to:
- Make a System (e.g.
class MySystem :WorldSystem)
1a. (make sure the system is registered in the system config file, which might be a separate tutorial if you don't already know how the ECS stuff works, so that its code actually runs normally) - Implement an
override event protected void OnDiag(float timeSlice) { ... }in your System class - Run the game in the Workbench editor
- Hold WindowsKey + LeftAlt, and use the keyboard arrow keys to go into the
Systemmenu and then use the right arrow key to turn on the "system diag" (change it from "none" -> "basic" or "full") - A window will pop up in the top left of the game window. Search through the list of all the running systems for the one you care about, and click the checkbox next to it
- Now, your
OnDiagfunction will be automatically called on every frame. Now, you can do your debug stuff in a totally separate place and context compared to your other regular code!
thank you!
no problem 
So currently what's the most appropriate way to schedule stuff if not call Later ? I haven't really checked but isn't the wait and execute feature using call later too?
tldr: it is just dont spam the global one
#enfusion_scripting message
Alright thanks.
So if A4 won't support call later it means 99% of reforger mods won't run by default
probably a lot more than that will be very different too
hopefully lots of upgrades
Call later is fine for normal delayed calls
It's not fine for initialization or hacks around initialziation or frame updates
Do you need to make something run every 10 seconds?
CallLater is fine then
Just do not use the global callqueue
as it can implode and slow things down heavily, notably replication threads
Create (Call new) a new Callqueue instance, then run it on fixed or frame update on your system with call to Update()
There will be support, just no public accessible or global queues
Thanks for your replies.
So, would something like this work instead of using the global callqueue?
It does not have to be in a system.
You can just mod the Update method on Game class, and add it there if you want to have global one for your mod
do not do anything else than Tick
Just call the tick, no ifs, and things like that
The main issue is mostly the usage of a global callqueue for the entire game
It lands you very easily into the situation where that throttles the main thread
If you want it more centered and specific for a system of yours, then yes do it on a system.
https://discord.com/channels/105462288051380224/1441062665509277726
No blog update but docs and feedback thread are there.
Honest to god game changer, i love the short hand, only feedback so far is could you add more to the find comp, like I can type out my class, then findcomp, press ctrl and enter and it auto fills in with the class instead of just the generic class it does right now
Like this?
Yeah
Last time I tried to use my own callqueue it was never called so w/e
Alright thanks. it works
Maybe you forgot the tick?
If I need to call the callqueue, whats the point
I mean
That is what happens to the global
It's all scripted
It gets called from that same OnUpdate as well
The point is to not cause a throttle on the main global one
Use your own callqueue but remember to call it in update, so you have a callqueue for a callqueue
?
So to have my own callqueue I also need a system to call it
Could you even do this without access to pointers?
1 line in OnUpdate of Game class
Yeah exactly. When is access to the global one being removed then?
For AR never, for A4 it already is
I tried down the path and anything I did was just stupidly convoluted or just too specific for general use
But
If you want to avoid thottles or not being part of the problem
Then just make your own
What's a throttle?
Could be general for your whole mod
What does throttling look like on a server?
latency i would assume
If you do not want to stall the main thread
Which then stalls everything else
Including replication
Are client sided call laters bad or just the ones called on the server
Which then will cause you desyncs, kicks and what not
That is why it is a big deal of a thing
It's not because "Patterns"
You can have your own global one for your mod, just not use the game one.
As everyone adds things there, including game devs back then
Which then incresaaes the complexity of processing it and then at some point it is just too much
could you not do some wizardry on your end and force mods calling the games callqueue to detour to one you make for that mod
probably not worth it tho
Enforce Script does not differentiate between mods
They all get compiled as whole package at the end
Client and server
But global call queue usage. The vanilla one
Just create your own global one for your mod if you want to use it like that.
And if you need some sort of dependency of the calls
If you tick queue1 first before queue2
then queue1 calls will be done first
then queue2
Etc. So it also gives you a bit of more control of how systems do it, or features
In the game global callqueu is free for all in a sense as well
So an extra usage of that if you need that ๐
Thanks for clarifying all that Mario will keep it in mind to rewrite my global callqueue usages ๐
Could this cause kicks via Replication Stalling, or is that like you said only cause by an error in replication so bad it stalls the replication thread
Is it okay to have different custom global callqueues for each of my mods? or is it better to have a single global one to use everywhere?
Replication Stall error is not replication being frozen
It's the name of the error when repliction gets broken to point of no return
So it stops and crashes
Ah okay, so the call queue does not cause stalling then
If something is badly implemented in a way that a freeze would cause big state mismatch, then it could happen yes
But tracking that is insanely hard
Fair but I feel like you'd notice that in general playing wouldnt you, are issue is once we get more than ~80-100 players in the same replication cell it causes mass Replication Stalling
And no new players can connect without getting the stall
It's random and heavily influenced by players, mods, etc
On our playtests we do not notice it that much
But we test mainly vanilla
We are planning on testing modded now, perhaps with community as well
But only on Exp
That will allow for higher debugging of mods on actual scenarios
As we can use higher profiling/debugging tools that we can't share to community
That's fair, it could've been us honestly, we where relying on RplProps to replicate entire arrays of data containers cause of legacy code from awhile ago so maybe it was the sheer amount of data like that?
If you surpass certain amount of Rpcs, or calls to replicate. They just get queued until you are able to send them all
I see but that necessarily wouldnt cause stalling tho right?
you replied to the autotest framework, but I hear ya ๐
Is that amount hard coded or just via how many bytes you've sent in one frame
My brain is kinda making me want to say perhaps but I have never seen that case. So no, idk this one. I will ask a network/rpl programmer.
Oops haha
Some hardcoded values for number of requests iirc
iirc the size was removed?
I will ask too
Appreciate it ๐
Speaking of replication and modding, is there any chance we can get some more direct influence on when/how entities get replicated?
For example mods with lots of players spawning in a safe zone (or even Vanilla conflict at session start when everyone spawns in and starts spawning gear out of arsenal all at once) probably don't need to instantly replicate all the 100+ other players starting gear to everyone else like it's a life or death situation and chug the server for it
If we could script for entities in some situations like these to RPL most stuff on a lower priority rate limited "eventual consistency" RPL queue could help avoid a lot of these kinds of situational bottlenecks
Also this was getting spammed in the console for those that where suffering from stalling
SocialComponent::IsRestricted: Invalid otherPlayerID
what would even cause this
This could cause a lot of false expectations from modders and even us on behavior of JIP, streaming and initialization
(I mean using the automatic replication stuff not manually RPCing everything)
Yeah fair makes sense it's easy enough to cause JIP errors without modders directly scripting them ๐
Even some special unscriptable game code defined trigger entity that puts RPL of entities/components on a whitelist in some low priority queue could maybe help without allowing us to touch too many sensitive things
Yeah I mean that is why we use log level debug. Speaking of which why is there so many more vanilla prints in 1.6? Our servers console have a lot more lines being spammed now. Surely it canโt be good.
Half of it is coming from these new analytic callbacks that were added 
They used grok to write the update
๐ The system has started successfully
"SCR_AnalyticsDataCollectionTransferSuppliesModule" Feels very much like it was written by a German to me.
@Grok is that true?
can anyone reproduce this issue, very weird
Print("Hello, World!"); // works fine
Print("Hello, World! (but debug)", LogLevel.DEBUG); // doesn't work
and yes ive checked my console filters, i should be seeing two prints but i only ever see the first
So going back to this... I set up a custom global call queue by creating a modded class in two separate mods. I run both mods simultaneously, and it appears that the callLater function stops working in one of them.
Each mod uses a different call-queue class, but the script file for the modded class shares the same name in both mods. Could that name overlap cause a conflict?
In other words, in one mod I have this modded class:
ArmaReforgerScripted_modded.c
*modded class ArmaReforgerScripted
{
override void OnUpdate(BaseWorld world, float timeslice)
{
super.OnUpdate(world, timeslice);
EE_CallQueue_RadioActions.Tick(timeslice);
}
}*
and in another mod I have this modded class:
ArmaReforgerScripted_modded.c
*modded class ArmaReforgerScripted
{
override void OnUpdate(BaseWorld world, float timeslice)
{
super.OnUpdate(world, timeslice);
EE_CallQueue_FrontlineOps.Tick(timeslice);
}
}*
and I run these mods together. will that cause a conflict? Is there an issue with both mods overriding the update function on the game class?
@minor agate can you advice?
do you have -logLevel debug in your launch options?
thats required? i thought just the filters controlled it
in workbench btw didnt specify
yes its required
i see, good to know then
ty
I'm trying to create a fix for supplies not being subtracted in Game Master mods when building compositions from a construction truck / outpost, and I've hit a snag. It seems like when SpawnComposition() is called the SCR_CampaignBuildingCompositionComponent no longer stores the provider entity. So, I can't get a supply source with this method. Is there a better way to get a supply source that anyone knows of? My fallback is to take supply when the builder places the placeholder.
Thank you! Did you make your own overwrite for OnEntityCoreBudgetUpdated removing that line or is there a better way?
Overwrite removing that line.
Awesome. Thank you again ๐

Wym filters? Did you launch your tools/game with launch parameters -logLevel DEBUG ?
you can filter log context in the log browser (in workbench)
i just didnt know you needed a launch param for the debug level
i had started making a logger and used that as a default value to then discover none of my logs were logging
is there any way to get reflection of some sort even just a way to get the method name in the current scope?
if there is please scream the answer at me
i just want a run once guard that doesnt require arbitrary values 
i looked and couldnt find anything at all so im doubtful
i had an idea to use the dump stack function and parse that to get the method name but i think thats a bit too much 'wtf bro...' at that point
and also its debug so...
Does this actually work for changing the skill level for AI? combat.SetAISkill
Last time I had a look at it, it was used for aiming error only
I guess that works for me. Thanks.
https://github.com/Arkensor/EnfusionDatabaseFramework/blob/armareforger/src/Scripts/Game/EDF_ReflectionUtils.c only way right now. Not sure if we will ever add reflection api
A database framework to connect the Enfusion engine with SQL-, document- and local file databases. - Arkensor/EnfusionDatabaseFramework
hey guys does htmlLoad work in reforger or similar. say i script button widget on pause menu i want it to open a discord url
Can you show me an example of exactly what you want?
so example ive added this discord icon in menu layout as an image widget wasnt sure if it needed to be something else. I know we had https://community.bistudio.com/wiki/htmlLoad in a3 or https://community.bistudio.com/wiki/openYoutubeVideo I wasnt sure if we had a similar for calling discord join links or a url aware of security risk of just letting blind urls calls. id seen it in a mod previously on reforger thought id see if anyone had any thoughts
// to open https://discord.gg/example
in the Steam overlay or game browser when clicked.
// The desired flow (once an exposed URL-opener API exists) would be:
// - In OnMenuOpen: Widget link = m_wRoot.FindAnyWidget("DiscordLink"); store as member.
// - Register for clicks on that widget (or its children) and, in OnClick, detect the click.
// - Call the engine-provided URL opener, e.g. OnlineServices.OpenUrl(), PlatformServices.OpenUrl(),
// or GetGame().OpenURL() if such a function is exposed on Reforger.
// At the moment we fall back to HyperLinkWidget in the layout to let the GUI handle navigation,
// but we cannot guarantee overlay opening without a script-level OpenURL entry point.
//------------------------------------------------------------------------------------------------```
Im looking for some people who can help test the armor im rigging and also help with developing a project. If your interested please hmu
not sure how it would be implemented but i think there are const values for the file and current line number or something right?
so assuming we can have one of those that returns the method (or something along these lines)
bool RunOnce(string method_name)
{
return m_aRunOnce.Find(method_name) > -1;
}
void MyFunction()
{
if (RunOnce(__METHOD__)) return;
// ...
}
Why you need THIS? 
how else can i do this for any number of events without spamming bools
void Update(float timeSlice)
{
if (!m_bHasRanMyEvent && someCondition)
{
MyEvent();
m_bHasRanMyEvent = true;
}
// more events (and potentially more events in inherited classes)
}
Inheritance - Base class that implement check and run if not runned + child for each case with desired code to run.
Or just redesign this entirely
i mean
i would prefer my mission events to be tied to the mission update loop
how else could i design the events being fired is my question i suppose
Depends on what is your "global goal". If it's just to tell that some event is happened - trigger-like entity or key-bool DB for "misison facts" (with mb "subscriber callbacks" to track changes)
an event i actually use is OnMissionStepComplete which can be overriden in inherited classes to extend when the mission completes
e.g. if you have a destroy prefab mission and inherit it to an evac so that when mission step 1 is complete you can do more things
idk if that makes any sense
yes but im already using bools, i dont want to use arbitrary values
since this is a framework type thing for my missions
theres a lot of inheritance involved so it can get confusing
and im just trying to minimise the amount of magic everywhere
minimise magic
Reflection - is more magic, then everything else
Use first one as easy implementation : #enfusion_scripting message
ive used a ton of different languages wdym
i just dont want to have to change any values if i rename a function or have to remember to do so but i get where youre coming from
one of my first big projects was in C# so maybe thats why?
and i used java a lot in uni
but i regressed to typescript for ages
then bounced to go, now im here
Is it possible to clear\reload datacollector at needed point? do not restart scenario or something else, but call from code something like Reset()\Clear()
What's best way to suppress the default camera in ocaen at 0 0 0 and ocean sounds on init?
Our loading placeholder handles this, in the respawn system.
Cool ty i'll check it
@torn bane Is it possible to clear\reload datacollector at needed point? do not restart scenario or something else, but call from code something like Reset()\Clear()
do you know?
where exactly? ๐ค
If you already use this setup you should not be seeing or hearing any 000. When do you encounter it? On first spawn or when you respawn after death?
Sometimes on first spawn. I guess it depends on the map too
Dedicated server or in workbench too?
Can someone share the example or tutorial how to play music\sound by script command for all players on server?
I don't know if I am doing this the right way (I know this works to play sounds on dedicated server, but I haven't really tested if it actually broadcasts to all or if just one player can hear it...)
But this is what I do
I have a "replication handler" script that I add to my game mode manager.
Basic pattern:
[RplRpc(RplChannel.Reliable, RplRcver.Broadcast)]
protected void RpcDo_BroadcastSound(string soundRes)
{
AudioSystem.PlaySound(soundRes);
}
// This should trigger the sound for everyone
void BroadcastSound(string soundRes)
{
if (Replication.IsServer())
{
Rpc(RpcDo_BroadcastSound, soundRes);
// This should play it local if playing single player
if (!Replication.IsRunning())
AudioSystem.PlaySound(soundRes);
}
}
Then you just call BroadcastSound("{your_sound}.wav") from the server and it should play for everyone.
If anyone has a better or a correct approach I'd love to know tho.
Thanks for now. Will test it
What would be a performant way to regularly check whether the player is near any other entity like vehicles/other players? Ideally with the ability to discern whether it's a vehicle or character or some other entity? Doesn't need to be replicated, can be just client side
aha discovered QueryEntitiesBySphere()
I created an override for OnEntityCoreBudgetUpdated, but it doesn't seem like it's called as I build from my construction truck. I overrode SCR_CampaignBuildingManagerComponent with a custom EOnInit and verified the class loads. I placed the modded script in \scripts\Game\Campaign\Modded\SCR_CampaignBuildingManagerComponent.c Were you able to get this working?
If you're using the GameMode_Editor prefab then supplies are also disabled on the game mode its self. The override is so that if supplies are enabled they're actually consumed. I have a custom game mode entity and all I have is that override and works for me 
I was trying this in the vanilla GM Arland. Is the global supply toggle connected to this toggle? What's weird is that the arsenal supply use works, but respawn and building does not
No idea, never really used the editor gm.
Ah I got it! The parent init was loading my unmodded event handler, so I needed to re-register the new one
How you fix it? Please i am struggling with this a lot
You can right click the item/its folder and select register. You also need to add it to any necessary config that calls it. Not sure about Overrides though, had issues using it in my mod.
What do you have set up right now? If you've followed the chain so far you should have found the function to override right?
How can I fix this error? It didnโt exist before โ it appeared after the server crash and now it completely breaks the whole build.
The first screenshot is not an error, read what it says. You probably want to choose yes. the second only have a look at your own prefabs. some errors prints are from base game
Clear game not worked too
Read what I said again, slowly. And then read what the popup says.
These are all from the base game, do not worry about those
โI understand what the popup says, but this never appeared before, and my whole build was working stably. After the server outage on Wednesday or Tuesday, this problem started.
I reinstalled the mods, re-downloaded the game, I even re-downloaded the workbench, etc. But still nothing wants to work as it did originally.
These strange errors started appearing โ with the M113 and so on.โ
4
Unload all mods, make sure you are not mix matching experimental gproj in your launch list with non exp tools etc.
no beta version - all worked and not worked after Drop servers at week
@torn bane
that i am only start scenario in editor without mods
That is entirely unrelated, script errrors would be shown to you on compilation, open the script editor ...
Uninstall the game and tools, run the game, then the tools, create new project. you broke something in your setup.
I see onedrive, you will need to disable that, it does not worrk well with workbench.
4 files - i send its if i start my mod packs
mod data is C:\ArmaTools\addons - to download arma
C:\ArmaTools\new - to my configs
I completely reinstalled the game, the workbench, and today I also re-downloaded the mods. I even solved the issue with the mod duplication, but nothing helps.@torn bane
Iโve been reinstalling everything for the second day in a row.
Please stop pining me. I am unable to help you beyond this
This is a vanilla issue, however it's not an issue that causes concern nor causes a problem. It's just saying those 4 prefabs do not exist, which they don't. Nothing you can do about that.
Could you look at the 4 logs above and tell me what might be causing the mod pack not to launch, even though it had no changes and was working earlier?
I'm really just starting out with Workbench, I'm a bit lost, I don't know where I have to change the code.
I replied to you here #enfusion_workshop message
Don't crosspost pls
I plan to release this to the workshop, but I wanted to test other things like spawn cost, etc before I do. Should be up before Sunday
Otherwise, and I sort of hate to be that guy, Iโd recommend reading/watching some tutorials. TPM tactical made some good vids that got me started.
Once you know what youโre doing, look back at Tonicโs messages. Thereโs a function youโll need to override which contains a couple lines that disable supplies on non โcampaignโ missions which I think I understand includes game modes like conflict, but not modes like game master.
i have alot of time on my hands, whats the best way to learn scripting in general for arma
i have a good understanding of the workbench and ive always wanted to script some things so nows finally the time lol
Your skills won't really develop in programming/scripting unless you start utilizing what you learn and experiment.
Best is to set yourself a not so ambitious toy project, and start with that
read the script docs, experiment
learn about OOP. And see how our language "breaks it". With the modding concessions we did for the enforce script langauge, OOP here is not fully OOP but you can start there.
i mostly included that part so people wouldnt baby me about how to learn enfusion first and whatnot ๐
i appreciate the pointers will check out what you mentioned!โค๏ธ
Best way is to create scripts in the workbench, but that is helped by having an understanding of C/C++ basics and the ECS design pattern. In general, both programming and scripting are heavily reliant on an understanding of design architecture and philosophy; once you see the patterns and get the philosophy behind why the devs chose to set things up the way they did, actually implementing your own systems/entities/components becomes really easy.
The most common pitfall I see people falling into in the beginning are:
- not understanding what they are trying to do.
- not understanding the tools available to solve the problem.
- setting really lofty goals (that they burn out trying to reach).
So, find a problem you can solve, and try to solve it. Set a simple goal so you don't burn yourself out, and start looking in the API reference documentation for keywords that correspond to that problem and/or solution. A towing system? You'll want to start looking in Physics, and maybe look into how other's have solved similar issues in the past. Proximity mines? Triggers would be the way to go. An additional bit of advice, when you start running into a lot of resistance in the system while trying to complete your goal, you should reconsider your approach. Developers spend a lot of time thinking about and laying out the paths, or channels, that you can go down in their systems, so if the system is fighting back you might be on the wrong track entirely. Hopefully some of that is helpful to you
God speed, mothertrucker.
To add to this. If something specific takes you more than than 30 minutes... JUST ASK
A lot of people do not get or chose to ignore that they have the actual developers at their disposal here
Who can help if you ask properly about your issue/question
lol 30 minutes, I feel guilty asking about something if I haven't worked on it for at least 3 hours
And modders as well, if they know they will also help.
Just don't listen to ||bacon|| about using components and entities as systems/Managers

Developers spend a lot of time thinking about and laying out the paths, or channels, that you can go down in their systems, so if the system is fighting back you might be on the wrong track entirely.
Also to add to this again, @sage shard. Also why it is important to ask.
If you do not ask then we might not know that some support for X something is missing. We can in many cases easily add the support in a next patch. But if you do not tell us, either here or feedback tracker then we will hardly notice it if we didn't before.
if ya say so
Biggest issues for new developers is overcomplicating their codebase like using overly complex systems or world controllers or other nonsense when all they need is a single entity.
If you abstract those things well enough for them to need less boilerplate than running through an entity then they'll be favorable.
can you give an example of this?
No I'll get banned for suggestions related to not wasting time
overengineering is a problem if it's actually overengineering. some people have something really simple to do and go around the world trying to do it instead of some simple way, can't give any examples off the top of my head
I think it happens most of the time because the person doesn't know that the straight-line easy path exists
In reforger scripting sometimes obvious straight lines are blocked. For example if you want to change the handler of your data based on some value in other languages you could store a reference to your handler function but in here you need a condition for every value and an explicit call because you cant store function references as dictionary (or map) values.
So you end up with 20 if statements if you have a relatively large choice.
So you can circumvent this by storing the name of your function as string in the dictionary and then use a special call that calls it from its string value which has to be much less efficient.
And, worst of all, it looks stupid.
Or just reinvent C++-like lambda struct that can be passed as function parameter and be called inside it
Or pass scriptinvoker which you create temporary just for this function call
That might help because I recently ready that author of mod better hits effect (3 millions download)quit because of frustration that 1.6 stable update break his hundreds of work which he invested with great results in 1.6 experimental.
Let me know if you have even more complicated ideas for doing this so I can make mario angry
All of us modders know that updates can completely break our mods from the beginning
It's not easy for you guys, need to have tough ass to keep doing despite this
Give us pointers, let us allocate memory, I swear I'll use it for good
i don't think it is so complicated:
auto cb = new ScriptInvoker();
cb.Insert(f);
g(cb);
...
void g(ScriptInvoekr cb) { cb.Invoke() };
void f();
But yeah mario mb too angry 
Let me make my own seg fault crashes god dammit
We did something similar in DayZ with script caller class, but we would rather fix some underlying issue for script <-> script calls and func keyword than forcing people into a wrapper class to pass around. We wil deal with the topic when we can.
Maybe you would have less issues if you actually did use systems and so 
Anyway for future games we are planning/thinking on removing the entity events and all that. For this same misusage. So basically for safety and stability reasons.
You would see 10 - 15 lines boilerplate to define a system, but you will remove all the other obstacles you find.
But you do you.
And it's not boilerplate, it's just simply it's configuration
There is no such thing as generic system so you will never get that
There is the Event class. But i think it is obsolete.
I don't know what "systems" mean when talking about ARMA reforger
Yeah no, at this point it takes you even less time to provide the func to work in scripts i would say
any news on this while youre here mario? ik its unlikely but technically my idea doesnt count as a reflection api lol 
You want a method that only gets called once?
without having to use an arbitrary value preferably
would be per instance
No
This is why I say tthat it is better to learn CPP (Simpler side of it) for enforce script
rather than C#
It will make your life easier
We will probably not provide such things ever to enforce script. One of the reasons of reflection never to hit the language as well
We do not want to make it more complicated for those not so savvy modders
rip but fair enough
also i will start using c++ when i can go to a definition in the std lib and understand it lol
We understand the requests for it
But we also check risk factor of it
If risk factor is higher than the added value to have it, then we don't do it
Can anyone please point me on where to find any tutorial or at least some hints on how to animate ironsight flipping on/off? Maybe it does not require scriptin and can be manager in easier way? I'm so new to all of this and can't seem to find anything on it in tutorials
Thank you in advance
Another reason for this for example
#enfusion_scripting message
Sometimes more control is not better if people that will use it will cause risky situations on game/engine
yeah i mean its not the end of the world for me anyways, i just have to use a normal string
and i see the risk now
HOWEVER
are there other options
like could you guys add a decorator that zaps my func into a noop after first invoke
Issue with reflection is that you can easily land in situations of completely disconnected logic debugging wise
So good luck trying to sort some bug
afaik decorators get processed after bytecode is generated, so too late for it
Probably a modifier would do it
that would be very cool but what are the chances itll happen 
Very low on backlog
one can dream
adding modifier means quite some work
yeah i can see that
So it will land on lowest prio as it's not even a common thing to be used
well at least i know theres a chance now lol ty for your time 
You can kind of do something similar with method static variable
but that will be for first call of a class method overall
ive already been spamming bools but its grown to the size where a map is more sensible
You might be able to do something with a table with the added slight bit of reflection for decorators (It will be hacky but you could make your life easier)
Not sure if it hit 1.6 already
Rather than spend time on some one time only code which is hard to follow when debugging an issue, just make simple clean statements. if (!blah) return or if it is a method param just add notnull to it in argument list, or make sure your method is only callable when you previously validated you arguments by making it protected and check your public apis
Better yet
somehow split the logic into the call once part
and the others
Seems like you are in a situation where you have multi purpose method
update loop yeah
for "missions" has stuff like a target, ai, tasks etc
multiple levels of inheritance
each with their own update and events (and bools to accompany those events)
I have a GenericEntity (Layer) spawned with few Vehicles inside, spawned from editor. After game start, I want to get all childrens(vehicles) from base
ref array<IEntity> allChildrens = {};
IEntity spawnVehiclesParent = GetGame().GetWorld().FindEntityByName("SpawnVehicles");
IEntity children = spawnVehiclesParent.GetChildren();while(children) { allChildrens.Insert(children); children = children.GetSibling(); } Print("SteelPath >> Founded base vehicles: " + allChildrens.Count());
This code return no childrens. Why?
A bad ref 
you mean just this is the reason? remove ref from array?
Probably not in this case
in debug, children is always null, cant get first too
will fix, its just for testing)
Do you have other ideas, why its always null? I'm calling script after world init, so i can see vehicles
As for the children you see there
If they do not have hierarchy component, then they will be created standalone
What you see on the layers, is just for you to group them on editor. But without hierarchy component they will not follow that in game
It has
Or you mean, each children should have this component?
Each child should have it
Okay, let me try
Works. Big thanks
But idk if Hierarchy component will not break many things in the game for Vehicles
Keep into account this #enfusion_scripting message
Actually
It will most likely break it
Beacuse now the vehicle is local to that entity
So it is not free in the world
so search another way to spawn them
Probably do a config like everything else like this in game
Very bad hint from my side sorry, did not realize they were vehicles at first
Things looking for root parent will probably break
Simulation/physics might struggle
etc
I know for example some things in gamecode/scripts look for root parent when in a vehicle, and if the vehicle has a parent then those things will not give back the vehicle but your SpawnVehicles entity
Understood. Will check, thanks
can confirm it does, way back I spawned vehicles and kept them as children of the spawner entity, it caused tons of weird physics bugs and broken vehicle camera/interiors
In SCR_SpawnLogic there is references to "player controller cleanup". Anyone know off hand which class handles that?
Pre processor directives could help you for what you want
Gamemode onplayerdisconnect. it will delete the controller charr of the controller if no reconnect component takes it over. also player controller cleanup refers to it being deleted from c++ side after disconnect is completed
Thank you ๐
I'm having intermittent persistence issues with players being unlinked from their character. Is this a known issue or should I try to get reproduction steps? It seems to have something to do with joining for part of a session and leaving, but I couldn't reproduce it consistently with session start > all join > some leave before save > session save. When the issue occurs their character spawns into the world, and their player data is present, but there's no player entity entry.
I was thinking it may have something to do with the controller cleanup
Hi all, does anyone know how to set a script activation on a missile after launch from a handheld launcher?? I cant figure it out for life of me. In workshop
This is too vague for me to say anything about
anyone wanna help on this shet?
that feature done but ship gonna take a lot of scripting hahaha
Definitely understandable. I will try to capture more detail if/when it happens again, sorry
lemme know anyway anyone welcome xoxox making multiuple ships
Hello guys!
Trying to workaround ScriptComponent for making some animation with scripting logic
I have my flags setup, but the EntityEvent.SIMULATE don't trigger the method EOnSimulate
My component is added on : SCR_ChimeraCharacter
Seen it was done in two classes : SCR_InteractableBoxComponent and SCR_JointDummyHolderEntity
I assume I'm missing something, but can't figure out honestly.
I wanted to use the method EOnSimulate for using void SetVariableBool(TAnimGraphVariable varIdx, bool value);
Since I've seen similar use in a protected override ENodeResult EOnTaskSimulate(AIAgent owner, float dt) that's probably the equivalent but for AI.
Am I missing something?
It is the clean way of doing it?
Thank's ๐
[ComponentEditorProps(category: "Misc")]
class FF_TestComponentClass : ScriptComponentClass
{
}
class FF_TestComponent: ScriptComponent
{
override protected void OnPostInit(IEntity owner)
{
super.OnPostInit(owner);
SetEventMask(owner, EntityEvent.INIT | EntityEvent.FRAME | EntityEvent.SIMULATE); // Flags
}
override protected void EOnInit(IEntity owner)
{
super.EOnInit(owner);
Print("[FF_TestComponent] EOnInit"); // Works
}
override event protected void EOnFrame(IEntity owner, float timeSlice)
{
super.EOnFrame(owner, timeSlice);
Print("[FF_TestComponent] EOnFrame"); // Works
}
override event protected void EOnSimulate(IEntity owner, float timeSlice)
{
super.EOnSimulate(owner, timeSlice);
Print("[FF_TestComponent] EOnSimulate"); // Not Printing
}
}
What are you trying to animate?
Base Player Character !
Watch the 3rd animation bootcamp
or the 3rd anim workshop
Both show similar but diferent things
I think EOnSimulate is only running when simulation is active. So something like Physics::SetActive or Physics::ChangeSimulationState is also needed.
It will cause desync anyway to do it the way he is trying
You are suppsoed to do things in very specific times
Thank's guys, I'll take a deeper look at the Bootcamp and the Anim Workshop
I keep in mind what you say Kex even is it's maybe not related, could be useful later ^^
https://community.bistudio.com/wiki/Arma_Reforger:Weapon_Animation/Basic_Tutorial
This Modding Boot Camp seminar was originally held on the Arma Discord Server on April 2nd, 2025.
In this session, Modding Supervisor Mario Enrรญquez goes over the advanced features of animation scripting.
TIMESTAMPS ARE WIP
00:00 Intro
00:17 Start of pre...
I would say watch all 3 tbh
At least to get idea of whole anim workflow
Also these 3 are tied together
Yeah, I actually watch the firt 2 ones, but the 3rd I skipped by chunk, I've probably missed something ^^'
Eager to go fast unfortunately
override void Use(float value = 1, EActionTrigger reason = EActionTrigger.DOWN)
{
CharacterAnimationComponent CAC;
CAC = CharacterAnimationComponent.Cast(m_CharacterOwner.FindComponent(CharacterAnimationComponent));
TAnimGraphCommand idx = CAC.BindCommand("CMD_Drink");
CAC.CallCommand(idx,1,0.0);
}
``` @minor agate is this okay?
You can also watch these 3 too
https://reforger.armaplatform.com/news/modding-animation-workshop-june-12-2024
They were done beforehand and show extra different things too
Ty for extra resources
Also
A bit of topic
But your name rings a bell to me
Were you active in DZ modding back then?
I believe he was.
Ahah, yeah, I was very long time ago; I had some health issue mid times while trying to get back on few things, and I shift from modding for a while
Seen a lot of modders became BI staff, that's nice ^^ hope you take care of my little frenchie DoJ
It's always been like this
Even many people on lead positions were modders
I used this for simulating helicopter flybys, but the the downside is that you need add this component. I went away from this for the newer implementation by using systems with simulation point on instead.
Do your own scripted comamnd for this
As otherwise you might desync the graph if not properly done with their gamecode command
The issue is that a gamecode command might not expect you to call those things at random
But if you enter your own command, then that one is active only and thus it might be safer to do whatever
Then activate locomotion command (Not from graph)
So that it defaults to simul default
If this method is in your scripted command, and called on it's update points then forget what I mentioned ๐
I can use this while moving.
It's a gadget btw.
Just a non looping animation of the upper body
Unfortunately they went basically same way for AR than they did in DZ. So anim comamnd stuff is as unmmodable as it was in DZ
So you will end up in missed logic, bad states and desyncs no matter what
If it does not seem to break much during testing (You can't see CPP impl) then go ahead I guess
yeah everything seems to work fine.
Can't be worse than the carrying compartment approach ๐
override player_main.agr to add the custom command
That was genius lol
Be careful that opening and (Inheriting from vanilla) graph is not modding friendly
You might break other mods
As it will generate new inherited files from vanilla specifically
So the way is to override each individual sheet
Then just open vanilla project
Then you can modify the sheets same way as configs
And if other modders do the same then their stuff gets merged
@river imp It has the AF design I never released for DZ heh
But it is a thing here, just needs more direct editor support which is work in progress
But system is there and can be used
Oh nice!
Every other graph based system will also follow up
So that means that Behavior Trees, Audio Files, etc will becoem fully moddable too
A4 or AR?
Paths, connections, transitions, nodes, removal of nodes, addition of nodes, connecting to mods, etc
It's on Enf, so at some point AR might merge it too
That's good to know, I need to be careful on my side then since I try to add a melee stance 
It's part oft he unification of graph editors process
It's why you saw the anim editor have a new look
That would solve so many potential mod conflicts
We are phasing them out, yes
That is why there was no mention of it in modding bootcamps as well
Is it unadvised to use Animation::SetBone and such?
I mean it depends on what you want to do
I've used them a few times and haven't had any issues.
It just overrides locally bone transform on top of resolved animations
I basically already abaondoned proc anims. The editor is already partially broken and they seem unreliable to begin with.
Yeah, in the beginning the editor wasn't broken and they were pretty easy to use and understand.
Now for simple things like that i just do it from script.
Yeah, though if only the setter and getter for bone matrices had any consistency ๐
I don't think i've been able to get Animation::ShowMesh to work though.
Issue with dealing with that
Is that depending on bone hierarchy the basis changes in "weird ways" for those that do not know internals
Certain baiss are used for optimization purposes
I think I saw @trim nexus mod where he was struggling with this I believe haha
THis is the only case where bone api is not advised
Everything can be done with the anim graph and it will sort all this for you
You can just do the procedural anims there and control
Bone API is low level so it does not do anything for you
There are just cases where manipulating bone matrices with scripts is much more convenient like for animating buttons on a gadget.
Yeah. I mean in the end is a tool
It's there, use it when it's better
A great use for proc anims instead of actual "animations"
I do agree as well that an entire graph just to move in a simple way a single bone once or twice per seesion is wasteful in many ways
but i prefer the scripted approach for simple things.
Graph can also create proc anims
It's why that other editor became obsolete
Graph scares me 
Yeah, it's a mess of "what's this node do" lol
It's fun when it's your own
๐
Graphs are great, you can use them to encode molecules as well ๐
Well for me I'm not a visual kind of guy so I can't graspe anything that is more or less like visual blocks, i'm more of a nitty gritty straight to the source.
Don't worry, it also has it's own text scripting language ๐
So when I look at the animation graph, proc editor and even sound editor, confuses the shit out of me
and it's turing complete.
Where's a list of methods for it?
I did an experiment once as well and made arkanoid game, played within the graph editor itself lol
editor shows them to you iirc
(YOu can make functions and vars too)
When you gonna make the "character height mod" for reforger?
I am not modding reforger as hobby anymore so probably never
The interest in that aspect is dead from me now
The exciting part of modding of finding and realizing things is gone for me
As I know or can get to know how things work right away now
I help modders as hobby tho, as as work too.
21:45:49.223 NETWORK (E): Unable to connect as client to ''
Then why does this sometimes happen with Peertool? lol
For example right now I am not working
So passion for modding goes away when you are at the best possible state for modding? ๐ญ
Why do you think modding became better compared to before?
I've asked numerous times and don't think i've ever gotten a direct answer.
๐
Like, don't get me wrong
I have interest in modding
Just the part of doing it myself as hobby, making mods as projects myself is not so interesting to me anymore as I do not feel any grow/learning aspect of it
Just because of my position at work here
Can you get them to make the ammo array accessible from script? lol
And fire modes, sway
Well, maybe if you could combine it with interesting math problems along the way ๐
This is also a huge topic as well
For example if we make modding so simple, that it is trivial
It gets boring
and bloated fast
So you want a bit of hardship there too
But also you do not want it too harsh/hard
I think it's pretty good as is currently.
It's way trickier than SQF though
But now you're kind of expected to know some things first.
I came into reforger late but it's safe to say everything is better than it was on RV, will never touch that again.
Which isn't bad
It's why separations must be made as well on type of modding/content creation
For example mission makers might want more simpler stuff
vs gameplay/system modders
Or advanced mission making modders
So it is good to identify those general profiles as well
Absolutely
Don't tell that to X39
๐
I'll shout it to them. Absolutely hated my time on a2/a3
Don't ban us for offtopic lol
I will never forget that someone attempted to port and fully make a SQF VM in Enforce Script and used it in mods

I remember hearing this
Generally I do agree, I do like the challenge and that you have way more control. It's just not a good state for mission makers right now. And I guess it won't get better until something Eden-like in A4.
Some modders had insane senior rejection, back to junior modder in a sense with Enfusion
I mean no one likes complete change, but it was for the better here
"had", I think it still there ๐
I'm sure Karel will cook up something for them, it is definitely more daunting for the more casual to get into but honestly anyone with experience outside of just arma should be able tp pickup things relatively quickly. Took me about 22 days to figure out everything I needed just by poking around and after that I was well on my way. The modding experience is just infinitely better now, I'm doing things I would of never done before 
e.g. asset and terrain creation. I never bothered with that in A3 ๐
Pretty much yeah, before last year I never really touched models directly, strictly code.
I can appreciate the value of having an interpreted language for quickly doing stuff.
One of my favorite scripts was one attached to a switch panel in an industrial building that is taken over by the bad guys.
Flipping the switch just turned all the lights on for the map, and maybe unlocked the doors for an objective.
Mostly simple, but I have imagined how to do it in AR, and it's not a fun idea...
Thing is, SQF was just mostly for configs/commands
Then it got misued as language (Better to say it older/parent SQS)
Then it was just widely used like that later
yeah I was going to say don't you mean sqs lol
Workbench crash every single time i try to publish somehting to try ir, for curiosity and hope how are you doing?
I don't even know SQS
Its sqf just more dumbed down, sqf came from it. Slightly different formatting but yeah
Approach is completely different. That is why I never accepted the idea of doing SQF to Enforce Script table kind of thing.
The Scenario Framework tools are actually pretty simple to use for mission making
It's better to learn from scratch
True, it's a neat framework, but probably still overwhelming when coming from Eden.
Think to what C is to C++ in a sense. But SQS to SQF
That depends entirely on what you're trying to do with it. I ended up making a custom mission logic framework which is much easier to use for my purposes.
i personally cant deal with the endless text boxes and combo boxes and drop downs and naming entities and configuring triggers
i just want board with buttons and words
Thats... really accurate..
And we have nice things like AI LOD. Not like back with A2 and older A3 scripts where every scenario had to implement their own dynamic spawn/depsawn or freeze script for optimization ๐
We are never doing macros
It will become a mess quickly
yeah but then i cant make my own domain specific language inside enforce
gonna make me cry man
The way I look at it is that from SQF to Enfusion
Is like
Purely functional to purely object oriented.
Now I handle swapping from python to java to dotnet to lua... I can still see how the swap from SQF to Enfusion is a mind f***
I was about to @ you, Iโve got a mod up for it now โJRM Supply Fixโ. This one has the override for the function that breaks supply.
I have a separate game master mod you also might want to check. It changes the default game master mode (I should have just made a new mode probably) to turn supply on by default, but also mods more settings for GM like turning off the garbage collector since it was deleting our vehicles too often
Please no more QGVAR ๐
I have a custom armor texture mod that uses 3 layers of macros to turn 2000 lines of config into 22000 lines of config. With about 10 lines of config, I could keep generating 2000 lines of config
A lot of modders, and modders joining our company started to use obsessively one line setters and getters
It was because of that we ended up making those get inlined
cant even stringify ๐ญ
Just make a one line method?
It will inline anyway
I don't even know what scripting standards are in rv anymore, that was done over a decade ago lol
Well, you don't have @property like in python, where you could easily extend the implementation of a getter if needed ๐
I mean
If you make a getter
ignoring my reflection obsession im curious if there are any language features planned for the future at all
you can extend it
A lot
And many are done and not reached AR yet
But everything we do is backwards compatible for the language
I am a simple man... I just want
if (auto someVar = Something()) {
// Do the thing
}
Oh and ternary operators.. but meh.
I actually had a language design meeting with a script programmer about this 2 months ago ๐
i am like an addict when it comes to ternary, better to keep access away from me...
This too but I ended on inconclusive
A habbit of C++ I never thought would carry lol
its just so easy to do in the moment when you have all the context in your head
You can use it here too
Inside methods too
but then you come back to the ? : monster a few days later and...
Yeah i've been doing it a lot. I know when I'll see my code in someone elses stuff is I see const everywhere possible, haven't really seen anyone else do it lol
We also thought once about const methods btw
But we decided it is actually risky for our modding ecosystem
If we didn't decide it's risky modding wise, we would have probably also denied the idea because of what it implies technically wise lol
perf wise nothing would be gained because of how they get passed
it would only add to compiler stuff
But then you run into the same issue for constness resolution of a variable, similar to function
So it would be having to solve the same problem
I see.
Place a feedback tracker request and tag me there
Probably a question you get asked a lot, but are there any plans for bridging the gap between Game Master and Modding to achieve what 3den did?
For AR, it's not in the released Roadmap so no
We have not released a roadmap for A4, so don't ask about A4 on that as we can't tell you anything about.
When working power grid?
Ask actual AR devs. Gameplay system so up to them.
Idk if they have notified anything about that
Would be very nice extra feature I got some cool ideas for it, I remember seeing it in the roadmap
You can perhaps ask our release producer/manager for AR
sabatkoo
He is aware of such things, and replies to community here often
People just did not know he was a dev lol
Word nice! Is he usually in this channel or another one?
Tbh
Don't ask any other dev about release of something, as devs dont have the full info on this most of the time
Best bet is to ask him
With other dev is a bit hit and miss
Copy that
I have a general scaling question if you know/allowed to say, the engine used for vbs4 or vbs blue can have gigantic terrains, will this hold true for enfusion? I know u guys are separate companies now but Iโm just curious
Translate it to english
https://cc.cz/herni-unikat-za-ctvrt-miliardy-korun-tvori-jen-15-lidi-ceske-hry-jsou-proste-jedinecne-rika-vyvojar/
But here you get some insight on what the aims are terrain wise
Ty ty!
Kinda pointless to have gigantic terrains when you can't see anyone beyond 1 click. It becomes very notable when fighting from Pik Pobedy. But let's see how it turns out.
Who says big terrains are purely for long range combat 
Fair point. It was more a connection to that Altis doesn't just impress me by the size, but also by the distance of engagements. Just the primary battlefield in Warlords from Lakka military to Anthrakia is huge compared to anything we have in Enfusion so far.
The Australia A3 modded map when? 
U can put server view distance to 12km now
And it looks very beautiful, but I'm talking about dynamic objects like vehicles and characters.
I canโt think of any game that renders characters or cars from more than like 2-3km
Well, I guess you haven't experienced Warlords in Arma 3
Damn Angara tanks could get you from God knows what distance ๐
we need Warlords in reforger
Though Conflict is kind of the next generation of Warlords. The author of Warlords was also heavily involved in Conflict afaik.
But conflict doesn't have the same strong PVPVE focus like in Warlords. In conflict the FIA is just a mere inconvenience in my opinion. Also missing the request menu which was very cool
On the other hand, Conflict has more variety thanks to the base building and supply system. Also the radio connection system is much better. Warlords could end up very annoying, when the enemy could capture any base even far behind enemy lines.
it would be cool if there was a system which could load things based on what the server things the player should be able to see
like if you are using a 30x zoom optic, it should probably tell you about where you are looking
We don't really know how hard it is to implement. It's already notable when you spawn that it can take quite some time to stream all objects in from the server.
dynamic rpl bubble, for zooming on scopes/binos?
is there an LOD cap that prevents spawning beyond just the hard AI limit cap?
So... I have seen this occurring inconsistenly...
Im still trying to figure it out, but why is "NOT_ALLOWED_CUSTOM_LOADOUT"?
I love you, internet stranger, I'm definitely going to check out everything you upload.
which part is occuring inconsistently?
The not allowed custom loadout.
I have seen it occur at random times, but I can't figure out why. My first thought was that it was just MOB, but then I couldn't spawn at base with a custom loadout.
Then I tried radios and I could so I figured radios and bases have different spawn components, but then I could spawn at bases with a custom loadout...
I can't seem to figure out why causes these weird conditions
I just started a fresh round and now its working at the start of the round, but I am looking at code that says it should fail...
Maybe it is dependent on other budgets as well
The budget system as a whole is a scary thought I do not want to think about ๐
I never touched it myself so can't help with it.
@static edge Recently dealt with it for some bugs. Maybe he can help 
I don't think it could be related to another budget type. Based on my search for the fail reason and them reading so far:
Find 1: HQ Tent spawn
Find 2: Backpack radio spawn condition
Find 3: MHQ spawn condition
Find 4: My override of find 1, same as 1 (image above, but also accurately shows find 1)
Find 1 is the condition I want to evaluate and it applies to the HQ tents... but I can't figure out its inconsistencies. Based on the code I am reading, spawning with a custom loadout just is not allowed at all....
place a breakpoint and follow the logic on callstack
While you are here and I don't expect you to have to answer this... I quickly noticed the missing M113 references in the faction config... Was the M113 in the roadmap? I don't recall seeing it. And if it isn't there, isn't this a kind of big leak?
idk anything about assets in roadmap in AR tbh
I am not a producer so I am unaware of those things.
Each player has 7 km2, and the network distance is 2500 km... and yes, the traffic on the server is 800 Mbps
900 / 128 = 7,03125
AR is not A4
nor AR Enf is same as current Enf as well
Gotcha! When will you answer our team's question in a private message? 
we hope...
I think best way to see it is as other games that use Unreal, that they do not instantly go to new release of unreal when unreal releases a new build
Engine and game dev teams are not the same, that is why the Engine is marketed separately and has it's own website as well
It's also why you see updates to engine, bug fixes, etc being "slower" compared to game feature ones.
If A4 ends up using such ludicrous amounts of bandwidth I will be quite disappointed
Does reforger server still send vehicle physics updates every frame?
Also will A4 have predictive player movement lag compensation like battlefield 3 did in 2011?
I have seen on my server the network usage drop from 700-900mbs for two full everon servers, down to 600-700mbs for 3 full servers, 2 everon + 1 kolguyev.
We have a 5900x CPU and I felt (almost) perfectly comfortable now adding a 4th smaller event server to the box to fill in that gap of potential compute.
I'm sure network settings affect it it,
across the board I have
1400 player view distance and 1600 network view distance
Ah so maybe all the servers stalling replication is because they have 20 helicopter pilots with 10km view distance
is there any way to search the logs by text in the server diag thing? is very difficult to use as is
That sounds like a passive agressive comment that does not even involve me....
Take it somewhere else
better place to ask is https://discord.com/channels/105462288051380224/976119935875026964
To answer your question, your server server should be writing to a log file in your profile folder unless the diag server is different..
I'm really lost here... any hint?
i am using the dedicated server tool. thanks
after the new patch I'm crashing when playing on dedicated server... everything fine on the workbench
In what universe is that a passive aggressive comment
You haven't played Reforger recently and experience community servers kicking groups of people over and over for random network replication errors?
Buffer over-read during replication? Did you modify that class "SCR_ExtendedCharacterIdentityComponent"?
no man
One of my mods may have done it... I'll check now
I've seen it a few times with faction mods, but I don't know where those people had gone wrong, specifically. If you haven't made any modifications to that component class, then you probably just supplied it with information in a way that it didn't like.
Wrecked codec i guess
I will check and see
Or rplcallback
problem solved!
my bad configuring 5 static npcs, I misconfigured the rpl component
Since it's already been established A4 Enfusion will have a lot of differences from Reforger Enfusion, are there any plans for some kind of transition period where A4 Enfusion WB is released early so we have time to port our mods to A4 before it comes out?
Or is it just gonna be like A4 drops and it's a mad scramble to port and publish on launch day? ๐
Haha I would love to know as well, cause I already get manic when a new update drops let alone a whole new game i have to update too
Then on launch day they push an update that makes everyone scramble again lol
I hope they are putting us through this pain here in reforger so it doesn't have to happen in A4 ๐ฅฒ
I mean it kind of already is. I spent the last couple weeks converting everything to world systems and world controllers.
I think there are a lot more differences than that, but yeah I've also been splitting my stuff into individual systems to try and make it more portable in advance
I feel like since Reforger is supposedly a testbed to get Enfusion ready for A4 it would make sense that eventually Reforger should be updated to A4 Enfusion so problems (both modded and vanilla) can be ironed out prior to launch. Would be great if BI can clarify the plan instead of us just hoping and assuming though lol
Biggest problem for transition would not be engine changes
As i said, engine changes are almost always backwards compatible
Yeah that makes sense I guess it would mostly be game code changes right?
Yeah
Porting assets
porting script 
Other than that i do not want to say much here right now.
You will have to wait for the blog post i mentioned i intend to do next year
So that modders can know what to expact for these things. And also so that they know about some key changes on the modsing ecosystem planned for 2026
A lot of work on the background from 2024 and this year for modders will start realizing for you next year.
Okay I'll try to hold on to my socks for now, excited to see what's coming! ๐
Being honest
Porting scripts is worse
Assets can be automated
Scripts cant
I don't believe in porting scripts. One of the reasons I made altis life was because before hand people were copying code from previous armas and it was just a giant unreadable pile of slop so I wanted to put a stop to that*.
Yeah
Please break as many things as possible; don't hold back for sake of compatibility
Move fast and break stuff is what Reforger has been all about right?
I make MSFS mods... backwards compatibilty drives me insane there I don't need crap from the 90s in my game
You cabt expect AR to not do changes until they finish roadmap
People need to understand that they are not modding an EOL game
Or a game in just devops
Oh yeah for sure I didn't mean that in any negative way hahah
A4 it'll finally be Consumption and not Consumtion 
Gotta bring back Dammage
Pretty sure i seen that somewhere
So it never really left
The funniest and weirdest part of a2/a3 was Damage and Dammage, both did the same thing.
"Opps spelling mistake, lets just dupe the method and name it properly
"
Hey MarioE, the animation videos on : https://reforger.armaplatform.com/news/modding-animation-workshop-june-12-2024
Were really good, a bit unfortunate it's unlisted on the channel
*I guess it's due to the Bootcamp, but to me it shines to get information quicker than the 3 x 1 hour video ๐
*
On other note, I can see the tutorial are mostly focused on weapons / interractions with items
Our previous talk, my focus was on the Character but I think I can find the root of what I needed from everything I gathered so far ; big thank's! 
Thanks to @icy warren and @hushed plover as well!
obviously the vast majority of scripts interacting with game code will need to be rewritten from scratch but I hope a lot of non-game stuff working with primitive types could be generalized and probably brought over w/ minimal changes.
A clean utility function that maps or filters an array of strings or multiplies some vecs/mats is probably gonna work mostly the same right?
multiplies some vecs/mats
This has been there since TKOM enfornce even
nothing is missing on that
Ah I misread
That comes from engine
Everything you see, from Core and Gamelib module is engine
Yeah and from what you've said it sounds like there aren't any planned major breaking changes to engine APIs, so our utility scripts using them should be mostly portable right?
In general those should be fine
ofc I expect some changes to potentially come up in future but that's good to know
But this isn also it is important to move to systems and controllers now that you have the full thing ๐
Where can I learn more about this systems and controllers thing
Doxygen docs
They are under docs in workbench install dir
same folder where EBT can be found
Or there
Thank you both ๐ซถ
Are you sure it's ready? Last time we tried, half the methods for controllers weren't working properly in MP and adding controllers could potentially even dead lock dedicated servers.
Yeah it was due to the defines issue
Unfortunately that issue also meant other issues for every ohter game system even
as it caused game systems to be enabled and ticking on both client and server, regardless if they were only set to client only, or server only
So if you get some really odd behavior since 1.6
That is probably the isssue
But it's busted? New systems are fine but the controllers just simply do not work the way they should.
Specifically in the case where you have a Server side system and want to notify controller of specific player. I scrapped the whole set up for TDL otherwise I'd show a reproduction, but it's telling that no base game system uses the new controllers (if they did it would not work right now).
Systems are busted in 1.6
They run on both client and server no matter the config
If you set them to client, then it should never run on server for example
Our own devs also had issues with this
Like. I am talking about game systems in here, not controllers
That's not necessarily the worst thing (at least I don't think that was the cause of my pain), but it was registering controllers in any way where they could be communicated with that was my big issue. I'll try to find some example. I tried a lot of things to make that communication work, and failed.
I dont think i am following what you mean ๐
Pre 1.6, you could not use controllers at all
If you tried it before 1.6 then it would have thrown an error telling you that world controllsrs are not supported
So if I recall correctly a big issue is that the method to get a controller for a specific player is busted, so I figured a good way around that issue was my own registration methods on the system each controller would call when instanced. I couldn't get it to work but I can try running a local test to see if I can refresh my mind on it. Couldn't make it useful for my case so switched back to a modded player controller for per player communication.
Ah ok i see
That is the part of the controllers that is broken yes
I talked with relevant enf dev and he pointed out the define thing
Idk if there is even a use case for them with that issue, until it's fixed. Maybe I'm wrong.
I mean systems yes
eta on fix?
Ahh i wonder if thats my issue with spawning players rn.
Have a spawn world system and world player controller
Do you think we're looking at a hot fix for it or wait till 1.7 ?
Is it possible to override multiple classes in different .C files from one script file, or must it be 1:1?
I already hate this message. It makes soft lock for workbench when i try debug respawns and only task manager can help.
Temporary fix while we wait for patch from the devs:
#ifdef WORKBENCH
modded class SCR_ArsenalManagerComponent
{
override SCR_MilitarySupplyAllocationConfig GetMilitarySupplyApplicationConfigData()
{
return null;
}
}
#endif
u can override all classes in one file with random name. Just put that file in "scripts/Game" folder
a good coding is to make file with name based on original. Like for "SCR_BaseGameMode.c" create file "MYTAG_M_SCR_BaseGameMode.c"
its better for reading and navigation in code
I guess it makes more sense to make it 1:1 so I know what applies to what. I was trying to keep things minimal but i know in coding that can become more of a pain ๐
its better to have own name. I dont remember but i had some issue with files with same names. And navigation and searching are more understandable with own names. And debug messages show u where crash was.
If file have same path - it will be replaced entirely
Not 100% true. Classes have to be modified in their module.
If they aren't a part of the Game Module then they can't be modded in "Scripts/Game"
Its valid
Only thing you need to comply with is what @river imp mentioned
@minor agate Speaking of modules, I see I can add my own in my project setting. Is that something that should be avoided?
It would not do anything afaik
Seems to work from a simple test
Was just wondering if it was intended to be used by modders or not.
hey brotha i dont mean to be a bother but can u give an eta for when the littlebird gau 19 will be fixed?
Are world controllers actually even necessary atm or just there to help us compartmentalize side-effects? Cause I have just been doing RPL and mutations on world/entities directly from system itself w/o issues
Hello
Do you know how to possible set for AI group command to destroy one vehicle? I need to spawn AI_Group from script and somehow say to this group, to go and destroy exactly this vehicle. Tried to do it using waypoints like search and destroy, suppress fire or attack, but they are looking for enemy person, not vehicle
would have to give it a think but just wanted to say that I have a workaround for this. I have a script that makes all vehicles "faction active" meaning even if they are empty, AI thinks they are occupied by enemy and they will attack the vehicle until it's destroyed. I achieve this by modding the SCR_VehicleFactionAffiliationComponent class. I'm sure it's fairly easy to take this and make a component to attach to a specific vehicle instead so that only that vehicle remains faction active.
This way you can just send your AI to the vehicle location (using Move waypoint) and they will attack it on sight
Yes, very good workaround. I will try
Controllers are neat if you want two-way communications between server and a specific client. Private controllers are similar to player controllers in that only the owner has a proxy. Public ones have on all clients a proxy, which you can currently only emulate with helper entities that have streaming disabled.
Yeah if the communication wasnโt currently busted
Why is it not possible to cleanly mod SCR_ResourceComponent?
For it to compile I need to explicitly copy over overrides for all the RPL serializer methods, shouldn't these be inherited from the original class I'm modding?
enfusion inheritance is wack af
I've noticed this with anything that uses serializer methods
Its the same with the SCR_MapMarkerBase atleast
seems to just be one of those weird inheritance divergences between script editor and compiler
like how you can do super.super and ctrl+click on the 2nd one in editor takes you to the 2nd parent as you would expect, but in reality compiler flattens it to basically just super
editor seems to be aware that all those methods are already defined on the class I'm inheriting from, but compiler just chokes on it
Anyone know the name of this "Vicinity" title bar widget? Can't seem to find it in any layouts ๐
nvm found it
Widget title = m_wLootStorage.FindAnyWidget("Header");
if (title)
title.SetVisible(false);
This is probably why the codec methods are required in modded classes (to avoid such an issue with multiple mods breaking eachother's replication on a given modded class)
^
super, when used in script VM resolves to this (After compilation)
So super.super => this.super
yeah the problem is the script editor treats it differently so its a bit misleading
It's also why this
MyClass SomeMethod()
{
return super;
}
Is the same as
MyClass SomeMethod()
{
return this;
}
e.g. with an inheritance model of classes C -> B -> A
In script editor if you ctrl+click on a super.super in class C it points you to class A as expected
But VM/compiler that exact same code points to class B instead
seems like script VM bug
Seems odd, afaik that was not issue before
The script VM behaviour is preferable though. What if I want my override to call something on an ancestor class directly, skipping intermediate inherited classes?
Script VM one is the one
Always
Editor is the broken one for this
Like if I actually want to call A.someMethod from an overrided C.someMethod it's not possible, because super.super.someMethod points to class B instead
As it should
super is only for the direct parent
So what would be the correct pattern to achieve what I want in that example??
seems to be messy unless you want vanilla
exactly and I want my override to skip calling that
Forget it and do it a different way
but doesn't seem possible
Yes I am asking what would the different way in this case be?
Call vanilla only allowable?
What script compiler does is make the origina one have a number
So like this
ClassA
modded ClassA
That causes this
Modded ClassA becomes the true ClassA
And Original one becomes ClassA0
then it makes ClassA : ClassA0
yeah that sucks
rinse and repeat
Not really
it should really be maintaining the inheritance heirarchy
You would not have proper class modding without that
But it is?
no, it collapses the inheritance heirarchy to a single parent
ClassA0 still points to the vanilla inheritance
?
No it does not
Things would break everywhere if so
then why doesn't super.super work in my example?
because that never worked in Enforce Script
super is idempotent
super.super => super
super.super.super => super
it has nothing to do with modded classes
you can only access the nearest class you inherit from, not any further up the inheritance hierarchy
that's what i meant by it collapses the heirarchy
What is the desired outcome, vanilla class slate or mod of specific mod?
No because welcome to maintenance hell and bugs galore if so
the only other thing we added, was vanilla
for those modders that do require vanilla super for some reason
Which means the original class's super
So an example would be like if you have multiple mods overriding a single class, and you are doing your own override that you want to skip behaviour of the most recent override in the inheritance stack and call a method on the one it inherits from
Yeah but mod load order means it won't be determinate, whatever mod you are trying to skip could be anywhere
I wonder where you got this idea
i.e. skip an override while still applying others
This
if super refers to the class a current class inherits from, then it logically follows that super.super should refer to the next step up in the inheritance stack
but you are still conceptually on the same class
you never moved up
super gave you the inherited class type
and super only works on instances
not on types
super is not .GetParent()
from the behaviour of the engine script editor ๐
like I said, that's how the script editor behaves
you can do super.super and it will refer to the class you are inheriting inherits from
So
You want to reference the original?
if so, use vanilla.MyMethod()
yes but it's not necesarrily vanilla code
Forget those ideas then
as mods do not even follow dependency order for scripts
sorry not the original, I mean like an intermediate modded class
It's based on directory alphabetical order
Yeah forget about that if you want to target a specific one
it's not deterministc so that is why we never added it
I had this discussion with enfusion when we were improving the language design of inheritance and modded classes
scripts/Game/GameMode/Respawn/AG0_RespawnSystemComponent.c(14): error: 'vanilla' keyword can be used only in modded classes
scripts/Game/GameMode/Respawn/AG0_RespawnSystemComponent.c(14): error: Can't find variable 'vanilla'
like say with my example earlier those C -> B -> A classes are all inheriting from a vanilla class.
I might want my mod to skip the behaviour implemented by another mod in class C and directly call the same method from the override by another mod in class B
double vanilla no work
Did you mod the class?
vanilla only makes sense on modded
So that is why it requires modded
ok, good
I guess the practical use-case for what I've been talking about would be if you wanted to integrate 2 mods that touch the same classes and conflict, if we could reference specific inheritance ancestors then it'd be as simple as finding which ancestor has the behaviour you want and calling it in your override instead of super.Method(), or you could even call the method on both ancestors and merge results etc
Some things can be done, but it can be troublesome depending on what
For example
I mean if Mod B isn't destructive, you could just undo whatever super in mod B does, tailored to that situation specifically. There is rarely bevaviour that cannot be unset (like if Mod A says var A is true, B says false, just set to true again in C), but determinism is still not there for load order. The best load order is probably mod B not being loaded.
class A
{
void SomeMethod()
{
Print("A ran!");
}
}
class B : A
{
override void SomeMethod();
{
super.SomeMethod();
Print("B ran!");
}
void SomeMethodFromA()
{
super.SomeMethod();
}
}
If you call B.SomeMethodFromA() then you get "A ran!"
even if you do this
class C : B
{
override void SomeMethod();
{
super.SomeMethod();
Print("C ran!");
}
}
If you call C.SomeMethodFromA() then you get "A ran!"
so mod b needs an interface, or you have another mod, mod Mod B to exist for the sole purpose of calling mod A super
but overall
this is those things called failure pattern or antipattern
It's really bad overall
So try to do it differently
It just brings with it issues
Work with the idea that you can't expect what other modders do
and the order of their class members overrides
Unfortunately it seems the only real alternative is to re-implement the behaviour you want from an ancestor class directly and just not call the super method at all which is what I've been doing ๐
Just thought it would be nice if there was a simpler way to do it but yeah I can see how it could cause problems
Copy pasting the code and not calling super
will break your thing very easily
as if we update that class methdo
you are scuffed
if a mod loads with you, and they needed something they added to the method
Your mod now becomes highly incompatible
etc etc
work with the idea to use super at all costs



