Compare commits

...

32 Commits

Author SHA1 Message Date
yueh dfcba264f3 Fixes #3880: Incorrect compare with empty itemstack. (#3882) 2018-12-25 21:21:19 +01:00
yueh d343ac47f5 Added CTM as actual soft dependency. (#3881) 2018-12-25 21:21:08 +01:00
yueh 05db930a4e Fixes #3821: Unconfigured level emitter now report all fluids. (#3875) 2018-12-24 14:44:40 +01:00
yueh 33bc0a6a3f Fixes #3776: Fixes dupe bug with cell upgrades. (#3874) 2018-12-24 14:11:45 +01:00
yueh f2f48a8d59 Fixes #3767: Fluid Annihilation plane too strict about leftover (#3872) 2018-12-23 23:33:15 +01:00
yueh 0f0af2349b Fixes #3866: Use blockstates to avoid the missing fluid block. (#3869) 2018-12-23 22:42:25 +01:00
yueh 32a4fcab77 Fixes #3768: Damageable items with nbt and without damage could crash. (#3867) 2018-12-23 22:42:09 +01:00
yueh a847a01d8a Feature #3832: Made onRequestChange() less ambiguous (#3833) 2018-12-23 22:41:52 +01:00
yueh ed643787df Updated gradle scripts (#3871)
Includes #3819
2018-12-23 22:41:11 +01:00
covers1624 524b26d2a2 Implement caching for facade item models. 2018-12-19 12:46:43 +01:00
covers1624 184b1f8efb Guard against models providing quads with null orientations. 2018-12-19 12:46:43 +01:00
E. Kim 06cca13087 Update ko_kr.lang (#3674) 2018-11-17 10:31:29 +01:00
徐晨曦 8e735e72ff Update zh_cn.lang (#3570) 2018-11-17 10:31:01 +01:00
yueh d3dd137570 Fixes #3817: Missing 1k Crafting Storage and Monitor from Network Status (#3818) 2018-11-11 13:11:45 +01:00
yueh 78e1126c38 Fixes #3814: IO Port no longer put to sleep on load when having work. (#3816) 2018-11-11 11:52:13 +01:00
yueh ebe3ff045d Fixes #3811: Display crafting unit as themself in the network monitor. (#3815) 2018-11-11 11:52:03 +01:00
yueh 6291a545c3 Fixes #3793: Limit filling fluid inventories to their max capacity. (#3794) 2018-10-21 11:18:02 +02:00
yueh 99fd5a9d53 Fixes #3790: Correctly handle fluids with NBT data. (#3791) 2018-10-21 11:17:27 +02:00
yueh 416c7d2683 Input P2P tunnels can now be assigned a new frequency. (#3765)
Shift right clicking an existing tunnel only allowed to copied the
stored frequency.

When shift right clicking now and the stored frequency being the same as
already stored one, it will now create a new one and save it to the memory
card. In other words doubling clicking will reset now, otherwise the old
behaviour is still kept.
2018-10-21 11:17:01 +02:00
yueh 0c88d1e7ee Fixes #3746: Revert OreDict use for cable anchors. Blame Forge for crashes. (#3764) 2018-10-06 00:02:41 +02:00
fscan d88f550eb0 Switch to new IItemHandler (#3669) 2018-10-04 20:39:06 +02:00
yueh e21c59b326 Fixes #3146: Prevent crash when GlassState is missing. (#3758) 2018-10-04 19:33:10 +02:00
yueh d8af8d26be Updated to new Forge RB (#3760) 2018-10-04 19:32:47 +02:00
yueh 02426bc101 Update bug_report.md
Fixed missing *
2018-10-02 17:38:22 +02:00
yueh 11f8471772 Updated issue templates
Updated bug report
Added feature request
2018-10-01 13:12:44 +02:00
yueh d35b720a16 Update issue templates (#3751) 2018-10-01 13:00:07 +02:00
mezz 7a5b84c10a Allow JEI to differentiate between different cable facades (#3750) 2018-10-01 11:18:38 +02:00
covers1624 800860d4e6 Fixes #3747: Fix issues with facade breaking textures. (#3748) 2018-10-01 11:12:38 +02:00
yueh ac81418684 Changed some fluid recipes to match their item variant. (#3744) 2018-09-28 18:25:05 +02:00
yueh 7daad58607 Fixes #3742: Do not use storableInStorageCell() to identify generic c… (#3743)
Annotated IStorageCell with Nonnull where appropriate.
2018-09-28 17:38:08 +02:00
yueh 038ca23523 Fixes #3688: Invalidate Storage Bus cache immediately upon missing TE. (#3737) 2018-09-28 17:36:58 +02:00
yueh 37d8833b95 Fixes #3708: Move knifes/wrenches to oredict as constants are unreliable (#3729) 2018-09-22 20:14:28 +02:00
58 changed files with 1135 additions and 836 deletions
+30
View File
@@ -0,0 +1,30 @@
---
name: Bug report
about: You found a bug or encountered a crash? Please report it here.
---
<!-- Provide a summary of the issue in the Title above, please do not "[Tag]" it. -->
**Describe the bug**
<!-- Always use the most recent version from ae-mod.info, it might already be fixed. -->
**To Reproduce**
<!-- Please provide the steps to reproduce it, otherwise we might not be able to fix it. -->
**Expected behavior**
<!-- A clear and concise description of what you expected to happen. -->
**Additional context**
<!-- Screenshots, crashlogs, etc. -->
<!-- A complete crashlog is required when reporting a crash. No excerpts. -->
<!-- Please use pastebin or gist for posting the complete crashlog. -->
**Environment**
<!-- Include as many relevant details about the environment -->
<!-- Like the used version, SP/MP, other mods and their version -->
<!-- The following ones are required, please note "latest" is not a version -->
- Minecraft Version:
- AE2 Version:
- Forge Version:
+17
View File
@@ -0,0 +1,17 @@
---
name: Feature Request
about: A feature request or suggestion to improve Applied Energistics 2
---
<!-- Provide a summary of the issue in the Title above, please do not "[Tag]" it. -->
**Describe the feature**
<!-- Tell us how it should work. -->
**Reasons why it should be considered**
<!-- This can help us in various degrees, e.g. to determine if it fits our design ideas. -->
**Additional Context**
<!-- Use this for further details, e.g. screenshots, links to mods for integrations. -->
<!-- Features will only be considered for the latest/next version. -->
+4 -4
View File
@@ -1,4 +1,4 @@
aeversion=rv5
aeversion=rv6
aechannel=alpha
aebuild=0
aegroup=appeng
@@ -9,7 +9,7 @@ aebasename=appliedenergistics2
#########################################################
minecraft_version=1.12.2
mcp_mappings=snapshot_20171003
forge_version=14.23.3.2655
forge_version=14.23.5.2768
#########################################################
# Installable #
@@ -19,14 +19,14 @@ hwyla_version=1.8.26-B41_1.12.2
#########################################################
# Provided APIs #
#########################################################
jei_version=4.10.0.198
jei_version=4.13.0.219
tesla_version=1.0.63
ic2_version=2.8.73-ex112
top_version=1.12-1.4.23-16
cofhcore_version=1.12.2-4.5.2.19
crafttweaker_version=4.1.8.9
inventorytweaks_version=1.63
ctm_version=0.3.0.15
ctm_version=MC1.12.2-0.3.1.16
#########################################################
# Deployment #
+24 -16
View File
@@ -24,36 +24,44 @@ allprojects {
}
javadoc {
options.encoding = 'UTF-8'
options.charSet = 'UTF-8'
options.encoding = 'UTF-8'
options.charSet = 'UTF-8'
}
task javadocs(type: Javadoc) {
source = sourceSets.api.java
include "appeng/api/**"
source = sourceSets.api.java
include "appeng/api/**"
// Due to ForgeGradle having to be a special snowflake,
// we have to add some custom configurations to the normal compile configuration and hope it does not break.
classpath = configurations.compile + configurations.forgeGradleMc + configurations.forgeGradleMcDeps
// Due to ForgeGradle having to be a special snowflake,
// we have to add some custom configurations to the normal compile configuration and hope it does not break.
classpath = configurations.compile + configurations.forgeGradleMc + configurations.forgeGradleMcDeps
}
task javadocJar(type: Jar, dependsOn: javadocs) {
from javadoc.destinationDir
classifier = 'javadoc'
classifier = 'javadoc'
}
task apiJar(type: Jar) {
from sourceSets.api.java
include "appeng/api/**"
from sourceSets.api.java
include "appeng/api/**"
from sourceSets.api.output
include "appeng/api/**"
from sourceSets.api.output
include "appeng/api/**"
classifier = 'api'
classifier = 'api'
}
task sourceJar(type: Jar, overwrite: true) {
from sourceSets.api.allSource
from sourceSets.main.allSource
classifier = 'sources'
}
artifacts {
archives apiJar
archives javadocJar
archives sourceJar
archives apiJar
archives javadocJar
archives sourceJar
}
+1 -1
View File
@@ -94,7 +94,7 @@ dependencies {
compileOnly "cofh:CoFHCore:${cofhcore_version}:deobf"
compileOnly "CraftTweaker2:CraftTweaker2-API:${crafttweaker_version}"
compileOnly "inventory-tweaks:InventoryTweaks:${inventorytweaks_version}:api"
compileOnly "team.chisel.ctm:CTM:MC1.12-${ctm_version}"
compileOnly "team.chisel.ctm:CTM:${ctm_version}"
// at runtime, use the full JEI jar
runtime "mezz.jei:jei_${minecraft_version}:${jei_version}"
@@ -24,6 +24,8 @@
package appeng.api.implementations.items;
import javax.annotation.Nonnull;
import net.minecraft.item.ItemStack;
import appeng.api.storage.ICellWorkbenchItem;
@@ -52,7 +54,7 @@ public interface IStorageCell<T extends IAEStack<T>> extends ICellWorkbenchItem
*
* @return number of bytes
*/
int getBytes( ItemStack cellItem );
int getBytes( @Nonnull ItemStack cellItem );
/**
* Determines the number of bytes used for any type included on the cell.
@@ -61,7 +63,7 @@ public interface IStorageCell<T extends IAEStack<T>> extends ICellWorkbenchItem
*
* @return number of bytes
*/
int getBytesPerType( ItemStack cellItem );
int getBytesPerType( @Nonnull ItemStack cellItem );
/**
* Must be between 1 and 63, indicates how many types you want to store on
@@ -71,7 +73,7 @@ public interface IStorageCell<T extends IAEStack<T>> extends ICellWorkbenchItem
*
* @return number of types
*/
int getTotalTypes( ItemStack cellItem );
int getTotalTypes( @Nonnull ItemStack cellItem );
/**
* Allows you to fine tune which items are allowed on a given cell, if you
@@ -83,7 +85,7 @@ public interface IStorageCell<T extends IAEStack<T>> extends ICellWorkbenchItem
*
* @return true to preventAdditionOfItem
*/
boolean isBlackListed( ItemStack cellItem, T requestedAddition );
boolean isBlackListed( @Nonnull ItemStack cellItem, @Nonnull T requestedAddition );
/**
* Allows you to specify if this storage cell can be stored inside other
@@ -104,7 +106,7 @@ public interface IStorageCell<T extends IAEStack<T>> extends ICellWorkbenchItem
*
* @return if the ItemStack should behavior as a storage cell.
*/
boolean isStorageCell( ItemStack i );
boolean isStorageCell( @Nonnull ItemStack i );
/**
* @return drain in ae/t this storage cell will use.
@@ -114,5 +116,6 @@ public interface IStorageCell<T extends IAEStack<T>> extends ICellWorkbenchItem
/**
* @return the type of channel your cell should be part of
*/
@Nonnull
IStorageChannel<T> getChannel();
}
@@ -29,5 +29,5 @@ package appeng.api.implementations.items;
*/
public enum MemoryCardMessages
{
INVALID_MACHINE, SETTINGS_LOADED, SETTINGS_SAVED, SETTINGS_CLEARED
INVALID_MACHINE, SETTINGS_LOADED, SETTINGS_SAVED, SETTINGS_RESET, SETTINGS_CLEARED
}
@@ -99,9 +99,18 @@ public interface ICraftingGrid extends IGridCache
/**
* is this item being crafted?
*
* @param aeStackInSlot item being crafted
* @param what item being crafted
*
* @return true if it is being crafting
*/
boolean isRequesting( IAEItemStack aeStackInSlot );
boolean isRequesting( IAEItemStack what );
/**
* The total amount being requested across all crafting cpus of a grid.
*
* @param what item being requested, ignores stacksize
*
* @return The total amount being requested.
*/
long requesting( IAEItemStack what );
}
@@ -45,6 +45,7 @@ public class FacadeBakedItemModel extends DelegateBakedModel
private final ItemStack textureStack;
private final FacadeBuilder facadeBuilder;
private List<BakedQuad> quads = null;
protected FacadeBakedItemModel( IBakedModel base, ItemStack textureStack, FacadeBuilder facadeBuilder )
{
@@ -60,9 +61,13 @@ public class FacadeBakedItemModel extends DelegateBakedModel
{
return Collections.emptyList();
}
List<BakedQuad> quads = new ArrayList<>();
quads.addAll( this.facadeBuilder.buildFacadeItemQuads( this.textureStack, EnumFacing.NORTH ) );
quads.addAll( this.getBaseModel().getQuads( state, side, rand ) );
if( quads == null )
{
quads = new ArrayList<>();
quads.addAll( this.facadeBuilder.buildFacadeItemQuads( this.textureStack, EnumFacing.NORTH ) );
quads.addAll( this.getBaseModel().getQuads( state, side, rand ) );
quads = Collections.unmodifiableList( quads );
}
return quads;
}
@@ -21,9 +21,12 @@ package appeng.client.render;
import java.util.Collections;
import java.util.List;
import java.util.Objects;
import javax.annotation.Nullable;
import it.unimi.dsi.fastutil.ints.Int2ObjectArrayMap;
import it.unimi.dsi.fastutil.ints.Int2ObjectMap;
import net.minecraft.block.state.IBlockState;
import net.minecraft.client.renderer.block.model.BakedQuad;
import net.minecraft.client.renderer.block.model.IBakedModel;
@@ -47,6 +50,7 @@ public class FacadeDispatcherBakedModel extends DelegateBakedModel
{
private final VertexFormat format;
private final FacadeBuilder facadeBuilder;
private final Int2ObjectMap<FacadeBakedItemModel> cache = new Int2ObjectArrayMap<>();
public FacadeDispatcherBakedModel( IBakedModel baseModel, VertexFormat format, FacadeBuilder facadeBuilder )
{
@@ -91,7 +95,15 @@ public class FacadeDispatcherBakedModel extends DelegateBakedModel
ItemStack textureItem = itemFacade.getTextureItem( stack );
return new FacadeBakedItemModel( FacadeDispatcherBakedModel.this.getBaseModel(), textureItem, FacadeDispatcherBakedModel.this.facadeBuilder );
int hash = Objects.hash( textureItem.getItem().getRegistryName(), textureItem.getMetadata(), textureItem.getTagCompound() );
FacadeBakedItemModel model = FacadeDispatcherBakedModel.this.cache.get( hash );
if( model == null )
{
model = new FacadeBakedItemModel(FacadeDispatcherBakedModel.this.getBaseModel(), textureItem, FacadeDispatcherBakedModel.this.facadeBuilder);
FacadeDispatcherBakedModel.this.cache.put(hash, model);
}
return model;
}
};
}
@@ -67,8 +67,8 @@ import appeng.thirdparty.codechicken.lib.model.pipeline.transformers.QuadTinter;
public class FacadeBuilder
{
public static double THICK_THICKNESS = 2D / 16D;
public static double THIN_THICKNESS = 1D / 16D;
public static final double THICK_THICKNESS = 2D / 16D;
public static final double THIN_THICKNESS = 1D / 16D;
public static final AxisAlignedBB[] THICK_FACADE_BOXES = new AxisAlignedBB[] {
new AxisAlignedBB( 0.0, 0.0, 0.0, 1.0, THICK_THICKNESS, 1.0 ),
@@ -141,7 +141,7 @@ public class FacadeBuilder
IBlockState blockState = facadeRenderState.getSourceBlock();
// If we aren't forcing transparency let the block decide if it should render.
if( !transparent )
if( !transparent && layer != null )
{
if( !blockState.getBlock().canRenderInLayer( blockState, layer ) )
{
@@ -224,7 +224,7 @@ public class FacadeBuilder
List<BakedQuad> modelQuads = new ArrayList<>();
// If we are forcing transparent facades, fake the render layer, and grab all quads.
if( transparent )
if( transparent || layer == null )
{
for( BlockRenderLayer forcedLayer : BlockRenderLayer.values() )
{
@@ -100,15 +100,18 @@ class GlassBakedModel implements IBakedModel
@Override
public List<BakedQuad> getQuads( @Nullable IBlockState state, @Nullable EnumFacing side, long rand )
{
if( !( state instanceof IExtendedBlockState ) || side == null )
{
return Collections.emptyList();
}
IExtendedBlockState extState = (IExtendedBlockState) state;
final IExtendedBlockState extState = (IExtendedBlockState) state;
final GlassState glassState = extState.getValue( BlockQuartzGlass.GLASS_STATE );
GlassState glassState = extState.getValue( BlockQuartzGlass.GLASS_STATE );
if( glassState == null )
{
return Collections.emptyList();
}
final int cx = Math.abs( glassState.getX() % 10 );
final int cy = Math.abs( glassState.getY() % 10 );
@@ -125,12 +128,12 @@ class GlassBakedModel implements IBakedModel
v /= 2;
}
TextureAtlasSprite glassTexture = this.glassTextures[texIdx];
final TextureAtlasSprite glassTexture = this.glassTextures[texIdx];
// Render the glass side
List<BakedQuad> quads = new ArrayList<>( 5 ); // At most 5
final List<BakedQuad> quads = new ArrayList<>( 5 ); // At most 5
List<Vec3d> corners = RenderHelper.getFaceCorners( side );
final List<Vec3d> corners = RenderHelper.getFaceCorners( side );
quads.add( this.createQuad( side, corners, glassTexture, u, v ) );
/*
@@ -143,8 +146,9 @@ class GlassBakedModel implements IBakedModel
* Converted to a number, this bitmask is 5. So the texture at index 5 is used.
* That texture had "0101" in its filename to indicate this.
*/
int edgeBitmask = makeBitmask( glassState, side );
TextureAtlasSprite sideSprite = this.frameTextures[edgeBitmask];
final int edgeBitmask = makeBitmask( glassState, side );
final TextureAtlasSprite sideSprite = this.frameTextures[edgeBitmask];
if( sideSprite != null )
{
quads.add( this.createQuad( side, corners, sideSprite, 0, 0 ) );
@@ -462,7 +462,6 @@ public abstract class AEBaseContainer extends Container
else if( destination.isEmpty() )
{
cs.putStack( tis.copy() );
cs.onSlotChanged();
this.updateSlot( cs );
break;
}
@@ -47,7 +47,7 @@ import appeng.container.slot.SlotRestrictedInput;
import appeng.tile.misc.TileCellWorkbench;
import appeng.util.Platform;
import appeng.util.helpers.ItemHandlerUtil;
import appeng.util.inv.WrapperLazyItemHandler;
import appeng.util.inv.WrapperSupplierItemHandler;
import appeng.util.iterators.NullIterator;
@@ -97,7 +97,7 @@ public class ContainerCellWorkbench extends ContainerUpgradeable
this.addSlotToContainer( new SlotRestrictedInput( SlotRestrictedInput.PlacableItemType.WORKBENCH_CELL, cell, 0, 152, 8, this.getPlayerInv() ) );
final IItemHandler inv = this.getUpgradeable().getInventoryByName( "config" );
final WrapperLazyItemHandler upgradeInventory = new WrapperLazyItemHandler( this::getCellUpgradeInventory );
final WrapperSupplierItemHandler upgradeInventory = new WrapperSupplierItemHandler( this::getCellUpgradeInventory );
// null, 3 * 8 );
int offset = 0;
@@ -87,7 +87,7 @@ public class AppEngSlot extends Slot
{
if( this.isSlotEnabled() )
{
return ItemHandlerUtil.isItemValidForSlot( this.itemHandler, this.index, par1ItemStack );
return this.itemHandler.isItemValid( this.index, par1ItemStack );
}
return false;
}
@@ -121,7 +121,6 @@ public class AppEngSlot extends Slot
if( this.isSlotEnabled() )
{
ItemHandlerUtil.setStackInSlot( this.itemHandler, this.index, stack );
this.onSlotChanged();
if( this.getContainer() != null )
{
@@ -138,7 +137,6 @@ public class AppEngSlot extends Slot
@Override
public void onSlotChanged()
{
ItemHandlerUtil.markDirty( this.itemHandler, this.index );
this.setIsValid( hasCalculatedValidness.NotAvailable );
}
+3 -1
View File
@@ -47,6 +47,8 @@ import net.minecraftforge.fml.common.event.FMLServerStoppedEvent;
import net.minecraftforge.fml.common.event.FMLServerStoppingEvent;
import net.minecraftforge.fml.common.network.NetworkRegistry;
import team.chisel.ctm.CTM;
import appeng.api.AEApi;
import appeng.core.crash.CrashInfo;
import appeng.core.crash.IntegrationCrashEnhancement;
@@ -81,7 +83,7 @@ public final class AppEng
private static final String FORGE_CURRENT_VERSION = ForgeVersion.majorVersion + "." + ForgeVersion.minorVersion + "." + ForgeVersion.revisionVersion + "." + ForgeVersion.buildVersion;
private static final String FORGE_MAX_VERSION = ( ForgeVersion.majorVersion + 1 ) + ".0.0.0";
public static final String MOD_DEPENDENCIES = "required-after:forge@[" + FORGE_CURRENT_VERSION + "," + FORGE_MAX_VERSION + ")";
public static final String MOD_DEPENDENCIES = "required-after:forge@[" + FORGE_CURRENT_VERSION + "," + FORGE_MAX_VERSION + ");after:ctm@[" + CTM.VERSION + ",);";
@Nonnull
private static final AppEng INSTANCE = new AppEng();
@@ -19,14 +19,17 @@
package appeng.core.api.definitions;
import net.minecraft.item.ItemStack;
import net.minecraft.util.ResourceLocation;
import net.minecraftforge.fml.common.registry.EntityEntryBuilder;
import net.minecraftforge.oredict.OreDictionary;
import appeng.api.definitions.IItemDefinition;
import appeng.api.definitions.IItems;
import appeng.api.util.AEColoredItemDefinition;
import appeng.bootstrap.FeatureFactory;
import appeng.bootstrap.components.IEntityRegistrationComponent;
import appeng.bootstrap.components.IOreDictComponent;
import appeng.client.render.crafting.ItemEncodedPatternRendering;
import appeng.core.CreativeTabFacade;
import appeng.core.features.AEFeature;
@@ -158,9 +161,13 @@ public final class ApiItems implements IItems
this.certusQuartzSword = certusTools.item( "certus_quartz_sword", () -> new ToolQuartzSword( AEFeature.CERTUS_QUARTZ_TOOLS ) )
.addFeatures( AEFeature.QUARTZ_SWORD )
.build();
this.certusQuartzWrench = certusTools.item( "certus_quartz_wrench", ToolQuartzWrench::new ).addFeatures( AEFeature.QUARTZ_WRENCH ).build();
this.certusQuartzWrench = certusTools.item( "certus_quartz_wrench", ToolQuartzWrench::new )
.addFeatures( AEFeature.QUARTZ_WRENCH )
.bootstrap( item -> (IOreDictComponent) side -> OreDictionary.registerOre( "itemQuartzWrench", new ItemStack( item ) ) )
.build();
this.certusQuartzKnife = certusTools.item( "certus_quartz_cutting_knife", () -> new ToolQuartzCuttingKnife( AEFeature.CERTUS_QUARTZ_TOOLS ) )
.addFeatures( AEFeature.QUARTZ_KNIFE )
.bootstrap( item -> (IOreDictComponent) side -> OreDictionary.registerOre( "itemQuartzKnife", new ItemStack( item ) ) )
.build();
FeatureFactory netherTools = registry.features( AEFeature.NETHER_QUARTZ_TOOLS );
@@ -179,9 +186,13 @@ public final class ApiItems implements IItems
this.netherQuartzSword = netherTools.item( "nether_quartz_sword", () -> new ToolQuartzSword( AEFeature.NETHER_QUARTZ_TOOLS ) )
.addFeatures( AEFeature.QUARTZ_SWORD )
.build();
this.netherQuartzWrench = netherTools.item( "nether_quartz_wrench", ToolQuartzWrench::new ).addFeatures( AEFeature.QUARTZ_WRENCH ).build();
this.netherQuartzWrench = netherTools.item( "nether_quartz_wrench", ToolQuartzWrench::new )
.addFeatures( AEFeature.QUARTZ_WRENCH )
.bootstrap( item -> (IOreDictComponent) side -> OreDictionary.registerOre( "itemQuartzWrench", new ItemStack( item ) ) )
.build();
this.netherQuartzKnife = netherTools.item( "nether_quartz_cutting_knife", () -> new ToolQuartzCuttingKnife( AEFeature.NETHER_QUARTZ_TOOLS ) )
.addFeatures( AEFeature.QUARTZ_KNIFE )
.bootstrap( item -> (IOreDictComponent) side -> OreDictionary.registerOre( "itemQuartzKnife", new ItemStack( item ) ) )
.build();
FeatureFactory powerTools = registry.features( AEFeature.POWERED_TOOLS );
@@ -29,6 +29,7 @@ public enum PlayerMessages
InvalidMachine,
LoadedSettings,
SavedSettings,
ResetSettings,
MachineNotPowered,
isNowLocked,
@@ -85,11 +85,11 @@ public class FluidCellConfig extends CellConfig
}
@Override
public boolean isItemValidForSlot( int slot, ItemStack stack )
public boolean isItemValid( int slot, ItemStack stack )
{
if( stack.isEmpty() || stack.getItem() instanceof FluidDummyItem )
{
super.isItemValidForSlot( slot, stack );
super.isItemValid( slot, stack );
}
FluidStack fluid = FluidUtil.getFluidContained( stack );
if( fluid == null || !Api.INSTANCE.definitions().items().dummyFluidItem().maybeStack( 1 ).isPresent() )
@@ -100,7 +100,7 @@ public class FluidCellConfig extends CellConfig
ItemStack is = Api.INSTANCE.definitions().items().dummyFluidItem().maybeStack( 1 ).get();
FluidDummyItem item = (FluidDummyItem) is.getItem();
item.setFluidStack( is, fluid );
return super.isItemValidForSlot( slot, is );
return super.isItemValid( slot, is );
}
}
@@ -304,7 +304,8 @@ public class PartFluidAnnihilationPlane extends PartBasicState implements IGridT
{
return false;
}
return inv.injectItems( stack, Actionable.SIMULATE, this.mySrc ) == null;
final IAEFluidStack leftOver = inv.injectItems( stack, Actionable.SIMULATE, this.mySrc );
return leftOver == null || leftOver.getStackSize() == 0;
}
}
catch( final GridAccessException e )
@@ -22,11 +22,13 @@ import appeng.api.networking.events.MENetworkChannelsChanged;
import appeng.api.networking.events.MENetworkEventSubscribe;
import appeng.api.networking.events.MENetworkPowerStatusChange;
import appeng.api.networking.security.IActionSource;
import appeng.api.networking.storage.IBaseMonitor;
import appeng.api.networking.storage.IStackWatcher;
import appeng.api.networking.storage.IStackWatcherHost;
import appeng.api.parts.IPartCollisionHelper;
import appeng.api.parts.IPartModel;
import appeng.api.storage.IMEMonitor;
import appeng.api.storage.IMEMonitorHandlerReceiver;
import appeng.api.storage.IStorageChannel;
import appeng.api.storage.channels.IFluidStorageChannel;
import appeng.api.storage.data.IAEFluidStack;
@@ -48,7 +50,7 @@ import appeng.util.IConfigManagerHost;
import appeng.util.Platform;
public class PartFluidLevelEmitter extends PartUpgradeable implements IStackWatcherHost, IConfigManagerHost, IAEFluidInventory
public class PartFluidLevelEmitter extends PartUpgradeable implements IStackWatcherHost, IConfigManagerHost, IAEFluidInventory, IMEMonitorHandlerReceiver<IAEFluidStack>
{
@PartModels
public static final ResourceLocation MODEL_BASE_OFF = new ResourceLocation( AppEng.MOD_ID, "part/level_emitter_base_off" );
@@ -153,6 +155,41 @@ public class PartFluidLevelEmitter extends PartUpgradeable implements IStackWatc
return cf | ( this.prevState ? FLAG_ON : 0 );
}
@Override
public boolean isValid( final Object effectiveGrid )
{
try
{
return this.getProxy().getGrid() == effectiveGrid;
}
catch( final GridAccessException e )
{
return false;
}
}
@Override
public void postChange( final IBaseMonitor<IAEFluidStack> monitor, final Iterable<IAEFluidStack> change, final IActionSource actionSource )
{
this.updateReportingValue( (IMEMonitor<IAEFluidStack>) monitor );
}
@Override
public void onListUpdate()
{
try
{
final IStorageChannel<IAEFluidStack> channel = AEApi.instance().storage().getStorageChannel( IFluidStorageChannel.class );
final IMEMonitor<IAEFluidStack> inventory = this.getProxy().getStorage().getInventory( channel );
this.updateReportingValue( inventory );
}
catch( final GridAccessException e )
{
// ;P
}
}
private void updateState()
{
final boolean isOn = this.isLevelEmitterOn();
@@ -168,31 +205,53 @@ public class PartFluidLevelEmitter extends PartUpgradeable implements IStackWatc
private void configureWatchers()
{
final IFluidStorageChannel channel = AEApi.instance().storage().getStorageChannel( IFluidStorageChannel.class );
if( this.stackWatcher != null )
{
this.stackWatcher.reset();
final IAEFluidStack myStack = this.config.getFluidInSlot( 0 );
if( myStack != null )
try
{
this.stackWatcher.add( myStack );
if( myStack != null )
{
this.getProxy().getStorage().getInventory( channel ).removeListener( this );
this.stackWatcher.add( myStack );
}
else
{
this.getProxy()
.getStorage()
.getInventory( channel )
.addListener( this, this.getProxy().getGrid() );
}
final IMEMonitor<IAEFluidStack> inventory = this.getProxy().getStorage().getInventory( channel );
this.updateReportingValue( inventory );
}
catch( GridAccessException e )
{
// NOP
}
}
try
{
this.updateReportingValue(
this.getProxy().getStorage().getInventory( AEApi.instance().storage().getStorageChannel( IFluidStorageChannel.class ) ) );
}
catch( GridAccessException e )
{
// x.x
}
}
private void updateReportingValue( final IMEMonitor<IAEFluidStack> monitor )
{
final IAEFluidStack myStack = this.config.getFluidInSlot( 0 );
if( myStack != null )
if( myStack == null )
{
this.lastReportedValue = 0;
for( final IAEFluidStack st : monitor.getStorageList() )
{
this.lastReportedValue += st.getStackSize();
}
}
else
{
final IAEFluidStack r = monitor.getStorageList().findPrecise( myStack );
if( r == null )
@@ -17,10 +17,10 @@ public class AEFluidInventory implements IAEFluidTank
{
private final IAEFluidStack[] fluids;
private final IAEFluidInventory handler;
private final long capacity;
private final int capacity;
private IFluidTankProperties[] props = null;
public AEFluidInventory( final IAEFluidInventory handler, final int slots, final long capcity )
public AEFluidInventory( final IAEFluidInventory handler, final int slots, final int capcity )
{
this.fluids = new IAEFluidStack[slots];
this.handler = handler;
@@ -29,7 +29,7 @@ public class AEFluidInventory implements IAEFluidTank
public AEFluidInventory( final IAEFluidInventory handler, final int slots )
{
this( handler, slots, Long.MAX_VALUE );
this( handler, slots, Integer.MAX_VALUE );
}
@Override
@@ -110,45 +110,34 @@ public class AEFluidInventory implements IAEFluidTank
final IAEFluidStack fluid = this.fluids[slot];
if( !doFill )
{
if( fluid == null )
{
return resource.amount;
}
if( !fluid.equals( resource ) )
{
return 0;
}
return (int) Math.min( Math.min( this.capacity - fluid.getStackSize(), resource.amount ), Integer.MAX_VALUE );
}
if( fluid == null )
{
this.setFluidInSlot( slot, AEFluidStack.fromFluidStack( resource ) );
return resource.amount;
}
if( !fluid.equals( resource ) )
if( fluid != null && !fluid.equals( resource ) )
{
return 0;
}
long filled = this.capacity - fluid.getStackSize();
if( resource.amount < filled )
int amountToStore = this.capacity;
if( fluid != null )
{
fluid.setStackSize( fluid.getStackSize() + resource.amount );
filled = resource.amount;
}
else
{
fluid.setStackSize( this.capacity );
amountToStore -= fluid.getStackSize();
}
this.onContentChanged( slot );
return (int) filled;
amountToStore = Math.min( amountToStore, resource.amount );
if( doFill )
{
if( fluid == null )
{
this.setFluidInSlot( slot, AEFluidStack.fromFluidStack( resource ) );
}
else
{
fluid.setStackSize( fluid.getStackSize() + amountToStore );
this.onContentChanged( slot );
}
}
return amountToStore;
}
public FluidStack drain( final int slot, final FluidStack resource, final boolean doDrain )
@@ -363,7 +352,7 @@ public class AEFluidInventory implements IAEFluidTank
@Override
public int getCapacity()
{
return (int) Math.min( AEFluidInventory.this.capacity, Integer.MAX_VALUE );
return Math.min( AEFluidInventory.this.capacity, Integer.MAX_VALUE );
}
@Override
@@ -49,37 +49,41 @@ import appeng.util.item.AEStack;
public final class AEFluidStack extends AEStack<IAEFluidStack> implements IAEFluidStack, Comparable<AEFluidStack>
{
private final int myHash;
private final Fluid fluid;
private NBTTagCompound tagCompound;
private AEFluidStack( final AEFluidStack is )
private AEFluidStack( final AEFluidStack fluidStack )
{
this.fluid = is.fluid;
this.setStackSize( is.getStackSize() );
this.fluid = fluidStack.fluid;
this.setStackSize( fluidStack.getStackSize() );
// priority = is.priority;
this.setCraftable( is.isCraftable() );
this.setCountRequestable( is.getCountRequestable() );
this.setCraftable( fluidStack.isCraftable() );
this.setCountRequestable( fluidStack.getCountRequestable() );
this.myHash = is.myHash;
if( fluidStack.hasTagCompound() )
{
this.tagCompound = fluidStack.tagCompound.copy();
}
}
private AEFluidStack( @Nonnull final FluidStack is )
private AEFluidStack( @Nonnull final FluidStack fluidStack )
{
this.fluid = is.getFluid();
this.fluid = fluidStack.getFluid();
if( this.fluid == null )
{
throw new IllegalArgumentException( "Fluid is null." );
}
this.setStackSize( is.amount );
this.setStackSize( fluidStack.amount );
this.setCraftable( false );
this.setCountRequestable( 0 );
this.myHash = this.fluid.hashCode() ^ ( this.tagCompound == null ? 0 : System.identityHashCode( this.tagCompound ) );
if( fluidStack.tag != null )
{
this.tagCompound = fluidStack.tag.copy();
}
}
public static AEFluidStack fromFluidStack( final FluidStack input )
@@ -92,9 +96,9 @@ public final class AEFluidStack extends AEStack<IAEFluidStack> implements IAEFlu
return new AEFluidStack( input );
}
public static IAEFluidStack fromNBT( final NBTTagCompound i )
public static IAEFluidStack fromNBT( final NBTTagCompound data )
{
final FluidStack fluidStack = FluidStack.loadFluidStackFromNBT( i );
final FluidStack fluidStack = FluidStack.loadFluidStackFromNBT( data );
if( fluidStack == null )
{
@@ -102,15 +106,21 @@ public final class AEFluidStack extends AEStack<IAEFluidStack> implements IAEFlu
}
final AEFluidStack fluid = AEFluidStack.fromFluidStack( fluidStack );
fluid.setStackSize( i.getLong( "Cnt" ) );
fluid.setCountRequestable( i.getLong( "Req" ) );
fluid.setCraftable( i.getBoolean( "Craft" ) );
fluid.setStackSize( data.getLong( "Cnt" ) );
fluid.setCountRequestable( data.getLong( "Req" ) );
fluid.setCraftable( data.getBoolean( "Craft" ) );
if( fluid.hasTagCompound() )
{
fluid.tagCompound = fluid.tagCompound.copy();
}
return fluid;
}
public static IAEFluidStack fromPacket( final ByteBuf data ) throws IOException
public static IAEFluidStack fromPacket( final ByteBuf buffer ) throws IOException
{
final byte mask = data.readByte();
final byte mask = buffer.readByte();
final byte stackType = (byte) ( ( mask & 0x0C ) >> 2 );
final byte countReqType = (byte) ( ( mask & 0x30 ) >> 4 );
final boolean isCraftable = ( mask & 0x40 ) > 0;
@@ -119,26 +129,26 @@ public final class AEFluidStack extends AEStack<IAEFluidStack> implements IAEFlu
// don't send this...
final NBTTagCompound d = new NBTTagCompound();
final byte len2 = data.readByte();
final byte len2 = buffer.readByte();
final byte[] name = new byte[len2];
data.readBytes( name, 0, len2 );
buffer.readBytes( name, 0, len2 );
d.setString( "FluidName", new String( name, "UTF-8" ) );
d.setByte( "Count", (byte) 0 );
if( hasTagCompound )
{
final int len = data.readInt();
final int len = buffer.readInt();
final byte[] bd = new byte[len];
data.readBytes( bd );
buffer.readBytes( bd );
final DataInputStream di = new DataInputStream( new ByteArrayInputStream( bd ) );
d.setTag( "tag", CompressedStreamTools.read( di ) );
d.setTag( "Tag", CompressedStreamTools.read( di ) );
}
final long stackSize = getPacketValue( stackType, data );
final long countRequestable = getPacketValue( countReqType, data );
final long stackSize = getPacketValue( stackType, buffer );
final long countRequestable = getPacketValue( countReqType, buffer );
final FluidStack fluidStack = FluidStack.loadFluidStackFromNBT( d );
@@ -168,51 +178,21 @@ public final class AEFluidStack extends AEStack<IAEFluidStack> implements IAEFlu
}
@Override
public void writeToNBT( final NBTTagCompound i )
public void writeToNBT( final NBTTagCompound data )
{
/*
* Mojang Fucked this over ; GC Optimization - Ugly Yes, but it saves a lot in the memory department.
*/
data.setString( "FluidName", this.fluid.getName() );
data.setByte( "Count", (byte) 0 );
data.setLong( "Cnt", this.getStackSize() );
data.setLong( "Req", this.getCountRequestable() );
data.setBoolean( "Craft", this.isCraftable() );
/*
* NBTBase FluidName = i.getTag( "FluidName" ); NBTBase Count = i.getTag( "Count" ); NBTBase Cnt = i.getTag(
* "Cnt" ); NBTBase Req = i.getTag( "Req" ); NBTBase Craft = i.getTag( "Craft" );
*/
/*
* if ( FluidName != null && FluidName instanceof NBTTagString ) ((NBTTagString) FluidName).data = (String)
* this.fluid.getName(); else
*/
i.setString( "FluidName", this.fluid.getName() );
/*
* if ( Count != null && Count instanceof NBTTagByte ) ((NBTTagByte) Count).data = (byte) 0; else
*/
i.setByte( "Count", (byte) 0 );
/*
* if ( Cnt != null && Cnt instanceof NBTTagLong ) ((NBTTagLong) Cnt).data = this.stackSize; else
*/
i.setLong( "Cnt", this.getStackSize() );
/*
* if ( Req != null && Req instanceof NBTTagLong ) ((NBTTagLong) Req).data = this.stackSize; else
*/
i.setLong( "Req", this.getCountRequestable() );
/*
* if ( Craft != null && Craft instanceof NBTTagByte ) ((NBTTagByte) Craft).data = (byte) (this.isCraftable() ?
* 1 : 0); else
*/
i.setBoolean( "Craft", this.isCraftable() );
if( this.tagCompound != null )
if( this.hasTagCompound() )
{
i.setTag( "tag", this.tagCompound );
data.setTag( "Tag", this.tagCompound );
}
else
{
i.removeTag( "tag" );
data.removeTag( "Tag" );
}
}
@@ -255,29 +235,43 @@ public final class AEFluidStack extends AEStack<IAEFluidStack> implements IAEFlu
}
@Override
public int compareTo( final AEFluidStack b )
public int compareTo( final AEFluidStack other )
{
final int diff = this.hashCode() - b.hashCode();
return diff > 0 ? 1 : ( diff < 0 ? -1 : 0 );
if( this.fluid != other.fluid )
{
return this.fluid.getName().compareTo( other.fluid.getName() );
}
if( Platform.itemComparisons().isNbtTagEqual( this.tagCompound, other.tagCompound ) )
{
return 0;
}
return this.tagCompound.hashCode() - other.tagCompound.hashCode();
}
@Override
public int hashCode()
{
return this.myHash;
final int prime = 31;
int result = 1;
result = prime * result + ( ( this.fluid == null ) ? 0 : this.fluid.hashCode() );
result = prime * result + ( ( this.tagCompound == null ) ? 0 : this.tagCompound.hashCode() );
return result;
}
@Override
public boolean equals( final Object ia )
public boolean equals( final Object other )
{
if( ia instanceof AEFluidStack )
if( other instanceof AEFluidStack )
{
final AEFluidStack is = (AEFluidStack) ia;
final AEFluidStack is = (AEFluidStack) other;
return is.fluid == this.fluid && Platform.itemComparisons().isNbtTagEqual( this.tagCompound, is.tagCompound );
}
else if( ia instanceof FluidStack )
else if( other instanceof FluidStack )
{
final FluidStack is = (FluidStack) ia;
final FluidStack is = (FluidStack) other;
return is.getFluid() == this.fluid && Platform.itemComparisons().isNbtTagEqual( this.tagCompound, is.tag );
}
return false;
@@ -286,7 +280,7 @@ public final class AEFluidStack extends AEStack<IAEFluidStack> implements IAEFlu
@Override
public String toString()
{
return this.getFluidStack().toString();
return this.getStackSize() + "x" + this.getFluidStack().getFluid().getName() + " " + this.tagCompound;
}
@Override
@@ -298,11 +292,8 @@ public final class AEFluidStack extends AEStack<IAEFluidStack> implements IAEFlu
@Override
public FluidStack getFluidStack()
{
final FluidStack is = new FluidStack( this.fluid, (int) Math.min( Integer.MAX_VALUE, this.getStackSize() ) );
if( this.tagCompound != null )
{
is.tag = this.tagCompound.copy();
}
final int amount = (int) Math.min( Integer.MAX_VALUE, this.getStackSize() );
final FluidStack is = new FluidStack( this.fluid, amount, this.tagCompound );
return is;
}
@@ -327,24 +318,24 @@ public final class AEFluidStack extends AEStack<IAEFluidStack> implements IAEFlu
}
@Override
public void writeToPacket( final ByteBuf i ) throws IOException
public void writeToPacket( final ByteBuf buffer ) throws IOException
{
final byte mask = (byte) ( ( this.getType( this.getStackSize() ) << 2 ) | ( this
.getType( this.getCountRequestable() ) << 4 ) | ( (byte) ( this.isCraftable() ? 1 : 0 ) << 6 ) | ( this.hasTagCompound() ? 1 : 0 ) << 7 );
i.writeByte( mask );
buffer.writeByte( mask );
this.writeToStream( i );
this.writeToStream( buffer );
this.putPacketValue( i, this.getStackSize() );
this.putPacketValue( i, this.getCountRequestable() );
this.putPacketValue( buffer, this.getStackSize() );
this.putPacketValue( buffer, this.getCountRequestable() );
}
private void writeToStream( final ByteBuf i ) throws IOException
private void writeToStream( final ByteBuf buffer ) throws IOException
{
final byte[] name = this.fluid.getName().getBytes( "UTF-8" );
i.writeByte( (byte) name.length );
i.writeBytes( name );
buffer.writeByte( (byte) name.length );
buffer.writeBytes( name );
if( this.hasTagCompound() )
{
final ByteArrayOutputStream bytes = new ByteArrayOutputStream();
@@ -355,8 +346,8 @@ public final class AEFluidStack extends AEStack<IAEFluidStack> implements IAEFlu
final byte[] tagBytes = bytes.toByteArray();
final int size = tagBytes.length;
i.writeInt( size );
i.writeBytes( tagBytes );
buffer.writeInt( size );
buffer.writeBytes( tagBytes );
}
}
}
@@ -32,6 +32,7 @@ import net.minecraft.item.ItemStack;
import mezz.jei.api.IJeiRuntime;
import mezz.jei.api.IModPlugin;
import mezz.jei.api.IModRegistry;
import mezz.jei.api.ISubtypeRegistry;
import mezz.jei.api.recipe.IRecipeCategoryRegistration;
import mezz.jei.api.recipe.VanillaRecipeCategoryUid;
@@ -54,6 +55,12 @@ import appeng.items.parts.ItemFacade;
@mezz.jei.api.JEIPlugin
public class JEIPlugin implements IModPlugin
{
@Override
public void registerItemSubtypes( ISubtypeRegistry subtypeRegistry )
{
final Optional<Item> maybeFacade = AEApi.instance().definitions().items().facade().maybeItem();
maybeFacade.ifPresent( subtypeRegistry::useNbtForSubtypes );
}
@Override
public void registerCategories( IRecipeCategoryRegistration registry )
@@ -25,6 +25,7 @@ import net.minecraft.client.util.ITooltipFlag;
import net.minecraft.entity.player.EntityPlayer;
import net.minecraft.item.ItemStack;
import net.minecraft.nbt.NBTTagCompound;
import net.minecraft.util.ActionResult;
import net.minecraft.util.EnumActionResult;
import net.minecraft.util.EnumFacing;
import net.minecraft.util.EnumHand;
@@ -174,6 +175,9 @@ public class ToolMemoryCard extends AEBaseItem implements IMemoryCard
case SETTINGS_SAVED:
player.sendMessage( PlayerMessages.SavedSettings.get() );
break;
case SETTINGS_RESET:
player.sendMessage( PlayerMessages.ResetSettings.get() );
break;
default:
}
}
@@ -185,9 +189,7 @@ public class ToolMemoryCard extends AEBaseItem implements IMemoryCard
{
if( !w.isRemote )
{
final IMemoryCard mem = (IMemoryCard) player.getHeldItem( hand ).getItem();
mem.notifyUser( player, MemoryCardMessages.SETTINGS_CLEARED );
player.getHeldItem( hand ).setTagCompound( null );
this.clearCard( player, w, hand );
}
return EnumActionResult.SUCCESS;
}
@@ -197,9 +199,31 @@ public class ToolMemoryCard extends AEBaseItem implements IMemoryCard
}
}
@Override
public ActionResult<ItemStack> onItemRightClick( World w, EntityPlayer player, EnumHand hand )
{
if( player.isSneaking() )
{
if( !w.isRemote )
{
this.clearCard( player, w, hand );
}
}
return super.onItemRightClick( w, player, hand );
}
@Override
public boolean doesSneakBypassUse( final ItemStack itemstack, final IBlockAccess world, final BlockPos pos, final EntityPlayer player )
{
return true;
}
private void clearCard( final EntityPlayer player, final World w, final EnumHand hand )
{
final IMemoryCard mem = (IMemoryCard) player.getHeldItem( hand ).getItem();
mem.notifyUser( player, MemoryCardMessages.SETTINGS_CLEARED );
player.getHeldItem( hand ).setTagCompound( null );
}
}
@@ -68,23 +68,24 @@ public class ToolEntropyManipulator extends AEBasePoweredItem implements IBlockT
this.coolDown = new HashMap<>();
this.coolDown.put( new InWorldToolOperationIngredient( Blocks.STONE.getDefaultState() ),
new InWorldToolOperationResult( new ItemStack( Blocks.COBBLESTONE ) ) );
new InWorldToolOperationResult( Blocks.COBBLESTONE.getDefaultState() ) );
this.coolDown.put( new InWorldToolOperationIngredient( Blocks.STONEBRICK.getDefaultState() ),
new InWorldToolOperationResult( new ItemStack( Blocks.STONEBRICK, 1, 2 ) ) );
this.coolDown.put( new InWorldToolOperationIngredient( Blocks.LAVA, true ), new InWorldToolOperationResult( new ItemStack( Blocks.OBSIDIAN ) ) );
new InWorldToolOperationResult( Blocks.STONEBRICK.getStateFromMeta( 2 ) ) );
this.coolDown.put( new InWorldToolOperationIngredient( Blocks.LAVA, true ), new InWorldToolOperationResult( Blocks.OBSIDIAN.getDefaultState() ) );
this.coolDown.put( new InWorldToolOperationIngredient( Blocks.FLOWING_LAVA, true ),
new InWorldToolOperationResult( new ItemStack( Blocks.OBSIDIAN ) ) );
this.coolDown.put( new InWorldToolOperationIngredient( Blocks.GRASS, true ), new InWorldToolOperationResult( new ItemStack( Blocks.DIRT ) ) );
new InWorldToolOperationResult( Blocks.OBSIDIAN.getDefaultState() ) );
this.coolDown.put( new InWorldToolOperationIngredient( Blocks.GRASS, true ), new InWorldToolOperationResult( Blocks.DIRT.getDefaultState() ) );
final List<ItemStack> snowBalls = new ArrayList<>();
snowBalls.add( new ItemStack( Items.SNOWBALL ) );
this.coolDown.put( new InWorldToolOperationIngredient( Blocks.FLOWING_WATER, true ), new InWorldToolOperationResult( ItemStack.EMPTY, snowBalls ) );
this.coolDown.put( new InWorldToolOperationIngredient( Blocks.WATER, true ), new InWorldToolOperationResult( new ItemStack( Blocks.ICE ) ) );
this.coolDown.put( new InWorldToolOperationIngredient( Blocks.FLOWING_WATER, true ), new InWorldToolOperationResult( null, snowBalls ) );
this.coolDown.put( new InWorldToolOperationIngredient( Blocks.WATER, true ), new InWorldToolOperationResult( Blocks.ICE.getDefaultState() ) );
this.heatUp.put( new InWorldToolOperationIngredient( Blocks.ICE.getDefaultState() ), new InWorldToolOperationResult( new ItemStack( Blocks.WATER ) ) );
this.heatUp.put( new InWorldToolOperationIngredient( Blocks.ICE.getDefaultState() ), new InWorldToolOperationResult( Blocks.WATER.getDefaultState() ) );
this.heatUp.put( new InWorldToolOperationIngredient( Blocks.FLOWING_WATER, true ), new InWorldToolOperationResult() );
this.heatUp.put( new InWorldToolOperationIngredient( Blocks.WATER, true ), new InWorldToolOperationResult() );
this.heatUp.put( new InWorldToolOperationIngredient( Blocks.SNOW, true ), new InWorldToolOperationResult( new ItemStack( Blocks.FLOWING_WATER ) ) );
this.heatUp.put( new InWorldToolOperationIngredient( Blocks.SNOW, true ),
new InWorldToolOperationResult( Blocks.FLOWING_WATER.getStateFromMeta( 7 ) ) );
}
private static class InWorldToolOperationIngredient
@@ -135,10 +136,9 @@ public class ToolEntropyManipulator extends AEBasePoweredItem implements IBlockT
r = this.heatUp.get( new InWorldToolOperationIngredient( state.getBlock(), true ) );
}
if( !r.getBlockItem().isEmpty() )
if( r.getBlockState() != null )
{
final Block blk = Block.getBlockFromItem( r.getBlockItem().getItem() );
w.setBlockState( pos, blk.getStateFromMeta( r.getBlockItem().getItemDamage() ), 3 );
w.setBlockState( pos, r.getBlockState(), 3 );
}
else
{
@@ -172,10 +172,9 @@ public class ToolEntropyManipulator extends AEBasePoweredItem implements IBlockT
r = this.coolDown.get( new InWorldToolOperationIngredient( state.getBlock(), true ) );
}
if( !r.getBlockItem().isEmpty() )
if( r.getBlockState() != null )
{
final Block blk = Block.getBlockFromItem( r.getBlockItem().getItem() );
w.setBlockState( pos, blk.getStateFromMeta( r.getBlockItem().getItemDamage() ), 3 );
w.setBlockState( pos, r.getBlockState(), 3 );
}
else
{
@@ -326,14 +325,13 @@ public class ToolEntropyManipulator extends AEBasePoweredItem implements IBlockT
w.playSound( p, pos.getX() + 0.5D, pos.getY() + 0.5D, pos.getZ() + 0.5D, SoundEvents.ITEM_FLINTANDSTEEL_USE, SoundCategory.PLAYERS, 1.0F,
itemRand.nextFloat() * 0.4F + 0.8F );
if( or.getBlockItem().isEmpty() )
if( or.getBlockState() == null )
{
w.setBlockState( pos, Platform.AIR_BLOCK.getDefaultState(), 3 );
}
else
{
final Block blk = Block.getBlockFromItem( or.getBlockItem().getItem() );
w.setBlockState( pos, blk.getStateFromMeta( or.getBlockItem().getItemDamage() ), 3 );
w.setBlockState( pos, or.getBlockState(), 3 );
}
if( or.getDrops() != null )
+11 -5
View File
@@ -576,15 +576,21 @@ public class CraftingGridCache implements ICraftingGrid, ICraftingProviderHelper
@Override
public boolean isRequesting( final IAEItemStack what )
{
return this.requesting( what ) > 0;
}
@Override
public long requesting( IAEItemStack what )
{
long requested = 0;
for( final CraftingCPUCluster cluster : this.craftingCPUClusters )
{
if( cluster.isMaking( what ) )
{
return true;
}
final IAEItemStack stack = cluster.making( what );
requested += stack != null ? stack.getStackSize() : 0;
}
return false;
return requested;
}
public List<ICraftingMedium> getMediums( final ICraftingPatternDetails key )
@@ -28,7 +28,6 @@ import java.util.Map;
import java.util.Map.Entry;
import com.google.common.collect.ImmutableList;
import com.google.common.collect.ImmutableSet;
import net.minecraft.inventory.InventoryCrafting;
import net.minecraft.item.ItemStack;
@@ -300,7 +299,7 @@ public final class CraftingCPUCluster implements IAECluster, ICraftingCPU
this.updateElapsedTime( what );
this.markDirty();
this.postCraftingStatusChange( is );
this.postCraftingStatusChange( what.copy().setStackSize( -what.getStackSize() ) );
if( this.finalOutput.equals( what ) )
{
@@ -332,6 +331,7 @@ public final class CraftingCPUCluster implements IAECluster, ICraftingCPU
what.decStackSize( is.getStackSize() );
is.setStackSize( 0 );
this.postCraftingStatusChange( insert.copy().setStackSize( -insert.getStackSize() ) );
if( this.finalOutput.equals( insert ) )
{
@@ -556,7 +556,9 @@ public final class CraftingCPUCluster implements IAECluster, ICraftingCPU
this.myLastLink = null;
this.tasks.clear();
final ImmutableSet<IAEItemStack> items = ImmutableSet.copyOf( this.waitingFor );
// final ImmutableSet<IAEItemStack> items = ImmutableSet.copyOf( this.waitingFor );
final List<IAEItemStack> items = new ArrayList<>( this.waitingFor.size() );
this.waitingFor.forEach( stack -> items.add( stack.copy().setStackSize( -stack.getStackSize() ) ) );
this.waitingFor.resetStatus();
@@ -1304,10 +1306,9 @@ public final class CraftingCPUCluster implements IAECluster, ICraftingCPU
return this.getCore().getWorld();
}
public boolean isMaking( final IAEItemStack what )
public IAEItemStack making( final IAEItemStack what )
{
final IAEItemStack wat = this.waitingFor.findPrecise( what );
return wat != null && wat.getStackSize() > 0;
return this.waitingFor.findPrecise( what );
}
public void breakCluster()
@@ -64,52 +64,44 @@ public class BasicCellInventory<T extends IAEStack<T>> extends AbstractCellInven
}
}
public static <T extends AEStack<T>> boolean isCellOfType( final ItemStack input, IStorageChannel channel )
public static <T extends AEStack<T>> boolean isCellOfType( final ItemStack input, IStorageChannel<?> channel )
{
if( input == null )
{
return false;
}
final IStorageCell<?> type = getStorageCell( input );
final Item type = input.getItem();
if( type instanceof IStorageCell )
{
return ( (IStorageCell) type ).getChannel() == channel;
}
return false;
return type != null && type.getChannel() == channel;
}
public static boolean isCell( final ItemStack input )
{
if( input == null )
{
return false;
}
return getStorageCell( input ) != null;
}
try
private boolean isStorageCell( final T input )
{
if( input instanceof IAEItemStack )
{
final Item type = input.getItem();
if( type instanceof IStorageCell )
{
return !( (IStorageCell) type ).storableInStorageCell();
}
}
catch( final Throwable err )
{
return true;
final IAEItemStack stack = (IAEItemStack) input;
final IStorageCell<?> type = getStorageCell( stack.getDefinition() );
return type != null && !type.storableInStorageCell();
}
return false;
}
private boolean isStorageCell( final T input )
private static IStorageCell<?> getStorageCell( final ItemStack input )
{
if( !input.isItem() )
if( input != null )
{
return false;
final Item type = input.getItem();
if( type instanceof IStorageCell )
{
return (IStorageCell<?>) type;
}
}
return isCell( ( (IAEItemStack) input ).getDefinition() );
return null;
}
@SuppressWarnings( { "rawtypes", "unchecked" } )
@@ -288,7 +288,18 @@ public class PartStorageBus extends PartUpgradeable implements IGridTickable, IC
{
if( pos.offset( this.getSide().getFacing() ).equals( neighbor ) )
{
this.resetCache( false );
final TileEntity te = w.getTileEntity( neighbor );
// In case the TE was destroyed, we have to do a full reset immediately.
if( te == null )
{
this.resetCache( true );
this.resetCache();
}
else
{
this.resetCache( false );
}
}
}
@@ -336,15 +336,18 @@ public abstract class PartP2PTunnel<T extends PartP2PTunnel> extends PartBasicSt
}
final IMemoryCard mc = (IMemoryCard) is.getItem();
final NBTTagCompound data = new NBTTagCompound();
final NBTTagCompound data = mc.getData( is );
final short storedFrequency = data.getShort( "freq" );
short newFreq = this.getFrequency();
final boolean wasOutput = this.isOutput();
this.setOutput( false );
final boolean needsNewFrequency = wasOutput || this.getFrequency() == 0 || storedFrequency == newFreq;
try
{
if( wasOutput || this.getFrequency() == 0 )
if( needsNewFrequency )
{
newFreq = this.getProxy().getP2P().newFrequency();
}
@@ -373,7 +376,14 @@ public abstract class PartP2PTunnel<T extends PartP2PTunnel> extends PartBasicSt
data.setIntArray( "colorCode", colorCode );
mc.setMemoryCardContents( is, type + ".name", data );
mc.notifyUser( player, MemoryCardMessages.SETTINGS_SAVED );
if( needsNewFrequency )
{
mc.notifyUser( player, MemoryCardMessages.SETTINGS_RESET );
}
else
{
mc.notifyUser( player, MemoryCardMessages.SETTINGS_SAVED );
}
return true;
}
return false;
@@ -46,7 +46,6 @@ public class Quad implements IVertexProducer, ISmartVertexConsumer
public CachedFormat format;
public int tintIndex = -1;
// TODO, sometimes this is null because people don't do models properly.
public EnumFacing orientation;
public boolean diffuseLighting = true;
public TextureAtlasSprite sprite;
@@ -130,6 +129,10 @@ public class Quad implements IVertexProducer, ISmartVertexConsumer
{
this.vertexIndex = 0;
this.full = true;
if(orientation == null)
{
calculateOrientation(false);
}
}
}
}
@@ -195,31 +198,41 @@ public class Quad implements IVertexProducer, ISmartVertexConsumer
vec[1] = (float) MathHelper.clamp( vec[1], bb.minY, bb.maxY );
vec[2] = (float) MathHelper.clamp( vec[2], bb.minZ, bb.maxZ );
}
this.v1.set( this.vertices[3].vec );
this.t.set( this.vertices[1].vec );
this.v1.sub( this.t );
this.v2.set( this.vertices[2].vec );
this.t.set( this.vertices[0].vec );
this.v2.sub( this.t );
this.normal.cross( this.v2, this.v1 );
this.normal.normalize();
if( this.format.hasNormal )
{
for( Vertex vertex : this.vertices )
{
vertex.normal[0] = this.normal.x;
vertex.normal[1] = this.normal.y;
vertex.normal[2] = this.normal.z;
vertex.normal[3] = 0;
}
}
this.orientation = EnumFacing.getFacingFromVector( this.normal.x, this.normal.y, this.normal.z );
calculateOrientation(true);
}
/**
* Re-calculates the Orientation of this quad,
* optionally the normal vector.
*
* @param setNormal If the normal vector should be updated.
*/
public void calculateOrientation( boolean setNormal )
{
this.v1.set( this.vertices[3].vec );
this.t.set( this.vertices[1].vec );
this.v1.sub( this.t );
this.v2.set( this.vertices[2].vec );
this.t.set( this.vertices[0].vec );
this.v2.sub( this.t );
this.normal.cross( this.v2, this.v1 );
this.normal.normalize();
if( this.format.hasNormal && setNormal)
{
for( Vertex vertex : this.vertices )
{
vertex.normal[0] = this.normal.x;
vertex.normal[1] = this.normal.y;
vertex.normal[2] = this.normal.z;
vertex.normal[3] = 0;
}
}
this.orientation = EnumFacing.getFacingFromVector( this.normal.x, this.normal.y, this.normal.z );
}
/**
* Used to create a new quad complete copy of this one.
*
@@ -20,15 +20,18 @@ package appeng.tile.crafting;
import java.io.IOException;
import java.util.Optional;
import io.netty.buffer.ByteBuf;
import net.minecraft.entity.player.EntityPlayer;
import net.minecraft.item.ItemStack;
import net.minecraft.nbt.NBTTagCompound;
import net.minecraft.util.EnumFacing;
import net.minecraftforge.fml.relauncher.Side;
import net.minecraftforge.fml.relauncher.SideOnly;
import appeng.api.AEApi;
import appeng.api.implementations.tiles.IColorableTile;
import appeng.api.storage.data.IAEItemStack;
import appeng.api.util.AEColor;
@@ -183,4 +186,12 @@ public class TileCraftingMonitorTile extends TileCraftingTile implements IColora
{
this.updateList = updateList;
}
@Override
protected ItemStack getItemFromTile( final Object obj )
{
final Optional<ItemStack> is = AEApi.instance().definitions().blocks().craftingMonitor().maybeStack( 1 );
return is.orElseGet( () -> super.getItemFromTile( obj ) );
}
}
@@ -42,6 +42,9 @@ public class TileCraftingStorageTile extends TileCraftingTile
switch( storage )
{
case 1:
is = blocks.craftingStorage1k().maybeStack( 1 );
break;
case 4:
is = blocks.craftingStorage4k().maybeStack( 1 );
break;
@@ -85,6 +85,10 @@ public class TileCraftingTile extends AENetworkTile implements IAEMultiBlock, IP
{
is = AEApi.instance().definitions().blocks().craftingAccelerator().maybeStack( 1 );
}
else
{
is = AEApi.instance().definitions().blocks().craftingUnit().maybeStack( 1 );
}
return is.orElseGet( () -> super.getItemFromTile( obj ) );
}
@@ -3,15 +3,15 @@ package appeng.tile.inventory;
import net.minecraft.item.ItemStack;
import net.minecraftforge.items.IItemHandlerModifiable;
import appeng.api.storage.ICellInventory;
import appeng.api.storage.ICellInventoryHandler;
import appeng.util.inv.IAEAppEngInventory;
import appeng.util.inv.IInternalItemHandler;
import appeng.util.inv.filter.IAEItemFilter;
public class AppEngCellInventory implements IInternalItemHandler
public class AppEngCellInventory implements IItemHandlerModifiable
{
private final AppEngInternalInventory inv;
private final ICellInventoryHandler handlerForSlot[];
@@ -78,17 +78,9 @@ public class AppEngCellInventory implements IInternalItemHandler
}
@Override
public boolean isItemValidForSlot( int slot, ItemStack stack )
public boolean isItemValid( int slot, ItemStack stack )
{
return this.inv.isItemValidForSlot( slot, stack );
}
@Override
public void markDirty( int slot )
{
this.persist( slot );
this.inv.markDirty( slot );
this.cleanup( slot );
return this.inv.isItemValid( slot, stack );
}
public void persist()
@@ -25,6 +25,7 @@ import javax.annotation.Nonnull;
import net.minecraft.item.ItemStack;
import net.minecraft.nbt.NBTTagCompound;
import net.minecraftforge.items.IItemHandlerModifiable;
import net.minecraftforge.items.ItemHandlerHelper;
import appeng.api.AEApi;
@@ -33,14 +34,13 @@ import appeng.api.storage.data.IAEItemStack;
import appeng.core.AELog;
import appeng.util.Platform;
import appeng.util.inv.IAEAppEngInventory;
import appeng.util.inv.IInternalItemHandler;
import appeng.util.inv.InvOperation;
import appeng.util.item.AEItemStack;
import appeng.util.iterators.AEInvIterator;
import appeng.util.iterators.InvIterator;
public class AppEngInternalAEInventory implements IInternalItemHandler, Iterable<ItemStack>
public class AppEngInternalAEInventory implements IItemHandlerModifiable, Iterable<ItemStack>
{
private final IAEAppEngInventory te;
private final IAEItemStack[] inv;
@@ -254,7 +254,7 @@ public class AppEngInternalAEInventory implements IInternalItemHandler, Iterable
private void fireOnChangeInventory( int slot, InvOperation op, ItemStack removed, ItemStack inserted )
{
if( this.te != null && Platform.isServer() )
if( this.te != null && Platform.isServer() && !this.dirtyFlag )
{
this.dirtyFlag = true;
this.te.onChangeInventory( this, slot, op, removed, inserted );
@@ -281,17 +281,8 @@ public class AppEngInternalAEInventory implements IInternalItemHandler, Iterable
}
@Override
public boolean isItemValidForSlot( int slot, ItemStack stack )
public boolean isItemValid( int slot, ItemStack stack )
{
return true;
}
@Override
public void markDirty( int slot )
{
if( !this.dirtyFlag )
{
this.fireOnChangeInventory( slot, InvOperation.DIRTY, ItemStack.EMPTY, ItemStack.EMPTY );
}
}
}
@@ -31,12 +31,11 @@ import net.minecraftforge.items.ItemStackHandler;
import appeng.util.Platform;
import appeng.util.inv.IAEAppEngInventory;
import appeng.util.inv.IInternalItemHandler;
import appeng.util.inv.InvOperation;
import appeng.util.inv.filter.IAEItemFilter;
public class AppEngInternalInventory extends ItemStackHandler implements IInternalItemHandler, Iterable<ItemStack>
public class AppEngInternalInventory extends ItemStackHandler implements Iterable<ItemStack>
{
private boolean enableClientEvents = false;
private IAEAppEngInventory te;
@@ -117,7 +116,7 @@ public class AppEngInternalInventory extends ItemStackHandler implements IIntern
@Override
protected void onContentsChanged( int slot )
{
if( this.getTileEntity() != null && this.eventsEnabled() )
if( this.getTileEntity() != null && this.eventsEnabled() && !this.dirtyFlag )
{
this.dirtyFlag = true;
ItemStack newStack = this.getStackInSlot( slot ).copy();
@@ -159,19 +158,7 @@ public class AppEngInternalInventory extends ItemStackHandler implements IIntern
}
@Override
public void markDirty( final int slot )
{
if( this.getTileEntity() != null && this.eventsEnabled() && !this.dirtyFlag )
{
this.dirtyFlag = true;
this.getTileEntity().onChangeInventory( this, slot, InvOperation.DIRTY, ItemStack.EMPTY, ItemStack.EMPTY );
this.getTileEntity().saveChanges();
this.dirtyFlag = false;
}
}
@Override
public boolean isItemValidForSlot( int slot, ItemStack stack )
public boolean isItemValid( int slot, ItemStack stack )
{
if( this.maxStack[slot] == 0 )
{
@@ -266,7 +266,7 @@ public class TileIOPort extends AENetworkInvTile implements IUpgradeableHost, IC
@Override
public TickingRequest getTickingRequest( final IGridNode node )
{
return new TickingRequest( TickRates.IOPort.getMin(), TickRates.IOPort.getMax(), this.hasWork(), false );
return new TickingRequest( TickRates.IOPort.getMin(), TickRates.IOPort.getMax(), !this.hasWork(), false );
}
@Override
@@ -24,47 +24,48 @@ import java.util.List;
import net.minecraft.block.Block;
import net.minecraft.block.BlockAir;
import net.minecraft.block.state.IBlockState;
import net.minecraft.item.ItemStack;
public class InWorldToolOperationResult
{
private final ItemStack BlockItem;
private final List<ItemStack> Drops;
private final IBlockState blockState;
private final List<ItemStack> drops;
public InWorldToolOperationResult()
{
this.BlockItem = ItemStack.EMPTY;
this.Drops = null;
this.blockState = null;
this.drops = null;
}
public InWorldToolOperationResult( final ItemStack block, final List<ItemStack> drops )
public InWorldToolOperationResult( final IBlockState block, final List<ItemStack> drops )
{
this.BlockItem = block;
this.Drops = drops;
this.blockState = block;
this.drops = drops;
}
public InWorldToolOperationResult( final ItemStack block )
public InWorldToolOperationResult( final IBlockState block )
{
this.BlockItem = block;
this.Drops = null;
this.blockState = block;
this.drops = null;
}
public static InWorldToolOperationResult getBlockOperationResult( final ItemStack[] items )
{
final List<ItemStack> temp = new ArrayList<>();
ItemStack b = ItemStack.EMPTY;
IBlockState b = null;
for( final ItemStack l : items )
{
if( b.isEmpty() )
if( b == null )
{
final Block bl = Block.getBlockFromItem( l.getItem() );
if( bl != null && !( bl instanceof BlockAir ) )
{
b = l;
b = bl.getDefaultState();
continue;
}
}
@@ -75,13 +76,13 @@ public class InWorldToolOperationResult
return new InWorldToolOperationResult( b, temp );
}
public ItemStack getBlockItem()
public IBlockState getBlockState()
{
return this.BlockItem;
return this.blockState;
}
public List<ItemStack> getDrops()
{
return this.Drops;
return this.drops;
}
}
@@ -24,8 +24,6 @@ import net.minecraft.item.ItemStack;
import net.minecraftforge.items.IItemHandler;
import net.minecraftforge.items.IItemHandlerModifiable;
import appeng.util.inv.IInternalItemHandler;
public class ItemHandlerUtil
{
@@ -66,37 +64,6 @@ public class ItemHandlerUtil
return true;
}
public static void markDirty( final IItemHandler inv, final int slot )
{
if( inv instanceof IInternalItemHandler )
{
( (IInternalItemHandler) inv ).markDirty( slot );
}
}
public static boolean isItemValidForSlot( final IItemHandler inv, int slot, ItemStack stack )
{
if( stack.isEmpty() )
{
return false;
}
if( inv instanceof IInternalItemHandler )
{
return ( (IInternalItemHandler) inv ).isItemValidForSlot( slot, stack );
}
// empty slot
ItemStack currentStack = inv.getStackInSlot( slot );
setStackInSlot( inv, slot, ItemStack.EMPTY );
// test insert
ItemStack remainder = inv.insertItem( slot, stack, true );
// restore slot
setStackInSlot( inv, slot, currentStack );
return remainder.isEmpty() || remainder.getCount() < stack.getCount();
}
public static void copy( final IItemHandler from, final IItemHandler to, boolean deepCopy )
{
for( int i = 0; i < Math.min( from.getSlots(), to.getSlots() ); ++i )
@@ -1,31 +0,0 @@
/*
* This file is part of Applied Energistics 2.
* Copyright (c) 2013 - 2017, 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.util.inv;
import net.minecraft.item.ItemStack;
import net.minecraftforge.items.IItemHandlerModifiable;
public interface IInternalItemHandler extends IItemHandlerModifiable
{
boolean isItemValidForSlot( int slot, ItemStack stack );
void markDirty( int slot );
}
@@ -21,5 +21,5 @@ package appeng.util.inv;
public enum InvOperation
{
EXTRACT, INSERT, SET, DIRTY
EXTRACT, INSERT, SET
}
@@ -25,12 +25,13 @@ import javax.annotation.Nonnull;
import net.minecraft.item.ItemStack;
import net.minecraftforge.items.IItemHandler;
import net.minecraftforge.items.IItemHandlerModifiable;
import net.minecraftforge.items.wrapper.EmptyHandler;
import appeng.util.helpers.ItemHandlerUtil;
public class WrapperChainedItemHandler implements IInternalItemHandler
public class WrapperChainedItemHandler implements IItemHandlerModifiable
{
private IItemHandler[] itemHandler; // the handlers
private int[] baseIndex; // index-offsets of the different handlers
@@ -159,20 +160,11 @@ public class WrapperChainedItemHandler implements IInternalItemHandler
}
@Override
public boolean isItemValidForSlot( int slot, ItemStack stack )
public boolean isItemValid( int slot, ItemStack stack )
{
int index = this.getIndexForSlot( slot );
IItemHandler handler = this.getHandlerFromIndex( index );
int targetSlot = this.getSlotFromIndex( slot, index );
return ItemHandlerUtil.isItemValidForSlot( handler, targetSlot, stack );
}
@Override
public void markDirty( int slot )
{
int index = this.getIndexForSlot( slot );
IItemHandler handler = this.getHandlerFromIndex( index );
int targetSlot = this.getSlotFromIndex( slot, index );
ItemHandlerUtil.markDirty( handler, targetSlot );
return handler.isItemValid( targetSlot, stack );
}
}
@@ -23,12 +23,13 @@ import javax.annotation.Nonnull;
import net.minecraft.item.ItemStack;
import net.minecraftforge.items.IItemHandler;
import net.minecraftforge.items.IItemHandlerModifiable;
import appeng.util.helpers.ItemHandlerUtil;
import appeng.util.inv.filter.IAEItemFilter;
public class WrapperFilteredItemHandler implements IInternalItemHandler
public class WrapperFilteredItemHandler implements IItemHandlerModifiable
{
private final IItemHandler handler;
private final IAEItemFilter filter;
@@ -86,18 +87,12 @@ public class WrapperFilteredItemHandler implements IInternalItemHandler
}
@Override
public boolean isItemValidForSlot( int slot, ItemStack stack )
public boolean isItemValid( int slot, ItemStack stack )
{
if( !this.filter.allowInsert( this.handler, slot, stack ) )
{
return false;
}
return ItemHandlerUtil.isItemValidForSlot( this.handler, slot, stack );
}
@Override
public void markDirty( int slot )
{
ItemHandlerUtil.markDirty( this.handler, slot );
return this.handler.isItemValid( slot, stack );
}
}
@@ -105,7 +105,7 @@ public class WrapperInvItemHandler implements IInventory
@Override
public void markDirty()
{
ItemHandlerUtil.markDirty( this.inv, -1 );
// NOP
}
@Override
@@ -129,7 +129,7 @@ public class WrapperInvItemHandler implements IInventory
@Override
public boolean isItemValidForSlot( int index, ItemStack stack )
{
return ItemHandlerUtil.isItemValidForSlot( this.inv, index, stack );
return this.inv.isItemValid( index, stack );
}
@Override
@@ -23,11 +23,12 @@ import javax.annotation.Nonnull;
import net.minecraft.item.ItemStack;
import net.minecraftforge.items.IItemHandler;
import net.minecraftforge.items.IItemHandlerModifiable;
import appeng.util.helpers.ItemHandlerUtil;
public class WrapperRangeItemHandler implements IInternalItemHandler
public class WrapperRangeItemHandler implements IItemHandlerModifiable
{
private final IItemHandler compose;
private final int minSlot;
@@ -108,22 +109,12 @@ public class WrapperRangeItemHandler implements IInternalItemHandler
}
@Override
public boolean isItemValidForSlot( int slot, ItemStack stack )
public boolean isItemValid( int slot, ItemStack stack )
{
if( this.checkSlot( slot ) )
{
return ItemHandlerUtil.isItemValidForSlot( this.compose, slot + this.minSlot, stack );
return this.compose.isItemValid( slot + this.minSlot, stack );
}
return false;
}
@Override
public void markDirty( int slot )
{
if( this.checkSlot( slot ) )
{
ItemHandlerUtil.markDirty( this.compose, slot + this.minSlot );
}
}
}
@@ -23,18 +23,18 @@ import java.util.function.Supplier;
import net.minecraft.item.ItemStack;
import net.minecraftforge.items.IItemHandler;
import net.minecraftforge.items.IItemHandlerModifiable;
import appeng.util.Lazy;
import appeng.util.helpers.ItemHandlerUtil;
public class WrapperLazyItemHandler implements IInternalItemHandler
public class WrapperSupplierItemHandler implements IItemHandlerModifiable
{
private final Lazy<IItemHandler> sourceHandler;
private final Supplier<IItemHandler> sourceHandler;
public WrapperLazyItemHandler( Supplier<IItemHandler> source )
public WrapperSupplierItemHandler( Supplier<IItemHandler> source )
{
this.sourceHandler = new Lazy<>( source );
this.sourceHandler = source;
}
@Override
@@ -74,14 +74,8 @@ public class WrapperLazyItemHandler implements IInternalItemHandler
}
@Override
public boolean isItemValidForSlot( int slot, ItemStack stack )
public boolean isItemValid( int slot, ItemStack stack )
{
return ItemHandlerUtil.isItemValidForSlot( this.sourceHandler.get(), slot, stack );
}
@Override
public void markDirty( int slot )
{
ItemHandlerUtil.markDirty( this.sourceHandler.get(), slot );
return this.sourceHandler.get().isItemValid( slot, stack );
}
}
@@ -46,6 +46,11 @@ final class AESharedItemStack implements Comparable<AESharedItemStack>
this.itemDamage = itemStack.getItemDamage();
}
Bounds getBounds( final FuzzyMode fuzzy, final boolean ignoreMeta )
{
return new Bounds( this.itemStack, fuzzy, ignoreMeta );
}
ItemStack getDefinition()
{
return this.itemStack;
@@ -139,83 +144,122 @@ final class AESharedItemStack implements Comparable<AESharedItemStack>
return System.identityHashCode( this.itemStack.getTagCompound() ) - System.identityHashCode( b.getTagCompound() );
}
public AESharedItemStack getLowerBound( final FuzzyMode fuzzy, final boolean ignoreMeta )
/**
* Creates the lower and upper bounds for a specific shared itemstack.
*/
public static final class Bounds
{
Preconditions.checkState( this.itemStack.getCount() == 1, "ItemStack#getCount() has to be 1" );
final ItemStack newDef = this.itemStack.copy();
/**
* Bounds enforced by {@link ItemStack#isEmpty()}
*/
private static final int MIN_DAMAGE_VALUE = 0;
private static final int MAX_DAMAGE_VALUE = 65535;
if( ignoreMeta )
private final AESharedItemStack lower;
private final AESharedItemStack upper;
public Bounds( final ItemStack stack, final FuzzyMode fuzzy, final boolean ignoreMeta )
{
newDef.setItemDamage( 0 );
Preconditions.checkState( !stack.isEmpty(), "ItemStack#isEmpty() has to be false" );
Preconditions.checkState( stack.getCount() == 1, "ItemStack#getCount() has to be 1" );
final NBTTagCompound tag = stack.hasTagCompound() ? stack.getTagCompound() : null;
this.lower = this.makeLowerBound( stack, tag, fuzzy, ignoreMeta );
this.upper = this.makeUpperBound( stack, tag, fuzzy, ignoreMeta );
}
else
public AESharedItemStack lower()
{
if( newDef.getItem().isDamageable() )
return this.lower;
}
public AESharedItemStack upper()
{
return this.upper;
}
private AESharedItemStack makeLowerBound( final ItemStack itemStack, final NBTTagCompound tag, final FuzzyMode fuzzy, final boolean ignoreMeta )
{
final ItemStack newDef = itemStack.copy();
if( ignoreMeta )
{
if( fuzzy == FuzzyMode.IGNORE_ALL )
newDef.setItemDamage( MIN_DAMAGE_VALUE );
newDef.setTagCompound( tag );
}
else
{
if( newDef.getItem().isDamageable() )
{
newDef.setItemDamage( 0 );
}
else if( fuzzy == FuzzyMode.PERCENT_99 )
{
if( this.itemStack.getItemDamage() == 0 )
if( fuzzy == FuzzyMode.IGNORE_ALL )
{
newDef.setItemDamage( 0 );
newDef.setItemDamage( MIN_DAMAGE_VALUE );
}
else if( fuzzy == FuzzyMode.PERCENT_99 )
{
if( itemStack.getItemDamage() == MIN_DAMAGE_VALUE )
{
newDef.setItemDamage( MIN_DAMAGE_VALUE );
}
else
{
newDef.setItemDamage( MIN_DAMAGE_VALUE + 1 );
}
}
else
{
newDef.setItemDamage( 1 );
final int breakpoint = fuzzy.calculateBreakPoint( itemStack.getMaxDamage() );
final int damage = breakpoint <= itemStack.getItemDamage() ? breakpoint : 0;
newDef.setItemDamage( damage );
}
}
else
{
final int breakpoint = fuzzy.calculateBreakPoint( this.itemStack.getMaxDamage() );
newDef.setItemDamage( breakpoint <= this.itemDamage ? breakpoint : 0 );
}
newDef.setTagCompound( LOW_TAG );
}
newDef.setTagCompound( LOW_TAG );
return new AESharedItemStack( newDef );
}
return new AESharedItemStack( newDef );
}
public AESharedItemStack getUpperBound( final FuzzyMode fuzzy, final boolean ignoreMeta )
{
Preconditions.checkState( this.itemStack.getCount() == 1, "ItemStack#getCount() has to be 1" );
final ItemStack newDef = this.itemStack.copy();
if( ignoreMeta )
private AESharedItemStack makeUpperBound( final ItemStack itemStack, final NBTTagCompound tag, final FuzzyMode fuzzy, final boolean ignoreMeta )
{
newDef.setItemDamage( Integer.MAX_VALUE );
}
else
{
if( newDef.getItem().isDamageable() )
final ItemStack newDef = itemStack.copy();
if( ignoreMeta )
{
if( fuzzy == FuzzyMode.IGNORE_ALL )
newDef.setItemDamage( MAX_DAMAGE_VALUE );
newDef.setTagCompound( tag );
}
else
{
if( newDef.getItem().isDamageable() )
{
newDef.setItemDamage( this.itemStack.getMaxDamage() + 1 );
}
else if( fuzzy == FuzzyMode.PERCENT_99 )
{
if( this.itemStack.getItemDamage() == 0 )
if( fuzzy == FuzzyMode.IGNORE_ALL )
{
newDef.setItemDamage( 0 );
newDef.setItemDamage( itemStack.getMaxDamage() + 1 );
}
else if( fuzzy == FuzzyMode.PERCENT_99 )
{
if( itemStack.getItemDamage() == MIN_DAMAGE_VALUE )
{
newDef.setItemDamage( MIN_DAMAGE_VALUE );
}
else
{
newDef.setItemDamage( itemStack.getMaxDamage() + 1 );
}
}
else
{
newDef.setItemDamage( this.itemStack.getMaxDamage() + 1 );
final int breakpoint = fuzzy.calculateBreakPoint( itemStack.getMaxDamage() );
final int damage = itemStack.getItemDamage() < breakpoint ? breakpoint - 1 : itemStack.getMaxDamage() + 1;
newDef.setItemDamage( damage );
}
}
else
{
final int breakpoint = fuzzy.calculateBreakPoint( this.itemStack.getMaxDamage() );
newDef.setItemDamage( this.itemDamage < breakpoint ? breakpoint - 1 : this.itemStack.getMaxDamage() + 1 );
}
newDef.setTagCompound( HIGH_TAG );
}
newDef.setTagCompound( HIGH_TAG );
return new AESharedItemStack( newDef );
}
return new AESharedItemStack( newDef );
}
}
+4 -5
View File
@@ -31,6 +31,7 @@ import net.minecraftforge.oredict.OreDictionary;
import appeng.api.config.FuzzyMode;
import appeng.api.storage.data.IAEItemStack;
import appeng.api.storage.data.IItemList;
import appeng.util.item.AESharedItemStack.Bounds;
public final class ItemList implements IItemList<IAEItemStack>
@@ -99,8 +100,7 @@ public final class ItemList implements IItemList<IAEItemStack>
return output;
}
} )
.orElse( this.findFuzzyDamage( ais, fuzzy, false ) );
} ).orElse( this.findFuzzyDamage( ais, fuzzy, false ) );
}
@Override
@@ -222,9 +222,8 @@ public final class ItemList implements IItemList<IAEItemStack>
private Collection<IAEItemStack> findFuzzyDamage( final IAEItemStack filter, final FuzzyMode fuzzy, final boolean ignoreMeta )
{
final AEItemStack itemStack = (AEItemStack) filter;
final AESharedItemStack low = itemStack.getSharedStack().getLowerBound( fuzzy, ignoreMeta );
final AESharedItemStack high = itemStack.getSharedStack().getUpperBound( fuzzy, ignoreMeta );
final Bounds bounds = itemStack.getSharedStack().getBounds( fuzzy, ignoreMeta );
return this.records.subMap( low, true, high, true ).descendingMap().values();
return this.records.subMap( bounds.lower(), true, bounds.upper(), true ).descendingMap().values();
}
}
@@ -84,7 +84,8 @@ chat.appliedenergistics2.DeviceNotLinked=Device is not linked.
chat.appliedenergistics2.StationCanNotBeLocated=Station can not be located.
chat.appliedenergistics2.MachineNotPowered=Machine is not powered.
chat.appliedenergistics2.CommunicationError=Error Communicating with Network.
chat.appliedenergistics2.SavedSettings=Copied device configuration to memory card.
chat.appliedenergistics2.SavedSettings=Copied current device configuration to memory card.
chat.appliedenergistics2.ResetSettings=New device configuration created and copied to memory card.
chat.appliedenergistics2.AmmoDepleted=Ammo Depleted.
chat.appliedenergistics2.isNowLocked=Monitor is now Locked.
chat.appliedenergistics2.isNowUnlocked=Monitor is now Unlocked.
@@ -1,4 +1,5 @@
tile.appliedenergistics2.cable_bus.name=AE2 케이블 and/or 버스
// Blocks
tile.appliedenergistics2.cable_bus.name=AE2 케이블 and/or 버스
tile.appliedenergistics2.cell_workbench.name=셀 작업대
tile.appliedenergistics2.charger.name=충전기
tile.appliedenergistics2.chest.name=ME 상자
@@ -12,34 +13,35 @@ tile.appliedenergistics2.drive.name=ME 드라이브
tile.appliedenergistics2.energy_acceptor.name=에너지 수용기
tile.appliedenergistics2.grindstone.name=석영 맷돌
tile.appliedenergistics2.matrix_frame.name=행렬 프레임
tile.appliedenergistics2.io_port.name=ME IO 포트
tile.appliedenergistics2.io_port.name=ME 입출력 포트
tile.appliedenergistics2.inscriber.name=회로 인쇄기
tile.appliedenergistics2.interface.name=ME 인터페이스
tile.appliedenergistics2.fluid_interface.name=ME 유체 인터페이스
tile.appliedenergistics2.quantum_link.name=ME 양자 연결기
tile.appliedenergistics2.quantum_ring.name=ME 양자 고리
tile.appliedenergistics2.fluix_block.name=액정 블럭
tile.appliedenergistics2.quartz_block.name=투스 석영 블
tile.appliedenergistics2.chiseled_quartz_block.name=조각된 투스 석영 블
tile.appliedenergistics2.quartz_block.name=투스 석영 블
tile.appliedenergistics2.chiseled_quartz_block.name=조각된 투스 석영 블
tile.appliedenergistics2.quartz_glass.name=석영 유리
tile.appliedenergistics2.quartz_vibrant_glass.name=공명 석영 유리
tile.appliedenergistics2.quartz_pillar.name=투스 석영 기둥
tile.appliedenergistics2.quartz_vibrant_glass.name=공명 석영 유리
tile.appliedenergistics2.quartz_pillar.name=투스 석영 기둥
tile.appliedenergistics2.quartz_fixture.name=충전된 석영 설비
tile.appliedenergistics2.light_detector.name=빛 감지 설비
tile.appliedenergistics2.spatial_io_port.name=시공 IO 포트
tile.appliedenergistics2.spatial_io_port.name=시공 입출력 포트
tile.appliedenergistics2.spatial_pylon.name=시공 지시탑
tile.appliedenergistics2.tiny_tnt.name=소형 TNT
tile.appliedenergistics2.vibration_chamber.name=공명
tile.appliedenergistics2.vibration_chamber.name=진동
tile.appliedenergistics2.wireless_access_point.name=ME 무선 액세스 포인트
tile.appliedenergistics2.quartz_ore.name=투스 석영 광석
tile.appliedenergistics2.charged_quartz_ore.name=충전된 투스 석영 광석
tile.appliedenergistics2.quartz_ore.name=투스 석영 광석
tile.appliedenergistics2.charged_quartz_ore.name=충전된 투스 석영 광석
tile.appliedenergistics2.security_station.name=ME 보안 단말기
tile.appliedenergistics2.quartz_growth_accelerator.name=결정 성장 촉진기
tile.appliedenergistics2.sky_stone_block.name=천령석
tile.appliedenergistics2.smooth_sky_stone_block.name=천령석 블럭
tile.appliedenergistics2.smooth_sky_stone_block.name=부드러운 천령석
tile.appliedenergistics2.sky_stone_brick.name=천령석 벽돌
tile.appliedenergistics2.sky_stone_small_brick.name=천령석 작은 벽돌
tile.appliedenergistics2.sky_stone_chest.name=천령석 창고
tile.appliedenergistics2.smooth_sky_stone_chest.name=천령석 블럭 창고
tile.appliedenergistics2.sky_stone_chest.name=천령석 상자
tile.appliedenergistics2.smooth_sky_stone_chest.name=천령석 블록 상자
tile.appliedenergistics2.sky_compass.name=운석 탐지기
tile.appliedenergistics2.crafting_monitor.name=조합 모니터
tile.appliedenergistics2.crafting_storage_1k.name=1k 조합법 저장고
@@ -51,31 +53,47 @@ tile.appliedenergistics2.crafting_unit.name=조합 유닛
tile.appliedenergistics2.molecular_assembler.name=분자 조합기
// Stairs
tile.appliedenergistics2.ChiseledQuartzStairBlock.name=Chiseled Certus Quartz Stairs
tile.appliedenergistics2.fluix_stairs.name=Fluix Stairs
tile.appliedenergistics2.QuartzPillarStairBlock.name=Certus Quartz Pillar Stairs
tile.appliedenergistics2.QuartzStairBlock.name=투스 석영 계단
tile.appliedenergistics2.SkyStoneBlockStairBlock.name=스카이 스톤 블록 계단
tile.appliedenergistics2.SkyStoneBrickStairBlock.name=스카이 스톤 벽돌 계단
tile.appliedenergistics2.SkyStoneSmallBrickStairBlock.name=Sky Stone Small Brick Stairs
tile.appliedenergistics2.SkyStoneStairBlock.name=스카이 스톤 계단
tile.appliedenergistics2.fluix_stairs.name=액정 계단
tile.appliedenergistics2.quartz_stairs.name=서투스 석영 계단
tile.appliedenergistics2.chiseled_quartz_stairs.name=조각된 서투스 석영 계단
tile.appliedenergistics2.quartz_pillar_stairs.name=투스 석영 기둥 계단
tile.appliedenergistics2.smooth_sky_stone_stairs.name=부드러운 천령석 계단
tile.appliedenergistics2.sky_stone_brick_stairs.name=천령석 벽돌 계단
tile.appliedenergistics2.sky_stone_small_brick_stairs.name=천령석 작은 벽돌 계단
tile.appliedenergistics2.sky_stone_stairs.name=천령석 계단
chat.appliedenergistics2.ChestCannotReadStorageCell=ME 창고가 셀을 읽을 수 없습니다.
// 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.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.OutOfRange=무선 신호 범위를 이탈했습니다.
chat.appliedenergistics2.InvalidMachine=알 수 없는 기계입니다.
chat.appliedenergistics2.LoadedSettings=설정을 성공적으로 복사했습니다.
chat.appliedenergistics2.DeviceNotPowered=기기의 전력이 부족합니다.
chat.appliedenergistics2.MachineNotPowered=기기가 전력을 받고 있지 않습니다.
chat.appliedenergistics2.DeviceNotPowered=장치의 전력이 부족합니다.
chat.appliedenergistics2.DeviceNotWirelessTerminal=장치가 무선 단말기가 아닙니다.
chat.appliedenergistics2.DeviceNotLinked=장치가 연결되지 않았습니다.
chat.appliedenergistics2.StationCanNotBeLocated=기지가 없습니다.
chat.appliedenergistics2.MachineNotPowered=장치가 전력을 받고 있지 않습니다.
chat.appliedenergistics2.CommunicationError=네트워크와 소통하는 데 문제가 발생했습니다.
chat.appliedenergistics2.SavedSettings=설정을 성공적으로 저장했습니다.
chat.appliedenergistics2.AmmoDepleted=Ammo Depleted.
chat.appliedenergistics2.isNowLocked=Monitor is now Locked.
chat.appliedenergistics2.isNowUnlocked=Monitor is now Unlocked.
chat.appliedenergistics2.AmmoDepleted=암모가 고갈되었습니다.
chat.appliedenergistics2.isNowLocked=모니터가 잠금 상태입니다.
chat.appliedenergistics2.isNowUnlocked=모니터가 잠금 해제되었습니다.
itemGroup.appliedenergistics2=응용 에너지학 2
itemGroup.appliedenergistics2.facades=응용 에너지학 2 - 덮개
// Creative Tabs
itemGroup.appliedenergistics2=응용 에너지학
itemGroup.appliedenergistics2.facades=응용 에너지학(덮개)
// GUI
gui.appliedenergistics2.CraftingTerminal=조합 단말기
gui.appliedenergistics2.METunnel=ME
gui.appliedenergistics2.ItemTunnel=아이템
@@ -84,20 +102,24 @@ gui.appliedenergistics2.RedstoneTunnel=레드스톤
gui.appliedenergistics2.EUTunnel=EU
gui.appliedenergistics2.FETunnel=FE
gui.appliedenergistics2.LightTunnel=빛
gui.appliedenergistics2.OCTunnel=오픈컴퓨터즈
gui.appliedenergistics2.PressureTunnel=압력
gui.appliedenergistics2.security.extract.name=Withdraw
gui.appliedenergistics2.security.inject.name=Deposit
gui.appliedenergistics2.security.craft.name=Craft
gui.appliedenergistics2.security.build.name=Build
gui.appliedenergistics2.security.security.name=Security
gui.appliedenergistics2.security.extract.name=추출
gui.appliedenergistics2.security.inject.name=주입
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=User can modify the physical structure of the network, and make configuration changes.
gui.appliedenergistics2.security.security.tip=User can access and modify the security terminal of the network.
gui.appliedenergistics2.security.build.tip=유저는 네트워크의 물리적 구조를 수정하고 구성을 변경할 수 있습니다.
gui.appliedenergistics2.security.security.tip=유저는 네트워크의 보안 단말기에 액세스하여 수정할 수 있습니다.
gui.appliedenergistics2.Efficiency=효율
gui.appliedenergistics2.SCSSize=SCS 규모
gui.appliedenergistics2.SCSInvalid=무효
gui.appliedenergistics2.RequiredPower=전력 요구량
gui.appliedenergistics2.StoredPower=전력 저장량
gui.appliedenergistics2.MaxPower=최대 전력량
@@ -109,8 +131,9 @@ gui.appliedenergistics2.NoPermissions=아무 권한이 선택되지 않음
gui.appliedenergistics2.SecurityCardEditor=바이오메트릭 카드 에디터
gui.appliedenergistics2.Encoded=기록됨
gui.appliedenergistics2.Priority=우선 순위
gui.appliedenergistics2.StorageBus=스토리지 버스
gui.appliedenergistics2.EnergyDrain=Passive Drain
gui.appliedenergistics2.StorageBus=저장 버스
gui.appliedenergistics2.StorageBusFluids=액체 저장 버스
gui.appliedenergistics2.EnergyDrain=수동 배수기
gui.appliedenergistics2.Installed=설치됨
gui.appliedenergistics2.NetworkTool=네트워크 도구
gui.appliedenergistics2.PowerUsageRate=에너지 사용량
@@ -119,229 +142,293 @@ gui.appliedenergistics2.PortableCell=휴대용 셀
gui.appliedenergistics2.Security=보안 터미널
gui.appliedenergistics2.CellWorkbench=셀 작업대
gui.appliedenergistics2.QuantumLinkChamber=ME 양자 연결기
gui.appliedenergistics2.IOPort=ME IO 포트
gui.appliedenergistics2.IOPort=ME 입출력 포트
gui.appliedenergistics2.Chest=ME 상자
gui.appliedenergistics2.Condenser=Matter Condenser
gui.appliedenergistics2.Condenser=물질 응축기
gui.appliedenergistics2.Config=설정
gui.appliedenergistics2.Drive=ME 드라이브
gui.appliedenergistics2.ExportBus=ME 반출 버스
gui.appliedenergistics2.GrindStone=그라인더
gui.appliedenergistics2.ExportBusFluids=ME 액체 반출 버스
gui.appliedenergistics2.GrindStone=맷돌
gui.appliedenergistics2.ImportBus=ME 반입 버스
gui.appliedenergistics2.ImportBusFluids=ME 액체 반입 버스
gui.appliedenergistics2.Interface=ME 인터페이스
gui.appliedenergistics2.FluidInterface=ME 액체 인터페이스
gui.appliedenergistics2.LevelEmitter=ME 레벨 측정기
gui.appliedenergistics2.Of=Of
gui.appliedenergistics2.Patterns=패턴
gui.appliedenergistics2.SpatialIOPort=시공 IO 포트
gui.appliedenergistics2.Of=
gui.appliedenergistics2.Patterns=패턴
gui.appliedenergistics2.SpatialIOPort=시공 입출력 포트
gui.appliedenergistics2.StoredEnergy=저장된 전력량
gui.appliedenergistics2.StoredItems=저장된 아이템
gui.appliedenergistics2.StoredFluids=저장된 액체
gui.appliedenergistics2.Terminal=터미널
gui.appliedenergistics2.InterfaceTerminal=인터페이스 터미널
gui.appliedenergistics2.InterfaceTerminalHint=인터페이스 터미널에서 보여주거나 숨깁니다
gui.appliedenergistics2.FormationPlane=Formation Plane
gui.appliedenergistics2.VibrationChamber=진동 발전기
gui.appliedenergistics2.NetworkDetails=네트워크 더 보
gui.appliedenergistics2.StorageCells=ME 스토리지 셀
gui.appliedenergistics2.InterfaceTerminalHint=인터페이스 터미널에서 보여주거나 숨깁니다.
gui.appliedenergistics2.FormationPlane=생성면
gui.appliedenergistics2.FluidFormationPlane=액체 생성면
gui.appliedenergistics2.VibrationChamber=진동
gui.appliedenergistics2.NetworkDetails=네트워크 세부 사항
gui.appliedenergistics2.StorageCells=ME 저장 셀
gui.appliedenergistics2.IOBuses=ME 반입/반출 버스
gui.appliedenergistics2.Stores=Stores
gui.appliedenergistics2.BytesUsed=바이트 사용 중
gui.appliedenergistics2.Types=종류들
gui.appliedenergistics2.Blank=Blank
gui.appliedenergistics2.IOBusesFluids=ME 액체 반입/반출 버스
gui.appliedenergistics2.Stores=저장
gui.appliedenergistics2.BytesUsed=사용된 바이트
gui.appliedenergistics2.Types=유형
gui.appliedenergistics2.Blank=공백
gui.appliedenergistics2.Unlinked=연결되지 않음
gui.appliedenergistics2.Linked=연결됨
gui.appliedenergistics2.StoredSize=저장된 사이즈
gui.appliedenergistics2.SkyChest=천령석 창고
gui.appliedenergistics2.StoredSize=저장된 규모
gui.appliedenergistics2.CellId=셀 ID
gui.appliedenergistics2.SkyChest=천령석 상자
gui.appliedenergistics2.PatternTerminal=패턴 터미널
gui.appliedenergistics2.CraftingPattern=조합 터미널
gui.appliedenergistics2.CraftingPattern=조합 패턴
gui.appliedenergistics2.MolecularAssembler=분자 조합기
gui.appliedenergistics2.ProcessingPattern=패턴 제작하기
gui.appliedenergistics2.Crafts=다음을 조합:
gui.appliedenergistics2.And=와(과)
gui.appliedenergistics2.Creates=다음으로 조합:
gui.appliedenergistics2.With=와(과)
gui.appliedenergistics2.Substitute=대리 사용:
gui.appliedenergistics2.Yes=예
gui.appliedenergistics2.No=아니오
gui.appliedenergistics2.InWorldCrafting=AE2 월드 내 조합
gui.appliedenergistics2.inWorldFluix=물 웅덩이에다 1개의 충전된 투스 석영 아이템을 드롭하고 지옥 석영과 래드스톤 가루를 놓고 기다리세요.
gui.appliedenergistics2.inWorldPurificationCertus=물 웅덩이에다 1개의 세투스 석영 씨앗을 드롭하고 모래를 놓고 기다리세요.; 만들어지는 속도를 가속하시려면 결정 성장 촉진기를 넣으세요.
gui.appliedenergistics2.inWorldPurificationNether=Drop a Nether Quartz Seed made from Nether Quartz Dust and Sand into a puddle of water; to make the process faster add Crystal Growth Accelerators.
gui.appliedenergistics2.inWorldPurificationFluix=Drop a 액정 씨앗 made from 액정 가루 and Sand into a puddle of water; to make the process faster add Crystal Growth Accelerators.
gui.appliedenergistics2.inWorldSingularity=To create drop 1 Singularity and 1 Ender Dust and cause an explosion within range of the items.
gui.appliedenergistics2.ChargedQuartz=Charged Certus Quartz is crafted by inserting an uncharged Certus Quartz Crystal into the Charger, and powering it.
gui.appliedenergistics2.ChargedQuartzFind=Charged Certus Quartz can be found in world semi rarely, it appears similar to normal Certus Quartz, except it sparkles.
gui.appliedenergistics2.OfSecondOutput=%1$d%% Chance for second output.
gui.appliedenergistics2.NoSecondOutput=No Secondary Output
gui.appliedenergistics2.SelectAmount=Select Amount
gui.appliedenergistics2.inWorldFluix=물 웅덩이에 충전된 투스 석영 1개를 던지고 지옥 석영과 래드스톤 가루를 놓고 기다리세요.
gui.appliedenergistics2.inWorldPurificationCertus=물 웅덩이에다 서투스 석영 가루로 만든 서투스 석영 씨앗 1개를 던지고 모래를 놓고 기다리세요.; 만들어지는 속도를 가속하시려면 결정 성장 촉진기를 넣으세요.
gui.appliedenergistics2.inWorldPurificationNether=물 웅덩이에다 지옥 석영 가루로 만든 지옥 석영 씨앗 1개를 던지고 모래를 놓고 기다리세요.; 만들어지는 속도를 가속하시려면 결정 성장 촉진기를 넣으세요.
gui.appliedenergistics2.inWorldPurificationFluix=물 웅덩이에다 액정 가루로 만든 액정 씨앗 1개를 던지고 모래를 놓고 기다리세요.; 만들어지는 속도를 가속하시려면 결정 성장 촉진기를 넣으세요.
gui.appliedenergistics2.inWorldSingularity=특이점 1개와 엔더 가루 1개를 아이템 범위 내에서 던지는 것은 폭발을 발생합니다.
gui.appliedenergistics2.ChargedQuartz=충전된 서투스 석영은 충전이 안된 서투스 석영 수정을 충전기에 삽입하여 만들어지고 전력을 내뿜습니다.
gui.appliedenergistics2.ChargedQuartzFind=충전된 서투스 석영은 드물게 발견할 수 있으며, 스파크를 일으키는 것을 제외하고는 평범한 서투스 석영과 비슷하게 나타납니다.
gui.appliedenergistics2.NoSecondOutput=2차 출력 없음
gui.appliedenergistics2.OfSecondOutput=%1$d%%이 2차 출력을 할 수 있습니다.
gui.appliedenergistics2.MultipleOutputs=%1$d%%이 2차 출력, %2$d%%이 3차 출력을 합니다.
gui.appliedenergistics2.SelectAmount=양 선택
gui.appliedenergistics2.CopyMode=복사 모드
gui.appliedenergistics2.CopyModeDesc=Controls if the contents of the configuration pane are cleared when you remove the cell.
gui.appliedenergistics2.CopyModeDesc=셀을 제거할 때 환경설정 창의 내용을 지울지 여부를 제어합니다.
gui.appliedenergistics2.Next=다음
gui.appliedenergistics2.Lumen=Lumen
gui.appliedenergistics2.Empty=Empty
gui.appliedenergistics2.Lumen=루멘
gui.appliedenergistics2.Empty=비어있음
gui.appliedenergistics2.Stored=저장됨
gui.appliedenergistics2.Cancel=취소
gui.appliedenergistics2.ETAFormat=HH:mm:ss
gui.appliedenergistics2.Crafting=제작
gui.appliedenergistics2.Scheduled=예정됨
gui.appliedenergistics2.CraftingStatus=제작 상황
gui.appliedenergistics2.FromStorage=활성화
gui.appliedenergistics2.ToCraft=제작하기
gui.appliedenergistics2.CraftingPlan=Crafting Plan
gui.appliedenergistics2.CraftingPlan=제작 계획
gui.appliedenergistics2.Automatic=자동
gui.appliedenergistics2.Start=시작
gui.appliedenergistics2.Missing=부족
gui.appliedenergistics2.Bytes=저장소
gui.appliedenergistics2.Simulation=시뮬레이션
gui.appliedenergistics2.CoProcessors=Co Processors
gui.appliedenergistics2.CoProcessors=프로세서
gui.appliedenergistics2.CraftingCPU=제작용 CPU
gui.appliedenergistics2.NoCraftingCPUs=제작용 CPU를 사용할 수 없습니다.
gui.appliedenergistics2.CalculatingWait=계산중입니다...
gui.appliedenergistics2.Clean=Clean
gui.appliedenergistics2.Clean=청소
gui.appliedenergistics2.InvalidPattern=알 수 없는 패턴
gui.appliedenergistics2.Range=범위
gui.appliedenergistics2.TransparentFacades=Transparent Facades
gui.appliedenergistics2.TransparentFacadesHint=Controls visibility of facades while the network tool is on your toolbar.
gui.appliedenergistics2.TransparentFacades=투명 덮개
gui.appliedenergistics2.TransparentFacadesHint=도구 모음에 네트워크 도구가 있는 동안 덮개의 가시성을 제어합니다.
gui.appliedenergistics2.CPUs=CPU
gui.appliedenergistics2.NoCraftingJobs=No Crafting Job Active
gui.appliedenergistics2.NoCraftingJobs=조합 작업 활성 없음
gui.appliedenergistics2.FacadeCrafting=덮개 제작
gui.appliedenergistics2.inWorldCraftingPresses=Crafting Presses are found in the center of meteorites which can be found in around the world, they can be located by using a meteorite compass.
gui.appliedenergistics2.Included=Included
gui.appliedenergistics2.Excluded=Excluded
gui.appliedenergistics2.Partitioned=Partitioned
gui.appliedenergistics2.Precise=Precise
gui.appliedenergistics2.Fuzzy=Fuzzy
gui.appliedenergistics2.inWorldCraftingPresses=프레스 조합은 세계 곳곳에서 볼 수 있는 운석 중심에 있으며 운석 탐지기를 이용해 위치를 파악할 수 있습니다.
gui.appliedenergistics2.Included=포함됨
gui.appliedenergistics2.Excluded=제외됨
gui.appliedenergistics2.Partitioned=분할됨
gui.appliedenergistics2.Precise=정밀화
gui.appliedenergistics2.Fuzzy=퍼지
gui.appliedenergistics2.SmallFontCraft=조합
gui.appliedenergistics2.LargeFontCraft=+
gui.appliedenergistics2.Nothing=없음
gui.tooltips.appliedenergistics2.Stash=Store Items
gui.tooltips.appliedenergistics2.StashDesc=Return items on the crafting grid to network storage.
gui.tooltips.appliedenergistics2.Substitutions=Ore-Dict Substitutions
gui.tooltips.appliedenergistics2.SubstitutionsDesc=Edit substitution options for input components.
gui.tooltips.appliedenergistics2.SubstitutionsOn=Substitutions Enabled
gui.tooltips.appliedenergistics2.SubstitutionsOff=Substitutions Disabled
gui.tooltips.appliedenergistics2.Encode=Encode Pattern
gui.tooltips.appliedenergistics2.EncodeDescription=Write the entered pattern to the current encoded pattern, or to available blank pattern.
gui.tooltips.appliedenergistics2.FuzzyMode=Fuzzy Comparison
gui.tooltips.appliedenergistics2.FZPercent_25=Split Damage at 25%
gui.tooltips.appliedenergistics2.FZPercent_50=Split Damage at 50%
gui.tooltips.appliedenergistics2.FZPercent_75=Split Damage at 75%
gui.tooltips.appliedenergistics2.FZPercent_99=Split Damage at 99%
gui.tooltips.appliedenergistics2.SortOrder=Sort Order
gui.tooltips.appliedenergistics2.SortBy=Sort By
gui.tooltips.appliedenergistics2.FZIgnoreAll=Match Any
gui.tooltips.appliedenergistics2.TransferDirection=Transfer Direction
gui.tooltips.appliedenergistics2.TransferToNetwork=Transfer data to Network
gui.tooltips.appliedenergistics2.TransferToStorageCell=Transfer data to Storage Cell
gui.tooltips.appliedenergistics2.ToggleSortDirection=Toggle sorting direction
gui.tooltips.appliedenergistics2.StoredItems=Stored Items
gui.tooltips.appliedenergistics2.StoredCraftable=Stored / Craftable
gui.tooltips.appliedenergistics2.View=View
gui.tooltips.appliedenergistics2.RedstoneMode=Redstone Mode
gui.tooltips.appliedenergistics2.OperationMode=Operation Mode
gui.tooltips.appliedenergistics2.NumberOfItems=Number of items
gui.tooltips.appliedenergistics2.ItemName=Item name
gui.tooltips.appliedenergistics2.PowerUnits=Power Units
gui.tooltips.appliedenergistics2.IOMode=Input/Output Mode
gui.tooltips.appliedenergistics2.CondenserOutput=ME Condenser - Output
gui.tooltips.appliedenergistics2.PartitionStorage=Partition Storage
gui.tooltips.appliedenergistics2.Clear=Clear
gui.tooltips.appliedenergistics2.TrashController=Deletion via Shift / Space Clicking.
gui.tooltips.appliedenergistics2.InterfaceBlockingMode=Blocking Mode
gui.tooltips.appliedenergistics2.InterfaceCraftingMode=Crafting Mode
gui.tooltips.appliedenergistics2.Trash=Destroy Items
gui.tooltips.appliedenergistics2.MatterBalls=Condense Into Matter Balls\n%s per item
gui.tooltips.appliedenergistics2.Singularity=Condense Into Singularities\n%s per item
gui.tooltips.appliedenergistics2.Read=Extract Only
gui.tooltips.appliedenergistics2.Write=Insert Only
gui.tooltips.appliedenergistics2.ReadWrite=Bi-Directional
gui.tooltips.appliedenergistics2.AlwaysActive=Always active
gui.tooltips.appliedenergistics2.ActiveWithoutSignal=Active without signal
gui.tooltips.appliedenergistics2.ActiveWithSignal=Active with signal
gui.tooltips.appliedenergistics2.ActiveOnPulse=Activate once per pulse
gui.tooltips.appliedenergistics2.EmitLevelsBelow=Emit when levels are below or equal to limit.
gui.tooltips.appliedenergistics2.EmitLevelAbove=Emit when levels are above or equal to limit.
gui.tooltips.appliedenergistics2.SearchMode_Auto=Auto Search
gui.tooltips.appliedenergistics2.SearchMode_Standard=Standard Search
gui.tooltips.appliedenergistics2.SearchMode_JEIAuto=JEI Syncronized Auto
gui.tooltips.appliedenergistics2.SearchMode_JEIStandard=JEI Syncronized Standard
gui.tooltips.appliedenergistics2.SearchMode=Search Box Mode
gui.tooltips.appliedenergistics2.PartitionStorageHint=Configures Partition based on currently stored items.
gui.tooltips.appliedenergistics2.ClearSettings=Clear Config/Settings
gui.tooltips.appliedenergistics2.Craftable=Craftable
gui.tooltips.appliedenergistics2.MoveWhenEmpty=Move to output when empty.
gui.tooltips.appliedenergistics2.MoveWhenWorkIsDone=Move to output when work is done.
gui.tooltips.appliedenergistics2.MoveWhenFull=Move to output when full.
gui.tooltips.appliedenergistics2.Disabled=Disabled
gui.tooltips.appliedenergistics2.Enable=Enabled
gui.tooltips.appliedenergistics2.Blocking=Do not push crafing items if inventory contains items.
gui.tooltips.appliedenergistics2.NonBlocking=Ignore the contents of the target inventory.
gui.tooltips.appliedenergistics2.Craft=Crafting Behavior
gui.tooltips.appliedenergistics2.CraftOnly=Do not use stocked items, only craft items while exporting.
gui.tooltips.appliedenergistics2.CraftEither=Use stocked items, or craft items while exporting.
gui.tooltips.appliedenergistics2.LevelType=Level Type
gui.tooltips.appliedenergistics2.LevelType_Energy=Energy
gui.tooltips.appliedenergistics2.LevelType_Item=Item
gui.tooltips.appliedenergistics2.InventoryTweaks=인벤토리 트윅
// 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.SubstitutionsDesc=요소 삽입을 위해 대체 설정을 수정합니다.
gui.tooltips.appliedenergistics2.SubstitutionsOn=대체 활성화
gui.tooltips.appliedenergistics2.SubstitutionsOff=대체 비활성화
gui.tooltips.appliedenergistics2.Encode=패턴 인코딩
gui.tooltips.appliedenergistics2.EncodeDescription=입력된 패턴을 현재 인코딩된 패턴 또는 사용 가능한 빈 패턴에 기록합니다.
gui.tooltips.appliedenergistics2.FuzzyMode=퍼지 비교
gui.tooltips.appliedenergistics2.FZPercent_25=분할 손상도 25%
gui.tooltips.appliedenergistics2.FZPercent_50=분할 손상도 50%
gui.tooltips.appliedenergistics2.FZPercent_75=분할 손상도 75%
gui.tooltips.appliedenergistics2.FZPercent_99=분할 손상도 99%
gui.tooltips.appliedenergistics2.SortOrder=정렬 순서
gui.tooltips.appliedenergistics2.SortBy=정렬 기준
gui.tooltips.appliedenergistics2.FZIgnoreAll=일치
gui.tooltips.appliedenergistics2.TransferDirection=전송 방향
gui.tooltips.appliedenergistics2.TransferToNetwork=데이터를 네트워크로 전송
gui.tooltips.appliedenergistics2.TransferToStorageCell=데이터를 저장 셀로 전송
gui.tooltips.appliedenergistics2.ToggleSortDirection=방향 정렬을 토글하기
gui.tooltips.appliedenergistics2.StoredItems=저장된 아이템
gui.tooltips.appliedenergistics2.StoredCraftable=저장 / 조합 가능
gui.tooltips.appliedenergistics2.View=보기
gui.tooltips.appliedenergistics2.RedstoneMode=레드스톤 모드
gui.tooltips.appliedenergistics2.OperationMode=운용 모드
gui.tooltips.appliedenergistics2.NumberOfItems=아이템 갯수
gui.tooltips.appliedenergistics2.ItemName=아이템 이름
gui.tooltips.appliedenergistics2.PowerUnits=파워 유닛
gui.tooltips.appliedenergistics2.IOMode=입출력 모드
gui.tooltips.appliedenergistics2.CondenserOutput=ME 콘덴서 - 출력
gui.tooltips.appliedenergistics2.PartitionStorage=부분 저장고
gui.tooltips.appliedenergistics2.Clear=청소
gui.tooltips.appliedenergistics2.TrashController=Shift/Space를 눌러 삭제하세요.
gui.tooltips.appliedenergistics2.InterfaceBlockingMode=차단 모드
gui.tooltips.appliedenergistics2.InterfaceCraftingMode=조합 모드
gui.tooltips.appliedenergistics2.Trash=아이템 파괴
gui.tooltips.appliedenergistics2.MatterBalls=재료공에 냉각하기\n아이템 당 %s
gui.tooltips.appliedenergistics2.Singularity=특이점에 냉각하기\n아이템 당 %s
gui.tooltips.appliedenergistics2.Read=추출 한정
gui.tooltips.appliedenergistics2.Write=주입 한정
gui.tooltips.appliedenergistics2.ReadWrite=쌍방향
gui.tooltips.appliedenergistics2.AlwaysActive=항상 활성화
gui.tooltips.appliedenergistics2.ActiveWithoutSignal=신호없는 활성화
gui.tooltips.appliedenergistics2.ActiveWithSignal=신호있는 활성화
gui.tooltips.appliedenergistics2.ActiveOnPulse=한 파동 당 활성화
gui.tooltips.appliedenergistics2.EmitLevelsBelow=레벨이 제한보다 낮거나 같은 경우 수신합니다.
gui.tooltips.appliedenergistics2.EmitLevelAbove=레벨이 한계 이상일 때 발생합니다.
gui.tooltips.appliedenergistics2.SearchMode_Auto=자동 검색
gui.tooltips.appliedenergistics2.SearchMode_Standard=표준 검색
gui.tooltips.appliedenergistics2.SearchMode_JEIAuto=JEI 자동 동기화
gui.tooltips.appliedenergistics2.SearchMode_JEIStandard=JEI 표준 동기화
gui.tooltips.appliedenergistics2.SearchMode=검색 상자 모드
gui.tooltips.appliedenergistics2.PartitionStorageHint=현재 저장된 아이템을 기준으로 파티션을 구성합니다.
gui.tooltips.appliedenergistics2.ClearSettings=설정 지우기
gui.tooltips.appliedenergistics2.Craftable=조합 가능
gui.tooltips.appliedenergistics2.MoveWhenEmpty=비어있을 때 출력을 위해 움직입니다.
gui.tooltips.appliedenergistics2.MoveWhenWorkIsDone=작동할 때 출력을 위해 움직입니다.
gui.tooltips.appliedenergistics2.MoveWhenFull=채워질 때 출력을 위해 움직입니다.
gui.tooltips.appliedenergistics2.Disabled=비활성화
gui.tooltips.appliedenergistics2.Enable=비활성화
gui.tooltips.appliedenergistics2.Blocking=인벤토리에 아이템이 있다면 아이템 조합을 넣지 마세요.
gui.tooltips.appliedenergistics2.NonBlocking=타겟 인벤토리의 내용을 무시하세요.
gui.tooltips.appliedenergistics2.Craft=행동 조합
gui.tooltips.appliedenergistics2.CraftOnly=유출하는 동안 쌓은 아이템을 사용하지 않고, 오직 아이템만 조합 하세요.
gui.tooltips.appliedenergistics2.CraftEither=유출하는 동안 쌓은 아이템을 사용하거나 아이템을 조합하세요.
gui.tooltips.appliedenergistics2.LevelType=레벨 유형
gui.tooltips.appliedenergistics2.LevelType_Energy=에너지
gui.tooltips.appliedenergistics2.LevelType_Item=아이템
gui.tooltips.appliedenergistics2.InventoryTweaks=인벤토리 트위크
gui.tooltips.appliedenergistics2.Mod=모드
gui.tooltips.appliedenergistics2.TerminalStyle=Terminal Style
gui.tooltips.appliedenergistics2.TerminalStyle_Full=Full Screen Terminal
gui.tooltips.appliedenergistics2.TerminalStyle_Tall=Tall Centered Terminal
gui.tooltips.appliedenergistics2.TerminalStyle_Small=Small Centered Terminal
gui.tooltips.appliedenergistics2.DoesntDespawn=This item won't de-spawn.
gui.tooltips.appliedenergistics2.EmitterMode=Crafting Emitter Mode
gui.tooltips.appliedenergistics2.CraftViaRedstone=Emit Redstone to craft item.
gui.tooltips.appliedenergistics2.EmitWhenCrafting=Emit Redstone while item is crafting.
gui.tooltips.appliedenergistics2.ReportInaccessibleItems=Report Inaccessible Items
gui.tooltips.appliedenergistics2.ReportInaccessibleItemsYes=Yes: Items that cannot be extracted will be visible.
gui.tooltips.appliedenergistics2.ReportInaccessibleItemsNo=No: Only extractable items will be visible.
gui.tooltips.appliedenergistics2.TerminalStyle=터미널 방식
gui.tooltips.appliedenergistics2.TerminalStyle_Full=풀 스크린 터미널
gui.tooltips.appliedenergistics2.TerminalStyle_Tall=긴 집중 터미널
gui.tooltips.appliedenergistics2.TerminalStyle_Small=짧은 집중 터미널
gui.tooltips.appliedenergistics2.DoesntDespawn=이 아이템은 디스폰하지 않을 것입니다.
gui.tooltips.appliedenergistics2.EmitterMode=처리 조합 모드
gui.tooltips.appliedenergistics2.CraftViaRedstone=레드스톤을 꺼내어 아이템을 조합하세요.
gui.tooltips.appliedenergistics2.EmitWhenCrafting=아이템을 조합하는 동안 레드스톤을 꺼내세요.
gui.tooltips.appliedenergistics2.ReportInaccessibleItems=액세스할 수 없는 아이템 보고
gui.tooltips.appliedenergistics2.ReportInaccessibleItemsYes=예: 추출될 수 없는 아이템은 보일 것입니다.
gui.tooltips.appliedenergistics2.ReportInaccessibleItemsNo=아니오: 추출 가능한 아이템은 보일 것입니다.
gui.tooltips.appliedenergistics2.ReportInaccessibleFluids=엑세스할 수 없는 액체 보고
gui.tooltips.appliedenergistics2.ReportInaccessibleFluidsYes=예: 추출될 수 없는 액체는 보일 것입니다.
gui.tooltips.appliedenergistics2.ReportInaccessibleFluidsNo=아니오: 추출 가능한 아이템은 보일 것입니다.
gui.tooltips.appliedenergistics2.BlockPlacement=블록 설치
gui.tooltips.appliedenergistics2.BlockPlacementYes=블록은 블록으로서 설치될 수 있습니다.
gui.tooltips.appliedenergistics2.BlockPlacementNo=블록은 아이템으로서 드롭될 수 있습니다.
gui.tooltips.appliedenergistics2.SchedulingMode=일정 모드
gui.tooltips.appliedenergistics2.SchedulingModeDefault=네트워크가 비어 있을 때까지 첫 번째 아이템을 내보낸 후 다음 아이템을 시도해 보세요.
gui.tooltips.appliedenergistics2.SchedulingModeRoundRobin=라운드 로빈 모드를 사용하여 내보냅니다.
gui.tooltips.appliedenergistics2.SchedulingModeRandom=아이템을 임의 모드로 내보냅니다.
gui.tooltips.appliedenergistics2.FilterMode=검색 필터 모드
gui.tooltips.appliedenergistics2.FilterModeKeep=이전 검색 필터를 복원합니다.
gui.tooltips.appliedenergistics2.FilterModeClear=각 오픈마다 청소합니다.
gui.tooltips.appliedenergistics2.ItemsStored=아이템 저장: %s
gui.tooltips.appliedenergistics2.ItemsRequestable=아이템 요청: %s
gui.tooltips.appliedenergistics2.P2PFrequency=빈도: %s
// Units
gui.appliedenergistics2.units.appliedenergstics=AE
gui.appliedenergistics2.units.ic2=에너지 단위(EU)
gui.appliedenergistics2.units.rf=레드스톤 유율(RF)
gui.appliedenergistics2.units.ic2=EU
gui.appliedenergistics2.units.rf=RF
gui.appliedenergistics2.White=하양
// Colors
gui.appliedenergistics2.White=흰색
gui.appliedenergistics2.Orange=주황
gui.appliedenergistics2.Magenta=자홍색
gui.appliedenergistics2.LightBlue=밝은 파랑
gui.appliedenergistics2.Yellow=노랑
gui.appliedenergistics2.LightBlue=하늘색
gui.appliedenergistics2.Yellow=노랑
gui.appliedenergistics2.Lime=연두색
gui.appliedenergistics2.Pink=분홍색
gui.appliedenergistics2.Gray=회색
gui.appliedenergistics2.LightGray=회색
gui.appliedenergistics2.LightGray=밝은 회색
gui.appliedenergistics2.Cyan=청록색
gui.appliedenergistics2.Purple=보라
gui.appliedenergistics2.Blue=파랑
gui.appliedenergistics2.Purple=보라
gui.appliedenergistics2.Blue=파랑
gui.appliedenergistics2.Brown=갈색
gui.appliedenergistics2.Green=초록색
gui.appliedenergistics2.Red=빨강
gui.appliedenergistics2.Black=검정
gui.appliedenergistics2.Red=빨강
gui.appliedenergistics2.Black=검정
gui.appliedenergistics2.Fluix=액정
// Waila
waila.appliedenergistics2.Crafting=조합
waila.appliedenergistics2.DeviceOnline=장치 켜짐
waila.appliedenergistics2.DeviceOffline=장치 꺼짐
waila.appliedenergistics2.DeviceMissingChannel=Device Missing Channel
waila.appliedenergistics2.Locked=잠겨있음
waila.appliedenergistics2.DeviceMissingChannel=채널을 잃은 장치
waila.appliedenergistics2.Locked=잠겨 있음
waila.appliedenergistics2.Unlocked=잠겨있지 않음
waila.appliedenergistics2.Showing=Showing
waila.appliedenergistics2.Contains=Contains
waila.appliedenergistics2.Channels=%1$d of %2$d 채널
waila.appliedenergistics2.Showing=공개
waila.appliedenergistics2.Contains=포함
waila.appliedenergistics2.Channels=%1$d %2$d 채널
waila.appliedenergistics2.P2PUnlinked=접속 안됨
waila.appliedenergistics2.P2PInputOneOutput=접속됨 (입력면)
waila.appliedenergistics2.P2PInputManyOutputs=접속됨 (입력면) - %d 출력
waila.appliedenergistics2.P2POutput=접속됨 (출력면)
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.creative_storage_cell.name=크리에이티브 ME 저장용 셀
item.appliedenergistics2.encoded_pattern.name=쓰여진 패턴
item.appliedenergistics2.view_cell.name=View Cell
// TheOneProbe
theoneprobe.appliedenergistics2.crafting=조합: %1$s
theoneprobe.appliedenergistics2.device_online=장치 켜짐
theoneprobe.appliedenergistics2.device_offline=장치 꺼짐
theoneprobe.appliedenergistics2.device_missing_channel=채널을 잃은 장치
theoneprobe.appliedenergistics2.locked=잠겨 있음
theoneprobe.appliedenergistics2.unlocked=잠겨있지 않음
theoneprobe.appliedenergistics2.showing=공개
theoneprobe.appliedenergistics2.contains=포함
theoneprobe.appliedenergistics2.channels=%1$d의 %2$d 채널
theoneprobe.appliedenergistics2.p2p_unlinked=접속 안됨
theoneprobe.appliedenergistics2.p2p_input_one_output=접속됨 (입력면)
theoneprobe.appliedenergistics2.p2p_input_many_outputs=접속됨 (입력면) - %d 출력
theoneprobe.appliedenergistics2.p2p_output=접속됨 (출력면)
theoneprobe.appliedenergistics2.p2p_frequency=빈도: %1$s
theoneprobe.appliedenergistics2.stored_energy=%1$d / %2$d
// 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.creative_storage_cell.name=크리에이티브 ME 저장 셀
item.appliedenergistics2.encoded_pattern.name=인코딩된 패턴
item.appliedenergistics2.view_cell.name=뷰 셀
item.appliedenergistics2.facade.name=케이블 덮개
item.appliedenergistics2.crystal_seed.certus.name=투스 석영 씨앗
item.appliedenergistics2.crystal_seed.certus.name=투스 석영 씨앗
item.appliedenergistics2.crystal_seed.nether.name=지옥 석영 씨앗
item.appliedenergistics2.crystal_seed.fluix.name=액정 씨앗
item.appliedenergistics2.material.invalid_type.name=이 아이템은 비활성화됨
item.appliedenergistics2.material.advanced_card.name=Advanced Card
item.appliedenergistics2.material.annihilation_core.name=Annihilation Core
item.appliedenergistics2.material.advanced_card.name=고급 카드
item.appliedenergistics2.material.annihilation_core.name=소멸 코어
item.appliedenergistics2.material.basic_card.name=기본 카드
item.appliedenergistics2.material.blank_pattern.name=빈 패턴
item.appliedenergistics2.material.calculation_processor.name=Calculation Processor
item.appliedenergistics2.material.card_capacity.name=Capacity Card
item.appliedenergistics2.material.card_fuzzy.name=Fuzzy Card
item.appliedenergistics2.material.card_inverter.name=Inverter Card
item.appliedenergistics2.material.calculation_processor.name=계산 프로세서
item.appliedenergistics2.material.card_capacity.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=Acceleration Card
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³ 시공 요소
@@ -349,26 +436,30 @@ 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.certus_quartz_crystal.name=세투스 석영 결정체
item.appliedenergistics2.material.certus_quartz_crystal_charged.name=충전된 세투스 석영 결정체
item.appliedenergistics2.material.certus_quartz_dust.name=세투스 석영 가루
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.certus_quartz_crystal.name=서투스 석영 수정
item.appliedenergistics2.material.certus_quartz_crystal_charged.name=충전된 서투스 석영 수정
item.appliedenergistics2.material.certus_quartz_dust.name=서투스 석영 가루
item.appliedenergistics2.material.empty_storage_cell.name=빈 ME 저장 셀
item.appliedenergistics2.material.ender_dust.name=엔더 가루
item.appliedenergistics2.material.engineering_processor.name=공학 처리기
item.appliedenergistics2.material.flour.name=Flour
item.appliedenergistics2.material.fluix_crystal.name=액정 결정체
item.appliedenergistics2.material.engineering_processor.name=공학 프로세서
item.appliedenergistics2.material.flour.name=가루
item.appliedenergistics2.material.fluix_crystal.name=액정 수정
item.appliedenergistics2.material.fluix_dust.name=액정 가루
item.appliedenergistics2.material.fluix_pearl.name=액정 진주
item.appliedenergistics2.material.formation_core.name=형성 코어
item.appliedenergistics2.material.gold_dust.name=금 가루
item.appliedenergistics2.material.iron_dust.name=철 가루
item.appliedenergistics2.material.logic_processor.name=논리 처리기
item.appliedenergistics2.material.logic_processor_asm.name=미완성된 논리 처리기
item.appliedenergistics2.material.logic_processor.name=논리 프로세서
item.appliedenergistics2.material.logic_processor_asm.name=미완성된 논리 프로세서
item.appliedenergistics2.material.matter_ball.name=물질 공
item.appliedenergistics2.material.nether_quartz_dust.name=지옥 석영 가루
item.appliedenergistics2.material.purified_certus_quartz_crystal.name=순수한 투스 석영 결정체
item.appliedenergistics2.material.purified_fluix_crystal.name=순수한 액정 결정체
item.appliedenergistics2.material.purified_nether_quartz_crystal.name=순수한 지옥 석영 결정체
item.appliedenergistics2.material.purified_certus_quartz_crystal.name=순수한 투스 석영 수정
item.appliedenergistics2.material.purified_fluix_crystal.name=순수한 액정 수정
item.appliedenergistics2.material.purified_nether_quartz_crystal.name=순수한 지옥 석영 수정
item.appliedenergistics2.material.quantum_entangled_singularity.name=양자얽힘 특이점
item.appliedenergistics2.material.silicon.name=실리콘
item.appliedenergistics2.material.singularity.name=특이점
@@ -388,43 +479,54 @@ item.appliedenergistics2.material.sky_dust.name=천령석 가루
item.appliedenergistics2.material.card_crafting.name=조합 카드
item.appliedenergistics2.multi_part.annihilation_plane.name=ME 소멸 평면
item.appliedenergistics2.multi_part.fluid_annihilation_plane.name=ME 액체 소멸 평면
item.appliedenergistics2.multi_part.identity_annihilation_plane.name=ME 확인 소멸 평면
item.appliedenergistics2.multi_part.cable_anchor.name=케이블 앵커
item.appliedenergistics2.multi_part.cable_covered.name=ME 차폐 케이블
item.appliedenergistics2.multi_part.cable_glass.name=ME 유리 케이블
item.appliedenergistics2.multi_part.cable_smart.name=ME 스마트 케이블
item.appliedenergistics2.multi_part.cable_dense_smart.name=ME 조밀 케이블
item.appliedenergistics2.multi_part.cable_dense_smart.name=ME 조밀 스마트 케이블
item.appliedenergistics2.multi_part.storage_monitor.name=ME 저장고 모니터
item.appliedenergistics2.multi_part.conversion_monitor.name=ME 변환 모니터
item.appliedenergistics2.multi_part.crafting_terminal.name=ME 조합 단말기
item.appliedenergistics2.multi_part.crafting_terminal.name=ME 조합 터미널
item.appliedenergistics2.multi_part.semi_dark_monitor.name=조명판
item.appliedenergistics2.multi_part.monitor.name=밝은 조명판
item.appliedenergistics2.multi_part.dark_monitor.name=어두운 조명판
item.appliedenergistics2.multi_part.export_bus.name=ME Export 버스
item.appliedenergistics2.multi_part.formation_plane.name=ME 생성 평면
item.appliedenergistics2.multi_part.import_bus.name=ME 입력 버스
item.appliedenergistics2.multi_part.export_bus.name=ME 유출 버스
item.appliedenergistics2.multi_part.fluid_export_bus.name=ME 액체 유출 버스
item.appliedenergistics2.multi_part.formation_plane.name=ME 생성면
item.appliedenergistics2.multi_part.fluid_formation_plane.name=ME 액체 생성면
item.appliedenergistics2.multi_part.import_bus.name=ME 유입 버스
item.appliedenergistics2.multi_part.fluid_import_bus.name=ME 액체 유입 버스
item.appliedenergistics2.multi_part.interface.name=ME 인터페이스
item.appliedenergistics2.multi_part.fluid_interface.name=ME 액체 인터페이스
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.quartz_fiber.name=Quartz Fiber
item.appliedenergistics2.multi_part.storage_bus.name=ME 저장 요소
item.appliedenergistics2.multi_part.quartz_fiber.name=석영 섬유
item.appliedenergistics2.multi_part.storage_bus.name=ME 저장 버스
item.appliedenergistics2.multi_part.fluid_storage_bus.name=ME 액체 저장 버스
item.appliedenergistics2.multi_part.terminal.name=ME 터미널
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.crafting_monitor.name=ME 조합 모니터
item.appliedenergistics2.multi_part.interface_terminal.name=ME 인터페이스 터미널
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=2³ 시공 셀
item.appliedenergistics2.certus_quartz_axe.name=투스 석영 도끼
item.appliedenergistics2.certus_quartz_cutting_knife.name=투스 석영 커터칼
item.appliedenergistics2.certus_quartz_hoe.name=투스 석영 괭이
item.appliedenergistics2.certus_quartz_pickaxe.name=투스 석영 곡괭이
item.appliedenergistics2.certus_quartz_spade.name=투스 석영 삽
item.appliedenergistics2.certus_quartz_sword.name=투스 석영 검
item.appliedenergistics2.certus_quartz_wrench.name=투스 석영 렌치
item.appliedenergistics2.certus_quartz_axe.name=투스 석영 도끼
item.appliedenergistics2.certus_quartz_cutting_knife.name=투스 석영 커터칼
item.appliedenergistics2.certus_quartz_hoe.name=투스 석영 괭이
item.appliedenergistics2.certus_quartz_pickaxe.name=투스 석영 곡괭이
item.appliedenergistics2.certus_quartz_spade.name=투스 석영 삽
item.appliedenergistics2.certus_quartz_sword.name=투스 석영 검
item.appliedenergistics2.certus_quartz_wrench.name=투스 석영 렌치
item.appliedenergistics2.nether_quartz_axe.name=지옥 석영 도끼
item.appliedenergistics2.nether_quartz_cutting_knife.name=지옥 석영 커터칼
@@ -438,74 +540,83 @@ item.appliedenergistics2.paint_ball.name=페인트 공
item.appliedenergistics2.portable_cell.name=휴대용 셀
item.appliedenergistics2.network_tool.name=네트워크 도구
item.appliedenergistics2.charged_staff.name=충전된 스태프
item.appliedenergistics2.entropy_manipulator.name=Entropy Manipulator
item.appliedenergistics2.matter_cannon.name=메터 캐논
item.appliedenergistics2.entropy_manipulator.name=엔트로피 조종기
item.appliedenergistics2.matter_cannon.name=물질 대포
item.appliedenergistics2.memory_card.name=메모리 카드
item.appliedenergistics2.color_applicator.name=Color Applicator
item.appliedenergistics2.color_applicator.name=색상 적용기
item.appliedenergistics2.wireless_terminal.name무선 터미널
item.appliedenergistics2.biometric_card.name=바이오메트릭 카드
item.appliedenergistics2.debug_card.name=Dev.DebugCard
item.appliedenergistics2.debug_replicator_card.name=Dev.ReplicatorCard
item.appliedenergistics2.debug_card.name=디버그 카드
item.appliedenergistics2.debug_replicator_card.name=복제 카드
commands.ae2.usage=Commands provided by Applied Energistics 2 - use /ae2 list for a list, and /ae2 help _____ for help with a command.
commands.ae2.permissions=You do not have adequate permissions to run this command.
commands.ae2.ChunkLogger=Toggles Chunk Loading and unloading to the server log. ( OP )
commands.ae2.ChunkLoggerOn=청크 로깅이 켜졌습니다
commands.ae2.ChunkLoggerOff=청크 로깅이 졌습니다
commands.ae2.Supporters=Displays a list of AE2 Supporters
// Commands
commands.ae2.usage=응용 에너지학 모드에서 제공되는 명령어는 다음과 같습니다. - 목록은 /ae2 list를 사용하고, 명령어 도움말은 /ae2 help _____를 사용하세요.
commands.ae2.permissions=이 명령어를 실행할 수 있는 적절한 권한이 없습니다.
commands.ae2.ChunkLogger=청크 로드 및 서버 로그 로딩을 전환합니다. (OP)
commands.ae2.ChunkLoggerOn=청크 로깅이 졌습니다.
commands.ae2.ChunkLoggerOff=청크 로깅이 꺼졌습니다.
commands.ae2.Supporters=응용 에너지학 모드의 지원자 목록을 공개합니다.
achievement.ae2.Compass=Meteorite Hunter
achievement.ae2.Compass.desc=Craft a Meteorite Compass
achievement.ae2.Presses=Unknown Technology
achievement.ae2.Presses.desc=Find a Processor Press
achievement.ae2.SpatialIO=Spatial Coordination
achievement.ae2.SpatialIO.desc=Craft a Spatial IO Port
achievement.ae2.SpatialIOExplorer=To boldly go
achievement.ae2.SpatialIOExplorer.desc=Get stored in a spatial storage cell
achievement.ae2.StorageCell=Better Then Chests
achievement.ae2.StorageCell.desc=Craft a Storage Cell
achievement.ae2.IOPort=Storage Cell Shuffle
achievement.ae2.IOPort.desc=Craft a IO Port
achievement.ae2.CraftingTerminal=A (Much) Bigger Table
achievement.ae2.CraftingTerminal.desc=Craft a Crafting Terminal
achievement.ae2.PatternTerminal=Crafting Maestro
achievement.ae2.PatternTerminal.desc=Craft a Pattern Terminal
achievement.ae2.ChargedQuartz=Shocking
achievement.ae2.ChargedQuartz.desc=Find Charged Quartz
achievement.ae2.Fluix=Unnatural
achievement.ae2.Fluix.desc=Create Fluix Crystals
achievement.ae2.Charger=Fluix Production
achievement.ae2.Charger.desc=Craft a Charger
achievement.ae2.CrystalGrowthAccelerator=Accelerator is an understatement
achievement.ae2.CrystalGrowthAccelerator.desc=Craft a Crystal Growth Accelerator
// Achievements
achievement.ae2.Root=응용 에너지학
achievement.ae2.Root.desc=상자가 충분치 않을 때
achievement.ae2.Compass=운석 사냥꾼
achievement.ae2.Compass.desc=운석 탐지기 조합
achievement.ae2.Presses=알려지지 않은 기술
achievement.ae2.Presses.desc=프로세서 프레스 발견
achievement.ae2.SpatialIO=공간 조정
achievement.ae2.SpatialIO.desc=시공 입출력 포트 조합
achievement.ae2.SpatialIOExplorer=대담하게 가다
achievement.ae2.SpatialIOExplorer.desc=시공 저장 셀에 저장
achievement.ae2.StorageCell=상자보다 그뤠잇
achievement.ae2.StorageCell.desc=저장 셀 조합
achievement.ae2.IOPort=저장 셀 순서 섞기
achievement.ae2.IOPort.desc=입출력 포트 조합
achievement.ae2.CraftingTerminal=더 큰 탁자
achievement.ae2.CraftingTerminal.desc=조합 터미널 조합
achievement.ae2.PatternTerminal=마에스트로 조합
achievement.ae2.PatternTerminal.desc=패턴 터미널 조합
achievement.ae2.ChargedQuartz=슈퍼그뤠잇!
achievement.ae2.ChargedQuartz.desc=충전된 수정 발견
achievement.ae2.Fluix=비자연
achievement.ae2.Fluix.desc=액정 수정 발견
achievement.ae2.Charger=액정 생산
achievement.ae2.Charger.desc=충전기 조합
achievement.ae2.CrystalGrowthAccelerator=가속기는 절제
achievement.ae2.CrystalGrowthAccelerator.desc=결정 성장 촉진기 조합
achievement.ae2.GlassCable=유동 에너지 연결
achievement.ae2.GlassCable.desc=ME 유리 케이블을 제작
achievement.ae2.Networking1=Network Apprentice
achievement.ae2.Networking1.desc=Reach 8 channel using devices on a network.
achievement.ae2.Controller=Networking Switchboard
achievement.ae2.Controller.desc=제어기를 제작
achievement.ae2.GlassCable.desc=ME 유리 케이블 조합
achievement.ae2.Networking1=네트워크 견습생
achievement.ae2.Networking1.desc=네트워크에 사용하는 장치를 8채널에 도달
achievement.ae2.Controller=네트워크 교환대
achievement.ae2.Controller.desc=제어기 조합
achievement.ae2.Networking2=네트워크 엔지니어
achievement.ae2.Networking2.desc=Reach 128 channel using devices on a network.
achievement.ae2.Networking3=Network Administrator
achievement.ae2.Networking3.desc=Reach 2048 channel using devices on a network.
achievement.ae2.P2P=Point to Point Networking
achievement.ae2.P2P.desc=Craft a P2P Tunnel
achievement.ae2.Recursive=Recursive Networking
achievement.ae2.Recursive.desc=Place a Interface on a storage Bus.
achievement.ae2.CraftingCPU=Next Gen Crafting
achievement.ae2.CraftingCPU.desc=Craft a Crafting Unit
achievement.ae2.Facade=Network Aesthetics
achievement.ae2.Facade.desc=Craft a Cable Facade
achievement.ae2.NetworkTool=Network Diagnostics
achievement.ae2.NetworkTool.desc=Craft a Network Tool
achievement.ae2.PortableCell=Storage Nomad
achievement.ae2.PortableCell.desc=Craft a Portable Cell
achievement.ae2.StorageBus=Limitless Potential
achievement.ae2.StorageBus.desc=Craft a Storage Bus
achievement.ae2.QNB=Quantum Tunneling
achievement.ae2.QNB.desc=Craft a Quantum Link
achievement.ae2.Networking2.desc=네트워크에 사용하는 장치를 128채널에 도달
achievement.ae2.Networking3=네트워크 관리자
achievement.ae2.Networking3.desc=네트워크에 사용하는 장치를 2048채널에 도달
achievement.ae2.P2P=P2P 네트워크
achievement.ae2.P2P.desc=P2P 터널 조합
achievement.ae2.Recursive=재귀적 네트워킹
achievement.ae2.Recursive.desc=저장 버스에 인터페이스 설치
achievement.ae2.CraftingCPU=차세대 조합
achievement.ae2.CraftingCPU.desc=조합 유닛 조합
achievement.ae2.Facade=네트워크 미학
achievement.ae2.Facade.desc=케이블 덮개 조합
achievement.ae2.NetworkTool=네트워크 진단
achievement.ae2.NetworkTool.desc=네트워크 도구 제작
achievement.ae2.PortableCell=저장 유목민
achievement.ae2.PortableCell.desc=휴대용 셀 제작
achievement.ae2.StorageBus=한계없는 잠재력
achievement.ae2.StorageBus.desc=저장 버스 조합
achievement.ae2.QNB=양자 터널링
achievement.ae2.QNB.desc=양자 링크 조합
stat.ae2.ItemsInserted=Items added to ME Storage
stat.ae2.ItemsExtracted=Items extracted from ME Storage
stat.ae2.TurnedCranks=Turned Cranks
// Stats
stat.ae2.ItemsInserted=아이템이 ME 저장고에 추가되었습니다.
stat.ae2.ItemsExtracted=아이템이 ME 저장고로부터 추출되었습니다.
stat.ae2.TurnedCranks=전환된 크랭크
//Keys
key.appliedenergistics2.category=응용 에너지학
key.toggle_focus.desc=상자를 집중적으로 토글하면서 검색하세요.
@@ -1,4 +1,4 @@
// 方块
// Blocks (方块)
tile.appliedenergistics2.cable_bus.name=AE2线缆和(或)总线
tile.appliedenergistics2.cell_workbench.name=元件工作台
tile.appliedenergistics2.charger.name=充能器
@@ -16,6 +16,7 @@ tile.appliedenergistics2.matrix_frame.name=矩阵框架
tile.appliedenergistics2.io_port.name=ME-IO端口
tile.appliedenergistics2.inscriber.name=压印器
tile.appliedenergistics2.interface.name=ME接口
tile.appliedenergistics2.fluid_interface.name=ME流体接口
tile.appliedenergistics2.quantum_link.name=ME量子链接仓
tile.appliedenergistics2.quantum_ring.name=ME量子环
tile.appliedenergistics2.fluix_block.name=福鲁伊克斯块
@@ -51,7 +52,7 @@ tile.appliedenergistics2.crafting_accelerator.name=并行处理单元
tile.appliedenergistics2.crafting_unit.name=合成单元
tile.appliedenergistics2.molecular_assembler.name=分子装配室
// 楼梯
// Stairs (楼梯)
tile.appliedenergistics2.fluix_stairs.name=錾制赛特斯石英楼梯
tile.appliedenergistics2.quartz_stairs.name=福鲁伊克斯楼梯
tile.appliedenergistics2.chiseled_quartz_stairs.name=竖纹赛特斯石英楼梯
@@ -61,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=竖纹赛特斯石英台阶
@@ -71,7 +72,7 @@ tile.appliedenergistics2.sky_stone_brick_slab.name=陨石石砖台阶
tile.appliedenergistics2.sky_stone_small_brick_slab.name=陨石砖块台阶
tile.appliedenergistics2.sky_stone_slab.name=陨石台阶
// Chat Messages
// Chat Messages (聊天信息)
chat.appliedenergistics2.ChestCannotReadStorageCell=ME箱子无法读取存储元件.
chat.appliedenergistics2.SettingCleared=设置已清除.
chat.appliedenergistics2.OutOfRange=超出无线信号范围.
@@ -83,20 +84,21 @@ chat.appliedenergistics2.DeviceNotLinked=设备未连接.
chat.appliedenergistics2.StationCanNotBeLocated=无法定位安全终端.
chat.appliedenergistics2.MachineNotPowered=机器未供能.
chat.appliedenergistics2.CommunicationError=网络交互错误.
chat.appliedenergistics2.SavedSettings=成功保存设定.
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=物品
gui.appliedenergistics2.FluidTunnel=
gui.appliedenergistics2.FluidTunnel=
gui.appliedenergistics2.RedstoneTunnel=红石
gui.appliedenergistics2.EUTunnel=EU
gui.appliedenergistics2.FETunnel=FE
@@ -131,6 +133,7 @@ gui.appliedenergistics2.SecurityCardEditor=身份卡编辑
gui.appliedenergistics2.Encoded=已编码
gui.appliedenergistics2.Priority=优先级
gui.appliedenergistics2.StorageBus=存储总线
gui.appliedenergistics2.StorageBusFluids=流体储存总线
gui.appliedenergistics2.EnergyDrain=被动流失
gui.appliedenergistics2.Installed=已安装
gui.appliedenergistics2.NetworkTool=网络工具
@@ -146,23 +149,30 @@ gui.appliedenergistics2.Condenser=物质聚合器
gui.appliedenergistics2.Config=配置
gui.appliedenergistics2.Drive=ME驱动器
gui.appliedenergistics2.ExportBus=ME输出总线
gui.appliedenergistics2.ExportBusFluids=ME流体输出总线
gui.appliedenergistics2.GrindStone=磨具
gui.appliedenergistics2.ImportBus=ME输入总线
gui.appliedenergistics2.ImportBusFluids=ME流体输入总线
gui.appliedenergistics2.Interface=ME接口
gui.appliedenergistics2.FluidInterface=ME流体接口
gui.appliedenergistics2.LevelEmitter=ME标准发信器
gui.appliedenergistics2.FluidLevelEmitter=ME流体标准发信器
gui.appliedenergistics2.Of=/
gui.appliedenergistics2.Patterns=样板
gui.appliedenergistics2.SpatialIOPort=空间IO端口
gui.appliedenergistics2.StoredEnergy=已存储能源
gui.appliedenergistics2.StoredItems=已存储物品
gui.appliedenergistics2.StoredFluids=已存储流体
gui.appliedenergistics2.Terminal=终端
gui.appliedenergistics2.InterfaceTerminal=接口终端
gui.appliedenergistics2.InterfaceTerminalHint=在接口终端显示或隐藏.
gui.appliedenergistics2.FormationPlane=成型面板
gui.appliedenergistics2.FluidFormationPlane=流体成型面板
gui.appliedenergistics2.VibrationChamber=谐振仓
gui.appliedenergistics2.NetworkDetails=网络信息
gui.appliedenergistics2.StorageCells=ME存储元件
gui.appliedenergistics2.IOBuses=ME输入/输出总线
gui.appliedenergistics2.IOBusesFluids=ME流体输入/输出总线
gui.appliedenergistics2.Stores=存储
gui.appliedenergistics2.BytesUsed=字节已使用
gui.appliedenergistics2.Types=类型
@@ -236,7 +246,7 @@ gui.appliedenergistics2.SmallFontCraft=Craft
gui.appliedenergistics2.LargeFontCraft=+
gui.appliedenergistics2.Nothing=无
// GUI提示
// GUI Tooltips (GUI提示)
gui.tooltips.appliedenergistics2.Stash=存储物品
gui.tooltips.appliedenergistics2.StashDesc=将合成槽的物品返回网络
gui.tooltips.appliedenergistics2.Substitutions=矿物词典替换
@@ -289,6 +299,10 @@ gui.tooltips.appliedenergistics2.SearchMode_Auto=自动搜索
gui.tooltips.appliedenergistics2.SearchMode_Standard=标准搜索
gui.tooltips.appliedenergistics2.SearchMode_JEIAuto=JEI自动同步
gui.tooltips.appliedenergistics2.SearchMode_JEIStandard=JEI标准同步
gui.tooltips.appliedenergistics2.SearchMode_AutoKeep=保持自动搜索
gui.tooltips.appliedenergistics2.SearchMode_StandardKeep=保持标准搜索
gui.tooltips.appliedenergistics2.SearchMode_JEIAutoKeep=保持JEI自动同步
gui.tooltips.appliedenergistics2.SearchMode_JEIStandardKeep=保持JEI标准同步
gui.tooltips.appliedenergistics2.SearchMode=搜索框模式
gui.tooltips.appliedenergistics2.PartitionStorageHint=基于当前已存储物品进行分区编辑.
gui.tooltips.appliedenergistics2.ClearSettings=清除配置
@@ -316,9 +330,12 @@ gui.tooltips.appliedenergistics2.DoesntDespawn=该物品不会消失.
gui.tooltips.appliedenergistics2.EmitterMode=合成发信模式
gui.tooltips.appliedenergistics2.CraftViaRedstone=发射红石信号来合成物品.
gui.tooltips.appliedenergistics2.EmitWhenCrafting=在物品合成时发射红石信号.
gui.tooltips.appliedenergistics2.ReportInaccessibleItems=报告不可交互的物品
gui.tooltips.appliedenergistics2.ReportInaccessibleItems=显示不可交互的物品
gui.tooltips.appliedenergistics2.ReportInaccessibleItemsYes=是: 显示无法取出的物品.
gui.tooltips.appliedenergistics2.ReportInaccessibleItemsNo=否: 只显示可以取出的物品.
gui.tooltips.appliedenergistics2.ReportInaccessibleFluids=显示不可交互的流体
gui.tooltips.appliedenergistics2.ReportInaccessibleFluidsYes=是: 显示无法取出的流体.
gui.tooltips.appliedenergistics2.ReportInaccessibleFluidsNo=否: 只显示可以取出的流体.
gui.tooltips.appliedenergistics2.BlockPlacement=方块放置方式
gui.tooltips.appliedenergistics2.BlockPlacementYes=方块将被放置.
gui.tooltips.appliedenergistics2.BlockPlacementNo=方块将以物品形式掉落.
@@ -326,15 +343,19 @@ gui.tooltips.appliedenergistics2.SchedulingMode=调度模式
gui.tooltips.appliedenergistics2.SchedulingModeDefault=输出第一个物品直到系统中没有该物品,再输出下一个.
gui.tooltips.appliedenergistics2.SchedulingModeRoundRobin=循环输出模式.
gui.tooltips.appliedenergistics2.SchedulingModeRandom=随机输出模式.
gui.tooltips.appliedenergistics2.FilterMode=搜索过滤器模式
gui.tooltips.appliedenergistics2.FilterModeKeep=重载上一个搜索过滤器.
gui.tooltips.appliedenergistics2.FilterModeClear=在每次打开时清空.
gui.tooltips.appliedenergistics2.ItemsStored=存储物品: %s
gui.tooltips.appliedenergistics2.ItemsRequestable=可请求: %s
gui.tooltips.appliedenergistics2.P2PFrequency=频率: %s
// 单位
// Units (单位)
gui.appliedenergistics2.units.appliedenergstics=AE
gui.appliedenergistics2.units.ic2=EU
gui.appliedenergistics2.units.rf=RF
// 颜色
// Colors (颜色)
gui.appliedenergistics2.White=白色
gui.appliedenergistics2.Orange=橙色
gui.appliedenergistics2.Magenta=品红色
@@ -382,13 +403,18 @@ theoneprobe.appliedenergistics2.p2p_unlinked=未连接
theoneprobe.appliedenergistics2.p2p_input_one_output=已连接(输入端)
theoneprobe.appliedenergistics2.p2p_input_many_outputs=已连接(输入端)- %d 输出
theoneprobe.appliedenergistics2.p2p_output=已连接(输出端)
theoneprobe.appliedenergistics2.p2p_frequency=频率: %1$s
theoneprobe.appliedenergistics2.stored_energy=%1$d / %2$d
// 物品
// 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.creative_storage_cell.name=创造型ME存储元件
item.appliedenergistics2.encoded_pattern.name=编码样板
item.appliedenergistics2.view_cell.name=显示元件
@@ -415,6 +441,10 @@ 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.certus_quartz_crystal.name=赛特斯石英水晶
item.appliedenergistics2.material.certus_quartz_crystal_charged.name=充能赛特斯石英水晶
item.appliedenergistics2.material.certus_quartz_dust.name=赛特斯石英粉
@@ -454,6 +484,7 @@ item.appliedenergistics2.material.sky_dust.name=陨石粉
item.appliedenergistics2.material.card_crafting.name=合成卡
item.appliedenergistics2.multi_part.annihilation_plane.name=ME破坏面板
item.appliedenergistics2.multi_part.fluid_annihilation_plane.name=ME流体破坏面板
item.appliedenergistics2.multi_part.identity_annihilation_plane.name=ME精准破坏面板
item.appliedenergistics2.multi_part.cable_anchor.name=线缆锚
item.appliedenergistics2.multi_part.cable_covered.name=ME包层线缆
@@ -468,19 +499,26 @@ item.appliedenergistics2.multi_part.semi_dark_monitor.name=照明面板
item.appliedenergistics2.multi_part.monitor.name=亮色照明面板
item.appliedenergistics2.multi_part.dark_monitor.name=暗色照明面板
item.appliedenergistics2.multi_part.export_bus.name=ME输出总线
item.appliedenergistics2.multi_part.fluid_export_bus.name=ME流体输出总线
item.appliedenergistics2.multi_part.formation_plane.name=ME成型面板
item.appliedenergistics2.multi_part.fluid_formation_plane.name=ME流体成型面板
item.appliedenergistics2.multi_part.import_bus.name=ME输入总线
item.appliedenergistics2.multi_part.fluid_import_bus.name=ME流体输入总线
item.appliedenergistics2.multi_part.interface.name=ME接口
item.appliedenergistics2.multi_part.fluid_interface.name=ME流体接口
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.quartz_fiber.name=石英纤维
item.appliedenergistics2.multi_part.storage_bus.name=ME存储总线
item.appliedenergistics2.multi_part.fluid_storage_bus.name=ME流体储存总线
item.appliedenergistics2.multi_part.terminal.name=ME终端
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.invalid_type.name=已禁用
item.appliedenergistics2.spatial_storage_cell_128_cubed.name=128³-空间存储元件
@@ -517,7 +555,7 @@ 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)
@@ -525,15 +563,17 @@ commands.ae2.ChunkLoggerOn=区块日志已打开
commands.ae2.ChunkLoggerOff=区块日志已关闭
commands.ae2.Supporters=显示ae2支持者列表
// 成就
// Achievements (进度)
achievement.ae2.Root=Applied Energistics
achievement.ae2.Root.desc=当箱子只是不够用的时候.
achievement.ae2.Compass=陨石猎手
achievement.ae2.Compass.desc=制作一个陨石罗盘
achievement.ae2.Presses=未知科技
achievement.ae2.Presses.desc=发现一个处理器模板
achievement.ae2.SpatialIO=空间协调
achievement.ae2.SpatialIO.desc=制作一个空间IO端口
achievement.ae2.SpatialIOExplorerer=大胆去
achievement.ae2.SpatialIOExplorerer.desc=被存入空间存储元件
achievement.ae2.SpatialIOExplorer=大胆去
achievement.ae2.SpatialIOExplorer.desc=被存储在一个空间储存元件
achievement.ae2.StorageCell=比箱子更好
achievement.ae2.StorageCell.desc=制作一个存储元件
achievement.ae2.IOPort=元件互通
@@ -577,7 +617,11 @@ achievement.ae2.StorageBus.desc=制作一个存储总线
achievement.ae2.QNB=量子隧道
achievement.ae2.QNB.desc=制作一个链接室
// 统计
// Stats (统计)
stat.ae2.ItemsInserted=物品已加入ME存储
stat.ae2.ItemsExtracted=物品已取出ME存储
stat.ae2.TurnedCranks=转动曲柄
// Keys (键盘)
key.appliedenergistics2.category=Applied Energistics 2
key.toggle_focus.desc=打开/关闭搜索框聚焦
@@ -19,6 +19,26 @@
}
]
},
{
"name": "appliedenergistics2:fluid_interface",
"conditions": [
{
"type": "appliedenergistics2:features",
"features": [
"fluid_interface"
]
}
],
"ingredient": [
{
"item": "appliedenergistics2:fluid_interface"
},
{
"type": "appliedenergistics2:part",
"part": "part.fluid_interface"
}
]
},
{
"name": "appliedenergistics2:knife",
"conditions": [
@@ -38,25 +58,6 @@
}
]
},
{
"name": "appliedenergistics2:wrench",
"conditions": [
{
"type": "appliedenergistics2:features",
"features": [
"quartz_wrench"
]
}
],
"ingredient": [
{
"item": "appliedenergistics2:certus_quartz_wrench"
},
{
"item": "appliedenergistics2:nether_quartz_wrench"
}
]
},
{
"name": "appliedenergistics2:cable",
"ingredient": [
@@ -12,7 +12,7 @@
"key": {
"b": {
"type": "appliedenergistics2:part",
"part": "material.engineering_processor"
"part": "material.calculation_processor"
},
"d": {
"item": "appliedenergistics2:quartz_glass"
@@ -12,7 +12,7 @@
"key": {
"b": {
"type": "appliedenergistics2:part",
"part": "material.engineering_processor"
"part": "material.calculation_processor"
},
"c": {
"type": "appliedenergistics2:part",
@@ -9,7 +9,7 @@
"item": "minecraft:sticky_piston"
},
{
"item": "#appliedenergistics2:interface"
"item": "#appliedenergistics2:fluid_interface"
},
{
"item": "minecraft:piston"
@@ -13,7 +13,8 @@
"ore": "chestWood"
},
{
"item": "#appliedenergistics2:wrench"
"type": "forge:ore_dict",
"ore": "itemQuartzWrench"
},
{
"type": "appliedenergistics2:part",