Advertisement
Socky

Untitled

Dec 19th, 2023
1,473
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
  1. extends Node
  2.  
  3. var object = null
  4.  
  5. var radius := 2
  6. var map := {}
  7.  
  8. var putPos : Vector3 = Vector3.ZERO
  9.  
  10. var t = ["block1"]
  11.  
  12. func _mouse_pos():
  13.     var camera = $Camera3D
  14.     var mouse = get_viewport().get_mouse_position()
  15.     var result = camera.project_position(mouse, 10.0)
  16.     return Vector3(result.x, 0, result.z).snapped(Vector3(1,0.5,1))
  17.    
  18. func _ready():
  19.     _spawn_block()
  20.    
  21. func _physics_process(delta):
  22.     var tar = _mouse_pos() - Vector3(object.size.x/2, 0, object.size.z/2)
  23.     var p = _update_target(tar, object)
  24.     object.global_position = putPos
  25.    
  26.     if Input.is_action_just_pressed("ui_accept"):
  27.         if !p: return
  28.         _mark_block(putPos, object.size)
  29.         _spawn_block()
  30.        
  31. func _spawn_block():
  32.     var x = t[randi() % t.size()]
  33.     var loaded = load("res://%s.tscn" % x)
  34.     object = loaded.instantiate()
  35.     object.get_child(0).position = Vector3(object.size.x/2, 0, object.size.z/2)
  36.     object.get_child(0).material.albedo_color = Color(randi_range(0,4),randi_range(0,4),randi_range(0,4),1)
  37.     add_child(object)
  38.        
  39. func _update_target(target: Vector3, block: Node3D):
  40.     var check = false
  41.     var range = _get_radius(target)
  42.     var c = null
  43.     for i in range:
  44.         var hasBlock = _has_block(i, block.size)
  45.         if not hasBlock and (c == null or i.distance_to(target) < c.distance_to(target)):
  46.             check = true
  47.             c = i
  48.     if c != null: putPos = c
  49.     return check
  50.  
  51. func _get_radius(target: Vector3):
  52.     var result := []
  53.     for x in range(-radius, radius + 1):
  54.         for z in range(-radius, radius + 1):
  55.             var point = Vector3(target.x + x, 0, target.z + z)
  56.             result.append(point)
  57.     return result
  58.    
  59. func _has_block(p: Vector3, s: Vector3):
  60.     for x in range(s.x):
  61.         for z in range(s.z):
  62.             var key = Vector3(p.x + x, p.y, p.z + z)
  63.             if map.has(key):
  64.                 return true
  65.     return false
  66.    
  67. func _mark_block(p: Vector3, s: Vector3):
  68.     for x in range(s.x):
  69.         for z in range(s.z):
  70.             map[Vector3(p.x + x, p.y, p.z + z)] = object
  71.  
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement