public void OnPlayerPosition(IMinecraftUser user, IMinecraftPacket packet) { Position destinationPosition = packet.ReadAbsolutePosition(); bool isOnGround = packet.ReadBoolean(); user.Player.Move(destinationPosition, isOnGround); }
public void OnPlayerRotation(IMinecraftUser user, IMinecraftPacket packet) { float yawAngle = packet.ReadSingle(); float pitchAngle = packet.ReadSingle(); bool isOnGround = packet.ReadBoolean(); user.Player.Rotate(yawAngle, pitchAngle); }
public void OnPlayerPositionAndRotation(IMinecraftUser user, IMinecraftPacket packet) { Position destinationPosition = packet.ReadAbsolutePosition(); float yawAngle = packet.ReadSingle(); float pitchAngle = packet.ReadSingle(); bool isOnGround = packet.ReadBoolean(); user.Player.MoveAndRotate(destinationPosition, yawAngle, pitchAngle, isOnGround); }
public void OnPlayerBlockPlacement(IMinecraftUser user, IMinecraftPacket packet) { var handType = (HandType)packet.ReadVarInt32(); Position blockPosition = packet.ReadPosition(); var blockFace = (BlockFaceType)packet.ReadVarInt32(); float cursorX = packet.ReadSingle(); float cursorY = packet.ReadSingle(); float cursorZ = packet.ReadSingle(); bool isInsideBlock = packet.ReadBoolean(); // TODO: check if the current player is interacting with an interactable object. // Like: Chest, anvil, crafting table. IItemSlot currentHeldItem = user.Player.HotBar.SelectedSlot; if (currentHeldItem.HasItem) { BlockData block = _registry.Blocks.FirstOrDefault(x => x.ItemId == currentHeldItem.ItemId); BlockType blockToPlace = block.Type; if (blockToPlace is not BlockType.Air) { Position realBlockPosition = blockFace switch { BlockFaceType.Bottom => new Position(blockPosition.X, blockPosition.Y - 1, blockPosition.Z), BlockFaceType.Top => new Position(blockPosition.X, blockPosition.Y + 1, blockPosition.Z), BlockFaceType.North => new Position(blockPosition.X, blockPosition.Y, blockPosition.Z - 1), BlockFaceType.South => new Position(blockPosition.X, blockPosition.Y, blockPosition.Z + 1), BlockFaceType.West => new Position(blockPosition.X - 1, blockPosition.Y, blockPosition.Z), BlockFaceType.East => new Position(blockPosition.X + 1, blockPosition.Y, blockPosition.Z), _ => throw new InvalidOperationException("Invalid block face type.") }; _logger.LogDebug($"Placing block '{blockToPlace}' at position {realBlockPosition}"); user.Player.Map.SetBlock(blockToPlace, (int)realBlockPosition.X, (int)realBlockPosition.Y, (int)realBlockPosition.Z); using var blockChangePacket = new BlockChangePacket(blockToPlace, blockPosition); user.Player.SendPacketToVisibleEntities(blockChangePacket); using var chunkDataPacket = new ChunkDataPacket(user.Player.Chunk); user.Player.SendPacketToVisibleEntities(chunkDataPacket); } } } }
public void OnCreativeInventoryAction(IMinecraftUser user, IMinecraftPacket packet) { short slot = (short)(packet.ReadInt16() - RedstoneContants.PlayerInventoryHotbarOffset); // item slot structure bool present = packet.ReadBoolean(); if (present) { int itemId = packet.ReadVarInt32(); byte itemCount = packet.ReadByte(); NbtCompound itemExtras = packet.ReadNbtCompound(); _logger.LogInformation($"Item with id: {itemId} (x{itemCount}) set at slot {slot}"); user.Player.HotBar.SetItem(slot, itemId, itemCount); } else { _logger.LogInformation($"Clearing item slot '{slot}'"); user.Player.HotBar.ClearItem(slot); } }