Jtgibson/Tips – User
(Created page with "This is just a repository of useful information I've dug up in my occasional gorilla-like bashing on the keyboard and hooting. (I try not to throw feces. I am, after all, ci...") |
No edit summary |
||
Line 1: | Line 1: | ||
This is just a repository of useful information I've dug up in my occasional gorilla-like bashing on the keyboard and hooting. (I try not to throw feces. I am, after all, civilised.) | This is just a repository of useful information I've dug up in my occasional gorilla-like bashing on the keyboard and hooting. (I try not to throw feces. I am, after all, civilised.) | ||
I found some of this information in an old file I had been sitting on for a while and never got around to putting up anywhere. Since I've more or less given up on a personal website these days -- all it was good for was having my former employer spy on me -- I'll just throw it up as a biki subpage instead. =) | |||
== How to determine if a plugin is installed == | == How to determine if a plugin is installed == | ||
Line 5: | Line 7: | ||
Attempt to load a known class that would be provided by that plugin, and then test isClass to see if the class is valid. If not, the plugin is not installed. | Attempt to load a known class that would be provided by that plugin, and then test isClass to see if the class is valid. If not, the plugin is not installed. | ||
_isMyClassActive = isClass (configFile / "CfgPatches" / "MyClass"); | _isMyClassActive = [[isClass]] ([[configFile]] / "CfgPatches" / "MyClass"); | ||
It can sometimes be beneficial when creating a script-only addon to create a dummy module that allows scripters to test for its existence. | It can sometimes be beneficial when creating a script-only addon to create a dummy module that allows scripters to test for its existence. | ||
Line 13: | Line 15: | ||
There are several useful functions for this: | There are several useful functions for this: | ||
cursorTarget returns the object you see the unit info text for. For instance, if you are holding your crosshairs over a friendly and it identifies them as "Rifleman", they are your cursortarget. What's interesting is that this behaviour carries over to lockable weapons, so as long as you have a target locked on your HUD (and can therefore still see their HUD info, e.g., "MSE-3 Marid"), they will remain your cursortarget even if no longer pointing directly at them. | [[cursorTarget]] returns the object you see the unit info text for. For instance, if you are holding your crosshairs over a friendly and it identifies them as "Rifleman", they are your cursortarget. What's interesting is that this behaviour carries over to lockable weapons, so as long as you have a target locked on your HUD (and can therefore still see their HUD info, e.g., "MSE-3 Marid"), they will remain your cursortarget even if no longer pointing directly at them. | ||
cursorObject was added in Arma 3 v1.56 to address this problem. It ''always'' yields the objects directly under your crosshairs. | [[cursorObject]] was added in Arma 3 v1.56 to address this problem. It ''always'' yields the objects directly under your crosshairs. | ||
screenToWorld is also incredibly handy -- whatever screen coordinates you pass in (from 0 to 1 on the horizontal and from 0 to 1 on the vertical) will translate into a specific point on the map. Unless, of course, you're pointing off into space. You get nothing! Get out of my factory! | [[screenToWorld]] is also incredibly handy -- whatever screen coordinates you pass in (from 0 to 1 on the horizontal and from 0 to 1 on the vertical) will translate into a specific point on the map. Unless, of course, you're pointing off into space. You get nothing! Get out of my factory! | ||
== De-simulate an object (reduce memory footprint/"virtualise") == | == De-simulate an object (reduce memory footprint/"virtualise") == | ||
Line 24: | Line 26: | ||
//Move object 50 metres underground | //Move object 50 metres underground | ||
_this setPosATL [(_this getPos select 0), (_this getPos select 1), (_this getPos select 2)-50]; | _this [[setPosATL]] [(_this [[getPos]] [[select]] 0), (_this getPos select 1), (_this getPos select 2)-50]; | ||
//Hide object from server | //Hide object from server | ||
hideObjectGlobal _this; | [[hideObjectGlobal]] _this; | ||
//Disable simulation to reduce/eliminate network traffic | //Disable simulation to reduce/eliminate network traffic | ||
_this enableSimulation false; | _this [[enableSimulation]] false; | ||
A de-simulated object should be stored in a variable or otherwise tracked, as otherwise it is difficult to locate by script. | A de-simulated object should be stored in a variable or otherwise tracked, as otherwise it is difficult to locate by script. | ||
Line 40: | Line 42: | ||
To create a new virtual object, simply add its classname to the object's "ACE_cargo_loaded" array: | To create a new virtual object, simply add its classname to the object's "ACE_cargo_loaded" array: | ||
_array = _this getVariable ["ACE_cargo_loaded", []]; | _array = _this [[getVariable]] ["ACE_cargo_loaded", []]; | ||
_array pushBack "ACE_Wheel"; //Add the virtual class "wheel" onto the end of the array | _array [[pushBack]] "ACE_Wheel"; //Add the virtual class "wheel" onto the end of the array | ||
_array pushBack "ACE_Wheel"; //Add two more wheels | _array pushBack "ACE_Wheel"; //Add two more wheels | ||
Line 48: | Line 50: | ||
This is far more efficient than using the ACE3 cargo attachment module, which actually creates "real" objects and then attaches them invisibly to the unit. | This is far more efficient than using the ACE3 cargo attachment module, which actually creates "real" objects and then attaches them invisibly to the unit. | ||
If putting into a vehicle's init script, you cannot use local variables, so will have to use | If putting into a vehicle's init script, you cannot use local variables, so will have to use an external function instead. | ||
=== ACE3 Cargo: Iterating and deleting === | === ACE3 Cargo: Iterating and deleting === |
Revision as of 22:52, 30 June 2016
This is just a repository of useful information I've dug up in my occasional gorilla-like bashing on the keyboard and hooting. (I try not to throw feces. I am, after all, civilised.)
I found some of this information in an old file I had been sitting on for a while and never got around to putting up anywhere. Since I've more or less given up on a personal website these days -- all it was good for was having my former employer spy on me -- I'll just throw it up as a biki subpage instead. =)
How to determine if a plugin is installed
Attempt to load a known class that would be provided by that plugin, and then test isClass to see if the class is valid. If not, the plugin is not installed.
_isMyClassActive = isClass (configFile / "CfgPatches" / "MyClass");
It can sometimes be beneficial when creating a script-only addon to create a dummy module that allows scripters to test for its existence.
Get object/point under crosshairs
There are several useful functions for this:
cursorTarget returns the object you see the unit info text for. For instance, if you are holding your crosshairs over a friendly and it identifies them as "Rifleman", they are your cursortarget. What's interesting is that this behaviour carries over to lockable weapons, so as long as you have a target locked on your HUD (and can therefore still see their HUD info, e.g., "MSE-3 Marid"), they will remain your cursortarget even if no longer pointing directly at them.
cursorObject was added in Arma 3 v1.56 to address this problem. It always yields the objects directly under your crosshairs.
screenToWorld is also incredibly handy -- whatever screen coordinates you pass in (from 0 to 1 on the horizontal and from 0 to 1 on the vertical) will translate into a specific point on the map. Unless, of course, you're pointing off into space. You get nothing! Get out of my factory!
De-simulate an object (reduce memory footprint/"virtualise")
Three steps can be taken to desimulate an object. All in combination provide the optimal solution:
//Move object 50 metres underground _this setPosATL [(_this getPos select 0), (_this getPos select 1), (_this getPos select 2)-50]; //Hide object from server hideObjectGlobal _this; //Disable simulation to reduce/eliminate network traffic _this enableSimulation false;
A de-simulated object should be stored in a variable or otherwise tracked, as otherwise it is difficult to locate by script.
ACE3
ACE3 Cargo: Add virtual cargo
To create a new virtual object, simply add its classname to the object's "ACE_cargo_loaded" array:
_array = _this getVariable ["ACE_cargo_loaded", []]; _array pushBack "ACE_Wheel"; //Add the virtual class "wheel" onto the end of the array
_array pushBack "ACE_Wheel"; //Add two more wheels _array pushBack "ACE_Wheel";
This is far more efficient than using the ACE3 cargo attachment module, which actually creates "real" objects and then attaches them invisibly to the unit.
If putting into a vehicle's init script, you cannot use local variables, so will have to use an external function instead.
ACE3 Cargo: Iterating and deleting
The cargo module in ACE is somewhat complicated because objects in cargo can either exist as true objects -- which are hidden and attached to the object -- or as virtual objects -- which exist only as a classname and are spawned when created. The advantage of having true objects as cargo is that their properties (damage, contents, etc.) are preserved, while virtual objects are very efficient for the engine (only a few bytes to store a prototypical object).
All of the objects are stored in the object's "ACE_cargo_loaded" array, so iterating through this list will reveal all of the objects contained as cargo.
If the object is not the same type as objNull, you know it is a virtual object and can be removed from the array to delete. If the object IS equivalent to objNull, it must be removed from the array and then destroyed with deleteVehicle.