@tool
class_name XRToolsGrabPointSnap
extends XRToolsGrabPoint


## XR Tools Grab Point Snap Script
##
## This script allows specifying a grab point for snap zones. It supports
## group-filters if different points are required for different snap zones.


## Require grab-by to be in the specified group
@export var require_group : String = ""

## Deny grab-by if in the specified group
@export var exclude_group : String = ""


# Called when the node enters the scene tree for the first time.
func _ready():
	# Add a Position3D child to help editor visibility
	if Engine.is_editor_hint():
		add_child(Marker3D.new())


## Test if a grabber can grab by this grab-point
func can_grab(_grabber : Node) -> bool:
	# Skip if not enabled
	if not enabled:
		return false

	# Ensure the pickup is valid
	if not is_instance_valid(_grabber):
		return false

	# Ensure the grabber is a snap-zone
	if not _grabber is XRToolsSnapZone:
		return false

	# Refuse if the grabber is not in the required group
	if not require_group.is_empty() and not _grabber.is_in_group(require_group):
		return false

	# Refuse if the grabber is in the excluded group
	if not exclude_group.is_empty() and _grabber.is_in_group(exclude_group):
		return false

	# Allow the grab
	return true