Implement 40250 classic client port

This commit is contained in:
shenlei
2026-09-01 18:49:28 +09:00
parent 2277b1dd60
commit 8f61990a83
481 changed files with 169826 additions and 293 deletions
+24 -5
View File
@@ -10,7 +10,7 @@
# `/setblockmode <mask ^ bit>`EBlockAction 位:1<<0..1<<5)—— 真聊天命令
# pvp_{peace,revenge,guild,free} (radio) → `/pkmode {0,1,4,2}` —— 真聊天命令
# name_color / target_board / view_chat / always_show_name / show_damage / salestext (radio)
# —— 客户端显示开关,持久化到 user://system_option.cfg [gameopt];渲染侧钩子待补
# —— 客户端显示开关,持久化到 user://system_option.cfg [gameopt];渲染节点按需读取这些设置
extends Node
# Packet.h EBlockAction
@@ -67,9 +67,16 @@ var uiscript_dir := ""
var _win: Dictionary = {}
var _cfg := ConfigFile.new()
var _block_mode := 0 # blockMode(本地跟踪服务回包同步待补
var _block_mode := 0 # blockMode(本地跟踪 + 服务回包同步)
var _display := {} # cfg [gameopt] 快照
static func config_path() -> String:
var override_dir := OS.get_environment("MT_CONFIG_DIR")
if override_dir != "":
return override_dir.path_join("system_option.cfg")
return OS.get_temp_dir().path_join("mtgodot_system_option.cfg") \
if DisplayServer.get_name() == "headless" else CFG_PATH
func setup(ui_manager: CanvasLayer, m2client: Node, assets := "") -> void:
ui = ui_manager
client = m2client
@@ -79,10 +86,12 @@ func setup(ui_manager: CanvasLayer, m2client: Node, assets := "") -> void:
uiscript_dir = assets_root.path_join("uiscript/uiscript")
if not DirAccess.dir_exists_absolute(uiscript_dir):
uiscript_dir = assets_root.path_join("uiscript")
_cfg.load(CFG_PATH)
_cfg.load(config_path())
for k in ["name_color", "target_board", "view_chat", "always_show_name", "show_damage", "salestext"]:
_display[k] = int(_cfg.get_value("gameopt", k, 1 if k in ["view_chat", "always_show_name", "show_damage"] else 0))
_block_mode = int(_cfg.get_value("gameopt", "block_mode", 0))
if client and client.has_signal("block_mode_changed"):
client.block_mode_changed.connect(_on_server_block_mode)
func is_open() -> bool:
return not _win.is_empty() and is_instance_valid(_win.get("root"))
@@ -166,7 +175,9 @@ func _toggle_block(bit: int) -> void:
if client and client.has_method("say"):
client.say(0, "/setblockmode %d" % _block_mode)
_cfg.set_value("gameopt", "block_mode", _block_mode)
_cfg.save(CFG_PATH)
var err := _cfg.save(config_path())
if err != OK:
push_warning("GameOptionUI: save failed (%s): %s" % [err, config_path()])
_sync_block()
# 开窗时把状态回填到控件
@@ -186,8 +197,16 @@ func _sync_block() -> void:
if b is BaseButton:
b.set_pressed_no_signal((_block_mode & int(BLOCK_BITS[nm])) != 0)
func _on_server_block_mode(mask: int) -> void:
_block_mode = maxi(0, mask)
_cfg.set_value("gameopt", "block_mode", _block_mode)
_cfg.save(config_path())
_sync_block()
func _save() -> void:
for k in _display:
_cfg.set_value("gameopt", k, int(_display[k]))
_cfg.set_value("gameopt", "block_mode", _block_mode)
_cfg.save(CFG_PATH)
var err := _cfg.save(config_path())
if err != OK:
push_warning("GameOptionUI: save failed (%s): %s" % [err, config_path()])