fix: redstone

This commit is contained in:
Reider745
2026-05-07 20:20:09 +03:00
parent c551f9459a
commit 712e18460c
5 changed files with 64 additions and 12 deletions
@@ -367,7 +367,7 @@ public class CustomBlock extends BlockSolidMeta implements RandomTick {
this.level);
return type;
} else if (type == Level.BLOCK_UPDATE_REDSTONE || type == Level.BLOCK_UPDATE_NORMAL) {
ServerHooks.postApply.add(this);
RedstoneSystem.onChangeRedstone(this);
return type;
}
return type;
@@ -0,0 +1,53 @@
package com.reider745.block;
import cn.nukkit.block.Block;
import cn.nukkit.level.Level;
import com.zhekasmirnov.innercore.api.NativeCallback;
import it.unimi.dsi.fastutil.ints.Int2ObjectMap;
import it.unimi.dsi.fastutil.ints.Int2ObjectMaps;
import it.unimi.dsi.fastutil.ints.Int2ObjectOpenHashMap;
import it.unimi.dsi.fastutil.objects.Object2ObjectMaps;
import it.unimi.dsi.fastutil.objects.Object2ObjectOpenHashMap;
import org.jetbrains.annotations.Nullable;
import java.util.Map;
public class RedstoneSystem {
private static final Int2ObjectMap<Map<Block, Byte>> redstoneSignals = Int2ObjectMaps.synchronize(new Int2ObjectOpenHashMap<>());
@Nullable
private static Map<Block, Byte> getBlocks(Block block) {
if(block.isValid()) {
return redstoneSignals.computeIfAbsent(block.getLevel().getId(), (id) -> Object2ObjectMaps.synchronize(new Object2ObjectOpenHashMap<>()));
}
return null;
}
public static void onChangeRedstone(Block block) {
Map<Block, Byte> blocks = getBlocks(block);
if(blocks != null) {
Level level = block.getLevel();
int signal = level.isBlockIndirectlyGettingPowered(block);
if(!blocks.containsKey(block) || blocks.get(block) != signal) {
blocks.put(block, (byte) signal);
NativeCallback.onRedstoneSignalChange((int) block.x, (int) block.y, (int) block.z,
signal, !block.isPowerSource(), level);
}
}
}
public static void onBreak(Block block) {
Map<Block, Byte> blocks = getBlocks(block);
if(blocks != null) {
blocks.remove(block);
}
}
public static void onUnloadLevel(Level level) {
redstoneSignals.remove(level.getId());
}
}
@@ -20,6 +20,7 @@ import cn.nukkit.event.inventory.InventoryPickupItemEvent;
import cn.nukkit.event.level.ChunkLoadEvent;
import cn.nukkit.event.level.ChunkPopulateEvent;
import cn.nukkit.event.level.ChunkUnloadEvent;
import cn.nukkit.event.level.LevelUnloadEvent;
import cn.nukkit.event.player.*;
import cn.nukkit.event.plugin.PluginDisableEvent;
import cn.nukkit.event.plugin.PluginEnableEvent;
@@ -42,6 +43,7 @@ import cn.nukkit.network.protocol.UpdateBlockPacket;
import cn.nukkit.scheduler.AsyncTask;
import com.reider745.InnerCoreServer;
import com.reider745.api.ZoteOnly;
import com.reider745.block.RedstoneSystem;
import com.reider745.hooks.ServerHooks;
import com.reider745.hooks.network.RakNetPlayerSessionHooks;
import com.reider745.item.ItemMethod;
@@ -169,19 +171,10 @@ public class EventListener implements Listener {
EntityMethod.getIdForEntity(event.getPlayer())));
}
public static void onRedstone(Block event) {
Block block = event.getBlock();
Level level = event.getBlock().getLevel();
int signal = level.isBlockIndirectlyGettingPowered(block);
NativeCallback.onRedstoneSignalChange((int) block.x, (int) block.y, (int) block.z,
signal, !event.getBlock().isPowerSource(), level);
}
@EventHandler(priority = EventPriority.HIGHEST)
public void onRedstoneUpdate(RedstoneUpdateEvent event) {
if(isFirstTickEnd){
RedstoneSystem.onChangeRedstone(event.getBlock());
}
}
@@ -624,6 +617,11 @@ public class EventListener implements Listener {
NativeCallback.onChunkDiscarded(FakeDimensions.getFakeIdForLevel(event.getLevel()), chunk.getX(), chunk.getZ());
}
@EventHandler
public void onUnloadLevel(LevelUnloadEvent event){
RedstoneSystem.onUnloadLevel(event.getLevel());
}
@ZoteOnly
@EventHandler
public void onPluginEnable(PluginEnableEvent event) {
@@ -32,7 +32,6 @@ import org.apache.logging.log4j.LogManager;
public class ServerHooks {
public static InnerCoreServer innerCoreServer = new InnerCoreServer();
private static final org.apache.logging.log4j.Logger zoteLogger = LogManager.getLogger(MainLogger.class);
public static final List<Block> postApply = new CopyOnWriteArrayList<>();
@Inject
public static void start(Server self) throws Exception {
@@ -33,6 +33,7 @@ import com.reider745.api.hooks.annotation.Hooks;
import com.reider745.api.hooks.annotation.Inject;
import com.reider745.api.hooks.annotation.ShadowGetField;
import com.reider745.api.hooks.annotation.ShadowMethod;
import com.reider745.block.RedstoneSystem;
import com.reider745.event.EventListener;
import com.reider745.world.dimensions.DimensionsMethods;
import com.zhekasmirnov.innercore.api.dimensions.CustomDimension;
@@ -176,6 +177,7 @@ public class LevelHooks implements HookClass {
}
target.onBreak(item, player);
RedstoneSystem.onBreak(target);
item.useOn(target);
if (item.isTool() && item.getDamage() >= item.getMaxDurability()) {