|
@@ -5,36 +5,50 @@ const _crown = preload("res://img/crown.png")
|
|
|
@onready var _list = $HBoxContainer/VBoxContainer/ItemList
|
|
|
@onready var _action = $HBoxContainer/VBoxContainer/Action
|
|
|
|
|
|
+const ACTIONS = ["roll", "pass"]
|
|
|
+
|
|
|
var _players = []
|
|
|
var _turn = -1
|
|
|
|
|
|
-master func set_player_name(name):
|
|
|
- var sender = get_tree().get_rpc_sender_id()
|
|
|
- rpc("update_player_name", sender, name)
|
|
|
+@rpc func _log(what):
|
|
|
+ $HBoxContainer/RichTextLabel.add_text(what + "\n")
|
|
|
+
|
|
|
+
|
|
|
+@rpc(any_peer) func set_player_name(name):
|
|
|
+ if not is_multiplayer_authority():
|
|
|
+ return
|
|
|
+ var sender = multiplayer.get_remote_sender_id()
|
|
|
+ update_player_name.rpc(sender, name)
|
|
|
|
|
|
|
|
|
-remotesync func update_player_name(player, name):
|
|
|
+@rpc(call_local) func update_player_name(player, name):
|
|
|
var pos = _players.find(player)
|
|
|
if pos != -1:
|
|
|
_list.set_item_text(pos, name)
|
|
|
|
|
|
|
|
|
-master func request_action(action):
|
|
|
- var sender = get_tree().get_rpc_sender_id()
|
|
|
- if _players[_turn] != get_tree().get_rpc_sender_id():
|
|
|
- rpc("_log", "Someone is trying to cheat! %s" % str(sender))
|
|
|
+@rpc(any_peer) func request_action(action):
|
|
|
+ if not is_multiplayer_authority():
|
|
|
+ return
|
|
|
+ var sender = multiplayer.get_remote_sender_id()
|
|
|
+ if _players[_turn] != sender:
|
|
|
+ _log.rpc("Someone is trying to cheat! %s" % str(sender))
|
|
|
return
|
|
|
+ if action not in ACTIONS:
|
|
|
+ _log.rpc("Invalid action: %s" % action)
|
|
|
+ return
|
|
|
+
|
|
|
do_action(action)
|
|
|
next_turn()
|
|
|
|
|
|
|
|
|
-remotesync func do_action(action):
|
|
|
- var name = _list.get_item_text(_turn)
|
|
|
+func do_action(action):
|
|
|
+ var player_name = _list.get_item_text(_turn)
|
|
|
var val = randi() % 100
|
|
|
- rpc("_log", "%s: %ss %d" % [name, action, val])
|
|
|
+ _log.rpc("%s: %ss %d" % [player_name, action, val])
|
|
|
|
|
|
|
|
|
-remotesync func set_turn(turn):
|
|
|
+@rpc(call_local) func set_turn(turn):
|
|
|
_turn = turn
|
|
|
if turn >= _players.size():
|
|
|
return
|
|
@@ -43,27 +57,27 @@ remotesync func set_turn(turn):
|
|
|
_list.set_item_icon(i, _crown)
|
|
|
else:
|
|
|
_list.set_item_icon(i, null)
|
|
|
- _action.disabled = _players[turn] != get_tree().get_network_unique_id()
|
|
|
+ _action.disabled = _players[turn] != multiplayer.get_unique_id()
|
|
|
|
|
|
|
|
|
-remotesync func del_player(id):
|
|
|
+@rpc(call_local) func del_player(id):
|
|
|
var pos = _players.find(id)
|
|
|
if pos == -1:
|
|
|
return
|
|
|
- _players.remove(pos)
|
|
|
+ _players.erase(pos)
|
|
|
_list.remove_item(pos)
|
|
|
if _turn > pos:
|
|
|
_turn -= 1
|
|
|
- if get_tree().is_network_server():
|
|
|
- rpc("set_turn", _turn)
|
|
|
+ if multiplayer.is_server():
|
|
|
+ set_turn.rpc(_turn)
|
|
|
|
|
|
|
|
|
-remotesync func add_player(id, name=""):
|
|
|
+@rpc(call_local) func add_player(id, pname=""):
|
|
|
_players.append(id)
|
|
|
- if name == "":
|
|
|
+ if pname == "":
|
|
|
_list.add_item("... connecting ...", null, false)
|
|
|
else:
|
|
|
- _list.add_item(name, null, false)
|
|
|
+ _list.add_item(pname, null, false)
|
|
|
|
|
|
|
|
|
func get_player_name(pos):
|
|
@@ -77,7 +91,7 @@ func next_turn():
|
|
|
_turn += 1
|
|
|
if _turn >= _players.size():
|
|
|
_turn = 0
|
|
|
- rpc("set_turn", _turn)
|
|
|
+ set_turn.rpc(_turn)
|
|
|
|
|
|
|
|
|
func start():
|
|
@@ -92,27 +106,25 @@ func stop():
|
|
|
|
|
|
|
|
|
func on_peer_add(id):
|
|
|
- if not get_tree().is_network_server():
|
|
|
+ if not multiplayer.is_server():
|
|
|
return
|
|
|
for i in range(0, _players.size()):
|
|
|
- rpc_id(id, "add_player", _players[i], get_player_name(i))
|
|
|
- rpc("add_player", id)
|
|
|
- rpc_id(id, "set_turn", _turn)
|
|
|
+ add_player.rpc_id(id, _players[i], get_player_name(i))
|
|
|
+ add_player.rpc(id)
|
|
|
+ set_turn.rpc_id(id, _turn)
|
|
|
|
|
|
|
|
|
func on_peer_del(id):
|
|
|
- if not get_tree().is_network_server():
|
|
|
+ if not multiplayer.is_server():
|
|
|
return
|
|
|
- rpc("del_player", id)
|
|
|
-
|
|
|
-
|
|
|
-remotesync func _log(what):
|
|
|
- $HBoxContainer/RichTextLabel.add_text(what + "\n")
|
|
|
+ del_player.rpc(id)
|
|
|
|
|
|
|
|
|
func _on_Action_pressed():
|
|
|
- if get_tree().is_network_server():
|
|
|
+ if multiplayer.is_server():
|
|
|
+ if _turn != 0:
|
|
|
+ return
|
|
|
do_action("roll")
|
|
|
next_turn()
|
|
|
else:
|
|
|
- rpc_id(1, "request_action", "roll")
|
|
|
+ request_action.rpc_id(1, "roll")
|