Alloy furnace - Comparator output control
This commit is contained in:
parent
67d6f34fcc
commit
63e3c2dbc3
6 changed files with 199 additions and 92 deletions
4
TODO.txt
4
TODO.txt
|
@ -44,9 +44,7 @@ materials.ores No Tin
|
|||
materials.ores No Zinc
|
||||
-------------------------------------------------------------------------------------------------------
|
||||
tech.base No Alloy furnace
|
||||
-> comparator signal configuration
|
||||
(inventory mode w/ combinations, valid ingredients, burn time,
|
||||
alloying time)
|
||||
-> check item behaviour
|
||||
tech.base No Coke oven
|
||||
-------------------------------------------------------------------------------------------------------
|
||||
animals ??? Goats
|
||||
|
|
|
@ -25,7 +25,6 @@ import net.minecraft.entity.EntityLivingBase;
|
|||
import net.minecraft.entity.player.EntityPlayer;
|
||||
import net.minecraft.init.Blocks;
|
||||
import net.minecraft.init.SoundEvents;
|
||||
import net.minecraft.inventory.Container;
|
||||
import net.minecraft.inventory.InventoryHelper;
|
||||
import net.minecraft.item.Item;
|
||||
import net.minecraft.item.ItemStack;
|
||||
|
@ -395,7 +394,7 @@ public class TBAFBlock
|
|||
if ( ! ( te instanceof TBAFTileEntity ) ) {
|
||||
return 0;
|
||||
}
|
||||
return Container.calcRedstoneFromInventory( ( (TBAFTileEntity) te ).output );
|
||||
return ( (TBAFTileEntity) te ).getComparatorValue( );
|
||||
}
|
||||
|
||||
|
||||
|
|
|
@ -16,6 +16,7 @@ import net.minecraft.client.resources.I18n;
|
|||
import net.minecraft.entity.player.InventoryPlayer;
|
||||
import net.minecraft.tileentity.TileEntity;
|
||||
import net.minecraft.util.ResourceLocation;
|
||||
import net.minecraftforge.fml.client.config.GuiCheckBox;
|
||||
import net.minecraftforge.fml.relauncher.Side;
|
||||
import net.minecraftforge.fml.relauncher.SideOnly;
|
||||
|
||||
|
@ -210,9 +211,7 @@ public class TBAFGui
|
|||
extends A_UGTab
|
||||
{
|
||||
private GuiButton bActivationMode;
|
||||
private GuiButton bInputInvalid;
|
||||
private GuiButton bOutputInvalidInput;
|
||||
private GuiButton bOutputInvalidFuel;
|
||||
private GuiCheckBox bFlags[];
|
||||
|
||||
|
||||
private ConfigTab( )
|
||||
|
@ -231,16 +230,31 @@ public class TBAFGui
|
|||
{
|
||||
super.initGui( x , y );
|
||||
|
||||
this.bActivationMode = new GuiButton( 100 , x + 10 , y + 10 , this.parent.getXSize( ) - 20 , 20 , "" );
|
||||
int id = 100;
|
||||
this.bActivationMode = new GuiButton( id++ , x + 10 , y + 10 , this.parent.getXSize( ) - 20 , 20 , "" );
|
||||
this.buttons.add( this.bActivationMode );
|
||||
|
||||
this.bInputInvalid = new GuiButton( 100 , x + 10 , y + 40 , this.parent.getXSize( ) - 20 , 20 , "" );
|
||||
this.buttons.add( this.bInputInvalid );
|
||||
this.bFlags = new GuiCheckBox[ 9 ];
|
||||
this.bFlags[ 0 ] = this.makeCheckbox( id++ , x , y + 55 , 0 , "hoppers_input_invalid" );
|
||||
this.bFlags[ 1 ] = this.makeCheckbox( id++ , x , y + 70 , 0 , "hoppers_output_invalid" );
|
||||
this.bFlags[ 2 ] = this.makeCheckbox( id++ , x , y + 85 , 0 , "hoppers_output_fuel" );
|
||||
this.bFlags[ 3 ] = this.makeCheckbox( id++ , x , y + 125 , 0 , "cmp_output" );
|
||||
this.bFlags[ 4 ] = this.makeCheckbox( id++ , x , y + 125 , 1 , "cmp_fuel" );
|
||||
this.bFlags[ 5 ] = this.makeCheckbox( id++ , x , y + 140 , 0 , "cmp_valid_input" );
|
||||
this.bFlags[ 6 ] = this.makeCheckbox( id++ , x , y + 140 , 1 , "cmp_invalid_input" );
|
||||
this.bFlags[ 7 ] = this.makeCheckbox( id++ , x , y + 155 , 0 , "cmp_alloying" );
|
||||
this.bFlags[ 8 ] = this.makeCheckbox( id++ , x , y + 155 , 1 , "cmp_burning" );
|
||||
}
|
||||
|
||||
this.bOutputInvalidInput = new GuiButton( 100 , x + 10 , y + 70 , this.parent.getXSize( ) - 20 , 20 , "" );
|
||||
this.buttons.add( this.bOutputInvalidInput );
|
||||
this.bOutputInvalidFuel = new GuiButton( 100 , x + 10 , y + 94 , this.parent.getXSize( ) - 20 , 20 , "" );
|
||||
this.buttons.add( this.bOutputInvalidFuel );
|
||||
|
||||
private GuiCheckBox makeCheckbox( final int id , final int x , final int y , final int column ,
|
||||
final String text )
|
||||
{
|
||||
final GuiCheckBox checkBox = new GuiCheckBox( id , x + 10 + column * ( this.parent.getXSize( ) / 2 - 8 ) ,
|
||||
y , I18n.format( "container.mmm.alloy_furnace.cfg." + text ) , false );
|
||||
checkBox.packedFGColour = 0xffffff;
|
||||
this.buttons.add( checkBox );
|
||||
return checkBox;
|
||||
}
|
||||
|
||||
|
||||
|
@ -248,10 +262,20 @@ public class TBAFGui
|
|||
public void drawBackground( final float partialTicks , final int mouseX , final int mouseY )
|
||||
{
|
||||
this.bActivationMode.displayString = this.getActivationText( );
|
||||
this.bInputInvalid.displayString = this.getInputHopperText( );
|
||||
this.bOutputInvalidInput.displayString = this.getOutputHopperInputText( );
|
||||
this.bOutputInvalidFuel.displayString = this.getOutputHopperFuelText( );
|
||||
|
||||
final int flags = ( (TBAFContainer) this.parent.container ).getFlags( );
|
||||
for ( int i = 0 ; i < this.bFlags.length ; i++ ) {
|
||||
this.bFlags[ i ].setIsChecked( ( flags & 1 << i ) != 0 );
|
||||
}
|
||||
|
||||
super.drawBackground( partialTicks , mouseX , mouseY );
|
||||
|
||||
final int x = ( this.parent.width - this.parent.getXSize( ) ) / 2;
|
||||
final int y = ( this.parent.height - this.parent.getYSize( ) ) / 2;
|
||||
this.drawString( this.parent.getFontRenderer( ) , I18n.format( "gui.mmm.configure.hoppers" ) , x + 10 ,
|
||||
y + 40 , 0xffffff );
|
||||
this.drawString( this.parent.getFontRenderer( ) , I18n.format( "gui.mmm.configure.comparator" ) , x + 10 ,
|
||||
y + 110 , 0xffffff );
|
||||
}
|
||||
|
||||
|
||||
|
@ -264,18 +288,13 @@ public class TBAFGui
|
|||
return true;
|
||||
}
|
||||
|
||||
if ( button == this.bInputInvalid ) {
|
||||
cont.setFlags( cont.getFlags( ) ^ TBAFTileEntity.F_IH_INVALID );
|
||||
return true;
|
||||
}
|
||||
|
||||
if ( button == this.bOutputInvalidInput ) {
|
||||
cont.setFlags( cont.getFlags( ) ^ TBAFTileEntity.F_OH_INVALID_INPUT );
|
||||
return true;
|
||||
}
|
||||
|
||||
if ( button == this.bOutputInvalidFuel ) {
|
||||
cont.setFlags( cont.getFlags( ) ^ TBAFTileEntity.F_OH_INVALID_FUEL );
|
||||
if ( button.id > 100 && button.id <= 100 + this.bFlags.length ) {
|
||||
final int flags = cont.getFlags( );
|
||||
if ( this.bFlags[ button.id - 101 ].isChecked( ) ) {
|
||||
cont.setFlags( flags | 1 << button.id - 101 );
|
||||
} else {
|
||||
cont.setFlags( flags & ~ ( 1 << button.id - 101 ) );
|
||||
}
|
||||
return true;
|
||||
}
|
||||
|
||||
|
@ -288,36 +307,6 @@ public class TBAFGui
|
|||
return I18n.format( ( (TBAFContainer) this.parent.container ).getActivationMode( ).getDisplayName( ) );
|
||||
}
|
||||
|
||||
|
||||
private String getInputHopperText( )
|
||||
{
|
||||
final boolean active = ( ( (TBAFContainer) this.parent.container ).getFlags( )
|
||||
& TBAFTileEntity.F_IH_INVALID ) != 0;
|
||||
return I18n.format( active
|
||||
? "container.mmm.alloy_furnace.cfg.ihinv.yes" //
|
||||
: "container.mmm.alloy_furnace.cfg.ihinv.no" );
|
||||
}
|
||||
|
||||
|
||||
private String getOutputHopperInputText( )
|
||||
{
|
||||
final boolean active = ( ( (TBAFContainer) this.parent.container ).getFlags( )
|
||||
& TBAFTileEntity.F_OH_INVALID_INPUT ) != 0;
|
||||
return I18n.format( active
|
||||
? "container.mmm.alloy_furnace.cfg.ohinvin.yes" //
|
||||
: "container.mmm.alloy_furnace.cfg.ohinvin.no" );
|
||||
}
|
||||
|
||||
|
||||
private String getOutputHopperFuelText( )
|
||||
{
|
||||
final boolean active = ( ( (TBAFContainer) this.parent.container ).getFlags( )
|
||||
& TBAFTileEntity.F_OH_INVALID_FUEL ) != 0;
|
||||
return I18n.format( active
|
||||
? "container.mmm.alloy_furnace.cfg.ohinvf.yes" //
|
||||
: "container.mmm.alloy_furnace.cfg.ohinvf.no" );
|
||||
}
|
||||
|
||||
}
|
||||
|
||||
private ArrayList< MAlloyRecipe > recipes;
|
||||
|
|
|
@ -35,9 +35,9 @@ public class TBAFMessage
|
|||
}
|
||||
|
||||
|
||||
public TBAFMessage( int flags )
|
||||
public TBAFMessage( final int flags )
|
||||
{
|
||||
this.type = MT_SET_FLAGS;
|
||||
this.type = TBAFMessage.MT_SET_FLAGS;
|
||||
this.flags = flags;
|
||||
}
|
||||
|
||||
|
@ -59,7 +59,7 @@ public class TBAFMessage
|
|||
break;
|
||||
|
||||
case MT_SET_FLAGS:
|
||||
this.flags = buf.readByte( );
|
||||
this.flags = buf.readShort( );
|
||||
break;
|
||||
|
||||
}
|
||||
|
@ -82,7 +82,7 @@ public class TBAFMessage
|
|||
break;
|
||||
|
||||
case MT_SET_FLAGS:
|
||||
buf.writeByte( this.flags );
|
||||
buf.writeShort( this.flags );
|
||||
break;
|
||||
|
||||
}
|
||||
|
@ -105,9 +105,9 @@ public class TBAFMessage
|
|||
case MT_SET_RECIPE:
|
||||
container.setCurrentRecipe( this.recipe , this.type == TBAFMessage.MT_SET_RECIPE );
|
||||
break;
|
||||
|
||||
|
||||
case MT_SET_FLAGS:
|
||||
container.setFlags( flags );
|
||||
container.setFlags( this.flags );
|
||||
break;
|
||||
|
||||
}
|
||||
|
|
|
@ -7,6 +7,7 @@ import mmm.tech.base.E_TBActivationMode;
|
|||
import mmm.tech.base.I_TBConfigurableActivation;
|
||||
import mmm.utils.UInventoryGrid;
|
||||
import net.minecraft.block.state.IBlockState;
|
||||
import net.minecraft.inventory.Container;
|
||||
import net.minecraft.item.ItemStack;
|
||||
import net.minecraft.nbt.NBTTagCompound;
|
||||
import net.minecraft.network.NetworkManager;
|
||||
|
@ -17,6 +18,7 @@ import net.minecraft.util.EnumFacing;
|
|||
import net.minecraft.util.ITickable;
|
||||
import net.minecraft.util.ResourceLocation;
|
||||
import net.minecraft.util.math.BlockPos;
|
||||
import net.minecraft.util.math.MathHelper;
|
||||
import net.minecraft.world.World;
|
||||
import net.minecraftforge.common.capabilities.Capability;
|
||||
import net.minecraftforge.common.util.Constants.NBT;
|
||||
|
@ -30,12 +32,60 @@ public class TBAFTileEntity
|
|||
extends TileEntity
|
||||
implements ITickable , I_TBConfigurableActivation
|
||||
{
|
||||
/** Output hopper collects invalid input? */
|
||||
public static final int F_OH_INVALID_INPUT = 1 << 0;
|
||||
/** Output hopper collects invalid fuel? */
|
||||
public static final int F_OH_INVALID_FUEL = 1 << 1;
|
||||
/** Input hopper allows invalid input? */
|
||||
public static final int F_IH_INVALID = 1 << 2;
|
||||
public static final int F_IH_INVALID = 1 << 0;
|
||||
/** Output hopper collects invalid input? */
|
||||
public static final int F_OH_INVALID_INPUT = 1 << 1;
|
||||
/** Output hopper collects invalid fuel? */
|
||||
public static final int F_OH_INVALID_FUEL = 1 << 2;
|
||||
/** Comparators check output? */
|
||||
public static final int F_CMP_OUTPUT = 1 << 3;
|
||||
/** Comparators check fuel? */
|
||||
public static final int F_CMP_FUEL = 1 << 4;
|
||||
/** Comparators check valid input? */
|
||||
public static final int F_CMP_INPUT_VALID = 1 << 5;
|
||||
/** Comparators check invalid input? */
|
||||
public static final int F_CMP_INPUT_INVALID = 1 << 6;
|
||||
/** Comparators check alloying progress? */
|
||||
public static final int F_CMP_ALLOYING = 1 << 7;
|
||||
/** Comparators check burn time? */
|
||||
public static final int F_CMP_BURN_TIME = 1 << 8;
|
||||
|
||||
private class Inventory
|
||||
extends UInventoryGrid
|
||||
{
|
||||
|
||||
public Inventory( final String name , final int width , final int height )
|
||||
{
|
||||
super( name , width , height );
|
||||
}
|
||||
|
||||
|
||||
@Override
|
||||
public void markDirty( )
|
||||
{
|
||||
TBAFTileEntity.this.forceUpdate( );
|
||||
}
|
||||
|
||||
}
|
||||
|
||||
private class FuelInventory
|
||||
extends Inventory
|
||||
{
|
||||
|
||||
public FuelInventory( final String name , final int width , final int height )
|
||||
{
|
||||
super( name , width , height );
|
||||
}
|
||||
|
||||
|
||||
@Override
|
||||
public boolean isItemValidForSlot( final int index , final ItemStack stack )
|
||||
{
|
||||
return super.isItemValidForSlot( index , stack ) && TileEntityFurnace.isItemFuel( stack );
|
||||
}
|
||||
|
||||
}
|
||||
|
||||
public final UInventoryGrid input;
|
||||
public final UInventoryGrid fuel;
|
||||
|
@ -58,20 +108,13 @@ public class TBAFTileEntity
|
|||
|
||||
public TBAFTileEntity( )
|
||||
{
|
||||
this.input = new UInventoryGrid( "Input" , 3 , 5 );
|
||||
this.fuel = new UInventoryGrid( "Fuel" , 2 , 2 ) {
|
||||
|
||||
@Override
|
||||
public boolean isItemValidForSlot( int index , ItemStack stack )
|
||||
{
|
||||
return super.isItemValidForSlot( index , stack ) && TileEntityFurnace.isItemFuel( stack );
|
||||
}
|
||||
|
||||
};
|
||||
this.output = new UInventoryGrid( "Output" , 2 , 5 );
|
||||
this.input = new Inventory( "Input" , 3 , 5 );
|
||||
this.fuel = new FuelInventory( "Fuel" , 2 , 2 );
|
||||
this.output = new Inventory( "Output" , 2 , 5 );
|
||||
this.recipe = MAlloyRecipe.REGISTRY.getRecipes( ).get( 0 );
|
||||
this.activationMode = E_TBActivationMode.ALWAYS_ACTIVE;
|
||||
this.flags = TBAFTileEntity.F_OH_INVALID_INPUT | TBAFTileEntity.F_OH_INVALID_FUEL;
|
||||
this.flags = TBAFTileEntity.F_OH_INVALID_INPUT | TBAFTileEntity.F_OH_INVALID_FUEL
|
||||
| TBAFTileEntity.F_CMP_INPUT_VALID;
|
||||
|
||||
this.inputHopper = new TBAFInputHopper( this );
|
||||
this.fuelHopper = new InvWrapper( this.fuel );
|
||||
|
@ -499,7 +542,7 @@ public class TBAFTileEntity
|
|||
this.activationMode = E_TBActivationMode.DISABLED;
|
||||
break;
|
||||
}
|
||||
this.flags = compound.getByte( "Flags" );
|
||||
this.flags = compound.getShort( "Flags" );
|
||||
|
||||
this.burnCurrent = compound.getInteger( "BurnCurrent" );
|
||||
this.burnTotal = compound.getInteger( "BurnTotal" );
|
||||
|
@ -522,7 +565,7 @@ public class TBAFTileEntity
|
|||
{
|
||||
compound.setString( "Recipe" , this.recipe.name.toString( ) );
|
||||
compound.setByte( "ActivationMode" , (byte) this.activationMode.ordinal( ) );
|
||||
compound.setByte( "Flags" , (byte) this.flags );
|
||||
compound.setShort( "Flags" , (short) this.flags );
|
||||
if ( this.alloying != null ) {
|
||||
compound.setString( "AlloyRecipe" , this.alloying.name.toString( ) );
|
||||
compound.setInteger( "AlloyCurrent" , this.alloyCurrent );
|
||||
|
@ -533,4 +576,78 @@ public class TBAFTileEntity
|
|||
}
|
||||
}
|
||||
|
||||
|
||||
public int getComparatorValue( )
|
||||
{
|
||||
int nValues = 0;
|
||||
int total = 0;
|
||||
|
||||
if ( ( this.flags & TBAFTileEntity.F_CMP_OUTPUT ) != 0 ) {
|
||||
nValues++;
|
||||
total += Container.calcRedstoneFromInventory( this.output );
|
||||
}
|
||||
|
||||
if ( ( this.flags & TBAFTileEntity.F_CMP_FUEL ) != 0 ) {
|
||||
nValues++;
|
||||
total += Container.calcRedstoneFromInventory( this.fuel );
|
||||
}
|
||||
|
||||
if ( ( this.flags & ( TBAFTileEntity.F_CMP_INPUT_INVALID | TBAFTileEntity.F_CMP_INPUT_VALID ) ) != 0 ) {
|
||||
int validInput = 0 , invalidInput = 0;
|
||||
float validInputSum = 0f , invalidInputSum = 0f;
|
||||
for ( int i = 0 ; i < this.input.slotsCount ; i++ ) {
|
||||
final ItemStack stack = this.input.getStackInSlot( i );
|
||||
if ( stack == null ) {
|
||||
continue;
|
||||
}
|
||||
final float value = stack.stackSize / (float) Math.min( this.input.getInventoryStackLimit( ) , //
|
||||
stack.getMaxStackSize( ) );
|
||||
if ( this.recipe.hasInput( stack ) ) {
|
||||
validInput++;
|
||||
validInputSum += value;
|
||||
} else {
|
||||
invalidInput++;
|
||||
invalidInputSum += value;
|
||||
}
|
||||
}
|
||||
if ( ( this.flags & TBAFTileEntity.F_CMP_INPUT_VALID ) != 0 ) {
|
||||
validInputSum /= this.input.slotsCount;
|
||||
total += MathHelper.floor_float( validInputSum * 14F ) + ( validInput > 0 ? 1 : 0 );
|
||||
nValues++;
|
||||
}
|
||||
if ( ( this.flags & TBAFTileEntity.F_CMP_INPUT_INVALID ) != 0 ) {
|
||||
invalidInputSum /= this.input.slotsCount;
|
||||
total += MathHelper.floor_float( invalidInputSum * 14F ) + ( invalidInput > 0 ? 1 : 0 );
|
||||
nValues++;
|
||||
}
|
||||
}
|
||||
|
||||
if ( ( this.flags & TBAFTileEntity.F_CMP_ALLOYING ) != 0 ) {
|
||||
nValues++;
|
||||
if ( this.alloying != null ) {
|
||||
int t = this.alloying.burnTime;
|
||||
if ( t == 0 ) {
|
||||
t = 200;
|
||||
}
|
||||
total += 1 + Math.min( 14 , ( t - this.alloyCurrent ) * 14 / t );
|
||||
}
|
||||
}
|
||||
|
||||
if ( ( this.flags & TBAFTileEntity.F_CMP_BURN_TIME ) != 0 ) {
|
||||
nValues++;
|
||||
if ( this.isBurning( ) ) {
|
||||
int t = this.burnTotal;
|
||||
if ( t == 0 ) {
|
||||
t = 200;
|
||||
}
|
||||
total += 1 + Math.min( 14 , ( t - this.burnCurrent ) * 14 / t );
|
||||
}
|
||||
}
|
||||
|
||||
if ( nValues == 0 ) {
|
||||
return 0;
|
||||
}
|
||||
final float ratio = total / ( 15.0f * nValues );
|
||||
return MathHelper.floor_float( ratio * 14.0f ) + ( total == 0 ? 0 : 1 );
|
||||
}
|
||||
}
|
||||
|
|
|
@ -1,5 +1,6 @@
|
|||
gui.mmm.configure=Configure
|
||||
|
||||
gui.mmm.configure.hoppers=Hoppers
|
||||
gui.mmm.configure.comparator=Comparator Output
|
||||
|
||||
|
||||
item.mmm.materials.stone.coke.name=Coke
|
||||
|
@ -25,12 +26,15 @@ item.mmm.tech.base.alloy_furnace.name=Alloy Furnace
|
|||
container.mmm.alloy_furnace.contents=Furnace Contents
|
||||
container.mmm.alloy_furnace.recipe=Alloy Selection
|
||||
container.mmm.alloy_furnace.select=Select Alloy
|
||||
container.mmm.alloy_furnace.cfg.ihinv.yes=Allow invalid hopper input
|
||||
container.mmm.alloy_furnace.cfg.ihinv.no=Block invalid hopper input
|
||||
container.mmm.alloy_furnace.cfg.ohinvin.yes=Remove invalid input
|
||||
container.mmm.alloy_furnace.cfg.ohinvin.no=Keep invalid input
|
||||
container.mmm.alloy_furnace.cfg.ohinvf.yes=Remove spent fuel buckets
|
||||
container.mmm.alloy_furnace.cfg.ohinvf.no=Keep spent fuel buckets
|
||||
container.mmm.alloy_furnace.cfg.hoppers_input_invalid=Allow invalid input
|
||||
container.mmm.alloy_furnace.cfg.hoppers_output_invalid=Remove invalid input
|
||||
container.mmm.alloy_furnace.cfg.hoppers_output_fuel=Remove spent fuel buckets
|
||||
container.mmm.alloy_furnace.cfg.cmp_output=Output
|
||||
container.mmm.alloy_furnace.cfg.cmp_fuel=Fuel
|
||||
container.mmm.alloy_furnace.cfg.cmp_valid_input=Valid Input
|
||||
container.mmm.alloy_furnace.cfg.cmp_invalid_input=Invalid Input
|
||||
container.mmm.alloy_furnace.cfg.cmp_alloying=Alloying Time
|
||||
container.mmm.alloy_furnace.cfg.cmp_burning=Burn Time
|
||||
|
||||
|
||||
item.mmm.tech.tools.copper.shovel.name=Copper Shovel
|
||||
|
|
Reference in a new issue