From 537cdeb9dbef717876c9343e01c859c918914378 Mon Sep 17 00:00:00 2001 From: copygirl Date: Fri, 14 May 2021 15:08:32 +0200 Subject: [PATCH] Sync appearance / held item - Send appearance to server on connect - Server now sends held items to newly connected players - Simplify World.SpawnPlayer/Block - Add Items property to Player --- src/EscapeMenuAppearance.cs | 6 ++---- src/HUD/RadialMenu.cs | 2 +- src/Items/Items.cs | 8 +++++++- src/Objects/Player.cs | 4 +++- src/Scenes/Client.cs | 4 ++++ src/Scenes/Server.cs | 24 ++++++++++++++++++------ src/World.cs | 23 ++++++----------------- 7 files changed, 41 insertions(+), 30 deletions(-) diff --git a/src/EscapeMenuAppearance.cs b/src/EscapeMenuAppearance.cs index 79899b7..6251ddf 100644 --- a/src/EscapeMenuAppearance.cs +++ b/src/EscapeMenuAppearance.cs @@ -20,10 +20,8 @@ public class EscapeMenuAppearance : CenterContainer ColorSlider.Value = GD.Randf(); ColorPreview.Modulate = Color.FromHsv((float)ColorSlider.Value, 1.0F, 1.0F); - // FIXME: LocalPlayer hasn't spawned yet on connection. - // var client = this.GetClient(); - // client.Connected += () => client.LocalPlayer.RpcId(1, - // nameof(Player.ChangeAppearance), DisplayName.Text, ColorPreview.Modulate); + this.GetClient().LocalPlayerSpawned += (player) => player.RpcId(1, + nameof(Player.ChangeAppearance), DisplayName.Text, ColorPreview.Modulate); } #pragma warning disable IDE0051 diff --git a/src/HUD/RadialMenu.cs b/src/HUD/RadialMenu.cs index 52c8732..bb5a644 100644 --- a/src/HUD/RadialMenu.cs +++ b/src/HUD/RadialMenu.cs @@ -25,7 +25,7 @@ public class RadialMenu : Node2D } public IItems GetItems() - => this.GetClient().LocalPlayer?.GetNode("Items"); + => this.GetClient().LocalPlayer?.Items; public override void _UnhandledInput(InputEvent ev) { diff --git a/src/Items/Items.cs b/src/Items/Items.cs index 1936f95..4fb9614 100644 --- a/src/Items/Items.cs +++ b/src/Items/Items.cs @@ -15,6 +15,8 @@ public class Items : Node2D, IItems { [Export] public NodePath DefaultItemPath { get; set; } + public Player Player { get; private set; } + private Node2D _current; public int Count => GetChildCount(); public Node2D this[int index] => GetChild(index); @@ -22,6 +24,7 @@ public class Items : Node2D, IItems public override void _Ready() { + Player = GetParent(); foreach (var item in this) SetActive(item, false); if (DefaultItemPath != null) SetCurrent(GetNode(DefaultItemPath), false); } @@ -41,8 +44,11 @@ public class Items : Node2D, IItems } } [Remote] - private void DoSetCurrent(string name) + public void DoSetCurrent(string name) { + if (this.GetGame() is Server) { + if (GetTree().GetRpcSenderId() != Player.NetworkID) return; + } var node = (name != null) ? GetNode(name) : null; SetCurrent(node, this.GetGame() is Server); } diff --git a/src/Objects/Player.cs b/src/Objects/Player.cs index 77011cb..2080fc7 100644 --- a/src/Objects/Player.cs +++ b/src/Objects/Player.cs @@ -7,6 +7,7 @@ public class Player : KinematicBody2D, IInitializable public Label DisplayNameLabel { get; private set; } public Sprite Sprite { get; private set; } + public IItems Items { get; private set; } public int NetworkID { get => int.Parse(Name); set => Name = value.ToString(); } @@ -16,7 +17,8 @@ public class Player : KinematicBody2D, IInitializable public void Initialize() { DisplayNameLabel = GetNode