From 46f5adf46766d332af34b1ecaaa9275e13bbd57c Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?=E9=99=A8=E8=90=BD=E5=9F=BA=E5=9B=B4=E8=99=BE?= <3161880837@qq.com> Date: Mon, 10 Nov 2025 22:51:03 +0800 Subject: [PATCH] =?UTF-8?q?feat(=E7=8A=B6=E6=80=81=E6=9C=BA):=20=E6=B7=BB?= =?UTF-8?q?=E5=8A=A0=E5=8E=86=E5=8F=B2=E8=AE=B0=E5=BD=95=E6=A0=88=E5=8A=9F?= =?UTF-8?q?=E8=83=BD=E7=94=A8=E4=BA=8E=E7=8E=A9=E5=AE=B6=E5=90=8D=E7=A7=B0?= =?UTF-8?q?=E8=BE=93=E5=85=A5?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit 实现玩家名称输入的历史记录功能,使用新添加的Reference和Composables类来管理历史记录栈。当玩家修改名称时,自动更新历史记录并处理名称冲突。 修改Starter面板以使用新功能,包括名称冲突时的自动重命名和通过RPC同步名称更改。 --- scripts/Contents/Panels/Starter.gd | 16 ++++++++++++++-- scripts/Statemachine/Composables.gd | 16 ++++++++++++++++ scripts/Statemachine/Composables.gd.uid | 1 + scripts/Statemachine/Reference.gd | 11 +++++++++++ scripts/Statemachine/Reference.gd.uid | 1 + 5 files changed, 43 insertions(+), 2 deletions(-) create mode 100644 scripts/Statemachine/Composables.gd create mode 100644 scripts/Statemachine/Composables.gd.uid create mode 100644 scripts/Statemachine/Reference.gd create mode 100644 scripts/Statemachine/Reference.gd.uid diff --git a/scripts/Contents/Panels/Starter.gd b/scripts/Contents/Panels/Starter.gd index 4134cb4..a7fa2b7 100644 --- a/scripts/Contents/Panels/Starter.gd +++ b/scripts/Contents/Panels/Starter.gd @@ -13,6 +13,7 @@ extends FullscreenPanelBase @onready var connectionState: Label = $"%connectionState" @onready var disconnectBtn: Button = $"%disconnectBtn" @onready var playerNameInput: LineEdit = $"%playerNameInput" +var historyStack @onready var serverConfig: VBoxContainer = $"%serverConfig" @onready var players: VBoxContainer = $"%players" @onready var playersList: VBoxContainer = $"%list" @@ -22,6 +23,10 @@ func joinPlayer(player: String): if multiplayer.is_server(): addPlayerName(player) rebuildAllPlayers.rpc(getPlayerNames()) + if getPlayerNames().has(player): + var newName = player + str(randi_range(1000, 99999999999)) + setPlayerName.rpc(player, newName) + setPlayerName(player, newName) @rpc("any_peer") func leavePlayer(playerName: String): if multiplayer.is_server(): @@ -29,9 +34,13 @@ func leavePlayer(playerName: String): rebuildAllPlayers.rpc(getPlayerNames()) @rpc("any_peer") func setPlayerName(oldName: String, newName: String): + if playerNameInput.text == oldName: + playerNameInput.text = newName + historyStack[0].getData().append(newName) for i in playersList.get_children(): if i.text == oldName: i.text = newName + break @rpc("any_peer") func rebuildAllPlayers(playerNames: Array[String]): for i in playersList.get_children(): @@ -40,6 +49,7 @@ func rebuildAllPlayers(playerNames: Array[String]): addPlayerName(i) func _ready(): + historyStack = Composables.useHistoryStack(playerNameInput) diffEdit.min_value = GameRule.difficultyRange.x diffEdit.max_value = GameRule.difficultyRange.y multiplayer.connection_failed.connect( @@ -81,9 +91,11 @@ func _ready(): leavePlayer.rpc(playerNameInput.text) setState(MultiplayerState.ConnectionState.DISCONNECTED) ) + var getLast = historyStack[1] playerNameInput.text_changed.connect( - func(text): - setPlayerName.rpc(playerNameInput.text, text) + func(newText): + setPlayerName.rpc(getLast.call(1), newText) + setPlayerName(getLast.call(1), newText) ) setState(MultiplayerState.ConnectionState.DISCONNECTED) func _physics_process(_delta): diff --git a/scripts/Statemachine/Composables.gd b/scripts/Statemachine/Composables.gd new file mode 100644 index 0000000..3dc98ba --- /dev/null +++ b/scripts/Statemachine/Composables.gd @@ -0,0 +1,16 @@ +class_name Composables + +static func useHistoryStack(input: LineEdit): + var stack = Reference.new([input.text]) + var lastText = Reference.new("") + var getLast = func(index: int): + return stack.getData()[stack.getData().size() - index - 1] + input.text_changed.connect(func(text): + lastText.setData(text) + stack.getData().append(text) + ) + return [ + stack, + getLast, + lastText + ] diff --git a/scripts/Statemachine/Composables.gd.uid b/scripts/Statemachine/Composables.gd.uid new file mode 100644 index 0000000..282e683 --- /dev/null +++ b/scripts/Statemachine/Composables.gd.uid @@ -0,0 +1 @@ +uid://bbqva0vgrd2m3 diff --git a/scripts/Statemachine/Reference.gd b/scripts/Statemachine/Reference.gd new file mode 100644 index 0000000..2756f7b --- /dev/null +++ b/scripts/Statemachine/Reference.gd @@ -0,0 +1,11 @@ +class_name Reference + +var data: Variant = null + +func _init(initialData: Variant): + data = initialData + +func setData(newData: Variant): + data = newData +func getData() -> Variant: + return data diff --git a/scripts/Statemachine/Reference.gd.uid b/scripts/Statemachine/Reference.gd.uid new file mode 100644 index 0000000..d6f3f37 --- /dev/null +++ b/scripts/Statemachine/Reference.gd.uid @@ -0,0 +1 @@ +uid://cwllidbftjld2