diff --git a/leaf-server/paper-patches/features/0022-Cache-CraftEntityType-minecraftToBukkit-convert.patch b/leaf-server/paper-patches/features/0022-Cache-CraftEntityType-minecraftToBukkit-convert.patch index 673cba45..1554059f 100644 --- a/leaf-server/paper-patches/features/0022-Cache-CraftEntityType-minecraftToBukkit-convert.patch +++ b/leaf-server/paper-patches/features/0022-Cache-CraftEntityType-minecraftToBukkit-convert.patch @@ -8,10 +8,10 @@ and the results are always same, thus there is no need to do the convert process Save ~0.16ms per tick, and improve 11660ms -> 60ms in around 1 hour. diff --git a/src/main/java/org/bukkit/craftbukkit/entity/CraftEntityType.java b/src/main/java/org/bukkit/craftbukkit/entity/CraftEntityType.java -index 47db4546242974a40f7fc1e34f237fd1f06d5f37..f73fa612a63f2a24646261988843fa8a6e7c3e04 100644 +index 47db4546242974a40f7fc1e34f237fd1f06d5f37..5efe81d85ffb91614308c442ec1afcff4c7855a9 100644 --- a/src/main/java/org/bukkit/craftbukkit/entity/CraftEntityType.java +++ b/src/main/java/org/bukkit/craftbukkit/entity/CraftEntityType.java -@@ -15,15 +15,25 @@ import org.bukkit.entity.EntityType; +@@ -15,14 +15,26 @@ import org.bukkit.entity.EntityType; public class CraftEntityType { @@ -33,8 +33,8 @@ index 47db4546242974a40f7fc1e34f237fd1f06d5f37..f73fa612a63f2a24646261988843fa8a Preconditions.checkArgument(bukkit != null); -- return bukkit; -+ return MINECRAFT_TO_BUKKIT_KEY_CACHE.put(minecraft, bukkit); // Leaf - Cache CraftEntityType#minecraftToBukkit convert ++ MINECRAFT_TO_BUKKIT_KEY_CACHE.put(minecraft, bukkit); // Leaf - Cache CraftEntityType#minecraftToBukkit convert ++ + return bukkit; } - private static final java.util.Map>> KEY_CACHE = java.util.Collections.synchronizedMap(new java.util.EnumMap<>(EntityType.class)); // Paper diff --git a/leaf-server/src/main/java/org/dreeam/leaf/config/modules/gameplay/MaxItemsStackCount.java b/leaf-server/src/main/java/org/dreeam/leaf/config/modules/gameplay/MaxItemsStackCount.java deleted file mode 100644 index 434a938c..00000000 --- a/leaf-server/src/main/java/org/dreeam/leaf/config/modules/gameplay/MaxItemsStackCount.java +++ /dev/null @@ -1,27 +0,0 @@ -package org.dreeam.leaf.config.modules.gameplay; - -import org.dreeam.leaf.config.ConfigModules; -import org.dreeam.leaf.config.EnumConfigCategory; - -public class MaxItemsStackCount extends ConfigModules { - - public String getBasePath() { - return EnumConfigCategory.GAMEPLAY.getBaseKeyName() + ".max-item-stack-count"; - } - - public static int maxItemStackCount = 0; - public static int maxContainerDestroyCount = 0; - - @Override - public void onLoaded() { - config.addCommentRegionBased(getBasePath(), - "Don't touch this unless you know what you are doing!", - "不要动该项, 除非你知道自己在做什么!"); - - maxItemStackCount = config.getInt(getBasePath() + ".max-dropped-items-stack-count", maxItemStackCount); - maxContainerDestroyCount = config.getInt(getBasePath() + ".max-container-destroy-count", maxContainerDestroyCount); - - if (maxItemStackCount < 0) maxItemStackCount = 0; - if (maxContainerDestroyCount < 0) maxContainerDestroyCount = 0; - } -} diff --git a/leaf-server/src/main/java/org/dreeam/leaf/config/modules/misc/HiddenItemComponents.java b/leaf-server/src/main/java/org/dreeam/leaf/config/modules/misc/HiddenItemComponents.java deleted file mode 100644 index 81f28d84..00000000 --- a/leaf-server/src/main/java/org/dreeam/leaf/config/modules/misc/HiddenItemComponents.java +++ /dev/null @@ -1,60 +0,0 @@ -package org.dreeam.leaf.config.modules.misc; - -import net.minecraft.core.Holder; -import net.minecraft.core.component.DataComponentType; -import net.minecraft.core.registries.BuiltInRegistries; -import net.minecraft.resources.ResourceLocation; -import org.dreeam.leaf.config.ConfigModules; -import org.dreeam.leaf.config.EnumConfigCategory; -import org.dreeam.leaf.config.LeafConfig; - -import java.util.ArrayList; -import java.util.List; -import java.util.Optional; - -public class HiddenItemComponents extends ConfigModules { - - public String getBasePath() { - return EnumConfigCategory.MISC.getBaseKeyName(); - } - - public static List> hiddenItemComponentTypes = List.of(); - - @Override - public void onLoaded() { - List list = config.getList(getBasePath() + ".hidden-item-components", new ArrayList<>(), config.pickStringRegionBased(""" - Controls whether specified component information is sent to clients. - This may break resource packs and mods that rely on this information. - It needs a component type list, incorrect things will not work. - You can fill it with ["custom_data"] to hide components of CUSTOM_DATA. - Also, it can avoid some frequent client animations. - NOTICE: You must know what you're filling in and how it works! It will handle all itemStacks!""", - """ - 控制哪些物品组件信息会被发送至客户端. - 可能会导致依赖物品组件的资源包/模组无法正常工作. - 该配置项接受一个物品组件列表, 格式不正确将不会启用. - 可以填入 ["custom_data"] 来隐藏自定义数据物品组件 CUSTOM_DATA. - 也可以避免一些客户端动画效果. - 注意: 你必须知道你填进去的是什么, 有什么用, 该项配置会处理所有的ItemStack!""")); - - List> types = new ArrayList<>(list.size()); - - for (String id : list) { - // Find and check - Optional>> optional = BuiltInRegistries.DATA_COMPONENT_TYPE.get(ResourceLocation.parse(id)); - - if (optional.isEmpty()) continue; - - DataComponentType type = optional.get().value(); - - if (type != null) { - types.add(type); - } else { - LeafConfig.LOGGER.warn("Unknown component type: {}", id); - } - } - - hiddenItemComponentTypes = types; - } - -} diff --git a/leaf-server/src/main/java/org/dreeam/leaf/util/HashedReferenceList.java b/leaf-server/src/main/java/org/dreeam/leaf/util/HashedReferenceList.java deleted file mode 100644 index 8c082074..00000000 --- a/leaf-server/src/main/java/org/dreeam/leaf/util/HashedReferenceList.java +++ /dev/null @@ -1,282 +0,0 @@ -package org.dreeam.leaf.util; - -import it.unimi.dsi.fastutil.objects.Reference2IntOpenHashMap; -import it.unimi.dsi.fastutil.objects.ReferenceArrayList; -import it.unimi.dsi.fastutil.objects.ReferenceOpenHashSet; -import org.jetbrains.annotations.NotNull; - -import java.util.Collection; -import java.util.Iterator; -import java.util.List; -import java.util.ListIterator; -import java.util.NoSuchElementException; - -/** - * Wraps a {@link List} with a hash table which provides O(1) lookups for {@link Collection#contains(Object)}. The type - * contained by this list must use reference-equality semantics. - */ -@SuppressWarnings("SuspiciousMethodCalls") -public class HashedReferenceList implements List { - private final ReferenceArrayList list; - private final Reference2IntOpenHashMap counter; - - public HashedReferenceList(List list) { - this.list = new ReferenceArrayList<>(); - this.list.addAll(list); - - this.counter = new Reference2IntOpenHashMap<>(); - this.counter.defaultReturnValue(0); - - for (T obj : this.list) { - this.counter.addTo(obj, 1); - } - } - - @Override - public int size() { - return this.list.size(); - } - - @Override - public boolean isEmpty() { - return this.list.isEmpty(); - } - - @Override - public boolean contains(Object o) { - return this.counter.containsKey(o); - } - - @Override - public Iterator iterator() { - return this.listIterator(); - } - - @Override - public Object[] toArray() { - return this.list.toArray(); - } - - @SuppressWarnings("SuspiciousToArrayCall") - @Override - public T1[] toArray(T1 @NotNull [] a) { - return this.list.toArray(a); - } - - @Override - public boolean add(T t) { - this.trackReferenceAdded(t); - - return this.list.add(t); - } - - @Override - public boolean remove(Object o) { - this.trackReferenceRemoved(o); - - return this.list.remove(o); - } - - @Override - public boolean containsAll(Collection c) { - for (Object obj : c) { - if (!this.counter.containsKey(obj)) { - return false; - } - } - - return true; - } - - @Override - public boolean addAll(Collection c) { - for (T obj : c) { - this.trackReferenceAdded(obj); - } - - return this.list.addAll(c); - } - - @Override - public boolean addAll(int index, Collection c) { - for (T obj : c) { - this.trackReferenceAdded(obj); - } - - return this.list.addAll(index, c); - } - - @Override - public boolean removeAll(@NotNull Collection c) { - if (this.size() >= 2 && c.size() > 4 && c instanceof List) { - //HashReferenceList uses reference equality, so using ReferenceOpenHashSet is fine - c = new ReferenceOpenHashSet<>(c); - } - this.counter.keySet().removeAll(c); - return this.list.removeAll(c); - } - - @Override - public boolean retainAll(@NotNull Collection c) { - this.counter.keySet().retainAll(c); - return this.list.retainAll(c); - } - - @Override - public void clear() { - this.counter.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 != element) { - if (prev != null) { - this.trackReferenceRemoved(prev); - } - - this.trackReferenceAdded(element); - } - - return prev; - } - - @Override - public void add(int index, T element) { - this.trackReferenceAdded(element); - - this.list.add(index, element); - } - - @Override - public T remove(int index) { - T prev = this.list.remove(index); - - if (prev != null) { - this.trackReferenceRemoved(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.listIterator(0); - } - - @Override - public ListIterator listIterator(int index) { - return new ListIterator<>() { - private final ListIterator inner = HashedReferenceList.this.list.listIterator(index); - - @Override - public boolean hasNext() { - return this.inner.hasNext(); - } - - @Override - public T next() { - return this.inner.next(); - } - - @Override - public boolean hasPrevious() { - return this.inner.hasPrevious(); - } - - @Override - public T previous() { - return this.inner.previous(); - } - - @Override - public int nextIndex() { - return this.inner.nextIndex(); - } - - @Override - public int previousIndex() { - return this.inner.previousIndex(); - } - - @Override - public void remove() { - int last = this.previousIndex(); - - if (last == -1) { - throw new NoSuchElementException(); - } - - T prev = HashedReferenceList.this.get(last); - - if (prev != null) { - HashedReferenceList.this.trackReferenceRemoved(prev); - } - - this.inner.remove(); - } - - @Override - public void set(T t) { - int last = this.previousIndex(); - - if (last == -1) { - throw new NoSuchElementException(); - } - - T prev = HashedReferenceList.this.get(last); - - if (prev != t) { - if (prev != null) { - HashedReferenceList.this.trackReferenceRemoved(prev); - } - - HashedReferenceList.this.trackReferenceAdded(t); - } - - this.inner.remove(); - } - - @Override - public void add(T t) { - HashedReferenceList.this.trackReferenceAdded(t); - - this.inner.add(t); - } - }; - } - - @Override - public List subList(int fromIndex, int toIndex) { - return this.list.subList(fromIndex, toIndex); - } - - private void trackReferenceAdded(T t) { - this.counter.addTo(t, 1); - } - - @SuppressWarnings("unchecked") - private void trackReferenceRemoved(Object o) { - if (this.counter.addTo((T) o, -1) <= 1) { - this.counter.removeInt(o); - } - } - -} diff --git a/leaf-server/src/main/java/org/dreeam/leaf/util/item/ItemStackObfuscator.java b/leaf-server/src/main/java/org/dreeam/leaf/util/item/ItemStackObfuscator.java deleted file mode 100644 index 55cc2528..00000000 --- a/leaf-server/src/main/java/org/dreeam/leaf/util/item/ItemStackObfuscator.java +++ /dev/null @@ -1,29 +0,0 @@ -package org.dreeam.leaf.util.item; - -import net.minecraft.core.component.DataComponentType; -import net.minecraft.world.item.ItemStack; -import org.dreeam.leaf.config.modules.misc.HiddenItemComponents; - -import java.util.List; - -public class ItemStackObfuscator { - - public static ItemStack stripMeta(final ItemStack itemStack, final boolean copyItemStack) { - if (itemStack.isEmpty() || itemStack.getComponentsPatch().isEmpty()) return itemStack; - - final ItemStack copy = copyItemStack ? itemStack.copy() : itemStack; - - // Get the types which need to hide - List> hiddenTypes = HiddenItemComponents.hiddenItemComponentTypes; - - if (hiddenTypes.isEmpty()) return copy; - - // Remove specified types - for (DataComponentType type : hiddenTypes) { - // Only remove, no others - copy.remove(type); - } - - return copy; - } -} diff --git a/todos.md b/todos.md index 9d7ead2a..ae351b21 100644 --- a/todos.md +++ b/todos.md @@ -9,7 +9,6 @@ - [ ] Add server full join config explaination to docs - [ ] leaf at - [ ] Add purpur config changes to docs moved config -- [ ] Check linear - [ ] Merge changes from Tramontane # Cleanup