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 extends EntityTracker> entityTrackerClass;
private final Protocol protocol;
- private Map typeMapping;
+ private Int2IntMap typeMapping;
protected MetadataRewriter(Protocol protocol, Class extends EntityTracker> 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