@tool
extends EditorPlugin
var _f12_was_pressed: bool = false
var _tcp_server: TCPServer = null
var _screenshot_dir: String = "/home/fleeky/Desktop/hyper-tps"
const TCP_PORT = 6008
func _enter_tree() -> void:
set_process(true)
# Start TCP server for CLI-triggered screenshots
_tcp_server = TCPServer.new()
var err: int = _tcp_server.listen(TCP_PORT, "127.0.0.1")
if err == OK:
print("Editor Screenshot plugin loaded — F12 or: echo screenshot | nc localhost %d" % TCP_PORT)
else:
print("Editor Screenshot plugin loaded — F12 only (TCP port %d in use)" % TCP_PORT)
_tcp_server = null
func _exit_tree() -> void:
if _tcp_server:
_tcp_server.stop()
_tcp_server = null
func _process(_delta: float) -> void:
# F12 hotkey
var pressed: bool = Input.is_key_pressed(KEY_F12)
if pressed and not _f12_was_pressed:
_take_screenshot()
_f12_was_pressed = pressed
# Check for TCP connections
if _tcp_server and _tcp_server.is_connection_available():
var peer: StreamPeerTCP = _tcp_server.take_connection()
if peer:
# Take screenshot and respond with path
var path: String = _take_screenshot()
if not path.is_empty():
peer.put_data((path + "\n").to_utf8_buffer())
else:
peer.put_data("ERROR: screenshot failed\n".to_utf8_buffer())
peer.disconnect_from_host()
func _take_screenshot() -> String:
var vp: SubViewport = get_editor_interface().get_editor_viewport_3d(0)
if not vp:
print("Editor Screenshot: no 3D viewport found")
return ""
var img: Image = vp.get_texture().get_image()
if not img:
print("Editor Screenshot: failed to get viewport image")
return ""
DirAccess.make_dir_recursive_absolute(_screenshot_dir)
var ts: String = Time.get_datetime_string_from_system().replace(":", "-")
var path: String = "%s/editor_%s.png" % [_screenshot_dir, ts]
var err: int = img.save_png(path)
if err == OK:
print("Editor screenshot saved: %s" % path)
return path
else:
print("Editor screenshot FAILED (error %d): %s" % [err, path])
return ""