Compare commits

..

2 Commits

Author SHA1 Message Date
PrototypeTrousers e09f74cb5f 2 2021-08-14 00:09:32 -03:00
PrototypeTrousers facc1b4ef4 prevent crafting job to be fired if its a pattern failed previously till
the lack of ingredient that caused the failure is satisfied
2021-08-13 22:50:14 -03:00
1123 changed files with 107065 additions and 92662 deletions
+1 -1
View File
@@ -57,7 +57,7 @@ tasks.withType(JavaCompile) {
options.encoding = 'UTF-8' options.encoding = 'UTF-8'
} }
version = aeversion + "-" + aechannel + "-" + aebuild + "-" + extended + "-" + extendedversion version = aeversion + "-" + aechannel + "-" + aebuild + " " + trousers
group = aegroup group = aegroup
archivesBaseName = aebasename archivesBaseName = aebasename
+5 -4
View File
@@ -3,18 +3,20 @@ aechannel=stable
aebuild=7 aebuild=7
aegroup=appeng aegroup=appeng
aebasename=appliedenergistics2 aebasename=appliedenergistics2
extended=extended_life trousers=omni-fixes-v47
extendedversion=v0.53.8
######################################################### #########################################################
# Versions # # Versions #
######################################################### #########################################################
minecraft_version=1.12.2 minecraft_version=1.12.2
mcp_mappings=snapshot_20171003 mcp_mappings=snapshot_20171003
forge_version=14.23.5.2847 forge_version=14.23.5.2847
######################################################### #########################################################
# Installable # # Installable #
######################################################### #########################################################
hwyla_version=1.8.26-B41_1.12.2 hwyla_version=1.8.26-B41_1.12.2
######################################################### #########################################################
# Provided APIs # # Provided APIs #
######################################################### #########################################################
@@ -25,9 +27,8 @@ top_version=1.12-1.4.23-16
cofhcore_version=1.12.2-4.5.2.19 cofhcore_version=1.12.2-4.5.2.19
crafttweaker_version=4.1.8.9 crafttweaker_version=4.1.8.9
inventorytweaks_version=1.63 inventorytweaks_version=1.63
bogosorter_version=1.1.0
ctm_version=MC1.12.2-0.3.1.16 ctm_version=MC1.12.2-0.3.1.16
forestry_version=5.8.2.387
######################################################### #########################################################
# Deployment # # Deployment #
######################################################### #########################################################
+8 -10
View File
@@ -31,7 +31,7 @@ repositories {
maven { maven {
name = "Tesla repo" name = "Tesla repo"
url "https://maven.mcmoddev.com" url "http://maven.mcmoddev.com"
} }
maven { maven {
@@ -59,7 +59,7 @@ repositories {
url "http://maven.k-4u.nl/" url "http://maven.k-4u.nl/"
} }
maven { // CraftTweaker maven { // CraftTweaker
name 'jared maven' name 'jared maven'
url "http://maven.blamejared.com/" url "http://maven.blamejared.com/"
} }
@@ -70,9 +70,9 @@ repositories {
//} //}
maven { maven {
name = "CurseForge" name = "CurseForge"
url = "https://minecraft.curseforge.com/api/maven/" url = "https://minecraft.curseforge.com/api/maven/"
} }
} }
configurations { configurations {
@@ -80,7 +80,8 @@ configurations {
} }
dependencies { dependencies {
deobfCompile "gregtechce:gregtech:1.12.2:1.15.1.735" compileOnly "gregtechce:gregtech:1.12.2:1.15.1.735"
// installable runtime dependencies // installable runtime dependencies
mods "mcp.mobius.waila:Hwyla:${hwyla_version}" mods "mcp.mobius.waila:Hwyla:${hwyla_version}"
mods "net.industrial-craft:industrialcraft-2:${ic2_version}:dev" mods "net.industrial-craft:industrialcraft-2:${ic2_version}:dev"
@@ -94,12 +95,9 @@ dependencies {
compileOnly "mcjty.theoneprobe:TheOneProbe-1.12:${top_version}:api" compileOnly "mcjty.theoneprobe:TheOneProbe-1.12:${top_version}:api"
compileOnly "cofh:CoFHCore:${cofhcore_version}:deobf" compileOnly "cofh:CoFHCore:${cofhcore_version}:deobf"
compileOnly "CraftTweaker2:CraftTweaker2-API:${crafttweaker_version}" compileOnly "CraftTweaker2:CraftTweaker2-API:${crafttweaker_version}"
compileOnly "inventory-tweaks:InventoryTweaks:${inventorytweaks_version}:api" compileOnly "inventory-tweaks:InventoryTweaks:${inventorytweaks_version}:api"
compileOnly "inventory-bogo-sorter:bogosorter:${bogosorter_version}"
compileOnly "team.chisel.ctm:CTM:${ctm_version}" compileOnly "team.chisel.ctm:CTM:${ctm_version}"
compileOnly "de.ellpeck.actuallyadditions:ActuallyAdditions:1.12.2-r152.16:api" compileOnly "de.ellpeck.actuallyadditions:ActuallyAdditions:1.12.2-r152.16:api"
deobfCompile "net.sengir.forestry:forestry_${minecraft_version}:$forestry_version"
// at runtime, use the full JEI jar // at runtime, use the full JEI jar
runtime "mezz.jei:jei_${minecraft_version}:${jei_version}" runtime "mezz.jei:jei_${minecraft_version}:${jei_version}"
@@ -28,8 +28,7 @@ public enum PowerUnits
{ {
AE( "gui.appliedenergistics2.units.appliedenergstics" ), // Native Units - AE Energy AE( "gui.appliedenergistics2.units.appliedenergstics" ), // Native Units - AE Energy
EU( "gui.appliedenergistics2.units.ic2" ), // IndustrialCraft 2 - Energy Units EU( "gui.appliedenergistics2.units.ic2" ), // IndustrialCraft 2 - Energy Units
RF( "gui.appliedenergistics2.units.rf" ), // RF - Redstone Flux RF( "gui.appliedenergistics2.units.rf" ); // RF - Redstone Flux
GTEU( "gui.appliedenergistics2.units.gteu" ); // RF - Redstone Flux
/** /**
* unlocalized name for the power unit. * unlocalized name for the power unit.
@@ -47,13 +46,14 @@ public enum PowerUnits
/** /**
* do power conversion using AE's conversion rates. * do power conversion using AE's conversion rates.
* <p> *
* Example: PowerUnits.EU.convertTo( PowerUnits.AE, 32 ); * Example: PowerUnits.EU.convertTo( PowerUnits.AE, 32 );
* <p> *
* will normally returns 64, as it will convert the EU, to AE with AE's power settings. * will normally returns 64, as it will convert the EU, to AE with AE's power settings.
* *
* @param target target power unit * @param target target power unit
* @param value value * @param value value
*
* @return value converted to target units, from this units. * @return value converted to target units, from this units.
*/ */
public double convertTo( final PowerUnits target, final double value ) public double convertTo( final PowerUnits target, final double value )
@@ -29,7 +29,6 @@ public enum TunnelType
ME, // Network Tunnel ME, // Network Tunnel
IC2_POWER, // EU Tunnel IC2_POWER, // EU Tunnel
FE_POWER, // Forge Energy tunnel FE_POWER, // Forge Energy tunnel
GTEU_POWER, // Forge Energy tunnel
REDSTONE, // Redstone Tunnel REDSTONE, // Redstone Tunnel
FLUID, // Fluid Tunnel FLUID, // Fluid Tunnel
ITEM, // Item Tunnel ITEM, // Item Tunnel
+48 -57
View File
@@ -30,106 +30,97 @@ import appeng.api.util.AEColoredItemDefinition;
/** /**
* A list of all parts in AE * A list of all parts in AE
*/ */
public interface IParts { public interface IParts
AEColoredItemDefinition cableSmart(); {
AEColoredItemDefinition cableSmart();
AEColoredItemDefinition cableCovered(); AEColoredItemDefinition cableCovered();
AEColoredItemDefinition cableGlass(); AEColoredItemDefinition cableGlass();
AEColoredItemDefinition cableDenseCovered(); AEColoredItemDefinition cableDenseCovered();
AEColoredItemDefinition cableDenseSmart(); AEColoredItemDefinition cableDenseSmart();
AEColoredItemDefinition lumenCableSmart(); AEColoredItemDefinition lumenCableSmart();
AEColoredItemDefinition lumenCableCovered(); AEColoredItemDefinition lumenCableCovered();
AEColoredItemDefinition lumenCableGlass(); AEColoredItemDefinition lumenCableGlass();
AEColoredItemDefinition lumenDenseCableSmart(); AEColoredItemDefinition lumenDenseCableSmart();
IItemDefinition quartzFiber(); IItemDefinition quartzFiber();
IItemDefinition toggleBus(); IItemDefinition toggleBus();
IItemDefinition invertedToggleBus(); IItemDefinition invertedToggleBus();
IItemDefinition storageBus(); IItemDefinition storageBus();
IItemDefinition oreDictStorageBus(); IItemDefinition importBus();
IItemDefinition importBus(); IItemDefinition exportBus();
IItemDefinition exportBus(); IItemDefinition iface();
IItemDefinition iface(); IItemDefinition fluidIface();
IItemDefinition fluidIface(); IItemDefinition levelEmitter();
IItemDefinition levelEmitter(); IItemDefinition annihilationPlane();
IItemDefinition annihilationPlane(); IItemDefinition identityAnnihilationPlane();
IItemDefinition identityAnnihilationPlane(); IItemDefinition formationPlane();
IItemDefinition formationPlane(); IItemDefinition p2PTunnelME();
IItemDefinition p2PTunnelME(); IItemDefinition p2PTunnelRedstone();
IItemDefinition p2PTunnelRedstone(); IItemDefinition p2PTunnelItems();
IItemDefinition p2PTunnelItems(); IItemDefinition p2PTunnelFluids();
IItemDefinition p2PTunnelFluids(); IItemDefinition p2PTunnelEU();
IItemDefinition p2PTunnelEU(); IItemDefinition p2PTunnelFE();
IItemDefinition p2PTunnelFE(); IItemDefinition p2PTunnelLight();
IItemDefinition p2PTunnelGTEU(); // IItemDefinition p2PTunnelOpenComputers();
IItemDefinition p2PTunnelLight(); IItemDefinition cableAnchor();
// IItemDefinition p2PTunnelOpenComputers(); IItemDefinition monitor();
IItemDefinition cableAnchor(); IItemDefinition semiDarkMonitor();
IItemDefinition monitor(); IItemDefinition darkMonitor();
IItemDefinition semiDarkMonitor(); IItemDefinition interfaceTerminal();
IItemDefinition darkMonitor(); IItemDefinition patternTerminal();
IItemDefinition interfaceTerminal(); IItemDefinition craftingTerminal();
IItemDefinition patternTerminal(); IItemDefinition terminal();
IItemDefinition expandedProcessingPatternTerminal(); IItemDefinition storageMonitor();
IItemDefinition interfaceConfigurationTerminal(); IItemDefinition conversionMonitor();
IItemDefinition fluidInterfaceConfigurationTerminal(); IItemDefinition fluidTerminal();
IItemDefinition craftingTerminal(); IItemDefinition fluidImportBus();
IItemDefinition terminal(); IItemDefinition fluidExportBus();
IItemDefinition storageMonitor(); IItemDefinition fluidStorageBus();
IItemDefinition conversionMonitor(); IItemDefinition fluidLevelEmitter();
IItemDefinition fluidTerminal(); IItemDefinition fluidAnnihilationPlane();
IItemDefinition fluidImportBus(); IItemDefinition fluidFormationnPlane();
IItemDefinition fluidExportBus();
IItemDefinition fluidStorageBus();
IItemDefinition fluidLevelEmitter();
IItemDefinition fluidAnnihilationPlane();
IItemDefinition fluidFormationnPlane();
} }
@@ -28,8 +28,6 @@ import appeng.api.networking.security.IActionSource;
import appeng.api.networking.storage.IBaseMonitor; import appeng.api.networking.storage.IBaseMonitor;
import appeng.api.storage.data.IAEItemStack; import appeng.api.storage.data.IAEItemStack;
import javax.annotation.Nullable;
public interface ICraftingCPU extends IBaseMonitor<IAEItemStack> public interface ICraftingCPU extends IBaseMonitor<IAEItemStack>
{ {
@@ -58,30 +56,4 @@ public interface ICraftingCPU extends IBaseMonitor<IAEItemStack>
* @return an empty string or the name of the cpu. * @return an empty string or the name of the cpu.
*/ */
String getName(); String getName();
/**
* @return final output of the current crafting operation, or null if not crafting
*/
@Nullable
default IAEItemStack getFinalOutput()
{
return null;
}
/**
* @return remaining count of items (or other units of processing) for the current crafting job
*/
default long getRemainingItemCount()
{
return 0;
}
/**
* @return total count of items (or other units of processing) for the current crafting job
*/
default long getStartItemCount()
{
return 0;
}
} }
@@ -119,10 +119,6 @@ public interface IAEItemStack extends IAEStack<IAEItemStack>
* *
* @param is An item stack * @param is An item stack
*/ */
boolean equals( ItemStack is ); boolean equals(ItemStack is);
ItemStack getCachedItemStack( long stackSize );
void setCachedItemStack( ItemStack is );
} }
@@ -39,7 +39,7 @@ import appeng.api.storage.IStorageChannel;
* - For fluids: AEApi.instance().storage().getStorageChannel( IFluidStorageChannel.class).createList() * - For fluids: AEApi.instance().storage().getStorageChannel( IFluidStorageChannel.class).createList()
* - Replace with the corresponding {@link IStorageChannel} type for non native channels * - Replace with the corresponding {@link IStorageChannel} type for non native channels
*/ */
public interface IItemList<T extends IAEStack<T>> extends IItemContainer<T>, Iterable<T>, Cloneable public interface IItemList<T extends IAEStack<T>> extends IItemContainer<T>, Iterable<T>
{ {
/** /**
@@ -85,9 +85,4 @@ public interface IItemList<T extends IAEStack<T>> extends IItemContainer<T>, Ite
* resets stack sizes to 0. * resets stack sizes to 0.
*/ */
void resetStatus(); void resetStatus();
/**
* create a copy of this list.
*/
IItemList<T> clone();
} }
+464 -379
View File
@@ -19,12 +19,11 @@
package appeng.block; package appeng.block;
import appeng.api.util.IOrientable; import java.util.ArrayList;
import appeng.api.util.IOrientableBlock; import java.util.List;
import appeng.helpers.AEGlassMaterial;
import appeng.helpers.ICustomCollision; import javax.annotation.Nullable;
import appeng.util.LookDirection;
import appeng.util.Platform;
import net.minecraft.block.Block; import net.minecraft.block.Block;
import net.minecraft.block.SoundType; import net.minecraft.block.SoundType;
import net.minecraft.block.material.Material; import net.minecraft.block.material.Material;
@@ -47,378 +46,464 @@ import net.minecraft.world.World;
import net.minecraftforge.fml.relauncher.Side; import net.minecraftforge.fml.relauncher.Side;
import net.minecraftforge.fml.relauncher.SideOnly; import net.minecraftforge.fml.relauncher.SideOnly;
import javax.annotation.Nullable; import appeng.api.util.IOrientable;
import java.util.ArrayList; import appeng.api.util.IOrientableBlock;
import java.util.List; import appeng.helpers.AEGlassMaterial;
import appeng.helpers.ICustomCollision;
import appeng.util.LookDirection;
public abstract class AEBaseBlock extends Block { import appeng.util.Platform;
private boolean isOpaque = true;
private boolean isFullSize = true; public abstract class AEBaseBlock extends Block
private boolean hasSubtypes = false; {
private boolean isInventory = false;
private boolean isOpaque = true;
protected AxisAlignedBB boundingBox = FULL_BLOCK_AABB; private boolean isFullSize = true;
private boolean hasSubtypes = false;
protected AEBaseBlock(final Material mat) { private boolean isInventory = false;
super(mat);
protected AxisAlignedBB boundingBox = FULL_BLOCK_AABB;
if (mat == AEGlassMaterial.INSTANCE || mat == Material.GLASS) {
this.setSoundType(SoundType.GLASS); protected AEBaseBlock( final Material mat )
} else if (mat == Material.ROCK) { {
this.setSoundType(SoundType.STONE); super( mat );
} else if (mat == Material.WOOD) {
this.setSoundType(SoundType.WOOD); if( mat == AEGlassMaterial.INSTANCE || mat == Material.GLASS )
} else { {
this.setSoundType(SoundType.METAL); this.setSoundType( SoundType.GLASS );
} }
else if( mat == Material.ROCK )
this.setLightOpacity(255); {
this.setLightLevel(0); this.setSoundType( SoundType.STONE );
this.setHardness(2.2F); }
this.setHarvestLevel("pickaxe", 0); else if( mat == Material.WOOD )
{
// Workaround as vanilla sets it way too early. this.setSoundType( SoundType.WOOD );
this.fullBlock = this.isFullSize(); }
} else
{
@Override this.setSoundType( SoundType.METAL );
protected BlockStateContainer createBlockState() { }
return new BlockStateContainer(this, this.getAEStates());
} this.setLightOpacity( 255 );
this.setLightLevel( 0 );
@Override this.setHardness( 2.2F );
public final boolean isNormalCube(IBlockState state) { this.setHarvestLevel( "pickaxe", 0 );
return this.isFullSize() && this.isOpaque();
} // Workaround as vanilla sets it way too early.
this.fullBlock = this.isFullSize();
@Override }
public AxisAlignedBB getBoundingBox(IBlockState state, IBlockAccess source, BlockPos pos) {
return this.boundingBox; @Override
} protected BlockStateContainer createBlockState()
{
@SuppressWarnings("deprecation") return new BlockStateContainer( this, this.getAEStates() );
@Override }
public void addCollisionBoxToList(final IBlockState state, final World w, final BlockPos pos, final AxisAlignedBB bb, final List<AxisAlignedBB> out, @Nullable final Entity e, boolean p_185477_7_) {
final ICustomCollision collisionHandler = this.getCustomCollision(w, pos); @Override
public final boolean isNormalCube( IBlockState state )
if (collisionHandler != null && bb != null) { {
final List<AxisAlignedBB> tmp = new ArrayList<>(); return this.isFullSize() && this.isOpaque();
collisionHandler.addCollidingBlockToList(w, pos, bb, tmp, e); }
for (final AxisAlignedBB b : tmp) {
final AxisAlignedBB offset = b.offset(pos.getX(), pos.getY(), pos.getZ()); @Override
if (bb.intersects(offset)) { public AxisAlignedBB getBoundingBox( IBlockState state, IBlockAccess source, BlockPos pos )
out.add(offset); {
} return this.boundingBox;
} }
} else {
super.addCollisionBoxToList(state, w, pos, bb, out, e, p_185477_7_); @SuppressWarnings( "deprecation" )
} @Override
} public void addCollisionBoxToList( final IBlockState state, final World w, final BlockPos pos, final AxisAlignedBB bb, final List<AxisAlignedBB> out, @Nullable final Entity e, boolean p_185477_7_ )
{
@SuppressWarnings("deprecation") final ICustomCollision collisionHandler = this.getCustomCollision( w, pos );
@Override
@SideOnly(Side.CLIENT) if( collisionHandler != null && bb != null )
public AxisAlignedBB getSelectedBoundingBox(IBlockState state, final World w, final BlockPos pos) { {
final ICustomCollision collisionHandler = this.getCustomCollision(w, pos); final List<AxisAlignedBB> tmp = new ArrayList<>();
collisionHandler.addCollidingBlockToList( w, pos, bb, tmp, e );
if (collisionHandler != null) { for( final AxisAlignedBB b : tmp )
if (Platform.isClient()) { {
final EntityPlayer player = Minecraft.getMinecraft().player; final AxisAlignedBB offset = b.offset( pos.getX(), pos.getY(), pos.getZ() );
final LookDirection ld = Platform.getPlayerRay(player, Platform.getEyeOffset(player)); if( bb.intersects( offset ) )
{
final Iterable<AxisAlignedBB> bbs = collisionHandler.getSelectedBoundingBoxesFromPool(w, pos, Minecraft.getMinecraft().player, true); out.add( offset );
AxisAlignedBB br = null; }
}
double lastDist = 0; }
else
for (final AxisAlignedBB bb : bbs) { {
this.boundingBox = bb; super.addCollisionBoxToList( state, w, pos, bb, out, e, p_185477_7_ );
}
final RayTraceResult r = super.collisionRayTrace(state, w, pos, ld.getA(), ld.getB()); }
this.boundingBox = FULL_BLOCK_AABB; @SuppressWarnings( "deprecation" )
@Override
if (r != null) { @SideOnly( Side.CLIENT )
final double xLen = (ld.getA().x - r.hitVec.x); public AxisAlignedBB getSelectedBoundingBox( IBlockState state, final World w, final BlockPos pos )
final double yLen = (ld.getA().y - r.hitVec.y); {
final double zLen = (ld.getA().z - r.hitVec.z); final ICustomCollision collisionHandler = this.getCustomCollision( w, pos );
final double thisDist = xLen * xLen + yLen * yLen + zLen * zLen; if( collisionHandler != null )
{
if (br == null || lastDist > thisDist) { if( Platform.isClient() )
lastDist = thisDist; {
br = bb; final EntityPlayer player = Minecraft.getMinecraft().player;
} final LookDirection ld = Platform.getPlayerRay( player, Platform.getEyeOffset( player ) );
}
} final Iterable<AxisAlignedBB> bbs = collisionHandler.getSelectedBoundingBoxesFromPool( w, pos, Minecraft.getMinecraft().player, true );
AxisAlignedBB br = null;
if (br != null) {
br = new AxisAlignedBB(br.minX + pos.getX(), br.minY + pos.getY(), br.minZ + pos.getZ(), br.maxX + pos.getX(), br.maxY + pos double lastDist = 0;
.getY(), br.maxZ + pos.getZ());
return br; for( final AxisAlignedBB bb : bbs )
} {
} this.boundingBox = bb;
AxisAlignedBB b = null; // new AxisAlignedBB( 16d, 16d, 16d, 0d, 0d, 0d ); final RayTraceResult r = super.collisionRayTrace( state, w, pos, ld.getA(), ld.getB() );
for (final AxisAlignedBB bx : collisionHandler.getSelectedBoundingBoxesFromPool(w, pos, null, false)) { this.boundingBox = FULL_BLOCK_AABB;
if (b == null) {
b = bx; if( r != null )
continue; {
} final double xLen = ( ld.getA().x - r.hitVec.x );
final double yLen = ( ld.getA().y - r.hitVec.y );
final double minX = Math.min(b.minX, bx.minX); final double zLen = ( ld.getA().z - r.hitVec.z );
final double minY = Math.min(b.minY, bx.minY);
final double minZ = Math.min(b.minZ, bx.minZ); final double thisDist = xLen * xLen + yLen * yLen + zLen * zLen;
final double maxX = Math.max(b.maxX, bx.maxX);
final double maxY = Math.max(b.maxY, bx.maxY); if( br == null || lastDist > thisDist )
final double maxZ = Math.max(b.maxZ, bx.maxZ); {
lastDist = thisDist;
b = new AxisAlignedBB(minX, minY, minZ, maxX, maxY, maxZ); br = bb;
} }
}
if (b == null) { }
b = new AxisAlignedBB(16d, 16d, 16d, 0d, 0d, 0d);
} else { if( br != null )
b = new AxisAlignedBB(b.minX + pos.getX(), b.minY + pos.getY(), b.minZ + pos.getZ(), b.maxX + pos.getX(), b.maxY + pos.getY(), b.maxZ + pos {
.getZ()); br = new AxisAlignedBB( br.minX + pos.getX(), br.minY + pos.getY(), br.minZ + pos.getZ(), br.maxX + pos.getX(), br.maxY + pos
} .getY(), br.maxZ + pos.getZ() );
return br;
return b; }
} }
return super.getSelectedBoundingBox(state, w, pos); AxisAlignedBB b = null; // new AxisAlignedBB( 16d, 16d, 16d, 0d, 0d, 0d );
}
for( final AxisAlignedBB bx : collisionHandler.getSelectedBoundingBoxesFromPool( w, pos, null, false ) )
@Override {
public final boolean isOpaqueCube(IBlockState state) { if( b == null )
return this.isOpaque(); {
} b = bx;
continue;
@SuppressWarnings("deprecation") }
@Override
public RayTraceResult collisionRayTrace(final IBlockState state, final World w, final BlockPos pos, final Vec3d a, final Vec3d b) { final double minX = Math.min( b.minX, bx.minX );
final ICustomCollision collisionHandler = this.getCustomCollision(w, pos); final double minY = Math.min( b.minY, bx.minY );
final double minZ = Math.min( b.minZ, bx.minZ );
if (collisionHandler != null) { final double maxX = Math.max( b.maxX, bx.maxX );
final Iterable<AxisAlignedBB> bbs = collisionHandler.getSelectedBoundingBoxesFromPool(w, pos, null, true); final double maxY = Math.max( b.maxY, bx.maxY );
RayTraceResult br = null; final double maxZ = Math.max( b.maxZ, bx.maxZ );
double lastDist = 0; b = new AxisAlignedBB( minX, minY, minZ, maxX, maxY, maxZ );
}
for (final AxisAlignedBB bb : bbs) {
this.boundingBox = bb; if( b == null )
{
final RayTraceResult r = super.collisionRayTrace(state, w, pos, a, b); b = new AxisAlignedBB( 16d, 16d, 16d, 0d, 0d, 0d );
}
this.boundingBox = FULL_BLOCK_AABB; else
{
if (r != null) { b = new AxisAlignedBB( b.minX + pos.getX(), b.minY + pos.getY(), b.minZ + pos.getZ(), b.maxX + pos.getX(), b.maxY + pos.getY(), b.maxZ + pos
final double xLen = (a.x - r.hitVec.x); .getZ() );
final double yLen = (a.y - r.hitVec.y); }
final double zLen = (a.z - r.hitVec.z);
return b;
final double thisDist = xLen * xLen + yLen * yLen + zLen * zLen; }
if (br == null || lastDist > thisDist) {
lastDist = thisDist; return super.getSelectedBoundingBox( state, w, pos );
br = r; }
}
} @Override
} public final boolean isOpaqueCube( IBlockState state )
{
return br; return this.isOpaque();
} }
this.boundingBox = FULL_BLOCK_AABB; @SuppressWarnings( "deprecation" )
return super.collisionRayTrace(state, w, pos, a, b); @Override
} public RayTraceResult collisionRayTrace( final IBlockState state, final World w, final BlockPos pos, final Vec3d a, final Vec3d b )
{
@Override final ICustomCollision collisionHandler = this.getCustomCollision( w, pos );
public boolean hasComparatorInputOverride(IBlockState state) {
return this.isInventory(); if( collisionHandler != null )
} {
final Iterable<AxisAlignedBB> bbs = collisionHandler.getSelectedBoundingBoxesFromPool( w, pos, null, true );
@Override RayTraceResult br = null;
public int getComparatorInputOverride(IBlockState state, final World worldIn, final BlockPos pos) {
return 0; double lastDist = 0;
}
for( final AxisAlignedBB bb : bbs )
@Override {
public final boolean isNormalCube(IBlockState state, final IBlockAccess world, final BlockPos pos) { this.boundingBox = bb;
return this.isFullSize();
} final RayTraceResult r = super.collisionRayTrace( state, w, pos, a, b );
@Override this.boundingBox = FULL_BLOCK_AABB;
public boolean rotateBlock(final World w, final BlockPos pos, final EnumFacing axis) {
final IOrientable rotatable = this.getOrientable(w, pos); if( r != null )
{
if (rotatable != null && rotatable.canBeRotated()) { final double xLen = ( a.x - r.hitVec.x );
if (this.hasCustomRotation()) { final double yLen = ( a.y - r.hitVec.y );
this.customRotateBlock(rotatable, axis); final double zLen = ( a.z - r.hitVec.z );
return true;
} else { final double thisDist = xLen * xLen + yLen * yLen + zLen * zLen;
EnumFacing forward = rotatable.getForward(); if( br == null || lastDist > thisDist )
EnumFacing up = rotatable.getUp(); {
lastDist = thisDist;
for (int rs = 0; rs < 4; rs++) { br = r;
forward = Platform.rotateAround(forward, axis); }
up = Platform.rotateAround(up, axis); }
}
if (this.isValidOrientation(w, pos, forward, up)) {
rotatable.setOrientation(forward, up); if( br != null )
return true; {
} return br;
} }
}
} return null;
}
return super.rotateBlock(w, pos, axis);
} this.boundingBox = FULL_BLOCK_AABB;
return super.collisionRayTrace( state, w, pos, a, b );
@Override }
public EnumFacing[] getValidRotations(final World w, final BlockPos pos) {
return new EnumFacing[0]; @Override
} public boolean hasComparatorInputOverride( IBlockState state )
{
@SideOnly(Side.CLIENT) return this.isInventory();
@Override }
public void addInformation(final ItemStack is, final World world, final List<String> lines, final ITooltipFlag advancedItemTooltips) {
@Override
} public int getComparatorInputOverride( IBlockState state, final World worldIn, final BlockPos pos )
{
public boolean onActivated(final World w, final BlockPos pos, final EntityPlayer player, final EnumHand hand, final @Nullable ItemStack heldItem, final EnumFacing side, final float hitX, final float hitY, final float hitZ) { return 0;
return false; }
}
@Override
public final EnumFacing mapRotation(final IOrientable ori, final EnumFacing dir) { public final boolean isNormalCube( IBlockState state, final IBlockAccess world, final BlockPos pos )
// case DOWN: return bottomIcon; {
// case UP: return blockIcon; return this.isFullSize();
// case NORTH: return northIcon; }
// case SOUTH: return southIcon;
// case WEST: return sideIcon; @Override
// case EAST: return sideIcon; public boolean rotateBlock( final World w, final BlockPos pos, final EnumFacing axis )
{
final EnumFacing forward = ori.getForward(); final IOrientable rotatable = this.getOrientable( w, pos );
final EnumFacing up = ori.getUp();
if( rotatable != null && rotatable.canBeRotated() )
if (forward == null || up == null) { {
return dir; if( this.hasCustomRotation() )
} {
this.customRotateBlock( rotatable, axis );
final int west_x = forward.getFrontOffsetY() * up.getFrontOffsetZ() - forward.getFrontOffsetZ() * up.getFrontOffsetY(); return true;
final int west_y = forward.getFrontOffsetZ() * up.getFrontOffsetX() - forward.getFrontOffsetX() * up.getFrontOffsetZ(); }
final int west_z = forward.getFrontOffsetX() * up.getFrontOffsetY() - forward.getFrontOffsetY() * up.getFrontOffsetX(); else
{
EnumFacing west = null; EnumFacing forward = rotatable.getForward();
for (final EnumFacing dx : EnumFacing.VALUES) { EnumFacing up = rotatable.getUp();
if (dx.getFrontOffsetX() == west_x && dx.getFrontOffsetY() == west_y && dx.getFrontOffsetZ() == west_z) {
west = dx; for( int rs = 0; rs < 4; rs++ )
} {
} forward = Platform.rotateAround( forward, axis );
up = Platform.rotateAround( up, axis );
if (west == null) {
return dir; if( this.isValidOrientation( w, pos, forward, up ) )
} {
rotatable.setOrientation( forward, up );
if (dir == forward) { return true;
return EnumFacing.SOUTH; }
} }
if (dir == forward.getOpposite()) { }
return EnumFacing.NORTH; }
}
return super.rotateBlock( w, pos, axis );
if (dir == up) { }
return EnumFacing.UP;
} @Override
if (dir == up.getOpposite()) { public EnumFacing[] getValidRotations( final World w, final BlockPos pos )
return EnumFacing.DOWN; {
} return new EnumFacing[0];
}
if (dir == west) {
return EnumFacing.WEST; @SideOnly( Side.CLIENT )
} @Override
if (dir == west.getOpposite()) { public void addInformation( final ItemStack is, final World world, final List<String> lines, final ITooltipFlag advancedItemTooltips )
return EnumFacing.EAST; {
}
}
return null;
} public boolean onActivated( final World w, final BlockPos pos, final EntityPlayer player, final EnumHand hand, final @Nullable ItemStack heldItem, final EnumFacing side, final float hitX, final float hitY, final float hitZ )
{
@Override return false;
public String toString() { }
String regName = this.getRegistryName() != null ? this.getRegistryName().getResourcePath() : "unregistered";
return this.getClass().getSimpleName() + "[" + regName + "]"; public final EnumFacing mapRotation( final IOrientable ori, final EnumFacing dir )
} {
// case DOWN: return bottomIcon;
protected String getUnlocalizedName(final ItemStack is) { // case UP: return blockIcon;
return this.getUnlocalizedName(); // case NORTH: return northIcon;
} // case SOUTH: return southIcon;
// case WEST: return sideIcon;
protected boolean hasCustomRotation() { // case EAST: return sideIcon;
return false;
} final EnumFacing forward = ori.getForward();
final EnumFacing up = ori.getUp();
protected void customRotateBlock(final IOrientable rotatable, final EnumFacing axis) {
if( forward == null || up == null )
} {
return dir;
protected IOrientable getOrientable(final IBlockAccess w, final BlockPos pos) { }
if (this instanceof IOrientableBlock) {
IOrientableBlock orientable = (IOrientableBlock) this; final int west_x = forward.getFrontOffsetY() * up.getFrontOffsetZ() - forward.getFrontOffsetZ() * up.getFrontOffsetY();
return orientable.getOrientable(w, pos); final int west_y = forward.getFrontOffsetZ() * up.getFrontOffsetX() - forward.getFrontOffsetX() * up.getFrontOffsetZ();
} final int west_z = forward.getFrontOffsetX() * up.getFrontOffsetY() - forward.getFrontOffsetY() * up.getFrontOffsetX();
return null;
} EnumFacing west = null;
for( final EnumFacing dx : EnumFacing.VALUES )
protected boolean isValidOrientation(final World w, final BlockPos pos, final EnumFacing forward, final EnumFacing up) { {
return true; if( dx.getFrontOffsetX() == west_x && dx.getFrontOffsetY() == west_y && dx.getFrontOffsetZ() == west_z )
} {
west = dx;
protected ICustomCollision getCustomCollision(final World w, final BlockPos pos) { }
if (this instanceof ICustomCollision) { }
return (ICustomCollision) this;
} if( west == null )
return null; {
} return dir;
}
protected IProperty[] getAEStates() {
return new IProperty[0]; if( dir == forward )
} {
return EnumFacing.SOUTH;
protected boolean isOpaque() { }
return this.isOpaque; if( dir == forward.getOpposite() )
} {
return EnumFacing.NORTH;
protected boolean setOpaque(final boolean isOpaque) { }
this.isOpaque = isOpaque;
return isOpaque; if( dir == up )
} {
return EnumFacing.UP;
protected boolean hasSubtypes() { }
return this.hasSubtypes; if( dir == up.getOpposite() )
} {
return EnumFacing.DOWN;
protected void setHasSubtypes(final boolean hasSubtypes) { }
this.hasSubtypes = hasSubtypes;
} if( dir == west )
{
protected boolean isFullSize() { return EnumFacing.WEST;
return this.isFullSize; }
} if( dir == west.getOpposite() )
{
protected boolean setFullSize(final boolean isFullSize) { return EnumFacing.EAST;
this.isFullSize = isFullSize; }
return isFullSize;
} return null;
}
protected boolean isInventory() {
return this.isInventory; @Override
} public String toString()
{
protected void setInventory(final boolean isInventory) { String regName = this.getRegistryName() != null ? this.getRegistryName().getResourcePath() : "unregistered";
this.isInventory = isInventory; return this.getClass().getSimpleName() + "[" + regName + "]";
} }
protected String getUnlocalizedName( final ItemStack is )
{
return this.getUnlocalizedName();
}
protected boolean hasCustomRotation()
{
return false;
}
protected void customRotateBlock( final IOrientable rotatable, final EnumFacing axis )
{
}
protected IOrientable getOrientable( final IBlockAccess w, final BlockPos pos )
{
if( this instanceof IOrientableBlock )
{
IOrientableBlock orientable = (IOrientableBlock) this;
return orientable.getOrientable( w, pos );
}
return null;
}
protected boolean isValidOrientation( final World w, final BlockPos pos, final EnumFacing forward, final EnumFacing up )
{
return true;
}
protected ICustomCollision getCustomCollision( final World w, final BlockPos pos )
{
if( this instanceof ICustomCollision )
{
return (ICustomCollision) this;
}
return null;
}
protected IProperty[] getAEStates()
{
return new IProperty[0];
}
protected boolean isOpaque()
{
return this.isOpaque;
}
protected boolean setOpaque( final boolean isOpaque )
{
this.isOpaque = isOpaque;
return isOpaque;
}
protected boolean hasSubtypes()
{
return this.hasSubtypes;
}
protected void setHasSubtypes( final boolean hasSubtypes )
{
this.hasSubtypes = hasSubtypes;
}
protected boolean isFullSize()
{
return this.isFullSize;
}
protected boolean setFullSize( final boolean isFullSize )
{
this.isFullSize = isFullSize;
return isFullSize;
}
protected boolean isInventory()
{
return this.isInventory;
}
protected void setInventory( final boolean isInventory )
{
this.isInventory = isInventory;
}
} }
+154 -118
View File
@@ -19,13 +19,8 @@
package appeng.block; package appeng.block;
import appeng.api.util.IOrientable; import java.util.List;
import appeng.api.util.IOrientableBlock;
import appeng.block.misc.BlockLightDetector;
import appeng.block.misc.BlockSkyCompass;
import appeng.block.networking.BlockWireless;
import appeng.me.helpers.IGridProxyable;
import appeng.tile.AEBaseTile;
import net.minecraft.block.Block; import net.minecraft.block.Block;
import net.minecraft.block.state.IBlockState; import net.minecraft.block.state.IBlockState;
import net.minecraft.client.util.ITooltipFlag; import net.minecraft.client.util.ITooltipFlag;
@@ -39,137 +34,178 @@ import net.minecraft.world.World;
import net.minecraftforge.fml.relauncher.Side; import net.minecraftforge.fml.relauncher.Side;
import net.minecraftforge.fml.relauncher.SideOnly; import net.minecraftforge.fml.relauncher.SideOnly;
import java.util.List; import appeng.api.util.IOrientable;
import appeng.api.util.IOrientableBlock;
import appeng.block.misc.BlockLightDetector;
import appeng.block.misc.BlockSkyCompass;
import appeng.block.networking.BlockWireless;
import appeng.me.helpers.IGridProxyable;
import appeng.tile.AEBaseTile;
public class AEBaseItemBlock extends ItemBlock { public class AEBaseItemBlock extends ItemBlock
{
private final AEBaseBlock blockType; private final AEBaseBlock blockType;
public AEBaseItemBlock(final Block id) { public AEBaseItemBlock( final Block id )
super(id); {
this.blockType = (AEBaseBlock) id; super( id );
this.hasSubtypes = this.blockType.hasSubtypes(); this.blockType = (AEBaseBlock) id;
} this.hasSubtypes = this.blockType.hasSubtypes();
}
@Override @Override
public int getMetadata(final int dmg) { public int getMetadata( final int dmg )
if (this.hasSubtypes) { {
return dmg; if( this.hasSubtypes )
} {
return 0; return dmg;
} }
return 0;
}
@Override @Override
@SideOnly(Side.CLIENT) @SideOnly( Side.CLIENT )
public final void addInformation(final ItemStack itemStack, final World world, final List<String> toolTip, final ITooltipFlag advancedTooltips) { public final void addInformation( final ItemStack itemStack, final World world, final List<String> toolTip, final ITooltipFlag advancedTooltips )
this.addCheckedInformation(itemStack, world, toolTip, advancedTooltips); {
} this.addCheckedInformation( itemStack, world, toolTip, advancedTooltips );
}
@SideOnly(Side.CLIENT) @SideOnly( Side.CLIENT )
public void addCheckedInformation(final ItemStack itemStack, final World world, final List<String> toolTip, final ITooltipFlag advancedTooltips) { public void addCheckedInformation( final ItemStack itemStack, final World world, final List<String> toolTip, final ITooltipFlag advancedTooltips )
this.blockType.addInformation(itemStack, world, toolTip, advancedTooltips); {
} this.blockType.addInformation( itemStack, world, toolTip, advancedTooltips );
}
@Override @Override
public boolean isBookEnchantable(final ItemStack itemstack1, final ItemStack itemstack2) { public boolean isBookEnchantable( final ItemStack itemstack1, final ItemStack itemstack2 )
return false; {
} return false;
}
@Override @Override
public String getUnlocalizedName(final ItemStack is) { public String getUnlocalizedName( final ItemStack is )
return this.blockType.getUnlocalizedName(is); {
} return this.blockType.getUnlocalizedName( is );
}
@Override @Override
public boolean placeBlockAt(final ItemStack stack, final EntityPlayer player, final World w, final BlockPos pos, final EnumFacing side, final float hitX, final float hitY, final float hitZ, final IBlockState newState) { public boolean placeBlockAt( final ItemStack stack, final EntityPlayer player, final World w, final BlockPos pos, final EnumFacing side, final float hitX, final float hitY, final float hitZ, final IBlockState newState )
EnumFacing up = null; {
EnumFacing forward = null; EnumFacing up = null;
EnumFacing forward = null;
if (this.blockType instanceof AEBaseTileBlock) { if( this.blockType instanceof AEBaseTileBlock )
if (this.blockType instanceof BlockLightDetector) { {
up = side; if( this.blockType instanceof BlockLightDetector )
if (up == EnumFacing.UP || up == EnumFacing.DOWN) { {
forward = EnumFacing.SOUTH; up = side;
} else { if( up == EnumFacing.UP || up == EnumFacing.DOWN )
forward = EnumFacing.UP; {
} forward = EnumFacing.SOUTH;
} else if (this.blockType instanceof BlockWireless || this.blockType instanceof BlockSkyCompass) { }
forward = side; else
if (forward == EnumFacing.UP || forward == EnumFacing.DOWN) { {
up = EnumFacing.SOUTH; forward = EnumFacing.UP;
} else { }
up = EnumFacing.UP; }
} else if( this.blockType instanceof BlockWireless || this.blockType instanceof BlockSkyCompass )
} else { {
up = EnumFacing.UP; forward = side;
if( forward == EnumFacing.UP || forward == EnumFacing.DOWN )
{
up = EnumFacing.SOUTH;
}
else
{
up = EnumFacing.UP;
}
}
else
{
up = EnumFacing.UP;
final byte rotation = (byte) (MathHelper.floor((player.rotationYaw * 4F) / 360F + 2.5D) & 3); final byte rotation = (byte) ( MathHelper.floor( ( player.rotationYaw * 4F ) / 360F + 2.5D ) & 3 );
switch (rotation) { switch( rotation )
default: {
case 0: default:
forward = EnumFacing.SOUTH; case 0:
break; forward = EnumFacing.SOUTH;
case 1: break;
forward = EnumFacing.WEST; case 1:
break; forward = EnumFacing.WEST;
case 2: break;
forward = EnumFacing.NORTH; case 2:
break; forward = EnumFacing.NORTH;
case 3: break;
forward = EnumFacing.EAST; case 3:
break; forward = EnumFacing.EAST;
} break;
}
if (player.rotationPitch > 65) { if( player.rotationPitch > 65 )
up = forward.getOpposite(); {
forward = EnumFacing.UP; up = forward.getOpposite();
} else if (player.rotationPitch < -65) { forward = EnumFacing.UP;
up = forward.getOpposite(); }
forward = EnumFacing.DOWN; else if( player.rotationPitch < -65 )
} {
} up = forward.getOpposite();
} forward = EnumFacing.DOWN;
}
}
}
IOrientable ori = null; IOrientable ori = null;
if (this.blockType instanceof IOrientableBlock) { if( this.blockType instanceof IOrientableBlock )
ori = ((IOrientableBlock) this.blockType).getOrientable(w, pos); {
up = side; ori = ( (IOrientableBlock) this.blockType ).getOrientable( w, pos );
forward = EnumFacing.SOUTH; up = side;
if (up.getFrontOffsetY() == 0) { forward = EnumFacing.SOUTH;
forward = EnumFacing.UP; if( up.getFrontOffsetY() == 0 )
} {
} forward = EnumFacing.UP;
}
}
if (!this.blockType.isValidOrientation(w, pos, forward, up)) { if( !this.blockType.isValidOrientation( w, pos, forward, up ) )
return false; {
} return false;
}
if (super.placeBlockAt(stack, player, w, pos, side, hitX, hitY, hitZ, newState)) { if( super.placeBlockAt( stack, player, w, pos, side, hitX, hitY, hitZ, newState ) )
if (this.blockType instanceof AEBaseTileBlock && !(this.blockType instanceof BlockLightDetector)) { {
final AEBaseTile tile = ((AEBaseTileBlock) this.blockType).getTileEntity(w, pos); if( this.blockType instanceof AEBaseTileBlock && !( this.blockType instanceof BlockLightDetector ) )
ori = tile; {
final AEBaseTile tile = ( (AEBaseTileBlock) this.blockType ).getTileEntity( w, pos );
ori = tile;
if (tile == null) { if( tile == null )
return true; {
} return true;
}
if (ori.canBeRotated() && !this.blockType.hasCustomRotation()) { if( ori.canBeRotated() && !this.blockType.hasCustomRotation() )
ori.setOrientation(forward, up); {
} ori.setOrientation( forward, up );
}
if (tile instanceof IGridProxyable) { if( tile instanceof IGridProxyable )
((IGridProxyable) tile).getProxy().setOwner(player); {
} ( (IGridProxyable) tile ).getProxy().setOwner( player );
}
tile.onPlacement(stack, player, side); tile.onPlacement( stack, player, side );
} else if (this.blockType instanceof IOrientableBlock) { }
ori.setOrientation(forward, up); else if( this.blockType instanceof IOrientableBlock )
} {
ori.setOrientation( forward, up );
}
return true; return true;
} }
return false; return false;
} }
} }
@@ -19,14 +19,9 @@
package appeng.block; package appeng.block;
import appeng.api.config.AccessRestriction; import java.text.MessageFormat;
import appeng.api.config.Actionable; import java.util.List;
import appeng.api.config.PowerUnits;
import appeng.api.definitions.IBlockDefinition;
import appeng.api.implementations.items.IAEItemPowerStorage;
import appeng.core.Api;
import appeng.core.localization.GuiText;
import appeng.util.Platform;
import net.minecraft.block.Block; import net.minecraft.block.Block;
import net.minecraft.client.util.ITooltipFlag; import net.minecraft.client.util.ITooltipFlag;
import net.minecraft.item.ItemStack; import net.minecraft.item.ItemStack;
@@ -35,102 +30,126 @@ import net.minecraft.world.World;
import net.minecraftforge.fml.relauncher.Side; import net.minecraftforge.fml.relauncher.Side;
import net.minecraftforge.fml.relauncher.SideOnly; import net.minecraftforge.fml.relauncher.SideOnly;
import java.text.MessageFormat; import appeng.api.config.AccessRestriction;
import java.util.List; import appeng.api.config.Actionable;
import appeng.api.config.PowerUnits;
import appeng.api.definitions.IBlockDefinition;
import appeng.api.implementations.items.IAEItemPowerStorage;
import appeng.core.Api;
import appeng.core.localization.GuiText;
import appeng.util.Platform;
public class AEBaseItemBlockChargeable extends AEBaseItemBlock implements IAEItemPowerStorage { public class AEBaseItemBlockChargeable extends AEBaseItemBlock implements IAEItemPowerStorage
{
public AEBaseItemBlockChargeable(final Block id) { public AEBaseItemBlockChargeable( final Block id )
super(id); {
} super( id );
}
@Override @Override
@SideOnly(Side.CLIENT) @SideOnly( Side.CLIENT )
public void addCheckedInformation(final ItemStack stack, final World world, final List<String> lines, final ITooltipFlag advancedTooltips) { public void addCheckedInformation( final ItemStack stack, final World world, final List<String> lines, final ITooltipFlag advancedTooltips )
final NBTTagCompound tag = stack.getTagCompound(); {
double internalCurrentPower = 0; final NBTTagCompound tag = stack.getTagCompound();
final double internalMaxPower = this.getMaxEnergyCapacity(); double internalCurrentPower = 0;
final double internalMaxPower = this.getMaxEnergyCapacity();
if (internalMaxPower > 0) { if( internalMaxPower > 0 )
if (tag != null) { {
internalCurrentPower = tag.getDouble("internalCurrentPower"); if( tag != null )
} {
internalCurrentPower = tag.getDouble( "internalCurrentPower" );
}
final double percent = internalCurrentPower / internalMaxPower; final double percent = internalCurrentPower / internalMaxPower;
lines.add(GuiText.StoredEnergy.getLocal() + ':' + MessageFormat.format(" {0,number,#} ", internalCurrentPower) + Platform lines.add( GuiText.StoredEnergy.getLocal() + ':' + MessageFormat.format( " {0,number,#} ", internalCurrentPower ) + Platform
.gui_localize(PowerUnits.AE.unlocalizedName) + " - " + MessageFormat.format(" {0,number,#.##%} ", percent)); .gui_localize( PowerUnits.AE.unlocalizedName ) + " - " + MessageFormat.format( " {0,number,#.##%} ", percent ) );
} }
} }
@Override @Override
public double injectAEPower(final ItemStack is, double amount, Actionable mode) { public double injectAEPower( final ItemStack is, double amount, Actionable mode )
final double internalCurrentPower = this.getInternal(is); {
final double internalMaxPower = this.getAEMaxPower(is); final double internalCurrentPower = this.getInternal( is );
final double required = internalMaxPower - internalCurrentPower; final double internalMaxPower = this.getAEMaxPower( is );
final double overflow = Math.max(0, amount - required); final double required = internalMaxPower - internalCurrentPower;
final double overflow = Math.max( 0, amount - required );
if (mode == Actionable.MODULATE) { if( mode == Actionable.MODULATE )
final double toAdd = Math.min(required, amount); {
final double newPowerStored = internalCurrentPower + toAdd; final double toAdd = Math.min( required, amount );
final double newPowerStored = internalCurrentPower + toAdd;
this.setInternal(is, newPowerStored); this.setInternal( is, newPowerStored );
} }
return overflow; return overflow;
} }
@Override @Override
public double extractAEPower(final ItemStack is, double amount, Actionable mode) { public double extractAEPower( final ItemStack is, double amount, Actionable mode )
final double internalCurrentPower = this.getInternal(is); {
final double fulfillable = Math.min(amount, internalCurrentPower); final double internalCurrentPower = this.getInternal( is );
final double fulfillable = Math.min( amount, internalCurrentPower );
if (mode == Actionable.MODULATE) { if( mode == Actionable.MODULATE )
final double newPowerStored = internalCurrentPower - fulfillable; {
final double newPowerStored = internalCurrentPower - fulfillable;
this.setInternal(is, newPowerStored); this.setInternal( is, newPowerStored );
} }
return fulfillable; return fulfillable;
} }
@Override @Override
public double getAEMaxPower(final ItemStack is) { public double getAEMaxPower( final ItemStack is )
return this.getMaxEnergyCapacity(); {
} return this.getMaxEnergyCapacity();
}
@Override @Override
public double getAECurrentPower(final ItemStack is) { public double getAECurrentPower( final ItemStack is )
return this.getInternal(is); {
} return this.getInternal( is );
}
@Override @Override
public AccessRestriction getPowerFlow(final ItemStack is) { public AccessRestriction getPowerFlow( final ItemStack is )
return AccessRestriction.WRITE; {
} return AccessRestriction.WRITE;
}
private double getMaxEnergyCapacity() { private double getMaxEnergyCapacity()
final Block blockID = Block.getBlockFromItem(this); {
final IBlockDefinition energyCell = Api.INSTANCE.definitions().blocks().energyCell(); final Block blockID = Block.getBlockFromItem( this );
final IBlockDefinition energyCell = Api.INSTANCE.definitions().blocks().energyCell();
return energyCell.maybeBlock().map(block -> return energyCell.maybeBlock().map( block ->
{ {
if (blockID == block) { if( blockID == block )
return 200000; {
} else { return 200000;
return 8 * 200000; }
} else
}).orElse(0); {
} return 8 * 200000;
}
} ).orElse( 0 );
}
private double getInternal(final ItemStack is) { private double getInternal( final ItemStack is )
final NBTTagCompound nbt = Platform.openNbtData(is); {
return nbt.getDouble("internalCurrentPower"); final NBTTagCompound nbt = Platform.openNbtData( is );
} return nbt.getDouble( "internalCurrentPower" );
}
private void setInternal(final ItemStack is, final double amt) { private void setInternal( final ItemStack is, final double amt )
final NBTTagCompound nbt = Platform.openNbtData(is); {
nbt.setDouble("internalCurrentPower", amt); final NBTTagCompound nbt = Platform.openNbtData( is );
} nbt.setDouble( "internalCurrentPower", amt );
}
} }
@@ -20,27 +20,31 @@ package appeng.block;
import com.google.common.base.Preconditions; import com.google.common.base.Preconditions;
import net.minecraft.block.Block; import net.minecraft.block.Block;
import net.minecraft.block.BlockStairs; import net.minecraft.block.BlockStairs;
public abstract class AEBaseStairBlock extends BlockStairs { public abstract class AEBaseStairBlock extends BlockStairs
{
protected AEBaseStairBlock(final Block block, final String type) { protected AEBaseStairBlock( final Block block, final String type )
super(block.getDefaultState()); {
super( block.getDefaultState() );
Preconditions.checkNotNull(block); Preconditions.checkNotNull( block );
Preconditions.checkNotNull(block.getUnlocalizedName()); Preconditions.checkNotNull( block.getUnlocalizedName() );
Preconditions.checkArgument(block.getUnlocalizedName().length() > 0); Preconditions.checkArgument( block.getUnlocalizedName().length() > 0 );
this.setUnlocalizedName("stair." + type); this.setUnlocalizedName( "stair." + type );
this.setLightOpacity(0); this.setLightOpacity( 0 );
} }
@Override @Override
public String toString() { public String toString()
String regName = this.getRegistryName() != null ? this.getRegistryName().getResourcePath() : "unregistered"; {
return this.getClass().getSimpleName() + "[" + regName + "]"; String regName = this.getRegistryName() != null ? this.getRegistryName().getResourcePath() : "unregistered";
} return this.getClass().getSimpleName() + "[" + regName + "]";
}
} }
+296 -244
View File
@@ -19,23 +19,14 @@
package appeng.block; package appeng.block;
import appeng.api.implementations.items.IMemoryCard; import java.util.ArrayList;
import appeng.api.implementations.items.MemoryCardMessages; import java.util.List;
import appeng.api.implementations.tiles.IColorableTile;
import appeng.api.util.AEColor; import javax.annotation.Nonnull;
import appeng.api.util.AEPartLocation; import javax.annotation.Nullable;
import appeng.api.util.IOrientable;
import appeng.block.networking.BlockCableBus;
import appeng.core.sync.GuiBridge;
import appeng.helpers.ICustomCollision;
import appeng.items.tools.quartz.ToolQuartzCuttingKnife;
import appeng.tile.AEBaseInvTile;
import appeng.tile.AEBaseTile;
import appeng.tile.networking.TileCableBus;
import appeng.tile.storage.TileSkyChest;
import appeng.util.Platform;
import appeng.util.SettingsFrom;
import com.google.common.collect.Lists; import com.google.common.collect.Lists;
import net.minecraft.block.Block; import net.minecraft.block.Block;
import net.minecraft.block.ITileEntityProvider; import net.minecraft.block.ITileEntityProvider;
import net.minecraft.block.material.Material; import net.minecraft.block.material.Material;
@@ -55,287 +46,348 @@ import net.minecraft.world.World;
import net.minecraftforge.common.property.ExtendedBlockState; import net.minecraftforge.common.property.ExtendedBlockState;
import net.minecraftforge.common.property.IExtendedBlockState; import net.minecraftforge.common.property.IExtendedBlockState;
import net.minecraftforge.common.property.IUnlistedProperty; import net.minecraftforge.common.property.IUnlistedProperty;
import net.minecraftforge.event.ForgeEventFactory;
import net.minecraftforge.items.ItemHandlerHelper; import net.minecraftforge.items.ItemHandlerHelper;
import javax.annotation.Nonnull; import appeng.api.implementations.items.IMemoryCard;
import javax.annotation.Nullable; import appeng.api.implementations.items.MemoryCardMessages;
import java.util.ArrayList; import appeng.api.implementations.tiles.IColorableTile;
import java.util.List; import appeng.api.util.AEColor;
import appeng.api.util.IOrientable;
import appeng.block.networking.BlockCableBus;
import appeng.helpers.ICustomCollision;
import appeng.tile.AEBaseInvTile;
import appeng.tile.AEBaseTile;
import appeng.tile.networking.TileCableBus;
import appeng.tile.storage.TileSkyChest;
import appeng.util.Platform;
import appeng.util.SettingsFrom;
public abstract class AEBaseTileBlock extends AEBaseBlock implements ITileEntityProvider { public abstract class AEBaseTileBlock extends AEBaseBlock implements ITileEntityProvider
{
@Nonnull @Nonnull
private Class<? extends AEBaseTile> tileEntityType; private Class<? extends AEBaseTile> tileEntityType;
public AEBaseTileBlock(final Material mat) { public AEBaseTileBlock( final Material mat )
super(mat); {
} super( mat );
}
public static final UnlistedDirection FORWARD = new UnlistedDirection("forward"); public static final UnlistedDirection FORWARD = new UnlistedDirection( "forward" );
public static final UnlistedDirection UP = new UnlistedDirection("up"); public static final UnlistedDirection UP = new UnlistedDirection( "up" );
@Override @Override
public IBlockState getExtendedState(IBlockState state, IBlockAccess world, BlockPos pos) { public IBlockState getExtendedState( IBlockState state, IBlockAccess world, BlockPos pos )
// A subclass may decide it doesn't want extended block state for whatever reason {
if (!(state instanceof IExtendedBlockState)) { // A subclass may decide it doesn't want extended block state for whatever reason
return state; if( !( state instanceof IExtendedBlockState ) )
} {
return state;
}
AEBaseTile tile = this.getTileEntity(world, pos); AEBaseTile tile = this.getTileEntity( world, pos );
if (tile == null) { if( tile == null )
return state; // No info available {
} return state; // No info available
}
IExtendedBlockState extState = (IExtendedBlockState) state; IExtendedBlockState extState = (IExtendedBlockState) state;
return extState.withProperty(FORWARD, tile.getForward()).withProperty(UP, tile.getUp()); return extState.withProperty( FORWARD, tile.getForward() ).withProperty( UP, tile.getUp() );
} }
@Override @Override
protected BlockStateContainer createBlockState() { protected BlockStateContainer createBlockState()
return new ExtendedBlockState(this, this.getAEStates(), new IUnlistedProperty[]{ {
FORWARD, return new ExtendedBlockState( this, this.getAEStates(), new IUnlistedProperty[] {
UP FORWARD,
}); UP
} } );
}
@Override @Override
public int getMetaFromState(IBlockState state) { public int getMetaFromState( IBlockState state )
return 0; {
} return 0;
}
// TODO : Was this change needed? // TODO : Was this change needed?
public void setTileEntity(final Class<? extends AEBaseTile> c) { public void setTileEntity( final Class<? extends AEBaseTile> c )
this.tileEntityType = c; {
this.setInventory(AEBaseInvTile.class.isAssignableFrom(c)); this.tileEntityType = c;
} this.setInventory( AEBaseInvTile.class.isAssignableFrom( c ) );
}
@Override @Override
public boolean hasTileEntity(IBlockState state) { public boolean hasTileEntity( IBlockState state )
return this.hasBlockTileEntity(); {
} return this.hasBlockTileEntity();
}
private boolean hasBlockTileEntity() { private boolean hasBlockTileEntity()
return this.tileEntityType != null; {
} return this.tileEntityType != null;
}
public Class<? extends AEBaseTile> getTileEntityClass() { public Class<? extends AEBaseTile> getTileEntityClass()
return this.tileEntityType; {
} return this.tileEntityType;
}
@Nullable @Nullable
public <T extends AEBaseTile> T getTileEntity(final IBlockAccess w, final int x, final int y, final int z) { public <T extends AEBaseTile> T getTileEntity( final IBlockAccess w, final int x, final int y, final int z )
return this.getTileEntity(w, new BlockPos(x, y, z)); {
} return this.getTileEntity( w, new BlockPos( x, y, z ) );
}
@Nullable @Nullable
public <T extends AEBaseTile> T getTileEntity(final IBlockAccess w, final BlockPos pos) { public <T extends AEBaseTile> T getTileEntity( final IBlockAccess w, final BlockPos pos )
if (!this.hasBlockTileEntity()) { {
return null; if( !this.hasBlockTileEntity() )
} {
return null;
}
final TileEntity te = w.getTileEntity(pos); final TileEntity te = w.getTileEntity( pos );
if (this.tileEntityType.isInstance(te)) { if( this.tileEntityType.isInstance( te ) )
return (T) te; {
} return (T) te;
}
return null; return null;
} }
@Override @Override
public final TileEntity createNewTileEntity(final World var1, final int var2) { public final TileEntity createNewTileEntity( final World var1, final int var2 )
if (this.hasBlockTileEntity()) { {
try { if( this.hasBlockTileEntity() )
return this.tileEntityType.newInstance(); {
} catch (final InstantiationException e) { try
throw new IllegalStateException("Failed to create a new instance of an illegal class " + this.tileEntityType, e); {
} catch (final IllegalAccessException e) { return this.tileEntityType.newInstance();
throw new IllegalStateException("Failed to create a new instance of " + this.tileEntityType + ", because lack of permissions", e); }
} catch( final InstantiationException e )
} {
throw new IllegalStateException( "Failed to create a new instance of an illegal class " + this.tileEntityType, e );
}
catch( final IllegalAccessException e )
{
throw new IllegalStateException( "Failed to create a new instance of " + this.tileEntityType + ", because lack of permissions", e );
}
}
return null; return null;
} }
@Override @Override
public void breakBlock(final World w, final BlockPos pos, final IBlockState state) { public void breakBlock( final World w, final BlockPos pos, final IBlockState state )
final AEBaseTile te = this.getTileEntity(w, pos); {
if (te != null) { final AEBaseTile te = this.getTileEntity( w, pos );
final ArrayList<ItemStack> drops = new ArrayList<>(); if( te != null )
if (te.dropItems()) { {
te.getDrops(w, pos, drops); final ArrayList<ItemStack> drops = new ArrayList<>();
} else { if( te.dropItems() )
te.getNoDrops(w, pos, drops); {
} te.getDrops( w, pos, drops );
}
else
{
te.getNoDrops( w, pos, drops );
}
// Cry ;_; ... // Cry ;_; ...
Platform.spawnDrops(w, pos, drops); Platform.spawnDrops( w, pos, drops );
} }
// super will remove the TE, as it is not an instance of BlockContainer // super will remove the TE, as it is not an instance of BlockContainer
super.breakBlock(w, pos, state); super.breakBlock( w, pos, state );
} }
@Override @Override
public final EnumFacing[] getValidRotations(final World w, final BlockPos pos) { public final EnumFacing[] getValidRotations( final World w, final BlockPos pos )
final AEBaseTile obj = this.getTileEntity(w, pos); {
if (obj != null && obj.canBeRotated()) { final AEBaseTile obj = this.getTileEntity( w, pos );
return EnumFacing.VALUES; if( obj != null && obj.canBeRotated() )
} {
return EnumFacing.VALUES;
}
return super.getValidRotations(w, pos); return super.getValidRotations( w, pos );
} }
@Override @Override
public boolean recolorBlock(final World world, final BlockPos pos, final EnumFacing side, final EnumDyeColor color) { public boolean recolorBlock( final World world, final BlockPos pos, final EnumFacing side, final EnumDyeColor color )
final TileEntity te = this.getTileEntity(world, pos); {
final TileEntity te = this.getTileEntity( world, pos );
if (te instanceof IColorableTile) { if( te instanceof IColorableTile )
final IColorableTile ct = (IColorableTile) te; {
final AEColor c = ct.getColor(); final IColorableTile ct = (IColorableTile) te;
final AEColor newColor = AEColor.values()[color.getMetadata()]; final AEColor c = ct.getColor();
final AEColor newColor = AEColor.values()[color.getMetadata()];
if (c != newColor) { if( c != newColor )
ct.recolourBlock(side, newColor, null); {
return true; ct.recolourBlock( side, newColor, null );
} return true;
return false; }
} return false;
}
return super.recolorBlock(world, pos, side, color); return super.recolorBlock( world, pos, side, color );
} }
@Override @Override
public int getComparatorInputOverride(IBlockState state, final World w, final BlockPos pos) { public int getComparatorInputOverride( IBlockState state, final World w, final BlockPos pos )
final TileEntity te = this.getTileEntity(w, pos); {
if (te instanceof AEBaseInvTile) { final TileEntity te = this.getTileEntity( w, pos );
AEBaseInvTile invTile = (AEBaseInvTile) te; if( te instanceof AEBaseInvTile )
if (invTile.getInternalInventory().getSlots() > 0) { {
return ItemHandlerHelper.calcRedstoneFromInventory(invTile.getInternalInventory()); AEBaseInvTile invTile = (AEBaseInvTile) te;
} if( invTile.getInternalInventory().getSlots() > 0 )
} {
return 0; return ItemHandlerHelper.calcRedstoneFromInventory( invTile.getInternalInventory() );
} }
}
return 0;
}
@Override @Override
public boolean eventReceived(final IBlockState state, final World worldIn, final BlockPos pos, final int eventID, final int eventParam) { public boolean eventReceived( final IBlockState state, final World worldIn, final BlockPos pos, final int eventID, final int eventParam )
super.eventReceived(state, worldIn, pos, eventID, eventParam); {
final TileEntity tileentity = worldIn.getTileEntity(pos); super.eventReceived( state, worldIn, pos, eventID, eventParam );
return tileentity != null && tileentity.receiveClientEvent(eventID, eventParam); final TileEntity tileentity = worldIn.getTileEntity( pos );
} return tileentity != null ? tileentity.receiveClientEvent( eventID, eventParam ) : false;
}
@Override @Override
public void onBlockPlacedBy(final World w, final BlockPos pos, final IBlockState state, final EntityLivingBase placer, final ItemStack is) { public void onBlockPlacedBy( final World w, final BlockPos pos, final IBlockState state, final EntityLivingBase placer, final ItemStack is )
if (is.hasDisplayName()) { {
final TileEntity te = this.getTileEntity(w, pos); if( is.hasDisplayName() )
if (te instanceof AEBaseTile) { {
((AEBaseTile) w.getTileEntity(pos)).setName(is.getDisplayName()); final TileEntity te = this.getTileEntity( w, pos );
} if( te instanceof AEBaseTile )
} {
} ( (AEBaseTile) w.getTileEntity( pos ) ).setName( is.getDisplayName() );
}
}
}
@Override @Override
public boolean onBlockActivated(World world, BlockPos pos, IBlockState state, EntityPlayer player, EnumHand hand, EnumFacing facing, float hitX, float hitY, float hitZ) { public boolean onBlockActivated( World world, BlockPos pos, IBlockState state, EntityPlayer player, EnumHand hand, EnumFacing facing, float hitX, float hitY, float hitZ )
ItemStack heldItem; {
if (player != null && !player.getHeldItem(hand).isEmpty()) { ItemStack heldItem;
heldItem = player.getHeldItem(hand); if( player != null && !player.getHeldItem( hand ).isEmpty() )
{
heldItem = player.getHeldItem( hand );
if (Platform.isWrench(player, heldItem, pos) && player.isSneaking()) { if( Platform.isWrench( player, heldItem, pos ) && player.isSneaking() )
final IBlockState blockState = world.getBlockState(pos); {
final Block block = blockState.getBlock(); final IBlockState blockState = world.getBlockState( pos );
final Block block = blockState.getBlock();
if (block == null) { if( block == null )
return false; {
} return false;
}
final AEBaseTile tile = this.getTileEntity(world, pos); final AEBaseTile tile = this.getTileEntity( world, pos );
if (tile == null) { if( tile == null )
return false; {
} return false;
}
if (tile instanceof TileCableBus || tile instanceof TileSkyChest) { if( tile instanceof TileCableBus || tile instanceof TileSkyChest )
return false; {
} return false;
}
final ItemStack[] itemDropCandidates = Platform.getBlockDrops(world, pos); final ItemStack[] itemDropCandidates = Platform.getBlockDrops( world, pos );
final ItemStack op = new ItemStack(this); final ItemStack op = new ItemStack( this );
for (final ItemStack ol : itemDropCandidates) { for( final ItemStack ol : itemDropCandidates )
if (Platform.itemComparisons().isEqualItemType(ol, op)) { {
final NBTTagCompound tag = tile.downloadSettings(SettingsFrom.DISMANTLE_ITEM); if( Platform.itemComparisons().isEqualItemType( ol, op ) )
if (tag != null) { {
ol.setTagCompound(tag); final NBTTagCompound tag = tile.downloadSettings( SettingsFrom.DISMANTLE_ITEM );
} if( tag != null )
} {
} ol.setTagCompound( tag );
}
}
}
if (block.removedByPlayer(blockState, world, pos, player, false)) { if( block.removedByPlayer( blockState, world, pos, player, false ) )
final List<ItemStack> itemsToDrop = Lists.newArrayList(itemDropCandidates); {
Platform.spawnDrops(world, pos, itemsToDrop); final List<ItemStack> itemsToDrop = Lists.newArrayList( itemDropCandidates );
world.setBlockToAir(pos); Platform.spawnDrops( world, pos, itemsToDrop );
} world.setBlockToAir( pos );
}
return false; return false;
} }
if (heldItem.getItem() instanceof IMemoryCard && !(this instanceof BlockCableBus)) { if( heldItem.getItem() instanceof IMemoryCard && !( this instanceof BlockCableBus ) )
final IMemoryCard memoryCard = (IMemoryCard) heldItem.getItem(); {
final AEBaseTile tileEntity = this.getTileEntity(world, pos); final IMemoryCard memoryCard = (IMemoryCard) heldItem.getItem();
final AEBaseTile tileEntity = this.getTileEntity( world, pos );
if (tileEntity == null) { if( tileEntity == null )
return false; {
} return false;
}
final String name = this.getUnlocalizedName(); final String name = this.getUnlocalizedName();
if (player.isSneaking()) { if( player.isSneaking() )
final NBTTagCompound data = tileEntity.downloadSettings(SettingsFrom.MEMORY_CARD); {
if (data != null) { final NBTTagCompound data = tileEntity.downloadSettings( SettingsFrom.MEMORY_CARD );
memoryCard.setMemoryCardContents(heldItem, name, data); if( data != null )
memoryCard.notifyUser(player, MemoryCardMessages.SETTINGS_SAVED); {
} memoryCard.setMemoryCardContents( heldItem, name, data );
} else { memoryCard.notifyUser( player, MemoryCardMessages.SETTINGS_SAVED );
final String savedName = memoryCard.getSettingsName(heldItem); }
final NBTTagCompound data = memoryCard.getData(heldItem); }
else
{
final String savedName = memoryCard.getSettingsName( heldItem );
final NBTTagCompound data = memoryCard.getData( heldItem );
if (this.getUnlocalizedName().equals(savedName)) { if( this.getUnlocalizedName().equals( savedName ) )
tileEntity.uploadSettings(SettingsFrom.MEMORY_CARD, data); {
memoryCard.notifyUser(player, MemoryCardMessages.SETTINGS_LOADED); tileEntity.uploadSettings( SettingsFrom.MEMORY_CARD, data );
} else { memoryCard.notifyUser( player, MemoryCardMessages.SETTINGS_LOADED );
memoryCard.notifyUser(player, MemoryCardMessages.INVALID_MACHINE); }
} else
} {
memoryCard.notifyUser( player, MemoryCardMessages.INVALID_MACHINE );
}
}
return true; return true;
} }
}
if (heldItem.getItem() instanceof ToolQuartzCuttingKnife && !(this instanceof BlockCableBus)) { return this.onActivated( world, pos, player, hand, player.getHeldItem( hand ), facing, hitX, hitY, hitZ );
if (ForgeEventFactory.onItemUseStart(player, heldItem, 1) <= 0) return false; }
final AEBaseTile tile = this.getTileEntity(world, pos);
if (tile == null) return false;
Platform.openGUI(player, tile, AEPartLocation.fromFacing(facing), GuiBridge.GUI_RENAMER);
return true;
}
}
return this.onActivated(world, pos, player, hand, player.getHeldItem(hand), facing, hitX, hitY, hitZ); @Override
} public IOrientable getOrientable( final IBlockAccess w, final BlockPos pos )
{
return this.getTileEntity( w, pos );
}
@Override @Override
public IOrientable getOrientable(final IBlockAccess w, final BlockPos pos) { public ICustomCollision getCustomCollision( final World w, final BlockPos pos )
return this.getTileEntity(w, pos); {
} final AEBaseTile te = this.getTileEntity( w, pos );
if( te instanceof ICustomCollision )
{
return (ICustomCollision) te;
}
@Override return super.getCustomCollision( w, pos );
public ICustomCollision getCustomCollision(final World w, final BlockPos pos) { }
final AEBaseTile te = this.getTileEntity(w, pos);
if (te instanceof ICustomCollision) {
return (ICustomCollision) te;
}
return super.getCustomCollision(w, pos);
}
} }
@@ -22,8 +22,10 @@ package appeng.block;
import net.minecraft.block.material.Material; import net.minecraft.block.material.Material;
public abstract class AEDecorativeBlock extends AEBaseBlock { public abstract class AEDecorativeBlock extends AEBaseBlock
public AEDecorativeBlock(final Material mat) { {
super(mat); public AEDecorativeBlock( final Material mat )
} {
super( mat );
}
} }
@@ -23,24 +23,29 @@ import net.minecraft.world.IBlockAccess;
import net.minecraftforge.common.property.IUnlistedProperty; import net.minecraftforge.common.property.IUnlistedProperty;
public final class UnlistedBlockAccess implements IUnlistedProperty<IBlockAccess> { public final class UnlistedBlockAccess implements IUnlistedProperty<IBlockAccess>
@Override {
public String getName() { @Override
return "ba"; public String getName()
} {
return "ba";
}
@Override @Override
public boolean isValid(final IBlockAccess value) { public boolean isValid( final IBlockAccess value )
return true; {
} return true;
}
@Override @Override
public Class<IBlockAccess> getType() { public Class<IBlockAccess> getType()
return IBlockAccess.class; {
} return IBlockAccess.class;
}
@Override @Override
public String valueToString(final IBlockAccess value) { public String valueToString( final IBlockAccess value )
return null; {
} return null;
}
} }
@@ -23,24 +23,29 @@ import net.minecraft.util.math.BlockPos;
import net.minecraftforge.common.property.IUnlistedProperty; import net.minecraftforge.common.property.IUnlistedProperty;
public final class UnlistedBlockPos implements IUnlistedProperty<BlockPos> { public final class UnlistedBlockPos implements IUnlistedProperty<BlockPos>
@Override {
public String getName() { @Override
return "pos"; public String getName()
} {
return "pos";
}
@Override @Override
public boolean isValid(final BlockPos value) { public boolean isValid( final BlockPos value )
return true; {
} return true;
}
@Override @Override
public Class<BlockPos> getType() { public Class<BlockPos> getType()
return BlockPos.class; {
} return BlockPos.class;
}
@Override @Override
public String valueToString(final BlockPos value) { public String valueToString( final BlockPos value )
return null; {
} return null;
}
} }
@@ -23,32 +23,38 @@ import net.minecraft.util.EnumFacing;
import net.minecraftforge.common.property.IUnlistedProperty; import net.minecraftforge.common.property.IUnlistedProperty;
public class UnlistedDirection implements IUnlistedProperty<EnumFacing> { public class UnlistedDirection implements IUnlistedProperty<EnumFacing>
{
private final String name; private final String name;
public UnlistedDirection(String name) { public UnlistedDirection( String name )
this.name = name; {
} this.name = name;
}
@Override @Override
public String getName() { public String getName()
return this.name; {
} return this.name;
}
@Override @Override
public boolean isValid(EnumFacing value) { public boolean isValid( EnumFacing value )
return value != null; {
} return value != null;
}
@Override @Override
public Class<EnumFacing> getType() { public Class<EnumFacing> getType()
return EnumFacing.class; {
} return EnumFacing.class;
}
@Override @Override
public String valueToString(EnumFacing value) { public String valueToString( EnumFacing value )
return value.getName(); {
} return value.getName();
}
} }
@@ -19,9 +19,6 @@
package appeng.block.crafting; package appeng.block.crafting;
import appeng.api.util.AEColor;
import appeng.client.UnlistedProperty;
import appeng.tile.crafting.TileCraftingMonitorTile;
import net.minecraft.block.state.BlockStateContainer; import net.minecraft.block.state.BlockStateContainer;
import net.minecraft.block.state.IBlockState; import net.minecraft.block.state.IBlockState;
import net.minecraft.creativetab.CreativeTabs; import net.minecraft.creativetab.CreativeTabs;
@@ -36,47 +33,57 @@ import net.minecraftforge.common.property.IUnlistedProperty;
import net.minecraftforge.fml.relauncher.Side; import net.minecraftforge.fml.relauncher.Side;
import net.minecraftforge.fml.relauncher.SideOnly; import net.minecraftforge.fml.relauncher.SideOnly;
import appeng.api.util.AEColor;
import appeng.client.UnlistedProperty;
import appeng.tile.crafting.TileCraftingMonitorTile;
public class BlockCraftingMonitor extends BlockCraftingUnit {
public static final UnlistedProperty<AEColor> COLOR = new UnlistedProperty<>("color", AEColor.class); public class BlockCraftingMonitor extends BlockCraftingUnit
{
public BlockCraftingMonitor() { public static final UnlistedProperty<AEColor> COLOR = new UnlistedProperty<>( "color", AEColor.class );
super(CraftingUnitType.MONITOR);
}
@Override public BlockCraftingMonitor()
protected BlockStateContainer createBlockState() { {
return new ExtendedBlockState(this, this.getAEStates(), new IUnlistedProperty[]{ super( CraftingUnitType.MONITOR );
STATE, }
COLOR,
FORWARD,
UP
});
}
@Override @Override
public IExtendedBlockState getExtendedState(IBlockState state, IBlockAccess world, BlockPos pos) { protected BlockStateContainer createBlockState()
AEColor color = AEColor.TRANSPARENT; {
EnumFacing forward = EnumFacing.NORTH; return new ExtendedBlockState( this, this.getAEStates(), new IUnlistedProperty[] {
EnumFacing up = EnumFacing.UP; STATE,
COLOR,
FORWARD,
UP
} );
}
TileCraftingMonitorTile te = this.getTileEntity(world, pos); @Override
if (te != null) { public IExtendedBlockState getExtendedState( IBlockState state, IBlockAccess world, BlockPos pos )
color = te.getColor(); {
forward = te.getForward(); AEColor color = AEColor.TRANSPARENT;
up = te.getUp(); EnumFacing forward = EnumFacing.NORTH;
} EnumFacing up = EnumFacing.UP;
return super.getExtendedState(state, world, pos) TileCraftingMonitorTile te = this.getTileEntity( world, pos );
.withProperty(COLOR, color) if( te != null )
.withProperty(FORWARD, forward) {
.withProperty(UP, up); color = te.getColor();
} forward = te.getForward();
up = te.getUp();
}
@Override return super.getExtendedState( state, world, pos )
@SideOnly(Side.CLIENT) .withProperty( COLOR, color )
public void getSubBlocks(final CreativeTabs tabs, final NonNullList<ItemStack> itemStacks) { .withProperty( FORWARD, forward )
itemStacks.add(new ItemStack(this, 1, 0)); .withProperty( UP, up );
} }
@Override
@SideOnly( Side.CLIENT )
public void getSubBlocks( final CreativeTabs tabs, final NonNullList<ItemStack> itemStacks )
{
itemStacks.add( new ItemStack( this, 1, 0 ) );
}
} }
@@ -19,10 +19,12 @@
package appeng.block.crafting; package appeng.block.crafting;
public class BlockCraftingStorage extends BlockCraftingUnit { public class BlockCraftingStorage extends BlockCraftingUnit
{
public BlockCraftingStorage(final CraftingUnitType type) { public BlockCraftingStorage( final CraftingUnitType type )
super(type); {
} super( type );
}
} }
@@ -19,13 +19,8 @@
package appeng.block.crafting; package appeng.block.crafting;
import appeng.api.util.AEPartLocation; import java.util.EnumSet;
import appeng.block.AEBaseTileBlock;
import appeng.client.UnlistedProperty;
import appeng.client.render.crafting.CraftingCubeState;
import appeng.core.sync.GuiBridge;
import appeng.tile.crafting.TileCraftingTile;
import appeng.util.Platform;
import net.minecraft.block.Block; import net.minecraft.block.Block;
import net.minecraft.block.material.Material; import net.minecraft.block.material.Material;
import net.minecraft.block.properties.IProperty; import net.minecraft.block.properties.IProperty;
@@ -43,105 +38,130 @@ import net.minecraftforge.common.property.ExtendedBlockState;
import net.minecraftforge.common.property.IExtendedBlockState; import net.minecraftforge.common.property.IExtendedBlockState;
import net.minecraftforge.common.property.IUnlistedProperty; import net.minecraftforge.common.property.IUnlistedProperty;
import java.util.EnumSet; import appeng.api.util.AEPartLocation;
import appeng.block.AEBaseTileBlock;
import appeng.client.UnlistedProperty;
import appeng.client.render.crafting.CraftingCubeState;
import appeng.core.sync.GuiBridge;
import appeng.tile.crafting.TileCraftingTile;
import appeng.util.Platform;
public class BlockCraftingUnit extends AEBaseTileBlock { public class BlockCraftingUnit extends AEBaseTileBlock
public static final PropertyBool FORMED = PropertyBool.create("formed"); {
public static final PropertyBool POWERED = PropertyBool.create("powered"); public static final PropertyBool FORMED = PropertyBool.create( "formed" );
public static final UnlistedProperty<CraftingCubeState> STATE = new UnlistedProperty<>("state", CraftingCubeState.class); public static final PropertyBool POWERED = PropertyBool.create( "powered" );
public static final UnlistedProperty<CraftingCubeState> STATE = new UnlistedProperty<>( "state", CraftingCubeState.class );
public final CraftingUnitType type; public final CraftingUnitType type;
public BlockCraftingUnit(final CraftingUnitType type) { public BlockCraftingUnit( final CraftingUnitType type )
super(Material.IRON); {
super( Material.IRON );
this.type = type; this.type = type;
} }
@Override @Override
protected IProperty[] getAEStates() { protected IProperty[] getAEStates()
return new IProperty[]{POWERED, FORMED}; {
} return new IProperty[] { POWERED, FORMED };
}
@Override @Override
public IExtendedBlockState getExtendedState(IBlockState state, IBlockAccess world, BlockPos pos) { public IExtendedBlockState getExtendedState( IBlockState state, IBlockAccess world, BlockPos pos )
{
EnumSet<EnumFacing> connections = EnumSet.noneOf(EnumFacing.class); EnumSet<EnumFacing> connections = EnumSet.noneOf( EnumFacing.class );
for (EnumFacing facing : EnumFacing.values()) { for( EnumFacing facing : EnumFacing.values() )
if (this.isConnected(world, pos, facing)) { {
connections.add(facing); if( this.isConnected( world, pos, facing ) )
} {
} connections.add( facing );
}
}
IExtendedBlockState extState = (IExtendedBlockState) state; IExtendedBlockState extState = (IExtendedBlockState) state;
return extState.withProperty(STATE, new CraftingCubeState(connections)); return extState.withProperty( STATE, new CraftingCubeState( connections ) );
} }
private boolean isConnected(IBlockAccess world, BlockPos pos, EnumFacing side) { private boolean isConnected( IBlockAccess world, BlockPos pos, EnumFacing side )
BlockPos adjacentPos = pos.offset(side); {
return world.getBlockState(adjacentPos).getBlock() instanceof BlockCraftingUnit; BlockPos adjacentPos = pos.offset( side );
} return world.getBlockState( adjacentPos ).getBlock() instanceof BlockCraftingUnit;
}
@Override @Override
protected BlockStateContainer createBlockState() { protected BlockStateContainer createBlockState()
return new ExtendedBlockState(this, this.getAEStates(), new IUnlistedProperty[]{STATE}); {
} return new ExtendedBlockState( this, this.getAEStates(), new IUnlistedProperty[] { STATE } );
}
@Override @Override
public IBlockState getStateFromMeta(final int meta) { public IBlockState getStateFromMeta( final int meta )
return this.getDefaultState().withProperty(POWERED, (meta & 1) == 1).withProperty(FORMED, (meta & 2) == 2); {
} return this.getDefaultState().withProperty( POWERED, ( meta & 1 ) == 1 ).withProperty( FORMED, ( meta & 2 ) == 2 );
}
@Override @Override
public int getMetaFromState(final IBlockState state) { public int getMetaFromState( final IBlockState state )
boolean p = state.getValue(POWERED); {
boolean f = state.getValue(FORMED); boolean p = state.getValue( POWERED );
return (p ? 1 : 0) | (f ? 2 : 0); boolean f = state.getValue( FORMED );
} return ( p ? 1 : 0 ) | ( f ? 2 : 0 );
}
@Override @Override
public void neighborChanged(final IBlockState state, final World worldIn, final BlockPos pos, final Block blockIn, final BlockPos fromPos) { public void neighborChanged( final IBlockState state, final World worldIn, final BlockPos pos, final Block blockIn, final BlockPos fromPos )
final TileCraftingTile cp = this.getTileEntity(worldIn, pos); {
if (cp != null) { final TileCraftingTile cp = this.getTileEntity( worldIn, pos );
cp.updateMultiBlock(); if( cp != null )
} {
} cp.updateMultiBlock();
}
}
@Override @Override
public BlockRenderLayer getBlockLayer() { public BlockRenderLayer getBlockLayer()
return BlockRenderLayer.CUTOUT; {
} return BlockRenderLayer.CUTOUT;
}
@Override @Override
public void breakBlock(final World w, final BlockPos pos, final IBlockState state) { public void breakBlock( final World w, final BlockPos pos, final IBlockState state )
final TileCraftingTile cp = this.getTileEntity(w, pos); {
if (cp != null) { final TileCraftingTile cp = this.getTileEntity( w, pos );
cp.breakCluster(); if( cp != null )
} {
cp.breakCluster();
}
super.breakBlock(w, pos, state); super.breakBlock( w, pos, state );
} }
@Override @Override
public boolean onBlockActivated(final World w, final BlockPos pos, final IBlockState state, final EntityPlayer p, final EnumHand hand, final EnumFacing side, final float hitX, final float hitY, final float hitZ) { public boolean onBlockActivated( final World w, final BlockPos pos, final IBlockState state, final EntityPlayer p, final EnumHand hand, final EnumFacing side, final float hitX, final float hitY, final float hitZ )
final TileCraftingTile tg = this.getTileEntity(w, pos); {
final TileCraftingTile tg = this.getTileEntity( w, pos );
if (tg != null && !p.isSneaking() && tg.isFormed() && tg.isActive()) { if( tg != null && !p.isSneaking() && tg.isFormed() && tg.isActive() )
if (Platform.isClient()) { {
return true; if( Platform.isClient() )
} {
return true;
}
Platform.openGUI(p, tg, AEPartLocation.fromFacing(side), GuiBridge.GUI_CRAFTING_CPU); Platform.openGUI( p, tg, AEPartLocation.fromFacing( side ), GuiBridge.GUI_CRAFTING_CPU );
return true; return true;
} }
return super.onBlockActivated(w, pos, state, p, hand, side, hitX, hitY, hitZ); return super.onBlockActivated( w, pos, state, p, hand, side, hitX, hitY, hitZ );
} }
public enum CraftingUnitType { public enum CraftingUnitType
UNIT, ACCELERATOR, STORAGE_1K, STORAGE_4K, STORAGE_16K, STORAGE_64K, MONITOR {
} UNIT, ACCELERATOR, STORAGE_1K, STORAGE_4K, STORAGE_16K, STORAGE_64K, MONITOR
}
} }
@@ -19,11 +19,6 @@
package appeng.block.crafting; package appeng.block.crafting;
import appeng.api.util.AEPartLocation;
import appeng.block.AEBaseTileBlock;
import appeng.core.sync.GuiBridge;
import appeng.tile.crafting.TileMolecularAssembler;
import appeng.util.Platform;
import net.minecraft.block.material.Material; import net.minecraft.block.material.Material;
import net.minecraft.block.properties.IProperty; import net.minecraft.block.properties.IProperty;
import net.minecraft.block.properties.PropertyBool; import net.minecraft.block.properties.PropertyBool;
@@ -38,71 +33,79 @@ import net.minecraft.world.World;
import net.minecraftforge.fml.relauncher.Side; import net.minecraftforge.fml.relauncher.Side;
import net.minecraftforge.fml.relauncher.SideOnly; import net.minecraftforge.fml.relauncher.SideOnly;
import appeng.api.util.AEPartLocation;
import appeng.block.AEBaseTileBlock;
import appeng.core.sync.GuiBridge;
import appeng.tile.crafting.TileMolecularAssembler;
import appeng.util.Platform;
public class BlockMolecularAssembler extends AEBaseTileBlock {
public static final PropertyBool POWERED = PropertyBool.create("powered"); public class BlockMolecularAssembler extends AEBaseTileBlock
{
public BlockMolecularAssembler() { public static final PropertyBool POWERED = PropertyBool.create( "powered" );
super(Material.IRON);
this.setOpaque(false); public BlockMolecularAssembler()
this.lightOpacity = 1; {
} super( Material.IRON );
@Override this.setOpaque( false );
protected IProperty[] getAEStates() { this.lightOpacity = 1;
return new IProperty[]{POWERED}; }
}
@Override @Override
public IBlockState getActualState(IBlockState state, IBlockAccess worldIn, BlockPos pos) { protected IProperty[] getAEStates()
boolean powered = false; {
TileMolecularAssembler te = this.getTileEntity(worldIn, pos); return new IProperty[] { POWERED };
if (te != null) { }
powered = te.isPowered();
}
return super.getActualState(state, worldIn, pos).withProperty(POWERED, powered); @Override
} public IBlockState getActualState( IBlockState state, IBlockAccess worldIn, BlockPos pos )
{
boolean powered = false;
TileMolecularAssembler te = this.getTileEntity( worldIn, pos );
if( te != null )
{
powered = te.isPowered();
}
/** return super.getActualState( state, worldIn, pos ).withProperty( POWERED, powered );
* NOTE: This is only used to determine how to render an item being held in hand. }
* For determining block rendering, the method below is used (canRenderInLayer).
*/
@SideOnly(Side.CLIENT)
@Override
public BlockRenderLayer getBlockLayer() {
return BlockRenderLayer.CUTOUT;
}
@SideOnly(Side.CLIENT) /**
@Override * NOTE: This is only used to determine how to render an item being held in hand.
public boolean canRenderInLayer(IBlockState state, BlockRenderLayer layer) { * For determining block rendering, the method below is used (canRenderInLayer).
return layer == BlockRenderLayer.CUTOUT || layer == BlockRenderLayer.TRANSLUCENT; */
} @SideOnly( Side.CLIENT )
@Override
public BlockRenderLayer getBlockLayer()
{
return BlockRenderLayer.CUTOUT;
}
@Override @SideOnly( Side.CLIENT )
public boolean isFullCube(IBlockState state) { @Override
return false; public boolean canRenderInLayer( IBlockState state, BlockRenderLayer layer )
} {
return layer == BlockRenderLayer.CUTOUT || layer == BlockRenderLayer.TRANSLUCENT;
}
@Override @Override
public boolean onBlockActivated(final World w, final BlockPos pos, final IBlockState state, final EntityPlayer p, final EnumHand hand, final EnumFacing side, final float hitX, final float hitY, final float hitZ) { public boolean isFullCube( IBlockState state )
final TileMolecularAssembler tg = this.getTileEntity(w, pos); {
if (tg != null && !p.isSneaking()) { return false;
Platform.openGUI(p, tg, AEPartLocation.fromFacing(side), GuiBridge.GUI_MAC); }
return true;
}
return super.onBlockActivated(w, pos, state, p, hand, side, hitX, hitY, hitZ); @Override
} public boolean onBlockActivated( final World w, final BlockPos pos, final IBlockState state, final EntityPlayer p, final EnumHand hand, final EnumFacing side, final float hitX, final float hitY, final float hitZ )
{
final TileMolecularAssembler tg = this.getTileEntity( w, pos );
if( tg != null && !p.isSneaking() )
{
Platform.openGUI( p, tg, AEPartLocation.fromFacing( side ), GuiBridge.GUI_MAC );
return true;
}
@Override return super.onBlockActivated( w, pos, state, p, hand, side, hitX, hitY, hitZ );
public void onNeighborChange(IBlockAccess world, BlockPos pos, BlockPos neighbor) { }
final TileMolecularAssembler tg = this.getTileEntity(world, pos);
if (tg != null) {
tg.updateNeighbors(world, pos, neighbor);
}
}
} }
@@ -19,27 +19,32 @@
package appeng.block.crafting; package appeng.block.crafting;
import net.minecraft.block.Block;
import net.minecraft.item.ItemStack;
import appeng.api.AEApi; import appeng.api.AEApi;
import appeng.block.AEBaseItemBlock; import appeng.block.AEBaseItemBlock;
import appeng.core.AEConfig; import appeng.core.AEConfig;
import appeng.core.features.AEFeature; import appeng.core.features.AEFeature;
import net.minecraft.block.Block;
import net.minecraft.item.ItemStack;
public class ItemCraftingStorage extends AEBaseItemBlock { public class ItemCraftingStorage extends AEBaseItemBlock
{
public ItemCraftingStorage(final Block id) { public ItemCraftingStorage( final Block id )
super(id); {
} super( id );
}
@Override @Override
public ItemStack getContainerItem(final ItemStack itemStack) { public ItemStack getContainerItem( final ItemStack itemStack )
return AEApi.instance().definitions().blocks().craftingUnit().maybeStack(1).orElse(ItemStack.EMPTY); {
} return AEApi.instance().definitions().blocks().craftingUnit().maybeStack( 1 ).orElse( ItemStack.EMPTY );
}
@Override @Override
public boolean hasContainerItem(final ItemStack stack) { public boolean hasContainerItem( final ItemStack stack )
return AEConfig.instance().isFeatureEnabled(AEFeature.ENABLE_DISASSEMBLY_CRAFTING); {
} return AEConfig.instance().isFeatureEnabled( AEFeature.ENABLE_DISASSEMBLY_CRAFTING );
}
} }
@@ -19,11 +19,8 @@
package appeng.block.grindstone; package appeng.block.grindstone;
import appeng.api.implementations.tiles.ICrankable; import javax.annotation.Nullable;
import appeng.block.AEBaseTileBlock;
import appeng.core.stats.Stats;
import appeng.tile.AEBaseTile;
import appeng.tile.grindstone.TileCrank;
import net.minecraft.block.Block; import net.minecraft.block.Block;
import net.minecraft.block.material.Material; import net.minecraft.block.material.Material;
import net.minecraft.block.state.BlockFaceShape; import net.minecraft.block.state.BlockFaceShape;
@@ -40,114 +37,145 @@ import net.minecraft.world.IBlockAccess;
import net.minecraft.world.World; import net.minecraft.world.World;
import net.minecraftforge.common.util.FakePlayer; import net.minecraftforge.common.util.FakePlayer;
import javax.annotation.Nullable; import appeng.api.implementations.tiles.ICrankable;
import appeng.block.AEBaseTileBlock;
import appeng.core.stats.Stats;
import appeng.tile.AEBaseTile;
import appeng.tile.grindstone.TileCrank;
public class BlockCrank extends AEBaseTileBlock { public class BlockCrank extends AEBaseTileBlock
{
public BlockCrank() { public BlockCrank()
super(Material.WOOD); {
super( Material.WOOD );
this.setLightOpacity(0); this.setLightOpacity( 0 );
this.setHarvestLevel("axe", 0); this.setHarvestLevel( "axe", 0 );
this.setFullSize(this.setOpaque(false)); this.setFullSize( this.setOpaque( false ) );
} }
@Override @Override
public boolean onActivated(final World w, final BlockPos pos, final EntityPlayer player, final EnumHand hand, final @Nullable ItemStack heldItem, final EnumFacing side, final float hitX, final float hitY, final float hitZ) { public boolean onActivated( final World w, final BlockPos pos, final EntityPlayer player, final EnumHand hand, final @Nullable ItemStack heldItem, final EnumFacing side, final float hitX, final float hitY, final float hitZ )
if (player instanceof FakePlayer || player == null) { {
this.dropCrank(w, pos); if( player instanceof FakePlayer || player == null )
return true; {
} this.dropCrank( w, pos );
return true;
}
final AEBaseTile tile = this.getTileEntity(w, pos); final AEBaseTile tile = this.getTileEntity( w, pos );
if (tile instanceof TileCrank) { if( tile instanceof TileCrank )
if (((TileCrank) tile).power()) { {
Stats.TurnedCranks.addToPlayer(player, 1); if( ( (TileCrank) tile ).power() )
} {
} Stats.TurnedCranks.addToPlayer( player, 1 );
}
}
return true; return true;
} }
private void dropCrank(final World world, final BlockPos pos) { private void dropCrank( final World world, final BlockPos pos )
world.destroyBlock(pos, true); // w.destroyBlock( x, y, z, true ); {
world.notifyBlockUpdate(pos, this.getDefaultState(), world.getBlockState(pos), 3); world.destroyBlock( pos, true ); // w.destroyBlock( x, y, z, true );
} world.notifyBlockUpdate( pos, this.getDefaultState(), world.getBlockState( pos ), 3 );
}
@Override @Override
public void onBlockPlacedBy(final World world, final BlockPos pos, final IBlockState state, final EntityLivingBase placer, final ItemStack stack) { public void onBlockPlacedBy( final World world, final BlockPos pos, final IBlockState state, final EntityLivingBase placer, final ItemStack stack )
final AEBaseTile tile = this.getTileEntity(world, pos); {
if (tile != null) { final AEBaseTile tile = this.getTileEntity( world, pos );
final EnumFacing mnt = this.findCrankable(world, pos); if( tile != null )
EnumFacing forward = EnumFacing.UP; {
if (mnt == EnumFacing.UP || mnt == EnumFacing.DOWN) { final EnumFacing mnt = this.findCrankable( world, pos );
forward = EnumFacing.SOUTH; EnumFacing forward = EnumFacing.UP;
} if( mnt == EnumFacing.UP || mnt == EnumFacing.DOWN )
tile.setOrientation(forward, mnt.getOpposite()); {
} else { forward = EnumFacing.SOUTH;
this.dropCrank(world, pos); }
} tile.setOrientation( forward, mnt.getOpposite() );
} }
else
{
this.dropCrank( world, pos );
}
}
@Override @Override
public boolean isValidOrientation(final World w, final BlockPos pos, final EnumFacing forward, final EnumFacing up) { public boolean isValidOrientation( final World w, final BlockPos pos, final EnumFacing forward, final EnumFacing up )
final TileEntity te = w.getTileEntity(pos); {
return !(te instanceof TileCrank) || this.isCrankable(w, pos, up.getOpposite()); final TileEntity te = w.getTileEntity( pos );
} return !( te instanceof TileCrank ) || this.isCrankable( w, pos, up.getOpposite() );
}
private EnumFacing findCrankable(final World world, final BlockPos pos) { private EnumFacing findCrankable( final World world, final BlockPos pos )
for (final EnumFacing dir : EnumFacing.VALUES) { {
if (this.isCrankable(world, pos, dir)) { for( final EnumFacing dir : EnumFacing.VALUES )
return dir; {
} if( this.isCrankable( world, pos, dir ) )
} {
return null; return dir;
} }
}
return null;
}
private boolean isCrankable(final World world, final BlockPos pos, final EnumFacing offset) { private boolean isCrankable( final World world, final BlockPos pos, final EnumFacing offset )
final BlockPos o = pos.offset(offset); {
final TileEntity te = world.getTileEntity(o); final BlockPos o = pos.offset( offset );
final TileEntity te = world.getTileEntity( o );
return te instanceof ICrankable && ((ICrankable) te).canCrankAttach(offset.getOpposite()); return te instanceof ICrankable && ( (ICrankable) te ).canCrankAttach( offset.getOpposite() );
} }
@Override @Override
public EnumBlockRenderType getRenderType(IBlockState state) { public EnumBlockRenderType getRenderType( IBlockState state )
return EnumBlockRenderType.ENTITYBLOCK_ANIMATED; {
} return EnumBlockRenderType.ENTITYBLOCK_ANIMATED;
}
@Override @Override
public void neighborChanged(IBlockState state, World world, BlockPos pos, Block blockIn, BlockPos fromPos) { public void neighborChanged( IBlockState state, World world, BlockPos pos, Block blockIn, BlockPos fromPos )
{
final AEBaseTile tile = this.getTileEntity(world, pos); final AEBaseTile tile = this.getTileEntity( world, pos );
if (tile != null) { if( tile != null )
if (!this.isCrankable(world, pos, tile.getUp().getOpposite())) { {
this.dropCrank(world, pos); if( !this.isCrankable( world, pos, tile.getUp().getOpposite() ) )
} {
} else { this.dropCrank( world, pos );
this.dropCrank(world, pos); }
} }
} else
{
this.dropCrank( world, pos );
}
}
@Override @Override
public boolean canPlaceBlockAt(final World world, final BlockPos pos) { public boolean canPlaceBlockAt( final World world, final BlockPos pos )
return this.findCrankable(world, pos) != null; {
} return this.findCrankable( world, pos ) != null;
}
@Override @Override
public boolean isFullCube(IBlockState state) { public boolean isFullCube( IBlockState state )
return false; {
} return false;
}
@Override @Override
public boolean canPlaceTorchOnTop(IBlockState state, IBlockAccess world, BlockPos pos) { public boolean canPlaceTorchOnTop( IBlockState state, IBlockAccess world, BlockPos pos )
return false; {
} return false;
}
@Override @Override
public BlockFaceShape getBlockFaceShape(IBlockAccess worldIn, IBlockState state, BlockPos pos, EnumFacing face) { public BlockFaceShape getBlockFaceShape( IBlockAccess worldIn, IBlockState state, BlockPos pos, EnumFacing face )
return BlockFaceShape.UNDEFINED; {
} return BlockFaceShape.UNDEFINED;
}
} }
@@ -19,11 +19,8 @@
package appeng.block.grindstone; package appeng.block.grindstone;
import appeng.api.util.AEPartLocation; import javax.annotation.Nullable;
import appeng.block.AEBaseTileBlock;
import appeng.core.sync.GuiBridge;
import appeng.tile.grindstone.TileGrinder;
import appeng.util.Platform;
import net.minecraft.block.material.Material; import net.minecraft.block.material.Material;
import net.minecraft.entity.player.EntityPlayer; import net.minecraft.entity.player.EntityPlayer;
import net.minecraft.item.ItemStack; import net.minecraft.item.ItemStack;
@@ -32,24 +29,32 @@ import net.minecraft.util.EnumHand;
import net.minecraft.util.math.BlockPos; import net.minecraft.util.math.BlockPos;
import net.minecraft.world.World; import net.minecraft.world.World;
import javax.annotation.Nullable; import appeng.api.util.AEPartLocation;
import appeng.block.AEBaseTileBlock;
import appeng.core.sync.GuiBridge;
import appeng.tile.grindstone.TileGrinder;
import appeng.util.Platform;
public class BlockGrinder extends AEBaseTileBlock { public class BlockGrinder extends AEBaseTileBlock
{
public BlockGrinder() { public BlockGrinder()
super(Material.ROCK); {
super( Material.ROCK );
this.setHardness(3.2F); this.setHardness( 3.2F );
} }
@Override @Override
public boolean onActivated(final World w, final BlockPos pos, final EntityPlayer p, final EnumHand hand, final @Nullable ItemStack heldItem, final EnumFacing side, final float hitX, final float hitY, final float hitZ) { public boolean onActivated( final World w, final BlockPos pos, final EntityPlayer p, final EnumHand hand, final @Nullable ItemStack heldItem, final EnumFacing side, final float hitX, final float hitY, final float hitZ )
final TileGrinder tg = this.getTileEntity(w, pos); {
if (tg != null && !p.isSneaking()) { final TileGrinder tg = this.getTileEntity( w, pos );
Platform.openGUI(p, tg, AEPartLocation.fromFacing(side), GuiBridge.GUI_GRINDER); if( tg != null && !p.isSneaking() )
return true; {
} Platform.openGUI( p, tg, AEPartLocation.fromFacing( side ), GuiBridge.GUI_GRINDER );
return false; return true;
} }
return false;
}
} }
@@ -19,19 +19,22 @@
package appeng.block.grindstone; package appeng.block.grindstone;
import net.minecraftforge.fml.relauncher.Side;
import net.minecraftforge.fml.relauncher.SideOnly;
import appeng.bootstrap.BlockRenderingCustomizer; import appeng.bootstrap.BlockRenderingCustomizer;
import appeng.bootstrap.IBlockRendering; import appeng.bootstrap.IBlockRendering;
import appeng.bootstrap.IItemRendering; import appeng.bootstrap.IItemRendering;
import appeng.client.render.tesr.CrankTESR; import appeng.client.render.tesr.CrankTESR;
import net.minecraftforge.fml.relauncher.Side;
import net.minecraftforge.fml.relauncher.SideOnly;
public class CrankRendering extends BlockRenderingCustomizer { public class CrankRendering extends BlockRenderingCustomizer
{
@Override @Override
@SideOnly(Side.CLIENT) @SideOnly( Side.CLIENT )
public void customize(IBlockRendering rendering, IItemRendering itemRendering) { public void customize( IBlockRendering rendering, IItemRendering itemRendering )
rendering.tesr(new CrankTESR()); {
} rendering.tesr( new CrankTESR() );
}
} }
@@ -19,11 +19,8 @@
package appeng.block.misc; package appeng.block.misc;
import appeng.api.util.AEPartLocation; import javax.annotation.Nullable;
import appeng.block.AEBaseTileBlock;
import appeng.core.sync.GuiBridge;
import appeng.tile.misc.TileCellWorkbench;
import appeng.util.Platform;
import net.minecraft.block.material.Material; import net.minecraft.block.material.Material;
import net.minecraft.entity.player.EntityPlayer; import net.minecraft.entity.player.EntityPlayer;
import net.minecraft.item.ItemStack; import net.minecraft.item.ItemStack;
@@ -32,28 +29,38 @@ import net.minecraft.util.EnumHand;
import net.minecraft.util.math.BlockPos; import net.minecraft.util.math.BlockPos;
import net.minecraft.world.World; import net.minecraft.world.World;
import javax.annotation.Nullable; import appeng.api.util.AEPartLocation;
import appeng.block.AEBaseTileBlock;
import appeng.core.sync.GuiBridge;
import appeng.tile.misc.TileCellWorkbench;
import appeng.util.Platform;
public class BlockCellWorkbench extends AEBaseTileBlock { public class BlockCellWorkbench extends AEBaseTileBlock
{
public BlockCellWorkbench() { public BlockCellWorkbench()
super(Material.IRON); {
} super( Material.IRON );
}
@Override @Override
public boolean onActivated(final World w, final BlockPos pos, final EntityPlayer p, final EnumHand hand, final @Nullable ItemStack heldItem, final EnumFacing side, final float hitX, final float hitY, final float hitZ) { public boolean onActivated( final World w, final BlockPos pos, final EntityPlayer p, final EnumHand hand, final @Nullable ItemStack heldItem, final EnumFacing side, final float hitX, final float hitY, final float hitZ )
if (p.isSneaking()) { {
return false; if( p.isSneaking() )
} {
return false;
}
final TileCellWorkbench tg = this.getTileEntity(w, pos); final TileCellWorkbench tg = this.getTileEntity( w, pos );
if (tg != null) { if( tg != null )
if (Platform.isServer()) { {
Platform.openGUI(p, tg, AEPartLocation.fromFacing(side), GuiBridge.GUI_CELL_WORKBENCH); if( Platform.isServer() )
} {
return true; Platform.openGUI( p, tg, AEPartLocation.fromFacing( side ), GuiBridge.GUI_CELL_WORKBENCH );
} }
return false; return true;
} }
return false;
}
} }
+150 -125
View File
@@ -19,18 +19,17 @@
package appeng.block.misc; package appeng.block.misc;
import appeng.api.AEApi; import java.util.Collections;
import appeng.api.util.AEAxisAlignedBB; import java.util.List;
import appeng.block.AEBaseTileBlock; import java.util.Random;
import appeng.client.render.effects.LightningFX;
import appeng.client.render.renderable.ItemRenderable; import javax.annotation.Nullable;
import appeng.client.render.tesr.ModularTESR;
import appeng.core.AEConfig; import org.apache.commons.lang3.tuple.ImmutablePair;
import appeng.core.AppEng; import org.apache.commons.lang3.tuple.Pair;
import appeng.helpers.ICustomCollision; import org.lwjgl.util.vector.Matrix4f;
import appeng.tile.AEBaseTile; import org.lwjgl.util.vector.Vector3f;
import appeng.tile.misc.TileCharger;
import appeng.util.Platform;
import net.minecraft.block.material.Material; import net.minecraft.block.material.Material;
import net.minecraft.block.state.IBlockState; import net.minecraft.block.state.IBlockState;
import net.minecraft.client.Minecraft; import net.minecraft.client.Minecraft;
@@ -45,138 +44,164 @@ import net.minecraft.util.math.BlockPos;
import net.minecraft.world.World; import net.minecraft.world.World;
import net.minecraftforge.fml.relauncher.Side; import net.minecraftforge.fml.relauncher.Side;
import net.minecraftforge.fml.relauncher.SideOnly; import net.minecraftforge.fml.relauncher.SideOnly;
import org.apache.commons.lang3.tuple.ImmutablePair;
import org.apache.commons.lang3.tuple.Pair;
import org.lwjgl.util.vector.Matrix4f;
import org.lwjgl.util.vector.Vector3f;
import javax.annotation.Nullable; import appeng.api.AEApi;
import java.util.Collections; import appeng.api.util.AEAxisAlignedBB;
import java.util.List; import appeng.block.AEBaseTileBlock;
import java.util.Random; import appeng.client.render.effects.LightningFX;
import appeng.client.render.renderable.ItemRenderable;
import appeng.client.render.tesr.ModularTESR;
import appeng.core.AEConfig;
import appeng.core.AppEng;
import appeng.helpers.ICustomCollision;
import appeng.tile.AEBaseTile;
import appeng.tile.misc.TileCharger;
import appeng.util.Platform;
public class BlockCharger extends AEBaseTileBlock implements ICustomCollision { public class BlockCharger extends AEBaseTileBlock implements ICustomCollision
{
public BlockCharger() { public BlockCharger()
super(Material.IRON); {
super( Material.IRON );
this.setLightOpacity(2); this.setLightOpacity( 2 );
this.setFullSize(this.setOpaque(false)); this.setFullSize( this.setOpaque( false ) );
} }
@Override @Override
public boolean onActivated(final World w, final BlockPos pos, final EntityPlayer player, final EnumHand hand, final @Nullable ItemStack heldItem, final EnumFacing side, final float hitX, final float hitY, final float hitZ) { public boolean onActivated( final World w, final BlockPos pos, final EntityPlayer player, final EnumHand hand, final @Nullable ItemStack heldItem, final EnumFacing side, final float hitX, final float hitY, final float hitZ )
if (player.isSneaking()) { {
return false; if( player.isSneaking() )
} {
return false;
}
if (Platform.isServer()) { if( Platform.isServer() )
final TileCharger tc = this.getTileEntity(w, pos); {
if (tc != null) { final TileCharger tc = this.getTileEntity( w, pos );
tc.activate(player); if( tc != null )
} {
} tc.activate( player );
}
}
return true; return true;
} }
@Override @Override
@SideOnly(Side.CLIENT) @SideOnly( Side.CLIENT )
public void randomDisplayTick(final IBlockState state, final World w, final BlockPos pos, final Random r) { public void randomDisplayTick( final IBlockState state, final World w, final BlockPos pos, final Random r )
if (!AEConfig.instance().isEnableEffects()) { {
return; if( !AEConfig.instance().isEnableEffects() )
} {
return;
}
if (r.nextFloat() < 0.98) { if( r.nextFloat() < 0.98 )
return; {
} return;
}
final AEBaseTile tile = this.getTileEntity(w, pos); final AEBaseTile tile = this.getTileEntity( w, pos );
if (tile instanceof TileCharger) { if( tile instanceof TileCharger )
final TileCharger tc = (TileCharger) tile; {
final TileCharger tc = (TileCharger) tile;
if (AEApi.instance().definitions().materials().certusQuartzCrystalCharged().isSameAs(tc.getInternalInventory().getStackInSlot(0))) { if( AEApi.instance().definitions().materials().certusQuartzCrystalCharged().isSameAs( tc.getInternalInventory().getStackInSlot( 0 ) ) )
final double xOff = 0.0; {
final double yOff = 0.0; final double xOff = 0.0;
final double zOff = 0.0; final double yOff = 0.0;
final double zOff = 0.0;
for (int bolts = 0; bolts < 3; bolts++) { for( int bolts = 0; bolts < 3; bolts++ )
if (AppEng.proxy.shouldAddParticles(r)) { {
final LightningFX fx = new LightningFX(w, xOff + 0.5 + pos.getX(), yOff + 0.5 + pos.getY(), zOff + 0.5 + pos if( AppEng.proxy.shouldAddParticles( r ) )
.getZ(), 0.0D, 0.0D, 0.0D); {
Minecraft.getMinecraft().effectRenderer.addEffect(fx); final LightningFX fx = new LightningFX( w, xOff + 0.5 + pos.getX(), yOff + 0.5 + pos.getY(), zOff + 0.5 + pos
} .getZ(), 0.0D, 0.0D, 0.0D );
} Minecraft.getMinecraft().effectRenderer.addEffect( fx );
} }
} }
} }
}
}
@Override @Override
public Iterable<AxisAlignedBB> getSelectedBoundingBoxesFromPool(final World w, final BlockPos pos, final Entity thePlayer, final boolean b) { public Iterable<AxisAlignedBB> getSelectedBoundingBoxesFromPool( final World w, final BlockPos pos, final Entity thePlayer, final boolean b )
final TileCharger tile = this.getTileEntity(w, pos); {
if (tile != null) { final TileCharger tile = this.getTileEntity( w, pos );
final double twoPixels = 2.0 / 16.0; if( tile != null )
final EnumFacing up = tile.getUp(); {
final EnumFacing forward = tile.getForward(); final double twoPixels = 2.0 / 16.0;
final AEAxisAlignedBB bb = new AEAxisAlignedBB(twoPixels, twoPixels, twoPixels, 1.0 - twoPixels, 1.0 - twoPixels, 1.0 - twoPixels); final EnumFacing up = tile.getUp();
final EnumFacing forward = tile.getForward();
final AEAxisAlignedBB bb = new AEAxisAlignedBB( twoPixels, twoPixels, twoPixels, 1.0 - twoPixels, 1.0 - twoPixels, 1.0 - twoPixels );
if (up.getFrontOffsetX() != 0) { if( up.getFrontOffsetX() != 0 )
bb.minX = 0; {
bb.maxX = 1; bb.minX = 0;
} bb.maxX = 1;
if (up.getFrontOffsetY() != 0) { }
bb.minY = 0; if( up.getFrontOffsetY() != 0 )
bb.maxY = 1; {
} bb.minY = 0;
if (up.getFrontOffsetZ() != 0) { bb.maxY = 1;
bb.minZ = 0; }
bb.maxZ = 1; if( up.getFrontOffsetZ() != 0 )
} {
bb.minZ = 0;
bb.maxZ = 1;
}
switch (forward) { switch( forward )
case DOWN: {
bb.maxY = 1; case DOWN:
break; bb.maxY = 1;
case UP: break;
bb.minY = 0; case UP:
break; bb.minY = 0;
case NORTH: break;
bb.maxZ = 1; case NORTH:
break; bb.maxZ = 1;
case SOUTH: break;
bb.minZ = 0; case SOUTH:
break; bb.minZ = 0;
case EAST: break;
bb.minX = 0; case EAST:
break; bb.minX = 0;
case WEST: break;
bb.maxX = 1; case WEST:
break; bb.maxX = 1;
default: break;
break; default:
} break;
}
return Collections.singletonList(bb.getBoundingBox()); return Collections.singletonList( bb.getBoundingBox() );
} }
return Collections.singletonList(new AxisAlignedBB(0.0, 0, 0.0, 1.0, 1.0, 1.0)); return Collections.singletonList( new AxisAlignedBB( 0.0, 0, 0.0, 1.0, 1.0, 1.0 ) );
} }
@Override @Override
public void addCollidingBlockToList(final World w, final BlockPos pos, final AxisAlignedBB bb, final List<AxisAlignedBB> out, final Entity e) { public void addCollidingBlockToList( final World w, final BlockPos pos, final AxisAlignedBB bb, final List<AxisAlignedBB> out, final Entity e )
out.add(new AxisAlignedBB(0.0, 0.0, 0.0, 1.0, 1.0, 1.0)); {
} out.add( new AxisAlignedBB( 0.0, 0.0, 0.0, 1.0, 1.0, 1.0 ) );
}
@SideOnly(Side.CLIENT) @SideOnly( Side.CLIENT )
public static TileEntitySpecialRenderer<TileCharger> createTesr() { public static TileEntitySpecialRenderer<TileCharger> createTesr()
return new ModularTESR<>(new ItemRenderable<>(BlockCharger::getRenderedItem)); {
} return new ModularTESR<>( new ItemRenderable<>( BlockCharger::getRenderedItem ) );
}
@SideOnly(Side.CLIENT) @SideOnly( Side.CLIENT )
private static Pair<ItemStack, Matrix4f> getRenderedItem(TileCharger tile) { private static Pair<ItemStack, Matrix4f> getRenderedItem( TileCharger tile )
Matrix4f transform = new Matrix4f(); {
transform.translate(new Vector3f(0.5f, 0.4f, 0.5f)); Matrix4f transform = new Matrix4f();
return new ImmutablePair<>(tile.getInternalInventory().getStackInSlot(0), transform); transform.translate( new Vector3f( 0.5f, 0.4f, 0.5f ) );
} return new ImmutablePair<>( tile.getInternalInventory().getStackInSlot( 0 ), transform );
}
} }
@@ -19,11 +19,8 @@
package appeng.block.misc; package appeng.block.misc;
import appeng.api.util.AEPartLocation; import javax.annotation.Nullable;
import appeng.block.AEBaseTileBlock;
import appeng.core.sync.GuiBridge;
import appeng.tile.misc.TileCondenser;
import appeng.util.Platform;
import net.minecraft.block.material.Material; import net.minecraft.block.material.Material;
import net.minecraft.entity.player.EntityPlayer; import net.minecraft.entity.player.EntityPlayer;
import net.minecraft.item.ItemStack; import net.minecraft.item.ItemStack;
@@ -32,29 +29,39 @@ import net.minecraft.util.EnumHand;
import net.minecraft.util.math.BlockPos; import net.minecraft.util.math.BlockPos;
import net.minecraft.world.World; import net.minecraft.world.World;
import javax.annotation.Nullable; import appeng.api.util.AEPartLocation;
import appeng.block.AEBaseTileBlock;
import appeng.core.sync.GuiBridge;
import appeng.tile.misc.TileCondenser;
import appeng.util.Platform;
public class BlockCondenser extends AEBaseTileBlock { public class BlockCondenser extends AEBaseTileBlock
{
public BlockCondenser() { public BlockCondenser()
super(Material.IRON); {
} super( Material.IRON );
}
@Override @Override
public boolean onActivated(final World w, final BlockPos pos, final EntityPlayer player, final EnumHand hand, final @Nullable ItemStack heldItem, final EnumFacing side, final float hitX, final float hitY, final float hitZ) { public boolean onActivated( final World w, final BlockPos pos, final EntityPlayer player, final EnumHand hand, final @Nullable ItemStack heldItem, final EnumFacing side, final float hitX, final float hitY, final float hitZ )
if (player.isSneaking()) { {
return false; if( player.isSneaking() )
} {
return false;
}
if (Platform.isServer()) { if( Platform.isServer() )
final TileCondenser tc = this.getTileEntity(w, pos); {
if (tc != null && !player.isSneaking()) { final TileCondenser tc = this.getTileEntity( w, pos );
Platform.openGUI(player, tc, AEPartLocation.fromFacing(side), GuiBridge.GUI_CONDENSER); if( tc != null && !player.isSneaking() )
return true; {
} Platform.openGUI( player, tc, AEPartLocation.fromFacing( side ), GuiBridge.GUI_CONDENSER );
} return true;
}
}
return true; return true;
} }
} }
@@ -19,11 +19,8 @@
package appeng.block.misc; package appeng.block.misc;
import appeng.api.util.AEPartLocation; import javax.annotation.Nullable;
import appeng.block.AEBaseTileBlock;
import appeng.core.sync.GuiBridge;
import appeng.tile.misc.TileInscriber;
import appeng.util.Platform;
import net.minecraft.block.material.Material; import net.minecraft.block.material.Material;
import net.minecraft.block.state.IBlockState; import net.minecraft.block.state.IBlockState;
import net.minecraft.entity.player.EntityPlayer; import net.minecraft.entity.player.EntityPlayer;
@@ -34,41 +31,53 @@ import net.minecraft.util.EnumHand;
import net.minecraft.util.math.BlockPos; import net.minecraft.util.math.BlockPos;
import net.minecraft.world.World; import net.minecraft.world.World;
import javax.annotation.Nullable; import appeng.api.util.AEPartLocation;
import appeng.block.AEBaseTileBlock;
import appeng.core.sync.GuiBridge;
import appeng.tile.misc.TileInscriber;
import appeng.util.Platform;
public class BlockInscriber extends AEBaseTileBlock { public class BlockInscriber extends AEBaseTileBlock
{
public BlockInscriber() { public BlockInscriber()
super(Material.IRON); {
super( Material.IRON );
this.setLightOpacity(2); this.setLightOpacity( 2 );
this.setFullSize(this.setOpaque(false)); this.setFullSize( this.setOpaque( false ) );
} }
@Override @Override
public boolean onActivated(final World w, final BlockPos pos, final EntityPlayer p, final EnumHand hand, final @Nullable ItemStack heldItem, final EnumFacing side, final float hitX, final float hitY, final float hitZ) { public boolean onActivated( final World w, final BlockPos pos, final EntityPlayer p, final EnumHand hand, final @Nullable ItemStack heldItem, final EnumFacing side, final float hitX, final float hitY, final float hitZ )
if (p.isSneaking()) { {
return false; if( p.isSneaking() )
} {
return false;
}
final TileInscriber tg = this.getTileEntity(w, pos); final TileInscriber tg = this.getTileEntity( w, pos );
if (tg != null) { if( tg != null )
if (Platform.isServer()) { {
Platform.openGUI(p, tg, AEPartLocation.fromFacing(side), GuiBridge.GUI_INSCRIBER); if( Platform.isServer() )
} {
return true; Platform.openGUI( p, tg, AEPartLocation.fromFacing( side ), GuiBridge.GUI_INSCRIBER );
} }
return false; return true;
} }
return false;
}
@Override @Override
public EnumBlockRenderType getRenderType(IBlockState state) { public EnumBlockRenderType getRenderType( IBlockState state )
return EnumBlockRenderType.MODEL; {
} return EnumBlockRenderType.MODEL;
}
@Override @Override
public String getUnlocalizedName(final ItemStack is) { public String getUnlocalizedName( final ItemStack is )
return super.getUnlocalizedName(is); {
} return super.getUnlocalizedName( is );
}
} }
@@ -19,12 +19,8 @@
package appeng.block.misc; package appeng.block.misc;
import appeng.api.util.AEPartLocation; import javax.annotation.Nullable;
import appeng.api.util.IOrientable;
import appeng.block.AEBaseTileBlock;
import appeng.core.sync.GuiBridge;
import appeng.tile.misc.TileInterface;
import appeng.util.Platform;
import net.minecraft.block.material.Material; import net.minecraft.block.material.Material;
import net.minecraft.block.properties.IProperty; import net.minecraft.block.properties.IProperty;
import net.minecraft.block.properties.PropertyBool; import net.minecraft.block.properties.PropertyBool;
@@ -37,60 +33,77 @@ import net.minecraft.util.math.BlockPos;
import net.minecraft.world.IBlockAccess; import net.minecraft.world.IBlockAccess;
import net.minecraft.world.World; import net.minecraft.world.World;
import javax.annotation.Nullable; import appeng.api.util.AEPartLocation;
import appeng.api.util.IOrientable;
import appeng.block.AEBaseTileBlock;
import appeng.core.sync.GuiBridge;
import appeng.tile.misc.TileInterface;
import appeng.util.Platform;
public class BlockInterface extends AEBaseTileBlock { public class BlockInterface extends AEBaseTileBlock
{
private static final PropertyBool OMNIDIRECTIONAL = PropertyBool.create("omnidirectional"); private static final PropertyBool OMNIDIRECTIONAL = PropertyBool.create( "omnidirectional" );
public BlockInterface() { public BlockInterface()
super(Material.IRON); {
} super( Material.IRON );
}
@Override @Override
protected IProperty[] getAEStates() { protected IProperty[] getAEStates()
return new IProperty[]{OMNIDIRECTIONAL}; {
} return new IProperty[] { OMNIDIRECTIONAL };
}
@Override @Override
public IBlockState getActualState(IBlockState state, IBlockAccess world, BlockPos pos) { public IBlockState getActualState( IBlockState state, IBlockAccess world, BlockPos pos )
// Determine whether the interface is omni-directional or not {
TileInterface te = this.getTileEntity(world, pos); // Determine whether the interface is omni-directional or not
boolean omniDirectional = true; // The default TileInterface te = this.getTileEntity( world, pos );
if (te != null) { boolean omniDirectional = true; // The default
omniDirectional = te.isOmniDirectional(); if( te != null )
} {
omniDirectional = te.isOmniDirectional();
}
return super.getActualState(state, world, pos) return super.getActualState( state, world, pos )
.withProperty(OMNIDIRECTIONAL, omniDirectional); .withProperty( OMNIDIRECTIONAL, omniDirectional );
} }
@Override @Override
public boolean onActivated(final World w, final BlockPos pos, final EntityPlayer p, final EnumHand hand, final @Nullable ItemStack heldItem, final EnumFacing side, final float hitX, final float hitY, final float hitZ) { public boolean onActivated( final World w, final BlockPos pos, final EntityPlayer p, final EnumHand hand, final @Nullable ItemStack heldItem, final EnumFacing side, final float hitX, final float hitY, final float hitZ )
if (p.isSneaking()) { {
return false; if( p.isSneaking() )
} {
return false;
}
final TileInterface tg = this.getTileEntity(w, pos); final TileInterface tg = this.getTileEntity( w, pos );
if (tg != null) { if( tg != null )
if (Platform.isServer()) { {
Platform.openGUI(p, tg, AEPartLocation.fromFacing(side), GuiBridge.GUI_INTERFACE); if( Platform.isServer() )
} {
return true; Platform.openGUI( p, tg, AEPartLocation.fromFacing( side ), GuiBridge.GUI_INTERFACE );
} }
return false; return true;
} }
return false;
}
@Override @Override
protected boolean hasCustomRotation() { protected boolean hasCustomRotation()
return true; {
} return true;
}
@Override @Override
protected void customRotateBlock(final IOrientable rotatable, final EnumFacing axis) { protected void customRotateBlock( final IOrientable rotatable, final EnumFacing axis )
if (rotatable instanceof TileInterface) { {
((TileInterface) rotatable).setSide(axis); if( rotatable instanceof TileInterface )
} {
} ( (TileInterface) rotatable ).setSide( axis );
}
}
} }
@@ -19,12 +19,10 @@
package appeng.block.misc; package appeng.block.misc;
import appeng.api.util.IOrientable; import java.util.Collections;
import appeng.api.util.IOrientableBlock; import java.util.List;
import appeng.block.AEBaseTileBlock; import java.util.Random;
import appeng.helpers.ICustomCollision;
import appeng.helpers.MetaRotation;
import appeng.tile.misc.TileLightDetector;
import net.minecraft.block.Block; import net.minecraft.block.Block;
import net.minecraft.block.material.Material; import net.minecraft.block.material.Material;
import net.minecraft.block.properties.IProperty; import net.minecraft.block.properties.IProperty;
@@ -41,139 +39,166 @@ import net.minecraft.world.World;
import net.minecraftforge.fml.relauncher.Side; import net.minecraftforge.fml.relauncher.Side;
import net.minecraftforge.fml.relauncher.SideOnly; import net.minecraftforge.fml.relauncher.SideOnly;
import java.util.Collections; import appeng.api.util.IOrientable;
import java.util.List; import appeng.api.util.IOrientableBlock;
import java.util.Random; import appeng.block.AEBaseTileBlock;
import appeng.helpers.ICustomCollision;
import appeng.helpers.MetaRotation;
import appeng.tile.misc.TileLightDetector;
public class BlockLightDetector extends AEBaseTileBlock implements IOrientableBlock, ICustomCollision { public class BlockLightDetector extends AEBaseTileBlock implements IOrientableBlock, ICustomCollision
{
// Cannot use the vanilla FACING property here because it excludes facing DOWN // Cannot use the vanilla FACING property here because it excludes facing DOWN
public static final PropertyDirection FACING = PropertyDirection.create("facing"); public static final PropertyDirection FACING = PropertyDirection.create( "facing" );
// Used to alternate between two variants of the fixture on adjacent blocks // Used to alternate between two variants of the fixture on adjacent blocks
public static final PropertyBool ODD = PropertyBool.create("odd"); public static final PropertyBool ODD = PropertyBool.create( "odd" );
public BlockLightDetector() { public BlockLightDetector()
super(Material.CIRCUITS); {
super( Material.CIRCUITS );
this.setDefaultState(this.blockState.getBaseState().withProperty(FACING, EnumFacing.UP).withProperty(ODD, false)); this.setDefaultState( this.blockState.getBaseState().withProperty( FACING, EnumFacing.UP ).withProperty( ODD, false ) );
this.setLightOpacity(0); this.setLightOpacity( 0 );
this.setFullSize(false); this.setFullSize( false );
this.setOpaque(false); this.setOpaque( false );
} }
@Override @Override
public int getMetaFromState(final IBlockState state) { public int getMetaFromState( final IBlockState state )
return state.getValue(FACING).ordinal(); {
} return state.getValue( FACING ).ordinal();
}
@Override @Override
public IBlockState getStateFromMeta(final int meta) { public IBlockState getStateFromMeta( final int meta )
EnumFacing facing = EnumFacing.values()[meta]; {
return this.getDefaultState().withProperty(FACING, facing); EnumFacing facing = EnumFacing.values()[meta];
} return this.getDefaultState().withProperty( FACING, facing );
}
@Override @Override
protected IProperty[] getAEStates() { protected IProperty[] getAEStates()
return new IProperty[]{FACING, ODD}; {
} return new IProperty[] { FACING, ODD };
}
@Override @Override
public int getWeakPower(final IBlockState state, final IBlockAccess w, final BlockPos pos, final EnumFacing side) { public int getWeakPower( final IBlockState state, final IBlockAccess w, final BlockPos pos, final EnumFacing side )
if (w instanceof World && ((TileLightDetector) this.getTileEntity(w, pos)).isReady()) { {
return ((World) w).getLightFromNeighbors(pos) - 6; if( w instanceof World && ( (TileLightDetector) this.getTileEntity( w, pos ) ).isReady() )
} {
return ( (World) w ).getLightFromNeighbors( pos ) - 6;
}
return 0; return 0;
} }
@Override @Override
public void onNeighborChange(final IBlockAccess world, final BlockPos pos, final BlockPos neighbor) { public void onNeighborChange( final IBlockAccess world, final BlockPos pos, final BlockPos neighbor )
super.onNeighborChange(world, pos, neighbor); {
super.onNeighborChange( world, pos, neighbor );
final TileLightDetector tld = this.getTileEntity(world, pos); final TileLightDetector tld = this.getTileEntity( world, pos );
if (tld != null) { if( tld != null )
tld.updateLight(); {
} tld.updateLight();
} }
}
@Override @Override
public void randomDisplayTick(final IBlockState state, final World worldIn, final BlockPos pos, final Random rand) { public void randomDisplayTick( final IBlockState state, final World worldIn, final BlockPos pos, final Random rand )
// cancel out lightning {
} // cancel out lightning
}
@Override @Override
public boolean isValidOrientation(final World w, final BlockPos pos, final EnumFacing forward, final EnumFacing up) { public boolean isValidOrientation( final World w, final BlockPos pos, final EnumFacing forward, final EnumFacing up )
return this.canPlaceAt(w, pos, up.getOpposite()); {
} return this.canPlaceAt( w, pos, up.getOpposite() );
}
private boolean canPlaceAt(final World w, final BlockPos pos, final EnumFacing dir) { private boolean canPlaceAt( final World w, final BlockPos pos, final EnumFacing dir )
return w.isSideSolid(pos.offset(dir), dir.getOpposite(), false); {
} return w.isSideSolid( pos.offset( dir ), dir.getOpposite(), false );
}
@Override @Override
public Iterable<AxisAlignedBB> getSelectedBoundingBoxesFromPool(final World w, final BlockPos pos, final Entity thePlayer, final boolean b) { public Iterable<AxisAlignedBB> getSelectedBoundingBoxesFromPool( final World w, final BlockPos pos, final Entity thePlayer, final boolean b )
final EnumFacing up = this.getOrientable(w, pos).getUp(); {
final double xOff = -0.3 * up.getFrontOffsetX(); final EnumFacing up = this.getOrientable( w, pos ).getUp();
final double yOff = -0.3 * up.getFrontOffsetY(); final double xOff = -0.3 * up.getFrontOffsetX();
final double zOff = -0.3 * up.getFrontOffsetZ(); final double yOff = -0.3 * up.getFrontOffsetY();
return Collections.singletonList(new AxisAlignedBB(xOff + 0.3, yOff + 0.3, zOff + 0.3, xOff + 0.7, yOff + 0.7, zOff + 0.7)); final double zOff = -0.3 * up.getFrontOffsetZ();
} return Collections.singletonList( new AxisAlignedBB( xOff + 0.3, yOff + 0.3, zOff + 0.3, xOff + 0.7, yOff + 0.7, zOff + 0.7 ) );
}
@Override @Override
public void addCollidingBlockToList(final World w, final BlockPos pos, final AxisAlignedBB bb, final List<AxisAlignedBB> out, final Entity e) {/* public void addCollidingBlockToList( final World w, final BlockPos pos, final AxisAlignedBB bb, final List<AxisAlignedBB> out, final Entity e )
* double xOff = -0.15 * getUp().offsetX; double yOff = -0.15 * {/*
* getUp().offsetY; double zOff = -0.15 * getUp().offsetZ; out.add( * double xOff = -0.15 * getUp().offsetX; double yOff = -0.15 *
* AxisAlignedBB.getBoundingBox( xOff + (double) x + 0.15, yOff + * getUp().offsetY; double zOff = -0.15 * getUp().offsetZ; out.add(
* (double) y + 0.15, zOff + (double) z + 0.15,// ahh xOff + (double) x * AxisAlignedBB.getBoundingBox( xOff + (double) x + 0.15, yOff +
* + 0.85, yOff + (double) y + 0.85, zOff + (double) z + 0.85 ) ); * (double) y + 0.15, zOff + (double) z + 0.15,// ahh xOff + (double) x
*/ * + 0.85, yOff + (double) y + 0.85, zOff + (double) z + 0.85 ) );
} */
}
@Override @Override
public void neighborChanged(IBlockState state, World world, BlockPos pos, Block blockIn, BlockPos fromPos) { public void neighborChanged( IBlockState state, World world, BlockPos pos, Block blockIn, BlockPos fromPos )
final EnumFacing up = this.getOrientable(world, pos).getUp(); {
if (!this.canPlaceAt(world, pos, up.getOpposite())) { final EnumFacing up = this.getOrientable( world, pos ).getUp();
this.dropTorch(world, pos); if( !this.canPlaceAt( world, pos, up.getOpposite() ) )
} {
} this.dropTorch( world, pos );
}
}
private void dropTorch(final World w, final BlockPos pos) { private void dropTorch( final World w, final BlockPos pos )
final IBlockState prev = w.getBlockState(pos); {
w.destroyBlock(pos, true); final IBlockState prev = w.getBlockState( pos );
w.notifyBlockUpdate(pos, prev, w.getBlockState(pos), 3); w.destroyBlock( pos, true );
} w.notifyBlockUpdate( pos, prev, w.getBlockState( pos ), 3 );
}
@Override @Override
public boolean canPlaceBlockAt(final World w, final BlockPos pos) { public boolean canPlaceBlockAt( final World w, final BlockPos pos )
for (final EnumFacing dir : EnumFacing.VALUES) { {
if (this.canPlaceAt(w, pos, dir)) { for( final EnumFacing dir : EnumFacing.VALUES )
return true; {
} if( this.canPlaceAt( w, pos, dir ) )
} {
return false; return true;
} }
}
return false;
}
@Override @Override
public boolean usesMetadata() { public boolean usesMetadata()
return false; {
} return false;
}
@Override @Override
public boolean isFullCube(IBlockState state) { public boolean isFullCube( IBlockState state )
return false; {
} return false;
}
@Override @Override
@SideOnly(Side.CLIENT) @SideOnly( Side.CLIENT )
public BlockRenderLayer getBlockLayer() { public BlockRenderLayer getBlockLayer()
return BlockRenderLayer.CUTOUT; {
} return BlockRenderLayer.CUTOUT;
}
@Override @Override
public IOrientable getOrientable(final IBlockAccess w, final BlockPos pos) { public IOrientable getOrientable( final IBlockAccess w, final BlockPos pos )
return new MetaRotation(w, pos, FACING); {
} return new MetaRotation( w, pos, FACING );
}
} }
@@ -19,14 +19,10 @@
package appeng.block.misc; package appeng.block.misc;
import appeng.api.util.IOrientable; import java.util.Collections;
import appeng.api.util.IOrientableBlock; import java.util.List;
import appeng.block.AEBaseBlock; import java.util.Random;
import appeng.client.render.effects.LightningFX;
import appeng.core.AEConfig;
import appeng.core.AppEng;
import appeng.helpers.ICustomCollision;
import appeng.helpers.MetaRotation;
import net.minecraft.block.Block; import net.minecraft.block.Block;
import net.minecraft.block.material.Material; import net.minecraft.block.material.Material;
import net.minecraft.block.properties.IProperty; import net.minecraft.block.properties.IProperty;
@@ -44,156 +40,187 @@ import net.minecraft.world.World;
import net.minecraftforge.fml.relauncher.Side; import net.minecraftforge.fml.relauncher.Side;
import net.minecraftforge.fml.relauncher.SideOnly; import net.minecraftforge.fml.relauncher.SideOnly;
import java.util.Collections; import appeng.api.util.IOrientable;
import java.util.List; import appeng.api.util.IOrientableBlock;
import java.util.Random; import appeng.block.AEBaseBlock;
import appeng.client.render.effects.LightningFX;
import appeng.core.AEConfig;
import appeng.core.AppEng;
import appeng.helpers.ICustomCollision;
import appeng.helpers.MetaRotation;
public class BlockQuartzFixture extends AEBaseBlock implements IOrientableBlock, ICustomCollision { public class BlockQuartzFixture extends AEBaseBlock implements IOrientableBlock, ICustomCollision
{
// Cannot use the vanilla FACING property here because it excludes facing DOWN // Cannot use the vanilla FACING property here because it excludes facing DOWN
public static final PropertyDirection FACING = PropertyDirection.create("facing"); public static final PropertyDirection FACING = PropertyDirection.create( "facing" );
// Used to alternate between two variants of the fixture on adjacent blocks // Used to alternate between two variants of the fixture on adjacent blocks
public static final PropertyBool ODD = PropertyBool.create("odd"); public static final PropertyBool ODD = PropertyBool.create( "odd" );
public BlockQuartzFixture() { public BlockQuartzFixture()
super(Material.CIRCUITS); {
super( Material.CIRCUITS );
this.setDefaultState(this.blockState.getBaseState().withProperty(FACING, EnumFacing.UP).withProperty(ODD, false)); this.setDefaultState( this.blockState.getBaseState().withProperty( FACING, EnumFacing.UP ).withProperty( ODD, false ) );
this.setLightLevel(0.9375F); this.setLightLevel( 0.9375F );
this.setLightOpacity(0); this.setLightOpacity( 0 );
this.setFullSize(false); this.setFullSize( false );
this.setOpaque(false); this.setOpaque( false );
} }
/** /**
* Sets the "ODD" property of the block state according to the placement of the block. * Sets the "ODD" property of the block state according to the placement of the block.
*/ */
@Override @Override
public IBlockState getActualState(IBlockState state, IBlockAccess worldIn, BlockPos pos) { public IBlockState getActualState( IBlockState state, IBlockAccess worldIn, BlockPos pos )
boolean oddPlacement = ((pos.getX() + pos.getY() + pos.getZ()) % 2) != 0; {
boolean oddPlacement = ( ( pos.getX() + pos.getY() + pos.getZ() ) % 2 ) != 0;
return super.getActualState(state, worldIn, pos) return super.getActualState( state, worldIn, pos )
.withProperty(ODD, oddPlacement); .withProperty( ODD, oddPlacement );
} }
@Override @Override
public int getMetaFromState(final IBlockState state) { public int getMetaFromState( final IBlockState state )
return state.getValue(FACING).ordinal(); {
} return state.getValue( FACING ).ordinal();
}
@Override @Override
public IBlockState getStateFromMeta(final int meta) { public IBlockState getStateFromMeta( final int meta )
EnumFacing facing = EnumFacing.values()[meta]; {
return this.getDefaultState().withProperty(FACING, facing); EnumFacing facing = EnumFacing.values()[meta];
} return this.getDefaultState().withProperty( FACING, facing );
}
@Override @Override
protected IProperty[] getAEStates() { protected IProperty[] getAEStates()
return new IProperty[]{FACING, ODD}; {
} return new IProperty[] { FACING, ODD };
}
@Override @Override
public boolean isValidOrientation(final World w, final BlockPos pos, final EnumFacing forward, final EnumFacing up) { public boolean isValidOrientation( final World w, final BlockPos pos, final EnumFacing forward, final EnumFacing up )
return this.canPlaceAt(w, pos, up.getOpposite()); {
} return this.canPlaceAt( w, pos, up.getOpposite() );
}
private boolean canPlaceAt(final World w, final BlockPos pos, final EnumFacing dir) { private boolean canPlaceAt( final World w, final BlockPos pos, final EnumFacing dir )
final BlockPos test = pos.offset(dir); {
return w.isSideSolid(test, dir.getOpposite(), false); final BlockPos test = pos.offset( dir );
} return w.isSideSolid( test, dir.getOpposite(), false );
}
@Override @Override
public Iterable<AxisAlignedBB> getSelectedBoundingBoxesFromPool(final World w, final BlockPos pos, final Entity e, final boolean isVisual) { public Iterable<AxisAlignedBB> getSelectedBoundingBoxesFromPool( final World w, final BlockPos pos, final Entity e, final boolean isVisual )
final EnumFacing up = this.getOrientable(w, pos).getUp(); {
final double xOff = -0.3 * up.getFrontOffsetX(); final EnumFacing up = this.getOrientable( w, pos ).getUp();
final double yOff = -0.3 * up.getFrontOffsetY(); final double xOff = -0.3 * up.getFrontOffsetX();
final double zOff = -0.3 * up.getFrontOffsetZ(); final double yOff = -0.3 * up.getFrontOffsetY();
return Collections.singletonList(new AxisAlignedBB(xOff + 0.3, yOff + 0.3, zOff + 0.3, xOff + 0.7, yOff + 0.7, zOff + 0.7)); final double zOff = -0.3 * up.getFrontOffsetZ();
} return Collections.singletonList( new AxisAlignedBB( xOff + 0.3, yOff + 0.3, zOff + 0.3, xOff + 0.7, yOff + 0.7, zOff + 0.7 ) );
}
@Override @Override
public void addCollidingBlockToList(final World w, final BlockPos pos, final AxisAlignedBB bb, final List out, final Entity e) {/* public void addCollidingBlockToList( final World w, final BlockPos pos, final AxisAlignedBB bb, final List out, final Entity e )
* double xOff = -0.15 * getUp().offsetX; double yOff = -0.15 * getUp().offsetY; double zOff = -0.15 * {/*
* getUp().offsetZ; out.add( AxisAlignedBB.getBoundingBox( xOff + (double) x + 0.15, yOff + (double) y + 0.15, * double xOff = -0.15 * getUp().offsetX; double yOff = -0.15 * getUp().offsetY; double zOff = -0.15 *
* zOff * getUp().offsetZ; out.add( AxisAlignedBB.getBoundingBox( xOff + (double) x + 0.15, yOff + (double) y + 0.15,
* + (double) z + 0.15,// ahh xOff + (double) x + 0.85, yOff + (double) y + 0.85, zOff + (double) z + 0.85 ) ); * zOff
*/ * + (double) z + 0.15,// ahh xOff + (double) x + 0.85, yOff + (double) y + 0.85, zOff + (double) z + 0.85 ) );
} */
}
@Override @Override
@SideOnly(Side.CLIENT) @SideOnly( Side.CLIENT )
public void randomDisplayTick(final IBlockState state, final World w, final BlockPos pos, final Random r) { public void randomDisplayTick( final IBlockState state, final World w, final BlockPos pos, final Random r )
if (!AEConfig.instance().isEnableEffects()) { {
return; if( !AEConfig.instance().isEnableEffects() )
} {
return;
}
if (r.nextFloat() < 0.98) { if( r.nextFloat() < 0.98 )
return; {
} return;
}
final EnumFacing up = this.getOrientable(w, pos).getUp(); final EnumFacing up = this.getOrientable( w, pos ).getUp();
final double xOff = -0.3 * up.getFrontOffsetX(); final double xOff = -0.3 * up.getFrontOffsetX();
final double yOff = -0.3 * up.getFrontOffsetY(); final double yOff = -0.3 * up.getFrontOffsetY();
final double zOff = -0.3 * up.getFrontOffsetZ(); final double zOff = -0.3 * up.getFrontOffsetZ();
for (int bolts = 0; bolts < 3; bolts++) { for( int bolts = 0; bolts < 3; bolts++ )
if (AppEng.proxy.shouldAddParticles(r)) { {
final LightningFX fx = new LightningFX(w, xOff + 0.5 + pos.getX(), yOff + 0.5 + pos.getY(), zOff + 0.5 + pos.getZ(), 0.0D, 0.0D, 0.0D); if( AppEng.proxy.shouldAddParticles( r ) )
{
final LightningFX fx = new LightningFX( w, xOff + 0.5 + pos.getX(), yOff + 0.5 + pos.getY(), zOff + 0.5 + pos.getZ(), 0.0D, 0.0D, 0.0D );
Minecraft.getMinecraft().effectRenderer.addEffect(fx); Minecraft.getMinecraft().effectRenderer.addEffect( fx );
} }
} }
} }
@Override @Override
public void neighborChanged(IBlockState state, World world, BlockPos pos, Block blockIn, BlockPos fromPos) { public void neighborChanged( IBlockState state, World world, BlockPos pos, Block blockIn, BlockPos fromPos )
final EnumFacing up = this.getOrientable(world, pos).getUp(); {
if (!this.canPlaceAt(world, pos, up.getOpposite())) { final EnumFacing up = this.getOrientable( world, pos ).getUp();
this.dropTorch(world, pos); if( !this.canPlaceAt( world, pos, up.getOpposite() ) )
} {
} this.dropTorch( world, pos );
}
}
private void dropTorch(final World w, final BlockPos pos) { private void dropTorch( final World w, final BlockPos pos )
final IBlockState prev = w.getBlockState(pos); {
w.destroyBlock(pos, true); final IBlockState prev = w.getBlockState( pos );
w.notifyBlockUpdate(pos, prev, w.getBlockState(pos), 3); w.destroyBlock( pos, true );
} w.notifyBlockUpdate( pos, prev, w.getBlockState( pos ), 3 );
}
@Override @Override
public boolean canPlaceBlockAt(final World w, final BlockPos pos) { public boolean canPlaceBlockAt( final World w, final BlockPos pos )
for (final EnumFacing dir : EnumFacing.VALUES) { {
if (this.canPlaceAt(w, pos, dir)) { for( final EnumFacing dir : EnumFacing.VALUES )
return true; {
} if( this.canPlaceAt( w, pos, dir ) )
} {
return false; return true;
} }
}
return false;
}
@Override @Override
public boolean usesMetadata() { public boolean usesMetadata()
return true; {
} return true;
}
@Override @Override
public IOrientable getOrientable(final IBlockAccess w, final BlockPos pos) { public IOrientable getOrientable( final IBlockAccess w, final BlockPos pos )
return new MetaRotation(w, pos, FACING); {
} return new MetaRotation( w, pos, FACING );
}
@Override @Override
public boolean isOpaque() { public boolean isOpaque()
return false; {
} return false;
}
@Override @Override
public boolean isFullCube(IBlockState state) { public boolean isFullCube( IBlockState state )
return false; {
} return false;
}
@Override @Override
@SideOnly(Side.CLIENT) @SideOnly( Side.CLIENT )
public BlockRenderLayer getBlockLayer() { public BlockRenderLayer getBlockLayer()
return BlockRenderLayer.CUTOUT; {
} return BlockRenderLayer.CUTOUT;
}
} }
@@ -19,13 +19,8 @@
package appeng.block.misc; package appeng.block.misc;
import appeng.api.util.IOrientableBlock; import java.util.Random;
import appeng.block.AEBaseTileBlock;
import appeng.client.render.effects.LightningFX;
import appeng.core.AEConfig;
import appeng.core.AppEng;
import appeng.tile.misc.TileQuartzGrowthAccelerator;
import appeng.util.Platform;
import net.minecraft.block.SoundType; import net.minecraft.block.SoundType;
import net.minecraft.block.material.Material; import net.minecraft.block.material.Material;
import net.minecraft.block.properties.IProperty; import net.minecraft.block.properties.IProperty;
@@ -39,113 +34,129 @@ import net.minecraft.world.World;
import net.minecraftforge.fml.relauncher.Side; import net.minecraftforge.fml.relauncher.Side;
import net.minecraftforge.fml.relauncher.SideOnly; import net.minecraftforge.fml.relauncher.SideOnly;
import java.util.Random; import appeng.api.util.IOrientableBlock;
import appeng.block.AEBaseTileBlock;
import appeng.client.render.effects.LightningFX;
import appeng.core.AEConfig;
import appeng.core.AppEng;
import appeng.tile.misc.TileQuartzGrowthAccelerator;
import appeng.util.Platform;
public class BlockQuartzGrowthAccelerator extends AEBaseTileBlock implements IOrientableBlock { public class BlockQuartzGrowthAccelerator extends AEBaseTileBlock implements IOrientableBlock
{
private static final PropertyBool POWERED = PropertyBool.create("powered"); private static final PropertyBool POWERED = PropertyBool.create( "powered" );
public BlockQuartzGrowthAccelerator() { public BlockQuartzGrowthAccelerator()
super(Material.ROCK); {
this.setSoundType(SoundType.METAL); super( Material.ROCK );
this.setDefaultState(this.getDefaultState().withProperty(POWERED, false)); this.setSoundType( SoundType.METAL );
} this.setDefaultState( this.getDefaultState().withProperty( POWERED, false ) );
}
@Override @Override
public IBlockState getActualState(IBlockState state, IBlockAccess world, BlockPos pos) { public IBlockState getActualState( IBlockState state, IBlockAccess world, BlockPos pos )
TileQuartzGrowthAccelerator te = this.getTileEntity(world, pos); {
boolean powered = te != null && te.isPowered(); TileQuartzGrowthAccelerator te = this.getTileEntity( world, pos );
boolean powered = te != null && te.isPowered();
return super.getActualState(state, world, pos) return super.getActualState( state, world, pos )
.withProperty(POWERED, powered); .withProperty( POWERED, powered );
} }
@Override @Override
protected IProperty[] getAEStates() { protected IProperty[] getAEStates()
return new IProperty[]{POWERED}; {
} return new IProperty[] { POWERED };
}
@SideOnly(Side.CLIENT) @SideOnly( Side.CLIENT )
@Override @Override
public void randomDisplayTick(final IBlockState state, final World w, final BlockPos pos, final Random r) { public void randomDisplayTick( final IBlockState state, final World w, final BlockPos pos, final Random r )
if (!AEConfig.instance().isEnableEffects()) { {
return; if( !AEConfig.instance().isEnableEffects() )
} {
return;
}
final TileQuartzGrowthAccelerator cga = this.getTileEntity(w, pos); final TileQuartzGrowthAccelerator cga = this.getTileEntity( w, pos );
if (cga != null && cga.isPowered() && AppEng.proxy.shouldAddParticles(r)) { if( cga != null && cga.isPowered() && AppEng.proxy.shouldAddParticles( r ) )
final double d0 = r.nextFloat() - 0.5F; {
final double d1 = r.nextFloat() - 0.5F; final double d0 = r.nextFloat() - 0.5F;
final double d1 = r.nextFloat() - 0.5F;
final EnumFacing up = cga.getUp(); final EnumFacing up = cga.getUp();
final EnumFacing forward = cga.getForward(); final EnumFacing forward = cga.getForward();
final EnumFacing west = Platform.crossProduct(forward, up); final EnumFacing west = Platform.crossProduct( forward, up );
double rx = 0.5 + pos.getX(); double rx = 0.5 + pos.getX();
double ry = 0.5 + pos.getY(); double ry = 0.5 + pos.getY();
double rz = 0.5 + pos.getZ(); double rz = 0.5 + pos.getZ();
rx += up.getFrontOffsetX() * d0; rx += up.getFrontOffsetX() * d0;
ry += up.getFrontOffsetY() * d0; ry += up.getFrontOffsetY() * d0;
rz += up.getFrontOffsetZ() * d0; rz += up.getFrontOffsetZ() * d0;
final int x = pos.getX(); final int x = pos.getX();
final int y = pos.getY(); final int y = pos.getY();
final int z = pos.getZ(); final int z = pos.getZ();
double dz = 0; double dz = 0;
double dx = 0; double dx = 0;
BlockPos pt = null; BlockPos pt = null;
switch (r.nextInt(4)) { switch( r.nextInt( 4 ) )
case 0: {
dx = 0.6; case 0:
dz = d1; dx = 0.6;
pt = new BlockPos(x + west.getFrontOffsetX(), y + west.getFrontOffsetY(), z + west.getFrontOffsetZ()); dz = d1;
pt = new BlockPos( x + west.getFrontOffsetX(), y + west.getFrontOffsetY(), z + west.getFrontOffsetZ() );
break; break;
case 1: case 1:
dx = d1; dx = d1;
dz += 0.6; dz += 0.6;
pt = new BlockPos(x + forward.getFrontOffsetX(), y + forward.getFrontOffsetY(), z + forward.getFrontOffsetZ()); pt = new BlockPos( x + forward.getFrontOffsetX(), y + forward.getFrontOffsetY(), z + forward.getFrontOffsetZ() );
break; break;
case 2: case 2:
dx = d1; dx = d1;
dz = -0.6; dz = -0.6;
pt = new BlockPos(x - forward.getFrontOffsetX(), y - forward.getFrontOffsetY(), z - forward.getFrontOffsetZ()); pt = new BlockPos( x - forward.getFrontOffsetX(), y - forward.getFrontOffsetY(), z - forward.getFrontOffsetZ() );
break; break;
case 3: case 3:
dx = -0.6; dx = -0.6;
dz = d1; dz = d1;
pt = new BlockPos(x - west.getFrontOffsetX(), y - west.getFrontOffsetY(), z - west.getFrontOffsetZ()); pt = new BlockPos( x - west.getFrontOffsetX(), y - west.getFrontOffsetY(), z - west.getFrontOffsetZ() );
break; break;
} }
if (!w.getBlockState(pt).getBlock().isAir(w.getBlockState(pt), w, pt)) { if( !w.getBlockState( pt ).getBlock().isAir( w.getBlockState( pt ), w, pt ) )
return; {
} return;
}
rx += dx * west.getFrontOffsetX(); rx += dx * west.getFrontOffsetX();
ry += dx * west.getFrontOffsetY(); ry += dx * west.getFrontOffsetY();
rz += dx * west.getFrontOffsetZ(); rz += dx * west.getFrontOffsetZ();
rx += dz * forward.getFrontOffsetX(); rx += dz * forward.getFrontOffsetX();
ry += dz * forward.getFrontOffsetY(); ry += dz * forward.getFrontOffsetY();
rz += dz * forward.getFrontOffsetZ(); rz += dz * forward.getFrontOffsetZ();
final LightningFX fx = new LightningFX(w, rx, ry, rz, 0.0D, 0.0D, 0.0D); final LightningFX fx = new LightningFX( w, rx, ry, rz, 0.0D, 0.0D, 0.0D );
Minecraft.getMinecraft().effectRenderer.addEffect(fx); Minecraft.getMinecraft().effectRenderer.addEffect( fx );
} }
} }
@Override @Override
public boolean usesMetadata() { public boolean usesMetadata()
return false; {
} return false;
}
} }
@@ -19,11 +19,8 @@
package appeng.block.misc; package appeng.block.misc;
import appeng.api.util.AEPartLocation; import javax.annotation.Nullable;
import appeng.block.AEBaseTileBlock;
import appeng.core.sync.GuiBridge;
import appeng.tile.misc.TileSecurityStation;
import appeng.util.Platform;
import net.minecraft.block.material.Material; import net.minecraft.block.material.Material;
import net.minecraft.block.properties.IProperty; import net.minecraft.block.properties.IProperty;
import net.minecraft.block.properties.PropertyBool; import net.minecraft.block.properties.PropertyBool;
@@ -37,56 +34,70 @@ import net.minecraft.util.math.BlockPos;
import net.minecraft.world.IBlockAccess; import net.minecraft.world.IBlockAccess;
import net.minecraft.world.World; import net.minecraft.world.World;
import javax.annotation.Nullable; import appeng.api.util.AEPartLocation;
import appeng.block.AEBaseTileBlock;
import appeng.core.sync.GuiBridge;
import appeng.tile.misc.TileSecurityStation;
import appeng.util.Platform;
public class BlockSecurityStation extends AEBaseTileBlock { public class BlockSecurityStation extends AEBaseTileBlock
{
private static final PropertyBool POWERED = PropertyBool.create("powered"); private static final PropertyBool POWERED = PropertyBool.create( "powered" );
public BlockSecurityStation() { public BlockSecurityStation()
super(Material.IRON); {
super( Material.IRON );
this.setDefaultState(this.getDefaultState().withProperty(POWERED, false)); this.setDefaultState( this.getDefaultState().withProperty( POWERED, false ) );
} }
@Override @Override
protected IProperty[] getAEStates() { protected IProperty[] getAEStates()
return new IProperty[]{POWERED}; {
} return new IProperty[] { POWERED };
}
@Override @Override
public BlockRenderLayer getBlockLayer() { public BlockRenderLayer getBlockLayer()
return BlockRenderLayer.CUTOUT; {
} return BlockRenderLayer.CUTOUT;
}
@Override @Override
public IBlockState getActualState(IBlockState state, IBlockAccess world, BlockPos pos) { public IBlockState getActualState( IBlockState state, IBlockAccess world, BlockPos pos )
boolean powered = false; {
TileSecurityStation te = this.getTileEntity(world, pos); boolean powered = false;
if (te != null) { TileSecurityStation te = this.getTileEntity( world, pos );
powered = te.isActive(); if( te != null )
} {
powered = te.isActive();
}
return super.getActualState(state, world, pos) return super.getActualState( state, world, pos )
.withProperty(POWERED, powered); .withProperty( POWERED, powered );
} }
@Override @Override
public boolean onActivated(final World w, final BlockPos pos, final EntityPlayer p, final EnumHand hand, final @Nullable ItemStack heldItem, final EnumFacing side, final float hitX, final float hitY, final float hitZ) { public boolean onActivated( final World w, final BlockPos pos, final EntityPlayer p, final EnumHand hand, final @Nullable ItemStack heldItem, final EnumFacing side, final float hitX, final float hitY, final float hitZ )
if (p.isSneaking()) { {
return false; if( p.isSneaking() )
} {
return false;
}
final TileSecurityStation tg = this.getTileEntity(w, pos); final TileSecurityStation tg = this.getTileEntity( w, pos );
if (tg != null) { if( tg != null )
if (Platform.isClient()) { {
return true; if( Platform.isClient() )
} {
return true;
}
Platform.openGUI(p, tg, AEPartLocation.fromFacing(side), GuiBridge.GUI_SECURITY); Platform.openGUI( p, tg, AEPartLocation.fromFacing( side ), GuiBridge.GUI_SECURITY );
return true; return true;
} }
return false; return false;
} }
} }
@@ -19,9 +19,9 @@
package appeng.block.misc; package appeng.block.misc;
import appeng.block.AEBaseTileBlock; import java.util.Collections;
import appeng.helpers.ICustomCollision; import java.util.List;
import appeng.tile.misc.TileSkyCompass;
import net.minecraft.block.Block; import net.minecraft.block.Block;
import net.minecraft.block.material.Material; import net.minecraft.block.material.Material;
import net.minecraft.block.state.BlockStateContainer; import net.minecraft.block.state.BlockStateContainer;
@@ -36,137 +36,156 @@ import net.minecraftforge.common.property.ExtendedBlockState;
import net.minecraftforge.common.property.IUnlistedProperty; import net.minecraftforge.common.property.IUnlistedProperty;
import net.minecraftforge.common.property.PropertyFloat; import net.minecraftforge.common.property.PropertyFloat;
import java.util.Collections; import appeng.block.AEBaseTileBlock;
import java.util.List; import appeng.helpers.ICustomCollision;
import appeng.tile.misc.TileSkyCompass;
public class BlockSkyCompass extends AEBaseTileBlock implements ICustomCollision { public class BlockSkyCompass extends AEBaseTileBlock implements ICustomCollision
{
// Rotation is expressed as radians // Rotation is expressed as radians
public static final PropertyFloat ROTATION = new PropertyFloat("rotation"); public static final PropertyFloat ROTATION = new PropertyFloat( "rotation" );
public BlockSkyCompass() { public BlockSkyCompass()
super(Material.CIRCUITS); {
this.setLightOpacity(0); super( Material.CIRCUITS );
this.setFullSize(false); this.setLightOpacity( 0 );
this.setOpaque(false); this.setFullSize( false );
} this.setOpaque( false );
}
@Override @Override
protected BlockStateContainer createBlockState() { protected BlockStateContainer createBlockState()
return new ExtendedBlockState(this, this.getAEStates(), new IUnlistedProperty[]{FORWARD, UP, ROTATION}); {
} return new ExtendedBlockState( this, this.getAEStates(), new IUnlistedProperty[] { FORWARD, UP, ROTATION } );
}
@Override @Override
public boolean isValidOrientation(final World w, final BlockPos pos, final EnumFacing forward, final EnumFacing up) { public boolean isValidOrientation( final World w, final BlockPos pos, final EnumFacing forward, final EnumFacing up )
final TileSkyCompass sc = this.getTileEntity(w, pos); {
if (sc != null) { final TileSkyCompass sc = this.getTileEntity( w, pos );
return false; if( sc != null )
} {
return this.canPlaceAt(w, pos, forward.getOpposite()); return false;
} }
return this.canPlaceAt( w, pos, forward.getOpposite() );
}
private boolean canPlaceAt(final World w, final BlockPos pos, final EnumFacing dir) { private boolean canPlaceAt( final World w, final BlockPos pos, final EnumFacing dir )
return w.isSideSolid(pos.offset(dir), dir.getOpposite(), false); {
} return w.isSideSolid( pos.offset( dir ), dir.getOpposite(), false );
}
@Override @Override
public void neighborChanged(IBlockState state, World world, BlockPos pos, Block blockIn, BlockPos fromPos) { public void neighborChanged( IBlockState state, World world, BlockPos pos, Block blockIn, BlockPos fromPos )
final TileSkyCompass sc = this.getTileEntity(world, pos); {
final EnumFacing forward = sc.getForward(); final TileSkyCompass sc = this.getTileEntity( world, pos );
if (!this.canPlaceAt(world, pos, forward.getOpposite())) { final EnumFacing forward = sc.getForward();
this.dropTorch(world, pos); if( !this.canPlaceAt( world, pos, forward.getOpposite() ) )
} {
} this.dropTorch( world, pos );
}
}
private void dropTorch(final World w, final BlockPos pos) { private void dropTorch( final World w, final BlockPos pos )
final IBlockState prev = w.getBlockState(pos); {
w.destroyBlock(pos, true); final IBlockState prev = w.getBlockState( pos );
w.notifyBlockUpdate(pos, prev, w.getBlockState(pos), 3); w.destroyBlock( pos, true );
} w.notifyBlockUpdate( pos, prev, w.getBlockState( pos ), 3 );
}
@Override @Override
public boolean canPlaceBlockAt(final World w, final BlockPos pos) { public boolean canPlaceBlockAt( final World w, final BlockPos pos )
for (final EnumFacing dir : EnumFacing.VALUES) { {
if (this.canPlaceAt(w, pos, dir)) { for( final EnumFacing dir : EnumFacing.VALUES )
return true; {
} if( this.canPlaceAt( w, pos, dir ) )
} {
return false; return true;
} }
}
return false;
}
@Override @Override
public Iterable<AxisAlignedBB> getSelectedBoundingBoxesFromPool(final World w, final BlockPos pos, final Entity thePlayer, final boolean b) { public Iterable<AxisAlignedBB> getSelectedBoundingBoxesFromPool( final World w, final BlockPos pos, final Entity thePlayer, final boolean b )
final TileSkyCompass tile = this.getTileEntity(w, pos); {
if (tile != null) { final TileSkyCompass tile = this.getTileEntity( w, pos );
final EnumFacing forward = tile.getForward(); if( tile != null )
{
final EnumFacing forward = tile.getForward();
double minX = 0; double minX = 0;
double minY = 0; double minY = 0;
double minZ = 0; double minZ = 0;
double maxX = 1; double maxX = 1;
double maxY = 1; double maxY = 1;
double maxZ = 1; double maxZ = 1;
switch (forward) { switch( forward )
case DOWN: {
minZ = minX = 5.0 / 16.0; case DOWN:
maxZ = maxX = 11.0 / 16.0; minZ = minX = 5.0 / 16.0;
maxY = 1.0; maxZ = maxX = 11.0 / 16.0;
minY = 14.0 / 16.0; maxY = 1.0;
break; minY = 14.0 / 16.0;
case EAST: break;
minZ = minY = 5.0 / 16.0; case EAST:
maxZ = maxY = 11.0 / 16.0; minZ = minY = 5.0 / 16.0;
maxX = 2.0 / 16.0; maxZ = maxY = 11.0 / 16.0;
minX = 0.0; maxX = 2.0 / 16.0;
break; minX = 0.0;
case NORTH: break;
minY = minX = 5.0 / 16.0; case NORTH:
maxY = maxX = 11.0 / 16.0; minY = minX = 5.0 / 16.0;
maxZ = 1.0; maxY = maxX = 11.0 / 16.0;
minZ = 14.0 / 16.0; maxZ = 1.0;
break; minZ = 14.0 / 16.0;
case SOUTH: break;
minY = minX = 5.0 / 16.0; case SOUTH:
maxY = maxX = 11.0 / 16.0; minY = minX = 5.0 / 16.0;
maxZ = 2.0 / 16.0; maxY = maxX = 11.0 / 16.0;
minZ = 0.0; maxZ = 2.0 / 16.0;
break; minZ = 0.0;
case UP: break;
minZ = minX = 5.0 / 16.0; case UP:
maxZ = maxX = 11.0 / 16.0; minZ = minX = 5.0 / 16.0;
maxY = 2.0 / 16.0; maxZ = maxX = 11.0 / 16.0;
minY = 0.0; maxY = 2.0 / 16.0;
break; minY = 0.0;
case WEST: break;
minZ = minY = 5.0 / 16.0; case WEST:
maxZ = maxY = 11.0 / 16.0; minZ = minY = 5.0 / 16.0;
maxX = 1.0; maxZ = maxY = 11.0 / 16.0;
minX = 14.0 / 16.0; maxX = 1.0;
break; minX = 14.0 / 16.0;
default: break;
break; default:
} break;
}
return Collections.singletonList(new AxisAlignedBB(minX, minY, minZ, maxX, maxY, maxZ)); return Collections.singletonList( new AxisAlignedBB( minX, minY, minZ, maxX, maxY, maxZ ) );
} }
return Collections.singletonList(new AxisAlignedBB(0.0, 0, 0.0, 1.0, 1.0, 1.0)); return Collections.singletonList( new AxisAlignedBB( 0.0, 0, 0.0, 1.0, 1.0, 1.0 ) );
} }
@Override @Override
public void addCollidingBlockToList(final World w, final BlockPos pos, final AxisAlignedBB bb, final List<AxisAlignedBB> out, final Entity e) { public void addCollidingBlockToList( final World w, final BlockPos pos, final AxisAlignedBB bb, final List<AxisAlignedBB> out, final Entity e )
{
} }
@Override @Override
public EnumBlockRenderType getRenderType(IBlockState state) { public EnumBlockRenderType getRenderType( IBlockState state )
return EnumBlockRenderType.ENTITYBLOCK_ANIMATED; {
} return EnumBlockRenderType.ENTITYBLOCK_ANIMATED;
}
@Override @Override
public boolean isFullBlock(IBlockState state) { public boolean isFullBlock( IBlockState state )
return false; {
} return false;
}
} }
+109 -86
View File
@@ -19,9 +19,11 @@
package appeng.block.misc; package appeng.block.misc;
import appeng.block.AEBaseBlock; import java.util.Collections;
import appeng.entity.EntityTinyTNTPrimed; import java.util.List;
import appeng.helpers.ICustomCollision;
import javax.annotation.Nullable;
import net.minecraft.block.Block; import net.minecraft.block.Block;
import net.minecraft.block.SoundType; import net.minecraft.block.SoundType;
import net.minecraft.block.material.Material; import net.minecraft.block.material.Material;
@@ -41,105 +43,126 @@ import net.minecraft.util.math.BlockPos;
import net.minecraft.world.Explosion; import net.minecraft.world.Explosion;
import net.minecraft.world.World; import net.minecraft.world.World;
import javax.annotation.Nullable; import appeng.block.AEBaseBlock;
import java.util.Collections; import appeng.entity.EntityTinyTNTPrimed;
import java.util.List; import appeng.helpers.ICustomCollision;
public class BlockTinyTNT extends AEBaseBlock implements ICustomCollision { public class BlockTinyTNT extends AEBaseBlock implements ICustomCollision
{
public BlockTinyTNT() { public BlockTinyTNT()
super(Material.TNT); {
super( Material.TNT );
this.boundingBox = new AxisAlignedBB(0.25f, 0.0f, 0.25f, 0.75f, 0.5f, 0.75f); this.boundingBox = new AxisAlignedBB( 0.25f, 0.0f, 0.25f, 0.75f, 0.5f, 0.75f );
this.setLightOpacity(2); this.setLightOpacity( 2 );
this.setFullSize(false); this.setFullSize( false );
this.setOpaque(false); this.setOpaque( false );
this.setSoundType(SoundType.GROUND); this.setSoundType( SoundType.GROUND );
this.setHardness(0F); this.setHardness( 0F );
} }
@Override @Override
public boolean isFullCube(IBlockState state) { public boolean isFullCube( IBlockState state )
return false; {
} return false;
}
@Override @Override
public boolean onActivated(final World w, final BlockPos pos, final EntityPlayer player, final EnumHand hand, final @Nullable ItemStack heldItem, final EnumFacing side, final float hitX, final float hitY, final float hitZ) { public boolean onActivated( final World w, final BlockPos pos, final EntityPlayer player, final EnumHand hand, final @Nullable ItemStack heldItem, final EnumFacing side, final float hitX, final float hitY, final float hitZ )
if (heldItem != null && heldItem.getItem() == Items.FLINT_AND_STEEL) { {
this.startFuse(w, pos, player); if( heldItem != null && heldItem.getItem() == Items.FLINT_AND_STEEL )
w.setBlockToAir(pos); {
heldItem.damageItem(1, player); this.startFuse( w, pos, player );
return true; w.setBlockToAir( pos );
} else { heldItem.damageItem( 1, player );
return super.onActivated(w, pos, player, hand, heldItem, side, hitX, hitY, hitZ); return true;
} }
} else
{
return super.onActivated( w, pos, player, hand, heldItem, side, hitX, hitY, hitZ );
}
}
public void startFuse(final World w, final BlockPos pos, final EntityLivingBase igniter) { public void startFuse( final World w, final BlockPos pos, final EntityLivingBase igniter )
if (!w.isRemote) { {
final EntityTinyTNTPrimed primedTinyTNTEntity = new EntityTinyTNTPrimed(w, pos.getX() + 0.5F, pos.getY() + 0.5F, pos.getZ() + 0.5F, igniter); if( !w.isRemote )
w.spawnEntity(primedTinyTNTEntity); {
w.playSound(null, primedTinyTNTEntity.posX, primedTinyTNTEntity.posY, primedTinyTNTEntity.posZ, SoundEvents.ENTITY_TNT_PRIMED, final EntityTinyTNTPrimed primedTinyTNTEntity = new EntityTinyTNTPrimed( w, pos.getX() + 0.5F, pos.getY() + 0.5F, pos.getZ() + 0.5F, igniter );
SoundCategory.BLOCKS, 1, 1); w.spawnEntity( primedTinyTNTEntity );
} w.playSound( null, primedTinyTNTEntity.posX, primedTinyTNTEntity.posY, primedTinyTNTEntity.posZ, SoundEvents.ENTITY_TNT_PRIMED,
} SoundCategory.BLOCKS, 1, 1 );
}
}
@Override @Override
public void neighborChanged(IBlockState state, World world, BlockPos pos, Block blockIn, BlockPos fromPos) { public void neighborChanged( IBlockState state, World world, BlockPos pos, Block blockIn, BlockPos fromPos )
if (world.isBlockIndirectlyGettingPowered(pos) > 0) { {
this.startFuse(world, pos, null); if( world.isBlockIndirectlyGettingPowered( pos ) > 0 )
world.setBlockToAir(pos); {
} this.startFuse( world, pos, null );
} world.setBlockToAir( pos );
}
}
@Override @Override
public void onBlockAdded(final World w, final BlockPos pos, final IBlockState state) { public void onBlockAdded( final World w, final BlockPos pos, final IBlockState state )
super.onBlockAdded(w, pos, state); {
super.onBlockAdded( w, pos, state );
if (w.isBlockIndirectlyGettingPowered(pos) > 0) { if( w.isBlockIndirectlyGettingPowered( pos ) > 0 )
this.startFuse(w, pos, null); {
w.setBlockToAir(pos); this.startFuse( w, pos, null );
} w.setBlockToAir( pos );
} }
}
@Override @Override
public void onEntityWalk(final World w, final BlockPos pos, final Entity entity) { public void onEntityWalk( final World w, final BlockPos pos, final Entity entity )
if (entity instanceof EntityArrow && !w.isRemote) { {
final EntityArrow entityarrow = (EntityArrow) entity; if( entity instanceof EntityArrow && !w.isRemote )
{
final EntityArrow entityarrow = (EntityArrow) entity;
if (entityarrow.isBurning()) { if( entityarrow.isBurning() )
this.startFuse(w, pos, entityarrow.shootingEntity instanceof EntityLivingBase ? (EntityLivingBase) entityarrow.shootingEntity : null); {
w.setBlockToAir(pos); this.startFuse( w, pos, entityarrow.shootingEntity instanceof EntityLivingBase ? (EntityLivingBase) entityarrow.shootingEntity : null );
} w.setBlockToAir( pos );
} }
} }
}
@Override @Override
public boolean canDropFromExplosion(final Explosion exp) { public boolean canDropFromExplosion( final Explosion exp )
return false; {
} return false;
}
@Override @Override
public void onBlockExploded(final World w, final BlockPos pos, final Explosion exp) { public void onBlockExploded( final World w, final BlockPos pos, final Explosion exp )
super.onBlockExploded(w, pos, exp); {
if (!w.isRemote) { super.onBlockExploded( w, pos, exp );
final EntityTinyTNTPrimed primedTinyTNTEntity = new EntityTinyTNTPrimed(w, pos.getX() + 0.5F, pos.getY() + 0.5F, pos.getZ() + 0.5F, exp if( !w.isRemote )
.getExplosivePlacedBy()); {
primedTinyTNTEntity.setFuse(w.rand.nextInt(primedTinyTNTEntity.getFuse() / 4) + primedTinyTNTEntity.getFuse() / 8); final EntityTinyTNTPrimed primedTinyTNTEntity = new EntityTinyTNTPrimed( w, pos.getX() + 0.5F, pos.getY() + 0.5F, pos.getZ() + 0.5F, exp
w.spawnEntity(primedTinyTNTEntity); .getExplosivePlacedBy() );
} primedTinyTNTEntity.setFuse( w.rand.nextInt( primedTinyTNTEntity.getFuse() / 4 ) + primedTinyTNTEntity.getFuse() / 8 );
} w.spawnEntity( primedTinyTNTEntity );
}
}
@Override @Override
public Iterable<AxisAlignedBB> getSelectedBoundingBoxesFromPool(final World w, final BlockPos pos, final Entity thePlayer, final boolean b) { public Iterable<AxisAlignedBB> getSelectedBoundingBoxesFromPool( final World w, final BlockPos pos, final Entity thePlayer, final boolean b )
return Collections.singletonList(new AxisAlignedBB(0.25, 0, 0.25, 0.75, 0.5, 0.75)); {
} return Collections.singletonList( new AxisAlignedBB( 0.25, 0, 0.25, 0.75, 0.5, 0.75 ) );
}
@Override @Override
public void addCollidingBlockToList(final World w, final BlockPos pos, final AxisAlignedBB bb, final List<AxisAlignedBB> out, final Entity e) { public void addCollidingBlockToList( final World w, final BlockPos pos, final AxisAlignedBB bb, final List<AxisAlignedBB> out, final Entity e )
out.add(new AxisAlignedBB(0.25, 0, 0.25, 0.75, 0.5, 0.75)); {
} out.add( new AxisAlignedBB( 0.25, 0, 0.25, 0.75, 0.5, 0.75 ) );
}
} }
@@ -19,13 +19,10 @@
package appeng.block.misc; package appeng.block.misc;
import appeng.api.util.AEPartLocation; import java.util.Random;
import appeng.block.AEBaseTileBlock;
import appeng.core.AEConfig; import javax.annotation.Nullable;
import appeng.core.sync.GuiBridge;
import appeng.tile.AEBaseTile;
import appeng.tile.misc.TileVibrationChamber;
import appeng.util.Platform;
import net.minecraft.block.material.Material; import net.minecraft.block.material.Material;
import net.minecraft.block.properties.IProperty; import net.minecraft.block.properties.IProperty;
import net.minecraft.block.properties.PropertyBool; import net.minecraft.block.properties.PropertyBool;
@@ -39,91 +36,108 @@ import net.minecraft.util.math.BlockPos;
import net.minecraft.world.IBlockAccess; import net.minecraft.world.IBlockAccess;
import net.minecraft.world.World; import net.minecraft.world.World;
import javax.annotation.Nullable; import appeng.api.util.AEPartLocation;
import java.util.Random; import appeng.block.AEBaseTileBlock;
import appeng.core.AEConfig;
import appeng.core.sync.GuiBridge;
import appeng.tile.AEBaseTile;
import appeng.tile.misc.TileVibrationChamber;
import appeng.util.Platform;
public final class BlockVibrationChamber extends AEBaseTileBlock { public final class BlockVibrationChamber extends AEBaseTileBlock
{
// Indicates that the vibration chamber is currently working // Indicates that the vibration chamber is currently working
private static final PropertyBool ACTIVE = PropertyBool.create("active"); private static final PropertyBool ACTIVE = PropertyBool.create( "active" );
public BlockVibrationChamber() { public BlockVibrationChamber()
super(Material.IRON); {
this.setHardness(4.2F); super( Material.IRON );
this.setDefaultState(this.getDefaultState().withProperty(ACTIVE, false)); this.setHardness( 4.2F );
} this.setDefaultState( this.getDefaultState().withProperty( ACTIVE, false ) );
}
@Override @Override
public IBlockState getActualState(IBlockState state, IBlockAccess world, BlockPos pos) { public IBlockState getActualState( IBlockState state, IBlockAccess world, BlockPos pos )
TileVibrationChamber te = this.getTileEntity(world, pos); {
boolean active = te != null && te.isOn; TileVibrationChamber te = this.getTileEntity( world, pos );
boolean active = te != null && te.isOn;
return super.getActualState(state, world, pos) return super.getActualState( state, world, pos )
.withProperty(ACTIVE, active); .withProperty( ACTIVE, active );
} }
@Override @Override
protected IProperty[] getAEStates() { protected IProperty[] getAEStates()
return new IProperty[]{ACTIVE}; {
} return new IProperty[] { ACTIVE };
}
@Override @Override
public boolean onActivated(final World w, final BlockPos pos, final EntityPlayer player, final EnumHand hand, final @Nullable ItemStack heldItem, final EnumFacing side, final float hitX, final float hitY, final float hitZ) { public boolean onActivated( final World w, final BlockPos pos, final EntityPlayer player, final EnumHand hand, final @Nullable ItemStack heldItem, final EnumFacing side, final float hitX, final float hitY, final float hitZ )
if (player.isSneaking()) { {
return false; if( player.isSneaking() )
} {
return false;
}
if (Platform.isServer()) { if( Platform.isServer() )
final TileVibrationChamber tc = this.getTileEntity(w, pos); {
if (tc != null && !player.isSneaking()) { final TileVibrationChamber tc = this.getTileEntity( w, pos );
Platform.openGUI(player, tc, AEPartLocation.fromFacing(side), GuiBridge.GUI_VIBRATION_CHAMBER); if( tc != null && !player.isSneaking() )
return true; {
} Platform.openGUI( player, tc, AEPartLocation.fromFacing( side ), GuiBridge.GUI_VIBRATION_CHAMBER );
} return true;
}
}
return true; return true;
} }
@Override @Override
public void randomDisplayTick(final IBlockState state, final World w, final BlockPos pos, final Random r) { public void randomDisplayTick( final IBlockState state, final World w, final BlockPos pos, final Random r )
if (!AEConfig.instance().isEnableEffects()) { {
return; if( !AEConfig.instance().isEnableEffects() )
} {
return;
}
final AEBaseTile tile = this.getTileEntity(w, pos); final AEBaseTile tile = this.getTileEntity( w, pos );
if (tile instanceof TileVibrationChamber) { if( tile instanceof TileVibrationChamber )
final TileVibrationChamber tc = (TileVibrationChamber) tile; {
if (tc.isOn) { final TileVibrationChamber tc = (TileVibrationChamber) tile;
float f1 = pos.getX() + 0.5F; if( tc.isOn )
float f2 = pos.getY() + 0.5F; {
float f3 = pos.getZ() + 0.5F; float f1 = pos.getX() + 0.5F;
float f2 = pos.getY() + 0.5F;
float f3 = pos.getZ() + 0.5F;
final EnumFacing forward = tc.getForward(); final EnumFacing forward = tc.getForward();
final EnumFacing up = tc.getUp(); final EnumFacing up = tc.getUp();
final int west_x = forward.getFrontOffsetY() * up.getFrontOffsetZ() - forward.getFrontOffsetZ() * up.getFrontOffsetY(); final int west_x = forward.getFrontOffsetY() * up.getFrontOffsetZ() - forward.getFrontOffsetZ() * up.getFrontOffsetY();
final int west_y = forward.getFrontOffsetZ() * up.getFrontOffsetX() - forward.getFrontOffsetX() * up.getFrontOffsetZ(); final int west_y = forward.getFrontOffsetZ() * up.getFrontOffsetX() - forward.getFrontOffsetX() * up.getFrontOffsetZ();
final int west_z = forward.getFrontOffsetX() * up.getFrontOffsetY() - forward.getFrontOffsetY() * up.getFrontOffsetX(); final int west_z = forward.getFrontOffsetX() * up.getFrontOffsetY() - forward.getFrontOffsetY() * up.getFrontOffsetX();
f1 += forward.getFrontOffsetX() * 0.6; f1 += forward.getFrontOffsetX() * 0.6;
f2 += forward.getFrontOffsetY() * 0.6; f2 += forward.getFrontOffsetY() * 0.6;
f3 += forward.getFrontOffsetZ() * 0.6; f3 += forward.getFrontOffsetZ() * 0.6;
final float ox = r.nextFloat(); final float ox = r.nextFloat();
final float oy = r.nextFloat() * 0.2f; final float oy = r.nextFloat() * 0.2f;
f1 += up.getFrontOffsetX() * (-0.3 + oy); f1 += up.getFrontOffsetX() * ( -0.3 + oy );
f2 += up.getFrontOffsetY() * (-0.3 + oy); f2 += up.getFrontOffsetY() * ( -0.3 + oy );
f3 += up.getFrontOffsetZ() * (-0.3 + oy); f3 += up.getFrontOffsetZ() * ( -0.3 + oy );
f1 += west_x * (0.3 * ox - 0.15); f1 += west_x * ( 0.3 * ox - 0.15 );
f2 += west_y * (0.3 * ox - 0.15); f2 += west_y * ( 0.3 * ox - 0.15 );
f3 += west_z * (0.3 * ox - 0.15); f3 += west_z * ( 0.3 * ox - 0.15 );
w.spawnParticle(EnumParticleTypes.SMOKE_NORMAL, f1, f2, f3, 0.0D, 0.0D, 0.0D); w.spawnParticle( EnumParticleTypes.SMOKE_NORMAL, f1, f2, f3, 0.0D, 0.0D, 0.0D, new int[0] );
w.spawnParticle(EnumParticleTypes.FLAME, f1, f2, f3, 0.0D, 0.0D, 0.0D); w.spawnParticle( EnumParticleTypes.FLAME, f1, f2, f3, 0.0D, 0.0D, 0.0D, new int[0] );
} }
} }
} }
} }
@@ -1,20 +1,24 @@
package appeng.block.misc; package appeng.block.misc;
import net.minecraftforge.fml.relauncher.Side;
import net.minecraftforge.fml.relauncher.SideOnly;
import appeng.bootstrap.BlockRenderingCustomizer; import appeng.bootstrap.BlockRenderingCustomizer;
import appeng.bootstrap.IBlockRendering; import appeng.bootstrap.IBlockRendering;
import appeng.bootstrap.IItemRendering; import appeng.bootstrap.IItemRendering;
import appeng.client.render.tesr.InscriberTESR; import appeng.client.render.tesr.InscriberTESR;
import net.minecraftforge.fml.relauncher.Side;
import net.minecraftforge.fml.relauncher.SideOnly;
public class InscriberRendering extends BlockRenderingCustomizer { public class InscriberRendering extends BlockRenderingCustomizer
{
@SideOnly(Side.CLIENT) @SideOnly( Side.CLIENT )
@Override @Override
public void customize(IBlockRendering rendering, IItemRendering itemRendering) { public void customize( IBlockRendering rendering, IItemRendering itemRendering )
rendering.tesr(new InscriberTESR()); {
} rendering.tesr( new InscriberTESR() );
}
} }
@@ -19,22 +19,25 @@
package appeng.block.misc; package appeng.block.misc;
import net.minecraftforge.fml.relauncher.Side;
import net.minecraftforge.fml.relauncher.SideOnly;
import appeng.api.util.AEColor; import appeng.api.util.AEColor;
import appeng.bootstrap.BlockRenderingCustomizer; import appeng.bootstrap.BlockRenderingCustomizer;
import appeng.bootstrap.IBlockRendering; import appeng.bootstrap.IBlockRendering;
import appeng.bootstrap.IItemRendering; import appeng.bootstrap.IItemRendering;
import appeng.client.render.ColorableTileBlockColor; import appeng.client.render.ColorableTileBlockColor;
import appeng.client.render.StaticItemColor; import appeng.client.render.StaticItemColor;
import net.minecraftforge.fml.relauncher.Side;
import net.minecraftforge.fml.relauncher.SideOnly;
public class SecurityStationRendering extends BlockRenderingCustomizer { public class SecurityStationRendering extends BlockRenderingCustomizer
{
@Override @Override
@SideOnly(Side.CLIENT) @SideOnly( Side.CLIENT )
public void customize(IBlockRendering rendering, IItemRendering itemRendering) { public void customize( IBlockRendering rendering, IItemRendering itemRendering )
rendering.blockColor(ColorableTileBlockColor.INSTANCE); {
itemRendering.color(new StaticItemColor(AEColor.TRANSPARENT)); rendering.blockColor( ColorableTileBlockColor.INSTANCE );
} itemRendering.color( new StaticItemColor( AEColor.TRANSPARENT ) );
}
} }
@@ -19,26 +19,29 @@
package appeng.block.misc; package appeng.block.misc;
import net.minecraft.client.renderer.block.model.ModelResourceLocation;
import net.minecraftforge.fml.relauncher.Side;
import net.minecraftforge.fml.relauncher.SideOnly;
import appeng.bootstrap.BlockRenderingCustomizer; import appeng.bootstrap.BlockRenderingCustomizer;
import appeng.bootstrap.IBlockRendering; import appeng.bootstrap.IBlockRendering;
import appeng.bootstrap.IItemRendering; import appeng.bootstrap.IItemRendering;
import appeng.client.render.model.SkyCompassModel; import appeng.client.render.model.SkyCompassModel;
import appeng.client.render.tesr.SkyCompassTESR; import appeng.client.render.tesr.SkyCompassTESR;
import net.minecraft.client.renderer.block.model.ModelResourceLocation;
import net.minecraftforge.fml.relauncher.Side;
import net.minecraftforge.fml.relauncher.SideOnly;
public class SkyCompassRendering extends BlockRenderingCustomizer { public class SkyCompassRendering extends BlockRenderingCustomizer
{
private static final ModelResourceLocation ITEM_MODEL = new ModelResourceLocation("appliedenergistics2:sky_compass", "normal"); private static final ModelResourceLocation ITEM_MODEL = new ModelResourceLocation( "appliedenergistics2:sky_compass", "normal" );
@Override @Override
@SideOnly(Side.CLIENT) @SideOnly( Side.CLIENT )
public void customize(IBlockRendering rendering, IItemRendering itemRendering) { public void customize( IBlockRendering rendering, IItemRendering itemRendering )
rendering.tesr(new SkyCompassTESR()); {
itemRendering.model(ITEM_MODEL); rendering.tesr( new SkyCompassTESR() );
itemRendering.builtInModel("models/block/builtin/sky_compass", new SkyCompassModel()); itemRendering.model( ITEM_MODEL );
} itemRendering.builtInModel( "models/block/builtin/sky_compass", new SkyCompassModel() );
}
} }
@@ -19,29 +19,12 @@
package appeng.block.networking; package appeng.block.networking;
import appeng.api.parts.IFacadeContainer; import java.util.EnumSet;
import appeng.api.parts.IFacadePart; import java.util.List;
import appeng.api.parts.PartItemStack; import java.util.Random;
import appeng.api.parts.SelectedPart;
import appeng.api.util.AEColor; import javax.annotation.Nullable;
import appeng.api.util.AEPartLocation;
import appeng.block.AEBaseTileBlock;
import appeng.client.UnlistedProperty;
import appeng.client.render.cablebus.CableBusBakedModel;
import appeng.client.render.cablebus.CableBusRenderState;
import appeng.core.Api;
import appeng.core.AppEng;
import appeng.core.sync.network.NetworkHandler;
import appeng.core.sync.packets.PacketClick;
import appeng.helpers.AEGlassMaterial;
import appeng.integration.abstraction.IAEFacade;
import appeng.parts.ICableBusContainer;
import appeng.parts.NullCableBusContainer;
import appeng.tile.AEBaseTile;
import appeng.tile.networking.CableBusTESR;
import appeng.tile.networking.TileCableBus;
import appeng.tile.networking.TileCableBusTESR;
import appeng.util.Platform;
import net.minecraft.block.Block; import net.minecraft.block.Block;
import net.minecraft.block.properties.IProperty; import net.minecraft.block.properties.IProperty;
import net.minecraft.block.state.BlockStateContainer; import net.minecraft.block.state.BlockStateContainer;
@@ -78,354 +61,439 @@ import net.minecraftforge.fml.common.registry.GameRegistry;
import net.minecraftforge.fml.relauncher.Side; import net.minecraftforge.fml.relauncher.Side;
import net.minecraftforge.fml.relauncher.SideOnly; import net.minecraftforge.fml.relauncher.SideOnly;
import javax.annotation.Nullable; import appeng.api.parts.IFacadeContainer;
import java.util.EnumSet; import appeng.api.parts.IFacadePart;
import java.util.List; import appeng.api.parts.PartItemStack;
import java.util.Random; import appeng.api.parts.SelectedPart;
import appeng.api.util.AEColor;
import appeng.api.util.AEPartLocation;
public class BlockCableBus extends AEBaseTileBlock implements IAEFacade { import appeng.block.AEBaseTileBlock;
import appeng.client.UnlistedProperty;
public static final UnlistedProperty<CableBusRenderState> RENDER_STATE_PROPERTY = new UnlistedProperty<>("cable_bus_render_state", CableBusRenderState.class); import appeng.client.render.cablebus.CableBusBakedModel;
import appeng.client.render.cablebus.CableBusRenderState;
private static final ICableBusContainer NULL_CABLE_BUS = new NullCableBusContainer(); import appeng.core.Api;
import appeng.core.AppEng;
private static Class<? extends AEBaseTile> noTesrTile; import appeng.core.sync.network.NetworkHandler;
import appeng.core.sync.packets.PacketClick;
private static Class<? extends AEBaseTile> tesrTile; import appeng.helpers.AEGlassMaterial;
import appeng.integration.abstraction.IAEFacade;
public BlockCableBus() { import appeng.parts.ICableBusContainer;
super(AEGlassMaterial.INSTANCE); import appeng.parts.NullCableBusContainer;
this.setLightOpacity(0); import appeng.tile.AEBaseTile;
this.setFullSize(false); import appeng.tile.networking.CableBusTESR;
this.setOpaque(false); import appeng.tile.networking.TileCableBus;
import appeng.tile.networking.TileCableBusTESR;
// this will actually be overwritten later through setupTile and the import appeng.util.Platform;
// combined layers
this.setTileEntity(TileCableBus.class);
} public class BlockCableBus extends AEBaseTileBlock implements IAEFacade
{
@Override
public boolean isFullCube(IBlockState state) { public static final UnlistedProperty<CableBusRenderState> RENDER_STATE_PROPERTY = new UnlistedProperty<>( "cable_bus_render_state", CableBusRenderState.class );
return false;
} private static final ICableBusContainer NULL_CABLE_BUS = new NullCableBusContainer();
@Override private static Class<? extends AEBaseTile> noTesrTile;
protected BlockStateContainer createBlockState() {
return new ExtendedBlockState(this, new IProperty[0], new IUnlistedProperty[]{RENDER_STATE_PROPERTY}); private static Class<? extends AEBaseTile> tesrTile;
}
public BlockCableBus()
@Override {
public IBlockState getExtendedState(IBlockState state, IBlockAccess world, BlockPos pos) { super( AEGlassMaterial.INSTANCE );
CableBusRenderState renderState = this.cb(world, pos).getRenderState(); this.setLightOpacity( 0 );
renderState.setWorld(world); this.setFullSize( false );
renderState.setPos(pos); this.setOpaque( false );
return ((IExtendedBlockState) state).withProperty(RENDER_STATE_PROPERTY, renderState);
} // this will actually be overwritten later through setupTile and the
// combined layers
@Override this.setTileEntity( TileCableBus.class );
public void randomDisplayTick(final IBlockState state, final World worldIn, final BlockPos pos, final Random rand) { }
this.cb(worldIn, pos).randomDisplayTick(worldIn, pos, rand);
} @Override
public boolean isFullCube( IBlockState state )
@Override {
public void onNeighborChange(final IBlockAccess w, final BlockPos pos, final BlockPos neighbor) { return false;
this.cb(w, pos).onNeighborChanged(w, pos, neighbor); }
}
@Override
@Override protected BlockStateContainer createBlockState()
public Item getItemDropped(final IBlockState state, final Random rand, final int fortune) { {
return null; return new ExtendedBlockState( this, new IProperty[0], new IUnlistedProperty[] { RENDER_STATE_PROPERTY } );
} }
@Override @Override
public int getWeakPower(final IBlockState state, final IBlockAccess w, final BlockPos pos, final EnumFacing side) { public IBlockState getExtendedState( IBlockState state, IBlockAccess world, BlockPos pos )
return this.cb(w, pos).isProvidingWeakPower(side.getOpposite()); // TODO: {
// IS CableBusRenderState renderState = this.cb( world, pos ).getRenderState();
// OPPOSITE!? renderState.setWorld( world );
} renderState.setPos( pos );
return ( (IExtendedBlockState) state ).withProperty( RENDER_STATE_PROPERTY, renderState );
@Override }
public boolean canProvidePower(final IBlockState state) {
return true; @Override
} public void randomDisplayTick( final IBlockState state, final World worldIn, final BlockPos pos, final Random rand )
{
@Override this.cb( worldIn, pos ).randomDisplayTick( worldIn, pos, rand );
public void onEntityCollidedWithBlock(final World w, final BlockPos pos, final IBlockState state, final Entity entityIn) { }
this.cb(w, pos).onEntityCollision(entityIn);
} @Override
public void onNeighborChange( final IBlockAccess w, final BlockPos pos, final BlockPos neighbor )
@Override {
public int getStrongPower(final IBlockState state, final IBlockAccess w, final BlockPos pos, final EnumFacing side) { this.cb( w, pos ).onNeighborChanged( w, pos, neighbor );
return this.cb(w, pos).isProvidingStrongPower(side.getOpposite()); // TODO: }
// IS
// OPPOSITE!? @Override
} public Item getItemDropped( final IBlockState state, final Random rand, final int fortune )
{
@Override return null;
public int getLightValue(final IBlockState state, final IBlockAccess world, final BlockPos pos) { }
if (state.getBlock() != this) {
return state.getBlock().getLightValue(state, world, pos); @Override
} public int getWeakPower( final IBlockState state, final IBlockAccess w, final BlockPos pos, final EnumFacing side )
return this.cb(world, pos).getLightValue(); {
} return this.cb( w, pos ).isProvidingWeakPower( side.getOpposite() ); // TODO:
// IS
@Override // OPPOSITE!?
public boolean isLadder(final IBlockState state, final IBlockAccess world, final BlockPos pos, final EntityLivingBase entity) { }
return this.cb(world, pos).isLadder(entity);
} @Override
public boolean canProvidePower( final IBlockState state )
@Override {
public boolean isSideSolid(final IBlockState state, final IBlockAccess w, final BlockPos pos, final EnumFacing side) { return true;
return this.cb(w, pos).isSolidOnSide(side); }
}
@Override
@Override public void onEntityCollidedWithBlock( final World w, final BlockPos pos, final IBlockState state, final Entity entityIn )
public boolean isReplaceable(final IBlockAccess w, final BlockPos pos) { {
return this.cb(w, pos).isEmpty(); this.cb( w, pos ).onEntityCollision( entityIn );
} }
@Override @Override
public boolean removedByPlayer(final IBlockState state, final World world, final BlockPos pos, final EntityPlayer player, final boolean willHarvest) { public int getStrongPower( final IBlockState state, final IBlockAccess w, final BlockPos pos, final EnumFacing side )
if (player.capabilities.isCreativeMode) { {
final AEBaseTile tile = this.getTileEntity(world, pos); return this.cb( w, pos ).isProvidingStrongPower( side.getOpposite() ); // TODO:
if (tile != null) { // IS
tile.disableDrops(); // OPPOSITE!?
} }
// maybe ray trace?
} @Override
return super.removedByPlayer(state, world, pos, player, willHarvest); public int getLightValue( final IBlockState state, final IBlockAccess world, final BlockPos pos )
} {
if( state.getBlock() != this )
@Override {
public boolean canConnectRedstone(final IBlockState state, final IBlockAccess w, final BlockPos pos, EnumFacing side) { return state.getBlock().getLightValue( state, world, pos );
if (side == null) { }
side = EnumFacing.UP; return this.cb( world, pos ).getLightValue();
} }
return this.cb(w, pos).canConnectRedstone(EnumSet.of(side)); @Override
} public boolean isLadder( final IBlockState state, final IBlockAccess world, final BlockPos pos, final EntityLivingBase entity )
{
@Override return this.cb( world, pos ).isLadder( entity );
public ItemStack getPickBlock(final IBlockState state, final RayTraceResult target, final World world, final BlockPos pos, final EntityPlayer player) { }
final Vec3d v3 = target.hitVec.subtract(pos.getX(), pos.getY(), pos.getZ());
final SelectedPart sp = this.cb(world, pos).selectPart(v3); @Override
public boolean isSideSolid( final IBlockState state, final IBlockAccess w, final BlockPos pos, final EnumFacing side )
if (sp.part != null) { {
return sp.part.getItemStack(PartItemStack.PICK); return this.cb( w, pos ).isSolidOnSide( side );
} else if (sp.facade != null) { }
return sp.facade.getItemStack();
} @Override
public boolean isReplaceable( final IBlockAccess w, final BlockPos pos )
return ItemStack.EMPTY; {
} return this.cb( w, pos ).isEmpty();
}
@Override
@SideOnly(Side.CLIENT) @Override
public boolean addHitEffects(final IBlockState state, final World world, final RayTraceResult target, final ParticleManager effectRenderer) { public boolean removedByPlayer( final IBlockState state, final World world, final BlockPos pos, final EntityPlayer player, final boolean willHarvest )
{
// Half the particle rate. Since we're spawning concentrated on a specific spot, if( player.capabilities.isCreativeMode )
// our particle effect otherwise looks too strong {
if (Platform.getRandom().nextBoolean()) { final AEBaseTile tile = this.getTileEntity( world, pos );
return true; if( tile != null )
} {
tile.disableDrops();
ICableBusContainer cb = this.cb(world, target.getBlockPos()); }
// maybe ray trace?
// Our built-in model has the actual baked sprites we need }
IBakedModel model = Minecraft.getMinecraft().getBlockRendererDispatcher().getModelForState(this.getDefaultState()); return super.removedByPlayer( state, world, pos, player, willHarvest );
}
// We cannot add the effect if we don't have the model
if (!(model instanceof CableBusBakedModel)) { @Override
return true; public boolean canConnectRedstone( final IBlockState state, final IBlockAccess w, final BlockPos pos, EnumFacing side )
} {
if( side == null )
CableBusBakedModel cableBusModel = (CableBusBakedModel) model; {
side = EnumFacing.UP;
CableBusRenderState renderState = cb.getRenderState(); }
// Spawn a particle for one of the particle textures return this.cb( w, pos ).canConnectRedstone( EnumSet.of( side ) );
TextureAtlasSprite texture = Platform.pickRandom(cableBusModel.getParticleTextures(renderState)); }
if (texture != null) {
double x = target.hitVec.x; @Override
double y = target.hitVec.y; public ItemStack getPickBlock( final IBlockState state, final RayTraceResult target, final World world, final BlockPos pos, final EntityPlayer player )
double z = target.hitVec.z; {
final Vec3d v3 = target.hitVec.subtract( pos.getX(), pos.getY(), pos.getZ() );
Particle fx = new DestroyFX(world, x, y, z, 0.0D, 0.0D, 0.0D, state).setBlockPos(target.getBlockPos()).multipleParticleScaleBy(0.8F); final SelectedPart sp = this.cb( world, pos ).selectPart( v3 );
fx.setParticleTexture(texture);
effectRenderer.addEffect(fx); if( sp.part != null )
} {
return sp.part.getItemStack( PartItemStack.PICK );
return true; }
} else if( sp.facade != null )
{
@Override return sp.facade.getItemStack();
@SideOnly(Side.CLIENT) }
public boolean addDestroyEffects(final World world, final BlockPos pos, final ParticleManager effectRenderer) {
ICableBusContainer cb = this.cb(world, pos); return ItemStack.EMPTY;
}
// Our built-in model has the actual baked sprites we need
IBakedModel model = Minecraft.getMinecraft().getBlockRendererDispatcher().getModelForState(this.getDefaultState()); @Override
@SideOnly( Side.CLIENT )
// We cannot add the effect if we dont have the model public boolean addHitEffects( final IBlockState state, final World world, final RayTraceResult target, final ParticleManager effectRenderer )
if (!(model instanceof CableBusBakedModel)) { {
return true;
} // Half the particle rate. Since we're spawning concentrated on a specific spot,
// our particle effect otherwise looks too strong
CableBusBakedModel cableBusModel = (CableBusBakedModel) model; if( Platform.getRandom().nextBoolean() )
{
CableBusRenderState renderState = cb.getRenderState(); return true;
}
List<TextureAtlasSprite> textures = cableBusModel.getParticleTextures(renderState);
ICableBusContainer cb = this.cb( world, target.getBlockPos() );
if (!textures.isEmpty()) {
// Shamelessly inspired by ParticleManager.addBlockDestroyEffects // Our built-in model has the actual baked sprites we need
for (int j = 0; j < 4; ++j) { IBakedModel model = Minecraft.getMinecraft().getBlockRendererDispatcher().getModelForState( this.getDefaultState() );
for (int k = 0; k < 4; ++k) {
for (int l = 0; l < 4; ++l) { // We cannot add the effect if we don't have the model
// Randomly select one of the textures if the cable bus has more than just one possibility here if( !( model instanceof CableBusBakedModel ) )
final TextureAtlasSprite texture = Platform.pickRandom(textures); {
return true;
final double d0 = pos.getX() + (j + 0.5D) / 4.0D; }
final double d1 = pos.getY() + (k + 0.5D) / 4.0D;
final double d2 = pos.getZ() + (l + 0.5D) / 4.0D; CableBusBakedModel cableBusModel = (CableBusBakedModel) model;
final ParticleDigging particle = new DestroyFX(world, d0, d1, d2, d0 - pos.getX() - 0.5D, d1 - pos
.getY() - 0.5D, d2 - pos.getZ() - 0.5D, this.getDefaultState()).setBlockPos(pos); CableBusRenderState renderState = cb.getRenderState();
particle.setParticleTexture(texture); // Spawn a particle for one of the particle textures
effectRenderer.addEffect(particle); TextureAtlasSprite texture = Platform.pickRandom( cableBusModel.getParticleTextures( renderState ) );
} if( texture != null )
} {
} double x = target.hitVec.x;
} double y = target.hitVec.y;
double z = target.hitVec.z;
return true;
} Particle fx = new DestroyFX( world, x, y, z, 0.0D, 0.0D, 0.0D, state ).setBlockPos( target.getBlockPos() ).multipleParticleScaleBy( 0.8F );
fx.setParticleTexture( texture );
@Override effectRenderer.addEffect( fx );
public void neighborChanged(IBlockState state, World world, BlockPos pos, Block blockIn, BlockPos fromPos) { }
if (Platform.isServer()) {
this.cb(world, pos).onNeighborChanged(world, pos, fromPos); return true;
} }
}
@Override
private ICableBusContainer cb(final IBlockAccess w, final BlockPos pos) { @SideOnly( Side.CLIENT )
final TileEntity te = w.getTileEntity(pos); public boolean addDestroyEffects( final World world, final BlockPos pos, final ParticleManager effectRenderer )
ICableBusContainer out = null; {
ICableBusContainer cb = this.cb( world, pos );
if (te instanceof TileCableBus) {
out = ((TileCableBus) te).getCableBus(); // Our built-in model has the actual baked sprites we need
} IBakedModel model = Minecraft.getMinecraft().getBlockRendererDispatcher().getModelForState( this.getDefaultState() );
return out == null ? NULL_CABLE_BUS : out; // We cannot add the effect if we dont have the model
} if( !( model instanceof CableBusBakedModel ) )
{
@Nullable return true;
private IFacadeContainer fc(final IBlockAccess w, final BlockPos pos) { }
final TileEntity te = w.getTileEntity(pos);
IFacadeContainer out = null; CableBusBakedModel cableBusModel = (CableBusBakedModel) model;
if (te instanceof TileCableBus) { CableBusRenderState renderState = cb.getRenderState();
out = ((TileCableBus) te).getCableBus().getFacadeContainer();
} List<TextureAtlasSprite> textures = cableBusModel.getParticleTextures( renderState );
return out; if( !textures.isEmpty() )
} {
// Shamelessly inspired by ParticleManager.addBlockDestroyEffects
@Override for( int j = 0; j < 4; ++j )
public void onBlockClicked(World worldIn, BlockPos pos, EntityPlayer playerIn) { {
if (Platform.isClient()) { for( int k = 0; k < 4; ++k )
final RayTraceResult rtr = Minecraft.getMinecraft().objectMouseOver; {
if (rtr != null && rtr.typeOfHit == Type.BLOCK && pos.equals(rtr.getBlockPos())) { for( int l = 0; l < 4; ++l )
final Vec3d hitVec = rtr.hitVec.subtract(new Vec3d(pos)); {
// Randomly select one of the textures if the cable bus has more than just one possibility here
if (this.cb(worldIn, pos).clicked(playerIn, EnumHand.MAIN_HAND, hitVec)) { final TextureAtlasSprite texture = Platform.pickRandom( textures );
NetworkHandler.instance()
.sendToServer( final double d0 = pos.getX() + ( j + 0.5D ) / 4.0D;
new PacketClick(pos, rtr.sideHit, (float) hitVec.x, (float) hitVec.y, (float) hitVec.z, EnumHand.MAIN_HAND, true)); final double d1 = pos.getY() + ( k + 0.5D ) / 4.0D;
} final double d2 = pos.getZ() + ( l + 0.5D ) / 4.0D;
} final ParticleDigging particle = new DestroyFX( world, d0, d1, d2, d0 - pos.getX() - 0.5D, d1 - pos
} .getY() - 0.5D, d2 - pos.getZ() - 0.5D, this.getDefaultState() ).setBlockPos( pos );
}
particle.setParticleTexture( texture );
public void onBlockClickPacket(World worldIn, BlockPos pos, EntityPlayer playerIn, EnumHand hand, Vec3d hitVec) { effectRenderer.addEffect( particle );
this.cb(worldIn, pos).clicked(playerIn, hand, hitVec); }
} }
}
@Override }
public boolean onActivated(final World w, final BlockPos pos, final EntityPlayer player, final EnumHand hand, final @Nullable ItemStack heldItem, final EnumFacing side, final float hitX, final float hitY, final float hitZ) {
return this.cb(w, pos).activate(player, hand, new Vec3d(hitX, hitY, hitZ)); return true;
} }
@Override @Override
public boolean recolorBlock(final World world, final BlockPos pos, final EnumFacing side, final EnumDyeColor color) { public void neighborChanged( IBlockState state, World world, BlockPos pos, Block blockIn, BlockPos fromPos )
return this.recolorBlock(world, pos, side, color, null); {
} if( Platform.isServer() )
{
public boolean recolorBlock(final World world, final BlockPos pos, final EnumFacing side, final EnumDyeColor color, final EntityPlayer who) { this.cb( world, pos ).onNeighborChanged( world, pos, fromPos );
try { }
return this.cb(world, pos).recolourBlock(side, AEColor.values()[color.ordinal()], who); }
} catch (final Throwable ignored) {
} private ICableBusContainer cb( final IBlockAccess w, final BlockPos pos )
return false; {
} final TileEntity te = w.getTileEntity( pos );
ICableBusContainer out = null;
@Override
@SideOnly(Side.CLIENT) if( te instanceof TileCableBus )
public void getSubBlocks(final CreativeTabs tabs, final NonNullList<ItemStack> itemStacks) { {
// do nothing out = ( (TileCableBus) te ).getCableBus();
} }
public void setupTile() { return out == null ? NULL_CABLE_BUS : out;
noTesrTile = Api.INSTANCE.partHelper().getCombinedInstance(TileCableBus.class); }
this.setTileEntity(noTesrTile);
@Nullable
GameRegistry.registerTileEntity(noTesrTile, AppEng.MOD_ID.toLowerCase() + ":" + "BlockCableBus"); private IFacadeContainer fc( final IBlockAccess w, final BlockPos pos )
{
if (Platform.isClient()) { final TileEntity te = w.getTileEntity( pos );
setupTesr(); IFacadeContainer out = null;
}
} if( te instanceof TileCableBus )
{
@SideOnly(Side.CLIENT) out = ( (TileCableBus) te ).getCableBus().getFacadeContainer();
private static void setupTesr() { }
tesrTile = Api.INSTANCE.partHelper().getCombinedInstance(TileCableBusTESR.class);
GameRegistry.registerTileEntity(tesrTile, AppEng.MOD_ID.toLowerCase() + ":" + "ClientOnly_TESR_CableBus"); return out;
ClientRegistry.bindTileEntitySpecialRenderer(BlockCableBus.getTesrTile(), new CableBusTESR()); }
}
@Override
@Override public void onBlockClicked( World worldIn, BlockPos pos, EntityPlayer playerIn )
public boolean canRenderInLayer(IBlockState state, BlockRenderLayer layer) { {
return true; if( Platform.isClient() )
} {
final RayTraceResult rtr = Minecraft.getMinecraft().objectMouseOver;
@Override if( rtr != null && rtr.typeOfHit == Type.BLOCK && pos.equals( rtr.getBlockPos() ) )
public IBlockState getFacadeState(IBlockAccess world, BlockPos pos, EnumFacing side) { {
if (side != null) { final Vec3d hitVec = rtr.hitVec.subtract( new Vec3d( pos ) );
IFacadeContainer container = this.fc(world, pos);
if (container != null) { if( this.cb( worldIn, pos ).clicked( playerIn, EnumHand.MAIN_HAND, hitVec ) )
IFacadePart facade = container.getFacade(AEPartLocation.fromFacing(side)); {
if (facade != null) { NetworkHandler.instance()
return facade.getBlockState(); .sendToServer(
} new PacketClick( pos, rtr.sideHit, (float) hitVec.x, (float) hitVec.y, (float) hitVec.z, EnumHand.MAIN_HAND, true ) );
} }
} }
return world.getBlockState(pos); }
} }
public static Class<? extends AEBaseTile> getNoTesrTile() { public void onBlockClickPacket( World worldIn, BlockPos pos, EntityPlayer playerIn, EnumHand hand, Vec3d hitVec )
return noTesrTile; {
} this.cb( worldIn, pos ).clicked( playerIn, hand, hitVec );
}
public static Class<? extends AEBaseTile> getTesrTile() {
return tesrTile; @Override
} public boolean onActivated( final World w, final BlockPos pos, final EntityPlayer player, final EnumHand hand, final @Nullable ItemStack heldItem, final EnumFacing side, final float hitX, final float hitY, final float hitZ )
{
// Helper to get access to the protected constructor return this.cb( w, pos ).activate( player, hand, new Vec3d( hitX, hitY, hitZ ) );
@SideOnly(Side.CLIENT) }
private static class DestroyFX extends ParticleDigging {
DestroyFX(World worldIn, double xCoordIn, double yCoordIn, double zCoordIn, double xSpeedIn, double ySpeedIn, double zSpeedIn, IBlockState state) { @Override
super(worldIn, xCoordIn, yCoordIn, zCoordIn, xSpeedIn, ySpeedIn, zSpeedIn, state); public boolean recolorBlock( final World world, final BlockPos pos, final EnumFacing side, final EnumDyeColor color )
} {
} return this.recolorBlock( world, pos, side, color, null );
}
public boolean recolorBlock( final World world, final BlockPos pos, final EnumFacing side, final EnumDyeColor color, final EntityPlayer who )
{
try
{
return this.cb( world, pos ).recolourBlock( side, AEColor.values()[color.ordinal()], who );
}
catch( final Throwable ignored )
{
}
return false;
}
@Override
@SideOnly( Side.CLIENT )
public void getSubBlocks( final CreativeTabs tabs, final NonNullList<ItemStack> itemStacks )
{
// do nothing
}
public void setupTile()
{
noTesrTile = Api.INSTANCE.partHelper().getCombinedInstance( TileCableBus.class );
this.setTileEntity( noTesrTile );
GameRegistry.registerTileEntity( noTesrTile, AppEng.MOD_ID.toLowerCase() + ":" + "BlockCableBus" );
if( Platform.isClient() )
{
setupTesr();
}
}
@SideOnly( Side.CLIENT )
private static void setupTesr()
{
tesrTile = Api.INSTANCE.partHelper().getCombinedInstance( TileCableBusTESR.class );
GameRegistry.registerTileEntity( tesrTile, AppEng.MOD_ID.toLowerCase() + ":" + "ClientOnly_TESR_CableBus" );
ClientRegistry.bindTileEntitySpecialRenderer( BlockCableBus.getTesrTile(), new CableBusTESR() );
}
@Override
public boolean canRenderInLayer( IBlockState state, BlockRenderLayer layer )
{
return true;
}
@Override
public IBlockState getFacadeState( IBlockAccess world, BlockPos pos, EnumFacing side )
{
if( side != null )
{
IFacadeContainer container = this.fc( world, pos );
if( container != null )
{
IFacadePart facade = container.getFacade( AEPartLocation.fromFacing( side ) );
if( facade != null )
{
return facade.getBlockState();
}
}
}
return world.getBlockState( pos );
}
public static Class<? extends AEBaseTile> getNoTesrTile()
{
return noTesrTile;
}
public static Class<? extends AEBaseTile> getTesrTile()
{
return tesrTile;
}
// Helper to get access to the protected constructor
@SideOnly( Side.CLIENT )
private static class DestroyFX extends ParticleDigging
{
DestroyFX( World worldIn, double xCoordIn, double yCoordIn, double zCoordIn, double xSpeedIn, double ySpeedIn, double zSpeedIn, IBlockState state )
{
super( worldIn, xCoordIn, yCoordIn, zCoordIn, xSpeedIn, ySpeedIn, zSpeedIn, state );
}
}
} }
@@ -19,8 +19,6 @@
package appeng.block.networking; package appeng.block.networking;
import appeng.block.AEBaseTileBlock;
import appeng.tile.networking.TileController;
import net.minecraft.block.Block; import net.minecraft.block.Block;
import net.minecraft.block.material.Material; import net.minecraft.block.material.Material;
import net.minecraft.block.properties.IProperty; import net.minecraft.block.properties.IProperty;
@@ -33,126 +31,154 @@ import net.minecraft.util.math.BlockPos;
import net.minecraft.world.IBlockAccess; import net.minecraft.world.IBlockAccess;
import net.minecraft.world.World; import net.minecraft.world.World;
import appeng.block.AEBaseTileBlock;
import appeng.tile.networking.TileController;
public class BlockController extends AEBaseTileBlock {
public enum ControllerBlockState implements IStringSerializable { public class BlockController extends AEBaseTileBlock
offline, online, conflicted; {
@Override public enum ControllerBlockState implements IStringSerializable
public String getName() { {
return this.name(); offline, online, conflicted;
}
} @Override
public String getName()
{
return this.name();
}
/** }
* Controls the rendering of the controller block (connected texture style).
* inside_a and inside_b are alternating patterns for a controller that is enclosed by other controllers,
* and since they are always offline, they do not have the usual sub-states.
*/
public enum ControllerRenderType implements IStringSerializable {
block, column_x, column_y, column_z, inside_a, inside_b;
@Override /**
public String getName() { * Controls the rendering of the controller block (connected texture style).
return this.name(); * inside_a and inside_b are alternating patterns for a controller that is enclosed by other controllers,
} * and since they are always offline, they do not have the usual sub-states.
*/
public enum ControllerRenderType implements IStringSerializable
{
block, column_x, column_y, column_z, inside_a, inside_b;
} @Override
public String getName()
{
return this.name();
}
public static final PropertyEnum<ControllerBlockState> CONTROLLER_STATE = PropertyEnum.create("state", ControllerBlockState.class); }
public static final PropertyEnum<ControllerRenderType> CONTROLLER_TYPE = PropertyEnum.create("type", ControllerRenderType.class); public static final PropertyEnum<ControllerBlockState> CONTROLLER_STATE = PropertyEnum.create( "state", ControllerBlockState.class );
public BlockController() { public static final PropertyEnum<ControllerRenderType> CONTROLLER_TYPE = PropertyEnum.create( "type", ControllerRenderType.class );
super(Material.IRON);
this.setHardness(6);
this.setDefaultState(this.getDefaultState()
.withProperty(CONTROLLER_STATE, ControllerBlockState.offline)
.withProperty(CONTROLLER_TYPE, ControllerRenderType.block));
}
@Override public BlockController()
protected IProperty[] getAEStates() { {
return new IProperty[]{CONTROLLER_STATE, CONTROLLER_TYPE}; super( Material.IRON );
} this.setHardness( 6 );
this.setDefaultState( this.getDefaultState()
.withProperty( CONTROLLER_STATE, ControllerBlockState.offline )
.withProperty( CONTROLLER_TYPE, ControllerRenderType.block ) );
}
@Override @Override
protected BlockStateContainer createBlockState() { protected IProperty[] getAEStates()
return new BlockStateContainer(this, this.getAEStates()); {
} return new IProperty[] { CONTROLLER_STATE, CONTROLLER_TYPE };
}
/** @Override
* This will compute the AE_BLOCK_FORWARD, AE_BLOCK_UP and CONTROLLER_TYPE block states based on adjacent protected BlockStateContainer createBlockState()
* controllers and the network state of this controller (offline, online, conflicted). This is used to {
* get a rudimentary connected texture feel for the controller based on how it is placed. return new BlockStateContainer( this, this.getAEStates() );
*/ }
@Override
public IBlockState getActualState(IBlockState state, IBlockAccess world, BlockPos pos) {
// Only used for columns, really /**
ControllerRenderType type = ControllerRenderType.block; * This will compute the AE_BLOCK_FORWARD, AE_BLOCK_UP and CONTROLLER_TYPE block states based on adjacent
* controllers and the network state of this controller (offline, online, conflicted). This is used to
* get a rudimentary connected texture feel for the controller based on how it is placed.
*/
@Override
public IBlockState getActualState( IBlockState state, IBlockAccess world, BlockPos pos )
{
int x = pos.getX(); // Only used for columns, really
int y = pos.getY(); ControllerRenderType type = ControllerRenderType.block;
int z = pos.getZ();
// Detect whether controllers are on both sides of the x, y, and z axes int x = pos.getX();
final boolean xx = this.getTileEntity(world, x - 1, y, z) instanceof TileController && this.getTileEntity(world, x + 1, y, int y = pos.getY();
z) instanceof TileController; int z = pos.getZ();
final boolean yy = this.getTileEntity(world, x, y - 1, z) instanceof TileController && this.getTileEntity(world, x, y + 1,
z) instanceof TileController;
final boolean zz = this.getTileEntity(world, x, y, z - 1) instanceof TileController && this.getTileEntity(world, x, y,
z + 1) instanceof TileController;
if (xx && !yy && !zz) { // Detect whether controllers are on both sides of the x, y, and z axes
type = ControllerRenderType.column_x; final boolean xx = this.getTileEntity( world, x - 1, y, z ) instanceof TileController && this.getTileEntity( world, x + 1, y,
} else if (!xx && yy && !zz) { z ) instanceof TileController;
type = ControllerRenderType.column_y; final boolean yy = this.getTileEntity( world, x, y - 1, z ) instanceof TileController && this.getTileEntity( world, x, y + 1,
} else if (!xx && !yy && zz) { z ) instanceof TileController;
type = ControllerRenderType.column_z; final boolean zz = this.getTileEntity( world, x, y, z - 1 ) instanceof TileController && this.getTileEntity( world, x, y,
} else if ((xx ? 1 : 0) + (yy ? 1 : 0) + (zz ? 1 : 0) >= 2) { z + 1 ) instanceof TileController;
final int v = (Math.abs(x) + Math.abs(y) + Math.abs(z)) % 2;
// While i'd like this to be based on the blockstate randomization feature, this generates if( xx && !yy && !zz )
// an alternating pattern based on world position, so this is not 100% doable with blockstates. {
if (v == 0) { type = ControllerRenderType.column_x;
type = ControllerRenderType.inside_a; }
} else { else if( !xx && yy && !zz )
type = ControllerRenderType.inside_b; {
} type = ControllerRenderType.column_y;
} }
else if( !xx && !yy && zz )
{
type = ControllerRenderType.column_z;
}
else if( ( xx ? 1 : 0 ) + ( yy ? 1 : 0 ) + ( zz ? 1 : 0 ) >= 2 )
{
final int v = ( Math.abs( x ) + Math.abs( y ) + Math.abs( z ) ) % 2;
return state.withProperty(CONTROLLER_TYPE, type); // While i'd like this to be based on the blockstate randomization feature, this generates
} // an alternating pattern based on world position, so this is not 100% doable with blockstates.
if( v == 0 )
{
type = ControllerRenderType.inside_a;
}
else
{
type = ControllerRenderType.inside_b;
}
}
@Override return state.withProperty( CONTROLLER_TYPE, type );
public IBlockState getExtendedState(IBlockState state, IBlockAccess world, BlockPos pos) { }
return state;
}
@Override @Override
public int getMetaFromState(final IBlockState state) { public IBlockState getExtendedState( IBlockState state, IBlockAccess world, BlockPos pos )
return state.getValue(CONTROLLER_STATE).ordinal(); {
} return state;
}
@Override @Override
public IBlockState getStateFromMeta(final int meta) { public int getMetaFromState( final IBlockState state )
ControllerBlockState state = ControllerBlockState.values()[meta]; {
return this.getDefaultState().withProperty(CONTROLLER_STATE, state); return state.getValue( CONTROLLER_STATE ).ordinal();
} }
@Override @Override
public BlockRenderLayer getBlockLayer() { public IBlockState getStateFromMeta( final int meta )
return BlockRenderLayer.CUTOUT; {
} ControllerBlockState state = ControllerBlockState.values()[meta];
return this.getDefaultState().withProperty( CONTROLLER_STATE, state );
}
@Override @Override
public void neighborChanged(IBlockState state, World world, BlockPos pos, Block blockIn, BlockPos fromPos) { public BlockRenderLayer getBlockLayer()
final TileController tc = this.getTileEntity(world, pos); {
if (tc != null) { return BlockRenderLayer.CUTOUT;
tc.onNeighborChange(false); }
}
} @Override
public void neighborChanged( IBlockState state, World world, BlockPos pos, Block blockIn, BlockPos fromPos )
{
final TileController tc = this.getTileEntity( world, pos );
if( tc != null )
{
tc.onNeighborChange( false );
}
}
} }
@@ -23,9 +23,11 @@ import appeng.block.AEBaseTileBlock;
import appeng.helpers.AEGlassMaterial; import appeng.helpers.AEGlassMaterial;
public class BlockCreativeEnergyCell extends AEBaseTileBlock { public class BlockCreativeEnergyCell extends AEBaseTileBlock
{
public BlockCreativeEnergyCell() { public BlockCreativeEnergyCell()
super(AEGlassMaterial.INSTANCE); {
} super( AEGlassMaterial.INSTANCE );
}
} }
@@ -19,14 +19,17 @@
package appeng.block.networking; package appeng.block.networking;
public class BlockDenseEnergyCell extends BlockEnergyCell { public class BlockDenseEnergyCell extends BlockEnergyCell
{
public BlockDenseEnergyCell() { public BlockDenseEnergyCell()
{
} }
@Override @Override
public double getMaxPower() { public double getMaxPower()
return 200000.0 * 8.0; {
} return 200000.0 * 8.0;
}
} }
@@ -19,13 +19,16 @@
package appeng.block.networking; package appeng.block.networking;
import appeng.block.AEBaseTileBlock;
import net.minecraft.block.material.Material; import net.minecraft.block.material.Material;
import appeng.block.AEBaseTileBlock;
public class BlockEnergyAcceptor extends AEBaseTileBlock {
public BlockEnergyAcceptor() { public class BlockEnergyAcceptor extends AEBaseTileBlock
super(Material.IRON); {
}
public BlockEnergyAcceptor()
{
super( Material.IRON );
}
} }
@@ -19,9 +19,6 @@
package appeng.block.networking; package appeng.block.networking;
import appeng.block.AEBaseTileBlock;
import appeng.helpers.AEGlassMaterial;
import appeng.util.Platform;
import net.minecraft.block.properties.IProperty; import net.minecraft.block.properties.IProperty;
import net.minecraft.block.properties.PropertyInteger; import net.minecraft.block.properties.PropertyInteger;
import net.minecraft.block.state.IBlockState; import net.minecraft.block.state.IBlockState;
@@ -32,45 +29,56 @@ import net.minecraft.util.NonNullList;
import net.minecraftforge.fml.relauncher.Side; import net.minecraftforge.fml.relauncher.Side;
import net.minecraftforge.fml.relauncher.SideOnly; import net.minecraftforge.fml.relauncher.SideOnly;
import appeng.block.AEBaseTileBlock;
import appeng.helpers.AEGlassMaterial;
import appeng.util.Platform;
public class BlockEnergyCell extends AEBaseTileBlock {
public static final PropertyInteger ENERGY_STORAGE = PropertyInteger.create("fullness", 0, 7); public class BlockEnergyCell extends AEBaseTileBlock
{
@Override public static final PropertyInteger ENERGY_STORAGE = PropertyInteger.create( "fullness", 0, 7 );
public int getMetaFromState(final IBlockState state) {
return state.getValue(ENERGY_STORAGE);
}
@Override @Override
public IBlockState getStateFromMeta(final int meta) { public int getMetaFromState( final IBlockState state )
return this.getDefaultState().withProperty(ENERGY_STORAGE, Math.min(7, Math.max(0, meta))); {
} return state.getValue( ENERGY_STORAGE );
}
public BlockEnergyCell() { @Override
super(AEGlassMaterial.INSTANCE); public IBlockState getStateFromMeta( final int meta )
} {
return this.getDefaultState().withProperty( ENERGY_STORAGE, Math.min( 7, Math.max( 0, meta ) ) );
}
@Override public BlockEnergyCell()
@SideOnly(Side.CLIENT) {
public void getSubBlocks(final CreativeTabs tabs, final NonNullList<ItemStack> itemStacks) { super( AEGlassMaterial.INSTANCE );
super.getSubBlocks(tabs, itemStacks); }
final ItemStack charged = new ItemStack(this, 1); @Override
final NBTTagCompound tag = Platform.openNbtData(charged); @SideOnly( Side.CLIENT )
tag.setDouble("internalCurrentPower", this.getMaxPower()); public void getSubBlocks( final CreativeTabs tabs, final NonNullList<ItemStack> itemStacks )
tag.setDouble("internalMaxPower", this.getMaxPower()); {
super.getSubBlocks( tabs, itemStacks );
itemStacks.add(charged); final ItemStack charged = new ItemStack( this, 1 );
} final NBTTagCompound tag = Platform.openNbtData( charged );
tag.setDouble( "internalCurrentPower", this.getMaxPower() );
tag.setDouble( "internalMaxPower", this.getMaxPower() );
public double getMaxPower() { itemStacks.add( charged );
return 200000.0; }
}
@Override public double getMaxPower()
protected IProperty[] getAEStates() { {
return new IProperty[]{ENERGY_STORAGE}; return 200000.0;
} }
@Override
protected IProperty[] getAEStates()
{
return new IProperty[] { ENERGY_STORAGE };
}
} }
@@ -19,55 +19,62 @@
package appeng.block.networking; package appeng.block.networking;
import net.minecraft.client.renderer.block.model.ModelResourceLocation;
import net.minecraft.item.ItemStack;
import net.minecraft.util.ResourceLocation;
import appeng.api.implementations.items.IAEItemPowerStorage; import appeng.api.implementations.items.IAEItemPowerStorage;
import appeng.block.AEBaseItemBlockChargeable; import appeng.block.AEBaseItemBlockChargeable;
import appeng.bootstrap.BlockRenderingCustomizer; import appeng.bootstrap.BlockRenderingCustomizer;
import appeng.bootstrap.IBlockRendering; import appeng.bootstrap.IBlockRendering;
import appeng.bootstrap.IItemRendering; import appeng.bootstrap.IItemRendering;
import appeng.tile.networking.TileEnergyCell; import appeng.tile.networking.TileEnergyCell;
import net.minecraft.client.renderer.block.model.ModelResourceLocation;
import net.minecraft.item.ItemStack;
import net.minecraft.util.ResourceLocation;
public class BlockEnergyCellRendering extends BlockRenderingCustomizer { public class BlockEnergyCellRendering extends BlockRenderingCustomizer
{
private final ResourceLocation baseModel; private final ResourceLocation baseModel;
public BlockEnergyCellRendering(ResourceLocation baseModel) { public BlockEnergyCellRendering( ResourceLocation baseModel )
this.baseModel = baseModel; {
} this.baseModel = baseModel;
}
@Override @Override
public void customize(IBlockRendering rendering, IItemRendering itemRendering) { public void customize( IBlockRendering rendering, IItemRendering itemRendering )
itemRendering.meshDefinition(this::getItemModel); {
// Note: Since we use the block models, we dont need to register custom variants itemRendering.meshDefinition( this::getItemModel );
} // Note: Since we use the block models, we dont need to register custom variants
}
/** /**
* Determines which version of the energy cell model should be used depending on the fill factor * Determines which version of the energy cell model should be used depending on the fill factor
* of the item stack. * of the item stack.
*/ */
private ModelResourceLocation getItemModel(ItemStack is) { private ModelResourceLocation getItemModel( ItemStack is )
double fillFactor = getFillFactor(is); {
double fillFactor = getFillFactor( is );
int storageLevel = TileEnergyCell.getStorageLevelFromFillFactor(fillFactor); int storageLevel = TileEnergyCell.getStorageLevelFromFillFactor( fillFactor );
return new ModelResourceLocation(this.baseModel, "fullness=" + storageLevel); return new ModelResourceLocation( this.baseModel, "fullness=" + storageLevel );
} }
/** /**
* Helper method that returns the energy fill factor (between 0 and 1) of a given item stack. * Helper method that returns the energy fill factor (between 0 and 1) of a given item stack.
* Returns 0 if the item stack has no fill factor. * Returns 0 if the item stack has no fill factor.
*/ */
private static double getFillFactor(ItemStack is) { private static double getFillFactor( ItemStack is )
if (!(is.getItem() instanceof IAEItemPowerStorage)) { {
return 0; if( !( is.getItem() instanceof IAEItemPowerStorage ) )
} {
return 0;
}
AEBaseItemBlockChargeable itemChargeable = (AEBaseItemBlockChargeable) is.getItem(); AEBaseItemBlockChargeable itemChargeable = (AEBaseItemBlockChargeable) is.getItem();
double curPower = itemChargeable.getAECurrentPower(is); double curPower = itemChargeable.getAECurrentPower( is );
double maxPower = itemChargeable.getAEMaxPower(is); double maxPower = itemChargeable.getAEMaxPower( is );
return curPower / maxPower; return curPower / maxPower;
} }
} }
@@ -19,13 +19,9 @@
package appeng.block.networking; package appeng.block.networking;
import appeng.api.util.AEPartLocation; import java.util.Collections;
import appeng.block.AEBaseTileBlock; import java.util.List;
import appeng.core.sync.GuiBridge;
import appeng.helpers.AEGlassMaterial;
import appeng.helpers.ICustomCollision;
import appeng.tile.networking.TileWireless;
import appeng.util.Platform;
import net.minecraft.block.properties.IProperty; import net.minecraft.block.properties.IProperty;
import net.minecraft.block.properties.PropertyEnum; import net.minecraft.block.properties.PropertyEnum;
import net.minecraft.block.state.IBlockState; import net.minecraft.block.state.IBlockState;
@@ -40,196 +36,224 @@ import net.minecraft.util.math.BlockPos;
import net.minecraft.world.IBlockAccess; import net.minecraft.world.IBlockAccess;
import net.minecraft.world.World; import net.minecraft.world.World;
import java.util.Collections; import appeng.api.util.AEPartLocation;
import java.util.List; import appeng.block.AEBaseTileBlock;
import appeng.core.sync.GuiBridge;
import appeng.helpers.AEGlassMaterial;
import appeng.helpers.ICustomCollision;
import appeng.tile.networking.TileWireless;
import appeng.util.Platform;
public class BlockWireless extends AEBaseTileBlock implements ICustomCollision { public class BlockWireless extends AEBaseTileBlock implements ICustomCollision
{
enum State implements IStringSerializable { enum State implements IStringSerializable
OFF, {
ON, OFF,
HAS_CHANNEL; ON,
HAS_CHANNEL;
@Override @Override
public String getName() { public String getName()
return this.name().toLowerCase(); {
} return this.name().toLowerCase();
} }
}
public static final PropertyEnum<State> STATE = PropertyEnum.create("state", State.class); public static final PropertyEnum<State> STATE = PropertyEnum.create( "state", State.class );
public BlockWireless() { public BlockWireless()
super(AEGlassMaterial.INSTANCE); {
this.setLightOpacity(0); super( AEGlassMaterial.INSTANCE );
this.setFullSize(false); this.setLightOpacity( 0 );
this.setOpaque(false); this.setFullSize( false );
this.setDefaultState(this.getDefaultState().withProperty(STATE, State.OFF)); this.setOpaque( false );
} this.setDefaultState( this.getDefaultState().withProperty( STATE, State.OFF ) );
}
@Override @Override
public BlockRenderLayer getBlockLayer() { public BlockRenderLayer getBlockLayer()
return BlockRenderLayer.CUTOUT; {
} return BlockRenderLayer.CUTOUT;
}
@Override @Override
public IBlockState getActualState(IBlockState state, IBlockAccess worldIn, BlockPos pos) { public IBlockState getActualState( IBlockState state, IBlockAccess worldIn, BlockPos pos )
State teState = State.OFF; {
State teState = State.OFF;
TileWireless te = this.getTileEntity(worldIn, pos); TileWireless te = this.getTileEntity( worldIn, pos );
if (te != null) { if( te != null )
if (te.isActive()) { {
teState = State.HAS_CHANNEL; if( te.isActive() )
} else if (te.isPowered()) { {
teState = State.ON; teState = State.HAS_CHANNEL;
} }
} else if( te.isPowered() )
{
teState = State.ON;
}
}
return super.getActualState(state, worldIn, pos) return super.getActualState( state, worldIn, pos )
.withProperty(STATE, teState); .withProperty( STATE, teState );
} }
@Override @Override
protected IProperty[] getAEStates() { protected IProperty[] getAEStates()
return new IProperty[]{STATE}; {
} return new IProperty[] { STATE };
}
@Override @Override
public boolean onBlockActivated(final World w, final BlockPos pos, final IBlockState state, final EntityPlayer player, final EnumHand hand, final EnumFacing side, final float hitX, final float hitY, final float hitZ) { public boolean onBlockActivated( final World w, final BlockPos pos, final IBlockState state, final EntityPlayer player, final EnumHand hand, final EnumFacing side, final float hitX, final float hitY, final float hitZ )
final TileWireless tg = this.getTileEntity(w, pos); {
final TileWireless tg = this.getTileEntity( w, pos );
if (tg != null && !player.isSneaking()) { if( tg != null && !player.isSneaking() )
if (Platform.isServer()) { {
Platform.openGUI(player, tg, AEPartLocation.fromFacing(side), GuiBridge.GUI_WIRELESS); if( Platform.isServer() )
} {
return true; Platform.openGUI( player, tg, AEPartLocation.fromFacing( side ), GuiBridge.GUI_WIRELESS );
} }
return true;
}
return super.onBlockActivated(w, pos, state, player, hand, side, hitX, hitY, hitZ); return super.onBlockActivated( w, pos, state, player, hand, side, hitX, hitY, hitZ );
} }
@Override @Override
public Iterable<AxisAlignedBB> getSelectedBoundingBoxesFromPool(final World w, final BlockPos pos, final Entity thePlayer, final boolean b) { public Iterable<AxisAlignedBB> getSelectedBoundingBoxesFromPool( final World w, final BlockPos pos, final Entity thePlayer, final boolean b )
final TileWireless tile = this.getTileEntity(w, pos); {
if (tile != null) { final TileWireless tile = this.getTileEntity( w, pos );
final EnumFacing forward = tile.getForward(); if( tile != null )
{
final EnumFacing forward = tile.getForward();
double minX = 0; double minX = 0;
double minY = 0; double minY = 0;
double minZ = 0; double minZ = 0;
double maxX = 1; double maxX = 1;
double maxY = 1; double maxY = 1;
double maxZ = 1; double maxZ = 1;
switch (forward) { switch( forward )
case DOWN: {
minZ = minX = 3.0 / 16.0; case DOWN:
maxZ = maxX = 13.0 / 16.0; minZ = minX = 3.0 / 16.0;
maxY = 1.0; maxZ = maxX = 13.0 / 16.0;
minY = 5.0 / 16.0; maxY = 1.0;
break; minY = 5.0 / 16.0;
case EAST: break;
minZ = minY = 3.0 / 16.0; case EAST:
maxZ = maxY = 13.0 / 16.0; minZ = minY = 3.0 / 16.0;
maxX = 11.0 / 16.0; maxZ = maxY = 13.0 / 16.0;
minX = 0.0; maxX = 11.0 / 16.0;
break; minX = 0.0;
case NORTH: break;
minY = minX = 3.0 / 16.0; case NORTH:
maxY = maxX = 13.0 / 16.0; minY = minX = 3.0 / 16.0;
maxZ = 1.0; maxY = maxX = 13.0 / 16.0;
minZ = 5.0 / 16.0; maxZ = 1.0;
break; minZ = 5.0 / 16.0;
case SOUTH: break;
minY = minX = 3.0 / 16.0; case SOUTH:
maxY = maxX = 13.0 / 16.0; minY = minX = 3.0 / 16.0;
maxZ = 11.0 / 16.0; maxY = maxX = 13.0 / 16.0;
minZ = 0.0; maxZ = 11.0 / 16.0;
break; minZ = 0.0;
case UP: break;
minZ = minX = 3.0 / 16.0; case UP:
maxZ = maxX = 13.0 / 16.0; minZ = minX = 3.0 / 16.0;
maxY = 11.0 / 16.0; maxZ = maxX = 13.0 / 16.0;
minY = 0.0; maxY = 11.0 / 16.0;
break; minY = 0.0;
case WEST: break;
minZ = minY = 3.0 / 16.0; case WEST:
maxZ = maxY = 13.0 / 16.0; minZ = minY = 3.0 / 16.0;
maxX = 1.0; maxZ = maxY = 13.0 / 16.0;
minX = 5.0 / 16.0; maxX = 1.0;
break; minX = 5.0 / 16.0;
default: break;
break; default:
} break;
}
return Collections.singletonList(new AxisAlignedBB(minX, minY, minZ, maxX, maxY, maxZ)); return Collections.singletonList( new AxisAlignedBB( minX, minY, minZ, maxX, maxY, maxZ ) );
} }
return Collections.singletonList(new AxisAlignedBB(0.0, 0, 0.0, 1.0, 1.0, 1.0)); return Collections.singletonList( new AxisAlignedBB( 0.0, 0, 0.0, 1.0, 1.0, 1.0 ) );
} }
@Override @Override
public void addCollidingBlockToList(final World w, final BlockPos pos, final AxisAlignedBB bb, final List<AxisAlignedBB> out, final Entity e) { public void addCollidingBlockToList( final World w, final BlockPos pos, final AxisAlignedBB bb, final List<AxisAlignedBB> out, final Entity e )
final TileWireless tile = this.getTileEntity(w, pos); {
if (tile != null) { final TileWireless tile = this.getTileEntity( w, pos );
final EnumFacing forward = tile.getForward(); if( tile != null )
{
final EnumFacing forward = tile.getForward();
double minX = 0; double minX = 0;
double minY = 0; double minY = 0;
double minZ = 0; double minZ = 0;
double maxX = 1; double maxX = 1;
double maxY = 1; double maxY = 1;
double maxZ = 1; double maxZ = 1;
switch (forward) { switch( forward )
case DOWN: {
minZ = minX = 3.0 / 16.0; case DOWN:
maxZ = maxX = 13.0 / 16.0; minZ = minX = 3.0 / 16.0;
maxY = 1.0; maxZ = maxX = 13.0 / 16.0;
minY = 5.0 / 16.0; maxY = 1.0;
break; minY = 5.0 / 16.0;
case EAST: break;
minZ = minY = 3.0 / 16.0; case EAST:
maxZ = maxY = 13.0 / 16.0; minZ = minY = 3.0 / 16.0;
maxX = 11.0 / 16.0; maxZ = maxY = 13.0 / 16.0;
minX = 0.0; maxX = 11.0 / 16.0;
break; minX = 0.0;
case NORTH: break;
minY = minX = 3.0 / 16.0; case NORTH:
maxY = maxX = 13.0 / 16.0; minY = minX = 3.0 / 16.0;
maxZ = 1.0; maxY = maxX = 13.0 / 16.0;
minZ = 5.0 / 16.0; maxZ = 1.0;
break; minZ = 5.0 / 16.0;
case SOUTH: break;
minY = minX = 3.0 / 16.0; case SOUTH:
maxY = maxX = 13.0 / 16.0; minY = minX = 3.0 / 16.0;
maxZ = 11.0 / 16.0; maxY = maxX = 13.0 / 16.0;
minZ = 0.0; maxZ = 11.0 / 16.0;
break; minZ = 0.0;
case UP: break;
minZ = minX = 3.0 / 16.0; case UP:
maxZ = maxX = 13.0 / 16.0; minZ = minX = 3.0 / 16.0;
maxY = 11.0 / 16.0; maxZ = maxX = 13.0 / 16.0;
minY = 0.0; maxY = 11.0 / 16.0;
break; minY = 0.0;
case WEST: break;
minZ = minY = 3.0 / 16.0; case WEST:
maxZ = maxY = 13.0 / 16.0; minZ = minY = 3.0 / 16.0;
maxX = 1.0; maxZ = maxY = 13.0 / 16.0;
minX = 5.0 / 16.0; maxX = 1.0;
break; minX = 5.0 / 16.0;
default: break;
break; default:
} break;
}
out.add(new AxisAlignedBB(minX, minY, minZ, maxX, maxY, maxZ)); out.add( new AxisAlignedBB( minX, minY, minZ, maxX, maxY, maxZ ) );
} else { }
out.add(new AxisAlignedBB(0.0, 0.0, 0.0, 1.0, 1.0, 1.0)); else
} {
} out.add( new AxisAlignedBB( 0.0, 0.0, 0.0, 1.0, 1.0, 1.0 ) );
}
}
@Override @Override
public boolean isFullCube(IBlockState state) { public boolean isFullCube( IBlockState state )
return false; {
} return false;
}
} }
@@ -19,8 +19,6 @@
package appeng.block.networking; package appeng.block.networking;
import appeng.api.util.AEColor;
import appeng.client.render.cablebus.CableBusRenderState;
import net.minecraft.block.state.IBlockState; import net.minecraft.block.state.IBlockState;
import net.minecraft.client.renderer.color.IBlockColor; import net.minecraft.client.renderer.color.IBlockColor;
import net.minecraft.util.math.BlockPos; import net.minecraft.util.math.BlockPos;
@@ -29,26 +27,33 @@ import net.minecraftforge.common.property.IExtendedBlockState;
import net.minecraftforge.fml.relauncher.Side; import net.minecraftforge.fml.relauncher.Side;
import net.minecraftforge.fml.relauncher.SideOnly; import net.minecraftforge.fml.relauncher.SideOnly;
import appeng.api.util.AEColor;
import appeng.client.render.cablebus.CableBusRenderState;
/** /**
* Exposes the cable bus color as tint indices 0 (dark variant), 1 (medium variant) and 2 (bright variant). * Exposes the cable bus color as tint indices 0 (dark variant), 1 (medium variant) and 2 (bright variant).
*/ */
@SideOnly(Side.CLIENT) @SideOnly( Side.CLIENT )
public class CableBusColor implements IBlockColor { public class CableBusColor implements IBlockColor
{
@Override @Override
public int colorMultiplier(IBlockState state, IBlockAccess worldIn, BlockPos pos, int color) { public int colorMultiplier( IBlockState state, IBlockAccess worldIn, BlockPos pos, int color )
{
AEColor busColor = AEColor.TRANSPARENT; AEColor busColor = AEColor.TRANSPARENT;
if (state instanceof IExtendedBlockState) { if( state instanceof IExtendedBlockState )
CableBusRenderState renderState = ((IExtendedBlockState) state).getValue(BlockCableBus.RENDER_STATE_PROPERTY); {
if (renderState != null) { CableBusRenderState renderState = ( (IExtendedBlockState) state ).getValue( BlockCableBus.RENDER_STATE_PROPERTY );
busColor = renderState.getCableColor(); if( renderState != null )
} {
} busColor = renderState.getCableColor();
}
}
return busColor.getVariantByTintIndex(color); return busColor.getVariantByTintIndex( color );
} }
} }
@@ -19,30 +19,34 @@
package appeng.block.networking; package appeng.block.networking;
import net.minecraftforge.fml.relauncher.Side;
import net.minecraftforge.fml.relauncher.SideOnly;
import appeng.bootstrap.BlockRenderingCustomizer; import appeng.bootstrap.BlockRenderingCustomizer;
import appeng.bootstrap.IBlockRendering; import appeng.bootstrap.IBlockRendering;
import appeng.bootstrap.IItemRendering; import appeng.bootstrap.IItemRendering;
import appeng.client.render.cablebus.CableBusModel; import appeng.client.render.cablebus.CableBusModel;
import appeng.core.features.registries.PartModels; import appeng.core.features.registries.PartModels;
import net.minecraftforge.fml.relauncher.Side;
import net.minecraftforge.fml.relauncher.SideOnly;
/** /**
* Customizes the rendering behavior for cable busses, which are the biggest multipart of AE2. * Customizes the rendering behavior for cable busses, which are the biggest multipart of AE2.
*/ */
public class CableBusRendering extends BlockRenderingCustomizer { public class CableBusRendering extends BlockRenderingCustomizer
private final PartModels partModels; {
private final PartModels partModels;
public CableBusRendering(PartModels partModels) { public CableBusRendering( PartModels partModels )
this.partModels = partModels; {
} this.partModels = partModels;
}
@Override @Override
@SideOnly(Side.CLIENT) @SideOnly( Side.CLIENT )
public void customize(IBlockRendering rendering, IItemRendering itemRendering) { public void customize( IBlockRendering rendering, IItemRendering itemRendering )
rendering.builtInModel("models/block/builtin/cable_bus", new CableBusModel(this.partModels)); {
rendering.blockColor(new CableBusColor()); rendering.builtInModel( "models/block/builtin/cable_bus", new CableBusModel( this.partModels ) );
rendering.modelCustomizer((loc, model) -> model); rendering.blockColor( new CableBusColor() );
} rendering.modelCustomizer( ( loc, model ) -> model );
}
} }
@@ -24,10 +24,12 @@ import appeng.bootstrap.IBlockRendering;
import appeng.bootstrap.IItemRendering; import appeng.bootstrap.IItemRendering;
public class ControllerRendering extends BlockRenderingCustomizer { public class ControllerRendering extends BlockRenderingCustomizer
@Override {
public void customize(IBlockRendering rendering, IItemRendering itemRendering) { @Override
// Disables the default model rotator public void customize( IBlockRendering rendering, IItemRendering itemRendering )
rendering.modelCustomizer((loc, model) -> model); {
} // Disables the default model rotator
rendering.modelCustomizer( ( loc, model ) -> model );
}
} }
@@ -1,19 +1,23 @@
package appeng.block.networking; package appeng.block.networking;
import net.minecraftforge.fml.relauncher.Side;
import net.minecraftforge.fml.relauncher.SideOnly;
import appeng.api.util.AEColor; import appeng.api.util.AEColor;
import appeng.bootstrap.BlockRenderingCustomizer; import appeng.bootstrap.BlockRenderingCustomizer;
import appeng.bootstrap.IBlockRendering; import appeng.bootstrap.IBlockRendering;
import appeng.bootstrap.IItemRendering; import appeng.bootstrap.IItemRendering;
import appeng.client.render.StaticBlockColor; import appeng.client.render.StaticBlockColor;
import net.minecraftforge.fml.relauncher.Side;
import net.minecraftforge.fml.relauncher.SideOnly;
public class WirelessRendering extends BlockRenderingCustomizer { public class WirelessRendering extends BlockRenderingCustomizer
@Override {
@SideOnly(Side.CLIENT) @Override
public void customize(IBlockRendering rendering, IItemRendering itemRendering) { @SideOnly( Side.CLIENT )
rendering.blockColor(new StaticBlockColor(AEColor.TRANSPARENT)); public void customize( IBlockRendering rendering, IItemRendering itemRendering )
} {
rendering.blockColor( new StaticBlockColor( AEColor.TRANSPARENT ) );
}
} }
+102 -82
View File
@@ -19,10 +19,10 @@
package appeng.block.paint; package appeng.block.paint;
import appeng.block.AEBaseTileBlock; import java.util.Collection;
import appeng.helpers.Splotch; import java.util.Collections;
import appeng.tile.misc.TilePaint; import java.util.Random;
import appeng.util.Platform;
import net.minecraft.block.Block; import net.minecraft.block.Block;
import net.minecraft.block.material.MapColor; import net.minecraft.block.material.MapColor;
import net.minecraft.block.material.MaterialLiquid; import net.minecraft.block.material.MaterialLiquid;
@@ -44,108 +44,128 @@ import net.minecraftforge.common.property.IUnlistedProperty;
import net.minecraftforge.fml.relauncher.Side; import net.minecraftforge.fml.relauncher.Side;
import net.minecraftforge.fml.relauncher.SideOnly; import net.minecraftforge.fml.relauncher.SideOnly;
import java.util.Collection; import appeng.block.AEBaseTileBlock;
import java.util.Collections; import appeng.helpers.Splotch;
import java.util.Random; import appeng.tile.misc.TilePaint;
import appeng.util.Platform;
public class BlockPaint extends AEBaseTileBlock { public class BlockPaint extends AEBaseTileBlock
{
static final PaintSplotchesProperty SPLOTCHES = new PaintSplotchesProperty(); static final PaintSplotchesProperty SPLOTCHES = new PaintSplotchesProperty();
public BlockPaint() { public BlockPaint()
super(new MaterialLiquid(MapColor.AIR)); {
super( new MaterialLiquid( MapColor.AIR ) );
this.setLightOpacity(0); this.setLightOpacity( 0 );
this.setFullSize(false); this.setFullSize( false );
this.setOpaque(false); this.setOpaque( false );
} }
@Override @Override
protected BlockStateContainer createBlockState() { protected BlockStateContainer createBlockState()
return new ExtendedBlockState(this, new IProperty[0], new IUnlistedProperty[]{SPLOTCHES}); {
} return new ExtendedBlockState( this, new IProperty[0], new IUnlistedProperty[] { SPLOTCHES } );
}
@Override @Override
public IBlockState getExtendedState(IBlockState state, IBlockAccess world, BlockPos pos) { public IBlockState getExtendedState( IBlockState state, IBlockAccess world, BlockPos pos )
IExtendedBlockState extState = (IExtendedBlockState) state; {
IExtendedBlockState extState = (IExtendedBlockState) state;
TilePaint te = this.getTileEntity(world, pos); TilePaint te = this.getTileEntity( world, pos );
Collection<Splotch> splotches = Collections.emptyList(); Collection<Splotch> splotches = Collections.emptyList();
if (te != null) { if( te != null )
splotches = te.getDots(); {
} splotches = te.getDots();
}
return extState.withProperty(SPLOTCHES, new PaintSplotches(splotches)); return extState.withProperty( SPLOTCHES, new PaintSplotches( splotches ) );
} }
@Override @Override
public BlockRenderLayer getBlockLayer() { public BlockRenderLayer getBlockLayer()
return BlockRenderLayer.CUTOUT; {
} return BlockRenderLayer.CUTOUT;
}
@Override @Override
@SideOnly(Side.CLIENT) @SideOnly( Side.CLIENT )
public void getSubBlocks(final CreativeTabs tabs, final NonNullList<ItemStack> itemStacks) { public void getSubBlocks( final CreativeTabs tabs, final NonNullList<ItemStack> itemStacks )
// do nothing {
} // do nothing
}
@Override @Override
public AxisAlignedBB getCollisionBoundingBox(IBlockState blockState, IBlockAccess worldIn, BlockPos pos) { public AxisAlignedBB getCollisionBoundingBox( IBlockState blockState, IBlockAccess worldIn, BlockPos pos )
return null; {
} return null;
}
@Override @Override
public boolean canCollideCheck(final IBlockState state, final boolean hitIfLiquid) { public boolean canCollideCheck( final IBlockState state, final boolean hitIfLiquid )
return false; {
} return false;
}
@Override @Override
public void neighborChanged(IBlockState state, World world, BlockPos pos, Block blockIn, BlockPos fromPos) { public void neighborChanged( IBlockState state, World world, BlockPos pos, Block blockIn, BlockPos fromPos )
final TilePaint tp = this.getTileEntity(world, pos); {
final TilePaint tp = this.getTileEntity( world, pos );
if (tp != null) { if( tp != null )
tp.neighborChanged(); {
} tp.neighborChanged();
} }
}
@Override @Override
public Item getItemDropped(final IBlockState state, final Random rand, final int fortune) { public Item getItemDropped( final IBlockState state, final Random rand, final int fortune )
return null; {
} return null;
}
@Override @Override
public void dropBlockAsItemWithChance(final World worldIn, final BlockPos pos, final IBlockState state, final float chance, final int fortune) { public void dropBlockAsItemWithChance( final World worldIn, final BlockPos pos, final IBlockState state, final float chance, final int fortune )
{
} }
@Override @Override
public void fillWithRain(final World w, final BlockPos pos) { public void fillWithRain( final World w, final BlockPos pos )
if (Platform.isServer()) { {
w.setBlockToAir(pos); if( Platform.isServer() )
} {
} w.setBlockToAir( pos );
}
}
@Override @Override
public int getLightValue(final IBlockState state, final IBlockAccess w, final BlockPos pos) { public int getLightValue( final IBlockState state, final IBlockAccess w, final BlockPos pos )
final TilePaint tp = this.getTileEntity(w, pos); {
final TilePaint tp = this.getTileEntity( w, pos );
if (tp != null) { if( tp != null )
return tp.getLightLevel(); {
} return tp.getLightLevel();
}
return 0; return 0;
} }
@Override @Override
public boolean isAir(final IBlockState state, final IBlockAccess world, final BlockPos pos) { public boolean isAir( final IBlockState state, final IBlockAccess world, final BlockPos pos )
return true; {
} return true;
}
@Override @Override
public boolean isReplaceable(final IBlockAccess worldIn, final BlockPos pos) { public boolean isReplaceable( final IBlockAccess worldIn, final BlockPos pos )
return true; {
} return true;
}
} }
@@ -1,10 +1,16 @@
package appeng.block.paint; package appeng.block.paint;
import appeng.client.render.cablebus.CubeBuilder; import java.util.ArrayList;
import appeng.core.AppEng; import java.util.Collections;
import appeng.helpers.Splotch; import java.util.List;
import java.util.function.Function;
import javax.annotation.Nullable;
import com.google.common.collect.ImmutableList; import com.google.common.collect.ImmutableList;
import net.minecraft.block.state.IBlockState; import net.minecraft.block.state.IBlockState;
import net.minecraft.client.renderer.block.model.BakedQuad; import net.minecraft.client.renderer.block.model.BakedQuad;
import net.minecraft.client.renderer.block.model.IBakedModel; import net.minecraft.client.renderer.block.model.IBakedModel;
@@ -16,11 +22,9 @@ import net.minecraft.util.EnumFacing;
import net.minecraft.util.ResourceLocation; import net.minecraft.util.ResourceLocation;
import net.minecraftforge.common.property.IExtendedBlockState; import net.minecraftforge.common.property.IExtendedBlockState;
import javax.annotation.Nullable; import appeng.client.render.cablebus.CubeBuilder;
import java.util.ArrayList; import appeng.core.AppEng;
import java.util.Collections; import appeng.helpers.Splotch;
import java.util.List;
import java.util.function.Function;
/** /**
@@ -28,150 +32,168 @@ import java.util.function.Function;
* a * a
* matter cannon with paint balls. * matter cannon with paint balls.
*/ */
class PaintBakedModel implements IBakedModel { class PaintBakedModel implements IBakedModel
{
private static final ResourceLocation TEXTURE_PAINT1 = new ResourceLocation(AppEng.MOD_ID, "blocks/paint1"); private static final ResourceLocation TEXTURE_PAINT1 = new ResourceLocation( AppEng.MOD_ID, "blocks/paint1" );
private static final ResourceLocation TEXTURE_PAINT2 = new ResourceLocation(AppEng.MOD_ID, "blocks/paint2"); private static final ResourceLocation TEXTURE_PAINT2 = new ResourceLocation( AppEng.MOD_ID, "blocks/paint2" );
private static final ResourceLocation TEXTURE_PAINT3 = new ResourceLocation(AppEng.MOD_ID, "blocks/paint3"); private static final ResourceLocation TEXTURE_PAINT3 = new ResourceLocation( AppEng.MOD_ID, "blocks/paint3" );
private final VertexFormat vertexFormat; private final VertexFormat vertexFormat;
private final TextureAtlasSprite[] textures; private final TextureAtlasSprite[] textures;
PaintBakedModel(VertexFormat vertexFormat, Function<ResourceLocation, TextureAtlasSprite> bakedTextureGetter) { PaintBakedModel( VertexFormat vertexFormat, Function<ResourceLocation, TextureAtlasSprite> bakedTextureGetter )
this.vertexFormat = vertexFormat; {
this.textures = new TextureAtlasSprite[]{ this.vertexFormat = vertexFormat;
bakedTextureGetter.apply(TEXTURE_PAINT1), this.textures = new TextureAtlasSprite[] {
bakedTextureGetter.apply(TEXTURE_PAINT2), bakedTextureGetter.apply( TEXTURE_PAINT1 ),
bakedTextureGetter.apply(TEXTURE_PAINT3) bakedTextureGetter.apply( TEXTURE_PAINT2 ),
}; bakedTextureGetter.apply( TEXTURE_PAINT3 )
} };
}
@Override @Override
public List<BakedQuad> getQuads(@Nullable IBlockState state, @Nullable EnumFacing side, long rand) { public List<BakedQuad> getQuads( @Nullable IBlockState state, @Nullable EnumFacing side, long rand )
if (side != null) { {
return Collections.emptyList(); if( side != null )
} {
return Collections.emptyList();
}
if (!(state instanceof IExtendedBlockState)) { if( !( state instanceof IExtendedBlockState ) )
// This is the inventory model which should usually not be used other than in special cases {
List<BakedQuad> quads = new ArrayList<>(1); // This is the inventory model which should usually not be used other than in special cases
CubeBuilder builder = new CubeBuilder(this.vertexFormat, quads); List<BakedQuad> quads = new ArrayList<>( 1 );
builder.setTexture(this.textures[0]); CubeBuilder builder = new CubeBuilder( this.vertexFormat, quads );
builder.addCube(0, 0, 0, 16, 16, 16); builder.setTexture( this.textures[0] );
return quads; builder.addCube( 0, 0, 0, 16, 16, 16 );
} return quads;
}
IExtendedBlockState extendedBlockState = (IExtendedBlockState) state; IExtendedBlockState extendedBlockState = (IExtendedBlockState) state;
PaintSplotches splotchesState = extendedBlockState.getValue(BlockPaint.SPLOTCHES); PaintSplotches splotchesState = extendedBlockState.getValue( BlockPaint.SPLOTCHES );
if (splotchesState == null) { if( splotchesState == null )
return Collections.emptyList(); {
} return Collections.emptyList();
}
List<Splotch> splotches = splotchesState.getSplotches(); List<Splotch> splotches = splotchesState.getSplotches();
CubeBuilder builder = new CubeBuilder(this.vertexFormat); CubeBuilder builder = new CubeBuilder( this.vertexFormat );
float offsetConstant = 0.001f; float offsetConstant = 0.001f;
for (final Splotch s : splotches) { for( final Splotch s : splotches )
{
if (s.isLumen()) { if( s.isLumen() )
builder.setColorRGB(s.getColor().whiteVariant); {
builder.setRenderFullBright(true); builder.setColorRGB( s.getColor().whiteVariant );
} else { builder.setRenderFullBright( true );
builder.setColorRGB(s.getColor().mediumVariant); }
builder.setRenderFullBright(false); else
} {
builder.setColorRGB( s.getColor().mediumVariant );
builder.setRenderFullBright( false );
}
float offset = offsetConstant; float offset = offsetConstant;
offsetConstant += 0.001f; offsetConstant += 0.001f;
final float buffer = 0.1f; final float buffer = 0.1f;
float pos_x = s.x(); float pos_x = s.x();
float pos_y = s.y(); float pos_y = s.y();
pos_x = Math.max(buffer, Math.min(1.0f - buffer, pos_x)); pos_x = Math.max( buffer, Math.min( 1.0f - buffer, pos_x ) );
pos_y = Math.max(buffer, Math.min(1.0f - buffer, pos_y)); pos_y = Math.max( buffer, Math.min( 1.0f - buffer, pos_y ) );
TextureAtlasSprite ico = this.textures[s.getSeed() % this.textures.length]; TextureAtlasSprite ico = this.textures[s.getSeed() % this.textures.length];
builder.setTexture(ico); builder.setTexture( ico );
builder.setCustomUv(s.getSide().getOpposite(), 0, 0, 16, 16); builder.setCustomUv( s.getSide().getOpposite(), 0, 0, 16, 16 );
switch (s.getSide()) { switch( s.getSide() )
case UP: {
offset = 1.0f - offset; case UP:
builder.addQuad(EnumFacing.DOWN, pos_x - buffer, offset, pos_y - buffer, offset = 1.0f - offset;
pos_x + buffer, offset, pos_y + buffer); builder.addQuad( EnumFacing.DOWN, pos_x - buffer, offset, pos_y - buffer,
break; pos_x + buffer, offset, pos_y + buffer );
break;
case DOWN: case DOWN:
builder.addQuad(EnumFacing.UP, pos_x - buffer, offset, pos_y - buffer, builder.addQuad( EnumFacing.UP, pos_x - buffer, offset, pos_y - buffer,
pos_x + buffer, offset, pos_y + buffer); pos_x + buffer, offset, pos_y + buffer );
break; break;
case EAST: case EAST:
offset = 1.0f - offset; offset = 1.0f - offset;
builder.addQuad(EnumFacing.WEST, offset, pos_x - buffer, pos_y - buffer, builder.addQuad( EnumFacing.WEST, offset, pos_x - buffer, pos_y - buffer,
offset, pos_x + buffer, pos_y + buffer); offset, pos_x + buffer, pos_y + buffer );
break; break;
case WEST: case WEST:
builder.addQuad(EnumFacing.EAST, offset, pos_x - buffer, pos_y - buffer, builder.addQuad( EnumFacing.EAST, offset, pos_x - buffer, pos_y - buffer,
offset, pos_x + buffer, pos_y + buffer); offset, pos_x + buffer, pos_y + buffer );
break; break;
case SOUTH: case SOUTH:
offset = 1.0f - offset; offset = 1.0f - offset;
builder.addQuad(EnumFacing.NORTH, pos_x - buffer, pos_y - buffer, offset, builder.addQuad( EnumFacing.NORTH, pos_x - buffer, pos_y - buffer, offset,
pos_x + buffer, pos_y + buffer, offset); pos_x + buffer, pos_y + buffer, offset );
break; break;
case NORTH: case NORTH:
builder.addQuad(EnumFacing.SOUTH, pos_x - buffer, pos_y - buffer, offset, builder.addQuad( EnumFacing.SOUTH, pos_x - buffer, pos_y - buffer, offset,
pos_x + buffer, pos_y + buffer, offset); pos_x + buffer, pos_y + buffer, offset );
break; break;
default: default:
} }
} }
return builder.getOutput(); return builder.getOutput();
} }
@Override @Override
public boolean isAmbientOcclusion() { public boolean isAmbientOcclusion()
return false; {
} return false;
}
@Override @Override
public boolean isGui3d() { public boolean isGui3d()
return true; {
} return true;
}
@Override @Override
public boolean isBuiltInRenderer() { public boolean isBuiltInRenderer()
return false; {
} return false;
}
@Override @Override
public TextureAtlasSprite getParticleTexture() { public TextureAtlasSprite getParticleTexture()
return this.textures[0]; {
} return this.textures[0];
}
@Override @Override
public ItemCameraTransforms getItemCameraTransforms() { public ItemCameraTransforms getItemCameraTransforms()
return ItemCameraTransforms.DEFAULT; {
} return ItemCameraTransforms.DEFAULT;
}
@Override @Override
public ItemOverrideList getOverrides() { public ItemOverrideList getOverrides()
return ItemOverrideList.NONE; {
} return ItemOverrideList.NONE;
}
static List<ResourceLocation> getRequiredTextures() { static List<ResourceLocation> getRequiredTextures()
return ImmutableList.of( {
TEXTURE_PAINT1, TEXTURE_PAINT2, TEXTURE_PAINT3); return ImmutableList.of(
} TEXTURE_PAINT1, TEXTURE_PAINT2, TEXTURE_PAINT3 );
}
} }
@@ -1,6 +1,11 @@
package appeng.block.paint; package appeng.block.paint;
import java.util.Collection;
import java.util.Collections;
import java.util.function.Function;
import net.minecraft.client.renderer.block.model.IBakedModel; import net.minecraft.client.renderer.block.model.IBakedModel;
import net.minecraft.client.renderer.texture.TextureAtlasSprite; import net.minecraft.client.renderer.texture.TextureAtlasSprite;
import net.minecraft.client.renderer.vertex.VertexFormat; import net.minecraft.client.renderer.vertex.VertexFormat;
@@ -9,31 +14,32 @@ import net.minecraftforge.client.model.IModel;
import net.minecraftforge.common.model.IModelState; import net.minecraftforge.common.model.IModelState;
import net.minecraftforge.common.model.TRSRTransformation; import net.minecraftforge.common.model.TRSRTransformation;
import java.util.Collection;
import java.util.Collections;
import java.util.function.Function;
class PaintModel implements IModel
{
class PaintModel implements IModel { @Override
public Collection<ResourceLocation> getDependencies()
{
return Collections.emptyList();
}
@Override @Override
public Collection<ResourceLocation> getDependencies() { public Collection<ResourceLocation> getTextures()
return Collections.emptyList(); {
} return PaintBakedModel.getRequiredTextures();
}
@Override @Override
public Collection<ResourceLocation> getTextures() { public IBakedModel bake( IModelState state, VertexFormat format, Function<ResourceLocation, TextureAtlasSprite> bakedTextureGetter )
return PaintBakedModel.getRequiredTextures(); {
} return new PaintBakedModel( format, bakedTextureGetter );
}
@Override @Override
public IBakedModel bake(IModelState state, VertexFormat format, Function<ResourceLocation, TextureAtlasSprite> bakedTextureGetter) { public IModelState getDefaultState()
return new PaintBakedModel(format, bakedTextureGetter); {
} return TRSRTransformation.identity();
}
@Override
public IModelState getDefaultState() {
return TRSRTransformation.identity();
}
} }
@@ -1,20 +1,24 @@
package appeng.block.paint; package appeng.block.paint;
import net.minecraftforge.fml.relauncher.Side;
import net.minecraftforge.fml.relauncher.SideOnly;
import appeng.bootstrap.BlockRenderingCustomizer; import appeng.bootstrap.BlockRenderingCustomizer;
import appeng.bootstrap.IBlockRendering; import appeng.bootstrap.IBlockRendering;
import appeng.bootstrap.IItemRendering; import appeng.bootstrap.IItemRendering;
import net.minecraftforge.fml.relauncher.Side;
import net.minecraftforge.fml.relauncher.SideOnly;
public class PaintRendering extends BlockRenderingCustomizer { public class PaintRendering extends BlockRenderingCustomizer
{
@Override @Override
@SideOnly(Side.CLIENT) @SideOnly( Side.CLIENT )
public void customize(IBlockRendering rendering, IItemRendering itemRendering) { public void customize( IBlockRendering rendering, IItemRendering itemRendering )
rendering.builtInModel("models/block/paint", new PaintModel()); {
// Disable auto rotation rendering.builtInModel( "models/block/paint", new PaintModel() );
rendering.modelCustomizer((location, model) -> model); // Disable auto rotation
} rendering.modelCustomizer( ( location, model ) -> model );
}
} }
@@ -1,26 +1,31 @@
package appeng.block.paint; package appeng.block.paint;
import appeng.helpers.Splotch;
import com.google.common.collect.ImmutableList;
import java.util.Collection; import java.util.Collection;
import java.util.List; import java.util.List;
import com.google.common.collect.ImmutableList;
import appeng.helpers.Splotch;
/** /**
* Used to transfer the state about paint splotches from the game thread to the render thread. * Used to transfer the state about paint splotches from the game thread to the render thread.
*/ */
class PaintSplotches { class PaintSplotches
{
private final List<Splotch> splotches; private final List<Splotch> splotches;
PaintSplotches(Collection<Splotch> splotches) { PaintSplotches( Collection<Splotch> splotches )
this.splotches = ImmutableList.copyOf(splotches); {
} this.splotches = ImmutableList.copyOf( splotches );
}
List<Splotch> getSplotches() { List<Splotch> getSplotches()
return this.splotches; {
} return this.splotches;
}
} }
@@ -1,28 +1,34 @@
package appeng.block.paint; package appeng.block.paint;
import net.minecraftforge.common.property.IUnlistedProperty; import net.minecraftforge.common.property.IUnlistedProperty;
class PaintSplotchesProperty implements IUnlistedProperty<PaintSplotches> { class PaintSplotchesProperty implements IUnlistedProperty<PaintSplotches>
{
@Override @Override
public String getName() { public String getName()
return "paint_splots"; {
} return "paint_splots";
}
@Override @Override
public boolean isValid(PaintSplotches value) { public boolean isValid( PaintSplotches value )
return value != null; {
} return value != null;
}
@Override @Override
public Class<PaintSplotches> getType() { public Class<PaintSplotches> getType()
return PaintSplotches.class; {
} return PaintSplotches.class;
}
@Override @Override
public String valueToString(PaintSplotches value) { public String valueToString( PaintSplotches value )
return null; {
} return null;
}
} }
@@ -19,9 +19,6 @@
package appeng.block.qnb; package appeng.block.qnb;
import appeng.block.AEBaseTileBlock;
import appeng.helpers.ICustomCollision;
import appeng.tile.qnb.TileQuantumBridge;
import net.minecraft.block.Block; import net.minecraft.block.Block;
import net.minecraft.block.material.Material; import net.minecraft.block.material.Material;
import net.minecraft.block.properties.IProperty; import net.minecraft.block.properties.IProperty;
@@ -37,79 +34,97 @@ import net.minecraftforge.common.property.ExtendedBlockState;
import net.minecraftforge.common.property.IExtendedBlockState; import net.minecraftforge.common.property.IExtendedBlockState;
import net.minecraftforge.common.property.IUnlistedProperty; import net.minecraftforge.common.property.IUnlistedProperty;
import appeng.block.AEBaseTileBlock;
import appeng.helpers.ICustomCollision;
import appeng.tile.qnb.TileQuantumBridge;
public abstract class BlockQuantumBase extends AEBaseTileBlock implements ICustomCollision {
public static final PropertyBool FORMED = PropertyBool.create("formed"); public abstract class BlockQuantumBase extends AEBaseTileBlock implements ICustomCollision
{
public static final QnbFormedStateProperty FORMED_STATE = new QnbFormedStateProperty(); public static final PropertyBool FORMED = PropertyBool.create( "formed" );
public BlockQuantumBase(final Material mat) { public static final QnbFormedStateProperty FORMED_STATE = new QnbFormedStateProperty();
super(mat);
final float shave = 2.0f / 16.0f;
this.boundingBox = new AxisAlignedBB(shave, shave, shave, 1.0f - shave, 1.0f - shave, 1.0f - shave);
this.setLightOpacity(0);
this.setFullSize(this.setOpaque(false));
this.setDefaultState(this.getDefaultState().withProperty(FORMED, false));
}
@Override public BlockQuantumBase( final Material mat )
protected IProperty[] getAEStates() { {
return new IProperty[]{FORMED}; super( mat );
} final float shave = 2.0f / 16.0f;
this.boundingBox = new AxisAlignedBB( shave, shave, shave, 1.0f - shave, 1.0f - shave, 1.0f - shave );
this.setLightOpacity( 0 );
this.setFullSize( this.setOpaque( false ) );
this.setDefaultState( this.getDefaultState().withProperty( FORMED, false ) );
}
@Override @Override
protected BlockStateContainer createBlockState() { protected IProperty[] getAEStates()
return new ExtendedBlockState(this, this.getAEStates(), new IUnlistedProperty[]{FORMED_STATE}); {
} return new IProperty[] { FORMED };
}
@Override @Override
public IBlockState getExtendedState(IBlockState state, IBlockAccess world, BlockPos pos) { protected BlockStateContainer createBlockState()
IExtendedBlockState extState = (IExtendedBlockState) state; {
return new ExtendedBlockState( this, this.getAEStates(), new IUnlistedProperty[] { FORMED_STATE } );
}
TileQuantumBridge bridge = this.getTileEntity(world, pos); @Override
if (bridge != null) { public IBlockState getExtendedState( IBlockState state, IBlockAccess world, BlockPos pos )
QnbFormedState formedState = new QnbFormedState(bridge.getAdjacentQuantumBridges(), bridge.isCorner(), bridge.isPowered()); {
extState = extState.withProperty(FORMED_STATE, formedState); IExtendedBlockState extState = (IExtendedBlockState) state;
}
return extState; TileQuantumBridge bridge = this.getTileEntity( world, pos );
} if( bridge != null )
{
QnbFormedState formedState = new QnbFormedState( bridge.getAdjacentQuantumBridges(), bridge.isCorner(), bridge.isPowered() );
extState = extState.withProperty( FORMED_STATE, formedState );
}
@Override return extState;
public IBlockState getActualState(IBlockState state, IBlockAccess worldIn, BlockPos pos) { }
TileQuantumBridge bridge = this.getTileEntity(worldIn, pos);
if (bridge != null) {
state = state.withProperty(FORMED, bridge.isFormed());
}
return state;
}
@Override @Override
public BlockRenderLayer getBlockLayer() { public IBlockState getActualState( IBlockState state, IBlockAccess worldIn, BlockPos pos )
return BlockRenderLayer.CUTOUT; {
} TileQuantumBridge bridge = this.getTileEntity( worldIn, pos );
if( bridge != null )
{
state = state.withProperty( FORMED, bridge.isFormed() );
}
return state;
}
@Override @Override
public void neighborChanged(IBlockState state, World world, BlockPos pos, Block blockIn, BlockPos fromPos) { public BlockRenderLayer getBlockLayer()
final TileQuantumBridge bridge = this.getTileEntity(world, pos); {
if (bridge != null) { return BlockRenderLayer.CUTOUT;
bridge.neighborUpdate(); }
}
}
@Override @Override
public void breakBlock(final World w, final BlockPos pos, final IBlockState state) { public void neighborChanged( IBlockState state, World world, BlockPos pos, Block blockIn, BlockPos fromPos )
final TileQuantumBridge bridge = this.getTileEntity(w, pos); {
if (bridge != null) { final TileQuantumBridge bridge = this.getTileEntity( world, pos );
bridge.breakCluster(); if( bridge != null )
} {
bridge.neighborUpdate();
}
}
super.breakBlock(w, pos, state); @Override
} public void breakBlock( final World w, final BlockPos pos, final IBlockState state )
{
final TileQuantumBridge bridge = this.getTileEntity( w, pos );
if( bridge != null )
{
bridge.breakCluster();
}
@Override super.breakBlock( w, pos, state );
public boolean isFullCube(IBlockState state) { }
return false;
} @Override
public boolean isFullCube( IBlockState state )
{
return false;
}
} }
@@ -19,13 +19,12 @@
package appeng.block.qnb; package appeng.block.qnb;
import appeng.api.util.AEPartLocation; import java.util.Collections;
import appeng.client.EffectType; import java.util.List;
import appeng.core.AppEng; import java.util.Random;
import appeng.core.sync.GuiBridge;
import appeng.helpers.AEGlassMaterial; import javax.annotation.Nullable;
import appeng.tile.qnb.TileQuantumBridge;
import appeng.util.Platform;
import net.minecraft.block.state.IBlockState; import net.minecraft.block.state.IBlockState;
import net.minecraft.entity.Entity; import net.minecraft.entity.Entity;
import net.minecraft.entity.player.EntityPlayer; import net.minecraft.entity.player.EntityPlayer;
@@ -36,55 +35,70 @@ import net.minecraft.util.math.AxisAlignedBB;
import net.minecraft.util.math.BlockPos; import net.minecraft.util.math.BlockPos;
import net.minecraft.world.World; import net.minecraft.world.World;
import javax.annotation.Nullable; import appeng.api.util.AEPartLocation;
import java.util.Collections; import appeng.client.EffectType;
import java.util.List; import appeng.core.AppEng;
import java.util.Random; import appeng.core.sync.GuiBridge;
import appeng.helpers.AEGlassMaterial;
import appeng.tile.qnb.TileQuantumBridge;
import appeng.util.Platform;
public class BlockQuantumLinkChamber extends BlockQuantumBase { public class BlockQuantumLinkChamber extends BlockQuantumBase
{
public BlockQuantumLinkChamber() { public BlockQuantumLinkChamber()
super(AEGlassMaterial.INSTANCE); {
} super( AEGlassMaterial.INSTANCE );
}
@Override @Override
public void randomDisplayTick(final IBlockState state, final World w, final BlockPos pos, final Random rand) { public void randomDisplayTick( final IBlockState state, final World w, final BlockPos pos, final Random rand )
final TileQuantumBridge bridge = this.getTileEntity(w, pos); {
if (bridge != null) { final TileQuantumBridge bridge = this.getTileEntity( w, pos );
if (bridge.hasQES()) { if( bridge != null )
if (AppEng.proxy.shouldAddParticles(rand)) { {
AppEng.proxy.spawnEffect(EffectType.Energy, w, pos.getX() + 0.5, pos.getY() + 0.5, pos.getZ() + 0.5, null); if( bridge.hasQES() )
} {
} if( AppEng.proxy.shouldAddParticles( rand ) )
} {
} AppEng.proxy.spawnEffect( EffectType.Energy, w, pos.getX() + 0.5, pos.getY() + 0.5, pos.getZ() + 0.5, null );
}
}
}
}
@Override @Override
public boolean onActivated(final World w, final BlockPos pos, final EntityPlayer p, final EnumHand hand, final @Nullable ItemStack heldItem, final EnumFacing side, final float hitX, final float hitY, final float hitZ) { public boolean onActivated( final World w, final BlockPos pos, final EntityPlayer p, final EnumHand hand, final @Nullable ItemStack heldItem, final EnumFacing side, final float hitX, final float hitY, final float hitZ )
if (p.isSneaking()) { {
return false; if( p.isSneaking() )
} {
return false;
}
final TileQuantumBridge tg = this.getTileEntity(w, pos); final TileQuantumBridge tg = this.getTileEntity( w, pos );
if (tg != null) { if( tg != null )
if (Platform.isServer()) { {
Platform.openGUI(p, tg, AEPartLocation.fromFacing(side), GuiBridge.GUI_QNB); if( Platform.isServer() )
} {
return true; Platform.openGUI( p, tg, AEPartLocation.fromFacing( side ), GuiBridge.GUI_QNB );
} }
return false; return true;
} }
return false;
}
@Override @Override
public Iterable<AxisAlignedBB> getSelectedBoundingBoxesFromPool(final World w, final BlockPos pos, final Entity thePlayer, final boolean b) { public Iterable<AxisAlignedBB> getSelectedBoundingBoxesFromPool( final World w, final BlockPos pos, final Entity thePlayer, final boolean b )
final double onePixel = 2.0 / 16.0; {
return Collections.singletonList(new AxisAlignedBB(onePixel, onePixel, onePixel, 1.0 - onePixel, 1.0 - onePixel, 1.0 - onePixel)); final double onePixel = 2.0 / 16.0;
} return Collections.singletonList( new AxisAlignedBB( onePixel, onePixel, onePixel, 1.0 - onePixel, 1.0 - onePixel, 1.0 - onePixel ) );
}
@Override @Override
public void addCollidingBlockToList(final World w, final BlockPos pos, final AxisAlignedBB bb, final List<AxisAlignedBB> out, final Entity e) { public void addCollidingBlockToList( final World w, final BlockPos pos, final AxisAlignedBB bb, final List<AxisAlignedBB> out, final Entity e )
final double onePixel = 2.0 / 16.0; {
out.add(new AxisAlignedBB(onePixel, onePixel, onePixel, 1.0 - onePixel, 1.0 - onePixel, 1.0 - onePixel)); final double onePixel = 2.0 / 16.0;
} out.add( new AxisAlignedBB( onePixel, onePixel, onePixel, 1.0 - onePixel, 1.0 - onePixel, 1.0 - onePixel ) );
}
} }
@@ -19,44 +19,55 @@
package appeng.block.qnb; package appeng.block.qnb;
import appeng.tile.qnb.TileQuantumBridge; import java.util.Collections;
import java.util.List;
import net.minecraft.block.material.Material; import net.minecraft.block.material.Material;
import net.minecraft.entity.Entity; import net.minecraft.entity.Entity;
import net.minecraft.util.math.AxisAlignedBB; import net.minecraft.util.math.AxisAlignedBB;
import net.minecraft.util.math.BlockPos; import net.minecraft.util.math.BlockPos;
import net.minecraft.world.World; import net.minecraft.world.World;
import java.util.Collections; import appeng.tile.qnb.TileQuantumBridge;
import java.util.List;
public class BlockQuantumRing extends BlockQuantumBase { public class BlockQuantumRing extends BlockQuantumBase
{
public BlockQuantumRing() { public BlockQuantumRing()
super(Material.IRON); {
} super( Material.IRON );
}
@Override @Override
public Iterable<AxisAlignedBB> getSelectedBoundingBoxesFromPool(final World w, final BlockPos pos, final Entity thePlayer, final boolean b) { public Iterable<AxisAlignedBB> getSelectedBoundingBoxesFromPool( final World w, final BlockPos pos, final Entity thePlayer, final boolean b )
double onePixel = 2.0 / 16.0; {
final TileQuantumBridge bridge = this.getTileEntity(w, pos); double onePixel = 2.0 / 16.0;
if (bridge != null && bridge.isCorner()) { final TileQuantumBridge bridge = this.getTileEntity( w, pos );
onePixel = 4.0 / 16.0; if( bridge != null && bridge.isCorner() )
} else if (bridge != null && bridge.isFormed()) { {
onePixel = 1.0 / 16.0; onePixel = 4.0 / 16.0;
} }
return Collections.singletonList(new AxisAlignedBB(onePixel, onePixel, onePixel, 1.0 - onePixel, 1.0 - onePixel, 1.0 - onePixel)); else if( bridge != null && bridge.isFormed() )
} {
onePixel = 1.0 / 16.0;
}
return Collections.singletonList( new AxisAlignedBB( onePixel, onePixel, onePixel, 1.0 - onePixel, 1.0 - onePixel, 1.0 - onePixel ) );
}
@Override @Override
public void addCollidingBlockToList(final World w, final BlockPos pos, final AxisAlignedBB bb, final List<AxisAlignedBB> out, final Entity e) { public void addCollidingBlockToList( final World w, final BlockPos pos, final AxisAlignedBB bb, final List<AxisAlignedBB> out, final Entity e )
double onePixel = 2.0 / 16.0; {
final TileQuantumBridge bridge = this.getTileEntity(w, pos); double onePixel = 2.0 / 16.0;
if (bridge != null && bridge.isCorner()) { final TileQuantumBridge bridge = this.getTileEntity( w, pos );
onePixel = 4.0 / 16.0; if( bridge != null && bridge.isCorner() )
} else if (bridge != null && bridge.isFormed()) { {
onePixel = 1.0 / 16.0; onePixel = 4.0 / 16.0;
} }
out.add(new AxisAlignedBB(onePixel, onePixel, onePixel, 1.0 - onePixel, 1.0 - onePixel, 1.0 - onePixel)); else if( bridge != null && bridge.isFormed() )
} {
onePixel = 1.0 / 16.0;
}
out.add( new AxisAlignedBB( onePixel, onePixel, onePixel, 1.0 - onePixel, 1.0 - onePixel, 1.0 - onePixel ) );
}
} }
@@ -1,10 +1,16 @@
package appeng.block.qnb; package appeng.block.qnb;
import appeng.api.AEApi; import java.util.EnumSet;
import appeng.client.render.cablebus.CubeBuilder; import java.util.List;
import appeng.core.AppEng; import java.util.Set;
import java.util.function.Function;
import javax.annotation.Nullable;
import com.google.common.collect.ImmutableList; import com.google.common.collect.ImmutableList;
import net.minecraft.block.Block; import net.minecraft.block.Block;
import net.minecraft.block.state.IBlockState; import net.minecraft.block.state.IBlockState;
import net.minecraft.client.renderer.block.model.BakedQuad; import net.minecraft.client.renderer.block.model.BakedQuad;
@@ -17,195 +23,222 @@ import net.minecraft.util.EnumFacing;
import net.minecraft.util.ResourceLocation; import net.minecraft.util.ResourceLocation;
import net.minecraftforge.common.property.IExtendedBlockState; import net.minecraftforge.common.property.IExtendedBlockState;
import javax.annotation.Nullable; import appeng.api.AEApi;
import java.util.EnumSet; import appeng.client.render.cablebus.CubeBuilder;
import java.util.List; import appeng.core.AppEng;
import java.util.Set;
import java.util.function.Function;
class QnbFormedBakedModel implements IBakedModel { class QnbFormedBakedModel implements IBakedModel
{
private static final ResourceLocation TEXTURE_LINK = new ResourceLocation(AppEng.MOD_ID, "blocks/quantum_link"); private static final ResourceLocation TEXTURE_LINK = new ResourceLocation( AppEng.MOD_ID, "blocks/quantum_link" );
private static final ResourceLocation TEXTURE_RING = new ResourceLocation(AppEng.MOD_ID, "blocks/quantum_ring"); private static final ResourceLocation TEXTURE_RING = new ResourceLocation( AppEng.MOD_ID, "blocks/quantum_ring" );
private static final ResourceLocation TEXTURE_RING_LIGHT = new ResourceLocation(AppEng.MOD_ID, "blocks/quantum_ring_light"); private static final ResourceLocation TEXTURE_RING_LIGHT = new ResourceLocation( AppEng.MOD_ID, "blocks/quantum_ring_light" );
private static final ResourceLocation TEXTURE_RING_LIGHT_CORNER = new ResourceLocation(AppEng.MOD_ID, "blocks/quantum_ring_light_corner"); private static final ResourceLocation TEXTURE_RING_LIGHT_CORNER = new ResourceLocation( AppEng.MOD_ID, "blocks/quantum_ring_light_corner" );
private static final ResourceLocation TEXTURE_CABLE_GLASS = new ResourceLocation(AppEng.MOD_ID, "parts/cable/glass/transparent"); private static final ResourceLocation TEXTURE_CABLE_GLASS = new ResourceLocation( AppEng.MOD_ID, "parts/cable/glass/transparent" );
private static final ResourceLocation TEXTURE_COVERED_CABLE = new ResourceLocation(AppEng.MOD_ID, "parts/cable/covered/transparent"); private static final ResourceLocation TEXTURE_COVERED_CABLE = new ResourceLocation( AppEng.MOD_ID, "parts/cable/covered/transparent" );
private static final float DEFAULT_RENDER_MIN = 2.0f; private static final float DEFAULT_RENDER_MIN = 2.0f;
private static final float DEFAULT_RENDER_MAX = 14.0f; private static final float DEFAULT_RENDER_MAX = 14.0f;
private static final float CORNER_POWERED_RENDER_MIN = 3.9f; private static final float CORNER_POWERED_RENDER_MIN = 3.9f;
private static final float CORNER_POWERED_RENDER_MAX = 12.1f; private static final float CORNER_POWERED_RENDER_MAX = 12.1f;
private static final float CENTER_POWERED_RENDER_MIN = -0.01f; private static final float CENTER_POWERED_RENDER_MIN = -0.01f;
private static final float CENTER_POWERED_RENDER_MAX = 16.01f; private static final float CENTER_POWERED_RENDER_MAX = 16.01f;
private final VertexFormat vertexFormat; private final VertexFormat vertexFormat;
private final IBakedModel baseModel; private final IBakedModel baseModel;
private final Block linkBlock; private final Block linkBlock;
private final TextureAtlasSprite linkTexture; private final TextureAtlasSprite linkTexture;
private final TextureAtlasSprite ringTexture; private final TextureAtlasSprite ringTexture;
private final TextureAtlasSprite glassCableTexture; private final TextureAtlasSprite glassCableTexture;
private final TextureAtlasSprite coveredCableTexture; private final TextureAtlasSprite coveredCableTexture;
private final TextureAtlasSprite lightTexture; private final TextureAtlasSprite lightTexture;
private final TextureAtlasSprite lightCornerTexture; private final TextureAtlasSprite lightCornerTexture;
public QnbFormedBakedModel(VertexFormat vertexFormat, IBakedModel baseModel, Function<ResourceLocation, TextureAtlasSprite> bakedTextureGetter) { public QnbFormedBakedModel( VertexFormat vertexFormat, IBakedModel baseModel, Function<ResourceLocation, TextureAtlasSprite> bakedTextureGetter )
this.vertexFormat = vertexFormat; {
this.baseModel = baseModel; this.vertexFormat = vertexFormat;
this.linkTexture = bakedTextureGetter.apply(TEXTURE_LINK); this.baseModel = baseModel;
this.ringTexture = bakedTextureGetter.apply(TEXTURE_RING); this.linkTexture = bakedTextureGetter.apply( TEXTURE_LINK );
this.glassCableTexture = bakedTextureGetter.apply(TEXTURE_CABLE_GLASS); this.ringTexture = bakedTextureGetter.apply( TEXTURE_RING );
this.coveredCableTexture = bakedTextureGetter.apply(TEXTURE_COVERED_CABLE); this.glassCableTexture = bakedTextureGetter.apply( TEXTURE_CABLE_GLASS );
this.lightTexture = bakedTextureGetter.apply(TEXTURE_RING_LIGHT); this.coveredCableTexture = bakedTextureGetter.apply( TEXTURE_COVERED_CABLE );
this.lightCornerTexture = bakedTextureGetter.apply(TEXTURE_RING_LIGHT_CORNER); this.lightTexture = bakedTextureGetter.apply( TEXTURE_RING_LIGHT );
this.linkBlock = AEApi.instance().definitions().blocks().quantumLink().maybeBlock().orElse(null); this.lightCornerTexture = bakedTextureGetter.apply( TEXTURE_RING_LIGHT_CORNER );
} this.linkBlock = AEApi.instance().definitions().blocks().quantumLink().maybeBlock().orElse( null );
}
@Override @Override
public List<BakedQuad> getQuads(@Nullable IBlockState state, @Nullable EnumFacing side, long rand) { public List<BakedQuad> getQuads( @Nullable IBlockState state, @Nullable EnumFacing side, long rand )
// Get the correct base model {
if (!(state instanceof IExtendedBlockState)) { // Get the correct base model
return this.baseModel.getQuads(state, side, rand); if( !( state instanceof IExtendedBlockState ) )
} {
return this.baseModel.getQuads( state, side, rand );
}
IExtendedBlockState extendedBlockState = (IExtendedBlockState) state; IExtendedBlockState extendedBlockState = (IExtendedBlockState) state;
QnbFormedState formedState = extendedBlockState.getValue(BlockQuantumBase.FORMED_STATE); QnbFormedState formedState = extendedBlockState.getValue( BlockQuantumBase.FORMED_STATE );
return this.getQuads(formedState, state, side, rand); return this.getQuads( formedState, state, side, rand );
} }
private List<BakedQuad> getQuads(QnbFormedState formedState, IBlockState state, EnumFacing side, long rand) { private List<BakedQuad> getQuads( QnbFormedState formedState, IBlockState state, EnumFacing side, long rand )
CubeBuilder builder = new CubeBuilder(this.vertexFormat); {
CubeBuilder builder = new CubeBuilder( this.vertexFormat );
if (state.getBlock() == this.linkBlock) { if( state.getBlock() == this.linkBlock )
Set<EnumFacing> sides = formedState.getAdjacentQuantumBridges(); {
Set<EnumFacing> sides = formedState.getAdjacentQuantumBridges();
this.renderCableAt(builder, 0.11f * 16, this.glassCableTexture, 0.141f * 16, sides); this.renderCableAt( builder, 0.11f * 16, this.glassCableTexture, 0.141f * 16, sides );
this.renderCableAt(builder, 0.188f * 16, this.coveredCableTexture, 0.1875f * 16, sides); this.renderCableAt( builder, 0.188f * 16, this.coveredCableTexture, 0.1875f * 16, sides );
builder.setTexture(this.linkTexture); builder.setTexture( this.linkTexture );
builder.addCube(DEFAULT_RENDER_MIN, DEFAULT_RENDER_MIN, DEFAULT_RENDER_MIN, DEFAULT_RENDER_MAX, DEFAULT_RENDER_MAX, DEFAULT_RENDER_MAX); builder.addCube( DEFAULT_RENDER_MIN, DEFAULT_RENDER_MIN, DEFAULT_RENDER_MIN, DEFAULT_RENDER_MAX, DEFAULT_RENDER_MAX, DEFAULT_RENDER_MAX );
} else { }
if (formedState.isCorner()) { else
this.renderCableAt(builder, 0.188f * 16, this.coveredCableTexture, 0.05f * 16, formedState.getAdjacentQuantumBridges()); {
if( formedState.isCorner() )
{
this.renderCableAt( builder, 0.188f * 16, this.coveredCableTexture, 0.05f * 16, formedState.getAdjacentQuantumBridges() );
builder.setTexture(this.ringTexture); builder.setTexture( this.ringTexture );
builder.addCube(DEFAULT_RENDER_MIN, DEFAULT_RENDER_MIN, DEFAULT_RENDER_MIN, DEFAULT_RENDER_MAX, DEFAULT_RENDER_MAX, DEFAULT_RENDER_MAX); builder.addCube( DEFAULT_RENDER_MIN, DEFAULT_RENDER_MIN, DEFAULT_RENDER_MIN, DEFAULT_RENDER_MAX, DEFAULT_RENDER_MAX, DEFAULT_RENDER_MAX );
if (formedState.isPowered()) { if( formedState.isPowered() )
builder.setTexture(this.lightCornerTexture); {
builder.setRenderFullBright(true); builder.setTexture( this.lightCornerTexture );
for (EnumFacing facing : EnumFacing.values()) { builder.setRenderFullBright( true );
// Offset the face by a slight amount so that it is drawn over the already drawn ring texture for( EnumFacing facing : EnumFacing.values() )
// (avoids z-fighting) {
float xOffset = Math.abs(facing.getFrontOffsetX() * 0.01f); // Offset the face by a slight amount so that it is drawn over the already drawn ring texture
float yOffset = Math.abs(facing.getFrontOffsetY() * 0.01f); // (avoids z-fighting)
float zOffset = Math.abs(facing.getFrontOffsetZ() * 0.01f); float xOffset = Math.abs( facing.getFrontOffsetX() * 0.01f );
float yOffset = Math.abs( facing.getFrontOffsetY() * 0.01f );
float zOffset = Math.abs( facing.getFrontOffsetZ() * 0.01f );
builder.setDrawFaces(EnumSet.of(facing)); builder.setDrawFaces( EnumSet.of( facing ) );
builder.addCube( builder.addCube(
DEFAULT_RENDER_MIN - xOffset, DEFAULT_RENDER_MIN - yOffset, DEFAULT_RENDER_MIN - zOffset, DEFAULT_RENDER_MIN - xOffset, DEFAULT_RENDER_MIN - yOffset, DEFAULT_RENDER_MIN - zOffset,
DEFAULT_RENDER_MAX + xOffset, DEFAULT_RENDER_MAX + yOffset, DEFAULT_RENDER_MAX + zOffset); DEFAULT_RENDER_MAX + xOffset, DEFAULT_RENDER_MAX + yOffset, DEFAULT_RENDER_MAX + zOffset );
} }
} }
} else { }
builder.setTexture(this.ringTexture); else
{
builder.setTexture( this.ringTexture );
builder.addCube(0, DEFAULT_RENDER_MIN, DEFAULT_RENDER_MIN, 16, DEFAULT_RENDER_MAX, DEFAULT_RENDER_MAX); builder.addCube( 0, DEFAULT_RENDER_MIN, DEFAULT_RENDER_MIN, 16, DEFAULT_RENDER_MAX, DEFAULT_RENDER_MAX );
builder.addCube(DEFAULT_RENDER_MIN, 0, DEFAULT_RENDER_MIN, DEFAULT_RENDER_MAX, 16, DEFAULT_RENDER_MAX); builder.addCube( DEFAULT_RENDER_MIN, 0, DEFAULT_RENDER_MIN, DEFAULT_RENDER_MAX, 16, DEFAULT_RENDER_MAX );
builder.addCube(DEFAULT_RENDER_MIN, DEFAULT_RENDER_MIN, 0, DEFAULT_RENDER_MAX, DEFAULT_RENDER_MAX, 16); builder.addCube( DEFAULT_RENDER_MIN, DEFAULT_RENDER_MIN, 0, DEFAULT_RENDER_MAX, DEFAULT_RENDER_MAX, 16 );
if (formedState.isPowered()) { if( formedState.isPowered() )
builder.setTexture(this.lightTexture); {
builder.setRenderFullBright(true); builder.setTexture( this.lightTexture );
for (EnumFacing facing : EnumFacing.values()) { builder.setRenderFullBright( true );
// Offset the face by a slight amount so that it is drawn over the already drawn ring texture for( EnumFacing facing : EnumFacing.values() )
// (avoids z-fighting) {
float xOffset = Math.abs(facing.getFrontOffsetX() * 0.01f); // Offset the face by a slight amount so that it is drawn over the already drawn ring texture
float yOffset = Math.abs(facing.getFrontOffsetY() * 0.01f); // (avoids z-fighting)
float zOffset = Math.abs(facing.getFrontOffsetZ() * 0.01f); float xOffset = Math.abs( facing.getFrontOffsetX() * 0.01f );
float yOffset = Math.abs( facing.getFrontOffsetY() * 0.01f );
float zOffset = Math.abs( facing.getFrontOffsetZ() * 0.01f );
builder.setDrawFaces(EnumSet.of(facing)); builder.setDrawFaces( EnumSet.of( facing ) );
builder.addCube( builder.addCube(
-xOffset, -yOffset, -zOffset, -xOffset, -yOffset, -zOffset,
16 + xOffset, 16 + yOffset, 16 + zOffset); 16 + xOffset, 16 + yOffset, 16 + zOffset );
} }
} }
} }
} }
return builder.getOutput(); return builder.getOutput();
} }
private void renderCableAt(CubeBuilder builder, float thickness, TextureAtlasSprite texture, float pull, Set<EnumFacing> connections) { private void renderCableAt( CubeBuilder builder, float thickness, TextureAtlasSprite texture, float pull, Set<EnumFacing> connections )
builder.setTexture(texture); {
builder.setTexture( texture );
if (connections.contains(EnumFacing.WEST)) { if( connections.contains( EnumFacing.WEST ) )
builder.addCube(0, 8 - thickness, 8 - thickness, 8 - thickness - pull, 8 + thickness, 8 + thickness); {
} builder.addCube( 0, 8 - thickness, 8 - thickness, 8 - thickness - pull, 8 + thickness, 8 + thickness );
}
if (connections.contains(EnumFacing.EAST)) { if( connections.contains( EnumFacing.EAST ) )
builder.addCube(8 + thickness + pull, 8 - thickness, 8 - thickness, 16, 8 + thickness, 8 + thickness); {
} builder.addCube( 8 + thickness + pull, 8 - thickness, 8 - thickness, 16, 8 + thickness, 8 + thickness );
}
if (connections.contains(EnumFacing.NORTH)) { if( connections.contains( EnumFacing.NORTH ) )
builder.addCube(8 - thickness, 8 - thickness, 0, 8 + thickness, 8 + thickness, 8 - thickness - pull); {
} builder.addCube( 8 - thickness, 8 - thickness, 0, 8 + thickness, 8 + thickness, 8 - thickness - pull );
}
if (connections.contains(EnumFacing.SOUTH)) { if( connections.contains( EnumFacing.SOUTH ) )
builder.addCube(8 - thickness, 8 - thickness, 8 + thickness + pull, 8 + thickness, 8 + thickness, 16); {
} builder.addCube( 8 - thickness, 8 - thickness, 8 + thickness + pull, 8 + thickness, 8 + thickness, 16 );
}
if (connections.contains(EnumFacing.DOWN)) { if( connections.contains( EnumFacing.DOWN ) )
builder.addCube(8 - thickness, 0, 8 - thickness, 8 + thickness, 8 - thickness - pull, 8 + thickness); {
} builder.addCube( 8 - thickness, 0, 8 - thickness, 8 + thickness, 8 - thickness - pull, 8 + thickness );
}
if (connections.contains(EnumFacing.UP)) { if( connections.contains( EnumFacing.UP ) )
builder.addCube(8 - thickness, 8 + thickness + pull, 8 - thickness, 8 + thickness, 16, 8 + thickness); {
} builder.addCube( 8 - thickness, 8 + thickness + pull, 8 - thickness, 8 + thickness, 16, 8 + thickness );
} }
}
@Override @Override
public boolean isAmbientOcclusion() { public boolean isAmbientOcclusion()
return this.baseModel.isAmbientOcclusion(); {
} return this.baseModel.isAmbientOcclusion();
}
@Override @Override
public boolean isGui3d() { public boolean isGui3d()
return true; {
} return true;
}
@Override @Override
public boolean isBuiltInRenderer() { public boolean isBuiltInRenderer()
return false; {
} return false;
}
@Override @Override
public TextureAtlasSprite getParticleTexture() { public TextureAtlasSprite getParticleTexture()
return this.baseModel.getParticleTexture(); {
} return this.baseModel.getParticleTexture();
}
@Override @Override
public ItemCameraTransforms getItemCameraTransforms() { public ItemCameraTransforms getItemCameraTransforms()
return this.baseModel.getItemCameraTransforms(); {
} return this.baseModel.getItemCameraTransforms();
}
@Override @Override
public ItemOverrideList getOverrides() { public ItemOverrideList getOverrides()
return this.baseModel.getOverrides(); {
} return this.baseModel.getOverrides();
}
public static List<ResourceLocation> getRequiredTextures() { public static List<ResourceLocation> getRequiredTextures()
return ImmutableList.of( {
TEXTURE_LINK, TEXTURE_RING, TEXTURE_CABLE_GLASS, TEXTURE_COVERED_CABLE, TEXTURE_RING_LIGHT, TEXTURE_RING_LIGHT_CORNER); return ImmutableList.of(
} TEXTURE_LINK, TEXTURE_RING, TEXTURE_CABLE_GLASS, TEXTURE_COVERED_CABLE, TEXTURE_RING_LIGHT, TEXTURE_RING_LIGHT_CORNER );
}
} }
@@ -1,8 +1,12 @@
package appeng.block.qnb; package appeng.block.qnb;
import appeng.core.AppEng; import java.util.Collection;
import java.util.function.Function;
import com.google.common.collect.ImmutableList; import com.google.common.collect.ImmutableList;
import net.minecraft.client.renderer.block.model.IBakedModel; import net.minecraft.client.renderer.block.model.IBakedModel;
import net.minecraft.client.renderer.texture.TextureAtlasSprite; import net.minecraft.client.renderer.texture.TextureAtlasSprite;
import net.minecraft.client.renderer.vertex.VertexFormat; import net.minecraft.client.renderer.vertex.VertexFormat;
@@ -12,41 +16,49 @@ import net.minecraftforge.client.model.ModelLoaderRegistry;
import net.minecraftforge.common.model.IModelState; import net.minecraftforge.common.model.IModelState;
import net.minecraftforge.common.model.TRSRTransformation; import net.minecraftforge.common.model.TRSRTransformation;
import java.util.Collection; import appeng.core.AppEng;
import java.util.function.Function;
public class QnbFormedModel implements IModel { public class QnbFormedModel implements IModel
{
private static final ResourceLocation MODEL_RING = new ResourceLocation(AppEng.MOD_ID, "block/qnb/ring"); private static final ResourceLocation MODEL_RING = new ResourceLocation( AppEng.MOD_ID, "block/qnb/ring" );
@Override @Override
public Collection<ResourceLocation> getDependencies() { public Collection<ResourceLocation> getDependencies()
return ImmutableList.of(MODEL_RING); {
} return ImmutableList.of( MODEL_RING );
}
@Override @Override
public Collection<ResourceLocation> getTextures() { public Collection<ResourceLocation> getTextures()
return QnbFormedBakedModel.getRequiredTextures(); {
} return QnbFormedBakedModel.getRequiredTextures();
}
@Override @Override
public IBakedModel bake(IModelState state, VertexFormat format, Function<ResourceLocation, TextureAtlasSprite> bakedTextureGetter) { public IBakedModel bake( IModelState state, VertexFormat format, Function<ResourceLocation, TextureAtlasSprite> bakedTextureGetter )
IBakedModel ringModel = this.getBaseModel(MODEL_RING, state, format, bakedTextureGetter); {
return new QnbFormedBakedModel(format, ringModel, bakedTextureGetter); IBakedModel ringModel = this.getBaseModel( MODEL_RING, state, format, bakedTextureGetter );
} return new QnbFormedBakedModel( format, ringModel, bakedTextureGetter );
}
@Override @Override
public IModelState getDefaultState() { public IModelState getDefaultState()
return TRSRTransformation.identity(); {
} return TRSRTransformation.identity();
}
private IBakedModel getBaseModel(ResourceLocation model, IModelState state, VertexFormat format, Function<ResourceLocation, TextureAtlasSprite> bakedTextureGetter) { private IBakedModel getBaseModel( ResourceLocation model, IModelState state, VertexFormat format, Function<ResourceLocation, TextureAtlasSprite> bakedTextureGetter )
// Load the base model {
try { // Load the base model
return ModelLoaderRegistry.getModel(model).bake(state, format, bakedTextureGetter); try
} catch (Exception e) { {
throw new RuntimeException(e); return ModelLoaderRegistry.getModel( model ).bake( state, format, bakedTextureGetter );
} }
} catch( Exception e )
{
throw new RuntimeException( e );
}
}
} }
@@ -1,35 +1,41 @@
package appeng.block.qnb; package appeng.block.qnb;
import net.minecraft.util.EnumFacing;
import java.util.Set; import java.util.Set;
import net.minecraft.util.EnumFacing;
public class QnbFormedState {
private final Set<EnumFacing> adjacentQuantumBridges; public class QnbFormedState
{
private final boolean corner; private final Set<EnumFacing> adjacentQuantumBridges;
private final boolean powered; private final boolean corner;
public QnbFormedState(Set<EnumFacing> adjacentQuantumBridges, boolean corner, boolean powered) { private final boolean powered;
this.adjacentQuantumBridges = adjacentQuantumBridges;
this.corner = corner;
this.powered = powered;
}
public Set<EnumFacing> getAdjacentQuantumBridges() { public QnbFormedState( Set<EnumFacing> adjacentQuantumBridges, boolean corner, boolean powered )
return this.adjacentQuantumBridges; {
} this.adjacentQuantumBridges = adjacentQuantumBridges;
this.corner = corner;
this.powered = powered;
}
public boolean isCorner() { public Set<EnumFacing> getAdjacentQuantumBridges()
return this.corner; {
} return this.adjacentQuantumBridges;
}
public boolean isPowered() { public boolean isCorner()
return this.powered; {
} return this.corner;
}
public boolean isPowered()
{
return this.powered;
}
} }
@@ -1,28 +1,34 @@
package appeng.block.qnb; package appeng.block.qnb;
import net.minecraftforge.common.property.IUnlistedProperty; import net.minecraftforge.common.property.IUnlistedProperty;
public class QnbFormedStateProperty implements IUnlistedProperty<QnbFormedState> { public class QnbFormedStateProperty implements IUnlistedProperty<QnbFormedState>
{
@Override @Override
public String getName() { public String getName()
return "qnb_formed"; {
} return "qnb_formed";
}
@Override @Override
public boolean isValid(QnbFormedState value) { public boolean isValid( QnbFormedState value )
return value != null; {
} return value != null;
}
@Override @Override
public Class<QnbFormedState> getType() { public Class<QnbFormedState> getType()
return QnbFormedState.class; {
} return QnbFormedState.class;
}
@Override @Override
public String valueToString(QnbFormedState value) { public String valueToString( QnbFormedState value )
return null; {
} return null;
}
} }
@@ -1,20 +1,24 @@
package appeng.block.qnb; package appeng.block.qnb;
import net.minecraftforge.fml.relauncher.Side;
import net.minecraftforge.fml.relauncher.SideOnly;
import appeng.bootstrap.BlockRenderingCustomizer; import appeng.bootstrap.BlockRenderingCustomizer;
import appeng.bootstrap.IBlockRendering; import appeng.bootstrap.IBlockRendering;
import appeng.bootstrap.IItemRendering; import appeng.bootstrap.IItemRendering;
import net.minecraftforge.fml.relauncher.Side;
import net.minecraftforge.fml.relauncher.SideOnly;
public class QuantumBridgeRendering extends BlockRenderingCustomizer { public class QuantumBridgeRendering extends BlockRenderingCustomizer
{
@Override @Override
@SideOnly(Side.CLIENT) @SideOnly( Side.CLIENT )
public void customize(IBlockRendering rendering, IItemRendering itemRendering) { public void customize( IBlockRendering rendering, IItemRendering itemRendering )
rendering.builtInModel("models/block/qnb/qnb_formed", new QnbFormedModel()); {
// Disable auto rotation rendering.builtInModel( "models/block/qnb/qnb_formed", new QnbFormedModel() );
rendering.modelCustomizer((location, model) -> model); // Disable auto rotation
} rendering.modelCustomizer( ( location, model ) -> model );
}
} }
@@ -19,8 +19,9 @@
package appeng.block.spatial; package appeng.block.spatial;
import appeng.block.AEBaseBlock; import java.util.Arrays;
import appeng.helpers.ICustomCollision; import java.util.List;
import net.minecraft.block.material.Material; import net.minecraft.block.material.Material;
import net.minecraft.block.state.IBlockState; import net.minecraft.block.state.IBlockState;
import net.minecraft.creativetab.CreativeTabs; import net.minecraft.creativetab.CreativeTabs;
@@ -35,49 +36,57 @@ import net.minecraft.world.World;
import net.minecraftforge.fml.relauncher.Side; import net.minecraftforge.fml.relauncher.Side;
import net.minecraftforge.fml.relauncher.SideOnly; import net.minecraftforge.fml.relauncher.SideOnly;
import java.util.Arrays; import appeng.block.AEBaseBlock;
import java.util.List; import appeng.helpers.ICustomCollision;
public class BlockMatrixFrame extends AEBaseBlock implements ICustomCollision { public class BlockMatrixFrame extends AEBaseBlock implements ICustomCollision
{
public BlockMatrixFrame() { public BlockMatrixFrame()
super(Material.ANVIL); {
this.setResistance(6000000.0F); super( Material.ANVIL );
this.setBlockUnbreakable(); this.setResistance( 6000000.0F );
this.setLightOpacity(0); this.setBlockUnbreakable();
this.setOpaque(false); this.setLightOpacity( 0 );
} this.setOpaque( false );
}
@Override @Override
@SideOnly(Side.CLIENT) @SideOnly( Side.CLIENT )
public void getSubBlocks(final CreativeTabs tabs, final NonNullList<ItemStack> itemStacks) { public void getSubBlocks( final CreativeTabs tabs, final NonNullList<ItemStack> itemStacks )
// do nothing {
} // do nothing
}
@Override @Override
public Iterable<AxisAlignedBB> getSelectedBoundingBoxesFromPool(final World w, final BlockPos pos, final Entity thePlayer, final boolean b) { public Iterable<AxisAlignedBB> getSelectedBoundingBoxesFromPool( final World w, final BlockPos pos, final Entity thePlayer, final boolean b )
return Arrays.asList(new AxisAlignedBB[]{});// AxisAlignedBB.getBoundingBox( 0.25, 0, 0.25, 0.75, 0.5, 0.75 ) {
// } ); return Arrays.asList( new AxisAlignedBB[] {} );// AxisAlignedBB.getBoundingBox( 0.25, 0, 0.25, 0.75, 0.5, 0.75 )
} // } );
}
@Override @Override
public void addCollidingBlockToList(final World w, final BlockPos pos, final AxisAlignedBB bb, final List<AxisAlignedBB> out, final Entity e) { public void addCollidingBlockToList( final World w, final BlockPos pos, final AxisAlignedBB bb, final List<AxisAlignedBB> out, final Entity e )
out.add(new AxisAlignedBB(0.0, 0.0, 0.0, 1.0, 1.0, 1.0)); {
} out.add( new AxisAlignedBB( 0.0, 0.0, 0.0, 1.0, 1.0, 1.0 ) );
}
@Override @Override
public boolean canPlaceBlockAt(final World worldIn, final BlockPos pos) { public boolean canPlaceBlockAt( final World worldIn, final BlockPos pos )
return false; {
} return false;
}
@Override @Override
public void onBlockExploded(final World world, final BlockPos pos, final Explosion explosion) { public void onBlockExploded( final World world, final BlockPos pos, final Explosion explosion )
// Don't explode. {
} // Don't explode.
}
@Override @Override
public boolean canEntityDestroy(final IBlockState state, final IBlockAccess world, final BlockPos pos, final Entity entity) { public boolean canEntityDestroy( final IBlockState state, final IBlockAccess world, final BlockPos pos, final Entity entity )
return false; {
} return false;
}
} }
@@ -19,11 +19,8 @@
package appeng.block.spatial; package appeng.block.spatial;
import appeng.api.util.AEPartLocation; import javax.annotation.Nullable;
import appeng.block.AEBaseTileBlock;
import appeng.core.sync.GuiBridge;
import appeng.tile.spatial.TileSpatialIOPort;
import appeng.util.Platform;
import net.minecraft.block.Block; import net.minecraft.block.Block;
import net.minecraft.block.material.Material; import net.minecraft.block.material.Material;
import net.minecraft.block.state.IBlockState; import net.minecraft.block.state.IBlockState;
@@ -34,36 +31,48 @@ import net.minecraft.util.EnumHand;
import net.minecraft.util.math.BlockPos; import net.minecraft.util.math.BlockPos;
import net.minecraft.world.World; import net.minecraft.world.World;
import javax.annotation.Nullable; import appeng.api.util.AEPartLocation;
import appeng.block.AEBaseTileBlock;
import appeng.core.sync.GuiBridge;
import appeng.tile.spatial.TileSpatialIOPort;
import appeng.util.Platform;
public class BlockSpatialIOPort extends AEBaseTileBlock { public class BlockSpatialIOPort extends AEBaseTileBlock
{
public BlockSpatialIOPort() { public BlockSpatialIOPort()
super(Material.IRON); {
} super( Material.IRON );
}
@Override @Override
public void neighborChanged(IBlockState state, World world, BlockPos pos, Block blockIn, BlockPos fromPos) { public void neighborChanged( IBlockState state, World world, BlockPos pos, Block blockIn, BlockPos fromPos )
final TileSpatialIOPort te = this.getTileEntity(world, pos); {
if (te != null) { final TileSpatialIOPort te = this.getTileEntity( world, pos );
te.updateRedstoneState(); if( te != null )
} {
} te.updateRedstoneState();
}
}
@Override @Override
public boolean onActivated(final World w, final BlockPos pos, final EntityPlayer p, final EnumHand hand, final @Nullable ItemStack heldItem, final EnumFacing side, final float hitX, final float hitY, final float hitZ) { public boolean onActivated( final World w, final BlockPos pos, final EntityPlayer p, final EnumHand hand, final @Nullable ItemStack heldItem, final EnumFacing side, final float hitX, final float hitY, final float hitZ )
if (p.isSneaking()) { {
return false; if( p.isSneaking() )
} {
return false;
}
final TileSpatialIOPort tg = this.getTileEntity(w, pos); final TileSpatialIOPort tg = this.getTileEntity( w, pos );
if (tg != null) { if( tg != null )
if (Platform.isServer()) { {
Platform.openGUI(p, tg, AEPartLocation.fromFacing(side), GuiBridge.GUI_SPATIAL_IO_PORT); if( Platform.isServer() )
} {
return true; Platform.openGUI( p, tg, AEPartLocation.fromFacing( side ), GuiBridge.GUI_SPATIAL_IO_PORT );
} }
return false; return true;
} }
return false;
}
} }
@@ -19,10 +19,6 @@
package appeng.block.spatial; package appeng.block.spatial;
import appeng.block.AEBaseTileBlock;
import appeng.client.render.spatial.SpatialPylonStateProperty;
import appeng.helpers.AEGlassMaterial;
import appeng.tile.spatial.TileSpatialPylon;
import net.minecraft.block.Block; import net.minecraft.block.Block;
import net.minecraft.block.state.BlockStateContainer; import net.minecraft.block.state.BlockStateContainer;
import net.minecraft.block.state.IBlockState; import net.minecraft.block.state.IBlockState;
@@ -34,57 +30,73 @@ import net.minecraftforge.common.property.ExtendedBlockState;
import net.minecraftforge.common.property.IExtendedBlockState; import net.minecraftforge.common.property.IExtendedBlockState;
import net.minecraftforge.common.property.IUnlistedProperty; import net.minecraftforge.common.property.IUnlistedProperty;
import appeng.block.AEBaseTileBlock;
import appeng.client.render.spatial.SpatialPylonStateProperty;
import appeng.helpers.AEGlassMaterial;
import appeng.tile.spatial.TileSpatialPylon;
public class BlockSpatialPylon extends AEBaseTileBlock {
public static final SpatialPylonStateProperty STATE = new SpatialPylonStateProperty(); public class BlockSpatialPylon extends AEBaseTileBlock
{
public BlockSpatialPylon() { public static final SpatialPylonStateProperty STATE = new SpatialPylonStateProperty();
super(AEGlassMaterial.INSTANCE);
}
@Override public BlockSpatialPylon()
protected BlockStateContainer createBlockState() { {
return new ExtendedBlockState(this, this.getAEStates(), new IUnlistedProperty[]{STATE}); super( AEGlassMaterial.INSTANCE );
} }
@Override @Override
public IBlockState getExtendedState(IBlockState state, IBlockAccess world, BlockPos pos) { protected BlockStateContainer createBlockState()
IExtendedBlockState extState = (IExtendedBlockState) state; {
return new ExtendedBlockState( this, this.getAEStates(), new IUnlistedProperty[] { STATE } );
}
return extState.withProperty(STATE, this.getDisplayState(world, pos)); @Override
} public IBlockState getExtendedState( IBlockState state, IBlockAccess world, BlockPos pos )
{
IExtendedBlockState extState = (IExtendedBlockState) state;
@Override return extState.withProperty( STATE, this.getDisplayState( world, pos ) );
public void neighborChanged(IBlockState state, World world, BlockPos pos, Block blockIn, BlockPos fromPos) { }
final TileSpatialPylon tsp = this.getTileEntity(world, pos);
if (tsp != null) {
tsp.neighborChanged();
}
}
@Override @Override
public int getLightValue(final IBlockState state, final IBlockAccess w, final BlockPos pos) { public void neighborChanged( IBlockState state, World world, BlockPos pos, Block blockIn, BlockPos fromPos )
final TileSpatialPylon tsp = this.getTileEntity(w, pos); {
if (tsp != null) { final TileSpatialPylon tsp = this.getTileEntity( world, pos );
return tsp.getLightValue(); if( tsp != null )
} {
return super.getLightValue(state, w, pos); tsp.neighborChanged();
} }
}
private int getDisplayState(IBlockAccess world, BlockPos pos) { @Override
TileSpatialPylon te = this.getTileEntity(world, pos); public int getLightValue( final IBlockState state, final IBlockAccess w, final BlockPos pos )
{
final TileSpatialPylon tsp = this.getTileEntity( w, pos );
if( tsp != null )
{
return tsp.getLightValue();
}
return super.getLightValue( state, w, pos );
}
if (te == null) { private int getDisplayState( IBlockAccess world, BlockPos pos )
return 0; {
} TileSpatialPylon te = this.getTileEntity( world, pos );
return te.getDisplayBits(); if( te == null )
} {
return 0;
}
@Override return te.getDisplayBits();
public BlockRenderLayer getBlockLayer() { }
return BlockRenderLayer.CUTOUT;
} @Override
public BlockRenderLayer getBlockLayer()
{
return BlockRenderLayer.CUTOUT;
}
} }
@@ -19,12 +19,8 @@
package appeng.block.storage; package appeng.block.storage;
import appeng.api.util.AEPartLocation; import javax.annotation.Nullable;
import appeng.block.AEBaseTileBlock;
import appeng.core.localization.PlayerMessages;
import appeng.core.sync.GuiBridge;
import appeng.tile.storage.TileChest;
import appeng.util.Platform;
import net.minecraft.block.material.Material; import net.minecraft.block.material.Material;
import net.minecraft.block.properties.IProperty; import net.minecraft.block.properties.IProperty;
import net.minecraft.block.properties.PropertyEnum; import net.minecraft.block.properties.PropertyEnum;
@@ -38,67 +34,87 @@ import net.minecraft.util.math.BlockPos;
import net.minecraft.world.IBlockAccess; import net.minecraft.world.IBlockAccess;
import net.minecraft.world.World; import net.minecraft.world.World;
import javax.annotation.Nullable; import appeng.api.util.AEPartLocation;
import appeng.block.AEBaseTileBlock;
import appeng.core.localization.PlayerMessages;
import appeng.core.sync.GuiBridge;
import appeng.tile.storage.TileChest;
import appeng.util.Platform;
public class BlockChest extends AEBaseTileBlock { public class BlockChest extends AEBaseTileBlock
{
private final static PropertyEnum<DriveSlotState> SLOT_STATE = PropertyEnum.create("slot_state", DriveSlotState.class); private final static PropertyEnum<DriveSlotState> SLOT_STATE = PropertyEnum.create( "slot_state", DriveSlotState.class );
public BlockChest() { public BlockChest()
super(Material.IRON); {
this.setDefaultState(this.getDefaultState().withProperty(SLOT_STATE, DriveSlotState.EMPTY)); super( Material.IRON );
} this.setDefaultState( this.getDefaultState().withProperty( SLOT_STATE, DriveSlotState.EMPTY ) );
}
@Override @Override
protected IProperty[] getAEStates() { protected IProperty[] getAEStates()
return new IProperty[]{SLOT_STATE}; {
} return new IProperty[] { SLOT_STATE };
}
@Override @Override
public BlockRenderLayer getBlockLayer() { public BlockRenderLayer getBlockLayer()
return BlockRenderLayer.CUTOUT; {
} return BlockRenderLayer.CUTOUT;
}
@Override @Override
public IBlockState getActualState(IBlockState state, IBlockAccess worldIn, BlockPos pos) { public IBlockState getActualState( IBlockState state, IBlockAccess worldIn, BlockPos pos )
DriveSlotState slotState = DriveSlotState.EMPTY; {
DriveSlotState slotState = DriveSlotState.EMPTY;
TileChest te = this.getTileEntity(worldIn, pos); TileChest te = this.getTileEntity( worldIn, pos );
if (te != null) { if( te != null )
if (te.getCellCount() >= 1) { {
slotState = DriveSlotState.fromCellStatus(te.getCellStatus(0)); if( te.getCellCount() >= 1 )
} {
// Power-state has to be checked separately slotState = DriveSlotState.fromCellStatus( te.getCellStatus( 0 ) );
if (!te.isPowered() && slotState != DriveSlotState.EMPTY) { }
slotState = DriveSlotState.OFFLINE; // Power-state has to be checked separately
} if( !te.isPowered() && slotState != DriveSlotState.EMPTY )
} {
slotState = DriveSlotState.OFFLINE;
}
}
return super.getActualState(state, worldIn, pos) return super.getActualState( state, worldIn, pos )
.withProperty(SLOT_STATE, slotState); .withProperty( SLOT_STATE, slotState );
} }
@Override @Override
public boolean onActivated(final World w, final BlockPos pos, final EntityPlayer p, final EnumHand hand, final @Nullable ItemStack heldItem, final EnumFacing side, final float hitX, final float hitY, final float hitZ) { public boolean onActivated( final World w, final BlockPos pos, final EntityPlayer p, final EnumHand hand, final @Nullable ItemStack heldItem, final EnumFacing side, final float hitX, final float hitY, final float hitZ )
final TileChest tg = this.getTileEntity(w, pos); {
if (tg != null && !p.isSneaking()) { final TileChest tg = this.getTileEntity( w, pos );
if (Platform.isClient()) { if( tg != null && !p.isSneaking() )
return true; {
} if( Platform.isClient() )
{
return true;
}
if (side != tg.getUp()) { if( side != tg.getUp() )
Platform.openGUI(p, tg, AEPartLocation.fromFacing(side), GuiBridge.GUI_CHEST); {
} else { Platform.openGUI( p, tg, AEPartLocation.fromFacing( side ), GuiBridge.GUI_CHEST );
if (!tg.openGui(p)) { }
p.sendMessage(PlayerMessages.ChestCannotReadStorageCell.get()); else
} {
} if( !tg.openGui( p ) )
{
p.sendMessage( PlayerMessages.ChestCannotReadStorageCell.get() );
}
}
return true; return true;
} }
return false; return false;
} }
} }
@@ -19,12 +19,8 @@
package appeng.block.storage; package appeng.block.storage;
import appeng.api.util.AEPartLocation; import javax.annotation.Nullable;
import appeng.block.AEBaseTileBlock;
import appeng.client.UnlistedProperty;
import appeng.core.sync.GuiBridge;
import appeng.tile.storage.TileDrive;
import appeng.util.Platform;
import net.minecraft.block.material.Material; import net.minecraft.block.material.Material;
import net.minecraft.block.state.BlockStateContainer; import net.minecraft.block.state.BlockStateContainer;
import net.minecraft.block.state.IBlockState; import net.minecraft.block.state.IBlockState;
@@ -40,51 +36,65 @@ import net.minecraftforge.common.property.ExtendedBlockState;
import net.minecraftforge.common.property.IExtendedBlockState; import net.minecraftforge.common.property.IExtendedBlockState;
import net.minecraftforge.common.property.IUnlistedProperty; import net.minecraftforge.common.property.IUnlistedProperty;
import javax.annotation.Nullable; import appeng.api.util.AEPartLocation;
import appeng.block.AEBaseTileBlock;
import appeng.client.UnlistedProperty;
import appeng.core.sync.GuiBridge;
import appeng.tile.storage.TileDrive;
import appeng.util.Platform;
public class BlockDrive extends AEBaseTileBlock { public class BlockDrive extends AEBaseTileBlock
{
public static final UnlistedProperty<DriveSlotsState> SLOTS_STATE = new UnlistedProperty<>("drive_slots_state", DriveSlotsState.class); public static final UnlistedProperty<DriveSlotsState> SLOTS_STATE = new UnlistedProperty<>( "drive_slots_state", DriveSlotsState.class );
public BlockDrive() { public BlockDrive()
super(Material.IRON); {
} super( Material.IRON );
}
@Override @Override
public BlockRenderLayer getBlockLayer() { public BlockRenderLayer getBlockLayer()
return BlockRenderLayer.CUTOUT; {
} return BlockRenderLayer.CUTOUT;
}
@Override @Override
protected BlockStateContainer createBlockState() { protected BlockStateContainer createBlockState()
return new ExtendedBlockState(this, this.getAEStates(), new IUnlistedProperty[]{ {
SLOTS_STATE, return new ExtendedBlockState( this, this.getAEStates(), new IUnlistedProperty[] {
FORWARD, SLOTS_STATE,
UP FORWARD,
}); UP
} } );
}
@Override @Override
public IBlockState getExtendedState(IBlockState state, IBlockAccess world, BlockPos pos) { public IBlockState getExtendedState( IBlockState state, IBlockAccess world, BlockPos pos )
TileDrive te = this.getTileEntity(world, pos); {
IExtendedBlockState extState = (IExtendedBlockState) super.getExtendedState(state, world, pos); TileDrive te = this.getTileEntity( world, pos );
return extState.withProperty(SLOTS_STATE, te == null ? DriveSlotsState.createEmpty(10) : DriveSlotsState.fromChestOrDrive(te)); IExtendedBlockState extState = (IExtendedBlockState) super.getExtendedState( state, world, pos );
} return extState.withProperty( SLOTS_STATE, te == null ? DriveSlotsState.createEmpty( 10 ) : DriveSlotsState.fromChestOrDrive( te ) );
}
@Override @Override
public boolean onActivated(final World w, final BlockPos pos, final EntityPlayer p, final EnumHand hand, final @Nullable ItemStack heldItem, final EnumFacing side, final float hitX, final float hitY, final float hitZ) { public boolean onActivated( final World w, final BlockPos pos, final EntityPlayer p, final EnumHand hand, final @Nullable ItemStack heldItem, final EnumFacing side, final float hitX, final float hitY, final float hitZ )
if (p.isSneaking()) { {
return false; if( p.isSneaking() )
} {
return false;
}
final TileDrive tg = this.getTileEntity(w, pos); final TileDrive tg = this.getTileEntity( w, pos );
if (tg != null) { if( tg != null )
if (Platform.isServer()) { {
Platform.openGUI(p, tg, AEPartLocation.fromFacing(side), GuiBridge.GUI_DRIVE); if( Platform.isServer() )
} {
return true; Platform.openGUI( p, tg, AEPartLocation.fromFacing( side ), GuiBridge.GUI_DRIVE );
} }
return false; return true;
} }
return false;
}
} }
@@ -19,11 +19,8 @@
package appeng.block.storage; package appeng.block.storage;
import appeng.api.util.AEPartLocation; import javax.annotation.Nullable;
import appeng.block.AEBaseTileBlock;
import appeng.core.sync.GuiBridge;
import appeng.tile.storage.TileIOPort;
import appeng.util.Platform;
import net.minecraft.block.Block; import net.minecraft.block.Block;
import net.minecraft.block.material.Material; import net.minecraft.block.material.Material;
import net.minecraft.block.state.IBlockState; import net.minecraft.block.state.IBlockState;
@@ -34,36 +31,48 @@ import net.minecraft.util.EnumHand;
import net.minecraft.util.math.BlockPos; import net.minecraft.util.math.BlockPos;
import net.minecraft.world.World; import net.minecraft.world.World;
import javax.annotation.Nullable; import appeng.api.util.AEPartLocation;
import appeng.block.AEBaseTileBlock;
import appeng.core.sync.GuiBridge;
import appeng.tile.storage.TileIOPort;
import appeng.util.Platform;
public class BlockIOPort extends AEBaseTileBlock { public class BlockIOPort extends AEBaseTileBlock
{
public BlockIOPort() { public BlockIOPort()
super(Material.IRON); {
} super( Material.IRON );
}
@Override @Override
public void neighborChanged(IBlockState state, World world, BlockPos pos, Block blockIn, BlockPos fromPos) { public void neighborChanged( IBlockState state, World world, BlockPos pos, Block blockIn, BlockPos fromPos )
final TileIOPort te = this.getTileEntity(world, pos); {
if (te != null) { final TileIOPort te = this.getTileEntity( world, pos );
te.updateRedstoneState(); if( te != null )
} {
} te.updateRedstoneState();
}
}
@Override @Override
public boolean onActivated(final World w, final BlockPos pos, final EntityPlayer p, final EnumHand hand, final @Nullable ItemStack heldItem, final EnumFacing side, final float hitX, final float hitY, final float hitZ) { public boolean onActivated( final World w, final BlockPos pos, final EntityPlayer p, final EnumHand hand, final @Nullable ItemStack heldItem, final EnumFacing side, final float hitX, final float hitY, final float hitZ )
if (p.isSneaking()) { {
return false; if( p.isSneaking() )
} {
return false;
}
final TileIOPort tg = this.getTileEntity(w, pos); final TileIOPort tg = this.getTileEntity( w, pos );
if (tg != null) { if( tg != null )
if (Platform.isServer()) { {
Platform.openGUI(p, tg, AEPartLocation.fromFacing(side), GuiBridge.GUI_IOPORT); if( Platform.isServer() )
} {
return true; Platform.openGUI( p, tg, AEPartLocation.fromFacing( side ), GuiBridge.GUI_IOPORT );
} }
return false; return true;
} }
return false;
}
} }
@@ -19,12 +19,11 @@
package appeng.block.storage; package appeng.block.storage;
import appeng.api.util.AEPartLocation; import java.util.Collections;
import appeng.block.AEBaseTileBlock; import java.util.List;
import appeng.core.sync.GuiBridge;
import appeng.helpers.ICustomCollision; import javax.annotation.Nullable;
import appeng.tile.storage.TileSkyChest;
import appeng.util.Platform;
import net.minecraft.block.material.Material; import net.minecraft.block.material.Material;
import net.minecraft.block.state.IBlockState; import net.minecraft.block.state.IBlockState;
import net.minecraft.entity.Entity; import net.minecraft.entity.Entity;
@@ -37,81 +36,94 @@ import net.minecraft.util.math.AxisAlignedBB;
import net.minecraft.util.math.BlockPos; import net.minecraft.util.math.BlockPos;
import net.minecraft.world.World; import net.minecraft.world.World;
import javax.annotation.Nullable; import appeng.api.util.AEPartLocation;
import java.util.Collections; import appeng.block.AEBaseTileBlock;
import java.util.List; import appeng.core.sync.GuiBridge;
import appeng.helpers.ICustomCollision;
import appeng.tile.storage.TileSkyChest;
import appeng.util.Platform;
public class BlockSkyChest extends AEBaseTileBlock implements ICustomCollision { public class BlockSkyChest extends AEBaseTileBlock implements ICustomCollision
{
private static final double AABB_OFFSET_BOTTOM = 0.00; private static final double AABB_OFFSET_BOTTOM = 0.00;
private static final double AABB_OFFSET_SIDES = 0.06; private static final double AABB_OFFSET_SIDES = 0.06;
private static final double AABB_OFFSET_TOP = 0.125; private static final double AABB_OFFSET_TOP = 0.125;
public enum SkyChestType { public enum SkyChestType
STONE, BLOCK {
} STONE, BLOCK
};
public final SkyChestType type; public final SkyChestType type;
public BlockSkyChest(final SkyChestType type) { public BlockSkyChest( final SkyChestType type )
super(Material.ROCK); {
this.setOpaque(this.setFullSize(false)); super( Material.ROCK );
this.lightOpacity = 0; this.setOpaque( this.setFullSize( false ) );
this.setHardness(50); this.lightOpacity = 0;
this.blockResistance = 150.0f; this.setHardness( 50 );
this.type = type; this.blockResistance = 150.0f;
} this.type = type;
}
@Override @Override
public EnumBlockRenderType getRenderType(IBlockState state) { public EnumBlockRenderType getRenderType( IBlockState state )
return EnumBlockRenderType.ENTITYBLOCK_ANIMATED; {
} return EnumBlockRenderType.ENTITYBLOCK_ANIMATED;
}
@Override @Override
public boolean onActivated(final World w, final BlockPos pos, final EntityPlayer player, final EnumHand hand, final @Nullable ItemStack heldItem, final EnumFacing side, final float hitX, final float hitY, final float hitZ) { public boolean onActivated( final World w, final BlockPos pos, final EntityPlayer player, final EnumHand hand, final @Nullable ItemStack heldItem, final EnumFacing side, final float hitX, final float hitY, final float hitZ )
if (Platform.isServer()) { {
Platform.openGUI(player, this.getTileEntity(w, pos), AEPartLocation.fromFacing(side), GuiBridge.GUI_SKYCHEST); if( Platform.isServer() )
} {
Platform.openGUI( player, this.getTileEntity( w, pos ), AEPartLocation.fromFacing( side ), GuiBridge.GUI_SKYCHEST );
}
return true; return true;
} }
@Override @Override
public Iterable<AxisAlignedBB> getSelectedBoundingBoxesFromPool(final World w, final BlockPos pos, final Entity thePlayer, final boolean b) { public Iterable<AxisAlignedBB> getSelectedBoundingBoxesFromPool( final World w, final BlockPos pos, final Entity thePlayer, final boolean b )
final AxisAlignedBB aabb = this.computeAABB(w, pos); {
final AxisAlignedBB aabb = this.computeAABB( w, pos );
return Collections.singletonList(aabb); return Collections.singletonList( aabb );
} }
@Override @Override
public void addCollidingBlockToList(final World w, final BlockPos pos, final AxisAlignedBB bb, final List<AxisAlignedBB> out, final Entity e) { public void addCollidingBlockToList( final World w, final BlockPos pos, final AxisAlignedBB bb, final List<AxisAlignedBB> out, final Entity e )
final AxisAlignedBB aabb = this.computeAABB(w, pos); {
final AxisAlignedBB aabb = this.computeAABB( w, pos );
out.add(aabb); out.add( aabb );
} }
private AxisAlignedBB computeAABB(final World w, final BlockPos pos) { private AxisAlignedBB computeAABB( final World w, final BlockPos pos )
final TileSkyChest sk = this.getTileEntity(w, pos); {
EnumFacing o = EnumFacing.UP; final TileSkyChest sk = this.getTileEntity( w, pos );
EnumFacing o = EnumFacing.UP;
if (sk != null) { if( sk != null )
o = sk.getUp(); {
} o = sk.getUp();
}
final double offsetX = o.getFrontOffsetX() == 0 ? AABB_OFFSET_SIDES : 0.0; final double offsetX = o.getFrontOffsetX() == 0 ? AABB_OFFSET_SIDES : 0.0;
final double offsetY = o.getFrontOffsetY() == 0 ? AABB_OFFSET_SIDES : 0.0; final double offsetY = o.getFrontOffsetY() == 0 ? AABB_OFFSET_SIDES : 0.0;
final double offsetZ = o.getFrontOffsetZ() == 0 ? AABB_OFFSET_SIDES : 0.0; final double offsetZ = o.getFrontOffsetZ() == 0 ? AABB_OFFSET_SIDES : 0.0;
// for x/z top and bottom is swapped // for x/z top and bottom is swapped
final double minX = Math.max(0.0, offsetX + (o.getFrontOffsetX() < 0 ? AABB_OFFSET_BOTTOM : (o.getFrontOffsetX() * AABB_OFFSET_TOP))); final double minX = Math.max( 0.0, offsetX + ( o.getFrontOffsetX() < 0 ? AABB_OFFSET_BOTTOM : ( o.getFrontOffsetX() * AABB_OFFSET_TOP ) ) );
final double minY = Math.max(0.0, offsetY + (o.getFrontOffsetY() < 0 ? AABB_OFFSET_TOP : (o.getFrontOffsetY() * AABB_OFFSET_BOTTOM))); final double minY = Math.max( 0.0, offsetY + ( o.getFrontOffsetY() < 0 ? AABB_OFFSET_TOP : ( o.getFrontOffsetY() * AABB_OFFSET_BOTTOM ) ) );
final double minZ = Math.max(0.0, offsetZ + (o.getFrontOffsetZ() < 0 ? AABB_OFFSET_BOTTOM : (o.getFrontOffsetZ() * AABB_OFFSET_TOP))); final double minZ = Math.max( 0.0, offsetZ + ( o.getFrontOffsetZ() < 0 ? AABB_OFFSET_BOTTOM : ( o.getFrontOffsetZ() * AABB_OFFSET_TOP ) ) );
final double maxX = Math.min(1.0, 1.0 - offsetX - (o.getFrontOffsetX() < 0 ? AABB_OFFSET_TOP : (o.getFrontOffsetX() * AABB_OFFSET_BOTTOM))); final double maxX = Math.min( 1.0, 1.0 - offsetX - ( o.getFrontOffsetX() < 0 ? AABB_OFFSET_TOP : ( o.getFrontOffsetX() * AABB_OFFSET_BOTTOM ) ) );
final double maxY = Math.min(1.0, 1.0 - offsetY - (o.getFrontOffsetY() < 0 ? AABB_OFFSET_BOTTOM : (o.getFrontOffsetY() * AABB_OFFSET_TOP))); final double maxY = Math.min( 1.0, 1.0 - offsetY - ( o.getFrontOffsetY() < 0 ? AABB_OFFSET_BOTTOM : ( o.getFrontOffsetY() * AABB_OFFSET_TOP ) ) );
final double maxZ = Math.min(1.0, 1.0 - offsetZ - (o.getFrontOffsetZ() < 0 ? AABB_OFFSET_TOP : (o.getFrontOffsetZ() * AABB_OFFSET_BOTTOM))); final double maxZ = Math.min( 1.0, 1.0 - offsetZ - ( o.getFrontOffsetZ() < 0 ? AABB_OFFSET_TOP : ( o.getFrontOffsetZ() * AABB_OFFSET_BOTTOM ) ) );
return new AxisAlignedBB(minX, minY, minZ, maxX, maxY, maxZ); return new AxisAlignedBB( minX, minY, minZ, maxX, maxY, maxZ );
} }
} }
@@ -19,24 +19,27 @@
package appeng.block.storage; package appeng.block.storage;
import net.minecraftforge.fml.relauncher.Side;
import net.minecraftforge.fml.relauncher.SideOnly;
import appeng.api.util.AEColor; import appeng.api.util.AEColor;
import appeng.bootstrap.BlockRenderingCustomizer; import appeng.bootstrap.BlockRenderingCustomizer;
import appeng.bootstrap.IBlockRendering; import appeng.bootstrap.IBlockRendering;
import appeng.bootstrap.IItemRendering; import appeng.bootstrap.IItemRendering;
import appeng.client.render.ColorableTileBlockColor; import appeng.client.render.ColorableTileBlockColor;
import appeng.client.render.StaticItemColor; import appeng.client.render.StaticItemColor;
import net.minecraftforge.fml.relauncher.Side;
import net.minecraftforge.fml.relauncher.SideOnly;
public class ChestRendering extends BlockRenderingCustomizer { public class ChestRendering extends BlockRenderingCustomizer
{
@Override @Override
@SideOnly(Side.CLIENT) @SideOnly( Side.CLIENT )
public void customize(IBlockRendering rendering, IItemRendering itemRendering) { public void customize( IBlockRendering rendering, IItemRendering itemRendering )
// I checked, the ME chest doesn't keep its color in item form {
itemRendering.color(new StaticItemColor(AEColor.TRANSPARENT)); // I checked, the ME chest doesn't keep its color in item form
rendering.blockColor(new ColorableTileBlockColor()); itemRendering.color( new StaticItemColor( AEColor.TRANSPARENT ) );
} rendering.blockColor( new ColorableTileBlockColor() );
}
} }
@@ -25,9 +25,11 @@ import appeng.bootstrap.IItemRendering;
import appeng.client.render.model.DriveModel; import appeng.client.render.model.DriveModel;
public class DriveRendering extends BlockRenderingCustomizer { public class DriveRendering extends BlockRenderingCustomizer
@Override {
public void customize(IBlockRendering rendering, IItemRendering itemRendering) { @Override
rendering.builtInModel("models/block/builtin/drive", new DriveModel()); public void customize( IBlockRendering rendering, IItemRendering itemRendering )
} {
rendering.builtInModel( "models/block/builtin/drive", new DriveModel() );
}
} }
@@ -25,46 +25,51 @@ import net.minecraft.util.IStringSerializable;
/** /**
* Describes the different states a single slot of a BlockDrive can be in in terms of rendering. * Describes the different states a single slot of a BlockDrive can be in in terms of rendering.
*/ */
public enum DriveSlotState implements IStringSerializable { public enum DriveSlotState implements IStringSerializable
{
// No cell in slot // No cell in slot
EMPTY("empty"), EMPTY( "empty" ),
// Cell in slot, but unpowered // Cell in slot, but unpowered
OFFLINE("offline"), OFFLINE( "offline" ),
// Online and free space // Online and free space
ONLINE("online"), ONLINE( "online" ),
// Types full, space left // Types full, space left
TYPES_FULL("types_full"), TYPES_FULL( "types_full" ),
// Completely full // Completely full
FULL("full"); FULL( "full" );
private final String name; private final String name;
DriveSlotState(String name) { DriveSlotState( String name )
this.name = name; {
} this.name = name;
}
@Override @Override
public String getName() { public String getName()
return this.name; {
} return this.name;
}
public static DriveSlotState fromCellStatus(int cellStatus) { public static DriveSlotState fromCellStatus( int cellStatus )
switch (cellStatus) { {
default: switch( cellStatus )
case 0: {
return DriveSlotState.EMPTY; default:
case 1: case 0:
return DriveSlotState.ONLINE; return DriveSlotState.EMPTY;
case 2: case 1:
return DriveSlotState.TYPES_FULL; return DriveSlotState.ONLINE;
case 3: case 2:
return DriveSlotState.FULL; return DriveSlotState.TYPES_FULL;
} case 3:
} return DriveSlotState.FULL;
}
}
} }
@@ -25,49 +25,64 @@ import appeng.api.implementations.tiles.IChestOrDrive;
/** /**
* Contains the full information about what the state of the slots in a BlockDrive is. * Contains the full information about what the state of the slots in a BlockDrive is.
*/ */
public class DriveSlotsState { public class DriveSlotsState
{
private final DriveSlotState[] slots; private final DriveSlotState[] slots;
private DriveSlotsState(DriveSlotState[] slots) { private DriveSlotsState( DriveSlotState[] slots )
this.slots = slots; {
} this.slots = slots;
}
public DriveSlotState getState(int index) { public DriveSlotState getState( int index )
if (index >= this.slots.length) { {
return DriveSlotState.EMPTY; if( index >= this.slots.length )
} {
return this.slots[index]; return DriveSlotState.EMPTY;
} }
return this.slots[index];
}
public int getSlotCount() { public int getSlotCount()
return this.slots.length; {
} return this.slots.length;
}
/** /**
* Retrieve an array that describes the state of each slot in this drive or chest. * Retrieve an array that describes the state of each slot in this drive or chest.
*/ */
public static DriveSlotsState fromChestOrDrive(IChestOrDrive chestOrDrive) { public static DriveSlotsState fromChestOrDrive( IChestOrDrive chestOrDrive )
DriveSlotState[] slots = new DriveSlotState[chestOrDrive.getCellCount()]; {
for (int i = 0; i < chestOrDrive.getCellCount(); i++) { DriveSlotState[] slots = new DriveSlotState[chestOrDrive.getCellCount()];
if (!chestOrDrive.isPowered()) { for( int i = 0; i < chestOrDrive.getCellCount(); i++ )
if (chestOrDrive.getCellStatus(i) != 0) { {
slots[i] = DriveSlotState.OFFLINE; if( !chestOrDrive.isPowered() )
} else { {
slots[i] = DriveSlotState.EMPTY; if( chestOrDrive.getCellStatus( i ) != 0 )
} {
} else { slots[i] = DriveSlotState.OFFLINE;
slots[i] = DriveSlotState.fromCellStatus(chestOrDrive.getCellStatus(i)); }
} else
} {
return new DriveSlotsState(slots); slots[i] = DriveSlotState.EMPTY;
} }
}
else
{
slots[i] = DriveSlotState.fromCellStatus( chestOrDrive.getCellStatus( i ) );
}
}
return new DriveSlotsState( slots );
}
public static DriveSlotsState createEmpty(int slotCount) { public static DriveSlotsState createEmpty( int slotCount )
DriveSlotState[] slots = new DriveSlotState[slotCount]; {
for (int i = 0; i < slotCount; i++) { DriveSlotState[] slots = new DriveSlotState[slotCount];
slots[i] = DriveSlotState.EMPTY; for( int i = 0; i < slotCount; i++ )
} {
return new DriveSlotsState(slots); slots[i] = DriveSlotState.EMPTY;
} }
return new DriveSlotsState( slots );
}
} }
@@ -19,45 +19,51 @@
package appeng.block.storage; package appeng.block.storage;
import appeng.bootstrap.BlockRenderingCustomizer;
import appeng.bootstrap.IBlockRendering;
import appeng.bootstrap.IItemRendering;
import appeng.client.render.tesr.SkyChestTESR;
import net.minecraft.client.renderer.block.model.ModelResourceLocation; import net.minecraft.client.renderer.block.model.ModelResourceLocation;
import net.minecraftforge.fml.relauncher.Side; import net.minecraftforge.fml.relauncher.Side;
import net.minecraftforge.fml.relauncher.SideOnly; import net.minecraftforge.fml.relauncher.SideOnly;
import appeng.bootstrap.BlockRenderingCustomizer;
import appeng.bootstrap.IBlockRendering;
import appeng.bootstrap.IItemRendering;
import appeng.client.render.tesr.SkyChestTESR;
public class SkyChestRenderingCustomizer extends BlockRenderingCustomizer {
private final BlockSkyChest.SkyChestType type; public class SkyChestRenderingCustomizer extends BlockRenderingCustomizer
{
public SkyChestRenderingCustomizer(BlockSkyChest.SkyChestType type) { private final BlockSkyChest.SkyChestType type;
this.type = type;
}
@SideOnly(Side.CLIENT) public SkyChestRenderingCustomizer( BlockSkyChest.SkyChestType type )
@Override {
public void customize(IBlockRendering rendering, IItemRendering itemRendering) { this.type = type;
rendering.tesr(new SkyChestTESR()); }
// Register a custom non-tesr item model @SideOnly( Side.CLIENT )
String modelName = this.getModelFromType(); @Override
ModelResourceLocation model = new ModelResourceLocation("appliedenergistics2:" + modelName, "inventory"); public void customize( IBlockRendering rendering, IItemRendering itemRendering )
itemRendering.model(model).variants(model); {
} rendering.tesr( new SkyChestTESR() );
private String getModelFromType() { // Register a custom non-tesr item model
final String modelName; String modelName = this.getModelFromType();
switch (this.type) { ModelResourceLocation model = new ModelResourceLocation( "appliedenergistics2:" + modelName, "inventory" );
default: itemRendering.model( model ).variants( model );
case STONE: }
modelName = "sky_stone_chest";
break; private String getModelFromType()
case BLOCK: {
modelName = "smooth_sky_stone_chest"; final String modelName;
break; switch( this.type )
} {
return modelName; default:
} case STONE:
modelName = "sky_stone_chest";
break;
case BLOCK:
modelName = "smooth_sky_stone_chest";
break;
}
return modelName;
}
} }
@@ -19,6 +19,25 @@
package appeng.bootstrap; package appeng.bootstrap;
import java.util.ArrayList;
import java.util.Collections;
import java.util.EnumSet;
import java.util.List;
import java.util.function.BiFunction;
import java.util.function.Function;
import java.util.function.Supplier;
import javax.annotation.Nullable;
import net.minecraft.block.Block;
import net.minecraft.client.renderer.block.model.ModelResourceLocation;
import net.minecraft.creativetab.CreativeTabs;
import net.minecraft.item.Item;
import net.minecraft.item.ItemBlock;
import net.minecraft.util.ResourceLocation;
import net.minecraftforge.fml.relauncher.Side;
import net.minecraftforge.fml.relauncher.SideOnly;
import appeng.api.definitions.IBlockDefinition; import appeng.api.definitions.IBlockDefinition;
import appeng.block.AEBaseBlock; import appeng.block.AEBaseBlock;
import appeng.block.AEBaseItemBlock; import appeng.block.AEBaseItemBlock;
@@ -30,209 +49,233 @@ import appeng.bootstrap.definitions.TileEntityDefinition;
import appeng.core.AEConfig; import appeng.core.AEConfig;
import appeng.core.AppEng; import appeng.core.AppEng;
import appeng.core.CreativeTab; import appeng.core.CreativeTab;
import appeng.core.features.*; import appeng.core.features.AEFeature;
import appeng.core.features.ActivityState;
import appeng.core.features.BlockDefinition;
import appeng.core.features.BlockStackSrc;
import appeng.core.features.TileDefinition;
import appeng.tile.AEBaseTile; import appeng.tile.AEBaseTile;
import appeng.util.Platform; import appeng.util.Platform;
import net.minecraft.block.Block;
import net.minecraft.client.renderer.block.model.ModelResourceLocation;
import net.minecraft.creativetab.CreativeTabs;
import net.minecraft.item.Item;
import net.minecraft.item.ItemBlock;
import net.minecraft.util.ResourceLocation;
import net.minecraftforge.fml.relauncher.Side;
import net.minecraftforge.fml.relauncher.SideOnly;
import javax.annotation.Nullable;
import java.util.ArrayList;
import java.util.Collections;
import java.util.EnumSet;
import java.util.List;
import java.util.function.BiFunction;
import java.util.function.Function;
import java.util.function.Supplier;
class BlockDefinitionBuilder implements IBlockBuilder { class BlockDefinitionBuilder implements IBlockBuilder
{
private final FeatureFactory factory; private final FeatureFactory factory;
private final String registryName; private final String registryName;
private final Supplier<? extends Block> blockSupplier; private final Supplier<? extends Block> blockSupplier;
private final List<BiFunction<Block, Item, IBootstrapComponent>> bootstrapComponents = new ArrayList<>(); private final List<BiFunction<Block, Item, IBootstrapComponent>> bootstrapComponents = new ArrayList<>();
private final EnumSet<AEFeature> features = EnumSet.noneOf(AEFeature.class); private final EnumSet<AEFeature> features = EnumSet.noneOf( AEFeature.class );
private final CreativeTabs creativeTab = CreativeTab.instance; private CreativeTabs creativeTab = CreativeTab.instance;
private TileEntityDefinition tileEntityDefinition; private TileEntityDefinition tileEntityDefinition;
private boolean disableItem = false; private boolean disableItem = false;
private Function<Block, ItemBlock> itemFactory; private Function<Block, ItemBlock> itemFactory;
@SideOnly(Side.CLIENT) @SideOnly( Side.CLIENT )
private BlockRendering blockRendering; private BlockRendering blockRendering;
@SideOnly(Side.CLIENT) @SideOnly( Side.CLIENT )
private ItemRendering itemRendering; private ItemRendering itemRendering;
BlockDefinitionBuilder(FeatureFactory factory, String id, Supplier<? extends Block> blockSupplier) { BlockDefinitionBuilder( FeatureFactory factory, String id, Supplier<? extends Block> blockSupplier )
this.factory = factory; {
this.registryName = id; this.factory = factory;
this.blockSupplier = blockSupplier; this.registryName = id;
this.blockSupplier = blockSupplier;
if (Platform.isClient()) { if( Platform.isClient() )
this.blockRendering = new BlockRendering(); {
this.itemRendering = new ItemRendering(); this.blockRendering = new BlockRendering();
} this.itemRendering = new ItemRendering();
} }
}
@Override @Override
public BlockDefinitionBuilder bootstrap(BiFunction<Block, Item, IBootstrapComponent> callback) { public BlockDefinitionBuilder bootstrap( BiFunction<Block, Item, IBootstrapComponent> callback )
this.bootstrapComponents.add(callback); {
return this; this.bootstrapComponents.add( callback );
} return this;
}
@Override @Override
public IBlockBuilder features(AEFeature... features) { public IBlockBuilder features( AEFeature... features )
this.features.clear(); {
this.addFeatures(features); this.features.clear();
return this; this.addFeatures( features );
} return this;
}
@Override @Override
public IBlockBuilder addFeatures(AEFeature... features) { public IBlockBuilder addFeatures( AEFeature... features )
Collections.addAll(this.features, features); {
return this; Collections.addAll( this.features, features );
} return this;
}
@Override @Override
public BlockDefinitionBuilder rendering(BlockRenderingCustomizer callback) { public BlockDefinitionBuilder rendering( BlockRenderingCustomizer callback )
if (Platform.isClient()) { {
this.customizeForClient(callback); if( Platform.isClient() )
} {
this.customizeForClient( callback );
}
return this; return this;
} }
@Override @Override
public IBlockBuilder tileEntity(TileEntityDefinition tileEntityDefinition) { public IBlockBuilder tileEntity( TileEntityDefinition tileEntityDefinition )
this.tileEntityDefinition = tileEntityDefinition; {
return this; this.tileEntityDefinition = tileEntityDefinition;
} return this;
}
@Override @Override
public IBlockBuilder useCustomItemModel() { public IBlockBuilder useCustomItemModel()
this.rendering(new BlockRenderingCustomizer() { {
@Override this.rendering( new BlockRenderingCustomizer()
@SideOnly(Side.CLIENT) {
public void customize(IBlockRendering rendering, IItemRendering itemRendering) { @Override
ModelResourceLocation model = new ModelResourceLocation(new ResourceLocation(AppEng.MOD_ID, BlockDefinitionBuilder.this.registryName), "inventory"); @SideOnly( Side.CLIENT )
itemRendering.model(model).variants(model); public void customize( IBlockRendering rendering, IItemRendering itemRendering )
} {
}); ModelResourceLocation model = new ModelResourceLocation( new ResourceLocation( AppEng.MOD_ID, BlockDefinitionBuilder.this.registryName ), "inventory" );
itemRendering.model( model ).variants( model );
}
} );
return this; return this;
} }
@Override @Override
public IBlockBuilder item(Function<Block, ItemBlock> factory) { public IBlockBuilder item( Function<Block, ItemBlock> factory )
this.itemFactory = factory; {
return this; this.itemFactory = factory;
} return this;
}
@Override @Override
public IBlockBuilder disableItem() { public IBlockBuilder disableItem()
this.disableItem = true; {
return this; this.disableItem = true;
} return this;
}
@SideOnly(Side.CLIENT) @SideOnly( Side.CLIENT )
private void customizeForClient(BlockRenderingCustomizer callback) { private void customizeForClient( BlockRenderingCustomizer callback )
callback.customize(this.blockRendering, this.itemRendering); {
} callback.customize( this.blockRendering, this.itemRendering );
}
@SuppressWarnings("unchecked") @SuppressWarnings( "unchecked" )
@Override @Override
public <T extends IBlockDefinition> T build() { public <T extends IBlockDefinition> T build()
if (!AEConfig.instance().areFeaturesEnabled(this.features)) { {
return (T) new TileDefinition(this.registryName, null, null); if( !AEConfig.instance().areFeaturesEnabled( this.features ) )
} {
return (T) new TileDefinition( this.registryName, null, null );
}
// Create block and matching item, and set factory name of both // Create block and matching item, and set factory name of both
Block block = this.blockSupplier.get(); Block block = this.blockSupplier.get();
block.setRegistryName(AppEng.MOD_ID, this.registryName); block.setRegistryName( AppEng.MOD_ID, this.registryName );
block.setUnlocalizedName("appliedenergistics2." + this.registryName); block.setUnlocalizedName( "appliedenergistics2." + this.registryName );
ItemBlock item = this.constructItemFromBlock(block); ItemBlock item = this.constructItemFromBlock( block );
if (item != null) { if( item != null )
item.setRegistryName(AppEng.MOD_ID, this.registryName); {
} item.setRegistryName( AppEng.MOD_ID, this.registryName );
}
// Register the item and block with the game // Register the item and block with the game
this.factory.addBootstrapComponent((IBlockRegistrationComponent) (side, registry) -> registry.register(block)); this.factory.addBootstrapComponent( (IBlockRegistrationComponent) ( side, registry ) -> registry.register( block ) );
if (item != null) { if( item != null )
this.factory.addBootstrapComponent((IItemRegistrationComponent) (side, registry) -> registry.register(item)); {
} this.factory.addBootstrapComponent( (IItemRegistrationComponent) ( side, registry ) -> registry.register( item ) );
}
block.setCreativeTab(this.creativeTab); block.setCreativeTab( this.creativeTab );
// Register all extra handlers // Register all extra handlers
this.bootstrapComponents.forEach(component -> this.factory.addBootstrapComponent(component.apply(block, item))); this.bootstrapComponents.forEach( component -> this.factory.addBootstrapComponent( component.apply( block, item ) ) );
if (this.tileEntityDefinition != null && block instanceof AEBaseTileBlock) { if( this.tileEntityDefinition != null && block instanceof AEBaseTileBlock )
((AEBaseTileBlock) block).setTileEntity(this.tileEntityDefinition.getTileEntityClass()); {
if (this.tileEntityDefinition.getName() == null) { ( (AEBaseTileBlock) block ).setTileEntity( this.tileEntityDefinition.getTileEntityClass() );
this.tileEntityDefinition.setName(this.registryName); if( this.tileEntityDefinition.getName() == null )
} {
this.tileEntityDefinition.setName( this.registryName );
}
} }
if (Platform.isClient()) { if( Platform.isClient() )
if (block instanceof AEBaseTileBlock) { {
AEBaseTileBlock tileBlock = (AEBaseTileBlock) block; if( block instanceof AEBaseTileBlock )
this.blockRendering.apply(this.factory, block, tileBlock.getTileEntityClass()); {
} else { AEBaseTileBlock tileBlock = (AEBaseTileBlock) block;
this.blockRendering.apply(this.factory, block, null); this.blockRendering.apply( this.factory, block, tileBlock.getTileEntityClass() );
} }
else
{
this.blockRendering.apply( this.factory, block, null );
}
if (item != null) { if( item != null )
this.itemRendering.apply(this.factory, item); {
} this.itemRendering.apply( this.factory, item );
} }
}
if (block instanceof AEBaseTileBlock) { if( block instanceof AEBaseTileBlock )
this.factory.addBootstrapComponent((IPreInitComponent) side -> {
{ this.factory.addBootstrapComponent( (IPreInitComponent) side ->
AEBaseTile.registerTileItem( {
this.tileEntityDefinition == null ? ((AEBaseTileBlock) block).getTileEntityClass() : this.tileEntityDefinition.getTileEntityClass(), AEBaseTile.registerTileItem(
new BlockStackSrc(block, 0, ActivityState.Enabled)); this.tileEntityDefinition == null ? ( (AEBaseTileBlock) block ).getTileEntityClass() : this.tileEntityDefinition.getTileEntityClass(),
}); new BlockStackSrc( block, 0, ActivityState.Enabled ) );
} );
if (this.tileEntityDefinition != null) { if( this.tileEntityDefinition != null )
this.factory.tileEntityComponent.addTileEntity(this.tileEntityDefinition); {
} this.factory.tileEntityComponent.addTileEntity( this.tileEntityDefinition );
}
return (T) new TileDefinition(this.registryName, (AEBaseTileBlock) block, item); return (T) new TileDefinition( this.registryName, (AEBaseTileBlock) block, item );
} else { }
return (T) new BlockDefinition(this.registryName, block, item); else
} {
} return (T) new BlockDefinition( this.registryName, block, item );
}
}
@Nullable @Nullable
private ItemBlock constructItemFromBlock(Block block) { private ItemBlock constructItemFromBlock( Block block )
if (this.disableItem) { {
return null; if( this.disableItem )
} {
return null;
}
if (this.itemFactory != null) { if( this.itemFactory != null )
return this.itemFactory.apply(block); {
} else if (block instanceof AEBaseBlock) { return this.itemFactory.apply( block );
return new AEBaseItemBlock(block); }
} else { else if( block instanceof AEBaseBlock )
return new ItemBlock(block); {
} return new AEBaseItemBlock( block );
} }
else
{
return new ItemBlock( block );
}
}
} }
@@ -19,11 +19,10 @@
package appeng.bootstrap; package appeng.bootstrap;
import appeng.block.AEBaseTileBlock; import java.util.HashMap;
import appeng.bootstrap.components.BlockColorComponent; import java.util.Map;
import appeng.bootstrap.components.StateMapperComponent; import java.util.function.BiFunction;
import appeng.bootstrap.components.TesrComponent;
import appeng.client.render.model.AutoRotatingModel;
import net.minecraft.block.Block; import net.minecraft.block.Block;
import net.minecraft.client.renderer.block.model.IBakedModel; import net.minecraft.client.renderer.block.model.IBakedModel;
import net.minecraft.client.renderer.block.model.ModelResourceLocation; import net.minecraft.client.renderer.block.model.ModelResourceLocation;
@@ -34,87 +33,103 @@ import net.minecraftforge.client.model.IModel;
import net.minecraftforge.fml.relauncher.Side; import net.minecraftforge.fml.relauncher.Side;
import net.minecraftforge.fml.relauncher.SideOnly; import net.minecraftforge.fml.relauncher.SideOnly;
import java.util.HashMap; import appeng.block.AEBaseTileBlock;
import java.util.Map; import appeng.bootstrap.components.BlockColorComponent;
import java.util.function.BiFunction; import appeng.bootstrap.components.StateMapperComponent;
import appeng.bootstrap.components.TesrComponent;
import appeng.client.render.model.AutoRotatingModel;
class BlockRendering implements IBlockRendering { class BlockRendering implements IBlockRendering
{
@SideOnly(Side.CLIENT) @SideOnly( Side.CLIENT )
private BiFunction<ModelResourceLocation, IBakedModel, IBakedModel> modelCustomizer; private BiFunction<ModelResourceLocation, IBakedModel, IBakedModel> modelCustomizer;
@SideOnly(Side.CLIENT) @SideOnly( Side.CLIENT )
private IBlockColor blockColor; private IBlockColor blockColor;
@SideOnly(Side.CLIENT) @SideOnly( Side.CLIENT )
private TileEntitySpecialRenderer<?> tesr; private TileEntitySpecialRenderer<?> tesr;
@SideOnly(Side.CLIENT) @SideOnly( Side.CLIENT )
private IStateMapper stateMapper; private IStateMapper stateMapper;
@SideOnly(Side.CLIENT) @SideOnly( Side.CLIENT )
private final Map<String, IModel> builtInModels = new HashMap<>(); private Map<String, IModel> builtInModels = new HashMap<>();
@Override @Override
@SideOnly(Side.CLIENT) @SideOnly( Side.CLIENT )
public IBlockRendering modelCustomizer(BiFunction<ModelResourceLocation, IBakedModel, IBakedModel> customizer) { public IBlockRendering modelCustomizer( BiFunction<ModelResourceLocation, IBakedModel, IBakedModel> customizer )
this.modelCustomizer = customizer; {
return this; this.modelCustomizer = customizer;
} return this;
}
@SideOnly(Side.CLIENT) @SideOnly( Side.CLIENT )
@Override @Override
public IBlockRendering blockColor(IBlockColor blockColor) { public IBlockRendering blockColor( IBlockColor blockColor )
this.blockColor = blockColor; {
return this; this.blockColor = blockColor;
} return this;
}
@SideOnly(Side.CLIENT) @SideOnly( Side.CLIENT )
@Override @Override
public IBlockRendering tesr(TileEntitySpecialRenderer<?> tesr) { public IBlockRendering tesr( TileEntitySpecialRenderer<?> tesr )
this.tesr = tesr; {
return this; this.tesr = tesr;
} return this;
}
@Override @Override
public IBlockRendering builtInModel(String name, IModel model) { public IBlockRendering builtInModel( String name, IModel model )
this.builtInModels.put(name, model); {
return this; this.builtInModels.put( name, model );
} return this;
}
@SideOnly(Side.CLIENT) @SideOnly( Side.CLIENT )
@Override @Override
public IBlockRendering stateMapper(IStateMapper mapper) { public IBlockRendering stateMapper( IStateMapper mapper )
this.stateMapper = mapper; {
return this; this.stateMapper = mapper;
} return this;
}
void apply(FeatureFactory factory, Block block, Class<?> tileEntityClass) { void apply( FeatureFactory factory, Block block, Class<?> tileEntityClass )
if (this.tesr != null) { {
if (tileEntityClass == null) { if( this.tesr != null )
throw new IllegalStateException("Tried to register a TESR for " + block + " even though no tile entity has been specified."); {
} if( tileEntityClass == null )
factory.addBootstrapComponent(new TesrComponent(tileEntityClass, this.tesr)); {
} throw new IllegalStateException( "Tried to register a TESR for " + block + " even though no tile entity has been specified." );
}
factory.addBootstrapComponent( new TesrComponent( tileEntityClass, this.tesr ) );
}
if (this.modelCustomizer != null) { if( this.modelCustomizer != null )
factory.addModelOverride(block.getRegistryName().getResourcePath(), this.modelCustomizer); {
} else if (block instanceof AEBaseTileBlock) { factory.addModelOverride( block.getRegistryName().getResourcePath(), this.modelCustomizer );
// This is a default rotating model if the base-block uses an AE tile entity which exposes UP/FRONT as }
// extended props else if( block instanceof AEBaseTileBlock )
factory.addModelOverride(block.getRegistryName().getResourcePath(), (l, m) -> new AutoRotatingModel(m)); {
} // This is a default rotating model if the base-block uses an AE tile entity which exposes UP/FRONT as
// extended props
factory.addModelOverride( block.getRegistryName().getResourcePath(), ( l, m ) -> new AutoRotatingModel( m ) );
}
// TODO : 1.12 // TODO : 1.12
this.builtInModels.forEach(factory::addBuiltInModel); this.builtInModels.forEach( factory::addBuiltInModel );
if (this.blockColor != null) { if( this.blockColor != null )
factory.addBootstrapComponent(new BlockColorComponent(block, this.blockColor)); {
} factory.addBootstrapComponent( new BlockColorComponent( block, this.blockColor ) );
}
if (this.stateMapper != null) { if( this.stateMapper != null )
factory.addBootstrapComponent(new StateMapperComponent(block, this.stateMapper)); {
} factory.addBootstrapComponent( new StateMapperComponent( block, this.stateMapper ) );
} }
}
} }
@@ -28,9 +28,10 @@ import net.minecraftforge.fml.relauncher.SideOnly;
* used * used
* due to them not being able to be annotated with @SideOnly(CLIENT). * due to them not being able to be annotated with @SideOnly(CLIENT).
*/ */
public abstract class BlockRenderingCustomizer { public abstract class BlockRenderingCustomizer
{
@SideOnly(Side.CLIENT) @SideOnly( Side.CLIENT )
public abstract void customize(IBlockRendering rendering, IItemRendering itemRendering); public abstract void customize( IBlockRendering rendering, IItemRendering itemRendering );
} }
@@ -19,6 +19,24 @@
package appeng.bootstrap; package appeng.bootstrap;
import java.util.ArrayList;
import java.util.Arrays;
import java.util.Collections;
import java.util.HashMap;
import java.util.Iterator;
import java.util.List;
import java.util.Map;
import java.util.function.BiFunction;
import java.util.function.Supplier;
import net.minecraft.block.Block;
import net.minecraft.client.renderer.block.model.IBakedModel;
import net.minecraft.client.renderer.block.model.ModelResourceLocation;
import net.minecraft.item.Item;
import net.minecraftforge.client.model.IModel;
import net.minecraftforge.fml.relauncher.Side;
import net.minecraftforge.fml.relauncher.SideOnly;
import appeng.api.definitions.IItemDefinition; import appeng.api.definitions.IItemDefinition;
import appeng.api.util.AEColor; import appeng.api.util.AEColor;
import appeng.api.util.AEColoredItemDefinition; import appeng.api.util.AEColoredItemDefinition;
@@ -30,107 +48,111 @@ import appeng.core.features.ActivityState;
import appeng.core.features.ColoredItemDefinition; import appeng.core.features.ColoredItemDefinition;
import appeng.core.features.ItemStackSrc; import appeng.core.features.ItemStackSrc;
import appeng.util.Platform; import appeng.util.Platform;
import net.minecraft.block.Block;
import net.minecraft.client.renderer.block.model.IBakedModel;
import net.minecraft.client.renderer.block.model.ModelResourceLocation;
import net.minecraft.item.Item;
import net.minecraftforge.client.model.IModel;
import net.minecraftforge.fml.relauncher.Side;
import net.minecraftforge.fml.relauncher.SideOnly;
import java.util.*;
import java.util.function.BiFunction;
import java.util.function.Supplier;
public class FeatureFactory { public class FeatureFactory
{
private final AEFeature[] defaultFeatures; private final AEFeature[] defaultFeatures;
private final Map<Class<? extends IBootstrapComponent>, List<IBootstrapComponent>> bootstrapComponents; private final Map<Class<? extends IBootstrapComponent>, List<IBootstrapComponent>> bootstrapComponents;
@SideOnly(Side.CLIENT) @SideOnly( Side.CLIENT )
private ModelOverrideComponent modelOverrideComponent; private ModelOverrideComponent modelOverrideComponent;
@SideOnly(Side.CLIENT) @SideOnly( Side.CLIENT )
private BuiltInModelComponent builtInModelComponent; private BuiltInModelComponent builtInModelComponent;
public final TileEntityComponent tileEntityComponent; public final TileEntityComponent tileEntityComponent;
public FeatureFactory() { public FeatureFactory()
this.defaultFeatures = new AEFeature[]{AEFeature.CORE}; {
this.bootstrapComponents = new HashMap<>(); this.defaultFeatures = new AEFeature[] { AEFeature.CORE };
this.bootstrapComponents = new HashMap<>();
this.tileEntityComponent = new TileEntityComponent(); this.tileEntityComponent = new TileEntityComponent();
this.addBootstrapComponent(this.tileEntityComponent); this.addBootstrapComponent( this.tileEntityComponent );
if (Platform.isClient()) { if( Platform.isClient() )
this.modelOverrideComponent = new ModelOverrideComponent(); {
this.addBootstrapComponent(this.modelOverrideComponent); this.modelOverrideComponent = new ModelOverrideComponent();
this.addBootstrapComponent( this.modelOverrideComponent );
this.builtInModelComponent = new BuiltInModelComponent(); this.builtInModelComponent = new BuiltInModelComponent();
this.addBootstrapComponent(this.builtInModelComponent); this.addBootstrapComponent( this.builtInModelComponent );
} }
} }
private FeatureFactory(FeatureFactory parent, AEFeature... defaultFeatures) { private FeatureFactory( FeatureFactory parent, AEFeature... defaultFeatures )
this.defaultFeatures = defaultFeatures.clone(); {
this.bootstrapComponents = parent.bootstrapComponents; this.defaultFeatures = defaultFeatures.clone();
this.tileEntityComponent = parent.tileEntityComponent; this.bootstrapComponents = parent.bootstrapComponents;
if (Platform.isClient()) { this.tileEntityComponent = parent.tileEntityComponent;
this.modelOverrideComponent = parent.modelOverrideComponent; if( Platform.isClient() )
this.builtInModelComponent = parent.builtInModelComponent; {
} this.modelOverrideComponent = parent.modelOverrideComponent;
} this.builtInModelComponent = parent.builtInModelComponent;
}
}
public IBlockBuilder block(String id, Supplier<Block> block) { public IBlockBuilder block( String id, Supplier<Block> block )
return new BlockDefinitionBuilder(this, id, block).features(this.defaultFeatures); {
} return new BlockDefinitionBuilder( this, id, block ).features( this.defaultFeatures );
}
public IItemBuilder item(String id, Supplier<Item> item) { public IItemBuilder item( String id, Supplier<Item> item )
return new ItemDefinitionBuilder(this, id, item).features(this.defaultFeatures); {
} return new ItemDefinitionBuilder( this, id, item ).features( this.defaultFeatures );
}
public AEColoredItemDefinition colored(IItemDefinition target, int offset) { public AEColoredItemDefinition colored( IItemDefinition target, int offset )
ColoredItemDefinition definition = new ColoredItemDefinition(); {
ColoredItemDefinition definition = new ColoredItemDefinition();
target.maybeItem().ifPresent(targetItem -> target.maybeItem().ifPresent( targetItem ->
{ {
for (final AEColor color : AEColor.VALID_COLORS) { for( final AEColor color : AEColor.VALID_COLORS )
final ActivityState state = ActivityState.from(target.isEnabled()); {
final ActivityState state = ActivityState.from( target.isEnabled() );
definition.add(color, new ItemStackSrc(targetItem, offset + color.ordinal(), state)); definition.add( color, new ItemStackSrc( targetItem, offset + color.ordinal(), state ) );
} }
}); } );
return definition; return definition;
} }
public FeatureFactory features(AEFeature... features) { public FeatureFactory features( AEFeature... features )
return new FeatureFactory(this, features); {
} return new FeatureFactory( this, features );
}
public void addBootstrapComponent(IBootstrapComponent component) { public void addBootstrapComponent( IBootstrapComponent component )
Arrays.stream(component.getClass().getInterfaces()) {
.filter(i -> IBootstrapComponent.class.isAssignableFrom(i)) Arrays.stream( component.getClass().getInterfaces() )
.forEach(i -> this.addBootstrapComponent((Class<? extends IBootstrapComponent>) i, component)); .filter( i -> IBootstrapComponent.class.isAssignableFrom( i ) )
} .forEach( i -> this.addBootstrapComponent( (Class<? extends IBootstrapComponent>) i, component ) );
}
private <T extends IBootstrapComponent> void addBootstrapComponent(Class<? extends IBootstrapComponent> eventType, T component) { private <T extends IBootstrapComponent> void addBootstrapComponent( Class<? extends IBootstrapComponent> eventType, T component )
this.bootstrapComponents.computeIfAbsent(eventType, c -> new ArrayList<IBootstrapComponent>()).add(component); {
} this.bootstrapComponents.computeIfAbsent( eventType, c -> new ArrayList<IBootstrapComponent>() ).add( component );
}
@SideOnly(Side.CLIENT) @SideOnly( Side.CLIENT )
void addBuiltInModel(String path, IModel model) { void addBuiltInModel( String path, IModel model )
this.builtInModelComponent.addModel(path, model); {
} this.builtInModelComponent.addModel( path, model );
}
@SideOnly(Side.CLIENT) @SideOnly( Side.CLIENT )
void addModelOverride(String resourcePath, BiFunction<ModelResourceLocation, IBakedModel, IBakedModel> customizer) { void addModelOverride( String resourcePath, BiFunction<ModelResourceLocation, IBakedModel, IBakedModel> customizer )
this.modelOverrideComponent.addOverride(resourcePath, customizer); {
} this.modelOverrideComponent.addOverride( resourcePath, customizer );
}
public <T extends IBootstrapComponent> Iterator<T> getBootstrapComponents(Class<T> eventType) { public <T extends IBootstrapComponent> Iterator<T> getBootstrapComponents( Class<T> eventType )
return (Iterator<T>) this.bootstrapComponents.getOrDefault(eventType, Collections.emptyList()).iterator(); {
} return (Iterator<T>) this.bootstrapComponents.getOrDefault( eventType, Collections.emptyList() ).iterator();
}
} }
@@ -19,40 +19,42 @@
package appeng.bootstrap; package appeng.bootstrap;
import appeng.api.definitions.IBlockDefinition; import java.util.function.BiFunction;
import appeng.bootstrap.definitions.TileEntityDefinition; import java.util.function.Function;
import appeng.core.features.AEFeature;
import net.minecraft.block.Block; import net.minecraft.block.Block;
import net.minecraft.item.Item; import net.minecraft.item.Item;
import net.minecraft.item.ItemBlock; import net.minecraft.item.ItemBlock;
import java.util.function.BiFunction; import appeng.api.definitions.IBlockDefinition;
import java.util.function.Function; import appeng.bootstrap.definitions.TileEntityDefinition;
import appeng.core.features.AEFeature;
public interface IBlockBuilder { public interface IBlockBuilder
IBlockBuilder bootstrap(BiFunction<Block, Item, IBootstrapComponent> component); {
IBlockBuilder bootstrap( BiFunction<Block, Item, IBootstrapComponent> component );
IBlockBuilder features(AEFeature... features); IBlockBuilder features( AEFeature... features );
IBlockBuilder addFeatures(AEFeature... features); IBlockBuilder addFeatures( AEFeature... features );
IBlockBuilder rendering(BlockRenderingCustomizer callback); IBlockBuilder rendering( BlockRenderingCustomizer callback );
IBlockBuilder tileEntity(TileEntityDefinition tileEntityDefinition); IBlockBuilder tileEntity( TileEntityDefinition tileEntityDefinition );
/** /**
* Don't register an item for this block. * Don't register an item for this block.
*/ */
IBlockBuilder disableItem(); IBlockBuilder disableItem();
/** /**
* Forces this block's item to uses a custom model, instead of using the default block state as the item model. * Forces this block's item to uses a custom model, instead of using the default block state as the item model.
* The model has the same name as the registry name. * The model has the same name as the registry name.
*/ */
IBlockBuilder useCustomItemModel(); IBlockBuilder useCustomItemModel();
IBlockBuilder item(Function<Block, ItemBlock> factory); IBlockBuilder item( Function<Block, ItemBlock> factory );
<T extends IBlockDefinition> T build(); <T extends IBlockDefinition> T build();
} }
@@ -19,6 +19,8 @@
package appeng.bootstrap; package appeng.bootstrap;
import java.util.function.BiFunction;
import net.minecraft.client.renderer.block.model.IBakedModel; import net.minecraft.client.renderer.block.model.IBakedModel;
import net.minecraft.client.renderer.block.model.ModelResourceLocation; import net.minecraft.client.renderer.block.model.ModelResourceLocation;
import net.minecraft.client.renderer.block.statemap.IStateMapper; import net.minecraft.client.renderer.block.statemap.IStateMapper;
@@ -28,30 +30,29 @@ import net.minecraftforge.client.model.IModel;
import net.minecraftforge.fml.relauncher.Side; import net.minecraftforge.fml.relauncher.Side;
import net.minecraftforge.fml.relauncher.SideOnly; import net.minecraftforge.fml.relauncher.SideOnly;
import java.util.function.BiFunction;
/** /**
* Allows for client-side rendering to be customized in the context of block/item registration. * Allows for client-side rendering to be customized in the context of block/item registration.
*/ */
public interface IBlockRendering { public interface IBlockRendering
{
@SideOnly(Side.CLIENT) @SideOnly( Side.CLIENT )
IBlockRendering modelCustomizer(BiFunction<ModelResourceLocation, IBakedModel, IBakedModel> customizer); IBlockRendering modelCustomizer( BiFunction<ModelResourceLocation, IBakedModel, IBakedModel> customizer );
@SideOnly(Side.CLIENT) @SideOnly( Side.CLIENT )
IBlockRendering blockColor(IBlockColor blockColor); IBlockRendering blockColor( IBlockColor blockColor );
@SideOnly(Side.CLIENT) @SideOnly( Side.CLIENT )
IBlockRendering stateMapper(IStateMapper mapper); IBlockRendering stateMapper( IStateMapper mapper );
@SideOnly(Side.CLIENT) @SideOnly( Side.CLIENT )
IBlockRendering tesr(TileEntitySpecialRenderer<?> tesr); IBlockRendering tesr( TileEntitySpecialRenderer<?> tesr );
/** /**
* Registers a built-in model under the given resource path. * Registers a built-in model under the given resource path.
*/ */
@SideOnly(Side.CLIENT) @SideOnly( Side.CLIENT )
IBlockRendering builtInModel(String name, IModel model); IBlockRendering builtInModel( String name, IModel model );
} }
@@ -23,5 +23,6 @@ package appeng.bootstrap;
* Bootstrap components can be registered to take part in the various initialization phases of Forge. * Bootstrap components can be registered to take part in the various initialization phases of Forge.
* See the individual subclasses for a specific forge initalization event. * See the individual subclasses for a specific forge initalization event.
*/ */
public interface IBootstrapComponent { public interface IBootstrapComponent
{
} }
@@ -24,6 +24,7 @@ import net.minecraft.advancements.ICriterionTrigger;
@FunctionalInterface @FunctionalInterface
public interface ICriterionTriggerRegistry { public interface ICriterionTriggerRegistry
void register(ICriterionTrigger<? extends ICriterionInstance> trigger); {
void register( ICriterionTrigger<? extends ICriterionInstance> trigger );
} }
@@ -19,35 +19,37 @@
package appeng.bootstrap; package appeng.bootstrap;
import appeng.core.features.AEFeature; import java.util.function.Function;
import appeng.core.features.ItemDefinition; import java.util.function.Supplier;
import net.minecraft.creativetab.CreativeTabs; import net.minecraft.creativetab.CreativeTabs;
import net.minecraft.dispenser.IBehaviorDispenseItem; import net.minecraft.dispenser.IBehaviorDispenseItem;
import net.minecraft.item.Item; import net.minecraft.item.Item;
import java.util.function.Function; import appeng.core.features.AEFeature;
import java.util.function.Supplier; import appeng.core.features.ItemDefinition;
/** /**
* Allows an item to be defined and registered with the game. * Allows an item to be defined and registered with the game.
* The item is only registered once build is called. * The item is only registered once build is called.
*/ */
public interface IItemBuilder { public interface IItemBuilder
IItemBuilder bootstrap(Function<Item, IBootstrapComponent> component); {
IItemBuilder bootstrap( Function<Item, IBootstrapComponent> component );
IItemBuilder features(AEFeature... features); IItemBuilder features( AEFeature... features );
IItemBuilder addFeatures(AEFeature... features); IItemBuilder addFeatures( AEFeature... features );
IItemBuilder creativeTab(CreativeTabs tab); IItemBuilder creativeTab( CreativeTabs tab );
IItemBuilder rendering(ItemRenderingCustomizer callback); IItemBuilder rendering( ItemRenderingCustomizer callback );
/** /**
* Registers a custom dispenser behavior for this item. * Registers a custom dispenser behavior for this item.
*/ */
IItemBuilder dispenserBehavior(Supplier<IBehaviorDispenseItem> behavior); IItemBuilder dispenserBehavior( Supplier<IBehaviorDispenseItem> behavior );
ItemDefinition build(); ItemDefinition build();
} }
@@ -19,6 +19,9 @@
package appeng.bootstrap; package appeng.bootstrap;
import java.util.Arrays;
import java.util.Collection;
import net.minecraft.client.renderer.ItemMeshDefinition; import net.minecraft.client.renderer.ItemMeshDefinition;
import net.minecraft.client.renderer.block.model.ModelResourceLocation; import net.minecraft.client.renderer.block.model.ModelResourceLocation;
import net.minecraft.client.renderer.color.IItemColor; import net.minecraft.client.renderer.color.IItemColor;
@@ -27,66 +30,66 @@ import net.minecraftforge.client.model.IModel;
import net.minecraftforge.fml.relauncher.Side; import net.minecraftforge.fml.relauncher.Side;
import net.minecraftforge.fml.relauncher.SideOnly; import net.minecraftforge.fml.relauncher.SideOnly;
import java.util.Arrays;
import java.util.Collection;
/** /**
* Allows the rendering of an item to be customized. * Allows the rendering of an item to be customized.
*/ */
public interface IItemRendering { public interface IItemRendering
{
/** /**
* Registers a custom item mesh definition that will be used to dynamically determine the * Registers a custom item mesh definition that will be used to dynamically determine the
* item model to be used for rendering by inspecting the item stack (i.e. for NBT data). * item model to be used for rendering by inspecting the item stack (i.e. for NBT data).
* Please * Please
*/ */
@SideOnly(Side.CLIENT) @SideOnly( Side.CLIENT )
IItemRendering meshDefinition(ItemMeshDefinition meshDefinition); IItemRendering meshDefinition( ItemMeshDefinition meshDefinition );
/** /**
* Registers an item model for meta=0, see {@link #model(int, ModelResourceLocation)}. * Registers an item model for meta=0, see {@link #model(int, ModelResourceLocation)}.
*/ */
@SideOnly(Side.CLIENT) @SideOnly( Side.CLIENT )
default IItemRendering model(ModelResourceLocation model) { default IItemRendering model( ModelResourceLocation model )
return model(0, model); {
} return model( 0, model );
}
/** /**
* Registers an item model for a given meta. * Registers an item model for a given meta.
*/ */
@SideOnly(Side.CLIENT) @SideOnly( Side.CLIENT )
IItemRendering model(int meta, ModelResourceLocation model); IItemRendering model( int meta, ModelResourceLocation model );
/** /**
* Convenient override for {@link #variants(Collection)}. * Convenient override for {@link #variants(Collection)}.
*/ */
@SideOnly(Side.CLIENT) @SideOnly( Side.CLIENT )
default IItemRendering variants(ResourceLocation... resources) { default IItemRendering variants( ResourceLocation... resources )
return variants(Arrays.asList(resources)); {
} return variants( Arrays.asList( resources ) );
}
/** /**
* Registers the item variants of this item. This are all models that need to be loaded for this item. * Registers the item variants of this item. This are all models that need to be loaded for this item.
* This has no direct effect on rendering, but is used to load models that are used for example by * This has no direct effect on rendering, but is used to load models that are used for example by
* the ItemMeshDefinition. * the ItemMeshDefinition.
* <p> *
* Models registered via {@link #model(int, ModelResourceLocation)} are automatically added here. * Models registered via {@link #model(int, ModelResourceLocation)} are automatically added here.
*/ */
@SideOnly(Side.CLIENT) @SideOnly( Side.CLIENT )
IItemRendering variants(Collection<ResourceLocation> resources); IItemRendering variants( Collection<ResourceLocation> resources );
/** /**
* Registers a custom item color definition that inspects an item stack and tint and * Registers a custom item color definition that inspects an item stack and tint and
* returns a color multiplier. * returns a color multiplier.
*/ */
@SideOnly(Side.CLIENT) @SideOnly( Side.CLIENT )
IItemRendering color(IItemColor itemColor); IItemRendering color( IItemColor itemColor );
/** /**
* Registers a built-in model under the given resource path. * Registers a built-in model under the given resource path.
*/ */
@SideOnly(Side.CLIENT) @SideOnly( Side.CLIENT )
IItemRendering builtInModel(String name, IModel model); IItemRendering builtInModel( String name, IModel model );
} }
@@ -27,12 +27,13 @@ import net.minecraft.item.Item;
import net.minecraft.util.ResourceLocation; import net.minecraft.util.ResourceLocation;
public interface IModelRegistry { public interface IModelRegistry
void registerItemVariants(Item item, ResourceLocation... names); {
void registerItemVariants( Item item, ResourceLocation... names );
void setCustomModelResourceLocation(Item item, int metadata, ModelResourceLocation model); void setCustomModelResourceLocation( Item item, int metadata, ModelResourceLocation model );
void setCustomMeshDefinition(Item item, ItemMeshDefinition meshDefinition); void setCustomMeshDefinition( Item item, ItemMeshDefinition meshDefinition );
void setCustomStateMapper(Block block, IStateMapper mapper); void setCustomStateMapper( Block block, IStateMapper mapper );
} }
@@ -19,6 +19,20 @@
package appeng.bootstrap; package appeng.bootstrap;
import java.util.ArrayList;
import java.util.Collections;
import java.util.EnumSet;
import java.util.List;
import java.util.function.Function;
import java.util.function.Supplier;
import net.minecraft.block.BlockDispenser;
import net.minecraft.creativetab.CreativeTabs;
import net.minecraft.dispenser.IBehaviorDispenseItem;
import net.minecraft.item.Item;
import net.minecraftforge.fml.relauncher.Side;
import net.minecraftforge.fml.relauncher.SideOnly;
import appeng.bootstrap.components.IItemRegistrationComponent; import appeng.bootstrap.components.IItemRegistrationComponent;
import appeng.bootstrap.components.IPostInitComponent; import appeng.bootstrap.components.IPostInitComponent;
import appeng.core.AEConfig; import appeng.core.AEConfig;
@@ -27,127 +41,129 @@ import appeng.core.CreativeTab;
import appeng.core.features.AEFeature; import appeng.core.features.AEFeature;
import appeng.core.features.ItemDefinition; import appeng.core.features.ItemDefinition;
import appeng.util.Platform; import appeng.util.Platform;
import net.minecraft.block.BlockDispenser;
import net.minecraft.creativetab.CreativeTabs;
import net.minecraft.dispenser.IBehaviorDispenseItem;
import net.minecraft.item.Item;
import net.minecraftforge.fml.relauncher.Side;
import net.minecraftforge.fml.relauncher.SideOnly;
import java.util.ArrayList;
import java.util.Collections;
import java.util.EnumSet;
import java.util.List;
import java.util.function.Function;
import java.util.function.Supplier;
class ItemDefinitionBuilder implements IItemBuilder { class ItemDefinitionBuilder implements IItemBuilder
{
private final FeatureFactory factory; private final FeatureFactory factory;
private final String registryName; private final String registryName;
private final Supplier<Item> itemSupplier; private final Supplier<Item> itemSupplier;
private final EnumSet<AEFeature> features = EnumSet.noneOf(AEFeature.class); private final EnumSet<AEFeature> features = EnumSet.noneOf( AEFeature.class );
private final List<Function<Item, IBootstrapComponent>> boostrapComponents = new ArrayList<>(); private final List<Function<Item, IBootstrapComponent>> boostrapComponents = new ArrayList<>();
private Supplier<IBehaviorDispenseItem> dispenserBehaviorSupplier; private Supplier<IBehaviorDispenseItem> dispenserBehaviorSupplier;
@SideOnly(Side.CLIENT) @SideOnly( Side.CLIENT )
private ItemRendering itemRendering; private ItemRendering itemRendering;
private CreativeTabs creativeTab = CreativeTab.instance; private CreativeTabs creativeTab = CreativeTab.instance;
ItemDefinitionBuilder(FeatureFactory factory, String registryName, Supplier<Item> itemSupplier) { ItemDefinitionBuilder( FeatureFactory factory, String registryName, Supplier<Item> itemSupplier )
this.factory = factory; {
this.registryName = registryName; this.factory = factory;
this.itemSupplier = itemSupplier; this.registryName = registryName;
if (Platform.isClient()) { this.itemSupplier = itemSupplier;
this.itemRendering = new ItemRendering(); if( Platform.isClient() )
} {
} this.itemRendering = new ItemRendering();
}
}
@Override @Override
public IItemBuilder bootstrap(Function<Item, IBootstrapComponent> component) { public IItemBuilder bootstrap( Function<Item, IBootstrapComponent> component )
this.boostrapComponents.add(component); {
return this; this.boostrapComponents.add( component );
} return this;
}
@Override @Override
public IItemBuilder features(AEFeature... features) { public IItemBuilder features( AEFeature... features )
this.features.clear(); {
this.addFeatures(features); this.features.clear();
return this; this.addFeatures( features );
} return this;
}
@Override @Override
public IItemBuilder addFeatures(AEFeature... features) { public IItemBuilder addFeatures( AEFeature... features )
Collections.addAll(this.features, features); {
return this; Collections.addAll( this.features, features );
} return this;
}
@Override @Override
public IItemBuilder creativeTab(CreativeTabs tab) { public IItemBuilder creativeTab( CreativeTabs tab )
this.creativeTab = tab; {
return this; this.creativeTab = tab;
} return this;
}
@Override @Override
public IItemBuilder rendering(ItemRenderingCustomizer callback) { public IItemBuilder rendering( ItemRenderingCustomizer callback )
if (Platform.isClient()) { {
this.customizeForClient(callback); if( Platform.isClient() )
} {
this.customizeForClient( callback );
}
return this; return this;
} }
@Override @Override
public IItemBuilder dispenserBehavior(Supplier<IBehaviorDispenseItem> behavior) { public IItemBuilder dispenserBehavior( Supplier<IBehaviorDispenseItem> behavior )
this.dispenserBehaviorSupplier = behavior; {
return this; this.dispenserBehaviorSupplier = behavior;
} return this;
}
@SideOnly(Side.CLIENT) @SideOnly( Side.CLIENT )
private void customizeForClient(ItemRenderingCustomizer callback) { private void customizeForClient( ItemRenderingCustomizer callback )
callback.customize(this.itemRendering); {
} callback.customize( this.itemRendering );
}
@Override @Override
public ItemDefinition build() { public ItemDefinition build()
if (!AEConfig.instance().areFeaturesEnabled(this.features)) { {
return new ItemDefinition(this.registryName, null); if( !AEConfig.instance().areFeaturesEnabled( this.features ) )
} {
return new ItemDefinition( this.registryName, null );
}
Item item = this.itemSupplier.get(); Item item = this.itemSupplier.get();
item.setRegistryName(AppEng.MOD_ID, this.registryName); item.setRegistryName( AppEng.MOD_ID, this.registryName );
ItemDefinition definition = new ItemDefinition(this.registryName, item); ItemDefinition definition = new ItemDefinition( this.registryName, item );
item.setUnlocalizedName("appliedenergistics2." + this.registryName); item.setUnlocalizedName( "appliedenergistics2." + this.registryName );
item.setCreativeTab(this.creativeTab); item.setCreativeTab( this.creativeTab );
// Register all extra handlers // Register all extra handlers
this.boostrapComponents.forEach(component -> this.factory.addBootstrapComponent(component.apply(item))); this.boostrapComponents.forEach( component -> this.factory.addBootstrapComponent( component.apply( item ) ) );
// Register custom dispenser behavior if requested // Register custom dispenser behavior if requested
if (this.dispenserBehaviorSupplier != null) { if( this.dispenserBehaviorSupplier != null )
this.factory.addBootstrapComponent((IPostInitComponent) side -> {
{ this.factory.addBootstrapComponent( (IPostInitComponent) side ->
IBehaviorDispenseItem behavior = this.dispenserBehaviorSupplier.get(); {
BlockDispenser.DISPENSE_BEHAVIOR_REGISTRY.putObject(item, behavior); IBehaviorDispenseItem behavior = this.dispenserBehaviorSupplier.get();
}); BlockDispenser.DISPENSE_BEHAVIOR_REGISTRY.putObject( item, behavior );
} } );
}
this.factory.addBootstrapComponent((IItemRegistrationComponent) (side, reg) -> reg.register(item)); this.factory.addBootstrapComponent( (IItemRegistrationComponent) ( side, reg ) -> reg.register( item ) );
if (Platform.isClient()) { if( Platform.isClient() )
this.itemRendering.apply(this.factory, item); {
} this.itemRendering.apply( this.factory, item );
}
return definition; return definition;
} }
} }
+116 -89
View File
@@ -19,11 +19,15 @@
package appeng.bootstrap; package appeng.bootstrap;
import appeng.bootstrap.components.ItemColorComponent; import java.util.Collection;
import appeng.bootstrap.components.ItemMeshDefinitionComponent; import java.util.Collections;
import appeng.bootstrap.components.ItemModelComponent; import java.util.HashMap;
import appeng.bootstrap.components.ItemVariantsComponent; import java.util.HashSet;
import java.util.Map;
import java.util.Set;
import com.google.common.collect.ImmutableMap; import com.google.common.collect.ImmutableMap;
import net.minecraft.block.Block; import net.minecraft.block.Block;
import net.minecraft.block.state.IBlockState; import net.minecraft.block.state.IBlockState;
import net.minecraft.client.renderer.ItemMeshDefinition; import net.minecraft.client.renderer.ItemMeshDefinition;
@@ -37,114 +41,137 @@ import net.minecraftforge.client.model.IModel;
import net.minecraftforge.fml.relauncher.Side; import net.minecraftforge.fml.relauncher.Side;
import net.minecraftforge.fml.relauncher.SideOnly; import net.minecraftforge.fml.relauncher.SideOnly;
import java.util.*; import appeng.bootstrap.components.ItemColorComponent;
import appeng.bootstrap.components.ItemMeshDefinitionComponent;
import appeng.bootstrap.components.ItemModelComponent;
import appeng.bootstrap.components.ItemVariantsComponent;
class ItemRendering implements IItemRendering { class ItemRendering implements IItemRendering
{
@SideOnly(Side.CLIENT) @SideOnly( Side.CLIENT )
private IItemColor itemColor; private IItemColor itemColor;
@SideOnly(Side.CLIENT) @SideOnly( Side.CLIENT )
private ItemMeshDefinition itemMeshDefinition; private ItemMeshDefinition itemMeshDefinition;
@SideOnly(Side.CLIENT) @SideOnly( Side.CLIENT )
private final Map<Integer, ModelResourceLocation> itemModels = new HashMap<>(); private Map<Integer, ModelResourceLocation> itemModels = new HashMap<>();
@SideOnly(Side.CLIENT) @SideOnly( Side.CLIENT )
private final Set<ResourceLocation> variants = new HashSet<>(); private Set<ResourceLocation> variants = new HashSet<>();
@SideOnly(Side.CLIENT) @SideOnly( Side.CLIENT )
private final Map<String, IModel> builtInModels = new HashMap<>(); private Map<String, IModel> builtInModels = new HashMap<>();
@Override @Override
@SideOnly(Side.CLIENT) @SideOnly( Side.CLIENT )
public IItemRendering meshDefinition(ItemMeshDefinition meshDefinition) { public IItemRendering meshDefinition( ItemMeshDefinition meshDefinition )
this.itemMeshDefinition = meshDefinition; {
return this; this.itemMeshDefinition = meshDefinition;
} return this;
}
@Override @Override
@SideOnly(Side.CLIENT) @SideOnly( Side.CLIENT )
public IItemRendering model(int meta, ModelResourceLocation model) { public IItemRendering model( int meta, ModelResourceLocation model )
this.itemModels.put(meta, model); {
return this; this.itemModels.put( meta, model );
} return this;
}
@Override @Override
public IItemRendering variants(Collection<ResourceLocation> resources) { public IItemRendering variants( Collection<ResourceLocation> resources )
this.variants.addAll(resources); {
return this; this.variants.addAll( resources );
} return this;
}
@Override @Override
@SideOnly(Side.CLIENT) @SideOnly( Side.CLIENT )
public IItemRendering color(IItemColor itemColor) { public IItemRendering color( IItemColor itemColor )
this.itemColor = itemColor; {
return this; this.itemColor = itemColor;
} return this;
}
@Override @Override
public IItemRendering builtInModel(String name, IModel model) { public IItemRendering builtInModel( String name, IModel model )
this.builtInModels.put(name, model); {
return this; this.builtInModels.put( name, model );
} return this;
}
void apply(FeatureFactory factory, Item item) { void apply( FeatureFactory factory, Item item )
if (this.itemMeshDefinition != null) { {
factory.addBootstrapComponent(new ItemMeshDefinitionComponent(item, this.itemMeshDefinition)); if( this.itemMeshDefinition != null )
} {
factory.addBootstrapComponent( new ItemMeshDefinitionComponent( item, this.itemMeshDefinition ) );
}
if (!this.itemModels.isEmpty()) { if( !this.itemModels.isEmpty() )
factory.addBootstrapComponent(new ItemModelComponent(item, this.itemModels)); {
} factory.addBootstrapComponent( new ItemModelComponent( item, this.itemModels ) );
}
Set<ResourceLocation> resources = new HashSet<>(this.variants); Set<ResourceLocation> resources = new HashSet<>( this.variants );
// Register a default item model if neither items by meta nor an item mesh definition exist // Register a default item model if neither items by meta nor an item mesh definition exist
if (this.itemMeshDefinition == null && this.itemModels.isEmpty()) { if( this.itemMeshDefinition == null && this.itemModels.isEmpty() )
ModelResourceLocation model; {
ModelResourceLocation model;
// For block items, the default will try to use the default state of the associated block // For block items, the default will try to use the default state of the associated block
if (item instanceof ItemBlock) { if( item instanceof ItemBlock )
Block block = ((ItemBlock) item).getBlock(); {
Block block = ( (ItemBlock) item ).getBlock();
// We can only do this once the blocks are actually registered... // We can only do this once the blocks are actually registered...
StateMapperHelper helper = new StateMapperHelper(item.getRegistryName()); StateMapperHelper helper = new StateMapperHelper( item.getRegistryName() );
model = helper.getModelResourceLocation(block.getDefaultState()); model = helper.getModelResourceLocation( block.getDefaultState() );
} else { }
model = new ModelResourceLocation(item.getRegistryName(), "inventory"); else
} {
factory.addBootstrapComponent(new ItemModelComponent(item, ImmutableMap.of(0, model))); model = new ModelResourceLocation( item.getRegistryName(), "inventory" );
} }
factory.addBootstrapComponent( new ItemModelComponent( item, ImmutableMap.of( 0, model ) ) );
}
// TODO : 1.12 // TODO : 1.12
this.builtInModels.forEach(factory::addBuiltInModel); this.builtInModels.forEach( factory::addBuiltInModel );
if (!resources.isEmpty()) { if( !resources.isEmpty() )
factory.addBootstrapComponent(new ItemVariantsComponent(item, resources)); {
} else if (this.itemMeshDefinition != null) { factory.addBootstrapComponent( new ItemVariantsComponent( item, resources ) );
// Adding an empty variant list here will prevent Vanilla from trying to load the default item model in this }
// case else if( this.itemMeshDefinition != null )
factory.addBootstrapComponent(new ItemVariantsComponent(item, Collections.emptyList())); {
} // Adding an empty variant list here will prevent Vanilla from trying to load the default item model in this
// case
factory.addBootstrapComponent( new ItemVariantsComponent( item, Collections.emptyList() ) );
}
if (this.itemColor != null) { if( this.itemColor != null )
factory.addBootstrapComponent(new ItemColorComponent(item, this.itemColor)); {
} factory.addBootstrapComponent( new ItemColorComponent( item, this.itemColor ) );
} }
}
private static class StateMapperHelper extends StateMapperBase { private static class StateMapperHelper extends StateMapperBase
{
private final ResourceLocation registryName; private final ResourceLocation registryName;
public StateMapperHelper(ResourceLocation registryName) { public StateMapperHelper( ResourceLocation registryName )
this.registryName = registryName; {
} this.registryName = registryName;
}
@Override @Override
protected ModelResourceLocation getModelResourceLocation(IBlockState state) { protected ModelResourceLocation getModelResourceLocation( IBlockState state )
return new ModelResourceLocation(this.registryName, this.getPropertyString(state.getProperties())); {
} return new ModelResourceLocation( this.registryName, this.getPropertyString( state.getProperties() ) );
} }
}
} }
@@ -28,8 +28,9 @@ import net.minecraftforge.fml.relauncher.SideOnly;
* used * used
* due to them not being able to be annotated with @SideOnly(CLIENT). * due to them not being able to be annotated with @SideOnly(CLIENT).
*/ */
public abstract class ItemRenderingCustomizer { public abstract class ItemRenderingCustomizer
{
@SideOnly(Side.CLIENT) @SideOnly( Side.CLIENT )
public abstract void customize(IItemRendering rendering); public abstract void customize( IItemRendering rendering );
} }
@@ -25,20 +25,23 @@ import net.minecraft.client.renderer.color.IBlockColor;
import net.minecraftforge.fml.relauncher.Side; import net.minecraftforge.fml.relauncher.Side;
public class BlockColorComponent implements IInitComponent { public class BlockColorComponent implements IInitComponent
{
private final Block block; private final Block block;
private final IBlockColor blockColor; private final IBlockColor blockColor;
public BlockColorComponent(Block block, IBlockColor blockColor) { public BlockColorComponent( Block block, IBlockColor blockColor )
this.block = block; {
this.blockColor = blockColor; this.block = block;
} this.blockColor = blockColor;
}
@Override @Override
public void initialize(Side side) { public void initialize( Side side )
Minecraft.getMinecraft().getBlockColors().registerBlockColorHandler(this.blockColor, this.block); {
} Minecraft.getMinecraft().getBlockColors().registerBlockColorHandler( this.blockColor, this.block );
}
} }
@@ -19,34 +19,39 @@
package appeng.bootstrap.components; package appeng.bootstrap.components;
import appeng.client.render.model.BuiltInModelLoader; import java.util.HashMap;
import java.util.Map;
import com.google.common.base.Preconditions; import com.google.common.base.Preconditions;
import net.minecraftforge.client.model.IModel; import net.minecraftforge.client.model.IModel;
import net.minecraftforge.client.model.ModelLoaderRegistry; import net.minecraftforge.client.model.ModelLoaderRegistry;
import net.minecraftforge.fml.relauncher.Side; import net.minecraftforge.fml.relauncher.Side;
import net.minecraftforge.fml.relauncher.SideOnly; import net.minecraftforge.fml.relauncher.SideOnly;
import java.util.HashMap; import appeng.client.render.model.BuiltInModelLoader;
import java.util.Map;
@SideOnly(Side.CLIENT) @SideOnly( Side.CLIENT )
public class BuiltInModelComponent implements IPreInitComponent { public class BuiltInModelComponent implements IPreInitComponent
{
private final Map<String, IModel> builtInModels = new HashMap<>(); private final Map<String, IModel> builtInModels = new HashMap<>();
private boolean hasInitialized = false; private boolean hasInitialized = false;
public void addModel(String path, IModel model) { public void addModel( String path, IModel model )
Preconditions.checkState(!this.hasInitialized); {
this.builtInModels.put(path, model); Preconditions.checkState( !this.hasInitialized );
} this.builtInModels.put( path, model );
}
@Override @Override
public void preInitialize(Side side) { public void preInitialize( Side side )
this.hasInitialized = true; {
this.hasInitialized = true;
BuiltInModelLoader loader = new BuiltInModelLoader(this.builtInModels); BuiltInModelLoader loader = new BuiltInModelLoader( this.builtInModels );
ModelLoaderRegistry.registerLoader(loader); ModelLoaderRegistry.registerLoader( loader );
} }
} }
@@ -1,13 +1,16 @@
package appeng.bootstrap.components; package appeng.bootstrap.components;
import appeng.bootstrap.IBootstrapComponent;
import net.minecraft.block.Block; import net.minecraft.block.Block;
import net.minecraftforge.fml.relauncher.Side; import net.minecraftforge.fml.relauncher.Side;
import net.minecraftforge.registries.IForgeRegistry; import net.minecraftforge.registries.IForgeRegistry;
import appeng.bootstrap.IBootstrapComponent;
@FunctionalInterface @FunctionalInterface
public interface IBlockRegistrationComponent extends IBootstrapComponent { public interface IBlockRegistrationComponent extends IBootstrapComponent
void blockRegistration(Side side, IForgeRegistry<Block> blockRegistry); {
void blockRegistration( Side side, IForgeRegistry<Block> blockRegistry );
} }
@@ -1,12 +1,15 @@
package appeng.bootstrap.components; package appeng.bootstrap.components;
import appeng.bootstrap.IBootstrapComponent;
import net.minecraftforge.fml.common.registry.EntityEntry; import net.minecraftforge.fml.common.registry.EntityEntry;
import net.minecraftforge.registries.IForgeRegistry; import net.minecraftforge.registries.IForgeRegistry;
import appeng.bootstrap.IBootstrapComponent;
@FunctionalInterface @FunctionalInterface
public interface IEntityRegistrationComponent extends IBootstrapComponent { public interface IEntityRegistrationComponent extends IBootstrapComponent
void entityRegistration(IForgeRegistry<EntityEntry> entityRegistry); {
void entityRegistration( IForgeRegistry<EntityEntry> entityRegistry );
} }
@@ -19,11 +19,13 @@
package appeng.bootstrap.components; package appeng.bootstrap.components;
import appeng.bootstrap.IBootstrapComponent;
import net.minecraftforge.fml.relauncher.Side; import net.minecraftforge.fml.relauncher.Side;
import appeng.bootstrap.IBootstrapComponent;
@FunctionalInterface @FunctionalInterface
public interface IInitComponent extends IBootstrapComponent { public interface IInitComponent extends IBootstrapComponent
void initialize(Side side); {
void initialize( Side side );
} }
@@ -1,13 +1,16 @@
package appeng.bootstrap.components; package appeng.bootstrap.components;
import appeng.bootstrap.IBootstrapComponent;
import net.minecraft.item.Item; import net.minecraft.item.Item;
import net.minecraftforge.fml.relauncher.Side; import net.minecraftforge.fml.relauncher.Side;
import net.minecraftforge.registries.IForgeRegistry; import net.minecraftforge.registries.IForgeRegistry;
import appeng.bootstrap.IBootstrapComponent;
@FunctionalInterface @FunctionalInterface
public interface IItemRegistrationComponent extends IBootstrapComponent { public interface IItemRegistrationComponent extends IBootstrapComponent
void itemRegistration(Side side, IForgeRegistry<Item> itemRegistry); {
void itemRegistration( Side side, IForgeRegistry<Item> itemRegistry );
} }
@@ -19,9 +19,10 @@
package appeng.bootstrap.components; package appeng.bootstrap.components;
import net.minecraftforge.fml.relauncher.Side;
import appeng.bootstrap.IBootstrapComponent; import appeng.bootstrap.IBootstrapComponent;
import appeng.bootstrap.IModelRegistry; import appeng.bootstrap.IModelRegistry;
import net.minecraftforge.fml.relauncher.Side;
/** /**
@@ -29,6 +30,7 @@ import net.minecraftforge.fml.relauncher.Side;
*/ */
@FunctionalInterface @FunctionalInterface
public interface IModelRegistrationComponent extends IBootstrapComponent { public interface IModelRegistrationComponent extends IBootstrapComponent
void modelRegistration(Side side, IModelRegistry registry); {
void modelRegistration( Side side, IModelRegistry registry );
} }

Some files were not shown because too many files have changed in this diff Show More