diff --git a/src/main/java/de/bixilon/minosoft/protocol/packets/clientbound/play/PacketMapData.java b/src/main/java/de/bixilon/minosoft/protocol/packets/clientbound/play/PacketMapData.java new file mode 100644 index 000000000..8480ffb7e --- /dev/null +++ b/src/main/java/de/bixilon/minosoft/protocol/packets/clientbound/play/PacketMapData.java @@ -0,0 +1,193 @@ +/* + * 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.logging.Log; +import de.bixilon.minosoft.protocol.packets.ClientboundPacket; +import de.bixilon.minosoft.protocol.protocol.InPacketBuffer; +import de.bixilon.minosoft.protocol.protocol.PacketHandler; +import de.bixilon.minosoft.protocol.protocol.ProtocolVersion; +import de.bixilon.minosoft.util.BitByte; + +import java.util.ArrayList; +import java.util.List; + +public class PacketMapData implements ClientboundPacket { + int mapId; + PacketMapDataData dataData; + + // depends on data + // start + byte xStart; + byte yStart; + byte[] colors; + + // players + List players; + + //scale + byte scale; + + + @Override + public void read(InPacketBuffer buffer, ProtocolVersion v) { + switch (v) { + case VERSION_1_7_10: + mapId = buffer.readVarInt(); // mapId + short length = buffer.readShort(); + // read action + dataData = PacketMapDataData.byId(buffer.readByte()); + switch (dataData) { + case START: + xStart = buffer.readByte(); + yStart = buffer.readByte(); + colors = buffer.readBytes(length - 3); // 3: dataData(1) + xStart (1) + yStart (1) + break; + case PLAYERS: + players = new ArrayList<>(); + length--; // minus the dataData + for (int i = 0; i < length / 3; i++) { // loop over all sets ( 1 set: 3 bytes) + byte data = buffer.readByte(); + byte type = BitByte.getLow4Bits(data); + MapPlayerDirection direction = MapPlayerDirection.byId(BitByte.getHigh4Bits(data)); + byte x = buffer.readByte(); + byte y = buffer.readByte(); + players.add(new MapPlayerSet(type, direction, x, y)); + } + break; + case SCALE: + scale = buffer.readByte(); + return; + } + + break; + } + } + + @Override + public void log() { + Log.protocol(String.format("Received map meta data (mapId=%d)", mapId)); + } + + @Override + public void handle(PacketHandler h) { + h.handle(this); + } + + public PacketMapDataData getDataData() { + return dataData; + } + + public byte getXStart() { + return xStart; + } + + public byte getYStart() { + return yStart; + } + + public byte[] getColors() { + return colors; + } + + + public List getPlayers() { + return players; + } + + + public byte getScale() { + return scale; + } + + public enum PacketMapDataData { + START(0), + PLAYERS(1), + SCALE(2); + + final int id; + + PacketMapDataData(int id) { + this.id = id; + } + + public static PacketMapDataData byId(int id) { + for (PacketMapDataData d : values()) { + if (d.getId() == id) { + return d; + } + } + return null; + } + + public int getId() { + return id; + } + } + + + public enum MapPlayerDirection { + //ToDo + TO_DO(0); + + final int id; + + MapPlayerDirection(int id) { + this.id = id; + } + + public static MapPlayerDirection byId(int id) { + for (MapPlayerDirection d : values()) { + if (d.getId() == id) { + return d; + } + } + return null; + } + + public int getId() { + return id; + } + } + + public class MapPlayerSet { + final int type; + final MapPlayerDirection direction; + byte x; + byte z; + + public MapPlayerSet(int type, MapPlayerDirection direction, byte x, byte z) { + this.type = type; + this.direction = direction; + this.x = x; + this.z = z; + } + + public int getType() { + return type; + } + + public MapPlayerDirection getDirection() { + return direction; + } + + public byte getX() { + return x; + } + + public byte getZ() { + return z; + } + } +} 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 66e7c84eb..a07ed4867 100644 --- a/src/main/java/de/bixilon/minosoft/protocol/protocol/PacketHandler.java +++ b/src/main/java/de/bixilon/minosoft/protocol/protocol/PacketHandler.java @@ -381,10 +381,10 @@ public class PacketHandler { public void handle(PacketScoreboardUpdateScore pkg) { switch (pkg.getAction()) { case CREATE_UPDATE: - connection.getPlayer().getScoreboardManager().getObjective(pkg.getItemName()).addScore(new ScoreboardScore(pkg.getItemName(), pkg.getScoreName(), pkg.getScoreValue())); + connection.getPlayer().getScoreboardManager().getObjective(pkg.getScoreName()).addScore(new ScoreboardScore(pkg.getItemName(), pkg.getScoreName(), pkg.getScoreValue())); break; case REMOVE: - connection.getPlayer().getScoreboardManager().getObjective(pkg.getItemName()).removeScore(pkg.getItemName()); + connection.getPlayer().getScoreboardManager().getObjective(pkg.getScoreName()).removeScore(pkg.getScoreName()); break; } @@ -413,4 +413,8 @@ public class PacketHandler { break; } } + + public void handle(PacketMapData 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 6b89750b0..5376df9b7 100644 --- a/src/main/java/de/bixilon/minosoft/protocol/protocol/Protocol.java +++ b/src/main/java/de/bixilon/minosoft/protocol/protocol/Protocol.java @@ -111,6 +111,7 @@ public abstract class Protocol implements ProtocolInterface { packetClassMapping.put(Packets.Clientbound.PLAY_UPDATE_SCORE, PacketScoreboardUpdateScore.class); packetClassMapping.put(Packets.Clientbound.PLAY_TEAMS, PacketScoreboardTeams.class); packetClassMapping.put(Packets.Clientbound.PLAY_DISPLAY_SCOREBOARD, PacketScoreboardDisplayScoreboard.class); + packetClassMapping.put(Packets.Clientbound.PLAY_MAP_DATA, PacketMapData.class); } public static ProtocolVersion getLowestVersionSupported() {