diff --git a/server/MPClient.ts b/server/MPClient.ts index 8dc5160..1a97370 100644 --- a/server/MPClient.ts +++ b/server/MPClient.ts @@ -1,5 +1,5 @@ import { Console } from "hsconsole"; -import { Endian, IReader, createWriter } from "bufferstuff"; +import { IReader } from "bufferstuff"; import { MinecraftServer } from "./MinecraftServer"; import { Packet } from "./enums/Packet"; import { PacketAnimation } from "./packets/Animation"; @@ -14,13 +14,10 @@ import { Player } from "./entities/Player"; import { Socket } from "net"; import Vec3 from "./Vec3"; import { PacketRespawn } from "./packets/Respawn"; -import { PacketSpawnPosition } from "./packets/SpawnPosition"; import { PacketPlayerBlockPlacement } from "./packets/PlayerBlockPlacement"; -import { Inventory } from "./inventories/Inventory"; import { PacketHoldingChange } from "./packets/HoldingChange"; import { PacketDisconnectKick } from "./packets/DisconnectKick"; import { ItemStack } from "./inventories/ItemStack"; -import { PacketWindowItems } from "./packets/WindowItems"; import { Block } from "./blocks/Block"; import { EntityItem } from "./entities/EntityItem"; import AABB from "./AABB"; @@ -28,12 +25,13 @@ import { PacketSoundEffect } from "./packets/SoundEffect"; import { SoundEffects } from "./enums/SoundEffects"; import { PacketUseEntity } from "./packets/UseEntity"; import { EntityLiving } from "./entities/EntityLiving"; +import PlayerInventory from "./inventories/PlayerInventory"; export class MPClient { private readonly mcServer:MinecraftServer; private readonly socket:Socket; public entity:Player; - private inventory:Inventory; + private inventory:PlayerInventory; private dimension:number; private holdingIndex:number = 36; // First hotbar slot. @@ -200,11 +198,12 @@ export class MPClient { const itemId = blockBehaviour.droppedItem(brokenBlockId); if (itemId !== -1) { const itemCount = blockBehaviour.droppedCount(brokenBlockId); + this.entity.sendToNearby(new PacketSoundEffect(SoundEffects.BLOCK_BREAK, x, y, z, brokenBlockId).writeData()); for (let i = 0; i < ((itemCount - 1) >> 6) + 1; i++) { const itemEntity = new EntityItem(this.entity.world, new ItemStack(itemId, Math.min(itemCount - 64 * i, 64), metadata)); itemEntity.position.set(x + 0.5, y + 0.5, z + 0.5); + itemEntity.pickupDelay = 10; this.entity.world.addEntity(itemEntity); - this.entity.sendToNearby(new PacketSoundEffect(SoundEffects.BLOCK_BREAK, x, y, z, brokenBlockId).writeData()); } } } @@ -214,7 +213,30 @@ export class MPClient { // Special drop item case if (packet.status === 4) { - // TODO: Handle dropping items + const itemStack = this.getHeldItemStack(); + if (itemStack !== null && itemStack.size > 0) { + itemStack.size--; + const itemEntity = new EntityItem(this.entity.world, new ItemStack(itemStack.itemID, 1, itemStack.damage)); + itemEntity.pickupDelay = 10; + itemEntity.position.set(this.entity.position.x, this.entity.position.y + 1.50, this.entity.position.z); + itemEntity.motion.set( + -Math.sin((this.entity.rotation.yaw / 180) * Math.PI) * Math.cos((this.entity.rotation.pitch / 180) * Math.PI) * 0.3, + -Math.sin((this.entity.rotation.pitch / 180) * Math.PI) * 0.3 + 0.1, + Math.cos((this.entity.rotation.yaw / 180) * Math.PI) * Math.cos((this.entity.rotation.pitch / 180) * Math.PI) * 0.3 + ); + // Add random motion vector + const twoPIRandomised = Math.random() * Math.PI * 2; + const rngMult = 0.02 * Math.random(); + itemEntity.motion.add( + Math.cos(twoPIRandomised) * rngMult, + (Math.random() - Math.random()) * 0.1, + Math.sin(twoPIRandomised) * rngMult + ); + this.entity.world.addEntity(itemEntity); + + this.inventory.dropEmptyItemStacks(); + this.inventory.sendUpdatedStacks([this.holdingIndex]); + } return; } diff --git a/server/entities/Entity.ts b/server/entities/Entity.ts index 367439d..77524f6 100644 --- a/server/entities/Entity.ts +++ b/server/entities/Entity.ts @@ -264,7 +264,6 @@ export class Entity implements IEntity { // TODO: Handle X and Z collisions. if (this.entityAABB.intersects(blockBoundingBox)) { const intersectionY = this.entityAABB.intersectionY(blockBoundingBox); - console.log(intersectionY); this.position.add(0, intersectionY, 0); this.motion.y = 0; this.onGround = true; diff --git a/server/entities/EntityItem.ts b/server/entities/EntityItem.ts index 71ea02c..7e306ef 100644 --- a/server/entities/EntityItem.ts +++ b/server/entities/EntityItem.ts @@ -31,7 +31,6 @@ export class EntityItem extends Entity { } else { let playerCollided = await this.collidesWithPlayer(this.entityAABB); if (playerCollided !== undefined) { - console.log(playerCollided.username); playerCollided.inventory.addItemStack(this.itemStack); playerCollided.itemPickup(this, this.itemStack.size); if (this.itemStack.size <= 0) { diff --git a/server/packets/SetSlot.ts b/server/packets/SetSlot.ts index 1b5168e..51abd7b 100644 --- a/server/packets/SetSlot.ts +++ b/server/packets/SetSlot.ts @@ -17,6 +17,12 @@ export class PacketSetSlot implements IPacket { this.itemId = itemId; this.itemCount = itemCount; this.itemUses = itemUses; + } else if (typeof(windowId) === "number" && typeof(slot) === "number" && typeof(itemId) === "number") { + this.windowId = windowId; + this.slot = slot; + this.itemId = itemId; + this.itemCount = Number.MIN_VALUE; + this.itemUses = Number.MIN_VALUE; } else { this.windowId = Number.MIN_VALUE; this.slot = Number.MIN_VALUE;