mirror of
https://github.com/Rundll86/Dog-Lynx-And-HCN.git
synced 2026-05-28 06:51:54 +08:00
feat(状态机): 添加历史记录栈功能用于玩家名称输入
实现玩家名称输入的历史记录功能,使用新添加的Reference和Composables类来管理历史记录栈。当玩家修改名称时,自动更新历史记录并处理名称冲突。 修改Starter面板以使用新功能,包括名称冲突时的自动重命名和通过RPC同步名称更改。
This commit is contained in:
@@ -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):
|
||||
|
||||
@@ -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
|
||||
]
|
||||
@@ -0,0 +1 @@
|
||||
uid://bbqva0vgrd2m3
|
||||
@@ -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
|
||||
@@ -0,0 +1 @@
|
||||
uid://cwllidbftjld2
|
||||
Reference in New Issue
Block a user