Compare commits
31 Commits
| Author | SHA1 | Date | |
|---|---|---|---|
| 52d62b8202 | |||
| 643f559186 | |||
| 09ed06e47f | |||
| 741b5bee1f | |||
| c1c3655db6 | |||
| b05796e62b | |||
| 200e56a509 | |||
| 9540bbce49 | |||
| c6d932da04 | |||
| 6e7100361c | |||
| ca50ee0762 | |||
| f00d5c297f | |||
| b13f5ced01 | |||
| 1c0f1ea243 | |||
| b612ff47a3 | |||
| e8a68cc531 | |||
| d9f362270b | |||
| 37aef15a02 | |||
| 2d8728f0e1 | |||
| 3498a0902b | |||
| bb4b6719fe | |||
| 34f78a7ce4 | |||
| 064acc21ee | |||
| deeb67f07d | |||
| 2eeaa80b59 | |||
| 1710894edc | |||
| 7cb485aa48 | |||
| 65d0ae9290 | |||
| 1baed48b0a | |||
| 013c8d882c | |||
| e392ecd08d |
@@ -22,9 +22,11 @@ apply from: 'gradle/scripts/dependencies.gradle'
|
||||
apply from: 'gradle/scripts/artifacts.gradle'
|
||||
apply from: 'gradle/scripts/autoinstallruntime.gradle'
|
||||
apply from: 'gradle/scripts/integration.gradle'
|
||||
apply from: 'gradle/scripts/optional.gradle'
|
||||
|
||||
buildscript {
|
||||
repositories {
|
||||
mavenLocal()
|
||||
mavenCentral()
|
||||
|
||||
maven {
|
||||
|
||||
+27
-10
@@ -1,5 +1,5 @@
|
||||
aeversion=rv2
|
||||
aechannel=beta
|
||||
aechannel=stable
|
||||
aebuild=0
|
||||
aegroup=appeng
|
||||
aebasename=appliedenergistics2
|
||||
@@ -11,30 +11,47 @@ minecraft_version=1.7.10
|
||||
forge_version=10.13.2.1291
|
||||
|
||||
#########################################################
|
||||
# APIs used for development #
|
||||
# Installable #
|
||||
#########################################################
|
||||
waila_version=1.5.10
|
||||
jabba_version=1.2.1a
|
||||
enderstorage_version=1.4.7.33
|
||||
translocator_version=1.1.1.14
|
||||
ic2_version=2.2.717
|
||||
enderio_version=2.3.0.375_beta
|
||||
#cofhlib_version=1.0.1-157
|
||||
#cofhcore_version=3.0.2-270
|
||||
#texpansion_version=4.0.0-176
|
||||
#tfoundation_version=1.0.0-82
|
||||
betterstorage_version=0.11.3.123.20
|
||||
invtweaks_version=1.58
|
||||
|
||||
#########################################################
|
||||
# Provided APIs #
|
||||
#########################################################
|
||||
fmp_version=1.1.1.324
|
||||
code_chicken_lib_version=1.1.3.127
|
||||
code_chicken_core_version=1.0.4.35
|
||||
nei_version=1.0.4.90
|
||||
bc_version=6.4.6
|
||||
bc_version=7.0.9
|
||||
|
||||
#########################################################
|
||||
# API Stubs #
|
||||
# Self Compiled APIs #
|
||||
#########################################################
|
||||
mekansim_version=8.0.1.198
|
||||
rotarycraft_version=V6e
|
||||
|
||||
|
||||
#########################################################
|
||||
# Self Compiled API Stubs #
|
||||
# Note: Do not edit these version numbers as they are #
|
||||
# not the version of the mod, but stub code for AE2 to #
|
||||
# compile #
|
||||
#########################################################
|
||||
api_betterstorage_version=1
|
||||
api_coloredlightscore_version=1
|
||||
api_craftguide_version=1
|
||||
api_ic2_version=1
|
||||
api_immibis_version=1
|
||||
api_invtweaks_version=1
|
||||
api_mekansim_version=1.7.10-8.0.1.198
|
||||
api_mfr_version=1
|
||||
api_railcraft_version=1
|
||||
api_rblocks_version=1
|
||||
api_rf_version=2
|
||||
api_rotarycraft_version=V5c
|
||||
api_waila_version=1.5.10_1.7.10
|
||||
@@ -19,14 +19,14 @@
|
||||
|
||||
|
||||
repositories {
|
||||
|
||||
mavenLocal()
|
||||
maven {
|
||||
name 'CB Maven FS'
|
||||
name "ChickenBones"
|
||||
url "http://chickenbones.net/maven/"
|
||||
}
|
||||
|
||||
maven {
|
||||
name "Waila Mobius Repo"
|
||||
name "Mobius"
|
||||
url "http://mobiusstrip.eu/maven"
|
||||
}
|
||||
|
||||
@@ -34,31 +34,92 @@ repositories {
|
||||
name "FireBall API Depot"
|
||||
url "http://dl.tsr.me/artifactory/libs-release-local"
|
||||
}
|
||||
|
||||
maven {
|
||||
name = "Player"
|
||||
url = "http://maven.ic2.player.to/"
|
||||
}
|
||||
|
||||
maven {
|
||||
name = "Tterrag"
|
||||
url = "http://maven.tterrag.com/"
|
||||
}
|
||||
|
||||
maven {
|
||||
name = "RX14 Proxy"
|
||||
url = "http://mvn.rx14.co.uk/repo/"
|
||||
}
|
||||
|
||||
ivy {
|
||||
name "BuildCraft"
|
||||
artifactPattern "http://www.mod-buildcraft.com/releases/BuildCraft/[revision]/[module]-[revision]-[classifier].[ext]"
|
||||
}
|
||||
|
||||
// CurseForge DNS for TE is not available or I am just being unlucky, code part can stay since this is applicable to any other curseforge mod though
|
||||
// ivy {
|
||||
// name = "CoFHLib"
|
||||
// artifactPattern "http://addons.cursecdn.com/files/2212/893/[module]-[revision].[ext]"
|
||||
// }
|
||||
//
|
||||
// ivy {
|
||||
// name = "CoFHCore"
|
||||
// artifactPattern "http://addons.cursecdn.com/files/2212/895/[module]-[revision].[ext]"
|
||||
// }
|
||||
|
||||
// ivy {
|
||||
// name = "ThermalExpansion"
|
||||
// artifactPattern "http://addons.curse.cursecdn.com/files/2212/446/[module]-[revision].[ext]"
|
||||
// }
|
||||
|
||||
// ivy {
|
||||
// name = "ThermalFoundation"
|
||||
// artifactPattern "http://addons.curse.cursecdn.com/files/2212/444/[module]-[revision].[ext]"
|
||||
// }
|
||||
}
|
||||
|
||||
configurations {
|
||||
mods
|
||||
}
|
||||
|
||||
dependencies {
|
||||
// installable
|
||||
mods "mcp.mobius.waila:Waila:${waila_version}_${minecraft_version}:dev"
|
||||
mods "mcp.mobius.jabba:Jabba:${jabba_version}_${minecraft_version}:dev"
|
||||
mods "codechicken:EnderStorage:${minecraft_version}-${enderstorage_version}:dev"
|
||||
mods "codechicken:Translocator:${minecraft_version}-${translocator_version}:dev"
|
||||
mods "net.industrial-craft:industrialcraft-2:${ic2_version}-experimental:dev"
|
||||
mods "com.enderio:EnderIO:${minecraft_version}-${enderio_version}:dev"
|
||||
mods "net.mcft.copy.betterstorage:BetterStorage:${minecraft_version}-${betterstorage_version}:deobf"
|
||||
mods "inventorytweaks:InventoryTweaks:${invtweaks_version}:deobf"
|
||||
// mods name: 'CoFHLib', version: "[${minecraft_version}]${cofhlib_version}-dev", ext: 'jar'
|
||||
// mods name: 'CoFHCore', version: "[${minecraft_version}]${cofhcore_version}-dev", ext: 'jar'
|
||||
// mods name: 'ThermalExpansion', version: "[${minecraft_version}]${texpansion_version}-dev", ext: 'jar'
|
||||
// mods name: 'ThermalFoundation', version: "[${minecraft_version}]${tfoundation_version}-dev", ext: 'jar'
|
||||
|
||||
compile "codechicken:ForgeMultipart:${minecraft_version}-${fmp_version}:dev"
|
||||
compile "codechicken:CodeChickenLib:${minecraft_version}-${code_chicken_lib_version}:dev"
|
||||
compile "codechicken:CodeChickenCore:${minecraft_version}-${code_chicken_core_version}:dev"
|
||||
compile "codechicken:NotEnoughItems:${minecraft_version}-${nei_version}:dev"
|
||||
|
||||
compile "com.mod-buildcraft:buildcraft:${bc_version}:dev"
|
||||
|
||||
// provided APIs
|
||||
compile "net.industrial-craft:industrialcraft-2:${ic2_version}-experimental:api"
|
||||
compile "net.mcft.copy.betterstorage:BetterStorage:${minecraft_version}-${betterstorage_version}:api"
|
||||
|
||||
// self compiled APIs
|
||||
compile(group: 'api', name: 'betterstorage', version: "${api_betterstorage_version}")
|
||||
compile "appeng:Waila:${waila_version}_${minecraft_version}:api"
|
||||
compile "appeng:RotaryCraft:${rotarycraft_version}:api"
|
||||
compile "appeng:mekanism:${minecraft_version}-${mekansim_version}:api"
|
||||
compile "appeng:InventoryTweaks:${invtweaks_version}:api"
|
||||
|
||||
// self compiled stubs
|
||||
compile(group: 'api', name: 'coloredlightscore', version: "${api_coloredlightscore_version}")
|
||||
compile(group: 'api', name: 'craftguide', version: "${api_craftguide_version}")
|
||||
compile(group: 'api', name: 'ic2', version: "${api_ic2_version}")
|
||||
compile(group: 'api', name: 'immibis', version: "${api_immibis_version}")
|
||||
compile(group: 'api', name: 'invtweaks', version: "${api_invtweaks_version}")
|
||||
compile(group: 'api', name: 'mfr', version: "${api_mfr_version}")
|
||||
compile(group: 'api', name: 'railcraft', version: "${api_railcraft_version}")
|
||||
compile(group: 'api', name: 'rblocks', version: "${api_rblocks_version}")
|
||||
compile(group: 'api', name: 'rf', version: "${api_rf_version}")
|
||||
compile "appeng:Waila:${api_waila_version}:api"
|
||||
compile "appeng:RotaryCraft:${api_rotarycraft_version}:api"
|
||||
compile "appeng:mekanism:${api_mekansim_version}:api"
|
||||
|
||||
testCompile "junit:junit:4.11"
|
||||
}
|
||||
|
||||
@@ -0,0 +1,106 @@
|
||||
task wrapper(type: Wrapper) {
|
||||
gradleVersion = "2.3"
|
||||
}
|
||||
|
||||
// WAILA
|
||||
task installWaila(type: Copy, dependsOn: "deinstallWaila") {
|
||||
from { configurations.mods }
|
||||
include "**/*Waila*dev.jar"
|
||||
into file(minecraft.runDir + "/mods")
|
||||
}
|
||||
|
||||
task deinstallWaila(type: Delete) {
|
||||
delete fileTree(dir: minecraft.runDir + "/mods", include: "*Waila*.jar")
|
||||
}
|
||||
|
||||
// JABBA
|
||||
task installJabba(type: Copy, dependsOn: "deinstallJabba") {
|
||||
from { configurations.mods }
|
||||
include "**/*Jabba*dev.jar"
|
||||
into file(minecraft.runDir + "/mods")
|
||||
}
|
||||
|
||||
task deinstallJabba(type: Delete) {
|
||||
delete fileTree(dir: minecraft.runDir + "/mods", include: "*Jabba*.jar")
|
||||
}
|
||||
|
||||
// ENDER STORAGE
|
||||
task installEnderStorage(type: Copy, dependsOn: "deinstallEnderStorage") {
|
||||
from { configurations.mods }
|
||||
include "**/*EnderStorage*dev.jar"
|
||||
into file(minecraft.runDir + "/mods")
|
||||
}
|
||||
|
||||
task deinstallEnderStorage(type: Delete) {
|
||||
delete fileTree(dir: minecraft.runDir + "/mods", include: "*EnderStorage*.jar")
|
||||
}
|
||||
|
||||
// TRANSLOCATOR
|
||||
task installTranslocator(type: Copy, dependsOn: "deinstallTranslocator") {
|
||||
from { configurations.mods }
|
||||
include "**/*Translocator*dev.jar"
|
||||
into file(minecraft.runDir + "/mods")
|
||||
}
|
||||
|
||||
task deinstallTranslocator(type: Delete) {
|
||||
delete fileTree(dir: minecraft.runDir + "/mods", include: "*Translocator*.jar")
|
||||
}
|
||||
|
||||
// INDUSTRIALCRAFT
|
||||
task installIC2(type: Copy, dependsOn: "deinstallIC2") {
|
||||
from { configurations.mods }
|
||||
include "**/*industrialcraft*dev.jar"
|
||||
into file(minecraft.runDir + "/mods")
|
||||
}
|
||||
|
||||
task deinstallIC2(type: Delete) {
|
||||
delete fileTree(dir: minecraft.runDir + "/mods", include: "*industrialcraft*.jar")
|
||||
}
|
||||
|
||||
// ENDER IO
|
||||
task installEnderIO(type: Copy, dependsOn: "deinstallEnderIO") {
|
||||
from { configurations.mods }
|
||||
include "**/*EnderIO*dev.jar"
|
||||
into file(minecraft.runDir + "/mods")
|
||||
}
|
||||
|
||||
task deinstallEnderIO(type: Delete) {
|
||||
delete fileTree(dir: minecraft.runDir + "/mods", include: "*EnderIO*.jar")
|
||||
}
|
||||
|
||||
// TE
|
||||
//task installTE(type: Copy, dependsOn: "deinstallTE") {
|
||||
// from { configurations.mods }
|
||||
// include "**/*CoFHLib*.jar"
|
||||
// include "**/*CoFHCore*.jar"
|
||||
// include "**/*ThermalFoundation*.jar"
|
||||
// include "**/*ThermalExpansion*.jar"
|
||||
//
|
||||
// into file(minecraft.runDir + "/mods")
|
||||
//}
|
||||
//
|
||||
//task deinstallTE(type: Delete) {
|
||||
// delete fileTree(dir: minecraft.runDir + "/mods", includes: ["*CoFHLib*.jar", "*CoFHCore*.jar", "*ThermalFoundation*.jar", "*ThermalExpansion*.jar"])
|
||||
//}
|
||||
|
||||
// INV TWEAKS
|
||||
task installInvTweaks(type: Copy, dependsOn: "deinstallInvTweaks") {
|
||||
from { configurations.mods }
|
||||
include "**/*InventoryTweaks*dev*.jar"
|
||||
into file(minecraft.runDir + "/mods")
|
||||
}
|
||||
|
||||
task deinstallInvTweaks(type: Delete) {
|
||||
delete fileTree(dir: minecraft.runDir + "/mods", include: "*InventoryTweaks*.jar")
|
||||
}
|
||||
|
||||
// BETTER STORAGE
|
||||
task installBetterStorage(type: Copy, dependsOn: "deinstallBetterStorage") {
|
||||
from { configurations.mods }
|
||||
include "**/*BetterStorage*deobf*.jar"
|
||||
into file(minecraft.runDir + "/mods")
|
||||
}
|
||||
|
||||
task deinstallBetterStorage(type: Delete) {
|
||||
delete fileTree(dir: minecraft.runDir + "/mods", include: "*BetterStorage*.jar")
|
||||
}
|
||||
Vendored
BIN
Binary file not shown.
+2
-2
@@ -1,6 +1,6 @@
|
||||
#Sat Sep 13 21:58:22 CEST 2014
|
||||
#Sat May 02 19:28:20 CEST 2015
|
||||
distributionBase=GRADLE_USER_HOME
|
||||
distributionPath=wrapper/dists
|
||||
zipStoreBase=GRADLE_USER_HOME
|
||||
zipStorePath=wrapper/dists
|
||||
distributionUrl=https\://services.gradle.org/distributions/gradle-2.1-all.zip
|
||||
distributionUrl=https\://services.gradle.org/distributions/gradle-2.3-bin.zip
|
||||
|
||||
@@ -39,7 +39,7 @@ import appeng.tile.misc.TileVibrationChamber;
|
||||
import appeng.util.Platform;
|
||||
|
||||
|
||||
public class BlockVibrationChamber extends AEBaseBlock
|
||||
public final class BlockVibrationChamber extends AEBaseBlock
|
||||
{
|
||||
|
||||
public BlockVibrationChamber()
|
||||
|
||||
@@ -1,6 +1,6 @@
|
||||
/*
|
||||
* This file is part of Applied Energistics 2.
|
||||
* Copyright (c) 2013 - 2014, AlgorithmX2, All rights reserved.
|
||||
* Copyright (c) 2013 - 2015, AlgorithmX2, All rights reserved.
|
||||
*
|
||||
* Applied Energistics 2 is free software: you can redistribute it and/or modify
|
||||
* it under the terms of the GNU Lesser General Public License as published by
|
||||
@@ -29,7 +29,6 @@ import net.minecraft.item.ItemStack;
|
||||
import net.minecraft.util.MathHelper;
|
||||
import net.minecraft.world.IBlockAccess;
|
||||
import net.minecraft.world.World;
|
||||
import net.minecraftforge.oredict.OreDictionary;
|
||||
|
||||
import appeng.api.AEApi;
|
||||
import appeng.api.exceptions.MissingDefinition;
|
||||
@@ -67,12 +66,6 @@ public class OreQuartz extends AEBaseBlock
|
||||
return RenderQuartzOre.class;
|
||||
}
|
||||
|
||||
@Override
|
||||
public void postInit()
|
||||
{
|
||||
OreDictionary.registerOre( "oreCertusQuartz", new ItemStack( this ) );
|
||||
}
|
||||
|
||||
@Override
|
||||
public int getMixedBrightnessForBlock( IBlockAccess par1iBlockAccess, int par2, int par3, int par4 )
|
||||
{
|
||||
|
||||
@@ -22,6 +22,7 @@ package appeng.client.gui.implementations;
|
||||
import java.io.IOException;
|
||||
import java.util.List;
|
||||
|
||||
import org.lwjgl.input.Keyboard;
|
||||
import org.lwjgl.input.Mouse;
|
||||
|
||||
import net.minecraft.client.gui.GuiButton;
|
||||
@@ -218,6 +219,8 @@ public class GuiMEMonitorable extends AEBaseMEGui implements ISortSource, IConfi
|
||||
@Override
|
||||
public void initGui()
|
||||
{
|
||||
Keyboard.enableRepeatEvents( true );
|
||||
|
||||
this.maxRows = this.getMaxRows();
|
||||
this.perRow = AEConfig.instance.getConfigManager().getSetting( Settings.TERMINAL_STYLE ) != TerminalStyle.FULL ? 9 : 9 + ( ( this.width - this.standardSize ) / 18 );
|
||||
|
||||
@@ -383,6 +386,7 @@ public class GuiMEMonitorable extends AEBaseMEGui implements ISortSource, IConfi
|
||||
public void onGuiClosed()
|
||||
{
|
||||
super.onGuiClosed();
|
||||
Keyboard.enableRepeatEvents( false );
|
||||
memoryText = this.searchField.getText();
|
||||
}
|
||||
|
||||
|
||||
@@ -65,8 +65,6 @@ public class ContainerInscriber extends ContainerUpgradeable implements IProgres
|
||||
this.addSlotToContainer( this.middle = new SlotRestrictedInput( SlotRestrictedInput.PlacableItemType.INSCRIBER_INPUT, this.ti, 2, 63, 39, this.invPlayer ) );
|
||||
|
||||
this.addSlotToContainer( new SlotOutput( this.ti, 3, 113, 40, -1 ) );
|
||||
|
||||
this.bindPlayerInventory( ip, 0, this.getHeight() - /* height of player inventory */82 );
|
||||
}
|
||||
|
||||
@Override
|
||||
|
||||
@@ -20,6 +20,11 @@ package appeng.core.features;
|
||||
|
||||
|
||||
import java.lang.reflect.Constructor;
|
||||
import java.lang.reflect.InvocationTargetException;
|
||||
import javax.annotation.Nonnull;
|
||||
|
||||
import com.google.common.base.Optional;
|
||||
import com.google.common.base.Preconditions;
|
||||
|
||||
import net.minecraft.block.Block;
|
||||
import net.minecraft.item.Item;
|
||||
@@ -27,10 +32,6 @@ import net.minecraft.item.ItemBlock;
|
||||
import net.minecraft.item.ItemStack;
|
||||
import net.minecraft.world.IBlockAccess;
|
||||
|
||||
import com.google.common.base.Optional;
|
||||
import com.google.common.base.Preconditions;
|
||||
import com.google.common.collect.ObjectArrays;
|
||||
|
||||
import appeng.api.definitions.IBlockDefinition;
|
||||
import appeng.block.AEBaseBlock;
|
||||
|
||||
@@ -92,13 +93,16 @@ public class BlockDefinition extends ItemDefinition implements IBlockDefinition
|
||||
/**
|
||||
* Create an {@link ItemBlock} from a {@link Block} to register it later as {@link Item}
|
||||
*
|
||||
* @param block
|
||||
* @return
|
||||
* @param block to be constructed from
|
||||
*
|
||||
* @return item from block
|
||||
*/
|
||||
@Nonnull
|
||||
private static Item constructItemFromBlock( Block block )
|
||||
{
|
||||
final Class<? extends ItemBlock> itemclass = getItemBlockConstructor( block );
|
||||
return constructItemBlock( block, itemclass );
|
||||
final Class<? extends ItemBlock> itemClass = getItemBlockConstructor( block );
|
||||
|
||||
return constructItemBlock( block, itemClass );
|
||||
}
|
||||
|
||||
/**
|
||||
@@ -110,6 +114,7 @@ public class BlockDefinition extends ItemDefinition implements IBlockDefinition
|
||||
* @param block the block used to determine the used constructor.
|
||||
* @return a {@link Class} extending ItemBlock
|
||||
*/
|
||||
@Nonnull
|
||||
private static Class<? extends ItemBlock> getItemBlockConstructor( Block block )
|
||||
{
|
||||
if ( block instanceof AEBaseBlock )
|
||||
@@ -124,32 +129,39 @@ public class BlockDefinition extends ItemDefinition implements IBlockDefinition
|
||||
/**
|
||||
* Actually construct an instance of {@link Item} with the block and earlier determined constructor.
|
||||
*
|
||||
* Shamelessly stolen from the forge magic.
|
||||
*
|
||||
* TODO: throw an exception instead of returning null? As this could cause issue later on.
|
||||
*
|
||||
* @param block the block to create the {@link ItemBlock} from
|
||||
* @param itemclass the class used to construct it.
|
||||
* @param itemClass the class used to construct it.
|
||||
* @return an {@link Item} for the block. Actually always a sub type of {@link ItemBlock}
|
||||
*/
|
||||
private static Item constructItemBlock( Block block, Class<? extends ItemBlock> itemclass )
|
||||
@Nonnull
|
||||
private static Item constructItemBlock( Block block, Class<? extends ItemBlock> itemClass )
|
||||
{
|
||||
assert block != null;
|
||||
assert itemClass != null;
|
||||
|
||||
try
|
||||
{
|
||||
Object[] itemCtorArgs = new Object[] {};
|
||||
Class<?>[] ctorArgClasses = new Class<?>[itemCtorArgs.length + 1];
|
||||
ctorArgClasses[0] = Block.class;
|
||||
for ( int idx = 1; idx < ctorArgClasses.length; idx++ )
|
||||
{
|
||||
ctorArgClasses[idx] = itemCtorArgs[idx - 1].getClass();
|
||||
}
|
||||
final Constructor<? extends ItemBlock> itemConstructor = itemClass.getConstructor( Block.class );
|
||||
|
||||
Constructor<? extends ItemBlock> itemCtor = itemclass.getConstructor( ctorArgClasses );
|
||||
return itemCtor.newInstance( ObjectArrays.concat( block, itemCtorArgs ) );
|
||||
return itemConstructor.newInstance( block );
|
||||
}
|
||||
catch ( Throwable t )
|
||||
catch( InstantiationException e )
|
||||
{
|
||||
return null;
|
||||
e.printStackTrace();
|
||||
}
|
||||
catch( IllegalAccessException e )
|
||||
{
|
||||
e.printStackTrace();
|
||||
}
|
||||
catch( InvocationTargetException e )
|
||||
{
|
||||
e.printStackTrace();
|
||||
}
|
||||
catch( NoSuchMethodException e )
|
||||
{
|
||||
e.printStackTrace();
|
||||
}
|
||||
|
||||
throw new IllegalStateException( "Tried to construct an ItemBlock from Block " + block.getUnlocalizedName() + " and Class<Item>" + itemClass );
|
||||
}
|
||||
}
|
||||
|
||||
@@ -19,23 +19,26 @@
|
||||
package appeng.core.features;
|
||||
|
||||
|
||||
import net.minecraft.item.Item;
|
||||
import net.minecraft.item.ItemStack;
|
||||
import net.minecraft.world.IBlockAccess;
|
||||
import javax.annotation.Nonnull;
|
||||
|
||||
import com.google.common.base.Optional;
|
||||
import com.google.common.base.Preconditions;
|
||||
|
||||
import net.minecraft.item.Item;
|
||||
import net.minecraft.item.ItemStack;
|
||||
import net.minecraft.world.IBlockAccess;
|
||||
|
||||
import appeng.api.definitions.IItemDefinition;
|
||||
import appeng.util.Platform;
|
||||
|
||||
|
||||
public class ItemDefinition implements IItemDefinition
|
||||
{
|
||||
@Nonnull
|
||||
private final Item item;
|
||||
private final boolean enabled;
|
||||
|
||||
public ItemDefinition( Item item, ActivityState state )
|
||||
public ItemDefinition( @Nonnull Item item, @Nonnull ActivityState state )
|
||||
{
|
||||
Preconditions.checkNotNull( item );
|
||||
Preconditions.checkNotNull( state );
|
||||
|
||||
@@ -85,7 +85,10 @@ public final class WrappedDamageItemDefinition implements ITileDefinition
|
||||
return false;
|
||||
}
|
||||
|
||||
return this.definition.isSameAs( comparableStack ) && comparableStack.getItemDamage() == this.damage;
|
||||
final boolean sameItem = this.definition.isSameAs( new ItemStack( comparableStack.getItem() ) );
|
||||
final boolean sameDamage = comparableStack.getItemDamage() == this.damage;
|
||||
|
||||
return sameItem && sameDamage;
|
||||
}
|
||||
|
||||
@Override
|
||||
|
||||
@@ -1,6 +1,6 @@
|
||||
/*
|
||||
* This file is part of Applied Energistics 2.
|
||||
* Copyright (c) 2013 - 2014, AlgorithmX2, All rights reserved.
|
||||
* Copyright (c) 2013 - 2015, AlgorithmX2, All rights reserved.
|
||||
*
|
||||
* Applied Energistics 2 is free software: you can redistribute it and/or modify
|
||||
* it under the terms of the GNU Lesser General Public License as published by
|
||||
@@ -44,7 +44,7 @@ import codechicken.lib.data.MCDataOutput;
|
||||
import codechicken.lib.raytracer.IndexedCuboid6;
|
||||
import codechicken.lib.vec.Cuboid6;
|
||||
import codechicken.lib.vec.Vector3;
|
||||
import codechicken.multipart.IRedstonePart;
|
||||
import codechicken.multipart.IMaskedRedstonePart;
|
||||
import codechicken.multipart.JCuboidPart;
|
||||
import codechicken.multipart.JNormalOcclusion;
|
||||
import codechicken.multipart.NormalOcclusionTest;
|
||||
@@ -83,24 +83,41 @@ import appeng.util.Platform;
|
||||
*
|
||||
* TSlottedPart,ISidedHollowConnect
|
||||
*/
|
||||
public class CableBusPart extends JCuboidPart implements JNormalOcclusion, IRedstonePart, AEMultiTile
|
||||
public class CableBusPart extends JCuboidPart implements JNormalOcclusion, IMaskedRedstonePart, AEMultiTile
|
||||
{
|
||||
|
||||
public static final ThreadLocal<Boolean> DISABLE_FACADE_OCCLUSION = new ThreadLocal<Boolean>();
|
||||
|
||||
private static final double SHORTER = 6.0 / 16.0;
|
||||
private static final double LONGER = 10.0 / 16.0;
|
||||
private static final double MIN_DIRECTION = 0;
|
||||
private static final double MAX_DIRECTION = 1.0;
|
||||
private static final Cuboid6[] SIDE_TESTS = new Cuboid6[] {
|
||||
|
||||
new Cuboid6( 6.0 / 16.0, 0, 6.0 / 16.0, 10.0 / 16.0, 6.0 / 16.0, 10.0 / 16.0 ), // DOWN(0, -1, 0),
|
||||
// DOWN(0, -1, 0),
|
||||
new Cuboid6( SHORTER, MIN_DIRECTION, SHORTER, LONGER, SHORTER, LONGER ),
|
||||
|
||||
new Cuboid6( 6.0 / 16.0, 10.0 / 16.0, 6.0 / 16.0, 10.0 / 16.0, 1.0, 10.0 / 16.0 ), // UP(0, 1, 0),
|
||||
// UP(0, 1, 0),
|
||||
new Cuboid6( SHORTER, LONGER, SHORTER, LONGER, MAX_DIRECTION, LONGER ),
|
||||
|
||||
new Cuboid6( 6.0 / 16.0, 6.0 / 16.0, 0.0, 10.0 / 16.0, 10.0 / 16.0, 6.0 / 16.0 ),// NORTH(0, 0, -1),
|
||||
// NORTH(0, 0, -1),
|
||||
new Cuboid6( SHORTER, SHORTER, MIN_DIRECTION, LONGER, LONGER, SHORTER ),
|
||||
|
||||
new Cuboid6( 6.0 / 16.0, 6.0 / 16.0, 10.0 / 16.0, 10.0 / 16.0, 10.0 / 16.0, 1.0 ),// SOUTH(0, 0, 1),
|
||||
// SOUTH(0, 0, 1),
|
||||
new Cuboid6( SHORTER, SHORTER, LONGER, LONGER, LONGER, MAX_DIRECTION ),
|
||||
|
||||
new Cuboid6( 0.0, 6.0 / 16.0, 6.0 / 16.0, 6.0 / 16.0, 10.0 / 16.0, 10.0 / 16.0 ),// WEST(-1, 0, 0),
|
||||
// WEST(-1, 0, 0),
|
||||
new Cuboid6( MIN_DIRECTION, SHORTER, SHORTER, SHORTER, LONGER, LONGER ),
|
||||
|
||||
new Cuboid6( 10.0 / 16.0, 6.0 / 16.0, 6.0 / 16.0, 1.0, 10.0 / 16.0, 10.0 / 16.0 ),// EAST(1, 0, 0),
|
||||
// EAST(1, 0, 0),
|
||||
new Cuboid6( LONGER, SHORTER, SHORTER, MAX_DIRECTION, LONGER, LONGER ),
|
||||
};
|
||||
|
||||
/**
|
||||
* Mask for {@link IMaskedRedstonePart#getConnectionMask(int)}
|
||||
*
|
||||
* the bits are derived from the rotation, where 4 is the center
|
||||
*/
|
||||
private static final int CONNECTION_MASK = 0x000010;
|
||||
public CableBusContainer cb = new CableBusContainer( this );
|
||||
boolean canUpdate = false;
|
||||
|
||||
@@ -559,15 +576,6 @@ public class CableBusPart extends JCuboidPart implements JNormalOcclusion, IReds
|
||||
public void clearContainer()
|
||||
{
|
||||
this.cb = new CableBusContainer( this );
|
||||
} @Override
|
||||
public Iterable<Cuboid6> getCollisionBoxes()
|
||||
{
|
||||
LinkedList<Cuboid6> l = new LinkedList<Cuboid6>();
|
||||
for( AxisAlignedBB b : this.cb.getSelectedBoundingBoxesFromPool( false, true, null, true ) )
|
||||
{
|
||||
l.add( new Cuboid6( b.minX, b.minY, b.minZ, b.maxX, b.maxY, b.maxZ ) );
|
||||
}
|
||||
return l;
|
||||
}
|
||||
|
||||
@Override
|
||||
@@ -579,7 +587,11 @@ public class CableBusPart extends JCuboidPart implements JNormalOcclusion, IReds
|
||||
}
|
||||
|
||||
DISABLE_FACADE_OCCLUSION.set( true );
|
||||
boolean blocked = !this.tile().canAddPart( new NormallyOccludedPart( SIDE_TESTS[side.ordinal()] ) );
|
||||
|
||||
final int ordinal = side.ordinal();
|
||||
final Cuboid6 sideTest = SIDE_TESTS[ordinal];
|
||||
final NormallyOccludedPart occludedPart = new NormallyOccludedPart( sideTest );
|
||||
boolean blocked = !this.tile().canAddPart( occludedPart );
|
||||
DISABLE_FACADE_OCCLUSION.remove();
|
||||
|
||||
return blocked;
|
||||
@@ -627,15 +639,6 @@ public class CableBusPart extends JCuboidPart implements JNormalOcclusion, IReds
|
||||
public Set<LayerFlags> getLayerFlags()
|
||||
{
|
||||
return this.cb.getLayerFlags();
|
||||
} @Override
|
||||
public Iterable<IndexedCuboid6> getSubParts()
|
||||
{
|
||||
LinkedList<IndexedCuboid6> l = new LinkedList<IndexedCuboid6>();
|
||||
for( Cuboid6 c : this.getCollisionBoxes() )
|
||||
{
|
||||
l.add( new IndexedCuboid6( 0, c ) );
|
||||
}
|
||||
return l;
|
||||
}
|
||||
|
||||
@Override
|
||||
@@ -664,7 +667,31 @@ public class CableBusPart extends JCuboidPart implements JNormalOcclusion, IReds
|
||||
return this.cb.isInWorld();
|
||||
}
|
||||
|
||||
@Override
|
||||
public Iterable<Cuboid6> getCollisionBoxes()
|
||||
{
|
||||
LinkedList<Cuboid6> l = new LinkedList<Cuboid6>();
|
||||
for( AxisAlignedBB b : this.cb.getSelectedBoundingBoxesFromPool( false, true, null, true ) )
|
||||
{
|
||||
l.add( new Cuboid6( b.minX, b.minY, b.minZ, b.maxX, b.maxY, b.maxZ ) );
|
||||
}
|
||||
return l;
|
||||
}
|
||||
|
||||
@Override
|
||||
public Iterable<IndexedCuboid6> getSubParts()
|
||||
{
|
||||
LinkedList<IndexedCuboid6> l = new LinkedList<IndexedCuboid6>();
|
||||
for( Cuboid6 c : this.getCollisionBoxes() )
|
||||
{
|
||||
l.add( new IndexedCuboid6( 0, c ) );
|
||||
}
|
||||
return l;
|
||||
}
|
||||
|
||||
|
||||
@Override
|
||||
public int getConnectionMask( int side )
|
||||
{
|
||||
return CONNECTION_MASK;
|
||||
}
|
||||
}
|
||||
|
||||
@@ -11,7 +11,7 @@ import java.lang.annotation.Target;
|
||||
* Marker interface to help identify invocation of reflection
|
||||
*/
|
||||
@Retention( RetentionPolicy.SOURCE )
|
||||
@Target( { ElementType.CONSTRUCTOR, ElementType.FIELD, ElementType.TYPE } )
|
||||
@Target( { ElementType.CONSTRUCTOR, ElementType.FIELD, ElementType.TYPE, ElementType.METHOD } )
|
||||
public @interface Reflected
|
||||
{
|
||||
|
||||
|
||||
@@ -1,6 +1,6 @@
|
||||
/*
|
||||
* This file is part of Applied Energistics 2.
|
||||
* Copyright (c) 2013 - 2014, AlgorithmX2, All rights reserved.
|
||||
* Copyright (c) 2013 - 2015, AlgorithmX2, All rights reserved.
|
||||
*
|
||||
* Applied Energistics 2 is free software: you can redistribute it and/or modify
|
||||
* it under the terms of the GNU Lesser General Public License as published by
|
||||
@@ -27,7 +27,7 @@ public enum IntegrationType
|
||||
|
||||
RC( IntegrationSide.BOTH, "Railcraft", "Railcraft" ),
|
||||
|
||||
BC( IntegrationSide.BOTH, "BuildCraft", "BuildCraft|Silicon" ),
|
||||
BC( IntegrationSide.BOTH, "BuildCraft", "BuildCraft|Core" ),
|
||||
|
||||
RF( IntegrationSide.BOTH, "RedstoneFlux Power - Tiles", "CoFHAPI" ),
|
||||
|
||||
|
||||
@@ -1,6 +1,6 @@
|
||||
/*
|
||||
* This file is part of Applied Energistics 2.
|
||||
* Copyright (c) 2013 - 2014, AlgorithmX2, All rights reserved.
|
||||
* Copyright (c) 2013 - 2015, AlgorithmX2, All rights reserved.
|
||||
*
|
||||
* Applied Energistics 2 is free software: you can redistribute it and/or modify
|
||||
* it under the terms of the GNU Lesser General Public License as published by
|
||||
@@ -31,10 +31,14 @@ import net.minecraftforge.common.util.ForgeDirection;
|
||||
|
||||
import cpw.mods.fml.common.event.FMLInterModComms;
|
||||
|
||||
import buildcraft.BuildCraftCore;
|
||||
import buildcraft.BuildCraftEnergy;
|
||||
import buildcraft.BuildCraftTransport;
|
||||
import buildcraft.api.blueprints.BuilderAPI;
|
||||
import buildcraft.api.blueprints.IBuilderContext;
|
||||
import buildcraft.api.blueprints.ISchematicRegistry;
|
||||
import buildcraft.api.blueprints.SchematicBlock;
|
||||
import buildcraft.api.blueprints.SchematicTile;
|
||||
import buildcraft.api.facades.IFacadeItem;
|
||||
import buildcraft.api.tools.IToolWrench;
|
||||
import buildcraft.api.transport.IInjectable;
|
||||
@@ -68,9 +72,21 @@ public final class BC extends BaseModule implements IBC
|
||||
|
||||
public BC()
|
||||
{
|
||||
this.testClassExistence( IPipeConnection.class );
|
||||
this.testClassExistence( ItemFacade.class );
|
||||
this.testClassExistence( BuildCraftEnergy.class );
|
||||
this.testClassExistence( BuildCraftTransport.class );
|
||||
this.testClassExistence( BuilderAPI.class );
|
||||
this.testClassExistence( IBuilderContext.class );
|
||||
this.testClassExistence( ISchematicRegistry.class );
|
||||
this.testClassExistence( IFacadeItem.class );
|
||||
this.testClassExistence( IToolWrench.class );
|
||||
this.testClassExistence( IInjectable.class );
|
||||
this.testClassExistence( IPipeConnection.class );
|
||||
this.testClassExistence( IPipeTile.class );
|
||||
this.testClassExistence( ItemFacade.class );
|
||||
this.testClassExistence( PipeIconProvider.class );
|
||||
this.testClassExistence( SchematicTile.class );
|
||||
this.testClassExistence( SchematicBlock.class );
|
||||
this.testClassExistence( IPipeTile.PipeType.class );
|
||||
}
|
||||
|
||||
@Override
|
||||
@@ -166,9 +182,9 @@ public final class BC extends BaseModule implements IBC
|
||||
public void registerPowerP2P()
|
||||
{
|
||||
IP2PTunnelRegistry reg = AEApi.instance().registries().p2pTunnel();
|
||||
reg.addNewAttunement( new ItemStack( BuildCraftEnergy.engineBlock, 1, 0 ), TunnelType.RF_POWER );
|
||||
reg.addNewAttunement( new ItemStack( BuildCraftEnergy.engineBlock, 1, 1 ), TunnelType.RF_POWER );
|
||||
reg.addNewAttunement( new ItemStack( BuildCraftEnergy.engineBlock, 1, 2 ), TunnelType.RF_POWER );
|
||||
reg.addNewAttunement( new ItemStack( BuildCraftCore.engineBlock, 1, 0 ), TunnelType.RF_POWER );
|
||||
reg.addNewAttunement( new ItemStack( BuildCraftCore.engineBlock, 1, 1 ), TunnelType.RF_POWER );
|
||||
reg.addNewAttunement( new ItemStack( BuildCraftCore.engineBlock, 1, 2 ), TunnelType.RF_POWER );
|
||||
reg.addNewAttunement( new ItemStack( BuildCraftTransport.pipePowerCobblestone ), TunnelType.RF_POWER );
|
||||
reg.addNewAttunement( new ItemStack( BuildCraftTransport.pipePowerDiamond ), TunnelType.RF_POWER );
|
||||
reg.addNewAttunement( new ItemStack( BuildCraftTransport.pipePowerGold ), TunnelType.RF_POWER );
|
||||
|
||||
@@ -1,6 +1,6 @@
|
||||
/*
|
||||
* This file is part of Applied Energistics 2.
|
||||
* Copyright (c) 2013 - 2014, AlgorithmX2, All rights reserved.
|
||||
* Copyright (c) 2013 - 2015, AlgorithmX2, All rights reserved.
|
||||
*
|
||||
* Applied Energistics 2 is free software: you can redistribute it and/or modify
|
||||
* it under the terms of the GNU Lesser General Public License as published by
|
||||
@@ -21,8 +21,10 @@ package appeng.integration.modules;
|
||||
|
||||
import java.util.Arrays;
|
||||
import java.util.List;
|
||||
import javax.annotation.Nullable;
|
||||
|
||||
import com.google.common.base.Optional;
|
||||
|
||||
import net.minecraft.init.Blocks;
|
||||
import net.minecraft.item.ItemStack;
|
||||
import net.minecraft.item.crafting.CraftingManager;
|
||||
import net.minecraft.item.crafting.IRecipe;
|
||||
@@ -32,95 +34,173 @@ import cpw.mods.fml.relauncher.ReflectionHelper;
|
||||
import uristqwerty.CraftGuide.CraftGuideLog;
|
||||
import uristqwerty.CraftGuide.DefaultRecipeTemplate;
|
||||
import uristqwerty.CraftGuide.RecipeGeneratorImplementation;
|
||||
import uristqwerty.CraftGuide.api.ChanceSlot;
|
||||
import uristqwerty.CraftGuide.api.CraftGuideAPIObject;
|
||||
import uristqwerty.CraftGuide.api.CraftGuideRecipe;
|
||||
import uristqwerty.CraftGuide.api.ItemSlot;
|
||||
import uristqwerty.CraftGuide.api.RecipeGenerator;
|
||||
import uristqwerty.CraftGuide.api.RecipeProvider;
|
||||
import uristqwerty.CraftGuide.api.RecipeTemplate;
|
||||
import uristqwerty.CraftGuide.api.Slot;
|
||||
import uristqwerty.CraftGuide.api.SlotType;
|
||||
import uristqwerty.CraftGuide.api.StackInfo;
|
||||
import uristqwerty.CraftGuide.api.StackInfoSource;
|
||||
import uristqwerty.gui_craftguide.texture.DynamicTexture;
|
||||
import uristqwerty.gui_craftguide.texture.TextureClip;
|
||||
|
||||
import appeng.api.AEApi;
|
||||
import appeng.api.IAppEngApi;
|
||||
import appeng.api.definitions.IBlocks;
|
||||
import appeng.api.exceptions.MissingIngredientError;
|
||||
import appeng.api.exceptions.RegistrationError;
|
||||
import appeng.api.features.IGrinderEntry;
|
||||
import appeng.api.features.IInscriberRecipe;
|
||||
import appeng.api.recipes.IIngredient;
|
||||
import appeng.helpers.Reflected;
|
||||
import appeng.integration.IIntegrationModule;
|
||||
import appeng.recipes.game.ShapedRecipe;
|
||||
import appeng.recipes.game.ShapelessRecipe;
|
||||
|
||||
|
||||
public class CraftGuide extends CraftGuideAPIObject implements IIntegrationModule, RecipeProvider, StackInfoSource, RecipeGenerator
|
||||
public final class CraftGuide extends CraftGuideAPIObject implements IIntegrationModule, RecipeProvider
|
||||
{
|
||||
private static final int SLOT_SIZE = 16;
|
||||
private static final int TEXTURE_WIDTH = 79;
|
||||
private static final int TEXTURE_HEIGHT = 58;
|
||||
private static final int GRINDER_RATIO = 10000;
|
||||
|
||||
private static final Slot[] GRINDER_SLOTS = new ItemSlot[] {
|
||||
new ItemSlot( 3, 21, SLOT_SIZE, SLOT_SIZE ).drawOwnBackground(),
|
||||
new ItemSlot( 41, 21, SLOT_SIZE, SLOT_SIZE, true ).drawOwnBackground().setSlotType( SlotType.OUTPUT_SLOT ),
|
||||
new ChanceSlot( 59, 12, SLOT_SIZE, SLOT_SIZE, true ).setRatio( GRINDER_RATIO ).setFormatString( " (%1$.2f%% chance)" ).drawOwnBackground().setSlotType( SlotType.OUTPUT_SLOT ),
|
||||
new ChanceSlot( 59, 30, SLOT_SIZE, SLOT_SIZE, true ).setRatio( GRINDER_RATIO ).setFormatString( " (%1$.2f%% chance)" ).drawOwnBackground().setSlotType( SlotType.OUTPUT_SLOT ),
|
||||
new ItemSlot( 22, 12, SLOT_SIZE, SLOT_SIZE ).setSlotType( SlotType.MACHINE_SLOT ),
|
||||
new ItemSlot( 22, 30, SLOT_SIZE, SLOT_SIZE ).setSlotType( SlotType.MACHINE_SLOT )
|
||||
};
|
||||
private static final Slot[] INSCRIBER_SLOTS = new ItemSlot[] {
|
||||
new ItemSlot( 12, 21, SLOT_SIZE, SLOT_SIZE ).drawOwnBackground(),
|
||||
new ItemSlot( 21, 3, SLOT_SIZE, SLOT_SIZE ).drawOwnBackground(),
|
||||
new ItemSlot( 21, 39, SLOT_SIZE, SLOT_SIZE ).drawOwnBackground(),
|
||||
new ItemSlot( 50, 21, SLOT_SIZE, SLOT_SIZE, true ).drawOwnBackground().setSlotType( SlotType.OUTPUT_SLOT ),
|
||||
new ItemSlot( 31, 21, SLOT_SIZE, SLOT_SIZE ).setSlotType( SlotType.MACHINE_SLOT )
|
||||
};
|
||||
private static final Slot[] SHAPELESS_CRAFTING_SLOTS = new ItemSlot[] {
|
||||
new ItemSlot( 3, 3, SLOT_SIZE, SLOT_SIZE ),
|
||||
new ItemSlot( 21, 3, SLOT_SIZE, SLOT_SIZE ),
|
||||
new ItemSlot( 39, 3, SLOT_SIZE, SLOT_SIZE ),
|
||||
new ItemSlot( 3, 21, SLOT_SIZE, SLOT_SIZE ),
|
||||
new ItemSlot( 21, 21, SLOT_SIZE, SLOT_SIZE ),
|
||||
new ItemSlot( 39, 21, SLOT_SIZE, SLOT_SIZE ),
|
||||
new ItemSlot( 3, 39, SLOT_SIZE, SLOT_SIZE ),
|
||||
new ItemSlot( 21, 39, SLOT_SIZE, SLOT_SIZE ),
|
||||
new ItemSlot( 39, 39, SLOT_SIZE, SLOT_SIZE ),
|
||||
new ItemSlot( 59, 21, SLOT_SIZE, SLOT_SIZE, true ).setSlotType( SlotType.OUTPUT_SLOT ),
|
||||
};
|
||||
private static final Slot[] CRAFTING_SLOTS_OWN_BG = new ItemSlot[] {
|
||||
new ItemSlot( 3, 3, SLOT_SIZE, SLOT_SIZE ).drawOwnBackground(),
|
||||
new ItemSlot( 21, 3, SLOT_SIZE, SLOT_SIZE ).drawOwnBackground(),
|
||||
new ItemSlot( 39, 3, SLOT_SIZE, SLOT_SIZE ).drawOwnBackground(),
|
||||
new ItemSlot( 3, 21, SLOT_SIZE, SLOT_SIZE ).drawOwnBackground(),
|
||||
new ItemSlot( 21, 21, SLOT_SIZE, SLOT_SIZE ).drawOwnBackground(),
|
||||
new ItemSlot( 39, 21, SLOT_SIZE, SLOT_SIZE ).drawOwnBackground(),
|
||||
new ItemSlot( 3, 39, SLOT_SIZE, SLOT_SIZE ).drawOwnBackground(),
|
||||
new ItemSlot( 21, 39, SLOT_SIZE, SLOT_SIZE ).drawOwnBackground(),
|
||||
new ItemSlot( 39, 39, SLOT_SIZE, SLOT_SIZE ).drawOwnBackground(),
|
||||
new ItemSlot( 59, 21, SLOT_SIZE, SLOT_SIZE, true ).setSlotType( SlotType.OUTPUT_SLOT ).drawOwnBackground(),
|
||||
};
|
||||
private static final Slot[] SMALL_CRAFTING_SLOTS_OWN_BG = new ItemSlot[] {
|
||||
new ItemSlot( 12, 12, SLOT_SIZE, SLOT_SIZE ).drawOwnBackground(),
|
||||
new ItemSlot( 30, 12, SLOT_SIZE, SLOT_SIZE ).drawOwnBackground(),
|
||||
new ItemSlot( 12, 30, SLOT_SIZE, SLOT_SIZE ).drawOwnBackground(),
|
||||
new ItemSlot( 30, 30, SLOT_SIZE, SLOT_SIZE ).drawOwnBackground(),
|
||||
new ItemSlot( 59, 21, SLOT_SIZE, SLOT_SIZE, true ).setSlotType( SlotType.OUTPUT_SLOT ).drawOwnBackground(),
|
||||
};
|
||||
private static final Slot[] CRTAFTING_SLOTS = new ItemSlot[] {
|
||||
new ItemSlot( 3, 3, SLOT_SIZE, SLOT_SIZE ),
|
||||
new ItemSlot( 21, 3, SLOT_SIZE, SLOT_SIZE ),
|
||||
new ItemSlot( 39, 3, SLOT_SIZE, SLOT_SIZE ),
|
||||
new ItemSlot( 3, 21, SLOT_SIZE, SLOT_SIZE ),
|
||||
new ItemSlot( 21, 21, SLOT_SIZE, SLOT_SIZE ),
|
||||
new ItemSlot( 39, 21, SLOT_SIZE, SLOT_SIZE ),
|
||||
new ItemSlot( 3, 39, SLOT_SIZE, SLOT_SIZE ),
|
||||
new ItemSlot( 21, 39, SLOT_SIZE, SLOT_SIZE ),
|
||||
new ItemSlot( 39, 39, SLOT_SIZE, SLOT_SIZE ),
|
||||
new ItemSlot( 59, 21, SLOT_SIZE, SLOT_SIZE, true ).setSlotType( SlotType.OUTPUT_SLOT ),
|
||||
};
|
||||
private static final Slot[] SMALL_CRAFTING_SLOTS = new ItemSlot[] {
|
||||
new ItemSlot( 12, 12, SLOT_SIZE, SLOT_SIZE ),
|
||||
new ItemSlot( 30, 12, SLOT_SIZE, SLOT_SIZE ),
|
||||
new ItemSlot( 12, 30, SLOT_SIZE, SLOT_SIZE ),
|
||||
new ItemSlot( 30, 30, SLOT_SIZE, SLOT_SIZE ),
|
||||
new ItemSlot( 59, 21, SLOT_SIZE, SLOT_SIZE, true ).setSlotType( SlotType.OUTPUT_SLOT ),
|
||||
};
|
||||
|
||||
@Reflected
|
||||
public static CraftGuide instance;
|
||||
|
||||
private final Slot[] shapelessCraftingSlots = new ItemSlot[] { new ItemSlot( 3, 3, 16, 16 ), new ItemSlot( 21, 3, 16, 16 ), new ItemSlot( 39, 3, 16, 16 ), new ItemSlot( 3, 21, 16, 16 ), new ItemSlot( 21, 21, 16, 16 ), new ItemSlot( 39, 21, 16, 16 ), new ItemSlot( 3, 39, 16, 16 ), new ItemSlot( 21, 39, 16, 16 ), new ItemSlot( 39, 39, 16, 16 ), new ItemSlot( 59, 21, 16, 16, true ).setSlotType( SlotType.OUTPUT_SLOT ), };
|
||||
|
||||
private final Slot[] craftingSlotsOwnBackground = new ItemSlot[] { new ItemSlot( 3, 3, 16, 16 ).drawOwnBackground(), new ItemSlot( 21, 3, 16, 16 ).drawOwnBackground(), new ItemSlot( 39, 3, 16, 16 ).drawOwnBackground(), new ItemSlot( 3, 21, 16, 16 ).drawOwnBackground(), new ItemSlot( 21, 21, 16, 16 ).drawOwnBackground(), new ItemSlot( 39, 21, 16, 16 ).drawOwnBackground(), new ItemSlot( 3, 39, 16, 16 ).drawOwnBackground(), new ItemSlot( 21, 39, 16, 16 ).drawOwnBackground(), new ItemSlot( 39, 39, 16, 16 ).drawOwnBackground(), new ItemSlot( 59, 21, 16, 16, true ).setSlotType( SlotType.OUTPUT_SLOT ).drawOwnBackground(), };
|
||||
|
||||
private final Slot[] smallCraftingSlotsOwnBackground = new ItemSlot[] { new ItemSlot( 12, 12, 16, 16 ).drawOwnBackground(), new ItemSlot( 30, 12, 16, 16 ).drawOwnBackground(), new ItemSlot( 12, 30, 16, 16 ).drawOwnBackground(), new ItemSlot( 30, 30, 16, 16 ).drawOwnBackground(), new ItemSlot( 59, 21, 16, 16, true ).setSlotType( SlotType.OUTPUT_SLOT ).drawOwnBackground(), };
|
||||
|
||||
private final Slot[] craftingSlots = new ItemSlot[] { new ItemSlot( 3, 3, 16, 16 ), new ItemSlot( 21, 3, 16, 16 ), new ItemSlot( 39, 3, 16, 16 ), new ItemSlot( 3, 21, 16, 16 ), new ItemSlot( 21, 21, 16, 16 ), new ItemSlot( 39, 21, 16, 16 ), new ItemSlot( 3, 39, 16, 16 ), new ItemSlot( 21, 39, 16, 16 ), new ItemSlot( 39, 39, 16, 16 ), new ItemSlot( 59, 21, 16, 16, true ).setSlotType( SlotType.OUTPUT_SLOT ), };
|
||||
|
||||
private final Slot[] smallCraftingSlots = new ItemSlot[] { new ItemSlot( 12, 12, 16, 16 ), new ItemSlot( 30, 12, 16, 16 ), new ItemSlot( 12, 30, 16, 16 ), new ItemSlot( 30, 30, 16, 16 ), new ItemSlot( 59, 21, 16, 16, true ).setSlotType( SlotType.OUTPUT_SLOT ), };
|
||||
|
||||
private final Slot[] furnaceSlots = new ItemSlot[] { new ItemSlot( 13, 21, 16, 16 ), new ItemSlot( 50, 21, 16, 16, true ).setSlotType( SlotType.OUTPUT_SLOT ), };
|
||||
RecipeGenerator parent;
|
||||
|
||||
@Override
|
||||
public String getInfo( ItemStack itemStack )
|
||||
{
|
||||
// :P
|
||||
return null;
|
||||
}
|
||||
|
||||
@Override
|
||||
public void generateRecipes( RecipeGenerator generator )
|
||||
{
|
||||
this.parent = generator;
|
||||
|
||||
RecipeTemplate craftingTemplate;
|
||||
RecipeTemplate smallCraftingTemplate;
|
||||
final RecipeTemplate craftingTemplate;
|
||||
final RecipeTemplate smallTemplate;
|
||||
|
||||
if( uristqwerty.CraftGuide.CraftGuide.newerBackgroundStyle )
|
||||
{
|
||||
craftingTemplate = generator.createRecipeTemplate( this.craftingSlotsOwnBackground, null );
|
||||
smallCraftingTemplate = generator.createRecipeTemplate( this.smallCraftingSlotsOwnBackground, null );
|
||||
craftingTemplate = generator.createRecipeTemplate( CRAFTING_SLOTS_OWN_BG, null );
|
||||
smallTemplate = generator.createRecipeTemplate( SMALL_CRAFTING_SLOTS_OWN_BG, null );
|
||||
}
|
||||
else
|
||||
{
|
||||
craftingTemplate = new DefaultRecipeTemplate( this.craftingSlots, RecipeGeneratorImplementation.workbench, new TextureClip( DynamicTexture.instance( "recipe_backgrounds" ), 1, 1, 79, 58 ), new TextureClip( DynamicTexture.instance( "recipe_backgrounds" ), 82, 1, 79, 58 ) );
|
||||
final TextureClip craftingBG = new TextureClip( DynamicTexture.instance( "recipe_backgrounds" ), 1, 1, TEXTURE_WIDTH, TEXTURE_HEIGHT );
|
||||
final TextureClip craftingSelected = new TextureClip( DynamicTexture.instance( "recipe_backgrounds" ), 82, 1, TEXTURE_WIDTH, TEXTURE_HEIGHT );
|
||||
craftingTemplate = new DefaultRecipeTemplate( CRTAFTING_SLOTS, RecipeGeneratorImplementation.workbench, craftingBG, craftingSelected );
|
||||
|
||||
smallCraftingTemplate = new DefaultRecipeTemplate( this.smallCraftingSlots, RecipeGeneratorImplementation.workbench, new TextureClip( DynamicTexture.instance( "recipe_backgrounds" ), 1, 61, 79, 58 ), new TextureClip( DynamicTexture.instance( "recipe_backgrounds" ), 82, 61, 79, 58 ) );
|
||||
final TextureClip smallBG = new TextureClip( DynamicTexture.instance( "recipe_backgrounds" ), 1, 61, TEXTURE_WIDTH, TEXTURE_HEIGHT );
|
||||
final TextureClip smallSelected = new TextureClip( DynamicTexture.instance( "recipe_backgrounds" ), 82, 61, TEXTURE_WIDTH, TEXTURE_HEIGHT );
|
||||
smallTemplate = new DefaultRecipeTemplate( SMALL_CRAFTING_SLOTS, RecipeGeneratorImplementation.workbench, smallBG, smallSelected );
|
||||
}
|
||||
|
||||
RecipeTemplate shapelessTemplate = new DefaultRecipeTemplate( this.shapelessCraftingSlots, RecipeGeneratorImplementation.workbench, new TextureClip( DynamicTexture.instance( "recipe_backgrounds" ), 1, 121, 79, 58 ), new TextureClip( DynamicTexture.instance( "recipe_backgrounds" ), 82, 121, 79, 58 ) );
|
||||
final TextureClip shapelessBG = new TextureClip( DynamicTexture.instance( "recipe_backgrounds" ), 1, 121, TEXTURE_WIDTH, TEXTURE_HEIGHT );
|
||||
final TextureClip shapelessSelected = new TextureClip( DynamicTexture.instance( "recipe_backgrounds" ), 82, 121, TEXTURE_WIDTH, TEXTURE_HEIGHT );
|
||||
final RecipeTemplate shapelessTemplate = new DefaultRecipeTemplate( SHAPELESS_CRAFTING_SLOTS, RecipeGeneratorImplementation.workbench, shapelessBG, shapelessSelected );
|
||||
|
||||
RecipeTemplate furnaceTemplate = new DefaultRecipeTemplate( this.furnaceSlots, new ItemStack( Blocks.furnace ), new TextureClip( DynamicTexture.instance( "recipe_backgrounds" ), 1, 181, 79, 58 ), new TextureClip( DynamicTexture.instance( "recipe_backgrounds" ), 82, 181, 79, 58 ) );
|
||||
this.addCraftingRecipes( craftingTemplate, smallTemplate, shapelessTemplate, generator );
|
||||
|
||||
this.addCraftingRecipes( craftingTemplate, smallCraftingTemplate, shapelessTemplate, this );
|
||||
this.addGrinderRecipes( furnaceTemplate, this );
|
||||
this.addInscriberRecipes( furnaceTemplate, this );
|
||||
final IAppEngApi api = AEApi.instance();
|
||||
final IBlocks aeBlocks = api.definitions().blocks();
|
||||
final Optional<ItemStack> grindstone = aeBlocks.grindStone().maybeStack( 1 );
|
||||
final Optional<ItemStack> inscriber = aeBlocks.inscriber().maybeStack( 1 );
|
||||
|
||||
if( grindstone.isPresent() )
|
||||
{
|
||||
this.addGrinderRecipes( api, grindstone.get(), generator );
|
||||
}
|
||||
|
||||
if( inscriber.isPresent() )
|
||||
{
|
||||
this.addInscriberRecipes( api, inscriber.get(), generator );
|
||||
}
|
||||
}
|
||||
|
||||
@SuppressWarnings( "unchecked" )
|
||||
private List<IRecipe> getUncheckedRecipes()
|
||||
{
|
||||
return (List<IRecipe>) CraftingManager.getInstance().getRecipeList();
|
||||
}
|
||||
|
||||
private void addCraftingRecipes( RecipeTemplate template, RecipeTemplate templateSmall, RecipeTemplate templateShapeless, RecipeGenerator generator )
|
||||
{
|
||||
List recipes = CraftingManager.getInstance().getRecipeList();
|
||||
final List<IRecipe> recipes = this.getUncheckedRecipes();
|
||||
|
||||
int errCount = 0;
|
||||
|
||||
for( Object o : recipes )
|
||||
for( IRecipe recipe : recipes )
|
||||
{
|
||||
try
|
||||
{
|
||||
IRecipe recipe = (IRecipe) o;
|
||||
|
||||
Object[] items = generator.getCraftingRecipe( recipe, true );
|
||||
final Object[] items = this.getCraftingRecipe( recipe, true );
|
||||
|
||||
if( items == null )
|
||||
{
|
||||
continue;
|
||||
}
|
||||
if( items.length == 5 )
|
||||
{
|
||||
generator.addRecipe( templateSmall, items );
|
||||
@@ -138,8 +218,7 @@ public class CraftGuide extends CraftGuideAPIObject implements IIntegrationModul
|
||||
{
|
||||
if( errCount >= 5 )
|
||||
{
|
||||
CraftGuideLog.log( "CraftGuide DefaultRecipeProvider: Stack trace limit reached, further stack traces from this invocation will not be logged to the console. They will still be logged to (.minecraft)/config/CraftGuide/CraftGuide.log", true );
|
||||
errCount = -1;
|
||||
CraftGuideLog.log( "AppEng CraftGuide integration: Stack trace limit reached, further stack traces from this invocation will not be logged to the console. They will still be logged to (.minecraft)/config/CraftGuide/CraftGuide.log", true );
|
||||
}
|
||||
else
|
||||
{
|
||||
@@ -152,61 +231,49 @@ public class CraftGuide extends CraftGuideAPIObject implements IIntegrationModul
|
||||
}
|
||||
}
|
||||
|
||||
private void addGrinderRecipes( RecipeTemplate template, RecipeGenerator generator )
|
||||
private void addGrinderRecipes( IAppEngApi api, ItemStack grindstone, RecipeGenerator generator )
|
||||
{
|
||||
final ItemStack handle = api.definitions().blocks().crankHandle().maybeStack( 1 ).orNull();
|
||||
final RecipeTemplate grinderTemplate = generator.createRecipeTemplate( GRINDER_SLOTS, grindstone );
|
||||
|
||||
for( IGrinderEntry recipe : api.registries().grinder().getRecipes() )
|
||||
{
|
||||
generator.addRecipe( grinderTemplate, new Object[] {
|
||||
recipe.getInput(),
|
||||
recipe.getOutput(),
|
||||
new Object[] {
|
||||
recipe.getOptionalOutput(),
|
||||
(int) ( recipe.getOptionalChance() * GRINDER_RATIO )
|
||||
},
|
||||
new Object[] {
|
||||
recipe.getSecondOptionalOutput(),
|
||||
(int) ( recipe.getOptionalChance() * GRINDER_RATIO )
|
||||
},
|
||||
handle,
|
||||
grindstone
|
||||
} );
|
||||
}
|
||||
}
|
||||
|
||||
private void addInscriberRecipes( RecipeTemplate template, RecipeGenerator generator )
|
||||
private void addInscriberRecipes( IAppEngApi api, ItemStack inscriber, RecipeGenerator generator )
|
||||
{
|
||||
final RecipeTemplate inscriberTemplate = generator.createRecipeTemplate( INSCRIBER_SLOTS, inscriber );
|
||||
|
||||
for( IInscriberRecipe recipe : api.registries().inscriber().getRecipes() )
|
||||
{
|
||||
generator.addRecipe( inscriberTemplate, new Object[] {
|
||||
recipe.getInputs(),
|
||||
recipe.getTopOptional().orNull(),
|
||||
recipe.getBottomOptional().orNull(),
|
||||
recipe.getOutput(),
|
||||
inscriber
|
||||
} );
|
||||
}
|
||||
}
|
||||
|
||||
@Override
|
||||
public RecipeTemplate createRecipeTemplate( Slot[] slots, ItemStack craftingType )
|
||||
private Object[] getCraftingShapelessRecipe( List<?> items, ItemStack recipeOutput )
|
||||
{
|
||||
return this.parent.createRecipeTemplate( slots, craftingType );
|
||||
}
|
||||
|
||||
@Override
|
||||
public RecipeTemplate createRecipeTemplate( Slot[] slots, ItemStack craftingType, String backgroundTexture, int backgroundX, int backgroundY, int backgroundSelectedX, int backgroundSelectedY )
|
||||
{
|
||||
return this.parent.createRecipeTemplate( slots, craftingType, backgroundTexture, backgroundX, backgroundY, backgroundSelectedX, backgroundSelectedY );
|
||||
}
|
||||
|
||||
@Override
|
||||
public RecipeTemplate createRecipeTemplate( Slot[] slots, ItemStack craftingType, String backgroundTexture, int backgroundX, int backgroundY, String backgroundSelectedTexture, int backgroundSelectedX, int backgroundSelectedY )
|
||||
{
|
||||
return this.parent.createRecipeTemplate( slots, craftingType, backgroundTexture, backgroundX, backgroundY, backgroundSelectedTexture, backgroundSelectedX, backgroundSelectedY );
|
||||
}
|
||||
|
||||
@Override
|
||||
public void addRecipe( RecipeTemplate template, Object[] crafting )
|
||||
{
|
||||
this.parent.addRecipe( template, crafting );
|
||||
}
|
||||
|
||||
@Override
|
||||
public void addRecipe( CraftGuideRecipe recipe, ItemStack craftingType )
|
||||
{
|
||||
this.parent.addRecipe( recipe, craftingType );
|
||||
}
|
||||
|
||||
@Override
|
||||
public void setDefaultTypeVisibility( ItemStack type, boolean visible )
|
||||
{
|
||||
this.parent.setDefaultTypeVisibility( type, visible );
|
||||
}
|
||||
|
||||
@Override
|
||||
public Object[] getCraftingRecipe( IRecipe recipe )
|
||||
{
|
||||
return this.getCraftingRecipe( recipe, true );
|
||||
}
|
||||
|
||||
Object[] getCraftingShapelessRecipe( List items, ItemStack recipeOutput )
|
||||
{
|
||||
Object[] output = new Object[10];
|
||||
final Object[] output = new Object[10];
|
||||
|
||||
for( int i = 0; i < items.size(); i++ )
|
||||
{
|
||||
@@ -235,18 +302,19 @@ public class CraftGuide extends CraftGuideAPIObject implements IIntegrationModul
|
||||
}
|
||||
|
||||
output[9] = recipeOutput;
|
||||
|
||||
return output;
|
||||
}
|
||||
|
||||
Object[] getSmallShapedRecipe( int width, int height, Object[] items, ItemStack recipeOutput )
|
||||
private Object[] getSmallShapedRecipe( int width, int height, Object[] items, ItemStack recipeOutput )
|
||||
{
|
||||
Object[] output = new Object[5];
|
||||
final Object[] output = new Object[5];
|
||||
|
||||
for( int y = 0; y < height; y++ )
|
||||
{
|
||||
for( int x = 0; x < width; x++ )
|
||||
{
|
||||
int i = y * 2 + x;
|
||||
final int i = y * 2 + x;
|
||||
output[i] = items[y * width + x];
|
||||
|
||||
if( output[i] instanceof ItemStack[] )
|
||||
@@ -273,18 +341,19 @@ public class CraftGuide extends CraftGuideAPIObject implements IIntegrationModul
|
||||
}
|
||||
|
||||
output[4] = recipeOutput;
|
||||
|
||||
return output;
|
||||
}
|
||||
|
||||
Object[] getCraftingShapedRecipe( int width, int height, Object[] items, ItemStack recipeOutput )
|
||||
private Object[] getCraftingShapedRecipe( int width, int height, Object[] items, ItemStack recipeOutput )
|
||||
{
|
||||
Object[] output = new Object[10];
|
||||
final Object[] output = new Object[10];
|
||||
|
||||
for( int y = 0; y < height; y++ )
|
||||
{
|
||||
for( int x = 0; x < width; x++ )
|
||||
{
|
||||
int i = y * 3 + x;
|
||||
final int i = y * 3 + x;
|
||||
output[i] = items[y * width + x];
|
||||
|
||||
if( output[i] instanceof ItemStack[] )
|
||||
@@ -311,12 +380,13 @@ public class CraftGuide extends CraftGuideAPIObject implements IIntegrationModul
|
||||
}
|
||||
|
||||
output[9] = recipeOutput;
|
||||
|
||||
return output;
|
||||
}
|
||||
|
||||
private Object toCG( ItemStack[] itemStackSet )
|
||||
{
|
||||
List<ItemStack> list = Arrays.asList( itemStackSet );
|
||||
final List<ItemStack> list = Arrays.asList( itemStackSet );
|
||||
|
||||
for( int x = 0; x < list.size(); x++ )
|
||||
{
|
||||
@@ -330,19 +400,20 @@ public class CraftGuide extends CraftGuideAPIObject implements IIntegrationModul
|
||||
return list;
|
||||
}
|
||||
|
||||
@Override
|
||||
public Object[] getCraftingRecipe( IRecipe recipe, boolean allowSmallGrid )
|
||||
@Nullable
|
||||
private Object[] getCraftingRecipe( IRecipe recipe, boolean allowSmallGrid )
|
||||
{
|
||||
if( recipe instanceof ShapelessRecipe )
|
||||
{
|
||||
List items = ReflectionHelper.getPrivateValue( ShapelessRecipe.class, (ShapelessRecipe) recipe, "input" );
|
||||
final List<Object> items = ReflectionHelper.getPrivateValue( ShapelessRecipe.class, (ShapelessRecipe) recipe, "input" );
|
||||
|
||||
return this.getCraftingShapelessRecipe( items, recipe.getRecipeOutput() );
|
||||
}
|
||||
else if( recipe instanceof ShapedRecipe )
|
||||
{
|
||||
int width = ReflectionHelper.getPrivateValue( ShapedRecipe.class, (ShapedRecipe) recipe, "width" );
|
||||
int height = ReflectionHelper.getPrivateValue( ShapedRecipe.class, (ShapedRecipe) recipe, "height" );
|
||||
Object[] items = ReflectionHelper.getPrivateValue( ShapedRecipe.class, (ShapedRecipe) recipe, "input" );
|
||||
final int width = ReflectionHelper.getPrivateValue( ShapedRecipe.class, (ShapedRecipe) recipe, "width" );
|
||||
final int height = ReflectionHelper.getPrivateValue( ShapedRecipe.class, (ShapedRecipe) recipe, "height" );
|
||||
final Object[] items = ReflectionHelper.getPrivateValue( ShapedRecipe.class, (ShapedRecipe) recipe, "input" );
|
||||
|
||||
if( allowSmallGrid && width < 3 && height < 3 )
|
||||
{
|
||||
@@ -360,7 +431,6 @@ public class CraftGuide extends CraftGuideAPIObject implements IIntegrationModul
|
||||
@Override
|
||||
public void init() throws Throwable
|
||||
{
|
||||
StackInfo.addSource( this );
|
||||
}
|
||||
|
||||
@Override
|
||||
|
||||
@@ -28,7 +28,8 @@ public class RotaryCraft extends BaseModule
|
||||
|
||||
public RotaryCraft()
|
||||
{
|
||||
this.testClassExistence( Reika.RotaryCraft.API.Power.ShaftPowerReceiver.class );
|
||||
this.testClassExistence( Reika.RotaryCraft.API.Power.AdvancedShaftPowerReceiver.class );
|
||||
this.testClassExistence( Reika.RotaryCraft.API.Interfaces.Transducerable.class );
|
||||
}
|
||||
|
||||
@Override
|
||||
|
||||
@@ -38,6 +38,7 @@ public class Waila extends BaseModule
|
||||
{
|
||||
final IWailaDataProvider partHost = new PartWailaDataProvider();
|
||||
|
||||
registrar.registerStackProvider( partHost, AEBaseTile.class );
|
||||
registrar.registerBodyProvider( partHost, AEBaseTile.class );
|
||||
registrar.registerNBTProvider( partHost, AEBaseTile.class );
|
||||
|
||||
|
||||
@@ -38,6 +38,7 @@ import appeng.api.parts.IPart;
|
||||
import appeng.integration.modules.waila.part.ChannelWailaDataProvider;
|
||||
import appeng.integration.modules.waila.part.IPartWailaDataProvider;
|
||||
import appeng.integration.modules.waila.part.PartAccessor;
|
||||
import appeng.integration.modules.waila.part.PartStackWailaDataProvider;
|
||||
import appeng.integration.modules.waila.part.PowerStateWailaDataProvider;
|
||||
import appeng.integration.modules.waila.part.StorageMonitorWailaDataProvider;
|
||||
import appeng.integration.modules.waila.part.Tracer;
|
||||
@@ -75,13 +76,32 @@ public final class PartWailaDataProvider implements IWailaDataProvider
|
||||
final IPartWailaDataProvider channel = new ChannelWailaDataProvider();
|
||||
final IPartWailaDataProvider storageMonitor = new StorageMonitorWailaDataProvider();
|
||||
final IPartWailaDataProvider powerState = new PowerStateWailaDataProvider();
|
||||
final IPartWailaDataProvider partStack = new PartStackWailaDataProvider();
|
||||
|
||||
this.providers = Lists.newArrayList( channel, storageMonitor, powerState );
|
||||
this.providers = Lists.newArrayList( channel, storageMonitor, powerState, partStack );
|
||||
}
|
||||
|
||||
@Override
|
||||
public ItemStack getWailaStack( IWailaDataAccessor accessor, IWailaConfigHandler config )
|
||||
{
|
||||
final TileEntity te = accessor.getTileEntity();
|
||||
final MovingObjectPosition mop = accessor.getPosition();
|
||||
|
||||
final Optional<IPart> maybePart = this.accessor.getMaybePart( te, mop );
|
||||
|
||||
if( maybePart.isPresent() )
|
||||
{
|
||||
final IPart part = maybePart.get();
|
||||
|
||||
ItemStack wailaStack = null;
|
||||
|
||||
for( IPartWailaDataProvider provider : this.providers )
|
||||
{
|
||||
wailaStack = provider.getWailaStack( part, config, wailaStack );
|
||||
}
|
||||
return wailaStack;
|
||||
}
|
||||
|
||||
return null;
|
||||
}
|
||||
|
||||
|
||||
@@ -22,6 +22,7 @@ package appeng.integration.modules.waila.part;
|
||||
import java.util.List;
|
||||
|
||||
import net.minecraft.entity.player.EntityPlayerMP;
|
||||
import net.minecraft.item.ItemStack;
|
||||
import net.minecraft.nbt.NBTTagCompound;
|
||||
import net.minecraft.tileentity.TileEntity;
|
||||
import net.minecraft.world.World;
|
||||
@@ -41,6 +42,12 @@ import appeng.api.parts.IPart;
|
||||
*/
|
||||
public abstract class BasePartWailaDataProvider implements IPartWailaDataProvider
|
||||
{
|
||||
@Override
|
||||
public ItemStack getWailaStack( IPart part, IWailaConfigHandler config, ItemStack partStack )
|
||||
{
|
||||
return null;
|
||||
}
|
||||
|
||||
@Override
|
||||
public List<String> getWailaHead( IPart part, List<String> currentToolTip, IWailaDataAccessor accessor, IWailaConfigHandler config )
|
||||
{
|
||||
|
||||
@@ -22,6 +22,7 @@ package appeng.integration.modules.waila.part;
|
||||
import java.util.List;
|
||||
|
||||
import net.minecraft.entity.player.EntityPlayerMP;
|
||||
import net.minecraft.item.ItemStack;
|
||||
import net.minecraft.nbt.NBTTagCompound;
|
||||
import net.minecraft.tileentity.TileEntity;
|
||||
import net.minecraft.world.World;
|
||||
@@ -41,6 +42,8 @@ import appeng.api.parts.IPart;
|
||||
*/
|
||||
public interface IPartWailaDataProvider
|
||||
{
|
||||
ItemStack getWailaStack( IPart part, IWailaConfigHandler config, ItemStack partStack );
|
||||
|
||||
List<String> getWailaHead( IPart part, List<String> currentToolTip, IWailaDataAccessor accessor, IWailaConfigHandler config );
|
||||
|
||||
List<String> getWailaBody( IPart part, List<String> currentToolTip, IWailaDataAccessor accessor, IWailaConfigHandler config );
|
||||
|
||||
@@ -0,0 +1,42 @@
|
||||
/*
|
||||
* This file is part of Applied Energistics 2.
|
||||
* Copyright (c) 2013 - 2015, AlgorithmX2, All rights reserved.
|
||||
*
|
||||
* Applied Energistics 2 is free software: you can redistribute it and/or modify
|
||||
* it under the terms of the GNU Lesser General Public License as published by
|
||||
* the Free Software Foundation, either version 3 of the License, or
|
||||
* (at your option) any later version.
|
||||
*
|
||||
* Applied Energistics 2 is distributed in the hope that it will be useful,
|
||||
* but WITHOUT ANY WARRANTY; without even the implied warranty of
|
||||
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
|
||||
* GNU Lesser General Public License for more details.
|
||||
*
|
||||
* You should have received a copy of the GNU Lesser General Public License
|
||||
* along with Applied Energistics 2. If not, see <http://www.gnu.org/licenses/lgpl>.
|
||||
*/
|
||||
|
||||
package appeng.integration.modules.waila.part;
|
||||
|
||||
import appeng.api.parts.IPart;
|
||||
import appeng.api.parts.PartItemStack;
|
||||
import mcp.mobius.waila.api.IWailaConfigHandler;
|
||||
import net.minecraft.item.ItemStack;
|
||||
|
||||
/**
|
||||
* Part ItemStack provider for WAILA
|
||||
*
|
||||
* @author TheJulianJES
|
||||
* @version rv2
|
||||
* @since rv2
|
||||
*/
|
||||
public class PartStackWailaDataProvider extends BasePartWailaDataProvider {
|
||||
|
||||
@Override
|
||||
public ItemStack getWailaStack( IPart part, IWailaConfigHandler config, ItemStack partStack )
|
||||
{
|
||||
partStack = part.getItemStack( PartItemStack.Pick );
|
||||
return partStack;
|
||||
}
|
||||
|
||||
}
|
||||
@@ -29,6 +29,7 @@ import net.minecraft.world.World;
|
||||
|
||||
import gnu.trove.map.TObjectLongMap;
|
||||
import gnu.trove.map.hash.TObjectLongHashMap;
|
||||
import mcp.mobius.waila.api.ITaggedList;
|
||||
import mcp.mobius.waila.api.IWailaConfigHandler;
|
||||
import mcp.mobius.waila.api.IWailaDataAccessor;
|
||||
|
||||
@@ -76,6 +77,9 @@ public final class PowerStorageWailaDataProvider extends BaseWailaDataProvider
|
||||
@Override
|
||||
public List<String> getWailaBody( ItemStack itemStack, List<String> currentToolTip, IWailaDataAccessor accessor, IWailaConfigHandler config )
|
||||
{
|
||||
//Removes RF tooltip on WAILA 1.5.9+
|
||||
((ITaggedList<String, String>) currentToolTip).removeEntries("RFEnergyStorage");
|
||||
|
||||
final TileEntity te = accessor.getTileEntity();
|
||||
if( te instanceof IAEPowerStorage )
|
||||
{
|
||||
|
||||
@@ -86,7 +86,10 @@ public class MEMonitorIInventory implements IMEMonitor<IAEItemStack>
|
||||
out = this.adaptor.addItems( input.getItemStack() );
|
||||
}
|
||||
|
||||
this.onTick();
|
||||
if( type == Actionable.MODULATE )
|
||||
{
|
||||
this.onTick();
|
||||
}
|
||||
|
||||
if( out == null )
|
||||
{
|
||||
@@ -122,7 +125,10 @@ public class MEMonitorIInventory implements IMEMonitor<IAEItemStack>
|
||||
IAEItemStack o = request.copy();
|
||||
o.setStackSize( out.stackSize );
|
||||
|
||||
this.onTick();
|
||||
if( type == Actionable.MODULATE )
|
||||
{
|
||||
this.onTick();
|
||||
}
|
||||
|
||||
return o;
|
||||
}
|
||||
|
||||
@@ -92,7 +92,7 @@ public final class DisassembleRecipe implements IRecipe
|
||||
{
|
||||
// needs a single input in the recipe
|
||||
itemCount++;
|
||||
if ( itemCount > 1 )
|
||||
if( itemCount > 1 )
|
||||
{
|
||||
return MISMATCHED_STACK;
|
||||
}
|
||||
|
||||
@@ -86,7 +86,11 @@ public final class VersionParser
|
||||
{
|
||||
assert PATTERN_VALID_REVISION.matcher( rawRevision ).matches();
|
||||
|
||||
final int revision = new Scanner( rawRevision ).useDelimiter( PATTERN_REVISION ).nextInt();
|
||||
final Scanner scanner = new Scanner( rawRevision );
|
||||
|
||||
final int revision = scanner.useDelimiter( PATTERN_REVISION ).nextInt();
|
||||
|
||||
scanner.close();
|
||||
|
||||
return revision;
|
||||
}
|
||||
@@ -124,7 +128,11 @@ public final class VersionParser
|
||||
{
|
||||
assert PATTERN_NATURAL.matcher( rawBuild ).matches();
|
||||
|
||||
final int build = new Scanner( rawBuild ).useDelimiter( PATTERN_BUILD ).nextInt();
|
||||
final Scanner scanner = new Scanner( rawBuild );
|
||||
|
||||
final int build = scanner.useDelimiter( PATTERN_BUILD ).nextInt();
|
||||
|
||||
scanner.close();
|
||||
|
||||
return build;
|
||||
}
|
||||
|
||||
@@ -4,7 +4,7 @@ package appeng.services.version.github;
|
||||
/**
|
||||
* Template class for Gson to write values from the Json Object into an actual class
|
||||
*/
|
||||
@SuppressWarnings( "ALL" )
|
||||
@SuppressWarnings( "all" )
|
||||
public class Release
|
||||
{
|
||||
/**
|
||||
|
||||
@@ -19,6 +19,8 @@
|
||||
package appeng.tile;
|
||||
|
||||
|
||||
import javax.annotation.Nullable;
|
||||
|
||||
import net.minecraft.block.Block;
|
||||
import net.minecraft.entity.player.EntityPlayer;
|
||||
import net.minecraft.inventory.IInventory;
|
||||
@@ -93,7 +95,7 @@ public abstract class AEBaseInvTile extends AEBaseTile implements ISidedInventor
|
||||
}
|
||||
|
||||
@Override
|
||||
public void setInventorySlotContents( int i, ItemStack itemstack )
|
||||
public void setInventorySlotContents( int i, @Nullable ItemStack itemstack )
|
||||
{
|
||||
this.getInternalInventory().setInventorySlotContents( i, itemstack );
|
||||
}
|
||||
|
||||
@@ -26,6 +26,9 @@ import java.util.EnumMap;
|
||||
import java.util.HashMap;
|
||||
import java.util.LinkedList;
|
||||
import java.util.List;
|
||||
import java.util.Map;
|
||||
import javax.annotation.Nonnull;
|
||||
import javax.annotation.Nullable;
|
||||
|
||||
import io.netty.buffer.ByteBuf;
|
||||
import io.netty.buffer.Unpooled;
|
||||
@@ -61,14 +64,15 @@ public class AEBaseTile extends TileEntity implements IOrientable, ICommonTile,
|
||||
{
|
||||
|
||||
public static final ThreadLocal<WeakReference<AEBaseTile>> DROP_NO_ITEMS = new ThreadLocal<WeakReference<AEBaseTile>>();
|
||||
private static final HashMap<Class, EnumMap<TileEventType, List<AETileEventHandler>>> HANDLERS = new HashMap<Class, EnumMap<TileEventType, List<AETileEventHandler>>>();
|
||||
private static final HashMap<Class, ItemStackSrc> ITEM_STACKS = new HashMap<Class, ItemStackSrc>();
|
||||
public int renderFragment = 0;
|
||||
private static final Map<Class<? extends AEBaseTile>, Map<TileEventType, List<AETileEventHandler>>> HANDLERS = new HashMap<Class<? extends AEBaseTile>, Map<TileEventType, List<AETileEventHandler>>>();
|
||||
private static final Map<Class<? extends TileEntity>, ItemStackSrc> ITEM_STACKS = new HashMap<Class<? extends TileEntity>, ItemStackSrc>();
|
||||
private int renderFragment = 0;
|
||||
@Nullable
|
||||
public String customName;
|
||||
private ForgeDirection forward = ForgeDirection.UNKNOWN;
|
||||
private ForgeDirection up = ForgeDirection.UNKNOWN;
|
||||
|
||||
public static void registerTileItem( Class c, ItemStackSrc wat )
|
||||
public static void registerTileItem( Class<? extends TileEntity> c, ItemStackSrc wat )
|
||||
{
|
||||
ITEM_STACKS.put( c, wat );
|
||||
}
|
||||
@@ -84,11 +88,13 @@ public class AEBaseTile extends TileEntity implements IOrientable, ICommonTile,
|
||||
return !this.worldObj.blockExists( this.xCoord, this.yCoord, this.zCoord );
|
||||
}
|
||||
|
||||
@Nonnull
|
||||
public TileEntity getTile()
|
||||
{
|
||||
return this;
|
||||
}
|
||||
|
||||
@Nullable
|
||||
protected ItemStack getItemFromTile( Object obj )
|
||||
{
|
||||
ItemStackSrc src = ITEM_STACKS.get( obj.getClass() );
|
||||
@@ -99,11 +105,6 @@ public class AEBaseTile extends TileEntity implements IOrientable, ICommonTile,
|
||||
return src.stack( 1 );
|
||||
}
|
||||
|
||||
public final void Tick()
|
||||
{
|
||||
|
||||
}
|
||||
|
||||
/**
|
||||
* for dormant chunk cache.
|
||||
*/
|
||||
@@ -176,7 +177,7 @@ public class AEBaseTile extends TileEntity implements IOrientable, ICommonTile,
|
||||
{
|
||||
for( AETileEventHandler h : this.getHandlerListFor( TileEventType.TICK ) )
|
||||
{
|
||||
h.Tick( this );
|
||||
h.tick( this );
|
||||
}
|
||||
}
|
||||
|
||||
@@ -211,10 +212,11 @@ public class AEBaseTile extends TileEntity implements IOrientable, ICommonTile,
|
||||
return this.hasHandlerFor( TileEventType.TICK );
|
||||
}
|
||||
|
||||
protected boolean hasHandlerFor( TileEventType type )
|
||||
private boolean hasHandlerFor( TileEventType type )
|
||||
{
|
||||
List<AETileEventHandler> list = this.getHandlerListFor( type );
|
||||
return list != null && !list.isEmpty();
|
||||
|
||||
return !list.isEmpty();
|
||||
}
|
||||
|
||||
@Override
|
||||
@@ -331,45 +333,72 @@ public class AEBaseTile extends TileEntity implements IOrientable, ICommonTile,
|
||||
return true;
|
||||
}
|
||||
|
||||
protected List<AETileEventHandler> getHandlerListFor( TileEventType type )
|
||||
@Nonnull
|
||||
private List<AETileEventHandler> getHandlerListFor( TileEventType type )
|
||||
{
|
||||
Class clz = this.getClass();
|
||||
EnumMap<TileEventType, List<AETileEventHandler>> handlerSet = HANDLERS.get( clz );
|
||||
final Map<TileEventType, List<AETileEventHandler>> eventToHandlers = this.getEventToHandlers();
|
||||
final List<AETileEventHandler> handlers = this.getHandlers( eventToHandlers, type );
|
||||
|
||||
if( handlerSet == null )
|
||||
{
|
||||
HANDLERS.put( clz, handlerSet = new EnumMap<TileEventType, List<AETileEventHandler>>( TileEventType.class ) );
|
||||
|
||||
for( Method m : clz.getMethods() )
|
||||
{
|
||||
TileEvent te = m.getAnnotation( TileEvent.class );
|
||||
if( te != null )
|
||||
{
|
||||
this.addHandler( handlerSet, te.value(), m );
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
List<AETileEventHandler> list = handlerSet.get( type );
|
||||
|
||||
if( list == null )
|
||||
{
|
||||
handlerSet.put( type, list = new LinkedList<AETileEventHandler>() );
|
||||
}
|
||||
|
||||
return list;
|
||||
return handlers;
|
||||
}
|
||||
|
||||
private void addHandler( EnumMap<TileEventType, List<AETileEventHandler>> handlerSet, TileEventType value, Method m )
|
||||
@Nonnull
|
||||
private Map<TileEventType, List<AETileEventHandler>> getEventToHandlers()
|
||||
{
|
||||
final Class<? extends AEBaseTile> clazz = this.getClass();
|
||||
final Map<TileEventType, List<AETileEventHandler>> storedHandlers = HANDLERS.get( clazz );
|
||||
|
||||
if ( storedHandlers == null )
|
||||
{
|
||||
final Map<TileEventType, List<AETileEventHandler>> newStoredHandlers = new EnumMap<TileEventType, List<AETileEventHandler>>( TileEventType.class );
|
||||
|
||||
HANDLERS.put( clazz, newStoredHandlers );
|
||||
|
||||
for( Method method : clazz.getMethods() )
|
||||
{
|
||||
TileEvent event = method.getAnnotation( TileEvent.class );
|
||||
if( event != null )
|
||||
{
|
||||
this.addHandler( newStoredHandlers, event.value(), method );
|
||||
}
|
||||
}
|
||||
|
||||
return newStoredHandlers;
|
||||
}
|
||||
else
|
||||
{
|
||||
return storedHandlers;
|
||||
}
|
||||
}
|
||||
|
||||
@Nonnull
|
||||
private List<AETileEventHandler> getHandlers( Map<TileEventType, List<AETileEventHandler>> eventToHandlers, TileEventType event ) {
|
||||
final List<AETileEventHandler> oldHandlers = eventToHandlers.get( event );
|
||||
|
||||
if( oldHandlers == null )
|
||||
{
|
||||
final List<AETileEventHandler> newHandlers = new LinkedList<AETileEventHandler>();
|
||||
eventToHandlers.put( event, newHandlers );
|
||||
|
||||
return newHandlers;
|
||||
}
|
||||
else
|
||||
{
|
||||
return oldHandlers;
|
||||
}
|
||||
}
|
||||
|
||||
private void addHandler( Map<TileEventType, List<AETileEventHandler>> handlerSet, TileEventType value, Method m )
|
||||
{
|
||||
List<AETileEventHandler> list = handlerSet.get( value );
|
||||
|
||||
if( list == null )
|
||||
{
|
||||
handlerSet.put( value, list = new ArrayList<AETileEventHandler>() );
|
||||
list = new ArrayList<AETileEventHandler>();
|
||||
handlerSet.put( value, list );
|
||||
}
|
||||
|
||||
list.add( new AETileEventHandler( m, value ) );
|
||||
list.add( new AETileEventHandler( m ) );
|
||||
}
|
||||
|
||||
@Override
|
||||
|
||||
@@ -32,18 +32,18 @@ import cpw.mods.fml.relauncher.SideOnly;
|
||||
import appeng.tile.AEBaseTile;
|
||||
|
||||
|
||||
public class AETileEventHandler
|
||||
public final class AETileEventHandler
|
||||
{
|
||||
|
||||
private final Method method;
|
||||
|
||||
public AETileEventHandler( Method m, TileEventType which )
|
||||
public AETileEventHandler( Method method )
|
||||
{
|
||||
this.method = m;
|
||||
this.method = method;
|
||||
}
|
||||
|
||||
// TICK
|
||||
public void Tick( AEBaseTile tile )
|
||||
public void tick( AEBaseTile tile )
|
||||
{
|
||||
try
|
||||
{
|
||||
|
||||
@@ -25,5 +25,10 @@ public enum TileEventType
|
||||
|
||||
WORLD_NBT_READ, WORLD_NBT_WRITE,
|
||||
|
||||
NETWORK_READ, NETWORK_WRITE
|
||||
/**
|
||||
* Methods annotated with this need to return a boolean
|
||||
*/
|
||||
NETWORK_READ,
|
||||
|
||||
NETWORK_WRITE
|
||||
}
|
||||
|
||||
@@ -36,21 +36,25 @@ import appeng.api.networking.ticking.TickingRequest;
|
||||
import appeng.api.util.AECableType;
|
||||
import appeng.api.util.DimensionalCoord;
|
||||
import appeng.core.settings.TickRates;
|
||||
import appeng.helpers.Reflected;
|
||||
import appeng.me.GridAccessException;
|
||||
import appeng.tile.TileEvent;
|
||||
import appeng.tile.events.TileEventType;
|
||||
import appeng.tile.grid.AENetworkInvTile;
|
||||
import appeng.tile.inventory.AppEngInternalInventory;
|
||||
import appeng.tile.inventory.InvOperation;
|
||||
import appeng.util.Platform;
|
||||
|
||||
|
||||
public class TileVibrationChamber extends AENetworkInvTile implements IGridTickable
|
||||
{
|
||||
|
||||
final double powerPerTick = 5;
|
||||
|
||||
final int[] sides = new int[] { 0 };
|
||||
final AppEngInternalInventory inv = new AppEngInternalInventory( this, 1 );
|
||||
private static final int FUEL_SLOT_INDEX = 0;
|
||||
private static final double POWER_PER_TICK = 5;
|
||||
private static final int[] ACCESSIBLE_SLOTS = new int[] { FUEL_SLOT_INDEX };
|
||||
private static final int MAX_BURN_SPEED = 200;
|
||||
private static final double DILATION_SCALING = 100.0;
|
||||
private static final int MIN_BURN_SPEED = 20;
|
||||
private final IInventory inv = new AppEngInternalInventory( this, 1 );
|
||||
|
||||
public int burnSpeed = 100;
|
||||
public double burnTime = 0;
|
||||
@@ -71,16 +75,20 @@ public class TileVibrationChamber extends AENetworkInvTile implements IGridTicka
|
||||
return AECableType.COVERED;
|
||||
}
|
||||
|
||||
@Reflected
|
||||
@TileEvent( TileEventType.NETWORK_READ )
|
||||
public boolean readFromStream_TileVibrationChamber( ByteBuf data )
|
||||
public boolean hasUpdate( ByteBuf data )
|
||||
{
|
||||
boolean wasOn = this.isOn;
|
||||
final boolean wasOn = this.isOn;
|
||||
|
||||
this.isOn = data.readBoolean();
|
||||
|
||||
return wasOn != this.isOn; // TESR doesn't need updates!
|
||||
}
|
||||
|
||||
@Reflected
|
||||
@TileEvent( TileEventType.NETWORK_WRITE )
|
||||
public void writeToStream_TileVibrationChamber( ByteBuf data )
|
||||
public void writeToNetwork( ByteBuf data )
|
||||
{
|
||||
data.writeBoolean( this.burnTime > 0 );
|
||||
}
|
||||
@@ -107,12 +115,6 @@ public class TileVibrationChamber extends AENetworkInvTile implements IGridTicka
|
||||
return this.inv;
|
||||
}
|
||||
|
||||
@Override
|
||||
public int getInventoryStackLimit()
|
||||
{
|
||||
return 64;
|
||||
}
|
||||
|
||||
@Override
|
||||
public boolean isItemValidForSlot( int i, ItemStack itemstack )
|
||||
{
|
||||
@@ -147,12 +149,12 @@ public class TileVibrationChamber extends AENetworkInvTile implements IGridTicka
|
||||
@Override
|
||||
public int[] getAccessibleSlotsBySide( ForgeDirection side )
|
||||
{
|
||||
return this.sides;
|
||||
return ACCESSIBLE_SLOTS;
|
||||
}
|
||||
|
||||
private boolean canEatFuel()
|
||||
{
|
||||
ItemStack is = this.getStackInSlot( 0 );
|
||||
ItemStack is = this.getStackInSlot( FUEL_SLOT_INDEX );
|
||||
if( is != null )
|
||||
{
|
||||
int newBurnTime = TileEntityFurnace.getItemBurnTime( is );
|
||||
@@ -182,7 +184,7 @@ public class TileVibrationChamber extends AENetworkInvTile implements IGridTicka
|
||||
}
|
||||
|
||||
@Override
|
||||
public TickRateModulation tickingRequest( IGridNode node, int TicksSinceLastCall )
|
||||
public TickRateModulation tickingRequest( IGridNode node, int ticksSinceLastCall )
|
||||
{
|
||||
if( this.burnTime <= 0 )
|
||||
{
|
||||
@@ -197,10 +199,10 @@ public class TileVibrationChamber extends AENetworkInvTile implements IGridTicka
|
||||
return TickRateModulation.SLEEP;
|
||||
}
|
||||
|
||||
this.burnSpeed = Math.max( 20, Math.min( this.burnSpeed, 200 ) );
|
||||
double dilation = this.burnSpeed / 100.0;
|
||||
this.burnSpeed = Math.max( MIN_BURN_SPEED, Math.min( this.burnSpeed, MAX_BURN_SPEED ) );
|
||||
double dilation = this.burnSpeed / DILATION_SCALING;
|
||||
|
||||
double timePassed = TicksSinceLastCall * dilation;
|
||||
double timePassed = ticksSinceLastCall * dilation;
|
||||
this.burnTime -= timePassed;
|
||||
if( this.burnTime < 0 )
|
||||
{
|
||||
@@ -211,7 +213,7 @@ public class TileVibrationChamber extends AENetworkInvTile implements IGridTicka
|
||||
try
|
||||
{
|
||||
IEnergyGrid grid = this.gridProxy.getEnergy();
|
||||
double newPower = timePassed * this.powerPerTick;
|
||||
double newPower = timePassed * POWER_PER_TICK;
|
||||
double overFlow = grid.injectPower( newPower, Actionable.SIMULATE );
|
||||
|
||||
// burn the over flow.
|
||||
@@ -219,30 +221,30 @@ public class TileVibrationChamber extends AENetworkInvTile implements IGridTicka
|
||||
|
||||
if( overFlow > 0 )
|
||||
{
|
||||
this.burnSpeed -= TicksSinceLastCall;
|
||||
this.burnSpeed -= ticksSinceLastCall;
|
||||
}
|
||||
else
|
||||
{
|
||||
this.burnSpeed += TicksSinceLastCall;
|
||||
this.burnSpeed += ticksSinceLastCall;
|
||||
}
|
||||
|
||||
this.burnSpeed = Math.max( 20, Math.min( this.burnSpeed, 200 ) );
|
||||
this.burnSpeed = Math.max( MIN_BURN_SPEED, Math.min( this.burnSpeed, MAX_BURN_SPEED ) );
|
||||
return overFlow > 0 ? TickRateModulation.SLOWER : TickRateModulation.FASTER;
|
||||
}
|
||||
catch( GridAccessException e )
|
||||
{
|
||||
this.burnSpeed -= TicksSinceLastCall;
|
||||
this.burnSpeed = Math.max( 20, Math.min( this.burnSpeed, 200 ) );
|
||||
this.burnSpeed -= ticksSinceLastCall;
|
||||
this.burnSpeed = Math.max( MIN_BURN_SPEED, Math.min( this.burnSpeed, MAX_BURN_SPEED ) );
|
||||
return TickRateModulation.SLOWER;
|
||||
}
|
||||
}
|
||||
|
||||
private void eatFuel()
|
||||
{
|
||||
ItemStack is = this.getStackInSlot( 0 );
|
||||
final ItemStack is = this.getStackInSlot( FUEL_SLOT_INDEX );
|
||||
if( is != null )
|
||||
{
|
||||
int newBurnTime = TileEntityFurnace.getItemBurnTime( is );
|
||||
final int newBurnTime = TileEntityFurnace.getItemBurnTime( is );
|
||||
if( newBurnTime > 0 && is.stackSize > 0 )
|
||||
{
|
||||
this.burnTime += newBurnTime;
|
||||
@@ -252,7 +254,7 @@ public class TileVibrationChamber extends AENetworkInvTile implements IGridTicka
|
||||
{
|
||||
ItemStack container = null;
|
||||
|
||||
if( is.getItem().hasContainerItem( is ) )
|
||||
if( is.getItem() != null && is.getItem().hasContainerItem( is ) )
|
||||
{
|
||||
container = is.getItem().getContainerItem( is );
|
||||
}
|
||||
@@ -263,6 +265,8 @@ public class TileVibrationChamber extends AENetworkInvTile implements IGridTicka
|
||||
{
|
||||
this.setInventorySlotContents( 0, is );
|
||||
}
|
||||
|
||||
this.markDirty();
|
||||
}
|
||||
}
|
||||
|
||||
@@ -278,10 +282,16 @@ public class TileVibrationChamber extends AENetworkInvTile implements IGridTicka
|
||||
}
|
||||
}
|
||||
|
||||
// state change
|
||||
if( ( !this.isOn && this.burnTime > 0 ) || ( this.isOn && this.burnTime <= 0 ) )
|
||||
{
|
||||
this.isOn = this.burnTime > 0;
|
||||
this.markForUpdate();
|
||||
|
||||
if ( this.hasWorldObj() )
|
||||
{
|
||||
Platform.notifyBlocksOfNeighbors( this.worldObj, this.xCoord, this.yCoord, this.zCoord );
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
@@ -30,7 +30,6 @@ import net.minecraft.entity.Entity;
|
||||
import net.minecraft.entity.player.EntityPlayer;
|
||||
import net.minecraft.item.ItemStack;
|
||||
import net.minecraft.nbt.NBTTagCompound;
|
||||
import net.minecraft.tileentity.TileEntity;
|
||||
import net.minecraft.util.AxisAlignedBB;
|
||||
import net.minecraft.util.Vec3;
|
||||
import net.minecraft.world.World;
|
||||
@@ -162,12 +161,6 @@ public class TileCableBus extends AEBaseTile implements AEMultiTile, ICustomColl
|
||||
return this.cb.getCableConnectionType( side );
|
||||
}
|
||||
|
||||
@Override
|
||||
public TileEntity getTile()
|
||||
{
|
||||
return this;
|
||||
}
|
||||
|
||||
@Override
|
||||
public void onChunkUnload()
|
||||
{
|
||||
|
||||
@@ -19,20 +19,25 @@
|
||||
package appeng.tile.powersink;
|
||||
|
||||
|
||||
import appeng.transformer.annotations.Integration;
|
||||
import net.minecraft.world.World;
|
||||
import net.minecraftforge.common.util.ForgeDirection;
|
||||
|
||||
import Reika.RotaryCraft.API.Power.ShaftPowerReceiver;
|
||||
import Reika.RotaryCraft.API.Interfaces.Transducerable;
|
||||
import Reika.RotaryCraft.API.Power.AdvancedShaftPowerReceiver;
|
||||
|
||||
import appeng.api.config.PowerUnits;
|
||||
import appeng.tile.TileEvent;
|
||||
import appeng.tile.events.TileEventType;
|
||||
import appeng.transformer.annotations.Integration.Interface;
|
||||
import appeng.transformer.annotations.Integration.InterfaceList;
|
||||
import appeng.transformer.annotations.Integration.Method;
|
||||
import appeng.util.Platform;
|
||||
|
||||
import java.util.ArrayList;
|
||||
|
||||
@Interface( iname = "RotaryCraft", iface = "Reika.RotaryCraft.API.Power.ShaftPowerReceiver" )
|
||||
public abstract class RotaryCraft extends IC2 implements ShaftPowerReceiver
|
||||
@InterfaceList( value = { @Interface( iname = "RotaryCraft", iface = "Reika.RotaryCraft.API.Power.AdvancedShaftPowerReceiver" ), @Interface( iname = "RotaryCraft", iface = "Reika.RotaryCraft.API.Interfaces.Transducerable") } )
|
||||
public abstract class RotaryCraft extends IC2 implements AdvancedShaftPowerReceiver, Transducerable
|
||||
{
|
||||
|
||||
private int omega = 0;
|
||||
@@ -40,16 +45,32 @@ public abstract class RotaryCraft extends IC2 implements ShaftPowerReceiver
|
||||
private long power = 0;
|
||||
private int alpha = 0;
|
||||
|
||||
private long currentPower = 0;
|
||||
|
||||
@TileEvent( TileEventType.TICK )
|
||||
@Method( iname = "RotaryCraft" )
|
||||
public void Tick_RotaryCraft()
|
||||
{
|
||||
if( this.worldObj != null && !this.worldObj.isRemote && this.power > 0 )
|
||||
if( this.worldObj != null && !this.worldObj.isRemote && this.currentPower > 0 )
|
||||
{
|
||||
this.injectExternalPower( PowerUnits.WA, this.power );
|
||||
this.injectExternalPower( PowerUnits.WA, this.currentPower );
|
||||
this.currentPower = 0;
|
||||
}
|
||||
}
|
||||
|
||||
@Override
|
||||
public final boolean addPower( int torque, int omega, long power, ForgeDirection side )
|
||||
{
|
||||
this.omega = omega;
|
||||
this.torque = torque;
|
||||
this.power = power;
|
||||
|
||||
this.currentPower += power;
|
||||
|
||||
return true;
|
||||
|
||||
}
|
||||
|
||||
@Override
|
||||
public final int getOmega()
|
||||
{
|
||||
@@ -86,37 +107,6 @@ public abstract class RotaryCraft extends IC2 implements ShaftPowerReceiver
|
||||
this.alpha = io;
|
||||
}
|
||||
|
||||
@Override
|
||||
public final void setPower( long p )
|
||||
{
|
||||
if( Platform.isClient() )
|
||||
{
|
||||
return;
|
||||
}
|
||||
|
||||
this.power = p;
|
||||
}
|
||||
|
||||
@Override
|
||||
public final void noInputMachine()
|
||||
{
|
||||
this.power = 0;
|
||||
this.torque = 0;
|
||||
this.omega = 0;
|
||||
}
|
||||
|
||||
@Override
|
||||
public final void setTorque( int t )
|
||||
{
|
||||
this.torque = t;
|
||||
}
|
||||
|
||||
@Override
|
||||
public final void setOmega( int o )
|
||||
{
|
||||
this.omega = o;
|
||||
}
|
||||
|
||||
public final boolean canReadFromBlock( int x, int y, int z )
|
||||
{
|
||||
ForgeDirection side = ForgeDirection.UNKNOWN;
|
||||
@@ -164,6 +154,33 @@ public abstract class RotaryCraft extends IC2 implements ShaftPowerReceiver
|
||||
@Override
|
||||
public final int getMinTorque( int available )
|
||||
{
|
||||
return 0;
|
||||
return 1;
|
||||
}
|
||||
|
||||
@Override
|
||||
public final ArrayList<String> getMessages( World world, int x, int y, int z, int side )
|
||||
{
|
||||
String out;
|
||||
if( power >= 1000000000 )
|
||||
{
|
||||
out = String.format( "Receiving %.3f GW @ %d rad/s.", power / 1000000000.0D, omega );
|
||||
}
|
||||
else if( power >= 1000000 )
|
||||
{
|
||||
out = String.format( "Receiving %.3f MW @ %d rad/s.", power / 1000000.0D, omega );
|
||||
}
|
||||
else if( power >= 1000 )
|
||||
{
|
||||
out = String.format( "Receiving %.3f kW @ %d rad/s.", power / 1000.0D, omega );
|
||||
}
|
||||
else
|
||||
{
|
||||
out = String.format( "Receiving %d W @ %d rad/s.", power, omega );
|
||||
}
|
||||
|
||||
|
||||
ArrayList<String> messages = new ArrayList<String>( 1 );
|
||||
messages.add( out );
|
||||
return messages;
|
||||
}
|
||||
}
|
||||
|
||||
@@ -1863,15 +1863,15 @@ public class Platform
|
||||
return null;
|
||||
}
|
||||
|
||||
public static boolean isSameItemType( ItemStack ol, ItemStack op )
|
||||
public static boolean isSameItemType( ItemStack that, ItemStack other )
|
||||
{
|
||||
if( ol != null && op != null && ol.getItem() == op.getItem() )
|
||||
if( that != null && other != null && that.getItem() == other.getItem() )
|
||||
{
|
||||
if( ol.isItemStackDamageable() )
|
||||
if( that.isItemStackDamageable() )
|
||||
{
|
||||
return true;
|
||||
}
|
||||
return ol.getItemDamage() == ol.getItemDamage();
|
||||
return that.getItemDamage() == other.getItemDamage();
|
||||
}
|
||||
return false;
|
||||
}
|
||||
|
||||
@@ -1,5 +1,5 @@
|
||||
tile.appliedenergistics2.BlockCableBus.name=AE2-Kabel und/oder Bus
|
||||
tile.appliedenergistics2.BlockCellWorkbench.name=Zellenwerkbank
|
||||
tile.appliedenergistics2.BlockCellWorkbench.name=Speicherzellenwerkbank
|
||||
tile.appliedenergistics2.BlockCharger.name=Ladegerät
|
||||
tile.appliedenergistics2.BlockChest.name=ME-Truhe
|
||||
tile.appliedenergistics2.BlockCondenser.name=Materiekondensator
|
||||
@@ -17,7 +17,7 @@ tile.appliedenergistics2.BlockInscriber.name=Gravurmaschine
|
||||
tile.appliedenergistics2.BlockInterface.name=ME-Schnittstelle
|
||||
tile.appliedenergistics2.BlockQuantumLinkChamber.name=ME-Quantentunnelkammer
|
||||
tile.appliedenergistics2.BlockQuantumRing.name=ME-Quantentunnelring
|
||||
tile.appliedenergistics2.BlockFluix.name=Fluix-Block
|
||||
tile.appliedenergistics2.BlockFluix.name=Fluixblock
|
||||
tile.appliedenergistics2.BlockQuartz.name=Certusquarzblock
|
||||
tile.appliedenergistics2.BlockQuartzChiseled.name=Gemeißelter Certusquarzblock
|
||||
tile.appliedenergistics2.BlockQuartzGlass.name=Quarzglas
|
||||
@@ -50,7 +50,7 @@ tile.appliedenergistics2.BlockCraftingAccelerator.name=Fertigungs-Prozessoreinhe
|
||||
tile.appliedenergistics2.BlockCraftingUnit.name=Fertigungseinheit
|
||||
tile.appliedenergistics2.BlockMolecularAssembler.name=Molekularassembler
|
||||
|
||||
chat.appliedenergistics2.ChestCannotReadStorageCell=ME-Truhe kann Speicherzelle nicht einlesen.
|
||||
chat.appliedenergistics2.ChestCannotReadStorageCell=ME-Truhe kann die Speicherzelle nicht einlesen.
|
||||
chat.appliedenergistics2.SettingCleared=Einstellung gelöscht.
|
||||
chat.appliedenergistics2.OutOfRange=Drahtloser Zugangspunkt außer Reichweite.
|
||||
chat.appliedenergistics2.InvalidMachine=Ungültige Maschine.
|
||||
@@ -148,11 +148,11 @@ gui.appliedenergistics2.Crafts=Fertigt
|
||||
gui.appliedenergistics2.And=und
|
||||
gui.appliedenergistics2.Creates=Kreiert
|
||||
gui.appliedenergistics2.With=mit
|
||||
gui.appliedenergistics2.InWorldCrafting=AE2 In-World-Fertigung
|
||||
gui.appliedenergistics2.InWorldCrafting=AE2 In-Welt-Fertigung
|
||||
gui.appliedenergistics2.inWorldFluix=Wirf 1 Geladenes Certusquarzstück + 1 Netherquarz + Redstone-Staub nebeneinander in eine Pfütze und warte einen Moment.
|
||||
gui.appliedenergistics2.inWorldPurificationCertus=Wirf einen Certusquarzkeim, gemacht aus Certusquarzstaub und Sand, in eine Pfütze Wasser; um den Prozess zu beschleunigen, füge Kristallwachstumsbeschleuniger hinzu.
|
||||
gui.appliedenergistics2.inWorldPurificationNether=Wirf einen Netherquarzkeim, gemacht aus Netherquarzstaub und Sand, in eine Pfütze Wasser; um den Prozess zu beschleunigen, füge Kristallwachstumsbeschleuniger hinzu.
|
||||
gui.appliedenergistics2.inWorldPurificationFluix=Wirf einen Fluix-Keim, gemacht aus Fluix-Staub und Sand, in eine Pfütze Wasser; um den Prozess zu beschleunigen, füge Kristallwachstumsbeschleuniger hinzu.
|
||||
gui.appliedenergistics2.inWorldPurificationFluix=Wirf einen Fluixkeim, gemacht aus Fluixstaub und Sand, in eine Pfütze Wasser; um den Prozess zu beschleunigen, füge Kristallwachstumsbeschleuniger hinzu.
|
||||
gui.appliedenergistics2.inWorldSingularity=Wirf zum Erschaffen 1 Singularität und 1 Enderstaub zusammen und erzeuge in Reichweite der Items eine Explosion.
|
||||
gui.appliedenergistics2.ChargedQuartz=Geladener Certusquarz entsteht durch Einfügen eines Ungeladenen Certusquarzkristalls in ein Ladegerät, das Energie erhält.
|
||||
gui.appliedenergistics2.ChargedQuartzFind=Geladener Certusquarz kann relativ selten in der Welt gefunden werden, er sieht aus wie gewöhnlicher Certusquarz, aber er funkelt.
|
||||
@@ -309,7 +309,7 @@ waila.appliedenergistics2.Locked=Gesperrt
|
||||
waila.appliedenergistics2.Unlocked=Entsperrt
|
||||
waila.appliedenergistics2.Showing=Zeigt
|
||||
waila.appliedenergistics2.Contains=Enthält
|
||||
waila.appliedenergistics2.Channels=%1$d of %2$d Kanäle
|
||||
waila.appliedenergistics2.Channels=%1$d von %2$d Kanälen
|
||||
|
||||
item.appliedenergistics2.ItemBasicStorageCell.1k.name=1k-ME-Speicherzelle
|
||||
item.appliedenergistics2.ItemBasicStorageCell.4k.name=4k-ME-Speicherzelle
|
||||
@@ -322,7 +322,7 @@ item.appliedenergistics2.ItemFacade.name=Kabelfassade
|
||||
|
||||
item.appliedenergistics2.ItemCrystalSeed.Certus.name=Certusquarzkeim
|
||||
item.appliedenergistics2.ItemCrystalSeed.Nether.name=Netherquarzkeim
|
||||
item.appliedenergistics2.ItemCrystalSeed.Fluix.name=Fluix-Keim
|
||||
item.appliedenergistics2.ItemCrystalSeed.Fluix.name=Fluixkeim
|
||||
item.appliedenergistics2.ItemMaterial.InvalidType.name=Dieses Item ist deaktiviert.
|
||||
item.appliedenergistics2.ItemMaterial.AdvCard.name=Fortgeschrittene Karte
|
||||
item.appliedenergistics2.ItemMaterial.AnnihilationCore.name=Annihilationskern
|
||||
|
||||
@@ -1,3 +1,4 @@
|
||||
//Blocos
|
||||
tile.appliedenergistics2.BlockCableBus.name=Cabos e/ou Barramentos do AE2
|
||||
tile.appliedenergistics2.BlockCellWorkbench.name=Bancada de Células
|
||||
tile.appliedenergistics2.BlockCharger.name=Carregador
|
||||
@@ -19,7 +20,7 @@ tile.appliedenergistics2.BlockQuantumLinkChamber.name=Câmara de Ligação Quân
|
||||
tile.appliedenergistics2.BlockQuantumRing.name=Anel Quântico ME
|
||||
tile.appliedenergistics2.BlockFluix.name=Bloco de Fluix
|
||||
tile.appliedenergistics2.BlockQuartz.name=Bloco de Quartzo Certus
|
||||
tile.appliedenergistics2.BlockQuartzChiseled.name=Bloco de Quartzo Certus Cinzelado
|
||||
tile.appliedenergistics2.BlockQuartzChiseled.name=Bloco de Quartzo Certus Talhado
|
||||
tile.appliedenergistics2.BlockQuartzGlass.name=Vidro de Quartzo
|
||||
tile.appliedenergistics2.BlockQuartzLamp.name=Vidro Vibrante de Quartzo
|
||||
tile.appliedenergistics2.BlockQuartzPillar.name=Pilar de Quartzo Certus
|
||||
@@ -50,8 +51,8 @@ tile.appliedenergistics2.BlockCraftingAccelerator.name=Unidade de Co-Processamen
|
||||
tile.appliedenergistics2.BlockCraftingUnit.name=Unidade de Fabricação
|
||||
tile.appliedenergistics2.BlockMolecularAssembler.name=Montador Molecular
|
||||
|
||||
// Stairs
|
||||
tile.appliedenergistics2.ChiseledQuartzStairBlock.name=Escadas de Quartzo Certus Cinzelado
|
||||
// Escadas
|
||||
tile.appliedenergistics2.ChiseledQuartzStairBlock.name=Escadas de Quartzo Certus Talhadas
|
||||
tile.appliedenergistics2.FluixStairBlock.name=Escadas de Fluix
|
||||
tile.appliedenergistics2.QuartzPillarStairBlock.name=Escadas de Pilar de Quartzo Certus
|
||||
tile.appliedenergistics2.QuartzStairBlock.name=Escadas de Quartzo Certus
|
||||
@@ -472,7 +473,7 @@ achievement.ae2.IOPort=Embaralhamento de Células de Armazenamentos
|
||||
achievement.ae2.IOPort.desc=Faça uma Porta de ES
|
||||
achievement.ae2.CraftingTerminal=Uma Bancada (Muito) Maior
|
||||
achievement.ae2.CraftingTerminal.desc=Faça um Terminal de Fabricação
|
||||
achievement.ae2.PatternTerminal=Maestro de Fabricação
|
||||
achievement.ae2.PatternTerminal=Maestro da Fabricação
|
||||
achievement.ae2.PatternTerminal.desc=Faça um Terminal de Padrões
|
||||
achievement.ae2.ChargedQuartz=Chocante
|
||||
achievement.ae2.ChargedQuartz.desc=Ache Quartzo Carregado
|
||||
@@ -502,7 +503,7 @@ achievement.ae2.Facade=Estética de Rede
|
||||
achievement.ae2.Facade.desc=Faça uma Fachada de Cabo
|
||||
achievement.ae2.NetworkTool=Diagnóstico de Rede
|
||||
achievement.ae2.NetworkTool.desc=Faça uma Ferramenta de Rede
|
||||
achievement.ae2.PortableCell=Armazenamento Portátil
|
||||
achievement.ae2.PortableCell=Armazenamento Nômade
|
||||
achievement.ae2.PortableCell.desc=Faça uma Célula Portátil
|
||||
achievement.ae2.StorageBus=Potencial Sem Limites
|
||||
achievement.ae2.StorageBus.desc=Faça um Barramento de Armazenamento
|
||||
|
||||
@@ -18,6 +18,8 @@ ore=mc:stained_hardened_clay:* -> blockStainedHardenedClay
|
||||
ore=ae2:ItemMaterial.NetherQuartzDust -> dustNetherQuartz
|
||||
ore=ae2:ItemMaterial.CertusQuartzDust -> dustCertusQuartz
|
||||
ore=ae2:ItemMaterial.FluixDust -> dustFluix
|
||||
ore=ae2:tile.OreQuartz -> oreCertusQuartz
|
||||
ore=ae2:tile.OreQuartzCharged -> oreCertusQuartz
|
||||
|
||||
group= mc:iron_ingot oredictionary:ingotCopper oredictionary:ingotTin oredictionary:ingotSilver oredictionary:ingotLead oredictionary:ingotBronze oredictionary:ingotBrass oredictionary:ingotNickel oredictionary:ingotInvar oredictionary:ingotAluminium -> metalIngots
|
||||
group= oredictionary:dustEnder oredictionary:dustEnderPearl -> dustEnder
|
||||
@@ -66,3 +68,4 @@ import=dyes_dense.recipe
|
||||
import=paint_balls.recipe
|
||||
import=crafting.recipe
|
||||
import=vanilla_enhance.recipe
|
||||
import=stairs.recipe
|
||||
|
||||
@@ -0,0 +1,47 @@
|
||||
shaped=
|
||||
ae2:BlockQuartzChiseled _ _,
|
||||
ae2:BlockQuartzChiseled ae2:BlockQuartzChiseled _,
|
||||
ae2:BlockQuartzChiseled ae2:BlockQuartzChiseled ae2:BlockQuartzChiseled
|
||||
-> 4 ae2:ChiseledQuartzStairBlock
|
||||
|
||||
shaped=
|
||||
ae2:BlockFluix _ _,
|
||||
ae2:BlockFluix ae2:BlockFluix _,
|
||||
ae2:BlockFluix ae2:BlockFluix ae2:BlockFluix
|
||||
-> 4 ae2:FluixStairBlock
|
||||
|
||||
shaped=
|
||||
ae2:BlockQuartzPillar _ _,
|
||||
ae2:BlockQuartzPillar ae2:BlockQuartzPillar _,
|
||||
ae2:BlockQuartzPillar ae2:BlockQuartzPillar ae2:BlockQuartzPillar
|
||||
-> 4 ae2:QuartzPillarStairBlock
|
||||
|
||||
shaped=
|
||||
ae2:BlockQuartz _ _,
|
||||
ae2:BlockQuartz ae2:BlockQuartz _,
|
||||
ae2:BlockQuartz ae2:BlockQuartz ae2:BlockQuartz
|
||||
-> 4 ae2:QuartzStairBlock
|
||||
|
||||
shaped=
|
||||
ae2:BlockSkyStone _ _,
|
||||
ae2:BlockSkyStone ae2:BlockSkyStone _,
|
||||
ae2:BlockSkyStone ae2:BlockSkyStone ae2:BlockSkyStone
|
||||
-> 4 ae2:SkyStoneStairBlock
|
||||
|
||||
shaped=
|
||||
ae2:BlockSkyStone:1 _ _,
|
||||
ae2:BlockSkyStone:1 ae2:BlockSkyStone:1 _,
|
||||
ae2:BlockSkyStone:1 ae2:BlockSkyStone:1 ae2:BlockSkyStone:1
|
||||
-> 4 ae2:SkyStoneBlockStairBlock
|
||||
|
||||
shaped=
|
||||
ae2:BlockSkyStone:2 _ _,
|
||||
ae2:BlockSkyStone:2 ae2:BlockSkyStone:2 _,
|
||||
ae2:BlockSkyStone:2 ae2:BlockSkyStone:2 ae2:BlockSkyStone:2
|
||||
-> 4 ae2:SkyStoneBrickStairBlock
|
||||
|
||||
shaped=
|
||||
ae2:BlockSkyStone:3 _ _,
|
||||
ae2:BlockSkyStone:3 ae2:BlockSkyStone:3 _,
|
||||
ae2:BlockSkyStone:3 ae2:BlockSkyStone:3 ae2:BlockSkyStone:3
|
||||
-> 4 ae2:SkyStoneSmallBrickStairBlock
|
||||
Reference in New Issue
Block a user