Skip to content

Commit

Permalink
Level新增setBlock和sendChunkPacket回调
Browse files Browse the repository at this point in the history
  • Loading branch information
boybook committed Jan 6, 2024
1 parent b9c0b09 commit 384ccee
Showing 1 changed file with 51 additions and 16 deletions.
67 changes: 51 additions & 16 deletions src/main/java/cn/nukkit/level/Level.java
Original file line number Diff line number Diff line change
Expand Up @@ -2,7 +2,10 @@

import cn.nukkit.Player;
import cn.nukkit.Server;
import cn.nukkit.block.*;
import cn.nukkit.block.Block;
import cn.nukkit.block.BlockID;
import cn.nukkit.block.BlockMultiface;
import cn.nukkit.block.BlockRedstoneDiode;
import cn.nukkit.blockentity.BlockEntity;
import cn.nukkit.entity.Entity;
import cn.nukkit.entity.item.EntityFirework;
Expand All @@ -24,14 +27,12 @@
import cn.nukkit.item.enchantment.Enchantment;
import cn.nukkit.level.GlobalBlockPaletteInterface.StaticVersion;
import cn.nukkit.level.biome.Biome;
import cn.nukkit.level.format.Chunk;
import cn.nukkit.level.format.ChunkSection;
import cn.nukkit.level.format.FullChunk;
import cn.nukkit.level.format.LevelProvider;
import cn.nukkit.level.format.LevelProviderManager;
import cn.nukkit.level.format.*;
import cn.nukkit.level.format.LevelProviderManager.LevelProviderHandle;
import cn.nukkit.level.format.anvil.Anvil;
import cn.nukkit.level.format.generic.*;
import cn.nukkit.level.format.generic.BaseFullChunk;
import cn.nukkit.level.format.generic.ChunkBlobCache;
import cn.nukkit.level.format.generic.ChunkPacketCache;
import cn.nukkit.level.format.leveldb.LevelDB;
import cn.nukkit.level.format.mcregion.McRegion;
import cn.nukkit.level.generator.Generator;
Expand All @@ -50,7 +51,10 @@
import cn.nukkit.metadata.MetadataValue;
import cn.nukkit.metadata.Metadatable;
import cn.nukkit.nbt.NBTIO;
import cn.nukkit.nbt.tag.*;
import cn.nukkit.nbt.tag.CompoundTag;
import cn.nukkit.nbt.tag.DoubleTag;
import cn.nukkit.nbt.tag.FloatTag;
import cn.nukkit.nbt.tag.ListTag;
import cn.nukkit.network.Network;
import cn.nukkit.network.protocol.*;
import cn.nukkit.network.protocol.BatchPacket.Track;
Expand Down Expand Up @@ -78,7 +82,13 @@
import java.nio.file.Path;
import java.nio.file.Paths;
import java.util.*;
import java.util.concurrent.*;
import java.util.concurrent.ConcurrentHashMap;
import java.util.concurrent.ConcurrentLinkedDeque;
import java.util.concurrent.ConcurrentLinkedQueue;
import java.util.concurrent.ThreadLocalRandom;
import java.util.concurrent.atomic.AtomicInteger;
import java.util.function.BiConsumer;
import java.util.function.Consumer;
import java.util.function.Predicate;
import java.util.function.Supplier;

Expand Down Expand Up @@ -319,6 +329,10 @@ public Generator initialValue() {

private boolean initialized;

private static final AtomicInteger callbackIdCounter = new AtomicInteger();
private final Int2ObjectMap<Consumer<Block>> callbackBlockSet = new Int2ObjectOpenHashMap<>();
private final Int2ObjectMap<BiConsumer<Long, DataPacket>> callbackChunkPacketSend = new Int2ObjectOpenHashMap<>();

public Level(Server server, String name, String path, LevelProviderHandle providerHandle) {
this.levelId = levelIdCounter++;
this.blockMetadata = new BlockMetadataStore(this);
Expand Down Expand Up @@ -961,6 +975,9 @@ public void addChunkPacket(int chunkX, int chunkZ, DataPacket packet) {
long index = Level.chunkHash(chunkX, chunkZ);
List<DataPacket> packets = this.chunkPackets.computeIfAbsent(index, key -> new ObjectArrayList<>());
packets.add(packet);
for (BiConsumer<Long, DataPacket> consumer : this.callbackChunkPacketSend.values()) {
consumer.accept(index, packet);
}
}

public void registerChunkLoader(ChunkLoader loader, int chunkX, int chunkZ) {
Expand Down Expand Up @@ -2414,6 +2431,10 @@ public synchronized boolean setBlock(int layer, int x, int y, int z, Block block
block.z = z;
block.level = this;

for (Consumer<Block> callback : this.callbackBlockSet.values()) {
callback.accept(block);
}

int cx = x >> 4;
int cz = z >> 4;
long index = Level.chunkHash(cx, cz);
Expand Down Expand Up @@ -2667,13 +2688,7 @@ public Item useBreakOn(Vector3 vector, @Nullable BlockFace face, @Nullable Item
}

if (createParticles) {
Int2ObjectMap<Player> players = this.getChunkPlayers((int) target.x >> 4, (int) target.z >> 4);

this.addParticle(new DestroyBlockParticle(target.add(0.5, 0, 0), target), players.values());

if (player != null) {
players.remove(player.getLoaderId());
}
this.addParticle(new DestroyBlockParticle(target, target));
}

// Close BlockEntity before we check onBreak
Expand Down Expand Up @@ -5126,4 +5141,24 @@ public Map<StaticVersion, LongSet> getRequestChunkVersions() {
public void setDisableChunkTick(boolean disable) {
disableChunkTick = disable;
}

public int addCallbackBlockSet(Consumer<Block> consumer) {
int id = callbackIdCounter.incrementAndGet();
callbackBlockSet.put(id, consumer);
return id;
}

public void removeCallbackBlockSet(int id) {
callbackBlockSet.remove(id);
}

public int addCallbackChunkPacketSend(BiConsumer<Long, DataPacket> consumer) {
int id = callbackIdCounter.incrementAndGet();
callbackChunkPacketSend.put(id, consumer);
return id;
}

public void removeCallbackChunkPacketSend(int id) {
callbackChunkPacketSend.remove(id);
}
}

0 comments on commit 384ccee

Please sign in to comment.