This is an old revision of the document!
Available in version 1.3 and later.
SetCellOccupiedCount(<-cellX <-cellZ <-count)
Sets the occupied count for a map cell. Extreme caution must be exercised when using this command. Normally units will increase the count for cells they occupy when they land or are created. The units will also decrease the count by 1 whenever they take off or are destroyed. Messing with the count can create 'phantom' areas on the map where units can't land or where they can stack. Units do not know that you have altered the count! So if you change the occupied count, a unit will still decrease the count by 1 when it takes off or is destroyed.
The effect of SetCellOccupiedCount does not persist between save and loads, as all units rebuild their cell occupied counts whenever the game is loaded and units are rebuilt from the save file.
#Make an area on the map that nothing can land in. once 20 10 do 20 10 do SetCellOccupiedCount(I J 10000) loop loop endonce #Make an area on the map always have a count of 0. This means units can stack on top of each other in this area. 10 0 do 10 0 do SetCellOccupiedCount(I J 0) loop loop
Here's an example of how to handle all the cases with setting custom occupied count on a unit. This is an example of a 9×9 unit that only wants the outer rim of the unit to occupy space, with a hollow middle. Make sure the unit is set to not occupy land in unit settings.
This code is universal and should handle all the cases properly, the only thing you have to edit is which cells around the unit should be changed by editing the contents of the SetCustomOccupiedLand function.
:awake once RegisterForMSG("MSG_PostUpdate" "PostUpdate") endonce :once @awake :destroyed <-G_iCurrentlyOccupiedX <-G_iCurrentlyOccupiedZ FALSE @SetCustomOccupiedLand :PostUpdate Self GetUnitMoveCell ->POU_iMoveZ ->POU_iMoveX <-POU_iMoveX ->POU_iMoveCell Self GetUnitCell ->POU_iZ ->POU_iX #Set the initial configuration of our unit once <-POU_iX <-POU_iZ TRUE @SetCustomOccupiedLand <-POU_iX <-POU_iZ ->G_iCurrentlyOccupiedZ ->G_iCurrentlyOccupiedX endonce #If the unit has been ordered to move <-POU_iMoveCell <-POU_iLastMoveCell neq <-POU_iMoveCell -1 neq and if #If the unit is already moving and has been reordered to move, #we clear the occupied count from the area we ordered the unit to previously <-POU_iLastMoveCell -1 neq if <-POU_iLastMoveX <-POU_iLastMoveZ FALSE @SetCustomOccupiedLand #If the unit was not moving and this is the first order, #we clear the occupied count from the area the unit was sitting on else <-POU_iX <-POU_iZ FALSE @SetCustomOccupiedLand endif #We set the occupied land at the new target location our unit is meant to land in <-POU_iMoveX <-POU_iMoveZ TRUE @SetCustomOccupiedLand <-POU_iMoveX <-POU_iMoveZ ->G_iCurrentlyOccupiedZ ->G_iCurrentlyOccupiedX #If the unit is stationary else <-POU_iMoveCell <-POU_iLastMoveCell eq <-POU_iMoveCell -1 eq and if #If the unit was moved in the editor, clear last position and set new position <-POU_iLastX <-POU_iX neq <-POU_iLastZ <-POU_iZ neq or if <-POU_iLastX <-POU_iLastZ FALSE @SetCustomOccupiedLand <-POU_iX <-POU_iZ TRUE @SetCustomOccupiedLand <-POU_iX <-POU_iZ ->G_iCurrentlyOccupiedZ ->G_iCurrentlyOccupiedX endif endif endif <-POU_iMoveZ <-POU_iMoveX ->POU_iLastMoveX ->POU_iLastMoveZ <-POU_iZ <-POU_iX ->POU_iLastX ->POU_iLastZ <-POU_iMoveCell ->POU_iLastMoveCell #i1 i2 b3 - #Uniformly set or unset a chunk of occupied land #Arguments: CellX and CellY of the last position (if unsetting) or current position (if setting), # boolean that determines if to set or unset #Result: None :SetCustomOccupiedLand ->SOL_bSet ->SOL_iCellZ ->SOL_iCellX 4 ->SOL_iRadius <-SOL_iCellZ <-SOL_iRadius add 1 add <-SOL_iCellZ <-SOL_iRadius sub do <-SOL_iCellX <-SOL_iRadius add 1 add <-SOL_iCellX <-SOL_iRadius sub do <-SOL_iCellX <-SOL_iRadius sub I eq <-SOL_iCellX <-SOL_iRadius add I eq or <-SOL_iCellZ <-SOL_iRadius sub J eq or <-SOL_iCellZ <-SOL_iRadius add J eq or if I J GetCellOccupiedCount ->SOL_iCount <-SOL_bSet if I J <-SOL_iCount 1 add SetCellOccupiedCount else I J <-SOL_iCount 1 sub SetCellOccupiedCount endif endif loop loop
⇐ Index