setTerrainHeight: Difference between revisions

From Bohemia Interactive Community
Jump to navigation Jump to search
(Fill in some data)
m (Fix typo)
 
(10 intermediate revisions by 2 users not shown)
Line 4: Line 4:
|version1= 2.10
|version1= 2.10


|branch= dev
 
|eff= global
 
|serverExec= server


|gr1= Diagnostic
|gr1= Diagnostic


|descr= {{Wiki|WIP}}
|descr= Set the current terrain's altitude on provided location(s).
{{Feature|important|
* Heightmap changes:
** are internally converted (rounded) to heightmap coordinates
** are stored in the JIP queue
** are '''not''' removed from the JIP queue if the values are set back to terrain's default value
** are updated in the JIP queue for updated positions '''if''' the same group of positions are edited (order does not matter, but amount does);<br>editing positions by terrain ''sections'' is good for multiplayer optimisation (see {{Link|#Example 2}})
** are '''not''' updated and sent twice (old one then new one) if position edits are not exactly the same (see point above and {{Link|#Example 2}}).
* Edited terrain heights are '''not''' saved inside savegames, they need to be restored manually on savegame load.
* Known issues:
** Terrain sections can become invisible if the change is too extreme
** Walking on the edge of extreme height changes can catapult the player away
}}


Warning, this command is dangerous and if used incorrectly will cause issues.
|s1= [[setTerrainHeight]] [positionAndAltitudeArray, adjustObjects]


Heightmap changes are stored in JIP queue, when doing multiple command invocations with the exact same XY positions (same number, same coordinates, order can be different) and different heights, the JIP messages will be merged which saves memory and network bandwidth and performance (each message is processed seperately) for joining clients.
|p1= positionAndAltitudeArray: [[Array]] of [[Array]] in format [[PositionASL]] - [<nowiki/>[x1, y1, newASLHeight1], [x2, y2, newASLHeight2], ...]


If even just one position is missing or extra or different a new JIP message will be created, each new client will get the old and the new message, which costs bandwidth and performance because the client has to process both heightmap updates seperately.
|p2= adjustObjects: [[Boolean]] - (Optional, default [[true]]) if true then objects on modified points are moved up/down to keep the same ATL height
{{Feature|important|'''All''' objects above modified terrain will be adjusted, even flying ones.}}


JIP messages do NOT remove themselves if all positions are returned back to their original values, so if changes to different areas are done during a mission, they will accumulate in JIP queue.
|r1= [[Nothing]]


setTerrainHeight should be used to set the height of an "area", and if that area should be further adjusted, the whole area should be adjusted and not just a subsection of it.
|x1= <sqf>
private _fnc_flattenTerrain =
{
params ["_start", "_a", "_b", "_h"];
private _newPositions = [];


for "_xStep" from 0 to _a do
{
for "_yStep" from 0 to _b do
{
private _newHeight = _start vectorAdd [_xStep, _yStep, 0];
_newHeight set [2, _h];
_newPositions pushBack _newHeight;
};
};


|s1= [[setTerrainHeight]]
_newPositions;
};
 
private _desiredTerrainHeight = 150;
private _positionsAndHeights = [getPosWorld player, 50, 50, _desiredTerrainHeight] call _fnc_flattenTerrain;
setTerrainHeight [_positionsAndHeights, true];
</sqf>


|r1= [[Nothing]]
|x2= Bad example:
<sqf>
// first update
setTerrainHeight [[[1000, 1000, 25], [1005, 1000, 25], [1000, 1005, 25], [1005, 1005, 25]]];


|x1= <sqf>setTerrainHeight [ [ [X, Y, NewHeight], [X2, Y2, NewHeight2], ... ], adjustObjects];</sqf>
// second update - this will make the JIP queue keep both messages
setTerrainHeight [[[1005, 1000, 50]]];
</sqf>


|p1= [ [X, Y, NewHeight], ... ]: [[Array]] of [[Array]] in format [[PositionASL]]
Good example:
XY are world coordinates, and are internally converted to heightmap coordinates like so
<sqf>
<sqf>
_hRes = (getTerrainInfo select 3)
// first update
_heightmapCoordinates = [round(_x/_hRes), round(_y/_hres)];
setTerrainHeight [[[1000, 1000, 25], [1005, 1000, 25], [1000, 1005, 25], [1005, 1005, 25]]];
 
// second update - this will update the JIP queue properly
setTerrainHeight [[[1000, 1000, 25], [1005, 1000, 50], [1000, 1005, 25], [1005, 1005, 25]]];
</sqf>
</sqf>
|p2= adjustObjects: [[Bool]] optional, default true. If true then objects on modified points are moved up/down to keep the same ATL height (Danger! Even objects in the sky above modified terrain are adjusted)


|seealso= [[getTerrainInfo]] [[getTerrainHeight]]
|seealso= [[getTerrainInfo]] [[getTerrainHeight]]
}}
}}

Latest revision as of 14:22, 10 April 2023

Hover & click on the images for description

Description

Description:
Set the current terrain's altitude on provided location(s).
  • Heightmap changes:
    • are internally converted (rounded) to heightmap coordinates
    • are stored in the JIP queue
    • are not removed from the JIP queue if the values are set back to terrain's default value
    • are updated in the JIP queue for updated positions if the same group of positions are edited (order does not matter, but amount does);
      editing positions by terrain sections is good for multiplayer optimisation (see Example 2)
    • are not updated and sent twice (old one then new one) if position edits are not exactly the same (see point above and Example 2).
  • Edited terrain heights are not saved inside savegames, they need to be restored manually on savegame load.
  • Known issues:
    • Terrain sections can become invisible if the change is too extreme
    • Walking on the edge of extreme height changes can catapult the player away
Groups:
Diagnostic

Syntax

Syntax:
setTerrainHeight [positionAndAltitudeArray, adjustObjects]
Parameters:
positionAndAltitudeArray: Array of Array in format PositionASL - [[x1, y1, newASLHeight1], [x2, y2, newASLHeight2], ...]
adjustObjects: Boolean - (Optional, default true) if true then objects on modified points are moved up/down to keep the same ATL height
All objects above modified terrain will be adjusted, even flying ones.
Return Value:
Nothing

Examples

Example 1:
private _fnc_flattenTerrain = { params ["_start", "_a", "_b", "_h"]; private _newPositions = []; for "_xStep" from 0 to _a do { for "_yStep" from 0 to _b do { private _newHeight = _start vectorAdd [_xStep, _yStep, 0]; _newHeight set [2, _h]; _newPositions pushBack _newHeight; }; }; _newPositions; }; private _desiredTerrainHeight = 150; private _positionsAndHeights = [getPosWorld player, 50, 50, _desiredTerrainHeight] call _fnc_flattenTerrain; setTerrainHeight [_positionsAndHeights, true];
Example 2:
Bad example:
// first update setTerrainHeight [[[1000, 1000, 25], [1005, 1000, 25], [1000, 1005, 25], [1005, 1005, 25]]]; // second update - this will make the JIP queue keep both messages setTerrainHeight [[[1005, 1000, 50]]];
Good example:
// first update setTerrainHeight [[[1000, 1000, 25], [1005, 1000, 25], [1000, 1005, 25], [1005, 1005, 25]]]; // second update - this will update the JIP queue properly setTerrainHeight [[[1000, 1000, 25], [1005, 1000, 50], [1000, 1005, 25], [1005, 1005, 25]]];

Additional Information

See also:
getTerrainInfo getTerrainHeight

Notes

Report bugs on the Feedback Tracker and/or discuss them on the Arma Discord or on the Forums.
Only post proven facts here! Add Note