From 0000000000000000000000000000000000000000 Mon Sep 17 00:00:00 2001 From: JellySquid Date: Fri, 31 Jul 2020 21:46:32 -0500 Subject: [PATCH] lithium MixinBiome Original code by JellySquid, licensed under GNU Lesser General Public License v3.0 you can find the original code on https://github.com/jellysquid3/lithium-fabric/tree/1.16.x/fabric (Yarn mappings) diff --git a/src/main/java/me/jellysquid/mods/lithium/common/util/collections/HashedList.java b/src/main/java/me/jellysquid/mods/lithium/common/util/collections/HashedList.java new file mode 100644 index 0000000000000000000000000000000000000000..15cc7232e4edf6803e4b831ff094a748f95e1f9a --- /dev/null +++ b/src/main/java/me/jellysquid/mods/lithium/common/util/collections/HashedList.java @@ -0,0 +1,171 @@ +package me.jellysquid.mods.lithium.common.util.collections; + +import java.util.Collection; +import java.util.HashSet; +import java.util.Iterator; +import java.util.List; +import java.util.ListIterator; +import java.util.Set; + +/** + * Wraps a {@link List} with a hash table which provides O(1) lookups for {@link Collection#contains(Object)}. + * + * @see HashedList + */ +public class HashedList implements List { + private final List list; + private final Set set; + + private HashedList(List list, Set set) { + this.list = list; + this.set = set; + } + + @Override + public int size() { + return this.list.size(); + } + + @Override + public boolean isEmpty() { + return this.list.isEmpty(); + } + + @Override + public boolean contains(Object o) { + return this.set.contains(o); + } + + @Override + public Iterator iterator() { + return this.list.iterator(); + } + + @Override + public Object[] toArray() { + return this.list.toArray(); + } + + @Override + public T1[] toArray(T1[] a) { + return this.list.toArray(a); + } + + @Override + public boolean add(T t) { + this.set.add(t); + + return this.list.add(t); + } + + @Override + public boolean remove(Object o) { + this.set.remove(o); + + return this.list.remove(o); + } + + @Override + public boolean containsAll(Collection c) { + return this.set.containsAll(c); + } + + @Override + public boolean addAll(Collection c) { + this.set.addAll(c); + + return this.list.addAll(c); + } + + @Override + public boolean addAll(int index, Collection c) { + this.set.addAll(c); + + return this.list.addAll(index, c); + } + + @Override + public boolean removeAll(Collection c) { + this.set.removeAll(c); + + return this.list.removeAll(c); + } + + @Override + public boolean retainAll(Collection c) { + this.set.retainAll(c); + + return this.list.retainAll(c); + } + + @Override + public void clear() { + this.set.clear(); + this.list.clear(); + } + + @Override + public T get(int index) { + return this.list.get(index); + } + + @Override + public T set(int index, T element) { + T prev = this.list.set(index, element); + + if (prev != null) { + this.set.remove(prev); + } + + this.set.add(element); + + return prev; + } + + @Override + public void add(int index, T element) { + this.set.add(element); + + this.list.add(index, element); + } + + @Override + public T remove(int index) { + T prev = this.list.remove(index); + + if (prev != null) { + this.set.remove(prev); + } + + return prev; + } + + @Override + public int indexOf(Object o) { + return this.list.indexOf(o); + } + + @Override + public int lastIndexOf(Object o) { + return this.list.lastIndexOf(o); + } + + @Override + public ListIterator listIterator() { + return this.list.listIterator(); + } + + @Override + public ListIterator listIterator(int index) { + return this.list.listIterator(index); + } + + @Override + public List subList(int fromIndex, int toIndex) { + return this.list.subList(fromIndex, toIndex); + } + + public static HashedList wrapper(List list) { + return new HashedList<>(list, new HashSet<>(list)); // Yatopia - use hashset + } +} diff --git a/src/main/java/net/minecraft/server/BiomeSettingsMobs.java b/src/main/java/net/minecraft/server/BiomeSettingsMobs.java index a18ca3f0001a771f21012bd39711f581efb2fef0..0f88b7b38b6191c3adbebdee82427275640c4197 100644 --- a/src/main/java/net/minecraft/server/BiomeSettingsMobs.java +++ b/src/main/java/net/minecraft/server/BiomeSettingsMobs.java @@ -113,7 +113,7 @@ public class BiomeSettingsMobs { private final Map> a = (Map) Stream.of(EnumCreatureType.values()).collect(Maps.toImmutableEnumMap((enumcreaturetype) -> { return enumcreaturetype; }, (enumcreaturetype) -> { - return new MobList(); // Use MobList instead of ArrayList + return me.jellysquid.mods.lithium.common.util.collections.HashedList.wrapper(new MobList()); // Use MobList instead of ArrayList // Yatopia - hashedlist })); // Paper end private final Map, BiomeSettingsMobs.b> b = Maps.newLinkedHashMap();