diff --git a/gradle.properties b/gradle.properties index d8f86abd..f2117082 100644 --- a/gradle.properties +++ b/gradle.properties @@ -3,7 +3,7 @@ org.gradle.jvmargs=-Xmx1G # Fabric Properties # check https://fabricmc.net/develop/ - minecraft_version=25w32a + minecraft_version=25w33a loader_version=0.16.14 jsr305_version=3.0.2 fabric_version=0.119.5+1.21.5 diff --git a/src/main/java/carpet/mixins/Explosion_scarpetEventMixin.java b/src/main/java/carpet/mixins/Explosion_scarpetEventMixin.java index 5985a526..8aeea1cd 100644 --- a/src/main/java/carpet/mixins/Explosion_scarpetEventMixin.java +++ b/src/main/java/carpet/mixins/Explosion_scarpetEventMixin.java @@ -8,7 +8,6 @@ import org.spongepowered.asm.mixin.Shadow; import org.spongepowered.asm.mixin.injection.At; import org.spongepowered.asm.mixin.injection.Inject; import org.spongepowered.asm.mixin.injection.Redirect; -import org.spongepowered.asm.mixin.injection.callback.CallbackInfo; import java.util.ArrayList; import java.util.List; @@ -17,6 +16,7 @@ import net.minecraft.world.entity.Entity; import net.minecraft.world.entity.LivingEntity; import net.minecraft.world.level.Explosion; import net.minecraft.world.phys.Vec3; +import org.spongepowered.asm.mixin.injection.callback.CallbackInfoReturnable; import org.spongepowered.asm.mixin.injection.callback.LocalCapture; import static carpet.script.CarpetEventServer.Event.EXPLOSION_OUTCOME; @@ -36,7 +36,7 @@ public abstract class Explosion_scarpetEventMixin private List affectedEntities = new ArrayList<>(); @Inject(method = "explode", at = @At("HEAD")) - private void explodeCM(CallbackInfo ci) + private void explodeCM(CallbackInfoReturnable cir) { affectedEntities.clear(); } @@ -49,7 +49,7 @@ public abstract class Explosion_scarpetEventMixin } @Inject(method = "explode", locals = LocalCapture.CAPTURE_FAILHARD, at = @At(value = "INVOKE", target = "Lnet/minecraft/world/level/ServerExplosion;hurtEntities()V", shift = At.Shift.AFTER)) - private void onExplosionDone(CallbackInfo ci, List list) + private void onExplosionDone(CallbackInfoReturnable cir, List list) { if (EXPLOSION_OUTCOME.isNeeded() && !level.isClientSide()) { diff --git a/src/main/java/carpet/mixins/ServerLevel_scarpetMixin.java b/src/main/java/carpet/mixins/ServerLevel_scarpetMixin.java index 81929187..a6af3113 100644 --- a/src/main/java/carpet/mixins/ServerLevel_scarpetMixin.java +++ b/src/main/java/carpet/mixins/ServerLevel_scarpetMixin.java @@ -4,11 +4,13 @@ import carpet.fakes.ServerWorldInterface; import net.minecraft.core.BlockPos; import net.minecraft.core.Holder; import net.minecraft.core.RegistryAccess; +import net.minecraft.core.particles.ExplosionParticleInfo; import net.minecraft.core.particles.ParticleOptions; import net.minecraft.resources.ResourceKey; import net.minecraft.server.level.ServerLevel; import net.minecraft.sounds.SoundEvent; import net.minecraft.util.profiling.ProfilerFiller; +import net.minecraft.util.random.WeightedList; import net.minecraft.world.DifficultyInstance; import net.minecraft.world.damagesource.DamageSource; import net.minecraft.world.entity.Entity; @@ -69,7 +71,7 @@ public abstract class ServerLevel_scarpetMixin extends Level implements ServerWo } @Inject(method = "explode", at = @At("HEAD"), cancellable = true) - private void handleExplosion(final Entity entity, final DamageSource damageSource, final ExplosionDamageCalculator explosionDamageCalculator, final double x, final double y, final double z, final float g, final boolean bl, final ExplosionInteraction explosionInteraction, final ParticleOptions particleOptions, final ParticleOptions particleOptions2, final Holder holder, final CallbackInfo ci) + private void handleExplosion(Entity entity, DamageSource damageSource, ExplosionDamageCalculator explosionDamageCalculator, double x, double y, double z, float g, boolean bl, ExplosionInteraction explosionInteraction, ParticleOptions particleOptions, ParticleOptions particleOptions2, WeightedList weightedList, Holder holder, CallbackInfo ci) { if (EXPLOSION.isNeeded()) { Explosion.BlockInteraction var10000 = switch (explosionInteraction) { diff --git a/src/main/java/carpet/script/api/WorldAccess.java b/src/main/java/carpet/script/api/WorldAccess.java index 080791d4..9e45dfad 100644 --- a/src/main/java/carpet/script/api/WorldAccess.java +++ b/src/main/java/carpet/script/api/WorldAccess.java @@ -28,7 +28,6 @@ import carpet.script.value.StringValue; import carpet.script.value.Value; import carpet.script.value.ValueConversions; -import com.mojang.brigadier.exceptions.CommandSyntaxException; import it.unimi.dsi.fastutil.longs.Long2ObjectOpenHashMap; import it.unimi.dsi.fastutil.longs.LongSet; import net.minecraft.Util; @@ -39,6 +38,7 @@ import net.minecraft.core.HolderSet; import net.minecraft.core.QuartPos; import net.minecraft.core.Registry; import net.minecraft.core.RegistryAccess; +import net.minecraft.core.particles.ExplosionParticleInfo; import net.minecraft.core.particles.ParticleOptions; import net.minecraft.core.particles.ParticleTypes; import net.minecraft.core.registries.BuiltInRegistries; @@ -54,6 +54,7 @@ import net.minecraft.sounds.SoundEvents; import net.minecraft.tags.ItemTags; import net.minecraft.tags.TagKey; import net.minecraft.util.ProblemReporter; +import net.minecraft.util.random.WeightedList; import net.minecraft.world.level.ServerExplosion; import net.minecraft.world.level.chunk.ChunkGenerator; import net.minecraft.world.level.chunk.PalettedContainer; @@ -71,7 +72,6 @@ import org.apache.commons.lang3.tuple.Pair; import java.util.ArrayList; import java.util.Arrays; -import java.util.Collections; import java.util.Comparator; import java.util.HashMap; import java.util.List; @@ -85,15 +85,11 @@ import java.util.function.Predicate; import java.util.stream.Collectors; import java.util.stream.Stream; -import net.minecraft.commands.arguments.item.ItemInput; import net.minecraft.nbt.CompoundTag; -import net.minecraft.nbt.Tag; import net.minecraft.network.protocol.game.ClientboundExplodePacket; import net.minecraft.resources.ResourceLocation; import net.minecraft.sounds.SoundSource; import net.minecraft.util.Mth; -import net.minecraft.util.SortedArraySet; -import net.minecraft.world.Clearable; import net.minecraft.world.InteractionResult; import net.minecraft.world.entity.Entity; import net.minecraft.world.entity.EntityType; @@ -998,6 +994,12 @@ public class WorldAccess return BooleanValue.of(success); }); + // from ServerLevel = don't wanna mixin this in, as it is PITA + WeightedList DEFAULT_EXPLOSION_BLOCK_PARTICLES = WeightedList.builder() + .add(new ExplosionParticleInfo(ParticleTypes.POOF, 0.5F, 1.0F)) + .add(new ExplosionParticleInfo(ParticleTypes.SMOKE, 1.0F, 1.0F)) + .build(); + expression.addContextFunction("create_explosion", -1, (c, t, lv) -> { if (lv.isEmpty()) @@ -1078,7 +1080,7 @@ public class WorldAccess LivingEntity theAttacker = attacker; // copy of ServerWorld.createExplosion #TRACK# - ServerExplosion explosion = new ServerExplosion(cc.level(), source, null, null, pos, powah, createFire, mode) + ServerExplosion serverExplosion = new ServerExplosion(cc.level(), source, null, null, pos, powah, createFire, mode) { @Override @Nullable @@ -1088,14 +1090,15 @@ public class WorldAccess return theAttacker; } }; - explosion.explode(); - ParticleOptions explosionParticle = explosion.isSmall() ? ParticleTypes.EXPLOSION : ParticleTypes.EXPLOSION_EMITTER; - cc.level().players().forEach(spe -> { - if (spe.distanceToSqr(pos) < 4096.0D) - { - spe.connection.send(new ClientboundExplodePacket(pos, Optional.ofNullable(explosion.getHitPlayers().get(spe)), explosionParticle, SoundEvents.GENERIC_EXPLODE)); + int i = serverExplosion.explode(); + ParticleOptions particleOptions3 = serverExplosion.isSmall() ? ParticleTypes.EXPLOSION : ParticleTypes.EXPLOSION_EMITTER; + + for (ServerPlayer serverPlayer : cc.level().players()) { + if (serverPlayer.distanceToSqr(pos) < 4096.0) { + Optional optional = Optional.ofNullable((Vec3)serverExplosion.getHitPlayers().get(serverPlayer)); + serverPlayer.connection.send(new ClientboundExplodePacket(pos, powah, i, optional, particleOptions3, SoundEvents.GENERIC_EXPLODE, DEFAULT_EXPLOSION_BLOCK_PARTICLES)); } - }); + } return Value.TRUE; });