Hello! I am here to show off my block based building script. Since I am new to verse, expect some underwhelming code. If you have recommendations please, comment below. Verse currently lacks some ray casting and you will notice my fix. Currently we step though the grid and find the closest block in front of the players crosshair. SO the script works like this, we find the closest block, figure out the side we are looking at, then place the block ahead of said side. Simple!
Here is it in action with some fancy materials and overlay!
using { /Fortnite.com/Devices }
using { /Verse.org/Simulation }
using { /UnrealEngine.com/Temporary/Diagnostics }
using { /Fortnite.com/Characters }
using { /UnrealEngine.com/Temporary/SpatialMath }
BlockBrushBasic := class(creative_device):
@editable FireTrigger : input_trigger_device = input_trigger_device{}
@editable TargetTrigger : input_trigger_device = input_trigger_device{}
@editable BlockAsset : creative_prop_asset = DefaultCreativePropAsset
var TileSize : float = 100.0
var TileOffset : vector3 = vector3{X:=0.0, Y:=0.0, Z:=100.0}
var OutOfBoundsZ : float = 0.0
Sign(Value: float) : float =
if(Value > 0.0):
return 1.0
else if (Value < 0.0):
return -1.0
return 0.0
GetBlockPosition(FC:fort_character, BlockOffset:float):vector3=
PlayerPosition:=FC.GetTransform().Translation
PlayerForward:=FC.GetViewRotation().GetLocalForward() * BlockOffset
CurrentPosition:=PlayerPosition + PlayerForward
if:
SnappedX:=Round[CurrentPosition.X/ TileSize] * TileSize + TileOffset.X
SnappedZ:=Round[CurrentPosition.Z / TileSize] * TileSize + TileOffset.Z
SnappedY:=Round[CurrentPosition.Y / TileSize] * TileSize + TileOffset.Y
then:
return vector3{X:=SnappedX, Y:=SnappedY, Z:=SnappedZ}
return CurrentPosition
GetClosestBlockFromRange(FC:fort_character):?creative_prop=
var MaxRange : int = 7
var PositionsWithinRange : []vector3 = array{}
for(Range:=2..MaxRange):
BlockPosition:=GetBlockPosition(FC, Range*100.0)
if (BlockPosition.Z > OutOfBoundsZ):
set PositionsWithinRange = PositionsWithinRange + array{BlockPosition}
#Print("Position Within Range Found {Range} at {BlockPosition}")
if (PositionsWithinRange.Length < 1):
return false
TaggedList:=FindCreativeObjectsWithTag(SpawnedBlockTag{})
var ClosestProp : creative_prop = creative_prop{}
var ClosestIndex: int = 999
for(TaggedActor:TaggedList):
var CurrentIndex: int = 0
if(Prop:=creative_prop[TaggedActor], PropPosition:=Prop.GetTransform().Translation):
for(Position:PositionsWithinRange):
if (PropPosition=Position, ClosestIndex> CurrentIndex):
set ClosestProp = Prop
set ClosestIndex= CurrentIndex
#Print("Prop Within Range Found {ClosestIndex} at {Position}")
set CurrentIndex+= 1
if (ClosestIndex < 999):
return option{ClosestProp}
return false
GetPositionNextToBlock(FC:fort_character, BlockProp:creative_prop):tuple(vector3, rotation)=
PlayerForward:=FC.GetViewRotation().GetLocalForward() * -1.0
BlockPosition:=BlockProp.GetTransform().Translation
var ForwardVector : vector3 = vector3{}
var FowardRotaion : rotation = rotation{}
if (Abs(PlayerForward.X)> Abs(PlayerForward.Y) and Abs(PlayerForward.X)> Abs(PlayerForward.Z)):
set ForwardVector = vector3{X:=Sign(PlayerForward.X) * 100.0}
set FowardRotaion = MakeRotationFromYawPitchRollDegrees(0.0,0.0,0.0)
else if (Abs(PlayerForward.Y) > Abs(PlayerForward.X) and Abs(PlayerForward.Y) > Abs(PlayerForward.Z)):
set ForwardVector = vector3{Y:=Sign(PlayerForward.Y) * 100.0}
set FowardRotaion = MakeRotationFromYawPitchRollDegrees(90.0,0.0,0.0)
else:
set ForwardVector = vector3{Z:=Sign(PlayerForward.Z) * 100.0 }
set FowardRotaion = MakeRotationFromYawPitchRollDegrees(0.0,90.0,0.0)
CurrentPosition:=BlockPosition + ForwardVector
TaggedList:=FindCreativeObjectsWithTag(SpawnedBlockTag{})
for(TaggedActor:TaggedList):
if:
Prop:=creative_prop[TaggedActor]
PropPosition:=Prop.GetTransform().Translation
PropPosition = CurrentPosition
then:
return (vector3{}, rotation{})
return (CurrentPosition, FowardRotaion)
SpawnBlock(Agent:agent):void=
if(FC:=Agent.GetFortCharacter[]):
ClosestProp:=GetClosestBlockFromRange(FC)
if(BlockProp:=ClosestProp?):
SpawnPosition:=GetPositionNextToBlock(FC, BlockProp)(0)
if (SpawnPosition = vector3{}):
return
Result:= SpawnProp(BlockAsset, SpawnPosition, rotation{})
if (SpawnedProp:=Result(0)?):
Print("Prop Spawned at {SpawnPosition}")
DisposeBlock(FC:fort_character):void=
ClosestProp:=GetClosestBlockFromRange(FC)
if(Prop:=ClosestProp?):
Prop.Dispose()
OnPrimaryFire()<suspends>:void=
Agent:=FireTrigger.PressedEvent.Await()
if(FC:=Agent.GetFortCharacter[]):
DisposeBlock(FC)
OnSecondaryFire()<suspends>:void=
Agent:=TargetTrigger.PressedEvent.Await()
SpawnBlock(Agent)
OnBegin<override>()<suspends>:void=
loop:
race:
OnPrimaryFire()
OnSecondaryFire()