Compare commits

...

31 Commits

Author SHA1 Message Date
PrototypeTrousers 2e0250de37 Merge pull request #1 from talchas/rv6-1.12
merge talchas fixes
2020-10-20 14:32:48 -03:00
yueh d730503378 Fixes #4388: Ensure correct ticking priority order (#4393) 2020-05-27 16:13:20 +02:00
yueh f3349b0a2d Fixes #4372: Limit validated itemstack to a size of 1 (#4373) 2020-05-07 11:49:00 +02:00
yueh f667e9a5f0 Reduce lock time 2020-04-25 18:28:33 +02:00
Hinara 2c0a2975de Fix #4114 (#4357) 2020-04-25 18:05:14 +02:00
yueh 2e3d6b721a Run daily after the initial cleanup is done 2020-03-30 11:00:43 +02:00
yueh 94e294f4e9 Remove redundant option 2020-03-27 21:28:55 +01:00
yueh 91620a0042 Handle issues and prs 2020-03-27 21:23:29 +01:00
yueh ffc79b5494 Run workflow hourly 2020-03-27 19:43:09 +01:00
yueh ce7c29d0ac Create lock.yml 2020-03-27 18:06:46 +01:00
yueh 6ece190ac4 Fixes #4127: Increase JEI box for grindstone recipes (#4270) 2020-01-30 10:06:14 +01:00
yueh 00a596ea8f Fixes #4268: Disabled JEI facade recipe when disabled. (#4269) 2020-01-30 09:35:45 +01:00
yueh 1fc1d5517d Fixes #4213: Prevent NPE when inserting via conversion monitor (#4265) 2020-01-26 13:36:06 +01:00
yueh d5fc7a5b21 Fixes #4256: Cache AESharedItemStack#hashCode() (#4257) 2020-01-16 13:22:42 +01:00
Rik Pronk 1f85d0f607 Fix CraftTweaker Grindstone second optional output (#4250)
Fixes an issue where the CraftTweaker Grindstone integration registered the second optional output as first optional output
2020-01-16 10:57:18 +01:00
talchas 34c490f92b Safer implementation of CraftingGridCache updatePatterns coalescing 2019-12-20 19:54:14 -08:00
ruifung 5efa6d6251 Update API JavaDocs for clarification (#4180)
* Fix javadoc for IGridBlock.getMachineRepresentation()

Javadoc should state proper semantics for that method, and telling people to return null there is a sure crash. #4178

* Update IPart interface javadoc.

Update the javadoc to state that functional parts should not be allowed to be placed on dense cables.
2019-12-19 10:18:27 +01:00
Andrew Motz 4269a66a4b Fix Typos in README.md (#4183)
"Summery" to "Summary"
2019-12-19 10:16:59 +01:00
talchas 401f1ebb3e Avoid quadratic behavior from rebuilding the entire crafting cache for
each interface visited. Instead rebuild it at most once per tick, like
cpu clusters.

This is particularly important when channels are disabled, since in
that case even adding a cable visits every grid node.
2019-12-09 22:43:55 -08:00
Chan, Danny df2a7c1858 Add "cullface" into charged_quartz_ore.json (#4108) 2019-08-07 10:08:05 +02:00
yueh c483bd17f5 Fixes #4089: Render cable core on straight lines of different types. (#4103) 2019-07-23 21:12:17 +02:00
yueh 92536fceb4 Fixes #4090 Portable cell incorrect empty itemstack handling (#4093) 2019-07-23 20:13:15 +02:00
yueh ded71cb2bd Fixes #4062: Rounding error due to float precision. (#4064) 2019-06-20 10:47:28 +02:00
yueh 41a4518c5b Fixes #4005: Persist cell after cleanup. (#4009) 2019-04-21 22:30:45 +02:00
yueh 87643094c3 Fixes #3925: Incorrect API JavaDoc (#4008)
`IGridBlock#getMachineRepresentation()` must be non null.
2019-04-21 22:30:35 +02:00
yueh 8a4c9b58e6 Fixes #3911: Incorrectly used string format. (#4007) 2019-04-21 22:30:21 +02:00
InterPlay 5436e6bf08 Added support for fluids in pt-BR lang file (#3904) 2019-04-21 13:20:57 +02:00
yueh 078112d97b Disable modmaven due to build issues for now (#4011) 2019-04-21 13:10:02 +02:00
yueh 46355a4e9b Fixes #3899: Put fluid interface into configured mode when needed. (#3903) 2019-01-15 12:52:12 +01:00
yueh eb389971a3 Fixes #3901: Ensure fluid terminal respects reported stacksizes. (#3902) 2019-01-15 12:52:00 +01:00
yueh a38ebf7c4d Fixes #3886: Initialise sleeping import bus in pulse mode. (#3887) 2018-12-26 23:28:17 +01:00
29 changed files with 353 additions and 197 deletions
+15
View File
@@ -0,0 +1,15 @@
name: 'Lock threads'
on:
schedule:
- cron: '0 0 * * *'
jobs:
lock:
runs-on: ubuntu-latest
steps:
- uses: dessant/lock-threads@v2
with:
github-token: ${{ github.token }}
issue-lock-inactive-days: '180'
pr-lock-inactive-days: '180'
+1 -1
View File
@@ -128,7 +128,7 @@ Here are a few things to keep in mind that will help get your PR approved.
* HTTPS `git clone https://github.com/<your username>/Applied-Energistics-2.git`
3. Change code base
4. Add changes to git `git add -A`
5. Commit changes to your clone `git commit -m "<summery of made changes>"`
5. Commit changes to your clone `git commit -m "<summary of made changes>"`
6. Push to your fork `git push`
7. Create a Pull-Request on GitHub
8. Wait for review
+4 -4
View File
@@ -64,10 +64,10 @@ repositories {
url "http://maven.blamejared.com/"
}
maven { // modmaven, maven proxy
name 'modmaven'
url "https://modmaven.k-4u.nl/"
}
//maven { // modmaven, maven proxy
// name 'modmaven'
// url "https://modmaven.k-4u.nl/"
//}
maven {
name = "CurseForge"
@@ -28,7 +28,6 @@ import java.util.EnumSet;
import javax.annotation.Nonnegative;
import javax.annotation.Nonnull;
import javax.annotation.Nullable;
import net.minecraft.item.ItemStack;
import net.minecraft.util.EnumFacing;
@@ -124,8 +123,8 @@ public interface IGridBlock
/**
* Determines what item stack is used to render this node in the GUI.
*
* @return the render item stack to use to render this node, null is valid, and will not show this node.
* @return the render item stack to use to render this node. Returning an empty ItemStack will not show this node.
*/
@Nullable
@Nonnull
ItemStack getMachineRepresentation();
}
+4 -1
View File
@@ -291,6 +291,9 @@ public interface IPart extends IBoxProvider, ICustomCableConnection
/**
* Used to determine which parts can be placed on what cables.
*
* Dense cables are not allowed for functional (getGridNode returns a node) parts.
* Doing so will result in crashes.
*
* @param what placed part
*
@@ -365,4 +368,4 @@ public interface IPart extends IBoxProvider, ICustomCableConnection
return null;
}
}
}
@@ -493,6 +493,11 @@ class CableBuilder
this.addCoveredConnection( facing, cableColor, connectionType, cableBusAdjacent, quadsOut );
return;
}
else if( connectionType == AECableType.DENSE_COVERED )
{
this.addDenseCoveredConnection( facing, cableColor, connectionType, cableBusAdjacent, quadsOut );
return;
}
CubeBuilder cubeBuilder = new CubeBuilder( this.format, quadsOut );
@@ -172,7 +172,7 @@ public class CableBusBakedModel implements IBakedModel
final AECableType secondType = sides.get( firstSide.getOpposite() );
return firstType == secondType;
return firstType == secondType && cableType == firstType && cableType == secondType;
}
private void addCableQuads( CableBusRenderState renderState, List<BakedQuad> quadsOut )
@@ -60,31 +60,21 @@ public class ContainerMEPortableCell extends ContainerMEMonitorable
{
final ItemStack currentItem = this.slot < 0 ? this.getPlayerInv().getCurrentItem() : this.getPlayerInv().getStackInSlot( this.slot );
if( this.civ != null )
{
if( currentItem != this.civ.getItemStack() )
{
if( !currentItem.isEmpty() )
{
if( ItemStack.areItemsEqual( this.civ.getItemStack(), currentItem ) )
{
this.getPlayerInv().setInventorySlotContents( this.getPlayerInv().currentItem, this.civ.getItemStack() );
}
else
{
this.setValidContainer( false );
}
}
else
{
this.setValidContainer( false );
}
}
}
else
if( this.civ == null || currentItem.isEmpty() )
{
this.setValidContainer( false );
}
else if( this.civ != null && !this.civ.getItemStack().isEmpty() && currentItem != this.civ.getItemStack() )
{
if( ItemStack.areItemsEqual( this.civ.getItemStack(), currentItem ) )
{
this.getPlayerInv().setInventorySlotContents( this.getPlayerInv().currentItem, this.civ.getItemStack() );
}
else
{
this.setValidContainer( false );
}
}
// drain 1 ae t
this.ticks++;
@@ -147,7 +147,7 @@ public class CraftingTreeNode
for( IAEItemStack fuzz : itemList )
{
if( this.parent.details.isValidItemForSlot( this.getSlot(), fuzz.createItemStack(), this.world ) )
if( this.parent.details.isValidItemForSlot( this.getSlot(), fuzz.copy().setStackSize( 1 ).createItemStack(), this.world ) )
{
fuzz = fuzz.copy();
fuzz.setStackSize( l );
@@ -105,7 +105,7 @@ public class BlockQuartzGlass extends AEBaseBlock
}
}
return w.getBlockState( pos ).shouldSideBeRendered( w, adjacentPos, side );
return super.shouldSideBeRendered( state, w, pos, side );
}
@Override
@@ -128,7 +128,7 @@ public class FluidStackSizeRenderer
format.setDecimalFormatSymbols( symbols );
format.setRoundingMode( RoundingMode.DOWN );
return format.format( originalSize / 1000f );
return format.format( originalSize / 1000d );
}
}
@@ -27,11 +27,8 @@ import javax.annotation.Nonnull;
import net.minecraft.entity.player.EntityPlayer;
import net.minecraft.entity.player.EntityPlayerMP;
import net.minecraft.entity.player.InventoryPlayer;
import net.minecraft.init.Items;
import net.minecraft.inventory.IContainerListener;
import net.minecraft.item.ItemStack;
import net.minecraftforge.common.ForgeModContainer;
import net.minecraftforge.fluids.Fluid;
import net.minecraftforge.fluids.FluidStack;
import net.minecraftforge.fluids.FluidUtil;
import net.minecraftforge.fluids.capability.IFluidHandlerItem;
@@ -353,32 +350,24 @@ public class ContainerFluidTerminal extends AEBaseContainer implements IConfigMa
super.doAction( player, action, slot, id );
return;
}
ItemStack held = player.inventory.getItemStack();
final ItemStack held = player.inventory.getItemStack();
if( held.getCount() != 1 )
{
// only support stacksize 1 for now
return;
}
IFluidHandlerItem fh = FluidUtil.getFluidHandler( held );
final IFluidHandlerItem fh = FluidUtil.getFluidHandler( held );
if( fh == null )
{
// only fluid handlers items
return;
}
boolean isBucket = held.getItem() == Items.BUCKET || held.getItem() == Items.WATER_BUCKET || held.getItem() == Items.LAVA_BUCKET || held
.getItem() == Items.MILK_BUCKET || held.getItem() == ForgeModContainer.getInstance().universalBucket;
if( action == InventoryAction.FILL_ITEM && this.clientRequestedTargetFluid != null )
{
AEFluidStack stack = (AEFluidStack) this.clientRequestedTargetFluid.copy();
AELog.debug( "Filling %s with %s, %s mb", held.getDisplayName(), this.clientRequestedTargetFluid.getFluidStack().getLocalizedName(),
stack.getStackSize() );
if( isBucket && stack.getStackSize() < Fluid.BUCKET_VOLUME )
{ // Although buckets support less than a buckets worth of fluid, it does not display how much it holds
return;
}
final IAEFluidStack stack = this.clientRequestedTargetFluid.copy();
// Check how much we can store in the item
stack.setStackSize( Integer.MAX_VALUE );
@@ -386,16 +375,22 @@ public class ContainerFluidTerminal extends AEBaseContainer implements IConfigMa
stack.setStackSize( amountAllowed );
// Check if we can pull out of the system
IAEFluidStack canPull = Platform.poweredExtraction( this.getPowerSource(), this.monitor, stack, this.getActionSource(), Actionable.SIMULATE );
if( canPull == null || canPull.getStackSize() < 1 || ( isBucket && canPull.getStackSize() != Fluid.BUCKET_VOLUME ) )
final IAEFluidStack canPull = Platform.poweredExtraction( this.getPowerSource(), this.monitor, stack, this.getActionSource(), Actionable.SIMULATE );
if( canPull == null || canPull.getStackSize() < 1 )
{
return;
}
// How much could fit into the container
final int canFill = fh.fill( canPull.getFluidStack(), false );
if( canFill == 0 )
{
// Either we couldn't pull out of the system,
// or we are using a bucket and can only pull out less than a buckets worth of fluid
return;
}
// Now actually pull out of the system
IAEFluidStack pulled = Platform.poweredExtraction( this.getPowerSource(), this.monitor, stack, this.getActionSource() );
stack.setStackSize( canFill );
final IAEFluidStack pulled = Platform.poweredExtraction( this.getPowerSource(), this.monitor, stack, this.getActionSource() );
if( pulled == null || pulled.getStackSize() < 1 )
{
// Something went wrong
@@ -404,42 +399,55 @@ public class ContainerFluidTerminal extends AEBaseContainer implements IConfigMa
}
// Actually fill
fh.fill( pulled.getFluidStack(), true );
final int used = fh.fill( pulled.getFluidStack(), true );
if( used != canFill )
{
AELog.error( "Fluid item [%s] reported a different possible amount than it actually accepted.", held.getDisplayName() );
}
player.inventory.setItemStack( fh.getContainer() );
this.updateHeld( player );
}
else if( action == InventoryAction.EMPTY_ITEM )
{
// Empty held item
AELog.debug( "Emptying %s", held.getDisplayName() );
// See how much we can drain from the item
FluidStack extract = fh.drain( Integer.MAX_VALUE, false );
final FluidStack extract = fh.drain( Integer.MAX_VALUE, false );
if( extract == null || extract.amount < 1 )
{
return;
}
// Check if we can push into the system
IAEFluidStack notPushed = Platform.poweredInsert( this.getPowerSource(), this.monitor, AEFluidStack.fromFluidStack( extract ),
final IAEFluidStack notStorable = Platform.poweredInsert( this.getPowerSource(), this.monitor, AEFluidStack.fromFluidStack( extract ),
this.getActionSource(), Actionable.SIMULATE );
if( isBucket && notPushed != null && notPushed.getStackSize() > 0 )
{
// We can't push enough for the bucket
return;
}
IAEFluidStack notInserted = Platform.poweredInsert( this.getPowerSource(), this.monitor, AEFluidStack.fromFluidStack( extract ),
this.getActionSource() );
if( notInserted != null && notInserted.getStackSize() > 0 )
if( notStorable != null && notStorable.getStackSize() > 0 )
{
// Only try to extract the amount we DID insert
extract.amount -= Math.toIntExact( notInserted.getStackSize() );
final int toStore = (int) ( extract.amount - notStorable.getStackSize() );
final FluidStack storable = fh.drain( toStore, false );
if( storable == null || storable.amount == 0 )
{
return;
}
else
{
extract.amount = storable.amount;
}
}
// Actually drain
fh.drain( extract, true );
final FluidStack drained = fh.drain( extract, true );
extract.amount = drained.amount;
final IAEFluidStack notInserted = Platform.poweredInsert( this.getPowerSource(), this.monitor, AEFluidStack.fromFluidStack( extract ),
this.getActionSource() );
if( notInserted != null && notInserted.getStackSize() > 0 )
{
AELog.error( "Fluid item [%s] reported a different possible amount to drain than it actually provided.", held.getDisplayName() );
}
player.inventory.setItemStack( fh.getContainer() );
this.updateHeld( player );
@@ -255,6 +255,17 @@ public class DualityFluidInterface implements IGridTickable, IStorageMonitorable
private void readConfig()
{
this.hasConfig = false;
for( int i = 0; i < this.config.getSlots(); i++ )
{
if( this.config.getFluidInSlot( i ) != null )
{
this.hasConfig = true;
break;
}
}
final boolean had = this.hasWorkToDo();
for( int x = 0; x < NUMBER_OF_TANKS; x++ )
@@ -62,7 +62,7 @@ public class GrinderRecipes
final ItemStack s2 = CTModule.toStack( secondary2Output );
if( !s2.isEmpty() )
{
builder.withFirstOptional( s2, secondary2Chance == null ? 1.0f : secondary2Chance );
builder.withSecondOptional( s2, secondary2Chance == null ? 1.0f : secondary2Chance );
}
CTModule.MODIFICATIONS.add( new Add( builder.build() ) );
}
@@ -48,7 +48,7 @@ class GrinderRecipeCategory implements IRecipeCategory<GrinderRecipeWrapper>, IR
this.localizedName = I18n.format( "tile.appliedenergistics2.grindstone.name" );
ResourceLocation location = new ResourceLocation( AppEng.MOD_ID, "textures/guis/grinder.png" );
this.background = guiHelper.createDrawable( location, 11, 16, 154, 64 );
this.background = guiHelper.createDrawable( location, 11, 16, 154, 70 );
}
@Override
@@ -203,7 +203,7 @@ public class JEIPlugin implements IModPlugin
{
Optional<Item> itemFacade = definitions.items().facade().maybeItem();
Optional<ItemStack> cableAnchor = definitions.parts().cableAnchor().maybeStack( 1 );
if( itemFacade.isPresent() && cableAnchor.isPresent() )
if( itemFacade.isPresent() && cableAnchor.isPresent() && AEConfig.instance().isFeatureEnabled( AEFeature.ENABLE_FACADE_CRAFTING ) )
{
registry.addRecipeRegistryPlugin( new FacadeRegistryPlugin( (ItemFacade) itemFacade.get(), cableAnchor.get() ) );
}
+5 -1
View File
@@ -39,6 +39,7 @@ import appeng.api.util.IReadOnlyCollection;
import appeng.core.worlddata.WorldData;
import appeng.hooks.TickHandler;
import appeng.util.ReadOnlyCollection;
import appeng.me.cache.CraftingGridCache;
public class Grid implements IGrid
@@ -219,7 +220,10 @@ public class Grid implements IGrid
@Override
public MENetworkEvent postEvent( final MENetworkEvent ev )
{
return this.eventBus.postEvent( this, ev );
CraftingGridCache.pauseRebuilds();
final MENetworkEvent ret = this.eventBus.postEvent( this, ev );
CraftingGridCache.unpauseRebuilds();
return ret;
}
@Override
+4
View File
@@ -55,6 +55,7 @@ import appeng.api.util.IReadOnlyCollection;
import appeng.core.AELog;
import appeng.core.worlddata.WorldData;
import appeng.hooks.TickHandler;
import appeng.me.cache.CraftingGridCache;
import appeng.me.pathfinding.IPathItem;
import appeng.util.IWorldCallable;
import appeng.util.ReadOnlyCollection;
@@ -164,6 +165,8 @@ public class GridNode implements IGridNode, IPathItem
{
final Object tracker = new Object();
CraftingGridCache.pauseRebuilds();
Deque<GridNode> nextRun = new ArrayDeque<>();
nextRun.add( this );
@@ -203,6 +206,7 @@ public class GridNode implements IGridNode, IPathItem
}
}
}
CraftingGridCache.unpauseRebuilds();
}
@Override
+28
View File
@@ -114,6 +114,8 @@ public class CraftingGridCache implements ICraftingGrid, ICraftingProviderHelper
private IStorageGrid storageGrid;
private IEnergyGrid energyGrid;
private boolean updateList = false;
private static int pauseRebuilds = 0;
private static Set<CraftingGridCache> rebuildNeeded = new HashSet<>();
public CraftingGridCache( final IGrid grid )
{
@@ -240,8 +242,34 @@ public class CraftingGridCache implements ICraftingGrid, ICraftingProviderHelper
// nothing!
}
public static void pauseRebuilds()
{
pauseRebuilds++;
}
public static void unpauseRebuilds()
{
pauseRebuilds--;
if (pauseRebuilds == 0 && rebuildNeeded.size() > 0)
{
ImmutableSet<CraftingGridCache> needed = ImmutableSet.copyOf(rebuildNeeded);
rebuildNeeded.clear();
for ( CraftingGridCache cache: needed )
{
cache.updatePatterns();
}
}
}
private void updatePatterns()
{
// coalesce change events during a grid traversal to a single rebuild
if (pauseRebuilds != 0)
{
rebuildNeeded.add(this);
return;
}
final Map<IAEItemStack, ImmutableList<ICraftingPatternDetails>> oldItems = this.craftableItems;
// erase list.
+39 -35
View File
@@ -47,6 +47,7 @@ public class TickManagerCache implements ITickManager
private final HashMap<IGridNode, TickTracker> sleeping = new HashMap<>();
private final HashMap<IGridNode, TickTracker> awake = new HashMap<>();
private final PriorityQueue<TickTracker> upcomingTicks = new PriorityQueue<>();
private long currentTick = 0;
public TickManagerCache( final IGrid g )
@@ -80,50 +81,52 @@ public class TickManagerCache implements ITickManager
public void onUpdateTick()
{
TickTracker tt = null;
try
{
this.currentTick++;
while( !this.upcomingTicks.isEmpty() )
{
tt = this.upcomingTicks.peek();
final int diff = (int) ( this.currentTick - tt.getLastTick() );
if( diff >= tt.getCurrentRate() )
// Stop once it reaches a TickTracker running at a later tick
if( tt.getNextTick() > this.currentTick )
{
// remove tt..
this.upcomingTicks.poll();
final TickRateModulation mod = tt.getGridTickable().tickingRequest( tt.getNode(), diff );
switch( mod )
{
case FASTER:
tt.setRate( tt.getCurrentRate() - 2 );
break;
case IDLE:
tt.setRate( tt.getRequest().maxTickRate );
break;
case SAME:
break;
case SLEEP:
this.sleepDevice( tt.getNode() );
break;
case SLOWER:
tt.setRate( tt.getCurrentRate() + 1 );
break;
case URGENT:
tt.setRate( 0 );
break;
default:
break;
}
if( this.awake.containsKey( tt.getNode() ) )
{
this.addToQueue( tt );
}
break;
}
else
this.upcomingTicks.poll();
final int diff = (int) ( this.currentTick - tt.getLastTick() );
final TickRateModulation mod = tt.getGridTickable().tickingRequest( tt.getNode(), diff );
switch( mod )
{
return; // done!
case FASTER:
tt.setCurrentRate( tt.getCurrentRate() - 2 );
break;
case IDLE:
tt.setCurrentRate( tt.getRequest().maxTickRate );
break;
case SAME:
break;
case SLEEP:
this.sleepDevice( tt.getNode() );
break;
case SLOWER:
tt.setCurrentRate( tt.getCurrentRate() + 1 );
break;
case URGENT:
tt.setCurrentRate( 0 );
break;
default:
break;
}
if( this.awake.containsKey( tt.getNode() ) )
{
this.addToQueue( tt );
}
}
}
@@ -255,6 +258,7 @@ public class TickManagerCache implements ITickManager
final TickTracker gt = this.sleeping.get( node );
this.sleeping.remove( node );
this.awake.put( node, gt );
this.upcomingTicks.remove( gt );
this.addToQueue( gt );
return true;
+22 -21
View File
@@ -37,7 +37,6 @@ public class TickTracker implements Comparable<TickTracker>
private final TickingRequest request;
private final IGridTickable gt;
private final IGridNode node;
private final TickManagerCache host;
private final long LastFiveTicksTime = 0;
@@ -51,7 +50,6 @@ public class TickTracker implements Comparable<TickTracker>
this.node = node;
this.setCurrentRate( ( req.minTickRate + req.maxTickRate ) / 2 );
this.setLastTick( currentTick );
this.host = tickManagerCache;
}
public long getAvgNanos()
@@ -59,27 +57,25 @@ public class TickTracker implements Comparable<TickTracker>
return( this.LastFiveTicksTime / 5 );
}
public void setRate( final int rate )
{
this.setCurrentRate( rate );
if( this.getCurrentRate() < this.getRequest().minTickRate )
{
this.setCurrentRate( this.getRequest().minTickRate );
}
if( this.getCurrentRate() > this.getRequest().maxTickRate )
{
this.setCurrentRate( this.getRequest().maxTickRate );
}
}
@Override
public int compareTo( @Nonnull final TickTracker t )
{
final int nextTick = (int) ( ( this.getLastTick() - this.host.getCurrentTick() ) + this.getCurrentRate() );
final int ts_nextTick = (int) ( ( t.getLastTick() - this.host.getCurrentTick() ) + t.getCurrentRate() );
return nextTick - ts_nextTick;
int next = Long.compare( this.getNextTick(), t.getNextTick() );
if( next != 0 )
{
return next;
}
int last = Long.compare( this.getLastTick(), t.getLastTick() );
if( last != 0 )
{
return last;
}
return Integer.compare( this.getCurrentRate(), t.getCurrentRate() );
}
public void addEntityCrashInfo( final CrashReportCategory crashreportcategory )
@@ -111,7 +107,12 @@ public class TickTracker implements Comparable<TickTracker>
public void setCurrentRate( final int currentRate )
{
this.currentRate = currentRate;
this.currentRate = Math.min( this.getRequest().maxTickRate, Math.max( this.getRequest().minTickRate, currentRate ) );
}
public long getNextTick()
{
return this.lastTick + this.currentRate;
}
public long getLastTick()
@@ -192,16 +192,29 @@ public abstract class AbstractCellInventory<T extends IAEStack<T>> implements IC
this.cellItems.resetStatus(); // clears totals and stuff.
final int types = (int) this.getStoredItemTypes();
boolean needsUpdate = false;
for( int slot = 0; slot < types; slot++ )
{
NBTTagCompound compoundTag = this.tagCompound.getCompoundTag( ITEM_SLOT_KEYS[slot] );
int stackSize = this.tagCompound.getInteger( ITEM_SLOT_COUNT_KEYS[slot] );
this.loadCellItem( compoundTag, stackSize );
needsUpdate |= !this.loadCellItem( compoundTag, stackSize );
}
if( needsUpdate )
{
this.saveChanges();
}
}
protected abstract void loadCellItem( NBTTagCompound compoundTag, int stackSize );
/**
* Load a single item.
*
* @param compoundTag
* @param stackSize
* @return true when successfully loaded
*/
protected abstract boolean loadCellItem( NBTTagCompound compoundTag, int stackSize );
@Override
public IItemList<T> getAvailableItems( final IItemList<T> out )
@@ -253,7 +253,7 @@ public class BasicCellInventory<T extends IAEStack<T>> extends AbstractCellInven
}
@Override
protected void loadCellItem( NBTTagCompound compoundTag, int stackSize )
protected boolean loadCellItem( NBTTagCompound compoundTag, int stackSize )
{
// Now load the item stack
final T t;
@@ -263,7 +263,7 @@ public class BasicCellInventory<T extends IAEStack<T>> extends AbstractCellInven
if( t == null )
{
AELog.warn( "Removing item " + compoundTag + " from storage cell because the associated item type couldn't be found." );
return;
return false;
}
}
catch( Throwable ex )
@@ -271,7 +271,7 @@ public class BasicCellInventory<T extends IAEStack<T>> extends AbstractCellInven
if( AEConfig.instance().isRemoveCrashingItemsOnLoad() )
{
AELog.warn( ex, "Removing item " + compoundTag + " from storage cell because loading the ItemStack crashed." );
return;
return false;
}
throw ex;
}
@@ -282,5 +282,7 @@ public class BasicCellInventory<T extends IAEStack<T>> extends AbstractCellInven
{
this.cellItems.add( t );
}
return true;
}
}
@@ -140,7 +140,7 @@ public class PartImportBus extends PartSharedItemBus implements IInventoryDestin
@Override
public TickingRequest getTickingRequest( final IGridNode node )
{
return new TickingRequest( TickRates.ImportBus.getMin(), TickRates.ImportBus.getMax(), this.getHandler() == null, false );
return new TickingRequest( TickRates.ImportBus.getMin(), TickRates.ImportBus.getMax(), this.isSleeping(), false );
}
@Override
@@ -138,8 +138,8 @@ class ItemHandlerAdapter implements IMEInventory<IAEItemStack>, IBaseMonitor<IAE
{
// Something broke. It should never return more than we requested...
// We're going to silently eat the remainder
AELog.warn( "Mod that provided item handler %1 is broken. Returned %2 items, even though we requested %3.",
this.itemHandler.getClass().getSimpleName(), extracted.getCount(), remainingCurrentSlot );
AELog.warn( "Mod that provided item handler %s is broken. Returned %s items while only requesting %d.",
this.itemHandler.getClass().getName(), extracted.toString(), remainingCurrentSlot );
extracted.setCount( remainingCurrentSlot );
}
@@ -179,25 +179,29 @@ public class PartConversionMonitor extends AbstractPartMonitor
final IEnergySource energy = this.getProxy().getEnergy();
final IMEMonitor<IAEItemStack> cell = this.getProxy()
.getStorage()
.getInventory(
AEApi.instance().storage().getStorageChannel( IItemStorageChannel.class ) );
.getInventory( AEApi.instance().storage().getStorageChannel( IItemStorageChannel.class ) );
if( allItems )
{
final IAEItemStack input = this.getDisplayed().copy();
IItemHandler inv = new PlayerMainInvWrapper( player.inventory );
for( int x = 0; x < inv.getSlots(); x++ )
if( this.getDisplayed() != null )
{
final ItemStack targetStack = inv.getStackInSlot( x );
if( input.equals( targetStack ) )
final IAEItemStack input = this.getDisplayed().copy();
IItemHandler inv = new PlayerMainInvWrapper( player.inventory );
for( int x = 0; x < inv.getSlots(); x++ )
{
final ItemStack canExtract = inv.extractItem( x, targetStack.getCount(), true );
if( !canExtract.isEmpty() )
final ItemStack targetStack = inv.getStackInSlot( x );
if( input.equals( targetStack ) )
{
input.setStackSize( canExtract.getCount() );
final IAEItemStack failedToInsert = Platform.poweredInsert( energy, cell, input, new PlayerSource( player, this ) );
inv.extractItem( x, failedToInsert == null ? canExtract.getCount() : canExtract.getCount() - (int) failedToInsert.getStackSize(),
false );
final ItemStack canExtract = inv.extractItem( x, targetStack.getCount(), true );
if( !canExtract.isEmpty() )
{
input.setStackSize( canExtract.getCount() );
final IAEItemStack failedToInsert = Platform.poweredInsert( energy, cell, input, new PlayerSource( player, this ) );
inv.extractItem( x,
failedToInsert == null ? canExtract.getCount() : canExtract.getCount() - (int) failedToInsert.getStackSize(),
false );
}
}
}
}
@@ -38,12 +38,14 @@ final class AESharedItemStack implements Comparable<AESharedItemStack>
private final ItemStack itemStack;
private final int itemId;
private final int itemDamage;
private final int hashCode;
public AESharedItemStack( final ItemStack itemStack )
{
this.itemStack = itemStack;
this.itemId = Item.getIdFromItem( itemStack.getItem() );
this.itemDamage = itemStack.getItemDamage();
this.hashCode = this.makeHashCode();
}
Bounds getBounds( final FuzzyMode fuzzy, final boolean ignoreMeta )
@@ -69,7 +71,7 @@ final class AESharedItemStack implements Comparable<AESharedItemStack>
@Override
public int hashCode()
{
return Objects.hash( this.itemId, this.itemDamage, this.itemStack.hasTagCompound() ? this.itemStack.getTagCompound() : 0 );
return this.hashCode;
}
@Override
@@ -144,6 +146,11 @@ final class AESharedItemStack implements Comparable<AESharedItemStack>
return System.identityHashCode( this.itemStack.getTagCompound() ) - System.identityHashCode( b.getTagCompound() );
}
private int makeHashCode()
{
return Objects.hash( this.itemId, this.itemDamage, this.itemStack.hasTagCompound() ? this.itemStack.getTagCompound() : 0 );
}
/**
* Creates the lower and upper bounds for a specific shared itemstack.
*/
@@ -1,8 +1,9 @@
//versão pt-BR atualizada por _InterPlay_ em 31/12/2018
//Blocos
tile.appliedenergistics2.cable_bus.name=Cabos e/ou Barramentos do AE2
tile.appliedenergistics2.cell_workbench.name=Bancada de Células
tile.appliedenergistics2.charger.name=Carregador
tile.appliedenergistics2.chest.name=Báu ME
tile.appliedenergistics2.chest.name=Báu de Matéria para Energia (ME)
tile.appliedenergistics2.condenser.name=Condensador de Matéria
tile.appliedenergistics2.controller.name=Controlador ME
tile.appliedenergistics2.crank.name=Manivela de Madeira
@@ -13,9 +14,10 @@ tile.appliedenergistics2.drive.name=Acionador ME
tile.appliedenergistics2.energy_acceptor.name=Aceitador de Energia
tile.appliedenergistics2.grindstone.name=Rebolo de Quartzo
tile.appliedenergistics2.matrix_frame.name=Armação de Matriz
tile.appliedenergistics2.io_port.name=Porta de Entrada-Saída ME
tile.appliedenergistics2.io_port.name=Porta de Entrada/Saída ME
tile.appliedenergistics2.inscriber.name=Inscritor
tile.appliedenergistics2.interface.name=Interface ME
tile.appliedenergistics2.fluid_interface.name=Interface de Fluidos ME
tile.appliedenergistics2.quantum_link.name=Câmara de Ligação Quântica ME
tile.appliedenergistics2.quantum_ring.name=Anel Quântico ME
tile.appliedenergistics2.fluix_block.name=Bloco de Fluix
@@ -73,18 +75,19 @@ tile.appliedenergistics2.sky_stone_slab.name=Laje de Pedra do Céu
// Chat Messages
chat.appliedenergistics2.ChestCannotReadStorageCell=Baú ME não consegue ler a célula de armazenamento.
chat.appliedenergistics2.SettingCleared=Configuração limpa.
chat.appliedenergistics2.SettingCleared=Cartão de Memória limpo.
chat.appliedenergistics2.OutOfRange=Fora de área do sinal
chat.appliedenergistics2.InvalidMachine=Máquina inválida.
chat.appliedenergistics2.LoadedSettings=Configurações carregadas com sucesso.
chat.appliedenergistics2.LoadedSettings=Configuração de dispositivo carregada a partir do cartão de memória.
chat.appliedenergistics2.DeviceNotPowered=Dispositivo está com baixa energia.
chat.appliedenergistics2.DeviceNotWirelessTerminal=Dispositivo não é um terminal sem fios.
chat.appliedenergistics2.DeviceNotLinked=Dispositivo não conectado
chat.appliedenergistics2.StationCanNotBeLocated=Estação não pode ser encontrada.
chat.appliedenergistics2.MachineNotPowered=Máquina não está sendo alimentada.
chat.appliedenergistics2.CommunicationError=Erro comunicando com a rede.
chat.appliedenergistics2.SavedSettings=Configurações salvas com sucesso.
chat.appliedenergistics2.AmmoDepleted=Munição depletada.
chat.appliedenergistics2.CommunicationError=Erro ao comunicar com a rede.
chat.appliedenergistics2.SavedSettings=Configurações atuais do dispositivo copiadas ao cartão de memória.
chat.appliedenergistics2.ResetSettings=Criada nova configuração de dispositivo e copiada ao cartão de memória.
chat.appliedenergistics2.AmmoDepleted=Munição esgotada.
chat.appliedenergistics2.isNowLocked=O monitor agora está Bloqueado.
chat.appliedenergistics2.isNowUnlocked=O monitor agora está Desbloqueado.
@@ -117,9 +120,11 @@ gui.appliedenergistics2.security.build.tip=O usuário pode modificar a estutura
gui.appliedenergistics2.security.security.tip=O usuário pode acessar e modificar o terminal de segurança da rede.
gui.appliedenergistics2.Efficiency=Eficiência
gui.appliedenergistics2.RequiredPower=Poder Requerido
gui.appliedenergistics2.StoredPower=Poder Armazenado
gui.appliedenergistics2.MaxPower=Poder Máximo
gui.appliedenergistics2.SCSSize=Tamanho SCS
gui.appliedenergistics2.SCSInvalid=Inválido
gui.appliedenergistics2.RequiredPower=Energia Requerida
gui.appliedenergistics2.StoredPower=Energia Armazenada
gui.appliedenergistics2.MaxPower=Energia Máxima
gui.appliedenergistics2.QuartzCuttingKnife=Faca de Corte de Quartzo
gui.appliedenergistics2.Inscriber=Inscritor
gui.appliedenergistics2.Wireless=Ponto de Acesso Sem Fio
@@ -129,6 +134,7 @@ gui.appliedenergistics2.SecurityCardEditor=Editor de Cartão Biométrico
gui.appliedenergistics2.Encoded=Codificado
gui.appliedenergistics2.Priority=Prioridade
gui.appliedenergistics2.StorageBus=Barramento de Armazenamento
gui.appliedenergistics2.StorageBusFluids=Barramento de Armazenamento de Fluido
gui.appliedenergistics2.EnergyDrain=Drenagem Passiva
gui.appliedenergistics2.Installed=Instalado
gui.appliedenergistics2.NetworkTool=Ferramenta de Rede
@@ -138,36 +144,44 @@ gui.appliedenergistics2.PortableCell=Célula Portátil
gui.appliedenergistics2.Security=Term. de Segurança
gui.appliedenergistics2.CellWorkbench=Bancada de Células
gui.appliedenergistics2.QuantumLinkChamber=Câmara de Ligação Quântica
gui.appliedenergistics2.IOPort=Porta de ES ME
gui.appliedenergistics2.IOPort=Porta de E/S ME
gui.appliedenergistics2.Chest=Baú ME
gui.appliedenergistics2.Condenser=Condensador de Matéria
gui.appliedenergistics2.Config=Config.
gui.appliedenergistics2.Drive=Acionador ME
gui.appliedenergistics2.ExportBus=Barramento de Exportação ME
gui.appliedenergistics2.ExportBus=Barramento ME de Exportação
gui.appliedenergistics2.ExportBusFluids=Barramento ME de Exportação de Fluidos
gui.appliedenergistics2.GrindStone=Rebolo
gui.appliedenergistics2.ImportBus=Barramento de Importação ME
gui.appliedenergistics2.ImportBus=Barramento ME de Importação
gui.appliedenergistics2.ImportBusFluids=Barramento ME de Importação de Fluido
gui.appliedenergistics2.Interface=Interface ME
gui.appliedenergistics2.LevelEmitter=Emissor de Nível ME
gui.appliedenergistics2.Of=De
gui.appliedenergistics2.FluidInterface=Interface ME de Fluido
gui.appliedenergistics2.LevelEmitter=Emissor ME de Nível
gui.appliedenergistics2.FluidLevelEmitter=Emissor ME de Nível de Fluido
gui.appliedenergistics2.Of=de
gui.appliedenergistics2.Patterns=Padrões
gui.appliedenergistics2.SpatialIOPort=Porta de ES Espacial
gui.appliedenergistics2.SpatialIOPort=Porta de E/S Espacial
gui.appliedenergistics2.StoredEnergy=Energia Armazenada
gui.appliedenergistics2.StoredItems=Itens Armazenados
gui.appliedenergistics2.StoredFluids=Fluidos Armazenados
gui.appliedenergistics2.Terminal=Terminal
gui.appliedenergistics2.InterfaceTerminal=Terminal de Interface
gui.appliedenergistics2.InterfaceTerminalHint=Mostrar ou Esconder no Terminal de Interface
gui.appliedenergistics2.FormationPlane=Plano de Formação
gui.appliedenergistics2.FluidFormationPlane=Plano de Formação de Fluido
gui.appliedenergistics2.VibrationChamber=Câmara de Vibração
gui.appliedenergistics2.NetworkDetails=Detalhes de Rede
gui.appliedenergistics2.StorageCells=Células de Armazenamento ME
gui.appliedenergistics2.IOBuses=Barramento de Ex/Importação ME
gui.appliedenergistics2.IOBuses=Barramento ME de Exp/Importação
gui.appliedenergistics2.IOBusesFluids=Barramento ME de Exp/Importação de Fluido
gui.appliedenergistics2.Stores=Guarda
gui.appliedenergistics2.BytesUsed=Bytes Usados
gui.appliedenergistics2.Types=Tipos
gui.appliedenergistics2.Blank=Branco
gui.appliedenergistics2.Unlinked=Não Conectado
gui.appliedenergistics2.Blank=Em Branco
gui.appliedenergistics2.Unlinked=Desconectado
gui.appliedenergistics2.Linked=Conectado
gui.appliedenergistics2.StoredSize=Tamanho Armazenado
gui.appliedenergistics2.CellId=ID da Célula
gui.appliedenergistics2.SkyChest=Baú de Pedra do Céu
gui.appliedenergistics2.PatternTerminal=Terminal de Padrões
gui.appliedenergistics2.CraftingPattern=Padrão de Fabricação
@@ -283,9 +297,13 @@ gui.tooltips.appliedenergistics2.ActiveOnPulse=Ativar uma vez por pulso
gui.tooltips.appliedenergistics2.EmitLevelsBelow=Emitir quando níveis são iguais ou estão abaixo do limite
gui.tooltips.appliedenergistics2.EmitLevelAbove=Emitir quando níveis são iguais ou estão acima do limite.
gui.tooltips.appliedenergistics2.SearchMode_Auto=Auto Procura
gui.tooltips.appliedenergistics2.SearchMode_Standard=Procura Normal
gui.tooltips.appliedenergistics2.SearchMode_JEIAuto=Auto Sincronizado ao JEI
gui.tooltips.appliedenergistics2.SearchMode_JEIStandard=Sincronizado ao JEI Normalmente
gui.tooltips.appliedenergistics2.SearchMode_Standard=Procura Padrão
gui.tooltips.appliedenergistics2.SearchMode_JEIAuto=Auto Procura, Sincronizado com o JEI
gui.tooltips.appliedenergistics2.SearchMode_JEIStandard=Procura Padrão, Sincronizado com o JEI
gui.tooltips.appliedenergistics2.SearchMode_AutoKeep=Auto Procura (Manter)
gui.tooltips.appliedenergistics2.SearchMode_StandardKeep=Procura Padrão (Manter)
gui.tooltips.appliedenergistics2.SearchMode_JEIAutoKeep=Auto Procura, Sincronizado com o JEI (Manter)
gui.tooltips.appliedenergistics2.SearchMode_JEIStandardKeep=Procura Padrão, Sincronizado com o JEI (Manter)
gui.tooltips.appliedenergistics2.SearchMode=Modo de Caixa de Procura
gui.tooltips.appliedenergistics2.PartitionStorageHint=Configura a Partição baseado em itens atualmente armazenados.
gui.tooltips.appliedenergistics2.ClearSettings=Limpar Configurações
@@ -314,8 +332,11 @@ gui.tooltips.appliedenergistics2.EmitterMode=Modo de Fabricação Emissor
gui.tooltips.appliedenergistics2.CraftViaRedstone=Emite sinal para fazer um item.
gui.tooltips.appliedenergistics2.EmitWhenCrafting=Emite sinal enquanto o item está sendo fabricado.
gui.tooltips.appliedenergistics2.ReportInaccessibleItems=Reportar Itens Inacessíveis
gui.tooltips.appliedenergistics2.ReportInaccessibleItemsYes=Sim: Itens que não podem ser extraídos vão estar visíveis.
gui.tooltips.appliedenergistics2.ReportInaccessibleItemsYes=Sim: Itens que não podem ser extraídos estarão visíveis.
gui.tooltips.appliedenergistics2.ReportInaccessibleItemsNo=Não: Apenas itens extraíveis vão estar visíveis.
gui.tooltips.appliedenergistics2.ReportInaccessibleFluids=Reportar Fluidos Inacessíveis
gui.tooltips.appliedenergistics2.ReportInaccessibleFluidsYes=Sim: Fluidos que não podem ser extraídos estarão visíveis.
gui.tooltips.appliedenergistics2.ReportInaccessibleFluidsNo=Não: Apenas fluidos extraíveis estarão visíveis.
gui.tooltips.appliedenergistics2.BlockPlacement=Colocação de Blocos
gui.tooltips.appliedenergistics2.BlockPlacementYes=Blocks serão colocados como blocos.
gui.tooltips.appliedenergistics2.BlockPlacementNo=Blocos serão jogados como itens.
@@ -323,12 +344,16 @@ gui.tooltips.appliedenergistics2.SchedulingMode=Modo Planejado
gui.tooltips.appliedenergistics2.SchedulingModeDefault=Exportar o primeiro item até que a rede esteja vazia, e depois tentar o próximo.
gui.tooltips.appliedenergistics2.SchedulingModeRoundRobin=Exportar usando mode modo de turnos.
gui.tooltips.appliedenergistics2.SchedulingModeRandom=Exportar items usando modo aleatório.
gui.tooltips.appliedenergistics2.FilterMode=Modo Filtro de Procura
gui.tooltips.appliedenergistics2.FilterModeKeep=Restaura o Filtro de Procura Anterior.
gui.tooltips.appliedenergistics2.FilterModeClear=Limpa em cada abertura.
gui.tooltips.appliedenergistics2.ItemsStored=Items Guardados: %s
gui.tooltips.appliedenergistics2.ItemsRequestable=Items Solicitáveis: %s
gui.tooltips.appliedenergistics2.P2PFrequency=Frequência: %s
// Units
gui.appliedenergistics2.units.appliedenergstics=AE
gui.appliedenergistics2.units.ic2=Energy Units
gui.appliedenergistics2.units.ic2=Unidades de Energia
gui.appliedenergistics2.units.rf=Redstone Flux
// Cores
@@ -360,15 +385,23 @@ waila.appliedenergistics2.Unlocked=Destrancado
waila.appliedenergistics2.Showing=Mostrando
waila.appliedenergistics2.Contains=Contém
waila.appliedenergistics2.Channels=%1$d de %2$d Canais
waila.appliedenergistics2.P2PUnlinked=Desconectado
waila.appliedenergistics2.P2PInputOneOutput=Conectado (Lado de Entrada)
waila.appliedenergistics2.P2PInputManyOutputs=Conectado (Lado de Entrada) - %d Saídas
waila.appliedenergistics2.P2POutput=Conectado (Lado de Saída)
// Items
item.appliedenergistics2.storage_cell_1k.name=Célula de Armazenamento ME de 1k
item.appliedenergistics2.storage_cell_4k.name=Célula de Armazenamento ME de 4k
item.appliedenergistics2.storage_cell_16k.name=Célula de Armazenamento ME de 16k
item.appliedenergistics2.storage_cell_64k.name=Célula de Armazenamento ME de 64k
item.appliedenergistics2.fluid_storage_cell_1k.name=Célula de Armazenamento ME de 1k para Fluidos
item.appliedenergistics2.fluid_storage_cell_4k.name=Célula de Armazenamento ME de 4k para Fluidos
item.appliedenergistics2.fluid_storage_cell_16k.name=Célula de Armazenamento ME de 16k para Fluidos
item.appliedenergistics2.fluid_storage_cell_64k.name=Célula de Armazenamento ME de 64k para Fluidos
item.appliedenergistics2.creative_storage_cell.name=Célula de Armazenamento ME Criativa
item.appliedenergistics2.encoded_pattern.name=Padrão Codificado
item.appliedenergistics2.view_cell.name=Ver Célula
item.appliedenergistics2.view_cell.name=Célula de Visualização
item.appliedenergistics2.facade.name=Fachada de Cabos
item.appliedenergistics2.crystal_seed.certus.name=Semente de Quartzo Certus
@@ -392,11 +425,15 @@ item.appliedenergistics2.material.cell1k_part.name=Componente de Armazenamento M
item.appliedenergistics2.material.cell4k_part.name=Componente de Armazenamento ME de 4k
item.appliedenergistics2.material.cell16k_part.name=Componente de Armazenamento ME de 16k
item.appliedenergistics2.material.cell64k_part.name=Componente de Armazenamento ME de 64k
item.appliedenergistics2.material.fluid_cell1k_part.name=Componente de Armazenamento ME de Fluidos de 1k
item.appliedenergistics2.material.fluid_cell4k_part.name=Componente de Armazenamento ME de Fluidos de 4k
item.appliedenergistics2.material.fluid_cell16k_part.name=Componente de Armazenamento ME de Fluidos de 16k
item.appliedenergistics2.material.fluid_cell64k_part.name=Componente de Armazenamento ME de Fluidos de 64k
item.appliedenergistics2.material.certus_quartz_crystal.name=Cristal de Quartzo Certus
item.appliedenergistics2.material.certus_quartz_crystal_charged.name=Cristal Carregado de Quartzo Certus
item.appliedenergistics2.material.certus_quartz_dust.name=Pó de Quartzo Certus
item.appliedenergistics2.material.empty_storage_cell.name=Encaixe de Armazenamento ME
item.appliedenergistics2.material.ender_dust.name=Pó do Fim
item.appliedenergistics2.material.ender_dust.name=Pó do End
item.appliedenergistics2.material.engineering_processor.name=Processador de Engenharia
item.appliedenergistics2.material.flour.name=Farinha
item.appliedenergistics2.material.fluix_crystal.name=Cristal de Fluix
@@ -431,32 +468,41 @@ item.appliedenergistics2.material.sky_dust.name=Pó de Pedra do Céu
item.appliedenergistics2.material.card_crafting.name=Cartão de Fabricação
item.appliedenergistics2.multi_part.annihilation_plane.name=Plano de Aniquilação ME
item.appliedenergistics2.multi_part.fluid_annihilation_plane.name=Plano de Aniquilação ME para Fluidos
item.appliedenergistics2.multi_part.identity_annihilation_plane.name=Plano de Aniquilação de identidade ME
item.appliedenergistics2.multi_part.cable_anchor.name=Cabo Âncora
item.appliedenergistics2.multi_part.cable_covered.name=Cabo Coberto ME
item.appliedenergistics2.multi_part.cable_glass.name=Cabo de Vidro ME
item.appliedenergistics2.multi_part.cable_smart.name=Cabo Inteligente ME
item.appliedenergistics2.multi_part.cable_dense_smart.name=Cabo Denso ME
item.appliedenergistics2.multi_part.cable_dense_smart.name=Cabo Denso Coberto ME
item.appliedenergistics2.multi_part.cable_dense_smart.name=Cabo Denso Coberto Inteligente ME
item.appliedenergistics2.multi_part.storage_monitor.name=Monitor de Armazenamento ME
item.appliedenergistics2.multi_part.conversion_monitor.name=Monitor de Conversão ME
item.appliedenergistics2.multi_part.crafting_terminal.name=Terminal de Fabricação ME
item.appliedenergistics2.multi_part.semi_dark_monitor.name=Painel Iluminado
item.appliedenergistics2.multi_part.monitor.name=Painel Brilhante Iluminado
item.appliedenergistics2.multi_part.dark_monitor.name=Painel Escuro Iluminado
item.appliedenergistics2.multi_part.export_bus.name=Barramento de Exportação ME
item.appliedenergistics2.multi_part.export_bus.name=Barramento ME de Exportação
item.appliedenergistics2.multi_part.fluid_export_bus.name=Barramento ME de Exportação de Fluidos
item.appliedenergistics2.multi_part.formation_plane.name=Plano de Formação ME
item.appliedenergistics2.multi_part.import_bus.name=Barramento de Importação ME
item.appliedenergistics2.multi_part.fluid_formation_plane.name=Plano de Formação ME para Fluidos
item.appliedenergistics2.multi_part.import_bus.name=Barramento ME de Importação
item.appliedenergistics2.multi_part.fluid_import_bus.name=Barramento ME de Importação de Fluidos
item.appliedenergistics2.multi_part.interface.name=Interface ME
item.appliedenergistics2.multi_part.fluid_interface.name=Interface ME de Fluidos
item.appliedenergistics2.multi_part.level_emitter.name=Emissor de Nível ME
item.appliedenergistics2.multi_part.fluid_level_emitter.name=Emissor de Nível ME para Fluidos
item.appliedenergistics2.multi_part.p2p_tunnel.name=Tùnel P2P
item.appliedenergistics2.multi_part.pattern_terminal.name=Terminal de Padrões ME
item.appliedenergistics2.multi_part.quartz_fiber.name=Fibra de Quartzo
item.appliedenergistics2.multi_part.storage_bus.name=Barramento de Armazenamento ME
item.appliedenergistics2.multi_part.storage_bus.name=Barramento ME de Armazenamento
item.appliedenergistics2.multi_part.fluid_storage_bus.name=Barramento ME de Armazenamento de Fluidos
item.appliedenergistics2.multi_part.terminal.name=Terminal ME
item.appliedenergistics2.multi_part.inverted_toggle_bus.name=Barramento de Alternância Invertido ME
item.appliedenergistics2.multi_part.toggle_bus.name=Barramento de Alternância ME
item.appliedenergistics2.multi_part.crafting_monitor.name=Monitor de Fabricação ME
item.appliedenergistics2.multi_part.interface_terminal.name=Terminal de Interface ME
item.appliedenergistics2.multi_part.fluid_terminal.name=Terminal ME de Fluidos
item.appliedenergistics2.multi_part.invalid_type.name=Item Desabilitado
item.appliedenergistics2.spatial_storage_cell_128_cubed.name=Célula de Armazenamento Espacial 128³
@@ -502,18 +548,20 @@ commands.ae2.ChunkLoggerOff=O registro de agora está desligado.
commands.ae2.Supporters=Mostra uma lista de Apoiadores do AE2
// Conquistas
achievement.ae2.Root=Energistica Aplicada
achievement.ae2.Root.desc=Quando baús não são o suficiente.
achievement.ae2.Compass=Caça-Meteoritos
achievement.ae2.Compass.desc=Faça uma Bússola de Meteoritos
achievement.ae2.Presses=Tecnologia Desconhecida
achievement.ae2.Presses.desc=Ache uma Prensa de Processador
achievement.ae2.SpatialIO=Coordenação Espacial
achievement.ae2.SpatialIO.desc=Crie uma Porta de ES Espacial
achievement.ae2.SpatialIO.desc=Crie uma Porta de E/S Espacial
achievement.ae2.SpatialIOExplorer=Ir audaciosamente
achievement.ae2.SpatialIOExplorer.desc=Fique armazenado em uma Célula de Armazenamento Espacial.
achievement.ae2.SpatialIOExplorer.desc=Seja armazenado em uma Célula de Armazenamento Espacial.
achievement.ae2.StorageCell=Melhor que Baús
achievement.ae2.StorageCell.desc=Faça uma Célula de Armazenamento
achievement.ae2.IOPort=Embaralhamento de Células de Armazenamentos
achievement.ae2.IOPort.desc=Faça uma Porta de ES
achievement.ae2.StorageCell.desc=Faça uma Célula de Armazenamento de Matéria para Energia
achievement.ae2.IOPort=Embaralhamento de Células de Armazenamento
achievement.ae2.IOPort.desc=Faça uma Porta de E/S
achievement.ae2.CraftingTerminal=Uma Bancada (Muito) Maior
achievement.ae2.CraftingTerminal.desc=Faça um Terminal de Fabricação
achievement.ae2.PatternTerminal=Maestro da Fabricação
@@ -557,3 +605,7 @@ achievement.ae2.QNB.desc=Faça uma Ligação Quântica
stat.ae2.ItemsInserted=Itens adicionados ao Armazenamento ME
stat.ae2.ItemsExtracted=Itens extraídos do Armazenamento ME
stat.ae2.TurnedCranks=Manivelas Giradas
//Keys
key.appliedenergistics2.category=Applied Energistics 2
key.toggle_focus.desc=Alterar foco da caixa de procura
@@ -10,22 +10,22 @@
{
"faces": {
"down": {
"texture": "#block"
"texture": "#block", "cullface": "down"
},
"east": {
"texture": "#block"
"texture": "#block", "cullface": "east"
},
"north": {
"texture": "#block"
"texture": "#block", "cullface": "north"
},
"south": {
"texture": "#block"
"texture": "#block", "cullface": "south"
},
"up": {
"texture": "#block"
"texture": "#block", "cullface": "up"
},
"west": {
"texture": "#block"
"texture": "#block", "cullface": "west"
}
},
"from": [
@@ -43,6 +43,7 @@
"faces": {
"down": {
"texture": "#quartz",
"cullface": "down",
"uvlightmap": {
"block": 0.007,
"sky": 0.007
@@ -50,6 +51,7 @@
},
"east": {
"texture": "#quartz",
"cullface": "east",
"uvlightmap": {
"block": 0.007,
"sky": 0.007
@@ -57,6 +59,7 @@
},
"north": {
"texture": "#quartz",
"cullface": "north",
"uvlightmap": {
"block": 0.007,
"sky": 0.007
@@ -64,6 +67,7 @@
},
"south": {
"texture": "#quartz",
"cullface": "south",
"uvlightmap": {
"block": 0.007,
"sky": 0.007
@@ -71,6 +75,7 @@
},
"up": {
"texture": "#quartz",
"cullface": "up",
"uvlightmap": {
"block": 0.007,
"sky": 0.007
@@ -78,6 +83,7 @@
},
"west": {
"texture": "#quartz",
"cullface": "west",
"uvlightmap": {
"block": 0.007,
"sky": 0.007