Files
mmo/scenes/hud/minimap.gd
Marek Le 2d4002bd3f refactor
2026-05-09 23:37:26 +02:00

41 lines
1.5 KiB
GDScript

extends Control
@export var world_size: float = 200.0
@export var label_text: String = ""
@export var draw_labels: bool = false
func _ready() -> void:
set_process(false)
func _draw() -> void:
var view_size: Vector2 = get_size()
draw_rect(Rect2(Vector2.ZERO, view_size), Color(0.05, 0.05, 0.08, 0.85))
draw_rect(Rect2(Vector2.ZERO, view_size), Color(0.6, 0.6, 0.6, 0.5), false, 2.0)
var local: Node = _local_player()
var center_offset: Vector2 = Vector2.ZERO
if local:
center_offset = Vector2((local as Node3D).global_position.x, (local as Node3D).global_position.z)
var map_sys: Node = get_tree().root.get_node_or_null("World/Systems/MapSystem")
if map_sys == null:
return
for entry in map_sys.get_marker_data():
var pos: Vector3 = entry.pos
var px: Vector2 = _to_pixel(Vector2(pos.x, pos.z), view_size, center_offset)
if px.x < 0 or px.x > view_size.x or px.y < 0 or px.y > view_size.y:
continue
draw_circle(px, 3.0, entry.color)
if draw_labels and entry.label != "":
var f: Font = ThemeDB.fallback_font
draw_string(f, px + Vector2(5, -5), entry.label, HORIZONTAL_ALIGNMENT_LEFT, -1, 12, Color.WHITE)
func _to_pixel(world: Vector2, view_size: Vector2, center: Vector2) -> Vector2:
var rel: Vector2 = world - center
var s: float = view_size.x / world_size
return view_size * 0.5 + rel * s
func _local_player() -> Node:
for p in get_tree().get_nodes_in_group("player"):
if p.is_multiplayer_authority():
return p
return null