浏览代码

学习一个 ReentrantAttribute

SunnyCase 8 年之前
父节点
当前提交
c73b5699ac

+ 1 - 1
src/MineCase.Protocol/Protocol/Play/PositionAndLook.cs

@@ -7,7 +7,7 @@ using System.IO;
 namespace MineCase.Protocol.Play
 {
     [Packet(0x2E)]
-    public sealed class PositionAndLook : ISerializablePacket
+    public sealed class ClientboundPositionAndLook : ISerializablePacket
     {
         [SerializeAs(DataType.Double)]
         public double X;

+ 6 - 14
src/MineCase.Server.Grains/Game/Entities/PlayerGrain.cs

@@ -16,7 +16,6 @@ namespace MineCase.Server.Game.Entities
     {
         private IUser _user;
         private ClientPlayPacketGenerator _generator;
-        private uint _ping;
 
         private string _name;
         private IInventoryWindow _inventory;
@@ -47,12 +46,11 @@ namespace MineCase.Server.Game.Entities
             await _generator.WindowItems(0, slots);
         }
 
-        public Task BindToUser(IUser user, IClientboundPacketSink sink)
+        public async Task BindToUser(IUser user)
         {
-            _generator = new ClientPlayPacketGenerator(sink);
+            _generator = new ClientPlayPacketGenerator(await user.GetClientPacketSink());
             _user = user;
             _health = MaxHealth;
-            return Task.CompletedTask;
         }
 
         public async Task SendHealth()
@@ -80,15 +78,15 @@ namespace MineCase.Server.Game.Entities
             await _generator.PlayerListItemAddPlayer(desc);
         }
 
-        public Task<PlayerDescription> GetDescription()
+        public async Task<PlayerDescription> GetDescription()
         {
-            return Task.FromResult(new PlayerDescription
+            return new PlayerDescription
             {
                 UUID = _user.GetPrimaryKey(),
                 Name = _name,
                 GameMode = new GameMode { ModeClass = GameMode.Class.Survival },
-                Ping = _ping
-            });
+                Ping = await _user.GetPing()
+            };
         }
 
         public async Task NotifyLoggedIn()
@@ -104,12 +102,6 @@ namespace MineCase.Server.Game.Entities
             _teleportConfirmed = false;
         }
 
-        public Task SetPing(uint ping)
-        {
-            _pitch = ping;
-            return Task.CompletedTask;
-        }
-
         public Task OnTeleportConfirm(uint teleportId)
         {
             _teleportConfirmed = true;

+ 1 - 1
src/MineCase.Server.Grains/Network/Play/ClientPlayPacketGenerator.cs

@@ -100,7 +100,7 @@ namespace MineCase.Server.Network.Play
 
         public Task PositionAndLook(double x, double y, double z, float yaw, float pitch, RelativeFlags relative, uint teleportId)
         {
-            return Sink.SendPacket(new PositionAndLook
+            return Sink.SendPacket(new ClientboundPositionAndLook
             {
                 X = x,
                 Y = y,

+ 3 - 2
src/MineCase.Server.Grains/User/UserGrain.cs

@@ -9,9 +9,11 @@ using MineCase.Server.Network;
 using System.Numerics;
 using MineCase.Server.Network.Play;
 using MineCase.Server.Game.Entities;
+using Orleans.Concurrency;
 
 namespace MineCase.Server.User
 {
+    [Reentrant]
     class UserGrain : Grain, IUser
     {
         private string _name;
@@ -66,7 +68,7 @@ namespace MineCase.Server.User
             var playerEid = await _world.NewEntityId();
             _player = GrainFactory.GetGrain<IPlayer>(_world.MakeEntityKey(playerEid));
             await _player.SetName(_name);
-            await _player.BindToUser(this, _sink);
+            await _player.BindToUser(this);
             await _world.AttachEntity(_player);
 
             _state = UserState.JoinedGame;
@@ -154,7 +156,6 @@ namespace MineCase.Server.User
 
         public async Task OnGameTick(TimeSpan deltaTime)
         {
-            await _player.SetPing(await GetPing());
             if(_state == UserState.DownloadingWorld)
             {
                 await _player.SendPositionAndLook();

+ 1 - 2
src/MineCase.Server.Interfaces/Game/Entities/IPlayer.cs

@@ -12,8 +12,7 @@ namespace MineCase.Server.Game.Entities
     {
         Task<string> GetName();
         Task SetName(string name);
-        Task BindToUser(IUser user, IClientboundPacketSink sink);
-        Task SetPing(uint ping);
+        Task BindToUser(IUser user);
         
         Task<PlayerDescription> GetDescription();
         Task<IInventoryWindow> GetInventory();