Merge remote-tracking branch 'origin/master' into fabric-1.16

# Conflicts:
#	src/main/java/appeng/block/spatial/SpatialPylonBlock.java
#	src/main/java/appeng/client/render/spatial/SpatialPylonBakedModel.java
#	src/main/java/appeng/core/AppEng.java
#	src/main/java/appeng/hooks/TickHandler.java
#	src/main/java/appeng/me/cluster/MBCalculator.java
#	src/main/java/appeng/me/cluster/implementations/CraftingCPUCluster.java
#	src/main/java/appeng/me/cluster/implementations/QuantumCluster.java
#	src/main/java/appeng/me/cluster/implementations/SpatialPylonCluster.java
#	src/main/java/appeng/me/helpers/AENetworkProxy.java
#	src/main/java/appeng/tile/networking/CableBusBlockEntity.java
#	src/main/java/appeng/tile/networking/DenseEnergyCellBlockEntity.java
#	src/main/java/appeng/tile/qnb/QuantumBridgeBlockEntity.java
#	src/main/java/appeng/tile/spatial/SpatialPylonBlockEntity.java
#	src/main/java/appeng/util/Platform.java
This commit is contained in:
Sebastian Hartte
2020-07-19 01:05:14 +02:00
34 changed files with 1018 additions and 133 deletions
@@ -71,4 +71,18 @@ public interface IAEPowerStorage extends IEnergySource {
*/
@Nonnull
AccessRestriction getPowerFlow();
}
/**
* 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;
}
}
@@ -59,7 +59,7 @@ public abstract class AbstractCraftingUnitBlock<T extends CraftingBlockEntity> e
final BlockPos fromPos, boolean isMoving) {
final CraftingBlockEntity cp = this.getBlockEntity(worldIn, pos);
if (cp != null) {
cp.updateMultiBlock();
cp.updateMultiBlock(fromPos);
}
}
@@ -70,7 +70,7 @@ public abstract class QuantumBaseBlock extends AEBaseTileBlock<QuantumBridgeBloc
boolean isMoving) {
final QuantumBridgeBlockEntity bridge = this.getBlockEntity(world, pos);
if (bridge != null) {
bridge.neighborUpdate();
bridge.neighborUpdate(fromPos);
}
}
@@ -39,7 +39,7 @@ public class SpatialPylonBlock extends AEBaseTileBlock<SpatialPylonBlockEntity>
boolean isMoving) {
final SpatialPylonBlockEntity tsp = this.getBlockEntity(world, pos);
if (tsp != null) {
tsp.neighborUpdate();
tsp.neighborUpdate(fromPos);
}
}
@@ -214,7 +214,7 @@ class SpatialPylonBakedModel implements BakedModel, FabricBakedModel {
@Override
public boolean useAmbientOcclusion() {
return true;
return false;
}
@Override
@@ -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);
}
}
@@ -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();
@@ -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();
}
+74 -23
View File
@@ -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<IWorldCallable<?>> serverQueue = new ArrayDeque<>();
private final Multimap<World, CraftingJob> craftingJobs = LinkedListMultimap.create();
private final WeakHashMap<WorldAccess, Queue<IWorldCallable<?>>> callQueue = new WeakHashMap<>();
private final Map<WorldAccess, Queue<IWorldCallable<?>>> callQueue = new WeakHashMap<>();
private final HandlerRep server = new HandlerRep();
private final HandlerRep client = new HandlerRep();
private final HashMap<Integer, PlayerColor> srvPlayerColors = new HashMap<>();
@@ -57,7 +88,29 @@ public class TickHandler {
}
public HashMap<Integer, PlayerColor> 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<Integer, PlayerColor> 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<CraftingJob> jobSet = this.craftingJobs.get(world);
if (!jobSet.isEmpty()) {
final int simTime = Math.max(1,
AEConfig.instance().getCraftingCalculationTimePerTick() / jobSet.size());
final Iterator<CraftingJob> 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<CraftingJob> 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<Integer, PlayerColor> playerSet) {
public void registerCraftingSimulation(final World world, final CraftingJob craftingJob) {
synchronized (this.craftingJobs) {
this.craftingJobs.put(world, craftingJob);
}
}
protected void tickColors(final Map<Integer, PlayerColor> playerSet) {
final Iterator<PlayerColor> 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 {
@@ -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;
+2 -2
View File
@@ -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();
}
}
+2 -2
View File
@@ -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) {
+16 -3
View File
@@ -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<IAEPowerStorage> COMPARATOR_HIGHEST_PRIORITY_FIRST = (o1, o2) -> Integer
.compare(o2.getPriority(), o1.getPriority());
private static final Comparator<IAEPowerStorage> COMPARATOR_LOWEST_PRIORITY_FIRST = (o1, o2) -> Integer
.compare(o1.getPriority(), o2.getPriority());
private final NavigableSet<EnergyThreshold> interests = Sets.newTreeSet();
private final double averageLength = 40.0;
private final Set<IAEPowerStorage> providers = new LinkedHashSet<>();
private final Set<IAEPowerStorage> requesters = new LinkedHashSet<>();
private final SortedSet<IAEPowerStorage> providers = new ObjectRBTreeSet<>(COMPARATOR_HIGHEST_PRIORITY_FIRST);
private final SortedSet<IAEPowerStorage> requesters = new ObjectRBTreeSet<>(COMPARATOR_LOWEST_PRIORITY_FIRST);
private final Multiset<IEnergyGridProvider> energyGridProviders = HashMultiset.create();
private final IGrid myGrid;
private final HashMap<IGridNode, IEnergyWatcher> 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;
+32 -20
View File
@@ -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:
@@ -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<IGridHost> getTiles();
}
@@ -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<IAECluster> 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)));
}
@@ -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<ICraftingPatternDetails, TaskProgress> 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);
}
}
@@ -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
@@ -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
@@ -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<SpatialPylonBlockEntity> 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<SpatialPylonBlockEntity> getLine() {
@@ -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);
}
}
@@ -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;
}
@@ -138,14 +138,14 @@ public class MEP2PTunnelPart extends P2PTunnelPart<MEP2PTunnelPart> 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);
}
}
@@ -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;
}
}
@@ -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) {
@@ -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
@@ -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;
}
}
@@ -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;
}
}
@@ -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;
}
}
@@ -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
@@ -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.
}
}
}
@@ -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;
+1 -1
View File
@@ -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));
}
}
@@ -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": "検索ボックスのフォーカスの切り替え"
}