Compare commits

...

52 Commits

Author SHA1 Message Date
PrototypeTrousers f13d7f351d fix container items breaking not being taken into account during simulation properly
optimize crafting with container items by checking IF WE HAVE ANY of before LOOKING UP IF THE RECIPE MATCHES with the item we DONT HAVE
2023-07-03 15:30:05 -03:00
PrototypeTrousers 086ddd5a67 shady optimization 2023-06-29 15:21:33 -03:00
PrototypeTrousers acb1d00197 attempt to separate itens used simulation (threaded) from the main 2023-06-29 12:53:32 -03:00
PrototypeTrousers 4aaa3f8929 make container itens not arrive too late or early instead precisely when
they are meant to
2023-06-29 12:51:04 -03:00
PrototypeTrousers cba89b0323 fix damageable container items not being returned immediately for simulation 2023-06-27 11:47:23 -03:00
PrototypeTrousers 1442248ec3 bump version 2023-06-17 08:12:34 -03:00
PrototypeTrousers 1500661e43 fix wireless terminals duping and voiding issues.
fixes #270
2023-06-16 17:57:13 -03:00
PrototypeTrousers a7c2824624 replace ItemEncodedPattern cache with something that actually works 2023-06-15 21:43:27 -03:00
PrototypeTrousers 9d2549bdd8 bump version 2023-05-26 19:46:34 -03:00
PrototypeTrousers a37a2b4e89 blindly attempt to fix wireless terminal voiding/duping 2023-05-26 19:46:34 -03:00
miozune aa6bad7a72 Fix CPU Clusters consisting only of addon blocks not being recognized (#274) 2023-05-24 07:27:20 -03:00
Rongmario e2e5eed351 Properly discard caches when reloading models (#278)
* Properly discard caches when reloading models

* Singleton reloading multiple AutoRotatingModels
2023-05-24 07:26:24 -03:00
Caedis b6de4ebf18 Fix single slabs and stairs to allow chest opening (#268) 2023-05-24 07:25:56 -03:00
PrototypeTrousers 4545d78a51 bump version 2023-04-24 09:43:23 -03:00
PrototypeTrousers 6dc75fe26e attempt to fix #253 2023-04-24 09:29:10 -03:00
Florian Kostenzer 0552282d9d fix: fix crash when requester node is removed (#262) 2023-04-24 09:18:17 -03:00
Hikari_Nova 8be01dfb87 Try to fix https://github.com/PrototypeTrousers/Applied-Energistics-2/issues/265. (#266) 2023-04-24 09:17:53 -03:00
PrototypeTrousers 4c5803b986 check if baubles mod is installed when using keybinds to open terminals 2023-04-24 09:17:18 -03:00
PrototypeTrousers 3b4b9a1bd5 add recursion check to item p2ps 2023-04-15 08:32:27 -03:00
osimon 2c7959e399 Interface shift-clicking QOL improvements (#248) 2023-03-28 18:27:36 -03:00
PrototypeTrousers 4649841341 Use anatawa's fork of forgegradel 2.3 2023-03-28 18:25:22 -03:00
PrototypeTrousers 3d4cfb2ee8 add the quantum link card to the quantum chamber tooltip 2023-03-28 18:24:51 -03:00
PrototypeTrousers 8092d0d354 Allow the quantum linking card to be disabled by config
Clean up some wrong tooltip
2023-03-28 18:02:36 -03:00
PrototypeTrousers ceee1f181f bump version. copy/paste some lang entries 2023-03-20 16:07:47 -03:00
Domi eefb11544e Add craftable items QOL features (tooltips / hold ALT to toggle craft request) (#241) 2023-03-20 16:01:06 -03:00
Xikaro af5921f9e8 fix ME Chest rendering (#246)
* Update dependencies.gradle

* fix ME Chest rendering
2023-03-20 15:58:40 -03:00
Domi 75be2ff039 Refresh crafting plan when job submission fails (#243) 2023-03-20 15:53:23 -03:00
Domi b6f4bdb64d Fix being unable to clear selected text in number boxes (#242) 2023-03-20 15:53:11 -03:00
PrototypeTrousers b76c9f1371 null check 2023-03-07 14:54:38 -03:00
PrototypeTrousers 50bf591418 bump version 2023-03-05 14:07:36 -03:00
RuiXuqi b077aff1f8 New cells models (#227)
new cells
2023-03-05 14:06:15 -03:00
PrototypeTrousers 8debd6c499 fix invisible interface config slots on servers 2023-02-28 20:00:31 -03:00
PrototypeTrousers 53ad6c776b fix magnet card crashing servers 2023-02-21 20:33:27 -03:00
PrototypeTrousers e37f8ef65d bump version 2023-02-21 10:19:36 -03:00
PrototypeTrousers d8b20f53a9 fix portable cell not working 2023-02-21 10:09:31 -03:00
PrototypeTrousers bf1a3b7751 fix outputs in processing terminal slowly migrating upwards 2023-02-21 09:58:54 -03:00
PrototypeTrousers c8a6d50ce3 fix wireless crafting terminal not loading sorting configs properly 2023-02-20 01:16:41 -03:00
PrototypeTrousers 13af30f657 try to fix the fix 2023-02-18 23:11:43 -03:00
PrototypeTrousers 5d7f552643 attempt to fix wireless terminals overwriting items in hand 2023-02-18 21:06:41 -03:00
Roman Hubenkov 82be548fc7 Update ru_ru.lang (#223)
Small fix
2023-02-18 21:06:13 -03:00
Roman Hubenkov 38249608e4 Update ru_ru.lang (#222) 2023-02-14 20:26:49 -03:00
mczph 8f66765696 Update zh_cn.lang (#221) 2023-02-14 20:26:29 -03:00
PrototypeTrousers fd5f9263d8 fix wireless pattern terminal not encoding processing outputs from JEI
bump version
2023-02-14 20:25:09 -03:00
PrototypeTrousers 36d94a17aa close wireless terminals if they run out of power instead of not working 2023-02-14 19:10:42 -03:00
PrototypeTrousers ede2b4ce25 fix OOB crash 2023-02-13 01:02:59 -03:00
PrototypeTrousers e09ec8c420 bump version 2023-02-10 06:32:35 -03:00
tier940 3d4c03e184 Update ja_jp.lang (#220)
* Update ja_jp.lang

* 組立室から組立機に変更

* 表記揺れの修正

* 記載揺れと誤字脱字の修正
2023-02-10 06:29:15 -03:00
PrototypeTrousers 17119fd990 more gui fixes... 2023-02-10 06:28:44 -03:00
PrototypeTrousers 9a00185b6d backport some security changes 2023-02-10 06:21:39 -03:00
PrototypeTrousers 2c7b239914 bump version 2023-02-09 19:20:17 -03:00
PrototypeTrousers 4039188712 more fixes yay 2023-02-09 13:02:55 -03:00
PrototypeTrousers ecb697ab11 fix terminal/netwoork tool (please) 2023-02-09 12:16:40 -03:00
94 changed files with 2125 additions and 1234 deletions
+25
View File
@@ -0,0 +1,25 @@
name: Build mod
on: [ push, pull_request, workflow_dispatch ]
jobs:
build:
name: Build mod
runs-on: ubuntu-latest
steps:
- uses: actions/checkout@v2
- name: Set up JDK 1.8
uses: actions/setup-java@v2
with:
distribution: 'adopt'
java-version: '8'
- name: Grant execute permission for gradlew
run: chmod +x gradlew
- name: Build with Gradle
run: ./gradlew -Pnet.minecraftforge.gradle.disableUpdateChecker=true build
- name: Upload artifacts
uses: actions/upload-artifact@v2
with:
name: appliedenergistics2
path: build/libs
-15
View File
@@ -1,15 +0,0 @@
name: 'Lock threads'
on:
schedule:
- cron: '0 0 * * *'
jobs:
lock:
runs-on: ubuntu-latest
steps:
- uses: dessant/lock-threads@v2
with:
github-token: ${{ github.token }}
issue-lock-inactive-days: '180'
pr-lock-inactive-days: '180'
+3 -1
View File
@@ -28,7 +28,9 @@ buildscript {
}
}
dependencies {
classpath 'net.minecraftforge.gradle:ForgeGradle:2.3-SNAPSHOT'
classpath("com.anatawa12.forge:ForgeGradle:2.3-1.0.+") {
changing = true
}
}
}
+1 -1
View File
@@ -4,7 +4,7 @@ aebuild=7
aegroup=appeng
aebasename=appliedenergistics2
extended=extended_life
extendedversion=v0.55.2
extendedversion=v0.55.15
#########################################################
# Versions #
#########################################################
+3 -3
View File
@@ -81,11 +81,11 @@ configurations {
dependencies {
// deobfCompile "gregtechce:gregtech:1.12.2:1.15.1.735"
// installable runtime dependencies
deobfCompile "curse.maven:gregtechceu-557242:3949406"
deobfCompile "curse.maven:gregtechceu-557242:4429261"
compileOnly "curse.maven:chisel-235279:2915375"
deobfCompile "baubles:Baubles:1.12:1.5.2"
deobfCompile "curse.maven:baubles-227083:2518667"
//mods "mcp.mobius.waila:Hwyla:${hwyla_version}"
mods "curse.maven:hwyla-253449:2568751"
mods "net.industrial-craft:industrialcraft-2:${ic2_version}:dev"
@@ -107,7 +107,7 @@ dependencies {
compileOnly "cofh:CoFHCore:${cofhcore_version}:deobf"
compileOnly "CraftTweaker2:CraftTweaker2-API:${crafttweaker_version}"
compileOnly "curse.maven:inventory-tweaks-223094:2482482"
compileOnly "curse.maven:inventory-bogo-sorter-632327:4329854"
compileOnly "curse.maven:inventory-bogo-sorter-632327:4399738"
compileOnly "team.chisel.ctm:CTM:${ctm_version}"
compileOnly "de.ellpeck.actuallyadditions:ActuallyAdditions:1.12.2-r152.16:api"
deobfCompile "net.sengir.forestry:forestry_${minecraft_version}:$forestry_version"
@@ -22,6 +22,12 @@ package appeng.block;
import com.google.common.base.Preconditions;
import net.minecraft.block.Block;
import net.minecraft.block.BlockStairs;
import net.minecraft.block.state.IBlockState;
import net.minecraft.util.EnumFacing;
import net.minecraft.util.math.BlockPos;
import net.minecraft.world.IBlockAccess;
import javax.annotation.Nonnull;
public abstract class AEBaseStairBlock extends BlockStairs {
@@ -43,4 +49,9 @@ public abstract class AEBaseStairBlock extends BlockStairs {
return this.getClass().getSimpleName() + "[" + regName + "]";
}
@Override
public boolean doesSideBlockChestOpening(@Nonnull IBlockState blockState, @Nonnull IBlockAccess world, @Nonnull BlockPos pos, @Nonnull EnumFacing side) {
return false;
}
}
@@ -25,21 +25,31 @@ import appeng.bootstrap.components.StateMapperComponent;
import appeng.bootstrap.components.TesrComponent;
import appeng.client.render.model.AutoRotatingModel;
import net.minecraft.block.Block;
import net.minecraft.client.Minecraft;
import net.minecraft.client.renderer.block.model.IBakedModel;
import net.minecraft.client.renderer.block.model.ModelResourceLocation;
import net.minecraft.client.renderer.block.statemap.IStateMapper;
import net.minecraft.client.renderer.color.IBlockColor;
import net.minecraft.client.renderer.tileentity.TileEntitySpecialRenderer;
import net.minecraft.client.resources.IReloadableResourceManager;
import net.minecraft.client.resources.IResourceManager;
import net.minecraft.client.resources.IResourceManagerReloadListener;
import net.minecraftforge.client.model.IModel;
import net.minecraftforge.client.resource.IResourceType;
import net.minecraftforge.client.resource.ISelectiveResourceReloadListener;
import net.minecraftforge.client.resource.VanillaResourceType;
import net.minecraftforge.fml.relauncher.Side;
import net.minecraftforge.fml.relauncher.SideOnly;
import java.util.ArrayList;
import java.util.HashMap;
import java.util.List;
import java.util.Map;
import java.util.function.BiFunction;
import java.util.function.Predicate;
class BlockRendering implements IBlockRendering {
class BlockRendering implements IBlockRendering, ISelectiveResourceReloadListener {
@SideOnly(Side.CLIENT)
private BiFunction<ModelResourceLocation, IBakedModel, IBakedModel> modelCustomizer;
@@ -56,6 +66,13 @@ class BlockRendering implements IBlockRendering {
@SideOnly(Side.CLIENT)
private final Map<String, IModel> builtInModels = new HashMap<>();
@SideOnly(Side.CLIENT)
private final List<IResourceManagerReloadListener> reloads = new ArrayList<>();
BlockRendering() {
((IReloadableResourceManager) Minecraft.getMinecraft().getResourceManager()).registerReloadListener(this);
}
@Override
@SideOnly(Side.CLIENT)
public IBlockRendering modelCustomizer(BiFunction<ModelResourceLocation, IBakedModel, IBakedModel> customizer) {
@@ -103,7 +120,11 @@ class BlockRendering implements IBlockRendering {
} else if (block instanceof AEBaseTileBlock) {
// This is a default rotating model if the base-block uses an AE tile entity which exposes UP/FRONT as
// extended props
factory.addModelOverride(block.getRegistryName().getResourcePath(), (l, m) -> new AutoRotatingModel(m));
factory.addModelOverride(block.getRegistryName().getResourcePath(), (l, m) -> {
AutoRotatingModel model = new AutoRotatingModel(m);
BlockRendering.this.reloads.add(model);
return model;
});
}
// TODO : 1.12
@@ -117,4 +138,13 @@ class BlockRendering implements IBlockRendering {
factory.addBootstrapComponent(new StateMapperComponent(block, this.stateMapper));
}
}
@Override
@SideOnly(Side.CLIENT)
public void onResourceManagerReload(IResourceManager resourceManager, Predicate<IResourceType> resourcePredicate) {
if (resourcePredicate.test(VanillaResourceType.MODELS)) {
this.reloads.forEach(listener -> listener.onResourceManagerReload(resourceManager));
}
}
}
@@ -49,6 +49,7 @@ import mezz.jei.api.gui.IGhostIngredientHandler;
import net.minecraft.client.Minecraft;
import net.minecraft.client.gui.Gui;
import net.minecraft.client.gui.GuiButton;
import net.minecraft.client.gui.GuiScreen;
import net.minecraft.client.gui.inventory.GuiContainer;
import net.minecraft.client.renderer.BufferBuilder;
import net.minecraft.client.renderer.GlStateManager;
@@ -568,7 +569,10 @@ public abstract class AEBaseGui extends GuiContainer implements IMTModGuiContain
action = (mouseButton == 1) ? InventoryAction.SPLIT_OR_PLACE_SINGLE : InventoryAction.PICKUP_OR_SET_DOWN;
stack = ((SlotME) slot).getAEStack();
if (stack != null && action == InventoryAction.PICKUP_OR_SET_DOWN && stack.getStackSize() == 0 && player.inventory.getItemStack().isEmpty()) {
if (stack != null
&& action == InventoryAction.PICKUP_OR_SET_DOWN
&& (stack.getStackSize() == 0 || GuiScreen.isAltKeyDown())
&& player.inventory.getItemStack().isEmpty()) {
action = InventoryAction.AUTO_CRAFT;
}
@@ -76,6 +76,11 @@ public abstract class AEBaseMEGui extends AEBaseGui {
currentToolTip.add(format);
}
if (myStack.isCraftable() && AEConfig.instance().isShowCraftableTooltip()) {
final String local = ButtonToolTips.ItemsCraftable.getLocal();
currentToolTip.add(TextFormatting.GRAY + local);
}
this.drawHoveringText(currentToolTip, x, y, this.fontRenderer);
return;
@@ -37,6 +37,9 @@ public class GuiNumberBox extends GuiTextField {
final String original = this.getText();
super.writeText(selectedText);
if (this.getText().isEmpty()) {
return;
}
try {
if (this.type == int.class || this.type == Integer.class) {
Integer.parseInt(this.getText());
@@ -26,6 +26,7 @@ import appeng.util.ISlimReadableNumberConverter;
import appeng.util.IWideReadableNumberConverter;
import appeng.util.ReadableNumberConverter;
import net.minecraft.client.gui.FontRenderer;
import net.minecraft.client.gui.GuiScreen;
import net.minecraft.client.renderer.GlStateManager;
@@ -48,7 +49,7 @@ public class StackSizeRenderer {
final boolean unicodeFlag = fontRenderer.getUnicodeFlag();
fontRenderer.setUnicodeFlag(false);
if (aeStack.getStackSize() == 0 && aeStack.isCraftable()) {
if ((aeStack.getStackSize() == 0 || GuiScreen.isAltKeyDown()) && aeStack.isCraftable()) {
final String craftLabelText = AEConfig.instance().useTerminalUseLargeFont() ? GuiText.LargeFontCraft.getLocal() : GuiText.SmallFontCraft
.getLocal();
GlStateManager.disableLighting();
@@ -64,8 +65,7 @@ public class StackSizeRenderer {
GlStateManager.enableDepth();
GlStateManager.enableBlend();
}
if (aeStack.getStackSize() > 0) {
else if (aeStack.getStackSize() > 0) {
final String stackSize = this.getToBeRenderedStackSize(aeStack.getStackSize());
GlStateManager.disableLighting();
@@ -45,7 +45,7 @@ import java.util.Map.Entry;
public class CableBusBakedModel implements IBakedModel {
private static final Map<CableBusRenderState, List<BakedQuad>> CABLE_MODEL_CACHE = new HashMap<>();
static final Map<CableBusRenderState, List<BakedQuad>> CABLE_MODEL_CACHE = new HashMap<>();
private final CableBuilder cableBuilder;
@@ -27,21 +27,26 @@ import com.google.common.collect.ImmutableMap;
import net.minecraft.client.renderer.block.model.IBakedModel;
import net.minecraft.client.renderer.texture.TextureAtlasSprite;
import net.minecraft.client.renderer.vertex.VertexFormat;
import net.minecraft.client.resources.IResourceManager;
import net.minecraft.util.ResourceLocation;
import net.minecraftforge.client.model.IModel;
import net.minecraftforge.client.model.ModelLoaderRegistry;
import net.minecraftforge.client.resource.IResourceType;
import net.minecraftforge.client.resource.ISelectiveResourceReloadListener;
import net.minecraftforge.client.resource.VanillaResourceType;
import net.minecraftforge.common.model.IModelState;
import net.minecraftforge.common.model.TRSRTransformation;
import java.util.Collection;
import java.util.Map;
import java.util.function.Function;
import java.util.function.Predicate;
/**
* The built-in model for the cable bus block.
*/
public class CableBusModel implements IModel {
public class CableBusModel implements IModel, ISelectiveResourceReloadListener {
private final PartModels partModels;
@@ -101,4 +106,12 @@ public class CableBusModel implements IModel {
public IModelState getDefaultState() {
return TRSRTransformation.identity();
}
@Override
public void onResourceManagerReload(IResourceManager resourceManager, Predicate<IResourceType> resourcePredicate) {
if (resourcePredicate.test(VanillaResourceType.MODELS)) {
CableBusBakedModel.CABLE_MODEL_CACHE.clear();
}
}
}
@@ -33,6 +33,8 @@ import net.minecraft.client.renderer.block.model.ItemOverrideList;
import net.minecraft.client.renderer.texture.TextureAtlasSprite;
import net.minecraft.client.renderer.vertex.VertexFormat;
import net.minecraft.client.renderer.vertex.VertexFormatElement;
import net.minecraft.client.resources.IResourceManager;
import net.minecraft.client.resources.IResourceManagerReloadListener;
import net.minecraft.util.EnumFacing;
import net.minecraft.util.math.Vec3i;
import net.minecraftforge.client.model.pipeline.IVertexConsumer;
@@ -46,7 +48,7 @@ import java.util.ArrayList;
import java.util.List;
public class AutoRotatingModel implements IBakedModel {
public class AutoRotatingModel implements IBakedModel, IResourceManagerReloadListener {
private final IBakedModel parent;
private final LoadingCache<AutoRotatingCacheKey, List<BakedQuad>> quadCache;
@@ -152,6 +154,11 @@ public class AutoRotatingModel implements IBakedModel {
return this.quadCache.getUnchecked(key);
}
@Override
public void onResourceManagerReload(IResourceManager resourceManager) {
this.quadCache.invalidateAll();
}
public static class VertexRotator extends QuadGatheringTransformer {
private final FacingToRotation f2r;
private final EnumFacing face;
@@ -18,7 +18,6 @@
package appeng.client.render.model;
import appeng.block.storage.BlockDrive;
import appeng.block.storage.DriveSlotState;
import appeng.block.storage.DriveSlotsState;
@@ -39,7 +38,6 @@ import java.util.ArrayList;
import java.util.List;
import java.util.Map;
public class DriveBakedModel implements IBakedModel {
private final IBakedModel bakedBase;
private final Map<DriveSlotState, IBakedModel> bakedCells;
@@ -72,9 +70,10 @@ public class DriveBakedModel implements IBakedModel {
Matrix4f transform = new Matrix4f();
transform.setIdentity();
// Position this drive model copy at the correct slot. The transform is based on the
// Position this drive model copy at the correct slot. The transform is based on
// the
// cell-model being in slot 0,0 at the top left of the drive.
float xOffset = -col * 7 / 16.0f;
float xOffset = -col * 8 / 16.0f;
float yOffset = -row * 3 / 16.0f;
transform.setTranslation(new Vector3f(xOffset, yOffset, 0));
@@ -32,6 +32,7 @@ import net.minecraft.client.resources.IResourceManager;
import net.minecraft.util.EnumFacing;
import net.minecraft.util.JsonUtils;
import net.minecraft.util.ResourceLocation;
import net.minecraftforge.client.EnumHelperClient;
import net.minecraftforge.client.model.ICustomModelLoader;
import net.minecraftforge.client.model.IModel;
import net.minecraftforge.client.model.ModelLoader;
@@ -54,7 +55,6 @@ import java.lang.invoke.MethodHandle;
import java.lang.invoke.MethodHandles;
import java.lang.reflect.Constructor;
import java.lang.reflect.Field;
import java.lang.reflect.Modifier;
import java.lang.reflect.Type;
import java.util.Collection;
import java.util.HashMap;
@@ -74,11 +74,7 @@ public enum UVLModelLoader implements ICustomModelLoader {
static {
try {
Field modifiers = Field.class.getDeclaredField("modifiers");
modifiers.setAccessible(true);
faceBakery = ReflectionHelper.findField(ModelBakery.class, "faceBakery", "field_177607_l");
modifiers.set(faceBakery, faceBakery.getModifiers() & (~Modifier.FINAL));
Class clas = Class.forName(ModelLoader.class.getName() + "$VanillaModelWrapper");
vanillaModelWrapper = clas.getDeclaredConstructor(ModelLoader.class, ResourceLocation.class, ModelBlock.class, boolean.class,
@@ -118,7 +114,7 @@ public enum UVLModelLoader implements ICustomModelLoader {
private static void setFaceBakery(ModelBakery modelBakery, FaceBakery faceBakery) {
try {
UVLModelLoader.faceBakery.set(modelBakery, faceBakery);
EnumHelperClient.setFailsafeFieldValue(UVLModelLoader.faceBakery, modelBakery, faceBakery);
} catch (Exception e) {
throw Throwables.propagate(e);
}
@@ -22,6 +22,7 @@ package appeng.container;
import appeng.api.AEApi;
import appeng.api.config.Actionable;
import appeng.api.config.SecurityPermissions;
import appeng.api.definitions.IItemDefinition;
import appeng.api.implementations.guiobjects.IGuiItemObject;
import appeng.api.networking.IGrid;
import appeng.api.networking.IGridNode;
@@ -37,6 +38,7 @@ import appeng.api.storage.data.IAEItemStack;
import appeng.client.me.SlotME;
import appeng.container.guisync.GuiSync;
import appeng.container.guisync.SyncData;
import appeng.container.implementations.ContainerInterface;
import appeng.container.slot.AppEngSlot;
import appeng.container.slot.SlotCraftingMatrix;
import appeng.container.slot.SlotCraftingTerm;
@@ -45,6 +47,8 @@ import appeng.container.slot.SlotFake;
import appeng.container.slot.SlotInaccessible;
import appeng.container.slot.SlotPlayerHotBar;
import appeng.container.slot.SlotPlayerInv;
import appeng.container.slot.SlotRestrictedInput;
import appeng.container.slot.SlotRestrictedInput.PlacableItemType;
import appeng.core.AELog;
import appeng.core.sync.network.NetworkHandler;
import appeng.core.sync.packets.PacketInventoryAction;
@@ -84,7 +88,7 @@ public abstract class AEBaseContainer extends Container {
private final HashSet<Integer> locked = new HashSet<>();
private final TileEntity tileEntity;
private final IPart part;
private final IGuiItemObject obj;
protected final IGuiItemObject obj;
private final HashMap<Integer, SyncData> syncData = new HashMap<>();
private boolean isContainerValid = true;
private String customName;
@@ -318,10 +322,13 @@ public abstract class AEBaseContainer extends Container {
}
if (clickSlot != null && clickSlot.getHasStack()) {
ItemStack tis = clickSlot.getStack();
if (tis.isEmpty()) {
return ItemStack.EMPTY;
}
IItemDefinition expansionCard = AEApi.instance().definitions().materials().cardPatternExpansion();
ContainerInterface casted;
final List<Slot> selectedSlots = new ArrayList<>();
@@ -332,6 +339,10 @@ public abstract class AEBaseContainer extends Container {
tis = this.transferStackToContainer(tis);
if (!tis.isEmpty()) {
if (this instanceof ContainerInterface && expansionCard.isSameAs(tis) && (casted = (ContainerInterface) this).getPatternUpgrades() == casted.availableUpgrades() - 1) {
return ItemStack.EMPTY; // Don't insert more pattern expansions than maximum useful
}
// target slots in the container...
for (final Object inventorySlot : this.inventorySlots) {
final AppEngSlot cs = (AppEngSlot) inventorySlot;
@@ -394,6 +405,10 @@ public abstract class AEBaseContainer extends Container {
if (Platform.itemComparisons().isSameItem(tis, t)) // t.isItemEqual(tis))
{
if (d instanceof SlotRestrictedInput && ((SlotRestrictedInput) d).getPlaceableItemType() == PlacableItemType.ENCODED_PATTERN) {
return ItemStack.EMPTY; // don't insert duplicate encoded patterns to interfaces
}
int maxSize = t.getMaxStackSize();
if (maxSize > d.getSlotStackLimit()) {
maxSize = d.getSlotStackLimit();
@@ -455,6 +470,13 @@ public abstract class AEBaseContainer extends Container {
return ItemStack.EMPTY;
} else {
this.updateSlot(d);
if (
(d instanceof SlotRestrictedInput && ((SlotRestrictedInput) d).getPlaceableItemType() == PlacableItemType.ENCODED_PATTERN) ||
(this instanceof ContainerInterface && expansionCard.isSameAs(tis) && (casted = (ContainerInterface) this).getPatternUpgrades() == casted.availableUpgrades() - 1)
) {
break; // Only insert one pattern when shift-clicking into interfaces, and don't insert more pattern expansions than maximum useful
}
}
}
}
@@ -38,6 +38,7 @@ import appeng.api.storage.data.IItemList;
import appeng.client.gui.implementations.GuiCraftConfirm;
import appeng.container.AEBaseContainer;
import appeng.container.guisync.GuiSync;
import appeng.container.interfaces.IInventorySlotAware;
import appeng.core.AELog;
import appeng.core.sync.GuiBridge;
import appeng.core.sync.network.NetworkHandler;
@@ -304,9 +305,18 @@ public class ContainerCraftConfirm extends AEBaseContainer {
final ICraftingGrid cc = this.getGrid().getCache(ICraftingGrid.class);
final ICraftingLink g = cc.submitJob(this.result, null, this.getSelectedCpu() == -1 ? null : this.cpus.get(this.getSelectedCpu()).getCpu(), true, this.getActionSrc());
this.setAutoStart(false);
if (g != null && originalGui != null && this.getOpenContext() != null) {
if (g == null) {
this.setJob(cc.beginCraftingJob(this.getWorld(), this.getGrid(), this.getActionSrc(), this.result.getOutput(), null));
} else if (originalGui != null && this.getOpenContext() != null) {
final TileEntity te = this.getOpenContext().getTile();
Platform.openGUI(this.getInventoryPlayer().player, te, this.getOpenContext().getSide(), originalGui);
if (te != null) {
Platform.openGUI(this.getInventoryPlayer().player, te, this.getOpenContext().getSide(), originalGui);
} else {
if (ah instanceof IInventorySlotAware) {
IInventorySlotAware i = ((IInventorySlotAware) ah);
Platform.openGUI(this.getInventoryPlayer().player, i.getInventorySlot(), originalGui, i.isBaubleSlot());
}
}
}
}
}
@@ -21,43 +21,25 @@ package appeng.container.implementations;
import appeng.api.config.Actionable;
import appeng.api.config.PowerMultiplier;
import appeng.api.implementations.IUpgradeableCellContainer;
import appeng.api.networking.security.IActionHost;
import appeng.api.implementations.guiobjects.IPortableCell;
import appeng.container.interfaces.IInventorySlotAware;
import appeng.container.slot.SlotRestrictedInput;
import appeng.core.AEConfig;
import appeng.core.localization.PlayerMessages;
import appeng.helpers.WirelessTerminalGuiObject;
import appeng.parts.automation.StackUpgradeInventory;
import appeng.tile.inventory.AppEngInternalInventory;
import appeng.util.Platform;
import appeng.util.inv.IAEAppEngInventory;
import appeng.util.inv.InvOperation;
import baubles.api.BaublesApi;
import net.minecraft.entity.player.EntityPlayer;
import net.minecraft.entity.player.InventoryPlayer;
import net.minecraft.inventory.ClickType;
import net.minecraft.inventory.Slot;
import net.minecraft.item.ItemStack;
import net.minecraft.nbt.NBTTagCompound;
import net.minecraftforge.items.IItemHandler;
public class ContainerMEPortableCell extends ContainerMEMonitorable implements IUpgradeableCellContainer, IAEAppEngInventory, IInventorySlotAware {
public class ContainerMEPortableCell extends ContainerMEMonitorable implements IInventorySlotAware {
protected final WirelessTerminalGuiObject wirelessTerminalGUIObject;
protected final IPortableCell portableCell;
private final int slot;
private double powerMultiplier = 0.5;
private int ticks = 0;
protected AppEngInternalInventory upgrades;
protected SlotRestrictedInput magnetSlot;
public ContainerMEPortableCell(InventoryPlayer ip, WirelessTerminalGuiObject monitorable, boolean bindInventory) {
super(ip, monitorable, bindInventory);
if (monitorable != null) {
final int slotIndex = ((IInventorySlotAware) monitorable).getInventorySlot();
if (!((IInventorySlotAware) monitorable).isBaubleSlot()) {
public ContainerMEPortableCell(InventoryPlayer ip, IPortableCell guiObject) {
super(ip, guiObject, guiObject, true);
if (guiObject != null) {
final int slotIndex = ((IInventorySlotAware) guiObject).getInventorySlot();
if (!((IInventorySlotAware) guiObject).isBaubleSlot()) {
this.lockPlayerInventorySlot(slotIndex);
}
this.slot = slotIndex;
@@ -65,82 +47,28 @@ public class ContainerMEPortableCell extends ContainerMEMonitorable implements I
this.slot = -1;
this.lockPlayerInventorySlot(ip.currentItem);
}
this.wirelessTerminalGUIObject = monitorable;
this.upgrades = new StackUpgradeInventory(wirelessTerminalGUIObject.getItemStack(), this, 2);
this.loadFromNBT();
this.setupUpgrades();
this.portableCell = guiObject;
}
@Override
public void detectAndSendChanges() {
if (Platform.isServer()) {
final ItemStack currentItem = this.slot < 0 ? this.getPlayerInv().getCurrentItem() : this.getPlayerInv().getStackInSlot(this.slot);
final ItemStack currentItem;
if (wirelessTerminalGUIObject.isBaubleSlot()) {
currentItem = BaublesApi.getBaublesHandler(this.getPlayerInv().player).getStackInSlot(this.slot);
} else {
currentItem = this.slot < 0 ? this.getPlayerInv().getCurrentItem() : this.getPlayerInv().getStackInSlot(this.slot);
}
if (currentItem.isEmpty()) {
if (this.portableCell == null || currentItem.isEmpty()) {
this.setValidContainer(false);
} else if (!this.portableCell.getItemStack().isEmpty() && currentItem != this.portableCell.getItemStack()) {
if (!ItemStack.areItemsEqual(this.portableCell.getItemStack(), currentItem)) {
this.setValidContainer(false);
} else if (!this.wirelessTerminalGUIObject.getItemStack().isEmpty() && currentItem != this.wirelessTerminalGUIObject.getItemStack()) {
if (ItemStack.areItemsEqual(this.wirelessTerminalGUIObject.getItemStack(), currentItem)) {
this.getPlayerInv().setInventorySlotContents(this.getPlayerInv().currentItem, this.wirelessTerminalGUIObject.getItemStack());
} else {
this.setValidContainer(false);
}
}
// drain 1 ae t
this.ticks++;
if (this.ticks > 10) {
this.wirelessTerminalGUIObject.extractAEPower(this.getPowerMultiplier() * this.ticks, Actionable.MODULATE, PowerMultiplier.CONFIG);
this.ticks = 0;
}
if (!this.wirelessTerminalGUIObject.rangeCheck()) {
if (Platform.isServer() && this.isValidContainer()) {
this.getPlayerInv().player.sendMessage(PlayerMessages.OutOfRange.get());
}
this.setValidContainer(false);
} else {
this.setPowerMultiplier(AEConfig.instance().wireless_getDrainRate(this.wirelessTerminalGUIObject.getRange()));
}
super.detectAndSendChanges();
}
}
@Override
public ItemStack slotClick(int slotId, int dragType, ClickType clickTypeIn, EntityPlayer player) {
if (clickTypeIn == ClickType.PICKUP && dragType == 1) {
if (this.inventorySlots.get(slotId) == magnetSlot) {
ItemStack itemStack = magnetSlot.getStack();
if (!magnetSlot.getStack().isEmpty()) {
NBTTagCompound tag = itemStack.getTagCompound();
if (tag == null) {
tag = new NBTTagCompound();
}
if (tag.hasKey("enabled")) {
boolean e = tag.getBoolean("enabled");
tag.setBoolean("enabled", !e);
} else {
tag.setBoolean("enabled", false);
}
magnetSlot.getStack().setTagCompound(tag);
magnetSlot.onSlotChanged();
return ItemStack.EMPTY;
}
}
}
return super.slotClick(slotId, dragType, clickTypeIn, player);
}
@Override
protected IActionHost getActionHost() {
return this.wirelessTerminalGUIObject;
// drain 1 ae t
this.ticks++;
if (this.ticks > 10) {
this.portableCell.extractAEPower(this.getPowerMultiplier() * this.ticks, Actionable.MODULATE, PowerMultiplier.CONFIG);
this.ticks = 0;
}
super.detectAndSendChanges();
}
private double getPowerMultiplier() {
@@ -151,56 +79,8 @@ public class ContainerMEPortableCell extends ContainerMEMonitorable implements I
this.powerMultiplier = powerMultiplier;
}
@Override
public int availableUpgrades() {
return 1;
}
@Override
public void setupUpgrades() {
if (wirelessTerminalGUIObject != null) {
for (int upgradeSlot = 0; upgradeSlot < availableUpgrades(); upgradeSlot++) {
this.magnetSlot = new SlotRestrictedInput(SlotRestrictedInput.PlacableItemType.UPGRADES, upgrades, upgradeSlot, 206, 135 + upgradeSlot * 18, this.getInventoryPlayer());
this.magnetSlot.setNotDraggable();
this.addSlotToContainer(magnetSlot);
}
}
}
@Override
public void onSlotChange(Slot s) {
super.detectAndSendChanges();
}
@Override
public void saveChanges() {
if (Platform.isServer()) {
NBTTagCompound tag = new NBTTagCompound();
this.upgrades.writeToNBT(tag, "upgrades");
this.wirelessTerminalGUIObject.saveChanges(tag);
}
}
protected void loadFromNBT() {
NBTTagCompound data = wirelessTerminalGUIObject.getItemStack().getTagCompound();
if (data != null) {
upgrades.readFromNBT(wirelessTerminalGUIObject.getItemStack().getTagCompound().getCompoundTag("upgrades"));
}
}
@Override
public void onChangeInventory(IItemHandler inv, int slot, InvOperation mc, ItemStack removedStack, ItemStack newStack) {
}
@Override
public int getInventorySlot() {
return wirelessTerminalGUIObject.getInventorySlot();
return this.slot;
}
@Override
public boolean isBaubleSlot() {
return wirelessTerminalGUIObject.isBaubleSlot();
}
}
}
@@ -0,0 +1,232 @@
/*
* This file is part of Applied Energistics 2.
* Copyright (c) 2013 - 2015, AlgorithmX2, All rights reserved.
*
* Applied Energistics 2 is free software: you can redistribute it and/or modify
* it under the terms of the GNU Lesser General Public License as published by
* the Free Software Foundation, either version 3 of the License, or
* (at your option) any later version.
*
* Applied Energistics 2 is distributed in the hope that it will be useful,
* but WITHOUT ANY WARRANTY; without even the implied warranty of
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
* GNU Lesser General Public License for more details.
*
* You should have received a copy of the GNU Lesser General Public License
* along with Applied Energistics 2. If not, see <http://www.gnu.org/licenses/lgpl>.
*/
package appeng.container.implementations;
import appeng.api.config.Actionable;
import appeng.api.config.PowerMultiplier;
import appeng.api.implementations.IUpgradeableCellContainer;
import appeng.api.implementations.guiobjects.IPortableCell;
import appeng.api.networking.security.IActionHost;
import appeng.container.interfaces.IInventorySlotAware;
import appeng.container.slot.SlotRestrictedInput;
import appeng.core.AEConfig;
import appeng.core.localization.PlayerMessages;
import appeng.helpers.WirelessTerminalGuiObject;
import appeng.parts.automation.StackUpgradeInventory;
import appeng.tile.inventory.AppEngInternalInventory;
import appeng.util.Platform;
import appeng.util.inv.IAEAppEngInventory;
import appeng.util.inv.InvOperation;
import baubles.api.BaublesApi;
import net.minecraft.entity.player.EntityPlayer;
import net.minecraft.entity.player.InventoryPlayer;
import net.minecraft.inventory.ClickType;
import net.minecraft.item.ItemStack;
import net.minecraft.nbt.NBTTagCompound;
import net.minecraftforge.items.IItemHandler;
public class ContainerMEPortableTerminal extends ContainerMEMonitorable implements IUpgradeableCellContainer, IAEAppEngInventory, IInventorySlotAware {
protected final WirelessTerminalGuiObject wirelessTerminalGUIObject;
private final int slot;
private double powerMultiplier = 0.5;
private int ticks = 0;
protected AppEngInternalInventory upgrades;
protected SlotRestrictedInput magnetSlot;
public ContainerMEPortableTerminal(InventoryPlayer ip, WirelessTerminalGuiObject guiObject, boolean bindInventory) {
super(ip, guiObject, guiObject, bindInventory);
if (guiObject != null) {
final int slotIndex = ((IInventorySlotAware) guiObject).getInventorySlot();
if (!((IInventorySlotAware) guiObject).isBaubleSlot()) {
this.lockPlayerInventorySlot(slotIndex);
}
this.slot = slotIndex;
} else {
this.slot = -1;
this.lockPlayerInventorySlot(ip.currentItem);
}
this.wirelessTerminalGUIObject = guiObject;
this.upgrades = new StackUpgradeInventory(wirelessTerminalGUIObject.getItemStack(), this, 2);
this.loadFromNBT();
this.setupUpgrades();
}
public ContainerMEPortableTerminal(InventoryPlayer ip, IPortableCell guiObject) {
super(ip, guiObject, guiObject, true);
if (guiObject != null) {
final int slotIndex = ((IInventorySlotAware) guiObject).getInventorySlot();
if (!((IInventorySlotAware) guiObject).isBaubleSlot()) {
this.lockPlayerInventorySlot(slotIndex);
}
this.slot = slotIndex;
} else {
this.slot = -1;
this.lockPlayerInventorySlot(ip.currentItem);
}
this.wirelessTerminalGUIObject = (WirelessTerminalGuiObject) guiObject;
this.upgrades = new StackUpgradeInventory(wirelessTerminalGUIObject.getItemStack(), this, 2);
this.loadFromNBT();
this.setupUpgrades();
}
@Override
public void detectAndSendChanges() {
if (Platform.isServer()) {
final ItemStack currentItem;
if (wirelessTerminalGUIObject.isBaubleSlot()) {
currentItem = BaublesApi.getBaublesHandler(this.getPlayerInv().player).getStackInSlot(this.slot);
} else {
currentItem = this.slot < 0 ? this.getPlayerInv().getCurrentItem() : this.getPlayerInv().getStackInSlot(this.slot);
}
if (currentItem.isEmpty()) {
this.setValidContainer(false);
} else if (!this.wirelessTerminalGUIObject.getItemStack().isEmpty() && currentItem != this.wirelessTerminalGUIObject.getItemStack()) {
if (ItemStack.areItemsEqual(this.wirelessTerminalGUIObject.getItemStack(), currentItem)) {
if (wirelessTerminalGUIObject.isBaubleSlot()) {
BaublesApi.getBaublesHandler(this.getPlayerInv().player).setStackInSlot(this.slot, this.wirelessTerminalGUIObject.getItemStack());
} else {
this.getPlayerInv().setInventorySlotContents(this.getPlayerInv().currentItem, this.wirelessTerminalGUIObject.getItemStack());
}
} else {
this.setValidContainer(false);
}
}
// drain 1 ae t
this.ticks++;
if (this.ticks > 10) {
double ext = this.wirelessTerminalGUIObject.extractAEPower(this.getPowerMultiplier() * this.ticks, Actionable.MODULATE, PowerMultiplier.CONFIG);
if (ext < this.getPowerMultiplier() * this.ticks) {
if (Platform.isServer() && this.isValidContainer()) {
this.getPlayerInv().player.sendMessage(PlayerMessages.DeviceNotPowered.get());
}
this.setValidContainer(false);
}
this.ticks = 0;
}
if (!this.wirelessTerminalGUIObject.rangeCheck()) {
if (Platform.isServer() && this.isValidContainer()) {
this.getPlayerInv().player.sendMessage(PlayerMessages.OutOfRange.get());
}
this.setValidContainer(false);
} else {
this.setPowerMultiplier(AEConfig.instance().wireless_getDrainRate(this.wirelessTerminalGUIObject.getRange()));
}
super.detectAndSendChanges();
}
}
@Override
public ItemStack slotClick(int slotId, int dragType, ClickType clickTypeIn, EntityPlayer player) {
if (slotId >= 0 && slotId < this.inventorySlots.size()) {
if (clickTypeIn == ClickType.PICKUP && dragType == 1) {
if (this.inventorySlots.get(slotId) == magnetSlot) {
ItemStack itemStack = magnetSlot.getStack();
if (!magnetSlot.getStack().isEmpty()) {
NBTTagCompound tag = itemStack.getTagCompound();
if (tag == null) {
tag = new NBTTagCompound();
}
if (tag.hasKey("enabled")) {
boolean e = tag.getBoolean("enabled");
tag.setBoolean("enabled", !e);
} else {
tag.setBoolean("enabled", false);
}
magnetSlot.getStack().setTagCompound(tag);
magnetSlot.onSlotChanged();
return ItemStack.EMPTY;
}
}
}
}
return super.slotClick(slotId, dragType, clickTypeIn, player);
}
@Override
protected IActionHost getActionHost() {
return this.wirelessTerminalGUIObject;
}
private double getPowerMultiplier() {
return this.powerMultiplier;
}
void setPowerMultiplier(final double powerMultiplier) {
this.powerMultiplier = powerMultiplier;
}
@Override
public int availableUpgrades() {
return 1;
}
@Override
public void setupUpgrades() {
if (wirelessTerminalGUIObject != null) {
for (int upgradeSlot = 0; upgradeSlot < availableUpgrades(); upgradeSlot++) {
this.magnetSlot = new SlotRestrictedInput(SlotRestrictedInput.PlacableItemType.UPGRADES, upgrades, upgradeSlot, 206, 135 + upgradeSlot * 18, this.getInventoryPlayer());
this.magnetSlot.setNotDraggable();
this.addSlotToContainer(magnetSlot);
}
}
}
@Override
public void saveChanges() {
if (Platform.isServer()) {
NBTTagCompound tag = new NBTTagCompound();
this.upgrades.writeToNBT(tag, "upgrades");
this.wirelessTerminalGUIObject.saveChanges(tag);
}
}
protected void loadFromNBT() {
NBTTagCompound data = wirelessTerminalGUIObject.getItemStack().getTagCompound();
if (data != null) {
upgrades.readFromNBT(wirelessTerminalGUIObject.getItemStack().getTagCompound().getCompoundTag("upgrades"));
}
}
@Override
public void onChangeInventory(IItemHandler inv, int slot, InvOperation mc, ItemStack removedStack, ItemStack newStack) {
}
@Override
public int getInventorySlot() {
return wirelessTerminalGUIObject.getInventorySlot();
}
@Override
public boolean isBaubleSlot() {
return wirelessTerminalGUIObject.isBaubleSlot();
}
}
@@ -39,7 +39,7 @@ import net.minecraftforge.items.IItemHandler;
import net.minecraftforge.items.wrapper.PlayerInvWrapper;
public class ContainerWirelessCraftingTerminal extends ContainerMEPortableCell implements IContainerCraftingPacket {
public class ContainerWirelessCraftingTerminal extends ContainerMEPortableTerminal implements IContainerCraftingPacket {
private final AppEngInternalInventory output = new AppEngInternalInventory(this, 1);
private final SlotCraftingMatrix[] craftingSlots = new SlotCraftingMatrix[9];
@@ -86,6 +86,8 @@ public class ContainerWirelessCraftingTerminal extends ContainerMEPortableCell i
this.outputSlot.putStack(craftingResult);
}
this.saveChanges();
}
@Override
@@ -135,7 +135,11 @@ public class ContainerWirelessPatternTerminal extends ContainerPatternEncoder im
this.setValidContainer(false);
} else if (!this.wirelessTerminalGUIObject.getItemStack().isEmpty() && currentItem != this.wirelessTerminalGUIObject.getItemStack()) {
if (ItemStack.areItemsEqual(this.wirelessTerminalGUIObject.getItemStack(), currentItem)) {
this.getPlayerInv().setInventorySlotContents(this.getPlayerInv().currentItem, this.wirelessTerminalGUIObject.getItemStack());
if (wirelessTerminalGUIObject.isBaubleSlot()) {
BaublesApi.getBaublesHandler(this.getPlayerInv().player).setStackInSlot(this.slot, this.wirelessTerminalGUIObject.getItemStack());
} else {
this.getPlayerInv().setInventorySlotContents(this.getPlayerInv().currentItem, this.wirelessTerminalGUIObject.getItemStack());
}
} else {
this.setValidContainer(false);
}
@@ -144,7 +148,14 @@ public class ContainerWirelessPatternTerminal extends ContainerPatternEncoder im
// drain 1 ae t
this.ticks++;
if (this.ticks > 10) {
this.wirelessTerminalGUIObject.extractAEPower(this.getPowerMultiplier() * this.ticks, Actionable.MODULATE, PowerMultiplier.CONFIG);
double ext = this.wirelessTerminalGUIObject.extractAEPower(this.getPowerMultiplier() * this.ticks, Actionable.MODULATE, PowerMultiplier.CONFIG);
if (ext < this.getPowerMultiplier() * this.ticks) {
if (Platform.isServer() && this.isValidContainer()) {
this.getPlayerInv().player.sendMessage(PlayerMessages.DeviceNotPowered.get());
}
this.setValidContainer(false);
}
this.ticks = 0;
}
@@ -164,23 +175,25 @@ public class ContainerWirelessPatternTerminal extends ContainerPatternEncoder im
@Override
public ItemStack slotClick(int slotId, int dragType, ClickType clickTypeIn, EntityPlayer player) {
if (clickTypeIn == ClickType.PICKUP && dragType == 1) {
if (this.inventorySlots.get(slotId) == magnetSlot) {
ItemStack itemStack = magnetSlot.getStack();
if (!magnetSlot.getStack().isEmpty()) {
NBTTagCompound tag = itemStack.getTagCompound();
if (tag == null) {
tag = new NBTTagCompound();
if (slotId >= 0 && slotId < this.inventorySlots.size()) {
if (clickTypeIn == ClickType.PICKUP && dragType == 1) {
if (this.inventorySlots.get(slotId) == magnetSlot) {
ItemStack itemStack = magnetSlot.getStack();
if (!magnetSlot.getStack().isEmpty()) {
NBTTagCompound tag = itemStack.getTagCompound();
if (tag == null) {
tag = new NBTTagCompound();
}
if (tag.hasKey("enabled")) {
boolean e = tag.getBoolean("enabled");
tag.setBoolean("enabled", !e);
} else {
tag.setBoolean("enabled", false);
}
magnetSlot.getStack().setTagCompound(tag);
magnetSlot.onSlotChanged();
return ItemStack.EMPTY;
}
if (tag.hasKey("enabled")) {
boolean e = tag.getBoolean("enabled");
tag.setBoolean("enabled", !e);
} else {
tag.setBoolean("enabled", false);
}
magnetSlot.getStack().setTagCompound(tag);
magnetSlot.onSlotChanged();
return ItemStack.EMPTY;
}
}
}
@@ -255,8 +268,13 @@ public class ContainerWirelessPatternTerminal extends ContainerPatternEncoder im
ItemHandlerUtil.setStackInSlot(this.crafting, x, item == null ? ItemStack.EMPTY : item.createItemStack());
}
for (int x = 0; x < this.output.getSlots() && x < details.getOutputs().length; x++) {
final IAEItemStack item = details.getOutputs()[x];
for (int x = 0; x < this.output.getSlots(); x++) {
final IAEItemStack item;
if (x < details.getOutputs().length) {
item = details.getOutputs()[x];
} else {
item = null;
}
this.output.setStackInSlot(x, item == null ? ItemStack.EMPTY : item.createItemStack());
}
}
@@ -269,6 +287,8 @@ public class ContainerWirelessPatternTerminal extends ContainerPatternEncoder im
public IItemHandler getInventoryByName(String name) {
if (name.equals("crafting")) {
return this.crafting;
} else if (name.equals("output")) {
return this.output;
}
return super.getInventoryByName(name);
}
@@ -23,7 +23,7 @@ import appeng.helpers.WirelessTerminalGuiObject;
import net.minecraft.entity.player.InventoryPlayer;
public class ContainerWirelessTerm extends ContainerMEPortableCell {
public class ContainerWirelessTerm extends ContainerMEPortableTerminal {
public ContainerWirelessTerm(final InventoryPlayer ip, final WirelessTerminalGuiObject gui) {
super(ip, gui, true);
@@ -65,6 +65,10 @@ public class SlotRestrictedInput extends AppEngSlot {
this.p = p;
}
public PlacableItemType getPlaceableItemType() {
return which;
}
@Override
public int getSlotStackLimit() {
if (this.stackLimit != -1) {
+6
View File
@@ -82,6 +82,7 @@ public final class AEConfig extends Configuration implements IConfigurableObject
private boolean disableColoredCableRecipesInJEI = true;
private int craftingCalculationTimePerTick = 5;
private PowerUnits selectedPowerUnit = PowerUnits.AE;
private boolean showCraftableTooltip = true;
// Spatial IO/Dimension
private int storageProviderID = -1;
private int storageDimensionID = -1;
@@ -248,6 +249,7 @@ public final class AEConfig extends Configuration implements IConfigurableObject
this.enableEffects = this.get("Client", "enableEffects", true).getBoolean(true);
this.useLargeFonts = this.get("Client", "useTerminalUseLargeFont", false).getBoolean(false);
this.useColoredCraftingStatus = this.get("Client", "useColoredCraftingStatus", true).getBoolean(true);
this.showCraftableTooltip = this.get("Client", "showCraftableTooltip", true, "Whether to add \"Craftable\" to item tooltips when they can be crafted automatically.").getBoolean(true);
// load buttons..
for (int btnNum = 0; btnNum < 4; btnNum++) {
@@ -501,6 +503,10 @@ public final class AEConfig extends Configuration implements IConfigurableObject
return this.useColoredCraftingStatus;
}
public boolean isShowCraftableTooltip() {
return this.showCraftableTooltip;
}
public boolean isDisableColoredCableRecipesInJEI() {
return this.disableColoredCableRecipesInJEI;
}
+3 -5
View File
@@ -409,6 +409,8 @@ final class Registration {
// Inscriber
Upgrades.SPEED.registerItem(blocks.inscriber(), 3);
Upgrades.QUANTUM_LINK.registerItem(blocks.quantumLink(), 1);
// Wireless Terminal Handler
ArrayList<IItemDefinition> iids = new ArrayList<>();
iids.add(items.wirelessTerminal());
@@ -418,14 +420,10 @@ final class Registration {
for (IItemDefinition id : iids) {
id.maybeItem().ifPresent(terminal -> {
registries.wireless().registerWirelessHandler((IWirelessTermHandler) terminal);
Upgrades.QUANTUM_LINK.registerItem(id, 1);
Upgrades.MAGNET.registerItem(id, 1);
});
}
items.wirelessFluidTerminal().maybeItem().ifPresent(terminal -> {
registries.wireless().registerWirelessHandler((IWirelessTermHandler) terminal);
Upgrades.QUANTUM_LINK.registerItem(items.wirelessFluidTerminal(), 1);
});
items.wirelessFluidTerminal().maybeItem().ifPresent(terminal -> registries.wireless().registerWirelessHandler((IWirelessTermHandler) terminal));
// Charge Rates
items.chargedStaff().maybeItem().ifPresent(chargedStaff -> registries.charger().addChargeRate(chargedStaff, 320d));
+2 -2
View File
@@ -41,8 +41,8 @@ import net.minecraft.util.math.BlockPos;
import net.minecraft.world.World;
import org.objectweb.asm.ClassReader;
import org.objectweb.asm.ClassWriter;
import org.objectweb.asm.commons.ClassRemapper;
import org.objectweb.asm.commons.Remapper;
import org.objectweb.asm.commons.RemappingClassAdapter;
import org.objectweb.asm.tree.AbstractInsnNode;
import org.objectweb.asm.tree.ClassNode;
import org.objectweb.asm.tree.MethodInsnNode;
@@ -150,7 +150,7 @@ public class ApiPart implements IPartHelper {
final DefaultPackageClassNameRemapper remapper = new DefaultPackageClassNameRemapper();
remapper.inputOutput.put("appeng/api/parts/LayerBase", n.superName);
remapper.inputOutput.put(originalName, n.name);
n.accept(new RemappingClassAdapter(cw, remapper));
n.accept(new ClassRemapper(cw, remapper));
// n.accept( cw );
// n.accept( new TraceClassVisitor( new PrintWriter( System.out ) ) );
@@ -521,6 +521,10 @@ public final class ApiBlocks implements IBlocks {
.disableItem()
.build();
if (!doubleSlabDef.maybeBlock().isPresent()) {
return new BlockDefinition(slabId, null, null);
}
Verify.verify(doubleSlabDef.maybeBlock().isPresent());
BlockSlab doubleSlabBlock = (BlockSlab) doubleSlabDef.maybeBlock().get();
@@ -530,6 +534,10 @@ public final class ApiBlocks implements IBlocks {
.features(AEFeature.DECORATIVE_BLOCKS)
.build();
if (!itemDef.maybeItem().isPresent()) {
return new BlockDefinition(slabId, null, null);
}
Verify.verify(itemDef.maybeItem().isPresent());
// Return a new composite block definition that combines the single slab block with the slab item
@@ -74,6 +74,7 @@ public enum AEFeature {
SECURITY("Security", Constants.CATEGORY_NETWORK_FEATURES),
SPATIAL_IO("SpatialIO", Constants.CATEGORY_NETWORK_FEATURES),
QUANTUM_NETWORK_BRIDGE("QuantumNetworkBridge", Constants.CATEGORY_NETWORK_FEATURES),
QUANTUM_LINKING_CARD("QuantumLinkingCard", Constants.CATEGORY_NETWORK_FEATURES),
CHANNELS("Channels", Constants.CATEGORY_NETWORK_FEATURES),
INTERFACE("Interface", Constants.CATEGORY_NETWORK_BUSES),
@@ -161,6 +161,7 @@ public enum ButtonToolTips {
// Used in the tooltips of the items in the terminal, when moused over
ItemsStored,
ItemsRequestable,
ItemsCraftable,
SchedulingMode,
SchedulingModeDefault,
@@ -232,9 +232,12 @@ public enum GuiBridge implements IGuiHandler {
public Object getServerGuiElement(final int ordinal, final EntityPlayer player, final World w, final int x, final int y, final int z) {
final AEPartLocation side = AEPartLocation.fromOrdinal(ordinal & 0x07);
final GuiBridge ID = values()[ordinal >> 4];
final boolean usingItemOnTile = ((ordinal >> 3) & 1) == 1;
if (ID.type.isItem()) {
ItemStack it = ItemStack.EMPTY;
if (y == 0) {
if (usingItemOnTile) {
it = player.inventory.getCurrentItem();
} else if (y == 0) {
if (x >= 0 && x < player.inventory.mainInventory.size()) {
it = player.inventory.getStackInSlot(x);
}
@@ -344,9 +347,13 @@ public enum GuiBridge implements IGuiHandler {
public Object getClientGuiElement(final int ordinal, final EntityPlayer player, final World w, final int x, final int y, final int z) {
final AEPartLocation side = AEPartLocation.fromOrdinal(ordinal & 0x07);
final GuiBridge ID = values()[ordinal >> 4];
final boolean usingItemOnTile = ((ordinal >> 3) & 1) == 1;
if (ID.type.isItem()) {
ItemStack it = ItemStack.EMPTY;
if (y == 0) {
if (usingItemOnTile) {
it = player.inventory.getCurrentItem();
} else if (y == 0) {
if (x >= 0 && x < player.inventory.mainInventory.size()) {
it = player.inventory.getStackInSlot(x);
}
@@ -27,6 +27,7 @@ import appeng.api.networking.security.IActionHost;
import appeng.container.ContainerOpenContext;
import appeng.container.implementations.ContainerCraftAmount;
import appeng.container.implementations.ContainerCraftConfirm;
import appeng.container.interfaces.IInventorySlotAware;
import appeng.core.AELog;
import appeng.core.sync.AppEngPacket;
import appeng.core.sync.GuiBridge;
@@ -91,7 +92,14 @@ public class PacketCraftRequest extends AppEngPacket {
final ContainerOpenContext context = cca.getOpenContext();
if (context != null) {
final TileEntity te = context.getTile();
Platform.openGUI(player, te, cca.getOpenContext().getSide(), GuiBridge.GUI_CRAFTING_CONFIRM);
if (te != null) {
Platform.openGUI(player, te, cca.getOpenContext().getSide(), GuiBridge.GUI_CRAFTING_CONFIRM);
} else {
if (ah instanceof IInventorySlotAware) {
IInventorySlotAware i = ((IInventorySlotAware) ah);
Platform.openGUI(player, i.getInventorySlot(), GuiBridge.GUI_CRAFTING_CONFIRM, i.isBaubleSlot());
}
}
if (player.openContainer instanceof ContainerCraftConfirm) {
final ContainerCraftConfirm ccc = (ContainerCraftConfirm) player.openContainer;
@@ -19,8 +19,10 @@
package appeng.core.sync.packets;
import appeng.api.networking.security.IActionHost;
import appeng.container.AEBaseContainer;
import appeng.container.ContainerOpenContext;
import appeng.container.interfaces.IInventorySlotAware;
import appeng.core.sync.AppEngPacket;
import appeng.core.sync.GuiBridge;
import appeng.core.sync.network.INetworkInfo;
@@ -60,8 +62,21 @@ public class PacketSwitchGuis extends AppEngPacket {
final AEBaseContainer bc = (AEBaseContainer) c;
final ContainerOpenContext context = bc.getOpenContext();
if (context != null) {
final TileEntity te = context.getTile();
Platform.openGUI(player, te, context.getSide(), this.newGui);
final Object target = bc.getTarget();
if (target instanceof IActionHost) {
final IActionHost ah = (IActionHost) target;
final TileEntity te = context.getTile();
if (te != null) {
Platform.openGUI(player, te, bc.getOpenContext().getSide(), this.newGui);
} else {
if (ah instanceof IInventorySlotAware) {
IInventorySlotAware i = ((IInventorySlotAware) ah);
Platform.openGUI(player, i.getInventorySlot(), this.newGui, i.isBaubleSlot());
}
}
}
}
}
}
@@ -1,6 +1,9 @@
package appeng.core.sync.packets;
import appeng.api.util.AEPartLocation;
import appeng.api.AEApi;
import appeng.api.features.ILocatable;
import appeng.api.features.IWirelessTermHandler;
import appeng.core.localization.PlayerMessages;
import appeng.core.sync.AppEngPacket;
import appeng.core.sync.network.INetworkInfo;
import appeng.items.tools.powered.Terminal;
@@ -11,6 +14,8 @@ import io.netty.buffer.Unpooled;
import net.minecraft.entity.player.EntityPlayer;
import net.minecraft.item.ItemStack;
import net.minecraft.util.NonNullList;
import net.minecraftforge.fml.common.Loader;
import net.minecraftforge.fml.common.Optional;
public class PacketTerminalUse extends AppEngPacket {
Terminal terminal;
@@ -35,16 +40,50 @@ public class PacketTerminalUse extends AppEngPacket {
for (int i = 0; i < mainInventory.size(); i++) {
ItemStack is = mainInventory.get(i);
if (terminal.getItemDefinition().isSameAs(is)) {
Platform.openGUI(player, i, terminal.getBridge(), false);
openGui(is, i, player, false);
return;
}
}
if (Loader.isModLoaded("baubles")) {
tryOpenBauble(player);
}
}
@Optional.Method(modid = "baubles")
void tryOpenBauble(EntityPlayer player) {
for (int i = 0; i < BaublesApi.getBaublesHandler(player).getSlots(); i++) {
ItemStack is = BaublesApi.getBaublesHandler(player).getStackInSlot(i);
if (terminal.getItemDefinition().isSameAs(is)) {
Platform.openGUI(player, i, terminal.getBridge(), true);
openGui(is, i, player, true);
break;
}
}
}
void openGui(ItemStack itemStack, int slotIdx, EntityPlayer player, boolean isBauble) {
final IWirelessTermHandler handler = AEApi.instance().registries().wireless().getWirelessTerminalHandler(itemStack);
if (handler == null) {
return;
}
final String unparsedKey = handler.getEncryptionKey(itemStack);
if (unparsedKey.isEmpty()) {
player.sendMessage(PlayerMessages.DeviceNotLinked.get());
return;
}
final long parsedKey = Long.parseLong(unparsedKey);
final ILocatable securityStation = AEApi.instance().registries().locatable().getLocatableBy(parsedKey);
if (securityStation == null) {
player.sendMessage(PlayerMessages.StationCanNotBeLocated.get());
return;
}
if (handler.hasPower(player, 0.5, itemStack)) {
Platform.openGUI(player, slotIdx, terminal.getBridge(), isBauble);
} else {
player.sendMessage(PlayerMessages.DeviceNotPowered.get());
}
}
}
@@ -19,32 +19,53 @@
package appeng.core.transformer;
import appeng.core.AE2ELCore;
import com.google.common.collect.Lists;
import com.google.common.collect.Sets;
import com.google.common.io.ByteStreams;
import net.minecraft.launchwrapper.IClassTransformer;
import net.minecraftforge.fml.common.Loader;
import org.objectweb.asm.ClassReader;
import org.objectweb.asm.ClassWriter;
import org.objectweb.asm.tree.ClassNode;
import org.objectweb.asm.Opcodes;
import org.objectweb.asm.commons.ClassRemapper;
import org.objectweb.asm.commons.Remapper;
import org.objectweb.asm.tree.*;
import java.io.IOException;
import java.io.InputStream;
import java.util.List;
import java.util.ListIterator;
import java.util.Set;
import java.util.function.Consumer;
public class AE2ELTransformer implements IClassTransformer {
@Override
public byte[] transform(String name, String transformedName, byte[] basicClass) {
if (Loader.instance().getIndexedModList().get("stackup") != null) {
return basicClass;
}
transformedName = transformedName.replace('/', '.');
byte[] data = basicClass;
Consumer<ClassNode> consumer = (n) -> {
};
Consumer<ClassNode> emptyConsumer = consumer;
if ("net.minecraft.item.ItemStack".equals(transformedName)) {
consumer = consumer.andThen(ItemStackPatch::patchCountGetSet);
} else if ("net.minecraft.network.PacketBuffer".equals(transformedName)) {
consumer = consumer.andThen((node) -> {
spliceClasses(node, "appeng.core.transformer.PacketBufferPatch",
"readItemStack", "func_150791_c",
"writeItemStack", "func_150788_a");
});
}
if (consumer != emptyConsumer) {
return processNode(basicClass, consumer);
} else {
return data;
return basicClass;
}
}
@@ -58,4 +79,106 @@ public class AE2ELTransformer implements IClassTransformer {
return writer.toByteArray();
}
public static void spliceClasses(final ClassNode data, final String className, final String... methods) {
try (InputStream stream = AE2ELCore.class.getClassLoader().getResourceAsStream(className.replace('.', '/') + ".class")) {
spliceClasses(data, ByteStreams.toByteArray(stream), className, methods);
} catch (IOException e) {
throw new RuntimeException(e);
}
}
public static void spliceClasses(final ClassNode nodeData, final byte[] dataSplice, final String className, final String... methods) {
// System.out.println("Splicing from " + className + " to " + targetClassName)
if (dataSplice == null) {
throw new RuntimeException("Class " + className + " not found! This is a AE2EL bug!");
}
final Set<String> methodSet = Sets.newHashSet(methods);
final List<String> methodList = Lists.newArrayList(methods);
final ClassReader readerSplice = new ClassReader(dataSplice);
final String className2 = className.replace('.', '/');
final String targetClassName2 = nodeData.name;
final String targetClassName = targetClassName2.replace('/', '.');
final Remapper remapper = new Remapper() {
public String map(final String name) {
return className2.equals(name) ? targetClassName2 : name;
}
};
ClassNode nodeSplice = new ClassNode();
readerSplice.accept(new ClassRemapper(nodeSplice, remapper), ClassReader.EXPAND_FRAMES);
for (String s : nodeSplice.interfaces) {
if (methodSet.contains(s)) {
nodeData.interfaces.add(s);
System.out.println("Added INTERFACE: " + s);
}
}
for (int i = 0; i < nodeSplice.methods.size(); i++) {
if (methodSet.contains(nodeSplice.methods.get(i).name)) {
MethodNode mn = nodeSplice.methods.get(i);
boolean added = false;
for (int j = 0; j < nodeData.methods.size(); j++) {
if (nodeData.methods.get(j).name.equals(mn.name)
&& nodeData.methods.get(j).desc.equals(mn.desc)) {
MethodNode oldMn = nodeData.methods.get(j);
System.out.println("Spliced in METHOD: " + targetClassName + "." + mn.name);
nodeData.methods.set(j, mn);
if (nodeData.name.equals(nodeSplice.superName)) {
ListIterator<AbstractInsnNode> nodeListIterator = mn.instructions.iterator();
while (nodeListIterator.hasNext()) {
AbstractInsnNode node = nodeListIterator.next();
if (node instanceof MethodInsnNode
&& node.getOpcode() == Opcodes.INVOKESPECIAL) {
MethodInsnNode methodNode = (MethodInsnNode) node;
if (targetClassName2.equals(methodNode.owner)) {
methodNode.owner = nodeData.superName;
}
}
}
}
oldMn.name = methodList.get((methodList.indexOf(oldMn.name)) & (~1)) + "_ae2el_old";
nodeData.methods.add(oldMn);
added = true;
break;
}
}
if (!added) {
System.out.println("Added METHOD: " + targetClassName + "." + mn.name);
nodeData.methods.add(mn);
added = true;
}
}
}
for (int i = 0; i < nodeSplice.fields.size(); i++) {
if (methodSet.contains(nodeSplice.fields.get(i).name)) {
FieldNode mn = nodeSplice.fields.get(i);
boolean added = false;
for (int j = 0; j < nodeData.fields.size(); j++) {
if (nodeData.fields.get(j).name.equals(mn.name)
&& nodeData.fields.get(j).desc.equals(mn.desc)) {
System.out.println("Spliced in FIELD: " + targetClassName + "." + mn.name);
nodeData.fields.set(j, mn);
added = true;
break;
}
}
if (!added) {
System.out.println("Added FIELD: " + targetClassName + "." + mn.name);
nodeData.fields.add(mn);
added = true;
}
}
}
}
}
@@ -20,11 +20,7 @@
package appeng.core.transformer;
import org.objectweb.asm.Opcodes;
import org.objectweb.asm.tree.AbstractInsnNode;
import org.objectweb.asm.tree.ClassNode;
import org.objectweb.asm.tree.LdcInsnNode;
import org.objectweb.asm.tree.MethodInsnNode;
import org.objectweb.asm.tree.MethodNode;
import org.objectweb.asm.tree.*;
import java.util.ListIterator;
@@ -0,0 +1,78 @@
package appeng.core.transformer;
/*
* Copyright (c) 2018, 2020 Adrian Siekierka
*
* This file is part of StackUp.
*
* StackUp is free software: you can redistribute it and/or modify
* it under the terms of the GNU Lesser General Public License as published by
* the Free Software Foundation, either version 3 of the License, or
* (at your option) any later version.
*
* StackUp is distributed in the hope that it will be useful,
* but WITHOUT ANY WARRANTY; without even the implied warranty of
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
* GNU Lesser General Public License for more details.
*
* You should have received a copy of the GNU Lesser General Public License
* along with StackUp. If not, see <http://www.gnu.org/licenses/>.
*/
import io.netty.buffer.ByteBuf;
import net.minecraft.item.Item;
import net.minecraft.item.ItemStack;
import net.minecraft.nbt.NBTTagCompound;
import net.minecraft.network.PacketBuffer;
import java.io.IOException;
public class PacketBufferPatch extends PacketBuffer {
public PacketBufferPatch(ByteBuf wrapped) {
super(wrapped);
}
@Override
public ItemStack readItemStack() throws IOException {
int id = this.readShort();
if (id < 0) {
return ItemStack.EMPTY;
} else {
int count = this.readByte();
if (count == -42) {
count = this.readInt();
}
int damage = this.readShort();
ItemStack itemstack = new ItemStack(Item.getItemById(id), count, damage);
itemstack.getItem().readNBTShareTag(itemstack, this.readCompoundTag());
return itemstack;
}
}
@Override
public PacketBuffer writeItemStack(ItemStack stack) {
if (stack.isEmpty()) {
this.writeShort(-1);
} else {
this.writeShort(Item.getIdFromItem(stack.getItem()));
if (stack.getCount() >= 0 && stack.getCount() <= 64) {
this.writeByte(stack.getCount());
} else {
this.writeByte(-42);
this.writeInt(stack.getCount());
}
this.writeShort(stack.getMetadata());
NBTTagCompound tag = null;
if (stack.getItem().isDamageable() || stack.getItem().getShareTag()) {
tag = stack.getItem().getNBTShareTag(stack);
}
this.writeCompoundTag(tag);
}
return this;
}
}
@@ -21,6 +21,8 @@ package appeng.crafting;
import appeng.api.networking.IGrid;
import appeng.api.networking.IGridHost;
import appeng.api.networking.IGridNode;
import appeng.api.networking.crafting.ICraftingRequester;
import appeng.me.cache.CraftingGridCache;
@@ -42,11 +44,15 @@ public class CraftingLinkNexus {
return true;
}
if (this.getRequest() == null || this.cpu == null) {
CraftingLink req = this.getRequest();
if (req == null || this.cpu == null) {
this.tickOfDeath++;
} else {
final boolean hasCpu = craftingGridCache.hasCpu(this.cpu.getCpu());
final boolean hasMachine = this.getRequest().getRequester().getActionableNode().getGrid() == g;
final ICraftingRequester requester = req.getRequester();
final IGridNode actionableNode = requester != null ? requester.getActionableNode() : null;
final IGrid grid = actionableNode != null ? actionableNode.getGrid() : null;
final boolean hasMachine = grid != null && grid == g;
if (hasCpu && hasMachine) {
this.tickOfDeath = 0;
@@ -32,13 +32,14 @@ import appeng.core.sync.network.NetworkHandler;
import appeng.core.sync.packets.PacketInformPlayer;
import appeng.me.cluster.implementations.CraftingCPUCluster;
import appeng.util.Platform;
import appeng.util.item.AEItemStack;
import net.minecraft.entity.player.EntityPlayerMP;
import net.minecraft.item.ItemStack;
import net.minecraft.world.World;
import net.minecraftforge.fml.common.Optional;
import java.io.IOException;
import java.util.ArrayList;
import java.util.Collection;
import java.util.LinkedList;
import java.util.List;
public class CraftingTreeNode {
@@ -111,14 +112,16 @@ public class CraftingTreeNode {
this.what.setStackSize(l);
if (this.getSlot() >= 0 && this.parent != null && this.parent.details.isCraftable()) {
Collection<IAEItemStack> itemList = new ArrayList<>();
LinkedList<IAEItemStack> itemList = new LinkedList<>();
boolean damageableItem = this.what.getItem().isDamageable() || Platform.isGTDamageableItem(this.what.getItem());
if (this.parent.details.canSubstitute()) {
for (IAEItemStack subs : this.parent.details.getSubstituteInputs(this.slot)) {
if (damageableItem) {
itemList.addAll(inventoryList.findFuzzy(subs, FuzzyMode.IGNORE_ALL));
for (IAEItemStack i : inventoryList.findFuzzy(subs, FuzzyMode.IGNORE_ALL)) {
itemList.add(i);
}
}
subs = inventoryList.findPrecise(subs);
if (subs != null) {
@@ -127,7 +130,9 @@ public class CraftingTreeNode {
}
} else {
if (damageableItem) {
itemList.addAll(inventoryList.findFuzzy(this.what, FuzzyMode.IGNORE_ALL));
for (IAEItemStack i : inventoryList.findFuzzy(this.what, FuzzyMode.IGNORE_ALL)) {
itemList.add(i);
}
} else {
final IAEItemStack item = inventoryList.findPrecise(this.what);
if (item != null) {
@@ -137,13 +142,25 @@ public class CraftingTreeNode {
}
for (IAEItemStack fuzz : itemList) {
if (this.parent.details.isValidItemForSlot(this.getSlot(), fuzz.copy().getCachedItemStack(1), this.world)) {
if (fuzz.getStackSize() == 0) {
continue;
}
if (this.parent.details.isValidItemForSlot(this.getSlot(), fuzz.getDefinition(), this.world)) {
fuzz = fuzz.copy();
fuzz.setStackSize(l);
final IAEItemStack available = inv.extractItems(fuzz, Actionable.MODULATE, src);
if (available != null) {
if (available.getItem().hasContainerItem(available.getDefinition())) {
final ItemStack is2 = Platform.getContainerItem(available.createItemStack());
final IAEItemStack o = AEItemStack.fromItemStack(is2);
if (o != null) {
this.parent.addContainers(o);
}
}
if (!this.exhausted) {
final IAEItemStack is = this.job.checkUse(available);
@@ -197,6 +214,16 @@ public class CraftingTreeNode {
final IAEItemStack available = inv.extractItems(madeWhat, Actionable.MODULATE, src);
if (available != null) {
if (parent != null && available.getItem().hasContainerItem(available.getDefinition())) {
final ItemStack is2 = Platform.getContainerItem(available.createItemStack());
final IAEItemStack o = AEItemStack.fromItemStack(is2);
if (o != null) {
this.parent.addContainers(o);
}
}
this.bytes += available.getStackSize();
l -= available.getStackSize();
@@ -240,6 +267,14 @@ public class CraftingTreeNode {
if (job.isSimulation()) {
this.bytes += l;
if (parent != null && this.what.getItem().hasContainerItem(this.what.getDefinition())) {
final ItemStack is2 = Platform.getContainerItem(this.what.copy().setStackSize(1).createItemStack());
final IAEItemStack o = AEItemStack.fromItemStack(is2);
if (o != null) {
this.parent.addContainers(o);
}
}
this.missing += l;
final IAEItemStack rv = this.what.copy();
rv.setStackSize(l);
@@ -27,15 +27,11 @@ import appeng.api.storage.data.IAEItemStack;
import appeng.api.storage.data.IItemList;
import appeng.core.AEConfig;
import appeng.me.cluster.implementations.CraftingCPUCluster;
import appeng.util.Platform;
import appeng.util.item.AEItemStack;
import com.google.common.collect.ImmutableCollection;
import it.unimi.dsi.fastutil.objects.Object2LongArrayMap;
import net.minecraft.item.ItemStack;
import net.minecraft.world.World;
import java.util.ArrayList;
import java.util.List;
import java.util.Map.Entry;
@@ -50,6 +46,7 @@ public class CraftingTreeProcess {
boolean possible = true;
private long crafts = 0;
private long bytes = 0;
private ArrayList<IAEItemStack> containers;
public CraftingTreeProcess(final ICraftingGrid cc, final CraftingJob job, final ICraftingPatternDetails details, final CraftingTreeNode craftingTreeNode, final int depth) {
this.parent = craftingTreeNode;
@@ -198,32 +195,18 @@ public class CraftingTreeProcess {
void request(final MECraftingInventory inv, final long amountOfTimes, final IActionSource src) throws CraftBranchFailure, InterruptedException {
addProcess();
this.job.handlePausing();
List<IAEItemStack> containerItems = null;
// request and remove inputs...
for (final Entry<CraftingTreeNode, Long> entry : this.nodes.object2LongEntrySet()) {
final IAEItemStack stack = entry.getKey().request(inv, entry.getValue() * amountOfTimes, src);
if (this.details.isCraftable() && stack.getItem().hasContainerItem(stack.getDefinition())) {
final ItemStack is = Platform.getContainerItem(stack.createItemStack());
final IAEItemStack o = AEItemStack.fromItemStack(is);
if (o != null) {
if (containerItems == null) {
containerItems = new ArrayList<>();
}
this.bytes++;
o.setCachedItemStack(is);
containerItems.add(o);
}
}
}
if (containerItems != null) {
for (IAEItemStack i : containerItems) {
inv.injectItems(i, Actionable.MODULATE, src);
if (this.containers != null) {
for (IAEItemStack iae : containers) {
inv.injectItems(iae, Actionable.MODULATE, src);
}
containers = null;
}
// assume its possible.
// add crafting results..
@@ -235,6 +218,13 @@ public class CraftingTreeProcess {
this.crafts += amountOfTimes;
}
public void addContainers(IAEItemStack container) {
if (this.containers == null) {
this.containers = new ArrayList<>();
}
this.containers.add(container);
}
void dive(final CraftingJob job) {
job.addTask(this.getAmountCrafted(this.parent.getStack(1)), this.crafts, this.details, this.depth);
for (final Entry<CraftingTreeNode, Long> entry : this.nodes.object2LongEntrySet()) {
@@ -10,10 +10,13 @@ import net.minecraft.block.state.IBlockState;
import net.minecraft.creativetab.CreativeTabs;
import net.minecraft.item.Item;
import net.minecraft.item.ItemStack;
import net.minecraft.util.EnumFacing;
import net.minecraft.util.IStringSerializable;
import net.minecraft.util.math.BlockPos;
import net.minecraft.world.IBlockAccess;
import net.minecraft.world.World;
import javax.annotation.Nonnull;
import javax.annotation.Nullable;
import java.util.Random;
@@ -97,6 +100,8 @@ public abstract class BlockSlabCommon extends BlockSlab {
return Variant.DEFAULT;
}
public static class Double extends BlockSlabCommon {
private final Block halfSlabBlock;
@@ -134,6 +139,11 @@ public abstract class BlockSlabCommon extends BlockSlab {
public boolean isDouble() {
return false;
}
@Override
public boolean doesSideBlockChestOpening(@Nonnull IBlockState blockState, @Nonnull IBlockAccess world, @Nonnull BlockPos pos, @Nonnull EnumFacing side) {
return false;
}
}
public enum Variant implements IStringSerializable {
@@ -158,11 +158,16 @@ public class ContainerMEPortableFluidCell extends AEBaseContainer implements IAE
} else {
currentItem = this.slot < 0 ? this.getPlayerInv().getCurrentItem() : this.getPlayerInv().getStackInSlot(this.slot);
}
if (currentItem.isEmpty()) {
this.setValidContainer(false);
} else if (!this.wirelessTerminalGUIObject.getItemStack().isEmpty() && currentItem != this.wirelessTerminalGUIObject.getItemStack()) {
if (ItemStack.areItemsEqual(this.wirelessTerminalGUIObject.getItemStack(), currentItem)) {
this.getPlayerInv().setInventorySlotContents(this.getPlayerInv().currentItem, this.wirelessTerminalGUIObject.getItemStack());
if (wirelessTerminalGUIObject.isBaubleSlot()) {
BaublesApi.getBaublesHandler(this.getPlayerInv().player).setStackInSlot(this.slot, this.wirelessTerminalGUIObject.getItemStack());
} else {
this.getPlayerInv().setInventorySlotContents(this.getPlayerInv().currentItem, this.wirelessTerminalGUIObject.getItemStack());
}
} else {
this.setValidContainer(false);
}
@@ -171,9 +176,16 @@ public class ContainerMEPortableFluidCell extends AEBaseContainer implements IAE
// drain 1 ae t
this.ticks++;
if (this.ticks > 10) {
double power = this.wirelessTerminalGUIObject.extractAEPower(this.getPowerMultiplier() * this.ticks, Actionable.MODULATE, PowerMultiplier.CONFIG);
double ext = this.wirelessTerminalGUIObject.extractAEPower(this.getPowerMultiplier() * this.ticks, Actionable.MODULATE, PowerMultiplier.CONFIG);
if (ext < this.getPowerMultiplier() * this.ticks) {
if (Platform.isServer() && this.isValidContainer()) {
this.getPlayerInv().player.sendMessage(PlayerMessages.DeviceNotPowered.get());
}
this.setValidContainer(false);
}
this.ticks = 0;
this.hasPower = power > 0.001;
this.hasPower = ext > 0.001;
}
if (!this.wirelessTerminalGUIObject.rangeCheck()) {
@@ -471,11 +483,6 @@ public class ContainerMEPortableFluidCell extends AEBaseContainer implements IAE
}
}
@Override
public void onSlotChange(Slot s) {
detectAndSendChanges();
}
private void queueInventory(final IContainerListener c) {
if (Platform.isServer() && c instanceof EntityPlayer && this.monitor != null) {
try {
@@ -74,13 +74,11 @@ public class MultiCraftingTracker {
public boolean handleCrafting(final int x, final long itemToCraft, final IAEItemStack ais, final InventoryAdaptor d, final World w, final IGrid g, final ICraftingGrid cg, final IActionSource mySrc) {
if (ais != null) {
ItemStack inputStack = ais.getCachedItemStack(ais.getStackSize());
ItemStack inputStack = ais.createItemStack();
ItemStack remaining = d.simulateAdd(inputStack);
if (remaining.isEmpty()) {
ais.setCachedItemStack(inputStack);
final Future<ICraftingJob> craftingJob = this.getJob(x);
if (this.getLink(x) != null) {
@@ -117,8 +115,6 @@ public class MultiCraftingTracker {
this.setJob(x, cg.beginCraftingJob(w, g, mySrc, aisC, null));
}
}
} else {
ais.setCachedItemStack(remaining);
}
}
return false;
@@ -119,7 +119,7 @@ public enum MaterialType {
FLUID_CELL64K_PART(57, "material_fluid_cell64k_part", EnumSet.of(AEFeature.STORAGE_CELLS)),
CARD_PATTERN_EXPANSION(58, "material_card_pattern_expansion", EnumSet.of(AEFeature.ADVANCED_CARDS)),
CARD_QUANTUM_LINK(59, "material_card_quantum_link", EnumSet.of(AEFeature.ADVANCED_CARDS)),
CARD_QUANTUM_LINK(59, "material_card_quantum_link", EnumSet.of(AEFeature.ADVANCED_CARDS, AEFeature.QUANTUM_LINKING_CARD)),
CARD_MAGNET(60, "material_card_magnet", EnumSet.of(AEFeature.BASIC_CARDS));
@@ -29,6 +29,8 @@ import appeng.helpers.InvalidPatternHelper;
import appeng.helpers.PatternHelper;
import appeng.items.AEBaseItem;
import appeng.util.Platform;
import appeng.util.item.ItemStackHashStrategy;
import it.unimi.dsi.fastutil.objects.Object2ObjectOpenCustomHashMap;
import net.minecraft.client.util.ITooltipFlag;
import net.minecraft.entity.player.EntityPlayer;
import net.minecraft.entity.player.InventoryPlayer;
@@ -45,12 +47,12 @@ import net.minecraftforge.fml.relauncher.SideOnly;
import java.util.List;
import java.util.Map;
import java.util.WeakHashMap;
public class ItemEncodedPattern extends AEBaseItem implements ICraftingPatternItem {
private static final ItemStackHashStrategy hashStrategy = ItemStackHashStrategy.comparingAllButCount();
// rather simple client side caching.
private static final Map<ItemStack, ItemStack> SIMPLE_CACHE = new WeakHashMap<>();
private static final Map<ItemStack, ItemStack> SIMPLE_CACHE = new Object2ObjectOpenCustomHashMap<>(hashStrategy);
public ItemEncodedPattern() {
this.setMaxStackSize(64);
@@ -70,6 +72,7 @@ public class ItemEncodedPattern extends AEBaseItem implements ICraftingPatternIt
private boolean clearPattern(final ItemStack stack, final EntityPlayer player) {
if (player.isSneaking()) {
SIMPLE_CACHE.remove(stack);
if (Platform.isClient()) {
return false;
}
@@ -209,9 +209,11 @@ public class ToolWirelessTerminal extends AEBasePoweredItem implements IWireless
}
boolean inverted = u.getInstalledUpgrades(Upgrades.INVERTER) == 1;
List<EntityItem> ei = worldIn.getEntitiesWithinAABB(EntityItem.class, new AxisAlignedBB(
new Vec3d(entityIn.posX + 5, entityIn.posY + 5, entityIn.posZ + 5),
new Vec3d(entityIn.posX - 5, entityIn.posY - 5, entityIn.posZ - 5)));
List<EntityItem> ei = worldIn.getEntitiesWithinAABB(EntityItem.class,
new AxisAlignedBB(
entityIn.posX - 5, entityIn.posY - 5, entityIn.posZ - 5,
entityIn.posX + 5, entityIn.posY + 5, entityIn.posZ + 5
));
boolean emptyFilter = true;
for (EntityItem i : ei) {
if (i.isDead) {
+10 -7
View File
@@ -63,6 +63,7 @@ import java.util.concurrent.ExecutorService;
import java.util.concurrent.Executors;
import java.util.concurrent.Future;
import java.util.concurrent.ThreadFactory;
import java.util.stream.StreamSupport;
public class CraftingGridCache implements ICraftingGrid, ICraftingProviderHelper, ICellProvider, IMEInventoryHandler<IAEItemStack> {
@@ -285,14 +286,16 @@ public class CraftingGridCache implements ICraftingGrid, ICraftingProviderHelper
private void updateCPUClusters() {
this.craftingCPUClusters.clear();
for (final IGridNode cst : this.grid.getMachines(TileCraftingStorageTile.class)) {
final TileCraftingStorageTile tile = (TileCraftingStorageTile) cst.getMachine();
final CraftingCPUCluster cluster = (CraftingCPUCluster) tile.getCluster();
if (cluster != null) {
this.craftingCPUClusters.add(cluster);
for (Object cls: StreamSupport.stream(grid.getMachinesClasses().spliterator(), false).filter(TileCraftingStorageTile.class::isAssignableFrom).toArray()) {
for (final IGridNode cst : this.grid.getMachines((Class<? extends IGridHost>) cls)) {
final TileCraftingStorageTile tile = (TileCraftingStorageTile) cst.getMachine();
final CraftingCPUCluster cluster = (CraftingCPUCluster) tile.getCluster();
if (cluster != null) {
this.craftingCPUClusters.add(cluster);
if (cluster.getLastCraftingLink() != null) {
this.addLink((CraftingLink) cluster.getLastCraftingLink());
if (cluster.getLastCraftingLink() != null) {
this.addLink((CraftingLink) cluster.getLastCraftingLink());
}
}
}
}
+6
View File
@@ -81,8 +81,11 @@ public class SecurityCache implements ISecurityGrid {
private void updateSecurityKey() {
final long lastCode = this.securityKey;
int newOwner = -1;
if (this.securityProvider.size() == 1) {
this.securityKey = this.securityProvider.get(0).getSecurityKey();
ISecurityProvider securityProvider = this.securityProvider.get(0);
newOwner = securityProvider.getOwner();
} else {
this.securityKey = -1;
}
@@ -91,6 +94,9 @@ public class SecurityCache implements ISecurityGrid {
this.getGrid().postEvent(new MENetworkSecurityChange());
for (final IGridNode n : this.getGrid().getNodes()) {
((GridNode) n).setLastSecurityKey(this.securityKey);
if (n.getPlayerID() != newOwner) {
n.setPlayerID(newOwner);
}
}
}
}
@@ -48,6 +48,7 @@ public class PartP2PItems extends PartP2PTunnel<PartP2PItems> implements IItemHa
private static final float POWER_DRAIN = 2.0f;
private static final P2PModels MODELS = new P2PModels("part/p2p/p2p_tunnel_items");
private boolean partVisited = false;
private int depth;
@PartModels
public static List<IPartModel> getModels() {
@@ -195,7 +196,13 @@ public class PartP2PItems extends PartP2PTunnel<PartP2PItems> implements IItemHa
@Override
public ItemStack insertItem(final int slot, final ItemStack stack, boolean simulate) {
return this.getDestination().insertItem(slot, stack, simulate);
if (depth == 1) {
return stack;
}
this.depth += 1;
ItemStack ret = this.getDestination().insertItem(slot, stack, simulate);
this.depth -= 1;
return ret;
}
@Override
@@ -69,8 +69,13 @@ public abstract class AbstractPartEncoder extends AbstractPartTerminal {
this.crafting.setStackInSlot(x, item == null ? ItemStack.EMPTY : item.createItemStack());
}
for (int x = 0; x < this.output.getSlots() && x < details.getOutputs().length; x++) {
final IAEItemStack item = details.getOutputs()[x];
for (int x = 0; x < this.output.getSlots(); x++) {
final IAEItemStack item;
if (x < details.getOutputs().length) {
item = details.getOutputs()[x];
} else {
item = null;
}
this.output.setStackInSlot(x, item == null ? ItemStack.EMPTY : item.createItemStack());
}
}
@@ -74,8 +74,8 @@ public class TileIOPort extends AENetworkInvTile implements IUpgradeableHost, IC
private final ConfigManager manager;
private final AppEngInternalInventory inputCells = new AppEngInternalInventory(this, NUMBER_OF_CELL_SLOTS);
private final AppEngInternalInventory outputCells = new AppEngInternalInventory(this, NUMBER_OF_CELL_SLOTS);
private final AppEngInternalInventory inputCells = new AppEngInternalInventory(this, NUMBER_OF_CELL_SLOTS, 1);
private final AppEngInternalInventory outputCells = new AppEngInternalInventory(this, NUMBER_OF_CELL_SLOTS, 1);
private final IItemHandler combinedInventory = new WrapperChainedItemHandler(this.inputCells, this.outputCells);
private final IItemHandler inputCellsExt = new WrapperFilteredItemHandler(this.inputCells, AEItemFilters.INSERT_ONLY);
+6 -4
View File
@@ -344,7 +344,11 @@ public class Platform {
if (tile == null && type.getType() == GuiHostType.ITEM) {
p.openGui(AppEng.instance(), type.ordinal() << 4, p.getEntityWorld(), x, 0, 0);
} else if (tile == null || type.getType() == GuiHostType.ITEM) {
p.openGui(AppEng.instance(), type.ordinal() << 4, p.getEntityWorld(), x, y, z);
if (tile != null) {
p.openGui(AppEng.instance(), type.ordinal() << 4 | (1 << 3), p.getEntityWorld(), x, y, z);
} else {
p.openGui(AppEng.instance(), type.ordinal() << 4, p.getEntityWorld(), x, y, z);
}
} else {
p.openGui(AppEng.instance(), type.ordinal() << 4 | (side.ordinal()), tile.getWorld(), x, y, z);
}
@@ -357,9 +361,7 @@ public class Platform {
}
if (type.getType().isItem()) {
if (type.getType() == GuiHostType.ITEM) {
p.openGui(AppEng.instance(), type.ordinal() << 4, p.getEntityWorld(), slot, isBauble ? 1 : 0, Integer.MIN_VALUE);
}
p.openGui(AppEng.instance(), type.ordinal() << 4, p.getEntityWorld(), slot, isBauble ? 1 : 0, Integer.MIN_VALUE);
}
}
@@ -0,0 +1,101 @@
package appeng.util.item;
import it.unimi.dsi.fastutil.Hash;
import net.minecraft.item.ItemStack;
import javax.annotation.Nullable;
import java.util.Objects;
/**
* Original code by Eutro, butchered by Prototypetrousers.
* A configurable generator of hashing strategies, allowing for consideration of select properties of ItemStacks when
* considering equality.
*/
public interface ItemStackHashStrategy extends Hash.Strategy<ItemStack> {
/**
* @return a builder object for producing a custom ItemStackHashStrategy.
*/
static ItemStackHashStrategyBuilder builder() {
return new ItemStackHashStrategyBuilder();
}
/**
* Generates an ItemStackHash configured to compare every aspect of ItemStacks except the number
* of items in the stack.
*
* @return the ItemStackHashStrategy as described above.
*/
static ItemStackHashStrategy comparingAllButCount() {
return builder().compareItem(true)
.compareDamage(true)
.compareTag(true)
.build();
}
/**
* Builder pattern class for generating customized ItemStackHashStrategy
*/
class ItemStackHashStrategyBuilder {
private boolean item, damage, tag;
/**
* Defines whether the Item type should be considered for equality.
*
* @param choice {@code true} to consider this property, {@code false} to ignore it.
* @return {@code this}
*/
public ItemStackHashStrategyBuilder compareItem(boolean choice) {
item = choice;
return this;
}
/**
* Defines whether damage values should be considered for equality.
*
* @param choice {@code true} to consider this property, {@code false} to ignore it.
* @return {@code this}
*/
public ItemStackHashStrategyBuilder compareDamage(boolean choice) {
damage = choice;
return this;
}
/**
* Defines whether NBT Tags should be considered for equality.
*
* @param choice {@code true} to consider this property, {@code false} to ignore it.
* @return {@code this}
*/
public ItemStackHashStrategyBuilder compareTag(boolean choice) {
tag = choice;
return this;
}
/**
* @return the ItemStackHashStrategy as configured by "compare" methods.
*/
public ItemStackHashStrategy build() {
return new ItemStackHashStrategy() {
@Override
public int hashCode(@Nullable ItemStack o) {
return o == null || o.isEmpty() ? 0 : Objects.hash(
item ? o.getItem() : null,
damage ? o.getItemDamage() : null,
tag ? o.getTagCompound() : null
);
}
@Override
public boolean equals(@Nullable ItemStack a, @Nullable ItemStack b) {
if (a == null || a.isEmpty()) return b == null || b.isEmpty();
if (b == null || b.isEmpty()) return false;
return (!item || a.getItem() == b.getItem()) &&
(!damage || a.getItemDamage() == b.getItemDamage()) &&
(!tag || Objects.equals(a.getTagCompound(), b.getTagCompound()));
}
};
}
}
}
@@ -135,6 +135,9 @@ public class OreHelper {
List<OreDictFilterMatcher.MatchRule> rulesList = OreDictFilterMatcher.parseExpression(oreExp);
for (String ore : OreDictionary.getOreNames()) {
if (ore == null) {
continue;
}
if (OreDictFilterMatcher.matches(rulesList, ore)) {
matchingIds.add(OreDictionary.getOreID(ore));
}
@@ -1,60 +1,60 @@
{
"forge_marker": 1,
"defaults": {
"model": "appliedenergistics2:chest/base"
},
"variants": {
"slot_state": {
"empty": {
"submodel": {
"lights": {
"model": "appliedenergistics2:chest/lights_off"
},
"state": {
"model": "appliedenergistics2:chest/cell_state_empty"
}
}
},
"offline": {
"submodel": {
"lights": {
"model": "appliedenergistics2:chest/lights_off"
},
"state": {
"model": "appliedenergistics2:chest/cell_state_offline"
}
}
},
"online": {
"submodel": {
"lights": {
"model": "appliedenergistics2:chest/lights_on"
},
"state": {
"model": "appliedenergistics2:chest/cell_state_online"
}
}
},
"types_full": {
"submodel": {
"lights": {
"model": "appliedenergistics2:chest/lights_on"
},
"state": {
"model": "appliedenergistics2:chest/cell_state_types_full"
}
}
},
"full": {
"submodel": {
"lights": {
"model": "appliedenergistics2:chest/lights_on"
},
"state": {
"model": "appliedenergistics2:chest/cell_state_full"
}
}
}
"forge_marker": 1,
"defaults": {
"model": "appliedenergistics2:chest/base"
},
"variants": {
"slot_state": {
"empty": {
"submodel": {
"lights": {
"model": "appliedenergistics2:chest/lights_off"
},
"state": {
"model": "appliedenergistics2:chest/cell_state_empty"
}
}
},
"offline": {
"submodel": {
"lights": {
"model": "appliedenergistics2:chest/lights_off"
},
"state": {
"model": "appliedenergistics2:chest/cell_state_offline"
}
}
},
"online": {
"submodel": {
"lights": {
"model": "appliedenergistics2:chest/lights_on"
},
"state": {
"model": "appliedenergistics2:chest/cell_state_online"
}
}
},
"types_full": {
"submodel": {
"lights": {
"model": "appliedenergistics2:chest/lights_on"
},
"state": {
"model": "appliedenergistics2:chest/cell_state_types_full"
}
}
},
"full": {
"submodel": {
"lights": {
"model": "appliedenergistics2:chest/lights_on"
},
"state": {
"model": "appliedenergistics2:chest/cell_state_full"
}
}
}
}
}
}
@@ -323,6 +323,7 @@ gui.tooltips.appliedenergistics2.SchedulingModeRoundRobin=Exportiere im Round-Ro
gui.tooltips.appliedenergistics2.SchedulingModeRandom=Exportiere im Zufallsmodus.
gui.tooltips.appliedenergistics2.ItemsStored=Items gespeichert: %s
gui.tooltips.appliedenergistics2.ItemsRequestable=Anfragbare Items: %s
gui.tooltips.appliedenergistics2.ItemsCraftable=Herstellbar
// Units
gui.appliedenergistics2.units.appliedenergstics=AE
@@ -354,6 +354,7 @@ gui.tooltips.appliedenergistics2.FilterModeKeep=Restore previous search filter.
gui.tooltips.appliedenergistics2.FilterModeClear=Clear on each opening.
gui.tooltips.appliedenergistics2.ItemsStored=Items Stored: %s
gui.tooltips.appliedenergistics2.ItemsRequestable=Items Requestable: %s
gui.tooltips.appliedenergistics2.ItemsCraftable=Craftable
gui.tooltips.appliedenergistics2.P2PFrequency=Frequency: %s
gui.tooltips.appliedenergistics2.MultiplyByTwo=Double the items set
gui.tooltips.appliedenergistics2.MultiplyByTwoDesc=Will try to double the items set in the crafting slots
@@ -1,7 +1,7 @@
# Japanese translate by tier940 & Quarri6343
# 日本語ローカライズ担当: tier940 & Quarri6343
# Corresponding Version: v0.52.3
# 対応バージョン: v0.52.3
# Japanese translate by GTModpackTeam
# 日本語ローカライズ担当: GTModpackTeam
# Corresponding Version: v0.54.20
# 対応バージョン: v0.54.20
// Blocks
tile.appliedenergistics2.cable_bus.name=AE2ケーブル または バス
@@ -55,7 +55,7 @@ tile.appliedenergistics2.crafting_storage_16k.name=16k クラフティングス
tile.appliedenergistics2.crafting_storage_64k.name=64k クラフティングストレージ
tile.appliedenergistics2.crafting_accelerator.name=クラフティング並列処理ユニット
tile.appliedenergistics2.crafting_unit.name=クラフティングユニット
tile.appliedenergistics2.molecular_assembler.name=分子組立
tile.appliedenergistics2.molecular_assembler.name=分子組立
// Stairs
tile.appliedenergistics2.fluix_stairs.name=フルーシュの階段
@@ -70,30 +70,31 @@ tile.appliedenergistics2.sky_stone_stairs.name=スカイストーンの階段
// Slabs
tile.appliedenergistics2.chiseled_quartz_slab.name=柱状ケルタスクォーツのハーフブロック
tile.appliedenergistics2.fluix_slab.name=フルーシュのハーフブロック
tile.appliedenergistics2.quartz_pillar_slab.name=様入りケルタスクォーツのハーフブロック
tile.appliedenergistics2.quartz_slab.name=ケルタスクォーツのハーフブロック
tile.appliedenergistics2.smooth_sky_stone_slab.name=スカイストーンブロックのハーフブロック
tile.appliedenergistics2.quartz_pillar_slab.name=様入りケルタスクォーツのハーフブロック
tile.appliedenergistics2.sky_stone_brick_slab.name=スカイストーンレンガのハーフブロック
tile.appliedenergistics2.sky_stone_small_brick_slab.name=小さなスカイストーンレンガのハーフブロック
tile.appliedenergistics2.sky_stone_slab.name=スカイストーンのハーフブロック
// Chat Messages
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=モニターはロックされていません。
chat.appliedenergistics2.ChestCannotReadStorageCell=MEチェストがストレージセルを読み取れませんでした
chat.appliedenergistics2.SettingCleared=メモリカードを初期化
chat.appliedenergistics2.MissingPatternsToEncode=コピーし終わるまでのパターン数が少ないです
chat.appliedenergistics2.OutOfRange=無線範囲外です
chat.appliedenergistics2.InvalidMachine=無効な操作です
chat.appliedenergistics2.LoadedSettings=設定を正常に読み込みました
chat.appliedenergistics2.DeviceNotPowered=利用中の端末が充電切れです
chat.appliedenergistics2.DeviceNotWirelessTerminal=利用中の端末は無線端末ではありません
chat.appliedenergistics2.DeviceNotLinked=利用中の端末はまだリンクされていません
chat.appliedenergistics2.StationCanNotBeLocated=MEセキュリティターミナルの位置が不明です
chat.appliedenergistics2.MachineNotPowered=機械にエネルギーがありません
chat.appliedenergistics2.CommunicationError=ネットワークとの通信エラーが発生しました
chat.appliedenergistics2.SavedSettings=設定を正常に保存しました
chat.appliedenergistics2.ResetSettings=新しい端末をメモリカードに設定しました
chat.appliedenergistics2.AmmoDepleted=マターボールを使い切りました
chat.appliedenergistics2.isNowLocked=モニターはロックされていま
chat.appliedenergistics2.isNowUnlocked=モニターはロックされていません
// Creative Tabs
itemGroup.appliedenergistics2=Applied Energistics 2
@@ -118,11 +119,11 @@ gui.appliedenergistics2.security.craft.name=クラフト
gui.appliedenergistics2.security.build.name=設置
gui.appliedenergistics2.security.security.name=セキュリティ
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.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サイズ
@@ -134,7 +135,7 @@ gui.appliedenergistics2.QuartzCuttingKnife=クォーツナイフ
gui.appliedenergistics2.Inscriber=刻印機
gui.appliedenergistics2.Wireless=無線アクセスポイント
gui.appliedenergistics2.WirelessTerminal=無線ターミナル
gui.appliedenergistics2.NoPermissions=アクセス権が選択されていません
gui.appliedenergistics2.NoPermissions=アクセス権が選択されていません
gui.appliedenergistics2.SecurityCardEditor=生体認証カードエディタ
gui.appliedenergistics2.Encoded=エンコード済
gui.appliedenergistics2.Priority=優先度
@@ -173,6 +174,8 @@ gui.appliedenergistics2.StoredFluids=貯蔵液体
gui.appliedenergistics2.Terminal=ターミナル
gui.appliedenergistics2.InterfaceTerminal=インターフェースターミナル
gui.appliedenergistics2.InterfaceTerminalHint=インターフェースターミナルから表示または非表示
gui.appliedenergistics2.InterfaceConfigurationTerminal=インターフェース設定用ターミナル
gui.appliedenergistics2.FluidInterfaceConfigurationTerminal=液体インターフェース設定用ターミナル
gui.appliedenergistics2.FormationPlane=形成プレーン
gui.appliedenergistics2.FluidFormationPlane=液体形成プレーン
gui.appliedenergistics2.VibrationChamber=振動チャンバー
@@ -180,7 +183,6 @@ gui.appliedenergistics2.NetworkDetails=ネットワークの詳細
gui.appliedenergistics2.StorageCells=MEストレージセル
gui.appliedenergistics2.IOBuses=ME入力/出力バス
gui.appliedenergistics2.IOBusesFluids=ME液体入力/出力バス
gui.appliedenergistics2.Stores=Stores
gui.appliedenergistics2.Stores=削除
gui.appliedenergistics2.BytesUsed=バイト使用済み
gui.appliedenergistics2.Types=タイプ
@@ -188,11 +190,12 @@ 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.MolecularAssembler=分子組立
gui.appliedenergistics2.ProcessingPattern=加工パターン
gui.appliedenergistics2.Crafts=クラフト
gui.appliedenergistics2.And=と
gui.appliedenergistics2.Creates=作成
@@ -209,11 +212,11 @@ gui.appliedenergistics2.inWorldSingularity=作る為には一個のシンギュ
gui.appliedenergistics2.ChargedQuartz=チャージドケルタスクォーツは普通のケルタスクォーツをチャージ機にセットし、電力を供給することで作製されます。
gui.appliedenergistics2.ChargedQuartzFind=チャージドケルタスクォーツは輝くことを除いて通常のケルタスクォーツに非常に似ています。見分け方は青い靄です。
gui.appliedenergistics2.NoSecondOutput=副産物なし
gui.appliedenergistics2.OfSecondOutput=%1$d%%の確率で副産物
gui.appliedenergistics2.MultipleOutputs=%1$d%%の確率で副産物%2$d%%の確率で第二副産物
gui.appliedenergistics2.OfSecondOutput=%1$d%%の確率で副産物を搬出
gui.appliedenergistics2.MultipleOutputs=%1$d%%の確率で副産物を搬出し%2$d%%の確率で第二副産物を搬出
gui.appliedenergistics2.SelectAmount=数を選択
gui.appliedenergistics2.CopyMode=コピーモード
gui.appliedenergistics2.CopyModeDesc=ストレージセルを取り外したとき設定パネルの内容を消去するかどうか
gui.appliedenergistics2.CopyModeDesc=ストレージセルを取り外したとき設定パネルの内容を消去するかどうか
gui.appliedenergistics2.Next=次
gui.appliedenergistics2.Lumen=ルーメン
gui.appliedenergistics2.Empty=空
@@ -233,15 +236,15 @@ gui.appliedenergistics2.Bytes=ストレージ
gui.appliedenergistics2.Simulation=シミュレーション
gui.appliedenergistics2.CoProcessors=Coプロセッサ
gui.appliedenergistics2.CraftingCPU=クラフティングCPU
gui.appliedenergistics2.NoCraftingCPUs=利用可能なCPUがありません
gui.appliedenergistics2.CalculatingWait=計算中ですお待ちください...
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.NoCraftingJobs=クラフティングが実行されていない
gui.appliedenergistics2.FacadeCrafting=偽装版クラフト
gui.appliedenergistics2.inWorldCraftingPresses=金型は世界中に散らばっている隕石の中心にあります。隕石は隕石探知コンパスで探せます。
gui.appliedenergistics2.Included=含める
@@ -251,23 +254,24 @@ gui.appliedenergistics2.Precise=精密マッチ
gui.appliedenergistics2.Fuzzy=抽象マッチ
gui.appliedenergistics2.SmallFontCraft=クラフト
gui.appliedenergistics2.LargeFontCraft=+
gui.appliedenergistics2.Renamer=カスタム名称: (Enterで設定)
gui.appliedenergistics2.Nothing=なし
// GUI Tooltips
gui.tooltips.appliedenergistics2.Stash=アイテムを保存
gui.tooltips.appliedenergistics2.StashDesc=グリッド上のアイテムをネットワークに戻す
gui.tooltips.appliedenergistics2.StashDesc=グリッド上のアイテムをネットワークに戻す
gui.tooltips.appliedenergistics2.Substitutions=鉱石辞書の置換
gui.tooltips.appliedenergistics2.SubstitutionsDescEnabled=材料を鉱石辞書で置換させる
gui.tooltips.appliedenergistics2.SubstitutionsDescDisabled=材料を鉱石辞書で置換させない
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.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.FZPercent_25=§a25%§rの分離損失
gui.tooltips.appliedenergistics2.FZPercent_50=§e50%§rの分離損失
gui.tooltips.appliedenergistics2.FZPercent_75=§675%§rの分離損失
gui.tooltips.appliedenergistics2.FZPercent_99=§499%§rの分離損失
gui.tooltips.appliedenergistics2.SortOrder=昇順/降順
gui.tooltips.appliedenergistics2.SortBy=並び替え方法
gui.tooltips.appliedenergistics2.FZIgnoreAll=すべてマッチする
@@ -291,8 +295,8 @@ 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.MatterBalls=§a%s§r個のアイテムごとにマターボール変換する
gui.tooltips.appliedenergistics2.Singularity=§a%s§r個のアイテムごとにシンギュラリティ変換する
gui.tooltips.appliedenergistics2.Read=出力のみ
gui.tooltips.appliedenergistics2.Write=入力のみ
gui.tooltips.appliedenergistics2.ReadWrite=入出力可能
@@ -355,26 +359,27 @@ gui.tooltips.appliedenergistics2.FilterModeKeep=以前の検索フィルター
gui.tooltips.appliedenergistics2.FilterModeClear=GUIを開くたびにリセットする
gui.tooltips.appliedenergistics2.ItemsStored=在庫アイテム: %s
gui.tooltips.appliedenergistics2.ItemsRequestable=要求可能なアイテム: %s
gui.tooltips.appliedenergistics2.ItemsCraftable=クラフト可能
gui.tooltips.appliedenergistics2.P2PFrequency=周波数: %s
gui.tooltips.appliedenergistics2.MultiplyByTwo=アイテムを倍にする
gui.tooltips.appliedenergistics2.MultiplyByTwoDesc=スロットのアイテム数を倍にすることを試みる
gui.tooltips.appliedenergistics2.MultiplyByTwoDesc=スロットのアイテム数を倍にすることを試みる
gui.tooltips.appliedenergistics2.MultiplyByThree=アイテムを3倍にする
gui.tooltips.appliedenergistics2.MultiplyByThreeDesc=スロットのアイテム数を3倍にすることを試みる
gui.tooltips.appliedenergistics2.MultiplyByThreeDesc=スロットのアイテム数を3倍にすることを試みる
gui.tooltips.appliedenergistics2.IncreaseByOne=1個追加
gui.tooltips.appliedenergistics2.IncreaseByOneDesc=スロットのアイテム数を1個増やすことを試みる。材料の比率は保持されない。
gui.tooltips.appliedenergistics2.IncreaseByOneDesc=スロットのアイテム数を1個増やすことを試みる
gui.tooltips.appliedenergistics2.DivideByTwo=2で割る
gui.tooltips.appliedenergistics2.DivideByTwoDesc=スロットのアイテム数を2で割ることを試みる
gui.tooltips.appliedenergistics2.DivideByTwoDesc=スロットのアイテム数を2で割ることを試みる
gui.tooltips.appliedenergistics2.DivideByThree=3で割る
gui.tooltips.appliedenergistics2.DivideByThreeDesc=スロットのアイテム数を3で割ることを試みる
gui.tooltips.appliedenergistics2.DivideByThreeDesc=スロットのアイテム数を3で割ることを試みる
gui.tooltips.appliedenergistics2.DecreaseByOne=1個減らす
gui.tooltips.appliedenergistics2.DecreaseByOneDesc=スロットのアイテム数を1個減らすことを試みる。材料の比率は保持されない。
gui.tooltips.appliedenergistics2.DecreaseByOneDesc=スロットのアイテム数を1個減らすことを試みる
gui.tooltips.appliedenergistics2.MaxCount=スロットのアイテム数を最大化
gui.tooltips.appliedenergistics2.MaxCountDesc=材料アイテムの比率を保ったままスロットのアイテム数を最大化する
gui.tooltips.appliedenergistics2.FreeMolecularSlotShortcut=スロットが空いているインターフェースを表示する
gui.tooltips.appliedenergistics2.FreeMolecularSlotShortcutDesc=スロットが空いているインターフェースを切り替えて分子組立を検索するショートカット。
gui.tooltips.appliedenergistics2.MaxCountDesc=材料アイテムの比率を保ったままスロットのアイテム数を最大化する
gui.tooltips.appliedenergistics2.FreeMolecularSlotShortcut=スロットが空いているインターフェースを表示する
gui.tooltips.appliedenergistics2.FreeMolecularSlotShortcutDesc=スロットが空いているインターフェースを切り替えて分子組立を検索する
gui.tooltips.appliedenergistics2.ToggleShowFullInterfaces=スロットが一杯になっているインターフェースの表示切り替え
gui.tooltips.appliedenergistics2.ToggleShowFullInterfacesOnDesc=全てのインターフェースを表示
gui.tooltips.appliedenergistics2.ToggleShowFullInterfacesOffDesc=空きがあるインターフェースのみを表示
gui.tooltips.appliedenergistics2.ToggleShowFullInterfacesOnDesc=全てのインターフェースを表示
gui.tooltips.appliedenergistics2.ToggleShowFullInterfacesOffDesc=空きがあるインターフェースのみを表示
gui.tooltips.appliedenergistics2.HighlightInterface=インターフェースを強調表示
// Units
@@ -414,13 +419,13 @@ waila.appliedenergistics2.Contains=格納
waila.appliedenergistics2.Channels=%2$d中%1$dチャンネル使用中
waila.appliedenergistics2.P2PUnlinked=設定待機中
waila.appliedenergistics2.p2p_input_one_output=1個接続中 (接続元)
waila.appliedenergistics2.p2p_input_many_outputs=%d個接続中 (接続元)
waila.appliedenergistics2.p2p_input_many_outputs=§4%d§r個接続中 (接続元)
waila.appliedenergistics2.p2p_output_one_input=1個接続中 (接続先)
waila.appliedenergistics2.p2p_output_many_inputs=%d個接続中 (接続先)
waila.appliedenergistics2.p2p_output_many_inputs=§2%d§r個接続中 (接続先)
waila.appliedenergistics2.P2POutput=接続中 (接続先)
// TheOneProbe
theoneprobe.appliedenergistics2.crafting=クラフト中: %1$s
theoneprobe.appliedenergistics2.crafting=クラフト中: §2%1$s§r
theoneprobe.appliedenergistics2.device_online=装置はオンラインです
theoneprobe.appliedenergistics2.device_offline=装置はオフラインです
theoneprobe.appliedenergistics2.device_missing_channel=装置のチャンネルが見つかりません
@@ -428,25 +433,25 @@ theoneprobe.appliedenergistics2.locked=ロックされています
theoneprobe.appliedenergistics2.unlocked=ロックされてません
theoneprobe.appliedenergistics2.showing=表示中
theoneprobe.appliedenergistics2.contains=格納
theoneprobe.appliedenergistics2.channels=%2$d%1$dチャンネル使用中
theoneprobe.appliedenergistics2.channels=§4%2$d§r中§2%1$d§rチャンネル使用中
theoneprobe.appliedenergistics2.p2p_unlinked=設定待機中
theoneprobe.appliedenergistics2.p2p_input_one_output=1個接続中 (接続元)
theoneprobe.appliedenergistics2.p2p_input_many_outputs=%d個接続中 (接続元)
theoneprobe.appliedenergistics2.p2p_output_one_input=1個接続中 (接続先)
theoneprobe.appliedenergistics2.p2p_output_many_inputs=%d個接続中 (接続先)
theoneprobe.appliedenergistics2.p2p_output=接続中 (接続先)
theoneprobe.appliedenergistics2.p2p_frequency=周波数: %1$s
theoneprobe.appliedenergistics2.stored_energy=%1$d / %2$d
theoneprobe.appliedenergistics2.p2p_frequency=周波数: §5%1$s§r
theoneprobe.appliedenergistics2.stored_energy=§2%1$d§к / §4%2$d§r
// Items
item.appliedenergistics2.storage_cell_1k.name=1k MEストレージセル
item.appliedenergistics2.storage_cell_4k.name=4k MEストレージセル
item.appliedenergistics2.storage_cell_16k.name=16k MEストレージセル
item.appliedenergistics2.storage_cell_64k.name=64k MEストレージセル
item.appliedenergistics2.fluid_storage_cell_1k.name=1k ME液体セル
item.appliedenergistics2.fluid_storage_cell_4k.name=4k ME液体セル
item.appliedenergistics2.fluid_storage_cell_16k.name=16k ME液体セル
item.appliedenergistics2.fluid_storage_cell_64k.name=64k ME液体セル
item.appliedenergistics2.storage_cell_1k.name=§61k§r MEストレージセル
item.appliedenergistics2.storage_cell_4k.name=§e4k§r MEストレージセル
item.appliedenergistics2.storage_cell_16k.name=§a16k§r MEストレージセル
item.appliedenergistics2.storage_cell_64k.name=§b64k§r MEストレージセル
item.appliedenergistics2.fluid_storage_cell_1k.name=§61k§r ME液体セル
item.appliedenergistics2.fluid_storage_cell_4k.name=§e4k§r ME液体セル
item.appliedenergistics2.fluid_storage_cell_16k.name=§a16k§r ME液体セル
item.appliedenergistics2.fluid_storage_cell_64k.name=§b64k§r ME液体セル
item.appliedenergistics2.creative_storage_cell.name=クリエイティブ用MEストレージセル
item.appliedenergistics2.encoded_pattern.name=エンコード済みパターン
item.appliedenergistics2.view_cell.name=セルを表示
@@ -463,21 +468,25 @@ item.appliedenergistics2.material.blank_pattern.name=ブランクパターン
item.appliedenergistics2.material.calculation_processor.name=発展プロセッサ
item.appliedenergistics2.material.card_capacity.name=容量カード
item.appliedenergistics2.material.card_pattern_expansion.name=パターン拡張カード
item.appliedenergistics2.material.card_magnet.name=マグネットカード
item.appliedenergistics2.material.card_magnet.usage=端末に装備した状態で空中へ右クリックするとON/OFFを切り替えられる
item.appliedenergistics2.material.card_magnet.partition=セル作業台にて設定変更ができます
item.appliedenergistics2.material.card_quantum_link.name=量子リンクカード
item.appliedenergistics2.material.card_fuzzy.name=ファジーカード
item.appliedenergistics2.material.card_inverter.name=反転カード
item.appliedenergistics2.material.card_redstone.name=レッドストーンカード
item.appliedenergistics2.material.card_speed.name=加速カード
item.appliedenergistics2.material.cell2_spatial_part.name=2³空間ストレージ
item.appliedenergistics2.material.cell16_spatial_part.name=16³空間ストレージ
item.appliedenergistics2.material.cell128_spatial_part.name=128³空間ストレージ
item.appliedenergistics2.material.cell1k_part.name=1k MEストレージコンポーネント
item.appliedenergistics2.material.cell4k_part.name=4k MEストレージコンポーネント
item.appliedenergistics2.material.cell16k_part.name=16k MEストレージコンポーネント
item.appliedenergistics2.material.cell64k_part.name=64k MEストレージコンポーネント
item.appliedenergistics2.material.fluid_cell1k_part.name=1k ME液体コンポーネント
item.appliedenergistics2.material.fluid_cell4k_part.name=4k ME液体コンポーネント
item.appliedenergistics2.material.fluid_cell16k_part.name=16k ME液体コンポーネント
item.appliedenergistics2.material.fluid_cell64k_part.name=64k ME液体コンポーネント
item.appliedenergistics2.material.cell2_spatial_part.name=§62³§r空間コンポーネント
item.appliedenergistics2.material.cell16_spatial_part.name=§916³空間コンポーネント
item.appliedenergistics2.material.cell128_spatial_part.name=§d128³空間コンポーネント
item.appliedenergistics2.material.cell1k_part.name=§61k§r MEストレージコンポーネント
item.appliedenergistics2.material.cell4k_part.name=§e4k§r MEストレージコンポーネント
item.appliedenergistics2.material.cell16k_part.name=§a16k§r MEストレージコンポーネント
item.appliedenergistics2.material.cell64k_part.name=§b64k§r MEストレージコンポーネント
item.appliedenergistics2.material.fluid_cell1k_part.name=§61k§r ME液体コンポーネント
item.appliedenergistics2.material.fluid_cell4k_part.name=§e4k§r ME液体コンポーネント
item.appliedenergistics2.material.fluid_cell16k_part.name=§a16k§r ME液体コンポーネント
item.appliedenergistics2.material.fluid_cell64k_part.name=§b64k§r ME液体コンポーネント
item.appliedenergistics2.material.certus_quartz_crystal.name=ケルタスクォーツ
item.appliedenergistics2.material.certus_quartz_crystal_charged.name=チャージドケルタスクォーツ
item.appliedenergistics2.material.certus_quartz_dust.name=ケルタスクォーツの粉
@@ -543,7 +552,7 @@ item.appliedenergistics2.multi_part.level_emitter.name=MEレベルエミッタ
item.appliedenergistics2.multi_part.fluid_level_emitter.name=ME液体レベルエミッタ
item.appliedenergistics2.multi_part.p2p_tunnel.name=P2Pトンネル
item.appliedenergistics2.multi_part.pattern_terminal.name=MEパターンターミナル
item.appliedenergistics2.multi_part.expanded_processing_pattern_terminal.name=ME拡張パターンターミナル
item.appliedenergistics2.multi_part.expanded_processing_pattern_terminal.name=ME拡張加工パターンターミナル
item.appliedenergistics2.multi_part.quartz_fiber.name=クォーツファイバー
item.appliedenergistics2.multi_part.storage_bus.name=MEストレージバス
item.appliedenergistics2.multi_part.oredict_storage_bus.name=ME鉱石辞書ストレージバス
@@ -553,12 +562,14 @@ item.appliedenergistics2.multi_part.inverted_toggle_bus.name=ME反転切替バ
item.appliedenergistics2.multi_part.toggle_bus.name=ME切替バス
item.appliedenergistics2.multi_part.crafting_monitor.name=MEクラフティングモニター
item.appliedenergistics2.multi_part.interface_terminal.name=MEインターフェースターミナル
item.appliedenergistics2.multi_part.fluid_terminal.name=ME液体インターフェースターミナル
item.appliedenergistics2.multi_part.interface_configuration_terminal.name=インターフェース設定用ターミナル
item.appliedenergistics2.multi_part.fluid_interface_configuration_terminal.name=液体インターフェース設定用ターミナル
item.appliedenergistics2.multi_part.fluid_terminal.name=ME液体ターミナル
item.appliedenergistics2.multi_part.invalid_type.name=無効アイテム
item.appliedenergistics2.spatial_storage_cell_128_cubed.name=128³空間ストレージセル
item.appliedenergistics2.spatial_storage_cell_16_cubed.name=16³空間ストレージセル
item.appliedenergistics2.spatial_storage_cell_2_cubed.name=空間ストレージセル
item.appliedenergistics2.spatial_storage_cell_128_cubed.name=§d128³§r空間ストレージセル
item.appliedenergistics2.spatial_storage_cell_16_cubed.name=§916³§r空間ストレージセル
item.appliedenergistics2.spatial_storage_cell_2_cubed.name=§62³§r空間ストレージセル
item.appliedenergistics2.certus_quartz_axe.name=ケルタスクォーツの斧
item.appliedenergistics2.certus_quartz_cutting_knife.name=ケルタスクォーツのナイフ
@@ -585,6 +596,9 @@ item.appliedenergistics2.matter_cannon.name=マターキャノン
item.appliedenergistics2.memory_card.name=メモリーカード
item.appliedenergistics2.color_applicator.name=カラーアプリケーター
item.appliedenergistics2.wireless_terminal.name=無線アクセスターミナル
item.appliedenergistics2.wireless_crafting_terminal.name=無線クラフティングターミナル
item.appliedenergistics2.wireless_pattern_terminal.name=無線パターンターミナル
item.appliedenergistics2.wireless_fluid_terminal.name=無線液体ターミナル
item.appliedenergistics2.biometric_card.name=生体認証カード
item.appliedenergistics2.debug_card.name=開発用.デバッグ用カード
@@ -592,43 +606,43 @@ item.appliedenergistics2.debug_replicator_card.name=開発用.反復子カード
// Commands
commands.ae2.usage=Applied Energistics 2のコマンド - リストが必要な場合は /ae2 list を使用し、コマンドのヘルプが必要な場合は /ae2 help _____ を使用します。
commands.ae2.permissions=このコマンドを実行するための必要な権限を持っていません
commands.ae2.ChunkLogger=チャンクロードとアンロードに関するサーバーログへの書き込みを切り替えます
commands.ae2.ChunkLoggerOn=チャンクロギングを開始しました。
commands.ae2.ChunkLoggerOff=チャンクロギングを終了しました
commands.ae2.Supporters=AE2サポーターの一覧を表示します
commands.ae2.permissions=このコマンドを実行するための必要な権限を持っていません
commands.ae2.ChunkLogger=チャンクロードとアンロードに関するサーバーログへの書き込みを切り替えます
commands.ae2.ChunkLoggerOn=チャンクロギングを開始しま
commands.ae2.ChunkLoggerOff=チャンクロギングを終了しました
commands.ae2.Supporters=AE2サポーターの一覧を表示します
// Achievements
achievement.ae2.Root=Applied Energistics 2
achievement.ae2.Root.desc=チェストだけでは物足りない
achievement.ae2.Root=Applied Energistics
achievement.ae2.Root.desc=チェストだけでは物足りない?
achievement.ae2.Compass=隕石ハンター
achievement.ae2.Compass.desc=隕石探知コンパスを作る。
achievement.ae2.Compass.desc=隕石探知コンパスを作成する。
achievement.ae2.Presses=未知なる技術
achievement.ae2.Presses.desc=プロセッサの金型を見つける。
achievement.ae2.SpatialIO=空間の調整
achievement.ae2.SpatialIO.desc=空間IOポートを作る。
achievement.ae2.SpatialIOExplorer=大胆に移動したい
achievement.ae2.SpatialIO.desc=空間IOポートを作成する。
achievement.ae2.SpatialIOExplorer=大胆に移動したい?
achievement.ae2.SpatialIOExplorer.desc=空間ストレージセルに格納する。
achievement.ae2.StorageCell=チェストより優れたもの
achievement.ae2.StorageCell.desc=ストレージセルを作る。
achievement.ae2.StorageCell.desc=ストレージセルを作成する。
achievement.ae2.IOPort=ストレージセルをシャッフル
achievement.ae2.IOPort.desc=入出力ポートを作る。
achievement.ae2.IOPort.desc=入出力ポートを作成する。
achievement.ae2.CraftingTerminal=もっと大きな作業台
achievement.ae2.CraftingTerminal.desc=クラフティングターミナルを作る。
achievement.ae2.CraftingTerminal.desc=クラフティングターミナルを作成する。
achievement.ae2.PatternTerminal=クラフティングの巨匠
achievement.ae2.PatternTerminal.desc=パターンターミナルを作る。
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.Charger.desc=チャージ機を作成する。
achievement.ae2.CrystalGrowthAccelerator=加速なんてものじゃない
achievement.ae2.CrystalGrowthAccelerator.desc=クリスタル成長加速機を作る。
achievement.ae2.CrystalGrowthAccelerator.desc=クリスタル成長加速機を作成する。
achievement.ae2.GlassCable=フルーシュエネルギーの接続
achievement.ae2.GlassCable.desc=MEケーブルを作る。
achievement.ae2.GlassCable.desc=MEケーブルを作成する。
achievement.ae2.Controller=ネットワークの配電盤
achievement.ae2.Controller.desc=コントローラを作る。
achievement.ae2.Controller.desc=コントローラを作成する。
achievement.ae2.Networking1=ネットワークの実習生
achievement.ae2.Networking1.desc=ネットワーク上のチャンネルが8個に到達する。
achievement.ae2.Networking2=ネットワークの設計者
@@ -636,27 +650,31 @@ achievement.ae2.Networking2.desc=ネットワーク上のチャンネルが128
achievement.ae2.Networking3=ネットワークの管理者
achievement.ae2.Networking3.desc=ネットワーク上のチャンネルが2048個に到達する。
achievement.ae2.P2P=ポイント・トゥ・ポイント(ピア・トゥ・ピアではない)
achievement.ae2.P2P.desc=P2Pトンネルを作る。
achievement.ae2.P2P.desc=P2Pトンネルを作成する。
achievement.ae2.Recursive=再帰的なネットワーク
achievement.ae2.Recursive.desc=ストレージバスにインターフェースを配置する。
achievement.ae2.CraftingCPU=次世代のクラフティング
achievement.ae2.CraftingCPU.desc=クラフティングユニットを作る。
achievement.ae2.CraftingCPU.desc=クラフティングユニットを作成する。
achievement.ae2.Facade=ネットワークの美意識
achievement.ae2.Facade.desc=偽装板を作る。
achievement.ae2.Facade.desc=偽装板を作成する。
achievement.ae2.NetworkTool=ネットワークの診断
achievement.ae2.NetworkTool.desc=ネットワークツールを作る。
achievement.ae2.NetworkTool.desc=ネットワークツールを作成する。
achievement.ae2.PortableCell=ストレージの放浪者
achievement.ae2.PortableCell.desc=ポータブルセルを作る。
achievement.ae2.PortableCell.desc=ポータブルセルを作成する。
achievement.ae2.StorageBus=無限大の可能性
achievement.ae2.StorageBus.desc=ストレージバスを作る。
achievement.ae2.StorageBus.desc=ストレージバスを作成する。
achievement.ae2.QNB=量子トンネル
achievement.ae2.QNB.desc=量子リンクを作る。
achievement.ae2.QNB.desc=量子リンクを作成する。
// Stats
stat.ae2.ItemsInserted=MEストレージセルに搬入したアイテム数
stat.ae2.ItemsExtracted=MEストレージセルから搬出したアイテム数
stat.ae2.ItemsInserted=MEストレージに搬入したアイテム数
stat.ae2.ItemsExtracted=MEストレージから搬出したアイテム数
stat.ae2.TurnedCranks=クランクを回した回数
// Keys
key.appliedenergistics2.category=Applied Energistics 2
key.toggle_focus.desc=検索ボックスの切り替え
key.open_wireless_terminal.desc=無線ターミナルを開く
key.open_wireless_crafting_terminal.desc=無線クラフティングターミナルを開く
key.open_wireless_pattern_terminal.desc=無線パターンターミナルを開く
key.open_wireless_fluid_terminal.desc=無線液体ターミナルを開く
@@ -354,6 +354,7 @@ gui.tooltips.appliedenergistics2.FilterModeKeep=Восстановить пре
gui.tooltips.appliedenergistics2.FilterModeClear=Очищать при каждом открытии.
gui.tooltips.appliedenergistics2.ItemsStored=Хранящиеся предметы: %s
gui.tooltips.appliedenergistics2.ItemsRequestable=Запрашиваемые предметы: %s
gui.tooltips.appliedenergistics2.ItemsCraftable=Можно создать
gui.tooltips.appliedenergistics2.P2PFrequency=Частота: %s
gui.tooltips.appliedenergistics2.MultiplyByTwo=Удвоить колличество предметов
gui.tooltips.appliedenergistics2.MultiplyByTwoDesc=Удвоить колличество предметов, установленных в слотах для крафта
@@ -463,7 +464,7 @@ item.appliedenergistics2.material.calculation_processor.name=Вычислите
item.appliedenergistics2.material.card_capacity.name=Карта ёмкости
item.appliedenergistics2.material.card_pattern_expansion.name=Карта расширения шаблона
item.appliedenergistics2.material.card_magnet.name=Магнитная карта
item.appliedenergistics2.material.card_magnet.usage=Щёлкните ПКМ пустой рукой по терминулу, чтобы включить или выключить
item.appliedenergistics2.material.card_magnet.usage=Щёлкните ПКМ пустой рукой по терминалу, чтобы включить или выключить
item.appliedenergistics2.material.card_magnet.partition=Можно настроить в верстаке для ячеек
item.appliedenergistics2.material.card_quantum_link.name=Карта квантовой связи
item.appliedenergistics2.material.card_fuzzy.name=Карта нечёткости
@@ -607,7 +608,7 @@ commands.ae2.ChunkLoggerOff=Логирование чанков выключен
commands.ae2.Supporters=Отображает список поддержавших AE2
// Achievements
achievement.ae2.Root=Applied Energistics! Падите ниц!
achievement.ae2.Root=Applied Energistics
achievement.ae2.Root.desc=Когда сундука уже не хватает...
achievement.ae2.Compass=Охотник за метеоритами!
achievement.ae2.Compass.desc=Сделайте метеоритный компас!
@@ -1,5 +1,5 @@
// Blocks (方块)
tile.appliedenergistics2.cable_bus.name=AE2线缆和(或)总线
// Blocks
tile.appliedenergistics2.cable_bus.name=AE2线缆和(或)总线
tile.appliedenergistics2.cell_workbench.name=元件工作台
tile.appliedenergistics2.charger.name=充能器
tile.appliedenergistics2.chest.name=ME箱子
@@ -52,7 +52,7 @@ tile.appliedenergistics2.crafting_accelerator.name=并行处理单元
tile.appliedenergistics2.crafting_unit.name=合成单元
tile.appliedenergistics2.molecular_assembler.name=分子装配室
// Stairs (楼梯)
// Stairs
tile.appliedenergistics2.fluix_stairs.name=錾制赛特斯石英楼梯
tile.appliedenergistics2.quartz_stairs.name=福鲁伊克斯楼梯
tile.appliedenergistics2.chiseled_quartz_stairs.name=竖纹赛特斯石英楼梯
@@ -62,7 +62,7 @@ tile.appliedenergistics2.sky_stone_brick_stairs.name=陨石石砖楼梯
tile.appliedenergistics2.sky_stone_small_brick_stairs.name=陨石砖块楼梯
tile.appliedenergistics2.sky_stone_stairs.name=陨石楼梯
// Slabs (台阶)
// Slabs
tile.appliedenergistics2.chiseled_quartz_slab.name=錾制赛特斯石英台阶
tile.appliedenergistics2.fluix_slab.name=福鲁伊克斯台阶
tile.appliedenergistics2.quartz_pillar_slab.name=竖纹赛特斯石英台阶
@@ -72,29 +72,30 @@ tile.appliedenergistics2.sky_stone_brick_slab.name=陨石石砖台阶
tile.appliedenergistics2.sky_stone_small_brick_slab.name=陨石砖块台阶
tile.appliedenergistics2.sky_stone_slab.name=陨石台阶
// Chat Messages (聊天信息)
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=监控器已解锁.
// Chat Messages
chat.appliedenergistics2.ChestCannotReadStorageCell=ME箱子无法读取存储元件
chat.appliedenergistics2.SettingCleared=设置已清除
chat.appliedenergistics2.MissingPatternsToEncode=样板不足,无法完成复制。
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=监控器已解锁。
// Creative Tabs (创造模式物品栏)
// Creative Tabs
itemGroup.appliedenergistics2=应用能源2
itemGroup.appliedenergistics2.facades=应用能源2-伪装板
// GUI (图形用户界面相关)
// GUI
gui.appliedenergistics2.CraftingTerminal=合成终端
gui.appliedenergistics2.METunnel=ME
gui.appliedenergistics2.ItemTunnel=物品
@@ -113,11 +114,11 @@ gui.appliedenergistics2.security.craft.name=合成
gui.appliedenergistics2.security.build.name=建造
gui.appliedenergistics2.security.security.name=安全
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.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规模
@@ -167,8 +168,9 @@ gui.appliedenergistics2.StoredItems=已存储物品
gui.appliedenergistics2.StoredFluids=已存储流体
gui.appliedenergistics2.Terminal=终端
gui.appliedenergistics2.InterfaceTerminal=接口终端
gui.appliedenergistics2.InterfaceTerminalHint=在接口终端显示或隐藏。
gui.appliedenergistics2.InterfaceConfigurationTerminal=接口配置终端
gui.appliedenergistics2.InterfaceTerminalHint=在接口终端显示或隐藏.
gui.appliedenergistics2.FluidInterfaceConfigurationTerminal=流体接口配置终端
gui.appliedenergistics2.FormationPlane=成型面板
gui.appliedenergistics2.FluidFormationPlane=流体成型面板
gui.appliedenergistics2.VibrationChamber=谐振仓
@@ -193,23 +195,23 @@ gui.appliedenergistics2.Crafts=合成
gui.appliedenergistics2.And=与
gui.appliedenergistics2.Creates=制作
gui.appliedenergistics2.With=使用
gui.appliedenergistics2.Substitute=启用替换:
gui.appliedenergistics2.Substitute=启用替换
gui.appliedenergistics2.Yes=是
gui.appliedenergistics2.No=否
gui.appliedenergistics2.InWorldCrafting=AE2在世界中的合成
gui.appliedenergistics2.inWorldFluix=将1个充能赛特斯石英水晶,1个下界石英和1个红石,相继扔进同一格水里,并等待一会儿.
gui.appliedenergistics2.inWorldPurificationCertus=用赛特斯石英粉和沙子制作赛特斯石英种子,并扔进水里;使用晶体催生器可以让这个过程变得更快.
gui.appliedenergistics2.inWorldPurificationNether=用下界石英粉和沙子制作下界石英种子,并扔进水里;使用晶体催生器可以让这个过程变得更快.
gui.appliedenergistics2.inWorldPurificationFluix=用福鲁伊克斯粉和沙子制作福鲁伊克斯种子,并扔进水里;使用晶体催生器可以让这个过程变得更快.
gui.appliedenergistics2.inWorldSingularity=将1个奇点和一个末影珍珠粉仍在地上,并用爆炸性物品引爆.
gui.appliedenergistics2.ChargedQuartz=将未充能赛特斯石英插入充能器充能后,可以得到充能赛特斯石英.
gui.appliedenergistics2.ChargedQuartzFind=充能赛特斯石英也可以在世界中以普通赛特斯石英一半的几率找到,它的外观类似普通赛特斯石英,除了它会冒出闪电.
gui.appliedenergistics2.NoSecondOutput=无副产物.
gui.appliedenergistics2.OfSecondOutput=获得副产物概率%1$d%%.
gui.appliedenergistics2.MultipleOutputs=第一副产概率%1$d%%,第二副产概率%2$d%%.
gui.appliedenergistics2.inWorldFluix=将1个充能赛特斯石英水晶1个下界石英和1个红石相继扔进同一格水里并等待一会儿
gui.appliedenergistics2.inWorldPurificationCertus=用赛特斯石英粉和沙子制作赛特斯石英种子并扔进水里;使用晶体催生器可以让这个过程变得更快
gui.appliedenergistics2.inWorldPurificationNether=用下界石英粉和沙子制作下界石英种子并扔进水里;使用晶体催生器可以让这个过程变得更快
gui.appliedenergistics2.inWorldPurificationFluix=用福鲁伊克斯粉和沙子制作福鲁伊克斯种子并扔进水里;使用晶体催生器可以让这个过程变得更快
gui.appliedenergistics2.inWorldSingularity=将1个奇点和一个末影珍珠粉仍在地上并用爆炸性物品引爆
gui.appliedenergistics2.ChargedQuartz=将未充能赛特斯石英插入充能器充能后可以得到充能赛特斯石英
gui.appliedenergistics2.ChargedQuartzFind=充能赛特斯石英也可以在世界中以普通赛特斯石英一半的几率找到它的外观类似普通赛特斯石英除了它会冒出闪电
gui.appliedenergistics2.NoSecondOutput=无副产物
gui.appliedenergistics2.OfSecondOutput=获得副产物概率%1$d%%
gui.appliedenergistics2.MultipleOutputs=第一副产概率%1$d%%第二副产概率%2$d%%
gui.appliedenergistics2.SelectAmount=选择数量
gui.appliedenergistics2.CopyMode=复制模式
gui.appliedenergistics2.CopyModeDesc=控制当取出存储元件时,是否清空配置格.
gui.appliedenergistics2.CopyModeDesc=控制当取出存储元件时是否清空配置格
gui.appliedenergistics2.Next=下一页
gui.appliedenergistics2.Lumen=光通
gui.appliedenergistics2.Empty=空
@@ -229,17 +231,17 @@ gui.appliedenergistics2.Bytes=可存储
gui.appliedenergistics2.Simulation=合成模拟
gui.appliedenergistics2.CoProcessors=并行处理单元
gui.appliedenergistics2.CraftingCPU=合成CPU
gui.appliedenergistics2.NoCraftingCPUs=没有可用的合成CPU...
gui.appliedenergistics2.CalculatingWait=正在计算,请等待...
gui.appliedenergistics2.NoCraftingCPUs=没有可用的合成CPU……
gui.appliedenergistics2.CalculatingWait=正在计算请等待……
gui.appliedenergistics2.Clean=清空
gui.appliedenergistics2.InvalidPattern=无效样板
gui.appliedenergistics2.Range=范围
gui.appliedenergistics2.TransparentFacades=透明的伪装板
gui.appliedenergistics2.TransparentFacadesHint=控制当网络工具放在快捷栏时,伪装板显示的透明度.
gui.appliedenergistics2.TransparentFacadesHint=控制当网络工具放在快捷栏时伪装板显示的透明度
gui.appliedenergistics2.CPUs=CPU
gui.appliedenergistics2.NoCraftingJobs=没有正在进行的合成任务
gui.appliedenergistics2.FacadeCrafting=伪装板合成
gui.appliedenergistics2.inWorldCraftingPresses=压印模板可以在陨石块的中心找到,陨石块会散落在世界中.可以用陨石罗盘来定位它们.
gui.appliedenergistics2.inWorldCraftingPresses=压印模板可以在陨石块的中心找到陨石块会散落在世界中可以用陨石罗盘来定位它们
gui.appliedenergistics2.Included=包含匹配
gui.appliedenergistics2.Excluded=排除匹配
gui.appliedenergistics2.Partitioned=分区
@@ -247,18 +249,19 @@ gui.appliedenergistics2.Precise=精确匹配
gui.appliedenergistics2.Fuzzy=模糊匹配
gui.appliedenergistics2.SmallFontCraft=Craft
gui.appliedenergistics2.LargeFontCraft=+
gui.appliedenergistics2.Renamer=自定义名称(按下Enter以设定)
gui.appliedenergistics2.Nothing=无
// GUI Tooltips (GUI提示)
// GUI Tooltips
gui.tooltips.appliedenergistics2.Stash=存储物品
gui.tooltips.appliedenergistics2.StashDesc=将合成槽的物品返回网络
gui.tooltips.appliedenergistics2.Substitutions=矿物词典替换
gui.tooltips.appliedenergistics2.SubstitutionsDescEnabled=启用输入组件替换功能.
gui.tooltips.appliedenergistics2.SubstitutionsDescDisabled=禁用输入组件替换功能.
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.EncodeDescription=将输入的样板写入当前编码样板或可用的空样板
gui.tooltips.appliedenergistics2.FuzzyMode=模糊对比
gui.tooltips.appliedenergistics2.FZPercent_25=25%时分离损耗
gui.tooltips.appliedenergistics2.FZPercent_50=50%时分离损耗
@@ -283,7 +286,7 @@ gui.tooltips.appliedenergistics2.IOMode=输入/输出模式
gui.tooltips.appliedenergistics2.CondenserOutput=ME聚合器-输出
gui.tooltips.appliedenergistics2.PartitionStorage=分区存储
gui.tooltips.appliedenergistics2.Clear=清除
gui.tooltips.appliedenergistics2.TrashController=通过按下shift或空格点击删除.
gui.tooltips.appliedenergistics2.TrashController=通过按下Shift或空格点击删除
gui.tooltips.appliedenergistics2.InterfaceBlockingMode=阻挡模式
gui.tooltips.appliedenergistics2.InterfaceCraftingMode=合成模式
gui.tooltips.appliedenergistics2.Trash=销毁物品
@@ -296,8 +299,8 @@ 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.EmitLevelsBelow=当容量标准小于设定限制时发出信号
gui.tooltips.appliedenergistics2.EmitLevelAbove=当容量标准大于等于设定限制时发出信号
gui.tooltips.appliedenergistics2.SearchMode_Auto=自动搜索
gui.tooltips.appliedenergistics2.SearchMode_Standard=标准搜索
gui.tooltips.appliedenergistics2.SearchMode_JEIAuto=JEI自动同步
@@ -307,51 +310,52 @@ 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.PartitionStorageHint=基于当前已存储物品进行分区编辑
gui.tooltips.appliedenergistics2.ClearSettings=清除配置
gui.tooltips.appliedenergistics2.Craftable=可合成
gui.tooltips.appliedenergistics2.MoveWhenEmpty=当元件为空时移动至输出口.
gui.tooltips.appliedenergistics2.MoveWhenWorkIsDone=当工序完成移动至输出口.
gui.tooltips.appliedenergistics2.MoveWhenFull=当元件装满时移动至输出口.
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.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=能源(ae)
gui.tooltips.appliedenergistics2.LevelType_Energy=能源
gui.tooltips.appliedenergistics2.LevelType_Item=物品
gui.tooltips.appliedenergistics2.InventoryTweaks=InventoryTweak(R键整理)
gui.tooltips.appliedenergistics2.InventoryTweaks=InventoryTweaks
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.DoesntDespawn=该物品不会消失
gui.tooltips.appliedenergistics2.EmitterMode=合成发信模式
gui.tooltips.appliedenergistics2.CraftViaRedstone=发射红石信号来合成物品.
gui.tooltips.appliedenergistics2.EmitWhenCrafting=在物品合成时发射红石信号.
gui.tooltips.appliedenergistics2.CraftViaRedstone=发射红石信号来合成物品
gui.tooltips.appliedenergistics2.EmitWhenCrafting=在物品合成时发射红石信号
gui.tooltips.appliedenergistics2.ReportInaccessibleItems=显示不可交互的物品
gui.tooltips.appliedenergistics2.ReportInaccessibleItemsYes=是: 显示无法取出的物品.
gui.tooltips.appliedenergistics2.ReportInaccessibleItemsNo=否: 只显示可以取出的物品.
gui.tooltips.appliedenergistics2.ReportInaccessibleItemsYes=是显示无法取出的物品
gui.tooltips.appliedenergistics2.ReportInaccessibleItemsNo=否只显示可以取出的物品
gui.tooltips.appliedenergistics2.ReportInaccessibleFluids=显示不可交互的流体
gui.tooltips.appliedenergistics2.ReportInaccessibleFluidsYes=是: 显示无法取出的流体.
gui.tooltips.appliedenergistics2.ReportInaccessibleFluidsNo=否: 只显示可以取出的流体.
gui.tooltips.appliedenergistics2.ReportInaccessibleFluidsYes=是显示无法取出的流体
gui.tooltips.appliedenergistics2.ReportInaccessibleFluidsNo=否只显示可以取出的流体
gui.tooltips.appliedenergistics2.BlockPlacement=方块放置方式
gui.tooltips.appliedenergistics2.BlockPlacementYes=方块将被放置.
gui.tooltips.appliedenergistics2.BlockPlacementNo=方块将以物品形式掉落.
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.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.tooltips.appliedenergistics2.FilterModeKeep=重载上一个搜索过滤器
gui.tooltips.appliedenergistics2.FilterModeClear=在每次打开时清空
gui.tooltips.appliedenergistics2.ItemsStored=存储物品%s
gui.tooltips.appliedenergistics2.ItemsRequestable=可请求%s
gui.tooltips.appliedenergistics2.ItemsCraftable=可合成
gui.tooltips.appliedenergistics2.P2PFrequency=频率:%s
gui.tooltips.appliedenergistics2.MultiplyByTwo=物品数量×2
gui.tooltips.appliedenergistics2.MultiplyByTwoDesc=将尝试将格内物品数量×2
gui.tooltips.appliedenergistics2.MultiplyByThree=物品数量×3
@@ -373,13 +377,13 @@ gui.tooltips.appliedenergistics2.ToggleShowFullInterfacesOnDesc=显示所有接
gui.tooltips.appliedenergistics2.ToggleShowFullInterfacesOffDesc=仅显示有样板位的接口
gui.tooltips.appliedenergistics2.HighlightInterface=高亮接口
// Units (单位)
// Units
gui.appliedenergistics2.units.appliedenergstics=AE
gui.appliedenergistics2.units.ic2=EU
gui.appliedenergistics2.units.rf=RF
gui.appliedenergistics2.units.gteu=GTEU
// Colors (颜色)
// Colors
gui.appliedenergistics2.White=白色
gui.appliedenergistics2.Orange=橙色
gui.appliedenergistics2.Magenta=品红色
@@ -409,14 +413,14 @@ 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.p2p_output_one_input=已连接(输出端)
waila.appliedenergistics2.p2p_output_many_inputs=已连接(输出端)- %d 输入
waila.appliedenergistics2.P2POutput=已连接(输出端)
waila.appliedenergistics2.p2p_input_one_output=已连接输入端- 1输出
waila.appliedenergistics2.p2p_input_many_outputs=已连接输入端- §4%d§r输出
waila.appliedenergistics2.p2p_output_one_input=已连接输出端- 1输入
waila.appliedenergistics2.p2p_output_many_inputs=已连接输出端- §4%d§r输入
waila.appliedenergistics2.P2POutput=已连接输出端
// TheOneProbe
theoneprobe.appliedenergistics2.crafting=合成中: %1$s
theoneprobe.appliedenergistics2.crafting=合成中%1$s
theoneprobe.appliedenergistics2.device_online=设备开启
theoneprobe.appliedenergistics2.device_offline=设备关闭
theoneprobe.appliedenergistics2.device_missing_channel=设备缺少频道
@@ -426,15 +430,15 @@ 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_one_input=已连接(输出端)
theoneprobe.appliedenergistics2.p2p_output_many_inputs=已连接(输出端)- %d 输入
theoneprobe.appliedenergistics2.p2p_output=已连接(输出端)
theoneprobe.appliedenergistics2.p2p_frequency=频率: %1$s
theoneprobe.appliedenergistics2.p2p_input_one_output=已连接输入端- 1输出
theoneprobe.appliedenergistics2.p2p_input_many_outputs=已连接输入端- §4%d§r输出
theoneprobe.appliedenergistics2.p2p_output_one_input=已连接输出端- 1输入
theoneprobe.appliedenergistics2.p2p_output_many_inputs=已连接输出端- §4%d§r输入
theoneprobe.appliedenergistics2.p2p_output=已连接输出端
theoneprobe.appliedenergistics2.p2p_frequency=频率%1$s
theoneprobe.appliedenergistics2.stored_energy=%1$d / %2$d
// Items (物品)
// Items
item.appliedenergistics2.storage_cell_1k.name=1k-ME存储元件
item.appliedenergistics2.storage_cell_4k.name=4k-ME存储元件
item.appliedenergistics2.storage_cell_16k.name=16k-ME存储元件
@@ -459,6 +463,10 @@ item.appliedenergistics2.material.blank_pattern.name=空白样板
item.appliedenergistics2.material.calculation_processor.name=运算处理器
item.appliedenergistics2.material.card_capacity.name=容量卡
item.appliedenergistics2.material.card_pattern_expansion.name=样板扩展卡
item.appliedenergistics2.material.card_magnet.name=磁引卡
item.appliedenergistics2.material.card_magnet.usage=在终端上空手右击以打开或关闭
item.appliedenergistics2.material.card_magnet.partition=可以在元件工作台上配置
item.appliedenergistics2.material.card_quantum_link.name=量子链接卡
item.appliedenergistics2.material.card_fuzzy.name=模糊卡
item.appliedenergistics2.material.card_inverter.name=反相卡
item.appliedenergistics2.material.card_redstone.name=红石卡
@@ -539,7 +547,7 @@ item.appliedenergistics2.multi_part.level_emitter.name=ME标准发信器
item.appliedenergistics2.multi_part.fluid_level_emitter.name=ME流体标准发信器
item.appliedenergistics2.multi_part.p2p_tunnel.name=P2P通道
item.appliedenergistics2.multi_part.pattern_terminal.name=ME样板终端
item.appliedenergistics2.multi_part.expanded_processing_pattern_terminal.name=ME增广处理样板终端
item.appliedenergistics2.multi_part.expanded_processing_pattern_terminal.name=ME增广样板终端
item.appliedenergistics2.multi_part.quartz_fiber.name=石英纤维
item.appliedenergistics2.multi_part.storage_bus.name=ME存储总线
item.appliedenergistics2.multi_part.oredict_storage_bus.name=ME矿典存储总线
@@ -550,6 +558,7 @@ item.appliedenergistics2.multi_part.toggle_bus.name=ME触发总线
item.appliedenergistics2.multi_part.crafting_monitor.name=ME合成监控器
item.appliedenergistics2.multi_part.interface_terminal.name=ME接口终端
item.appliedenergistics2.multi_part.interface_configuration_terminal.name=ME接口配置终端
item.appliedenergistics2.multi_part.fluid_interface_configuration_terminal.name=ME流体接口配置终端
item.appliedenergistics2.multi_part.fluid_terminal.name=ME流体终端
item.appliedenergistics2.multi_part.invalid_type.name=已禁用
@@ -582,22 +591,25 @@ item.appliedenergistics2.matter_cannon.name=物质炮
item.appliedenergistics2.memory_card.name=内存卡
item.appliedenergistics2.color_applicator.name=染色器
item.appliedenergistics2.wireless_terminal.name=无线终端
item.appliedenergistics2.wireless_crafting_terminal.name=无线合成终端
item.appliedenergistics2.wireless_pattern_terminal.name=无线样板终端
item.appliedenergistics2.wireless_fluid_terminal.name=无线流体终端
item.appliedenergistics2.biometric_card.name=身份卡
item.appliedenergistics2.debug_card.name=Dev.调试卡
item.appliedenergistics2.debug_replicator_card.name=Dev.复制卡
// Commands (指令)
commands.ae2.usage=ae2提供的指令 - 输入/ae2 list查看指令列表,/ae2 help _____查看指令帮助.
commands.ae2.permissions=你没有足够的权限来执行该指令.
commands.ae2.ChunkLogger=是否向服务器日志打开区块载入与载出信息.(OP)
// Commands
commands.ae2.usage=AE2提供的指令 - 输入/ae2 list查看指令列表/ae2 help _____查看指令帮助
commands.ae2.permissions=你没有足够的权限来执行该指令
commands.ae2.ChunkLogger=是否向服务器日志打开区块载入与载出信息。(OP
commands.ae2.ChunkLoggerOn=区块日志已打开
commands.ae2.ChunkLoggerOff=区块日志已关闭
commands.ae2.Supporters=显示ae2支持者列表
commands.ae2.Supporters=显示AE2支持者列表
// Achievements (进度)
achievement.ae2.Root=Applied Energistics
achievement.ae2.Root.desc=当箱子只是不够用的时候.
// Achievements
achievement.ae2.Root=应用能源
achievement.ae2.Root.desc=当箱子只是不够用的时候
achievement.ae2.Compass=陨石猎手
achievement.ae2.Compass.desc=制作一个陨石罗盘
achievement.ae2.Presses=未知科技
@@ -649,11 +661,15 @@ achievement.ae2.StorageBus.desc=制作一个存储总线
achievement.ae2.QNB=量子隧道
achievement.ae2.QNB.desc=制作一个链接室
// Stats (统计)
// Stats
stat.ae2.ItemsInserted=物品已存入ME存储
stat.ae2.ItemsExtracted=物品已取出ME存储
stat.ae2.TurnedCranks=转动曲柄
// Keys (键盘)
key.appliedenergistics2.category=Applied Energistics 2
//Keys
key.appliedenergistics2.category=应用能源2
key.toggle_focus.desc=打开/关闭搜索框聚焦
key.open_wireless_terminal.desc=打开无线终端
key.open_wireless_crafting_terminal.desc=打开无线合成终端
key.open_wireless_pattern_terminal.desc=打开无线样板终端
key.open_wireless_fluid_terminal.desc=打开无线流体终端
@@ -1,122 +1,108 @@
{
"credit": "Made with Blockbench",
"textures": {
"up": "appliedenergistics2:blocks/chest/top",
"down": "appliedenergistics2:blocks/chest/bottom",
"north": "appliedenergistics2:blocks/chest/front",
"particle": "appliedenergistics2:blocks/chest/side",
"east": "appliedenergistics2:blocks/chest/side"
},
"elements": [
{
"name": "inside_border_right",
"from": [4, 3, 0],
"to": [5, 8, 1],
"rotation": {"angle": 0, "axis": "y", "origin": [8, 13, 1]},
"faces": {
"east": {"uv": [0, 6, 1, 11], "rotation": 180, "texture": "#down"}
}
},
{
"name": "inside_right",
"from": [2, 1, 1],
"to": [5, 12, 11],
"rotation": {"angle": 0, "axis": "y", "origin": [9, 11, 3]},
"faces": {
"east": {"uv": [5, 2, 14, 13], "texture": "#down"}
}
},
{
"from": [0, 0, 0],
"to": [16, 16, 16],
"faces": {
"north": {"uv": [0, 0, 16, 16], "texture": "#north"},
"east": {"uv": [0, 0, 16, 16], "texture": "#east"},
"south": {"uv": [0, 0, 16, 16], "texture": "#east"},
"west": {"uv": [0, 0, 16, 16], "texture": "#east"},
"up": {"uv": [0, 0, 16, 16], "texture": "#up"},
"down": {"uv": [0, 0, 16, 16], "texture": "#down"}
}
},
{
"name": "inside_back",
"from": [5, 4, 7],
"to": [11, 7, 10],
"rotation": {"angle": 0, "axis": "y", "origin": [19, 11, 8]},
"faces": {
"north": {"uv": [3, 2, 14, 14], "texture": "#down"}
}
},
{
"name": "inside_left",
"from": [11, 1, 1],
"to": [14, 12, 11],
"rotation": {"angle": 0, "axis": "y", "origin": [18, 11, 3]},
"faces": {
"north": {"uv": [2, 5, 2, 5], "texture": "#down"},
"west": {"uv": [5, 2, 14, 13], "texture": "#down"}
}
},
{
"name": "inside_top",
"from": [5, 6, 1],
"to": [11, 9, 11],
"rotation": {"angle": 0, "axis": "y", "origin": [15, 16, 3]},
"faces": {
"north": {"uv": [14, 12, 14, 12], "texture": "#down"},
"down": {"uv": [12, 15, 12, 15], "texture": "#down"}
}
},
{
"name": "inside_bottom",
"from": [5, 1, 1],
"to": [11, 4, 11],
"rotation": {"angle": 0, "axis": "y", "origin": [15, 11, 3]},
"faces": {
"north": {"uv": [1, 6, 1, 6], "texture": "#down"},
"up": {"uv": [6, 1, 6, 1], "texture": "#down"}
}
},
{
"name": "inside_border_bottom",
"from": [4, 0, 0],
"to": [12, 3, 9],
"rotation": {"angle": 0, "axis": "y", "origin": [15, 10, 1]},
"faces": {
"up": {"uv": [0, 4, 9, 13], "rotation": 90, "texture": "#missing"}
}
},
{
"name": "inside_border_top",
"from": [5, 7, 0],
"to": [12, 10, 9],
"rotation": {"angle": 0, "axis": "y", "origin": [15, 17, 1]},
"faces": {
"down": {"uv": [0, 4, 9, 13], "rotation": 270, "texture": "#down"}
}
},
{
"name": "inside_border_left",
"from": [11, 3, 0],
"to": [12, 8, 1],
"rotation": {"angle": 0, "axis": "y", "origin": [15, 13, 1]},
"faces": {
"west": {"uv": [0, 8, 1, 13], "texture": "#down"}
}
}
],
"groups": [
{
"name": "chest",
"origin": [8, 8, 8],
"color": 0,
"children": [0, 1, 2, 3, 4, 5, 6, 7, 8, 9]
},
{
"name": "cells",
"origin": [8, 8, 8],
"color": 0,
"children": []
}
]
}
"textures": {
"4": "appliedenergistics2:blocks/drive_inside",
"up": "appliedenergistics2:blocks/chest/top",
"down": "appliedenergistics2:blocks/chest/bottom",
"north": "appliedenergistics2:blocks/chest/front",
"particle": "appliedenergistics2:blocks/chest/side",
"east": "appliedenergistics2:blocks/chest/side"
},
"elements": [
{
"from": [0, 0, 0],
"to": [16, 16, 16],
"faces": {
"north": { "uv": [0, 0, 16, 16], "texture": "#north" },
"east": { "uv": [0, 0, 16, 16], "texture": "#east" },
"south": { "uv": [0, 0, 16, 16], "texture": "#east" },
"west": { "uv": [0, 0, 16, 16], "texture": "#east" },
"up": { "uv": [0, 0, 16, 16], "texture": "#up" },
"down": { "uv": [0, 0, 16, 16], "texture": "#down" }
}
},
{
"name": "inside_back",
"from": [5, 4, 7],
"to": [11, 7, 10],
"rotation": { "angle": 0, "axis": "y", "origin": [19, 11, 8] },
"faces": {
"north": { "uv": [4, 1, 16, 14], "texture": "#4" }
}
},
{
"name": "inside_left",
"from": [11, 1, 1],
"to": [14, 12, 11],
"rotation": { "angle": 0, "axis": "y", "origin": [18, 11, 3] },
"faces": {
"north": { "uv": [2, 5, 2, 5], "texture": "#4" },
"west": { "uv": [5, 1, 14, 12], "texture": "#4" }
}
},
{
"name": "inside_top",
"from": [5, 6, 1],
"to": [11, 9, 11],
"rotation": { "angle": 0, "axis": "y", "origin": [15, 16, 3] },
"faces": {
"north": { "uv": [2, 7, 2, 7], "texture": "#4" },
"down": { "uv": [6, 4, 6, 4], "texture": "#4" }
}
},
{
"name": "inside_bottom",
"from": [5, 1, 1],
"to": [11, 4, 11],
"rotation": { "angle": 0, "axis": "y", "origin": [15, 11, 3] },
"faces": {
"north": { "uv": [2, 7, 2, 7], "texture": "#4" },
"up": { "uv": [6, 3, 6, 3], "texture": "#4" }
}
},
{
"name": "inside_border_bottom",
"from": [4, 0, 0],
"to": [12, 3, 9],
"rotation": { "angle": 0, "axis": "y", "origin": [15, 10, 1] },
"faces": {
"up": { "uv": [0, 4, 9, 13], "rotation": 90, "texture": "#4" }
}
},
{
"name": "inside_border_top",
"from": [5, 7, 0],
"to": [12, 10, 9],
"rotation": { "angle": 0, "axis": "y", "origin": [15, 17, 1] },
"faces": {
"down": { "uv": [0, 4, 9, 13], "rotation": 270, "texture": "#4" }
}
},
{
"name": "inside_border_left",
"from": [11, 3, 0],
"to": [12, 8, 1],
"rotation": { "angle": 0, "axis": "y", "origin": [15, 13, 1] },
"faces": {
"west": { "uv": [0, 8, 1, 13], "texture": "#4" }
}
},
{
"name": "inside_border_right",
"from": [4, 3, 0],
"to": [5, 8, 1],
"rotation": { "angle": 0, "axis": "y", "origin": [8, 13, 1] },
"faces": {
"east": { "uv": [0, 6, 1, 11], "rotation": 180, "texture": "#4" }
}
},
{
"name": "inside_right",
"from": [2, 1, 1],
"to": [5, 12, 11],
"rotation": { "angle": 0, "axis": "y", "origin": [9, 11, 3] },
"faces": {
"east": { "uv": [5, 2, 14, 13], "texture": "#4" }
}
}
]
}
@@ -1,4 +1,3 @@
{
"textures": {},
"elements": []
"credit": "Made with Blockbench"
}
@@ -1,38 +1,23 @@
{
"credit": "Made with Blockbench",
"textures": {
"front": "appliedenergistics2:blocks/chest/cell_state_backdrop",
"state": "appliedenergistics2:blocks/chest/cell_state_full",
"top_front": "appliedenergistics2:blocks/drive_cell_states_emissive"
},
"elements": [
{
"name": "Cell Backdrop",
"from": [5, 4, 0],
"to": [11, 6, 1],
"shade": false,
"faces": {
"north": {"uv": [5, 10, 11, 12], "texture": "#front"},
"up": {"uv": [5, 10, 11, 11], "texture": "#front"}
}
},
{
"name": "Cell Light",
"from": [9, 4, 0],
"to": [10, 5, 0],
"shade": false,
"faces": {
"north": {"uv": [6, 11, 7, 12], "texture": "#state"}
}
},
{
"name": "Cell Light",
"from": [9, 4, 0],
"to": [10, 5, 0],
"shade": false,
"faces": {
"north": {"uv": [1, 7, 2, 8], "texture": "#top_front"}
}
}
]
}
"textures": {
"backdrop": "appliedenergistics2:blocks/chest/cell_state_backdrop",
"state": "appliedenergistics2:blocks/chest/cell_state_full"
},
"elements": [
{
"from": [5, 4, 0],
"to": [11, 6, 1],
"faces": {
"north": { "uv": [5, 10, 11, 12], "texture": "#backdrop" },
"up": { "uv": [5, 9, 11, 10], "texture": "#backdrop" }
}
},
{
"from": [0, 0, 0],
"to": [16, 16, 16],
"faces": {
"north": { "uv": [0, 0, 16, 16], "texture": "#state" }
}
}
]
}
@@ -1,17 +1,15 @@
{
"credit": "Made with Blockbench",
"textures": {
"front": "appliedenergistics2:blocks/chest/cell_state_offline"
},
"elements": [
{
"from": [5, 4, 0],
"to": [11, 6, 1],
"shade": false,
"faces": {
"north": {"uv": [5, 10, 11, 12], "texture": "#front"},
"up": {"uv": [5, 10, 11, 11], "texture": "#front"}
}
}
]
}
"textures": {
"state": "appliedenergistics2:blocks/chest/cell_state_offline"
},
"elements": [
{
"from": [5, 4, 0],
"to": [11, 6, 1],
"faces": {
"north": { "uv": [5, 10, 11, 12], "texture": "#state" },
"up": { "uv": [5, 9, 11, 10], "texture": "#state" }
}
}
]
}
@@ -1,38 +1,23 @@
{
"ae2_uvl_marker": true,
"parent": "block/block",
"textures": {
"front": "appliedenergistics2:blocks/chest/cell_state_backdrop",
"state": "appliedenergistics2:blocks/chest/cell_state_online",
"top_front": "appliedenergistics2:blocks/drive_cell_states_emissive"
},
"elements": [
{
"name": "Cell Backdrop",
"from": [5, 4, 0],
"to": [11, 6, 1],
"shade": false,
"faces": {
"north": {"uv": [5, 10, 11, 12], "texture": "#front"},
"up": {"uv": [5, 10, 11, 11], "texture": "#front"}
}
},
{
"name": "Cell Light",
"from": [9, 4, 0],
"to": [10, 5, 0],
"shade": false,
"faces": {
"north": {"uv": [6, 11, 7, 12], "texture": "#state"}
}
},
{
"name": "Cell Light",
"from": [9, 4, 0],
"to": [10, 5, 0],
"faces": {
"north": {"uv": [1, 3, 2, 4], "texture": "#top_front"}
}
}
]
}
"textures": {
"backdrop": "appliedenergistics2:blocks/chest/cell_state_backdrop",
"state": "appliedenergistics2:blocks/chest/cell_state_online"
},
"elements": [
{
"from": [5, 4, 0],
"to": [11, 6, 1],
"faces": {
"north": { "uv": [5, 10, 11, 12], "texture": "#backdrop" },
"up": { "uv": [5, 9, 11, 10], "texture": "#backdrop" }
}
},
{
"from": [0, 0, 0],
"to": [16, 16, 16],
"faces": {
"north": { "uv": [0, 0, 16, 16], "texture": "#state" }
}
}
]
}
@@ -1,38 +1,23 @@
{
"credit": "Made with Blockbench",
"textures": {
"front": "appliedenergistics2:blocks/chest/cell_state_backdrop",
"state": "appliedenergistics2:blocks/chest/cell_state_types_full",
"top_front": "appliedenergistics2:blocks/drive_cell_states_emissive"
},
"elements": [
{
"name": "Cell Backdrop",
"from": [5, 4, 0],
"to": [11, 6, 1],
"shade": false,
"faces": {
"north": {"uv": [5, 10, 11, 12], "texture": "#front"},
"up": {"uv": [5, 10, 11, 11], "texture": "#front"}
}
},
{
"name": "Cell Light",
"from": [9, 4, 0],
"to": [10, 5, 0],
"shade": false,
"faces": {
"north": {"uv": [6, 11, 7, 12], "texture": "#state"}
}
},
{
"name": "Cell Light",
"from": [9, 4, 0],
"to": [10, 5, 0],
"shade": false,
"faces": {
"north": {"uv": [1, 5, 2, 6], "texture": "#top_front"}
}
}
]
}
"textures": {
"backdrop": "appliedenergistics2:blocks/chest/cell_state_backdrop",
"state": "appliedenergistics2:blocks/chest/cell_state_types_full"
},
"elements": [
{
"from": [5, 4, 0],
"to": [11, 6, 1],
"faces": {
"north": { "uv": [5, 10, 11, 12], "texture": "#backdrop" },
"up": { "uv": [5, 9, 11, 10], "texture": "#backdrop" }
}
},
{
"from": [0, 0, 0],
"to": [16, 16, 16],
"faces": {
"north": { "uv": [0, 0, 16, 16], "texture": "#state" }
}
}
]
}
@@ -1,25 +1,17 @@
{
"textures": {
"lights": "appliedenergistics2:blocks/chest/lights_off"
},
"elements": [
{
"from": [
0,
0,
0
],
"to": [
16,
16,
16
],
"faces": {
"up": {
"texture": "#lights",
"tintindex": 3
}
}
"textures": {
"lights": "appliedenergistics2:blocks/chest/lights_off"
},
"elements": [
{
"from": [0, 0, 0],
"to": [16, 16, 16],
"faces": {
"up": {
"texture": "#lights",
"tintindex": 3
}
]
}
}
}
]
}
@@ -1,79 +1,54 @@
{
"ae2_uvl_marker": true,
"textures": {
"lights_bright": "appliedenergistics2:blocks/chest/lights_on_bright",
"lights_medium": "appliedenergistics2:blocks/chest/lights_on_medium",
"lights_dark": "appliedenergistics2:blocks/chest/lights_on_dark"
},
"elements": [
{
"from": [
0,
0,
0
],
"to": [
16,
16,
16
],
"faces": {
"up": {
"texture": "#lights_bright",
"tintindex": 3,
"unlit": true,
"uvlightmap": {
"block": 15,
"sky": 15
}
}
}
},
{
"from": [
0,
0,
0
],
"to": [
16,
16,
16
],
"faces": {
"up": {
"texture": "#lights_medium",
"tintindex": 2,
"unlit": true,
"uvlightmap": {
"block": 15,
"sky": 15
}
}
}
},
{
"from": [
0,
0,
0
],
"to": [
16,
16,
16
],
"faces": {
"up": {
"texture": "#lights_dark",
"tintindex": 1,
"unlit": true,
"uvlightmap": {
"block": 15,
"sky": 15
}
}
}
"textures": {
"lights_bright": "appliedenergistics2:blocks/chest/lights_on_bright",
"lights_medium": "appliedenergistics2:blocks/chest/lights_on_medium",
"lights_dark": "appliedenergistics2:blocks/chest/lights_on_dark"
},
"elements": [
{
"from": [0, 0, 0],
"to": [16, 16, 16],
"faces": {
"up": {
"texture": "#lights_bright",
"tintindex": 3,
"unlit": true,
"uvlightmap": {
"block": 15,
"sky": 15
}
}
]
}
}
},
{
"from": [0, 0, 0],
"to": [16, 16, 16],
"faces": {
"up": {
"texture": "#lights_medium",
"tintindex": 2,
"unlit": true,
"uvlightmap": {
"block": 15,
"sky": 15
}
}
}
},
{
"from": [0, 0, 0],
"to": [16, 16, 16],
"faces": {
"up": {
"texture": "#lights_dark",
"tintindex": 1,
"unlit": true,
"uvlightmap": {
"block": 15,
"sky": 15
}
}
}
}
]
}
@@ -1,284 +1,261 @@
{
"parent": "block/block",
"ambientocclusion": false,
"textures": {
"particle": "appliedenergistics2:blocks/drive_side",
"side": "appliedenergistics2:blocks/drive_side",
"bottom": "appliedenergistics2:blocks/drive_bottom",
"top": "appliedenergistics2:blocks/drive_top",
"front": "appliedenergistics2:blocks/drive_front"
},
"elements": [
{
"name": "Right Side Panel",
"from": [0, 1, 0],
"to": [2, 15, 16],
"faces": {
"north": {
"uv": [15, 1, 16, 15],
"texture": "#front",
"cullface": "north"
},
"east": {
"uv": [0, 2, 16, 14],
"rotation": 180,
"texture": "#bottom",
"cullface": "north"
},
"south": {
"uv": [0, 1, 1, 15],
"texture": "#side",
"cullface": "south"
},
"west": {
"uv": [0, 1, 16, 15],
"texture": "#side",
"cullface": "west"
}
}
},
{
"name": "Left Side Panel",
"from": [14, 1, 0],
"to": [16, 15, 16],
"faces": {
"north": {
"uv": [0, 1, 1, 15],
"texture": "#front",
"cullface": "north"
},
"east": {
"uv": [0, 1, 16, 15],
"texture": "#side",
"cullface": "east"
},
"south": {
"uv": [15, 1, 16, 15],
"texture": "#side",
"cullface": "south"
},
"west": {
"uv": [0, 2, 16, 14],
"texture": "#bottom",
"cullface": "north"
}
}
},
{
"name": "Back Panel",
"from": [2, 1, 7],
"to": [14, 15, 16],
"rotation": {
"angle": 0,
"axis": "y",
"origin": [8, 8, 9]
},
"faces": {
"north": {
"uv": [13, 2, 14, 13],
"texture": "#bottom"
},
"south": {
"uv": [1, 1, 15, 15],
"texture": "#side",
"cullface": "south"
}
}
},
{
"name": "Bottom Panel",
"from": [0, 0, 0],
"to": [16, 1, 16],
"faces": {
"north": {
"uv": [0, 15, 16, 16],
"texture": "#front",
"cullface": "north"
},
"east": {
"uv": [0, 15, 16, 16],
"texture": "#side",
"cullface": "east"
},
"south": {
"uv": [0, 15, 16, 16],
"texture": "#side",
"cullface": "south"
},
"west": {
"uv": [0, 15, 16, 16],
"texture": "#side",
"cullface": "west"
},
"up": {
"uv": [0, 2, 16, 14],
"rotation": 90,
"texture": "#bottom",
"cullface": "north"
},
"down": {
"uv": [0, 0, 16, 16],
"texture": "#bottom",
"cullface": "down"
}
}
},
{
"name": "Top Panel",
"from": [0, 15, 0],
"to": [16, 16, 16],
"faces": {
"north": {
"uv": [0, 0, 16, 1],
"texture": "#front",
"cullface": "north"
},
"east": {
"uv": [0, 0, 16, 1],
"texture": "#side",
"cullface": "east"
},
"south": {
"uv": [0, 0, 16, 1],
"texture": "#side",
"cullface": "south"
},
"west": {
"uv": [0, 0, 16, 1],
"texture": "#side",
"cullface": "west"
},
"up": {
"uv": [0, 0, 16, 16],
"texture": "#top",
"cullface": "up"
},
"down": {
"uv": [0, 2, 16, 14],
"rotation": 270,
"texture": "#bottom",
"cullface": "north"
}
}
},
{
"name": "Front Panel",
"from": [7, 1, 1],
"to": [9, 15, 7],
"faces": {
"north": {
"uv": [7, 1, 9, 15],
"texture": "#front",
"cullface": "north"
},
"east": {
"uv": [1, 2, 7, 14],
"rotation": 180,
"texture": "#bottom",
"cullface": "north"
},
"west": {
"uv": [1, 2, 7, 14],
"texture": "#bottom",
"cullface": "north"
}
}
},
{
"name": "Separator",
"from": [1, 3, 2],
"to": [15, 4, 7],
"faces": {
"north": {
"uv": [1, 12, 15, 13],
"texture": "#front",
"cullface": "north"
},
"up": {
"uv": [1, 2, 6, 14],
"rotation": 90,
"texture": "#bottom",
"cullface": "north"
},
"down": {
"uv": [1, 2, 6, 14],
"rotation": 270,
"texture": "#bottom",
"cullface": "north"
}
}
},
{
"name": "Separator",
"from": [1, 6, 2],
"to": [15, 7, 7],
"faces": {
"north": {
"uv": [1, 9, 15, 10],
"texture": "#front",
"cullface": "north"
},
"up": {
"uv": [1, 2, 6, 14],
"rotation": 90,
"texture": "#bottom",
"cullface": "north"
},
"down": {
"uv": [1, 2, 6, 14],
"rotation": 270,
"texture": "#bottom",
"cullface": "north"
}
}
},
{
"name": "Separator",
"from": [1, 9, 2],
"to": [15, 10, 7],
"faces": {
"north": {
"uv": [1, 6, 15, 7],
"texture": "#front",
"cullface": "north"
},
"up": {
"uv": [1, 2, 6, 14],
"rotation": 90,
"texture": "#bottom",
"cullface": "north"
},
"down": {
"uv": [1, 2, 6, 14],
"rotation": 270,
"texture": "#bottom",
"cullface": "north"
}
}
},
{
"name": "Separator",
"from": [1, 12, 2],
"to": [15, 13, 7],
"faces": {
"north": {
"uv": [1, 3, 15, 4],
"texture": "#front",
"cullface": "north"
},
"up": {
"uv": [1, 2, 6, 14],
"rotation": 90,
"texture": "#bottom",
"cullface": "north"
},
"down": {
"uv": [1, 2, 6, 14],
"rotation": 270,
"texture": "#bottom",
"cullface": "north"
}
}
}
]
"parent": "block/block",
"textures": {
"inside": "appliedenergistics2:blocks/drive_inside",
"particle": "appliedenergistics2:blocks/drive_side",
"side": "appliedenergistics2:blocks/drive_side",
"bottom": "appliedenergistics2:blocks/drive_bottom",
"top": "appliedenergistics2:blocks/drive_top",
"front": "appliedenergistics2:blocks/drive_front"
},
"elements": [
{
"name": "Right Side Panel",
"from": [0, 1, 0],
"to": [1, 15, 16],
"faces": {
"north": {
"uv": [15, 1, 16, 15],
"texture": "#front",
"cullface": "north"
},
"east": {
"uv": [0, 0, 16, 16],
"rotation": 180,
"texture": "#inside",
"cullface": "north"
},
"south": {
"uv": [0, 1, 1, 15],
"texture": "#side",
"cullface": "south"
},
"west": { "uv": [0, 1, 16, 15], "texture": "#side", "cullface": "west" }
}
},
{
"name": "Left Side Panel",
"from": [15, 1, 0],
"to": [16, 15, 16],
"faces": {
"north": {
"uv": [0, 1, 1, 15],
"texture": "#front",
"cullface": "north"
},
"east": {
"uv": [0, 1, 16, 15],
"texture": "#side",
"cullface": "east"
},
"south": {
"uv": [15, 1, 16, 15],
"texture": "#side",
"cullface": "south"
},
"west": {
"uv": [0, 0, 16, 16],
"texture": "#inside",
"cullface": "north"
}
}
},
{
"name": "Back Panel",
"from": [1, 1, 7],
"to": [15, 15, 16],
"rotation": { "angle": 0, "axis": "y", "origin": [8, 8, 9] },
"faces": {
"north": { "uv": [15, 1, 16, 15], "texture": "#inside" },
"south": {
"uv": [1, 1, 15, 15],
"texture": "#side",
"cullface": "south"
}
}
},
{
"name": "Bottom Panel",
"from": [0, 0, 0],
"to": [16, 1, 16],
"faces": {
"north": {
"uv": [0, 15, 16, 16],
"texture": "#front",
"cullface": "north"
},
"east": {
"uv": [0, 15, 16, 16],
"texture": "#side",
"cullface": "east"
},
"south": {
"uv": [0, 15, 16, 16],
"texture": "#side",
"cullface": "south"
},
"west": {
"uv": [0, 15, 16, 16],
"texture": "#side",
"cullface": "west"
},
"up": {
"uv": [0, 0, 16, 16],
"rotation": 90,
"texture": "#inside",
"cullface": "north"
},
"down": {
"uv": [0, 0, 16, 16],
"texture": "#bottom",
"cullface": "down"
}
}
},
{
"name": "Top Panel",
"from": [0, 15, 0],
"to": [16, 16, 16],
"faces": {
"north": {
"uv": [0, 0, 16, 1],
"texture": "#front",
"cullface": "north"
},
"east": { "uv": [0, 0, 16, 1], "texture": "#side", "cullface": "east" },
"south": {
"uv": [0, 0, 16, 1],
"texture": "#side",
"cullface": "south"
},
"west": { "uv": [0, 0, 16, 1], "texture": "#side", "cullface": "west" },
"up": { "uv": [0, 0, 16, 16], "texture": "#top", "cullface": "up" },
"down": {
"uv": [0, 0, 16, 16],
"rotation": 270,
"texture": "#inside",
"cullface": "north"
}
}
},
{
"name": "Middle Strut",
"from": [7, 1, 1],
"to": [9, 15, 7],
"faces": {
"north": {
"uv": [7, 1, 9, 15],
"texture": "#front",
"cullface": "north"
},
"east": {
"uv": [1, 1, 7, 15],
"rotation": 180,
"texture": "#inside",
"cullface": "north"
},
"west": {
"uv": [1, 1, 7, 15],
"texture": "#inside",
"cullface": "north"
}
}
},
{
"name": "Separator",
"from": [1, 3, 2],
"to": [15, 4, 7],
"faces": {
"north": {
"uv": [1, 12, 15, 13],
"texture": "#front",
"cullface": "north"
},
"up": {
"uv": [2, 1, 7, 15],
"rotation": 90,
"texture": "#inside",
"cullface": "north"
},
"down": {
"uv": [2, 1, 7, 15],
"rotation": 270,
"texture": "#inside",
"cullface": "north"
}
}
},
{
"name": "Separator",
"from": [1, 6, 2],
"to": [15, 7, 7],
"faces": {
"north": {
"uv": [1, 9, 15, 10],
"texture": "#front",
"cullface": "north"
},
"up": {
"uv": [2, 1, 7, 15],
"rotation": 90,
"texture": "#inside",
"cullface": "north"
},
"down": {
"uv": [2, 1, 7, 15],
"rotation": 270,
"texture": "#inside",
"cullface": "north"
}
}
},
{
"name": "Separator",
"from": [1, 9, 2],
"to": [15, 10, 7],
"faces": {
"north": {
"uv": [1, 6, 15, 7],
"texture": "#front",
"cullface": "north"
},
"up": {
"uv": [2, 1, 7, 15],
"rotation": 90,
"texture": "#inside",
"cullface": "north"
},
"down": {
"uv": [2, 1, 7, 15],
"rotation": 270,
"texture": "#inside",
"cullface": "north"
}
}
},
{
"name": "Separator",
"from": [1, 12, 2],
"to": [15, 13, 7],
"faces": {
"north": {
"uv": [1, 3, 15, 4],
"texture": "#front",
"cullface": "north"
},
"up": {
"uv": [2, 1, 7, 15],
"rotation": 90,
"texture": "#inside",
"cullface": "north"
},
"down": {
"uv": [2, 1, 7, 15],
"rotation": 270,
"texture": "#inside",
"cullface": "north"
}
}
}
]
}
@@ -1,4 +1,5 @@
{
"credit": "Made with Blockbench",
"textures": {
"front": "appliedenergistics2:blocks/drive_cell_states",
"top_front": "appliedenergistics2:blocks/drive_cell_states_emissive"
@@ -7,22 +8,22 @@
{
"name": "Cell Backdrop",
"from": [9, 13, 1],
"to": [14, 15, 2],
"to": [15, 15, 2],
"shade": false,
"faces": {
"north": {"uv": [0, 8, 5, 10], "texture": "#front"},
"up": {"uv": [0, 8, 5, 9], "texture": "#front"},
"down": {"uv": [5, 10, 0, 9], "texture": "#front"}
"north": {"uv": [0, 8, 6, 10], "texture": "#front"},
"up": {"uv": [0, 8, 6, 9], "texture": "#front"},
"down": {"uv": [6, 8, 0, 10], "texture": "#front"}
}
},
{
"name": "Cell Light",
"from": [9, 13, 1],
"to": [14, 15, 2],
"to": [15, 15, 2],
"shade": false,
"faces": {
"north": {"uv": [0, 6, 5, 8], "texture": "#top_front"},
"down": {"uv": [5, 8, 0, 7], "texture": "#top_front"}
"north": {"uv": [0, 6, 6, 8], "texture": "#top_front"},
"down": {"uv": [6, 6, 0, 8], "texture": "#top_front"}
}
}
]
@@ -1,4 +1,5 @@
{
"credit": "Made with Blockbench",
"ambientocclusion": false,
"textures": {
"front": "appliedenergistics2:blocks/drive_cell_states"
@@ -7,11 +8,12 @@
{
"name": "Cell Backdrop",
"from": [9, 13, 1],
"to": [14, 15, 2],
"to": [15, 15, 2],
"shade": false,
"faces": {
"north": {"uv": [0, 0, 5, 2], "texture": "#front"},
"up": {"uv": [0, 0, 5, 1], "texture": "#front"},
"down": {"uv": [5, 2, 0, 1], "texture": "#front"}
"north": {"uv": [0, 0, 6, 2], "texture": "#front"},
"up": {"uv": [0, 0, 6, 1], "texture": "#front"},
"down": {"uv": [6, 0, 0, 2], "texture": "#front"}
}
}
]
@@ -1,4 +1,5 @@
{
"credit": "Made with Blockbench",
"textures": {
"front": "appliedenergistics2:blocks/drive_cell_states",
"top_front": "appliedenergistics2:blocks/drive_cell_states_emissive"
@@ -7,22 +8,22 @@
{
"name": "Cell Backdrop",
"from": [9, 13, 1],
"to": [14, 15, 2],
"to": [15, 15, 2],
"shade": false,
"faces": {
"north": {"uv": [0, 8, 5, 10], "texture": "#front"},
"up": {"uv": [0, 8, 5, 9], "texture": "#front"},
"down": {"uv": [5, 10, 0, 9], "texture": "#front"}
"north": {"uv": [0, 8, 6, 10], "texture": "#front"},
"up": {"uv": [0, 8, 6, 9], "texture": "#front"},
"down": {"uv": [6, 8, 0, 10], "texture": "#front"}
}
},
{
"name": "Cell Light",
"from": [9, 13, 1],
"to": [14, 15, 2],
"to": [15, 15, 2],
"shade": false,
"faces": {
"north": {"uv": [0, 2, 5, 4], "texture": "#top_front"},
"down": {"uv": [5, 4, 0, 3], "texture": "#top_front"}
"north": {"uv": [0, 2, 6, 4], "texture": "#top_front"},
"down": {"uv": [6, 2, 0, 4], "texture": "#top_front"}
}
}
]
@@ -1,4 +1,5 @@
{
"credit": "Made with Blockbench",
"textures": {
"front": "appliedenergistics2:blocks/drive_cell_states",
"top_front": "appliedenergistics2:blocks/drive_cell_states_emissive"
@@ -7,22 +8,22 @@
{
"name": "Cell Backdrop",
"from": [9, 13, 1],
"to": [14, 15, 2],
"to": [15, 15, 2],
"shade": false,
"faces": {
"north": {"uv": [0, 8, 5, 10], "texture": "#front"},
"up": {"uv": [0, 8, 5, 9], "texture": "#front"},
"down": {"uv": [5, 10, 0, 9], "texture": "#front"}
"north": {"uv": [0, 8, 6, 10], "texture": "#front"},
"up": {"uv": [0, 8, 6, 9], "texture": "#front"},
"down": {"uv": [6, 8, 0, 10], "texture": "#front"}
}
},
{
"name": "Cell Light",
"from": [9, 13, 1],
"to": [14, 15, 2],
"to": [15, 15, 2],
"shade": false,
"faces": {
"north": {"uv": [0, 4, 5, 6], "texture": "#top_front"},
"down": {"uv": [5, 6, 0, 5], "texture": "#top_front"}
"north": {"uv": [0, 4, 6, 6], "texture": "#top_front"},
"down": {"uv": [6, 4, 0, 6], "texture": "#top_front"}
}
}
]
@@ -0,0 +1,261 @@
{
"parent": "block/block",
"textures": {
"inside": "appliedenergistics2:blocks/drive_inside",
"particle": "appliedenergistics2:blocks/drive_side",
"side": "appliedenergistics2:blocks/drive_side",
"bottom": "appliedenergistics2:blocks/drive_bottom",
"top": "appliedenergistics2:blocks/drive_top",
"front": "appliedenergistics2:blocks/drive_front"
},
"elements": [
{
"name": "Right Side Panel",
"from": [0, 1, 0],
"to": [1, 15, 16],
"faces": {
"north": {
"uv": [15, 1, 16, 15],
"texture": "#front",
"cullface": "north"
},
"east": {
"uv": [0, 0, 16, 16],
"rotation": 180,
"texture": "#inside",
"cullface": "north"
},
"south": {
"uv": [0, 1, 1, 15],
"texture": "#side",
"cullface": "south"
},
"west": { "uv": [0, 1, 16, 15], "texture": "#side", "cullface": "west" }
}
},
{
"name": "Left Side Panel",
"from": [15, 1, 0],
"to": [16, 15, 16],
"faces": {
"north": {
"uv": [0, 1, 1, 15],
"texture": "#front",
"cullface": "north"
},
"east": {
"uv": [0, 1, 16, 15],
"texture": "#side",
"cullface": "east"
},
"south": {
"uv": [15, 1, 16, 15],
"texture": "#side",
"cullface": "south"
},
"west": {
"uv": [0, 0, 16, 16],
"texture": "#inside",
"cullface": "north"
}
}
},
{
"name": "Back Panel",
"from": [1, 1, 7],
"to": [15, 15, 16],
"rotation": { "angle": 0, "axis": "y", "origin": [8, 8, 9] },
"faces": {
"north": { "uv": [15, 1, 16, 15], "texture": "#inside" },
"south": {
"uv": [1, 1, 15, 15],
"texture": "#side",
"cullface": "south"
}
}
},
{
"name": "Bottom Panel",
"from": [0, 0, 0],
"to": [16, 1, 16],
"faces": {
"north": {
"uv": [0, 15, 16, 16],
"texture": "#front",
"cullface": "north"
},
"east": {
"uv": [0, 15, 16, 16],
"texture": "#side",
"cullface": "east"
},
"south": {
"uv": [0, 15, 16, 16],
"texture": "#side",
"cullface": "south"
},
"west": {
"uv": [0, 15, 16, 16],
"texture": "#side",
"cullface": "west"
},
"up": {
"uv": [0, 0, 16, 16],
"rotation": 90,
"texture": "#inside",
"cullface": "north"
},
"down": {
"uv": [0, 0, 16, 16],
"texture": "#bottom",
"cullface": "down"
}
}
},
{
"name": "Top Panel",
"from": [0, 15, 0],
"to": [16, 16, 16],
"faces": {
"north": {
"uv": [0, 0, 16, 1],
"texture": "#front",
"cullface": "north"
},
"east": { "uv": [0, 0, 16, 1], "texture": "#side", "cullface": "east" },
"south": {
"uv": [0, 0, 16, 1],
"texture": "#side",
"cullface": "south"
},
"west": { "uv": [0, 0, 16, 1], "texture": "#side", "cullface": "west" },
"up": { "uv": [0, 0, 16, 16], "texture": "#top", "cullface": "up" },
"down": {
"uv": [0, 0, 16, 16],
"rotation": 270,
"texture": "#inside",
"cullface": "north"
}
}
},
{
"name": "Middle Strut",
"from": [7, 1, 1],
"to": [9, 15, 7],
"faces": {
"north": {
"uv": [7, 1, 9, 15],
"texture": "#front",
"cullface": "north"
},
"east": {
"uv": [1, 1, 7, 15],
"rotation": 180,
"texture": "#inside",
"cullface": "north"
},
"west": {
"uv": [1, 1, 7, 15],
"texture": "#inside",
"cullface": "north"
}
}
},
{
"name": "Separator",
"from": [1, 3, 2],
"to": [15, 4, 7],
"faces": {
"north": {
"uv": [1, 12, 15, 13],
"texture": "#front",
"cullface": "north"
},
"up": {
"uv": [2, 1, 7, 15],
"rotation": 90,
"texture": "#inside",
"cullface": "north"
},
"down": {
"uv": [2, 1, 7, 15],
"rotation": 270,
"texture": "#inside",
"cullface": "north"
}
}
},
{
"name": "Separator",
"from": [1, 6, 2],
"to": [15, 7, 7],
"faces": {
"north": {
"uv": [1, 9, 15, 10],
"texture": "#front",
"cullface": "north"
},
"up": {
"uv": [2, 1, 7, 15],
"rotation": 90,
"texture": "#inside",
"cullface": "north"
},
"down": {
"uv": [2, 1, 7, 15],
"rotation": 270,
"texture": "#inside",
"cullface": "north"
}
}
},
{
"name": "Separator",
"from": [1, 9, 2],
"to": [15, 10, 7],
"faces": {
"north": {
"uv": [1, 6, 15, 7],
"texture": "#front",
"cullface": "north"
},
"up": {
"uv": [2, 1, 7, 15],
"rotation": 90,
"texture": "#inside",
"cullface": "north"
},
"down": {
"uv": [2, 1, 7, 15],
"rotation": 270,
"texture": "#inside",
"cullface": "north"
}
}
},
{
"name": "Separator",
"from": [1, 12, 2],
"to": [15, 13, 7],
"faces": {
"north": {
"uv": [1, 3, 15, 4],
"texture": "#front",
"cullface": "north"
},
"up": {
"uv": [2, 1, 7, 15],
"rotation": 90,
"texture": "#inside",
"cullface": "north"
},
"down": {
"uv": [2, 1, 7, 15],
"rotation": 270,
"texture": "#inside",
"cullface": "north"
}
}
}
]
}
Binary file not shown.

Before

Width:  |  Height:  |  Size: 398 B

After

Width:  |  Height:  |  Size: 2.8 KiB

Binary file not shown.

Before

Width:  |  Height:  |  Size: 145 B

After

Width:  |  Height:  |  Size: 2.6 KiB

Binary file not shown.

Before

Width:  |  Height:  |  Size: 140 B

After

Width:  |  Height:  |  Size: 2.6 KiB

Binary file not shown.

Before

Width:  |  Height:  |  Size: 147 B

After

Width:  |  Height:  |  Size: 2.6 KiB

Binary file not shown.

Before

Width:  |  Height:  |  Size: 375 B

After

Width:  |  Height:  |  Size: 3.4 KiB

Binary file not shown.

Before

Width:  |  Height:  |  Size: 323 B

After

Width:  |  Height:  |  Size: 3.3 KiB

Binary file not shown.

Before

Width:  |  Height:  |  Size: 212 B

After

Width:  |  Height:  |  Size: 2.8 KiB

Binary file not shown.

Before

Width:  |  Height:  |  Size: 245 B

After

Width:  |  Height:  |  Size: 2.8 KiB

Binary file not shown.

Before

Width:  |  Height:  |  Size: 232 B

After

Width:  |  Height:  |  Size: 2.6 KiB

Binary file not shown.

Before

Width:  |  Height:  |  Size: 223 B

After

Width:  |  Height:  |  Size: 2.8 KiB

Binary file not shown.

Before

Width:  |  Height:  |  Size: 342 B

After

Width:  |  Height:  |  Size: 3.3 KiB

Binary file not shown.

Before

Width:  |  Height:  |  Size: 325 B

After

Width:  |  Height:  |  Size: 2.9 KiB

Binary file not shown.

Before

Width:  |  Height:  |  Size: 278 B

After

Width:  |  Height:  |  Size: 2.9 KiB

Binary file not shown.

Before

Width:  |  Height:  |  Size: 398 B

After

Width:  |  Height:  |  Size: 2.8 KiB

Binary file not shown.

Before

Width:  |  Height:  |  Size: 182 B

After

Width:  |  Height:  |  Size: 2.1 KiB

Binary file not shown.

Before

Width:  |  Height:  |  Size: 442 B

After

Width:  |  Height:  |  Size: 3.8 KiB

Binary file not shown.

Before

Width:  |  Height:  |  Size: 274 B

After

Width:  |  Height:  |  Size: 3.7 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 2.8 KiB

Binary file not shown.

Before

Width:  |  Height:  |  Size: 438 B

After

Width:  |  Height:  |  Size: 3.3 KiB

Binary file not shown.

Before

Width:  |  Height:  |  Size: 398 B

After

Width:  |  Height:  |  Size: 3.3 KiB