diff --git a/src/main/java/de/bixilon/minosoft/protocol/packets/clientbound/play/PacketNamedSoundEffect.java b/src/main/java/de/bixilon/minosoft/protocol/packets/clientbound/play/PacketNamedSoundEffect.java new file mode 100644 index 000000000..e5de62c01 --- /dev/null +++ b/src/main/java/de/bixilon/minosoft/protocol/packets/clientbound/play/PacketNamedSoundEffect.java @@ -0,0 +1,80 @@ +/* + * Codename Minosoft + * Copyright (C) 2020 Moritz Zwerger + * + * This program is free software: you can redistribute it and/or modify it under the terms of the GNU General Public License as published by the Free Software Foundation, either version 3 of the License, or (at your option) any later version. + * + * This program is distributed in the hope that it will be useful, but WITHOUT ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License for more details. + * + * You should have received a copy of the GNU General Public License along with this program. If not, see . + * + * This software is not affiliated with Mojang AB, the original developer of Minecraft. + */ + +package de.bixilon.minosoft.protocol.packets.clientbound.play; + +import de.bixilon.minosoft.game.datatypes.entities.Location; +import de.bixilon.minosoft.logging.Log; +import de.bixilon.minosoft.protocol.packets.ClientboundPacket; +import de.bixilon.minosoft.protocol.protocol.InPacketBuffer; +import de.bixilon.minosoft.protocol.protocol.PacketHandler; + + +public class PacketNamedSoundEffect implements ClientboundPacket { + static final float pitchCalc = 100.0F / 63.0F; + Location location; + String sound; + float volume; + int pitch; + + @Override + public boolean read(InPacketBuffer buffer) { + switch (buffer.getVersion()) { + case VERSION_1_7_10: + case VERSION_1_8: + sound = buffer.readString(); + location = new Location(buffer.readInteger() * 8, buffer.readInteger() * 8, buffer.readInteger() * 8); + volume = buffer.readFloat(); + pitch = (int) (buffer.readByte() * pitchCalc); + return true; + case VERSION_1_9_4: + sound = buffer.readString(); + int category = buffer.readVarInt(); //ToDo: category + location = new Location(buffer.readFixedPointNumberInteger() * 8, buffer.readFixedPointNumberInteger() * 8, buffer.readFixedPointNumberInteger() * 8); + volume = buffer.readFloat(); + pitch = (int) (buffer.readByte() * pitchCalc); + return true; + } + + return false; + } + + @Override + public void log() { + Log.protocol(String.format("Play named sound effect %s with volume=%s and pitch=%s at %s", sound, volume, pitch, location.toString())); + } + + @Override + public void handle(PacketHandler h) { + h.handle(this); + } + + public Location getLocation() { + return location; + } + + /** + * @return Pitch in Percent * 100 + */ + public int getPitch() { + return pitch; + } + + public String getSound() { + return sound; + } + + public float getVolume() { + return volume; + } +} diff --git a/src/main/java/de/bixilon/minosoft/protocol/packets/clientbound/play/PacketSoundEffect.java b/src/main/java/de/bixilon/minosoft/protocol/packets/clientbound/play/PacketSoundEffect.java index fd3ba802f..7fa2c3416 100644 --- a/src/main/java/de/bixilon/minosoft/protocol/packets/clientbound/play/PacketSoundEffect.java +++ b/src/main/java/de/bixilon/minosoft/protocol/packets/clientbound/play/PacketSoundEffect.java @@ -23,17 +23,17 @@ import de.bixilon.minosoft.protocol.protocol.PacketHandler; public class PacketSoundEffect implements ClientboundPacket { static final float pitchCalc = 100.0F / 63.0F; Location location; - String sound; + int sound; float volume; int pitch; @Override public boolean read(InPacketBuffer buffer) { switch (buffer.getVersion()) { - case VERSION_1_7_10: - case VERSION_1_8: - sound = buffer.readString(); - location = new Location(buffer.readInteger() * 8, buffer.readInteger() * 8, buffer.readInteger() * 8); + case VERSION_1_9_4: + sound = buffer.readVarInt(); + int category = buffer.readVarInt(); //ToDo: category + location = new Location(buffer.readFixedPointNumberInteger() * 8, buffer.readFixedPointNumberInteger() * 8, buffer.readFixedPointNumberInteger() * 8); volume = buffer.readFloat(); pitch = (int) (buffer.readByte() * pitchCalc); return true; @@ -44,7 +44,7 @@ public class PacketSoundEffect implements ClientboundPacket { @Override public void log() { - Log.protocol(String.format("Play sound effect %s with volume=%s and pitch=%s at %s", sound, volume, pitch, location.toString())); + Log.protocol(String.format("Play sound effect %d with volume=%s and pitch=%s at %s", sound, volume, pitch, location.toString())); } @Override @@ -63,7 +63,7 @@ public class PacketSoundEffect implements ClientboundPacket { return pitch; } - public String getSound() { + public int getSound() { return sound; } diff --git a/src/main/java/de/bixilon/minosoft/protocol/packets/clientbound/play/PacketUnloadChunk.java b/src/main/java/de/bixilon/minosoft/protocol/packets/clientbound/play/PacketUnloadChunk.java new file mode 100644 index 000000000..f613891f4 --- /dev/null +++ b/src/main/java/de/bixilon/minosoft/protocol/packets/clientbound/play/PacketUnloadChunk.java @@ -0,0 +1,49 @@ +/* + * Codename Minosoft + * Copyright (C) 2020 Moritz Zwerger + * + * This program is free software: you can redistribute it and/or modify it under the terms of the GNU General Public License as published by the Free Software Foundation, either version 3 of the License, or (at your option) any later version. + * + * This program is distributed in the hope that it will be useful, but WITHOUT ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License for more details. + * + * You should have received a copy of the GNU General Public License along with this program. If not, see . + * + * This software is not affiliated with Mojang AB, the original developer of Minecraft. + */ + +package de.bixilon.minosoft.protocol.packets.clientbound.play; + +import de.bixilon.minosoft.game.datatypes.world.ChunkLocation; +import de.bixilon.minosoft.logging.Log; +import de.bixilon.minosoft.protocol.packets.ClientboundPacket; +import de.bixilon.minosoft.protocol.protocol.InPacketBuffer; +import de.bixilon.minosoft.protocol.protocol.PacketHandler; + +public class PacketUnloadChunk implements ClientboundPacket { + ChunkLocation location; + + + @Override + public boolean read(InPacketBuffer buffer) { + switch (buffer.getVersion()) { + case VERSION_1_9_4: + location = new ChunkLocation(buffer.readInteger(), buffer.readInteger()); + return true; + } + return false; + } + + @Override + public void log() { + Log.protocol(String.format("Received unload chunk packet (location=%s)", location.toString())); + } + + @Override + public void handle(PacketHandler h) { + h.handle(this); + } + + public ChunkLocation getLocation() { + return location; + } +} diff --git a/src/main/java/de/bixilon/minosoft/protocol/protocol/PacketHandler.java b/src/main/java/de/bixilon/minosoft/protocol/protocol/PacketHandler.java index 7a99e282a..32304886a 100644 --- a/src/main/java/de/bixilon/minosoft/protocol/protocol/PacketHandler.java +++ b/src/main/java/de/bixilon/minosoft/protocol/protocol/PacketHandler.java @@ -324,7 +324,7 @@ public class PacketHandler { //ToDo } - public void handle(PacketSoundEffect pkg) { + public void handle(PacketNamedSoundEffect pkg) { //ToDo } @@ -521,4 +521,12 @@ public class PacketHandler { public void handle(PacketCamera pkg) { //ToDo } + + public void handle(PacketUnloadChunk pkg) { + connection.getPlayer().getWorld().unloadChunk(pkg.getLocation()); + } + + public void handle(PacketSoundEffect pkg) { + //ToDo + } } diff --git a/src/main/java/de/bixilon/minosoft/protocol/protocol/Protocol.java b/src/main/java/de/bixilon/minosoft/protocol/protocol/Protocol.java index 7d3be5dda..8f8a7309a 100644 --- a/src/main/java/de/bixilon/minosoft/protocol/protocol/Protocol.java +++ b/src/main/java/de/bixilon/minosoft/protocol/protocol/Protocol.java @@ -107,7 +107,7 @@ public abstract class Protocol implements ProtocolInterface { packetClassMapping.put(Packets.Clientbound.PLAY_UPDATE_SIGN, PacketUpdateSignReceiving.class); packetClassMapping.put(Packets.Clientbound.PLAY_ENTITY_ANIMATION, PacketEntityAnimation.class); packetClassMapping.put(Packets.Clientbound.PLAY_ENTITY_STATUS, PacketEntityStatus.class); - packetClassMapping.put(Packets.Clientbound.PLAY_SOUND_EFFECT, PacketSoundEffect.class); + packetClassMapping.put(Packets.Clientbound.PLAY_NAMED_SOUND_EFFECT, PacketNamedSoundEffect.class); packetClassMapping.put(Packets.Clientbound.PLAY_PLAYER_POSITION_AND_ROTATION, PacketPlayerPositionAndRotation.class); packetClassMapping.put(Packets.Clientbound.PLAY_ATTACH_ENTITY, PacketAttachEntity.class); packetClassMapping.put(Packets.Clientbound.PLAY_USE_BED, PacketUseBed.class); @@ -138,6 +138,8 @@ public abstract class Protocol implements ProtocolInterface { packetClassMapping.put(Packets.Clientbound.PLAY_TITLE, PacketTitle.class); packetClassMapping.put(Packets.Clientbound.PLAY_COMBAT_EVENT, PacketCombatEvent.class); packetClassMapping.put(Packets.Clientbound.PLAY_CAMERA, PacketCamera.class); + packetClassMapping.put(Packets.Clientbound.PLAY_UNLOAD_CHUNK, PacketUnloadChunk.class); + packetClassMapping.put(Packets.Clientbound.PLAY_SOUND_EFFECT, PacketSoundEffect.class); } public static ProtocolVersion getLowestVersionSupported() { diff --git a/src/main/java/de/bixilon/minosoft/protocol/protocol/Protocol_1_7_10.java b/src/main/java/de/bixilon/minosoft/protocol/protocol/Protocol_1_7_10.java index 2071b3a55..c02370b35 100644 --- a/src/main/java/de/bixilon/minosoft/protocol/protocol/Protocol_1_7_10.java +++ b/src/main/java/de/bixilon/minosoft/protocol/protocol/Protocol_1_7_10.java @@ -86,7 +86,7 @@ public class Protocol_1_7_10 extends Protocol { clientboundPacketMapping.put(Packets.Clientbound.PLAY_CHUNK_BULK, 0x26); clientboundPacketMapping.put(Packets.Clientbound.PLAY_EXPLOSION, 0x27); clientboundPacketMapping.put(Packets.Clientbound.PLAY_EFFECT, 0x28); - clientboundPacketMapping.put(Packets.Clientbound.PLAY_SOUND_EFFECT, 0x29); + clientboundPacketMapping.put(Packets.Clientbound.PLAY_NAMED_SOUND_EFFECT, 0x29); clientboundPacketMapping.put(Packets.Clientbound.PLAY_PARTICLE, 0x2A); clientboundPacketMapping.put(Packets.Clientbound.PLAY_CHANGE_GAME_STATE, 0x2B); clientboundPacketMapping.put(Packets.Clientbound.PLAY_SPAWN_WEATHER_ENTITY, 0x2C); diff --git a/src/main/java/de/bixilon/minosoft/protocol/protocol/Protocol_1_8.java b/src/main/java/de/bixilon/minosoft/protocol/protocol/Protocol_1_8.java index 63191ec15..9b0121ac9 100644 --- a/src/main/java/de/bixilon/minosoft/protocol/protocol/Protocol_1_8.java +++ b/src/main/java/de/bixilon/minosoft/protocol/protocol/Protocol_1_8.java @@ -91,7 +91,7 @@ public class Protocol_1_8 extends Protocol { clientboundPacketMapping.put(Packets.Clientbound.PLAY_CHUNK_BULK, 0x26); clientboundPacketMapping.put(Packets.Clientbound.PLAY_EXPLOSION, 0x27); clientboundPacketMapping.put(Packets.Clientbound.PLAY_EFFECT, 0x28); - clientboundPacketMapping.put(Packets.Clientbound.PLAY_SOUND_EFFECT, 0x29); + clientboundPacketMapping.put(Packets.Clientbound.PLAY_NAMED_SOUND_EFFECT, 0x29); clientboundPacketMapping.put(Packets.Clientbound.PLAY_PARTICLE, 0x2A); clientboundPacketMapping.put(Packets.Clientbound.PLAY_CHANGE_GAME_STATE, 0x2B); clientboundPacketMapping.put(Packets.Clientbound.PLAY_SPAWN_WEATHER_ENTITY, 0x2C);