Guest User

Untitled

a guest
Nov 21st, 2023
117
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
  1. extends Node3D
  2.  
  3. @onready var block : Node3D = get_node("Guide")
  4. @onready var blockSize : Vector3 = block.get_child(0).size
  5.  
  6. var object = load("res://scenes/box.tscn")
  7.  
  8. var direction : Array = [Vector2(1, 1), Vector2(1, -1), Vector2(-1, 1), Vector2(-1, -1)]
  9. var tarPos : Vector3 = Vector3.ZERO
  10. var putPos : Vector3 = Vector3.ZERO
  11. var map : Dictionary = {}
  12. var can_place := true
  13.  
  14. func _unhandled_input(event):
  15.     if event.is_action_pressed("interact"):
  16.         if !can_place: return
  17.         _place_object(global_position, putPos)
  18.        
  19. func _mouse_pos():
  20.     var camera = $Camera3D
  21.     var mouse = get_viewport().get_mouse_position()
  22.     var result = camera.project_position(mouse, 10.0)
  23.     return Vector3(result.x, 0, result.z)
  24.    
  25. func _physics_process(delta):
  26.     tarPos = _mouse_pos()
  27.     _update_pos()
  28.    
  29.     get_node("Guide").global_position = putPos
  30.    
  31. func _place_object(spawn:Vector3, target:Vector3):
  32.     var o = object.instantiate()
  33.     add_child(o)
  34.     o.get_child(0).size = blockSize
  35.     o.get_child(0).position = Vector3(blockSize.x/2, 0, blockSize.z/2)
  36.     o.global_position = target
  37.     o.get_child(0).material.albedo_color = Color(randf(), randf(), randf(), 1)
  38.    
  39.     for x in range(blockSize.x):
  40.         for z in range(blockSize.z):
  41.             map[Vector3(target.x + x, target.y, target.z + z)] = null
  42.  
  43.     blockSize = Vector3(randi_range(1,4), 1, randi_range(1,4))
  44.     block.get_child(0).size = blockSize
  45.     block.get_child(0).position = Vector3(blockSize.x/2, 0, blockSize.z/2)
  46.    
  47. func _update_pos():
  48.     var queue = []
  49.     var close = {}
  50.     var start = tarPos.snapped(Vector3(1,0.5,1))
  51.     queue.append(start)
  52.     while queue.size() > 0:
  53.         var nodeNow = queue.pop_front()
  54.         var hasBlock = _range_pos(nodeNow)
  55.         close[nodeNow] = true
  56.         if not hasBlock:
  57.             putPos = nodeNow
  58.             break
  59.         for dir in direction:
  60.             var keyNext = Vector3(nodeNow.x + dir.x, nodeNow.y, nodeNow.z + dir.y)
  61.             if not close.has(keyNext):
  62.                 queue.append(keyNext)
  63.  
  64. func _range_pos(node: Vector3):
  65.     for x in range(blockSize.x):
  66.         for z in range(blockSize.z):
  67.             var key = Vector3(node.x + x, node.y, node.z + z)
  68.             if map.has(key):
  69.                 return true
  70.     return false
  71.  
Advertisement
Add Comment
Please, Sign In to add comment