diff --git a/src/api/java/appeng/api/networking/energy/IAEPowerStorage.java b/src/api/java/appeng/api/networking/energy/IAEPowerStorage.java index 177cd6998..e571e3c4e 100644 --- a/src/api/java/appeng/api/networking/energy/IAEPowerStorage.java +++ b/src/api/java/appeng/api/networking/energy/IAEPowerStorage.java @@ -71,4 +71,18 @@ public interface IAEPowerStorage extends IEnergySource { */ @Nonnull AccessRestriction getPowerFlow(); -} \ No newline at end of file + + /** + * The priority to use this energy storage. + * + * A higher value means it is more likely to be extracted from first, and less + * likely to be inserted into first. + * + * This should never use {@link Integer#MIN_VALUE} or {@link Integer#MAX_VALUE}. + * + * @return the priority for this storage + */ + default int getPriority() { + return 0; + } +} diff --git a/src/main/java/appeng/block/crafting/AbstractCraftingUnitBlock.java b/src/main/java/appeng/block/crafting/AbstractCraftingUnitBlock.java index 049ed2959..0abcd27ab 100644 --- a/src/main/java/appeng/block/crafting/AbstractCraftingUnitBlock.java +++ b/src/main/java/appeng/block/crafting/AbstractCraftingUnitBlock.java @@ -59,7 +59,7 @@ public abstract class AbstractCraftingUnitBlock e final BlockPos fromPos, boolean isMoving) { final CraftingBlockEntity cp = this.getBlockEntity(worldIn, pos); if (cp != null) { - cp.updateMultiBlock(); + cp.updateMultiBlock(fromPos); } } diff --git a/src/main/java/appeng/block/qnb/QuantumBaseBlock.java b/src/main/java/appeng/block/qnb/QuantumBaseBlock.java index a44e431bc..085476692 100644 --- a/src/main/java/appeng/block/qnb/QuantumBaseBlock.java +++ b/src/main/java/appeng/block/qnb/QuantumBaseBlock.java @@ -70,7 +70,7 @@ public abstract class QuantumBaseBlock extends AEBaseTileBlock boolean isMoving) { final SpatialPylonBlockEntity tsp = this.getBlockEntity(world, pos); if (tsp != null) { - tsp.neighborUpdate(); + tsp.neighborUpdate(fromPos); } } diff --git a/src/main/java/appeng/client/render/spatial/SpatialPylonBakedModel.java b/src/main/java/appeng/client/render/spatial/SpatialPylonBakedModel.java index 065ff7bea..652a746d6 100644 --- a/src/main/java/appeng/client/render/spatial/SpatialPylonBakedModel.java +++ b/src/main/java/appeng/client/render/spatial/SpatialPylonBakedModel.java @@ -214,7 +214,7 @@ class SpatialPylonBakedModel implements BakedModel, FabricBakedModel { @Override public boolean useAmbientOcclusion() { - return true; + return false; } @Override diff --git a/src/main/java/appeng/core/sync/packets/PaintedEntityPacket.java b/src/main/java/appeng/core/sync/packets/PaintedEntityPacket.java index deb7b4665..9781153fd 100644 --- a/src/main/java/appeng/core/sync/packets/PaintedEntityPacket.java +++ b/src/main/java/appeng/core/sync/packets/PaintedEntityPacket.java @@ -57,6 +57,6 @@ public class PaintedEntityPacket extends BasePacket { @Override public void clientPacketData(final INetworkInfo network, final PlayerEntity player) { final PlayerColor pc = new PlayerColor(this.entityId, this.myColor, this.ticks); - TickHandler.INSTANCE.getPlayerColors().put(this.entityId, pc); + TickHandler.instance().getPlayerColors().put(this.entityId, pc); } } diff --git a/src/main/java/appeng/crafting/CraftingJob.java b/src/main/java/appeng/crafting/CraftingJob.java index 73d19abbf..8c701ac01 100644 --- a/src/main/java/appeng/crafting/CraftingJob.java +++ b/src/main/java/appeng/crafting/CraftingJob.java @@ -125,7 +125,7 @@ public class CraftingJob implements Runnable, ICraftingJob { public void run() { try { try { - TickHandler.INSTANCE.registerCraftingSimulation(this.world, this); + TickHandler.instance().registerCraftingSimulation(this.world, this); this.handlePausing(); final Stopwatch timer = Stopwatch.createStarted(); diff --git a/src/main/java/appeng/debug/DebugCardItem.java b/src/main/java/appeng/debug/DebugCardItem.java index 2810762a1..cb5540e41 100644 --- a/src/main/java/appeng/debug/DebugCardItem.java +++ b/src/main/java/appeng/debug/DebugCardItem.java @@ -78,7 +78,7 @@ public class DebugCardItem extends AEBaseItem implements AEToolItem { int grids = 0; int totalNodes = 0; - for (final Grid g : TickHandler.INSTANCE.getGridList()) { + for (final Grid g : TickHandler.instance().getGridList()) { grids++; totalNodes += g.getNodes().size(); } diff --git a/src/main/java/appeng/hooks/TickHandler.java b/src/main/java/appeng/hooks/TickHandler.java index 79fc87474..b2be14922 100644 --- a/src/main/java/appeng/hooks/TickHandler.java +++ b/src/main/java/appeng/hooks/TickHandler.java @@ -18,6 +18,37 @@ package appeng.hooks; +import java.util.ArrayDeque; +import java.util.ArrayList; +import java.util.Collection; +import java.util.HashMap; +import java.util.HashSet; +import java.util.Iterator; +import java.util.List; +import java.util.Map; +import java.util.Queue; +import java.util.Set; +import java.util.WeakHashMap; +import java.util.concurrent.TimeUnit; + +import com.google.common.base.Stopwatch; +import com.google.common.collect.LinkedListMultimap; +import com.google.common.collect.Multimap; + +import net.minecraft.world.IWorld; +import net.minecraft.world.World; +import net.minecraftforge.api.distmarker.Dist; +import net.minecraftforge.event.TickEvent.ClientTickEvent; +import net.minecraftforge.event.TickEvent.Phase; +import net.minecraftforge.event.TickEvent.ServerTickEvent; +import net.minecraftforge.event.TickEvent.WorldTickEvent; +import net.minecraftforge.event.world.WorldEvent; +import net.minecraftforge.eventbus.api.IEventBus; +import net.minecraftforge.fml.DistExecutor; +import net.minecraftforge.fml.DistExecutor.SafeRunnable; + +import appeng.api.networking.IGridNode; +import appeng.api.parts.CableRenderMode; import appeng.api.util.AEColor; import appeng.core.AEConfig; import appeng.core.AELog; @@ -41,10 +72,10 @@ import java.util.concurrent.TimeUnit; public class TickHandler { - public static final TickHandler INSTANCE = new TickHandler(); + private static final TickHandler INSTANCE = new TickHandler(); private final Queue> serverQueue = new ArrayDeque<>(); private final Multimap craftingJobs = LinkedListMultimap.create(); - private final WeakHashMap>> callQueue = new WeakHashMap<>(); + private final Map>> callQueue = new WeakHashMap<>(); private final HandlerRep server = new HandlerRep(); private final HandlerRep client = new HandlerRep(); private final HashMap srvPlayerColors = new HashMap<>(); @@ -57,7 +88,29 @@ public class TickHandler { } - public HashMap getPlayerColors() { + public static TickHandler instance() { + return INSTANCE; + } + + public static void setup(IEventBus eventBus) { + eventBus.addListener(INSTANCE::onServerTick); + eventBus.addListener(INSTANCE::onWorldTick); + eventBus.addListener(INSTANCE::onUnloadWorld); + + // DistExecutor does not like functional interfaces + DistExecutor.safeRunWhenOn(Dist.CLIENT, () -> new SafeRunnable() { + + private static final long serialVersionUID = 5221919736953944125L; + + @Override + public void run() { + eventBus.addListener(INSTANCE::onClientTick); + + } + }); + } + + public Map getPlayerColors() { return this.srvPlayerColors; } @@ -77,8 +130,8 @@ public class TickHandler { } public void addInit(final AEBaseBlockEntity tile) { - if (Platform.isServer()) // for no there is no reason to care about this on the client... - { + // for no there is no reason to care about this on the client... + if (Platform.isServer()) { this.getRepo().tiles.add(tile); } } @@ -91,15 +144,15 @@ public class TickHandler { } public void addNetwork(final Grid grid) { - if (Platform.isServer()) // for no there is no reason to care about this on the client... - { + // for no there is no reason to care about this on the client... + if (Platform.isServer()) { this.getRepo().addNetwork(grid); } } public void removeNetwork(final Grid grid) { - if (Platform.isServer()) // for no there is no reason to care about this on the client... - { + // for no there is no reason to care about this on the client... + if (Platform.isServer()) { this.getRepo().removeNetwork(grid); } } @@ -142,9 +195,10 @@ public class TickHandler { synchronized (this.craftingJobs) { final Collection jobSet = this.craftingJobs.get(world); if (!jobSet.isEmpty()) { - final int simTime = Math.max(1, - AEConfig.instance().getCraftingCalculationTimePerTick() / jobSet.size()); - final Iterator i = jobSet.iterator(); + final int jobSize = jobSet.size(); + final int microSecondsPerTick = AEConfig.instance().getCraftingCalculationTimePerTick() * 1000; + final int simTime = Math.max(1, microSecondsPerTick / jobSize); + final Iterator i = jobSet.iterator(); while (i.hasNext()) { final CraftingJob cj = i.next(); if (!cj.simulateFor(simTime)) { @@ -176,8 +230,15 @@ public class TickHandler { this.processQueue(this.serverQueue, null); } - protected void tickColors(final HashMap playerSet) { + public void registerCraftingSimulation(final World world, final CraftingJob craftingJob) { + synchronized (this.craftingJobs) { + this.craftingJobs.put(world, craftingJob); + } + } + + protected void tickColors(final Map playerSet) { final Iterator i = playerSet.values().iterator(); + while (i.hasNext()) { final PlayerColor pc = i.next(); if (pc.ticksLeft <= 0) { @@ -206,16 +267,6 @@ public class TickHandler { AELog.debug(e); } } - - // long time = sw.elapsed( TimeUnit.MILLISECONDS ); - // if ( time > 0 ) - // AELog.info( "processQueue Time: " + time + "ms" ); - } - - public void registerCraftingSimulation(final World world, final CraftingJob craftingJob) { - synchronized (this.craftingJobs) { - this.craftingJobs.put(world, craftingJob); - } } private static class HandlerRep { diff --git a/src/main/java/appeng/items/tools/powered/MatterCannonItem.java b/src/main/java/appeng/items/tools/powered/MatterCannonItem.java index 72e2549c8..3bbf63f9e 100644 --- a/src/main/java/appeng/items/tools/powered/MatterCannonItem.java +++ b/src/main/java/appeng/items/tools/powered/MatterCannonItem.java @@ -245,7 +245,7 @@ public class MatterCannonItem extends AEBasePoweredItem implements IStorageCell< final int id = entityHit.getEntityId(); final PlayerColor marker = new PlayerColor(id, col, 20 * 30); - TickHandler.INSTANCE.getPlayerColors().put(id, marker); + TickHandler.instance().getPlayerColors().put(id, marker); if (entityHit instanceof SheepEntity) { final SheepEntity sh = (SheepEntity) entityHit; diff --git a/src/main/java/appeng/me/Grid.java b/src/main/java/appeng/me/Grid.java index 04d73e12f..98b22ccf7 100644 --- a/src/main/java/appeng/me/Grid.java +++ b/src/main/java/appeng/me/Grid.java @@ -64,7 +64,7 @@ public class Grid implements IGrid { this.postEvent(new MENetworkPostCacheConstruction()); - TickHandler.INSTANCE.addNetwork(this); + TickHandler.instance().addNetwork(this); center.setGrid(this); } @@ -112,7 +112,7 @@ public class Grid implements IGrid { this.pivot = (GridNode) n.next(); } else { this.pivot = null; - TickHandler.INSTANCE.removeNetwork(this); + TickHandler.instance().removeNetwork(this); this.myStorage.remove(); } } diff --git a/src/main/java/appeng/me/GridNode.java b/src/main/java/appeng/me/GridNode.java index 833d89fc6..3b413c4d9 100644 --- a/src/main/java/appeng/me/GridNode.java +++ b/src/main/java/appeng/me/GridNode.java @@ -384,7 +384,7 @@ public class GridNode implements IGridNode, IPathItem { GridConnection.create(node, this, f.getOpposite()); } catch (SecurityConnectionException e) { AELog.debug(e); - TickHandler.INSTANCE.addCallable(node.getWorld(), new MachineSecurityBreak(this)); + TickHandler.instance().addCallable(node.getWorld(), new MachineSecurityBreak(this)); return; } catch (final FailedConnectionException e) { @@ -411,7 +411,7 @@ public class GridNode implements IGridNode, IPathItem { } catch (SecurityConnectionException e) { AELog.debug(e); - TickHandler.INSTANCE.addCallable(node.getWorld(), new MachineSecurityBreak(this)); + TickHandler.instance().addCallable(node.getWorld(), new MachineSecurityBreak(this)); return; } catch (final FailedConnectionException e) { diff --git a/src/main/java/appeng/me/cache/EnergyGridCache.java b/src/main/java/appeng/me/cache/EnergyGridCache.java index b8bb25800..abc983454 100644 --- a/src/main/java/appeng/me/cache/EnergyGridCache.java +++ b/src/main/java/appeng/me/cache/EnergyGridCache.java @@ -23,16 +23,18 @@ import java.util.Comparator; import java.util.HashMap; import java.util.HashSet; import java.util.Iterator; -import java.util.LinkedHashSet; import java.util.NavigableSet; import java.util.PriorityQueue; import java.util.Queue; import java.util.Set; +import java.util.SortedSet; import com.google.common.collect.HashMultiset; import com.google.common.collect.Multiset; import com.google.common.collect.Sets; +import it.unimi.dsi.fastutil.objects.ObjectRBTreeSet; + import appeng.api.config.AccessRestriction; import appeng.api.config.Actionable; import appeng.api.config.PowerMultiplier; @@ -72,10 +74,15 @@ public class EnergyGridCache implements IEnergyGrid { return Double.compare(percent1, percent2); }; + private static final Comparator COMPARATOR_HIGHEST_PRIORITY_FIRST = (o1, o2) -> Integer + .compare(o2.getPriority(), o1.getPriority()); + private static final Comparator COMPARATOR_LOWEST_PRIORITY_FIRST = (o1, o2) -> Integer + .compare(o1.getPriority(), o2.getPriority()); + private final NavigableSet interests = Sets.newTreeSet(); private final double averageLength = 40.0; - private final Set providers = new LinkedHashSet<>(); - private final Set requesters = new LinkedHashSet<>(); + private final SortedSet providers = new ObjectRBTreeSet<>(COMPARATOR_HIGHEST_PRIORITY_FIRST); + private final SortedSet requesters = new ObjectRBTreeSet<>(COMPARATOR_LOWEST_PRIORITY_FIRST); private final Multiset energyGridProviders = HashMultiset.create(); private final IGrid myGrid; private final HashMap watchers = new HashMap<>(); @@ -572,6 +579,12 @@ public class EnergyGridCache implements IEnergyGrid { return this.stored; } + @Override + public int getPriority() { + // MIN_VALUE to push it to the back + return Integer.MIN_VALUE; + } + private void addCurrentAEPower(double amount) { this.stored += amount; diff --git a/src/main/java/appeng/me/cache/SpatialPylonCache.java b/src/main/java/appeng/me/cache/SpatialPylonCache.java index 853e36e63..40a48c951 100644 --- a/src/main/java/appeng/me/cache/SpatialPylonCache.java +++ b/src/main/java/appeng/me/cache/SpatialPylonCache.java @@ -82,21 +82,21 @@ public class SpatialPylonCache implements ISpatialCache { int pylonBlocks = 0; for (final SpatialPylonCluster cl : this.clusters.values()) { if (this.captureMax == null) { - this.captureMax = cl.getMax().copy(); + this.captureMax = new DimensionalCoord(cl.getWorld(), cl.getBoundsMax()); } if (this.captureMin == null) { - this.captureMin = cl.getMin().copy(); + this.captureMin = new DimensionalCoord(cl.getWorld(), cl.getBoundsMin()); } pylonBlocks += cl.tileCount(); - this.captureMin.x = Math.min(this.captureMin.x, cl.getMin().x); - this.captureMin.y = Math.min(this.captureMin.y, cl.getMin().y); - this.captureMin.z = Math.min(this.captureMin.z, cl.getMin().z); + this.captureMin.x = Math.min(this.captureMin.x, cl.getBoundsMin().getX()); + this.captureMin.y = Math.min(this.captureMin.y, cl.getBoundsMin().getY()); + this.captureMin.z = Math.min(this.captureMin.z, cl.getBoundsMin().getZ()); - this.captureMax.x = Math.max(this.captureMax.x, cl.getMax().x); - this.captureMax.y = Math.max(this.captureMax.y, cl.getMax().y); - this.captureMax.z = Math.max(this.captureMax.z, cl.getMax().z); + this.captureMax.x = Math.max(this.captureMax.x, cl.getBoundsMax().getX()); + this.captureMax.y = Math.max(this.captureMax.y, cl.getBoundsMax().getY()); + this.captureMax.z = Math.max(this.captureMax.z, cl.getBoundsMax().getZ()); } double maxPower = 0; @@ -110,28 +110,40 @@ public class SpatialPylonCache implements ISpatialCache { case X: this.isValid = this.isValid - && ((this.captureMax.y == cl.getMin().y || this.captureMin.y == cl.getMax().y) - || (this.captureMax.z == cl.getMin().z || this.captureMin.z == cl.getMax().z)) - && ((this.captureMax.y == cl.getMax().y || this.captureMin.y == cl.getMin().y) - || (this.captureMax.z == cl.getMax().z || this.captureMin.z == cl.getMin().z)); + && ((this.captureMax.y == cl.getBoundsMin().getY() + || this.captureMin.y == cl.getBoundsMax().getY()) + || (this.captureMax.z == cl.getBoundsMin().getZ() + || this.captureMin.z == cl.getBoundsMax().getZ())) + && ((this.captureMax.y == cl.getBoundsMax().getY() + || this.captureMin.y == cl.getBoundsMin().getY()) + || (this.captureMax.z == cl.getBoundsMax().getZ() + || this.captureMin.z == cl.getBoundsMin().getZ())); break; case Y: this.isValid = this.isValid - && ((this.captureMax.x == cl.getMin().x || this.captureMin.x == cl.getMax().x) - || (this.captureMax.z == cl.getMin().z || this.captureMin.z == cl.getMax().z)) - && ((this.captureMax.x == cl.getMax().x || this.captureMin.x == cl.getMin().x) - || (this.captureMax.z == cl.getMax().z || this.captureMin.z == cl.getMin().z)); + && ((this.captureMax.x == cl.getBoundsMin().getX() + || this.captureMin.x == cl.getBoundsMax().getX()) + || (this.captureMax.z == cl.getBoundsMin().getZ() + || this.captureMin.z == cl.getBoundsMax().getZ())) + && ((this.captureMax.x == cl.getBoundsMax().getX() + || this.captureMin.x == cl.getBoundsMin().getX()) + || (this.captureMax.z == cl.getBoundsMax().getZ() + || this.captureMin.z == cl.getBoundsMin().getZ())); break; case Z: this.isValid = this.isValid - && ((this.captureMax.y == cl.getMin().y || this.captureMin.y == cl.getMax().y) - || (this.captureMax.x == cl.getMin().x || this.captureMin.x == cl.getMax().x)) - && ((this.captureMax.y == cl.getMax().y || this.captureMin.y == cl.getMin().y) - || (this.captureMax.x == cl.getMax().x || this.captureMin.x == cl.getMin().x)); + && ((this.captureMax.y == cl.getBoundsMin().getY() + || this.captureMin.y == cl.getBoundsMax().getY()) + || (this.captureMax.x == cl.getBoundsMin().getX() + || this.captureMin.x == cl.getBoundsMax().getX())) + && ((this.captureMax.y == cl.getBoundsMax().getY() + || this.captureMin.y == cl.getBoundsMin().getY()) + || (this.captureMax.x == cl.getBoundsMax().getX() + || this.captureMin.x == cl.getBoundsMin().getX())); break; case UNFORMED: diff --git a/src/main/java/appeng/me/cluster/IAECluster.java b/src/main/java/appeng/me/cluster/IAECluster.java index 98ae4bbf4..4cb34f05c 100644 --- a/src/main/java/appeng/me/cluster/IAECluster.java +++ b/src/main/java/appeng/me/cluster/IAECluster.java @@ -20,13 +20,32 @@ package appeng.me.cluster; import java.util.Iterator; +import net.minecraft.util.math.AxisAlignedBB; +import net.minecraft.util.math.BlockPos; + import appeng.api.networking.IGridHost; public interface IAECluster { + /** + * The minimum x,y,z position still within the bounds of the cluster. + */ + BlockPos getBoundsMin(); + + /** + * The maximum x,y,z position still within the bounds of the cluster. + */ + BlockPos getBoundsMax(); + void updateStatus(boolean updateGrid); void destroy(); + /** + * @return True if the cluster has been destroyed, but not yet removed from a + * tile entity. Usually true during destruction. + */ + boolean isDestroyed(); + Iterator getTiles(); } diff --git a/src/main/java/appeng/me/cluster/MBCalculator.java b/src/main/java/appeng/me/cluster/MBCalculator.java index 6e39db98b..eed2ac9a3 100644 --- a/src/main/java/appeng/me/cluster/MBCalculator.java +++ b/src/main/java/appeng/me/cluster/MBCalculator.java @@ -18,6 +18,8 @@ package appeng.me.cluster; +import java.lang.ref.WeakReference; + import net.minecraft.block.entity.BlockEntity; import net.minecraft.util.math.BlockPos; import net.minecraft.world.World; @@ -29,16 +31,65 @@ import appeng.util.Platform; public abstract class MBCalculator { + private static WeakReference modificationInProgress = new WeakReference<>(null); + private final IAEMultiBlock target; public MBCalculator(final IAEMultiBlock t) { this.target = t; } - public void calculateMultiblock(final World world, final WorldCoord loc) { - if (Platform.isClient()) { + public static void setModificationInProgress(IAECluster cluster) { + IAECluster inProgress = modificationInProgress.get(); + if (inProgress == cluster) { return; } + if (inProgress != null && cluster != null) { + throw new IllegalStateException("A modification is already in-progress for: " + inProgress); + } + modificationInProgress = new WeakReference<>(cluster); + } + + public static boolean isModificationInProgress() { + return modificationInProgress.get() != null; + } + + public void updateMultiblockAfterNeighborUpdate(final World world, final WorldCoord loc, BlockPos changedPos) { + boolean recheck; + + IAECluster cluster = target.getCluster(); + if (cluster != null) { + if (isWithinBounds(changedPos, cluster.getBoundsMin(), cluster.getBoundsMax())) { + // If the location is part of the current multiblock, always re-check + recheck = true; + } else { + // If the location is outside, only re-check if it would now be considered part + // of it + recheck = isValidTileAt(world, changedPos.getX(), changedPos.getY(), changedPos.getZ()); + } + } else { + // Always recheck if the tile is not part of a cluster, because the adjacent + // block could have + // previously been a valid tile, but in a wrong placement, or the other way + // around. + recheck = true; + } + + if (recheck) { + calculateMultiblock(world, loc); + } + } + + public void calculateMultiblock(final World world, final WorldCoord loc) { + if (Platform.isClient() || isModificationInProgress()) { + return; + } + + IAECluster currentCluster = target.getCluster(); + if (currentCluster != null && currentCluster.isDestroyed()) { + return; // If we're still part of a cluster that is in the process of being destroyed, + // don't recalc. + } try { final WorldCoord min = loc.copy(); @@ -67,6 +118,7 @@ public abstract class MBCalculator { if (this.checkMultiblockScale(min, max)) { if (this.verifyUnownedRegion(world, min, max)) { IAECluster c = this.createCluster(world, min, max); + setModificationInProgress(c); try { if (!this.verifyInternalStructure(world, min, max)) { @@ -94,11 +146,21 @@ public abstract class MBCalculator { } } catch (final Throwable err) { AELog.debug(err); + } finally { + setModificationInProgress(null); } this.disconnect(); } + private static boolean isWithinBounds(BlockPos pos, BlockPos boundsMin, BlockPos boundsMax) { + int x = pos.getX(); + int y = pos.getY(); + int z = pos.getZ(); + return (x >= boundsMin.getX() && y >= boundsMin.getY() && z >= boundsMin.getZ() && x <= boundsMax.getX() + && y <= boundsMax.getY() && z <= boundsMax.getZ()); + } + private boolean isValidTileAt(final World w, final int x, final int y, final int z) { return this.isValidTile(w.getBlockEntity(new BlockPos(x, y, z))); } diff --git a/src/main/java/appeng/me/cluster/implementations/CraftingCPUCluster.java b/src/main/java/appeng/me/cluster/implementations/CraftingCPUCluster.java index d6d5c6a64..274766e53 100644 --- a/src/main/java/appeng/me/cluster/implementations/CraftingCPUCluster.java +++ b/src/main/java/appeng/me/cluster/implementations/CraftingCPUCluster.java @@ -32,6 +32,7 @@ import net.minecraft.inventory.CraftingInventory; import net.minecraft.item.ItemStack; import net.minecraft.nbt.CompoundTag; import net.minecraft.nbt.ListTag; +import net.minecraft.util.math.BlockPos; import net.minecraft.text.Text; import net.minecraft.world.World; @@ -70,6 +71,7 @@ import appeng.crafting.CraftingWatcher; import appeng.crafting.MECraftingInventory; import appeng.me.cache.CraftingGridCache; import appeng.me.cluster.IAECluster; +import appeng.me.cluster.MBCalculator; import appeng.me.helpers.MachineSource; import appeng.tile.crafting.CraftingMonitorBlockEntity; import appeng.tile.crafting.CraftingBlockEntity; @@ -80,8 +82,8 @@ public final class CraftingCPUCluster implements IAECluster, ICraftingCPU { private static final String LOG_MARK_AS_COMPLETE = "Completed job for %s."; - private final WorldCoord min; - private final WorldCoord max; + private final BlockPos boundsMin; + private final BlockPos boundsMax; private final int[] usedOps = new int[3]; private final Map tasks = new HashMap<>(); // INSTANCE sate @@ -112,11 +114,12 @@ public final class CraftingCPUCluster implements IAECluster, ICraftingCPU { private long startItemCount; private long remainingItemCount; - public CraftingCPUCluster(final WorldCoord min, final WorldCoord max) { - this.min = min; - this.max = max; + public CraftingCPUCluster(final WorldCoord boundsMin, final WorldCoord boundsMax) { + this.boundsMin = boundsMin.getBlockPos(); + this.boundsMax = boundsMax.getBlockPos(); } + @Override public boolean isDestroyed() { return this.isDestroyed; } @@ -125,6 +128,16 @@ public final class CraftingCPUCluster implements IAECluster, ICraftingCPU { return this.myLastLink; } + @Override + public BlockPos getBoundsMin() { + return boundsMin; + } + + @Override + public BlockPos getBoundsMax() { + return boundsMax; + } + /** * add a new Listener to the monitor, be sure to properly remove yourself when * your done. @@ -160,19 +173,24 @@ public final class CraftingCPUCluster implements IAECluster, ICraftingCPU { } this.isDestroyed = true; - boolean posted = false; + MBCalculator.setModificationInProgress(this); + try { + boolean posted = false; - for (final CraftingBlockEntity r : this.tiles) { - final IGridNode n = r.getActionableNode(); - if (n != null && !posted) { - final IGrid g = n.getGrid(); - if (g != null) { - g.postEvent(new MENetworkCraftingCpuChange(n)); - posted = true; + for (final CraftingBlockEntity r : this.tiles) { + final IGridNode n = r.getActionableNode(); + if (n != null && !posted) { + final IGrid g = n.getGrid(); + if (g != null) { + g.postEvent(new MENetworkCraftingCpuChange(n)); + posted = true; + } } - } - r.updateStatus(null); + r.updateStatus(null); + } + } finally { + MBCalculator.setModificationInProgress(null); } } diff --git a/src/main/java/appeng/me/cluster/implementations/QuantumCluster.java b/src/main/java/appeng/me/cluster/implementations/QuantumCluster.java index ac17c5187..bcdfa15bf 100644 --- a/src/main/java/appeng/me/cluster/implementations/QuantumCluster.java +++ b/src/main/java/appeng/me/cluster/implementations/QuantumCluster.java @@ -21,6 +21,7 @@ package appeng.me.cluster.implementations; import java.util.Iterator; import net.minecraft.block.entity.BlockEntity; +import net.minecraft.util.math.BlockPos; import net.minecraft.util.math.ChunkPos; import net.minecraft.world.World; @@ -36,13 +37,14 @@ import appeng.core.AELog; import appeng.core.Api; import appeng.me.cache.helpers.ConnectionWrapper; import appeng.me.cluster.IAECluster; +import appeng.me.cluster.MBCalculator; import appeng.tile.qnb.QuantumBridgeBlockEntity; import appeng.util.iterators.ChainedIterator; public class QuantumCluster implements ILocatable, IAECluster { - private final WorldCoord min; - private final WorldCoord max; + private final BlockPos boundsMin; + private final BlockPos boundsMax; private boolean isDestroyed = false; private boolean updateStatus = true; private QuantumBridgeBlockEntity[] Ring; @@ -53,8 +55,8 @@ public class QuantumCluster implements ILocatable, IAECluster { private QuantumBridgeBlockEntity center; public QuantumCluster(final WorldCoord min, final WorldCoord max) { - this.min = min; - this.max = max; + this.boundsMin = min.getBlockPos(); + this.boundsMax = max.getBlockPos(); this.setRing(new QuantumBridgeBlockEntity[8]); } @@ -185,6 +187,21 @@ public class QuantumCluster implements ILocatable, IAECluster { return this.thisSide != 0; } + @Override + public BlockPos getBoundsMin() { + return boundsMin; + } + + @Override + public BlockPos getBoundsMax() { + return boundsMax; + } + + @Override + public boolean isDestroyed() { + return isDestroyed; + } + @Override public void destroy() { if (this.isDestroyed) { @@ -192,25 +209,30 @@ public class QuantumCluster implements ILocatable, IAECluster { } this.isDestroyed = true; - if (this.registered) { - // FIXME FABRIC -> onWorldUnload event + MBCalculator.setModificationInProgress(this); + try { + if (this.registered) { + // FIXME FABRIC -> onWorldUnload event // FIXME FABRIC MinecraftForge.EVENT_BUS.unregister(this); this.registered = false; } - if (this.thisSide != 0) { - this.updateStatus(true); - LocatableEventAnnounce.EVENT.invoker().onLocatableAnnounce(this, LocatableEvent.UNREGISTER); + if (this.thisSide != 0) { + this.updateStatus(true); + LocatableEventAnnounce.EVENT.invoker().onLocatableAnnounce(this, LocatableEvent.UNREGISTER); + } + + this.center.updateStatus(null, (byte) -1, this.isUpdateStatus()); + + for (final QuantumBridgeBlockEntity r : this.getRing()) { + r.updateStatus(null, (byte) -1, this.isUpdateStatus()); + } + + this.center = null; + this.setRing(new QuantumBridgeBlockEntity[8]); + } finally { + MBCalculator.setModificationInProgress(null); } - - this.center.updateStatus(null, (byte) -1, this.isUpdateStatus()); - - for (final QuantumBridgeBlockEntity r : this.getRing()) { - r.updateStatus(null, (byte) -1, this.isUpdateStatus()); - } - - this.center = null; - this.setRing(new QuantumBridgeBlockEntity[8]); } @Override diff --git a/src/main/java/appeng/me/cluster/implementations/SpatialPylonCalculator.java b/src/main/java/appeng/me/cluster/implementations/SpatialPylonCalculator.java index 61744466f..d477da85d 100644 --- a/src/main/java/appeng/me/cluster/implementations/SpatialPylonCalculator.java +++ b/src/main/java/appeng/me/cluster/implementations/SpatialPylonCalculator.java @@ -22,7 +22,6 @@ import net.minecraft.block.entity.BlockEntity; import net.minecraft.util.math.BlockPos; import net.minecraft.world.World; -import appeng.api.util.DimensionalCoord; import appeng.api.util.WorldCoord; import appeng.me.cluster.IAECluster; import appeng.me.cluster.IAEMultiBlock; @@ -47,8 +46,7 @@ public class SpatialPylonCalculator extends MBCalculator { @Override public IAECluster createCluster(final World w, final WorldCoord min, final WorldCoord max) { - return new SpatialPylonCluster(new DimensionalCoord(w, min.x, min.y, min.z), - new DimensionalCoord(w, max.x, max.y, max.z)); + return new SpatialPylonCluster(w, min.getBlockPos(), max.getBlockPos()); } @Override diff --git a/src/main/java/appeng/me/cluster/implementations/SpatialPylonCluster.java b/src/main/java/appeng/me/cluster/implementations/SpatialPylonCluster.java index 630122307..90dddf218 100644 --- a/src/main/java/appeng/me/cluster/implementations/SpatialPylonCluster.java +++ b/src/main/java/appeng/me/cluster/implementations/SpatialPylonCluster.java @@ -22,30 +22,35 @@ import java.util.ArrayList; import java.util.Iterator; import java.util.List; +import net.minecraft.util.math.BlockPos; +import net.minecraft.world.World; + import appeng.api.networking.IGridHost; -import appeng.api.util.DimensionalCoord; import appeng.me.cluster.IAECluster; +import appeng.me.cluster.MBCalculator; import appeng.tile.spatial.SpatialPylonBlockEntity; public class SpatialPylonCluster implements IAECluster { - private final DimensionalCoord min; - private final DimensionalCoord max; + private final World world; + private final BlockPos boundsMin; + private final BlockPos boundsMax; private final List line = new ArrayList<>(); private boolean isDestroyed = false; private Axis currentAxis = Axis.UNFORMED; private boolean isValid; - public SpatialPylonCluster(final DimensionalCoord min, final DimensionalCoord max) { - this.min = min.copy(); - this.max = max.copy(); + public SpatialPylonCluster(final World world, final BlockPos boundsMin, final BlockPos boundsMax) { + this.world = world; + this.boundsMin = boundsMin.toImmutable(); + this.boundsMax = boundsMax.toImmutable(); - if (this.getMin().x != this.getMax().x) { + if (this.getBoundsMin().getX() != this.getBoundsMax().getX()) { this.setCurrentAxis(Axis.X); - } else if (this.getMin().y != this.getMax().y) { + } else if (this.getBoundsMin().getY() != this.getBoundsMax().getY()) { this.setCurrentAxis(Axis.Y); - } else if (this.getMin().z != this.getMax().z) { + } else if (this.getBoundsMin().getZ() != this.getBoundsMax().getZ()) { this.setCurrentAxis(Axis.Z); } else { this.setCurrentAxis(Axis.UNFORMED); @@ -59,6 +64,11 @@ public class SpatialPylonCluster implements IAECluster { } } + @Override + public boolean isDestroyed() { + return isDestroyed; + } + @Override public void destroy() { @@ -67,8 +77,13 @@ public class SpatialPylonCluster implements IAECluster { } this.isDestroyed = true; - for (final SpatialPylonBlockEntity r : this.getLine()) { - r.updateStatus(null); + MBCalculator.setModificationInProgress(this); + try { + for (final SpatialPylonBlockEntity r : this.getLine()) { + r.updateStatus(null); + } + } finally { + MBCalculator.setModificationInProgress(null); } } @@ -97,12 +112,18 @@ public class SpatialPylonCluster implements IAECluster { this.isValid = isValid; } - public DimensionalCoord getMax() { - return this.max; + public World getWorld() { + return world; } - public DimensionalCoord getMin() { - return this.min; + @Override + public BlockPos getBoundsMax() { + return this.boundsMax; + } + + @Override + public BlockPos getBoundsMin() { + return this.boundsMin; } List getLine() { diff --git a/src/main/java/appeng/me/helpers/AENetworkProxy.java b/src/main/java/appeng/me/helpers/AENetworkProxy.java index 836047003..fd571fc39 100644 --- a/src/main/java/appeng/me/helpers/AENetworkProxy.java +++ b/src/main/java/appeng/me/helpers/AENetworkProxy.java @@ -96,7 +96,7 @@ public class AENetworkProxy implements IGridBlock { public void validate() { if (this.gp instanceof AEBaseBlockEntity) { - TickHandler.INSTANCE.addInit((AEBaseBlockEntity) this.gp); + TickHandler.instance().addInit((AEBaseBlockEntity) this.gp); } } diff --git a/src/main/java/appeng/parts/automation/AnnihilationPlanePart.java b/src/main/java/appeng/parts/automation/AnnihilationPlanePart.java index 9d20f79b1..ad2c46fd6 100644 --- a/src/main/java/appeng/parts/automation/AnnihilationPlanePart.java +++ b/src/main/java/appeng/parts/automation/AnnihilationPlanePart.java @@ -411,7 +411,7 @@ public class AnnihilationPlanePart extends BasicStatePart implements IGridTickab performBreakBlock(w, pos, blockState, energy, requiredPower, items); } else { this.breaking = true; - TickHandler.INSTANCE.addCallable(this.getTile().getWorld(), this); + TickHandler.instance().addCallable(this.getTile().getWorld(), this); } return TickRateModulation.URGENT; } diff --git a/src/main/java/appeng/parts/p2p/MEP2PTunnelPart.java b/src/main/java/appeng/parts/p2p/MEP2PTunnelPart.java index 4dfd22eac..b7cd1b617 100644 --- a/src/main/java/appeng/parts/p2p/MEP2PTunnelPart.java +++ b/src/main/java/appeng/parts/p2p/MEP2PTunnelPart.java @@ -138,14 +138,14 @@ public class MEP2PTunnelPart extends P2PTunnelPart implements I if (!this.getProxy().getPath().isNetworkBooting()) { if (!this.getProxy().getEnergy().isNetworkPowered()) { this.connection.markDestroy(); - TickHandler.INSTANCE.addCallable(this.getTile().getWorld(), this.connection); + TickHandler.instance().addCallable(this.getTile().getWorld(), this.connection); } else { if (this.getProxy().isActive()) { this.connection.markCreate(); - TickHandler.INSTANCE.addCallable(this.getTile().getWorld(), this.connection); + TickHandler.instance().addCallable(this.getTile().getWorld(), this.connection); } else { this.connection.markDestroy(); - TickHandler.INSTANCE.addCallable(this.getTile().getWorld(), this.connection); + TickHandler.instance().addCallable(this.getTile().getWorld(), this.connection); } } diff --git a/src/main/java/appeng/tile/AEBaseBlockEntity.java b/src/main/java/appeng/tile/AEBaseBlockEntity.java index 995308060..05389736a 100644 --- a/src/main/java/appeng/tile/AEBaseBlockEntity.java +++ b/src/main/java/appeng/tile/AEBaseBlockEntity.java @@ -423,7 +423,7 @@ public class AEBaseBlockEntity extends BlockEntity implements IOrientable, IComm if (this.world != null) { this.world.markDirty(this.pos, this); if (!this.markDirtyQueued) { - TickHandler.INSTANCE.addCallable(null, this::markDirtyAtEndOfTick); + TickHandler.instance().addCallable(null, this::markDirtyAtEndOfTick); this.markDirtyQueued = true; } } diff --git a/src/main/java/appeng/tile/crafting/CraftingBlockEntity.java b/src/main/java/appeng/tile/crafting/CraftingBlockEntity.java index 396b62087..d2ca2e169 100644 --- a/src/main/java/appeng/tile/crafting/CraftingBlockEntity.java +++ b/src/main/java/appeng/tile/crafting/CraftingBlockEntity.java @@ -118,11 +118,11 @@ public class CraftingBlockEntity extends AENetworkBlockEntity implements IAEMult public void onReady() { super.onReady(); this.getProxy().setVisualRepresentation(this.getItemFromTile(this)); - this.updateMultiBlock(); + this.calc.calculateMultiblock(world, getLocation()); } - public void updateMultiBlock() { - this.calc.calculateMultiblock(this.world, this.getLocation()); + public void updateMultiBlock(BlockPos changedPos) { + this.calc.updateMultiblockAfterNeighborUpdate(this.world, this.getLocation(), changedPos); } public void updateStatus(final CraftingCPUCluster c) { diff --git a/src/main/java/appeng/tile/networking/CableBusBlockEntity.java b/src/main/java/appeng/tile/networking/CableBusBlockEntity.java index cd3aaa78b..50dbec50a 100644 --- a/src/main/java/appeng/tile/networking/CableBusBlockEntity.java +++ b/src/main/java/appeng/tile/networking/CableBusBlockEntity.java @@ -121,7 +121,7 @@ public class CableBusBlockEntity extends AEBaseBlockEntity implements AEMultiTil @Override public void cancelRemoval() { super.cancelRemoval(); - TickHandler.INSTANCE.addInit(this); + TickHandler.instance().addInit(this); } @Override diff --git a/src/main/java/appeng/tile/networking/CreativeEnergyCellBlockEntity.java b/src/main/java/appeng/tile/networking/CreativeEnergyCellBlockEntity.java index dce839065..8a5146ca6 100644 --- a/src/main/java/appeng/tile/networking/CreativeEnergyCellBlockEntity.java +++ b/src/main/java/appeng/tile/networking/CreativeEnergyCellBlockEntity.java @@ -69,4 +69,10 @@ public class CreativeEnergyCellBlockEntity extends AENetworkBlockEntity implemen public double extractAEPower(final double amt, final Actionable mode, final PowerMultiplier pm) { return amt; } + + @Override + public int getPriority() { + // MAX_VALUE to move creative cells to the front. + return Integer.MAX_VALUE; + } } diff --git a/src/main/java/appeng/tile/networking/DenseEnergyCellBlockEntity.java b/src/main/java/appeng/tile/networking/DenseEnergyCellBlockEntity.java index fc785d21b..defefdf80 100644 --- a/src/main/java/appeng/tile/networking/DenseEnergyCellBlockEntity.java +++ b/src/main/java/appeng/tile/networking/DenseEnergyCellBlockEntity.java @@ -22,9 +22,16 @@ import net.minecraft.block.entity.BlockEntityType; public class DenseEnergyCellBlockEntity extends EnergyCellBlockEntity { + private final static double MAX_STORED = 200000 * 8; + public DenseEnergyCellBlockEntity(BlockEntityType tileEntityTypeIn) { super(tileEntityTypeIn); - this.setInternalMaxPower(200000 * 8); + this.setInternalMaxPower(MAX_STORED); + } + + @Override + public int getPriority() { + return 1600; } } diff --git a/src/main/java/appeng/tile/networking/EnergyCellBlockEntity.java b/src/main/java/appeng/tile/networking/EnergyCellBlockEntity.java index afcdc041d..94eee309c 100644 --- a/src/main/java/appeng/tile/networking/EnergyCellBlockEntity.java +++ b/src/main/java/appeng/tile/networking/EnergyCellBlockEntity.java @@ -37,8 +37,10 @@ import appeng.util.SettingsFrom; public class EnergyCellBlockEntity extends AENetworkBlockEntity implements IAEPowerStorage { + private static final double MAX_STORED = 200000.0; + private double internalCurrentPower = 0.0; - private double internalMaxPower = 200000.0; + private double internalMaxPower = MAX_STORED; private byte currentMeta = -1; @@ -180,6 +182,11 @@ public class EnergyCellBlockEntity extends AENetworkBlockEntity implements IAEPo return pm.divide(this.extractAEPower(pm.multiply(amt), mode)); } + @Override + public int getPriority() { + return 200; + } + private double extractAEPower(double amt, final Actionable mode) { if (mode == Actionable.SIMULATE) { if (this.internalCurrentPower > amt) { @@ -219,4 +226,5 @@ public class EnergyCellBlockEntity extends AENetworkBlockEntity implements IAEPo void setInternalMaxPower(final double internalMaxPower) { this.internalMaxPower = internalMaxPower; } + } diff --git a/src/main/java/appeng/tile/qnb/QuantumBridgeBlockEntity.java b/src/main/java/appeng/tile/qnb/QuantumBridgeBlockEntity.java index 85ac5f5d7..081e3aeb5 100644 --- a/src/main/java/appeng/tile/qnb/QuantumBridgeBlockEntity.java +++ b/src/main/java/appeng/tile/qnb/QuantumBridgeBlockEntity.java @@ -33,6 +33,18 @@ import net.minecraft.block.entity.BlockEntityType; import net.minecraft.util.math.Direction; import alexiil.mc.lib.attributes.item.impl.EmptyFixedItemInv; +import net.minecraft.nbt.CompoundNBT; +import net.minecraft.network.PacketBuffer; +import net.minecraft.tileentity.ITickableTileEntity; +import net.minecraft.tileentity.TileEntity; +import net.minecraft.tileentity.TileEntityType; +import net.minecraft.util.Direction; +import net.minecraft.util.math.BlockPos; +import net.minecraftforge.client.model.data.IModelData; +import net.minecraftforge.client.model.data.ModelDataMap; +import net.minecraftforge.client.model.data.ModelProperty; +import net.minecraftforge.items.IItemHandler; +import net.minecraftforge.items.wrapper.EmptyHandler; import appeng.api.definitions.IBlockDefinition; import appeng.api.networking.GridFlags; @@ -266,8 +278,8 @@ public class QuantumBridgeBlockEntity extends AENetworkInvBlockEntity implements return AECableType.DENSE_SMART; } - public void neighborUpdate() { - this.calc.calculateMultiblock(this.world, this.getLocation()); + public void neighborUpdate(BlockPos fromPos) { + this.calc.updateMultiblockAfterNeighborUpdate(this.world, this.getLocation(), fromPos); } @Override diff --git a/src/main/java/appeng/tile/spatial/SpatialIOPortBlockEntity.java b/src/main/java/appeng/tile/spatial/SpatialIOPortBlockEntity.java index 35cd7858f..e27e2c875 100644 --- a/src/main/java/appeng/tile/spatial/SpatialIOPortBlockEntity.java +++ b/src/main/java/appeng/tile/spatial/SpatialIOPortBlockEntity.java @@ -102,7 +102,7 @@ public class SpatialIOPortBlockEntity extends AENetworkInvBlockEntity implements if (Platform.isServer()) { final ItemStack cell = this.inv.getInvStack(0); if (this.isSpatialCell(cell)) { - TickHandler.INSTANCE.addCallable(null, this);// this needs to be cross world synced. + TickHandler.instance().addCallable(null, this);// this needs to be cross world synced. } } } diff --git a/src/main/java/appeng/tile/spatial/SpatialPylonBlockEntity.java b/src/main/java/appeng/tile/spatial/SpatialPylonBlockEntity.java index eae0b443f..f4cfb7414 100644 --- a/src/main/java/appeng/tile/spatial/SpatialPylonBlockEntity.java +++ b/src/main/java/appeng/tile/spatial/SpatialPylonBlockEntity.java @@ -24,6 +24,15 @@ import java.util.EnumSet; import net.minecraft.block.entity.BlockEntityType; import net.minecraft.network.PacketByteBuf; import net.minecraft.util.math.Direction; +import javax.annotation.Nonnull; + +import net.minecraft.network.PacketBuffer; +import net.minecraft.tileentity.TileEntityType; +import net.minecraft.util.Direction; +import net.minecraft.util.math.BlockPos; +import net.minecraftforge.client.model.data.IModelData; +import net.minecraftforge.client.model.data.ModelDataMap; +import net.minecraftforge.client.model.data.ModelProperty; import appeng.api.networking.GridFlags; import appeng.api.networking.events.MENetworkChannelsChanged; @@ -77,7 +86,7 @@ public class SpatialPylonBlockEntity extends AENetworkBlockEntity implements IAE @Override public void onReady() { super.onReady(); - this.neighborUpdate(); + this.calc.calculateMultiblock(world, getLocation()); } @Override @@ -86,8 +95,8 @@ public class SpatialPylonBlockEntity extends AENetworkBlockEntity implements IAE super.markRemoved(); } - public void neighborUpdate() { - this.calc.calculateMultiblock(this.world, this.getLocation()); + public void neighborUpdate(BlockPos changedPos) { + this.calc.updateMultiblockAfterNeighborUpdate(this.world, this.getLocation(), changedPos); } @Override @@ -120,9 +129,9 @@ public class SpatialPylonBlockEntity extends AENetworkBlockEntity implements IAE this.displayBits = 0; if (this.cluster != null) { - if (this.cluster.getMin().equals(this.getLocation())) { + if (this.cluster.getBoundsMin().equals(this.getLocation())) { this.displayBits = DISPLAY_END_MIN; - } else if (this.cluster.getMax().equals(this.getLocation())) { + } else if (this.cluster.getBoundsMax().equals(this.getLocation())) { this.displayBits = DISPLAY_END_MAX; } else { this.displayBits = DISPLAY_MIDDLE; diff --git a/src/main/java/appeng/util/Platform.java b/src/main/java/appeng/util/Platform.java index 12d63b294..f780b5885 100644 --- a/src/main/java/appeng/util/Platform.java +++ b/src/main/java/appeng/util/Platform.java @@ -1097,7 +1097,7 @@ public class Platform { public static void notifyBlocksOfNeighbors(final World world, final BlockPos pos) { if (!world.isClient) { - TickHandler.INSTANCE.addCallable(world, new BlockUpdate(pos)); + TickHandler.instance().addCallable(world, new BlockUpdate(pos)); } } diff --git a/src/main/resources/assets/appliedenergistics2/lang/ja_jp.json b/src/main/resources/assets/appliedenergistics2/lang/ja_jp.json new file mode 100644 index 000000000..06bae3b30 --- /dev/null +++ b/src/main/resources/assets/appliedenergistics2/lang/ja_jp.json @@ -0,0 +1,613 @@ +{ + "block.appliedenergistics2.cable_bus": "AE2ケーブルまたはバス", + "block.appliedenergistics2.cell_workbench": "セルワークベンチ", + "block.appliedenergistics2.charger": "チャージャー", + "block.appliedenergistics2.chest": "MEチェスト", + "block.appliedenergistics2.condenser": "マターコンデンサー", + "block.appliedenergistics2.controller": "MEコントローラー", + "block.appliedenergistics2.crank": "木のクランク", + "block.appliedenergistics2.creative_energy_cell": "クリエイティブエナジーセル", + "block.appliedenergistics2.dense_energy_cell": "濃縮エナジーセル", + "block.appliedenergistics2.energy_cell": "エナジーセル", + "block.appliedenergistics2.drive": "MEドライブ", + "block.appliedenergistics2.energy_acceptor": "エナジーアクセプター", + "block.appliedenergistics2.grindstone": "クォーツ粉砕機", + "block.appliedenergistics2.matrix_frame": "マトリックスフレーム", + "block.appliedenergistics2.io_port": "ME入出力ポート", + "block.appliedenergistics2.inscriber": "刻印機", + "block.appliedenergistics2.interface": "MEインターフェース", + "block.appliedenergistics2.fluid_interface": "ME液体インターフェース", + "block.appliedenergistics2.quantum_link": "MEクァンタムリンクチェンバー", + "block.appliedenergistics2.quantum_ring": "MEクァンタムリング", + "block.appliedenergistics2.fluix_block": "フルーシュブロック", + "block.appliedenergistics2.quartz_block": "ケルタスクォーツブロック", + "block.appliedenergistics2.chiseled_quartz_block": "模様入りケルタスクォーツブロック", + "block.appliedenergistics2.quartz_glass": "クォーツガラス", + "block.appliedenergistics2.quartz_vibrant_glass": "彩光クォーツガラス", + "block.appliedenergistics2.quartz_pillar": "柱状ケルタスクォーツブロック", + "block.appliedenergistics2.quartz_fixture": "チャージ済みケルタスクォーツ電灯", + "block.appliedenergistics2.light_detector": "光検知器", + "block.appliedenergistics2.spatial_io_port": "空間入出力ポート", + "block.appliedenergistics2.spatial_pylon": "空間標識", + "block.appliedenergistics2.tiny_tnt": "極小TNT", + "block.appliedenergistics2.vibration_chamber": "火力発電機", + "block.appliedenergistics2.wireless_access_point": "ME無線アクセスポイント", + "block.appliedenergistics2.quartz_ore": "ケルタスクォーツ鉱石", + "block.appliedenergistics2.charged_quartz_ore": "チャージ済みケルタスクォーツ鉱石", + "block.appliedenergistics2.security_station": "MEセキュリティターミナル", + "block.appliedenergistics2.quartz_growth_accelerator": "クリスタル成長加速器", + "block.appliedenergistics2.sky_stone_block": "スカイストーン", + "block.appliedenergistics2.smooth_sky_stone_block": "スカイストーンブロック", + "block.appliedenergistics2.sky_stone_brick": "スカイストーンレンガ", + "block.appliedenergistics2.sky_stone_small_brick": "スカイストーン小レンガ", + "block.appliedenergistics2.sky_stone_chest": "スカイストーンチェスト", + "block.appliedenergistics2.smooth_sky_stone_chest": "スカイストーンブロックチェスト", + "block.appliedenergistics2.sky_compass": "隕石コンパス", + "block.appliedenergistics2.crafting_monitor": "クラフトモニター", + "block.appliedenergistics2.crafting_storage_1k": "1kクラフトストレージ", + "block.appliedenergistics2.crafting_storage_4k": "4kクラフトストレージ", + "block.appliedenergistics2.crafting_storage_16k": "16kクラフトストレージ", + "block.appliedenergistics2.crafting_storage_64k": "64kクラフトストレージ", + "block.appliedenergistics2.crafting_accelerator": "並列クラフトユニット", + "block.appliedenergistics2.crafting_unit": "クラフトユニット", + "block.appliedenergistics2.molecular_assembler": "分子組立機", + + "block.appliedenergistics2.fluix_stairs": "フルーシュの階段", + "block.appliedenergistics2.quartz_stairs": "ケルタスクォーツの階段", + "block.appliedenergistics2.chiseled_quartz_stairs": "模様入りケルタスクォーツの階段", + "block.appliedenergistics2.quartz_pillar_stairs": "柱状ケルタスクォーツの階段", + "block.appliedenergistics2.smooth_sky_stone_stairs": "スカイストーンブロックの階段", + "block.appliedenergistics2.sky_stone_brick_stairs": "スカイストーンレンガの階段", + "block.appliedenergistics2.sky_stone_small_brick_stairs": "スカイストーン小レンガの階段", + "block.appliedenergistics2.sky_stone_stairs": "スカイストーンの階段", + + "block.appliedenergistics2.chiseled_quartz_slab": "模様入りケルタスクォーツのハーフブロック", + "block.appliedenergistics2.fluix_slab": "フルーシュのハーフブロック", + "block.appliedenergistics2.quartz_pillar_slab": "柱状ケルタスクォーツのハーフブロック", + "block.appliedenergistics2.quartz_slab": "ケルタスクォーツのハーフブロック", + "block.appliedenergistics2.smooth_sky_stone_slab": "スカイストーンブロックのハーフブロック", + "block.appliedenergistics2.sky_stone_brick_slab": "スカイストーンレンガのハーフブロック", + "block.appliedenergistics2.sky_stone_small_brick_slab": "スカイストーン小レンガのハーフブロック", + "block.appliedenergistics2.sky_stone_slab": "スカイストーンのハーフブロック", + + "chat.appliedenergistics2.ChestCannotReadStorageCell": "MEチェストがストレージセルを読み込めません。", + "chat.appliedenergistics2.SettingCleared": "メモリーカードを消去しました。", + "chat.appliedenergistics2.OutOfRange": "無線が範囲外です。", + "chat.appliedenergistics2.InvalidMachine": "無効な装置です。", + "chat.appliedenergistics2.LoadedSettings": "メモリカードからデバイス構成をロードしました。", + "chat.appliedenergistics2.DeviceNotPowered": "デバイスの電力が低下しています。", + "chat.appliedenergistics2.DeviceNotWirelessTerminal": "デバイスは無線ターミナルではありません。", + "chat.appliedenergistics2.DeviceNotLinked": "デバイスはリンクされていません。", + "chat.appliedenergistics2.StationCanNotBeLocated": "ステーションが見つかりません。", + "chat.appliedenergistics2.MachineNotPowered": "マシンの電源が入っていません。", + "chat.appliedenergistics2.CommunicationError": "ネットワーク通信エラー。", + "chat.appliedenergistics2.SavedSettings": "現在のデバイス構成をメモリカードにコピーしました。", + "chat.appliedenergistics2.ResetSettings": "新しいデバイス構成が作成され、メモリカードにコピーされました。", + "chat.appliedenergistics2.AmmoDepleted": "弾薬がなくなりました。", + "chat.appliedenergistics2.isNowLocked": "モニターはロックされました。", + "chat.appliedenergistics2.isNowUnlocked": "モニターのロックが解除されました。", + + "itemGroup.appliedenergistics2": "Applied Energistics 2", + "itemGroup.appliedenergistics2.facades": "Applied Energistics 2 - 外観", + + "gui.appliedenergistics2.CraftingTerminal": "クラフトターミナル", + "gui.appliedenergistics2.METunnel": "ME", + "gui.appliedenergistics2.ItemTunnel": "アイテム", + "gui.appliedenergistics2.FluidTunnel": "液体", + "gui.appliedenergistics2.RedstoneTunnel": "レッドストーン", + "gui.appliedenergistics2.EUTunnel": "EU", + "gui.appliedenergistics2.FETunnel": "FE", + "gui.appliedenergistics2.LightTunnel": "光", + "gui.appliedenergistics2.OCTunnel": "OpenComputers", + "gui.appliedenergistics2.PressureTunnel": "Pressure", + + "gui.appliedenergistics2.security.extract": "引き出し", + "gui.appliedenergistics2.security.inject": "入金", + "gui.appliedenergistics2.security.craft": "クラフト", + "gui.appliedenergistics2.security.build": "ビルド", + "gui.appliedenergistics2.security.security": "セキュリティ", + + "gui.appliedenergistics2.security.extract.tip": "ユーザーはストレージからアイテムを削除できます。", + "gui.appliedenergistics2.security.inject.tip": "ユーザーは新しいアイテムをストレージに保存できます。", + "gui.appliedenergistics2.security.craft.tip": "ユーザーは新しいクラフトジョブを開始できます。", + "gui.appliedenergistics2.security.build.tip": "ユーザーはネットワークの物理構造を変更し、構成を変更できます。", + "gui.appliedenergistics2.security.security.tip": "ユーザーは、ネットワークのセキュリティ端末にアクセスして変更できます。", + + "gui.appliedenergistics2.Efficiency": "効率", + "gui.appliedenergistics2.SCSSize": "SCSサイズ", + "gui.appliedenergistics2.SCSInvalid": "無効", + "gui.appliedenergistics2.RequiredPower": "必要な電力", + "gui.appliedenergistics2.StoredPower": "充電済み電力", + "gui.appliedenergistics2.MaxPower": "最大電力", + "gui.appliedenergistics2.QuartzCuttingKnife": "クォーツナイフ", + "gui.appliedenergistics2.Inscriber": "刻印機", + "gui.appliedenergistics2.Wireless": "無線アクセスポイント", + "gui.appliedenergistics2.WirelessTerminal": "ワイヤレスターミナル", + "gui.appliedenergistics2.NoPermissions": "権限未選択", + "gui.appliedenergistics2.SecurityCardEditor": "生体認証カードエディター", + "gui.appliedenergistics2.Encoded": "エンコード済み", + "gui.appliedenergistics2.Priority": "優先度", + "gui.appliedenergistics2.StorageBus": "ストレージバス", + "gui.appliedenergistics2.StorageBusFluids": "液体ストレージバス", + "gui.appliedenergistics2.EnergyDrain": "受動排泄", + "gui.appliedenergistics2.Installed": "インストール済み", + "gui.appliedenergistics2.NetworkTool": "ネットワークツール", + "gui.appliedenergistics2.PowerUsageRate": "エネルギー使用率", + "gui.appliedenergistics2.PowerInputRate": "エネルギー充電率", + "gui.appliedenergistics2.PortableCell": "ポータブルセル", + "gui.appliedenergistics2.Security": "セキュリティ端末", + "gui.appliedenergistics2.CellWorkbench": "セルワークベンチ", + "gui.appliedenergistics2.QuantumLinkChamber": "クァンタムリンクチェンバー", + "gui.appliedenergistics2.IOPort": "ME入出力ポート", + "gui.appliedenergistics2.Chest": "MEチェスト", + "gui.appliedenergistics2.Condenser": "マターコンデンサー", + "gui.appliedenergistics2.Config": "コンフィグ", + "gui.appliedenergistics2.Drive": "MEドライブ", + "gui.appliedenergistics2.ExportBus": "ME出力バス", + "gui.appliedenergistics2.ExportBusFluids": "ME液体出力バス", + "gui.appliedenergistics2.GrindStone": "粉砕機", + "gui.appliedenergistics2.ImportBus": "MEインポートバス", + "gui.appliedenergistics2.ImportBusFluids": "ME液体インポートバス", + "gui.appliedenergistics2.Interface": "MEインターフェース", + "gui.appliedenergistics2.FluidInterface": "ME液体インターフェース", + "gui.appliedenergistics2.LevelEmitter": "MEレベルエミッター", + "gui.appliedenergistics2.FluidLevelEmitter": "ME液体レベルエミッター", + "gui.appliedenergistics2.Of": "の", + "gui.appliedenergistics2.Patterns": "パターン", + "gui.appliedenergistics2.SpatialIOPort": "空間入出力ポート", + "gui.appliedenergistics2.StoredEnergy": "保管済みエネルギー", + "gui.appliedenergistics2.StoredItems": "保管済みアイテム", + "gui.appliedenergistics2.StoredFluids": "保管済み液体", + "gui.appliedenergistics2.Terminal": "ターミナル", + "gui.appliedenergistics2.InterfaceTerminal": "インターフェースターミナル", + "gui.appliedenergistics2.InterfaceTerminalHint": "インターフェースターミナルで表示または隠す。", + "gui.appliedenergistics2.FormationPlane": "ブロック形成機", + "gui.appliedenergistics2.FluidFormationPlane": "液体形成機", + "gui.appliedenergistics2.VibrationChamber": "火力発電機", + "gui.appliedenergistics2.NetworkDetails": "ネットワークの詳細", + "gui.appliedenergistics2.StorageCells": "MEストレージセル", + "gui.appliedenergistics2.IOBuses": "MEインポート/エクスポートバス", + "gui.appliedenergistics2.IOBusesFluids": "ME液体インポート/エクスポートバス", + "gui.appliedenergistics2.Stores": "保管", + "gui.appliedenergistics2.BytesUsed": "バイト使用済み", + "gui.appliedenergistics2.Types": "タイプ", + "gui.appliedenergistics2.Blank": "空", + "gui.appliedenergistics2.Unlinked": "リンクされてない", + "gui.appliedenergistics2.Linked": "リンク済み", + "gui.appliedenergistics2.StoredSize": "保管済みサイズ", + "gui.appliedenergistics2.CellId": "セルID", + "gui.appliedenergistics2.SkyChest": "スカイストーンチェスト", + "gui.appliedenergistics2.PatternTerminal": "パターンターミナル", + "gui.appliedenergistics2.CraftingPattern": "クラフトパターン", + "gui.appliedenergistics2.MolecularAssembler": "分子集成室", + "gui.appliedenergistics2.ProcessingPattern": "処理パターン", + "gui.appliedenergistics2.Crafts": "クラフト", + "gui.appliedenergistics2.And": "と", + "gui.appliedenergistics2.Creates": "クリエイト", + "gui.appliedenergistics2.With": "と", + "gui.appliedenergistics2.Substitute": "置き換えの使用:", + "gui.appliedenergistics2.Yes": "はい", + "gui.appliedenergistics2.No": "いいえ", + "gui.appliedenergistics2.InWorldCrafting": "AE2のワールド内のクラフト", + "gui.appliedenergistics2.inWorldFluix": "チャージ済みケルタスクォーツ1つ、ネザークォーツ1つ、レッドストーン1つをまとめて水の中に入れると2つのフルーシュクリスタルになります。", + "gui.appliedenergistics2.inWorldPurificationCertus": "ケルタスクォーツの粉と砂で作られたケルタスクォーツの種を水の中に落とします。成長を高速化するには、クリスタル成長加速器を使用します。", + "gui.appliedenergistics2.inWorldPurificationNether": "ネザークォーツの粉と砂で作られたネザークォーツの種を水の中に落とします。成長を高速化するには、クリスタル成長加速器を使用します。", + "gui.appliedenergistics2.inWorldPurificationFluix": "フルーシュの粉と砂で作ったフルーシュの種を水の中に落とします。 成長を高速化するには、クリスタル成長加速器を追加します。", + "gui.appliedenergistics2.inWorldSingularity": "作成するには特異点とエンダーパールの粉を置いて、爆発に巻き込ませてください。", + "gui.appliedenergistics2.ChargedQuartz": "チャージ済みケルタスクォーツはチャージャーを使うことで、チャージされていないケルタスクォーツから作ることができます。", + "gui.appliedenergistics2.ChargedQuartzFind": "チャージ済みケルタスクォーツは、ワールド内ではめったに見つけることができません。輝くことを除けば、通常のケルタスクォーツに似ています。", + "gui.appliedenergistics2.NoSecondOutput": "2番目の出力無し", + "gui.appliedenergistics2.OfSecondOutput": "2番目の出力率 %1$d%%。", + "gui.appliedenergistics2.MultipleOutputs": "2番目 %1$d%%、3番目の出力率 %2$d%%。", + "gui.appliedenergistics2.SelectAmount": "金額を選択", + "gui.appliedenergistics2.CopyMode": "コピーモード", + "gui.appliedenergistics2.CopyModeDesc": "セルを削除するときに構成ペインの内容をクリアするかどうかをコントロールします。", + "gui.appliedenergistics2.Next": "次", + "gui.appliedenergistics2.Lumen": "ルーメン", + "gui.appliedenergistics2.Empty": "空", + "gui.appliedenergistics2.Stored": "保管済み", + "gui.appliedenergistics2.Cancel": "キャンセル", + "gui.appliedenergistics2.ETAFormat": "HH:mm:ss", + "gui.appliedenergistics2.Crafting": "クラフト", + "gui.appliedenergistics2.Scheduled": "予約済み", + "gui.appliedenergistics2.CraftingStatus": "クラフト状況", + "gui.appliedenergistics2.FromStorage": "有効", + "gui.appliedenergistics2.ToCraft": "クラフトへ", + "gui.appliedenergistics2.CraftingPlan": "クラフト計画", + "gui.appliedenergistics2.Automatic": "自動", + "gui.appliedenergistics2.Start": "スタート", + "gui.appliedenergistics2.Missing": "不足", + "gui.appliedenergistics2.Bytes": "ストレージ", + "gui.appliedenergistics2.Simulation": "シュミレート", + "gui.appliedenergistics2.CoProcessors": "プロセッサ", + "gui.appliedenergistics2.CraftingCPU": "クラフトCPU", + "gui.appliedenergistics2.NoCraftingCPUs": "クラフトCPUが有効ではありません", + "gui.appliedenergistics2.CalculatingWait": "計算中 しばらくお待ち下さい...", + "gui.appliedenergistics2.Clean": "消去", + "gui.appliedenergistics2.InvalidPattern": "無効なパターン", + "gui.appliedenergistics2.Range": "範囲", + "gui.appliedenergistics2.TransparentFacades": "透明な外装", + "gui.appliedenergistics2.TransparentFacadesHint": "ネットワークツールが手持ちにあるときに、外装の可視性を制御します。", + "gui.appliedenergistics2.CPUs": "CPU", + "gui.appliedenergistics2.NoCraftingJobs": "有効なクラフトジョブはありません", + "gui.appliedenergistics2.FacadeCrafting": "外装クラフト中", + "gui.appliedenergistics2.inWorldCraftingPresses": "金型は、ワールド内にある隕石の中心にあり、隕石コンパスを使用して見つけることができます。", + "gui.appliedenergistics2.Included": "付属済み", + "gui.appliedenergistics2.Excluded": "除外済み", + "gui.appliedenergistics2.Partitioned": "仕切られた", + "gui.appliedenergistics2.Precise": "正確", + "gui.appliedenergistics2.Fuzzy": "あいまい", + "gui.appliedenergistics2.SmallFontCraft": "クラフト", + "gui.appliedenergistics2.LargeFontCraft": "+", + "gui.appliedenergistics2.Nothing": "無し", + + "gui.tooltips.appliedenergistics2.Stash": "保管済みアイテム", + "gui.tooltips.appliedenergistics2.StashDesc": "クラフトグリッド上のアイテムをネットワークストレージに戻します。", + "gui.tooltips.appliedenergistics2.Substitutions": "鉱石辞書の置換", + "gui.tooltips.appliedenergistics2.SubstitutionsDescEnabled": "入力コンポーネントの置換を許可します。", + "gui.tooltips.appliedenergistics2.SubstitutionsDescDisabled": "入力コンポーネントの置換を防止します。", + "gui.tooltips.appliedenergistics2.SubstitutionsOn": "置換有効", + "gui.tooltips.appliedenergistics2.SubstitutionsOff": "置換無効", + "gui.tooltips.appliedenergistics2.Encode": "エンコードパターン", + "gui.tooltips.appliedenergistics2.EncodeDescription": "入力したパターンを現在のエンコードされたパターン、または利用可能な空のパターンに書き込みます。", + "gui.tooltips.appliedenergistics2.FuzzyMode": "ファジー比較", + "gui.tooltips.appliedenergistics2.FZPercent_25": "スプリットダメージ 25%", + "gui.tooltips.appliedenergistics2.FZPercent_50": "スプリットダメージ 50%", + "gui.tooltips.appliedenergistics2.FZPercent_75": "スプリットダメージ 75%", + "gui.tooltips.appliedenergistics2.FZPercent_99": "スプリットダメージ 99%", + "gui.tooltips.appliedenergistics2.SortOrder": "ソート順", + "gui.tooltips.appliedenergistics2.SortBy": "並び替え", + "gui.tooltips.appliedenergistics2.FZIgnoreAll": "いずれかに一致", + "gui.tooltips.appliedenergistics2.TransferDirection": "転送方向", + "gui.tooltips.appliedenergistics2.TransferToNetwork": "ネットワークへのデータ転送", + "gui.tooltips.appliedenergistics2.TransferToStorageCell": "ストレージセルへのデータ転送", + "gui.tooltips.appliedenergistics2.ToggleSortDirection": "ソート方向を切り替え", + "gui.tooltips.appliedenergistics2.StoredItems": "保管済みアイテム", + "gui.tooltips.appliedenergistics2.StoredCraftable": "保管済み / クラフト可能", + "gui.tooltips.appliedenergistics2.View": "表示", + "gui.tooltips.appliedenergistics2.RedstoneMode": "レッドストーンモード", + "gui.tooltips.appliedenergistics2.OperationMode": "演算モード", + "gui.tooltips.appliedenergistics2.NumberOfItems": "アイテムの数", + "gui.tooltips.appliedenergistics2.ItemName": "アイテムの名前", + "gui.tooltips.appliedenergistics2.PowerUnits": "パワーユニット", + "gui.tooltips.appliedenergistics2.IOMode": "入力/出力 モード", + "gui.tooltips.appliedenergistics2.CondenserOutput": "MEコンデンサー - 出力", + "gui.tooltips.appliedenergistics2.PartitionStorage": "パーティションストレージ", + "gui.tooltips.appliedenergistics2.Clear": "消去", + "gui.tooltips.appliedenergistics2.TrashController": "Shift / Spaceによる削除。", + "gui.tooltips.appliedenergistics2.InterfaceBlockingMode": "ブロックモード", + "gui.tooltips.appliedenergistics2.InterfaceCraftingMode": "クラフトモード", + "gui.tooltips.appliedenergistics2.Trash": "アイテムを消去", + "gui.tooltips.appliedenergistics2.MatterBalls": "マターボールへの凝縮\\nアイテムごとに%s個", + "gui.tooltips.appliedenergistics2.Singularity": "特異点への凝縮\\nアイテムごとに%s個", + "gui.tooltips.appliedenergistics2.Read": "抽出のみ", + "gui.tooltips.appliedenergistics2.Write": "挿入のみ", + "gui.tooltips.appliedenergistics2.ReadWrite": "双方向", + "gui.tooltips.appliedenergistics2.AlwaysActive": "常に有効", + "gui.tooltips.appliedenergistics2.ActiveWithoutSignal": "信号無しで有効", + "gui.tooltips.appliedenergistics2.ActiveWithSignal": "信号有りで有効", + "gui.tooltips.appliedenergistics2.ActiveOnPulse": "パルスで有効", + "gui.tooltips.appliedenergistics2.EmitLevelsBelow": "レベルが制限以下の場合に放出します。", + "gui.tooltips.appliedenergistics2.EmitLevelAbove": "レベルが制限以上の場合に放出します。", + "gui.tooltips.appliedenergistics2.SearchMode_Auto": "自動検索", + "gui.tooltips.appliedenergistics2.SearchMode_Standard": "標準検索", + "gui.tooltips.appliedenergistics2.SearchMode_JEIAuto": "JEI自動同期", + "gui.tooltips.appliedenergistics2.SearchMode_JEIStandard": "JEI標準同期", + "gui.tooltips.appliedenergistics2.SearchMode_AutoKeep": "自動検索を続ける", + "gui.tooltips.appliedenergistics2.SearchMode_StandardKeep": "標準検索を続ける", + "gui.tooltips.appliedenergistics2.SearchMode_JEIAutoKeep": "JEI自動同期を続ける", + "gui.tooltips.appliedenergistics2.SearchMode_JEIStandardKeep": "JEI標準同期を続ける", + "gui.tooltips.appliedenergistics2.SearchMode": "検索ボックスモード", + "gui.tooltips.appliedenergistics2.PartitionStorageHint": "現在保存されているアイテムに基づいてパーティションを構成します。", + "gui.tooltips.appliedenergistics2.ClearSettings": "設定の削除", + "gui.tooltips.appliedenergistics2.Craftable": "クラフト可能", + "gui.tooltips.appliedenergistics2.MoveWhenEmpty": "空の場合は出力に移行します。", + "gui.tooltips.appliedenergistics2.MoveWhenWorkIsDone": "作業が完了したら出力に移行します。", + "gui.tooltips.appliedenergistics2.MoveWhenFull": "いっぱいになったら出力に移行します。", + "gui.tooltips.appliedenergistics2.Disabled": "無効", + "gui.tooltips.appliedenergistics2.Enable": "有効", + "gui.tooltips.appliedenergistics2.Blocking": "インベントリにアイテムが含まれている場合、クラフトアイテムをプッシュしないでください。", + "gui.tooltips.appliedenergistics2.NonBlocking": "ターゲットインベントリの内容を無視します。", + "gui.tooltips.appliedenergistics2.Craft": "クラフト動作", + "gui.tooltips.appliedenergistics2.CraftOnly": "エクスポート中は、ストックされたアイテムを使用せず、クラフトアイテムのみを使用してください。", + "gui.tooltips.appliedenergistics2.CraftEither": "エクスポート中に在庫のあるアイテムまたはクラフトアイテムを使用します。", + "gui.tooltips.appliedenergistics2.LevelType": "レベルタイプ", + "gui.tooltips.appliedenergistics2.LevelType_Energy": "エネルギー", + "gui.tooltips.appliedenergistics2.LevelType_Item": "アイテム", + "gui.tooltips.appliedenergistics2.InventoryTweaks": "Inventory Tweaks", + "gui.tooltips.appliedenergistics2.Mod": "Mod", + "gui.tooltips.appliedenergistics2.TerminalStyle": "ターミナルスタイル", + "gui.tooltips.appliedenergistics2.TerminalStyle_Full": "フルスクリーンターミナル", + "gui.tooltips.appliedenergistics2.TerminalStyle_Tall": "ウインドウターミナル大", + "gui.tooltips.appliedenergistics2.TerminalStyle_Small": "ウインドウターミナル小", + "gui.tooltips.appliedenergistics2.DoesntDespawn": "このアイテムはデスポーンしません。", + "gui.tooltips.appliedenergistics2.EmitterMode": "クラフトエミッターモード", + "gui.tooltips.appliedenergistics2.CraftViaRedstone": "アイテムをクラフトしたときレッドストーン出力。", + "gui.tooltips.appliedenergistics2.EmitWhenCrafting": "アイテムをクラフト中にレッドストーン出力。", + "gui.tooltips.appliedenergistics2.ReportInaccessibleItems": "アクセスできないアイテムの報告", + "gui.tooltips.appliedenergistics2.ReportInaccessibleItemsYes": "はい: 抽出できないアイテムが表示されます。", + "gui.tooltips.appliedenergistics2.ReportInaccessibleItemsNo": "いいえ: 抽出可能なアイテムのみが表示されます。", + "gui.tooltips.appliedenergistics2.ReportInaccessibleFluids": "アクセスできない液体の報告", + "gui.tooltips.appliedenergistics2.ReportInaccessibleFluidsYes": "はい: 抽出できない液体が表示されます。", + "gui.tooltips.appliedenergistics2.ReportInaccessibleFluidsNo": "いいえ: 抽出可能な液体のみが表示されます。", + "gui.tooltips.appliedenergistics2.BlockPlacement": "ブロックの設置", + "gui.tooltips.appliedenergistics2.BlockPlacementYes": "ブロックとして設置されます。", + "gui.tooltips.appliedenergistics2.BlockPlacementNo": "アイテムとしてドロップします。", + "gui.tooltips.appliedenergistics2.SchedulingMode": "スケジュールモード", + "gui.tooltips.appliedenergistics2.SchedulingModeDefault": "ネットワークが空になるまで最初のアイテムを出力し、次のアイテムを試します。", + "gui.tooltips.appliedenergistics2.SchedulingModeRoundRobin": "エクスポートにラウンドロビンモードを使います。", + "gui.tooltips.appliedenergistics2.SchedulingModeRandom": "エクスポートにランダムモードを使います。", + "gui.tooltips.appliedenergistics2.FilterMode": "検索フィルターモード", + "gui.tooltips.appliedenergistics2.FilterModeKeep": "以前の検索フィルターを復元します。", + "gui.tooltips.appliedenergistics2.FilterModeClear": "開いたときに消去します。", + "gui.tooltips.appliedenergistics2.ItemsStored": "アイテム保管済み: %s", + "gui.tooltips.appliedenergistics2.ItemsRequestable": "リクエスト可能なアイテム: %s", + "gui.tooltips.appliedenergistics2.P2PFrequency": "周波数: %s", + + "gui.appliedenergistics2.units.appliedenergstics": "AE", + "gui.appliedenergistics2.units.ic2": "エネルギーユニット", + "gui.appliedenergistics2.units.rf": "レッドストーンフラックス", + + "gui.appliedenergistics2.White": "白色", + "gui.appliedenergistics2.Orange": "橙色", + "gui.appliedenergistics2.Magenta": "赤紫色", + "gui.appliedenergistics2.LightBlue": "水色", + "gui.appliedenergistics2.Yellow": "黄色", + "gui.appliedenergistics2.Lime": "黄緑色", + "gui.appliedenergistics2.Pink": "桃色", + "gui.appliedenergistics2.Gray": "灰色", + "gui.appliedenergistics2.LightGray": "薄灰色", + "gui.appliedenergistics2.Cyan": "空色", + "gui.appliedenergistics2.Purple": "紫色", + "gui.appliedenergistics2.Blue": "青色", + "gui.appliedenergistics2.Brown": "茶色", + "gui.appliedenergistics2.Green": "緑色", + "gui.appliedenergistics2.Red": "赤色", + "gui.appliedenergistics2.Black": "黒色", + "gui.appliedenergistics2.Fluix": "フルーシュ", + + "waila.appliedenergistics2.Crafting": "クラフト中", + "waila.appliedenergistics2.DeviceOnline": "デバイスオンライン", + "waila.appliedenergistics2.DeviceOffline": "デバイスオフライン", + "waila.appliedenergistics2.DeviceMissingChannel": "デバイスのチャンネル未探知", + "waila.appliedenergistics2.Locked": "ロックされた", + "waila.appliedenergistics2.Unlocked": "解錠された", + "waila.appliedenergistics2.Showing": "表示中", + "waila.appliedenergistics2.Contains": "含まれる", + "waila.appliedenergistics2.Channels": "%1$d / %2$dチャンネル", + "waila.appliedenergistics2.P2PUnlinked": "リンクされてない", + "waila.appliedenergistics2.P2PInputOneOutput": "リンク済み(入力側)", + "waila.appliedenergistics2.P2PInputManyOutputs": "リンク済み(入力側) - 出力: %d", + "waila.appliedenergistics2.P2POutput": "リンク済み(出力側)", + + "theoneprobe.appliedenergistics2.crafting": "クラフト中: %1$s", + "theoneprobe.appliedenergistics2.device_online": "デバイスオンライン", + "theoneprobe.appliedenergistics2.device_offline": "デバイスオフライン", + "theoneprobe.appliedenergistics2.device_missing_channel": "デバイスのチャンネル未探知", + "theoneprobe.appliedenergistics2.locked": "ロックされた", + "theoneprobe.appliedenergistics2.unlocked": "解錠された", + "theoneprobe.appliedenergistics2.showing": "表示中", + "theoneprobe.appliedenergistics2.contains": "含まれる", + "theoneprobe.appliedenergistics2.channels": "%1$d / %2$dチャンネル", + "theoneprobe.appliedenergistics2.p2p_unlinked": "リンクされてない", + "theoneprobe.appliedenergistics2.p2p_input_one_output": "リンク済み(入力側)", + "theoneprobe.appliedenergistics2.p2p_input_many_outputs": "リンク済み(入力側) - 出力: %d", + "theoneprobe.appliedenergistics2.p2p_output": "リンク済み(出力側)", + "theoneprobe.appliedenergistics2.p2p_frequency": "周波数: %1$s", + "theoneprobe.appliedenergistics2.stored_energy": "%1$d / %2$d", + + "item.appliedenergistics2.storage_cell_1k": "1k MEストレージセル", + "item.appliedenergistics2.storage_cell_4k": "4k MEストレージセル", + "item.appliedenergistics2.storage_cell_16k": "16k MEストレージセル", + "item.appliedenergistics2.storage_cell_64k": "64k MEストレージセル", + "item.appliedenergistics2.fluid_storage_cell_1k": "1k ME液体ストレージセル", + "item.appliedenergistics2.fluid_storage_cell_4k": "4k ME液体ストレージセル", + "item.appliedenergistics2.fluid_storage_cell_16k": "16k ME液体ストレージセル", + "item.appliedenergistics2.fluid_storage_cell_64k": "64k ME液体ストレージセル", + "item.appliedenergistics2.creative_storage_cell": "クリエイティブMEストレージセル", + "item.appliedenergistics2.encoded_pattern": "エンコード済みパターン", + "item.appliedenergistics2.view_cell": "表示セル", + "item.appliedenergistics2.facade": "外装ケーブル", + + "item.appliedenergistics2.crystal_seed.certus": "ケルタスクォーツの種結晶", + "item.appliedenergistics2.crystal_seed.nether": "ネザークォーツの種結晶", + "item.appliedenergistics2.crystal_seed.fluix": "フルーシュの種結晶", + "item.appliedenergistics2.material.invalid_type": "このアイテムは無効です", + "item.appliedenergistics2.material.advanced_card": "上級カード", + "item.appliedenergistics2.material.annihilation_core": "消滅コア", + "item.appliedenergistics2.material.basic_card": "基本カード", + "item.appliedenergistics2.material.blank_pattern": "空のパターン", + "item.appliedenergistics2.material.calculation_processor": "発展プロセッサ", + "item.appliedenergistics2.material.card_capacity": "キャパシティカード", + "item.appliedenergistics2.material.card_fuzzy": "ファジーカード", + "item.appliedenergistics2.material.card_inverter": "反転カード", + "item.appliedenergistics2.material.card_redstone": "レッドストーンカード", + "item.appliedenergistics2.material.card_speed": "加速カード", + "item.appliedenergistics2.material.cell2_spatial_part": "2³空間コンポーネント", + "item.appliedenergistics2.material.cell16_spatial_part": "16³空間コンポーネント", + "item.appliedenergistics2.material.cell128_spatial_part": "128³空間コンポーネント", + "item.appliedenergistics2.material.cell1k_part": "1k MEストレージコンポーネント", + "item.appliedenergistics2.material.cell4k_part": "4k MEストレージコンポーネント", + "item.appliedenergistics2.material.cell16k_part": "16k MEストレージコンポーネント", + "item.appliedenergistics2.material.cell64k_part": "64k MEストレージコンポーネント", + "item.appliedenergistics2.material.fluid_cell1k_part": "1k ME液体ストレージコンポーネント", + "item.appliedenergistics2.material.fluid_cell4k_part": "4k ME液体ストレージコンポーネント", + "item.appliedenergistics2.material.fluid_cell16k_part": "16k ME液体ストレージコンポーネント", + "item.appliedenergistics2.material.fluid_cell64k_part": "64k ME液体ストレージコンポーネント", + "item.appliedenergistics2.material.certus_quartz_crystal": "ケルタスクォーツクリスタル", + "item.appliedenergistics2.material.certus_quartz_crystal_charged": "チャージ済みケルタスクォーツクリスタル", + "item.appliedenergistics2.material.certus_quartz_dust": "ケルタスクォーツの粉", + "item.appliedenergistics2.material.empty_storage_cell": "MEストレージハウシング", + "item.appliedenergistics2.material.ender_dust": "エンダーパールの粉", + "item.appliedenergistics2.material.engineering_processor": "上級プロセッサ", + "item.appliedenergistics2.material.flour": "小麦粉", + "item.appliedenergistics2.material.fluix_crystal": "フルーシュクリスタル", + "item.appliedenergistics2.material.fluix_dust": "フルーシュの粉", + "item.appliedenergistics2.material.fluix_pearl": "フルーシュパール", + "item.appliedenergistics2.material.formation_core": "形成コア", + "item.appliedenergistics2.material.gold_dust": "金の粉", + "item.appliedenergistics2.material.iron_dust": "鉄の粉", + "item.appliedenergistics2.material.logic_processor": "基本プロセッサ", + "item.appliedenergistics2.material.logic_processor_asm": "未完成基本プロセッサ", + "item.appliedenergistics2.material.matter_ball": "マターボール", + "item.appliedenergistics2.material.nether_quartz_dust": "ネザークォーツの粉", + "item.appliedenergistics2.material.purified_certus_quartz_crystal": "ピュアケルタスクォーツクリスタル", + "item.appliedenergistics2.material.purified_fluix_crystal": "ピュアフルーシュクリスタル", + "item.appliedenergistics2.material.purified_nether_quartz_crystal": "ピュアネザークォーツクリスタル", + "item.appliedenergistics2.material.quantum_entangled_singularity": "量子もつれ特異点", + "item.appliedenergistics2.material.silicon": "シリコン", + "item.appliedenergistics2.material.singularity": "特異点", + "item.appliedenergistics2.material.wireless": "無線受信機", + "item.appliedenergistics2.material.wireless_booster": "無線ブースター", + "item.appliedenergistics2.material.wooden_gear": "木のギア", + "item.appliedenergistics2.material.engineering_processor_press": "上級回路の金型", + "item.appliedenergistics2.material.calculation_processor_press": "発展回路の金型", + "item.appliedenergistics2.material.logic_processor_press": "基本回路の金型", + "item.appliedenergistics2.material.engineering_processor_print": "上級回路", + "item.appliedenergistics2.material.calculation_processor_print": "発展回路", + "item.appliedenergistics2.material.logic_processor_print": "基本回路", + "item.appliedenergistics2.material.silicon_press": "シリコンの金型", + "item.appliedenergistics2.material.silicon_print": "シリコン基盤", + "item.appliedenergistics2.material.name_press": "名札金型", + "item.appliedenergistics2.material.sky_dust": "スカイストーンの粉", + "item.appliedenergistics2.material.card_crafting": "クラフティングカード", + + "item.appliedenergistics2.multi_part.annihilation_plane": "MEブロック消滅機", + "item.appliedenergistics2.multi_part.fluid_annihilation_plane": "ME液体消滅機", + "item.appliedenergistics2.multi_part.identity_annihilation_plane": "MEアイデンティティー消滅機", + "item.appliedenergistics2.multi_part.cable_anchor": "ケーブルアンカー", + "item.appliedenergistics2.multi_part.cable_covered": "MEカバーケーブル", + "item.appliedenergistics2.multi_part.cable_glass": "MEガラスケーブル", + "item.appliedenergistics2.multi_part.cable_smart": "MEスマートケーブル", + "item.appliedenergistics2.multi_part.cable_dense_covered": "ME濃縮カバーケーブル", + "item.appliedenergistics2.multi_part.cable_dense_smart": "ME濃縮スマートケーブル", + "item.appliedenergistics2.multi_part.storage_monitor": "MEストレージモニター", + "item.appliedenergistics2.multi_part.conversion_monitor": "ME変換モニター", + "item.appliedenergistics2.multi_part.crafting_terminal": "MEクラフトターミナル", + "item.appliedenergistics2.multi_part.semi_dark_monitor": "発光パネル", + "item.appliedenergistics2.multi_part.monitor": "明るい発光パネル", + "item.appliedenergistics2.multi_part.dark_monitor": "暗い発光パネル", + "item.appliedenergistics2.multi_part.export_bus": "ME出力バス", + "item.appliedenergistics2.multi_part.fluid_export_bus": "ME液体出力バス", + "item.appliedenergistics2.multi_part.formation_plane": "MEブロック形成機", + "item.appliedenergistics2.multi_part.fluid_formation_plane": "ME液体形成機", + "item.appliedenergistics2.multi_part.import_bus": "ME入力バス", + "item.appliedenergistics2.multi_part.fluid_import_bus": "ME液体入力バス", + "item.appliedenergistics2.multi_part.interface": "MEインターフェース", + "item.appliedenergistics2.multi_part.fluid_interface": "ME液体インターフェース", + "item.appliedenergistics2.multi_part.level_emitter": "MEレベルエミッター", + "item.appliedenergistics2.multi_part.fluid_level_emitter": "ME液体レベルエミッター", + "item.appliedenergistics2.multi_part.p2p_tunnel": "P2Pトンネル", + "item.appliedenergistics2.multi_part.pattern_terminal": "MEパターンターミナル", + "item.appliedenergistics2.multi_part.quartz_fiber": "クォーツファイバー", + "item.appliedenergistics2.multi_part.storage_bus": "MEストレージバス", + "item.appliedenergistics2.multi_part.fluid_storage_bus": "ME液体ストレージバス", + "item.appliedenergistics2.multi_part.terminal": "MEターミナル", + "item.appliedenergistics2.multi_part.inverted_toggle_bus": "ME反転トグルバス", + "item.appliedenergistics2.multi_part.toggle_bus": "MEトグルバス", + "item.appliedenergistics2.multi_part.crafting_monitor": "MEクラフトモニター", + "item.appliedenergistics2.multi_part.interface_terminal": "MEインターフェースターミナル", + "item.appliedenergistics2.multi_part.fluid_terminal": "ME液体ターミナル", + "item.appliedenergistics2.multi_part.invalid_type": "無効なアイテム", + + "item.appliedenergistics2.spatial_storage_cell_128_cubed": "128³空間ストレージセル", + "item.appliedenergistics2.spatial_storage_cell_16_cubed": "16³空間ストレージセル", + "item.appliedenergistics2.spatial_storage_cell_2_cubed": "2³空間ストレージセル", + + "item.appliedenergistics2.certus_quartz_axe": "ケルタスクォーツの斧", + "item.appliedenergistics2.certus_quartz_cutting_knife": "ケルタスクォーツのナイフ", + "item.appliedenergistics2.certus_quartz_hoe": "ケルタスクォーツのクワ", + "item.appliedenergistics2.certus_quartz_pickaxe": "ケルタスクォーツのピッケル", + "item.appliedenergistics2.certus_quartz_spade": "ケルタスクォーツのシャベル", + "item.appliedenergistics2.certus_quartz_sword": "ケルタスクォーツの剣", + "item.appliedenergistics2.certus_quartz_wrench": "ケルタスクォーツのレンチ", + + "item.appliedenergistics2.nether_quartz_axe": "ネザークォーツの斧", + "item.appliedenergistics2.nether_quartz_cutting_knife": "ネザークォーツのナイフ", + "item.appliedenergistics2.nether_quartz_hoe": "ネザークォーツのクワ", + "item.appliedenergistics2.nether_quartz_pickaxe": "ネザークォーツのピッケル", + "item.appliedenergistics2.nether_quartz_spade": "ネザークォーツのシャベル", + "item.appliedenergistics2.nether_quartz_sword": "ネザークォーツの剣", + "item.appliedenergistics2.nether_quartz_wrench": "ネザークォーツのレンチ", + + "item.appliedenergistics2.paint_ball": "ペイントボール", + "item.appliedenergistics2.portable_cell": "ポータブルセル", + "item.appliedenergistics2.network_tool": "ネットワークツール", + "item.appliedenergistics2.charged_staff": "チャージ済みのスタッフ", + "item.appliedenergistics2.entropy_manipulator": "エントロピーマニュピレーター", + "item.appliedenergistics2.matter_cannon": "マターキャノン", + "item.appliedenergistics2.memory_card": "メモリーカード", + "item.appliedenergistics2.color_applicator": "染色ブラシ", + "item.appliedenergistics2.wireless_terminal": "ワイヤレスターミナル", + "item.appliedenergistics2.biometric_card": "バイオメトリクスカード", + + "item.appliedenergistics2.debug_card": "Dev.DebugCard", + "item.appliedenergistics2.debug_replicator_card": "Dev.ReplicatorCard", + + "commands.ae2.usage": "Applied Energistics 2 によるコマンド - /ae2 list でリストを表示、/ae2 help _____ でヘルプを表示。", + "commands.ae2.permissions": "このコマンドを実行するための権限がありません。", + "commands.ae2.ChunkLogger": "サーバーログへのチャンクのロードとアンロードを切り替えます。 ( OP )", + "commands.ae2.ChunkLoggerOn": "チャンクロギング: オン", + "commands.ae2.ChunkLoggerOff": "チャンクロギング: オフ", + "commands.ae2.Supporters": "AE2サポーターのリストを表示", + + "achievement.ae2.Root": "Applied Energistics", + "achievement.ae2.Root.desc": "チェストだけでは物足りなかったとき", + "achievement.ae2.Compass": "隕石ハンター", + "achievement.ae2.Compass.desc": "隕石コンパスをクラフトする", + "achievement.ae2.Presses": "謎のテクノロジー", + "achievement.ae2.Presses.desc": "金型を見つける", + "achievement.ae2.SpatialIO": "空間座標", + "achievement.ae2.SpatialIO.desc": "空間入出力ポートをクラフトする", + "achievement.ae2.SpatialIOExplorer": "大胆に", + "achievement.ae2.SpatialIOExplorer.desc": "空間ストレージセルに保管する", + "achievement.ae2.StorageCell": "チェストよりも優れてる", + "achievement.ae2.StorageCell.desc": "ストレージセルをクラフトする", + "achievement.ae2.IOPort": "ストレージセルシャッフル", + "achievement.ae2.IOPort.desc": "入出力ポートをクラフトする", + "achievement.ae2.CraftingTerminal": "(マジで)でかいテーブル", + "achievement.ae2.CraftingTerminal.desc": "クラフトターミナルをクラフトする", + "achievement.ae2.PatternTerminal": "巨匠をクラフト", + "achievement.ae2.PatternTerminal.desc": "パターンターミナルをクラフトする", + "achievement.ae2.ChargedQuartz": "衝撃的な出会い", + "achievement.ae2.ChargedQuartz.desc": "チャージ済みクォーツを見つける", + "achievement.ae2.Fluix": "不自然", + "achievement.ae2.Fluix.desc": "フルーシュクリスタルをクラフトする", + "achievement.ae2.Charger": "フルーシュ生産工場", + "achievement.ae2.Charger.desc": "チャージャーをクラフトする", + "achievement.ae2.CrystalGrowthAccelerator": "ゆっくりな加速器", + "achievement.ae2.CrystalGrowthAccelerator.desc": "クリスタル成長加速器をクラフトする", + "achievement.ae2.GlassCable": "フルーシュエナジー接続", + "achievement.ae2.GlassCable.desc": "MEガラスケーブルをクラフトする", + "achievement.ae2.Networking1": "ネットワーク見習い", + "achievement.ae2.Networking1.desc": "ネットワークにデバイスを使って8つのチャンネルを繋ぐ。", + "achievement.ae2.Controller": "ネットワークスイッチングハブ", + "achievement.ae2.Controller.desc": "コントローラーをクラフトする", + "achievement.ae2.Networking2": "ネットワークエンジニア", + "achievement.ae2.Networking2.desc": "ネットワークにデバイスを使って128のチャンネルを繋ぐ。", + "achievement.ae2.Networking3": "ネットワーク管理者", + "achievement.ae2.Networking3.desc": "ネットワークにデバイスを使って2048のチャンネルを繋ぐ。", + "achievement.ae2.P2P": "ポイント・トゥ・ポイント・ネットワーク", + "achievement.ae2.P2P.desc": "P2Pトンネルをクラフトする", + "achievement.ae2.Recursive": "ネットワークの再帰", + "achievement.ae2.Recursive.desc": "ストレージバスにインターフェースを設置する。", + "achievement.ae2.CraftingCPU": "次世代クラフト", + "achievement.ae2.CraftingCPU.desc": "クラフトユニットをクラフトする", + "achievement.ae2.Facade": "ネットワークの美学", + "achievement.ae2.Facade.desc": "外装ケーブルをクラフトする", + "achievement.ae2.NetworkTool": "ネットワーク診断", + "achievement.ae2.NetworkTool.desc": "ネットワークツールをクラフトする", + "achievement.ae2.PortableCell": "ストレージ放牧民", + "achievement.ae2.PortableCell.desc": "ポータブルセルをクラフトする", + "achievement.ae2.StorageBus": "無限の可能性", + "achievement.ae2.StorageBus.desc": "ストレージバスをクラフトする", + "achievement.ae2.QNB": "量子トンネル", + "achievement.ae2.QNB.desc": "クァンタムリンクをクラフトする", + + "stat.ae2.ItemsInserted": "MEストレージにアイテムが追加された", + "stat.ae2.ItemsExtracted": "MEストレージからアイテムが搬出された", + "stat.ae2.TurnedCranks": "クランクが回された", + + "key.appliedenergistics2.category": "Applied Energistics 2", + "key.toggle_focus.desc": "検索ボックスのフォーカスの切り替え" +}