#arma3_tools

1 messages ยท Page 37 of 1

sly skiff
#

well A3PL is full of crap

#

so who knows

dawn palm
#

tools update:
Eliteness:
pew: fixed crash when decoding pew object id's
added object example for each template clicked on
dll:
convertwrp: fix to pew column transform matrix (credit kwan)
rapify: fixed curly brace macro t = QUOTE({({1})}; call f); (credit @glossy inlet )
makepbo: creating a texheaders.bin is now silent. (credit @wind elm )
me: rapify: fixed potential error with #quoted strings in macros

opaque pendant
#

I mean you cannot calculate weapon range and impact from just the weapon, the ammo matters too
@glossy inlet
Which is why i was looking for a formula or something similar. However this is the wrong channel for this, and im taking your advice about looking again at the wiki. Apparently i was looking at the wrong one before

zealous fox
#

Are there any special requirements for C# ? I get an "ErrorMessage: Buffer overrun detected when using extension testExtension" on a simple DLL

#

If I run the extension in KillzoneKids callExtension v2, all went fine

#

BattlEye is disabled for testing

native kiln
#

whats the code of your simple dll

zealous fox
#

I think I missed a simple outputSize--;

#

This is working

ionic dock
#

anyone elae have troubles to use the Game Updater with Steam Guard active?

glossy inlet
#

Yes its broken

#

I have fix if you need

#

should work I think

ionic dock
#

thanks I'll test

vague shard
ionic dock
#

then I could also just use the standard steam cli client. Should work the same. Not sure why I didn't think of it first. Thanks for your suggestions

ionic dock
#

@vague shard thanks, your linked app seems to work. However I had to switch the depot id to Arma 3 Content instead (107411) for it to make it work

ionic dock
vague shard
#

np

#

small advertisement for it ๐Ÿ˜›

why use this?

  • easy to configure due to good docu
  • ensures download to work
  • sync and mirror features
tame monolith
glossy inlet
#

they are slow yes

tame monolith
#

ok. How slow? I send my email like 7 month ago. Is there still a chance that something will come out of this?

glossy inlet
#

That sounds a bit too slow ๐Ÿ˜„

#

Just distribute your extension, and let many players attempt to load it

#

it will be submitted to battleye auto whitelisting thing

tame monolith
#

auto whitelisting?

glossy inlet
#

Yes that

tame monolith
#

ok thx. I will keep trying^^

dawn palm
#

latest linux tarball of my tools now available (credit @surreal wolf )

craggy lake
#

@ dedmen for your full dump I assume I need to pack the config folder into a PBO and run it as a mod is that correct?

glossy inlet
#

isn't there a mod under releases on github?

craggy lake
scenic canopy
#

probably easier to help if you state your problem

scenic canopy
#

I guess he decided he doesn't need help anymore thinkinghuh

dawn palm
#

probably an a3lifer who didn't want to say exactly what he wanted or was doing in case some one else profited from it.

scenic canopy
#

@native kiln I guess you already noticed but steamkit fixed the problem with CDN list 7 days ago

#

with unsupported type that was added, OpenCache

native kiln
#

@scenic canopy can you link me the issue? cant seem to rememeber the issue youre referring to
edit: i see now

nocturne basin
#

Someone here experienced in Bison syntax file debugging? Got some nasty reduce reduce error

vague shard
#

are dlls only loaded from the game dir/same folder as the exe, or is in a modfolder also valid?

scenic canopy
#

extensions can (and should) be loaded from mod folders

karmic niche
#

Both location are taken into account when loading a dll

#

(mod directory and arma3.exe location)

ionic dock
vague shard
#

ive used it only for mod sync so far

ionic dock
#

ah, fair enough, probably the prof branch is on a different depot id. A autoselect of given depot id would be lit

#

thanks for the tool once again ^^

scenic canopy
#

its the same name, you used the password as branch name

ionic dock
#

it is not

#

not for steamcli

#

for steamcli the profiling branch name is profiling and the pw is CautionSpecialProfilingAndTestingBranchArma3 the depot id is 249503 where as public branch uses public as branch name and depot id is 104711 there

scenic canopy
#

you should take another look at your image then

ionic dock
#

why should I? What is your point?

#

I got my issue solved as stated above kju's reply with correct use of the branch names and depot id's so I'm not sure what you mean by "look at your image"

scenic canopy
ionic dock
#

yeah and?

#

I'm not sure what you want me to tell. The Branch is the branch name, not the branch password, that was the main issue. And of course the profiling branch is on another depot id

#

ยฏ_(ใƒ„)_/ยฏ

#

everything works as expected, I don't get your point

glossy inlet
#

The Branch is the branch name, not the branch password
Exactly thats his point

ionic dock
#

that still wouldn't make sense with his original reply. its the same name, you used the password as branch name when refering to https://community.bistudio.com/wiki/Arma_3_Steam_Branches wouldn't make sense, as the Main Branch e.g, is called public on steam and not main. Also I stated that I have fixed my issue before he replied, that is what caused my confusion with his reply

rough python
#

@dawn palm what's the meaning of duplicated physical lods please ?

#

duplicated physical lods 6 and 7, resolution 11000.0

glossy inlet
#

It means duplicate lods

#

you have a ShadowBuffer at 11000 and a auto generated ShadowBuffer at 11000

#

There is no ShadowVolume 1000, ShadowVolume is from 10000-10999
11000-11999 is ShadowBuffer LODs

#

Object builder doesn't label them correctly

rough python
#

oook so shadowVolume 1000 is the source of this issue ?

glossy inlet
#

yes

#

you probably wanted ShadowVolume 999

rough python
#

what if I set 100 ?

#

is the number related to the draw distance ?

#

or would SV0, SV1 and SV2 work the same?

glossy inlet
#

afaik the numbers are just for ordering. But not sure if their specific value also has a influence

sly skiff
#

Its possible that the check is in a way wrong right now as sbSource = explicit/shadow = hybrid combo used with tree rvmat shaders uses custom lods for those lod levels. I dont think they are automatically generated.

#

this is to get shadows with alpha transparent textures on them to work

glossy inlet
#

Mikero afaik finds them after binarize, which auto generates them

#

And from above screenshot you can clearly see that the manually created ShadowBuffer LOD was not intended

dawn palm
#

Mikero afaik finds them after binarize,
correct

rough python
#

thanks for input

#

๐Ÿ‘Œ

sly skiff
#

having the sbSource = explicit/shadow = hybrid properties solves the error message

glossy inlet
#

But with probably not-expected/wanted outcome, in this case

#

it always depends on what you're doing. And if you get that error you are doing something wrong.
The solution can be one of two things, and it depends on what you wanted to do
Either you are missing the property, or you have a errornous lod.

sly skiff
#

yes those lods should be used only in conjunction with the explicit sbSource.

glossy inlet
#

or just not used as binarize will generate them in some cases (Which I'd recommend to just do/leave if you don't want manual ones which most people probably don't)

sly skiff
#

in the case of transparency in textured shadow mesh you want/need them, in any other case, no

hallow rapids
#

@glossy inlet does your script profiler also have to option to do text based output similar to perf I guess?

#

wait, I assumed you built the GUI yourself and with WPF but it's Tracy and seems to be able to run on Linux ^^

#

assuming the profiler itself works with wine/proton

glossy inlet
#

No

#

Yes

#

should

hallow rapids
#

๐Ÿ‘Œ

glossy inlet
nocturne basin
#

yup
got a PN on discord from him yesterday

#

will take care of it in a few mins

#

or more: you took care, waiting until he is back ๐Ÿ˜„

glossy inlet
#

Feel free to review, you see sharper

nocturne basin
#

quickly rushed over it yesterday from mobilephone
looked good all in all

scenic canopy
#

nice ๐Ÿ™‚

karmic niche
nocturne basin
#

done

gritty radish
#

Now I want a net core wrapper for intercept xD
Please don't make me learn c++

nocturne basin
#

For that, cpp will not Serve you well
Clr/cpp wrapper would be mandatory

#

I might craft some sqf-vm extension crap someday though ๐Ÿ˜‚ ๐Ÿ˜‚

#

Writing your extensions in the language you try to escape

#

Sqf

#

(blame @glossy inlet for that idea)

glossy inlet
#

i had the idea from someone else i think ๐Ÿค”

karmic niche
#

It's sad that so few people code in Python here, I seem see mostly C# programmers ๐Ÿ˜ฆ

#

(yes, I know your opinion on the matter, X39 ๐Ÿ˜› )

#

Although I have to say that Dslyecxi praised my Pythia - Python extension for Arma, so these people do exist (although he said that he is not a Python programmer either)

dawn palm
#

I don't code in c# or dotNet. nor will I ever have a need to. I do code in a limited subset of c++ which avoids anything to do with templates. Nor do i agree with stroustroup's attempts to make c(++) into something it isn't. competing with a 'better' language like c# (which i personally have no use for). If it's not in the stdlib, ain't interested.

karmic niche
#

I mean, yes, there are a few @_veterans that code in C++. I know that you do, X39 and Dedmen(?) mainly use C/++. But other than that, my observation (which may very well be wrong) is that most people here seem to be using C# nowadays ๐Ÿค”

dawn palm
#

I doubt you're wrong Stack, Microsft is the dominant player for things-pc, but IBM would take them to the cleaners in mid and mainframes). But, they are required to broaden their horizons if they want to move easily between microsft and the penguin.

scenic canopy
#

swift wrapper for intercept? ๐Ÿ˜„

nocturne basin
#

personally, i code mostly in C# for work
C for private projects (my lang project yaoosl eg. i am trying to figure out the most efficient way to store a namespace for the runtime later)
C++ for everything where C is too cumbersome or that simply i do not plan to maybe support on weirdo chipsets

sick verge
#

I used to do Java, now I'm doing a lot of c++ but very recently I looked into Rust and that's probably what I'm going to use in the future

nocturne basin
#

Rust is literally like another world
new concepts, new syntax = bad adoption rate

#

which is what the reality shows

dawn palm
#

Java is part of the c family: a good language and a rival to c#. Both suffer from being not being universally available on any platform, and Java is proprietary.

nocturne basin
#

it is only really used where NPEs and the corresponding security issues are a horrifying thing

sick verge
#

Rust is literally like another world
new concepts, new syntax = bad adoption rate
But it also means that it can get rid of all the PITA traditional languages have and also address problems that have existed for decades

nocturne basin
#

you can only do one of those things at a time
plus rust adds ontop of existing PITA a butload of new PITA crap that one not even can understand thanks to new syntax

dawn palm
#

SizeOf(int) big-endian/little endian

nocturne basin
#

it is said that one needs a month at least to start get productive with rust
and that is with daily usage
which means most of the stuff one wrote can be thrown away ...
it is a shame that rust is actually so different as a language, but that is the main reason i never even bothered to look into rust itself

#

getting a hang of reading the syntax correctly and using it so that programs compile will already take me a year (as i am in no way starting to use rust as my everyday lang) and understanding everything else rust brings with it another year afterwards

sick verge
#

But the HUGE plus is: Once the program compiles, it's a lot more likely to be correct.
What you save in time when programming in e.g. c++, you'll pay later when the thing starts to mis-behave at runtime. And probably that'll take even more time that it takes you to write the Rust code

nocturne basin
#

never said that ain't true
which is why i said it is a shame rust tried to be different at every level

#

also, once you get the hang of rust, you can write programs as fast as with c++

#

so the only con is really that the learning curve was made, not by accident (though not with this in mind), too huge to make it commercially viable in every usecase

scenic canopy
#

except you can still ignore all the safety checks in rust

sick verge
#

The part about the learning curve is probably true, yes

scenic canopy
#

so if you start adopting someones lib or other codebase you might be in for a treat ๐Ÿ™‚

sick verge
#

except you can still ignore all the safety checks in rust
Well yeah - you can always break a program if you want to. The point is to avoid accidental breaking ^^

nocturne basin
#

assembly hell alternative in rust?

scenic canopy
#

more like "urgh, this error is so annoying, I'll just bypass it"

#

said no lazy dev ever!

nocturne basin
#

which is the problem again with rust
you need to learn it to not break it by accident or lazyness

#

which is again, why rust will stay at a nishe

sick verge
#

Actually I don't think so

scenic canopy
#

static languages are on the rise at least, that's nice

#

even frontend oriented such as typescript

nocturne basin
#

you mean statically typed languages?

sick verge
#

I also don't think that the learning curve is so huge that it can't be tackled properly.
I'm still looking into it but from what I have seen so far, it's not that different. A bit of different syntax here and there and for everything else the compiler tells you then and there what the problem is (and how to fix it)

#

That's way better than any c++ error messages

nocturne basin
#

if you talk about bare minimum rust, yes
easy to learn
essentially just swapping types to the end

#

if you talk about actual productive work with rust, ohhh boy .... lifetime management ftw

#

problem is that rust enforces a new concept and a new syntax
it is like you are being told "here is your aircraft, gimme your car"

#

and thats it

sick verge
#

Well if you're coming from Java (or something like that) I think it's equally hard to learn about memory management ๐Ÿคทโ€โ™‚๏ธ

#

So the switch to c++ is not easy either

nocturne basin
#

which is also horrifying
a ton of programmers running around, not knowing anything about memory management with a GC destroying all their crap because they never bothered to understand how it works

scenic canopy
#

yes, statically typed ๐Ÿ˜…

nocturne basin
#

which brings me to the final point: The programming world is PITA and will stay PITA forever
need to continue working ๐Ÿ˜…

#

but leaving you with this gem:

while let Some(c) = line.chars() {
  // ...
}```
sick verge
#

Once you know what it does, it's actually really nice โ˜๏ธ

#

To get yet another c++ reference: If you're new to the language and see something like

if (auto test = myFunction()) {
  // ...
}

that's about the same. You need to know the syntax and the idoms that are used in a language to understand it ๐Ÿคท

scenic canopy
#

depending on what funny stuff that function returns ๐Ÿ™‚

glossy inlet
#

it's a lot more likely to be correct.
Well maybe no off by one's, buffer overflows and the likes. Which.. if you use proper structures/containers in C++ is also not an issue there.
Other logic bugs will still happen just as much in rust as elsewhere, and these are the ones you're usually fixing and having a hard time debugging.

Only thing that puts me off of rust so far is missing librarys. Basically everything has a C/C++/C# library.
That will just take more time for rust.

dawn palm
#

with the above in mind I always loved Perl's definition of zero.
'we hold all forms of zero, null, nil, nullptr, to be born equal as a zero'

sick verge
#

Plus the big one: No race-conditions data-races

#

For the libraries: Yeah that'll come. But I'm actually amazed by how many there are already

glossy inlet
#

Plus the big one: No race-conditions
If Arma had no race conditions I could easily make it run at 120fps ๐Ÿ˜„

sick verge
#

Arma 4 written in Rust confirmed!

dawn palm
#

nah, version 9.99 of enfusion.

nocturne basin
limber hearth
#

Now I want a net core wrapper for intercept xD
Please don't make me learn c++
@gritty radish
there was , a long time ago, someone who tried to do something similiar.. https://github.com/Cloudhax23/InterSharp
It is useless to state how it ended..

glossy inlet
#

However Rust does not prevent general race conditions.

This is pretty fundamentally impossible, and probably honestly undesirable. Your hardware is racy, your OS is racy, the other programs on your computer are racy, and the world this all runs in is racy. Any system that could genuinely claim to prevent all race conditions would be pretty awful to use, if not just incorrect.
So well... Basically still race conditions then. Unless you write correct/good code

sick verge
#

I used the wrong term above. It prevents data races

#

Not race conditions

#

@nocturne basin you did miss something: std::atomic happens at runtime while Rust's guarantees work out at compile time only

nocturne basin
#

atomic cannot happen at runtime
otherwise it would not be atomic

glossy inlet
#

You can make a proper C# wrapper for intercept relatively easily.
You need a CLR inbetween, which has functions for converting the native types (string, containers, object references, config n such) to re-implemented C# types which is quite a bit of work.
Then you need to reimplement all function wrappers (the biggest part of intercept) and inside them convert back and forth between C# and native type (which probably costs you a heckton of performance and you might aswell write SQF at that point)

Or... instead of converting native<->.NET, you instead do the data handling in CLR and just offer C# methods on all the types to manipulate them. Still have to reimplement all the... hundreds? of wrappers

#

2587 wrappers as of 1.96

sick verge
#

std::atomic wraps the access in a mutex if it's not an atomic operation leading to it being resolved at runtime

#

Because you can't just magically make each operation atomic at compile time

nocturne basin
#

the CLR wrapper should be pretty fast tbh (thanks to compiler magix)
exact overhead could be measured using SQF-VM and its CLR wrapper if one wants to test the introduced

#

what do you think is rust doing, the moment no native instruction is available?

#

it cannot add some magic assembly instruction that fixes all problems

#

if you work with threads, you need to sync them
no language can fix that for you

sick verge
#

Rust doesn't claim to make operations atomic. It just doesn't allow code that can lead to data races by using a very strict concept of ownership and borrowing

#

That's the beauty

glossy inlet
#

two people cannot fiddle with the same thing at the same time, cuz only one peep owns it

#

I guess?

nocturne basin
#

pretty much

limber hearth
#

@glossy inlet do you think that the CoreRT project already did anything of what you stated above? (Converted native types, mainly)

glossy inlet
#

Well it surely didn't take care of the intercept/arma types

limber hearth
#

But maybe it took care of the primitives type, maybe D:

glossy inlet
#

maybe it can be used for such.
But intercept has exact memory layout requirements. In some places even a single bit of padding being added would break it

#

So if you can define data structures there, and it can convert them to native layout for you, it would need to really be exact

nocturne basin
#

CLR primitives are C++ Primitives more or less
only when classes or structs come in play the stuff gets difficult

limber hearth
#

Personally I thought that this ability to compile directly to native code would have changed something for what concerns both net core and intercept, but i guess it didn't

sick verge
#

@glossy inlet yes exactly. Plus some rules for borrowing values in order to make the concept usable

glossy inlet
#

Maybe it did, maybe it lets you combine what would've been a seperate CLR library, directly into the C# code and make it compile down to the same thing

limber hearth
#

Yeah technically it is possible to combine existing stuff written in c/cpp and c# code (using corert), and compile to something that is native

meager surge
#

Hi. I'm not sure if this is correct place to ask, but seems it is.

  1. Is there any list of error codes for callExtension checker by @stray galleon
  2. Is there any performance difference DLL in C# (DLLExport UnmanagedExports) vs native C++?
elfin oxide
#
  1. There are theoretical performace differences, but you can totally ignore those given that they are not noticeable when comparing it to the actual workload you want to perform. Choose which of the languages offers you the best tools to achieve your goal. If you are not familiar with c++, C# and its default and nuget packages will make it easier to perform complex tasks, where as c++ will ask you to do everything and has 0 quality of life wrappers to offer for you. But with C++ you have more control over what is happening. If you dll should do things like, query a DB, write a text file, make some api call to some website or what ever, go with c#.
#

the only c++ dll i would ever consider would be if you do COMPLEX simulations or libraries and interfaces you want to use ONLY work with C++

karmic niche
#

I confirm the above. I've been writing Python arma extensions and in regular usage (that is, if you're not planning to call the extension 100 times within a frame), it's negligible

meager surge
#

I ask because currently I have extension which do some magic and export JSON file. Every call take ~35-50ms. I think this is too much. So I need to rewrite it. It was written in C#.

glossy inlet
#

make it asynchronous?

karmic niche
#

And to be fair... if you're calling it on the server and once every minute (or maybe even every 10 seconds), then literally no one will notice that it's taking 50ms ๐Ÿ™‚

meager surge
#

make it asynchronous?
maybe. but first I need to select language. And understand what Err:126 mean in checker to be able to test extension without arma

glossy inlet
#

126 is missing library

#

check dependency walker on your dll

karmic niche
nocturne basin
#

i really need to get more people using SQF-VM for extension development ... i mean, why use some barebones implementation of some SQF operators if you can have the plethora already available in SQF-VM?

karmic niche
#

Not trying to be disrespectful to your work but why use SQF when you can use a regular programming language?

glossy inlet
#

because you'll use the Arma extension from SQF anyway

karmic niche
#

SQF-VM is great if you want to do unit test, though

glossy inlet
#

instead of kk's thing that does custom parsing and putting together and stuff.
You can just literally copy-paste the SQF code that you already use to call the extension from within Arma, just without arma

karmic niche
#

Oh sorry, I understood that the point above was to write extensions in SQF instead of another language, silly me ๐Ÿคฆโ€โ™‚๏ธ

glossy inlet
#

nah that was the other completely different thing we talked about yesterday or so

scenic canopy
#

brett's rust wrapper for writing extensions works very nice too

meager surge
#

i really need to get more people using SQF-VM for extension development ... i mean, why use some barebones implementation of some SQF operators if you can have the plethora already available in SQF-VM?
is there any tutorial or may be even video how to use it? (Something more detailed than "Double click on exe file")

glossy inlet
#

double click on exe file.
Then you can run any sqf code. Put down your callExtension, it will call your extension

meager surge
#

yeah. all my attempts failed on NOT IMPLEMENTED notlikemeow

glossy inlet
#

๐Ÿค”

#

what code are you actually trying to run there

#

callExtension definitely is implemented

meager surge
#

I don't remember alredy. Even 13 chars from getPlayerUID not implemented

glossy inlet
#

well there is no getPlayerUID when you don't have a player, but i guess adding a placeholder would be easy

nocturne basin
#

Yup

#

help__ "provide__"

meager surge
#

there is other commands that want some environment but it does not exist.
nearEntities, cursorObject as an example. So to test code I need to create dummy placeholders for them?

nocturne basin
#

if you deem them mandatory for your extension and they are not required, yes
you may also add them to the SQF-VM wishlist so i can implement them

limber hearth
#

This command is blocking, meaning that the game will wait for the extension to return before continuing. This may cause FPS drop if extension is not optimised. If extension takes too long, consider making asynchronous extension, where the result of the work of the extension is collected in a separate call.

Just a quick doubt: I was wondering if calling an extension on the server side actually locks the whole execution of other sqf scripts, or just the thread in which the callextension command is issued

glossy inlet
#

just the thread

#

which is the main

#

there is only one thread that runs sqf

scenic canopy
#

You should make it async, any IO could be quite bad

limber hearth
#

Thank you both

#

So basically executing call extension in a spawned function doesn't change a thing, right?

#

I always had this doubt but really never asked about it

neon flax
#

It does not. Executing "long" sqf command in spawned script also.

#

Despite the 3ms limit running "nearestObjects <whole_world>" would still freeze the game for much longer.

#

Because the scheduler can go to next script only AFTER command was executed not during the command execution.

karmic niche
#

Only spawning a new thread inside the extension will give you concurrency

limber hearth
#

Thank you, that's clear.

karmic niche
#

Meaning a new OS thread

limber hearth
#

Yep, I'm going to do it

hallow rapids
#

has anyone made a better FSM editor by now? ๐Ÿ˜›

nocturne basin
#

thought about it
but as nobody really uses FSM ... why bother to add another feature nobody uses to Arma.Studio?

#

already wrote some pretty decent editor for statemachine stuff at work
it ain't that complicated to rework it into arma ... but for what ๐Ÿคทโ€โ™‚๏ธ those 2 people a year crafting a tiny state machine that they run the tool for 5 minutes?

dawn palm
#

binarise doesn't touch it, leaving the engine itself to strip away the fsm code nested in comments and then perform a rapify on what's left. The task being too difficult for bis to pass it thru cfgConvertFileChg first and therefore relieving the engine from doing so, each time every time it's invoked.

#

Oh, yes, i forgot that fsm rap text has trailing commas in it's arrays causing cfgConvert to crash. (sigh)

limber hearth
#

thought about it
but as nobody really uses FSM ... why bother to add another feature nobody uses to Arma.Studio?

  • cries on his fsms scripts *
nocturne basin
#

hello user 1/2 who uses it

limber hearth
#

๐Ÿ˜‚ accurate tho

neon flax
#

FSMs are ok and BI FSM editor is just fine.

dawn palm
#

I think so too, the editor does a decent job. The only criticisms are those above (which has little to do with the editor)

neon flax
#

Yeah, once you know how to use it you can work fast in it.

#

It could use a dark mode tho ๐Ÿ˜

cinder meteor
#

why bother to add another feature nobody uses to Arma.Studio?
I think that for a hobby project doing or not doing something should depend on if you are personally interested in it or not

#

And speaking of editors and such... what if someone made behaviour tree framework with an editor... or combined some existing editor with an SQF implementation of it... ๐Ÿค”

glossy inlet
#

just mod unreal engine and use its FSM stuff to export arma FSM's ๐Ÿ˜„

cinder meteor
#

๐Ÿค” it also has a behaviour tree as well

#

genius!

dull parrot
#

I have to say I find the FSM Editor very usable and useful...

cinder meteor
#

Well, in fact - me too, if I ignore the fact that I don't like FSMs on their own, the editor itself is quite OK. Only sad thing is that I must type all the code straight in it so I can't easily run SQF-VM on it.

karmic niche
#

I think that for a hobby project doing or not doing something should depend on if you are personally interested in it or not
That works only for the first few years of your hobby project's lifetime ๐Ÿ˜œ

limber hearth
#

I have to say I find the FSM Editor very usable and useful...
indeed it is funny

hushed crown
#

Hello everyone! Is this the channel to try to fix Arma 3 Tools? Getting a size pagination error when using Addon Builder or Binarize

hallow rapids
#

#arma3_tools message

should
@glossy inlet doesn't seem like wine plays nice with Intercept. Intercept itself loads fine but it can't find the ArmaScriptProfiler dlls apparently

#

๐Ÿ˜ข

glossy inlet
#

ยฏ_(ใƒ„)_/ยฏ

#

uses the same finding code as acre

#

which has the same problem

hallow rapids
#

trying to strace it just causes a crash as soon as intercept loads

#

sad

scenic canopy
#

@hallow rapids did you lowercase the files? they need to be titleized

#

ArmaScriptProfiler_x64.dll or it wont work on a case sensitive fs

hallow rapids
#

didn't

scenic canopy
#

I guess wine abstracts that thou so

#

and you're using x64 version?

hallow rapids
#

yep

scenic canopy
#

tried with wine logs enabled?

#

so you can see what the dll loading thinks

#

it requires quite new c++ runtime

#

like latest c++ redist

hallow rapids
#

don't see anything in the wine logs that's screaming like; hey there's an error

#

no references to ArmaScriptProfiler either though

#

this is proton/wine so it should be fine in terms of runtime and all

#

and it's writing messages from Intercept to the RPT

#

like this one: invoker::get().invoke_raw("diag_log", fmt::format("Intercept: Client plugin: {} was not found.", path_));

#

I guess I'll debug Intercept and see what it's actually doing when I've got a bit more time on my hands

scenic canopy
#

you tried with WINEDEBUG and adequate logging right?

hallow rapids
#

yep

scenic canopy
#

don't have proton setup atm so can't test myself ๐Ÿ˜ฆ

hallow rapids
#

WINEDEBUG="+timestamp,+pid,+tid,+seh,+debugstr,+module"

scenic canopy
#

which proton/wine are you running?

hallow rapids
#

that one

scenic canopy
#

some of the later vcredists are only in latest wine release

#

like 5.1+ or so

hallow rapids
#

proton 5.0 which is wine 5.0 I guess

karmic niche
#

@hallow rapids if you're talking with dedmen about the "finding code" that finds the open files, then I can confirm that my code that's very similar to the one intercept uses works with no problems with stock wine

#

(so that part of the intercept code should work too)

hallow rapids
#

I guess I can try it with stock wine

#

doesn't even start ๐Ÿ˜ฆ

karmic niche
#

Welp, maybe another part doesn't work, then ๐Ÿ˜

hallow rapids
#

probably have to juggle around with some prefix stuff

karmic niche
#

Actually, i remembered that I was only testing with setting up a Frontline server so I'm talking about running arma3server.exe!

#

I have never succeeded at running the Arma client in wine (but my last tries have been a long time ago, to be fair)

hallow rapids
#

probably won't work then due to the DX11 stuff

#

but now A3 is completely broken ๐Ÿ˜‚

karmic niche
#

and you're using x64 version?
I don't remember where I've read that x64 wine is more problematic than the 32bit counterpart though ๐Ÿค” (might have been fake news)

#

probably won't work then due to the DX11 stuff
But I've seen reports of people successfully running the game with dxvk/proton

#

So maybe make sure that you can run the vanilla version first and THEN check with Intercept

hallow rapids
#

I'm guessing you meant "without"?

karmic niche
#

Not sure what sentence you refer to but I've written what I meant, it seems

hallow rapids
#

But I've seen reports of people successfully running the game with dxvk/proton
@karmic niche that one

#

the game is running fine with proton

#

been playing like that for a while

karmic niche
#

Should work, yes

#

With BE disabled it should work

#

Afk

hallow rapids
#

well.. installing mingw-w64-gcc ๐Ÿ˜‚

#

let's see if it's even able to compile

scenic canopy
#

Arenโ€™t there prebuilt test versions of proton?

glossy inlet
#

as far as I know the hacky windows API intercept uses for finding files (same as ACRE) isn't implemented in wine

karmic niche
#

@glossy inlet seriously, we were able to run Pythia on wine, for Frontline, without any problems. I can look for the version that we were using and/or any forced native DLLs tomorrow.

I suspect the issue probably lays in some other part of the code

glossy inlet
#

well I hear ACRE people repeatedly say it doesn't work ยฏ_(ใƒ„)_/ยฏ

karmic niche
#

๐Ÿค”

Well I dunno. Works for me. Always had worked ๐Ÿค“

hallow rapids
#

Intercept doesn't compile with mingw-w64 so I'm giving up figuring it out for now :/

#

Arenโ€™t there prebuilt test versions of proton?
@scenic canopy sorry meant Intercept ^^

scenic canopy
#

ah ๐Ÿ˜›

#

it has github actions now so if you fork it any changes pushed will be automatically built and be available as artifacts for linux + windows on your fork

nocturne basin
#

Github Action for sqf using sqf-vm would be neat

hallow rapids
#

@scenic canopy ah sweet. I guess if all else fails I'll try that ๐Ÿ˜‹

glossy inlet
#

Github Action for sqf using sqf-vm would be neat
WIP-ish for a lint check by compiling with SQF-VM

scenic canopy
#

Neat

nocturne basin
#

just realized that what i was assuming to be a big-edian system, always was little edian ๐Ÿคฆโ€โ™‚๏ธ๐Ÿ˜…

hallow rapids
#

Getting pretty close with compiling Intercept with mingw but can't figure out out this one....

[100%] Linking CXX shared library intercept_x64.so
/usr/lib/gcc/x86_64-w64-mingw32/10.1.0/../../../../x86_64-w64-mingw32/bin/ld: ../extensions/extensions_static.a(extensions.cpp.o):/home/marcel/projects/intercept/src/host/extensions/extensions.cpp:34: undefined reference to `_ReturnAddress'
/usr/lib/gcc/x86_64-w64-mingw32/10.1.0/../../../../x86_64-w64-mingw32/bin/ld: ../extensions/extensions_static.a(signing.cpp.o): in function `intercept::cert::signing::verifyCert[abi:cxx11](std::basic_string_view<wchar_t, std::char_traits<wchar_t> >, intercept::types::r_string)':
/home/marcel/projects/intercept/src/host/extensions/signing.cpp:124: undefined reference to `__imp_CryptQueryObject'
#

tried -lxxxx -ing all the stuff in #pragma comment(lib, "xxxxx"); but nope

glossy inlet
#

crypt32.lib?

hallow rapids
#

tried linking it but doesn't seem to do much

#

oh found another CMakeLists.txt file with some compiler config stuff

#

that's better

#

now just this one left:

/usr/lib/gcc/x86_64-w64-mingw32/10.1.0/../../../../x86_64-w64-mingw32/bin/ld: ../extensions/extensions_static.a(extensions.cpp.o):/home/marcel/projects/intercept/src/host/extensions/extensions.cpp:34: undefined reference to `_ReturnAddress'
#

it's in rtcapi.h but no lib for it as far as I can tell

#

yay it built ๐Ÿ™‚

#

replaced _ReturnAddress with __builtin_return_address(0)

#

seems like a MSVC only thing

elfin oxide
#

Ah yes, the joys of C++

glossy inlet
#

why are you even compiling with mingw?

#

intercept needs to be binary compatible with Arma, and arma is built with MSVC/GCC.
So with mingw you might get some padding differences which might break it

hallow rapids
#

Ah that's why it's not loading ๐Ÿ˜…

#

I'm on Linux and need a windows build to use with wine

#

mingw is technically gcc though

glossy inlet
#

well the windows version is MSVC, not gcc ๐Ÿ˜„

#

they have different ways to do vtables, so that'll already break ya neck

hallow rapids
#

sigh

#

I guess I'll go the github actions way then

hallow rapids
#

I give up... D:\a\intercept\intercept\src\host\extensions\search.cpp(264,9): error C3861: 'ERROR': identifier not found [D:\a\intercept\intercept\build-win64\src\host\extensions\extensions_static.vcxproj]

#

๐Ÿ˜‚

karmic niche
#

Looks like you have an ERROR in your code ๐Ÿ˜

dawn palm
#

my code never has errors, only 'undocumented features'

scenic canopy
#

TODOs

dawn palm
#

haaaaaaaaaaaaaaaaaaaa

viscid verge
#

is there a way to build pbos from source on Linux? I've heard of armake and the pbo tools of Mikero for Linux

karmic niche
#

Yes, you just answered your own question ๐Ÿ™‚

viscid verge
#

he he, any example for a hello world pbo or such?

karmic niche
#

I'm not the right person to ask (as i just know the PBO format - kinda - I'm not really into that part of modding) so someone else will have to point you the way.
In the meantime you can just pick the smallest PBO that you have in your arma installation, unpack it and look at what's inside

glossy inlet
#

mikeros tools run on linux, but there is no binarize.exe on linux...
though I could build one ๐Ÿค”

dawn palm
#

makepbo (for linux) behaves identically as it's dos equivalent. Neither can binarise p3ds

#

ALL dos.exe files of my tools are >first< written for the penguin, with a wrapper to make them micro$oft compatible.

#

and a 'binarise.exe' would be exceptionally useful to me.

viscid verge
#

just toyed around with drone c/i and using that to start a nimitz or f-18 build would be great

dawn palm
#

just download the lib.so rar package for the penguin. which is available (and identical) for both subscribers and free.

#

in fact, it has just been updated.

viscid verge
#

this one? ```
depbo-tools-0.7.69$ ls lib/
libdepbo.so.0 libdepbo.so.0.7.69

dawn palm
#

I also recommend Armake as it's well written and maintained. I cannot make any sensible comment whether it's better or worse than my tools.

glossy inlet
#

well written and maintained
armake1 last commit dec 2018, 20 issues, 5 open pull requests back till november 2018 and still not merged
armake2 last commit jul 2019, 20 issues, 4 open pull requests back till april 2019 and still not merged and with 0 comments from maintainer

dawn palm
#

k

glossy inlet
#

HEMTT is the armake adaption that is mostly well maintained, and tries to fix the fixes that armake itself doesn't merge

dawn palm
#

perhaps i better say 'was' not 'is' ๐Ÿ‘€

#

there you go then. I just illustrated my ignorance. <grin>

karmic niche
#

I always thought that HEMTT was merely making use of armake instead of being an adaptation (you mean reimplementation?) ๐Ÿค”

viscid verge
#

so I use the original armake, binarize a p3d and then makepbo throws this: ```
internal error: lod size mismatch
ttt_cube.p3d:validating...p3d error Internally generated throw. See stderr for msg

Pbo: p3d error

dawn palm
#

checking.....

karmic niche
#

FYI: remember that there is armake and armake2. You may always want to test with "the other one"

viscid verge
#

trying armake2 now

dawn palm
#

lod size mismatch
is caused by the 4 byte sizeOf remaining data just before the vertex point flags (and all that follows) is not the same as the data actually read

viscid verge
#

hmm: ```
pbouser@tspindler-server:~$ armake2/target/debug/armake2 binarize ttt_cubesample/cube.p3d cube.p3d
error: binarize.exe is only available on windows. Use rapify to binarize configs.

dawn palm
#

(size mismatch is probably caused by counting the physx data at very end of file as being part of the LOD size)

scenic canopy
#

HEMTT uses a fork of armake2

#

there's a WIP binarize process for the penguin as well

#

don't remember where that ended up though

#

you can use GitHub Actions / Circle CI / Azure DevOps Build pipelines / AppVeyor or any of the other Windows CI systems and use BI binarize there

hallow rapids
#

#arma3_tools message

intercept needs to be binary compatible with Arma, and arma is built with MSVC/GCC.
So with mingw you might get some padding differences which might break it
@glossy inlet just for my curiosity; this mostly just applies to Intercept due to figuring out the addresses and what not for the in-engine commands right? Normally you'd be able to compile an extension with mingw?

scenic canopy
#

as long as the C export is correct yes

#

I've used mingw for arma extensions in the past

glossy inlet
#

You used armake to binarize a p3d? Armake can't binarize.

#

Yes mister marceldev

hallow rapids
#

Thank you sir dedmen

hallow rapids
#

@dawn palm it seems like the Linux deWrp version is waaaaayyyy slower than on Windows

#

it takes 3+ minutes to dewrp -O ... Stratis

#

compared to 5-ish seconds with the (older) DeWrpDos.exe using wine

#

I don't remember waiting that long for deWrp on Windows either

#

CPU and disk usage is pretty much 0

dawn palm
#

ouch

#

my guess is it will be your memory or swap space. you need at least 3x sizeOf(wrp) for it to run efficiently
and five seconds for wrp to complete is a little on the low side

hallow rapids
#

16 GB of ram should be plenty no? ๐Ÿ˜›

#

ram usage for deWrp is just 0.6% and CPU hovers somewhere between 1% and 3%

#

if I could get the Windows deWrp.exe (non dos) to work with wine I'd be happy as well but doesn't seem to work and crashes instantly ๐Ÿ˜ฆ

dawn palm
#

will pass these messages on to Killswitch who maintains the penguin code.

surreal wolf
#

๐Ÿค”

Found the problem...

Before

$ time dewrp -O Stratis.wrp >/dev/null 2>&1

real 3m4.280s
user 0m7.555s
sys 0m1.493s

After

$ time dewrp -O Stratis.wrp >/dev/null 2>&1

real 0m5.142s
user 0m5.011s
sys 0m0.063s

TODO: more testing...

hallow rapids
#

yaaaayyy

#

so what was it doing? ^^

#

recursion issues or something?

surreal wolf
#

No, it was just doing something when printing to stdout that does not need to be done in Linux

dreamy forum
#

Suggestion for anyone skilled enough to script this, the supply drop option from Achilles but able to fit multiple vehicles into a single cargo vehicle

#

Like the British LCU mk10 can carry 3 APCs in game but the Achilles script will only load 1

gritty radish
tame monolith
#

@glossy inlet ok thx for you help in Mai with the Extension whitelisting stuff ... it did work by just calling it again and again^^

hallow rapids
#

@dawn palm I'm trying to read in a (convertwrp'ed) .pew file but for whatever reason my RvmatIndexTable is too big it seems as it's containing a bunch of 0 indexes at the end which isn't supposed to happen according to the wiki ๐Ÿค”

#

any clue what I'm doing wrong?

#
uint32_t tsx = xy->x >> layers[i].size_type;
uint32_t tsy = xy->y >> layers[i].size_type;
uint32_t table_size = tsx * tsy;
#

is the math

#

where xy is the terrain size (2048x2048)

#

@glossy inlet ๐Ÿ™Œ

#

Also, supposedly layer sizetype is supposed to be between 0 and 2 but it's 3 for Stratis ๐Ÿ˜‹

dawn palm
#

@hallow rapids it's possible i've broken something in the dll. try another smaller map to see what the result is.

hallow rapids
#

just tried CUP Utes and it's asking for a table size of 16384 and at index 8704 I'm starting to get 0s in the table

#

it does seem that it reads the rest of the file correctly assuming it's supposed to end with 4 unnamed and empty selections

dawn palm
#

thank you. will look into this.

hallow rapids
#

@dawn palm Just tested with a Stratis.pew someone got on Windows and that one seems fine

#

the Linux convertwrp seems faulty

#

different output

#

the Linux version also has the ObjectTemplate.roadFlag set to 1 but the Windows version doesn't ๐Ÿ˜ข

#

could be because the Windows convertwrp is an older version

#

at least 4+ years

dawn palm
#

@surreal wolf ^

dawn palm
#

the latest windows version is 1.83 released on 12 dec 2019

fresh flower
#

Hi there... Hope this is the correct area to ask this question :)
Is it possible to enter a Server via a webpage in your browser?

hallow rapids
#

I think you can launch a game through the steam url handler with parameters

#

Not sure though ^^

vague shard
#

all info we could determine

#

but also be aware of:

https://feedback.bistudio.com/T126119

When you use steam://connect/<ip>:<port>/<password>/ launcher connects you to the server, but it will not fill the password for you.
You still have to fill the password yourself, correct behaviour would be that when launcher gets the password from steam browser protocol, it should be filled and you should be auto connected to the server.

atomic stratus
#

I seem to be having a problem with the ARMA III Tools publisher...when I try to update an existing mod, it just...freezes and fails to respond. I tried running as admin; that isn't working. IT was functioning properly 2 days ago. I have a Windows 10 system and havent had any major bugs

vague shard
#

use steamCMD instead: "%_APPPATH_STEAMCMD%\steamcmd.exe" +set_steam_guard_code %_SG_INTERNAL% +login %_USER_INTERNAL% %_PW_INTERNAL% +workshop_build_item "%_RELEASE_FILE_PATH%\%_RELEASE_FILE_WW2_LITE%.vdf" +quit

{
    "appid"            "107410"
    "publishedfileid"    "1996398183"
    "contentfolder"        "D:\kju\release\B\@WW2_LITE"
    "previewfile"        ""
    "visibility"        "1"
    "title"            "@WW2_LITE"
    "description"        ""
    "changenote"        ""
}
glossy inlet
#

publisher also has a cmdline version

dawn palm
#

@hallow rapids
the dll has been fixed for convertwrp (credit killswitch)

hallow rapids
#

sweet, I'll give it a test later ๐Ÿ™‚

#

well when they're available anyway ^^

surreal wolf
#

"well when they're available anyway ^^"
Now. Please test.

hallow rapids
#

๐Ÿ‘Œ

frozen forum
#

Hi, quick question: How do I sign my mod? I used DSUtils and it gave me a public and a private BIKEY. By putting the public BIKEY in the mod folder is that how I sign my mod?

#

nvm i just realised it

#

sorry for the stupid question

smoky halo
#

Are Poseidonโ€™s tools still useful and good? Are they still updated?

scenic canopy
#

its quite outdated now, old ST2 and outdated plugins

#

but you can get the same setup with plugins for ST3, Atom or VSCode

cinder meteor
#

Use VSCode

#

There is even a debugger for it

gritty radish
#

please make macro support a thing for vscode ๐Ÿ˜„

limber hearth
#

Wasnโ€™t that already a thing with the extension written by armitxes ?

cinder meteor
#

What macro support?

#

One of the sqf plugins (forgot its name) lists macros in the autofill thing (forgot the name for autofill thing)

#

Completion! Yes completion

#

Sqf language uploaded by Senfo does it

glossy inlet
#

linter macro resolve support

cinder meteor
#

It can go to macro definition sometimes if you mean this

glossy inlet
#

no

cinder meteor
#

What does it mean then? Linter macro resolve support?

#

Detect errors in macro arguments?

#

Hmm I use sqf vm for it. There is also an sqf vm plugin for VS Code.

sick verge
#

I think he means that macros can be expanded to see what they are actually getting replaced with

glossy inlet
#

no notlikemeow

sick verge
#

xD

glossy inlet
#

GVAR(var) = 5
ace_stuff_var call func;

ERROR!! syntax error in line 1!!
ERROR!!!! undefined variable ace_stuff_var in line 2!!!!!

#

No you stupid, its right there in the macro. Just parse it correctly โ”ฌโ”€โ”ฌ ใƒŽ( ใ‚œ-ใ‚œใƒŽ)

sick verge
#

Aka the macro has to be expanded :P

gritty radish
#

yes

#

the current linter works for simple macros but doesn't work is you start using macros in macros.

#

#define GVAR(arg) myvariable_arg //can be parsed
#define QOUTE(arg) #arg
#define QGVAR(arg) QOUTE(GVAR(arg)) //doesn't work

nocturne basin
#

Use sqf-vm to preparse

#

Be happy about nรถ more Problems

#

Should also be usable to expand macros on hover if Coded right Btw

dawn palm
#

the 1st line is faulty. the local variable 'arg' is not being used in the expression

#

i think and assume you meant 'myvariable_##arg'

#

the actual error message of course is solely dependent on the pre-processor of the compiler being used. including no error message at all.

glossy inlet
dawn palm
#

testing.....

glossy inlet
#

mh? ๐Ÿค”

#

I missinterpreted what you said at first, but its exactly what you said.
_ is not a word seperator, thus its just taken as one big "myvariable_arg" word withour any macro parameters inside it

nocturne basin
#

Reminds me that I should add a Warning to sqfvm preproc if an arg is unused

gritty radish
#

It was just a quick example notlikemeow

#

However the sqflint Plug-in for vscode would not have it detected

nocturne basin
gritty radish
#

i would love to see a better integration of sqfvm in vscode to highlight wrong lines in code directly

cinder meteor
#

did you try the SQFVM plugin for it? ๐Ÿค”

nocturne basin
#

The plugin has limited Support though

cinder meteor
#

Yes I am just wondering if anyone has tried it at all

#

Got zero feedback about it so far

#

So I didn't update it much or anything

nocturne basin
#

Yeah... Chances are, nobody really used it ๐Ÿ˜…๐Ÿ˜…

cinder meteor
#

I have no idea if it's because I didn't finish it up until the end or people just misunderstood it or what exactly ๐Ÿคท

gritty radish
#

@cinder meteor yes i am using it right now

#

i mean it is cool to see it working as a command line output, but like i said, i would like to see it getting highlighted in code directly

cinder meteor
#

Yeah I see

#

Let me check. I thought that there was problem matching implemented for it.

nocturne basin
#

Soonโ„ข๏ธ sqf-vm will be splitted up into separate components anyways
Which means that a specific vscode extension can be crafted

cinder meteor
#

Yes you are right, problem matching (in-editor highlighting) is not implemented it seems ๐Ÿค” I forgot already if I even did it but it's not working anyway.

nocturne basin
#

Next step language Server ๐Ÿคช ๐Ÿคช ๐Ÿคช

prisma field
#

Hi there, I am having a few issues with setting up my development environment. I have installed the dev branch and am using arma3diag_x64.exe with the following arguments:

-skipIntro
-noSplash
-cpuCount=4
-malloc=tbb4malloc_bi_x64
-hugePages
-maxvram=3000
-showScriptErrors
-FilePatching
-mod=${workspaceFolder}\\@AH-64D Apache Longbow;I:\\Steam\\steamapps\\common\\Arma 3\\!Workshop\\@CBA_A3;I:\\Steam\\steamapps\\common\\Arma 3\\!Workshop\\@A3 Thermal Improvement

From my understanding, I should be able to reload the mod by running the following command:

diag_mergeConfigFile ["path\to\config.cpp"];

and restarting the scenario. I have had issue with not being able to recompile functions, when I enable recompile in a mission and use the function editor to recompile all, it doesn't change? Same with execVMed scripts.

Note: I didn't PBO the mod I am developing, it's using filepatching.

If this is the wrong channel, please let me know and I will fix that!

dawn palm
#

you initially have to start with a pbo, so that everything you did not alter is in there.

glossy inlet
#

You need to enable recompile flag in CfgFunctions

dawn palm
#

oh?

glossy inlet
#

In addition to a proper dev setup

prisma field
#

Thank you for your help! So I need to add that recompile flag to CfgFunctions, I will do!

What steps are missing to make this a proper setup?

glossy inlet
#

Files need to be in correct place. Config path is relative to Arma folder

prisma field
#

Ah, my config path was not relative to the arma folder, in fact it wasn't even in the arma folder! I will change that. What is the correct place for the files?

#

Also, if it has to be relative, it may be worth editing what is on the wiki, as what it provides as an example is diag_mergeConfigFile ["O:\Arma3\A3\Stuff_F\config.cpp"]

glossy inlet
#

Well if Arma is on O:/Arma3 (which it is in our dev setup) then that's correct

dawn palm
#

i think you are giving bad info here. files reference in arma are \absolute to the drive they are on.

model=\a3\some.p3d

must be P:\ a3 or O:\a3 in the above bad example

glossy inlet
#

Nope

#

They are relative to Arma directory. Working directory.

dawn palm
#

ok. then that's something i am definately not used to.

prisma field
#

Okay, thank you. I will give it a go soon with this new information!

prisma field
#

Thanks to the help of all you, I have made progress! Now I can update configs, but still unfortunately when I edit sqf files that are being edited using execVM, or functions (with the recompile flag enabled), the changes do not occur. Is there anything that has to be done to get this to work (with an addon, not a mission)

glossy inlet
#

send the ingame path for your sqf file, and the out of game path where you are storing it and expecting it to be picked up by the game

vague shard
nocturne basin
#

are there actual ... links somewhere?

#

because i cannot see any

dusky dune
#

I feel bad for him with the arma ui stuff ๐Ÿ˜„

tawny island
#

Looks like a great concept to have a FSM like system for missions (eg. triggers)

dusky dune
#

doesnt seem like a fsm sort of thing

cinder meteor
#

Looks cool but I would rather write SQF than use a flow graph ๐Ÿ˜„

#

But as a thing in itself it looks like a great achievement

dawn palm
#

I'd rather never look at sqf again, ever.

sick verge
#

I also prefer writing code directly but I imagine that a lot of mission makers that aren't programmers will find this very useful

prisma field
#

@glossy inlet The ingame path is called "\fza_ah64_controls\scripting\page_eng.sqf" and I have it at "I:\Steam\steamapps\common\Arma 3\A3\fza_ah64_controls\scripting\page_eng.sqf" on my machine

glossy inlet
#

\A3\ but your mod doesn't have A3 in prefix

#

so thats wrong

#

You should have Arma 3\fza_ah64_controls

prisma field
#

Ahh, okay. I will give that a go soon!

prisma field
#

That has fixed it, thank you very much for helping me with it! Should definitely speed up my work!

dawn palm
#

will be interesting to see how you make the addon.

#

i've figured out that:
"I:\Steam\steamapps\common\Arma 3
becomes psuedo 'P:\ drive' for the purpose of accessing fza_ah64_controls

#

or stated in linux terms, the above becomes \

glossy inlet
#

Arma just accesses files from working directory, like any other application does too if you use relative paths

dawn palm
#

no. it does not

#

the engine has no idea what a c:\my documents is.

#

it has NO drive: at all and everything inside begins as \

#

which is why you extract game data to a place like p:\ or z:\ to emulate what-the-engine-sees

glossy inlet
#

k. whatever you say.

dawn palm
#

except for #includes there is no instance at all in the engine of relative addressing. Everything is absolute to \ . so much so that the \ is not normally required.

#

model=some\where.p3d;
and
model=\some\where.p3d ; // are identical in result

#

you are correct that for the above everything is relative to arma 3 \ folder because you have told the engine that this is the \root of all files.

glossy inlet
#

because you have told the engine that this is the \root of all files.

working directory, like any other application does too if you use relative paths

dawn palm
#

put another way, when it comes to building the addon itself, it is not steam anything, nor arma 3,the world simply begins at \fza_ah64_controls

glossy inlet
#

yeah. But we were talking about file patching.
And root is working directory, for file patching.

dawn palm
#

ok

#

(and much more importantly you did a lot more to help the guy than i did)

dusty walrus
#

https://forums.bohemia.net/forums/topic/229820-eden-editor-flowgraph-inspector-and-tools/
@vague shard I don't even want to know how many hurdles you have to jump to make the thing inside the eden editor and I would suggest an external tool may be suited better, from what I gather the enduser mostly don't care if it is done in eden or outside. But it is only my opinion, also really like the idea (wanted to implement a node edtior thingi for some other stuff, because it is easier for non coders, but couldn't make it work, but I am also a complete coding novice)

vague shard
#

@dusty walrus not my project. so best to share directly in the thread ๐Ÿ™‚

dusty walrus
#

oh sorry overlooked that, sorry for the ping and thanks for the info

vague shard
#

np

smoky halo
#

Is DeWRP a premium tool by Mikero or is it free?

elfin oxide
#

All tools come with a free version that is less frequently updated

dusky dune
#

If you got send the source files you dont need dewrp

vague shard
#

does someone have some A2S_RULES packet samples at hand by chance?

scenic canopy
#

arma 3 specifically? or any game?

vague shard
#

A3

#

trying to understand how do mod sync/matching with the data available, plus the new sqf commands to expose loaded mods (or rather the limits with optional mods, server mods, local mods, etc)

glossy inlet
#

Stack will have some

karmic niche
#

zรกmฤ›rnรฝ: Stack will have some
lol, indeed ;)

Optional mods come from the signatures entry where they have to match the file name (NOT mod name!) of signatures for the mods (tbh I don't really remember the extension, what's important is that it's the file name)

#

But kju is asking because I have failed to answer his question in a timely manner (entirely my fault btw)

#

Server mods - you have no idea. That information is not passed to the client

glossy inlet
#

u just too slow you Stack Overslow

karmic niche
#

I'm not claiming to know everything though, so if someone has a magic trick to get the list of optional mods from the server, then go ahead and type that here, please ๐Ÿ™‚

glossy inlet
#

I don't know how any of that magic works. I only play with signature check disabled anyway

#

but there must be some reason the signature names are sent over query, so your thingy sounds plausible

nocturne basin
#
// c++
struct type
{
    unsigned short value;
    type(unsigned short val) : value(val) {}
};
struct string : public type { string() : type(0 /* make this somehow non-user defined to prevent overriding but (type dependent)unique library (dynamic or static) wide */) {} };
struct integer : public type { integer() : type(1 /* make this somehow non-user defined to prevent overriding but (type dependent)unique library (dynamic or static) wide */) {} };```any ideas?
glossy inlet
#

not quite sure what you mean.

to prevent overriding
make the variable private with only a getter?

nocturne basin
#
struct boolean : public type { boolean() : type(1 /* "conflict" with integer */) {} };```
#

the above just serves as example ๐Ÿ˜…
trying to get rid of the enum for type in SQF-VM

#

and replace it with a more ... extensible way

glossy inlet
#

why do you need types to be extendable?
SQF only has so many types
and can't people just define their own struct then? if they need a new type?

nocturne basin
#

because i want to remove those things from the actual runtime

#

class type
{
protected:
    unsigned short m_value;
    static inline unsigned short s_type_value = 0;
    type() {}
public:
    auto operator<=>(const type& rhs) const = default;
};

template<typename T>
class type_t : public type
{
private:
    static inline unsigned short s_local_type_value = 0;
public:
    type_t()
    {
        if (s_local_type_value == 0) { s_local_type_value = ++s_type_value; }
        m_value = s_local_type_value;
    }
};

struct string : public type_t<string> { string() : type_t() {} };
struct integer : public type_t<integer> { integer() : type_t() {} };```
#

this ... works

stray galleon
#

auto operator<=>(const Point&) const = default; already coding in c++20? ๐Ÿ‘€

nocturne basin
#

Yup ๐Ÿ˜๐Ÿ˜

#

Mayor Compilers are already Supporting it

#

Though... Removed it in sqf-vm actual implementation ๐Ÿ˜…๐Ÿ˜…

cinder meteor
#

The expression a <=> b returns an object that compares <0 if a < b, compares >0 if a > b, and compares ==0 if a and b are equal/equivalent.
Wow I learned something new today ๐Ÿ˜ฎ

nocturne basin
#

Also had to understand it first ๐Ÿ˜… ๐Ÿ˜…

#

The spaceship operator is essentially not usable in normal Code but eases the implementation of comparison operators greatly

#

With = default literally just implementing a default behavior ๐Ÿ˜‚๐Ÿ˜‚ comparing all against all

dusky dune
#

The name of these operators are getting weirder everyday

karmic niche
#

Are you really still surprised, even after the "walrus operator" in Python? ๐Ÿ˜„

glossy inlet
#

We wanna do Elvis operator someday

karmic niche
#

That's gonna take a lot of characters to type!

dusky dune
#

Are you really still surprised, even after the "walrus operator" in Python? ๐Ÿ˜„
@karmic niche
Exactly what i was thinking about actually! ๐Ÿ˜„

#

I just want a smooth operator ๐Ÿ˜ฆ

cinder meteor
#

Thinking of an automated one-click way to update mods on my server via FTP.
Is there such a solution? I'd like it to compare all mods it can find at the server with what I have in my local workshop folder and update those which have... mismatching date? No? Maybe there is a better way to compare mods? With a hash maybe?

tawny island
#

On Linux I would suggest rsync, which allows you to only update new files (although I believe most FTP clients also have that feature by now).
Not sure if there's a Windows alternative though

cinder meteor
#

Oh interesting! ๐Ÿค” Reminds me of FreeFileSync software I use to synchronize generic files (not related to FTP).

#

If I can reflect FTP into file system then this might work, right?

tawny island
#

you could also look at https://rclone.org/ which is cross-platform, and let you do a lot of stuff, including syncing files with an external FTP server

cinder meteor
#

Awesome ๐Ÿ˜ฎ

tawny island
#

and the rsync algorithm is actually that "good", that it will only update the parts which are different, instead of full files (no idea how, but it works great for massive backups)

cinder meteor
#

Any idea how it performs comparison of files? I never considered how it can be done but I just hope it's not going to download the file entirely over FTP just to compare it

tawny island
#

I believe it makes a checksum of chunks of each file, compares those, and if a single chunk is different it will only update that chunk (instead of the complete file).

#

For small updates on large amounts of data it's rather slow and traffic heavy (compared to just updating the changed files manually), but with larger changes it will be a lot faster.

#

If you have access to SSH on the server it will be even more optimized, but FTP works also

cinder meteor
#

Yeah I have nothing except for FTP

tawny island
#

Alternatively you could take a look at git-ftp (https://github.com/git-ftp/git-ftp), which basically creates a git repo on a FTP server.
I haven't used that myself, but I've heard colleagues liking it

#

Although that will most likely work with complete files, but works exactly as you would expect from git

cinder meteor
#

Also interesting solution, thank you

smoky halo
#

@dawn palm Hi man I just wanted to say a huge thank you for your premium tools they are probably the best tools I have ever used and I would 100% recommend them to any developer. Thanks so much man for these tools!

vague shard
#

@cinder meteor winSCP has also command line execution

vague shard
#

didnt someone here use servers/cloud hosting with GPU for some automated A3 testing or similar? looking for some advice on the topic

karmic niche
#

That was @scenic canopy ๐Ÿ™‚

elfin oxide
#

I have been using paperspace.com for DayZ devleopment. You have your own VM you can install steam and automation pipelines on. There are other options out there, but mayne failed to be able to launch RV and Enfusion engine because of hardware and driver requirements. You can even game on them, though the mouse movement is buggy at times cause of focus loss >.>

vague shard
#

thanks! checking out

#

on a related note can one abuse one of those cloud gaming services (that allows steam install with mods and all) for such purpose too?

elfin oxide
#

Unfortunetly not really. I tried but often mods are not allowed to be installed. also some services wipe the vm after you stop playing so you need to reinstall and download everything. for games that is np cause its bascially instant on 10G networking but mods is annoying to get running. Needless to say you got no way of running a batch or .sh on them

nocturne basin
#

If it is just SQF-Related use SQF-VM ๐Ÿคช๐Ÿคช๐Ÿคช๐Ÿคช

neon flax
#

can it read configs from pbo?

nocturne basin
#

It has pbo Support in theory
Just that nobody ever added it to the actual vm

#

Aka: right now you need to unpack the Configs

#

Though that might change soonโ„ข๏ธ

glossy inlet
#

it has PBO reading classes, and it can read configs. But noone connected them together

cinder meteor
#

I need an addon which can save and load arma strings in a file in key-value pairs, key is string, value is string too. Perhaps someone has written such a thing already?

tawny island
#

other than that; afaik are there no mods which allow reading and writing files, especially not with BE support.

karmic niche
#

Or you can literally write that in 10 mins using Pythia ๐Ÿ˜‰

#

But yeah, no BE support

cinder meteor
#

As I understand, I just need to ask BE to approve my DLL. Also, is BE approval needed if it's a server-side addon?

tawny island
#

BE won't even start the server if a DLL is loaded... which isn't allowed that is

cinder meteor
#

if any dll is loaded? or any unsigned dll is loaded?

tawny island
#

any dll which isn't allowed by BE

#

afaik

cinder meteor
#

okay, then I just submit it to BE mail ๐Ÿคท or ask people to disable BE

tawny island
#

so extDB3 is the most useful method to store data, especially server only

cinder meteor
#

Or you can literally write that in 10 mins using Pythia ๐Ÿ˜‰
I wanted to see how inconvenient is it to write arma extensions actually, never wrote one yet.

#

so extDB3 is the most useful method to store data, especially server only
but people need to mess with installation of SQL on their dedicated server, right? and some one people I've met barely know how to ifnd the RPT file on their server ๐Ÿคฃ notlikemeowcry I'd rather have some addon which just requires installation like any other addon and nothing else.

tawny island
#

if people can't even read simple instructions, are they even worth your mod? ๐Ÿ˜‰

cinder meteor
#

sure, my idea is to have them send me one file with their saved game for debug instead of whole varsarma3profile

tawny island
#

but in short; BE support will be the biggest issue for anything that can read/write outside of the game/addon, and I even doubt it will be allowed at all

cinder meteor
#

fine, then I ask them to disable it ๐Ÿคท

tawny island
#

and telling people that BE can't be used (depending on use case) is probably worse... but that's my 2 cents

cinder meteor
#

yeah I see, then they use the usual dumb way of storing data in arma :/

#

I mean I plan my SQF code to switch between those storage methods, if the addon is present

karmic niche
#

Wait wait, if you're doing something server-side you don't care about BE

#

BE will block loading dlls only on the client's machine

#

(that's what I always thought, at least ๐Ÿค” )

cinder meteor
#

Grezvany13 said that BE on server won't let it load any DLLs

karmic niche
#

Fronline has been using Pythia (that's not BE whitelisted) on the server for years, so... ยฏ_(ใƒ„)_/ยฏ

cinder meteor
#

and you have BE enabled, right?

karmic niche
#

Is there even something like "enable BE" for servers in the config? I know that you can set "enforce BE on the client" in the server config but that's all

cinder meteor
#
BattlEye = 1;     Enables or disables the BattlEye anti-cheat engine. Default 0. - since 1.09 beta, in Arma 3 default is 1. Requires installed battleye on server and clients joining the server 
karmic niche
#

I don't have access to our configs now, but we've always been running Pythia AND enforced BE for the clients

#

Maybe that "battleye on the server" just means something that will communicate with BE on the clients, not interfere with dll loading on the server

#

@dusky dune ?

dusky dune
#

we had BE ye

#

no idea about the config, just know that you needed be to join

karmic niche
#

I mean, use whatever you want, ExtDB3 could be a good solution. I'm just referring to Pythia as an extension that I 120% know is blocked by BE ๐Ÿ˜„

glossy inlet
#

Also, is BE approval needed if it's a server-side addon?
no its not @cinder meteor
BE won't even start the server if a DLL is loaded...
Thats wrong @tawny island

neon flax
#

BE does not care about DLLs on the server.

scenic canopy
#

@cinder meteor inidb?

cinder meteor
#

I tried that long time ago. It has limits on string length and it has some special characters which it can't handle.

scenic canopy
#

1 or 2?

cinder meteor
#

?

#

version? no idea, it was such a long time ago

#

it was inidbi2

#

maybe it doesn't have the max size restrictions any more?

Well... crashing the game is a good way to start writing an extension ๐Ÿคฃ
ErrorMessage: Buffer overrun detected when using extension 'filext'

vague shard
#

anyone knows if you can delete the steam workshop depot cache and steam will only recreate the necessary one (aka it will get smaller)?

scenic canopy
#

it will fill up eventually

#

once you've uploaded the same items again

vague shard
#

well is it diffs or just the most recent data?

cinder meteor
#

I wonder, how would you implement data storage for this addon I discussed above?
So, I need to store key, value pairs in the file, both key and value are a string. I think I could just store it in format key<null>value<null> for each pair, where <null> is just 0-character. I don't think that there is a better and easier way really.

scenic canopy
#

YAML or JSON would make it easy to view and edit in most editors

cinder meteor
#

Good idea, but then I also need to think of escaping and unescaping characters which must be escaped in JSON

dusky dune
#

which addon above?

#

i mean i dont know how fast it would be, but just using the python stuff works pretty well without really problems

scenic canopy
#

Any sane json or yaml library will deal with the escaping

cinder meteor
#

Ok I see now, Python would have been a better choice, yes, it has good JSON capabilities

scenic canopy
#

Any of the common languages will

#

Most high level languages ship with built in json and/or yaml support

cinder meteor
#

I don't think that it's cool that I can't allocate a string of whatever size I want and pass it to arma as a return value :(
Why was it done this way? (char* output is provided by the game, int outputSize is the max amount of bytes I can write there)
int RVExtensionArgs(char *output, int outputSize, const char *function, const char **argv, int argc);

#

To avoid memory leaks I guess?

glossy inlet
#

I don't think that it's cool that I can't allocate a string of whatever size I want and pass it to arma as a return value ๐Ÿ˜ฆ
you can do that

#

use extension callback, they take arbitrary result link

#

To avoid memory leaks I guess?
no, performance, buffers stuff.

cinder meteor
#

use extension callback, they take arbitrary result link
it's for asynchronous things though, my design is synchronous ๐Ÿคท
no, performance, buffers stuff.
looks strange, so the game always allocates some 20 kilobytes just for the case that I need to return this amount of data ๐Ÿคท

glossy inlet
#

my design is synchronous
waitUntil ๐Ÿ˜„

#

so the game always allocates some 20 kilobytes just for the case that I need to return this amount of data
yep. Thats why its kept so "small"

cinder meteor
#

Wouldn't it make more sense to allocate that space only when I need to return data? ๐Ÿคท I mean, does it matter if I allocate memory or arma?

glossy inlet
#

yes it does matter who allocates it

#

you can't free memory that arma allocated, and arma can't free memory that you allocated

cinder meteor
#

oh really ๐Ÿ˜ฆ I didn't know this

cinder meteor
#

why does extension callExtension [function, arguments] need to convert a string argument to a string? It makes sense if I passed a number as argument, but doing a str _valueWhichIsString makes no sense, or does it?

glossy inlet
#

need to convert a string argument to a string?
what?

cinder meteor
#

"filext" callExtension ["loopback", ["myString"]];
it returned ["""myString""",0,0]

#

so before calling my code, it coverts every argument into argument array to a string, even a string

#

in this example, "loopback" just returns to arma whatever was passed to it
strcpy_s(output, outputSize-1, argv[0]);

glossy inlet
#

๐Ÿค”

dawn palm
#

I believe "quotes" are there to prevent any chance of 'thing' being misinterpreted as a #define

cinder meteor
#

it's not just quotes, it does proper escaping of all data inside, just like str "whatever" would do in SQF

dawn palm
#

well sqf itself requires "quotes" to denote strings.

cinder meteor
#

It doesn't add quotes to my function name though which is a string already, so I don't understand why would it do it for arguments

dawn palm
#

thing = __EVAL ("one" + "two" + "three");

glossy inlet
#

yep

#

it gets every value as text, which for string escapes it again.
Not sure if thats a bug @stray galleon
callExtension args all arguments get converted to string, but string isn't taken 1-1 but instead gets its quotes escaped.

#

even if its a bug, probably too late now

cinder meteor
#

I wonder if anyone's code relies on this ๐Ÿคฃ

glossy inlet
#

probably everyone's who's passing strings through there

cinder meteor
#

well, I'll just have to call compile it on the way back then meowtrash or parsesimplearray [_value] select 0

glossy inlet
#

why way back

#

just unescape it inside extension

cinder meteor
#

why solve character escaping problem if arma can equally solve it itself natively

glossy inlet
#

because the arma thing you want to do is slower

#

and your extension code is "native" too

cinder meteor
#

I meant that that solution is native to arma

#

I don't really know how hard destringification is ๐Ÿค” do I just convert each "" into " ๐Ÿคท

dawn palm
#

"""myString"""
this is perfectly legal syntax where you want the output to retain the quotes. example (in general)
["Hello World"]
will display "Hello World"
[Hello World]
will display Hello World

glossy inlet
dawn palm
#

["this is a quote"]
[this is not a quote]

cinder meteor
#

Or I could just... pass data through function argument, and pass function name through argv[0]
๐Ÿคฃ
Yes, perfect, this is an arma solution to the problem

No, it makes game crash at around 100 kilobytes of passed data Most likely it's because of my code ๐Ÿคฆ - yes it works past 1 megabyte of characters blobcloseenjoy

scenic canopy
#

@glossy inlet the reason is that you can check if an argument is a string or not, if its a string it starts with quotes

#

otherwise a string and a number would be the same

#

but it's a bit odd yes

#

normally you would know what arguments you're getting

#

but its nice for a generic function

#

i.e. """5""" vs "5"

#

output needs to be in the same format to use parseSimpleArray on it I guess

#

so it's consistent with that as well

dawn palm
#

strings are "strings" in sqf because there's no other way to detect the difference between GetObject and "GetObject", or "and" and and, nor any other stupid bloody verb-operator they use, of which there are hundreds which are regulatly added to whenever it suits them.

#

any other language, all this crap would be placed in a library and accessed by calls, but bis in their wisdom choose to make each one of them part of the formal syntax of the language.

nocturne basin
#

Think I had some very horrible string to SQF types converter I made ages ago somewhere to pretty much fix those things ๐Ÿค”

glossy inlet
#

@glossy inlet the reason is that you can check if an argument is a string or not, if its a string it starts with quotes
@scenic canopy
You have string, number, bool.
Everything that's not number or bool will be a string. Also with a extension you usually specified or know what types of arguments you expect.
So don't really see a reason to need to escape strings.
If you want strings as arguments, then you now have to unescape them manually
And if you wanted them escaped, you could just do that before calling the extension.

nocturne basin
#

Probably will do it tomorrow

scenic canopy
#

to create prepared statements for database it could be useful to deduce the type

#

just send the query and all values in a single callExtension

nocturne basin
#

Printf style

#

Argformats first

#

Actual content second ๐Ÿคช๐Ÿคช

cinder meteor
#

@glossy inlet the reason is that you can check if an argument is a string or not, if its a string it starts with quotes
Then type data should have been provided explicitly. And it's not worth to iterate whole string to provide type anyway. Added quote is a by-product of a totally unrelated operation IMO.

scenic canopy
#

helpful in your case since now a value can be either string or number automatically ๐Ÿ™‚

cinder meteor
#

For my specific case, I convert data to string format already to make it compatible with any storage which can store strings, also to make it occupy less space in profileNamespace ๐Ÿคท

#

But for the general case... I don't know?

scenic canopy
#

if you want to use json or yaml you should preferably handle the data as strings, numbers and booleans

cinder meteor
#

I am not arguing of that. I am saying that arma stringifies my passed string. Then, irrelevant of the form I store it (JSON library, or raw data in file), the value I get back after reading the file is stringified one more time, so to get it back what I sent to my addon, I must de-stringify it again.

scenic canopy
#

see the example on the biki

#

parseSimpleArray can deal with that

cinder meteor
#

I know, I understand it. I'd prefer to get same string back. ๐Ÿคท

scenic canopy
#

use the non args syntax then?

#

simple string in, simple string out

cinder meteor
#

I also must encode the function somewhere. But don't worry, I've found my solution already, second syntax and data passed through function

scenic canopy
#

why not just use the first one then?

cinder meteor
#

How do I encode function name? I must pass both function name and a huge string to my addon.

#

I could reserve some static amount of space for storing function name there at the start of string, but why if second way works as well ๐Ÿคท

scenic canopy
#

it won't be str'ed like the args for alternative syntax

cinder meteor
#

but alt syntax gives multiple arguments...

#

if (strcmp(argv[0], "\"open\"") == 0) { currently I use this xD

scenic canopy
#

function is not str'ed

#

only args

#

seems like a backwards approach instead of embracing the str'ed values in args

cinder meteor
#

why backwards?

scenic canopy
#

and same with return type

#

if you have open as the function you can just check for if (strcmp(function, "open") == 0)

cinder meteor
#

"myext" callExtension ["some huge string which I do not want to stringify please!!", ["set", "myfile.log", "myVarName"]]
You see, I pass data (big string) through function argument there

scenic canopy
#

or use std::string and just plain comparison

neon flax
gritty radish
#

@nocturne basin does the current sqfvm build has trouble with including files one layer up?
i get this error on the linux binary but not on the windows one: " Failed to include '..\script_common.hpp' into file '/mnt/c/Users/Dragon/SQF-VM - Linux - x64/Corescripts/functions/logging/script_component.hpp] ':File Not Found"

#

also, doesn't the application provide exit codes if detecting errors?

neon flax
#

@gritty radish no profanity.

young plaza
#

my pboproject suddently doesn't open anymore
somehow my pc removed vcruntime140_1.dll
any idea how to reinstall it?

tawny island
#

(re)install Microsoft Visual C++ 2015 - 2019 Redistributable

young plaza
#

that did it thanks @tawny island
didn't feel like trusting those "dll download" sites

karmic niche
#

Oh? You're saying that one of your car engine's pistons is broken? Nah, don't go to the car mechanic! Don't replace the engine either. <opens an old and dirty chest> Hmm... Where did I put it? Oh, here! Take this spare generic piston that will totally work for you!

nocturne basin
#

@gritty radish have you enabled the upper dir for access?

sick verge
#

https://github.com/overfl0/Armaclass is there any lib like this but for c# ?
@neon flax
I wrote something in Java a while ago. While it is obviously not c# I guess Java and C# are close enough for it to be easily ported if you want to.
Iirc class parsing was a bit buggy though... I mainly used it to read PBOs - you'll have to check whether it works for you.

See https://github.com/Krzmbrzl/ArmaFiles

scenic canopy
#

Head made one for C#

#

@neon flax

neon flax
#

Thanks guys.

dawn palm
#

my dll contains an API of well maintained c++ functions to retrieve/add/alter any part of a pbo irrespective of which engine it was/is targetted for. Using it is documented in, well, hell, the documentation accompanying the dll.

#

being c++ it is as usable in the penguin as it is in windoze without further fuss.

#

The api is available both free and subscriber and is compatible to both.

neon flax
#

I'm more interested in config manipulation only, wanted to use it for server config tool.

stray galleon
#

callExtension args all arguments get converted to string, but string isn't taken 1-1 but instead gets its quotes escaped. @glossy inlet not sure what you mean

dawn palm
#

The same API is used for rap/derap and all other file formats.

#

The dll treats all paramfiles both binarised and plain, as being born equal. There is no difference internally between the two.

scenic canopy
#

@neon flax some of the server admin tools like FAST2 or FASTER contains C# classes for all kinds of server configs

gritty radish
#

ain't both tools written in vb.net?

#

@nocturne basin if you mean permissions on the filesystem, yes

neon flax
#

FASTER is C#

nocturne basin
#

i mean literally have you allowed that directory for SQF-VM to be navigated into @gritty radish ๐Ÿ˜‰ i guess at best this is continued on the SQF-VM discord though

gritty radish
#

i will find my way soon soon

dusty walrus
#

I am working on an config database tool, and wanted to ask, is there a reason why enoch content isn't unpacked with arma3p? or at least isn't findable? Or should it be accessible?
to explain, the tool will use the icon path inside the config to show an preview picture, everything is working except the icons for enoch content

neon flax
#

enoch stuff is in ebo, encrypted pbo

#

it can't be unpacked.

dusty walrus
#

ok, thanks!

scenic canopy
#

it (mostly) uses the arma files as persistent storage

cinder meteor
#

callExtension args all arguments get converted to string, but string isn't taken 1-1 but instead gets its quotes escaped. @glossy inlet not sure what you mean
@stray galleon
string passed as an argument to alt variant of callExtension gets stringified one more time. So If I pass an arma string with value myStuff, inside the extension I get "myStuff". As if it was passed through str SQF command.

#

Just copy-paste of my yesterday's message explaining this:

"filext" callExtension ["loopback", ["myString"]];
it returned ["""myString""",0,0]
so before calling my code, it coverts every argument into argument array to a string, even a string
in this example, "loopback" just returns to arma whatever was passed to it
strcpy_s(output, outputSize-1, argv[0]);

glossy inlet
#

The same API is used for rap/derap and all other file formats.
no its not
The dll treats all paramfiles both binarised and plain
thats completely offtopic @dawn palm

vague shard
#

can you avoid steam redownloading all data (when the mod id has changed), if you put the old data into "downloading" (that temp folder) or by other means?

scenic canopy
#

Seems to be based on ACF metadata as well

#

But I havenโ€™t verified that

stray galleon
#

@cinder meteor intended. also you can detect string type inside extension by checking if 1st char is ". easy to strip off easy to add back.

cinder meteor
#

@stray galleon but if I store that result, I must unstringify it on the way back or elsewhere. Double waste of resources. And it's not like I'd need to just remove " at end and start, but also unescape double quotes and such

#

Anyway good to know that it's the intended behaviour meowtrash

stray galleon
#

it is supposed to be used with parseSimpleArray so you return array then you donโ€™t need to do anything

#

if you want to send one string and return one string there is overload for this that doesnโ€™t stringnify anything

nocturne basin
stray galleon
#

if you want send array and return array then use args syntax

karmic niche
#

Has anything changed with parseSimpleArray regarding speed or is it still the case that sometimes call compile is faster? (AFAIR this was the case 2 years ago)

#

Depending on the type of input, of course

stray galleon
#

no call compile was faster when it was caching but i think this was now removed because of memory leak

karmic niche
#

Hmm... ๐Ÿค”
Thanks for the information! I remember the issue with the memory leak but didn't relate it to that (even though it sounds obvious, now).

Gotta redo my performance tests then

stray galleon
#

@nocturne basin use sscanf?

nocturne basin
#

the parser (probably) already works

#

but the implicit cast & overloaded operators are troublesome ๐Ÿ˜„

cinder meteor
#

it is supposed to be used with parseSimpleArray so you return array then you donโ€™t need to do anything
Ok, so it stringifies it for me so that I can return a string which consists of, for instance
[argv[0], argv[1]] and use parsesimplearray on this in SQF side?

stray galleon
#

look up examples on callExtension page

#

also if you need to use data elsewhere after you passed it to extension, stripping/ adding quotes is easy there is even std:: function for it

nocturne basin
#

Plus what I am crafting there ๐Ÿคซ๐Ÿคซ

cinder meteor
#

also if you need to use data elsewhere after you passed it to extension, stripping/ adding quotes is easy there is even std:: function for it
What if my string is already a stringified array whicn initially had strings.
I understand the example but it still feels like this thing is doing more than it should. Just my opinion.

#

It's like 'convert it all to string even if it's a string already then call my code' instead of 'just call my code with the data I provide'

nocturne basin
#

You can use my sqf-parser stuff above when I am done

#

Right now I just need to fix the operators

cinder meteor
#

I am just passing my data through function argument for now, it doesn't stringify my string, don't worry

stray galleon
#

there is no separate type container that contains type of array elements you pass to extension it is all one big string. so how do you know element is string when it is inside the string already?

#

Anyway I might find time and add input handling routine code to biki I used before

glossy inlet
#

well yeah "5" and 5 would look the same inside extension tehn

cinder meteor
#

there is no separate type container that contains type of array elements you pass to extension it is all one big string. so how do you know element is string when it is inside the string already?
I'm used to writing in languages with strong types. There is no such problem there.

glossy inlet
#

Just use intercept

#

and implement your own script command

#

battleye whitelisting is the only problem with intercept, but thats not a thing on server sooo

stray galleon
#

c++ is strongly typed language the problem is input output bottleneck

cinder meteor
#

battleye whitelisting is the only problem with intercept, but thats not a thing on server sooo
Yeah I know but... i just wanted to try the standard way to see how much I like it :)

#

c++ is strongly typed language the problem is input output bottleneck
What's the problem really? How do I know type of my data? Easy, if it's my code then I always know its type because it's my code

glossy inlet
#

if you need to know the type you could add it as param

stray galleon
#

what if you need to write extension to be used by others?

glossy inlet
#

Well you need to specify the arguments and expected syntax and stuff anyway

stray galleon
#

then you need to be able to check input, because you donโ€™t know what user will put in it

glossy inlet
#

You need to do that now with the string double escape too

stray galleon
#

you need to know when user passes string and it is easy because it will always start with "

#

array will always start with [

scenic canopy
#

@cinder meteor dedmen alraedy linked you code to (de)stringify stuff between extension and sqf world

stray galleon
#

i need to look up how i did it but you can check accept or reject user input quite easily when args syntax is used

scenic canopy
#

I think the currently args solution is quite neat, super simple to write dynamic args handling

#

which is perfect for prepared queries with setString, setInteger etc

stray galleon
#

yes if you use stored procedures with known argument types your work is done for you

scenic canopy
#

yep

stray galleon
#

uses streams but why not

scenic canopy
#

neat, might be good to add on the wiki

#

I have something similar to dedmen's solution today

cinder meteor
#

what if you need to write extension to be used by others?
make an SQF wrapper which checks parameters, decodes return code, prints errors, etc ๐Ÿคท
If I had to make that callExtansion interface, I'd make that thing pass data in form [typename, value, typename, value], I think there is no better way to pass type information than to pass it explicitly

stray galleon
#

when you pass wrong argument to sqf function the game doesnโ€™t crash

#

if you donโ€™t want to check input in the dll, which is holding Arma by the balls then it is your problem

cinder meteor
#

I can crash game by a trillion other ways with an extension ๐Ÿคท

Of all ways to pass data type information there was chosen the one which does useless work plus also mangles data, and it won't change because it's too late anyway. I think it's not worth discussing this further.

But thanks for providing solutions.

glossy inlet
#

Its also easiest to implement

#

to pass strings 1-1 would need two lines extra code

cinder meteor
#

2 lines of extra code for 10-something people later to search for destringifier? notlikemeowcry notlikemeowcry notlikemeowcry

#

Maybe actually a third parameter to callExtension could be added, which would toggle string behaviour...

#

But of course I am in no way suggesting it to you ๐Ÿ˜„ I've found my workaround anyway

nocturne basin
#

@cinder meteor https://github.com/X39/sqfParser/blob/master/sqf-parser/value.h

auto input = sqf::value::parse("[1,\"false\", false, \"\"\"foo\"\"\"]");
auto output = sqf::value({ 1, "false", false, "\"foo\"" }).to_string();
// equals the SQF-Array [1, "false", false, """foo"""]
```that might be useful for ya? ๐Ÿ˜œ
cinder meteor
#

I am really thankful for this @nocturne basin but I've bypassed custom string manipulations entirely, I'd rather not do them if possible

nocturne basin
#

that is less about custom string manipulation

cinder meteor
#

But I understand that it could have parsed my string, right?

nocturne basin
#

and more about adding in a full layer of functionality, without any need to ever craft your sqf-output values on your own and full support for .. pretty much anything you can throw at it

#

yup

#

and output your values correctly as parseSimpleArray compatible code

cinder meteor
#

Hmm yes I see, the autoformat for output could be useful if I need it, thanks

nocturne basin
cinder meteor
#

Just want to make sure: is it fine if I store extra files in the addon folder (such as !Workshop/@myaddon if my addon was called myaddon)?
Will workshop erase those files? Is it possible?

#

I mean, extra files generated by addon itself, such as saved games or user data

dusky dune
#

From my experience any files that are not on the workshop are left alone

#

So new folders / files dont get changed / removed

#

Not sure what happens when you add a new file to workshop version that was previously created by your addon

rancid anvil
#

Although saving stuff like saves there doesnt sound like a good idea imo Shrug

cinder meteor
#

Why @rancid anvil ? Where would you save them?

rancid anvil
#

The profile folder

cinder meteor
#

I recently got advice that all addons which store extra files (infistar for instance) tend to save them in the folder rwith arma addon, it eases migration and other things.

rancid anvil
#

either in the .vars file or a seperate file for the addon

#

Hm I know that Kp lib stores them in the profile folder, not sure what other missions do

dusky dune
#

for plopper i just do everything in the addon folder and Pythia installs pip requirements to the mod folder as well

#

Although i agree that probably the profile folder would be a better option

cinder meteor
#

I wonder if I can get that folder path at a dedicated server

scenic canopy
#

you can read env vars

solemn isle
#

Is it possible to somehow binarise something using BI's 3DEN UI macroExecs.inc and macros.inc files?

glossy inlet
#

why wouldn't it be? they are just text files

vague shard
#

is compressed rvmat valid for model binarization? also meaningful or instead actually problematic?

glossy inlet
#

compressed?

#

rvmats aren't compressed?

vague shard
#

it seems to be possible with mikero tools or maybe otherwise (source of compression is not entirely clear yet)

nocturne basin
#

Maybe I should add it to the list in the biki ๐Ÿค”

elfin oxide
#

@vague shard most likely means binarized rvmats. I have not paid attention to it in the past, but it would not supprise me if binarize.exe knows how to deal with binarized data it has to fetch to binarize the source model. That you will have to test with a dummy and see, unless someone has tried it already and can report his findings ๐Ÿ™‚

vague shard
#

no i am talking about compression

#

from makepbo.readme.txt:

#
Compression

compression (and obfuscation) is disabled if you pack unbinarised p3d's.

Any pbo can be compressed for ANY engine. Since many low grade pbo extractors 'out there' don't understand compression, this can be used as a mild form of obfuscation.

The results of compressing mission pbos can achieve better than 75% reduction in payload.

For addons, the results are less spectacular (between 5..10%) because pax's (which form the majority of files in an addon) are generally the largest in size and are (mostly) pre-compressed anyway.

under no circumstances will the dll compress init*.sqs or sqf
the dll will not compress a file who's result would be larger
Obfuscation automatically implies compression. If no specific compression is specified, it will use the defaults.```
#

i think its lzss compression

elfin oxide
#

Ah yes. Compression is pbo level though. Any util that wants to access any of the pbo contents has to unpack the pbo, thus reversing the compression before reading the actual rvmat file. A single file can NOT be compressed under any circumstances.

#

So the answer then is, it does not matter. if the tool accepts pbos as source locations for rvmats, then it will be able to use them no matter if the pbo was compressed or if it is raw

cinder meteor
#

Is it true that currently only 32 bit extensions work on linux? Meaning that only 32 bit linux executables can use extensions?

nocturne basin
#

Where did you read that?

glossy inlet
#

A single file can NOT be compressed under any circumstances.
actually it can. Pbo compression is per-file, inside the pbo.

#

Is it true that currently only 32 bit extensions work on linux?
no?

cinder meteor
glossy inlet
#

thats wrong

cinder meteor
#

Okay, so... I guess it was old data

glossy inlet
#

probably written because 64bit linux outright didn't exist at all

cinder meteor
#

Is there some extension which exists in community which is built both for windows and linux?

glossy inlet
#

extDB (no x64 linux)

#

ArmaScriptProfiler (though not sure if I did x64 linux, probably not)

cinder meteor
#

๐Ÿค” why is there no x64 linux for extDB? Is it super hard to make?

glossy inlet
#

there was no x64 linux when extDB was last touched by its dev

#

Thus he didn't make it

cinder meteor
#

Ok I understand

scenic canopy
#

There is one somewhere here that I ported

cinder meteor
#

I was rather wondering how to make a setup to build that for all platforms

#

Or if I could borrow it from somewhere for my extension ๐Ÿ‘€

scenic canopy
#

I've added linux x64 to anrop aar and armascriptprofiler

#

both use cmake

#

but armascriptprofiler also needs intercept for linux x64

#

which is missing at least one vtable lookup

cinder meteor
#

Great, I will take a look!

#

What is anrop for? Never heard of it.

#

Maybe it would be worth making some multi-platform Arma extension CMAKE project template, I think it would be very useful. Unfortunately I am very bad with CMAKE and such things at this point.

nocturne basin
cinder meteor
#

I more worry about RV call extension declarations

#

dllexport and such things

scenic canopy
#

you just need to worry about windows vs linux

stray galleon
#

Currently key word meaning that at the time of writing this was the situation but doesnt mean that is the situation now

#

though it is still kinda true because linux 64 server is still dev

#

which means you probably need to add compile option

cinder meteor
#

Thanks!

dawn palm
#

@vague shard
is compressed rvmat valid for model binarization? also meaningful or instead actually problematic?
the rvmat baked into the p3d is sourced from plain jane text, or binarised (bis binarise accepts either). There would, however, never be a reason to not binarise any rvmat file. This is especially true of the thousands present in a wrp pbo.

lzss compression is used in the pbo after all this occurs for any/all files depending on what you exclude.

there are no known issues with rvmat (or p3d) compressed 'files' (eg the entries in the pbo itself). Paa cannot be compressed due to the texheaders.bin which records hard offsets into an uncompressed paa

as to problematic, the answer is p3d rvmats themselves may not be required in the pbo at all, since they're already baked in to the p3d! (to date, no one has actually tested this 'theory' ๐Ÿ˜Ž

vague shard
#

as said i am speaking of compressed rvmat - not rapified rvmat

#

the issue observed is a stark fps drop of models with such setup - my theory is the engine cannot read the compressed rvmat, thus cannot merge the information and leaves the reference to the rvmat. as result the engine has to load the info on runtime which results in the fps issues

#

we are looking for people with some insights on bisign files:

  1. is it really a problem if a client has multiple per pbo or fine as long as one of them is "correct" aka fits one bikey of the server?
  2. any other way known to match/verify bisign vs bikey (and pbo) than going just by their naming?
  3. any "simple" way via extension to know which bisigns are loaded by arma/to scan all loaded modfolders for bisign files?
scenic canopy
#
  1. I've had issues when (at least) one was wrong
#
  1. outside arma?
vague shard
#

ref 2) via extension

#

ref 1) wrong or outdated?

scenic canopy
#

isn't that the same thing? ๐Ÿ˜‰

#

non matching key, so outdated

vague shard
#

well people tend to have keys of multiple versions of cba present

#

i assume as such also bisign (but naturally just one pbo version)

scenic canopy
#

yes, don't do that based on that experience ๐Ÿ˜„

#

should be fine to have multiple keys as long as they are unique

#

and then player A has pbo + bisign from one version, player B has pbo + bisign from another version

#

but in our case one player had pbo + multiple bisign versions

#

where one was valid, one was wrong

vague shard
#

ok need to verify that

#

overall we are struggling most how to support optional mods

faint salmon
#

the issue observed is a stark fps drop of models with such setup - my theory is the engine cannot read the compressed rvmat, thus cannot merge the information and leaves the reference to the rvmat. as result the engine has to load the info on runtime which results in the fps issues
@vague shard @dawn palm Just happened to stumble across this (for entirely unrelated reasons), and wanted to add a little info - I've observed FPS drops happen with only compressed .p3ds, .rvmats were uncompressed in that test, and still saw major FPS drops.

faint salmon
#

I've written an example Arma Extension in Rust, that compiles on both 32-bit and 64-bit Windows and Linux and is completely free from extra dependencies (just rust standard library). It's also got a README that explains how to install toolchains and cross-compile for 32-bit from a 64-bit install, as well as (briefly) where to put .sos and .dlls.
Notably, it contains an example works around an issue in the Rust compiler that prevents 32-bit Windows DLLs from being detected by Arma, and a writeup on how that workaround works.
https://github.com/Spoffy/Rust-Arma-Extension-Example

#

Started as a bit of a curiosity project, but thought it might be useful if written up!

nocturne basin
faint salmon
#

Ooh, shall do.

glossy inlet
#

if you do cool stuff and want a repo on there feel free to ask as well o7

faint salmon
#

Oh, sweet, will do if any of my random bits and pieces turn into anything!

nocturne basin
#

should add my SQF scripts to the sqf-gems repo there

scenic canopy
faint salmon
#

Opened a PR @nocturne basin, let me know if you want me to change anything. (Edited: Pinged wrong person)

nocturne basin
#

*X39 (i guess X360K2 will now be furiously typing any minute :P)

scenic canopy
#

ah, I see its mentioned in the readme as well ๐Ÿ™‚

#

perhaps it should be mentioned higher up in the readme?

faint salmon
#

Yeah, I did. His stuff is a really nice bit of work, though unfortunately the amount of fancy macros he uses obfuscates the actual interface used.

#

I thought a more clear-cut example would be helpful!

scenic canopy
#

most of the files don't end with a newline, good practice to ensure compatibility with tools

rancid anvil
#

btw as a sidenote afaik people dont get pinged if a ping is edited into a message, they get the yellow message highlight but not the actual ping sound/red 1 on the server icon @faint salmon