Not a member of Pastebin yet?
Sign Up,
it unlocks many cool features!
- extends Node3D
- @onready var block : Node3D = get_node("Guide")
- @onready var blockSize : Vector3 = block.get_child(0).size
- var object = load("res://scenes/box.tscn")
- var direction : Array = [Vector2(1, 1), Vector2(1, -1), Vector2(-1, 1), Vector2(-1, -1)]
- var tarPos : Vector3 = Vector3.ZERO
- var putPos : Vector3 = Vector3.ZERO
- var map : Dictionary = {}
- var can_place := true
- func _unhandled_input(event):
- if event.is_action_pressed("interact"):
- if !can_place: return
- _place_object(global_position, putPos)
- func _mouse_pos():
- var camera = $Camera3D
- var mouse = get_viewport().get_mouse_position()
- var result = camera.project_position(mouse, 10.0)
- return Vector3(result.x, 0, result.z)
- func _physics_process(delta):
- tarPos = _mouse_pos()
- _update_pos()
- get_node("Guide").global_position = putPos
- func _place_object(spawn:Vector3, target:Vector3):
- var o = object.instantiate()
- add_child(o)
- o.get_child(0).size = blockSize
- o.get_child(0).position = Vector3(blockSize.x/2, 0, blockSize.z/2)
- o.global_position = target
- o.get_child(0).material.albedo_color = Color(randf(), randf(), randf(), 1)
- for x in range(blockSize.x):
- for z in range(blockSize.z):
- map[Vector3(target.x + x, target.y, target.z + z)] = null
- blockSize = Vector3(randi_range(1,4), 1, randi_range(1,4))
- block.get_child(0).size = blockSize
- block.get_child(0).position = Vector3(blockSize.x/2, 0, blockSize.z/2)
- func _update_pos():
- var queue = []
- var close = {}
- var start = tarPos.snapped(Vector3(1,0.5,1))
- queue.append(start)
- while queue.size() > 0:
- var nodeNow = queue.pop_front()
- var hasBlock = _range_pos(nodeNow)
- close[nodeNow] = true
- if not hasBlock:
- putPos = nodeNow
- break
- for dir in direction:
- var keyNext = Vector3(nodeNow.x + dir.x, nodeNow.y, nodeNow.z + dir.y)
- if not close.has(keyNext):
- queue.append(keyNext)
- func _range_pos(node: Vector3):
- for x in range(blockSize.x):
- for z in range(blockSize.z):
- var key = Vector3(node.x + x, node.y, node.z + z)
- if map.has(key):
- return true
- return false
Advertisement
Add Comment
Please, Sign In to add comment