mirror of
https://github.com/PlayPro/CoreProtect.git
synced 2026-10-28 09:44:56 +00:00
Skip block entity snapshots on the dispenser logging path (#1007)
Every dispense copied the dispenser's block entity twice on the region thread (block.getState() in the dispense listeners and inventory.getHolder() in onInventoryInteract), and both copies were only used for their type, location and live inventory. Paper can hand out non-snapshot states for this, so the dispense path now asks for those through a new PaperInterface.getBlockState(Block, boolean), falling back to a normal snapshot on Spigot.
This commit is contained in:
1 parent
bba6f9f522
commit
96eec2b768
6 files changed
+31
-3
No files matched your search
@@ -24,6 +24,7 @@ import net.coreprotect.config.Config;
|
||||
import net.coreprotect.consumer.Queue;
|
||||
import net.coreprotect.listener.player.InventoryChangeListener;
|
||||
import net.coreprotect.model.BlockGroup;
|
||||
import net.coreprotect.paper.PaperAdapter;
|
||||
import net.coreprotect.paper.listener.BlockPreDispenseListener;
|
||||
import net.coreprotect.thread.CacheHandler;
|
||||
import net.coreprotect.thread.Scheduler;
|
||||
@@ -64,7 +65,7 @@ public final class BlockDispenseListener extends Queue implements Listener {
|
||||
forceItem = true; // droppers always drop items
|
||||
}
|
||||
|
||||
BlockState dispenserState = block.getState();
|
||||
BlockState dispenserState = PaperAdapter.ADAPTER.getBlockState(block, false);
|
||||
ItemStack[] inventory = ((InventoryHolder) dispenserState).getInventory().getStorageContents();
|
||||
if (forceItem) {
|
||||
inventory = Arrays.copyOf(inventory, inventory.length + 1);
|
||||
|
||||
@@ -129,7 +129,7 @@ public final class InventoryChangeListener extends Queue implements Listener {
|
||||
}
|
||||
}
|
||||
else {
|
||||
InventoryHolder inventoryHolder = inventory.getHolder();
|
||||
InventoryHolder inventoryHolder = PaperAdapter.ADAPTER.getHolder(inventory, false);
|
||||
if (inventoryHolder == null) {
|
||||
if (CoreProtect.getInstance().isAdvancedChestsEnabled()) {
|
||||
AdvancedChest<?, ?> advancedChest = AdvancedChestsAPI.getInventoryManager().getAdvancedChest(inventory);
|
||||
|
||||
@@ -9,6 +9,7 @@ import org.bukkit.OfflinePlayer;
|
||||
import org.bukkit.Server;
|
||||
import org.bukkit.World;
|
||||
import org.bukkit.block.Block;
|
||||
import org.bukkit.block.BlockState;
|
||||
import org.bukkit.block.Sign;
|
||||
import org.bukkit.block.Skull;
|
||||
import org.bukkit.block.data.BlockData;
|
||||
@@ -76,6 +77,11 @@ public class PaperAdapter implements PaperInterface {
|
||||
return holder.getHolder();
|
||||
}
|
||||
|
||||
@Override
|
||||
public BlockState getBlockState(Block block, boolean useSnapshot) {
|
||||
return block.getState();
|
||||
}
|
||||
|
||||
@Override
|
||||
public boolean isStopping(Server server) {
|
||||
return false;
|
||||
|
||||
@@ -10,6 +10,8 @@ import java.util.UUID;
|
||||
import org.bukkit.Location;
|
||||
import org.bukkit.Server;
|
||||
import org.bukkit.World;
|
||||
import org.bukkit.block.Block;
|
||||
import org.bukkit.block.BlockState;
|
||||
import org.bukkit.entity.Entity;
|
||||
import org.bukkit.entity.Villager;
|
||||
import org.bukkit.inventory.Inventory;
|
||||
@@ -20,6 +22,7 @@ import net.coreprotect.model.entity.VillagerReputationData;
|
||||
|
||||
public class PaperHandler extends PaperAdapter {
|
||||
private volatile boolean supportsSnapshotHolderLookup = true;
|
||||
private volatile boolean supportsSnapshotStateLookup = true;
|
||||
private volatile boolean supportsAverageTickTime = true;
|
||||
|
||||
@Override
|
||||
@@ -67,6 +70,20 @@ public class PaperHandler extends PaperAdapter {
|
||||
return holder.getHolder();
|
||||
}
|
||||
|
||||
@Override
|
||||
public BlockState getBlockState(Block block, boolean useSnapshot) {
|
||||
if (supportsSnapshotStateLookup) {
|
||||
try {
|
||||
return block.getState(useSnapshot);
|
||||
}
|
||||
catch (LinkageError ignored) {
|
||||
supportsSnapshotStateLookup = false;
|
||||
}
|
||||
}
|
||||
|
||||
return block.getState();
|
||||
}
|
||||
|
||||
@Override
|
||||
public List<Object> getVillagerReputations(Villager villager) {
|
||||
List<Object> reputations = new ArrayList<>();
|
||||
|
||||
@@ -6,6 +6,7 @@ import org.bukkit.Location;
|
||||
import org.bukkit.Server;
|
||||
import org.bukkit.World;
|
||||
import org.bukkit.block.Block;
|
||||
import org.bukkit.block.BlockState;
|
||||
import org.bukkit.block.Sign;
|
||||
import org.bukkit.block.Skull;
|
||||
import org.bukkit.block.data.BlockData;
|
||||
@@ -21,6 +22,8 @@ public interface PaperInterface {
|
||||
|
||||
public InventoryHolder getHolder(Inventory holder, boolean useSnapshot);
|
||||
|
||||
public BlockState getBlockState(Block block, boolean useSnapshot);
|
||||
|
||||
public boolean isStopping(Server server);
|
||||
|
||||
public double getAverageTickTime(Server server);
|
||||
|
||||
@@ -19,6 +19,7 @@ import net.coreprotect.config.Config;
|
||||
import net.coreprotect.config.ConfigHandler;
|
||||
import net.coreprotect.consumer.Queue;
|
||||
import net.coreprotect.listener.player.InventoryChangeListener;
|
||||
import net.coreprotect.paper.PaperAdapter;
|
||||
|
||||
public final class BlockPreDispenseListener extends Queue implements Listener {
|
||||
|
||||
@@ -84,7 +85,7 @@ public final class BlockPreDispenseListener extends Queue implements Listener {
|
||||
|
||||
// Process the inventory transaction
|
||||
String user = "#dispenser";
|
||||
BlockState blockState = block.getState();
|
||||
BlockState blockState = PaperAdapter.ADAPTER.getBlockState(block, false);
|
||||
ItemStack[] inventory = ((InventoryHolder) blockState).getInventory().getStorageContents();
|
||||
InventoryChangeListener.inventoryTransaction(user, blockState, inventory);
|
||||
}
|
||||
|
||||
Reference in new issue
Block a user