more thread safe carpet globs

This commit is contained in:
gnembon committed 2021-05-25 17:24:14 -03:00
1 parent 5d00709b1f
commit f18cc1c836
19 files changed
+48 -52

No files matched your search

+1 -3
View File
@@ -117,9 +117,7 @@ public class CarpetServer implements ClientModInitializer,DedicatedServerModInit
scriptServer.tick(); scriptServer.tick();
//in case something happens //in case something happens
CarpetSettings.impendingFillSkipUpdates = false; CarpetSettings.impendingFillSkipUpdates.set(false);
CarpetSettings.currentTelepotingEntityBox = null;
CarpetSettings.fixedPosition = null;
extensions.forEach(e -> e.onTick(server)); extensions.forEach(e -> e.onTick(server));
} }
+2 -4
View File
@@ -45,10 +45,8 @@ public class CarpetSettings
{ {
public static final String carpetVersion = "1.4.37+v210519"; public static final String carpetVersion = "1.4.37+v210519";
public static final Logger LOG = LogManager.getLogger("carpet"); public static final Logger LOG = LogManager.getLogger("carpet");
public static boolean skipGenerationChecks = false; public static ThreadLocal<Boolean> skipGenerationChecks = ThreadLocal.withInitial(() -> false);
public static boolean impendingFillSkipUpdates = false; public static ThreadLocal<Boolean> impendingFillSkipUpdates = ThreadLocal.withInitial(() -> false);
public static Box currentTelepotingEntityBox = null;
public static Vec3d fixedPosition = null;
public static int runPermissionLevel = 2; public static int runPermissionLevel = 2;
public static boolean doChainStone = false; public static boolean doChainStone = false;
public static boolean chainStoneStickToAll = false; public static boolean chainStoneStickToAll = false;
@@ -224,7 +224,7 @@ public class DrawCommand
continue; continue;
} }
CarpetSettings.impendingFillSkipUpdates = !CarpetSettings.fillUpdates; CarpetSettings.impendingFillSkipUpdates.set(!CarpetSettings.fillUpdates);
for (int xmod = -1; xmod < 2; xmod += 2) for (int xmod = -1; xmod < 2; xmod += 2)
{ {
for (int ymod = -1; ymod < 2; ymod += 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(); ServerWorld world = source.getWorld();
CarpetSettings.impendingFillSkipUpdates = !CarpetSettings.fillUpdates; CarpetSettings.impendingFillSkipUpdates.set(!CarpetSettings.fillUpdates);
for (int r = 0; r < radius; ++r) for (int r = 0; r < radius; ++r)
{ {
@@ -290,7 +290,7 @@ public class DrawCommand
} }
} }
CarpetSettings.impendingFillSkipUpdates = false; CarpetSettings.impendingFillSkipUpdates.set(false);
if (CarpetSettings.fillUpdates) if (CarpetSettings.fillUpdates)
{ {
@@ -377,7 +377,7 @@ public class DrawCommand
ServerWorld world = source.getWorld(); ServerWorld world = source.getWorld();
CarpetSettings.impendingFillSkipUpdates = !CarpetSettings.fillUpdates; CarpetSettings.impendingFillSkipUpdates.set(!CarpetSettings.fillUpdates);
boolean isSquare = base.equalsIgnoreCase("square"); boolean isSquare = base.equalsIgnoreCase("square");
@@ -387,7 +387,7 @@ public class DrawCommand
affected+= fillFlat(world, pos, i, r, isSquare, orientation, block, replacement, list, mbpos); affected+= fillFlat(world, pos, i, r, isSquare, orientation, block, replacement, list, mbpos);
} }
CarpetSettings.impendingFillSkipUpdates = false; CarpetSettings.impendingFillSkipUpdates.set(false);
if (CarpetSettings.fillUpdates) { if (CarpetSettings.fillUpdates) {
@@ -429,7 +429,7 @@ public class DrawCommand
ServerWorld world = source.getWorld(); ServerWorld world = source.getWorld();
CarpetSettings.impendingFillSkipUpdates = !CarpetSettings.fillUpdates; CarpetSettings.impendingFillSkipUpdates.set(!CarpetSettings.fillUpdates);
boolean isSquare = base.equalsIgnoreCase("square"); boolean isSquare = base.equalsIgnoreCase("square");
@@ -438,7 +438,7 @@ public class DrawCommand
affected+= fillFlat(world, pos, i, radius, isSquare, orientation, block, replacement, list, mbpos); affected+= fillFlat(world, pos, i, radius, isSquare, orientation, block, replacement, list, mbpos);
} }
CarpetSettings.impendingFillSkipUpdates = false; CarpetSettings.impendingFillSkipUpdates.set(false);
if (CarpetSettings.fillUpdates) { if (CarpetSettings.fillUpdates) {
@@ -508,7 +508,7 @@ public class ScriptCommand
return 1; return 1;
} }
int successCount = 0; int successCount = 0;
CarpetSettings.impendingFillSkipUpdates = !CarpetSettings.fillUpdates; CarpetSettings.impendingFillSkipUpdates.set(!CarpetSettings.fillUpdates);
try try
{ {
for (int x = area.minX; x <= area.maxX; x++) for (int x = area.minX; x <= area.maxX; x++)
@@ -535,7 +535,7 @@ public class ScriptCommand
} }
finally finally
{ {
CarpetSettings.impendingFillSkipUpdates = false; CarpetSettings.impendingFillSkipUpdates.set(false);
} }
Messenger.m(source, "w Expression successful in " + successCount + " out of " + int_1 + " blocks"); Messenger.m(source, "w Expression successful in " + successCount + " out of " + int_1 + " blocks");
return successCount; return successCount;
@@ -618,7 +618,7 @@ public class ScriptCommand
} }
int affected = 0; int affected = 0;
CarpetSettings.impendingFillSkipUpdates = !CarpetSettings.fillUpdates; CarpetSettings.impendingFillSkipUpdates.set(!CarpetSettings.fillUpdates);
for (int x = 0; x <= maxx; x++) for (int x = 0; x <= maxx; x++)
{ {
for (int y = 0; y <= maxy; y++) 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) if (CarpetSettings.fillUpdates && block != null)
{ {
@@ -53,9 +53,9 @@ public class BlockRotator
{ {
return false; return false;
} }
CarpetSettings.impendingFillSkipUpdates = true; CarpetSettings.impendingFillSkipUpdates.set(true);
boolean retval = flip_block(state, world, player, hand, hit); boolean retval = flip_block(state, world, player, hand, hit);
CarpetSettings.impendingFillSkipUpdates = false; CarpetSettings.impendingFillSkipUpdates.set(false);
return retval; return retval;
} }
@@ -61,14 +61,14 @@ public class FeatureGenerator
ConfiguredFeature<?, ?> feature = world.getRegistryManager().get(Registry.CONFIGURED_FEATURE_WORLDGEN).get(id); ConfiguredFeature<?, ?> feature = world.getRegistryManager().get(Registry.CONFIGURED_FEATURE_WORLDGEN).get(id);
if (feature != null) if (feature != null)
{ {
CarpetSettings.skipGenerationChecks = true; CarpetSettings.skipGenerationChecks.set(true);
try try
{ {
return feature.generate(world, world.getChunkManager().getChunkGenerator(), world.random, pos); return feature.generate(world, world.getChunkManager().getChunkGenerator(), world.random, pos);
} }
finally finally
{ {
CarpetSettings.skipGenerationChecks = false; CarpetSettings.skipGenerationChecks.set(false);
} }
} }
return null; return null;
@@ -99,14 +99,14 @@ public class FeatureGenerator
private static Thing simplePlop(ConfiguredFeature feature) private static Thing simplePlop(ConfiguredFeature feature)
{ {
return (w, p) -> { return (w, p) -> {
CarpetSettings.skipGenerationChecks=true; CarpetSettings.skipGenerationChecks.set(true);
try try
{ {
return feature.generate(w, w.getChunkManager().getChunkGenerator(), w.random, p); return feature.generate(w, w.getChunkManager().getChunkGenerator(), w.random, p);
} }
finally finally
{ {
CarpetSettings.skipGenerationChecks = false; CarpetSettings.skipGenerationChecks.set(false);
} }
}; };
} }
@@ -20,7 +20,7 @@ public class BlockStateArgument_fillUpdatesMixin
)) ))
private BlockState postProcessStateProxy(BlockState state, WorldAccess serverWorld, BlockPos blockPos) private BlockState postProcessStateProxy(BlockState state, WorldAccess serverWorld, BlockPos blockPos)
{ {
if (CarpetSettings.impendingFillSkipUpdates) if (CarpetSettings.impendingFillSkipUpdates.get())
{ {
return state; return state;
} }
+1 -1
View File
@@ -16,6 +16,6 @@ public abstract class ChunkMixin
at =@At("HEAD"), cancellable = true) at =@At("HEAD"), cancellable = true)
private void squashWarnings(BlockPos blockPos_1, CallbackInfo ci) private void squashWarnings(BlockPos blockPos_1, CallbackInfo ci)
{ {
if (CarpetSettings.skipGenerationChecks) ci.cancel(); if (CarpetSettings.skipGenerationChecks.get()) ci.cancel();
} }
} }
@@ -11,9 +11,9 @@ import org.spongepowered.asm.mixin.injection.callback.CallbackInfo;
@Mixin(ChunkRegion.class) @Mixin(ChunkRegion.class)
public class ChunkRegion_scarpetPlopMixin 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) private void markOrNot(BlockPos blockPos, CallbackInfo ci)
{ {
if (CarpetSettings.skipGenerationChecks) ci.cancel(); if (CarpetSettings.skipGenerationChecks.get()) ci.cancel();
} }
} }
@@ -33,13 +33,13 @@ public abstract class CommandManagerMixin
private void onExecuteBegin(ServerCommandSource serverCommandSource_1, String string_1, CallbackInfoReturnable<Integer> cir) private void onExecuteBegin(ServerCommandSource serverCommandSource_1, String string_1, CallbackInfoReturnable<Integer> cir)
{ {
if (!CarpetSettings.fillUpdates) if (!CarpetSettings.fillUpdates)
CarpetSettings.impendingFillSkipUpdates = true; CarpetSettings.impendingFillSkipUpdates.set(true);
} }
@Inject(method = "execute", at = @At("RETURN")) @Inject(method = "execute", at = @At("RETURN"))
private void onExecuteEnd(ServerCommandSource serverCommandSource_1, String string_1, CallbackInfoReturnable<Integer> cir) private void onExecuteEnd(ServerCommandSource serverCommandSource_1, String string_1, CallbackInfoReturnable<Integer> cir)
{ {
CarpetSettings.impendingFillSkipUpdates = false; CarpetSettings.impendingFillSkipUpdates.set(false);
} }
@SuppressWarnings("UnresolvedMixinReference") @SuppressWarnings("UnresolvedMixinReference")
@@ -21,7 +21,7 @@ public class ServerPlayNetworkHandler_interactionUpdatesMixin
private void beforeBlockInteracted(PlayerInteractBlockC2SPacket playerInteractBlockC2SPacket_1, CallbackInfo ci) private void beforeBlockInteracted(PlayerInteractBlockC2SPacket playerInteractBlockC2SPacket_1, CallbackInfo ci)
{ {
if (!CarpetSettings.interactionUpdates) if (!CarpetSettings.interactionUpdates)
CarpetSettings.impendingFillSkipUpdates = true; CarpetSettings.impendingFillSkipUpdates.set(true);
} }
@Inject(method = "onPlayerInteractBlock", at = @At( @Inject(method = "onPlayerInteractBlock", at = @At(
@@ -32,7 +32,7 @@ public class ServerPlayNetworkHandler_interactionUpdatesMixin
private void afterBlockInteracted(PlayerInteractBlockC2SPacket playerInteractBlockC2SPacket_1, CallbackInfo ci) private void afterBlockInteracted(PlayerInteractBlockC2SPacket playerInteractBlockC2SPacket_1, CallbackInfo ci)
{ {
if (!CarpetSettings.interactionUpdates) if (!CarpetSettings.interactionUpdates)
CarpetSettings.impendingFillSkipUpdates = false; CarpetSettings.impendingFillSkipUpdates.set(false);
} }
@Inject(method = "onPlayerInteractItem", at = @At( @Inject(method = "onPlayerInteractItem", at = @At(
@@ -43,7 +43,7 @@ public class ServerPlayNetworkHandler_interactionUpdatesMixin
private void beforeItemInteracted(PlayerInteractItemC2SPacket packet, CallbackInfo ci) private void beforeItemInteracted(PlayerInteractItemC2SPacket packet, CallbackInfo ci)
{ {
if (!CarpetSettings.interactionUpdates) if (!CarpetSettings.interactionUpdates)
CarpetSettings.impendingFillSkipUpdates = true; CarpetSettings.impendingFillSkipUpdates.set(true);
} }
@Inject(method = "onPlayerInteractItem", at = @At( @Inject(method = "onPlayerInteractItem", at = @At(
@@ -54,7 +54,7 @@ public class ServerPlayNetworkHandler_interactionUpdatesMixin
private void afterItemInteracted(PlayerInteractItemC2SPacket packet, CallbackInfo ci) private void afterItemInteracted(PlayerInteractItemC2SPacket packet, CallbackInfo ci)
{ {
if (!CarpetSettings.interactionUpdates) if (!CarpetSettings.interactionUpdates)
CarpetSettings.impendingFillSkipUpdates = false; CarpetSettings.impendingFillSkipUpdates.set(false);
} }
@Inject(method = "onPlayerAction", at = @At( @Inject(method = "onPlayerAction", at = @At(
value = "INVOKE", value = "INVOKE",
@@ -64,7 +64,7 @@ public class ServerPlayNetworkHandler_interactionUpdatesMixin
private void beforeBlockBroken(PlayerActionC2SPacket packet, CallbackInfo ci) private void beforeBlockBroken(PlayerActionC2SPacket packet, CallbackInfo ci)
{ {
if (!CarpetSettings.interactionUpdates) if (!CarpetSettings.interactionUpdates)
CarpetSettings.impendingFillSkipUpdates = true; CarpetSettings.impendingFillSkipUpdates.set(true);
} }
@Inject(method = "onPlayerAction", at = @At( @Inject(method = "onPlayerAction", at = @At(
@@ -75,7 +75,7 @@ public class ServerPlayNetworkHandler_interactionUpdatesMixin
private void afterBlockBroken(PlayerActionC2SPacket packet, CallbackInfo ci) private void afterBlockBroken(PlayerActionC2SPacket packet, CallbackInfo ci)
{ {
if (!CarpetSettings.interactionUpdates) if (!CarpetSettings.interactionUpdates)
CarpetSettings.impendingFillSkipUpdates = false; CarpetSettings.impendingFillSkipUpdates.set(false);
} }
} }
@@ -22,14 +22,14 @@ public abstract class StructureBlockBlockEntity_fillUpdatesMixin
private void onStructurePlacen(Structure structure, ServerWorldAccess serverWorldAccess, BlockPos pos, StructurePlacementData placementData, Random random) private void onStructurePlacen(Structure structure, ServerWorldAccess serverWorldAccess, BlockPos pos, StructurePlacementData placementData, Random random)
{ {
if(!CarpetSettings.fillUpdates) if(!CarpetSettings.fillUpdates)
CarpetSettings.impendingFillSkipUpdates = true; CarpetSettings.impendingFillSkipUpdates.set(true);
try try
{ {
structure.place(serverWorldAccess, pos, placementData, random); structure.place(serverWorldAccess, pos, placementData, random);
} }
finally finally
{ {
CarpetSettings.impendingFillSkipUpdates = false; CarpetSettings.impendingFillSkipUpdates.set(false);
} }
} }
} }
@@ -35,7 +35,7 @@ public abstract class StructureFeatureMixin<C extends FeatureConfig> implements
{ {
if (world.isClient()) if (world.isClient())
return false; return false;
CarpetSettings.skipGenerationChecks = true; CarpetSettings.skipGenerationChecks.set(true);
try try
{ {
Random rand = new Random(world.getRandom().nextInt()); Random rand = new Random(world.getRandom().nextInt());
@@ -79,7 +79,7 @@ public abstract class StructureFeatureMixin<C extends FeatureConfig> implements
} }
finally finally
{ {
CarpetSettings.skipGenerationChecks = false; CarpetSettings.skipGenerationChecks.set(false);
} }
return true; return true;
} }
@@ -17,6 +17,6 @@ public class StructurePiece_scarpetPlopMixin
)) ))
private void markOrNot(Chunk chunk, BlockPos pos) private void markOrNot(Chunk chunk, BlockPos pos)
{ {
if (!CarpetSettings.skipGenerationChecks) chunk.markBlockForPostProcessing(pos); if (!CarpetSettings.skipGenerationChecks.get()) chunk.markBlockForPostProcessing(pos);
} }
} }
@@ -19,7 +19,7 @@ public class Structure_fillUpdatesMixin
)) ))
private void skipUpdateNeighbours(ServerWorldAccess serverWorldAccess, BlockPos pos, Block block) private void skipUpdateNeighbours(ServerWorldAccess serverWorldAccess, BlockPos pos, Block block)
{ {
if (!CarpetSettings.impendingFillSkipUpdates) if (!CarpetSettings.impendingFillSkipUpdates.get())
serverWorldAccess.updateNeighbors(pos, block); serverWorldAccess.updateNeighbors(pos, block);
} }
@@ -29,6 +29,6 @@ public class Structure_fillUpdatesMixin
)) ))
private boolean skipPostprocess(StructurePlacementData structurePlacementData) private boolean skipPostprocess(StructurePlacementData structurePlacementData)
{ {
return structurePlacementData.shouldUpdateNeighbors() || CarpetSettings.impendingFillSkipUpdates; return structurePlacementData.shouldUpdateNeighbors() || CarpetSettings.impendingFillSkipUpdates.get();
} }
} }
@@ -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) 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); 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) 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.getBlock().hasBlockEntity() && !blockState.isOf(state.getBlock())) if (blockState.getBlock().hasBlockEntity() && !blockState.isOf(state.getBlock()))
{ {
@@ -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 @ModifyConstant(method = "setBlockState(Lnet/minecraft/util/math/BlockPos;Lnet/minecraft/block/BlockState;II)Z", //setBlockState main
constant = @Constant(intValue = 16)) constant = @Constant(intValue = 16))
private int addFillUpdatesInt(int original) { private int addFillUpdatesInt(int original) {
if (CarpetSettings.impendingFillSkipUpdates) if (CarpetSettings.impendingFillSkipUpdates.get())
return -1; return -1;
return original; return original;
} }
@@ -27,7 +27,7 @@ public abstract class World_fillUpdatesMixin
)) ))
private void updateNeighborsMaybe(World world, BlockPos blockPos, Block block) private void updateNeighborsMaybe(World world, BlockPos blockPos, Block block)
{ {
if (!CarpetSettings.impendingFillSkipUpdates) world.updateNeighbors(blockPos, block); if (!CarpetSettings.impendingFillSkipUpdates.get()) world.updateNeighbors(blockPos, block);
} }
} }
@@ -18,7 +18,7 @@ public class World_scarpetPlopMixin
)) ))
private int fixSampleHeightmap(WorldChunk chunk, Heightmap.Type type, int x, int z) private int fixSampleHeightmap(WorldChunk chunk, Heightmap.Type type, int x, int z)
{ {
if (CarpetSettings.skipGenerationChecks) if (CarpetSettings.skipGenerationChecks.get())
{ {
Heightmap.Type newType = type; Heightmap.Type newType = type;
if (type == Heightmap.Type.OCEAN_FLOOR_WG) newType = Heightmap.Type.OCEAN_FLOOR; if (type == Heightmap.Type.OCEAN_FLOOR_WG) newType = Heightmap.Type.OCEAN_FLOOR;
@@ -688,19 +688,19 @@ public class WorldAccess {
// lazy cause its parked execution // lazy cause its parked execution
expression.addLazyFunction("without_updates", 1, (c, t, lv) -> expression.addLazyFunction("without_updates", 1, (c, t, lv) ->
{ {
boolean previous = CarpetSettings.impendingFillSkipUpdates; boolean previous = CarpetSettings.impendingFillSkipUpdates.get();
if (previous) return lv.get(0); if (previous) return lv.get(0);
Value [] result = new Value[]{Value.NULL}; Value [] result = new Value[]{Value.NULL};
((CarpetContext)c).s.getMinecraftServer().submitAndJoin( () -> ((CarpetContext)c).s.getMinecraftServer().submitAndJoin( () ->
{ {
try try
{ {
CarpetSettings.impendingFillSkipUpdates = true; CarpetSettings.impendingFillSkipUpdates.set(true);
result[0] = lv.get(0).evalValue(c, t); result[0] = lv.get(0).evalValue(c, t);
} }
finally finally
{ {
CarpetSettings.impendingFillSkipUpdates = previous; CarpetSettings.impendingFillSkipUpdates.set(previous);
} }
}); });
return (cc, tt) -> result[0]; return (cc, tt) -> result[0];