aboutsummaryrefslogtreecommitdiffhomepage
path: root/Spigot-Server-Patches/0102-Faster-redstone-torch-rapid-clock-removal.patch
blob: 7aa9554cd72838ebf11e1c5ddc3b1b71ee384de5 (plain)
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
From 0000000000000000000000000000000000000000 Mon Sep 17 00:00:00 2001
From: Martin Panzer <postremus1996@googlemail.com>
Date: Mon, 23 May 2016 12:12:37 +0200
Subject: [PATCH] Faster redstone torch rapid clock removal

Only resize the the redstone torch list once, since resizing arrays / lists is costly

diff --git a/src/main/java/net/minecraft/world/level/World.java b/src/main/java/net/minecraft/world/level/World.java
index cad86b0273c05767f78bcb3bdfaa9ea01e26af4e..d8ab2e22a5c0144decb5c657a123cc61722fcbf5 100644
--- a/src/main/java/net/minecraft/world/level/World.java
+++ b/src/main/java/net/minecraft/world/level/World.java
@@ -44,6 +44,7 @@ import net.minecraft.world.level.biome.BiomeBase;
 import net.minecraft.world.level.biome.BiomeManager;
 import net.minecraft.world.level.block.Block;
 import net.minecraft.world.level.block.BlockFireAbstract;
+import net.minecraft.world.level.block.BlockRedstoneTorch;
 import net.minecraft.world.level.block.Blocks;
 import net.minecraft.world.level.block.entity.ITickable;
 import net.minecraft.world.level.block.entity.TileEntity;
@@ -142,6 +143,7 @@ public abstract class World implements GeneratorAccess, AutoCloseable {
     private org.spigotmc.TickLimiter tileLimiter;
     private int tileTickPosition;
     public final Map<Explosion.CacheKey, Float> explosionDensityCache = new HashMap<>(); // Paper - Optimize explosions
+    public java.util.ArrayDeque<BlockRedstoneTorch.RedstoneUpdateInfo> redstoneUpdateInfos; // Paper - Move from Map in BlockRedstoneTorch to here
 
     public CraftWorld getWorld() {
         return this.world;
diff --git a/src/main/java/net/minecraft/world/level/block/BlockRedstoneTorch.java b/src/main/java/net/minecraft/world/level/block/BlockRedstoneTorch.java
index 8142c0be2978d8975612488b17da9c2e25f3b5dd..6771c16b4228c1495950484422b73928f6184929 100644
--- a/src/main/java/net/minecraft/world/level/block/BlockRedstoneTorch.java
+++ b/src/main/java/net/minecraft/world/level/block/BlockRedstoneTorch.java
@@ -22,7 +22,7 @@ import org.bukkit.event.block.BlockRedstoneEvent; // CraftBukkit
 public class BlockRedstoneTorch extends BlockTorch {
 
     public static final BlockStateBoolean LIT = BlockProperties.r;
-    private static final Map<IBlockAccess, List<BlockRedstoneTorch.RedstoneUpdateInfo>> b = new WeakHashMap();
+    // Paper - Move the mapped list to World
 
     protected BlockRedstoneTorch(BlockBase.Info blockbase_info) {
         super(blockbase_info, ParticleParamRedstone.a);
@@ -69,11 +69,15 @@ public class BlockRedstoneTorch extends BlockTorch {
     @Override
     public void tickAlways(IBlockData iblockdata, WorldServer worldserver, BlockPosition blockposition, Random random) {
         boolean flag = this.a((World) worldserver, blockposition, iblockdata);
-        List list = (List) BlockRedstoneTorch.b.get(worldserver);
-
-        while (list != null && !list.isEmpty() && worldserver.getTime() - ((BlockRedstoneTorch.RedstoneUpdateInfo) list.get(0)).b > 60L) {
-            list.remove(0);
+        // Paper start
+        java.util.ArrayDeque<BlockRedstoneTorch.RedstoneUpdateInfo> redstoneUpdateInfos = worldserver.redstoneUpdateInfos;
+        if (redstoneUpdateInfos != null) {
+            BlockRedstoneTorch.RedstoneUpdateInfo curr;
+            while ((curr = redstoneUpdateInfos.peek()) != null && worldserver.getTime() - curr.getTime() > 60L) {
+                redstoneUpdateInfos.poll();
+            }
         }
+        // Paper end
 
         // CraftBukkit start
         org.bukkit.plugin.PluginManager manager = worldserver.getServer().getPluginManager();
@@ -138,9 +142,12 @@ public class BlockRedstoneTorch extends BlockTorch {
     }
 
     private static boolean a(World world, BlockPosition blockposition, boolean flag) {
-        List<BlockRedstoneTorch.RedstoneUpdateInfo> list = (List) BlockRedstoneTorch.b.computeIfAbsent(world, (iblockaccess) -> {
-            return Lists.newArrayList();
-        });
+        // Paper start
+        java.util.ArrayDeque<BlockRedstoneTorch.RedstoneUpdateInfo> list = world.redstoneUpdateInfos;
+        if (list == null) {
+            list = world.redstoneUpdateInfos = new java.util.ArrayDeque<>();
+        }
+
 
         if (flag) {
             list.add(new BlockRedstoneTorch.RedstoneUpdateInfo(blockposition.immutableCopy(), world.getTime()));
@@ -148,9 +155,9 @@ public class BlockRedstoneTorch extends BlockTorch {
 
         int i = 0;
 
-        for (int j = 0; j < list.size(); ++j) {
-            BlockRedstoneTorch.RedstoneUpdateInfo blockredstonetorch_redstoneupdateinfo = (BlockRedstoneTorch.RedstoneUpdateInfo) list.get(j);
-
+        for (java.util.Iterator<BlockRedstoneTorch.RedstoneUpdateInfo> iterator = list.iterator(); iterator.hasNext();) {
+            BlockRedstoneTorch.RedstoneUpdateInfo blockredstonetorch_redstoneupdateinfo = iterator.next();
+            // Paper end
             if (blockredstonetorch_redstoneupdateinfo.a.equals(blockposition)) {
                 ++i;
                 if (i >= 8) {
@@ -165,7 +172,7 @@ public class BlockRedstoneTorch extends BlockTorch {
     public static class RedstoneUpdateInfo {
 
         private final BlockPosition a;
-        private final long b;
+        private final long b; final long getTime() { return this.b; } // Paper - OBFHELPER
 
         public RedstoneUpdateInfo(BlockPosition blockposition, long i) {
             this.a = blockposition;