User Tools

Site Tools


4rpl:commands:setunitcell

This is an old revision of the document!


Index

SetUnitCell

SetUnitCell(<-UID <-cellX <-cellZ <-snapToTerrain)

Description

Sets the 2D map position of a unit. The arguments are unit uid, the X and Z positions on the map, and whether the unit should be move to the terrain height at the target location.

Examples

SetUnitCell(<-UID <-posX <-posZ true)

Handling all the cases

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.

:Awake
	once
		RegisterForMSG("MSG_PostUpdate" "PostUpdate")
	endonce
:Once
	@Awake
:PostUpdate
	Self GetUnitMoveCell pop ->POU_iMoveCell
	Self GetUnitCell ->POU_iZ ->POU_iX
 
	#If a movable unit is moved by the player
	#Remove custom occupied cells when the unit takes off
	#Add them back when the unit has landed
	<-POU_iMoveCell <-POU_iLastMoveCell neq if
		<-POU_iMoveCell -1 eq if
			Self GetUnitCell TRUE @SetCustomOccupiedLand
		else
			Self GetUnitCell FALSE @SetCustomOccupiedLand
		endif
	#Update occupied count when the unit is forcibly moved in the editor
	#Only occurs when the unit is landed
	else <-POU_iMoveCell -1 eq if
		<-POU_iLastX <-POU_iX neq <-POU_iLastZ <-POU_iZ neq or if
			<-POU_iLastX <-POU_iLastZ FALSE @SetCustomOccupiedLand
			<-POU_iX <-POU_iZ TRUE @SetCustomOccupiedLand
		endif
	endif endif
 
	<-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

4rpl/commands/setunitcell.1631717356.txt.gz · Last modified: 2025/02/14 14:56 (external edit)