Minecraft Style Building In UEFN!

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!
FortniteClient-Win64-Shipping_FWtLVzLffe

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()

Well have my own block building system for an upcomeing space game.

So, what i did is a tad different:
I get a traceline, created a own collision channel for “building”.

Get the trace line collision normal. The collision normal shows me where i want my next block, instead of your system “clostest to the character”.
After that i set up an preview (i have different blocks and different sizes).
Run my logic to not overlap other already build blocks.

Your idea got the basics down pretty well so!

Good luck and have fun codeing!

why code doesnt work?