diff --git a/src/main/java/net/gensokyoreimagined/nitori/common/world/chunk/LithiumHashPalette.java b/src/main/java/net/gensokyoreimagined/nitori/common/world/chunk/LithiumHashPalette.java index 8d9d575..2edeaac 100644 --- a/src/main/java/net/gensokyoreimagined/nitori/common/world/chunk/LithiumHashPalette.java +++ b/src/main/java/net/gensokyoreimagined/nitori/common/world/chunk/LithiumHashPalette.java @@ -1,197 +1,199 @@ package net.gensokyoreimagined.nitori.common.world.chunk; -//import com.google.common.collect.ImmutableList; -//import it.unimi.dsi.fastutil.HashCommon; -//import it.unimi.dsi.fastutil.objects.Reference2IntMap; -//import it.unimi.dsi.fastutil.objects.Reference2IntOpenHashMap; -//import net.minecraft.network.FriendlyByteBuf; -//import net.minecraft.network.VarInt; -//import net.minecraft.core.IdMap; -//import net.minecraft.world.level.chunk.MissingPaletteEntryException; -//import net.minecraft.world.level.chunk.Palette; -//import net.minecraft.world.level.chunk.PaletteResize; -// -//import java.util.Arrays; -//import java.util.List; -//import java.util.function.Predicate; -// -//import static it.unimi.dsi.fastutil.Hash.FAST_LOAD_FACTOR; -// -///** -// * Generally provides better performance over the vanilla {@link net.minecraft.world.chunk.BiMapPalette} when calling -// * {@link LithiumHashPalette#index(Object)} through using a faster backing map and reducing pointer chasing. -// */ -//public class LithiumHashPalette implements Palette { -// private static final int ABSENT_VALUE = -1; -// -// private final IdMap idList; -// private final PaletteResize resizeHandler; -// private final int indexBits; -// -// private final Reference2IntMap table; -// private T[] entries; -// private int size = 0; -// -// public LithiumHashPalette(IdMap idList, PaletteResize resizeHandler, int indexBits, T[] entries, Reference2IntMap table, int size) { -// this.idList = idList; -// this.resizeHandler = resizeHandler; -// this.indexBits = indexBits; -// this.entries = entries; -// this.table = table; -// this.size = size; -// } -// -// public LithiumHashPalette(IdMap idList, int bits, PaletteResizeListener resizeHandler, List list) { -// this(idList, bits, resizeHandler); -// -// for (T t : list) { -// this.addEntry(t); -// } -// } -// -// @SuppressWarnings("unchecked") -// public LithiumHashPalette(IdMap idList, int bits, PaletteResizeListener resizeHandler) { -// this.idList = idList; -// this.indexBits = bits; -// this.resizeHandler = resizeHandler; -// -// int capacity = 1 << bits; -// -// this.entries = (T[]) new Object[capacity]; -// this.table = new Reference2IntOpenHashMap<>(capacity, FAST_LOAD_FACTOR); -// this.table.defaultReturnValue(ABSENT_VALUE); -// } -// -// @Override -// public int index(T obj) { -// int id = this.table.getInt(obj); -// -// if (id == ABSENT_VALUE) { -// id = this.computeEntry(obj); -// } -// -// return id; -// } -// -// @Override -// public boolean hasAny(Predicate predicate) { -// for (int i = 0; i < this.size; ++i) { -// if (predicate.test(this.entries[i])) { -// return true; -// } -// } -// -// return false; -// } -// -// private int computeEntry(T obj) { -// int id = this.addEntry(obj); -// -// if (id >= 1 << this.indexBits) { -// if (this.resizeHandler == null) { -// throw new IllegalStateException("Cannot grow"); -// } else { -// id = this.resizeHandler.onResize(this.indexBits + 1, obj); -// } -// } -// -// return id; -// } -// -// private int addEntry(T obj) { -// int nextId = this.size; -// -// if (nextId >= this.entries.length) { -// this.resize(this.size); -// } -// -// this.table.put(obj, nextId); -// this.entries[nextId] = obj; -// -// this.size++; -// -// return nextId; -// } -// -// private void resize(int neededCapacity) { -// this.entries = Arrays.copyOf(this.entries, HashCommon.nextPowerOfTwo(neededCapacity + 1)); -// } -// -// @Override -// public T get(int id) { -// T[] entries = this.entries; -// -// T entry = null; -// if (id >= 0 && id < entries.length) { -// entry = entries[id]; -// } -// -// if (entry != null) { -// return entry; -// } else { -// throw new MissingPaletteEntryException(id); -// } -// } -// -// @Override -// public void readPacket(FriendlyByteBuf buf) { -// this.clear(); -// -// int entryCount = buf.readVarInt(); -// -// for (int i = 0; i < entryCount; ++i) { -// this.addEntry(this.idList.get(buf.readVarInt())); -// } -// } -// -// @Override -// public void writePacket(FriendlyByteBuf buf) { -// int size = this.size; -// buf.writeVarInt(size); -// -// for (int i = 0; i < size; ++i) { -// buf.writeVarInt(this.idList.getRawId(this.get(i))); -// } -// } -// -// @Override -// public int getPacketSize() { -// int size = VarInt.getSizeInBytes(this.size); -// -// for (int i = 0; i < this.size; ++i) { -// size += VarInt.getSizeInBytes(this.idList.getRawId(this.get(i))); -// } -// -// return size; -// } -// -// @Override -// public int getSize() { -// return this.size; -// } -// -// @Override -// public Palette copy() { -// return new LithiumHashPalette<>(this.idList, this.resizeHandler, this.indexBits, this.entries.clone(), new Reference2IntOpenHashMap<>(this.table), this.size); -// } -// -// private void clear() { -// Arrays.fill(this.entries, null); -// this.table.clear(); -// this.size = 0; -// } -// -// public List getElements() { -// ImmutableList.Builder builder = new ImmutableList.Builder<>(); -// for (T entry : this.entries) { -// if (entry != null) { -// builder.add(entry); -// } -// } -// return builder.build(); -// } -// -// public static Palette create(int bits, IdMap idList, PaletteResizeListener listener, List list) { -// return new LithiumHashPalette<>(idList, bits, listener, list); -// } -//} \ No newline at end of file +import com.google.common.collect.ImmutableList; +import it.unimi.dsi.fastutil.HashCommon; +import it.unimi.dsi.fastutil.objects.Reference2IntMap; +import it.unimi.dsi.fastutil.objects.Reference2IntOpenHashMap; +import net.gensokyoreimagined.nitori.mixin.chunk.palette.PaletteResizeAccessor; +import net.minecraft.network.FriendlyByteBuf; +import net.minecraft.network.VarInt; +import net.minecraft.core.IdMap; +import net.minecraft.world.level.chunk.MissingPaletteEntryException; +import net.minecraft.world.level.chunk.Palette; +import org.jetbrains.annotations.NotNull; + +import java.util.Arrays; +import java.util.List; +import java.util.function.Predicate; + +import static it.unimi.dsi.fastutil.Hash.FAST_LOAD_FACTOR; + +/** +* Generally provides better performance over the vanilla {@link net.minecraft.world.level.chunk.HashMapPalette} when calling +* {@link LithiumHashPalette#idFor(Object)} through using a faster backing map and reducing pointer chasing. +*/ +public class LithiumHashPalette implements Palette { + private static final int ABSENT_VALUE = -1; + + private final IdMap idList; + // private final PaletteResize resizeHandler; + private final PaletteResizeAccessor resizeHandler; + private final int indexBits; + + private final Reference2IntMap table; + private T[] entries; + private int size = 0; + + public LithiumHashPalette(IdMap idList, PaletteResizeAccessor resizeHandler, int indexBits, T[] entries, Reference2IntMap table, int size) { + this.idList = idList; + this.resizeHandler = resizeHandler; + this.indexBits = indexBits; + this.entries = entries; + this.table = table; + this.size = size; + } + + public LithiumHashPalette(IdMap idList, int bits, PaletteResizeAccessor resizeHandler, List list) { + this(idList, bits, resizeHandler); + + for (T t : list) { + this.addEntry(t); + } + } + + @SuppressWarnings("unchecked") + public LithiumHashPalette(IdMap idList, int bits, PaletteResizeAccessor resizeHandler) { + this.idList = idList; + this.indexBits = bits; + this.resizeHandler = resizeHandler; + + int capacity = 1 << bits; + + this.entries = (T[]) new Object[capacity]; + this.table = new Reference2IntOpenHashMap<>(capacity, FAST_LOAD_FACTOR); + this.table.defaultReturnValue(ABSENT_VALUE); + } + + @Override + public int idFor(T obj) { + int id = this.table.getInt(obj); + + if (id == ABSENT_VALUE) { + id = this.computeEntry(obj); + } + + return id; + } + + @Override + public boolean maybeHas(Predicate predicate) { + for (int i = 0; i < this.size; ++i) { + if (predicate.test(this.entries[i])) { + return true; + } + } + + return false; + } + + private int computeEntry(T obj) { + int id = this.addEntry(obj); + + if (id >= 1 << this.indexBits) { + if (this.resizeHandler == null) { + throw new IllegalStateException("Cannot grow"); + } else { + id = this.resizeHandler.callOnResize(this.indexBits + 1, obj); + } + } + + return id; + } + + private int addEntry(T obj) { + int nextId = this.size; + + if (nextId >= this.entries.length) { + this.resize(this.size); + } + + this.table.put(obj, nextId); + this.entries[nextId] = obj; + + this.size++; + + return nextId; + } + + private void resize(int neededCapacity) { + this.entries = Arrays.copyOf(this.entries, HashCommon.nextPowerOfTwo(neededCapacity + 1)); + } + + @Override + public @NotNull T valueFor(int id) { + T[] entries = this.entries; + + T entry = null; + if (id >= 0 && id < entries.length) { + entry = entries[id]; + } + + if (entry != null) { + return entry; + } else { + throw new MissingPaletteEntryException(id); + } + } + + @Override + public void read(FriendlyByteBuf buf) { + this.clear(); + + int entryCount = buf.readVarInt(); + + for (int i = 0; i < entryCount; ++i) { + this.addEntry(this.idList.byId(buf.readVarInt())); + } + } + + @Override + public void write(FriendlyByteBuf buf) { + int size = this.size; + buf.writeVarInt(size); + + for (int i = 0; i < size; ++i) { + buf.writeVarInt(this.idList.getId(this.valueFor(i))); + } + } + + @Override + public int getSerializedSize() { + int size = VarInt.getByteSize(this.size); + + for (int i = 0; i < this.size; ++i) { + size += VarInt.getByteSize(this.idList.getId(this.valueFor(i))); + } + + return size; + } + + @Override + public int getSize() { + return this.size; + } + + @Override + public Palette copy() { + return new LithiumHashPalette<>(this.idList, this.resizeHandler, this.indexBits, this.entries.clone(), new Reference2IntOpenHashMap<>(this.table), this.size); + } + + private void clear() { + Arrays.fill(this.entries, null); + this.table.clear(); + this.size = 0; + } + + public List getElements() { + ImmutableList.Builder builder = new ImmutableList.Builder<>(); + for (T entry : this.entries) { + if (entry != null) { + builder.add(entry); + } + } + return builder.build(); + } + + public static Palette create(int bits, IdMap idList, PaletteResizeAccessor listener, List list) { + return new LithiumHashPalette<>(idList, bits, listener, list); + } +} \ No newline at end of file diff --git a/src/main/java/net/gensokyoreimagined/nitori/mixin/alloc/enum_values/living_entity/LivingEntityMixin.java b/src/main/java/net/gensokyoreimagined/nitori/mixin/alloc/enum_values/living_entity/LivingEntityMixin.java index e858d18..df5e6c3 100644 --- a/src/main/java/net/gensokyoreimagined/nitori/mixin/alloc/enum_values/living_entity/LivingEntityMixin.java +++ b/src/main/java/net/gensokyoreimagined/nitori/mixin/alloc/enum_values/living_entity/LivingEntityMixin.java @@ -1,23 +1,23 @@ package net.gensokyoreimagined.nitori.mixin.alloc.enum_values.living_entity; -//import net.gensokyoreimagined.nitori.common.util.EquipmentSlotConstants; -//import net.minecraft.world.entity.EquipmentSlot; -//import net.minecraft.world.entity.LivingEntity; -//import org.spongepowered.asm.mixin.Mixin; -//import org.spongepowered.asm.mixin.injection.At; -//import org.spongepowered.asm.mixin.injection.Redirect; -// -//@Mixin(LivingEntity.class) -//public class LivingEntityMixin { -// -// @Redirect( -// method = "collectEquipmentChanges()Ljava/util/Map;", -// at = @At( -// value = "INVOKE", -// target = "Lnet/minecraft/world/entity/LivingEntity;equipmentHasChanged(Lnet/minecraft/world/item/ItemStack;Lnet/minecraft/world/item/ItemStack;)Z" -// ) -// ) -// private EquipmentSlot[] removeAllocation() { -// return EquipmentSlotConstants.ALL; -// } -//} \ No newline at end of file +import net.gensokyoreimagined.nitori.common.util.EquipmentSlotConstants; +import net.minecraft.world.entity.EquipmentSlot; +import net.minecraft.world.entity.LivingEntity; +import org.spongepowered.asm.mixin.Mixin; +import org.spongepowered.asm.mixin.injection.At; +import org.spongepowered.asm.mixin.injection.Redirect; + +@Mixin(LivingEntity.class) +public class LivingEntityMixin { + + @Redirect( + method = "collectEquipmentChanges()Ljava/util/Map;", + at = @At( + value = "INVOKE", + target = "Lnet/minecraft/world/entity/EquipmentSlot;values()[Lnet/minecraft/world/entity/EquipmentSlot;" + ) + ) + private EquipmentSlot[] removeAllocation() { + return EquipmentSlotConstants.ALL; + } +} \ No newline at end of file diff --git a/src/main/java/net/gensokyoreimagined/nitori/mixin/alloc/nbt/NbtCompoundMixin.java b/src/main/java/net/gensokyoreimagined/nitori/mixin/alloc/nbt/NbtCompoundMixin.java deleted file mode 100644 index 712d7e0..0000000 --- a/src/main/java/net/gensokyoreimagined/nitori/mixin/alloc/nbt/NbtCompoundMixin.java +++ /dev/null @@ -1,90 +0,0 @@ -package net.gensokyoreimagined.nitori.mixin.alloc.nbt; - -//import com.google.common.collect.Maps; -//import it.unimi.dsi.fastutil.objects.Object2ObjectOpenHashMap; -//import net.minecraft.nbt.CompoundTag; -//import net.minecraft.nbt.Tag; -//import org.spongepowered.asm.mixin.Final; -//import org.spongepowered.asm.mixin.Mixin; -//import org.spongepowered.asm.mixin.Overwrite; -//import org.spongepowered.asm.mixin.Shadow; -//import org.spongepowered.asm.mixin.injection.At; -//import org.spongepowered.asm.mixin.injection.ModifyArg; -//import org.spongepowered.asm.mixin.injection.ModifyVariable; -//import org.spongepowered.asm.mixin.injection.Redirect; -// -//import java.util.HashMap; -//import java.util.Map; -// -///** -// * Use {@link Object2ObjectOpenHashMap} instead of {@link HashMap} to reduce NBT memory consumption and improve -// * iteration speed. -// * -// * @author Maity -// */ -//@Mixin(CompoundTag.class) -//public class CompoundTagMixin { -// -// @Shadow -// @Final -// private Map entries; -// -// @ModifyArg( -// method = "()V", -// at = @At(value = "INVOKE", target = "Lnet/minecraft/nbt/CompoundTag;(Ljava/util/Map;)V") -// ) -// private static Map useFasterCollection(Map oldMap) { -// return new Object2ObjectOpenHashMap<>(); -// } -// -// @Redirect( -// method = "()V", -// at = @At( -// value = "INVOKE", -// target = "Lcom/google/common/collect/Maps;newHashMap()Ljava/util/HashMap;", -// remap = false -// ) -// ) -// private static HashMap removeOldMapAlloc() { -// return null; -// } -// -// /** -// * @reason Use faster collection -// * @author Maity -// */ -// @Overwrite -// public CompoundTag copy() { -// // [VanillaCopy] HashMap is replaced with Object2ObjectOpenHashMap -// var map = new Object2ObjectOpenHashMap<>(Maps.transformValues(this.entries, Tag::copy)); -// return new CompoundTag(map); -// } -// -// @Mixin(targets = "net.minecraft.nbt.CompoundTag$1") -// static class Type { -// -// @ModifyVariable( -// method = "loadCompound", -// at = @At( -// value = "INVOKE_ASSIGN", -// target = "Lcom/google/common/collect/Maps;newHashMap()Ljava/util/HashMap;", -// remap = false -// ) -// ) -// private static Map useFasterCollection(Map map) { -// return new Object2ObjectOpenHashMap<>(); -// } -// -// @Redirect( -// method = "loadCompound", -// at = @At( -// value = "INVOKE", -// target = "Lcom/google/common/collect/Maps;newHashMap()Ljava/util/HashMap;", -// remap = false -// ) -// ) -// private static HashMap removeOldMapAlloc() { -// return null; -// } -// } -//} \ No newline at end of file diff --git a/src/main/java/net/gensokyoreimagined/nitori/mixin/chunk/palette/PaletteResizeAccessor.java b/src/main/java/net/gensokyoreimagined/nitori/mixin/chunk/palette/PaletteResizeAccessor.java new file mode 100644 index 0000000..b84feb3 --- /dev/null +++ b/src/main/java/net/gensokyoreimagined/nitori/mixin/chunk/palette/PaletteResizeAccessor.java @@ -0,0 +1,10 @@ +package net.gensokyoreimagined.nitori.mixin.chunk.palette; + +import org.spongepowered.asm.mixin.Mixin; +import org.spongepowered.asm.mixin.gen.Invoker; + +@Mixin(targets = "net.minecraft.world.level.chunk.PaletteResize") +public abstract class PaletteResizeAccessor { + @Invoker + public abstract int callOnResize(int newBits, T object); +} diff --git a/src/main/java/net/gensokyoreimagined/nitori/mixin/chunk/palette/PalettedContainerConfigurationMixin.java b/src/main/java/net/gensokyoreimagined/nitori/mixin/chunk/palette/PalettedContainerConfigurationMixin.java new file mode 100644 index 0000000..9076a67 --- /dev/null +++ b/src/main/java/net/gensokyoreimagined/nitori/mixin/chunk/palette/PalettedContainerConfigurationMixin.java @@ -0,0 +1,19 @@ +package net.gensokyoreimagined.nitori.mixin.chunk.palette; + +// import net.minecraft.core.IdMap; +// import net.minecraft.world.level.chunk.Palette; +// import net.minecraft.world.level.chunk.PaletteResize; +// import net.minecraft.world.level.chunk.PalettedContainer; +// import org.spongepowered.asm.mixin.Mixin; +// import org.spongepowered.asm.mixin.gen.Invoker; +// +// @Mixin(targets = "net.minecraft.world.level.chunk.PalettedContainer.Configuration") +// public abstract class PalettedContainerConfigurationMixin { +// @Invoker("(Lnet/minecraft/world/level/chunk/Palette$Factory;I)V") +// public static PalettedContainerConfigurationMixin create(Palette.Factory factory, int bits) { +// throw new AssertionError("mukyu~!"); +// } +// +// @Invoker +// public abstract PalettedContainer.Data createData(IdMap idList, PaletteResize listener, int size); +// } diff --git a/src/main/java/net/gensokyoreimagined/nitori/mixin/chunk/palette/PalettedContainerMixin.java b/src/main/java/net/gensokyoreimagined/nitori/mixin/chunk/palette/PalettedContainerMixin.java index 4f4f52f..409e5b9 100644 --- a/src/main/java/net/gensokyoreimagined/nitori/mixin/chunk/palette/PalettedContainerMixin.java +++ b/src/main/java/net/gensokyoreimagined/nitori/mixin/chunk/palette/PalettedContainerMixin.java @@ -1,197 +1,89 @@ package net.gensokyoreimagined.nitori.mixin.chunk.palette; -//import com.google.common.collect.ImmutableList; -//import it.unimi.dsi.fastutil.HashCommon; -//import it.unimi.dsi.fastutil.objects.Reference2IntMap; -//import it.unimi.dsi.fastutil.objects.Reference2IntOpenHashMap; -//import net.minecraft.network.PacketByteBuf; -//import net.minecraft.network.encoding.VarInts; -//import net.minecraft.util.collection.IndexedIterable; -//import net.minecraft.world.chunk.EntryMissingException; -//import net.minecraft.world.chunk.Palette; -//import net.minecraft.world.chunk.PaletteResizeListener; +// import net.gensokyoreimagined.nitori.common.world.chunk.LithiumHashPalette; +// import net.minecraft.core.IdMap; +// import net.minecraft.world.level.chunk.PalettedContainer; +// import org.jetbrains.annotations.NotNull; +// import org.spongepowered.asm.mixin.*; +// import net.minecraft.world.level.chunk.Palette; // -//import java.util.Arrays; -//import java.util.List; -//import java.util.function.Predicate; +// import static net.minecraft.world.level.chunk.PalettedContainer.Strategy.LINEAR_PALETTE_FACTORY; +// import static net.minecraft.world.level.chunk.PalettedContainer.Strategy.SINGLE_VALUE_PALETTE_FACTORY; // -//import static it.unimi.dsi.fastutil.Hash.FAST_LOAD_FACTOR; +// @Mixin(PalettedContainer.Strategy.class) +// public abstract class PalettedContainerMixin { +// @Mutable +// @Shadow +// @Final +// public static PalettedContainer.Strategy SECTION_STATES; // -///** -// * Generally provides better performance over the vanilla {@link net.minecraft.world.chunk.BiMapPalette} when calling -// * {@link LithiumHashPalette#index(Object)} through using a faster backing map and reducing pointer chasing. -// */ -//public class LithiumHashPalette implements Palette { -// private static final int ABSENT_VALUE = -1; +// @Unique +// private static final PalettedContainerConfigurationMixin[] BLOCKSTATE_DATA_PROVIDERS; +// @Unique +// private static final PalettedContainerConfigurationMixin[] BIOME_DATA_PROVIDERS; // -// private final IndexedIterable idList; -// private final PaletteResizeListener resizeHandler; -// private final int indexBits; // -// private final Reference2IntMap table; -// private T[] entries; -// private int size = 0; +// @Unique +// private static final Palette.Factory HASH = LithiumHashPalette::create; +// @Mutable +// @Shadow +// @Final +// public static PalettedContainer.Strategy SECTION_BIOMES; +// @Shadow +// @Final +// static Palette.Factory GLOBAL_PALETTE_FACTORY; // -// public LithiumHashPalette(IndexedIterable idList, PaletteResizeListener resizeHandler, int indexBits, T[] entries, Reference2IntMap table, int size) { -// this.idList = idList; -// this.resizeHandler = resizeHandler; -// this.indexBits = indexBits; -// this.entries = entries; -// this.table = table; -// this.size = size; -// } +// /* +// * @reason Replace the hash palette from vanilla with our own and change the threshold for usage to only 3 bits, +// * as our implementation performs better at smaller key ranges. +// * @author JellySquid, 2No2Name (avoid Configuration duplication, use hash palette for 3 bit biomes) +// */ +// static { +// Palette.Factory idListFactory = GLOBAL_PALETTE_FACTORY; // -// public LithiumHashPalette(IndexedIterable idList, int bits, PaletteResizeListener resizeHandler, List list) { -// this(idList, bits, resizeHandler); +// PalettedContainerConfigurationMixin arrayConfiguration4bit = PalettedContainerConfigurationMixin.create(LINEAR_PALETTE_FACTORY, 4); +// PalettedContainerConfigurationMixin hashConfiguration4bit = PalettedContainerConfigurationMixin.create(HASH, 4); +// BLOCKSTATE_DATA_PROVIDERS = new PalettedContainerConfigurationMixin[]{ +// PalettedContainerConfigurationMixin.create(SINGLE_VALUE_PALETTE_FACTORY, 0), +// // Bits 1-4 must all pass 4 bits as parameter, otherwise chunk sections will corrupt. +// arrayConfiguration4bit, +// arrayConfiguration4bit, +// hashConfiguration4bit, +// hashConfiguration4bit, +// PalettedContainerConfigurationMixin.create(HASH, 5), +// PalettedContainerConfigurationMixin.create(HASH, 6), +// PalettedContainerConfigurationMixin.create(HASH, 7), +// PalettedContainerConfigurationMixin.create(HASH, 8) +// }; // -// for (T t : list) { -// this.addEntry(t); -// } -// } +// SECTION_STATES = new PalettedContainer.Strategy(4) { +// @Override +// public @NotNull PalettedContainerConfigurationMixin getConfiguration(@NotNull IdMap idList, int bits) { +// if (bits >= 0 && bits < BLOCKSTATE_DATA_PROVIDERS.length) { +// //noinspection unchecked +// return (PalettedContainerConfigurationMixin) BLOCKSTATE_DATA_PROVIDERS[bits]; +// } +// return PalettedContainerConfigurationMixin.create(idListFactory, MathHelper.ceilLog2(idList.size())); +// } +// }; // -// @SuppressWarnings("unchecked") -// public LithiumHashPalette(IndexedIterable idList, int bits, PaletteResizeListener resizeHandler) { -// this.idList = idList; -// this.indexBits = bits; -// this.resizeHandler = resizeHandler; +// BIOME_DATA_PROVIDERS = new PalettedContainerConfigurationMixin[]{ +// PalettedContainerConfigurationMixin.create(SINGLE_VALUE_PALETTE_FACTORY, 0), +// PalettedContainerConfigurationMixin.create(LINEAR_PALETTE_FACTORY, 1), +// PalettedContainerConfigurationMixin.create(LINEAR_PALETTE_FACTORY, 2), +// PalettedContainerConfigurationMixin.create(HASH, 3) +// }; // -// int capacity = 1 << bits; // -// this.entries = (T[]) new Object[capacity]; -// this.table = new Reference2IntOpenHashMap<>(capacity, FAST_LOAD_FACTOR); -// this.table.defaultReturnValue(ABSENT_VALUE); -// } -// -// @Override -// public int index(T obj) { -// int id = this.table.getInt(obj); -// -// if (id == ABSENT_VALUE) { -// id = this.computeEntry(obj); -// } -// -// return id; -// } -// -// @Override -// public boolean hasAny(Predicate predicate) { -// for (int i = 0; i < this.size; ++i) { -// if (predicate.test(this.entries[i])) { -// return true; -// } -// } -// -// return false; -// } -// -// private int computeEntry(T obj) { -// int id = this.addEntry(obj); -// -// if (id >= 1 << this.indexBits) { -// if (this.resizeHandler == null) { -// throw new IllegalStateException("Cannot grow"); -// } else { -// id = this.resizeHandler.onResize(this.indexBits + 1, obj); -// } -// } -// -// return id; -// } -// -// private int addEntry(T obj) { -// int nextId = this.size; -// -// if (nextId >= this.entries.length) { -// this.resize(this.size); -// } -// -// this.table.put(obj, nextId); -// this.entries[nextId] = obj; -// -// this.size++; -// -// return nextId; -// } -// -// private void resize(int neededCapacity) { -// this.entries = Arrays.copyOf(this.entries, HashCommon.nextPowerOfTwo(neededCapacity + 1)); -// } -// -// @Override -// public T get(int id) { -// T[] entries = this.entries; -// -// T entry = null; -// if (id >= 0 && id < entries.length) { -// entry = entries[id]; -// } -// -// if (entry != null) { -// return entry; -// } else { -// throw new EntryMissingException(id); -// } -// } -// -// @Override -// public void readPacket(PacketByteBuf buf) { -// this.clear(); -// -// int entryCount = buf.readVarInt(); -// -// for (int i = 0; i < entryCount; ++i) { -// this.addEntry(this.idList.get(buf.readVarInt())); -// } -// } -// -// @Override -// public void writePacket(PacketByteBuf buf) { -// int size = this.size; -// buf.writeVarInt(size); -// -// for (int i = 0; i < size; ++i) { -// buf.writeVarInt(this.idList.getRawId(this.get(i))); -// } -// } -// -// @Override -// public int getPacketSize() { -// int size = VarInts.getSizeInBytes(this.size); -// -// for (int i = 0; i < this.size; ++i) { -// size += VarInts.getSizeInBytes(this.idList.getRawId(this.get(i))); -// } -// -// return size; -// } -// -// @Override -// public int getSize() { -// return this.size; -// } -// -// @Override -// public Palette copy() { -// return new LithiumHashPalette<>(this.idList, this.resizeHandler, this.indexBits, this.entries.clone(), new Reference2IntOpenHashMap<>(this.table), this.size); -// } -// -// private void clear() { -// Arrays.fill(this.entries, null); -// this.table.clear(); -// this.size = 0; -// } -// -// public List getElements() { -// ImmutableList.Builder builder = new ImmutableList.Builder<>(); -// for (T entry : this.entries) { -// if (entry != null) { -// builder.add(entry); -// } -// } -// return builder.build(); -// } -// -// public static Palette create(int bits, IndexedIterable idList, PaletteResizeListener listener, List list) { -// return new LithiumHashPalette<>(idList, bits, listener, list); -// } -//} \ No newline at end of file +// SECTION_BIOMES = new PalettedContainer.Strategy(2) { +// @Override +// public @NotNull PalettedContainerConfigurationMixin getConfiguration(@NotNull IdMap idList, int bits) { +// if (bits >= 0 && bits < BIOME_DATA_PROVIDERS.length) { +// //noinspection unchecked +// return (PalettedContainerConfigurationMixin) BIOME_DATA_PROVIDERS[bits]; +// } +// return PalettedContainerConfigurationMixin.create(idListFactory, MathHelper.ceilLog2(idList.size())); +// } +// }; +// } +// } \ No newline at end of file diff --git a/src/main/resources/mixins.core.json b/src/main/resources/mixins.core.json index 038501c..97149fb 100755 --- a/src/main/resources/mixins.core.json +++ b/src/main/resources/mixins.core.json @@ -67,6 +67,8 @@ "util.block_tracking.AbstractBlockStateMixin", "playerwatching.MixinChunkFilter", "playerwatching.MixinServerPlayerEntity", - "playerwatching.optimize_nearby_player_lookups.MixinMobEntity" + "playerwatching.optimize_nearby_player_lookups.MixinMobEntity", + "alloc.enum_values.living_entity.LivingEntityMixin", + "chunk.palette.PaletteResizeAccessor", ] }