diff --git a/bukkit/src/main/java/net/momirealms/craftengine/bukkit/plugin/BukkitPlatform.java b/bukkit/src/main/java/net/momirealms/craftengine/bukkit/plugin/BukkitPlatform.java index 6e1545272..dfccb590f 100644 --- a/bukkit/src/main/java/net/momirealms/craftengine/bukkit/plugin/BukkitPlatform.java +++ b/bukkit/src/main/java/net/momirealms/craftengine/bukkit/plugin/BukkitPlatform.java @@ -5,12 +5,17 @@ import com.mojang.brigadier.exceptions.CommandSyntaxException; import net.momirealms.craftengine.bukkit.api.BukkitAdaptors; import net.momirealms.craftengine.bukkit.nms.FastNMS; import net.momirealms.craftengine.bukkit.plugin.reflection.minecraft.MRegistryOps; +import net.momirealms.craftengine.bukkit.util.ParticleUtils; +import net.momirealms.craftengine.bukkit.world.particle.BukkitParticleType; import net.momirealms.craftengine.core.plugin.Platform; import net.momirealms.craftengine.core.plugin.locale.LocalizedResourceConfigException; +import net.momirealms.craftengine.core.util.Key; import net.momirealms.craftengine.core.world.World; +import net.momirealms.craftengine.core.world.particle.ParticleType; import net.momirealms.sparrow.nbt.CompoundTag; import net.momirealms.sparrow.nbt.Tag; import org.bukkit.Bukkit; +import org.bukkit.Particle; import java.util.Map; @@ -62,4 +67,13 @@ public class BukkitPlatform implements Platform { } return BukkitAdaptors.adapt(world); } + + @Override + public ParticleType getParticleType(Key name) { + Particle particle = ParticleUtils.getParticle(name); + if (particle == null) { + throw new IllegalArgumentException("Invalid particle: " + name); + } + return new BukkitParticleType(particle, name); + } } diff --git a/bukkit/src/main/java/net/momirealms/craftengine/bukkit/world/BukkitWorld.java b/bukkit/src/main/java/net/momirealms/craftengine/bukkit/world/BukkitWorld.java index 2624bc78d..4a3b36f80 100644 --- a/bukkit/src/main/java/net/momirealms/craftengine/bukkit/world/BukkitWorld.java +++ b/bukkit/src/main/java/net/momirealms/craftengine/bukkit/world/BukkitWorld.java @@ -12,6 +12,7 @@ import net.momirealms.craftengine.core.util.Key; import net.momirealms.craftengine.core.util.VersionHelper; import net.momirealms.craftengine.core.world.*; import net.momirealms.craftengine.core.world.particle.ParticleData; +import net.momirealms.craftengine.core.world.particle.ParticleType; import org.bukkit.Location; import org.bukkit.Particle; import org.bukkit.SoundCategory; @@ -106,8 +107,8 @@ public class BukkitWorld implements World { } @Override - public void spawnParticle(Position location, Key particle, int count, double xOffset, double yOffset, double zOffset, double speed, @Nullable ParticleData extraData, @NotNull Context context) { - Particle particleType = ParticleUtils.getParticle(particle); + public void spawnParticle(Position location, ParticleType particle, int count, double xOffset, double yOffset, double zOffset, double speed, @Nullable ParticleData extraData, @NotNull Context context) { + Particle particleType = (Particle) particle.platformParticle(); if (particleType == null) return; org.bukkit.World platformWorld = platformWorld(); platformWorld.spawnParticle(particleType, location.x(), location.y(), location.z(), count, xOffset, yOffset, zOffset, speed, extraData == null ? null : ParticleUtils.toBukkitParticleData(extraData, context, platformWorld, location.x(), location.y(), location.z())); diff --git a/bukkit/src/main/java/net/momirealms/craftengine/bukkit/world/particle/BukkitParticleType.java b/bukkit/src/main/java/net/momirealms/craftengine/bukkit/world/particle/BukkitParticleType.java new file mode 100644 index 000000000..0bba8abb3 --- /dev/null +++ b/bukkit/src/main/java/net/momirealms/craftengine/bukkit/world/particle/BukkitParticleType.java @@ -0,0 +1,25 @@ +package net.momirealms.craftengine.bukkit.world.particle; + +import net.momirealms.craftengine.core.util.Key; +import net.momirealms.craftengine.core.world.particle.ParticleType; +import org.bukkit.Particle; + +public class BukkitParticleType implements ParticleType { + private final Particle particle; + private final Key type; + + public BukkitParticleType(Particle particle, Key type) { + this.particle = particle; + this.type = type; + } + + @Override + public Key type() { + return this.type; + } + + @Override + public Particle platformParticle() { + return particle; + } +} diff --git a/core/src/main/java/net/momirealms/craftengine/core/block/entity/BlockEntity.java b/core/src/main/java/net/momirealms/craftengine/core/block/entity/BlockEntity.java index fd582ffe5..78dc7210a 100644 --- a/core/src/main/java/net/momirealms/craftengine/core/block/entity/BlockEntity.java +++ b/core/src/main/java/net/momirealms/craftengine/core/block/entity/BlockEntity.java @@ -13,7 +13,7 @@ public abstract class BlockEntity { protected final BlockPos pos; protected ImmutableBlockState blockState; protected BlockEntityType type; - protected CEWorld world; + public CEWorld world; protected boolean valid; @Nullable protected DynamicBlockEntityRenderer blockEntityRenderer; diff --git a/core/src/main/java/net/momirealms/craftengine/core/block/entity/tick/TickingBlockEntityImpl.java b/core/src/main/java/net/momirealms/craftengine/core/block/entity/tick/TickingBlockEntityImpl.java index ee323e5a9..12d09ee8c 100644 --- a/core/src/main/java/net/momirealms/craftengine/core/block/entity/tick/TickingBlockEntityImpl.java +++ b/core/src/main/java/net/momirealms/craftengine/core/block/entity/tick/TickingBlockEntityImpl.java @@ -25,10 +25,8 @@ public class TickingBlockEntityImpl implements TickingBlo @Override public void tick() { - // 已无效 - if (!this.isValid()) return; // 还没加载完全 - if (this.blockEntity.world() == null) return; + if (this.blockEntity.world == null) return; BlockPos pos = pos(); ImmutableBlockState state = this.chunk.getBlockState(pos); // 不是合法方块 diff --git a/core/src/main/java/net/momirealms/craftengine/core/plugin/Platform.java b/core/src/main/java/net/momirealms/craftengine/core/plugin/Platform.java index 3ab8e0267..6a8ec531b 100644 --- a/core/src/main/java/net/momirealms/craftengine/core/plugin/Platform.java +++ b/core/src/main/java/net/momirealms/craftengine/core/plugin/Platform.java @@ -1,7 +1,9 @@ package net.momirealms.craftengine.core.plugin; import com.google.gson.JsonElement; +import net.momirealms.craftengine.core.util.Key; import net.momirealms.craftengine.core.world.World; +import net.momirealms.craftengine.core.world.particle.ParticleType; import net.momirealms.sparrow.nbt.Tag; public interface Platform { @@ -17,4 +19,6 @@ public interface Platform { Tag javaToSparrowNBT(Object object); World getWorld(String name); + + ParticleType getParticleType(Key name); } 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 5d35506a7..ac187bb3a 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 @@ -31,8 +31,6 @@ public abstract class CEWorld { protected volatile boolean isUpdatingLights = false; protected SchedulerTask syncTickTask; protected SchedulerTask asyncTickTask; - @SuppressWarnings("FieldCanBeLocal") - private int tileTickPosition; public CEWorld(World world, StorageAdaptor adaptor) { this.world = world; @@ -207,12 +205,13 @@ public abstract class CEWorld { this.pendingTickingBlockEntities.clear(); } if (!this.tickingBlockEntities.isEmpty()) { - for (this.tileTickPosition = 0; this.tileTickPosition < this.tickingBlockEntities.size(); this.tileTickPosition++) { - TickingBlockEntity blockEntity = this.tickingBlockEntities.get(this.tileTickPosition); - if (blockEntity.isValid()) { - blockEntity.tick(); + Object[] entities = this.tickingBlockEntities.elements(); + for (int i = 0, size = this.tickingBlockEntities.size(); i < size; i++) { + TickingBlockEntity entity = (TickingBlockEntity) entities[i]; + if (entity.isValid()) { + entity.tick(); } else { - this.tickingBlockEntities.markAsRemoved(this.tileTickPosition); + this.tickingBlockEntities.markAsRemoved(i); } } this.tickingBlockEntities.removeMarkedEntries(); diff --git a/core/src/main/java/net/momirealms/craftengine/core/world/World.java b/core/src/main/java/net/momirealms/craftengine/core/world/World.java index bc6181c8b..6bf1e2eed 100644 --- a/core/src/main/java/net/momirealms/craftengine/core/world/World.java +++ b/core/src/main/java/net/momirealms/craftengine/core/world/World.java @@ -9,6 +9,7 @@ import net.momirealms.craftengine.core.sound.SoundData; import net.momirealms.craftengine.core.sound.SoundSource; import net.momirealms.craftengine.core.util.Key; import net.momirealms.craftengine.core.world.particle.ParticleData; +import net.momirealms.craftengine.core.world.particle.ParticleType; import org.jetbrains.annotations.NotNull; import javax.annotation.Nullable; @@ -58,7 +59,7 @@ public interface World { void levelEvent(int id, BlockPos pos, int data); - void spawnParticle(Position location, Key particle, int count, double xOffset, double yOffset, double zOffset, double speed, @Nullable ParticleData extraData, @NotNull Context context); + void spawnParticle(Position location, ParticleType particle, int count, double xOffset, double yOffset, double zOffset, double speed, @Nullable ParticleData extraData, @NotNull Context context); long time(); diff --git a/core/src/main/java/net/momirealms/craftengine/core/world/particle/ParticleConfig.java b/core/src/main/java/net/momirealms/craftengine/core/world/particle/ParticleConfig.java index b96863555..0621016d6 100644 --- a/core/src/main/java/net/momirealms/craftengine/core/world/particle/ParticleConfig.java +++ b/core/src/main/java/net/momirealms/craftengine/core/world/particle/ParticleConfig.java @@ -1,5 +1,6 @@ package net.momirealms.craftengine.core.world.particle; +import net.momirealms.craftengine.core.plugin.CraftEngine; import net.momirealms.craftengine.core.plugin.context.number.NumberProvider; import net.momirealms.craftengine.core.plugin.context.number.NumberProviders; import net.momirealms.craftengine.core.util.Key; @@ -9,7 +10,7 @@ import java.util.Map; import java.util.Optional; public class ParticleConfig { - public final Key particleType; + public final ParticleType particleType; public final NumberProvider x; public final NumberProvider y; public final NumberProvider z; @@ -20,7 +21,7 @@ public class ParticleConfig { public final NumberProvider speed; public final ParticleData particleData; - public ParticleConfig(Key particleType, NumberProvider x, NumberProvider y, NumberProvider z, NumberProvider count, NumberProvider xOffset, NumberProvider yOffset, NumberProvider zOffset, NumberProvider speed, ParticleData particleData) { + public ParticleConfig(ParticleType particleType, NumberProvider x, NumberProvider y, NumberProvider z, NumberProvider count, NumberProvider xOffset, NumberProvider yOffset, NumberProvider zOffset, NumberProvider speed, ParticleData particleData) { this.particleType = particleType; this.x = x; this.y = y; @@ -43,7 +44,7 @@ public class ParticleConfig { NumberProvider yOffset = NumberProviders.fromObject(arguments.getOrDefault("offset-y", 0)); NumberProvider zOffset = NumberProviders.fromObject(arguments.getOrDefault("offset-z", 0)); NumberProvider speed = NumberProviders.fromObject(arguments.getOrDefault("speed", 0)); - return new ParticleConfig(particleType, x, y, z, count, xOffset, yOffset, zOffset, speed, Optional.ofNullable(ParticleDataTypes.TYPES.get(particleType)).map(it -> it.apply(arguments)).orElse(null)); + return new ParticleConfig(CraftEngine.instance().platform().getParticleType(particleType), x, y, z, count, xOffset, yOffset, zOffset, speed, Optional.ofNullable(ParticleDataTypes.TYPES.get(particleType)).map(it -> it.apply(arguments)).orElse(null)); } public static ParticleConfig fromMap$blockEntity(Map arguments) { @@ -56,10 +57,10 @@ public class ParticleConfig { NumberProvider yOffset = NumberProviders.fromObject(arguments.getOrDefault("offset-y", 0)); NumberProvider zOffset = NumberProviders.fromObject(arguments.getOrDefault("offset-z", 0)); NumberProvider speed = NumberProviders.fromObject(arguments.getOrDefault("speed", 0)); - return new ParticleConfig(particleType, x, y, z, count, xOffset, yOffset, zOffset, speed, Optional.ofNullable(ParticleDataTypes.TYPES.get(particleType)).map(it -> it.apply(arguments)).orElse(null)); + return new ParticleConfig(CraftEngine.instance().platform().getParticleType(particleType), x, y, z, count, xOffset, yOffset, zOffset, speed, Optional.ofNullable(ParticleDataTypes.TYPES.get(particleType)).map(it -> it.apply(arguments)).orElse(null)); } - public Key particleType() { + public ParticleType particleType() { return particleType; } diff --git a/core/src/main/java/net/momirealms/craftengine/core/world/particle/ParticleType.java b/core/src/main/java/net/momirealms/craftengine/core/world/particle/ParticleType.java new file mode 100644 index 000000000..1a0a59998 --- /dev/null +++ b/core/src/main/java/net/momirealms/craftengine/core/world/particle/ParticleType.java @@ -0,0 +1,10 @@ +package net.momirealms.craftengine.core.world.particle; + +import net.momirealms.craftengine.core.util.Key; + +public interface ParticleType { + + Key type(); + + Object platformParticle(); +} diff --git a/gradle.properties b/gradle.properties index d93169b9c..69959143c 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.20 +project_version=0.0.63 config_version=45 lang_version=29 project_group=net.momirealms