diff --git a/common/pom.xml b/common/pom.xml index 4874d16c3..d190028ee 100644 --- a/common/pom.xml +++ b/common/pom.xml @@ -19,5 +19,13 @@ 1.18 compile + + + + it.unimi.dsi + fastutil + 8.3.1 + compile + diff --git a/common/src/main/java/us/myles/ViaVersion/api/entities/Entity1_13Types.java b/common/src/main/java/us/myles/ViaVersion/api/entities/Entity1_13Types.java index 591918921..1ede8e5e8 100644 --- a/common/src/main/java/us/myles/ViaVersion/api/entities/Entity1_13Types.java +++ b/common/src/main/java/us/myles/ViaVersion/api/entities/Entity1_13Types.java @@ -91,12 +91,11 @@ public class Entity1_13Types { // Fish ABSTRACT_FISHES(-1, ABSTRACT_CREATURE), // agb - COD_MOB(8, ABSTRACT_FISHES), // agf + COD(8, ABSTRACT_FISHES), // agf PUFFERFISH(52, ABSTRACT_FISHES), // agn SALMON(57, ABSTRACT_FISHES), // agp TROPICAL_FISH(72, ABSTRACT_FISHES), // agu - // Monsters ABSTRACT_MONSTER(-1, ABSTRACT_CREATURE), // ajs BLAZE(4, ABSTRACT_MONSTER), // ajd @@ -248,7 +247,7 @@ public class Entity1_13Types { ENDER_PEARL(65, EntityType.ENDER_PEARL), WITHER_SKULL(66, EntityType.WITHER_SKULL), SHULKER_BULLET(67, EntityType.SHULKER_BULLET), - LIAMA_SPIT(68, EntityType.LLAMA_SPIT), + LLAMA_SPIT(68, EntityType.LLAMA_SPIT), FALLING_BLOCK(70, EntityType.FALLING_BLOCK), ITEM_FRAME(71, EntityType.ITEM_FRAME), EYE_OF_ENDER(72, EntityType.EYE_OF_ENDER), diff --git a/common/src/main/java/us/myles/ViaVersion/api/protocol/ProtocolRegistry.java b/common/src/main/java/us/myles/ViaVersion/api/protocol/ProtocolRegistry.java index 50331e45c..4553bd6d2 100644 --- a/common/src/main/java/us/myles/ViaVersion/api/protocol/ProtocolRegistry.java +++ b/common/src/main/java/us/myles/ViaVersion/api/protocol/ProtocolRegistry.java @@ -2,6 +2,8 @@ package us.myles.ViaVersion.api.protocol; import com.google.common.collect.Lists; import com.google.common.collect.Range; +import it.unimi.dsi.fastutil.ints.Int2ObjectMap; +import it.unimi.dsi.fastutil.ints.Int2ObjectOpenHashMap; import org.jetbrains.annotations.Nullable; import us.myles.ViaVersion.api.Pair; import us.myles.ViaVersion.api.Via; @@ -52,7 +54,7 @@ public class ProtocolRegistry { public static final Protocol BASE_PROTOCOL = new BaseProtocol(); public static int SERVER_PROTOCOL = -1; // Input Version -> Output Version & Protocol (Allows fast lookup) - private static final Map> registryMap = new ConcurrentHashMap<>(); + private static final Int2ObjectMap> registryMap = new Int2ObjectOpenHashMap<>(32); private static final Map, Protocol> protocols = new HashMap<>(); private static final Map, List>> pathCache = new ConcurrentHashMap<>(); private static final Set supportedVersions = new HashSet<>(); @@ -126,7 +128,7 @@ public class ProtocolRegistry { * @param supported Supported client versions. * @param output The output server version it converts to. */ - public static void registerProtocol(Protocol protocol, List supported, Integer output) { + public static void registerProtocol(Protocol protocol, List supported, int output) { // Clear cache as this may make new routes. if (!pathCache.isEmpty()) { pathCache.clear(); @@ -135,7 +137,7 @@ public class ProtocolRegistry { protocols.put(protocol.getClass(), protocol); for (int version : supported) { - Map protocolMap = registryMap.computeIfAbsent(version, k -> new HashMap<>()); + Int2ObjectMap protocolMap = registryMap.computeIfAbsent(version, s -> new Int2ObjectOpenHashMap<>(2)); protocolMap.put(output, protocol); } @@ -204,8 +206,8 @@ public class ProtocolRegistry { * @return True if there is a useful pipe */ public static boolean isWorkingPipe() { - for (Map maps : registryMap.values()) { - if (maps.containsKey(SERVER_PROTOCOL)) return true; + for (Int2ObjectMap map : registryMap.values()) { + if (map.containsKey(SERVER_PROTOCOL)) return true; } return false; // No destination for protocol } @@ -234,36 +236,37 @@ public class ProtocolRegistry { if (current.size() > 50) return null; // Fail safe, protocol too complicated. // First check if there is any protocols for this - Map inputMap = registryMap.get(clientVersion); + Int2ObjectMap inputMap = registryMap.get(clientVersion); if (inputMap == null) { return null; // Not supported } + // Next check there isn't an obvious path Protocol protocol = inputMap.get(serverVersion); if (protocol != null) { current.add(new Pair<>(serverVersion, protocol)); return current; // Easy solution } + // There might be a more advanced solution... So we'll see if any of the others can get us there List> shortest = null; - - for (Map.Entry entry : inputMap.entrySet()) { + for (Int2ObjectMap.Entry entry : inputMap.int2ObjectEntrySet()) { // Ensure it wasn't caught by the other loop - if (!entry.getKey().equals(serverVersion)) { - Pair pair = new Pair<>(entry.getKey(), entry.getValue()); - // Ensure no recursion - if (!current.contains(pair)) { - // Create a copy - List> newCurrent = new ArrayList<>(current); - newCurrent.add(pair); - // Calculate the rest of the protocol using the current - newCurrent = getProtocolPath(newCurrent, entry.getKey(), serverVersion); - if (newCurrent != null) { - // If it's shorter then choose it - if (shortest == null || shortest.size() > newCurrent.size()) { - shortest = newCurrent; - } - } + if (entry.getIntKey() == (serverVersion)) continue; + + Pair pair = new Pair<>(entry.getIntKey(), entry.getValue()); + // Ensure no recursion + if (current.contains(pair)) continue; + + // Create a copy + List> newCurrent = new ArrayList<>(current); + newCurrent.add(pair); + // Calculate the rest of the protocol using the current + newCurrent = getProtocolPath(newCurrent, entry.getKey(), serverVersion); + if (newCurrent != null) { + // If it's shorter then choose it + if (shortest == null || shortest.size() > newCurrent.size()) { + shortest = newCurrent; } } } diff --git a/common/src/main/java/us/myles/ViaVersion/api/rewriters/MetadataRewriter.java b/common/src/main/java/us/myles/ViaVersion/api/rewriters/MetadataRewriter.java index de6db2ebd..a9dfb16ef 100644 --- a/common/src/main/java/us/myles/ViaVersion/api/rewriters/MetadataRewriter.java +++ b/common/src/main/java/us/myles/ViaVersion/api/rewriters/MetadataRewriter.java @@ -1,5 +1,7 @@ package us.myles.ViaVersion.api.rewriters; +import it.unimi.dsi.fastutil.ints.Int2IntMap; +import it.unimi.dsi.fastutil.ints.Int2IntOpenHashMap; import org.jetbrains.annotations.Nullable; import us.myles.ViaVersion.api.Via; import us.myles.ViaVersion.api.data.UserConnection; @@ -23,7 +25,7 @@ import java.util.logging.Logger; public abstract class MetadataRewriter { private final Class entityTrackerClass; private final Protocol protocol; - private Map typeMapping; + private Int2IntMap typeMapping; protected MetadataRewriter(Protocol protocol, Class entityTrackerClass) { this.protocol = protocol; @@ -182,7 +184,10 @@ public abstract class MetadataRewriter { } public & EntityType> void mapTypes(EntityType[] oldTypes, Class newTypeClass) { - if (typeMapping == null) typeMapping = new HashMap<>(oldTypes.length); + if (typeMapping == null) { + typeMapping = new Int2IntOpenHashMap(oldTypes.length, 1F); + typeMapping.defaultReturnValue(-1); + } for (EntityType oldType : oldTypes) { try { T newType = Enum.valueOf(newTypeClass, oldType.name()); @@ -190,14 +195,17 @@ public abstract class MetadataRewriter { } catch (IllegalArgumentException notFound) { if (!typeMapping.containsKey(oldType.getId())) { Via.getPlatform().getLogger().warning("Could not find new entity type for " + oldType + "! " + - "Old type: " + oldType.getClass().getSimpleName() + " New type: " + newTypeClass.getSimpleName()); + "Old type: " + oldType.getClass().getEnclosingClass().getSimpleName() + ", new type: " + newTypeClass.getEnclosingClass().getSimpleName()); } } } } public void mapType(EntityType oldType, EntityType newType) { - if (typeMapping == null) typeMapping = new HashMap<>(); + if (typeMapping == null) { + typeMapping = new Int2IntOpenHashMap(); + typeMapping.defaultReturnValue(-1); + } typeMapping.put(oldType.getId(), newType.getId()); } diff --git a/common/src/main/java/us/myles/ViaVersion/protocols/protocol1_13to1_12_2/Protocol1_13To1_12_2.java b/common/src/main/java/us/myles/ViaVersion/protocols/protocol1_13to1_12_2/Protocol1_13To1_12_2.java index feb9cef5f..4f345578c 100644 --- a/common/src/main/java/us/myles/ViaVersion/protocols/protocol1_13to1_12_2/Protocol1_13To1_12_2.java +++ b/common/src/main/java/us/myles/ViaVersion/protocols/protocol1_13to1_12_2/Protocol1_13To1_12_2.java @@ -346,8 +346,8 @@ public class Protocol1_13To1_12_2 extends Protocol idToKey = new HashMap<>(); - static Map keyToId = new HashMap<>(); - static Map connectionHandlerMap = new HashMap<>(); - static Map blockConnectionData = new HashMap<>(); - static Set occludingStates = new HashSet<>(); + static Int2ObjectMap idToKey = new Int2ObjectOpenHashMap<>(8582, 1F); + static Map keyToId = new HashMap<>(8582, 1F); + static Int2ObjectMap connectionHandlerMap = new Int2ObjectOpenHashMap<>(1); + static Int2ObjectMap blockConnectionData = new Int2ObjectOpenHashMap<>(1); + static IntSet occludingStates = new IntOpenHashSet(377, 1F); public static void update(UserConnection user, Position position) { for (BlockFace face : BlockFace.values()) { @@ -194,17 +202,21 @@ public class ConnectionData { public static void init() { if (!Via.getConfig().isServersideBlockConnections()) return; + Via.getPlatform().getLogger().info("Loading block connection mappings ..."); JsonObject mapping1_13 = MappingDataLoader.loadData("mapping-1.13.json", true); JsonObject blocks1_13 = mapping1_13.getAsJsonObject("blocks"); for (Entry blockState : blocks1_13.entrySet()) { - Integer id = Integer.parseInt(blockState.getKey()); + int id = Integer.parseInt(blockState.getKey()); String key = blockState.getValue().getAsString(); idToKey.put(id, key); keyToId.put(key, id); } + connectionHandlerMap = new Int2ObjectOpenHashMap<>(3650, 1F); + if (!Via.getConfig().isReduceBlockStorageMemory()) { + blockConnectionData = new Int2ObjectOpenHashMap<>(1146, 1F); JsonObject mappingBlockConnections = MappingDataLoader.loadData("blockConnections.json"); for (Entry entry : mappingBlockConnections.entrySet()) { int id = keyToId.get(entry.getKey()); @@ -231,7 +243,7 @@ public class ConnectionData { JsonObject blockData = MappingDataLoader.loadData("blockData.json"); JsonArray occluding = blockData.getAsJsonArray("occluding"); for (JsonElement jsonElement : occluding) { - occludingStates.add(keyToId.get(jsonElement.getAsString())); + occludingStates.add(keyToId.get(jsonElement.getAsString()).intValue()); } List initActions = new ArrayList<>(); diff --git a/common/src/main/java/us/myles/ViaVersion/protocols/protocol1_13to1_12_2/blockconnections/FlowerConnectionHandler.java b/common/src/main/java/us/myles/ViaVersion/protocols/protocol1_13to1_12_2/blockconnections/FlowerConnectionHandler.java index 2f181262e..0ede1d469 100644 --- a/common/src/main/java/us/myles/ViaVersion/protocols/protocol1_13to1_12_2/blockconnections/FlowerConnectionHandler.java +++ b/common/src/main/java/us/myles/ViaVersion/protocols/protocol1_13to1_12_2/blockconnections/FlowerConnectionHandler.java @@ -1,18 +1,18 @@ package us.myles.ViaVersion.protocols.protocol1_13to1_12_2.blockconnections; +import it.unimi.dsi.fastutil.ints.Int2IntMap; +import it.unimi.dsi.fastutil.ints.Int2IntOpenHashMap; import us.myles.ViaVersion.api.Via; import us.myles.ViaVersion.api.data.UserConnection; import us.myles.ViaVersion.api.minecraft.BlockFace; import us.myles.ViaVersion.api.minecraft.Position; -import java.util.HashMap; import java.util.HashSet; -import java.util.Map; import java.util.Set; public class FlowerConnectionHandler extends ConnectionHandler { - private static final Map flowers = new HashMap<>(); + private static final Int2IntMap flowers = new Int2IntOpenHashMap(); static ConnectionData.ConnectorInitAction init() { final Set baseFlower = new HashSet<>(); @@ -38,8 +38,8 @@ public class FlowerConnectionHandler extends ConnectionHandler { @Override public int connect(UserConnection user, Position position, int blockState) { int blockBelowId = getBlockData(user, position.getRelative(BlockFace.BOTTOM)); - Integer connectBelow = flowers.get(blockBelowId); - if (connectBelow != null) { + int connectBelow = flowers.get(blockBelowId); + if (connectBelow != 0) { int blockAboveId = getBlockData(user, position.getRelative(BlockFace.TOP)); if (Via.getConfig().isStemWhenBlockAbove()) { if (blockAboveId == 0) { diff --git a/common/src/main/java/us/myles/ViaVersion/protocols/protocol1_13to1_12_2/blockconnections/RedstoneConnectionHandler.java b/common/src/main/java/us/myles/ViaVersion/protocols/protocol1_13to1_12_2/blockconnections/RedstoneConnectionHandler.java index bfb3ef5ac..4f147800f 100644 --- a/common/src/main/java/us/myles/ViaVersion/protocols/protocol1_13to1_12_2/blockconnections/RedstoneConnectionHandler.java +++ b/common/src/main/java/us/myles/ViaVersion/protocols/protocol1_13to1_12_2/blockconnections/RedstoneConnectionHandler.java @@ -1,18 +1,18 @@ package us.myles.ViaVersion.protocols.protocol1_13to1_12_2.blockconnections; +import it.unimi.dsi.fastutil.ints.Int2IntMap; +import it.unimi.dsi.fastutil.ints.Int2IntOpenHashMap; import us.myles.ViaVersion.api.data.UserConnection; import us.myles.ViaVersion.api.minecraft.BlockFace; import us.myles.ViaVersion.api.minecraft.Position; -import java.util.HashMap; import java.util.HashSet; -import java.util.Map; import java.util.Set; public class RedstoneConnectionHandler extends ConnectionHandler { private static final Set redstone = new HashSet<>(); - private static final Map connectedBlockStates = new HashMap<>(); - private static final Map powerMappings = new HashMap<>(); + private static final Int2IntMap connectedBlockStates = new Int2IntOpenHashMap(1296); + private static final Int2IntMap powerMappings = new Int2IntOpenHashMap(1296); static ConnectionData.ConnectorInitAction init() { final RedstoneConnectionHandler connectionHandler = new RedstoneConnectionHandler(); @@ -22,7 +22,7 @@ public class RedstoneConnectionHandler extends ConnectionHandler { redstone.add(blockData.getSavedBlockStateId()); ConnectionData.connectionHandlerMap.put(blockData.getSavedBlockStateId(), connectionHandler); connectedBlockStates.put(getStates(blockData), blockData.getSavedBlockStateId()); - powerMappings.put(blockData.getSavedBlockStateId(), Integer.valueOf(blockData.getValue("power"))); + powerMappings.put(blockData.getSavedBlockStateId(), Integer.parseInt(blockData.getValue("power"))); }; } @@ -57,8 +57,7 @@ public class RedstoneConnectionHandler extends ConnectionHandler { b |= connects(user, position, BlockFace.SOUTH) << 4; b |= connects(user, position, BlockFace.WEST) << 6; b |= powerMappings.get(blockState) << 8; - final Integer newBlockState = connectedBlockStates.get(b); - return newBlockState == null ? blockState : newBlockState; + return connectedBlockStates.getOrDefault(b, blockState); } private int connects(UserConnection user, Position position, BlockFace side) { diff --git a/common/src/main/java/us/myles/ViaVersion/protocols/protocol1_13to1_12_2/data/BlockIdData.java b/common/src/main/java/us/myles/ViaVersion/protocols/protocol1_13to1_12_2/data/BlockIdData.java index 40585d9bd..2e914f432 100644 --- a/common/src/main/java/us/myles/ViaVersion/protocols/protocol1_13to1_12_2/data/BlockIdData.java +++ b/common/src/main/java/us/myles/ViaVersion/protocols/protocol1_13to1_12_2/data/BlockIdData.java @@ -2,6 +2,8 @@ package us.myles.ViaVersion.protocols.protocol1_13to1_12_2.data; import com.google.common.collect.ObjectArrays; import com.google.gson.reflect.TypeToken; +import it.unimi.dsi.fastutil.ints.Int2ObjectMap; +import it.unimi.dsi.fastutil.ints.Int2ObjectOpenHashMap; import us.myles.ViaVersion.util.GsonUtil; import java.io.IOException; @@ -13,18 +15,18 @@ import java.util.Map; public class BlockIdData { public static Map blockIdMapping; public static Map fallbackReverseMapping; - public static Map numberIdToString; + public static Int2ObjectMap numberIdToString; public static void init() { InputStream stream = MappingData.class.getClassLoader() .getResourceAsStream("assets/viaversion/data/blockIds1.12to1.13.json"); InputStreamReader reader = new InputStreamReader(stream); try { - blockIdMapping = new HashMap<>((Map) GsonUtil.getGson().fromJson( + blockIdMapping = new HashMap<>(GsonUtil.getGson().fromJson( reader, new TypeToken>() { }.getType() - )); + ), 1F); fallbackReverseMapping = new HashMap<>(); for (Map.Entry entry : blockIdMapping.entrySet()) { for (String val : entry.getValue()) { @@ -45,7 +47,7 @@ public class BlockIdData { .getResourceAsStream("assets/viaversion/data/blockNumberToString1.12.json"); InputStreamReader blockR = new InputStreamReader(blockS); try { - numberIdToString = new HashMap<>((Map) GsonUtil.getGson().fromJson( + numberIdToString = new Int2ObjectOpenHashMap<>(GsonUtil.getGson().fromJson( blockR, new TypeToken>() { }.getType() diff --git a/common/src/main/java/us/myles/ViaVersion/protocols/protocol1_13to1_12_2/data/EntityTypeRewriter.java b/common/src/main/java/us/myles/ViaVersion/protocols/protocol1_13to1_12_2/data/EntityTypeRewriter.java index 0573c2c72..a6f1f53cc 100644 --- a/common/src/main/java/us/myles/ViaVersion/protocols/protocol1_13to1_12_2/data/EntityTypeRewriter.java +++ b/common/src/main/java/us/myles/ViaVersion/protocols/protocol1_13to1_12_2/data/EntityTypeRewriter.java @@ -1,14 +1,13 @@ package us.myles.ViaVersion.protocols.protocol1_13to1_12_2.data; - -import java.util.HashMap; -import java.util.Map; -import java.util.Optional; +import it.unimi.dsi.fastutil.ints.Int2IntMap; +import it.unimi.dsi.fastutil.ints.Int2IntOpenHashMap; public class EntityTypeRewriter { - private static final Map entityTypes = new HashMap<>(); + private static final Int2IntMap ENTITY_TYPES = new Int2IntOpenHashMap(83, 1F); static { + ENTITY_TYPES.defaultReturnValue(-1); registerEntity(1, 32); // item - ajl registerEntity(2, 22); // xp_orb - abx registerEntity(3, 0); // area_effect_cloud - abp @@ -92,16 +91,13 @@ public class EntityTypeRewriter { registerEntity(104, 37); // llama_spit - alr registerEntity(105, 50); // parrot - agx registerEntity(120, 79); // villager - ala - - // OBJECTS - // Couldn't find any object id change with mapped values } private static void registerEntity(int type1_12, int type1_13) { - entityTypes.put(type1_12, type1_13); + ENTITY_TYPES.put(type1_12, type1_13); } - public static Optional getNewId(int type1_12) { - return Optional.ofNullable(entityTypes.get(type1_12)); + public static int getNewId(int type1_12) { + return ENTITY_TYPES.getOrDefault(type1_12, type1_12); } -} +} \ No newline at end of file diff --git a/common/src/main/java/us/myles/ViaVersion/protocols/protocol1_13to1_12_2/data/MappingData.java b/common/src/main/java/us/myles/ViaVersion/protocols/protocol1_13to1_12_2/data/MappingData.java index c8b262be6..7c7848a8a 100644 --- a/common/src/main/java/us/myles/ViaVersion/protocols/protocol1_13to1_12_2/data/MappingData.java +++ b/common/src/main/java/us/myles/ViaVersion/protocols/protocol1_13to1_12_2/data/MappingData.java @@ -11,6 +11,7 @@ import us.myles.ViaVersion.api.Via; import us.myles.ViaVersion.api.data.MappingDataLoader; import us.myles.ViaVersion.api.data.Mappings; import us.myles.ViaVersion.util.GsonUtil; +import us.myles.ViaVersion.util.Int2IntBiMap; import java.io.IOException; import java.io.InputStreamReader; @@ -20,7 +21,7 @@ import java.util.HashMap; import java.util.Map; public class MappingData { - public static final BiMap oldToNewItems = HashBiMap.create(); + public static final Int2IntBiMap oldToNewItems = new Int2IntBiMap(); public static final Map blockTags = new HashMap<>(); public static final Map itemTags = new HashMap<>(); public static final Map fluidTags = new HashMap<>(); @@ -37,6 +38,7 @@ public class MappingData { JsonObject mapping1_12 = MappingDataLoader.loadData("mapping-1.12.json", true); JsonObject mapping1_13 = MappingDataLoader.loadData("mapping-1.13.json", true); + oldToNewItems.defaultReturnValue(-1); blockMappings = new BlockMappingsShortArray(mapping1_12.getAsJsonObject("blocks"), mapping1_13.getAsJsonObject("blocks")); MappingDataLoader.mapIdentifiers(oldToNewItems, mapping1_12.getAsJsonObject("items"), mapping1_13.getAsJsonObject("items")); loadTags(blockTags, mapping1_13.getAsJsonObject("block_tags")); diff --git a/common/src/main/java/us/myles/ViaVersion/protocols/protocol1_13to1_12_2/metadata/MetadataRewriter1_13To1_12_2.java b/common/src/main/java/us/myles/ViaVersion/protocols/protocol1_13to1_12_2/metadata/MetadataRewriter1_13To1_12_2.java index db9709547..ad234da35 100644 --- a/common/src/main/java/us/myles/ViaVersion/protocols/protocol1_13to1_12_2/metadata/MetadataRewriter1_13To1_12_2.java +++ b/common/src/main/java/us/myles/ViaVersion/protocols/protocol1_13to1_12_2/metadata/MetadataRewriter1_13To1_12_2.java @@ -102,7 +102,7 @@ public class MetadataRewriter1_13To1_12_2 extends MetadataRewriter { @Override public int getNewEntityId(final int oldId) { - return EntityTypeRewriter.getNewId(oldId).orElse(oldId); + return EntityTypeRewriter.getNewId(oldId); } @Override diff --git a/common/src/main/java/us/myles/ViaVersion/protocols/protocol1_13to1_12_2/packets/InventoryPackets.java b/common/src/main/java/us/myles/ViaVersion/protocols/protocol1_13to1_12_2/packets/InventoryPackets.java index 07e3b96bc..edd520f5e 100644 --- a/common/src/main/java/us/myles/ViaVersion/protocols/protocol1_13to1_12_2/packets/InventoryPackets.java +++ b/common/src/main/java/us/myles/ViaVersion/protocols/protocol1_13to1_12_2/packets/InventoryPackets.java @@ -435,7 +435,7 @@ public class InventoryPackets { } } - item.setIdentifier(MappingData.oldToNewItems.get(rawId).shortValue()); + item.setIdentifier(MappingData.oldToNewItems.get(rawId)); item.setData((short) 0); } @@ -487,8 +487,8 @@ public class InventoryPackets { } if (rawId == null) { - Integer oldId = MappingData.oldToNewItems.inverse().get(item.getIdentifier()); - if (oldId != null) { + int oldId = MappingData.oldToNewItems.inverse().get(item.getIdentifier()); + if (oldId != -1) { // Handle spawn eggs Optional eggEntityId = SpawnEggRewriter.getEntityId(oldId); if (eggEntityId.isPresent()) { diff --git a/common/src/main/java/us/myles/ViaVersion/protocols/protocol1_13to1_12_2/packets/WorldPackets.java b/common/src/main/java/us/myles/ViaVersion/protocols/protocol1_13to1_12_2/packets/WorldPackets.java index 4e33f4abc..6537f3453 100644 --- a/common/src/main/java/us/myles/ViaVersion/protocols/protocol1_13to1_12_2/packets/WorldPackets.java +++ b/common/src/main/java/us/myles/ViaVersion/protocols/protocol1_13to1_12_2/packets/WorldPackets.java @@ -1,6 +1,8 @@ package us.myles.ViaVersion.protocols.protocol1_13to1_12_2.packets; import com.github.steveice10.opennbt.tag.builtin.CompoundTag; +import it.unimi.dsi.fastutil.ints.IntOpenHashSet; +import it.unimi.dsi.fastutil.ints.IntSet; import us.myles.ViaVersion.api.PacketWrapper; import us.myles.ViaVersion.api.Via; import us.myles.ViaVersion.api.data.UserConnection; @@ -27,31 +29,29 @@ import us.myles.ViaVersion.protocols.protocol1_13to1_12_2.types.Chunk1_13Type; import us.myles.ViaVersion.protocols.protocol1_9_1_2to1_9_3_4.types.Chunk1_9_3_4Type; import us.myles.ViaVersion.protocols.protocol1_9_3to1_9_1_2.storage.ClientWorld; -import java.util.HashSet; import java.util.List; import java.util.Optional; -import java.util.Set; public class WorldPackets { - private static final Set validBiomes = new HashSet<>(); + private static final IntSet VALID_BIOMES = new IntOpenHashSet(70, 1F); static { // Client will crash if it receives a invalid biome id for (int i = 0; i < 50; i++) { - validBiomes.add(i); + VALID_BIOMES.add(i); } - validBiomes.add(127); + VALID_BIOMES.add(127); for (int i = 129; i <= 134; i++) { - validBiomes.add(i); + VALID_BIOMES.add(i); } - validBiomes.add(140); - validBiomes.add(149); - validBiomes.add(151); + VALID_BIOMES.add(140); + VALID_BIOMES.add(149); + VALID_BIOMES.add(151); for (int i = 155; i <= 158; i++) { - validBiomes.add(i); + VALID_BIOMES.add(i); } for (int i = 160; i <= 167; i++) { - validBiomes.add(i); + VALID_BIOMES.add(i); } } @@ -407,7 +407,7 @@ public class WorldPackets { int latestBiomeWarn = Integer.MIN_VALUE; for (int i = 0; i < 256; i++) { int biome = chunk.getBiomeData()[i]; - if (!validBiomes.contains(biome)) { + if (!VALID_BIOMES.contains(biome)) { if (biome != 255 // is it generated naturally? *shrug* && latestBiomeWarn != biome) { if (!Via.getConfig().isSuppressConversionWarnings() || Via.getManager().isDebug()) { diff --git a/common/src/main/java/us/myles/ViaVersion/protocols/protocol1_13to1_12_2/storage/BlockConnectionStorage.java b/common/src/main/java/us/myles/ViaVersion/protocols/protocol1_13to1_12_2/storage/BlockConnectionStorage.java index 56ccd68fd..5b3c90eff 100644 --- a/common/src/main/java/us/myles/ViaVersion/protocols/protocol1_13to1_12_2/storage/BlockConnectionStorage.java +++ b/common/src/main/java/us/myles/ViaVersion/protocols/protocol1_13to1_12_2/storage/BlockConnectionStorage.java @@ -11,25 +11,29 @@ import us.myles.ViaVersion.protocols.protocol1_13to1_12_2.packets.WorldPackets; import java.lang.reflect.Constructor; import java.lang.reflect.InvocationTargetException; +import java.util.Arrays; import java.util.HashMap; import java.util.Map; public class BlockConnectionStorage extends StoredObject { - private final Map> blockStorage = createLongObjectMap(); - - private static final Map reverseBlockMappings; + private static final short[] REVERSE_BLOCK_MAPPINGS = new short[8582]; private static Constructor fastUtilLongObjectHashMap; + private final Map> blockStorage = createLongObjectMap(); + static { try { fastUtilLongObjectHashMap = Class.forName("it.unimi.dsi.fastutil.longs.Long2ObjectOpenHashMap").getConstructor(); Via.getPlatform().getLogger().info("Using FastUtil Long2ObjectOpenHashMap for block connections"); } catch (ClassNotFoundException | NoSuchMethodException ignored) { } - reverseBlockMappings = new HashMap<>(); + + Arrays.fill(REVERSE_BLOCK_MAPPINGS, (short) -1); for (int i = 0; i < 4096; i++) { int newBlock = MappingData.blockMappings.getNewId(i); - if (newBlock != -1) reverseBlockMappings.put((short) newBlock, (short) i); + if (newBlock != -1) { + REVERSE_BLOCK_MAPPINGS[newBlock] = (short) i; + } } } @@ -38,15 +42,18 @@ public class BlockConnectionStorage extends StoredObject { } public void store(int x, int y, int z, int blockState) { - Short mapping = reverseBlockMappings.get((short) blockState); - if (mapping == null) return; + short mapping = REVERSE_BLOCK_MAPPINGS[blockState]; + if (mapping == -1) return; + blockState = mapping; long pair = getChunkSectionIndex(x, y, z); Pair map = getChunkSection(pair, (blockState & 0xF) != 0); int blockIndex = encodeBlockPos(x, y, z); map.getKey()[blockIndex] = (byte) (blockState >> 4); NibbleArray nibbleArray = map.getValue(); - if (nibbleArray != null) nibbleArray.set(blockIndex, blockState); + if (nibbleArray != null) { + nibbleArray.set(blockIndex, blockState); + } } public int get(int x, int y, int z) { diff --git a/common/src/main/java/us/myles/ViaVersion/protocols/protocol1_13to1_12_2/storage/BlockStorage.java b/common/src/main/java/us/myles/ViaVersion/protocols/protocol1_13to1_12_2/storage/BlockStorage.java index dfdbf1b7c..91728d621 100644 --- a/common/src/main/java/us/myles/ViaVersion/protocols/protocol1_13to1_12_2/storage/BlockStorage.java +++ b/common/src/main/java/us/myles/ViaVersion/protocols/protocol1_13to1_12_2/storage/BlockStorage.java @@ -1,38 +1,41 @@ package us.myles.ViaVersion.protocols.protocol1_13to1_12_2.storage; +import it.unimi.dsi.fastutil.ints.IntOpenHashSet; +import it.unimi.dsi.fastutil.ints.IntSet; import us.myles.ViaVersion.api.data.StoredObject; import us.myles.ViaVersion.api.data.UserConnection; import us.myles.ViaVersion.api.minecraft.Position; -import java.util.HashSet; import java.util.Map; -import java.util.Set; import java.util.concurrent.ConcurrentHashMap; public class BlockStorage extends StoredObject { - private static final Set whitelist = new HashSet<>(); + private static final IntSet WHITELIST = new IntOpenHashSet(46, 1F); private final Map blocks = new ConcurrentHashMap<>(); static { // Flower pots - whitelist.add(5266); + WHITELIST.add(5266); // Add those red beds - for (int i = 0; i < 16; i++) - whitelist.add(972 + i); + for (int i = 0; i < 16; i++) { + WHITELIST.add(972 + i); + } // Add the white banners - for (int i = 0; i < 20; i++) - whitelist.add(6854 + i); + for (int i = 0; i < 20; i++) { + WHITELIST.add(6854 + i); + } // Add the white wall banners for (int i = 0; i < 4; i++) { - whitelist.add(7110 + i); + WHITELIST.add(7110 + i); } // Skeleton skulls - for (int i = 0; i < 5; i++) - whitelist.add(5447 + i); + for (int i = 0; i < 5; i++) { + WHITELIST.add(5447 + i); + } } public BlockStorage(UserConnection user) { @@ -44,14 +47,14 @@ public class BlockStorage extends StoredObject { } public void store(Position position, int block, int replacementId) { - if (!whitelist.contains(block)) + if (!WHITELIST.contains(block)) return; blocks.put(position, new ReplacementData(block, replacementId)); } public boolean isWelcome(int block) { - return whitelist.contains(block); + return WHITELIST.contains(block); } public boolean contains(Position position) { diff --git a/common/src/main/java/us/myles/ViaVersion/protocols/protocol1_14to1_13_2/data/EntityTypeRewriter.java b/common/src/main/java/us/myles/ViaVersion/protocols/protocol1_14to1_13_2/data/EntityTypeRewriter.java deleted file mode 100644 index 32529384a..000000000 --- a/common/src/main/java/us/myles/ViaVersion/protocols/protocol1_14to1_13_2/data/EntityTypeRewriter.java +++ /dev/null @@ -1,109 +0,0 @@ -package us.myles.ViaVersion.protocols.protocol1_14to1_13_2.data; - -import java.util.HashMap; -import java.util.Map; -import java.util.Optional; - -public class EntityTypeRewriter { - private static final Map entityTypes = new HashMap<>(); - - static { - regEnt(6, 7); // cave_spider - regEnt(7, 8); // chicken - regEnt(8, 9); // cod - regEnt(9, 10); // cow - regEnt(10, 11); // creeper - regEnt(11, 12); // donkey - regEnt(12, 13); // dolphin - regEnt(13, 14); // dragon_fireball - regEnt(14, 15); // drowned - regEnt(15, 16); // elder_guardian - regEnt(16, 17); // end_crystal - regEnt(17, 18); // ender_dragon - regEnt(18, 19); // enderman - regEnt(19, 20); // endermite - regEnt(20, 21); // evoker_fangs - regEnt(21, 22); // evoker - regEnt(22, 23); // experience_orb - regEnt(23, 24); // eye_of_ender - regEnt(24, 25); // falling_block - regEnt(25, 26); // firework_rocket - regEnt(26, 28); // ghast - regEnt(27, 29); // giant - regEnt(28, 30); // guardian - regEnt(29, 31); // horse - regEnt(30, 32); // husk - regEnt(31, 33); // illusioner - regEnt(32, 34); // item - regEnt(33, 35); // item_frame - regEnt(34, 36); // fireball - regEnt(35, 37); // leash_knot - regEnt(36, 38); // llama - regEnt(37, 39); // llama_spit - regEnt(38, 40); // magma_cube - regEnt(39, 41); // minecart - regEnt(40, 42); // chest_minecart - regEnt(41, 43); // command_block_minecart - regEnt(42, 44); // furnace_minecart - regEnt(43, 45); // hopper_minecart - regEnt(44, 46); // spawner_minecart - regEnt(45, 47); // tnt_minecart - regEnt(46, 48); // mule - regEnt(47, 49); // mooshroom - regEnt(48, 6); // ocelot -> cat TODO Remap untamed ocelot to ocelot? - regEnt(49, 51); // painting - regEnt(50, 53); // parrot - regEnt(51, 54); // pig - regEnt(52, 55); // pufferfish - regEnt(53, 56); // zombie_pigman - regEnt(54, 57); // polar_bear - regEnt(55, 58); // tnt - regEnt(56, 59); // rabbit - regEnt(57, 60); // salmon - regEnt(58, 61); // sheep - regEnt(59, 62); // shulker - regEnt(60, 63); // shulker_bullet - regEnt(61, 64); // silverfish - regEnt(62, 65); // skeleton - regEnt(63, 66); // skeleton_horse - regEnt(64, 67); // slime - regEnt(65, 68); // small_fireball - regEnt(66, 69); // snowgolem - regEnt(67, 70); // snowball - regEnt(68, 71); // spectral_arrow - regEnt(69, 72); // spider - regEnt(70, 73); // squid - regEnt(71, 74); // stray - regEnt(72, 76); // tropical_fish - regEnt(73, 77); // turtle - regEnt(74, 78); // egg - regEnt(75, 79); // ender_pearl - regEnt(76, 80); // experience_bottle - regEnt(77, 81); // potion - regEnt(78, 83); // vex - regEnt(79, 84); // villager - regEnt(80, 85); // iron_golem - regEnt(81, 86); // vindicator - regEnt(82, 89); // witch - regEnt(83, 90); // wither - regEnt(84, 91); // wither_skeleton - regEnt(85, 92); // wither_skull - regEnt(86, 93); // wolf - regEnt(87, 94); // zombie - regEnt(88, 95); // zombie_horse - regEnt(89, 96); // zombie_villager - regEnt(90, 97); // phantom - regEnt(91, 99); // lightning_bolt - regEnt(92, 100); // player - regEnt(93, 101); // fishing_bobber - regEnt(94, 82); // trident - } - - private static void regEnt(int type1_13, int type1_14) { - entityTypes.put(type1_13, type1_14); - } - - public static Optional getNewId(int type1_13) { - return Optional.ofNullable(entityTypes.get(type1_13)); - } -} diff --git a/common/src/main/java/us/myles/ViaVersion/protocols/protocol1_14to1_13_2/data/MappingData.java b/common/src/main/java/us/myles/ViaVersion/protocols/protocol1_14to1_13_2/data/MappingData.java index 261793a45..2bcf0a6e5 100644 --- a/common/src/main/java/us/myles/ViaVersion/protocols/protocol1_14to1_13_2/data/MappingData.java +++ b/common/src/main/java/us/myles/ViaVersion/protocols/protocol1_14to1_13_2/data/MappingData.java @@ -1,32 +1,32 @@ package us.myles.ViaVersion.protocols.protocol1_14to1_13_2.data; -import com.google.common.collect.BiMap; -import com.google.common.collect.HashBiMap; import com.google.gson.JsonArray; import com.google.gson.JsonElement; import com.google.gson.JsonObject; +import it.unimi.dsi.fastutil.ints.IntOpenHashSet; +import it.unimi.dsi.fastutil.ints.IntSet; import us.myles.ViaVersion.api.Via; import us.myles.ViaVersion.api.data.MappingDataLoader; import us.myles.ViaVersion.api.data.Mappings; +import us.myles.ViaVersion.util.Int2IntBiMap; import java.util.HashMap; -import java.util.HashSet; import java.util.Map; -import java.util.Set; public class MappingData { - public static final BiMap oldToNewItems = HashBiMap.create(); + public static final Int2IntBiMap oldToNewItems = new Int2IntBiMap(); public static Mappings blockStateMappings; public static Mappings blockMappings; public static Mappings soundMappings; - public static Set motionBlocking; - public static Set nonFullBlocks; + public static IntSet motionBlocking; + public static IntSet nonFullBlocks; public static void init() { Via.getPlatform().getLogger().info("Loading 1.13.2 -> 1.14 mappings..."); JsonObject mapping1_13_2 = MappingDataLoader.loadData("mapping-1.13.2.json", true); JsonObject mapping1_14 = MappingDataLoader.loadData("mapping-1.14.json", true); + oldToNewItems.defaultReturnValue(-1); blockStateMappings = new Mappings(mapping1_13_2.getAsJsonObject("blockstates"), mapping1_14.getAsJsonObject("blockstates")); blockMappings = new Mappings(mapping1_13_2.getAsJsonObject("blocks"), mapping1_14.getAsJsonObject("blocks")); MappingDataLoader.mapIdentifiers(oldToNewItems, mapping1_13_2.getAsJsonObject("items"), mapping1_14.getAsJsonObject("items")); @@ -40,19 +40,19 @@ public class MappingData { JsonObject heightMapData = MappingDataLoader.loadData("heightMapData-1.14.json"); JsonArray motionBlocking = heightMapData.getAsJsonArray("MOTION_BLOCKING"); - us.myles.ViaVersion.protocols.protocol1_14to1_13_2.data.MappingData.motionBlocking = new HashSet<>(motionBlocking.size()); + MappingData.motionBlocking = new IntOpenHashSet(motionBlocking.size(), 1F); for (JsonElement blockState : motionBlocking) { String key = blockState.getAsString(); Integer id = blockStateMap.get(key); if (id == null) { Via.getPlatform().getLogger().warning("Unknown blockstate " + key + " :("); } else { - us.myles.ViaVersion.protocols.protocol1_14to1_13_2.data.MappingData.motionBlocking.add(id); + MappingData.motionBlocking.add(id.intValue()); } } if (Via.getConfig().isNonFullBlockLightFix()) { - nonFullBlocks = new HashSet<>(); + nonFullBlocks = new IntOpenHashSet(1611, 1F); for (Map.Entry blockstates : mapping1_13_2.getAsJsonObject("blockstates").entrySet()) { final String state = blockstates.getValue().getAsString(); if (state.contains("_slab") || state.contains("_stairs") || state.contains("_wall[")) diff --git a/common/src/main/java/us/myles/ViaVersion/protocols/protocol1_14to1_13_2/metadata/MetadataRewriter1_14To1_13_2.java b/common/src/main/java/us/myles/ViaVersion/protocols/protocol1_14to1_13_2/metadata/MetadataRewriter1_14To1_13_2.java index a4a334f67..fe3e69975 100644 --- a/common/src/main/java/us/myles/ViaVersion/protocols/protocol1_14to1_13_2/metadata/MetadataRewriter1_14To1_13_2.java +++ b/common/src/main/java/us/myles/ViaVersion/protocols/protocol1_14to1_13_2/metadata/MetadataRewriter1_14To1_13_2.java @@ -3,6 +3,7 @@ package us.myles.ViaVersion.protocols.protocol1_14to1_13_2.metadata; import us.myles.ViaVersion.api.PacketWrapper; import us.myles.ViaVersion.api.Via; import us.myles.ViaVersion.api.data.UserConnection; +import us.myles.ViaVersion.api.entities.Entity1_13Types; import us.myles.ViaVersion.api.entities.Entity1_14Types; import us.myles.ViaVersion.api.entities.EntityType; import us.myles.ViaVersion.api.minecraft.VillagerData; @@ -13,7 +14,6 @@ import us.myles.ViaVersion.api.rewriters.MetadataRewriter; import us.myles.ViaVersion.api.type.Type; import us.myles.ViaVersion.api.type.types.Particle; import us.myles.ViaVersion.protocols.protocol1_14to1_13_2.Protocol1_14To1_13_2; -import us.myles.ViaVersion.protocols.protocol1_14to1_13_2.data.EntityTypeRewriter; import us.myles.ViaVersion.protocols.protocol1_14to1_13_2.packets.InventoryPackets; import us.myles.ViaVersion.protocols.protocol1_14to1_13_2.storage.EntityTracker1_14; @@ -23,6 +23,7 @@ public class MetadataRewriter1_14To1_13_2 extends MetadataRewriter { public MetadataRewriter1_14To1_13_2(Protocol1_14To1_13_2 protocol) { super(protocol, EntityTracker1_14.class); + mapTypes(Entity1_13Types.EntityType.values(), Entity1_14Types.EntityType.class); } @Override @@ -168,11 +169,6 @@ public class MetadataRewriter1_14To1_13_2 extends MetadataRewriter { } } - @Override - public int getNewEntityId(final int oldId) { - return EntityTypeRewriter.getNewId(oldId).orElse(oldId); - } - @Override protected EntityType getTypeFromId(int type) { return Entity1_14Types.getTypeFromId(type); diff --git a/common/src/main/java/us/myles/ViaVersion/protocols/protocol1_14to1_13_2/packets/EntityPackets.java b/common/src/main/java/us/myles/ViaVersion/protocols/protocol1_14to1_13_2/packets/EntityPackets.java index b3de6fe43..e81c7e5f8 100644 --- a/common/src/main/java/us/myles/ViaVersion/protocols/protocol1_14to1_13_2/packets/EntityPackets.java +++ b/common/src/main/java/us/myles/ViaVersion/protocols/protocol1_14to1_13_2/packets/EntityPackets.java @@ -14,7 +14,6 @@ import us.myles.ViaVersion.api.type.types.version.Types1_14; import us.myles.ViaVersion.protocols.protocol1_13to1_12_2.ClientboundPackets1_13; import us.myles.ViaVersion.protocols.protocol1_14to1_13_2.ClientboundPackets1_14; import us.myles.ViaVersion.protocols.protocol1_14to1_13_2.Protocol1_14To1_13_2; -import us.myles.ViaVersion.protocols.protocol1_14to1_13_2.data.EntityTypeRewriter; import us.myles.ViaVersion.protocols.protocol1_14to1_13_2.metadata.MetadataRewriter1_14To1_13_2; import us.myles.ViaVersion.protocols.protocol1_14to1_13_2.storage.EntityTracker1_14; @@ -50,7 +49,7 @@ public class EntityPackets { int typeId = wrapper.get(Type.VAR_INT, 1); Entity1_13Types.EntityType type1_13 = Entity1_13Types.getTypeFromId(typeId, true); - typeId = EntityTypeRewriter.getNewId(type1_13.getId()).orElse(type1_13.getId()); + typeId = metadataRewriter.getNewEntityId(type1_13.getId()); Entity1_14Types.EntityType type1_14 = Entity1_14Types.getTypeFromId(typeId); if (type1_14 != null) { diff --git a/common/src/main/java/us/myles/ViaVersion/protocols/protocol1_14to1_13_2/packets/InventoryPackets.java b/common/src/main/java/us/myles/ViaVersion/protocols/protocol1_14to1_13_2/packets/InventoryPackets.java index eca326ba4..b2d4a43c6 100644 --- a/common/src/main/java/us/myles/ViaVersion/protocols/protocol1_14to1_13_2/packets/InventoryPackets.java +++ b/common/src/main/java/us/myles/ViaVersion/protocols/protocol1_14to1_13_2/packets/InventoryPackets.java @@ -271,8 +271,8 @@ public class InventoryPackets { } public static int getNewItemId(int id) { - Integer newId = MappingData.oldToNewItems.get(id); - if (newId == null) { + int newId = MappingData.oldToNewItems.get(id); + if (newId == -1) { Via.getPlatform().getLogger().warning("Missing 1.14 item for 1.13.2 item " + id); return 1; } @@ -313,7 +313,7 @@ public class InventoryPackets { } public static int getOldItemId(int id) { - Integer oldId = MappingData.oldToNewItems.inverse().get(id); - return oldId != null ? oldId : 1; + int oldId = MappingData.oldToNewItems.inverse().get(id); + return oldId != -1 ? oldId : 1; } } diff --git a/common/src/main/java/us/myles/ViaVersion/protocols/protocol1_15to1_14_4/data/MappingData.java b/common/src/main/java/us/myles/ViaVersion/protocols/protocol1_15to1_14_4/data/MappingData.java index 057c33425..ae039cd61 100644 --- a/common/src/main/java/us/myles/ViaVersion/protocols/protocol1_15to1_14_4/data/MappingData.java +++ b/common/src/main/java/us/myles/ViaVersion/protocols/protocol1_15to1_14_4/data/MappingData.java @@ -1,14 +1,13 @@ package us.myles.ViaVersion.protocols.protocol1_15to1_14_4.data; -import com.google.common.collect.BiMap; -import com.google.common.collect.HashBiMap; import com.google.gson.JsonObject; import us.myles.ViaVersion.api.Via; import us.myles.ViaVersion.api.data.MappingDataLoader; import us.myles.ViaVersion.api.data.Mappings; +import us.myles.ViaVersion.util.Int2IntBiMap; public class MappingData { - public static BiMap oldToNewItems = HashBiMap.create(); + public static Int2IntBiMap oldToNewItems = new Int2IntBiMap(); public static Mappings blockMappings; public static Mappings blockStateMappings; public static Mappings soundMappings; @@ -19,6 +18,7 @@ public class MappingData { JsonObject mapping1_14 = MappingDataLoader.loadData("mapping-1.14.json", true); JsonObject mapping1_15 = MappingDataLoader.loadData("mapping-1.15.json", true); + oldToNewItems.defaultReturnValue(-1); blockStateMappings = new Mappings(mapping1_14.getAsJsonObject("blockstates"), mapping1_15.getAsJsonObject("blockstates"), diffmapping.getAsJsonObject("blockstates")); blockMappings = new Mappings(mapping1_14.getAsJsonObject("blocks"), mapping1_15.getAsJsonObject("blocks")); MappingDataLoader.mapIdentifiers(oldToNewItems, mapping1_14.getAsJsonObject("items"), mapping1_15.getAsJsonObject("items")); diff --git a/common/src/main/java/us/myles/ViaVersion/protocols/protocol1_15to1_14_4/packets/InventoryPackets.java b/common/src/main/java/us/myles/ViaVersion/protocols/protocol1_15to1_14_4/packets/InventoryPackets.java index 3bc4a619c..a096b7d53 100644 --- a/common/src/main/java/us/myles/ViaVersion/protocols/protocol1_15to1_14_4/packets/InventoryPackets.java +++ b/common/src/main/java/us/myles/ViaVersion/protocols/protocol1_15to1_14_4/packets/InventoryPackets.java @@ -143,8 +143,8 @@ public class InventoryPackets { } public static int getNewItemId(int id) { - Integer newId = MappingData.oldToNewItems.get(id); - if (newId == null) { + int newId = MappingData.oldToNewItems.get(id); + if (newId == -1) { Via.getPlatform().getLogger().warning("Missing 1.15 item for 1.14 item " + id); return 1; } @@ -152,7 +152,7 @@ public class InventoryPackets { } public static int getOldItemId(int id) { - Integer oldId = MappingData.oldToNewItems.inverse().get(id); - return oldId != null ? oldId : 1; + int oldId = MappingData.oldToNewItems.inverse().get(id); + return oldId != -1 ? oldId : 1; } } diff --git a/common/src/main/java/us/myles/ViaVersion/protocols/protocol1_16to1_15_2/data/MappingData.java b/common/src/main/java/us/myles/ViaVersion/protocols/protocol1_16to1_15_2/data/MappingData.java index 962910fbb..410091a76 100644 --- a/common/src/main/java/us/myles/ViaVersion/protocols/protocol1_16to1_15_2/data/MappingData.java +++ b/common/src/main/java/us/myles/ViaVersion/protocols/protocol1_16to1_15_2/data/MappingData.java @@ -1,17 +1,16 @@ package us.myles.ViaVersion.protocols.protocol1_16to1_15_2.data; -import com.google.common.collect.BiMap; -import com.google.common.collect.HashBiMap; import com.google.gson.JsonObject; import us.myles.ViaVersion.api.Via; import us.myles.ViaVersion.api.data.MappingDataLoader; import us.myles.ViaVersion.api.data.Mappings; +import us.myles.ViaVersion.util.Int2IntBiMap; import java.util.HashMap; import java.util.Map; public class MappingData { - public static BiMap oldToNewItems = HashBiMap.create(); + public static Int2IntBiMap oldToNewItems = new Int2IntBiMap(); public static Map attributeMappings = new HashMap<>(); public static Mappings blockMappings; public static Mappings blockStateMappings; @@ -23,6 +22,7 @@ public class MappingData { JsonObject mapping1_15 = MappingDataLoader.loadData("mapping-1.15.json", true); JsonObject mapping1_16 = MappingDataLoader.loadData("mapping-1.16.json", true); + oldToNewItems.defaultReturnValue(-1); blockStateMappings = new Mappings(mapping1_15.getAsJsonObject("blockstates"), mapping1_16.getAsJsonObject("blockstates"), diffmapping.getAsJsonObject("blockstates")); blockMappings = new Mappings(mapping1_15.getAsJsonObject("blocks"), mapping1_16.getAsJsonObject("blocks")); MappingDataLoader.mapIdentifiers(oldToNewItems, mapping1_15.getAsJsonObject("items"), mapping1_16.getAsJsonObject("items"), diffmapping.getAsJsonObject("items")); diff --git a/common/src/main/java/us/myles/ViaVersion/protocols/protocol1_16to1_15_2/packets/InventoryPackets.java b/common/src/main/java/us/myles/ViaVersion/protocols/protocol1_16to1_15_2/packets/InventoryPackets.java index d5cf51d52..02833f7c3 100644 --- a/common/src/main/java/us/myles/ViaVersion/protocols/protocol1_16to1_15_2/packets/InventoryPackets.java +++ b/common/src/main/java/us/myles/ViaVersion/protocols/protocol1_16to1_15_2/packets/InventoryPackets.java @@ -206,8 +206,8 @@ public class InventoryPackets { } public static int getNewItemId(int id) { - Integer newId = MappingData.oldToNewItems.get(id); - if (newId == null) { + int newId = MappingData.oldToNewItems.get(id); + if (newId == -1) { Via.getPlatform().getLogger().warning("Missing 1.16 item for 1.15.2 item " + id); return 1; } @@ -215,7 +215,7 @@ public class InventoryPackets { } public static int getOldItemId(int id) { - Integer oldId = MappingData.oldToNewItems.inverse().get(id); - return oldId != null ? oldId : 1; + int oldId = MappingData.oldToNewItems.inverse().get(id); + return oldId != -1 ? oldId : 1; } } diff --git a/common/src/main/java/us/myles/ViaVersion/protocols/protocol1_9to1_8/ItemRewriter.java b/common/src/main/java/us/myles/ViaVersion/protocols/protocol1_9to1_8/ItemRewriter.java index d69e1407e..b86e10dc7 100644 --- a/common/src/main/java/us/myles/ViaVersion/protocols/protocol1_9to1_8/ItemRewriter.java +++ b/common/src/main/java/us/myles/ViaVersion/protocols/protocol1_9to1_8/ItemRewriter.java @@ -4,6 +4,8 @@ import com.github.steveice10.opennbt.tag.builtin.CompoundTag; import com.github.steveice10.opennbt.tag.builtin.ListTag; import com.github.steveice10.opennbt.tag.builtin.StringTag; import com.github.steveice10.opennbt.tag.builtin.Tag; +import it.unimi.dsi.fastutil.ints.Int2IntMap; +import it.unimi.dsi.fastutil.ints.Int2IntOpenHashMap; import us.myles.ViaVersion.api.minecraft.item.Item; import java.util.Collections; @@ -17,7 +19,7 @@ public class ItemRewriter { private static final Map POTION_NAME_TO_ID = new HashMap<>(); private static final Map POTION_ID_TO_NAME = new HashMap<>(); - private static final Map POTION_INDEX = new HashMap<>(); + private static final Int2IntMap POTION_INDEX = new Int2IntOpenHashMap(36, 1F); static { /* Entities */ @@ -218,7 +220,7 @@ public class ItemRewriter { return str; } // hacky but it works :) - str = "\u00A7r" + str; + str = "§r" + str; return str; } @@ -381,21 +383,21 @@ public class ItemRewriter { oldID -= 8192; } - Integer index = POTION_INDEX.get(oldID); - if (index != null) { + int index = POTION_INDEX.get(oldID); + if (index != -1) { return index; } oldID = POTION_NAME_TO_ID.get(potionNameFromDamage((short) oldID)); - return (index = POTION_INDEX.get(oldID)) != null ? index : 0; + return (index = POTION_INDEX.get(oldID)) != -1 ? index : 0; } - private static void registerEntity(Integer id, String name) { + private static void registerEntity(int id, String name) { ENTTIY_ID_TO_NAME.put(id, name); ENTTIY_NAME_TO_ID.put(name, id); } - private static void registerPotion(Integer id, String name) { + private static void registerPotion(int id, String name) { POTION_INDEX.put(id, POTION_ID_TO_NAME.size()); POTION_ID_TO_NAME.put(id, name); POTION_NAME_TO_ID.put(name, id); diff --git a/common/src/main/java/us/myles/ViaVersion/protocols/protocol1_9to1_8/metadata/MetaIndex.java b/common/src/main/java/us/myles/ViaVersion/protocols/protocol1_9to1_8/metadata/MetaIndex.java index 1f05bc09b..2c5c19c2a 100644 --- a/common/src/main/java/us/myles/ViaVersion/protocols/protocol1_9to1_8/metadata/MetaIndex.java +++ b/common/src/main/java/us/myles/ViaVersion/protocols/protocol1_9to1_8/metadata/MetaIndex.java @@ -210,5 +210,4 @@ public enum MetaIndex { return null; } -} - +} \ No newline at end of file diff --git a/common/src/main/java/us/myles/ViaVersion/protocols/protocol1_9to1_8/sounds/Effect.java b/common/src/main/java/us/myles/ViaVersion/protocols/protocol1_9to1_8/sounds/Effect.java index 632e7e298..bcb3fe542 100644 --- a/common/src/main/java/us/myles/ViaVersion/protocols/protocol1_9to1_8/sounds/Effect.java +++ b/common/src/main/java/us/myles/ViaVersion/protocols/protocol1_9to1_8/sounds/Effect.java @@ -1,14 +1,13 @@ package us.myles.ViaVersion.protocols.protocol1_9to1_8.sounds; -import java.util.HashMap; -import java.util.Map; +import it.unimi.dsi.fastutil.ints.Int2IntMap; +import it.unimi.dsi.fastutil.ints.Int2IntOpenHashMap; public class Effect { - private static final Map effects; + private static final Int2IntMap EFFECTS = new Int2IntOpenHashMap(17, 1F); static { - effects = new HashMap<>(); addRewrite(1005, 1010); //Play music disc addRewrite(1003, 1005); //Iron door open addRewrite(1006, 1011); //Iron door close @@ -26,19 +25,17 @@ public class Effect { addRewrite(1020, 1029); //Anvil break addRewrite(1021, 1030); //Anvil use addRewrite(1022, 1031); //Anvil land - } public static int getNewId(int id) { - Integer newId = effects.get(id); - return newId != null ? newId : id; + return EFFECTS.getOrDefault(id, id); } public static boolean contains(int oldId) { - return effects.containsKey(oldId); + return EFFECTS.containsKey(oldId); } private static void addRewrite(int oldId, int newId) { - effects.put(oldId, newId); + EFFECTS.put(oldId, newId); } } diff --git a/common/src/main/java/us/myles/ViaVersion/util/Int2IntBiMap.java b/common/src/main/java/us/myles/ViaVersion/util/Int2IntBiMap.java new file mode 100644 index 000000000..2398a6230 --- /dev/null +++ b/common/src/main/java/us/myles/ViaVersion/util/Int2IntBiMap.java @@ -0,0 +1,128 @@ +package us.myles.ViaVersion.util; + +import com.google.common.base.Preconditions; +import it.unimi.dsi.fastutil.ints.Int2IntMap; +import it.unimi.dsi.fastutil.ints.Int2IntOpenHashMap; +import it.unimi.dsi.fastutil.ints.IntSet; +import it.unimi.dsi.fastutil.objects.ObjectSet; +import org.jetbrains.annotations.NotNull; + +import java.util.Map; + + +/** + * Simple wrapper class for two {@link Int2IntMap}s. + * + * @see #inverse() to get the inversed map + */ +public class Int2IntBiMap implements Int2IntMap { + + private final Int2IntMap map; + private final Int2IntBiMap inverse; + + public Int2IntBiMap() { + this.map = new Int2IntOpenHashMap(); + this.inverse = new Int2IntBiMap(this); + } + + private Int2IntBiMap(Int2IntBiMap inverse) { + this.map = new Int2IntOpenHashMap(); + this.inverse = inverse; + } + + /** + * @return the inverse of this bimap + */ + public Int2IntBiMap inverse() { + return inverse; + } + + /** + * Puts the key and value into the maps. + * + * @param key key + * @param value value + * @return old value if present + * @throws IllegalArgumentException if the value already exists in the map + */ + @Override + public int put(int key, int value) { + if (containsKey(key) && value == get(key)) return value; + + Preconditions.checkArgument(!containsValue(value), "value already present: %s", value); + map.put(key, value); + inverse.map.put(value, key); + return defaultReturnValue(); + } + + @Override + public boolean remove(int key, int value) { + map.remove(key, value); + return inverse.map.remove(key, value); + } + + @Override + public int get(int key) { + return map.get(key); + } + + @Override + public void clear() { + map.clear(); + inverse.map.clear(); + } + + @Override + public int size() { + return map.size(); + } + + @Override + public boolean isEmpty() { + return map.isEmpty(); + } + + @Override + @Deprecated + public void putAll(@NotNull Map m) { + throw new UnsupportedOperationException(); + } + + @Override + public void defaultReturnValue(int rv) { + map.defaultReturnValue(rv); + inverse.map.defaultReturnValue(rv); + } + + @Override + public int defaultReturnValue() { + return map.defaultReturnValue(); + } + + @Override + public ObjectSet int2IntEntrySet() { + return map.int2IntEntrySet(); + } + + @Override + @NotNull + public IntSet keySet() { + return map.keySet(); + } + + @Override + @NotNull + public IntSet values() { + return inverse.map.keySet(); + } + + @Override + public boolean containsKey(int key) { + return map.containsKey(key); + } + + @Override + public boolean containsValue(int value) { + return inverse.map.containsKey(value); + } +} diff --git a/jar/pom.xml b/jar/pom.xml index 621d022fe..9ec8fe221 100644 --- a/jar/pom.xml +++ b/jar/pom.xml @@ -73,7 +73,44 @@ false false + + + it.unimi.dsi:fastutil + + + it/unimi/dsi/fastutil/ints/* + it/unimi/dsi/fastutil/objects/* + it/unimi/dsi/fastutil/*.class + + + + it/unimi/dsi/fastutil/*/*Reference* + it/unimi/dsi/fastutil/*/*Boolean* + it/unimi/dsi/fastutil/*/*Byte* + it/unimi/dsi/fastutil/*/*Short* + it/unimi/dsi/fastutil/*/*Float* + it/unimi/dsi/fastutil/*/*Double* + it/unimi/dsi/fastutil/*/*Long* + it/unimi/dsi/fastutil/*/*Char* + + it/unimi/dsi/fastutil/*/*Custom* + it/unimi/dsi/fastutil/*/*Linked* + it/unimi/dsi/fastutil/*/*Sorted* + it/unimi/dsi/fastutil/*/*Tree* + it/unimi/dsi/fastutil/*/*Heap* + it/unimi/dsi/fastutil/*/*Queue* + + it/unimi/dsi/fastutil/*/*Big* + it/unimi/dsi/fastutil/*/*Synchronized* + it/unimi/dsi/fastutil/*/*Unmodifiable* + + + + + it.unimi.dsi.fastutil + us.myles.viaversion.libs.fastutil + com.github.steveice10.opennbt us.myles.viaversion.libs.opennbt