Implement 40250 classic client port
This commit is contained in:
@@ -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()])
|
||||
|
||||
Reference in New Issue
Block a user