Skip to content
This repository has been archived by the owner on Apr 20, 2023. It is now read-only.

Commit

Permalink
Showing 7 changed files with 65 additions and 43 deletions.
2 changes: 1 addition & 1 deletion gradle.properties
Original file line number Diff line number Diff line change
@@ -9,7 +9,7 @@ org.gradle.jvmargs=-Xmx1G
loader_version=aafae0b8

# Mod Properties
mod_version = 1.3.12
mod_version = 1.3.13
maven_group = net.earthcomputer
archives_base_name = multiconnect

14 changes: 7 additions & 7 deletions src/main/java/net/earthcomputer/multiconnect/impl/Utils.java
Original file line number Diff line number Diff line change
@@ -125,14 +125,14 @@ public static void copyBlocks(TagRegistry<Item> tags, TagRegistry<Block> blockTa
public static <T> int getUnmodifiedId(Registry<T> registry, T value) {
DefaultRegistries<T> defaultRegistries = (DefaultRegistries<T>) DefaultRegistries.DEFAULT_REGISTRIES.get(registry);
if (defaultRegistries == null) return registry.getRawId(value);
return defaultRegistries.defaultEntryIds.getInt(value);
return defaultRegistries.defaultEntryToRawId.getInt(value);
}

@SuppressWarnings("unchecked")
public static <T> Identifier getUnmodifiedName(Registry<T> registry, T value) {
DefaultRegistries<T> defaultRegistries = (DefaultRegistries<T>) DefaultRegistries.DEFAULT_REGISTRIES.get(registry);
if (defaultRegistries == null) return registry.getId(value);
return defaultRegistries.defaultEntriesById.inverse().get(value);
return defaultRegistries.defaultIdToEntry.inverse().get(value);
}

@SuppressWarnings("unchecked")
@@ -150,21 +150,21 @@ public static <T> void rename(ISimpleRegistry<T> registry, RegistryKey<T> from,

@SuppressWarnings("unchecked")
public static <T> void reregister(ISimpleRegistry<T> registry, T value, boolean inPlace) {
if (registry.getEntriesById().containsValue(value))
if (registry.getIdToEntry().containsValue(value))
return;

//noinspection SuspiciousMethodCalls
DefaultRegistries<T> defaultRegistries = (DefaultRegistries<T>) DefaultRegistries.DEFAULT_REGISTRIES.get(registry);
T prevValue = null;
for (int id = defaultRegistries.defaultEntryIds.getInt(value) - 1; id >= 0; id--) {
T val = defaultRegistries.defaultAllEntries.get(id);
if (registry.getEntriesById().containsValue(val)) {
for (int id = defaultRegistries.defaultEntryToRawId.getInt(value) - 1; id >= 0; id--) {
T val = defaultRegistries.defaultRawIdToEntry.get(id);
if (registry.getIdToEntry().containsValue(val)) {
prevValue = val;
break;
}
}

insertAfter(registry, prevValue, value, defaultRegistries.defaultEntriesById.inverse().get(value).toString(), inPlace);
insertAfter(registry, prevValue, value, defaultRegistries.defaultIdToEntry.inverse().get(value).toString(), inPlace);
}

@SuppressWarnings("unchecked")
Original file line number Diff line number Diff line change
@@ -3,7 +3,6 @@
import net.earthcomputer.multiconnect.impl.Utils;
import net.earthcomputer.multiconnect.protocols.generic.DefaultRegistries;
import net.earthcomputer.multiconnect.protocols.generic.IChunkDataS2CPacket;
import net.minecraft.block.entity.BlockEntityType;
import net.minecraft.datafixer.TypeReferences;
import net.minecraft.nbt.CompoundTag;
import net.minecraft.network.packet.s2c.play.ChunkDataS2CPacket;
@@ -53,7 +52,7 @@ private void onRead(CallbackInfo ci) {
if (blockEntityId != null) {
final int i_f = i;
Registry.BLOCK_ENTITY_TYPE.getOrEmpty(blockEntityId).ifPresent(type -> {
if (defaultBlockEntities.defaultEntryIds.containsKey(type)) {
if (defaultBlockEntities.defaultEntryToRawId.containsKey(type)) {
CompoundTag fixed = Utils.datafix(TypeReferences.BLOCK_ENTITY, blockEntity);
fixed.putString("id", blockEntityId.toString());
blockEntities.set(i_f, fixed);
Original file line number Diff line number Diff line change
@@ -35,7 +35,7 @@ public abstract class MixinSimpleRegistry<T> extends MutableRegistry<T> implemen
@Shadow protected Object[] randomEntries;
@Shadow private int nextId;

@Unique private Set<RegistryKey<T>> realEntries = new ObjectOpenCustomHashSet<>(Util.identityHashStrategy());
@Unique private final Set<RegistryKey<T>> realEntries = new ObjectOpenCustomHashSet<>(Util.identityHashStrategy());

public MixinSimpleRegistry(RegistryKey<? extends Registry<T>> registryKey, Lifecycle lifecycle) {
super(registryKey, lifecycle);
@@ -59,19 +59,27 @@ public RegistryKey<Registry<T>> getRegistryKey() {

@Accessor("field_26682")
@Override
public abstract ObjectList<T> getAllEntries();
public abstract ObjectList<T> getRawIdToEntry();

@Accessor("field_26683")
@Override
public abstract Object2IntMap<T> getEntryIds();
public abstract Object2IntMap<T> getEntryToRawId();

@Accessor
@Accessor("entriesById")
@Override
public abstract BiMap<Identifier, T> getIdToEntry();

@Accessor("entriesByKey")
@Override
public abstract BiMap<RegistryKey<T>, T> getKeyToEntry();

@Accessor("field_26731")
@Override
public abstract BiMap<Identifier, T> getEntriesById();
public abstract Map<T, Lifecycle> getEntryToLifecycle();

@Accessor
@Override
public abstract BiMap<RegistryKey<T>, T> getEntriesByKey();
public abstract void setRandomEntries(Object[] randomEntries);

@Override
public Set<RegistryKey<T>> getRealEntries() {
Original file line number Diff line number Diff line change
@@ -49,6 +49,7 @@ public void doRegistryMutation(boolean reAddMissingValues) {
}

protected void modifyPacketLists() {
//noinspection ConstantConditions
INetworkState networkState = (INetworkState) (Object) NetworkState.PLAY;
networkState.getPacketHandlers().values().forEach(IPacketHandler::multiconnect_clear);

@@ -109,7 +110,7 @@ private <T> void postMutateRegistry(Registry<T> registry, boolean reAddMissingVa
if (registry instanceof DefaultedRegistry) return;
DefaultRegistries<T> defaultRegistries = (DefaultRegistries<T>) DefaultRegistries.DEFAULT_REGISTRIES.get(registry);
if (defaultRegistries == null) return;
for (Map.Entry<Identifier, T> entry : defaultRegistries.defaultEntriesById.entrySet()) {
for (Map.Entry<Identifier, T> entry : defaultRegistries.defaultIdToEntry.entrySet()) {
if (registry.getId(entry.getValue()) == null) {
RegistryKey<T> key = RegistryKey.of(iregistry.getRegistryKey(), entry.getKey());
iregistry.register(entry.getValue(), iregistry.getNextId(), key, false);
@@ -167,10 +168,11 @@ public void postTranslateChunk(ChunkDataTranslator translator, ChunkData data) {
}

private static class DefaultPackets {
private static List<PacketInfo<?>> CLIENTBOUND = new ArrayList<>();
private static List<PacketInfo<?>> SERVERBOUND = new ArrayList<>();
private static final List<PacketInfo<?>> CLIENTBOUND = new ArrayList<>();
private static final List<PacketInfo<?>> SERVERBOUND = new ArrayList<>();

private static void initialize() {
//noinspection ConstantConditions
Map<NetworkSide, ? extends IPacketHandler<?>> packetHandlerMap = ((INetworkState) (Object) NetworkState.PLAY).getPacketHandlers();
IPacketHandler<?> clientPacketMap = packetHandlerMap.get(NetworkSide.CLIENTBOUND);
CLIENTBOUND.addAll(clientPacketMap.multiconnect_values());
Original file line number Diff line number Diff line change
@@ -2,6 +2,7 @@

import com.google.common.collect.BiMap;
import com.google.common.collect.HashBiMap;
import com.mojang.serialization.Lifecycle;
import it.unimi.dsi.fastutil.objects.*;
import net.earthcomputer.multiconnect.impl.Utils;
import net.earthcomputer.multiconnect.mixin.bridge.SpawnEggItemAccessor;
@@ -27,23 +28,25 @@ public class DefaultRegistries<T> {
private static final Map<EntityType<?>, SpawnEggItem> DEFAULT_SPAWN_EGG_ITEMS = new IdentityHashMap<>();
private static final Int2ObjectBiMap<TrackedDataHandler<?>> DEFAULT_TRACKED_DATA_HANDLERS = new Int2ObjectBiMap<>(16);

public final ObjectList<T> defaultAllEntries = new ObjectArrayList<>(256);
public final Object2IntMap<T> defaultEntryIds = new Object2IntOpenCustomHashMap<>(Util.identityHashStrategy());
public final BiMap<Identifier, T> defaultEntriesById = HashBiMap.create();
private final BiMap<RegistryKey<T>, T> defaultEntriesByKey = HashBiMap.create();
public final ObjectList<T> defaultRawIdToEntry = new ObjectArrayList<>(256);
public final Object2IntMap<T> defaultEntryToRawId = new Object2IntOpenCustomHashMap<>(Util.identityHashStrategy());
public final BiMap<Identifier, T> defaultIdToEntry = HashBiMap.create();
private final BiMap<RegistryKey<T>, T> defaultKeyToEntry = HashBiMap.create();
private final Map<T, Lifecycle> defaultEntryToLifecycle = new IdentityHashMap<>();
private final int defaultNextId;

private DefaultRegistries(Registry<T> registry) {
for (T t : registry) {
int rawId = registry.getRawId(t);
while (rawId >= defaultAllEntries.size()) {
defaultAllEntries.add(null);
while (rawId >= defaultRawIdToEntry.size()) {
defaultRawIdToEntry.add(null);
}
defaultAllEntries.set(rawId, t);
defaultEntryIds.put(t, rawId);
defaultEntriesById.put(registry.getId(t), t);
defaultRawIdToEntry.set(rawId, t);
defaultEntryToRawId.put(t, rawId);
defaultIdToEntry.put(registry.getId(t), t);
assert registry.getKey(t).isPresent();
defaultEntriesByKey.put(registry.getKey(t).get(), t);
defaultKeyToEntry.put(registry.getKey(t).get(), t);
defaultEntryToLifecycle.put(t, ((ISimpleRegistry<?>) registry).getEntryToLifecycle().get(t));
}
defaultNextId = ((ISimpleRegistry<?>) registry).getNextId();
}
@@ -52,25 +55,29 @@ public void restore(SimpleRegistry<T> registry) {
@SuppressWarnings("unchecked") ISimpleRegistry<T> iregistry = (ISimpleRegistry<T>) registry;

List<T> added = new ArrayList<>();
for (T thing : defaultAllEntries) {
if (!iregistry.getEntriesById().containsValue(thing)) {
for (T thing : defaultRawIdToEntry) {
if (!iregistry.getIdToEntry().containsValue(thing)) {
added.add(thing);
}
}
List<T> removed = new ArrayList<>();
for (T thing : registry) {
if (!defaultEntriesById.containsValue(thing)) {
if (!defaultIdToEntry.containsValue(thing)) {
removed.add(thing);
}
}

iregistry.getAllEntries().clear();
iregistry.getAllEntries().addAll(defaultAllEntries);
iregistry.getEntryIds().putAll(defaultEntryIds);
iregistry.getEntriesById().clear();
iregistry.getEntriesById().putAll(defaultEntriesById);
iregistry.getEntriesByKey().clear();
iregistry.getEntriesByKey().putAll(defaultEntriesByKey);
iregistry.getRawIdToEntry().clear();
iregistry.getRawIdToEntry().addAll(defaultRawIdToEntry);
iregistry.getEntryToRawId().clear();
iregistry.getEntryToRawId().putAll(defaultEntryToRawId);
iregistry.getIdToEntry().clear();
iregistry.getIdToEntry().putAll(defaultIdToEntry);
iregistry.getKeyToEntry().clear();
iregistry.getKeyToEntry().putAll(defaultKeyToEntry);
iregistry.getEntryToLifecycle().clear();
iregistry.getEntryToLifecycle().putAll(defaultEntryToLifecycle);
iregistry.setRandomEntries(null);
iregistry.setNextId(defaultNextId);
iregistry.onRestore(added, removed);
}
Original file line number Diff line number Diff line change
@@ -1,13 +1,15 @@
package net.earthcomputer.multiconnect.protocols.generic;

import com.google.common.collect.BiMap;
import com.mojang.serialization.Lifecycle;
import it.unimi.dsi.fastutil.objects.Object2IntMap;
import it.unimi.dsi.fastutil.objects.ObjectList;
import net.minecraft.util.Identifier;
import net.minecraft.util.registry.Registry;
import net.minecraft.util.registry.RegistryKey;
import net.minecraft.util.registry.SimpleRegistry;

import java.util.Map;
import java.util.Set;

public interface ISimpleRegistry<T> {
@@ -18,13 +20,17 @@ public interface ISimpleRegistry<T> {

RegistryKey<Registry<T>> getRegistryKey();

ObjectList<T> getAllEntries();
ObjectList<T> getRawIdToEntry();

Object2IntMap<T> getEntryIds();
Object2IntMap<T> getEntryToRawId();

BiMap<Identifier, T> getEntriesById();
BiMap<Identifier, T> getIdToEntry();

BiMap<RegistryKey<T>, T> getEntriesByKey();
BiMap<RegistryKey<T>, T> getKeyToEntry();

Map<T, Lifecycle> getEntryToLifecycle();

void setRandomEntries(Object[] randomEntries);

Set<RegistryKey<T>> getRealEntries();

0 comments on commit 60b787d

Please sign in to comment.