41 lines
1.5 KiB
GDScript
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
|