diff --git a/README.md b/README.md index fb8c37d..a060e7d 100644 --- a/README.md +++ b/README.md @@ -13,8 +13,9 @@ ## Features - **DivineMC is a fork of [Purpur](https://github.com/PurpurMC/Purpur)** designed for configurability, new fun and exciting gameplay features. +- **Contains [Lithium](https://github.com/CaffeineMC/lithium-fabric) patches** that optimizing many areas in game. +- **Contains** some PaperMC pull requests patches. - **Bug fixes** for several Minecraft issues. -- **Contains** PaperMC pull requests patches. - **Plugin compatibility** with Spigot & Paper plugins. ## Downloads @@ -34,4 +35,5 @@ In order to distribute and use this server software, you need a paperclip file: Patches are licensed under GPL-3.0. All other files are licensed under MIT. -###### And we don't steal logo from YatopiaMC!!! +###### And we don't steal logo from YatopiaMC! [List of all forks](https://gist.github.com/SoSeDiK/1773ef2c239722f7083a25b2f78619ed) +###### diff --git a/patches/server/0033-Replace-shape-full-block-cache-with-hashtable.patch b/patches/server/0033-Replace-shape-full-block-cache-with-hashtable.patch new file mode 100644 index 0000000..aae8511 --- /dev/null +++ b/patches/server/0033-Replace-shape-full-block-cache-with-hashtable.patch @@ -0,0 +1,115 @@ +From 0000000000000000000000000000000000000000 Mon Sep 17 00:00:00 2001 +From: NONPLAYT <76615486+NONPLAYT@users.noreply.github.com> +Date: Wed, 12 Apr 2023 00:45:28 +0300 +Subject: [PATCH] Replace shape full block cache with hashtable + +This patch is based on the following mixins and classes: +* "me/jellysquid/mods/lithium/common/util/collections/Object2BooleanCacheTable.java" +* "me/jellysquid/mods/lithium/mixin/shapes/blockstate_cache/BlockMixin.java" + +diff --git a/src/main/java/me/jellysquid/mods/lithium/common/util/collections/Object2BooleanCacheTable.java b/src/main/java/me/jellysquid/mods/lithium/common/util/collections/Object2BooleanCacheTable.java +new file mode 100644 +index 0000000000000000000000000000000000000000..0a6ab285cb870cfff7cc6a3115353457903965cd +--- /dev/null ++++ b/src/main/java/me/jellysquid/mods/lithium/common/util/collections/Object2BooleanCacheTable.java +@@ -0,0 +1,60 @@ ++package me.jellysquid.mods.lithium.common.util.collections; ++ ++import it.unimi.dsi.fastutil.HashCommon; ++import net.minecraft.util.Mth; ++ ++import java.util.function.Predicate; ++ ++/** ++ * A lossy hashtable implementation that stores a mapping between an object and a boolean. ++ *

++ * Any hash collisions will result in an overwrite: this is safe because the correct value can always be recomputed, ++ * given that the given operator is deterministic. ++ *

++ * This implementation is safe to use from multiple threads ++ */ ++public final class Object2BooleanCacheTable { ++ ++ private final int mask; ++ private final Node[] nodes; ++ private final Predicate operator; ++ ++ @SuppressWarnings("unchecked") ++ public Object2BooleanCacheTable(int capacity, Predicate operator) { ++ int capacity1 = Mth.smallestEncompassingPowerOfTwo(capacity); ++ this.mask = capacity1 - 1; ++ this.nodes = (Node[]) new Node[capacity1]; ++ this.operator = operator; ++ } ++ ++ private static int hash(T key) { ++ return HashCommon.mix(key.hashCode()); ++ } ++ ++ public boolean get(T key) { ++ int idx = hash(key) & this.mask; ++ ++ Node node = this.nodes[idx]; ++ if (node != null && key.equals(node.key)) { ++ return node.value; ++ } ++ ++ boolean test = this.operator.test(key); ++ this.nodes[idx] = new Node<>(key, test); ++ ++ return test; ++ } ++ ++ static class Node { ++ ++ final T key; ++ final boolean value; ++ ++ Node(T key, boolean value) { ++ this.key = key; ++ this.value = value; ++ } ++ ++ } ++ ++} +\ No newline at end of file +diff --git a/src/main/java/net/minecraft/world/level/block/Block.java b/src/main/java/net/minecraft/world/level/block/Block.java +index cc4a2bafc319fb54e8d1168cba85746c5dfafbc2..39121b8450c645f3ec003751f0716a9b102a7e5b 100644 +--- a/src/main/java/net/minecraft/world/level/block/Block.java ++++ b/src/main/java/net/minecraft/world/level/block/Block.java +@@ -62,6 +62,7 @@ import net.minecraft.world.phys.shapes.BooleanOp; + import net.minecraft.world.phys.shapes.Shapes; + import net.minecraft.world.phys.shapes.VoxelShape; + import org.slf4j.Logger; ++import me.jellysquid.mods.lithium.common.util.collections.Object2BooleanCacheTable; + + // Purpur start + import net.minecraft.nbt.CompoundTag; +@@ -75,11 +76,12 @@ public class Block extends BlockBehaviour implements ItemLike { + private static final Logger LOGGER = LogUtils.getLogger(); + private final Holder.Reference builtInRegistryHolder; + public static final IdMapper BLOCK_STATE_REGISTRY = new IdMapper<>(); +- private static final LoadingCache SHAPE_FULL_BLOCK_CACHE = CacheBuilder.newBuilder().maximumSize(512L).weakKeys().build(new CacheLoader() { +- public Boolean load(VoxelShape voxelshape) { +- return !Shapes.joinIsNotEmpty(Shapes.block(), voxelshape, BooleanOp.NOT_SAME); +- } +- }); ++ // DivineMC start - Replace shape full block cache with hashtable ++ private static final Object2BooleanCacheTable SHAPE_FULL_BLOCK_CACHE = new Object2BooleanCacheTable<>( ++ 1536, ++ shape -> !Shapes.joinIsNotEmpty(Shapes.block(), shape, BooleanOp.NOT_SAME) ++ ); ++ // DivineMC end + public static final int UPDATE_NEIGHBORS = 1; + public static final int UPDATE_CLIENTS = 2; + public static final int UPDATE_INVISIBLE = 4; +@@ -290,7 +292,7 @@ public class Block extends BlockBehaviour implements ItemLike { + } + + public static boolean isShapeFullBlock(VoxelShape shape) { +- return (Boolean) Block.SHAPE_FULL_BLOCK_CACHE.getUnchecked(shape); ++ return Block.SHAPE_FULL_BLOCK_CACHE.get(shape); // DivineMC end - Replace shape full block cache with hashtable + } + + public boolean propagatesSkylightDown(BlockState state, BlockGetter world, BlockPos pos) {