Jump to content
Zenophon

Zenophon's ArmA 3 Co-op Mission Making Framework

Recommended Posts

Gotta say this all looks very amazing.

Note: The script should automatically terminate / exit itself. No need for the exitWith at the bottom? Or is there more of the script or some method to the madness?..

Edited by Iceman77

Share this post


Link to post
Share on other sites
Gotta say this all looks very amazing.

Note: The script should automatically terminate / exit itself. No need for the exitWith at the bottom? Or is there more of the script or some method to the madness?..

Thanks, I'm glad that all the time spent designing each function and how they fit together paid off.

The exitWith explicitly returns void, rather than the value of the last line. Thus, it is safe to use '0 = call ...' or just 'call ...' without an error or putting an unknown value into your script when the call returns.

Share this post


Link to post
Share on other sites
After quite a bit of testing and looking through the code, realized that only one thing could be the problem. The only change to tasks for JIP is done by Zen_ReassignTask. I had assumed that it was working, but in fact it was not. I feel like I should have seen that earlier. Nevertheless, the bug is not directly in Zen_ReassignTask, but in a private function that it calls.

Woah, I found an actual bug? AWESOME! I have not had time to try this out yet, will do so on the weekend - Thanks dude!

Share this post


Link to post
Share on other sites
Thanks, I'm glad that all the time spent designing each function and how they fit together paid off.

The exitWith explicitly returns void, rather than the value of the last line. Thus, it is safe to use '0 = call ...' or just 'call ...' without an error or putting an unknown value into your script when the call returns.

Ahh gotcha. Couldn't it simply be

// . . . //

Zen_Task_Array_Global = Zen_Task_Array_Global - [0];
publicVariable "Zen_Task_Array_Global";

true

Just trying to learn a little here myself. Cheers.

Share this post


Link to post
Share on other sites
After quite a bit of testing and looking through the code, realized that only one thing could be the problem. The only change to tasks for JIP is done by Zen_ReassignTask. I had assumed that it was working, but in fact it was not. I feel like I should have seen that earlier. Nevertheless, the bug is not directly in Zen_ReassignTask, but in a private function that it calls.

Tested it tonight, and it works like a dream - thanks Zen. the only JIP issue I have left is the fact that JIP players cannot access the loadout system - I will review the sample code this weekend, but if you have any advice on this I'd appreciate it!

Share this post


Link to post
Share on other sites
Ahh gotcha. Couldn't it simply be

// . . . //

Zen_Task_Array_Global = Zen_Task_Array_Global - [0];
publicVariable "Zen_Task_Array_Global";

true

Just trying to learn a little here myself. Cheers.

Because true is not void; the return matches the documentation. I could use (nil) at the end and the effect should be the same, but I just chose exitWith.

I could use true/false or 1/0 to indicate success or failure, but that's just a lesser version of throwing an exception. Since exception handling in SQF is somewhat lacking, I made all of the errors print everywhere that they can and stop the function. Thus functions that have nothing meaningful to return simply return void.

Tested it tonight, and it works like a dream - thanks Zen. the only JIP issue I have left is the fact that JIP players cannot access the loadout system - I will review the sample code this weekend, but if you have any advice on this I'd appreciate it!

You must call Zen_AddLoadoutDialog in the JIP sync code for the action to be added. Append the loadouts to Zen_JIP_Args_Server:

Zen_JIP_Args_Server = [ ... , ["Light_AT_loadout","AA_loadout","Assault_loadout","Sniper_loadout","wm_Demo_loadout","Medic_loadout","Autorifleman_loadout","Heavy_AT_loadout"]];

Then in JIPSync.sqf, call Zen_AddLoadoutDialog using those loadouts on all the objects that should have the action:

{
   0 = [_x, (_serverArgs select 11), -1, false] call Zen_AddLoadoutDialog;
} forEach [bLUFORLoadouts, MHQ1, MHQ2, MHQ3];

Share this post


Link to post
Share on other sites

Thanks Zen, I will test that out this weekend. Now I need to update to the latest version of Icemans light vehicle respawn script, and see if I can get Zen_AddFastope, Zen_AddEject, and Zen_AddLoadoutDialog to work on respawned vehicles - I will report back on my progress.

/// EDIT /// EDIT /// EDIT /// EDIT /// EDIT /// EDIT /// EDIT ///

Hi Zen,

I added the code you provided to init and JIPsync.sqf. The code has been added at line 24 - 26, and the JIPsync file can be seen here.

When testing today, when a JIP player joins, existing tasks no longer sync. New tasks sync fine. Do you think this is caused by my placement of the code on line 24?

I will continue to test tomorrow.

Edited by CallMeSarge

Share this post


Link to post
Share on other sites

Introduction

Greetings fellow scripters and Armaholics, in this latest installment, I will continue to discuss the development of the framework and, of course, shamelessly advertise the framework in any way possible.

If this sounds boring, you can download the latest version from the original post. As always, the link to Google Drive for the .7z and .zip versions are already up to date. For those looking for older versions, go to file>revisions. The new version should be on Armaholic when Foxhound sees this or I PM him. Please bring any technical issues or mistakes to my attention, so e.g. people don't download the wrong version etc.

Changelog

The highlight of this release is a significant improvement to all the preprocessor macros; they have all been renamed to make them easier to use and recognize. The names are still relatively short, using abbreviations where the full word is obvious (e.g. 'OBJ' for object or 'veh' for vehicle).

In addition, numerous new macros have been added, with many argument values for Zen_FindGroundPosition. There are also macros for waiting for a distance between objects and getting a vehicle's weapons. Accordingly the standard macro ZEN_STD_OBJ_VIA has been removed in favor of ZEN_FMW_CFG_VehicleWeapons, which uses a much better algorithm.

The issue with Zen_OrderExtraction and Zen_OrderInsertion has been solved by simply letting the AI land normally and turn off their engines. If you are playing as the group leader during an insertion, ordering your subordinates to disembark early (e.g. when the helicopter is still in flight), may cause it not to land correctly. There's nothing I can do about this; the AI pilot responding to the disembark order is hard-coded in the engine.

The most significant fix is for Zen_ReassignTask and Zen_RemoveTask, which both called a smaller function that could erase the task's data entirely. They both now modify the task correctly and allow further changes to work. Also, Zen_RotateAsSet has been fixed for markers and optimized using a different 3d transformation algorithm.

Finally, a significant improvement to the documentation of many functions is the inclusion of their hidden parameter for remote execution. Almost every function that automatically remote executes itself in order to work from the server now has that argument explicitly listed in the documentation. I strongly recommend that you do not give that argument unless you know what its effect will really be.

10/29/14

  1. Fixed: Zen_AddFireSupportAction did not check its remote execution flag argument
  2. Fixed: Zen_RotateAsSet tried to get the height of markers as though they were objects
  3. Fixed: Zen_ReassignTask and Zen_RemoveTask deleted the task's internal data, making future changes impossible
  4. Added: Framework macros for Zen_FindGroundPosition arguments
  5. Added: Framework macros ZEN_FMW_Code_WaitDistanceGreater and ZEN_FMW_Code_WaitDistanceLess, for Zen_FindGroundPosition
  6. Added: Framework macro ZEN_FMW_CFG_VehicleWeapons, to parse a vehicle's true weapons
  7. Added: Standard macros ZEN_STD_Parse_ToArray and ZEN_STD_Parse_ToString
  8. Added: Zen_StringGenerateRandom now has a parameter for character type
  9. Improved: Renamed almost every framework and standard macro
  10. Improved: Zen_OrderExtraction and Zen_OrderInsertion now make the helicopter land at the correct spot and stay there
  11. Improved: Zen_RotateAsSet significantly optimized
  12. Improved: Zen_SpawnItemsOnTable now randomly puts the object anywhere on the table
  13. Removed: Standard macro ZEN_STD_OBJ_VIA
  14. Documentation: Added for ZEN_FMW_Code_WaitDistanceGreater, ZEN_FMW_Code_WaitDistanceLess, ZEN_FMW_ZFGP_Beach, ZEN_FMW_ZFGP_DeepSea, ZEN_FMW_ZFGP_Flat, ZEN_FMW_ZFGP_Forest, ZEN_FMW_ZFGP_Hill, ZEN_FMW_ZFGP_LandingZone, ZEN_FMW_ZFGP_NotForest, ZEN_FMW_ZFGP_Urban, ZEN_STD_Parse_ToArray, ZEN_STD_Parse_ToString
  15. Documentation: Improved for Zen_AddEject, Zen_AddFastRope, Zen_AddFireSupportAction, Zen_AddGiveMagazine, Zen_AddLoadoutDialog, Zen_AddRepackMagazines, Zen_GiveLoadoutOpfor, Zen_GiveLoadoutIndfor, Zen_GiveLoadoutCustom, Zen_GiveLoadoutBlufor, Zen_MultiplyDamage, Zen_SetWeather, Zen_RemoveFireSupportAction
  16. Documentation: Updated for Zen_StringGenerateRandom and every macro

Roadmap

Very little is planned for next release, so any feedback is appreciated so that I have something to do. I will probably just focus on testing and mission-making.

I think Zen_GiveLoadout should have a remote execute options as well, and there will be some more argument macros for Zen_SetWeather.

Function Spotlight

As users of my framework know, there is an enormous number of functions at your disposal. The amount of documentation that has to be sifted through can be extremely daunting. Each week I spotlight a function and talk about its usefulness. If you have found an obscure function (not in tutorials, barely seen in demonstrations or sample missions) that you think is useful, PM me and I can spotlight it.

The function chosen for this week is: Zen_RotateAsSet. Having been improved this week, this function can serve for both logic transforms and randomization. For example, rotate some vehicles to the direction of the road they are on:

// Assume _vehicles are spawned on a road
_roadDir = [(_vehicles select 0)] call Zen_FindRoadDirection;
_vehicleDir = [(_vehicles select 0), (_vehicles select 1)] call Zen_FindDirection;
0 = [_vehicles, _vehicleDir - _roadDir] call Zen_RotateAsSet;

Recall that Zen_RotateAsSet rotates clockwise by default, so to rotate through trig angles (which go counter-clockwise) the rotation angle must by opposite than when using compass angles. Numerically, if _roadDir = 45* and _vehicleDir = 90* (trig), (* denotes degrees), then the rotation is 90* - 45* = 45*, which is > 0 and clockwise.

You can also make use of Zen_RotateAsSet for randomization. Assume you have five fixed position objectives, which can be guarded by two patrol zones defined as markers. These markers are relatively small, such that they cannot cover every angle of approach. To add replayability, you can rotate those sets of markers randomly to cover the objects from random directions. Their size depends on the area around the objectives, so they have been placed in the editor.

// Assume a naming convention like mk_obj#_mkr#
for "_i" for 1 to 5 do {
   _markerArray = [];
   for "_j" from 1 to 2 do {
       _markerArray pushBack format ["mk_obj%1_mkr%2", _i, _j];
   };
   0 = [_markerArray, random 360] call Zen_RotateAsSet;
};

Of course, this works for any number of markers around any objectives. It will also work for objects, just use 'missionNamespace getVariable' to get the object from a string.

Beta

As already stated, the framework is in the beta stage of development. I am making every effort to quality control releases, but there will be bugs. Both new features and old ones could have bugs, issues, and things people just don't like.

There is no ETA or plan for a 'final' version. The framework is a work in progress, and it will continue to progress while there are improvements to be made (there always will be).

Some of the bugs have been pointed out by users, and those fixes are included in the changelog above. I want to thank everyone who has used/supported the framework.

---------- Post added at 02:48 ---------- Previous post was at 02:42 ----------

Thanks Zen, I will test that out this weekend. Now I need to update to the latest version of Icemans light vehicle respawn script, and see if I can get Zen_AddFastope, Zen_AddEject, and Zen_AddLoadoutDialog to work on respawned vehicles - I will report back on my progress.

/// EDIT /// EDIT /// EDIT /// EDIT /// EDIT /// EDIT /// EDIT ///

Hi Zen,

I added the code you provided to init and JIPsync.sqf. The code has been added at line 24 - 26, and the JIPsync file can be seen here.

When testing today, when a JIP player joins, existing tasks no longer sync. New tasks sync fine. Do you think this is caused by my placement of the code on line 24?

I will continue to test tomorrow.

Sorry, I didn't see your edit for a few days. The code you add shouldn't affect tasks in any way. The issue could be the data being looked at when tasks are added, the reference unit used to get the tasks, or Zen_ReassignTask itself.

Give it a try with the new release, and put in this debug:

diag_log Zen_Task_Array_Global;
diag_log (leader group player);
diag_log (units group player);
diag_log ([(leader group player)] call Zen_GetUnitTasks);

// Just use Zen_ReassignTask, as in the JIP demo
{
   0 = [_x, player] call Zen_ReassignTask;
} forEach ([(leader group player)] call Zen_GetUnitTasks);

It should appear the the reference unit is a living object, and his tasks are those already assigned to players. Those tasks would then be given to Zen_ReassignTask, so the bug is in there if the tasks are correct.

Share this post


Link to post
Share on other sites

Hi Zen,

I've been using your framework to create my first mission. It's awesome! Thank you for all your hard work

I've been using Dev branch so thought I'd give you a heads up about a potential issue coming with Heli DLC.

Fire from Vehicle (FFV) positions are treated differently from Cargo positions. So when spawn vehicles (Zen_SpawnHelicopter and Zen_SpawnVehicle) using your framework all the FFV positions are filled by crew members.

Also as an addition to the framework it would be cool to have a Zen_OrderSingLoadInsert and Zen_OrderSingLoadExtraction function that can be used to drop off / pick up items.

Finally do you know why the following drops an error in line h_extract saying (missionNamespace getVariable '_helicopterAlpha') is void?

_helicopterAlpha = [_heliSpawnPosAlpha, "B_Heli_Transport_03_F", 100] call Zen_SpawnHelicopter;
_trg = createTrigger["EmptyDetector",getPos player];
_trg setTriggerActivation["ALPHA",  "PRESENT",true];
_trg setTriggerText "Call Extraction at LZ Alpha";
_trg setTriggerStatements["this", "hint 'Radio has been triggered'; _task_Extract = [(group A11), 'Get to the extraction point.', 'Extract', 'LZ3', true] call Zen_InvokeTask;
_h_extract = [(missionNamespace getVariable '_helicopterAlpha') , ['LZ3', 'LOITER'], (group A11),'normal', 100] spawn Zen_OrderExtraction;", ""];  

Thanks for the help and this framework is really easy and fun to use!

Edited by nighteyes13

Share this post


Link to post
Share on other sites
Guest

Thanks for informing us of the newest version :)

Release frontpaged on the Armaholic homepage.

================================================

We have also "connected" these pages to your account on Armaholic.

This means in the future you will be able to maintain these pages yourself if you wish to do so. Once this new feature is ready we will contact you about it and explain how things work and what options you have.

When you have any questions already feel free to PM or email me!

Share this post


Link to post
Share on other sites

Zen, I'm posting this just by reading the documentation and the tutorials PDFs provided.

Im loving it. Really, your framework it's simple, really well documented, and eases the burden of Mission makers so you can create a quick mission with a few sentences, or bigger ones really knowing what you are doing and how the mission will function. And I really like to see how good is it working in MP and network latency.

I would like to ask you, though I will try later this night or tomorrow morning.

Have you used this in combination with ALIVE? (specifically for the spawn/despawn of units within range, created using ZEN)

My community has like 25 active players, and to create a mission that can last 2 hours or so, it's getting difficult to achieve some stressfull conditions (to get like 60 - 80 AIs spawned for having a dificult situation)

ALIVE seems the tool to use to not crash the server with too many AI

Share this post


Link to post
Share on other sites
Zen, I'm posting this just by reading the documentation and the tutorials PDFs provided.

Im loving it. Really, your framework it's simple, really well documented, and eases the burden of Mission makers so you can create a quick mission with a few sentences, or bigger ones really knowing what you are doing and how the mission will function. And I really like to see how good is it working in MP and network latency.

I would like to ask you, though I will try later this night or tomorrow morning.

Have you used this in combination with ALIVE? (specifically for the spawn/despawn of units within range, created using ZEN)

My community has like 25 active players, and to create a mission that can last 2 hours or so, it's getting difficult to achieve some stressfull conditions (to get like 60 - 80 AIs spawned for having a dificult situation)

ALIVE seems the tool to use to not crash the server with too many AI

60-80 AI shouldn't cause any issues server side if they are spawned in properly, unless I'm misunderstanding what you are saying?

Share this post


Link to post
Share on other sites

Nope, you haven't missunderstood, but from testing we have got to the point that we cannot spawn more than 120 AIs, or the server gets a huge performance dropdown, and having like 60-80 AIs all in combat makes the players to desync every so and then. Keep in mind we are using 2 mods for AI behavoiur and also the X39 medic system.

However, I cannot tell you how they are spawned because every editor in our groups uses more or less teir own "way" of achieving this.

I'm moving foward into creating my own content for the community, and got into here XD. I'm relly looking foward in starting to create my own missions using ZEN framework.

Share this post


Link to post
Share on other sites
Nope, you haven't missunderstood, but from testing we have got to the point that we cannot spawn more than 120 AIs, or the server gets a huge performance dropdown, and having like 60-80 AIs all in combat makes the players to desync every so and then. Keep in mind we are using 2 mods for AI behavoiur and also the X39 medic system.

However, I cannot tell you how they are spawned because every editor in our groups uses more or less teir own "way" of achieving this.

That could do it.

And that's how all us mission developers are :p.

Share this post


Link to post
Share on other sites

Hi Zen,

Thanks, will try that out shortly and do some more testing.

The release of the RHS Mod has solved alot of my unit problems, reducing my mod count substancially - but I am having trouble making their units appear as the faction when using ZenSpawnInfantry, as per your post in September here.

Having read their documentation and looked at the config viewer, I believe their infantry are not classed as men but as vehicles - how do I edit the 6th Argument to get this to work? I had a look at Zen_RandomBattle but could not work out what I need to change.

_enemyGroup = [_spawnPos, ENEMY_SIDE, AI_SKILL, [4,8],"Men", "rhs_faction_msv"] call Zen_SpawnInfantry; 

Using the code above, the error message I get is as below, and the units do not spawn.

2014-10-30_00002_zps4dff6603.jpg

Will test the JIP and report back - thanks again for your help on this.

Share this post


Link to post
Share on other sites

First feedback Zen,

Unless I've missed something, it's not possible to add multiple "waypoints" to the OrderMove functions. (the ones used to order vehicles and infantry to move from one point to the next).

I can achieve it using the waituntil Zen_isReady, but it's not as seamessly as giving a group multiple waypoints (editor style). There are little pauses in between each order.

Again, maybe I've missed something in the documentation on how to get that. I'm still starting to read XD

Share this post


Link to post
Share on other sites

Figure out thr RHS faction thing - it needs to go like this:

_enemyGroup = [_spawnPos, ENEMY_SIDE, AI_SKILL, [4,8], "rhs_vehclass_infantry", "rhs_faction_msv"] call Zen_SpawnInfantry; 

Share this post


Link to post
Share on other sites
Hi Zen,

I've been using your framework to create my first mission. It's awesome! Thank you for all your hard work

I've been using Dev branch so thought I'd give you a heads up about a potential issue coming with Heli DLC.

Fire from Vehicle (FFV) positions are treated differently from Cargo positions. So when spawn vehicles (Zen_SpawnHelicopter and Zen_SpawnVehicle) using your framework all the FFV positions are filled by crew members.

Also as an addition to the framework it would be cool to have a Zen_OrderSingLoadInsert and Zen_OrderSingLoadExtraction function that can be used to drop off / pick up items.

Finally do you know why the following drops an error in line h_extract saying (missionNamespace getVariable '_helicopterAlpha') is void?

_helicopterAlpha = [_heliSpawnPosAlpha, "B_Heli_Transport_03_F", 100] call Zen_SpawnHelicopter;
_trg = createTrigger["EmptyDetector",getPos player];
_trg setTriggerActivation["ALPHA",  "PRESENT",true];
_trg setTriggerText "Call Extraction at LZ Alpha";
_trg setTriggerStatements["this", "hint 'Radio has been triggered'; _task_Extract = [(group A11), 'Get to the extraction point.', 'Extract', 'LZ3', true] call Zen_InvokeTask;
_h_extract = [(missionNamespace getVariable '_helicopterAlpha') , ['LZ3', 'LOITER'], (group A11),'normal', 100] spawn Zen_OrderExtraction;", ""];

Thanks for the help and this framework is really easy and fun to use!

Then positions you can fire from are considered turrets in the config. I will have to filter those somehow to separate the two types of turrets. Also, I will definitely make functions to have the AI sling-load if BIS doesn't offer a one-line command to do it.

'_helicopterAlpha' is a local variable to the script, the trigger executes in a different thread (i.e. different local namespace). You must name it 'helicopterAlpha' without the '_' to put the variable in the global namespace, which all threads share (scheduled and non-scheduled). You can also do so explicitly with this:

_helicopterAlpha = [_heliSpawnPosAlpha, "B_Heli_Transport_03_F", 100] call Zen_SpawnHelicopter;
missionNamespace setVariable ["HelicopterAlpha", _helicopterAlpha];

Zen, I'm posting this just by reading the documentation and the tutorials PDFs provided.

Im loving it. Really, your framework it's simple, really well documented, and eases the burden of Mission makers so you can create a quick mission with a few sentences, or bigger ones really knowing what you are doing and how the mission will function. And I really like to see how good is it working in MP and network latency.

I would like to ask you, though I will try later this night or tomorrow morning.

Have you used this in combination with ALIVE? (specifically for the spawn/despawn of units within range, created using ZEN)

My community has like 25 active players, and to create a mission that can last 2 hours or so, it's getting difficult to achieve some stressfull conditions (to get like 60 - 80 AIs spawned for having a dificult situation)

ALIVE seems the tool to use to not crash the server with too many AI

Someone asked about ALIVE a while ago, and I didn't really have a good answer for them because I don't use ALIVE. The difficulty is in combining the module system of ALIVE with the heavy coding of the framework because you have no link between the two. From what I understood from quickly looking at ALIVE, you have lots of options for the different modules but no access to the source API.

If combining them doesn't work out, I'd be happy to help you write an AI caching script that's easy to use with the framework. It would not be that difficult to get basic features going like storing AI groups, their units, their loadouts, making them abstractly move, and getting it MP sync'd so the server or HC caches/uncaches groups based upon client location.

First feedback Zen,

Unless I've missed something, it's not possible to add multiple "waypoints" to the OrderMove functions. (the ones used to order vehicles and infantry to move from one point to the next).

I can achieve it using the waituntil Zen_isReady, but it's not as seamessly as giving a group multiple waypoints (editor style). There are little pauses in between each order.

Again, maybe I've missed something in the documentation on how to get that. I'm still starting to read XD

Those are purposefully for a single waypoint. If you want many random waypoints, the patrol functions offer that. I assumed that anyone who wanted a series of fixed waypoints would use the editor. However, if you have several semi-random points, you can link them together:

// Let _waypointArray be an array of positions
// and _vehicle be some vehicle
0 = [_vehicle, _waypointArray] spawn {
   {
       _h_move = [(_this select 0), _x] spawn Zen_OrderVehicleMove;

       waitUntil {
           sleep 5;
           scriptDone _h_move;
       };
   } forEach (_this select 1);
};

Now, why didn't I just put that into Zen_OrderVehicleMove, etc.? What if you wanted the vehicle to do something at every waypoint? What if the waypoints could change while the vehicle is moving? It gives scripters more options at the cost of more coding. You can just make the above code a function and then have a choice between the two styles. You can then add some code to not make the vehicle stop at each waypoint, based upon its velocity and distance.

Share this post


Link to post
Share on other sites
Those are purposefully for a single waypoint. If you want many random waypoints, the patrol functions offer that. I assumed that anyone who wanted a series of fixed waypoints would use the editor. However, if you have several semi-random points, you can link them together:

// Let _waypointArray be an array of positions
// and _vehicle be some vehicle
0 = [_vehicle, _waypointArray] spawn {
   {
       _h_move = [(_this select 0), _x] spawn Zen_OrderVehicleMove;

       waitUntil {
           sleep 5;
           scriptDone _h_move;
       };
   } forEach (_this select 1);
};

Now, why didn't I just put that into Zen_OrderVehicleMove, etc.? What if you wanted the vehicle to do something at every waypoint? What if the waypoints could change while the vehicle is moving? It gives scripters more options at the cost of more coding. You can just make the above code a function and then have a choice between the two styles. You can then add some code to not make the vehicle stop at each waypoint, based upon its velocity and distance.

So many ways to do the same thing with scripts. That's something I like, and dislike when I do not remember every way XD

Haven't tought on the "scritdone" (and I've been using it lately).

About ALIVE, we will see. I will try it, if not I just can spawn AI using editor and do the rest with your framework.

We will see, but really, keep up the good work.

Share this post


Link to post
Share on other sites

BTW, Zen.

Does the BAT file inside the Framework do something? Or it is a leftover?

Share this post


Link to post
Share on other sites
BTW, Zen.

Does the BAT file inside the Framework do something? Or it is a leftover?

When run, it automatically copies the preprocessor library files into all subdirectories. You can remove it if you want; it has no affect on missions. It's just to make coding the libraries easier for me. I left it in there in case mission makers want to change some preprocessor macros (not a good thing to do blindly) or add new ones. They must be copied due to this bug:

Please vote: http://feedback.arma3.com/view.php?id=9629

Also, do you know if the are any sort of incompatibilities between your Zen_SetAiSkill and Zen_SpawnInfantry and this 2 mods?

http://www.armaholic.com/page.php?id=24080 ASR AI3

http://www.armaholic.com/page.php?id=19467 TPWCAS A3 - AI Suppression System

Having unpbo'd (some of) ASR AI, it appears to change the AI's skill in a random range based upon some preset levels. I didn't see an obvious indicator of how it detected new units, although I'm sure it's able to do that. You could try calling Zen_SetAiSkill after ASR AI sets the units skill, but I don't know how you would determine when it did.

Looking very briefly at the source code for TPWCAS, I see that all uses of 'setSkill' are switching between newly calculated values and the original skills of the unit. Thus, if you use Zen_SetAISkill before TPWCAS stores the skill value, that will be its default 'old' value. Ii also uses 'allUnits' to detect AI, so it will automatically update when new units are spawned with Zen_SpawnInfantry (or any spawning function).

Share this post


Link to post
Share on other sites

Mmm I guess I'm OK with TPWCAS, bit not so well with ASR. I just want to have one clear AI modificator, so tweaking AI skill does not become a pain.

Share this post


Link to post
Share on other sites

Please sign in to comment

You will be able to leave a comment after signing in



Sign In Now

×