#enfusion_scripting

1 messages ยท Page 20 of 1

minor agate
#

Which makes it worse.

#

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.

mossy spade
#

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.

minor agate
#

It's not about that

ebon escarp
#

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:

minor agate
#

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.

ebon escarp
minor agate
#

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.

minor agate
mossy spade
# minor agate I am saying, if you see an issue. And you ignore reporting or telling us. You wi...

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".

minor agate
#

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.

ebon escarp
# minor agate What exactly are you trying to do?

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.

minor agate
#

Which is not possible

candid swallow
#

woah throw back ๐Ÿ˜‚
This was 3 or 4years ago, when there was no documentation, I accept I may have been very wrong!

ebon escarp
minor agate
#

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

ebon escarp
minor agate
#

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

ebon escarp
#

For future people who search for this in the Discord history, like I tried to:

  1. 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)
  2. Implement an override event protected void OnDiag(float timeSlice) { ... } in your System class
  3. Run the game in the Workbench editor
  4. Hold WindowsKey + LeftAlt, and use the keyboard arrow keys to go into the System menu and then use the right arrow key to turn on the "system diag" (change it from "none" -> "basic" or "full")
  5. 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
  6. Now, your OnDiag function 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!
ebon escarp
minor agate
scarlet iris
#

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?

scarlet iris
ocean needle
#

probably a lot more than that will be very different too
hopefully lots of upgrades

minor agate
#

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()

minor agate
scarlet iris
scarlet iris
minor agate
#

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.

serene yew
desert escarp
#

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

minor agate
ocean kernel
#

Last time I tried to use my own callqueue it was never called so w/e

scarlet iris
minor agate
ocean kernel
#

If I need to call the callqueue, whats the point

minor agate
#

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

ocean kernel
#

Use your own callqueue but remember to call it in update, so you have a callqueue for a callqueue

minor agate
#

It's major causes of our throttles most of the time

#

Specially on modded servers

ocean kernel
#

So to have my own callqueue I also need a system to call it

minor agate
#

No

#

You can just do this

desert escarp
minor agate
#

1 line in OnUpdate of Game class

ocean kernel
#

Yeah exactly. When is access to the global one being removed then?

minor agate
desert escarp
#

I tried down the path and anything I did was just stupidly convoluted or just too specific for general use

minor agate
#

But

#

If you want to avoid thottles or not being part of the problem

#

Then just make your own

ocean kernel
#

What's a throttle?

minor agate
#

Could be general for your whole mod

desert escarp
#

What does throttling look like on a server?

ocean needle
#

latency i would assume

minor agate
#

Which then stalls everything else

#

Including replication

desert escarp
#

Are client sided call laters bad or just the ones called on the server

minor agate
#

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

ocean needle
#

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

minor agate
#

They all get compiled as whole package at the end

ocean needle
#

ah i see

#

n/a then

minor agate
#

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 ๐Ÿ˜‰

midnight talon
#

Thanks for clarifying all that Mario will keep it in mind to rewrite my global callqueue usages ๐Ÿ™‚

desert escarp
scarlet iris
#

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?

minor agate
#

It's the name of the error when repliction gets broken to point of no return

#

So it stops and crashes

desert escarp
#

Ah okay, so the call queue does not cause stalling then

minor agate
#

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

desert escarp
#

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

minor agate
#

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

desert escarp
#

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?

minor agate
desert escarp
queen silo
desert escarp
#

Is that amount hard coded or just via how many bytes you've sent in one frame

minor agate
minor agate
#

iirc the size was removed?

#

I will ask too

desert escarp
midnight talon
#

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

desert escarp
minor agate
midnight talon
#

(I mean using the automatic replication stuff not manually RPCing everything)

minor agate
#

So that most likely will only stay with us

#

Very risky

midnight talon
#

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

analog python
#

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 meowsweats

red cedar
#

๐Ÿš€ The system has started successfully

maiden goblet
red cedar
#

@Grok is that true?

ocean needle
#

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

scarlet iris
#

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?

analog python
ocean needle
#

in workbench btw didnt specify

analog python
ocean needle
#

i see, good to know then
ty

frail olive
#

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.

frail olive
solid hearth
#

Overwrite removing that line.

frail olive
#

Awesome. Thank you again ๐Ÿ™

solid hearth
fringe prairie
ocean needle
#

i had started making a logger and used that as a default value to then discover none of my logs were logging

ocean needle
#

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 Pain

#

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...

scarlet iris
#

Does this actually work for changing the skill level for AI? combat.SetAISkill

ocean kernel
#

Last time I had a look at it, it was used for aiming error only

scarlet iris
torn bane
ivory cobalt
#

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

minor agate
ivory cobalt
#
// 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.
//------------------------------------------------------------------------------------------------```
lofty nest
#

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

ocean needle
# minor agate Can you show me an example of exactly what you want?

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;
  // ...
}
ocean needle
pliant ingot
ocean needle
#

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

pliant ingot
ocean needle
#

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

ocean needle
#

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

pliant ingot
ocean needle
#

ive used a ton of different languages wdym

ocean needle
#

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

forest arrow
#

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()

timid citrus
#

What's best way to suppress the default camera in ocaen at 0 0 0 and ocean sounds on init?

torn bane
timid citrus
forest arrow
#

@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?

scarlet iris
torn bane
scarlet iris
torn bane
#

Dedicated server or in workbench too?

forest arrow
#

Can someone share the example or tutorial how to play music\sound by script command for all players on server?

scarlet iris
# forest arrow Can someone share the example or tutorial how to play music\sound by script comm...

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.

forest arrow
#

Thanks for now. Will test it

ionic yacht
#

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()

frail olive
# solid hearth Overwrite removing that line.

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?

solid hearth
#

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 WorryShrug

frail olive
#

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

solid hearth
#

No idea, never really used the editor gm.

frail olive
#

Ah I got it! The parent init was loading my unmodded event handler, so I needed to re-register the new one

icy folio
restive island
frail olive
steady bay
#

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.

torn bane
torn bane
#

Read what I said again, slowly. And then read what the popup says.

steady bay
torn bane
# steady bay

These are all from the base game, do not worry about those

steady bay
# torn bane 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

torn bane
# steady bay

Unload all mods, make sure you are not mix matching experimental gproj in your launch list with non exp tools etc.

steady bay
#

@torn bane

#

that i am only start scenario in editor without mods

torn bane
#

That is entirely unrelated, script errrors would be shown to you on compilation, open the script editor ...

torn bane
#

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.

steady bay
#

4 files - i send its if i start my mod packs

steady bay
steady bay
#

Iโ€™ve been reinstalling everything for the second day in a row.

torn bane
#

Please stop pining me. I am unable to help you beyond this

solid hearth
# steady bay

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.

steady bay
icy folio
frail olive
# icy folio I'm really just starting out with Workbench, I'm a bit lost, I don't know where ...

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.

sage shard
#

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

minor agate
#

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.

sage shard
#

i appreciate the pointers will check out what you mentioned!โค๏ธ

silent shard
# sage shard i have alot of time on my hands, whats the best way to learn scripting in genera...

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:

  1. not understanding what they are trying to do.
  2. not understanding the tools available to solve the problem.
  3. 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 salute God speed, mothertrucker.

minor agate
#

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

misty escarp
#

lol 30 minutes, I feel guilty asking about something if I haven't worked on it for at least 3 hours

minor agate
#

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.

ocean kernel
#

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.

scarlet iris
ocean kernel
#

No I'll get banned for suggestions related to not wasting time

misty escarp
# scarlet iris can you give an example of this?

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

ocean kernel
#

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.

pliant ingot
#

Or pass scriptinvoker which you create temporary just for this function call

torpid juniper
ocean kernel
ocean kernel
torpid juniper
desert escarp
#

Give us pointers, let us allocate memory, I swear I'll use it for good

pliant ingot
desert escarp
#

Let me make my own seg fault crashes god dammit

torn bane
minor agate
#

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.

minor agate
#

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

minor agate
misty escarp
#

I don't know what "systems" mean when talking about ARMA reforger

minor agate
minor agate
# torn bane

Yeah no, at this point it takes you even less time to provide the func to work in scripts i would say

ocean needle
minor agate
ocean needle
#

without having to use an arbitrary value preferably

minor agate
#

Globaly?

#

Or per instance?

ocean needle
#

would be per instance

minor agate
#

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

ocean needle
#

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

minor agate
#

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

spice shale
#

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 meowsweats Thank you in advance

minor agate
#

Sometimes more control is not better if people that will use it will cause risky situations on game/engine

ocean needle
#

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

minor agate
#

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

minor agate
#

Probably a modifier would do it

ocean needle
#

that would be very cool but what are the chances itll happen Dwayne

minor agate
#

Very low on backlog

ocean needle
#

one can dream

minor agate
#

adding modifier means quite some work

ocean needle
#

yeah i can see that

minor agate
#

So it will land on lowest prio as it's not even a common thing to be used

ocean needle
#

well at least i know theres a chance now lol ty for your time meowheart

minor agate
#

You can kind of do something similar with method static variable

#

but that will be for first call of a class method overall

ocean needle
#

ive already been spamming bools but its grown to the size where a map is more sensible

minor agate
#

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

torn bane
#

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

minor agate
#

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

ocean needle
#

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)

forest arrow
#

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?

minor agate
#

A bad ref sad_cat

forest arrow
#

you mean just this is the reason? remove ref from array?

minor agate
#

Probably not in this case

forest arrow
#

in debug, children is always null, cant get first too

minor agate
#

But it's a bad ref

#

you can get some memory corruption

forest arrow
#

will fix, its just for testing)

forest arrow
minor agate
#

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

forest arrow
minor agate
#

Each child should have it

forest arrow
#

Okay, let me try

forest arrow
minor agate
#

But idk if Hierarchy component will not break many things in the game for Vehicles

minor agate
forest arrow
#

why it could break?

#

example pls, if you can

minor agate
#

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

forest arrow
#

Understood. Will check, thanks

midnight talon
slow acorn
#

In SCR_SpawnLogic there is references to "player controller cleanup". Anyone know off hand which class handles that?

fringe prairie
torn bane
frail olive
# torn bane Gamemode onplayerdisconnect. it will delete the controller charr of the controll...

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

barren prawn
#

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

torn bane
wooden fossil
#

anyone wanna help on this shet?

#

that feature done but ship gonna take a lot of scripting hahaha

frail olive
wooden fossil
#

lemme know anyway anyone welcome xoxox making multiuple ships

cobalt shoal
#

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
    }
}
river imp
cobalt shoal
#

Base Player Character !

minor agate
#

or the 3rd anim workshop

#

Both show similar but diferent things

dire sinew
#

I think EOnSimulate is only running when simulation is active. So something like Physics::SetActive or Physics::ChangeSimulationState is also needed.

minor agate
#

It will cause desync anyway to do it the way he is trying

#

You are suppsoed to do things in very specific times

cobalt shoal
#

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 ^^

minor agate
# cobalt shoal Thank's guys, I'll take a deeper look at the Bootcamp and the Anim Workshop I ke...

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...

โ–ถ Play video
#

I would say watch all 3 tbh

#

At least to get idea of whole anim workflow

#

Also these 3 are tied together

cobalt shoal
#

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

river imp
#
    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?
minor agate
#

They were done beforehand and show extra different things too

cobalt shoal
#

Ty for extra resources

minor agate
#

A bit of topic

#

But your name rings a bell to me

#

Were you active in DZ modding back then?

river imp
#

I believe he was.

cobalt shoal
#

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

minor agate
#

Even many people on lead positions were modders

dire sinew
minor agate
#

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 ๐Ÿ™‚

river imp
#

It's a gadget btw.

#

Just a non looping animation of the upper body

minor agate
#

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

river imp
#

yeah everything seems to work fine.

dire sinew
#

Can't be worse than the carrying compartment approach ๐Ÿ˜…

river imp
#

override player_main.agr to add the custom command

river imp
minor agate
#

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

river imp
#

Oh nice!

minor agate
#

So that means that Behavior Trees, Audio Files, etc will becoem fully moddable too

river imp
#

A4 or AR?

minor agate
#

Paths, connections, transitions, nodes, removal of nodes, addition of nodes, connecting to mods, etc

minor agate
cobalt shoal
#

That's good to know, I need to be careful on my side then since I try to add a melee stance PES3_SadCoffee

minor agate
#

It's part oft he unification of graph editors process

#

It's why you saw the anim editor have a new look

river imp
#

Yeah, I was wondering what that's about.

#

Are Proc Anims going away for AR?

dire sinew
#

That would solve so many potential mod conflicts

minor agate
#

That is why there was no mention of it in modding bootcamps as well

river imp
#

Is it unadvised to use Animation::SetBone and such?

minor agate
river imp
#

I've used them a few times and haven't had any issues.

minor agate
#

It just overrides locally bone transform on top of resolved animations

dire sinew
#

I basically already abaondoned proc anims. The editor is already partially broken and they seem unreliable to begin with.

river imp
#

Now for simple things like that i just do it from script.

dire sinew
#

Yeah, though if only the setter and getter for bone matrices had any consistency ๐Ÿ™ˆ

river imp
#

I don't think i've been able to get Animation::ShowMesh to work though.

minor agate
#

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

dire sinew
#

There are just cases where manipulating bone matrices with scripts is much more convenient like for animating buttons on a gadget.

minor agate
#

It's there, use it when it's better

river imp
#

A great use for proc anims instead of actual "animations"

minor agate
#

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

river imp
#

but i prefer the scripted approach for simple things.

minor agate
#

It's why that other editor became obsolete

solid hearth
#

Graph scares me desperj

river imp
#

Yeah, it's a mess of "what's this node do" lol

minor agate
#

๐Ÿ˜…

dire sinew
#

Graphs are great, you can use them to encode molecules as well ๐Ÿ˜„

solid hearth
#

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.

minor agate
solid hearth
#

So when I look at the animation graph, proc editor and even sound editor, confuses the shit out of me

minor agate
#

and it's turing complete.

river imp
minor agate
#

I did an experiment once as well and made arkanoid game, played within the graph editor itself lol

minor agate
#

(YOu can make functions and vars too)

river imp
#

When you gonna make the "character height mod" for reforger?

minor agate
river imp
#

Hahaha

#

I don't blame you.

solid hearth
#

When you gonna make a free dlc for character height adjustment

minor agate
#

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.

river imp
minor agate
#

For example right now I am not working

scarlet iris
minor agate
river imp
minor agate
#

๐Ÿ˜…

river imp
#

He's working for them, for us.

#

You're welcome. lol

minor agate
#

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

river imp
#

Can you get them to make the ammo array accessible from script? lol

solid hearth
#

And fire modes, sway

dire sinew
minor agate
#

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

river imp
#

I think it's pretty good as is currently.

dire sinew
#

It's way trickier than SQF though

river imp
#

But now you're kind of expected to know some things first.

solid hearth
#

I came into reforger late but it's safe to say everything is better than it was on RV, will never touch that again.

river imp
#

Which isn't bad

minor agate
#

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

minor agate
#

๐Ÿ˜…

solid hearth
#

I'll shout it to them. Absolutely hated my time on a2/a3

river imp
#

Don't ban us for offtopic lol

minor agate
#

I will never forget that someone attempted to port and fully make a SQF VM in Enforce Script and used it in mods

solid hearth
dire sinew
#

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.

minor agate
#

I mean no one likes complete change, but it was for the better here

dire sinew
#

"had", I think it still there ๐Ÿ™ˆ

solid hearth
#

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 PepeHappy

dire sinew
#

e.g. asset and terrain creation. I never bothered with that in A3 ๐Ÿ˜…

solid hearth
#

Pretty much yeah, before last year I never really touched models directly, strictly code.

storm bobcat
#

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...

minor agate
#

Then it got misued as language (Better to say it older/parent SQS)

#

Then it was just widely used like that later

solid hearth
#

yeah I was going to say don't you mean sqs lol

icy folio
dire sinew
#

I don't even know SQS

solid hearth
#

Its sqf just more dumbed down, sqf came from it. Slightly different formatting but yeah

minor agate
scarlet iris
minor agate
#

It's better to learn from scratch

dire sinew
minor agate
sweet badger
ocean needle
#

i just want board with buttons and words

solid hearth
ocean needle
#

speaking of c

#

we can get 100% more perf out of our perf

#

if we enable macros

dire sinew
#

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 ๐Ÿ˜…

minor agate
#

It will become a mess quickly

ocean needle
#

yeah but then i cant make my own domain specific language inside enforce

#

gonna make me cry man

storm bobcat
solid hearth
#

People hated me because of my obessive use of macros in a3

frail olive
# icy folio Workbench crash every single time i try to publish somehting to try ir, for curi...

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

dire sinew
#

Please no more QGVAR ๐Ÿ™ˆ

solid hearth
#

probably

#

but c'mon, thats valid no?

storm bobcat
# minor agate We are never doing macros

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

minor agate
#

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

ocean needle
#

cant even stringify ๐Ÿ˜ญ

minor agate
#

It will inline anyway

solid hearth
#

I don't even know what scripting standards are in rv anymore, that was done over a decade ago lol

dire sinew
ocean needle
#

ignoring my reflection obsession im curious if there are any language features planned for the future at all

minor agate
#

you can extend it

minor agate
#

And many are done and not reached AR yet

#

But everything we do is backwards compatible for the language

solid hearth
#

I am a simple man... I just want

if (auto someVar = Something()) {
    // Do the thing
}
#

Oh and ternary operators.. but meh.

minor agate
ocean needle
#

i am like an addict when it comes to ternary, better to keep access away from me...

solid hearth
#

I am becoming addicted to usage of const

minor agate
minor agate
#

That is actually good

solid hearth
#

A habbit of C++ I never thought would carry lol

ocean needle
#

its just so easy to do in the moment when you have all the context in your head

minor agate
#

Inside methods too

ocean needle
#

but then you come back to the ? : monster a few days later and...

minor agate
#

It does help perf

#

It can make an assignment 3 times faster

solid hearth
#

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

minor agate
#

But we decided it is actually risky for our modding ecosystem

solid hearth
#

That sounds like a nightmare to implement

#

What about parameters on methods?

minor agate
minor agate
#

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

solid hearth
#

hmm I see.

minor agate
storm bobcat
#

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?

minor agate
#

We have not released a roadmap for A4, so don't ask about A4 on that as we can't tell you anything about.

shrewd nova
#

When working power grid?

minor agate
#

Idk if they have notified anything about that

shrewd nova
#

Would be very nice extra feature I got some cool ideas for it, I remember seeing it in the roadmap

minor agate
#

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

shrewd nova
#

Word nice! Is he usually in this channel or another one?

minor agate
#

reforger experimental and general iirc

minor agate
#

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

shrewd nova
#

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

minor agate
# shrewd nova I have a general scaling question if you know/allowed to say, the engine used fo...
CzechCrunch

Filip Doksanskรฝ uลพ skoro ฤtvrt stoletรญ pomรกhรก z Bohemia Interactive tvoล™it nejvฤ›tลกรญ ฤeskรฉ hernรญ studio. I dรญky nฤ›mu vznikรก hernรญ engine Enfusion.

#

But here you get some insight on what the aims are terrain wise

shrewd nova
#

Ty ty!

dire sinew
#

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.

minor agate
dire sinew
#

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.

minor agate
shrewd nova
dire sinew
#

And it looks very beautiful, but I'm talking about dynamic objects like vehicles and characters.

shrewd nova
#

I canโ€™t think of any game that renders characters or cars from more than like 2-3km

dire sinew
#

Well, I guess you haven't experienced Warlords in Arma 3
Damn Angara tanks could get you from God knows what distance ๐Ÿ˜…

scarlet iris
#

we need Warlords in reforger

dire sinew
#

Though Conflict is kind of the next generation of Warlords. The author of Warlords was also heavily involved in Conflict afaik.

scarlet iris
dire sinew
#

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.

fringe prairie
#

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

dire sinew
#

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.

gloomy lynx
#

dynamic rpl bubble, for zooming on scopes/binos?

tough cave
#

is there an LOD cap that prevents spawning beyond just the hard AI limit cap?

storm bobcat
#

So... I have seen this occurring inconsistenly...

#

Im still trying to figure it out, but why is "NOT_ALLOWED_CUSTOM_LOADOUT"?

icy folio
misty escarp
storm bobcat
# misty escarp 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...

minor agate
#

Maybe it is dependent on other budgets as well

storm bobcat
#

The budget system as a whole is a scary thought I do not want to think about ๐Ÿ™ƒ

minor agate
#

@static edge Recently dealt with it for some bugs. Maybe he can help sideeye

storm bobcat
#

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....

minor agate
storm bobcat
minor agate
#

I am not a producer so I am unaware of those things.

plush tendon
# minor agate

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

minor agate
#

nor AR Enf is same as current Enf as well

plush tendon
halcyon crag
minor agate
# halcyon crag 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.

ocean kernel
#

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?

storm bobcat
#

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

misty escarp
scarlet iris
#

is there any way to search the logs by text in the server diag thing? is very difficult to use as is

storm bobcat
#

Take it somewhere else

storm bobcat
manic carbon
#

I'm really lost here... any hint?

scarlet iris
manic carbon
misty escarp
#

You haven't played Reforger recently and experience community servers kicking groups of people over and over for random network replication errors?

silent shard
manic carbon
#

One of my mods may have done it... I'll check now

silent shard
#

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.

minor agate
#

I will check and see

minor agate
#

Or rplcallback

manic carbon
#

my bad configuring 5 static npcs, I misconfigured the rpl component

midnight talon
# minor agate nor AR Enf is same as current Enf as well

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? ๐Ÿ˜„

desert escarp
spark otter
#

Then on launch day they push an update that makes everyone scramble again lol

scarlet iris
timid citrus
midnight talon
#

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

minor agate
#

As i said, engine changes are almost always backwards compatible

midnight talon
#

Yeah that makes sense I guess it would mostly be game code changes right?

minor agate
#

Yeah

solid hearth
#

Porting assets cat_thumbs_up porting script NoNo

minor agate
#

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.

midnight talon
#

Okay I'll try to hold on to my socks for now, excited to see what's coming! ๐Ÿ™‚

minor agate
#

Porting scripts is worse

#

Assets can be automated

#

Scripts cant

solid hearth
#

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*.

minor agate
#

Yeah

maiden goblet
#

Please break as many things as possible; don't hold back for sake of compatibility

midnight talon
maiden goblet
minor agate
#

People need to understand that they are not modding an EOL game

#

Or a game in just devops

midnight talon
#

Oh yeah for sure I didn't mean that in any negative way hahah

solid hearth
#

A4 it'll finally be Consumption and not Consumtion cat_thumbs_up

solid hearth
#

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. eeeh "Opps spelling mistake, lets just dupe the method and name it properly nodd "

cobalt shoal
#

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! PES3_HoldHeart

minor agate
#

Uhm

#

I wonder why they are unlisted

minor agate
midnight talon
minor agate
#

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

midnight talon
midnight talon
#

ofc I expect some changes to potentially come up in future but that's good to know

minor agate
#

But this isn also it is important to move to systems and controllers now that you have the full thing ๐Ÿ˜‰

scarlet iris
#

Where can I learn more about this systems and controllers thing

minor agate
#

They are under docs in workbench install dir

#

same folder where EBT can be found

minor agate
#

Or there

scarlet iris
#

Thank you both ๐Ÿซถ

minor agate
#

but that one is not updated that much

#

One in install dir is always up to date

dire sinew
minor agate
#

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

fringe prairie
# minor agate But this isn also it is important to move to systems and controllers now that yo...

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).

minor agate
#

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

fringe prairie
#

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.

minor agate
#

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

fringe prairie
#

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.

minor agate
#

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

fringe prairie
#

Idk if there is even a use case for them with that issue, until it's fixed. Maybe I'm wrong.

pliant ingot
timid citrus
#

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 ?

dense plank
#

if anyone can help me make a faction

#

i can talk on vc

restive island
#

Is it possible to override multiple classes in different .C files from one script file, or must it be 1:1?

abstract crescent
#

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
abstract crescent
abstract crescent
#

its better for reading and navigation in code

restive island
abstract crescent
pliant ingot
river imp
#

If they aren't a part of the Game Module then they can't be modded in "Scripts/Game"

minor agate
#

Only thing you need to comply with is what @river imp mentioned

river imp
#

@minor agate Speaking of modules, I see I can add my own in my project setting. Is that something that should be avoided?

minor agate
river imp
#

Seems to work from a simple test

minor agate
#

Should be okay

#

Why would it be an issue?

#

Its just isolated compilation units

river imp
#

Was just wondering if it was intended to be used by modders or not.

ionic bear
#

hey brotha i dont mean to be a bother but can u give an eta for when the littlebird gau 19 will be fixed?

midnight talon
forest arrow
#

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

scarlet iris
# forest arrow Hello Do you know how to possible set for AI group command to destroy one vehicl...

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

forest arrow
#

Yes, very good workaround. I will try

dire sinew
fringe prairie
#

Yeah if the communication wasnโ€™t currently busted

midnight talon
#

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

desert escarp
#

Its the same with the SCR_MapMarkerBase atleast

midnight talon
#

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

midnight talon
#

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);
fringe prairie
#

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)

minor agate
#

So super.super => this.super

midnight talon
minor agate
#

It's also why this

MyClass SomeMethod()
{
  return super;
}

Is the same as

MyClass SomeMethod()
{
  return this;
}
midnight talon
#

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

minor agate
#

Seems odd, afaik that was not issue before

fringe prairie
#

The game also will error I believe without those codecs

#

iirc

midnight talon
#

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?

minor agate
#

Always

#

Editor is the broken one for this

midnight talon
#

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

minor agate
#

super is only for the direct parent

midnight talon
#

So what would be the correct pattern to achieve what I want in that example??

fringe prairie
#

seems to be messy unless you want vanilla

minor agate
#

the direct parent could be another modded version of the class

#

before yours compile

midnight talon
minor agate
midnight talon
#

but doesn't seem possible

minor agate
#

Because of modding, you can't cather to that

#

when you mod a class

midnight talon
fringe prairie
#

Call vanilla only allowable?

minor agate
#

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

midnight talon
#

yeah that sucks

minor agate
#

rinse and repeat

minor agate
midnight talon
#

it should really be maintaining the inheritance heirarchy

minor agate
#

You would not have proper class modding without that

midnight talon
#

no, it collapses the inheritance heirarchy to a single parent

minor agate
#

ClassA0 still points to the vanilla inheritance

minor agate
#

No it does not

#

Things would break everywhere if so

midnight talon
#

then why doesn't super.super work in my example?

minor agate
#

super is idempotent

#

super.super => super

#

super.super.super => super

#

it has nothing to do with modded classes

midnight talon
#

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

fringe prairie
#

What is the desired outcome, vanilla class slate or mod of specific mod?

minor agate
#

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

midnight talon
fringe prairie
#

Yeah but mod load order means it won't be determinate, whatever mod you are trying to skip could be anywhere

minor agate
midnight talon
#

i.e. skip an override while still applying others

minor agate
#

even in C# this is strictly forbidden

#

base.base not a thing

midnight talon
#

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

minor agate
#

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()

midnight talon
#

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

minor agate
#

Yeah that needs to be fixed ๐Ÿ˜…

#

I wonder what vanilla.vanilla gives

minor agate
#

You want to reference the original?

#

if so, use vanilla.MyMethod()

midnight talon
minor agate
#

as mods do not even follow dependency order for scripts

midnight talon
#

sorry not the original, I mean like an intermediate modded class

minor agate
#

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

fringe prairie
#
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'
midnight talon
#

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

fringe prairie
#

double vanilla no work

minor agate
#

vanilla only makes sense on modded

#

So that is why it requires modded

fringe prairie
#

Yeah, double vanilla was the test

#

single vanilla fine

minor agate
#

ok, good

midnight talon
#

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

minor agate
#

For example

fringe prairie
#

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.

minor agate
#
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!"

fringe prairie
#

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

minor agate
#

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

midnight talon
#

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

minor agate
#

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