@tool class_name EntityDirection extends Node enum Direction { SOUTH, WEST, NORTH, EAST, } @export var meshInstance:MeshInstance3D = null: set(newInstance): meshInstance = newInstance; _updateMaterial(); @export var direction = Direction.SOUTH: set(newDirection): direction = newDirection; _updateMaterial(); @export var characterBody:CharacterBody3D = null func _ready() -> void: _updateMaterial(); func _updateMaterial() -> void: if !meshInstance: return for i in range(meshInstance.get_surface_override_material_count()): var material:ShaderMaterial = meshInstance.get_surface_override_material(i) if !material: continue material.set_shader_parameter("direction", direction) func getDirectionVector() -> Vector3: match direction: Direction.NORTH: return Vector3(0, 0, -1); Direction.SOUTH: return Vector3(0, 0, 1); Direction.WEST: return Vector3(-1, 0, 0); Direction.EAST: return Vector3(1, 0, 0); _: assert(false, "Invalid direction"); return Vector3(0, 0, 0); func updateDirectionFromMovement(movement:Vector2) -> void: if movement.x >= abs(movement.y) and( movement.y == 0 or (movement.y > 0 and direction != Direction.SOUTH) or (movement.y < 0 and direction != Direction.NORTH) ): direction = Direction.EAST; elif (movement.x <= -abs(movement.y) and ( movement.y == 0 or (movement.y > 0 and direction != Direction.SOUTH) or (movement.y < 0 and direction != Direction.NORTH) )): direction = Direction.WEST; elif (movement.y > 0): direction = Direction.SOUTH; elif (movement.y < 0): direction = Direction.NORTH; func getDirectionToFace(position:Vector3) -> Direction: if !characterBody: return Direction.SOUTH; var diff = position - characterBody.global_position; if abs(diff.x) > abs(diff.z): if diff.x > 0: return Direction.EAST; else: return Direction.WEST; else: if diff.z > 0: return Direction.SOUTH; else: return Direction.NORTH; return Direction.SOUTH;