Files
mtgodot-poc/project/debug_stones.gd
T
2026-09-27 19:44:41 -07:00

71 lines
2.8 KiB
GDScript

extends SceneTree
const PythonUISurface = preload("res://python_ui_surface.gd")
const Python3DSurface = preload("res://python_3d_surface.gd")
func _initialize() -> void:
call_deferred("run")
func _py(source: String) -> bool:
return Metin2PythonHost.run_line(source) == ""
func _pump_until(seconds: float, condition: Callable) -> bool:
var deadline := Time.get_ticks_msec() + int(seconds * 1000.0)
while Time.get_ticks_msec() < deadline:
if condition.call():
return true
await process_frame
return condition.call()
func run() -> void:
root.size = Vector2i(1024, 768)
var world = Python3DSurface.new()
var ui = PythonUISurface.new()
root.add_child(ui)
root.add_child(world)
ui.run_app()
await _pump_until(15, func(): return _py(
"import __main__, os, networkModule, introLogin, introSelect, game, player, background, chr, chrmgr\n"
+ "__main__._stream = [o for o in __import__('gc').get_objects() if isinstance(o, networkModule.MainStream)][0]"
))
await _pump_until(20, func(): return _py("assert isinstance(_stream.curPhaseWindow, introLogin.LoginWindow)"))
var host = OS.get_environment("MT_LIVE_HOST")
var login = OS.get_environment("MT_LIVE_LOGIN")
var pwd = OS.get_environment("MT_LIVE_PASSWORD")
var auth_port = int(OS.get_environment("MT_LIVE_AUTH_PORT"))
var game_port = int(OS.get_environment("MT_LIVE_GAME_PORT"))
_py("_stream.SetConnectInfo('%s', %d, '%s', %d)\n_stream.curPhaseWindow.Connect('%s', '%s')" % [host, game_port, host, auth_port, login, pwd])
await _pump_until(30, func(): return _py("assert isinstance(_stream.curPhaseWindow, introSelect.SelectCharacterWindow)"))
_py("_stream.curPhaseWindow.SelectSlot(0)\n_stream.curPhaseWindow.StartGame()")
await _pump_until(30, func(): return _py("assert isinstance(_stream.curPhaseWindow, game.GameWindow) and _stream.curPhaseWindow.IsShow()"))
for i in 60:
await process_frame
print("=== INSPECTING STONE TILES AROUND PLAYER (59700, 68200) ===")
var draws: Array = Metin2PythonHost.render3d_draws()
var player_z := 19851.5
for d in draws:
var tex: String = d.get("texture0", "")
if tex.contains("stone") or tex.contains("floor") or tex.contains("tile") or tex.contains("sign"):
var wm: PackedFloat32Array = d["world"]
var xform: Transform3D = Python3DSurface.d3d_transform(wm)
# check if this object is near player (within 2000cm):
if absf(xform.origin.x - 59700.0) < 3000.0 and absf(-xform.origin.y - 68200.0) < 3000.0:
var min_z := 1e9
var max_z := -1e9
for p in d["positions"]:
var wp: Vector3 = xform * p
min_z = minf(min_z, wp.z)
max_z = maxf(max_z, wp.z)
print("Object [%s] at (%.1f, %.1f, %.1f), Z range: [%.2f, %.2f], diff vs player_z(19851.5): min=%.2f, max=%.2f" % [
tex.get_file(), xform.origin.x, -xform.origin.y, xform.origin.z, min_z, max_z, min_z - player_z, max_z - player_z
])
quit(0)