Sfoglia il codice sorgente

Entity action (#57)

* Set seed from setting file

* Add entity action process

* Add packet player on ground.

* Add isOnGround in player grain

* Update isOnGround in player grain
WangJun 8 anni fa
parent
commit
026f18f3ec

+ 44 - 0
src/MineCase.Protocol/Protocol/Play/EntityAction.cs

@@ -0,0 +1,44 @@
+using System;
+using System.Collections.Generic;
+using System.IO;
+using System.Text;
+using MineCase.Serialization;
+
+namespace MineCase.Protocol.Play
+{
+    public enum ActionId : uint
+    {
+        StartSneaking = 0,
+        StopSneaking = 1,
+        LeaveBed = 2,
+        StartSprinting = 3,
+        StopSprinting = 4,
+        StartJumpWithHorse = 5,
+        StopJumpWithHorse = 6,
+        OpenHorseInventory = 7,
+        StartFlyingWithElytra = 8
+    }
+
+    [Packet(0x15)]
+    public sealed class EntityAction
+    {
+        [SerializeAs(DataType.VarInt)]
+        public uint EntityId;
+
+        [SerializeAs(DataType.VarInt)]
+        public ActionId ActionId;
+
+        [SerializeAs(DataType.VarInt)]
+        public uint JumpBoost;
+
+        public static EntityAction Deserialize(ref SpanReader br)
+        {
+            return new EntityAction
+            {
+                EntityId = br.ReadAsVarInt(out _),
+                ActionId = (ActionId)br.ReadAsVarInt(out _),
+                JumpBoost = br.ReadAsVarInt(out _)
+            };
+        }
+    }
+}

+ 22 - 0
src/MineCase.Protocol/Protocol/Play/PlayerOnGround.cs

@@ -0,0 +1,22 @@
+using System;
+using System.Collections.Generic;
+using System.Text;
+using MineCase.Serialization;
+
+namespace MineCase.Protocol.Play
+{
+    [Packet(0x0D)]
+    public sealed class PlayerOnGround
+    {
+        [SerializeAs(DataType.Boolean)]
+        public bool OnGround;
+
+        public static PlayerOnGround Deserialize(ref SpanReader br)
+        {
+            return new PlayerOnGround
+            {
+                OnGround = br.ReadAsBoolean(),
+            };
+        }
+    }
+}

+ 9 - 0
src/MineCase.Server.Grains/Game/Entities/PlayerGrain.cs

@@ -42,6 +42,8 @@ namespace MineCase.Server.Game.Entities
 
         private (Position, BlockState)? _diggingBlock;
 
+        private bool _isOnGround;
+
         public override Task OnActivateAsync()
         {
             _inventory = GrainFactory.GetGrain<IInventoryWindow>(Guid.NewGuid());
@@ -50,6 +52,7 @@ namespace MineCase.Server.Game.Entities
             _level = 0;
             _teleportId = 0;
             _levelMaxExp = 7;
+            _isOnGround = true;
 
             return base.OnActivateAsync();
         }
@@ -222,5 +225,11 @@ namespace MineCase.Server.Game.Entities
         {
             return Task.CompletedTask;
         }
+
+        public Task SetOnGround(bool state)
+        {
+            _isOnGround = state;
+            return Task.CompletedTask;
+        }
     }
 }

+ 30 - 8
src/MineCase.Server.Grains/Network/PacketRouterGrain.Play.cs

@@ -46,9 +46,9 @@ namespace MineCase.Server.Network
                     innerPacket = ServerboundKeepAlive.Deserialize(ref br);
                     break;
 
-                // Position And Look
-                case 0x0F:
-                    innerPacket = DeferPacket(ServerboundPositionAndLook.Deserialize(ref br));
+                // Player On Ground
+                case 0x0D:
+                    innerPacket = DeferPacket(PlayerOnGround.Deserialize(ref br));
                     break;
 
                 // Player Position
@@ -56,21 +56,31 @@ namespace MineCase.Server.Network
                     innerPacket = DeferPacket(PlayerPosition.Deserialize(ref br));
                     break;
 
+                // Position And Look
+                case 0x0F:
+                    innerPacket = DeferPacket(ServerboundPositionAndLook.Deserialize(ref br));
+                    break;
+
                 // Player Look
                 case 0x10:
                     innerPacket = DeferPacket(PlayerLook.Deserialize(ref br));
                     break;
 
-                // Held Item Change
-                case 0x1A:
-                    innerPacket = DeferPacket(ServerboundHeldItemChange.Deserialize(ref br));
-                    break;
-
                 // Player Digging
                 case 0x14:
                     innerPacket = DeferPacket(PlayerDigging.Deserialize(ref br));
                     break;
 
+                // Entity Action
+                case 0x15:
+                    innerPacket = DeferPacket(EntityAction.Deserialize(ref br));
+                    break;
+
+                // Held Item Change
+                case 0x1A:
+                    innerPacket = DeferPacket(ServerboundHeldItemChange.Deserialize(ref br));
+                    break;
+
                 // Animation
                 case 0x1D:
                     innerPacket = DeferPacket(ServerboundAnimation.Deserialize(ref br));
@@ -130,6 +140,12 @@ namespace MineCase.Server.Network
             player.SetLook(packet.Yaw, packet.Pitch, packet.OnGround).Ignore();
         }
 
+        private async Task DispatchPacket(PlayerOnGround packet)
+        {
+            var player = await _user.GetPlayer();
+            await player.SetOnGround(packet.OnGround);
+        }
+
         private async Task DispatchPacket(PlayerPosition packet)
         {
             var player = await _user.GetPlayer();
@@ -185,6 +201,12 @@ namespace MineCase.Server.Network
             }
         }
 
+        private Task DispatchPacket(EntityAction packet)
+        {
+            // TODO Set Entity Action
+            return Task.CompletedTask;
+        }
+
         private Task DispatchPacket(ServerboundAnimation packet)
         {
             return Task.CompletedTask;

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

@@ -54,5 +54,7 @@ namespace MineCase.Server.Game.Entities
         Task PlaceBlock(Position location, EntityInteractHand hand, PlayerDiggingFace face, Vector3 cursorPosition);
 
         Task SetHeldItem(short slot);
+
+        Task SetOnGround(bool state);
     }
 }