diff --git a/src/main/java/carpet/CarpetServer.java b/src/main/java/carpet/CarpetServer.java index a847a9fa..a2887fa8 100644 --- a/src/main/java/carpet/CarpetServer.java +++ b/src/main/java/carpet/CarpetServer.java @@ -117,9 +117,7 @@ public class CarpetServer implements ClientModInitializer,DedicatedServerModInit scriptServer.tick(); //in case something happens - CarpetSettings.impendingFillSkipUpdates = false; - CarpetSettings.currentTelepotingEntityBox = null; - CarpetSettings.fixedPosition = null; + CarpetSettings.impendingFillSkipUpdates.set(false); extensions.forEach(e -> e.onTick(server)); } diff --git a/src/main/java/carpet/CarpetSettings.java b/src/main/java/carpet/CarpetSettings.java index fb0f2253..f49d0da5 100644 --- a/src/main/java/carpet/CarpetSettings.java +++ b/src/main/java/carpet/CarpetSettings.java @@ -45,10 +45,8 @@ public class CarpetSettings { public static final String carpetVersion = "1.4.37+v210519"; public static final Logger LOG = LogManager.getLogger("carpet"); - public static boolean skipGenerationChecks = false; - public static boolean impendingFillSkipUpdates = false; - public static Box currentTelepotingEntityBox = null; - public static Vec3d fixedPosition = null; + public static ThreadLocal skipGenerationChecks = ThreadLocal.withInitial(() -> false); + public static ThreadLocal impendingFillSkipUpdates = ThreadLocal.withInitial(() -> false); public static int runPermissionLevel = 2; public static boolean doChainStone = false; public static boolean chainStoneStickToAll = false; @@ -473,6 +471,9 @@ public class CarpetSettings @Rule(desc = "Enables /player command to control/spawn players", category = COMMAND) public static String commandPlayer = "ops"; + @Rule(desc = "Spawn offline players in online mode if online-mode player with specified name does not exist", category = COMMAND) + public static boolean allowSpawningOfflinePlayers = true; + @Rule(desc = "Allows to track mobs AI via /track command", category = COMMAND) public static String commandTrackAI = "ops"; diff --git a/src/main/java/carpet/commands/DrawCommand.java b/src/main/java/carpet/commands/DrawCommand.java index 0644d88d..db4ac981 100644 --- a/src/main/java/carpet/commands/DrawCommand.java +++ b/src/main/java/carpet/commands/DrawCommand.java @@ -224,7 +224,7 @@ public class DrawCommand continue; } - CarpetSettings.impendingFillSkipUpdates = !CarpetSettings.fillUpdates; + CarpetSettings.impendingFillSkipUpdates.set(!CarpetSettings.fillUpdates); for (int xmod = -1; xmod < 2; xmod += 2) { for (int ymod = -1; ymod < 2; ymod += 2) @@ -238,7 +238,7 @@ public class DrawCommand } } } - CarpetSettings.impendingFillSkipUpdates = false; + CarpetSettings.impendingFillSkipUpdates.set(false); } } } @@ -274,7 +274,7 @@ public class DrawCommand ServerWorld world = source.getWorld(); - CarpetSettings.impendingFillSkipUpdates = !CarpetSettings.fillUpdates; + CarpetSettings.impendingFillSkipUpdates.set(!CarpetSettings.fillUpdates); for (int r = 0; r < radius; ++r) { @@ -290,7 +290,7 @@ public class DrawCommand } } - CarpetSettings.impendingFillSkipUpdates = false; + CarpetSettings.impendingFillSkipUpdates.set(false); if (CarpetSettings.fillUpdates) { @@ -377,7 +377,7 @@ public class DrawCommand ServerWorld world = source.getWorld(); - CarpetSettings.impendingFillSkipUpdates = !CarpetSettings.fillUpdates; + CarpetSettings.impendingFillSkipUpdates.set(!CarpetSettings.fillUpdates); boolean isSquare = base.equalsIgnoreCase("square"); @@ -387,7 +387,7 @@ public class DrawCommand affected+= fillFlat(world, pos, i, r, isSquare, orientation, block, replacement, list, mbpos); } - CarpetSettings.impendingFillSkipUpdates = false; + CarpetSettings.impendingFillSkipUpdates.set(false); if (CarpetSettings.fillUpdates) { @@ -429,7 +429,7 @@ public class DrawCommand ServerWorld world = source.getWorld(); - CarpetSettings.impendingFillSkipUpdates = !CarpetSettings.fillUpdates; + CarpetSettings.impendingFillSkipUpdates.set(!CarpetSettings.fillUpdates); boolean isSquare = base.equalsIgnoreCase("square"); @@ -438,7 +438,7 @@ public class DrawCommand affected+= fillFlat(world, pos, i, radius, isSquare, orientation, block, replacement, list, mbpos); } - CarpetSettings.impendingFillSkipUpdates = false; + CarpetSettings.impendingFillSkipUpdates.set(false); if (CarpetSettings.fillUpdates) { diff --git a/src/main/java/carpet/commands/PlayerCommand.java b/src/main/java/carpet/commands/PlayerCommand.java index f5677e94..aab852aa 100644 --- a/src/main/java/carpet/commands/PlayerCommand.java +++ b/src/main/java/carpet/commands/PlayerCommand.java @@ -192,9 +192,14 @@ public class PlayerCommand GameProfile profile = server.getUserCache().findByName(playerName); if (profile == null) { - Messenger.m(context.getSource(), "r Player "+playerName+" is either banned by Mojang, or auth servers are down. " + - "Banned players can only be summoned in Singleplayer and in servers in off-line mode."); - return true; + if (!CarpetSettings.allowSpawningOfflinePlayers) + { + Messenger.m(context.getSource(), "r Player "+playerName+" is either banned by Mojang, or auth servers are down. " + + "Banned players can only be summoned in Singleplayer and in servers in off-line mode."); + return true; + } else { + profile = new GameProfile(PlayerEntity.getOfflinePlayerUuid(playerName), playerName); + } } if (manager.getUserBanList().contains(profile)) { diff --git a/src/main/java/carpet/commands/ScriptCommand.java b/src/main/java/carpet/commands/ScriptCommand.java index fa61cd9e..d091dbd5 100644 --- a/src/main/java/carpet/commands/ScriptCommand.java +++ b/src/main/java/carpet/commands/ScriptCommand.java @@ -508,7 +508,7 @@ public class ScriptCommand return 1; } int successCount = 0; - CarpetSettings.impendingFillSkipUpdates = !CarpetSettings.fillUpdates; + CarpetSettings.impendingFillSkipUpdates.set(!CarpetSettings.fillUpdates); try { for (int x = area.getMinX(); x <= area.getMaxX(); x++) @@ -535,7 +535,7 @@ public class ScriptCommand } finally { - CarpetSettings.impendingFillSkipUpdates = false; + CarpetSettings.impendingFillSkipUpdates.set(false); } Messenger.m(source, "w Expression successful in " + successCount + " out of " + int_1 + " blocks"); return successCount; @@ -618,7 +618,7 @@ public class ScriptCommand } int affected = 0; - CarpetSettings.impendingFillSkipUpdates = !CarpetSettings.fillUpdates; + CarpetSettings.impendingFillSkipUpdates.set(!CarpetSettings.fillUpdates); for (int x = 0; x <= maxx; x++) { for (int y = 0; y <= maxy; y++) @@ -643,7 +643,7 @@ public class ScriptCommand } } } - CarpetSettings.impendingFillSkipUpdates = false; + CarpetSettings.impendingFillSkipUpdates.set(false); if (CarpetSettings.fillUpdates && block != null) { diff --git a/src/main/java/carpet/helpers/BlockRotator.java b/src/main/java/carpet/helpers/BlockRotator.java index fe3cd568..2d7f6b6a 100644 --- a/src/main/java/carpet/helpers/BlockRotator.java +++ b/src/main/java/carpet/helpers/BlockRotator.java @@ -53,9 +53,9 @@ public class BlockRotator { return false; } - CarpetSettings.impendingFillSkipUpdates = true; + CarpetSettings.impendingFillSkipUpdates.set(true); boolean retval = flip_block(state, world, player, hand, hit); - CarpetSettings.impendingFillSkipUpdates = false; + CarpetSettings.impendingFillSkipUpdates.set(false); return retval; } diff --git a/src/main/java/carpet/helpers/FeatureGenerator.java b/src/main/java/carpet/helpers/FeatureGenerator.java index af00e669..0cb97fc4 100644 --- a/src/main/java/carpet/helpers/FeatureGenerator.java +++ b/src/main/java/carpet/helpers/FeatureGenerator.java @@ -61,14 +61,14 @@ public class FeatureGenerator ConfiguredFeature feature = world.getRegistryManager().get(Registry.CONFIGURED_FEATURE_KEY).get(id); if (feature != null) { - CarpetSettings.skipGenerationChecks = true; + CarpetSettings.skipGenerationChecks.set(true); try { return feature.generate(world, world.getChunkManager().getChunkGenerator(), world.random, pos); } finally { - CarpetSettings.skipGenerationChecks = false; + CarpetSettings.skipGenerationChecks.set(false); } } return null; @@ -99,14 +99,14 @@ public class FeatureGenerator private static Thing simplePlop(ConfiguredFeature feature) { return (w, p) -> { - CarpetSettings.skipGenerationChecks=true; + CarpetSettings.skipGenerationChecks.set(true); try { return feature.generate(w, w.getChunkManager().getChunkGenerator(), w.random, p); } finally { - CarpetSettings.skipGenerationChecks = false; + CarpetSettings.skipGenerationChecks.set(false); } }; } diff --git a/src/main/java/carpet/mixins/BlockStateArgument_fillUpdatesMixin.java b/src/main/java/carpet/mixins/BlockStateArgument_fillUpdatesMixin.java index 0e432022..0cd7abaa 100644 --- a/src/main/java/carpet/mixins/BlockStateArgument_fillUpdatesMixin.java +++ b/src/main/java/carpet/mixins/BlockStateArgument_fillUpdatesMixin.java @@ -20,7 +20,7 @@ public class BlockStateArgument_fillUpdatesMixin )) private BlockState postProcessStateProxy(BlockState state, WorldAccess serverWorld, BlockPos blockPos) { - if (CarpetSettings.impendingFillSkipUpdates) + if (CarpetSettings.impendingFillSkipUpdates.get()) { return state; } diff --git a/src/main/java/carpet/mixins/ChunkMixin.java b/src/main/java/carpet/mixins/ChunkMixin.java index b1a9b128..5ae9c74e 100644 --- a/src/main/java/carpet/mixins/ChunkMixin.java +++ b/src/main/java/carpet/mixins/ChunkMixin.java @@ -16,6 +16,6 @@ public abstract class ChunkMixin at =@At("HEAD"), cancellable = true) private void squashWarnings(BlockPos blockPos_1, CallbackInfo ci) { - if (CarpetSettings.skipGenerationChecks) ci.cancel(); + if (CarpetSettings.skipGenerationChecks.get()) ci.cancel(); } } diff --git a/src/main/java/carpet/mixins/ChunkRegion_scarpetPlopMixin.java b/src/main/java/carpet/mixins/ChunkRegion_scarpetPlopMixin.java index fb06e695..f4a11509 100644 --- a/src/main/java/carpet/mixins/ChunkRegion_scarpetPlopMixin.java +++ b/src/main/java/carpet/mixins/ChunkRegion_scarpetPlopMixin.java @@ -11,9 +11,9 @@ import org.spongepowered.asm.mixin.injection.callback.CallbackInfo; @Mixin(ChunkRegion.class) public class ChunkRegion_scarpetPlopMixin { - @Inject(method = "markBlockForPostProcessing", at = @At("HEAD")) + @Inject(method = "markBlockForPostProcessing", at = @At("HEAD"), cancellable = true) private void markOrNot(BlockPos blockPos, CallbackInfo ci) { - if (CarpetSettings.skipGenerationChecks) ci.cancel(); + if (CarpetSettings.skipGenerationChecks.get()) ci.cancel(); } } diff --git a/src/main/java/carpet/mixins/CommandManagerMixin.java b/src/main/java/carpet/mixins/CommandManagerMixin.java index eb96d12b..0b3ef549 100644 --- a/src/main/java/carpet/mixins/CommandManagerMixin.java +++ b/src/main/java/carpet/mixins/CommandManagerMixin.java @@ -33,13 +33,13 @@ public abstract class CommandManagerMixin private void onExecuteBegin(ServerCommandSource serverCommandSource_1, String string_1, CallbackInfoReturnable cir) { if (!CarpetSettings.fillUpdates) - CarpetSettings.impendingFillSkipUpdates = true; + CarpetSettings.impendingFillSkipUpdates.set(true); } @Inject(method = "execute", at = @At("RETURN")) private void onExecuteEnd(ServerCommandSource serverCommandSource_1, String string_1, CallbackInfoReturnable cir) { - CarpetSettings.impendingFillSkipUpdates = false; + CarpetSettings.impendingFillSkipUpdates.set(false); } @SuppressWarnings("UnresolvedMixinReference") diff --git a/src/main/java/carpet/mixins/ServerPlayNetworkHandler_interactionUpdatesMixin.java b/src/main/java/carpet/mixins/ServerPlayNetworkHandler_interactionUpdatesMixin.java index a277e303..5009f83d 100644 --- a/src/main/java/carpet/mixins/ServerPlayNetworkHandler_interactionUpdatesMixin.java +++ b/src/main/java/carpet/mixins/ServerPlayNetworkHandler_interactionUpdatesMixin.java @@ -21,7 +21,7 @@ public class ServerPlayNetworkHandler_interactionUpdatesMixin private void beforeBlockInteracted(PlayerInteractBlockC2SPacket playerInteractBlockC2SPacket_1, CallbackInfo ci) { if (!CarpetSettings.interactionUpdates) - CarpetSettings.impendingFillSkipUpdates = true; + CarpetSettings.impendingFillSkipUpdates.set(true); } @Inject(method = "onPlayerInteractBlock", at = @At( @@ -32,7 +32,7 @@ public class ServerPlayNetworkHandler_interactionUpdatesMixin private void afterBlockInteracted(PlayerInteractBlockC2SPacket playerInteractBlockC2SPacket_1, CallbackInfo ci) { if (!CarpetSettings.interactionUpdates) - CarpetSettings.impendingFillSkipUpdates = false; + CarpetSettings.impendingFillSkipUpdates.set(false); } @Inject(method = "onPlayerInteractItem", at = @At( @@ -43,7 +43,7 @@ public class ServerPlayNetworkHandler_interactionUpdatesMixin private void beforeItemInteracted(PlayerInteractItemC2SPacket packet, CallbackInfo ci) { if (!CarpetSettings.interactionUpdates) - CarpetSettings.impendingFillSkipUpdates = true; + CarpetSettings.impendingFillSkipUpdates.set(true); } @Inject(method = "onPlayerInteractItem", at = @At( @@ -54,7 +54,7 @@ public class ServerPlayNetworkHandler_interactionUpdatesMixin private void afterItemInteracted(PlayerInteractItemC2SPacket packet, CallbackInfo ci) { if (!CarpetSettings.interactionUpdates) - CarpetSettings.impendingFillSkipUpdates = false; + CarpetSettings.impendingFillSkipUpdates.set(false); } @Inject(method = "onPlayerAction", at = @At( value = "INVOKE", @@ -64,7 +64,7 @@ public class ServerPlayNetworkHandler_interactionUpdatesMixin private void beforeBlockBroken(PlayerActionC2SPacket packet, CallbackInfo ci) { if (!CarpetSettings.interactionUpdates) - CarpetSettings.impendingFillSkipUpdates = true; + CarpetSettings.impendingFillSkipUpdates.set(true); } @Inject(method = "onPlayerAction", at = @At( @@ -75,7 +75,7 @@ public class ServerPlayNetworkHandler_interactionUpdatesMixin private void afterBlockBroken(PlayerActionC2SPacket packet, CallbackInfo ci) { if (!CarpetSettings.interactionUpdates) - CarpetSettings.impendingFillSkipUpdates = false; + CarpetSettings.impendingFillSkipUpdates.set(false); } } diff --git a/src/main/java/carpet/mixins/StructureBlockBlockEntity_fillUpdatesMixin.java b/src/main/java/carpet/mixins/StructureBlockBlockEntity_fillUpdatesMixin.java index 627d221f..b7279ace 100644 --- a/src/main/java/carpet/mixins/StructureBlockBlockEntity_fillUpdatesMixin.java +++ b/src/main/java/carpet/mixins/StructureBlockBlockEntity_fillUpdatesMixin.java @@ -22,14 +22,14 @@ public abstract class StructureBlockBlockEntity_fillUpdatesMixin private boolean onStructurePlacen(Structure structure, ServerWorldAccess serverWorldAccess, BlockPos pos, BlockPos blockPos, StructurePlacementData placementData, Random random, int i) { if(!CarpetSettings.fillUpdates) - CarpetSettings.impendingFillSkipUpdates = true; + CarpetSettings.impendingFillSkipUpdates.set(true); try { return structure.place(serverWorldAccess, pos, blockPos, placementData, random, i); // serverWorldAccess, pos, placementData, random); } finally { - CarpetSettings.impendingFillSkipUpdates = false; + CarpetSettings.impendingFillSkipUpdates.set(false); } } } \ No newline at end of file diff --git a/src/main/java/carpet/mixins/StructureFeatureMixin.java b/src/main/java/carpet/mixins/StructureFeatureMixin.java index d65a771c..d1ca1993 100644 --- a/src/main/java/carpet/mixins/StructureFeatureMixin.java +++ b/src/main/java/carpet/mixins/StructureFeatureMixin.java @@ -36,7 +36,7 @@ public abstract class StructureFeatureMixin implements { if (world.isClient()) return false; - CarpetSettings.skipGenerationChecks = true; + CarpetSettings.skipGenerationChecks.set(true); try { Random rand = new Random(world.getRandom().nextInt()); @@ -80,7 +80,7 @@ public abstract class StructureFeatureMixin implements } finally { - CarpetSettings.skipGenerationChecks = false; + CarpetSettings.skipGenerationChecks.set(false); } return true; } diff --git a/src/main/java/carpet/mixins/StructurePiece_scarpetPlopMixin.java b/src/main/java/carpet/mixins/StructurePiece_scarpetPlopMixin.java index 94b2cfc1..8c49bd91 100644 --- a/src/main/java/carpet/mixins/StructurePiece_scarpetPlopMixin.java +++ b/src/main/java/carpet/mixins/StructurePiece_scarpetPlopMixin.java @@ -17,6 +17,6 @@ public class StructurePiece_scarpetPlopMixin )) private void markOrNot(Chunk chunk, BlockPos pos) { - if (!CarpetSettings.skipGenerationChecks) chunk.markBlockForPostProcessing(pos); + if (!CarpetSettings.skipGenerationChecks.get()) chunk.markBlockForPostProcessing(pos); } } diff --git a/src/main/java/carpet/mixins/Structure_fillUpdatesMixin.java b/src/main/java/carpet/mixins/Structure_fillUpdatesMixin.java index 65515491..11b5216e 100644 --- a/src/main/java/carpet/mixins/Structure_fillUpdatesMixin.java +++ b/src/main/java/carpet/mixins/Structure_fillUpdatesMixin.java @@ -19,7 +19,7 @@ public class Structure_fillUpdatesMixin )) private void skipUpdateNeighbours(ServerWorldAccess serverWorldAccess, BlockPos pos, Block block) { - if (!CarpetSettings.impendingFillSkipUpdates) + if (!CarpetSettings.impendingFillSkipUpdates.get()) serverWorldAccess.updateNeighbors(pos, block); } @@ -29,6 +29,6 @@ public class Structure_fillUpdatesMixin )) private boolean skipPostprocess(StructurePlacementData structurePlacementData) { - return structurePlacementData.shouldUpdateNeighbors() || CarpetSettings.impendingFillSkipUpdates; + return structurePlacementData.shouldUpdateNeighbors() || CarpetSettings.impendingFillSkipUpdates.get(); } } diff --git a/src/main/java/carpet/mixins/WorldChunk_fillUpdatesMixin.java b/src/main/java/carpet/mixins/WorldChunk_fillUpdatesMixin.java index cde6b27e..14f3039a 100644 --- a/src/main/java/carpet/mixins/WorldChunk_fillUpdatesMixin.java +++ b/src/main/java/carpet/mixins/WorldChunk_fillUpdatesMixin.java @@ -19,7 +19,7 @@ public class WorldChunk_fillUpdatesMixin )) private void onAdded(BlockState blockState, World world_1, BlockPos blockPos_1, BlockState blockState_1, boolean boolean_1) { - if (!CarpetSettings.impendingFillSkipUpdates) + if (!CarpetSettings.impendingFillSkipUpdates.get()) blockState.onBlockAdded(world_1, blockPos_1, blockState_1, boolean_1); } @@ -29,7 +29,7 @@ public class WorldChunk_fillUpdatesMixin )) private void onRemovedBlock(BlockState blockState, World world, BlockPos pos, BlockState state, boolean moved) { - if (CarpetSettings.impendingFillSkipUpdates) // doing due dilligence from AbstractBlock onStateReplaced + if (CarpetSettings.impendingFillSkipUpdates.get()) // doing due dilligence from AbstractBlock onStateReplaced { if (blockState.hasBlockEntity() && !blockState.isOf(state.getBlock())) { diff --git a/src/main/java/carpet/mixins/World_fillUpdatesMixin.java b/src/main/java/carpet/mixins/World_fillUpdatesMixin.java index 8e9c6e1e..23cffe19 100644 --- a/src/main/java/carpet/mixins/World_fillUpdatesMixin.java +++ b/src/main/java/carpet/mixins/World_fillUpdatesMixin.java @@ -16,7 +16,7 @@ public abstract class World_fillUpdatesMixin @ModifyConstant(method = "setBlockState(Lnet/minecraft/util/math/BlockPos;Lnet/minecraft/block/BlockState;II)Z", //setBlockState main constant = @Constant(intValue = 16)) private int addFillUpdatesInt(int original) { - if (CarpetSettings.impendingFillSkipUpdates) + if (CarpetSettings.impendingFillSkipUpdates.get()) return -1; return original; } @@ -27,7 +27,7 @@ public abstract class World_fillUpdatesMixin )) private void updateNeighborsMaybe(World world, BlockPos blockPos, Block block) { - if (!CarpetSettings.impendingFillSkipUpdates) world.updateNeighbors(blockPos, block); + if (!CarpetSettings.impendingFillSkipUpdates.get()) world.updateNeighbors(blockPos, block); } } diff --git a/src/main/java/carpet/mixins/World_scarpetPlopMixin.java b/src/main/java/carpet/mixins/World_scarpetPlopMixin.java index 284ff0e3..aed0e49e 100644 --- a/src/main/java/carpet/mixins/World_scarpetPlopMixin.java +++ b/src/main/java/carpet/mixins/World_scarpetPlopMixin.java @@ -18,7 +18,7 @@ public class World_scarpetPlopMixin )) private int fixSampleHeightmap(WorldChunk chunk, Heightmap.Type type, int x, int z) { - if (CarpetSettings.skipGenerationChecks) + if (CarpetSettings.skipGenerationChecks.get()) { Heightmap.Type newType = type; if (type == Heightmap.Type.OCEAN_FLOOR_WG) newType = Heightmap.Type.OCEAN_FLOOR; diff --git a/src/main/java/carpet/patches/EntityPlayerMPFake.java b/src/main/java/carpet/patches/EntityPlayerMPFake.java index 34674f7b..ef8675a3 100644 --- a/src/main/java/carpet/patches/EntityPlayerMPFake.java +++ b/src/main/java/carpet/patches/EntityPlayerMPFake.java @@ -1,5 +1,6 @@ package carpet.patches; +import carpet.CarpetSettings; import com.mojang.authlib.GameProfile; import net.minecraft.block.entity.SkullBlockEntity; import net.minecraft.entity.Entity; @@ -22,7 +23,6 @@ import net.minecraft.util.UserCache; import net.minecraft.util.registry.RegistryKey; import net.minecraft.world.GameMode; import net.minecraft.world.World; -import net.minecraft.world.dimension.DimensionType; import carpet.fakes.ServerPlayerEntityInterface; import carpet.utils.Messenger; @@ -44,7 +44,15 @@ public class EntityPlayerMPFake extends ServerPlayerEntity finally { UserCache.setUseRemote(server.isDedicated() && server.isOnlineMode()); } - if (gameprofile == null) return null; + if (gameprofile == null) + { + if (!CarpetSettings.allowSpawningOfflinePlayers) + { + return null; + } else { + gameprofile = new GameProfile(PlayerEntity.getOfflinePlayerUuid(username), username); + } + } if (gameprofile.getProperties().containsKey("textures")) { gameprofile = SkullBlockEntity.loadProperties(gameprofile); diff --git a/src/main/java/carpet/script/annotation/Locator.java b/src/main/java/carpet/script/annotation/Locator.java index f4d49345..1f0e87e1 100644 --- a/src/main/java/carpet/script/annotation/Locator.java +++ b/src/main/java/carpet/script/annotation/Locator.java @@ -8,6 +8,7 @@ import java.util.Iterator; import org.apache.commons.lang3.NotImplementedException; +import carpet.script.CarpetContext; import carpet.script.Context; import carpet.script.argument.Argument; import carpet.script.argument.BlockArgument; @@ -17,6 +18,8 @@ import carpet.script.bundled.Module; import carpet.script.value.BlockValue; import carpet.script.value.FunctionValue; import carpet.script.value.Value; +import net.minecraft.block.BlockState; +import net.minecraft.util.math.BlockPos; import static java.lang.annotation.ElementType.PARAMETER; import static java.lang.annotation.ElementType.TYPE_USE; @@ -25,20 +28,18 @@ import static java.lang.annotation.RetentionPolicy.RUNTIME; /** *

Class that holds annotation for {@link Argument} locators to be used in Scarpet functions.

* - *

Note: Nothing in this class has been implemented at this point in time, since it requires Carpet changes. There is an implementation for - * Locator.Block working, but not implemented.

+ *

Note: Only {@link Block} locator is currently implemented.

*/ public interface Locator { /** *

Represents that the annotated argument must be gotten by passing the arguments in there into a {@link BlockArgument} locator.

* - *

Must be used in either {@link BlockValue} or {@link BlockArgument} parameters

+ *

Must be used in either {@link BlockArgument}, {@link BlockValue}, {@link BlockPos} or {@link BlockState} parameters

*/ @Documented @Retention(RUNTIME) @Target({ PARAMETER, TYPE_USE }) - @Deprecated // Not implemented, although implementation available public @interface Block { /** @@ -140,7 +141,7 @@ public interface Locator private static class BlockLocator extends AbstractLocator { - private final boolean returnBlockValue; + private final java.util.function.Function returnFunction; private final boolean acceptString; private final boolean anyString; private final boolean optional; @@ -150,11 +151,24 @@ public interface Locator this.acceptString = annotation.acceptString(); this.anyString = annotation.anyString(); this.optional = annotation.optional(); - this.returnBlockValue = type == BlockValue.class; - if (returnBlockValue && (anyString || optional)) + if (type != BlockArgument.class && (anyString || optional)) throw new IllegalArgumentException("Can only use anyString or optional parameters of Locator.Block if targeting a BlockArgument"); - if (!returnBlockValue && type != BlockArgument.class) - throw new IllegalArgumentException("Locator.Block can only be used against BlockArgument or BlockValue types!"); + this.returnFunction = getReturnFunction(type); + if (returnFunction == null) + throw new IllegalArgumentException("Locator.Block can only be used against BlockArgument, BlockValue, BlockPos or BlockState types!"); + } + + @SuppressWarnings("unchecked") + private static java.util.function.Function getReturnFunction(Class type) { + if (type == BlockArgument.class) + return r -> (R) r; + if (type == BlockValue.class) + return r -> (R) r.block; + if (type == BlockPos.class) + return r -> (R) r.block.getPos(); + if (type == BlockState.class) + return r -> (R) r.block.getBlockState(); + return null; } @Override @@ -166,10 +180,8 @@ public interface Locator @Override public R checkAndConvert(Iterator valueIterator, Context context, Context.Type theLazyT) { - BlockArgument locator = null; // BlockArgument.findIn((CarpetContext)context, valueIterator (requires changing to Value), 0, - // acceptString, optional, anyString); - // return (R) (returnBlockValue ? locator.block : locator); - throw new NotImplementedException("Locator.Block still requires adapting BlockArgument to accept iterators (which is actually simple)"); + BlockArgument locator = BlockArgument.findIn((CarpetContext) context, valueIterator, 0, acceptString, optional, anyString); + return returnFunction.apply(locator); } } diff --git a/src/main/java/carpet/script/api/WorldAccess.java b/src/main/java/carpet/script/api/WorldAccess.java index c6b5144f..fb142a3c 100644 --- a/src/main/java/carpet/script/api/WorldAccess.java +++ b/src/main/java/carpet/script/api/WorldAccess.java @@ -689,19 +689,19 @@ public class WorldAccess { // lazy cause its parked execution expression.addLazyFunction("without_updates", 1, (c, t, lv) -> { - boolean previous = CarpetSettings.impendingFillSkipUpdates; + boolean previous = CarpetSettings.impendingFillSkipUpdates.get(); if (previous) return lv.get(0); Value [] result = new Value[]{Value.NULL}; ((CarpetContext)c).s.getMinecraftServer().submitAndJoin( () -> { try { - CarpetSettings.impendingFillSkipUpdates = true; + CarpetSettings.impendingFillSkipUpdates.set(true); result[0] = lv.get(0).evalValue(c, t); } finally { - CarpetSettings.impendingFillSkipUpdates = previous; + CarpetSettings.impendingFillSkipUpdates.set(previous); } }); return (cc, tt) -> result[0]; diff --git a/src/main/java/carpet/script/argument/BlockArgument.java b/src/main/java/carpet/script/argument/BlockArgument.java index 97f3ffd2..86468d06 100644 --- a/src/main/java/carpet/script/argument/BlockArgument.java +++ b/src/main/java/carpet/script/argument/BlockArgument.java @@ -1,7 +1,6 @@ package carpet.script.argument; import carpet.script.CarpetContext; -import carpet.script.LazyValue; import carpet.script.exception.InternalExpressionException; import carpet.script.value.BlockValue; import carpet.script.value.ListValue; @@ -11,7 +10,9 @@ import carpet.script.value.StringValue; import carpet.script.value.Value; import net.minecraft.util.math.BlockPos; +import java.util.Iterator; import java.util.List; +import java.util.NoSuchElementException; public class BlockArgument extends Argument { @@ -41,26 +42,31 @@ public class BlockArgument extends Argument } public static BlockArgument findIn(CarpetContext c, List params, int offset, boolean acceptString, boolean optional, boolean anyString) + { + return findIn(c, params.listIterator(offset), offset, acceptString, optional, anyString); + } + + public static BlockArgument findIn(CarpetContext c, Iterator params, int offset, boolean acceptString, boolean optional, boolean anyString) { try { - Value v1 = params.get(0 + offset); + Value v1 = params.next(); //add conditional from string name if (optional && v1 instanceof NullValue) { - return new BlockArgument(null, 1+offset); + return new BlockArgument(null, 1 + offset); } if (anyString && v1 instanceof StringValue) { - return new BlockArgument(null, 1+offset, v1.getString()); + return new BlockArgument(null, 1 + offset, v1.getString()); } if (acceptString && v1 instanceof StringValue) { - return new BlockArgument(BlockValue.fromString(v1.getString()), 1+offset); + return new BlockArgument(BlockValue.fromString(v1.getString()), 1 + offset); } if (v1 instanceof BlockValue) { - return new BlockArgument(((BlockValue) v1), 1+offset); + return new BlockArgument(((BlockValue) v1), 1 + offset); } if (v1 instanceof ListValue) { @@ -74,21 +80,21 @@ public class BlockArgument extends Argument c.s.getWorld(), new BlockPos(c.origin.getX() + xpos, c.origin.getY() + ypos, c.origin.getZ() + zpos) ), - 1+offset); + 1 + offset); } int xpos = (int) NumericValue.asNumber(v1).getLong(); - int ypos = (int) NumericValue.asNumber( params.get(1 + offset)).getLong(); - int zpos = (int) NumericValue.asNumber( params.get(2 + offset)).getLong(); + int ypos = (int) NumericValue.asNumber( params.next()).getLong(); + int zpos = (int) NumericValue.asNumber( params.next()).getLong(); return new BlockArgument( new BlockValue( null, c.s.getWorld(), new BlockPos(c.origin.getX() + xpos, c.origin.getY() + ypos, c.origin.getZ() + zpos) ), - 3+offset + 3 + offset ); } - catch (IndexOutOfBoundsException e) + catch (IndexOutOfBoundsException | NoSuchElementException e) { throw handleError(optional, acceptString); }