diff --git a/bukkit/src/main/java/net/momirealms/craftengine/bukkit/plugin/injector/WorldStorageInjector.java b/bukkit/src/main/java/net/momirealms/craftengine/bukkit/plugin/injector/WorldStorageInjector.java index 50fafbd48..71e043a19 100644 --- a/bukkit/src/main/java/net/momirealms/craftengine/bukkit/plugin/injector/WorldStorageInjector.java +++ b/bukkit/src/main/java/net/momirealms/craftengine/bukkit/plugin/injector/WorldStorageInjector.java @@ -14,9 +14,9 @@ import net.bytebuddy.implementation.bytecode.assign.Assigner; import net.bytebuddy.matcher.ElementMatchers; import net.momirealms.craftengine.bukkit.nms.FastNMS; import net.momirealms.craftengine.bukkit.plugin.reflection.minecraft.CoreReflections; -import net.momirealms.craftengine.bukkit.util.BlockStateUtils; import net.momirealms.craftengine.bukkit.util.LocationUtils; import net.momirealms.craftengine.core.block.BlockStateWrapper; +import net.momirealms.craftengine.core.block.DelegatingBlockState; import net.momirealms.craftengine.core.block.EmptyBlock; import net.momirealms.craftengine.core.block.ImmutableBlockState; import net.momirealms.craftengine.core.block.entity.BlockEntity; @@ -36,7 +36,6 @@ import java.lang.invoke.MethodHandles; import java.lang.invoke.MethodType; import java.util.List; import java.util.Objects; -import java.util.Optional; import java.util.concurrent.Callable; import java.util.function.Consumer; @@ -219,38 +218,9 @@ public final class WorldStorageInjector { @SuppressWarnings("DuplicatedCode") private static void compareAndUpdateBlockState(int x, int y, int z, Object newState, Object previousState, InjectedHolder holder) { - Optional optionalCustomState = BlockStateUtils.getOptionalCustomBlockState(newState); CESection section = holder.ceSection(); - // 如果是原版方块 - if (optionalCustomState.isEmpty()) { - // 那么应该清空自定义块 - ImmutableBlockState previous = section.setBlockState(x, y, z, EmptyBlock.STATE); - // 处理 自定义块 -> 原版块 - if (!previous.isEmpty()) { - CEChunk chunk = holder.ceChunk(); - chunk.setDirty(true); - if (previous.hasBlockEntity()) { - BlockPos pos = new BlockPos(chunk.chunkPos.x * 16 + x, section.sectionY * 16 + y, chunk.chunkPos.z * 16 + z); - BlockEntity blockEntity = chunk.getBlockEntity(pos, false); - if (blockEntity != null) { - blockEntity.preRemove(); - chunk.removeBlockEntity(pos); - } - } - if (previous.hasBlockEntityRenderer()) { - BlockPos pos = new BlockPos(chunk.chunkPos.x * 16 + x, section.sectionY * 16 + y, chunk.chunkPos.z * 16 + z); - chunk.removeBlockEntityRenderer(pos); - } - if (Config.enableLightSystem()) { - // 自定义块到原版块,只需要判断旧块是否和客户端一直 - BlockStateWrapper wrapper = previous.vanillaBlockState(); - if (wrapper != null) { - updateLight(holder, wrapper.literalObject(), previousState, x, y, z); - } - } - } - } else { - ImmutableBlockState newImmutableBlockState = optionalCustomState.get(); + if (newState instanceof DelegatingBlockState delegatingBlockState) { + ImmutableBlockState newImmutableBlockState = delegatingBlockState.blockState(); ImmutableBlockState previousImmutableBlockState = section.setBlockState(x, y, z, newImmutableBlockState); if (previousImmutableBlockState == newImmutableBlockState) return; // 处理 自定义块到自定义块或原版块到自定义块 @@ -307,6 +277,34 @@ public final class WorldStorageInjector { updateLight$complex(holder, newImmutableBlockState.vanillaBlockState().literalObject(), newState, previousState, x, y, z); } } + } else { + // 如果是原版方块 + // 那么应该清空自定义块 + ImmutableBlockState previous = section.setBlockState(x, y, z, EmptyBlock.STATE); + // 处理 自定义块 -> 原版块 + if (!previous.isEmpty()) { + CEChunk chunk = holder.ceChunk(); + chunk.setDirty(true); + if (previous.hasBlockEntity()) { + BlockPos pos = new BlockPos(chunk.chunkPos.x * 16 + x, section.sectionY * 16 + y, chunk.chunkPos.z * 16 + z); + BlockEntity blockEntity = chunk.getBlockEntity(pos, false); + if (blockEntity != null) { + blockEntity.preRemove(); + chunk.removeBlockEntity(pos); + } + } + if (previous.hasBlockEntityRenderer()) { + BlockPos pos = new BlockPos(chunk.chunkPos.x * 16 + x, section.sectionY * 16 + y, chunk.chunkPos.z * 16 + z); + chunk.removeBlockEntityRenderer(pos); + } + if (Config.enableLightSystem()) { + // 自定义块到原版块,只需要判断旧块是否和客户端一直 + BlockStateWrapper wrapper = previous.vanillaBlockState(); + if (wrapper != null) { + updateLight(holder, wrapper.literalObject(), previousState, x, y, z); + } + } + } } } diff --git a/bukkit/src/main/java/net/momirealms/craftengine/bukkit/world/BukkitCEWorld.java b/bukkit/src/main/java/net/momirealms/craftengine/bukkit/world/BukkitCEWorld.java index 6d5d0cae4..93f3727cc 100644 --- a/bukkit/src/main/java/net/momirealms/craftengine/bukkit/world/BukkitCEWorld.java +++ b/bukkit/src/main/java/net/momirealms/craftengine/bukkit/world/BukkitCEWorld.java @@ -7,14 +7,10 @@ import net.momirealms.craftengine.core.plugin.config.Config; import net.momirealms.craftengine.core.util.SectionPosUtils; import net.momirealms.craftengine.core.world.BlockPos; import net.momirealms.craftengine.core.world.CEWorld; -import net.momirealms.craftengine.core.world.SectionPos; import net.momirealms.craftengine.core.world.World; import net.momirealms.craftengine.core.world.chunk.storage.StorageAdaptor; import net.momirealms.craftengine.core.world.chunk.storage.WorldDataStorage; -import java.util.ArrayList; -import java.util.List; - public class BukkitCEWorld extends CEWorld { public BukkitCEWorld(World world, StorageAdaptor adaptor) { @@ -27,19 +23,19 @@ public class BukkitCEWorld extends CEWorld { @Override public void updateLight() { - List poses; - synchronized (super.updatedSectionSet) { - poses = new ArrayList<>(super.updatedSectionSet); - super.updatedSectionSet.clear(); - } if (Config.enableLightSystem()) { + super.isUpdatingLights = true; LightUtils.updateChunkLight( (org.bukkit.World) this.world.platformWorld(), - SectionPosUtils.toMap(poses, + SectionPosUtils.toMap(super.lightSections, this.world.worldHeight().getMinSection() - 1, this.world.worldHeight().getMaxSection() + 1 ) ); + super.lightSections.clear(); + super.isUpdatingLights = false; + super.lightSections.addAll(super.pendingLightSections); + super.pendingLightSections.clear(); } } diff --git a/core/src/main/java/net/momirealms/craftengine/core/world/CEWorld.java b/core/src/main/java/net/momirealms/craftengine/core/world/CEWorld.java index b3c183f1b..32abf2075 100644 --- a/core/src/main/java/net/momirealms/craftengine/core/world/CEWorld.java +++ b/core/src/main/java/net/momirealms/craftengine/core/world/CEWorld.java @@ -17,7 +17,6 @@ import org.jetbrains.annotations.Nullable; import java.io.IOException; import java.util.*; -import java.util.concurrent.ConcurrentHashMap; public abstract class CEWorld { public static final String REGION_DIRECTORY = "craftengine"; @@ -25,10 +24,12 @@ public abstract class CEWorld { protected final ConcurrentLong2ReferenceChainedHashTable loadedChunkMap; protected final WorldDataStorage worldDataStorage; protected final WorldHeight worldHeightAccessor; - protected final Set updatedSectionSet = ConcurrentHashMap.newKeySet(128); + protected final List pendingLightSections = new ArrayList<>(128); + protected final Set lightSections = new HashSet<>(128); protected final List tickingBlockEntities = new ArrayList<>(); protected final List pendingTickingBlockEntities = new ArrayList<>(); protected boolean isTickingBlockEntities = false; + protected boolean isUpdatingLights = false; protected SchedulerTask syncTickTask; protected SchedulerTask asyncTickTask; @@ -163,12 +164,12 @@ public abstract class CEWorld { return worldDataStorage; } - public void sectionLightUpdated(SectionPos pos) { - this.updatedSectionSet.add(pos); - } - public void sectionLightUpdated(Collection pos) { - this.updatedSectionSet.addAll(pos); + if (this.isUpdatingLights) { + this.pendingLightSections.addAll(pos); + } else { + this.lightSections.addAll(pos); + } } public WorldHeight worldHeight() { diff --git a/gradle.properties b/gradle.properties index 455403f8e..766a33a0c 100644 --- a/gradle.properties +++ b/gradle.properties @@ -2,7 +2,7 @@ org.gradle.jvmargs=-Xmx1G # Project settings # Rule: [major update].[feature update].[bug fix] -project_version=0.0.62.13 +project_version=0.0.62.14 config_version=45 lang_version=25 project_group=net.momirealms