From fd098151c41704b1b7f84325d1fb59534078476c Mon Sep 17 00:00:00 2001 From: gnembon <41132274+gnembon@users.noreply.github.com> Date: Thu, 16 Jan 2025 12:43:30 +0100 Subject: [PATCH] 25w03a --- gradle.properties | 2 +- .../carpet/commands/PerimeterInfoCommand.java | 2 +- .../ExperienceOrb_xpNoCooldownMixin.java | 7 ++-- .../Guardian_renewableSpongesMixin.java | 2 +- .../mixins/LevelChunk_fillUpdatesMixin.java | 6 +-- .../mixins/LevelChunk_movableBEMixin.java | 35 +++++++++--------- .../StructureBlockEntity_limitsMixin.java | 4 +- .../mixins/StructureBlockRenderer_mixin.java | 4 +- .../carpet/patches/EntityPlayerMPFake.java | 2 +- .../java/carpet/script/CarpetExpression.java | 37 +++++++++++++++++++ src/main/java/carpet/script/Expression.java | 6 +++ .../java/carpet/script/ScriptCommand.java | 20 ++++++++++ .../java/carpet/script/api/Auxiliary.java | 2 +- src/main/java/carpet/script/api/Entities.java | 2 +- .../java/carpet/script/value/EntityValue.java | 2 +- src/main/java/carpet/utils/BlockInfo.java | 2 +- .../carpet/utils/PerimeterDiagnostics.java | 2 +- src/main/java/carpet/utils/SpawnReporter.java | 2 +- 18 files changed, 100 insertions(+), 39 deletions(-) diff --git a/gradle.properties b/gradle.properties index b79a9aa3..469ac583 100644 --- a/gradle.properties +++ b/gradle.properties @@ -3,7 +3,7 @@ org.gradle.jvmargs=-Xmx1G # Fabric Properties # check https://fabricmc.net/develop/ - minecraft_version=25w02a + minecraft_version=25w03a loader_version=0.16.10 jsr305_version=3.0.2 fabric_version=0.110.5+1.21.4 diff --git a/src/main/java/carpet/commands/PerimeterInfoCommand.java b/src/main/java/carpet/commands/PerimeterInfoCommand.java index f28885bd..7240fc8a 100644 --- a/src/main/java/carpet/commands/PerimeterInfoCommand.java +++ b/src/main/java/carpet/commands/PerimeterInfoCommand.java @@ -56,7 +56,7 @@ public class PerimeterInfoCommand { nbttagcompound.putString("id", mobId); Entity baseEntity = EntityType.loadEntityRecursive(nbttagcompound, source.getLevel(), EntitySpawnReason.COMMAND, (entity_1x) -> { - entity_1x.moveTo(new BlockPos(pos.getX(), source.getLevel().getMinY()-10, pos.getZ()), entity_1x.getYRot(), entity_1x. getXRot()); + entity_1x.snapTo(new BlockPos(pos.getX(), source.getLevel().getMinY()-10, pos.getZ()), entity_1x.getYRot(), entity_1x. getXRot()); return !source.getLevel().addWithUUID(entity_1x) ? null : entity_1x; }); if (!(baseEntity instanceof Mob)) diff --git a/src/main/java/carpet/mixins/ExperienceOrb_xpNoCooldownMixin.java b/src/main/java/carpet/mixins/ExperienceOrb_xpNoCooldownMixin.java index 0b04c22b..7c590b6e 100644 --- a/src/main/java/carpet/mixins/ExperienceOrb_xpNoCooldownMixin.java +++ b/src/main/java/carpet/mixins/ExperienceOrb_xpNoCooldownMixin.java @@ -19,9 +19,6 @@ public abstract class ExperienceOrb_xpNoCooldownMixin extends Entity @Shadow private int count; - @Shadow - private int value; - public ExperienceOrb_xpNoCooldownMixin(EntityType type, Level world) { super(type, world); @@ -30,13 +27,15 @@ public abstract class ExperienceOrb_xpNoCooldownMixin extends Entity @Shadow protected abstract int repairPlayerItems(ServerPlayer player, int amount); + @Shadow public abstract int getValue(); + @Inject(method = "playerTouch", at = @At("HEAD")) private void addXP(Player player, CallbackInfo ci) { if (CarpetSettings.xpNoCooldown && !level().isClientSide) { player.takeXpDelay = 0; // reducing the count to 1 and leaving vanilla to deal with it while (this.count > 1) { - int remainder = this.repairPlayerItems((ServerPlayer) player, this.value); + int remainder = this.repairPlayerItems((ServerPlayer) player, this.getValue()); if (remainder > 0) { player.giveExperiencePoints(remainder); } diff --git a/src/main/java/carpet/mixins/Guardian_renewableSpongesMixin.java b/src/main/java/carpet/mixins/Guardian_renewableSpongesMixin.java index 9ed6a3c0..d2fc84d3 100644 --- a/src/main/java/carpet/mixins/Guardian_renewableSpongesMixin.java +++ b/src/main/java/carpet/mixins/Guardian_renewableSpongesMixin.java @@ -25,7 +25,7 @@ public abstract class Guardian_renewableSpongesMixin extends Monster if (!this.level().isClientSide && !this.isRemoved() && CarpetSettings.renewableSponges && !((Object)this instanceof ElderGuardian)) { ElderGuardian elderGuardian = new ElderGuardian(EntityType.ELDER_GUARDIAN ,this.level()); - elderGuardian.moveTo(this.getX(), this.getY(), this.getZ(), this.getYRot(), this.getXRot()); + elderGuardian.snapTo(this.getX(), this.getY(), this.getZ(), this.getYRot(), this.getXRot()); elderGuardian.finalizeSpawn(serverWorld ,this.level().getCurrentDifficultyAt(elderGuardian.blockPosition()), EntitySpawnReason.CONVERSION, null); elderGuardian.setNoAi(this.isNoAi()); diff --git a/src/main/java/carpet/mixins/LevelChunk_fillUpdatesMixin.java b/src/main/java/carpet/mixins/LevelChunk_fillUpdatesMixin.java index d0eec071..7b5458ef 100644 --- a/src/main/java/carpet/mixins/LevelChunk_fillUpdatesMixin.java +++ b/src/main/java/carpet/mixins/LevelChunk_fillUpdatesMixin.java @@ -27,13 +27,13 @@ public class LevelChunk_fillUpdatesMixin @Redirect(method = "setBlockState", at = @At( value = "INVOKE", - target = "Lnet/minecraft/world/level/block/entity/BlockEntity;preRemoveSideEffects(Lnet/minecraft/core/BlockPos;Lnet/minecraft/world/level/block/state/BlockState;Z)V" + target = "Lnet/minecraft/world/level/block/entity/BlockEntity;preRemoveSideEffects(Lnet/minecraft/core/BlockPos;Lnet/minecraft/world/level/block/state/BlockState;)V" )) - private void onPreRemoveSideEffects(BlockEntity blockEntity, BlockPos blockPos_1, BlockState blockState_1, boolean boolean_1) + private void onPreRemoveSideEffects(BlockEntity blockEntity, BlockPos blockPos_1, BlockState blockState_1) { if (!CarpetSettings.impendingFillSkipUpdates.get()) { - blockEntity.preRemoveSideEffects(blockPos_1, blockState_1, boolean_1); + blockEntity.preRemoveSideEffects(blockPos_1, blockState_1); } } diff --git a/src/main/java/carpet/mixins/LevelChunk_movableBEMixin.java b/src/main/java/carpet/mixins/LevelChunk_movableBEMixin.java index 43a7d36f..6aa9b979 100644 --- a/src/main/java/carpet/mixins/LevelChunk_movableBEMixin.java +++ b/src/main/java/carpet/mixins/LevelChunk_movableBEMixin.java @@ -12,6 +12,7 @@ import net.minecraft.world.level.ChunkPos; import net.minecraft.world.level.Level; import net.minecraft.world.level.LevelHeightAccessor; import net.minecraft.world.level.biome.Biome; +import net.minecraft.world.level.block.BaseRailBlock; import net.minecraft.world.level.block.Block; import net.minecraft.world.level.block.EntityBlock; import net.minecraft.world.level.block.entity.BlockEntity; @@ -81,7 +82,7 @@ public abstract class LevelChunk_movableBEMixin extends ChunkAccess implements W public BlockState setBlockStateWithBlockEntity(BlockPos blockPos_1, BlockState newBlockState, BlockEntity newBlockEntity, int flags) { - boolean boolean_1 = (flags & 64) != 0; + int y = blockPos_1.getY(); LevelChunkSection chunkSection = this.getSection(this.getSectionIndex(y)); @@ -122,37 +123,35 @@ public abstract class LevelChunk_movableBEMixin extends ChunkAccess implements W profiler.pop(); } - boolean hadBlockEntity = oldBlockState.hasBlockEntity(); boolean blockChanged = !oldBlockState.is(newBlock); - + boolean boolean_1 = (flags & 64) != 0; // moved by pistons boolean sideEffects = (flags & Block.UPDATE_SKIP_BLOCK_ENTITY_SIDEEFFECTS) == 0; - if (blockChanged) { + if (blockChanged && oldBlockState.hasBlockEntity()) { if (level instanceof ServerLevel serverLevel && !(oldBlockState.getBlock() instanceof MovingPistonBlock)) { - if (hadBlockEntity && sideEffects) { - final BlockEntity blockEntity = level.getBlockEntity(blockPos_1); + if (sideEffects) { + BlockEntity blockEntity = level.getBlockEntity(blockPos_1); if (blockEntity != null) { - blockEntity.preRemoveSideEffects(blockPos_1, oldBlockState, boolean_1); + blockEntity.preRemoveSideEffects(blockPos_1, oldBlockState); } } + } + removeBlockEntity(blockPos_1); + } - if (hadBlockEntity) { - removeBlockEntity(blockPos_1); - } - if ((flags & Block.UPDATE_NEIGHBORS) != 0) { // scary change // so many other places that used to call this regardless if the UPDATE_NEIGHBORS flag was set + if (blockChanged || newBlock instanceof BaseRailBlock) + { + if (level instanceof ServerLevel serverLevel && !(oldBlockState.getBlock() instanceof MovingPistonBlock)) + { + if ((flags & Block.UPDATE_NEIGHBORS) != 0 || boolean_1) + { oldBlockState.affectNeighborsAfterRemoval(serverLevel, blockPos_1, boolean_1); } - } else if (hadBlockEntity) { - removeBlockEntity(blockPos_1); } } - - - - - if (chunkSection.getBlockState(x, chunkY, z).getBlock() != newBlock) + if (chunkSection.getBlockState(x, chunkY, z).getBlock() != newBlock) { return null; } diff --git a/src/main/java/carpet/mixins/StructureBlockEntity_limitsMixin.java b/src/main/java/carpet/mixins/StructureBlockEntity_limitsMixin.java index f0c758bb..84081048 100644 --- a/src/main/java/carpet/mixins/StructureBlockEntity_limitsMixin.java +++ b/src/main/java/carpet/mixins/StructureBlockEntity_limitsMixin.java @@ -29,14 +29,14 @@ public abstract class StructureBlockEntity_limitsMixin } @ModifyArg( - method = "saveStructure(Z)Z", + method = "saveStructure(Lnet/minecraft/server/level/ServerLevel;Lnet/minecraft/resources/ResourceLocation;Lnet/minecraft/core/BlockPos;Lnet/minecraft/core/Vec3i;ZLjava/lang/String;Z)Z", at = @At( value = "INVOKE", target = "Lnet/minecraft/world/level/levelgen/structure/templatesystem/StructureTemplate;fillFromWorld(Lnet/minecraft/world/level/Level;Lnet/minecraft/core/BlockPos;Lnet/minecraft/core/Vec3i;ZLnet/minecraft/world/level/block/Block;)V" ), index = 4 ) - private Block ignoredBlock(Block original) { + private static Block ignoredBlock(Block original) { return CarpetSettings.structureBlockIgnoredBlock; } } diff --git a/src/main/java/carpet/mixins/StructureBlockRenderer_mixin.java b/src/main/java/carpet/mixins/StructureBlockRenderer_mixin.java index 56bd7974..9fddba60 100644 --- a/src/main/java/carpet/mixins/StructureBlockRenderer_mixin.java +++ b/src/main/java/carpet/mixins/StructureBlockRenderer_mixin.java @@ -2,14 +2,14 @@ package carpet.mixins; import carpet.CarpetSettings; import net.minecraft.client.renderer.blockentity.BlockEntityRenderer; -import net.minecraft.client.renderer.blockentity.StructureBlockRenderer; +import net.minecraft.client.renderer.blockentity.BlockEntityWithBoundingBoxRenderer; import net.minecraft.world.level.block.entity.StructureBlockEntity; import org.spongepowered.asm.mixin.Mixin; import org.spongepowered.asm.mixin.injection.At; import org.spongepowered.asm.mixin.injection.Inject; import org.spongepowered.asm.mixin.injection.callback.CallbackInfoReturnable; -@Mixin(StructureBlockRenderer.class) +@Mixin(BlockEntityWithBoundingBoxRenderer.class) public abstract class StructureBlockRenderer_mixin implements BlockEntityRenderer { @Inject(method = "getViewDistance", at = @At("HEAD"), cancellable = true) diff --git a/src/main/java/carpet/patches/EntityPlayerMPFake.java b/src/main/java/carpet/patches/EntityPlayerMPFake.java index 271b8e62..70b27705 100644 --- a/src/main/java/carpet/patches/EntityPlayerMPFake.java +++ b/src/main/java/carpet/patches/EntityPlayerMPFake.java @@ -93,7 +93,7 @@ public class EntityPlayerMPFake extends ServerPlayer current = p.get(); } EntityPlayerMPFake instance = new EntityPlayerMPFake(server, worldIn, current, ClientInformation.createDefault(), false); - instance.fixStartingPosition = () -> instance.moveTo(pos.x, pos.y, pos.z, (float) yaw, (float) pitch); + instance.fixStartingPosition = () -> instance.snapTo(pos.x, pos.y, pos.z, (float) yaw, (float) pitch); server.getPlayerList().placeNewPlayer(new FakeClientConnection(PacketFlow.SERVERBOUND), instance, new CommonListenerCookie(current, 0, instance.clientInformation(), false)); instance.teleportTo(worldIn, pos.x, pos.y, pos.z, Set.of(), (float) yaw, (float) pitch, true); instance.setHealth(20.0F); diff --git a/src/main/java/carpet/script/CarpetExpression.java b/src/main/java/carpet/script/CarpetExpression.java index 8535812a..ee0f51f5 100644 --- a/src/main/java/carpet/script/CarpetExpression.java +++ b/src/main/java/carpet/script/CarpetExpression.java @@ -141,4 +141,41 @@ public class CarpetExpression throw new CarpetExpressionException("Your thoughts are too deep", null); } } + + public Value explain(ScriptHost host, BlockPos pos) + { + // convert to explain + CarpetScriptServer scriptServer = (CarpetScriptServer) host.scriptServer(); + try + { + Context context = new CarpetContext(host, source, origin). + with("x", (c, t) -> new NumericValue(pos.getX() - origin.getX()).bindTo("x")). + with("y", (c, t) -> new NumericValue(pos.getY() - origin.getY()).bindTo("y")). + with("z", (c, t) -> new NumericValue(pos.getZ() - origin.getZ()).bindTo("z")); + Entity e = source.getEntity(); + if (e == null) + { + Value nullPlayer = Value.NULL.reboundedTo("p"); + context.with("p", (cc, tt) -> nullPlayer); + } + else + { + Value playerValue = new EntityValue(e).bindTo("p"); + context.with("p", (cc, tt) -> playerValue); + } + return scriptServer.events.handleEvents.getWhileDisabled(() -> this.expr.explain(context)); + } + catch (ExpressionException e) + { + throw new CarpetExpressionException(e.getMessage(), e.stack); + } + catch (ArithmeticException ae) + { + throw new CarpetExpressionException("Math doesn't compute... " + ae.getMessage(), null); + } + catch (StackOverflowError soe) + { + throw new CarpetExpressionException("Your thoughts are too deep", null); + } + } } diff --git a/src/main/java/carpet/script/Expression.java b/src/main/java/carpet/script/Expression.java index 7f427a40..a76fa015 100644 --- a/src/main/java/carpet/script/Expression.java +++ b/src/main/java/carpet/script/Expression.java @@ -1251,6 +1251,12 @@ public class Expression return extractOp(optimizeOnlyContext, root, Context.Type.NONE); } + public Value explain(Context context) + { + //todo convert to explain + return Value.NULL; + } + private int treeSize(ExpressionNode node) { return node.op instanceof LazyValue.ContextFreeLazyValue ? 1 : node.args.stream().mapToInt(this::treeSize).sum() + 1; diff --git a/src/main/java/carpet/script/ScriptCommand.java b/src/main/java/carpet/script/ScriptCommand.java index d551f5bd..0a0b2188 100644 --- a/src/main/java/carpet/script/ScriptCommand.java +++ b/src/main/java/carpet/script/ScriptCommand.java @@ -5,6 +5,7 @@ import carpet.script.external.Vanilla; import carpet.script.utils.AppStoreManager; import carpet.script.exception.CarpetExpressionException; import carpet.script.value.FunctionValue; +import carpet.script.value.NumericValue; import carpet.script.value.Value; import com.mojang.brigadier.CommandDispatcher; import com.mojang.brigadier.arguments.StringArgumentType; @@ -358,6 +359,12 @@ public class ScriptCommand boolean success = ss(cc).uninstallApp(cc.getSource(), StringArgumentType.getString(cc, "app")); return success ? 1 : 0; })); + LiteralArgumentBuilder x = literal("explain"). + requires(Vanilla::ServerPlayer_canScriptACE). + then(argument("expr", StringArgumentType.greedyString()).suggests(ScriptCommand::suggestCode). + executes((cc) -> explain( + cc, + StringArgumentType.getString(cc, "expr")))); dispatcher.register(literal("script"). requires(Vanilla::ServerPlayer_canScriptGeneral). @@ -536,6 +543,19 @@ public class ScriptCommand }); } + private static int explain(CommandContext context, String expr) throws CommandSyntaxException + { + CommandSourceStack source = context.getSource(); + CarpetScriptHost host = getHost(context); + return handleCall(source, host, () -> { + CarpetExpression ex = new CarpetExpression(host.main, expr, source, new BlockPos(0, 0, 0)); + ex.explain(host, BlockPos.containing(source.getPosition())); + Carpet.Messenger_message(source, "w Expression: ", "wb " + expr); + Carpet.Messenger_message(source, "w Tokens: ", "wb " + ex.getExpr().toString()); + return NumericValue.ONE; + }); + } + private static int scriptScan(CommandContext context, BlockPos origin, BlockPos a, BlockPos b, String expr) throws CommandSyntaxException { CommandSourceStack source = context.getSource(); diff --git a/src/main/java/carpet/script/api/Auxiliary.java b/src/main/java/carpet/script/api/Auxiliary.java index b5b5e9c9..960d44b7 100644 --- a/src/main/java/carpet/script/api/Auxiliary.java +++ b/src/main/java/carpet/script/api/Auxiliary.java @@ -401,7 +401,7 @@ public class Auxiliary yoffset = -armorstand.getBbHeight() + 0.3; } } - armorstand.moveTo( + armorstand.snapTo( pointLocator.vec.x, //pointLocator.vec.y - ((!interactable && targetBlock == null)?0.41f:((targetBlock==null)?(armorstand.getHeight()+0.41):(armorstand.getHeight()-0.3))), pointLocator.vec.y + yoffset, diff --git a/src/main/java/carpet/script/api/Entities.java b/src/main/java/carpet/script/api/Entities.java index 68f74866..9c478d4b 100644 --- a/src/main/java/carpet/script/api/Entities.java +++ b/src/main/java/carpet/script/api/Entities.java @@ -143,7 +143,7 @@ public class Entities ServerLevel serverWorld = cc.level(); Entity entity = EntityType.loadEntityRecursive(tag, serverWorld, EntitySpawnReason.COMMAND, e -> { - e.moveTo(vec3d.x, vec3d.y, vec3d.z, e.getYRot(), e.getXRot()); + e.snapTo(vec3d.x, vec3d.y, vec3d.z, e.getYRot(), e.getXRot()); return e; }); if (entity == null) diff --git a/src/main/java/carpet/script/value/EntityValue.java b/src/main/java/carpet/script/value/EntityValue.java index 4fbcc5c0..16731668 100644 --- a/src/main/java/carpet/script/value/EntityValue.java +++ b/src/main/java/carpet/script/value/EntityValue.java @@ -911,7 +911,7 @@ public class EntityValue extends Value } else { - e.moveTo(x, y, z, yaw, pitch); + e.snapTo(x, y, z, yaw, pitch); // we were sending to players for not-living entites, that were untracked. Living entities should be tracked. //((ServerWorld) e.getEntityWorld()).getChunkManager().sendToNearbyPlayers(e, new EntityS2CPacket.(e)); if (e instanceof LivingEntity le) diff --git a/src/main/java/carpet/utils/BlockInfo.java b/src/main/java/carpet/utils/BlockInfo.java index 67b70496..ba41f635 100644 --- a/src/main/java/carpet/utils/BlockInfo.java +++ b/src/main/java/carpet/utils/BlockInfo.java @@ -76,7 +76,7 @@ public class BlockInfo { PathfinderMob creature = new ZombifiedPiglin(EntityType.ZOMBIFIED_PIGLIN, worldIn); creature.finalizeSpawn(worldIn, worldIn.getCurrentDifficultyAt(pos), EntitySpawnReason.NATURAL, null); - creature.moveTo(pos, 0.0F, 0.0F); + creature.snapTo(pos, 0.0F, 0.0F); RandomStrollGoal wander = new RandomStrollGoal(creature, 0.8D); int success = 0; for (int i=0; i<1000; i++) diff --git a/src/main/java/carpet/utils/PerimeterDiagnostics.java b/src/main/java/carpet/utils/PerimeterDiagnostics.java index 416fd702..c36f17f6 100644 --- a/src/main/java/carpet/utils/PerimeterDiagnostics.java +++ b/src/main/java/carpet/utils/PerimeterDiagnostics.java @@ -180,7 +180,7 @@ public class PerimeterDiagnostics if (SpawnPlacements.isSpawnPositionOk(sle.type(), worldServer, pos)) { - el.moveTo(pos.getX() + 0.5F, pos.getY(), pos.getZ()+0.5F, 0.0F, 0.0F); + el.snapTo(pos.getX() + 0.5F, pos.getY(), pos.getZ()+0.5F, 0.0F, 0.0F); return el.checkSpawnObstruction(worldServer) && el.checkSpawnRules(worldServer, EntitySpawnReason.NATURAL) && SpawnPlacements.checkSpawnRules(el.getType(),(ServerLevel)el.getCommandSenderWorld(), EntitySpawnReason.NATURAL, el.blockPosition(), el.getCommandSenderWorld().random) && worldServer.noCollision(el); // check collision rules once they stop fiddling with them after 1.14.1 diff --git a/src/main/java/carpet/utils/SpawnReporter.java b/src/main/java/carpet/utils/SpawnReporter.java index 0b21446e..4c96755d 100644 --- a/src/main/java/carpet/utils/SpawnReporter.java +++ b/src/main/java/carpet/utils/SpawnReporter.java @@ -439,7 +439,7 @@ public class SpawnReporter { float f = x + 0.5F; float f1 = z + 0.5F; - mob.moveTo(f, y, f1, worldIn.random.nextFloat() * 360.0F, 0.0F); + mob.snapTo(f, y, f1, worldIn.random.nextFloat() * 360.0F, 0.0F); fits = worldIn.noCollision(mob); EntityType etype = mob.getType();