diff --git a/divinemc-server/minecraft-patches/sources/net/minecraft/server/commands/LocateCommand.java.patch b/divinemc-server/minecraft-patches/sources/net/minecraft/server/commands/LocateCommand.java.patch new file mode 100644 index 0000000..b512477 --- /dev/null +++ b/divinemc-server/minecraft-patches/sources/net/minecraft/server/commands/LocateCommand.java.patch @@ -0,0 +1,16 @@ +--- a/net/minecraft/server/commands/LocateCommand.java ++++ b/net/minecraft/server/commands/LocateCommand.java +@@ -200,8 +_,10 @@ + } + + private static float dist(int x1, int z1, int x2, int z2) { +- int i = x2 - x1; +- int i1 = z2 - z1; +- return Mth.sqrt(i * i + i1 * i1); ++ // DivineMC start - Fix MC-177381 ++ double i = x2 - x1; ++ double j = z2 - z1; ++ return (float) Math.hypot(i, j); ++ // DivineMC end + } + } diff --git a/divinemc-server/minecraft-patches/sources/net/minecraft/server/level/ServerPlayer.java.patch b/divinemc-server/minecraft-patches/sources/net/minecraft/server/level/ServerPlayer.java.patch new file mode 100644 index 0000000..349a5fe --- /dev/null +++ b/divinemc-server/minecraft-patches/sources/net/minecraft/server/level/ServerPlayer.java.patch @@ -0,0 +1,10 @@ +--- a/net/minecraft/server/level/ServerPlayer.java ++++ b/net/minecraft/server/level/ServerPlayer.java +@@ -2239,6 +_,7 @@ + this.connection.send(new ClientboundGameEventPacket(ClientboundGameEventPacket.CHANGE_GAME_MODE, gameMode.getId())); + if (gameMode == GameType.SPECTATOR) { + this.removeEntitiesOnShoulder(); ++ this.stopSleeping(); // DivineMC - Fix MC-119417 + this.stopRiding(); + EnchantmentHelper.stopLocationBasedEffects(this); + } else { diff --git a/divinemc-server/minecraft-patches/sources/net/minecraft/util/thread/BlockableEventLoop.java.patch b/divinemc-server/minecraft-patches/sources/net/minecraft/util/thread/BlockableEventLoop.java.patch new file mode 100644 index 0000000..e8a5a70 --- /dev/null +++ b/divinemc-server/minecraft-patches/sources/net/minecraft/util/thread/BlockableEventLoop.java.patch @@ -0,0 +1,21 @@ +--- a/net/minecraft/util/thread/BlockableEventLoop.java ++++ b/net/minecraft/util/thread/BlockableEventLoop.java +@@ -22,7 +_,7 @@ + import org.slf4j.Logger; + + public abstract class BlockableEventLoop implements ProfilerMeasured, TaskScheduler, Executor { +- public static final long BLOCK_TIME_NANOS = 100000L; ++ public static final long BLOCK_TIME_NANOS = 2000000L; // DivineMC - Fix MC-183518 + private final String name; + private static final Logger LOGGER = LogUtils.getLogger(); + private final Queue pendingRunnables = Queues.newConcurrentLinkedQueue(); +@@ -146,8 +_,7 @@ + } + + protected void waitForTasks() { +- Thread.yield(); +- LockSupport.parkNanos("waiting for tasks", 100000L); ++ LockSupport.parkNanos("waiting for tasks", 2000000L); // DivineMC - Fix MC-183518 + } + + protected void doRunTask(R task) { diff --git a/divinemc-server/minecraft-patches/sources/net/minecraft/world/entity/monster/ZombieVillager.java.patch b/divinemc-server/minecraft-patches/sources/net/minecraft/world/entity/monster/ZombieVillager.java.patch new file mode 100644 index 0000000..f2722ca --- /dev/null +++ b/divinemc-server/minecraft-patches/sources/net/minecraft/world/entity/monster/ZombieVillager.java.patch @@ -0,0 +1,15 @@ +--- a/net/minecraft/world/entity/monster/ZombieVillager.java ++++ b/net/minecraft/world/entity/monster/ZombieVillager.java +@@ -313,6 +_,12 @@ + if (!this.isSilent()) { + serverLevel.levelEvent(null, 1027, this.blockPosition(), 0); + } ++ ++ // DivineMC start - Fix MC-200418 ++ if (villager.isPassenger() && villager.getVehicle() instanceof net.minecraft.world.entity.animal.Chicken && villager.isBaby()) { ++ villager.removeVehicle(); ++ } ++ // DivineMC end - Fix MC-200418 + // CraftBukkit start + }, org.bukkit.event.entity.EntityTransformEvent.TransformReason.CURED, org.bukkit.event.entity.CreatureSpawnEvent.SpawnReason.CURED // CraftBukkit + ); diff --git a/divinemc-server/minecraft-patches/sources/net/minecraft/world/entity/vehicle/MinecartHopper.java.patch b/divinemc-server/minecraft-patches/sources/net/minecraft/world/entity/vehicle/MinecartHopper.java.patch new file mode 100644 index 0000000..d158030 --- /dev/null +++ b/divinemc-server/minecraft-patches/sources/net/minecraft/world/entity/vehicle/MinecartHopper.java.patch @@ -0,0 +1,16 @@ +--- a/net/minecraft/world/entity/vehicle/MinecartHopper.java ++++ b/net/minecraft/world/entity/vehicle/MinecartHopper.java +@@ -99,6 +_,13 @@ + } + } + ++ // DivineMC start - tick minecart hopper without players ++ @Override ++ public void inactiveTick() { ++ this.tick(); ++ } ++ // DivineMC end - tick minecart hopper without players ++ + public boolean suckInItems() { + if (HopperBlockEntity.suckInItems(this.level(), this)) { + this.immunize(); // Paper diff --git a/divinemc-server/minecraft-patches/sources/net/minecraft/world/level/Level.java.patch b/divinemc-server/minecraft-patches/sources/net/minecraft/world/level/Level.java.patch index 6ad3b76..3d38bc6 100644 --- a/divinemc-server/minecraft-patches/sources/net/minecraft/world/level/Level.java.patch +++ b/divinemc-server/minecraft-patches/sources/net/minecraft/world/level/Level.java.patch @@ -1,5 +1,17 @@ --- a/net/minecraft/world/level/Level.java +++ b/net/minecraft/world/level/Level.java +@@ -115,9 +_,9 @@ + public static final int TICKS_PER_DAY = 24000; + public static final int MAX_ENTITY_SPAWN_Y = 20000000; + public static final int MIN_ENTITY_SPAWN_Y = -20000000; +- public final List blockEntityTickers = Lists.newArrayList(); // Paper - public ++ public final List blockEntityTickers = new space.bxteam.divinemc.util.lithium.HashedReferenceList<>(Lists.newArrayList()); // Paper - public // DivineMC - lithium: hashed_list + protected final NeighborUpdater neighborUpdater; +- private final List pendingBlockEntityTickers = Lists.newArrayList(); ++ private final List pendingBlockEntityTickers = new space.bxteam.divinemc.util.lithium.HashedReferenceList<>(Lists.newArrayList()); // DivineMC - lithium: hashed_list + private boolean tickingBlockEntities; + public final Thread thread; + private final boolean isDebug; @@ -172,8 +_,6 @@ public final io.papermc.paper.antixray.ChunkPacketBlockController chunkPacketBlockController; // Paper - Anti-Xray public final org.purpurmc.purpur.PurpurWorldConfig purpurConfig; // Purpur - Purpur config files diff --git a/divinemc-server/minecraft-patches/sources/net/minecraft/world/level/block/Blocks.java.patch b/divinemc-server/minecraft-patches/sources/net/minecraft/world/level/block/Blocks.java.patch new file mode 100644 index 0000000..f340094 --- /dev/null +++ b/divinemc-server/minecraft-patches/sources/net/minecraft/world/level/block/Blocks.java.patch @@ -0,0 +1,10 @@ +--- a/net/minecraft/world/level/block/Blocks.java ++++ b/net/minecraft/world/level/block/Blocks.java +@@ -6630,6 +_,7 @@ + .mapColor(MapColor.COLOR_ORANGE) + .instrument(NoteBlockInstrument.BASEDRUM) + .requiresCorrectToolForDrops() ++ .sound(SoundType.COPPER) // DivineMC - Fix MC-223153 + .strength(5.0F, 6.0F) + ); + public static final Block RAW_GOLD_BLOCK = register( diff --git a/divinemc-server/src/main/java/space/bxteam/divinemc/util/lithium/HashedReferenceList.java b/divinemc-server/src/main/java/space/bxteam/divinemc/util/lithium/HashedReferenceList.java new file mode 100644 index 0000000..aafa3e5 --- /dev/null +++ b/divinemc-server/src/main/java/space/bxteam/divinemc/util/lithium/HashedReferenceList.java @@ -0,0 +1,281 @@ +package space.bxteam.divinemc.util.lithium; + +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(); + } + + @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/patches/server/0028-Make-minecart-hopper-work-without-players.patch b/patches/server/0028-Make-minecart-hopper-work-without-players.patch deleted file mode 100644 index f6c467d..0000000 --- a/patches/server/0028-Make-minecart-hopper-work-without-players.patch +++ /dev/null @@ -1,24 +0,0 @@ -From 0000000000000000000000000000000000000000 Mon Sep 17 00:00:00 2001 -From: NONPLAYT <76615486+NONPLAYT@users.noreply.github.com> -Date: Wed, 22 May 2024 23:26:51 +0300 -Subject: [PATCH] Make minecart hopper work without players - - -diff --git a/src/main/java/net/minecraft/world/entity/vehicle/MinecartHopper.java b/src/main/java/net/minecraft/world/entity/vehicle/MinecartHopper.java -index d81a6874e8b25f098df619f84c359e146c7f64de..1d2794b77ca71b1dd9abd1200860467be2c346d9 100644 ---- a/src/main/java/net/minecraft/world/entity/vehicle/MinecartHopper.java -+++ b/src/main/java/net/minecraft/world/entity/vehicle/MinecartHopper.java -@@ -99,6 +99,13 @@ public class MinecartHopper extends AbstractMinecartContainer implements Hopper - } - } - -+ // DivineMC start - tick minecart -+ @Override -+ public void inactiveTick() { -+ this.tick(); -+ } -+ // DivineMC end -+ - public boolean suckInItems() { - if (HopperBlockEntity.suckInItems(this.level(), this)) { - this.immunize(); // Paper diff --git a/patches/server/0042-Fix-MC-223153.patch b/patches/server/0042-Fix-MC-223153.patch deleted file mode 100644 index 0d4277f..0000000 --- a/patches/server/0042-Fix-MC-223153.patch +++ /dev/null @@ -1,20 +0,0 @@ -From 0000000000000000000000000000000000000000 Mon Sep 17 00:00:00 2001 -From: NONPLAYT <76615486+NONPLAYT@users.noreply.github.com> -Date: Thu, 11 Jul 2024 19:11:08 +0300 -Subject: [PATCH] Fix MC-223153 - -Original bug on Mojira: https://bugs.mojang.com/browse/MC-223153 -Took here: https://github.com/Winds-Studio/Leaf/blob/ver/1.21/patches/server/0083-Fix-MC-223153.patch - -diff --git a/src/main/java/net/minecraft/world/level/block/Blocks.java b/src/main/java/net/minecraft/world/level/block/Blocks.java -index c5f8227cd9631d98cc8404e3f6d6109a55c617aa..041013600b2b76c146d7f73e9429376ac09faf23 100644 ---- a/src/main/java/net/minecraft/world/level/block/Blocks.java -+++ b/src/main/java/net/minecraft/world/level/block/Blocks.java -@@ -6600,6 +6600,7 @@ public class Blocks { - .mapColor(MapColor.COLOR_ORANGE) - .instrument(NoteBlockInstrument.BASEDRUM) - .requiresCorrectToolForDrops() -+ .sound(SoundType.COPPER) // DivineMC - Fix MC-223153 - .strength(5.0F, 6.0F) - ); - public static final Block RAW_GOLD_BLOCK = register( diff --git a/patches/server/0043-Fix-MC-119417.patch b/patches/server/0043-Fix-MC-119417.patch deleted file mode 100644 index b6fc183..0000000 --- a/patches/server/0043-Fix-MC-119417.patch +++ /dev/null @@ -1,20 +0,0 @@ -From 0000000000000000000000000000000000000000 Mon Sep 17 00:00:00 2001 -From: NONPLAYT <76615486+NONPLAYT@users.noreply.github.com> -Date: Thu, 11 Jul 2024 19:12:14 +0300 -Subject: [PATCH] Fix MC-119417 - -Original bug on Mojira: https://bugs.mojang.com/browse/MC-119417 -Took here: https://github.com/Winds-Studio/Leaf/blob/ver/1.21/patches/server/0082-Fix-MC-119417.patch - -diff --git a/src/main/java/net/minecraft/server/level/ServerPlayer.java b/src/main/java/net/minecraft/server/level/ServerPlayer.java -index 6f39fd99ffb28d6c0267f4251c54af0c519289db..0da41d7b11ac98d4cbd059f48be75fb43012118e 100644 ---- a/src/main/java/net/minecraft/server/level/ServerPlayer.java -+++ b/src/main/java/net/minecraft/server/level/ServerPlayer.java -@@ -2487,6 +2487,7 @@ public class ServerPlayer extends net.minecraft.world.entity.player.Player imple - this.connection.send(new ClientboundGameEventPacket(ClientboundGameEventPacket.CHANGE_GAME_MODE, (float) gameMode.getId())); - if (gameMode == GameType.SPECTATOR) { - this.removeEntitiesOnShoulder(); -+ this.stopSleeping(); // DivineMC - Fix MC-119417 - this.stopRiding(); - EnchantmentHelper.stopLocationBasedEffects(this); - } else { diff --git a/patches/server/0044-Fix-MC-200418.patch b/patches/server/0044-Fix-MC-200418.patch deleted file mode 100644 index 569014e..0000000 --- a/patches/server/0044-Fix-MC-200418.patch +++ /dev/null @@ -1,25 +0,0 @@ -From 0000000000000000000000000000000000000000 Mon Sep 17 00:00:00 2001 -From: NONPLAYT <76615486+NONPLAYT@users.noreply.github.com> -Date: Thu, 11 Jul 2024 19:15:23 +0300 -Subject: [PATCH] Fix MC-200418 - -Original bug on Mojira: https://bugs.mojang.com/browse/MC-200418 -Took here: https://github.com/Winds-Studio/Leaf/blob/ver/1.21/patches/server/0081-Fix-MC-200418.patch - -diff --git a/src/main/java/net/minecraft/world/entity/monster/ZombieVillager.java b/src/main/java/net/minecraft/world/entity/monster/ZombieVillager.java -index bba3562bf316878e7b8ba6a138889d9583a1b0f6..7ce3a667b819c096257732d8505b1aae03b0a148 100644 ---- a/src/main/java/net/minecraft/world/entity/monster/ZombieVillager.java -+++ b/src/main/java/net/minecraft/world/entity/monster/ZombieVillager.java -@@ -330,6 +330,12 @@ public class ZombieVillager extends Zombie implements VillagerDataHolder { - if (!this.isSilent()) { - world.levelEvent((Player) null, 1027, this.blockPosition(), 0); - } -+ -+ // DivineMC start - Fix MC-200418 -+ if (entityvillager.isPassenger() && entityvillager.getVehicle() instanceof net.minecraft.world.entity.animal.Chicken && entityvillager.isBaby()) { -+ entityvillager.removeVehicle(); -+ } -+ // DivineMC end - // CraftBukkit start - }, EntityTransformEvent.TransformReason.CURED, CreatureSpawnEvent.SpawnReason.CURED); - if (converted == null) { diff --git a/patches/server/0047-Fix-MC-183518.patch b/patches/server/0047-Fix-MC-183518.patch deleted file mode 100644 index e5bd037..0000000 --- a/patches/server/0047-Fix-MC-183518.patch +++ /dev/null @@ -1,31 +0,0 @@ -From 0000000000000000000000000000000000000000 Mon Sep 17 00:00:00 2001 -From: NONPLAYT <76615486+NONPLAYT@users.noreply.github.com> -Date: Mon, 17 Jun 2024 17:15:13 +0300 -Subject: [PATCH] Fix MC-183518 - -Issue on Mojira: https://bugs.mojang.com/browse/MC-183518 -P.S. Btw, I took this fix from this PR - https://github.com/Winds-Studio/Leaf/pull/69 - -diff --git a/src/main/java/net/minecraft/util/thread/BlockableEventLoop.java b/src/main/java/net/minecraft/util/thread/BlockableEventLoop.java -index 9b706276dc5b5f55b966c5472c6c4e864342b916..e9f2b88058bea5841fa648dad32903af19293328 100644 ---- a/src/main/java/net/minecraft/util/thread/BlockableEventLoop.java -+++ b/src/main/java/net/minecraft/util/thread/BlockableEventLoop.java -@@ -22,7 +22,7 @@ import net.minecraft.util.profiling.metrics.ProfilerMeasured; - import org.slf4j.Logger; - - public abstract class BlockableEventLoop implements ProfilerMeasured, TaskScheduler, Executor { -- public static final long BLOCK_TIME_NANOS = 100000L; -+ public static final long BLOCK_TIME_NANOS = 2000000L; // DivineMC - Fix MC-183518 - private final String name; - private static final Logger LOGGER = LogUtils.getLogger(); - private final Queue pendingRunnables = Queues.newConcurrentLinkedQueue(); -@@ -145,8 +145,7 @@ public abstract class BlockableEventLoop implements Profiler - } - - protected void waitForTasks() { -- Thread.yield(); -- LockSupport.parkNanos("waiting for tasks", 100000L); -+ LockSupport.parkNanos("waiting for tasks", 2000000L); // DivineMC - Fix MC-183518 - } - - protected void doRunTask(R task) { diff --git a/patches/server/0054-Fix-MC-177381.patch b/patches/server/0054-Fix-MC-177381.patch deleted file mode 100644 index e53d6e6..0000000 --- a/patches/server/0054-Fix-MC-177381.patch +++ /dev/null @@ -1,25 +0,0 @@ -From 0000000000000000000000000000000000000000 Mon Sep 17 00:00:00 2001 -From: NONPLAYT <76615486+NONPLAYT@users.noreply.github.com> -Date: Mon, 16 Dec 2024 01:22:14 +0300 -Subject: [PATCH] Fix MC-177381 - -Original bug on Mojira https://bugs.mojang.com/browse/MC-177381 - -diff --git a/src/main/java/net/minecraft/server/commands/LocateCommand.java b/src/main/java/net/minecraft/server/commands/LocateCommand.java -index 2972f041eea95b92b37c2ab869f9f8ed3d142a27..894bc308d623be6afded9aceca9a85c3ec4ac66d 100644 ---- a/src/main/java/net/minecraft/server/commands/LocateCommand.java -+++ b/src/main/java/net/minecraft/server/commands/LocateCommand.java -@@ -196,8 +196,10 @@ public class LocateCommand { - } - - private static float dist(int x1, int y1, int x2, int y2) { -- int i = x2 - x1; -- int j = y2 - y1; -- return Mth.sqrt((float)(i * i + j * j)); -+ // DivineMC start - Fix MC-177381 -+ double i = x2 - x1; -+ double j = y2 - y1; -+ return (float) Math.hypot(i, j); -+ // DivineMC end - } - }