1
0
mirror of https://github.com/SquidDev-CC/CC-Tweaked synced 2025-02-09 23:50:04 +00:00

Make our registry wrapper implement IdMap

This allows us to use some of the byte-buffer helper methods directly
with our registries, rather than rolling our own helpers.
This commit is contained in:
Jonathan Coates 2023-07-19 20:17:24 +01:00
parent eef05b9854
commit 1b88213eca
No known key found for this signature in database
GPG Key ID: B9E431FF07C98D06
5 changed files with 28 additions and 35 deletions

View File

@ -44,12 +44,12 @@ public class ArgumentUtils {
@SuppressWarnings("unchecked") @SuppressWarnings("unchecked")
private static <A extends ArgumentType<?>, T extends ArgumentTypeInfo.Template<A>> void serializeToNetwork(FriendlyByteBuf buffer, ArgumentTypeInfo<A, T> type, ArgumentTypeInfo.Template<A> template) { private static <A extends ArgumentType<?>, T extends ArgumentTypeInfo.Template<A>> void serializeToNetwork(FriendlyByteBuf buffer, ArgumentTypeInfo<A, T> type, ArgumentTypeInfo.Template<A> template) {
RegistryWrappers.writeId(buffer, RegistryWrappers.COMMAND_ARGUMENT_TYPES, type); buffer.writeId(RegistryWrappers.COMMAND_ARGUMENT_TYPES, type);
type.serializeToNetwork((T) template, buffer); type.serializeToNetwork((T) template, buffer);
} }
public static ArgumentTypeInfo.Template<?> deserialize(FriendlyByteBuf buffer) { public static ArgumentTypeInfo.Template<?> deserialize(FriendlyByteBuf buffer) {
var type = RegistryWrappers.readId(buffer, RegistryWrappers.COMMAND_ARGUMENT_TYPES); var type = buffer.readById(RegistryWrappers.COMMAND_ARGUMENT_TYPES);
Objects.requireNonNull(type, "Unknown argument type"); Objects.requireNonNull(type, "Unknown argument type");
return type.deserializeFromNetwork(buffer); return type.deserializeFromNetwork(buffer);
} }

View File

@ -5,6 +5,7 @@
package dan200.computercraft.shared.platform; package dan200.computercraft.shared.platform;
import net.minecraft.commands.synchronization.ArgumentTypeInfo; import net.minecraft.commands.synchronization.ArgumentTypeInfo;
import net.minecraft.core.IdMap;
import net.minecraft.core.Registry; import net.minecraft.core.Registry;
import net.minecraft.core.registries.Registries; import net.minecraft.core.registries.Registries;
import net.minecraft.network.FriendlyByteBuf; import net.minecraft.network.FriendlyByteBuf;
@ -36,9 +37,7 @@ public final class RegistryWrappers {
public static final RegistryWrapper<RecipeSerializer<?>> RECIPE_SERIALIZERS = PlatformHelper.get().wrap(Registries.RECIPE_SERIALIZER); public static final RegistryWrapper<RecipeSerializer<?>> RECIPE_SERIALIZERS = PlatformHelper.get().wrap(Registries.RECIPE_SERIALIZER);
public static final RegistryWrapper<MenuType<?>> MENU = PlatformHelper.get().wrap(Registries.MENU); public static final RegistryWrapper<MenuType<?>> MENU = PlatformHelper.get().wrap(Registries.MENU);
public interface RegistryWrapper<T> extends Iterable<T> { public interface RegistryWrapper<T> extends IdMap<T> {
int getId(T object);
ResourceLocation getKey(T object); ResourceLocation getKey(T object);
T get(ResourceLocation location); T get(ResourceLocation location);
@ -46,8 +45,6 @@ public final class RegistryWrappers {
@Nullable @Nullable
T tryGet(ResourceLocation location); T tryGet(ResourceLocation location);
T get(int id);
default Stream<T> stream() { default Stream<T> stream() {
return StreamSupport.stream(spliterator(), false); return StreamSupport.stream(spliterator(), false);
} }
@ -56,15 +53,6 @@ public final class RegistryWrappers {
private RegistryWrappers() { private RegistryWrappers() {
} }
public static <K> void writeId(FriendlyByteBuf buf, RegistryWrapper<K> registry, K object) {
buf.writeVarInt(registry.getId(object));
}
public static <K> K readId(FriendlyByteBuf buf, RegistryWrapper<K> registry) {
var id = buf.readVarInt();
return registry.get(id);
}
public static <K> void writeKey(FriendlyByteBuf buf, RegistryWrapper<K> registry, K object) { public static <K> void writeKey(FriendlyByteBuf buf, RegistryWrapper<K> registry, K object) {
buf.writeResourceLocation(registry.getKey(object)); buf.writeResourceLocation(registry.getKey(object));
} }

View File

@ -17,6 +17,8 @@ import net.minecraft.util.GsonHelper;
import net.minecraft.world.item.ItemStack; import net.minecraft.world.item.ItemStack;
import net.minecraft.world.level.block.Block; import net.minecraft.world.level.block.Block;
import java.util.Objects;
public final class TurtleToolSerialiser implements TurtleUpgradeSerialiser<TurtleTool> { public final class TurtleToolSerialiser implements TurtleUpgradeSerialiser<TurtleTool> {
public static final TurtleToolSerialiser INSTANCE = new TurtleToolSerialiser(); public static final TurtleToolSerialiser INSTANCE = new TurtleToolSerialiser();
@ -44,7 +46,8 @@ public final class TurtleToolSerialiser implements TurtleUpgradeSerialiser<Turtl
@Override @Override
public TurtleTool fromNetwork(ResourceLocation id, FriendlyByteBuf buffer) { public TurtleTool fromNetwork(ResourceLocation id, FriendlyByteBuf buffer) {
var adjective = buffer.readUtf(); var adjective = buffer.readUtf();
var craftingItem = RegistryWrappers.readId(buffer, RegistryWrappers.ITEMS); var craftingItem = buffer.readById(RegistryWrappers.ITEMS);
Objects.requireNonNull(craftingItem, "Unknown crafting item");
var toolItem = buffer.readItem(); var toolItem = buffer.readItem();
// damageMultiplier and breakable aren't used by the client, but we need to construct the upgrade exactly // damageMultiplier and breakable aren't used by the client, but we need to construct the upgrade exactly
// as otherwise syncing on an SP world will overwrite the (shared) upgrade registry with an invalid upgrade! // as otherwise syncing on an SP world will overwrite the (shared) upgrade registry with an invalid upgrade!
@ -59,7 +62,7 @@ public final class TurtleToolSerialiser implements TurtleUpgradeSerialiser<Turtl
@Override @Override
public void toNetwork(FriendlyByteBuf buffer, TurtleTool upgrade) { public void toNetwork(FriendlyByteBuf buffer, TurtleTool upgrade) {
buffer.writeUtf(upgrade.getUnlocalisedAdjective()); buffer.writeUtf(upgrade.getUnlocalisedAdjective());
RegistryWrappers.writeId(buffer, RegistryWrappers.ITEMS, upgrade.getCraftingItem().getItem()); buffer.writeId(RegistryWrappers.ITEMS, upgrade.getCraftingItem().getItem());
buffer.writeItem(upgrade.item); buffer.writeItem(upgrade.item);
buffer.writeFloat(upgrade.damageMulitiplier); buffer.writeFloat(upgrade.damageMulitiplier);
buffer.writeBoolean(upgrade.allowEnchantments); buffer.writeBoolean(upgrade.allowEnchantments);

View File

@ -337,9 +337,7 @@ public class PlatformHelperImpl implements PlatformHelper {
) implements RegistryWrappers.RegistryWrapper<T> { ) implements RegistryWrappers.RegistryWrapper<T> {
@Override @Override
public int getId(T object) { public int getId(T object) {
var id = registry.getId(object); return registry.getId(object);
if (id == -1) throw new IllegalArgumentException(object + " was not registered in " + name);
return id;
} }
@Override @Override
@ -363,10 +361,13 @@ public class PlatformHelperImpl implements PlatformHelper {
} }
@Override @Override
public T get(int id) { public @Nullable T byId(int id) {
var object = registry.byId(id); return registry.byId(id);
if (object == null) throw new IllegalArgumentException(id + " was not registered in " + name); }
return object;
@Override
public int size() {
return registry.size();
} }
@Override @Override

View File

@ -359,9 +359,7 @@ public class PlatformHelperImpl implements PlatformHelper {
) implements RegistryWrappers.RegistryWrapper<T> { ) implements RegistryWrappers.RegistryWrapper<T> {
@Override @Override
public int getId(T object) { public int getId(T object) {
var id = registry.getID(object); return registry.getID(object);
if (id == -1) throw new IllegalStateException(object + " was not registered in " + name);
return id;
} }
@Override @Override
@ -385,10 +383,13 @@ public class PlatformHelperImpl implements PlatformHelper {
} }
@Override @Override
public T get(int id) { public @Nullable T byId(int id) {
var object = registry.getValue(id); return registry.getValue(id);
if (object == null) throw new IllegalStateException(id + " was not registered in " + name); }
return object;
@Override
public int size() {
return registry.getKeys().size();
} }
@Override @Override