浏览代码

进入游戏 四周看看

SunnyCase 8 年之前
父节点
当前提交
5415bddd77

+ 1 - 1
src/MineCase.Gateway/Network/ClientSession.cs

@@ -145,4 +145,4 @@ namespace MineCase.Gateway.Network
         }
         #endregion
     }
-}
+}

+ 35 - 0
src/MineCase.Protocol/Protocol/Play/PositionAndLook.cs

@@ -41,4 +41,39 @@ namespace MineCase.Protocol.Play
             bw.WriteAsVarInt(TeleportId, out _);
         }
     }
+
+    [Packet(0x0F)]
+    public sealed class ServerboundPositionAndLook
+    {
+        [SerializeAs(DataType.Double)]
+        public double X;
+
+        [SerializeAs(DataType.Double)]
+        public double FeetY;
+
+        [SerializeAs(DataType.Double)]
+        public double Z;
+
+        [SerializeAs(DataType.Float)]
+        public float Yaw;
+
+        [SerializeAs(DataType.Float)]
+        public float Pitch;
+
+        [SerializeAs(DataType.Boolean)]
+        public bool OnGround;
+
+        public static ServerboundPositionAndLook Deserialize(BinaryReader br)
+        {
+            return new ServerboundPositionAndLook
+            {
+                X = br.ReadAsDouble(),
+                FeetY = br.ReadAsDouble(),
+                Z = br.ReadAsDouble(),
+                Yaw = br.ReadAsFloat(),
+                Pitch = br.ReadAsFloat(),
+                OnGround = br.ReadAsBoolean()
+            };
+        }
+    }
 }

+ 12 - 0
src/MineCase.Protocol/Serialization/BinaryReaderExtensions.cs

@@ -67,11 +67,23 @@ namespace MineCase.Serialization
             return (long)value.ToBigEndian();
         }
 
+        public static ulong ReadAsUnsignedLong(this BinaryReader br)
+        {
+            var value = br.ReadUInt64();
+            return value.ToBigEndian();
+        }
+
         public static float ReadAsFloat(this BinaryReader br)
         {
             var value = br.ReadAsUnsignedInt();
             return Unsafe.As<uint, float>(ref value);
         }
+
+        public static double ReadAsDouble(this BinaryReader br)
+        {
+            var value = br.ReadAsUnsignedLong();
+            return Unsafe.As<ulong, double>(ref value);
+        }
     }
 
     internal static class StreamExtensions

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

@@ -107,5 +107,10 @@ namespace MineCase.Server.Game.Entities
             _teleportConfirmed = true;
             return Task.CompletedTask;
         }
+
+        public Task SetPositionAndLook(double x, double feetY, double z, float yaw, float pitch, bool onGround)
+        {
+            return Task.CompletedTask;
+        }
     }
 }

+ 4 - 0
src/MineCase.Server.Grains/MineCase.Server.Grains.csproj

@@ -16,4 +16,8 @@
     <ProjectReference Include="..\MineCase.Server.Interfaces\MineCase.Server.Interfaces.csproj" />
   </ItemGroup>
 
+  <ItemGroup>
+    <Folder Include="World\Generation\" />
+  </ItemGroup>
+
 </Project>

+ 10 - 0
src/MineCase.Server.Grains/Network/PacketRouterGrain.Play.cs

@@ -36,6 +36,10 @@ namespace MineCase.Server.Network
                     case 0x0C:
                         innerPacket = ServerboundKeepAlive.Deserialize(br);
                         break;
+                    // Position And Look
+                    case 0x0F:
+                        innerPacket = ServerboundPositionAndLook.Deserialize(br);
+                        break;
                     default:
                         throw new InvalidDataException($"Unrecognizable packet id: 0x{packet.PacketId:X}.");
                 }
@@ -67,6 +71,12 @@ namespace MineCase.Server.Network
             return Task.CompletedTask;
         }
 
+        private async Task DispatchPacket(ServerboundPositionAndLook packet)
+        {
+            var player = await _user.GetPlayer();
+            player.SetPositionAndLook(packet.X, packet.FeetY, packet.Z, packet.Yaw, packet.Pitch, packet.OnGround).Ignore();
+        }
+
         private Task DispatchPacket(UseEntity packet)
         {
             var player = _user;

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

@@ -22,5 +22,6 @@ namespace MineCase.Server.Game.Entities
         Task NotifyLoggedIn();
         Task SendPositionAndLook();
         Task OnTeleportConfirm(uint teleportId);
+        Task SetPositionAndLook(double x, double feetY, double z, float yaw, float pitch, bool onGround);
     }
 }