diff --git a/block/AEBaseItemBlock.java b/block/AEBaseItemBlock.java index 243edf2c..3d37e18c 100644 --- a/block/AEBaseItemBlock.java +++ b/block/AEBaseItemBlock.java @@ -12,6 +12,7 @@ import net.minecraftforge.client.MinecraftForgeClient; import net.minecraftforge.common.util.ForgeDirection; import appeng.api.util.IOrientable; import appeng.api.util.IOrientableBlock; +import appeng.block.misc.BlockSkyCompass; import appeng.block.networking.BlockWireless; import appeng.client.render.ItemRenderer; import appeng.me.helpers.IGridProxyable; @@ -62,7 +63,7 @@ public class AEBaseItemBlock extends ItemBlock if ( blockType.hasBlockTileEntity() ) { - if ( blockType instanceof BlockWireless ) + if ( blockType instanceof BlockWireless || blockType instanceof BlockSkyCompass ) { forward = ForgeDirection.getOrientation( side ); if ( forward == ForgeDirection.UP || forward == ForgeDirection.DOWN ) diff --git a/block/misc/BlockSkyCompass.java b/block/misc/BlockSkyCompass.java new file mode 100644 index 00000000..76a11719 --- /dev/null +++ b/block/misc/BlockSkyCompass.java @@ -0,0 +1,161 @@ +package appeng.block.misc; + +import java.util.Arrays; +import java.util.EnumSet; +import java.util.List; + +import net.minecraft.block.Block; +import net.minecraft.block.material.Material; +import net.minecraft.client.renderer.texture.IIconRegister; +import net.minecraft.entity.Entity; +import net.minecraft.init.Blocks; +import net.minecraft.util.AxisAlignedBB; +import net.minecraft.util.IIcon; +import net.minecraft.world.World; +import net.minecraftforge.common.util.ForgeDirection; +import appeng.block.AEBaseBlock; +import appeng.client.render.BaseBlockRender; +import appeng.client.render.blocks.RenderBlockSkyCompass; +import appeng.core.features.AEFeature; +import appeng.helpers.ICustomCollision; +import appeng.tile.misc.TileSkyCompass; +import cpw.mods.fml.relauncher.Side; +import cpw.mods.fml.relauncher.SideOnly; + +public class BlockSkyCompass extends AEBaseBlock implements ICustomCollision +{ + + public BlockSkyCompass() { + super( BlockSkyCompass.class, Material.iron ); + setfeature( EnumSet.of( AEFeature.Core ) ); + setTileEntiy( TileSkyCompass.class ); + isOpaque = isFullSize = false; + lightOpacity = 0; + } + + @Override + @SideOnly(Side.CLIENT) + public IIcon getIcon(int direction, int metadata) + { + return Blocks.iron_block.getIcon( direction, metadata ); + } + + @Override + protected Class getRenderer() + { + return RenderBlockSkyCompass.class; + } + + private void dropTorch(World w, int x, int y, int z) + { + w.func_147480_a( x, y, z, true ); + // w.destroyBlock( x, y, z, true ); + w.markBlockForUpdate( x, y, z ); + } + + @Override + public boolean canPlaceBlockAt(World w, int x, int y, int z) + { + for (ForgeDirection dir : ForgeDirection.VALID_DIRECTIONS) + if ( canPlaceAt( w, x, y, z, dir ) ) + return true; + return false; + } + + private boolean canPlaceAt(World w, int x, int y, int z, ForgeDirection dir) + { + return w.isSideSolid( x + dir.offsetX, y + dir.offsetY, z + dir.offsetZ, dir.getOpposite(), false ); + } + + @Override + public boolean isValidOrientation(World w, int x, int y, int z, ForgeDirection forward, ForgeDirection up) + { + TileSkyCompass sc = getTileEntity( w, x, y, z ); + if ( sc != null ) + return false; + return canPlaceAt( w, x, y, z, forward.getOpposite() ); + } + + @Override + public void onNeighborBlockChange(World w, int x, int y, int z, Block id) + { + TileSkyCompass sc = getTileEntity( w, x, y, z ); + ForgeDirection up = sc.getForward(); + if ( !canPlaceAt( w, x, y, z, up.getOpposite() ) ) + dropTorch( w, x, y, z ); + } + + @Override + public Iterable getSelectedBoundingBoxsFromPool(World w, int x, int y, int z, Entity e, boolean isVisual) + { + TileSkyCompass tile = getTileEntity( w, x, y, z ); + if ( tile != null ) + { + ForgeDirection forward = tile.getForward(); + + double minX = 0; + double minY = 0; + double minZ = 0; + double maxX = 1; + double maxY = 1; + double maxZ = 1; + + switch (forward) + { + case DOWN: + minZ = minX = 5.0 / 16.0; + maxZ = maxX = 11.0 / 16.0; + maxY = 1.0; + minY = 14.0 / 16.0; + break; + case EAST: + minZ = minY = 5.0 / 16.0; + maxZ = maxY = 11.0 / 16.0; + maxX = 2.0 / 16.0; + minX = 0.0; + break; + case NORTH: + minY = minX = 5.0 / 16.0; + maxY = maxX = 11.0 / 16.0; + maxZ = 1.0; + minZ = 14.0 / 16.0; + break; + case SOUTH: + minY = minX = 5.0 / 16.0; + maxY = maxX = 11.0 / 16.0; + maxZ = 2.0 / 16.0; + minZ = 0.0; + break; + case UP: + minZ = minX = 5.0 / 16.0; + maxZ = maxX = 11.0 / 16.0; + maxY = 2.0 / 16.0; + minY = 0.0; + break; + case WEST: + minZ = minY = 5.0 / 16.0; + maxZ = maxY = 11.0 / 16.0; + maxX = 1.0; + minX = 14.0 / 16.0; + break; + default: + break; + } + + return Arrays.asList( new AxisAlignedBB[] { AxisAlignedBB.getBoundingBox( minX, minY, minZ, maxX, maxY, maxZ ) } ); + } + return Arrays.asList( new AxisAlignedBB[] { AxisAlignedBB.getBoundingBox( 0.0, 0, 0.0, 1.0, 1.0, 1.0 ) } ); + } + + @Override + public void addCollidingBlockToList(World w, int x, int y, int z, AxisAlignedBB bb, List out, Entity e) + { + + } + + @Override + public void registerBlockIcons(IIconRegister iconRegistry) + { + // :P + } +} diff --git a/block/misc/BlockTinyTNT.java b/block/misc/BlockTinyTNT.java index ce70be71..b51caa06 100644 --- a/block/misc/BlockTinyTNT.java +++ b/block/misc/BlockTinyTNT.java @@ -27,8 +27,8 @@ import appeng.core.AppEng; import appeng.core.features.AEFeature; import appeng.entity.EntityIds; import appeng.entity.EntityTinyTNTPrimed; -import appeng.helpers.DispenserBehaviorTinyTNT; import appeng.helpers.ICustomCollision; +import appeng.hooks.DispenserBehaviorTinyTNT; import cpw.mods.fml.common.registry.EntityRegistry; public class BlockTinyTNT extends AEBaseBlock implements ICustomCollision diff --git a/block/solids/BlockSkyStone.java b/block/solids/BlockSkyStone.java index 48b76ef5..e7c968de 100644 --- a/block/solids/BlockSkyStone.java +++ b/block/solids/BlockSkyStone.java @@ -3,6 +3,7 @@ package appeng.block.solids; import java.util.EnumSet; import java.util.List; +import net.minecraft.block.Block; import net.minecraft.block.material.Material; import net.minecraft.client.renderer.texture.IIconRegister; import net.minecraft.creativetab.CreativeTabs; @@ -15,6 +16,7 @@ import net.minecraft.world.World; import appeng.api.util.IOrientable; import appeng.api.util.IOrientableBlock; import appeng.block.AEBaseBlock; +import appeng.core.WorldSettings; import appeng.core.features.AEFeature; import appeng.helpers.LocationRotation; import cpw.mods.fml.relauncher.Side; @@ -110,4 +112,18 @@ public class BlockSkyStone extends AEBaseBlock implements IOrientableBlock l.add( new ItemStack( i, 1, 3 ) ); } + @Override + public void onBlockAdded(World w, int x, int y, int z) + { + super.onBlockAdded( w, x, y, z ); + WorldSettings.getInstance().getCompass().updateArea( w, x, y, z ); + } + + @Override + public void breakBlock(World w, int x, int y, int z, Block b, int WTF) + { + super.breakBlock( w, x, y, z, b, WTF ); + WorldSettings.getInstance().getCompass().updateArea( w, x, y, z ); + } + } diff --git a/block/storage/BlockChest.java b/block/storage/BlockChest.java index ca1777c0..71383960 100644 --- a/block/storage/BlockChest.java +++ b/block/storage/BlockChest.java @@ -9,15 +9,12 @@ import net.minecraft.world.World; import net.minecraftforge.common.util.ForgeDirection; import appeng.api.AEApi; import appeng.api.storage.ICellHandler; -import appeng.api.storage.IMEInventoryHandler; -import appeng.api.storage.StorageChannel; import appeng.block.AEBaseBlock; import appeng.client.render.BaseBlockRender; import appeng.client.render.blocks.RenderMEChest; import appeng.core.features.AEFeature; import appeng.core.localization.PlayerMessages; import appeng.core.sync.GuiBridge; -import appeng.helpers.AENoHandler; import appeng.tile.storage.TileChest; import appeng.util.Platform; @@ -56,36 +53,7 @@ public class BlockChest extends AEBaseBlock { ICellHandler ch = AEApi.instance().registries().cell().getHander( cell ); - try - { - IMEInventoryHandler ih = tg.getHandler( StorageChannel.ITEMS ); - if ( ch != null && ih != null ) - { - IMEInventoryHandler mine = ih; - ch.openChestGui( p, tg, ch, mine, cell, StorageChannel.ITEMS ); - return true; - } - - } - catch (AENoHandler e) - { - // :P - } - - try - { - IMEInventoryHandler fh = tg.getHandler( StorageChannel.FLUIDS ); - if ( ch != null && fh != null ) - { - IMEInventoryHandler mine = fh; - ch.openChestGui( p, tg, ch, mine, cell, StorageChannel.FLUIDS ); - return true; - } - } - catch (AENoHandler e) - { - // :P - } + tg.openGui( p, ch, cell, side ); } p.addChatMessage( PlayerMessages.ChestCannotReadStorageCell.get() ); diff --git a/client/render/BaseBlockRender.java b/client/render/BaseBlockRender.java index 9d184a60..d28aa301 100644 --- a/client/render/BaseBlockRender.java +++ b/client/render/BaseBlockRender.java @@ -16,6 +16,7 @@ import net.minecraft.item.ItemStack; import net.minecraft.tileentity.TileEntity; import net.minecraft.util.IIcon; import net.minecraft.world.IBlockAccess; +import net.minecraftforge.client.IItemRenderer.ItemRenderType; import net.minecraftforge.common.util.ForgeDirection; import org.lwjgl.BufferUtils; @@ -356,7 +357,7 @@ public class BaseBlockRender } } - public void renderInventory(AEBaseBlock block, ItemStack item, RenderBlocks renderer) + public void renderInventory(AEBaseBlock block, ItemStack item, RenderBlocks renderer, ItemRenderType type) { Tessellator tess = Tessellator.instance; diff --git a/client/render/ItemRenderer.java b/client/render/ItemRenderer.java index 2a5751a4..0e8fafb5 100644 --- a/client/render/ItemRenderer.java +++ b/client/render/ItemRenderer.java @@ -38,7 +38,7 @@ public class ItemRenderer implements IItemRenderer if ( type == ItemRenderType.INVENTORY ) GL11.glTranslatef( 0.0f, -0.1f, 0.0f ); - WorldRender.instance.renderItemBlock( item ); + WorldRender.instance.renderItemBlock( item, type ); GL11.glPopAttrib(); GL11.glPopMatrix(); diff --git a/client/render/WorldRender.java b/client/render/WorldRender.java index 5091ea11..78ff6bd0 100644 --- a/client/render/WorldRender.java +++ b/client/render/WorldRender.java @@ -6,6 +6,7 @@ import net.minecraft.block.Block; import net.minecraft.client.renderer.RenderBlocks; import net.minecraft.item.ItemStack; import net.minecraft.world.IBlockAccess; +import net.minecraftforge.client.IItemRenderer.ItemRenderType; import appeng.block.AEBaseBlock; import appeng.core.AELog; import cpw.mods.fml.client.registry.ISimpleBlockRenderingHandler; @@ -57,21 +58,21 @@ public class WorldRender implements ISimpleBlockRenderingHandler return renderID; } - public void renderItemBlock(ItemStack item) + public void renderItemBlock(ItemStack item, ItemRenderType type) { Block blk = Block.getBlockFromItem( item.getItem() ); if ( blk instanceof AEBaseBlock ) { - AEBaseBlock block = (AEBaseBlock)blk; + AEBaseBlock block = (AEBaseBlock) blk; renderer.setRenderBoundsFromBlock( block ); - + renderer.uvRotateBottom = renderer.uvRotateEast = renderer.uvRotateNorth = renderer.uvRotateSouth = renderer.uvRotateTop = renderer.uvRotateWest = 0; - getRender( block ).renderInventory( block, item, renderer ); + getRender( block ).renderInventory( block, item, renderer, type ); renderer.uvRotateBottom = renderer.uvRotateEast = renderer.uvRotateNorth = renderer.uvRotateSouth = renderer.uvRotateTop = renderer.uvRotateWest = 0; } else { - AELog.severe( "Invalid render: "+item.getUnlocalizedName() +" as ae block" ); + AELog.severe( "Invalid render: " + item.getUnlocalizedName() + " as ae block" ); } } diff --git a/client/render/blocks/RenderBlockCharger.java b/client/render/blocks/RenderBlockCharger.java index f0880fd4..ae9a84dd 100644 --- a/client/render/blocks/RenderBlockCharger.java +++ b/client/render/blocks/RenderBlockCharger.java @@ -9,6 +9,7 @@ import net.minecraft.client.renderer.Tessellator; import net.minecraft.inventory.IInventory; import net.minecraft.item.ItemStack; import net.minecraft.world.IBlockAccess; +import net.minecraftforge.client.IItemRenderer.ItemRenderType; import net.minecraftforge.common.util.ForgeDirection; import org.lwjgl.opengl.GL11; @@ -31,7 +32,7 @@ public class RenderBlockCharger extends BaseBlockRender } @Override - public void renderInventory(AEBaseBlock blk, ItemStack is, RenderBlocks renderer) + public void renderInventory(AEBaseBlock blk, ItemStack is, RenderBlocks renderer, ItemRenderType type) { Tessellator tess = Tessellator.instance; diff --git a/client/render/blocks/RenderBlockCrank.java b/client/render/blocks/RenderBlockCrank.java index 219924a1..cdad2fcd 100644 --- a/client/render/blocks/RenderBlockCrank.java +++ b/client/render/blocks/RenderBlockCrank.java @@ -7,6 +7,7 @@ import net.minecraft.client.renderer.Tessellator; import net.minecraft.client.renderer.texture.TextureMap; import net.minecraft.item.ItemStack; import net.minecraft.world.IBlockAccess; +import net.minecraftforge.client.IItemRenderer.ItemRenderType; import net.minecraftforge.common.util.ForgeDirection; import org.lwjgl.opengl.GL11; @@ -24,15 +25,15 @@ public class RenderBlockCrank extends BaseBlockRender } @Override - public void renderInventory(AEBaseBlock blk, ItemStack is, RenderBlocks renderer) + public void renderInventory(AEBaseBlock blk, ItemStack is, RenderBlocks renderer, ItemRenderType type) { renderer.renderAllFaces = true; renderer.setRenderBounds( 0.5D - 0.05, 0.5D - 0.5, 0.5D - 0.05, 0.5D + 0.05, 0.5D + 0.3, 0.5D + 0.05 ); - super.renderInventory( blk, is, renderer ); + super.renderInventory( blk, is, renderer, type ); renderer.setRenderBounds( 0.70D - 0.15, 0.75D - 0.05, 0.5D - 0.05, 0.70D + 0.28, 0.75D + 0.05, 0.5D + 0.05 ); - super.renderInventory( blk, is, renderer ); + super.renderInventory( blk, is, renderer, type ); renderer.renderAllFaces = false; } diff --git a/client/render/blocks/RenderBlockEnergyCube.java b/client/render/blocks/RenderBlockEnergyCube.java index c15896d5..c701ce2e 100644 --- a/client/render/blocks/RenderBlockEnergyCube.java +++ b/client/render/blocks/RenderBlockEnergyCube.java @@ -3,6 +3,7 @@ package appeng.client.render.blocks; import net.minecraft.client.renderer.RenderBlocks; import net.minecraft.item.ItemStack; import net.minecraft.world.IBlockAccess; +import net.minecraftforge.client.IItemRenderer.ItemRenderType; import appeng.api.implementations.items.IAEItemPowerStorage; import appeng.block.AEBaseBlock; import appeng.client.render.BaseBlockRender; @@ -15,7 +16,7 @@ public class RenderBlockEnergyCube extends BaseBlockRender } @Override - public void renderInventory(AEBaseBlock blk, ItemStack is, RenderBlocks renderer) + public void renderInventory(AEBaseBlock blk, ItemStack is, RenderBlocks renderer, ItemRenderType type) { IAEItemPowerStorage myItem = (IAEItemPowerStorage) is.getItem(); double internalCurrentPower = myItem.getAECurrentPower( is ); @@ -29,7 +30,7 @@ public class RenderBlockEnergyCube extends BaseBlockRender meta = 0; renderer.setOverrideBlockTexture( blk.getIcon( 0, meta ) ); - super.renderInventory( blk, is, renderer ); + super.renderInventory( blk, is, renderer, type ); renderer.setOverrideBlockTexture( null ); } diff --git a/client/render/blocks/RenderBlockSkyChest.java b/client/render/blocks/RenderBlockSkyChest.java index dd1e9509..e84890fe 100644 --- a/client/render/blocks/RenderBlockSkyChest.java +++ b/client/render/blocks/RenderBlockSkyChest.java @@ -7,6 +7,7 @@ import net.minecraft.client.renderer.Tessellator; import net.minecraft.item.ItemStack; import net.minecraft.util.ResourceLocation; import net.minecraft.world.IBlockAccess; +import net.minecraftforge.client.IItemRenderer.ItemRenderType; import org.lwjgl.opengl.GL11; @@ -25,7 +26,7 @@ public class RenderBlockSkyChest extends BaseBlockRender } @Override - public void renderInventory(AEBaseBlock blk, ItemStack is, RenderBlocks renderer) + public void renderInventory(AEBaseBlock blk, ItemStack is, RenderBlocks renderer, ItemRenderType type) { GL11.glEnable( 32826 /* GL_RESCALE_NORMAL_EXT */); GL11.glColor4f( 1.0F, 1.0F, 1.0F, 1.0F ); diff --git a/client/render/blocks/RenderBlockSkyCompass.java b/client/render/blocks/RenderBlockSkyCompass.java new file mode 100644 index 00000000..d826a580 --- /dev/null +++ b/client/render/blocks/RenderBlockSkyCompass.java @@ -0,0 +1,182 @@ +package appeng.client.render.blocks; + +import net.minecraft.client.Minecraft; +import net.minecraft.client.renderer.RenderBlocks; +import net.minecraft.client.renderer.Tessellator; +import net.minecraft.entity.player.EntityPlayer; +import net.minecraft.item.ItemStack; +import net.minecraft.util.ResourceLocation; +import net.minecraft.world.IBlockAccess; +import net.minecraftforge.client.IItemRenderer.ItemRenderType; +import net.minecraftforge.common.util.ForgeDirection; + +import org.lwjgl.opengl.GL11; + +import appeng.block.AEBaseBlock; +import appeng.client.render.BaseBlockRender; +import appeng.client.render.model.ModelCompass; +import appeng.hooks.CompassManager; +import appeng.hooks.CompassResult; +import appeng.tile.AEBaseTile; +import appeng.tile.misc.TileSkyCompass; + +public class RenderBlockSkyCompass extends BaseBlockRender +{ + + float r = 0; + ModelCompass model = new ModelCompass(); + + public RenderBlockSkyCompass() { + super( true, 80 ); + } + + @Override + public void renderInventory(AEBaseBlock blk, ItemStack is, RenderBlocks renderer, ItemRenderType type) + { + GL11.glEnable( 32826 /* GL_RESCALE_NORMAL_EXT */); + GL11.glColor4f( 1.0F, 1.0F, 1.0F, 1.0F ); + + ResourceLocation loc = new ResourceLocation( "appliedenergistics2", "textures/models/compass.png" ); + + Minecraft.getMinecraft().getTextureManager().bindTexture( loc ); + + if ( type == ItemRenderType.ENTITY ) + { + GL11.glRotatef( -90.0f, 0.0f, 0.0f, 1.0f ); + GL11.glScalef( 1.0F, -1F, -1F ); + GL11.glScalef( 2.5f, 2.5f, 2.5f ); + GL11.glTranslatef( -0.25F, -1.65F, -0.19F ); + } + else + { + if ( type == ItemRenderType.EQUIPPED_FIRST_PERSON ) + GL11.glRotatef( 15.3f, 0.0f, 0.0f, 1.0f ); + + GL11.glScalef( 1.0F, -1F, -1F ); + GL11.glScalef( 2.5f, 2.5f, 2.5f ); + + if ( type == ItemRenderType.EQUIPPED_FIRST_PERSON ) + GL11.glTranslatef( 0.3F, -1.65F, -0.19F ); + else + GL11.glTranslatef( 0.2F, -1.65F, -0.19F ); + } + + long now = System.currentTimeMillis(); + if ( type == ItemRenderType.EQUIPPED_FIRST_PERSON || type == ItemRenderType.INVENTORY ) + { + EntityPlayer p = Minecraft.getMinecraft().thePlayer; + + int x = (int) p.posX; + int y = (int) p.posY; + int z = (int) p.posZ; + CompassResult cr = CompassManager.instance.getCompassDirection( 0, x, y, z ); + + for (int i = 0; i < 3; i++) + for (int j = 0; j < 3; j++) + CompassManager.instance.getCompassDirection( 0, x + i - 1, y, z + j - 1 ); + + if ( cr.hasResult ) + { + if ( cr.spin ) + { + now = now % 100000; + model.renderAll( ((float) now / 50000.0f) * (float) Math.PI * 500.0f ); + } + else + { + if ( type == ItemRenderType.EQUIPPED_FIRST_PERSON ) + { + float offRads = p.rotationYaw / 180.0f * (float) Math.PI; + float adjustment = (float) Math.PI * 0.74f; + model.renderAll( (float) flipidiy( cr.rad + offRads + adjustment ) ); + } + else + { + float offRads = p.rotationYaw / 180.0f * (float) Math.PI; + float adjustment = (float) Math.PI * -0.74f; + model.renderAll( (float) flipidiy( cr.rad + offRads + adjustment ) ); + } + } + } + else + { + now = now % 1000000; + model.renderAll( ((float) now / 500000.0f) * (float) Math.PI * 500.0f ); + } + + } + else + { + now = now % 100000; + model.renderAll( ((float) now / 50000.0f) * (float) Math.PI * 500.0f ); + } + + GL11.glDisable( 32826 /* GL_RESCALE_NORMAL_EXT */); + GL11.glColor4f( 1.0F, 1.0F, 1.0F, 1.0F ); + } + + @Override + public boolean renderInWorld(AEBaseBlock blk, IBlockAccess world, int x, int y, int z, RenderBlocks renderer) + { + return true; + } + + @Override + public void renderTile(AEBaseBlock block, AEBaseTile tile, Tessellator tess, double x, double y, double z, float partialTick, RenderBlocks renderer) + { + if ( !(tile instanceof TileSkyCompass) ) + return; + + TileSkyCompass skyCompass = (TileSkyCompass) tile; + + if ( !skyCompass.hasWorldObj() ) + return; + + GL11.glEnable( 32826 /* GL_RESCALE_NORMAL_EXT */); + GL11.glColor4f( 1.0F, 1.0F, 1.0F, 1.0F ); + + ResourceLocation loc = new ResourceLocation( "appliedenergistics2", "textures/models/compass.png" ); + + Minecraft.getMinecraft().getTextureManager().bindTexture( loc ); + + this.applyTESRRotation( x, y, z, skyCompass.getUp(), skyCompass.getForward() ); + + GL11.glScalef( 1.0F, -1F, -1F ); + GL11.glTranslatef( 0.5F, -1.5F, -0.5F ); + + long now = System.currentTimeMillis(); + + CompassResult cr = null; + if ( skyCompass.getForward() == ForgeDirection.UP || skyCompass.getForward() == ForgeDirection.DOWN ) + cr = CompassManager.instance.getCompassDirection( 0, tile.xCoord, tile.yCoord, tile.zCoord ); + else + cr = new CompassResult( false, true, 0 ); + + if ( cr.hasResult ) + { + if ( cr.spin ) + { + now = now % 100000; + model.renderAll( ((float) now / 50000.0f) * (float) Math.PI * 500.0f ); + } + else + model.renderAll( (float) (skyCompass.getForward() == ForgeDirection.DOWN ? flipidiy( cr.rad ) : cr.rad) ); + + } + else + { + now = now % 1000000; + model.renderAll( ((float) now / 500000.0f) * (float) Math.PI * 500.0f ); + } + + GL11.glDisable( 32826 /* GL_RESCALE_NORMAL_EXT */); + GL11.glColor4f( 1.0F, 1.0F, 1.0F, 1.0F ); + } + + private double flipidiy(double rad) + { + double x = Math.cos( rad ); + double y = Math.sin( rad ); + return Math.atan2( -y, x ); + } +} diff --git a/client/render/blocks/RenderBlockWireless.java b/client/render/blocks/RenderBlockWireless.java index b5813f30..0d5f0abc 100644 --- a/client/render/blocks/RenderBlockWireless.java +++ b/client/render/blocks/RenderBlockWireless.java @@ -7,6 +7,7 @@ import net.minecraft.client.renderer.Tessellator; import net.minecraft.item.ItemStack; import net.minecraft.util.IIcon; import net.minecraft.world.IBlockAccess; +import net.minecraftforge.client.IItemRenderer.ItemRenderType; import net.minecraftforge.common.util.ForgeDirection; import appeng.api.util.AEColor; import appeng.block.AEBaseBlock; @@ -26,7 +27,7 @@ public class RenderBlockWireless extends BaseBlockRender } @Override - public void renderInventory(AEBaseBlock blk, ItemStack is, RenderBlocks renderer) + public void renderInventory(AEBaseBlock blk, ItemStack is, RenderBlocks renderer, ItemRenderType type) { this.blk = blk; cenx = 0; diff --git a/client/render/blocks/RenderDrive.java b/client/render/blocks/RenderDrive.java index 7fe4a217..241fd524 100644 --- a/client/render/blocks/RenderDrive.java +++ b/client/render/blocks/RenderDrive.java @@ -7,6 +7,7 @@ import net.minecraft.client.renderer.Tessellator; import net.minecraft.item.ItemStack; import net.minecraft.util.IIcon; import net.minecraft.world.IBlockAccess; +import net.minecraftforge.client.IItemRenderer.ItemRenderType; import net.minecraftforge.common.util.ForgeDirection; import appeng.block.AEBaseBlock; import appeng.client.render.BaseBlockRender; @@ -22,13 +23,13 @@ public class RenderDrive extends BaseBlockRender } @Override - public void renderInventory(AEBaseBlock block, ItemStack is, RenderBlocks renderer) + public void renderInventory(AEBaseBlock block, ItemStack is, RenderBlocks renderer, ItemRenderType type) { renderer.overrideBlockTexture = ExtraTextures.getMissing(); this.renderInvBlock( EnumSet.of( ForgeDirection.SOUTH ), block, is, Tessellator.instance, 0x000000, renderer ); renderer.overrideBlockTexture = null; - super.renderInventory( block, is, renderer ); + super.renderInventory( block, is, renderer, type ); } @Override diff --git a/client/render/blocks/RenderMEChest.java b/client/render/blocks/RenderMEChest.java index e1fa330c..ea5af430 100644 --- a/client/render/blocks/RenderMEChest.java +++ b/client/render/blocks/RenderMEChest.java @@ -7,6 +7,7 @@ import net.minecraft.client.renderer.Tessellator; import net.minecraft.item.ItemStack; import net.minecraft.util.IIcon; import net.minecraft.world.IBlockAccess; +import net.minecraftforge.client.IItemRenderer.ItemRenderType; import net.minecraftforge.common.util.ForgeDirection; import appeng.api.AEApi; import appeng.api.storage.ICellHandler; @@ -26,7 +27,7 @@ public class RenderMEChest extends BaseBlockRender } @Override - public void renderInventory(AEBaseBlock block, ItemStack is, RenderBlocks renderer) + public void renderInventory(AEBaseBlock block, ItemStack is, RenderBlocks renderer, ItemRenderType type) { renderer.overrideBlockTexture = ExtraTextures.getMissing(); this.renderInvBlock( EnumSet.of( ForgeDirection.SOUTH ), block, is, Tessellator.instance, 0x000000, renderer ); @@ -35,7 +36,7 @@ public class RenderMEChest extends BaseBlockRender this.renderInvBlock( EnumSet.of( ForgeDirection.UP ), block, is, Tessellator.instance, 0xffffff, renderer ); renderer.overrideBlockTexture = null; - super.renderInventory( block, is, renderer ); + super.renderInventory( block, is, renderer, type ); } @Override diff --git a/client/render/blocks/RenderNull.java b/client/render/blocks/RenderNull.java index 9737df1a..20678024 100644 --- a/client/render/blocks/RenderNull.java +++ b/client/render/blocks/RenderNull.java @@ -3,6 +3,7 @@ package appeng.client.render.blocks; import net.minecraft.client.renderer.RenderBlocks; import net.minecraft.item.ItemStack; import net.minecraft.world.IBlockAccess; +import net.minecraftforge.client.IItemRenderer.ItemRenderType; import appeng.block.AEBaseBlock; import appeng.client.render.BaseBlockRender; @@ -14,7 +15,7 @@ public class RenderNull extends BaseBlockRender } @Override - public void renderInventory(AEBaseBlock block, ItemStack is, RenderBlocks renderer) + public void renderInventory(AEBaseBlock block, ItemStack is, RenderBlocks renderer, ItemRenderType type) { } diff --git a/client/render/blocks/RenderQNB.java b/client/render/blocks/RenderQNB.java index 26fcd20c..5a5a2c13 100644 --- a/client/render/blocks/RenderQNB.java +++ b/client/render/blocks/RenderQNB.java @@ -8,6 +8,7 @@ import net.minecraft.item.Item; import net.minecraft.item.ItemStack; import net.minecraft.util.IIcon; import net.minecraft.world.IBlockAccess; +import net.minecraftforge.client.IItemRenderer.ItemRenderType; import net.minecraftforge.common.util.ForgeDirection; import appeng.api.AEApi; import appeng.api.util.AEColor; @@ -71,13 +72,13 @@ public class RenderQNB extends BaseBlockRender } @Override - public void renderInventory(AEBaseBlock block, ItemStack item, RenderBlocks renderer) + public void renderInventory(AEBaseBlock block, ItemStack item, RenderBlocks renderer, ItemRenderType type) { float px = 2.0f / 16.0f; float maxpx = 14.0f / 16.0f; renderer.setRenderBounds( px, px, px, maxpx, maxpx, maxpx ); - super.renderInventory( block, item, renderer ); + super.renderInventory( block, item, renderer, type ); } @Override @@ -101,7 +102,8 @@ public class RenderQNB extends BaseBlockRender EnumSet sides = tqb.getConnections(); renderCableAt( 0.11D, world, x, y, z, block, renderer, cable.getIconIndex( cabldef.stack( AEColor.Transparent, 1 ) ), 0.141D, sides ); - renderCableAt( 0.188D, world, x, y, z, block, renderer, ccable.getIconIndex( ccabldef.stack( AEColor.Transparent, 1 ) ), 0.1875D, tqb.getConnections() ); + renderCableAt( 0.188D, world, x, y, z, block, renderer, ccable.getIconIndex( ccabldef.stack( AEColor.Transparent, 1 ) ), 0.1875D, + tqb.getConnections() ); } float px = 2.0f / 16.0f; @@ -127,7 +129,8 @@ public class RenderQNB extends BaseBlockRender AEColoredItemDefinition ccabldef = AEApi.instance().parts().partCableCovered; Item ccable = ccabldef.item( AEColor.Transparent ); - renderCableAt( 0.188D, world, x, y, z, block, renderer, ccable.getIconIndex( ccabldef.stack( AEColor.Transparent, 1 ) ), 0.05D, tqb.getConnections() ); + renderCableAt( 0.188D, world, x, y, z, block, renderer, ccable.getIconIndex( ccabldef.stack( AEColor.Transparent, 1 ) ), 0.05D, + tqb.getConnections() ); float px = 4.0f / 16.0f; float maxpx = 12.0f / 16.0f; diff --git a/client/render/blocks/RenderQuartzGlass.java b/client/render/blocks/RenderQuartzGlass.java index 40050222..651cac6f 100644 --- a/client/render/blocks/RenderQuartzGlass.java +++ b/client/render/blocks/RenderQuartzGlass.java @@ -5,6 +5,7 @@ import java.util.Random; import net.minecraft.client.renderer.RenderBlocks; import net.minecraft.item.ItemStack; import net.minecraft.world.IBlockAccess; +import net.minecraftforge.client.IItemRenderer.ItemRenderType; import net.minecraftforge.common.util.ForgeDirection; import appeng.api.AEApi; import appeng.block.AEBaseBlock; @@ -113,12 +114,12 @@ public class RenderQuartzGlass extends BaseBlockRender } @Override - public void renderInventory(AEBaseBlock block, ItemStack is, RenderBlocks renderer) + public void renderInventory(AEBaseBlock block, ItemStack is, RenderBlocks renderer, ItemRenderType type) { renderer.overrideBlockTexture = ExtraTextures.GlassFrame.getIcon(); - super.renderInventory( block, is, renderer ); + super.renderInventory( block, is, renderer, type ); renderer.overrideBlockTexture = null; - super.renderInventory( block, is, renderer ); + super.renderInventory( block, is, renderer, type ); } @Override diff --git a/client/render/blocks/RenderQuartzOre.java b/client/render/blocks/RenderQuartzOre.java index f956dfcb..6af76552 100644 --- a/client/render/blocks/RenderQuartzOre.java +++ b/client/render/blocks/RenderQuartzOre.java @@ -3,6 +3,7 @@ package appeng.client.render.blocks; import net.minecraft.client.renderer.RenderBlocks; import net.minecraft.item.ItemStack; import net.minecraft.world.IBlockAccess; +import net.minecraftforge.client.IItemRenderer.ItemRenderType; import appeng.block.AEBaseBlock; import appeng.block.solids.OreQuartz; import appeng.client.render.BaseBlockRender; @@ -16,11 +17,11 @@ public class RenderQuartzOre extends BaseBlockRender } @Override - public void renderInventory(AEBaseBlock blk, ItemStack is, RenderBlocks renderer) + public void renderInventory(AEBaseBlock blk, ItemStack is, RenderBlocks renderer, ItemRenderType type) { - super.renderInventory( blk, is, renderer ); + super.renderInventory( blk, is, renderer, type ); blk.getRendererInstance().setTemporaryRenderIcon( ExtraTextures.OreQuartzStone.getIcon() ); - super.renderInventory( blk, is, renderer ); + super.renderInventory( blk, is, renderer, type ); blk.getRendererInstance().setTemporaryRenderIcon( null ); } diff --git a/client/render/blocks/RenderQuartzTorch.java b/client/render/blocks/RenderQuartzTorch.java index 063a4c3d..06dc65b4 100644 --- a/client/render/blocks/RenderQuartzTorch.java +++ b/client/render/blocks/RenderQuartzTorch.java @@ -7,6 +7,7 @@ import net.minecraft.client.renderer.Tessellator; import net.minecraft.init.Blocks; import net.minecraft.item.ItemStack; import net.minecraft.world.IBlockAccess; +import net.minecraftforge.client.IItemRenderer.ItemRenderType; import net.minecraftforge.common.util.ForgeDirection; import appeng.api.util.IOrientable; import appeng.block.AEBaseBlock; @@ -21,7 +22,7 @@ public class RenderQuartzTorch extends BaseBlockRender } @Override - public void renderInventory(AEBaseBlock blk, ItemStack is, RenderBlocks renderer) + public void renderInventory(AEBaseBlock blk, ItemStack is, RenderBlocks renderer, ItemRenderType type) { Tessellator tess = Tessellator.instance; diff --git a/client/render/blocks/RenderSpatialPylon.java b/client/render/blocks/RenderSpatialPylon.java index 16d6d281..3eedf6d0 100644 --- a/client/render/blocks/RenderSpatialPylon.java +++ b/client/render/blocks/RenderSpatialPylon.java @@ -5,6 +5,7 @@ import net.minecraft.client.renderer.Tessellator; import net.minecraft.item.ItemStack; import net.minecraft.util.IIcon; import net.minecraft.world.IBlockAccess; +import net.minecraftforge.client.IItemRenderer.ItemRenderType; import net.minecraftforge.common.util.ForgeDirection; import appeng.block.AEBaseBlock; import appeng.client.render.BaseBlockRender; @@ -20,12 +21,12 @@ public class RenderSpatialPylon extends BaseBlockRender } @Override - public void renderInventory(AEBaseBlock block, ItemStack is, RenderBlocks renderer) + public void renderInventory(AEBaseBlock block, ItemStack is, RenderBlocks renderer, ItemRenderType type) { renderer.overrideBlockTexture = ExtraTextures.BlockSpatialPylon_dim.getIcon(); - super.renderInventory( block, is, renderer ); + super.renderInventory( block, is, renderer, type ); renderer.overrideBlockTexture = null; - super.renderInventory( block, is, renderer ); + super.renderInventory( block, is, renderer, type ); } @Override diff --git a/client/render/blocks/RenderTinyTNT.java b/client/render/blocks/RenderTinyTNT.java index bb8f1f8e..9cabc9d2 100644 --- a/client/render/blocks/RenderTinyTNT.java +++ b/client/render/blocks/RenderTinyTNT.java @@ -3,6 +3,7 @@ package appeng.client.render.blocks; import net.minecraft.client.renderer.RenderBlocks; import net.minecraft.item.ItemStack; import net.minecraft.world.IBlockAccess; +import net.minecraftforge.client.IItemRenderer.ItemRenderType; import appeng.block.AEBaseBlock; import appeng.client.render.BaseBlockRender; @@ -14,10 +15,10 @@ public class RenderTinyTNT extends BaseBlockRender } @Override - public void renderInventory(AEBaseBlock block, ItemStack is, RenderBlocks renderer) + public void renderInventory(AEBaseBlock block, ItemStack is, RenderBlocks renderer, ItemRenderType type) { renderer.setRenderBounds( 0.25f, 0.0f, 0.25f, 0.75f, 0.5f, 0.75f ); - super.renderInventory( block, is, renderer ); + super.renderInventory( block, is, renderer, type ); } @Override diff --git a/client/render/blocks/RendererCableBus.java b/client/render/blocks/RendererCableBus.java index 4760b7b8..e722beee 100644 --- a/client/render/blocks/RendererCableBus.java +++ b/client/render/blocks/RendererCableBus.java @@ -4,6 +4,7 @@ import net.minecraft.client.renderer.RenderBlocks; import net.minecraft.client.renderer.Tessellator; import net.minecraft.item.ItemStack; import net.minecraft.world.IBlockAccess; +import net.minecraftforge.client.IItemRenderer.ItemRenderType; import appeng.block.AEBaseBlock; import appeng.client.render.BaseBlockRender; import appeng.client.render.BusRenderer; @@ -18,7 +19,7 @@ public class RendererCableBus extends BaseBlockRender } @Override - public void renderInventory(AEBaseBlock blk, ItemStack is, RenderBlocks renderer) + public void renderInventory(AEBaseBlock blk, ItemStack is, RenderBlocks renderer, ItemRenderType type) { // nothin. } diff --git a/client/render/blocks/RendererSecurity.java b/client/render/blocks/RendererSecurity.java index 1803ba16..1fe3f339 100644 --- a/client/render/blocks/RendererSecurity.java +++ b/client/render/blocks/RendererSecurity.java @@ -7,6 +7,7 @@ import net.minecraft.client.renderer.Tessellator; import net.minecraft.item.ItemStack; import net.minecraft.util.IIcon; import net.minecraft.world.IBlockAccess; +import net.minecraftforge.client.IItemRenderer.ItemRenderType; import net.minecraftforge.common.util.ForgeDirection; import appeng.block.AEBaseBlock; import appeng.client.render.BaseBlockRender; @@ -21,7 +22,7 @@ public class RendererSecurity extends BaseBlockRender } @Override - public void renderInventory(AEBaseBlock block, ItemStack is, RenderBlocks renderer) + public void renderInventory(AEBaseBlock block, ItemStack is, RenderBlocks renderer, ItemRenderType type) { renderer.overrideBlockTexture = ExtraTextures.getMissing(); this.renderInvBlock( EnumSet.of( ForgeDirection.SOUTH ), block, is, Tessellator.instance, 0x000000, renderer ); @@ -30,7 +31,7 @@ public class RendererSecurity extends BaseBlockRender this.renderInvBlock( EnumSet.of( ForgeDirection.UP ), block, is, Tessellator.instance, 0xffffff, renderer ); renderer.overrideBlockTexture = null; - super.renderInventory( block, is, renderer ); + super.renderInventory( block, is, renderer, type ); } @Override diff --git a/client/render/model/ModelCompass.java b/client/render/model/ModelCompass.java new file mode 100644 index 00000000..18e07b48 --- /dev/null +++ b/client/render/model/ModelCompass.java @@ -0,0 +1,98 @@ +package appeng.client.render.model; + +import net.minecraft.client.model.ModelBase; +import net.minecraft.client.model.ModelRenderer; + +public class ModelCompass extends ModelBase +{ + + ModelRenderer Ring1; + ModelRenderer Ring2; + ModelRenderer Ring3; + ModelRenderer Ring4; + ModelRenderer Middle; + ModelRenderer Base; + + ModelRenderer Pointer; + + public ModelCompass() { + textureWidth = 16; + textureHeight = 8; + + Ring1 = new ModelRenderer( this, 0, 0 ); + Ring1.addBox( 0F, 0F, 0F, 4, 1, 1 ); + Ring1.setRotationPoint( -2F, 22F, 2F ); + Ring1.setTextureSize( 16, 8 ); + Ring1.mirror = true; + setRotation( Ring1, 0F, 0F, 0F ); + + Ring2 = new ModelRenderer( this, 0, 0 ); + Ring2.addBox( 0F, 0F, 0F, 1, 1, 4 ); + Ring2.setRotationPoint( -3F, 22F, -2F ); + Ring2.setTextureSize( 16, 8 ); + Ring2.mirror = true; + setRotation( Ring2, 0F, 0F, 0F ); + + Ring3 = new ModelRenderer( this, 0, 0 ); + Ring3.addBox( 0F, 0F, 0F, 4, 1, 1 ); + Ring3.setRotationPoint( -2F, 22F, -3F ); + Ring3.setTextureSize( 16, 8 ); + Ring3.mirror = true; + setRotation( Ring3, 0F, 0F, 0F ); + + Ring4 = new ModelRenderer( this, 0, 0 ); + Ring4.addBox( 0F, 0F, 0F, 1, 1, 4 ); + Ring4.setRotationPoint( 2F, 22F, -2F ); + Ring4.setTextureSize( 16, 8 ); + Ring4.mirror = true; + setRotation( Ring4, 0F, 0F, 0F ); + + Middle = new ModelRenderer( this, 0, 0 ); + Middle.addBox( 0F, 0F, 0F, 1, 1, 1 ); + Middle.setRotationPoint( -0.5333334F, 22F, -0.5333334F ); + Middle.setTextureSize( 16, 8 ); + Middle.mirror = true; + setRotation( Middle, 0F, 0F, 0F ); + + Pointer = new ModelRenderer( this, 0, 0 ); + Pointer.setTextureOffset( 0, 5 ); + Pointer.addBox( -0.5F, 0F, 0F, 1, 1, 2 ); + Pointer.setRotationPoint( 0.5F, 22.5F, 0.5F ); + Pointer.setTextureSize( 16, 8 ); + Pointer.mirror = true; + Pointer.offsetZ = -0.034f; + Pointer.offsetX = -0.034f; + setRotation( Pointer, 0F, 0F, 0F ); + + Base = new ModelRenderer( this, 0, 0 ); + Base.addBox( 0F, 0F, 0F, 4, 1, 4 ); + Base.setRotationPoint( -2F, 23F, -2F ); + Base.setTextureSize( 16, 8 ); + Base.mirror = true; + setRotation( Base, 0F, 0F, 0F ); + } + + private void setRotation(ModelRenderer model, float x, float y, float z) + { + model.rotateAngleX = x; + model.rotateAngleY = y; + model.rotateAngleZ = z; + } + + public void renderAll(float rad) + { + setRotation( Pointer, 0F, 0F, 0F ); + + Pointer.rotateAngleY = rad; + + Base.render( 0.0625F ); + Middle.render( 0.0625F ); + + Pointer.render( 0.0625F ); + + Ring1.render( 0.0625F ); + Ring2.render( 0.0625F ); + Ring3.render( 0.0625F ); + Ring4.render( 0.0625F ); + } +} diff --git a/core/AppEng.java b/core/AppEng.java index db2e5962..1e13bcf4 100644 --- a/core/AppEng.java +++ b/core/AppEng.java @@ -7,7 +7,7 @@ import appeng.core.crash.CrashInfo; import appeng.core.features.AEFeature; import appeng.core.sync.GuiBridge; import appeng.core.sync.network.NetworkHandler; -import appeng.helpers.TickHandler; +import appeng.hooks.TickHandler; import appeng.integration.IntegrationRegistry; import appeng.integration.IntegrationSide; import appeng.server.AECommand; diff --git a/core/Registration.java b/core/Registration.java index 38aa72ff..94dd6954 100644 --- a/core/Registration.java +++ b/core/Registration.java @@ -36,6 +36,7 @@ import appeng.block.misc.BlockInterface; import appeng.block.misc.BlockQuartzGrowthAccelerator; import appeng.block.misc.BlockQuartzTorch; import appeng.block.misc.BlockSecurity; +import appeng.block.misc.BlockSkyCompass; import appeng.block.misc.BlockTinyTNT; import appeng.block.misc.BlockVibrationChamber; import appeng.block.networking.BlockCableBus; @@ -78,11 +79,11 @@ import appeng.core.localization.PlayerMessages; import appeng.debug.BlockChunkloader; import appeng.debug.BlockItemGen; import appeng.debug.ToolDebugCard; +import appeng.debug.ToolMeteoritePlacer; import appeng.debug.ToolReplicatorCard; -import appeng.helpers.AETrading; -import appeng.helpers.PartPlacement; -import appeng.helpers.QuartzWorldGen; -import appeng.helpers.TickHandler; +import appeng.hooks.AETrading; +import appeng.hooks.QuartzWorldGen; +import appeng.hooks.TickHandler; import appeng.items.materials.ItemMaterial; import appeng.items.materials.MaterialType; import appeng.items.misc.ItemCrystalSeed; @@ -115,6 +116,7 @@ import appeng.me.cache.SecurityCache; import appeng.me.cache.SpatialPylonCache; import appeng.me.cache.TickManagerCache; import appeng.me.storage.AEExternalHandler; +import appeng.parts.PartPlacement; import appeng.recipes.AEItemResolver; import appeng.recipes.RecipeHandler; import appeng.recipes.Recipes.ShapedRecipe; @@ -249,6 +251,7 @@ public class Registration blocks.blockFluix = addFeature( BlockFluix.class ); blocks.blockSkyStone = addFeature( BlockSkyStone.class ); blocks.blockSkyChest = addFeature( BlockSkyChest.class ); + blocks.blockSkyCompass = addFeature( BlockSkyCompass.class ); blocks.blockQuartzGlass = addFeature( BlockQuartzGlass.class ); blocks.blockQuartzVibrantGlass = addFeature( BlockQuartzLamp.class ); @@ -340,6 +343,7 @@ public class Registration items.itemFacade = addFeature( ItemFacade.class ); items.itemCrystalSeed = addFeature( ItemCrystalSeed.class ); + addFeature( ToolMeteoritePlacer.class ); addFeature( ToolDebugCard.class ); addFeature( ToolReplicatorCard.class ); addFeature( BlockItemGen.class ); diff --git a/core/WorldSettings.java b/core/WorldSettings.java index a7f6d56b..2cfe167b 100644 --- a/core/WorldSettings.java +++ b/core/WorldSettings.java @@ -13,6 +13,7 @@ import net.minecraftforge.common.config.Property; import appeng.api.util.WorldCoord; import appeng.me.GridStorage; import appeng.me.GridStorageSearch; +import appeng.services.CompassService; public class WorldSettings extends Configuration { @@ -22,8 +23,17 @@ public class WorldSettings extends Configuration long lastGridStorage = 0; int lastPlayer = 0; - public WorldSettings(File f) { - super( f ); + private CompassService compass; + + File AEFolder; + + public WorldSettings(File aeFolder) { + super( new File( aeFolder.getPath() + File.separatorChar + "settings.cfg" ) ); + AEFolder = aeFolder; + + compass = new CompassService( AEFolder ); + (new Thread( compass, "AE Compass Service" )).start(); + try { lastGridStorage = Long.parseLong( get( "Counters", "lastGridStorage", 0 ).getString() ); @@ -36,11 +46,21 @@ public class WorldSettings extends Configuration } } + public CompassService getCompass() + { + return compass; + } + public static WorldSettings getInstance() { if ( instance == null ) { - File f = DimensionManager.getWorld( 0 ).getSaveHandler().getMapFileFromName( "AppEng" ); + File world = DimensionManager.getWorld( 0 ).getSaveHandler().getWorldDirectory(); + File f = new File( world.getPath() + File.separatorChar + "AE2" ); + + if ( !f.exists() || !f.isDirectory() ) + f.mkdir(); + instance = new WorldSettings( f ); } @@ -60,6 +80,7 @@ public class WorldSettings extends Configuration public void shutdown() { save(); + compass.kill(); instance = null; } @@ -181,4 +202,5 @@ public class WorldSettings extends Configuration return prop.getInt(); } } + } diff --git a/core/api/ApiPart.java b/core/api/ApiPart.java index 4a0385b7..a4074026 100644 --- a/core/api/ApiPart.java +++ b/core/api/ApiPart.java @@ -29,8 +29,8 @@ import appeng.api.parts.LayerBase; import appeng.client.render.BusRenderer; import appeng.core.AELog; import appeng.core.AppEng; -import appeng.helpers.PartPlacement; import appeng.integration.abstraction.IFMP; +import appeng.parts.PartPlacement; import appeng.tile.networking.TileCableBus; import appeng.util.Platform; diff --git a/core/sync/AppEngPacketHandlerBase.java b/core/sync/AppEngPacketHandlerBase.java index 1e518c66..3a13830d 100644 --- a/core/sync/AppEngPacketHandlerBase.java +++ b/core/sync/AppEngPacketHandlerBase.java @@ -8,6 +8,8 @@ import java.util.HashMap; import java.util.Map; import appeng.core.sync.packets.PacketClick; +import appeng.core.sync.packets.PacketCompassRequest; +import appeng.core.sync.packets.PacketCompassResponse; import appeng.core.sync.packets.PacketConfigButton; import appeng.core.sync.packets.PacketInventoryAction; import appeng.core.sync.packets.PacketLightning; @@ -28,6 +30,10 @@ public class AppEngPacketHandlerBase public enum PacketTypes { + PACKET_COMPASS_REQUEST(PacketCompassRequest.class), + + PACKET_COMPASS_RESPONSE(PacketCompassResponse.class), + PACKET_INVENTORY_ACTION(PacketInventoryAction.class), PACKET_ME_INVENTORY_UPDATE(PacketMEInventoryUpdate.class), diff --git a/core/sync/packets/PacketCompassRequest.java b/core/sync/packets/PacketCompassRequest.java new file mode 100644 index 00000000..da39036d --- /dev/null +++ b/core/sync/packets/PacketCompassRequest.java @@ -0,0 +1,64 @@ +package appeng.core.sync.packets; + +import io.netty.buffer.ByteBuf; +import io.netty.buffer.Unpooled; + +import java.io.IOException; + +import net.minecraft.entity.player.EntityPlayer; +import net.minecraft.entity.player.EntityPlayerMP; +import appeng.api.util.DimensionalCoord; +import appeng.core.AELog; +import appeng.core.WorldSettings; +import appeng.core.sync.AppEngPacket; +import appeng.core.sync.network.INetworkInfo; +import appeng.core.sync.network.NetworkHandler; +import appeng.services.helpers.ICompassCallback; + +public class PacketCompassRequest extends AppEngPacket implements ICompassCallback +{ + + final public long attunement; + final public int cx, cz, cdy; + + EntityPlayer talkBackTo; + + // automatic. + public PacketCompassRequest(ByteBuf stream) throws IOException { + attunement = stream.readLong(); + cx = stream.readInt(); + cz = stream.readInt(); + cdy = stream.readInt(); + } + + @Override + public void calculatedDirection(boolean hasResult, boolean spin, double radians) + { + NetworkHandler.instance.sendTo( new PacketCompassResponse( this, hasResult, spin, radians ), (EntityPlayerMP) talkBackTo ); + } + + @Override + public void serverPacketData(INetworkInfo manager, AppEngPacket packet, EntityPlayer player) + { + AELog.info( "PacketCompassRequest.serverPacketData" ); + talkBackTo = player; + + DimensionalCoord loc = new DimensionalCoord( player.worldObj, this.cx << 4, this.cdy << 5, this.cz << 4 ); + WorldSettings.getInstance().getCompass().getCompassDirection( loc, this ); + } + + // api + public PacketCompassRequest(long attunement, int cx, int cz, int cdy) throws IOException { + + ByteBuf data = Unpooled.buffer(); + + data.writeInt( getPacketID() ); + data.writeLong( this.attunement = attunement ); + data.writeInt( this.cx = cx ); + data.writeInt( this.cz = cz ); + data.writeInt( this.cdy = cdy ); + + configureWrite( data ); + + } +} diff --git a/core/sync/packets/PacketCompassResponse.java b/core/sync/packets/PacketCompassResponse.java new file mode 100644 index 00000000..4f4c544d --- /dev/null +++ b/core/sync/packets/PacketCompassResponse.java @@ -0,0 +1,58 @@ +package appeng.core.sync.packets; + +import io.netty.buffer.ByteBuf; +import io.netty.buffer.Unpooled; + +import java.io.IOException; + +import net.minecraft.entity.player.EntityPlayer; +import appeng.core.AELog; +import appeng.core.sync.AppEngPacket; +import appeng.core.sync.network.INetworkInfo; +import appeng.hooks.CompassManager; +import appeng.hooks.CompassResult; + +public class PacketCompassResponse extends AppEngPacket +{ + + final public long attunement; + final public int cx, cz, cdy; + + public CompassResult cr; + + // automatic. + public PacketCompassResponse(ByteBuf stream) throws IOException { + attunement = stream.readLong(); + cx = stream.readInt(); + cz = stream.readInt(); + cdy = stream.readInt(); + + cr = new CompassResult( stream.readBoolean(), stream.readBoolean(), stream.readDouble() ); + } + + @Override + public void clientPacketData(INetworkInfo network, AppEngPacket packet, EntityPlayer player) + { + AELog.info( "PacketCompassResponse.clientPacketData" ); + CompassManager.instance.postResult( attunement, cx << 4, cdy << 5, cz << 4, cr ); + } + + // api + public PacketCompassResponse(PacketCompassRequest req, boolean hasResult, boolean spin, double radians) { + + ByteBuf data = Unpooled.buffer(); + + data.writeInt( getPacketID() ); + data.writeLong( this.attunement = req.attunement ); + data.writeInt( this.cx = req.cx ); + data.writeInt( this.cz = req.cz ); + data.writeInt( this.cdy = req.cdy ); + + data.writeBoolean( hasResult ); + data.writeBoolean( spin ); + data.writeDouble( radians ); + + configureWrite( data ); + + } +} \ No newline at end of file diff --git a/core/sync/packets/PacketPartPlacement.java b/core/sync/packets/PacketPartPlacement.java index 209c2e5c..76b2160b 100644 --- a/core/sync/packets/PacketPartPlacement.java +++ b/core/sync/packets/PacketPartPlacement.java @@ -9,7 +9,7 @@ import net.minecraft.entity.player.EntityPlayer; import net.minecraft.entity.player.EntityPlayerMP; import appeng.core.sync.AppEngPacket; import appeng.core.sync.network.INetworkInfo; -import appeng.helpers.PartPlacement; +import appeng.parts.PartPlacement; public class PacketPartPlacement extends AppEngPacket { diff --git a/debug/ToolDebugCard.java b/debug/ToolDebugCard.java index 2a0b188e..e7777b86 100644 --- a/debug/ToolDebugCard.java +++ b/debug/ToolDebugCard.java @@ -17,7 +17,7 @@ import appeng.api.networking.ticking.ITickManager; import appeng.api.parts.IPart; import appeng.api.parts.IPartHost; import appeng.core.features.AEFeature; -import appeng.helpers.TickHandler; +import appeng.hooks.TickHandler; import appeng.items.AEBaseItem; import appeng.me.Grid; import appeng.me.GridNode; diff --git a/debug/ToolMeteoritePlacer.java b/debug/ToolMeteoritePlacer.java new file mode 100644 index 00000000..2e9fc8cd --- /dev/null +++ b/debug/ToolMeteoritePlacer.java @@ -0,0 +1,37 @@ +package appeng.debug; + +import java.util.EnumSet; + +import net.minecraft.entity.player.EntityPlayer; +import net.minecraft.item.ItemStack; +import net.minecraft.util.ChatComponentText; +import net.minecraft.world.World; +import appeng.core.features.AEFeature; +import appeng.helpers.MeteoritePlacer; +import appeng.items.AEBaseItem; +import appeng.util.Platform; + +public class ToolMeteoritePlacer extends AEBaseItem +{ + + public ToolMeteoritePlacer() { + super( ToolMeteoritePlacer.class ); + setfeature( EnumSet.of( AEFeature.Debug, AEFeature.Creative ) ); + } + + @Override + public boolean onItemUseFirst(ItemStack stack, EntityPlayer player, World world, int x, int y, int z, int side, float hitX, float hitY, float hitZ) + { + if ( Platform.isClient() ) + return false; + + MeteoritePlacer mp = new MeteoritePlacer(); + boolean worked = mp.spawnMeteorite( world, x, y, z ); + + if ( !worked ) + player.addChatMessage( new ChatComponentText( "Un-suiteable Location." ) ); + + return true; + } + +} diff --git a/helpers/AENoHandler.java b/helpers/AENoHandler.java deleted file mode 100644 index 714f0bf9..00000000 --- a/helpers/AENoHandler.java +++ /dev/null @@ -1,8 +0,0 @@ -package appeng.helpers; - -public class AENoHandler extends Exception -{ - - private static final long serialVersionUID = 7995805326136526631L; - -} diff --git a/helpers/MeteoritePlacer.java b/helpers/MeteoritePlacer.java new file mode 100644 index 00000000..dda41399 --- /dev/null +++ b/helpers/MeteoritePlacer.java @@ -0,0 +1,361 @@ +package appeng.helpers; + +import java.util.HashSet; + +import net.minecraft.block.Block; +import net.minecraft.entity.Entity; +import net.minecraft.entity.item.EntityItem; +import net.minecraft.init.Blocks; +import net.minecraft.util.AxisAlignedBB; +import net.minecraft.world.World; +import appeng.api.AEApi; +import appeng.util.Platform; + +public class MeteoritePlacer +{ + + private class Fallout + { + + public int adjustCrator() + { + return 0; + } + + public void getRandomFall(World w, int x, int y, int z) + { + double a = Math.random(); + if ( a > 0.9 ) + put( w, x, y, z, Blocks.stone ); + else if ( a > 0.8 ) + put( w, x, y, z, Blocks.cobblestone ); + else if ( a > 0.7 ) + put( w, x, y, z, Blocks.dirt ); + else if ( a > 0.7 ) + put( w, x, y, z, Blocks.gravel ); + } + + public void getRandomInset(World w, int x, int y, int z) + { + double a = Math.random(); + if ( a > 0.9 ) + put( w, x, y, z, Blocks.cobblestone ); + else if ( a > 0.8 ) + put( w, x, y, z, Blocks.stone ); + else if ( a > 0.7 ) + put( w, x, y, z, Blocks.dirt ); + else if ( a > 0.6 ) + put( w, x, y, z, skystone ); + else if ( a > 0.5 ) + put( w, x, y, z, Blocks.gravel ); + else if ( a > 0.5 ) + put( w, x, y, z, Platform.air ); + } + + }; + + private class FalloutCopy extends Fallout + { + + Block blk; + int meta; + + public FalloutCopy(World w, int x, int y, int z) { + blk = w.getBlock( x, y, z ); + meta = w.getBlockMetadata( x, y, z ); + } + + public void getOther(World w, int x, int y, int z, double a) + { + + } + + public void getRandomFall(World w, int x, int y, int z) + { + double a = Math.random(); + if ( a > 0.9 ) + put( w, x, y, z, blk, meta ); + else + getOther( w, x, y, z, a ); + } + + public void getRandomInset(World w, int x, int y, int z) + { + double a = Math.random(); + if ( a > 0.9 ) + put( w, x, y, z, blk, meta ); + else if ( a > 0.8 ) + put( w, x, y, z, Platform.air ); + else + getOther( w, x, y, z, a - 0.1 ); + } + }; + + private class FalloutSand extends FalloutCopy + { + + public FalloutSand(World w, int x, int y, int z) { + super( w, x, y, z ); + } + + public int adjustCrator() + { + return 2; + } + + public void getOther(World w, int x, int y, int z, double a) + { + if ( a > 0.8 ) + put( w, x, y, z, Blocks.glass ); + } + + }; + + int minBLocks = 200; + HashSet validSpawn = new HashSet(); + HashSet invalidSpawn = new HashSet(); + + Fallout type = new Fallout(); + + Block skystone = AEApi.instance().blocks().blockSkyStone.block(); + + double real_sizeOfMetorite = (Math.random() * 6.0) + 2; + double real_crator = real_sizeOfMetorite * 2 + 5; + + double sizeOfMetorite = real_sizeOfMetorite * real_sizeOfMetorite; + double crator = real_crator * real_crator; + + public MeteoritePlacer() { + Block skystone = AEApi.instance().blocks().blockSkyStone.block(); + + validSpawn.add( Blocks.stone ); + validSpawn.add( Blocks.cobblestone ); + validSpawn.add( Blocks.grass ); + validSpawn.add( Blocks.sand ); + validSpawn.add( Blocks.dirt ); + validSpawn.add( Blocks.gravel ); + validSpawn.add( Blocks.netherrack ); + validSpawn.add( Blocks.iron_ore ); + validSpawn.add( Blocks.gold_ore ); + validSpawn.add( Blocks.diamond_ore ); + validSpawn.add( Blocks.redstone_ore ); + validSpawn.add( Blocks.hardened_clay ); + + invalidSpawn.add( skystone ); + invalidSpawn.add( Blocks.planks ); + invalidSpawn.add( Blocks.iron_door ); + invalidSpawn.add( Blocks.iron_bars ); + invalidSpawn.add( Blocks.wooden_door ); + invalidSpawn.add( Blocks.brick_block ); + invalidSpawn.add( Blocks.clay ); + invalidSpawn.add( Blocks.water ); + invalidSpawn.add( Blocks.log ); + invalidSpawn.add( Blocks.log2 ); + } + + public boolean spawnMeteorite(World w, int x, int y, int z) + { + int validBlocks = 0; + + if ( w.provider.hasNoSky ) + return false; + + Block blk = w.getBlock( x, y, z ); + if ( !validSpawn.contains( blk ) ) + return false; // must spawn on a valid block.. + + if ( blk == Blocks.sand ) + type = new FalloutSand( w, x, y, z ); + else if ( blk == Blocks.hardened_clay ) + type = new FalloutCopy( w, x, y, z ); + + int realValidBlocks = 0; + + for (int i = x - 6; i < x + 6; i++) + for (int j = y - 6; j < y + 6; j++) + for (int k = z - 6; k < z + 6; k++) + { + blk = w.getBlock( i, j, k ); + if ( validSpawn.contains( blk ) ) + realValidBlocks++; + } + + for (int i = x - 15; i < x + 15; i++) + for (int j = y - 15; j < y + 15; j++) + for (int k = z - 15; k < z + 15; k++) + { + blk = w.getBlock( i, j, k ); + if ( invalidSpawn.contains( blk ) ) + return false; + if ( validSpawn.contains( blk ) ) + validBlocks++; + } + + if ( validBlocks > minBLocks && realValidBlocks > 80 ) + { + // we can spawn here! + + int skyMode = 0; + + for (int i = x - 15; i < x + 15; i++) + for (int j = y - 15; j < y + 11; j++) + for (int k = z - 15; k < z + 15; k++) + { + if ( w.canBlockSeeTheSky( i, j, k ) ) + skyMode++; + } + + boolean solid = true; + for (int j = y - 15; j < y - 1; j++) + { + if ( w.getBlock( x, j, z ) == Platform.air ) + solid = false; + } + + if ( !solid ) + skyMode = 0; + + // creator + if ( skyMode > 10 ) + placeCrator( w, x, y, z ); + + placeMetor( w, x, y, z ); + + // collapse blocks... + if ( skyMode > 3 ) + Decay( w, x, y, z ); + + return true; + } + return false; + } + + private void placeCrator(World w, int x, int y, int z) + { + boolean lava = Math.random() > 0.9; + + for (int i = x - 30; i < x + 30; i++) + for (int j = y - 5; j < y + 40; j++) + for (int k = z - 30; k < z + 30; k++) + { + double dx = i - x; + double dz = k - z; + double h = y - real_sizeOfMetorite + 1 + type.adjustCrator(); + + double distanceFrom = dx * dx + dz * dz; + + if ( j > h + distanceFrom * 0.02 ) + { + if ( lava && j < y && w.getBlock( x, y - 1, z ).isBlockSolid( w, i, j, k, 0 ) ) + { + if ( j > h + distanceFrom * 0.02 ) + put( w, i, j, k, Blocks.lava ); + } + else + put( w, i, j, k, Platform.air ); + } + } + + for (Object o : w.getEntitiesWithinAABB( EntityItem.class, AxisAlignedBB.getBoundingBox( x - 30, y - 5, z - 30, x + 30, y + 30, z + 30 ) )) + { + Entity e = (Entity) o; + e.setDead(); + } + } + + private void placeMetor(World w, int x, int y, int z) + { + // spawn metor + for (int i = x - 8; i < x + 8; i++) + for (int j = y - 8; j < y + 8; j++) + for (int k = z - 8; k < z + 8; k++) + { + double dx = i - x; + double dy = j - y; + double dz = k - z; + + if ( dx * dx * 0.7 + dy * dy * (j > y ? 1.4 : 0.8) + dz * dz * 0.7 < sizeOfMetorite ) + put( w, i, j, k, skystone ); + } + } + + private void Decay(World w, int x, int y, int z) + { + + for (int i = x - 30; i < x + 30; i++) + for (int j = y - 9; j < y + 30; j++) + for (int k = z - 30; k < z + 30; k++) + { + Block blk = w.getBlock( i, j, k ); + if ( blk == Blocks.lava ) + continue; + + if ( blk.isReplaceable( w, i, j, k ) ) + { + blk = Platform.air; + Block blk_b = w.getBlock( i, j + 1, k ); + + if ( blk_b != blk ) + { + int meta_b = w.getBlockMetadata( i, j + 1, k ); + + w.setBlock( i, j, k, blk_b, meta_b, 3 ); + w.setBlock( i, j + 1, k, blk ); + } + else + { + double dx = i - x; + double dy = j - y; + double dz = k - z; + double dist = dx * dx + dy * dy + dz * dz; + + Block xf = w.getBlock( i, j - 1, k ); + + double height = crator * 0.1 - Math.abs( dist - crator * 1.7 ); + + if ( xf != blk && height > 0 && Math.random() > 0.5 ) + { + type.getRandomFall( w, i, j, k ); + } + } + } + else + { + // decay. + Block blk_b = w.getBlock( i, j + 1, k ); + if ( blk_b == Platform.air ) + { + if ( Math.random() > 0.4 ) + { + double dx = i - x; + double dy = j - y; + double dz = k - z; + + if ( dx * dx + dy * dy + dz * dz < crator * 1.6 ) + { + type.getRandomInset( w, i, j, k ); + } + + } + } + } + + } + } + + private void put(World w, int i, int j, int k, Block skystone) + { + if ( w.getBlock( i, j, k ) == Blocks.bedrock ) + return; + + w.setBlock( i, j, k, skystone ); + } + + private void put(World w, int i, int j, int k, Block skystone, int meta) + { + if ( w.getBlock( i, j, k ) == Blocks.bedrock ) + return; + + w.setBlock( i, j, k, skystone, meta, 3 ); + } +} diff --git a/helpers/AETrading.java b/hooks/AETrading.java similarity index 90% rename from helpers/AETrading.java rename to hooks/AETrading.java index 1d25e997..2f3da4c8 100644 --- a/helpers/AETrading.java +++ b/hooks/AETrading.java @@ -1,85 +1,85 @@ -package appeng.helpers; - -import java.util.Random; - -import net.minecraft.entity.passive.EntityVillager; -import net.minecraft.init.Items; -import net.minecraft.item.ItemStack; -import net.minecraft.village.MerchantRecipe; -import net.minecraft.village.MerchantRecipeList; -import appeng.api.AEApi; -import cpw.mods.fml.common.registry.VillagerRegistry.IVillageTradeHandler; - -public class AETrading implements IVillageTradeHandler -{ - - private void addToList(MerchantRecipeList l, ItemStack a, ItemStack b) - { - if ( a.stackSize < 1 ) - a.stackSize = 1; - if ( b.stackSize < 1 ) - b.stackSize = 1; - - if ( a.stackSize > a.getMaxStackSize() ) - a.stackSize = a.getMaxStackSize(); - if ( b.stackSize > b.getMaxStackSize() ) - b.stackSize = b.getMaxStackSize(); - - l.add( new MerchantRecipe( a, b ) ); - } - - private void addTrade(MerchantRecipeList list, ItemStack a, ItemStack b, Random rand, int convertion_Variance) - { - // Sell - ItemStack From = a.copy(); - ItemStack To = b.copy(); - - From.stackSize = 1 + (Math.abs( rand.nextInt() ) % (1 + convertion_Variance)); - To.stackSize = 1; - - addToList( list, From, To ); - } - - private void addMerchent(MerchantRecipeList list, ItemStack item, int emera, Random rand, int greed) - { - // Sell - ItemStack From = item.copy(); - ItemStack To = new ItemStack( Items.emerald ); - - int multiplier = (Math.abs( rand.nextInt() ) % 6); - emera += (Math.abs( rand.nextInt() ) % greed) - multiplier; - int mood = rand.nextInt() % 2; - - From.stackSize = multiplier + mood; - To.stackSize = multiplier * emera - mood; - - if ( To.stackSize < 0 ) - { - From.stackSize -= To.stackSize; - To.stackSize -= To.stackSize; - } - - addToList( list, From, To ); - - // Buy - ItemStack reverseTo = From.copy(); - ItemStack reverseFrom = To.copy(); - - reverseFrom.stackSize = (int) (reverseFrom.stackSize * (rand.nextFloat() * 3.0f + 1.0f)); - reverseTo.stackSize = reverseTo.stackSize; - - addToList( list, reverseFrom, reverseTo ); - } - - @Override - public void manipulateTradesForVillager(EntityVillager villager, MerchantRecipeList recipeList, Random random) - { - addMerchent( recipeList, AEApi.instance().materials().materialSilicon.stack( 1 ), 1, random, 1 ); - addMerchent( recipeList, AEApi.instance().materials().materialCertusQuartzCrystal.stack( 1 ), 2, random, 3 ); - addMerchent( recipeList, AEApi.instance().materials().materialCertusQuartzDust.stack( 1 ), 1, random, 2 ); - - addTrade( recipeList, AEApi.instance().materials().materialCertusQuartzDust.stack( 1 ), - AEApi.instance().materials().materialCertusQuartzCrystal.stack( 1 ), random, 1 ); - } - -} +package appeng.hooks; + +import java.util.Random; + +import net.minecraft.entity.passive.EntityVillager; +import net.minecraft.init.Items; +import net.minecraft.item.ItemStack; +import net.minecraft.village.MerchantRecipe; +import net.minecraft.village.MerchantRecipeList; +import appeng.api.AEApi; +import cpw.mods.fml.common.registry.VillagerRegistry.IVillageTradeHandler; + +public class AETrading implements IVillageTradeHandler +{ + + private void addToList(MerchantRecipeList l, ItemStack a, ItemStack b) + { + if ( a.stackSize < 1 ) + a.stackSize = 1; + if ( b.stackSize < 1 ) + b.stackSize = 1; + + if ( a.stackSize > a.getMaxStackSize() ) + a.stackSize = a.getMaxStackSize(); + if ( b.stackSize > b.getMaxStackSize() ) + b.stackSize = b.getMaxStackSize(); + + l.add( new MerchantRecipe( a, b ) ); + } + + private void addTrade(MerchantRecipeList list, ItemStack a, ItemStack b, Random rand, int convertion_Variance) + { + // Sell + ItemStack From = a.copy(); + ItemStack To = b.copy(); + + From.stackSize = 1 + (Math.abs( rand.nextInt() ) % (1 + convertion_Variance)); + To.stackSize = 1; + + addToList( list, From, To ); + } + + private void addMerchent(MerchantRecipeList list, ItemStack item, int emera, Random rand, int greed) + { + // Sell + ItemStack From = item.copy(); + ItemStack To = new ItemStack( Items.emerald ); + + int multiplier = (Math.abs( rand.nextInt() ) % 6); + emera += (Math.abs( rand.nextInt() ) % greed) - multiplier; + int mood = rand.nextInt() % 2; + + From.stackSize = multiplier + mood; + To.stackSize = multiplier * emera - mood; + + if ( To.stackSize < 0 ) + { + From.stackSize -= To.stackSize; + To.stackSize -= To.stackSize; + } + + addToList( list, From, To ); + + // Buy + ItemStack reverseTo = From.copy(); + ItemStack reverseFrom = To.copy(); + + reverseFrom.stackSize = (int) (reverseFrom.stackSize * (rand.nextFloat() * 3.0f + 1.0f)); + reverseTo.stackSize = reverseTo.stackSize; + + addToList( list, reverseFrom, reverseTo ); + } + + @Override + public void manipulateTradesForVillager(EntityVillager villager, MerchantRecipeList recipeList, Random random) + { + addMerchent( recipeList, AEApi.instance().materials().materialSilicon.stack( 1 ), 1, random, 2 ); + addMerchent( recipeList, AEApi.instance().materials().materialCertusQuartzCrystal.stack( 1 ), 2, random, 4 ); + addMerchent( recipeList, AEApi.instance().materials().materialCertusQuartzDust.stack( 1 ), 1, random, 3 ); + + addTrade( recipeList, AEApi.instance().materials().materialCertusQuartzDust.stack( 1 ), + AEApi.instance().materials().materialCertusQuartzCrystal.stack( 1 ), random, 2 ); + } + +} diff --git a/hooks/CompassManager.java b/hooks/CompassManager.java new file mode 100644 index 00000000..8da588a6 --- /dev/null +++ b/hooks/CompassManager.java @@ -0,0 +1,104 @@ +package appeng.hooks; + +import java.io.IOException; +import java.util.HashMap; +import java.util.Iterator; + +import appeng.core.AELog; +import appeng.core.sync.network.NetworkHandler; +import appeng.core.sync.packets.PacketCompassRequest; + +public class CompassManager +{ + + public static CompassManager instance = new CompassManager(); + + class CompassReq + { + + final int hash; + + final long attunement; + final int cx, cdy, cz; + + public CompassReq(long attunement, int x, int y, int z) { + this.attunement = attunement; + cx = x >> 4; + cdy = y >> 5; + cz = z >> 4; + hash = ((Integer) cx).hashCode() ^ ((Integer) cdy).hashCode() ^ ((Integer) cz).hashCode() ^ ((Long) attunement).hashCode(); + } + + @Override + public int hashCode() + { + return hash; + } + + @Override + public boolean equals(Object obj) + { + CompassReq b = (CompassReq) obj; + return attunement == b.attunement && cx == b.cx && cdy == b.cdy && cz == b.cz; + } + + } + + HashMap reqs = new HashMap(); + + public void postResult(long attunement, int x, int y, int z, CompassResult res) + { + AELog.info( "CompassManager.postResult" ); + CompassReq r = new CompassReq( attunement, x, y, z ); + reqs.put( r, res ); + } + + public CompassResult getCompassDirection(long attunement, int x, int y, int z) + { + long now = System.currentTimeMillis(); + + Iterator i = reqs.values().iterator(); + while (i.hasNext()) + { + CompassResult res = i.next(); + long diff = now - res.time; + if ( diff > 20000 ) + i.remove(); + } + + CompassReq r = new CompassReq( attunement, x, y, z ); + CompassResult res = reqs.get( r ); + + if ( res == null ) + { + res = new CompassResult( false, true, 0 ); + reqs.put( r, res ); + requestUpdate( r ); + } + else if ( now - res.time > 1000 * 3 ) + { + if ( !res.requested ) + { + res.requested = true; + requestUpdate( r ); + } + } + + return res; + } + + private void requestUpdate(CompassReq r) + { + AELog.info( "CompassManager.requestUpdate" ); + + try + { + NetworkHandler.instance.sendToServer( new PacketCompassRequest( r.attunement, r.cx, r.cz, r.cdy ) ); + } + catch (IOException e) + { + AELog.error( e ); + } + } + +} diff --git a/hooks/CompassResult.java b/hooks/CompassResult.java new file mode 100644 index 00000000..1fef881e --- /dev/null +++ b/hooks/CompassResult.java @@ -0,0 +1,20 @@ +package appeng.hooks; + +public class CompassResult +{ + + public final boolean hasResult; + public final boolean spin; + public final double rad; + public final long time; + + public boolean requested = false; + + public CompassResult(boolean hasResult, boolean spin, double rad) { + this.hasResult = hasResult; + this.spin = spin; + this.rad = rad; + this.time = System.currentTimeMillis(); + } + +} diff --git a/helpers/DispenserBehaviorTinyTNT.java b/hooks/DispenserBehaviorTinyTNT.java similarity index 97% rename from helpers/DispenserBehaviorTinyTNT.java rename to hooks/DispenserBehaviorTinyTNT.java index 15377172..80172afa 100644 --- a/helpers/DispenserBehaviorTinyTNT.java +++ b/hooks/DispenserBehaviorTinyTNT.java @@ -1,4 +1,4 @@ -package appeng.helpers; +package appeng.hooks; import net.minecraft.block.BlockDispenser; import net.minecraft.dispenser.BehaviorDefaultDispenseItem; diff --git a/helpers/DispenserEntropyManipulator.java b/hooks/DispenserEntropyManipulator.java similarity index 98% rename from helpers/DispenserEntropyManipulator.java rename to hooks/DispenserEntropyManipulator.java index afdb528e..d2bfe207 100644 --- a/helpers/DispenserEntropyManipulator.java +++ b/hooks/DispenserEntropyManipulator.java @@ -1,4 +1,4 @@ -package appeng.helpers; +package appeng.hooks; import net.minecraft.block.BlockDispenser; import net.minecraft.dispenser.BehaviorDefaultDispenseItem; diff --git a/helpers/DispenserMatterCannon.java b/hooks/DispenserMatterCannon.java similarity index 98% rename from helpers/DispenserMatterCannon.java rename to hooks/DispenserMatterCannon.java index 06c61268..d4f748f7 100644 --- a/helpers/DispenserMatterCannon.java +++ b/hooks/DispenserMatterCannon.java @@ -1,4 +1,4 @@ -package appeng.helpers; +package appeng.hooks; import net.minecraft.block.BlockDispenser; import net.minecraft.dispenser.BehaviorDefaultDispenseItem; diff --git a/helpers/QuartzWorldGen.java b/hooks/QuartzWorldGen.java similarity index 95% rename from helpers/QuartzWorldGen.java rename to hooks/QuartzWorldGen.java index 240f98e4..b27d7341 100644 --- a/helpers/QuartzWorldGen.java +++ b/hooks/QuartzWorldGen.java @@ -1,54 +1,54 @@ -package appeng.helpers; - -import java.util.Random; - -import net.minecraft.block.Block; -import net.minecraft.init.Blocks; -import net.minecraft.world.World; -import net.minecraft.world.chunk.IChunkProvider; -import net.minecraft.world.gen.feature.WorldGenMinable; -import appeng.api.AEApi; -import appeng.core.AEConfig; -import cpw.mods.fml.common.IWorldGenerator; - -final public class QuartzWorldGen implements IWorldGenerator -{ - - final WorldGenMinable oreNormal; - final WorldGenMinable oreCharged; - - public QuartzWorldGen() { - Block normal = AEApi.instance().blocks().blockQuartzOre.block(); - Block charged = AEApi.instance().blocks().blockQuartzOreCharged.block(); - - if ( normal != null && charged != null ) - { - oreNormal = new WorldGenMinable( normal, 0, AEConfig.instance.oresPerCluster, Blocks.stone ); - oreCharged = new WorldGenMinable( charged, 0, AEConfig.instance.oresPerCluster, Blocks.stone ); - } - else - oreNormal = oreCharged = null; - }; - - @Override - public void generate(Random r, int chunkX, int chunkZ, World w, IChunkProvider chunkGenerator, IChunkProvider chunkProvider) - { - int sealevel = w.provider.getAverageGroundLevel() + 1; - - if ( oreNormal == null || oreCharged == null ) - return; - - double oreDepthMultiplier = 15 * sealevel / 64; - int scale = (int) Math.round( r.nextGaussian() * Math.sqrt( oreDepthMultiplier ) + oreDepthMultiplier ); - - for (int x = 0; x < (r.nextBoolean() ? scale * 2 : scale) / 2; ++x) - { - WorldGenMinable whichOre = r.nextFloat() > 0.92 ? oreCharged : oreNormal; - int a = chunkX * 16 + r.nextInt( 22 ); - int b = r.nextInt( 40 * sealevel / 64 ) + r.nextInt( 22 * sealevel / 64 ) + 12 * sealevel / 64; - int c = chunkZ * 16 + r.nextInt( 22 ); - whichOre.generate( w, r, a, b, c ); - } - - } -} +package appeng.hooks; + +import java.util.Random; + +import net.minecraft.block.Block; +import net.minecraft.init.Blocks; +import net.minecraft.world.World; +import net.minecraft.world.chunk.IChunkProvider; +import net.minecraft.world.gen.feature.WorldGenMinable; +import appeng.api.AEApi; +import appeng.core.AEConfig; +import cpw.mods.fml.common.IWorldGenerator; + +final public class QuartzWorldGen implements IWorldGenerator +{ + + final WorldGenMinable oreNormal; + final WorldGenMinable oreCharged; + + public QuartzWorldGen() { + Block normal = AEApi.instance().blocks().blockQuartzOre.block(); + Block charged = AEApi.instance().blocks().blockQuartzOreCharged.block(); + + if ( normal != null && charged != null ) + { + oreNormal = new WorldGenMinable( normal, 0, AEConfig.instance.oresPerCluster, Blocks.stone ); + oreCharged = new WorldGenMinable( charged, 0, AEConfig.instance.oresPerCluster, Blocks.stone ); + } + else + oreNormal = oreCharged = null; + }; + + @Override + public void generate(Random r, int chunkX, int chunkZ, World w, IChunkProvider chunkGenerator, IChunkProvider chunkProvider) + { + int sealevel = w.provider.getAverageGroundLevel() + 1; + + if ( oreNormal == null || oreCharged == null ) + return; + + double oreDepthMultiplier = 15 * sealevel / 64; + int scale = (int) Math.round( r.nextGaussian() * Math.sqrt( oreDepthMultiplier ) + oreDepthMultiplier ); + + for (int x = 0; x < (r.nextBoolean() ? scale * 2 : scale) / 2; ++x) + { + WorldGenMinable whichOre = r.nextFloat() > 0.92 ? oreCharged : oreNormal; + int a = chunkX * 16 + r.nextInt( 22 ); + int b = r.nextInt( 40 * sealevel / 64 ) + r.nextInt( 22 * sealevel / 64 ) + 12 * sealevel / 64; + int c = chunkZ * 16 + r.nextInt( 22 ); + whichOre.generate( w, r, a, b, c ); + } + + } +} diff --git a/helpers/TickHandler.java b/hooks/TickHandler.java similarity index 93% rename from helpers/TickHandler.java rename to hooks/TickHandler.java index ebf7bab7..47f99774 100644 --- a/helpers/TickHandler.java +++ b/hooks/TickHandler.java @@ -1,136 +1,136 @@ -package appeng.helpers; - -import java.util.Collection; -import java.util.LinkedList; -import java.util.Queue; -import java.util.concurrent.Callable; - -import net.minecraftforge.event.world.WorldEvent; -import appeng.api.networking.IGridNode; -import appeng.core.AELog; -import appeng.me.Grid; -import appeng.me.NetworkList; -import appeng.tile.AEBaseTile; -import appeng.util.Platform; -import cpw.mods.fml.common.eventhandler.SubscribeEvent; -import cpw.mods.fml.common.gameevent.TickEvent; -import cpw.mods.fml.common.gameevent.TickEvent.Type; - -public class TickHandler -{ - - class HandlerRep - { - - public Queue tiles = new LinkedList(); - - public Collection networks = new NetworkList(); - - public void clear() - { - tiles = new LinkedList(); - networks = new NetworkList(); - } - - }; - - final public static TickHandler instance = new TickHandler(); - - final private Queue callQueue = new LinkedList(); - - final private HandlerRep server = new HandlerRep(); - final private HandlerRep client = new HandlerRep(); - - HandlerRep getRepo() - { - if ( Platform.isServer() ) - return server; - return client; - } - - public void addCallable(Callable c) - { - callQueue.add( c ); - } - - public void addInit(AEBaseTile tile) - { - getRepo().tiles.add( tile ); - } - - public void addNetwork(Grid grid) - { - if ( Platform.isServer() ) - getRepo().networks.add( grid ); - } - - public void removeNetwork(Grid grid) - { - if ( Platform.isServer() ) - getRepo().networks.remove( grid ); - } - - public Iterable getGridList() - { - return getRepo().networks; - } - - public void shutdown() - { - getRepo().clear(); - } - - @SubscribeEvent - public void unloadWorld(WorldEvent.Unload ev) - { - if ( Platform.isServer() ) - { - LinkedList toDestroy = new LinkedList(); - - for (Grid g : getRepo().networks) - { - for (IGridNode n : g.getNodes()) - { - if ( n.getWorld() == ev.world ) - toDestroy.add( n ); - } - } - - for (IGridNode n : toDestroy) - n.destroy(); - } - } - - @SubscribeEvent - public void onTick(TickEvent ev) - { - if ( ev.type == Type.SERVER ) - { - HandlerRep repo = getRepo(); - while (!repo.tiles.isEmpty()) - { - AEBaseTile bt = repo.tiles.poll(); - bt.onReady(); - } - - for (Grid g : getRepo().networks) - { - g.update(); - } - - Callable c = null; - while ((c = callQueue.poll()) != null) - { - try - { - c.call(); - } - catch (Exception e) - { - AELog.error( e ); - } - } - } - } - -} +package appeng.hooks; + +import java.util.Collection; +import java.util.LinkedList; +import java.util.Queue; +import java.util.concurrent.Callable; + +import net.minecraftforge.event.world.WorldEvent; +import appeng.api.networking.IGridNode; +import appeng.core.AELog; +import appeng.me.Grid; +import appeng.me.NetworkList; +import appeng.tile.AEBaseTile; +import appeng.util.Platform; +import cpw.mods.fml.common.eventhandler.SubscribeEvent; +import cpw.mods.fml.common.gameevent.TickEvent; +import cpw.mods.fml.common.gameevent.TickEvent.Type; + +public class TickHandler +{ + + class HandlerRep + { + + public Queue tiles = new LinkedList(); + + public Collection networks = new NetworkList(); + + public void clear() + { + tiles = new LinkedList(); + networks = new NetworkList(); + } + + }; + + final public static TickHandler instance = new TickHandler(); + + final private Queue callQueue = new LinkedList(); + + final private HandlerRep server = new HandlerRep(); + final private HandlerRep client = new HandlerRep(); + + HandlerRep getRepo() + { + if ( Platform.isServer() ) + return server; + return client; + } + + public void addCallable(Callable c) + { + callQueue.add( c ); + } + + public void addInit(AEBaseTile tile) + { + getRepo().tiles.add( tile ); + } + + public void addNetwork(Grid grid) + { + if ( Platform.isServer() ) + getRepo().networks.add( grid ); + } + + public void removeNetwork(Grid grid) + { + if ( Platform.isServer() ) + getRepo().networks.remove( grid ); + } + + public Iterable getGridList() + { + return getRepo().networks; + } + + public void shutdown() + { + getRepo().clear(); + } + + @SubscribeEvent + public void unloadWorld(WorldEvent.Unload ev) + { + if ( Platform.isServer() ) + { + LinkedList toDestroy = new LinkedList(); + + for (Grid g : getRepo().networks) + { + for (IGridNode n : g.getNodes()) + { + if ( n.getWorld() == ev.world ) + toDestroy.add( n ); + } + } + + for (IGridNode n : toDestroy) + n.destroy(); + } + } + + @SubscribeEvent + public void onTick(TickEvent ev) + { + if ( ev.type == Type.SERVER ) + { + HandlerRep repo = getRepo(); + while (!repo.tiles.isEmpty()) + { + AEBaseTile bt = repo.tiles.poll(); + bt.onReady(); + } + + for (Grid g : getRepo().networks) + { + g.update(); + } + + Callable c = null; + while ((c = callQueue.poll()) != null) + { + try + { + c.call(); + } + catch (Exception e) + { + AELog.error( e ); + } + } + } + } + +} diff --git a/items/tools/powered/ToolEntropyManipulator.java b/items/tools/powered/ToolEntropyManipulator.java index ebad2852..c194d87a 100644 --- a/items/tools/powered/ToolEntropyManipulator.java +++ b/items/tools/powered/ToolEntropyManipulator.java @@ -24,7 +24,7 @@ import net.minecraftforge.oredict.OreDictionary; import appeng.block.misc.BlockTinyTNT; import appeng.core.AEConfig; import appeng.core.features.AEFeature; -import appeng.helpers.DispenserEntropyManipulator; +import appeng.hooks.DispenserEntropyManipulator; import appeng.items.tools.powered.powersink.AEBasePoweredItem; import appeng.util.InWorldToolOperationResult; import appeng.util.Platform; diff --git a/items/tools/powered/ToolMassCannon.java b/items/tools/powered/ToolMassCannon.java index 791662aa..b73acd2e 100644 --- a/items/tools/powered/ToolMassCannon.java +++ b/items/tools/powered/ToolMassCannon.java @@ -36,7 +36,7 @@ import appeng.core.features.AEFeature; import appeng.core.localization.GuiText; import appeng.core.localization.PlayerMessages; import appeng.core.sync.packets.PacketMatterCannon; -import appeng.helpers.DispenserMatterCannon; +import appeng.hooks.DispenserMatterCannon; import appeng.items.contents.CellConfig; import appeng.items.contents.CellUpgrades; import appeng.items.tools.powered.powersink.AEBasePoweredItem; diff --git a/me/Grid.java b/me/Grid.java index 610e194a..b3da1d9c 100644 --- a/me/Grid.java +++ b/me/Grid.java @@ -15,7 +15,7 @@ import appeng.api.networking.events.MENetworkEvent; import appeng.api.networking.events.MENetworkPostCacheConstruction; import appeng.api.util.IReadOnlyCollection; import appeng.core.WorldSettings; -import appeng.helpers.TickHandler; +import appeng.hooks.TickHandler; import appeng.util.ReadOnlyCollection; public class Grid implements IGrid diff --git a/me/GridNode.java b/me/GridNode.java index 94415826..af808da9 100644 --- a/me/GridNode.java +++ b/me/GridNode.java @@ -27,7 +27,7 @@ import appeng.api.util.AEColor; import appeng.api.util.DimensionalCoord; import appeng.api.util.IReadOnlyCollection; import appeng.core.WorldSettings; -import appeng.helpers.TickHandler; +import appeng.hooks.TickHandler; import appeng.me.pathfinding.IPathItem; import appeng.util.ReadOnlyCollection; diff --git a/me/helpers/AENetworkProxy.java b/me/helpers/AENetworkProxy.java index 724a120f..83eafc26 100644 --- a/me/helpers/AENetworkProxy.java +++ b/me/helpers/AENetworkProxy.java @@ -23,7 +23,7 @@ import appeng.api.util.AEColor; import appeng.api.util.DimensionalCoord; import appeng.api.util.IOrientable; import appeng.core.WorldSettings; -import appeng.helpers.TickHandler; +import appeng.hooks.TickHandler; import appeng.me.GridAccessException; import appeng.me.cache.P2PCache; import appeng.parts.networking.PartCable; diff --git a/helpers/PartPlacement.java b/parts/PartPlacement.java similarity index 96% rename from helpers/PartPlacement.java rename to parts/PartPlacement.java index f61e9139..25994c52 100644 --- a/helpers/PartPlacement.java +++ b/parts/PartPlacement.java @@ -1,356 +1,356 @@ -package appeng.helpers; - -import java.io.IOException; -import java.util.LinkedList; -import java.util.List; - -import net.minecraft.block.Block; -import net.minecraft.block.Block.SoundType; -import net.minecraft.entity.player.EntityPlayer; -import net.minecraft.item.ItemBlock; -import net.minecraft.item.ItemStack; -import net.minecraft.tileentity.TileEntity; -import net.minecraft.util.MovingObjectPosition; -import net.minecraft.world.World; -import net.minecraftforge.common.MinecraftForge; -import net.minecraftforge.common.util.ForgeDirection; -import net.minecraftforge.event.entity.player.PlayerDestroyItemEvent; -import net.minecraftforge.event.entity.player.PlayerInteractEvent; -import net.minecraftforge.event.entity.player.PlayerInteractEvent.Action; -import appeng.api.AEApi; -import appeng.api.parts.IFacadePart; -import appeng.api.parts.IPartHost; -import appeng.api.parts.IPartItem; -import appeng.api.parts.PartItemStack; -import appeng.api.parts.SelectedPart; -import appeng.core.AELog; -import appeng.core.AppEng; -import appeng.core.sync.network.NetworkHandler; -import appeng.core.sync.packets.PacketPartPlacement; -import appeng.facade.IFacadeItem; -import appeng.integration.abstraction.IBC; -import appeng.integration.abstraction.IFMP; -import appeng.util.LookDirection; -import appeng.util.Platform; -import cpw.mods.fml.common.eventhandler.SubscribeEvent; - -public class PartPlacement -{ - - private ThreadLocal placing = new ThreadLocal(); - - @SubscribeEvent - public void playerInteract(PlayerInteractEvent event) - { - if ( event.action == Action.RIGHT_CLICK_BLOCK && event.entityPlayer.worldObj.isRemote ) - { - if ( placing.get() != null ) - return; - - placing.set( event ); - - ItemStack held = event.entityPlayer.getHeldItem(); - if ( place( held, event.x, event.y, event.z, event.face, event.entityPlayer, event.entityPlayer.worldObj, PlaceType.INTERACT_FIRST_PASS, 0 ) ) - event.setCanceled( true ); - - placing.set( null ); - } - } - - public enum PlaceType - { - PLACE_ITEM, INTERACT_FIRST_PASS, INTERACT_SECOND_PASS - }; - - public static boolean place(ItemStack held, int x, int y, int z, int face, EntityPlayer player, World world, PlaceType pass, int depth) - { - if ( depth > 3 ) - return false; - - ForgeDirection side = ForgeDirection.getOrientation( face ); - - if ( held != null && Platform.isWrench( player, held, x, y, z ) && player.isSneaking() ) - { - Block block = world.getBlock( x, y, z ); - TileEntity tile = world.getTileEntity( x, y, z ); - IPartHost host = null; - - if ( tile instanceof IPartHost ) - host = (IPartHost) tile; - - if ( host != null ) - { - if ( !world.isRemote ) - { - LookDirection dir = Platform.getPlayerRay( player ); - MovingObjectPosition mop = block.collisionRayTrace( world, x, y, z, dir.a, dir.b ); - if ( mop != null ) - { - List is = new LinkedList(); - SelectedPart sp = host.selectPart( mop.hitVec.addVector( -mop.blockX, -mop.blockY, -mop.blockZ ) ); - - if ( sp.part != null ) - { - is.add( sp.part.getItemStack( PartItemStack.Wrench ) ); - sp.part.getDrops( is, true ); - host.removePart( sp.side, false ); - } - - if ( sp.facade != null ) - { - is.add( sp.facade.getItemStack() ); - host.getFacadeContainer().removeFacade( host, sp.side ); - world.notifyBlocksOfNeighborChange( x, y, z, Platform.air ); - } - - if ( host.isEmpty() ) - world.setBlock( x, y, z, Platform.air ); - - if ( is != null && !is.isEmpty() ) - { - Platform.spawnDrops( world, x, y, z, is ); - } - } - } - else - { - player.swingItem(); - try - { - NetworkHandler.instance.sendToServer( new PacketPartPlacement( x, y, z, face ) ); - } - catch (IOException e) - { - AELog.error( e ); - } - } - return true; - } - - return false; - } - - TileEntity tile = world.getTileEntity( x, y, z ); - IPartHost host = null; - - if ( tile instanceof IPartHost ) - host = (IPartHost) tile; - - if ( held != null ) - { - IFacadePart fp = isFacade( held, side ); - if ( fp != null ) - { - if ( host != null ) - { - if ( !world.isRemote ) - { - if ( host.getPart( ForgeDirection.UNKNOWN ) == null ) - return false; - - if ( host.getFacadeContainer().addFacade( fp ) ) - { - host.markForUpdate(); - if ( !player.capabilities.isCreativeMode ) - { - held.stackSize--; - if ( held.stackSize == 0 ) - { - player.inventory.mainInventory[player.inventory.currentItem] = null; - MinecraftForge.EVENT_BUS.post( new PlayerDestroyItemEvent( player, held ) ); - } - } - return true; - } - } - else - { - player.swingItem(); - try - { - NetworkHandler.instance.sendToServer( new PacketPartPlacement( x, y, z, face ) ); - return true; - } - catch (IOException e) - { - AELog.error( e ); - } - } - } - return false; - } - } - - if ( host == null && tile != null && AppEng.instance.isIntegrationEnabled( "FMP" ) ) - host = ((IFMP) AppEng.instance.getIntegration( "FMP" )).getOrCreateHost( tile ); - - // if ( held == null ) - { - Block block = world.getBlock( x, y, z ); - if ( host != null && player.isSneaking() && block != null ) - { - LookDirection dir = Platform.getPlayerRay( player ); - MovingObjectPosition mop = block.collisionRayTrace( world, x, y, z, dir.a, dir.b ); - if ( mop != null ) - { - mop.hitVec = mop.hitVec.addVector( -mop.blockX, -mop.blockY, -mop.blockZ ); - SelectedPart sPart = host.selectPart( mop.hitVec ); - if ( sPart != null && sPart.part != null ) - if ( sPart.part.onShiftActivate( player, mop.hitVec ) ) - { - if ( world.isRemote ) - { - try - { - NetworkHandler.instance.sendToServer( new PacketPartPlacement( x, y, z, face ) ); - } - catch (IOException e) - { - AELog.error( e ); - } - } - return true; - } - } - } - - } - - if ( held == null || !(held.getItem() instanceof IPartItem) ) - return false; - - int te_x = x; - int te_y = y; - int te_z = z; - - if ( host == null && pass == PlaceType.PLACE_ITEM ) - { - ItemStack is = AEApi.instance().blocks().blockMultiPart.stack( 1 ); - ItemBlock ib = (ItemBlock) is.getItem(); - ForgeDirection offset = ForgeDirection.UNKNOWN; - - Block blkID = world.getBlock( x, y, z ); - if ( blkID != null && !blkID.isReplaceable( world, x, y, z ) ) - { - offset = side; - if ( Platform.isServer() ) - side = side.getOpposite(); - } - - te_x = x + offset.offsetX; - te_y = y + offset.offsetY; - te_z = z + offset.offsetZ; - - tile = world.getTileEntity( te_x, te_y, te_z ); - if ( tile instanceof IPartHost ) - host = (IPartHost) tile; - - if ( host == null && tile != null && AppEng.instance.isIntegrationEnabled( "FMP" ) ) - host = ((IFMP) AppEng.instance.getIntegration( "FMP" )).getOrCreateHost( tile ); - - if ( host == null && AEApi.instance().blocks().blockMultiPart.block().canPlaceBlockAt( world, te_x, te_y, te_z ) - && ib.placeBlockAt( is, player, world, te_x, te_y, te_z, side.ordinal(), 0.5f, 0.5f, 0.5f, 0 ) ) - { - if ( !world.isRemote ) - { - tile = world.getTileEntity( te_x, te_y, te_z ); - - if ( tile instanceof IPartHost ) - host = (IPartHost) tile; - - pass = PlaceType.INTERACT_SECOND_PASS; - } - else - { - player.swingItem(); - try - { - NetworkHandler.instance.sendToServer( new PacketPartPlacement( x, y, z, face ) ); - } - catch (IOException e) - { - AELog.error( e ); - } - return true; - } - } - else if ( host != null && !host.canAddPart( held, side ) ) - return false; - } - - if ( host == null ) - return false; - - if ( !host.canAddPart( held, side ) ) - { - if ( pass == PlaceType.INTERACT_FIRST_PASS || pass == PlaceType.PLACE_ITEM ) - { - ForgeDirection offset = side; - - te_x = x + offset.offsetX; - te_y = y + offset.offsetY; - te_z = z + offset.offsetZ; - - Block blkID = world.getBlock( te_x, te_y, te_z ); - tile = world.getTileEntity( te_x, te_y, te_z ); - - if ( tile != null && AppEng.instance.isIntegrationEnabled( "FMP" ) ) - host = ((IFMP) AppEng.instance.getIntegration( "FMP" )).getOrCreateHost( tile ); - - if ( (blkID == null || blkID.isReplaceable( world, te_x, te_y, te_z ) || host != null) && offset != ForgeDirection.UNKNOWN ) - return place( held, te_x, te_y, te_z, side.getOpposite().ordinal(), player, world, - pass == PlaceType.INTERACT_FIRST_PASS ? PlaceType.INTERACT_SECOND_PASS : PlaceType.PLACE_ITEM, depth + 1 ); - } - return false; - } - - if ( !world.isRemote ) - { - ForgeDirection mySide = host.addPart( held, side, player ); - if ( mySide != null ) - { - SoundType ss = AEApi.instance().blocks().blockMultiPart.block().stepSound; - - // ss.getPlaceSound() - world.playSoundEffect( 0.5 + x, 0.5 + y, 0.5 + z, ss.func_150496_b(), (ss.getVolume() + 1.0F) / 2.0F, ss.getPitch() * 0.8F ); - - if ( !player.capabilities.isCreativeMode ) - { - held.stackSize--; - if ( held.stackSize == 0 ) - { - player.inventory.mainInventory[player.inventory.currentItem] = null; - MinecraftForge.EVENT_BUS.post( new PlayerDestroyItemEvent( player, held ) ); - } - } - } - } - else - { - player.swingItem(); - try - { - NetworkHandler.instance.sendToServer( new PacketPartPlacement( x, y, z, face ) ); - } - catch (IOException e) - { - AELog.error( e ); - } - } - return true; - } - - private static IFacadePart isFacade(ItemStack held, ForgeDirection side) - { - if ( held.getItem() instanceof IFacadeItem ) - return ((IFacadeItem) held.getItem()).createPartFromItemStack( held, side ); - if ( AppEng.instance.isIntegrationEnabled( "BC" ) ) - { - IBC bc = (IBC) AppEng.instance.getIntegration( "BC" ); - if ( bc.isFacade( held ) ) - return bc.createFacadePart( held, side ); - } - return null; - } - +package appeng.parts; + +import java.io.IOException; +import java.util.LinkedList; +import java.util.List; + +import net.minecraft.block.Block; +import net.minecraft.block.Block.SoundType; +import net.minecraft.entity.player.EntityPlayer; +import net.minecraft.item.ItemBlock; +import net.minecraft.item.ItemStack; +import net.minecraft.tileentity.TileEntity; +import net.minecraft.util.MovingObjectPosition; +import net.minecraft.world.World; +import net.minecraftforge.common.MinecraftForge; +import net.minecraftforge.common.util.ForgeDirection; +import net.minecraftforge.event.entity.player.PlayerDestroyItemEvent; +import net.minecraftforge.event.entity.player.PlayerInteractEvent; +import net.minecraftforge.event.entity.player.PlayerInteractEvent.Action; +import appeng.api.AEApi; +import appeng.api.parts.IFacadePart; +import appeng.api.parts.IPartHost; +import appeng.api.parts.IPartItem; +import appeng.api.parts.PartItemStack; +import appeng.api.parts.SelectedPart; +import appeng.core.AELog; +import appeng.core.AppEng; +import appeng.core.sync.network.NetworkHandler; +import appeng.core.sync.packets.PacketPartPlacement; +import appeng.facade.IFacadeItem; +import appeng.integration.abstraction.IBC; +import appeng.integration.abstraction.IFMP; +import appeng.util.LookDirection; +import appeng.util.Platform; +import cpw.mods.fml.common.eventhandler.SubscribeEvent; + +public class PartPlacement +{ + + private ThreadLocal placing = new ThreadLocal(); + + @SubscribeEvent + public void playerInteract(PlayerInteractEvent event) + { + if ( event.action == Action.RIGHT_CLICK_BLOCK && event.entityPlayer.worldObj.isRemote ) + { + if ( placing.get() != null ) + return; + + placing.set( event ); + + ItemStack held = event.entityPlayer.getHeldItem(); + if ( place( held, event.x, event.y, event.z, event.face, event.entityPlayer, event.entityPlayer.worldObj, PlaceType.INTERACT_FIRST_PASS, 0 ) ) + event.setCanceled( true ); + + placing.set( null ); + } + } + + public enum PlaceType + { + PLACE_ITEM, INTERACT_FIRST_PASS, INTERACT_SECOND_PASS + }; + + public static boolean place(ItemStack held, int x, int y, int z, int face, EntityPlayer player, World world, PlaceType pass, int depth) + { + if ( depth > 3 ) + return false; + + ForgeDirection side = ForgeDirection.getOrientation( face ); + + if ( held != null && Platform.isWrench( player, held, x, y, z ) && player.isSneaking() ) + { + Block block = world.getBlock( x, y, z ); + TileEntity tile = world.getTileEntity( x, y, z ); + IPartHost host = null; + + if ( tile instanceof IPartHost ) + host = (IPartHost) tile; + + if ( host != null ) + { + if ( !world.isRemote ) + { + LookDirection dir = Platform.getPlayerRay( player ); + MovingObjectPosition mop = block.collisionRayTrace( world, x, y, z, dir.a, dir.b ); + if ( mop != null ) + { + List is = new LinkedList(); + SelectedPart sp = host.selectPart( mop.hitVec.addVector( -mop.blockX, -mop.blockY, -mop.blockZ ) ); + + if ( sp.part != null ) + { + is.add( sp.part.getItemStack( PartItemStack.Wrench ) ); + sp.part.getDrops( is, true ); + host.removePart( sp.side, false ); + } + + if ( sp.facade != null ) + { + is.add( sp.facade.getItemStack() ); + host.getFacadeContainer().removeFacade( host, sp.side ); + world.notifyBlocksOfNeighborChange( x, y, z, Platform.air ); + } + + if ( host.isEmpty() ) + world.setBlock( x, y, z, Platform.air ); + + if ( is != null && !is.isEmpty() ) + { + Platform.spawnDrops( world, x, y, z, is ); + } + } + } + else + { + player.swingItem(); + try + { + NetworkHandler.instance.sendToServer( new PacketPartPlacement( x, y, z, face ) ); + } + catch (IOException e) + { + AELog.error( e ); + } + } + return true; + } + + return false; + } + + TileEntity tile = world.getTileEntity( x, y, z ); + IPartHost host = null; + + if ( tile instanceof IPartHost ) + host = (IPartHost) tile; + + if ( held != null ) + { + IFacadePart fp = isFacade( held, side ); + if ( fp != null ) + { + if ( host != null ) + { + if ( !world.isRemote ) + { + if ( host.getPart( ForgeDirection.UNKNOWN ) == null ) + return false; + + if ( host.getFacadeContainer().addFacade( fp ) ) + { + host.markForUpdate(); + if ( !player.capabilities.isCreativeMode ) + { + held.stackSize--; + if ( held.stackSize == 0 ) + { + player.inventory.mainInventory[player.inventory.currentItem] = null; + MinecraftForge.EVENT_BUS.post( new PlayerDestroyItemEvent( player, held ) ); + } + } + return true; + } + } + else + { + player.swingItem(); + try + { + NetworkHandler.instance.sendToServer( new PacketPartPlacement( x, y, z, face ) ); + return true; + } + catch (IOException e) + { + AELog.error( e ); + } + } + } + return false; + } + } + + if ( host == null && tile != null && AppEng.instance.isIntegrationEnabled( "FMP" ) ) + host = ((IFMP) AppEng.instance.getIntegration( "FMP" )).getOrCreateHost( tile ); + + // if ( held == null ) + { + Block block = world.getBlock( x, y, z ); + if ( host != null && player.isSneaking() && block != null ) + { + LookDirection dir = Platform.getPlayerRay( player ); + MovingObjectPosition mop = block.collisionRayTrace( world, x, y, z, dir.a, dir.b ); + if ( mop != null ) + { + mop.hitVec = mop.hitVec.addVector( -mop.blockX, -mop.blockY, -mop.blockZ ); + SelectedPart sPart = host.selectPart( mop.hitVec ); + if ( sPart != null && sPart.part != null ) + if ( sPart.part.onShiftActivate( player, mop.hitVec ) ) + { + if ( world.isRemote ) + { + try + { + NetworkHandler.instance.sendToServer( new PacketPartPlacement( x, y, z, face ) ); + } + catch (IOException e) + { + AELog.error( e ); + } + } + return true; + } + } + } + + } + + if ( held == null || !(held.getItem() instanceof IPartItem) ) + return false; + + int te_x = x; + int te_y = y; + int te_z = z; + + if ( host == null && pass == PlaceType.PLACE_ITEM ) + { + ItemStack is = AEApi.instance().blocks().blockMultiPart.stack( 1 ); + ItemBlock ib = (ItemBlock) is.getItem(); + ForgeDirection offset = ForgeDirection.UNKNOWN; + + Block blkID = world.getBlock( x, y, z ); + if ( blkID != null && !blkID.isReplaceable( world, x, y, z ) ) + { + offset = side; + if ( Platform.isServer() ) + side = side.getOpposite(); + } + + te_x = x + offset.offsetX; + te_y = y + offset.offsetY; + te_z = z + offset.offsetZ; + + tile = world.getTileEntity( te_x, te_y, te_z ); + if ( tile instanceof IPartHost ) + host = (IPartHost) tile; + + if ( host == null && tile != null && AppEng.instance.isIntegrationEnabled( "FMP" ) ) + host = ((IFMP) AppEng.instance.getIntegration( "FMP" )).getOrCreateHost( tile ); + + if ( host == null && AEApi.instance().blocks().blockMultiPart.block().canPlaceBlockAt( world, te_x, te_y, te_z ) + && ib.placeBlockAt( is, player, world, te_x, te_y, te_z, side.ordinal(), 0.5f, 0.5f, 0.5f, 0 ) ) + { + if ( !world.isRemote ) + { + tile = world.getTileEntity( te_x, te_y, te_z ); + + if ( tile instanceof IPartHost ) + host = (IPartHost) tile; + + pass = PlaceType.INTERACT_SECOND_PASS; + } + else + { + player.swingItem(); + try + { + NetworkHandler.instance.sendToServer( new PacketPartPlacement( x, y, z, face ) ); + } + catch (IOException e) + { + AELog.error( e ); + } + return true; + } + } + else if ( host != null && !host.canAddPart( held, side ) ) + return false; + } + + if ( host == null ) + return false; + + if ( !host.canAddPart( held, side ) ) + { + if ( pass == PlaceType.INTERACT_FIRST_PASS || pass == PlaceType.PLACE_ITEM ) + { + ForgeDirection offset = side; + + te_x = x + offset.offsetX; + te_y = y + offset.offsetY; + te_z = z + offset.offsetZ; + + Block blkID = world.getBlock( te_x, te_y, te_z ); + tile = world.getTileEntity( te_x, te_y, te_z ); + + if ( tile != null && AppEng.instance.isIntegrationEnabled( "FMP" ) ) + host = ((IFMP) AppEng.instance.getIntegration( "FMP" )).getOrCreateHost( tile ); + + if ( (blkID == null || blkID.isReplaceable( world, te_x, te_y, te_z ) || host != null) && offset != ForgeDirection.UNKNOWN ) + return place( held, te_x, te_y, te_z, side.getOpposite().ordinal(), player, world, + pass == PlaceType.INTERACT_FIRST_PASS ? PlaceType.INTERACT_SECOND_PASS : PlaceType.PLACE_ITEM, depth + 1 ); + } + return false; + } + + if ( !world.isRemote ) + { + ForgeDirection mySide = host.addPart( held, side, player ); + if ( mySide != null ) + { + SoundType ss = AEApi.instance().blocks().blockMultiPart.block().stepSound; + + // ss.getPlaceSound() + world.playSoundEffect( 0.5 + x, 0.5 + y, 0.5 + z, ss.func_150496_b(), (ss.getVolume() + 1.0F) / 2.0F, ss.getPitch() * 0.8F ); + + if ( !player.capabilities.isCreativeMode ) + { + held.stackSize--; + if ( held.stackSize == 0 ) + { + player.inventory.mainInventory[player.inventory.currentItem] = null; + MinecraftForge.EVENT_BUS.post( new PlayerDestroyItemEvent( player, held ) ); + } + } + } + } + else + { + player.swingItem(); + try + { + NetworkHandler.instance.sendToServer( new PacketPartPlacement( x, y, z, face ) ); + } + catch (IOException e) + { + AELog.error( e ); + } + } + return true; + } + + private static IFacadePart isFacade(ItemStack held, ForgeDirection side) + { + if ( held.getItem() instanceof IFacadeItem ) + return ((IFacadeItem) held.getItem()).createPartFromItemStack( held, side ); + if ( AppEng.instance.isIntegrationEnabled( "BC" ) ) + { + IBC bc = (IBC) AppEng.instance.getIntegration( "BC" ); + if ( bc.isFacade( held ) ) + return bc.createFacadePart( held, side ); + } + return null; + } + } \ No newline at end of file diff --git a/parts/automation/PartAnnihilationPlane.java b/parts/automation/PartAnnihilationPlane.java index 6e4689c6..80f24948 100644 --- a/parts/automation/PartAnnihilationPlane.java +++ b/parts/automation/PartAnnihilationPlane.java @@ -36,7 +36,7 @@ import appeng.api.storage.data.IAEItemStack; import appeng.client.texture.CableBusTextures; import appeng.core.AELog; import appeng.core.sync.packets.PacketTransitionEffect; -import appeng.helpers.TickHandler; +import appeng.hooks.TickHandler; import appeng.me.GridAccessException; import appeng.parts.PartBasicState; import appeng.server.ServerHelper; diff --git a/parts/p2p/PartP2PTunnelME.java b/parts/p2p/PartP2PTunnelME.java index 87e7b03b..b0d164f3 100644 --- a/parts/p2p/PartP2PTunnelME.java +++ b/parts/p2p/PartP2PTunnelME.java @@ -20,7 +20,7 @@ import appeng.api.networking.ticking.TickingRequest; import appeng.api.parts.IPartHost; import appeng.api.util.AECableType; import appeng.core.AELog; -import appeng.helpers.TickHandler; +import appeng.hooks.TickHandler; import appeng.me.GridAccessException; import appeng.me.cache.helpers.Connections; import appeng.me.cache.helpers.TunnelConnection; diff --git a/services/CompassService.java b/services/CompassService.java new file mode 100644 index 00000000..0dfb3e07 --- /dev/null +++ b/services/CompassService.java @@ -0,0 +1,301 @@ +package appeng.services; + +import java.io.File; +import java.util.HashMap; +import java.util.LinkedList; + +import net.minecraft.block.Block; +import net.minecraft.world.World; +import appeng.api.AEApi; +import appeng.api.util.DimensionalCoord; +import appeng.core.AELog; +import appeng.services.helpers.CompassException; +import appeng.services.helpers.CompassReader; +import appeng.services.helpers.ICompassCallback; + +public class CompassService implements Runnable +{ + + private class CompassMessage + { + + public boolean isUpdate() + { + return false; + } + + public boolean isRequest() + { + return false; + } + + }; + + private class CMUpdatePost extends CompassMessage + { + + public final World world; + + public final int chunkX, chunkZ; + public final int doubleChunkY; // 32 blocks instead of 16. + public final boolean value; + + @Override + public boolean isUpdate() + { + return true; + } + + public CMUpdatePost(World w, int cx, int cz, int dcy, boolean val) { + world = w; + chunkX = cx; + doubleChunkY = dcy; + chunkZ = cz; + value = val; + } + }; + + private class CMDirectionRequest extends CompassMessage + { + + public final DimensionalCoord coord; + public final ICompassCallback callback; + + @Override + public boolean isRequest() + { + return true; + } + + public CMDirectionRequest(DimensionalCoord coord, ICompassCallback cc) { + this.coord = coord; + callback = cc; + } + + }; + + private LinkedList jobList = new LinkedList(); + + public void updateArea(World w, int x, int y, int z) + { + int cx = x >> 4; + int cdy = y >> 5; + int cz = z >> 4; + + int low_x = cx << 4; + int low_z = cz << 4; + int low_y = cdy << 5; + + int hi_x = low_x + 16; + int hi_z = low_z + 16; + int hi_y = low_y + 32; + + Block skystone = AEApi.instance().blocks().blockSkyStone.block(); + + for (int i = low_x; i < hi_x; i++) + { + for (int j = low_z; j < hi_z; j++) + { + for (int k = low_y; k < hi_y; k++) + { + Block blk = w.getBlock( i, k, j ); + if ( blk == skystone && w.getBlockMetadata( i, k, j ) == 0 ) + { + postJob( new CMUpdatePost( w, cx, cz, cdy, true ) ); + return; + } + } + } + } + + postJob( new CMUpdatePost( w, cx, cz, cdy, false ) ); + } + + public void getCompassDirection(DimensionalCoord coord, ICompassCallback cc) + { + postJob( new CMDirectionRequest( coord, cc ) ); + } + + private void postJob(CompassMessage msg) + { + synchronized (jobList) + { + if ( msg != null ) + jobList.offer( msg ); + jobList.notify(); + } + } + + private CompassMessage getNextMessage() + { + CompassMessage myMsg = null; + + while (myMsg == null && run) + { + synchronized (jobList) + { + try + { + myMsg = jobList.poll(); + if ( myMsg == null ) + jobList.wait(); + } + catch (InterruptedException e) + { + // :P + } + } + } + + return myMsg; + } + + HashMap worldSet = new HashMap(); + + final File rootFolder; + + public CompassService(File aEFolder) { + rootFolder = aEFolder; + } + + public CompassReader getReader(World w) + { + CompassReader cr = worldSet.get( w ); + + if ( cr == null ) + { + cr = new CompassReader( w, rootFolder ); + worldSet.put( w, cr ); + } + + return cr; + } + + private void processRequest(CMDirectionRequest req) + { + AELog.info( "CompassService.processRequest" ); + + int cx = req.coord.x >> 4; + int cz = req.coord.z >> 4; + + CompassReader cr = getReader( req.coord.getWorld() ); + + // Am I standing on it? + if ( cr.hasBeacon( cx, cz ) ) + { + req.callback.calculatedDirection( true, true, -999 ); + cr.close(); + return; + } + + // spiral outward... + for (int offset = 1; offset < 174; offset++) + { + int minx = cx - offset; + int minz = cz - offset; + int maxx = cx + offset; + int maxz = cz + offset; + + for (int z = minz; z <= maxz; z++) + { + if ( cr.hasBeacon( minx, z ) ) + { + req.callback.calculatedDirection( true, false, rad( cx, cz, minx, z ) ); + cr.close(); + return; + } + + if ( cr.hasBeacon( maxx, z ) ) + { + req.callback.calculatedDirection( true, false, rad( cx, cz, maxx, z ) ); + cr.close(); + return; + } + } + + for (int x = minx + 1; x < maxx; x++) + { + if ( cr.hasBeacon( x, minz ) ) + { + req.callback.calculatedDirection( true, false, rad( cx, cz, x, minz ) ); + cr.close(); + return; + } + + if ( cr.hasBeacon( x, maxz ) ) + { + req.callback.calculatedDirection( true, false, rad( cx, cz, x, maxz ) ); + cr.close(); + return; + } + } + } + + // didn't find shit... + req.callback.calculatedDirection( false, true, -999 ); + cr.close(); + } + + private double rad(int ax, int az, int bx, int bz) + { + int up = bz - az; + int side = bx - ax; + + return Math.atan2( -up, side ) - Math.PI / 2.0; + } + + private void processUpdate(CMUpdatePost req) + { + CompassReader cr = getReader( req.world ); + cr.setHasBeacon( req.chunkX, req.chunkZ, req.doubleChunkY, req.value ); + cr.close(); + } + + boolean run = true; + boolean stopped = false; + + @Override + public void run() + { + + while (run) + { + CompassMessage myMsg = getNextMessage(); + + try + { + if ( myMsg != null ) + { + if ( myMsg.isRequest() ) + processRequest( (CMDirectionRequest) myMsg ); + else if ( myMsg.isUpdate() ) + processUpdate( (CMUpdatePost) myMsg ); + } + } + catch (CompassException ce) + { + ce.inner.printStackTrace(); + } + } + + stopped = true; + } + + public void kill() + { + run = false; + postJob( null ); + + while (!stopped) + { + try + { + Thread.sleep( 100 ); + } + catch (InterruptedException e) + { + // :P + } + } + } +} diff --git a/services/helpers/CompassException.java b/services/helpers/CompassException.java new file mode 100644 index 00000000..6e60fa15 --- /dev/null +++ b/services/helpers/CompassException.java @@ -0,0 +1,14 @@ +package appeng.services.helpers; + +public class CompassException extends RuntimeException +{ + + private static final long serialVersionUID = 8825268683203860877L; + + public final Throwable inner; + + public CompassException(Throwable t) { + inner = t; + } + +} diff --git a/services/helpers/CompassReader.java b/services/helpers/CompassReader.java new file mode 100644 index 00000000..41b0f235 --- /dev/null +++ b/services/helpers/CompassReader.java @@ -0,0 +1,56 @@ +package appeng.services.helpers; + +import java.io.File; +import java.util.HashMap; + +import net.minecraft.world.World; + +public class CompassReader +{ + + HashMap regions = new HashMap(); + final int id; + final File rootFolder; + + public void close() + { + for (CompassRegion r : regions.values()) + r.close(); + regions.clear(); + } + + public CompassReader(World w, File rootFolder) { + id = w.provider.dimensionId; + this.rootFolder = rootFolder; + } + + public void setHasBeacon(int cx, int cz, int cdy, boolean hasBeacon) + { + CompassRegion r = getRegion( cx, cz ); + r.setHasBeacon( cx, cz, cdy, hasBeacon ); + } + + public boolean hasBeacon(int cx, int cz) + { + CompassRegion r = getRegion( cx, cz ); + return r.hasBeacon( cx, cz ); + } + + private CompassRegion getRegion(int cx, int cz) + { + long pos = cx >> 10; + pos = pos << 32; + pos = pos | (cz >> 10); + + CompassRegion cr = regions.get( pos ); + if ( cr == null ) + { + cr = new CompassRegion( cx, cz, id, rootFolder ); + regions.put( pos, cr ); + } + + return cr; + + } + +} diff --git a/services/helpers/CompassRegion.java b/services/helpers/CompassRegion.java new file mode 100644 index 00000000..2a25d190 --- /dev/null +++ b/services/helpers/CompassRegion.java @@ -0,0 +1,159 @@ +package appeng.services.helpers; + +import java.io.EOFException; +import java.io.File; +import java.io.RandomAccessFile; + +public class CompassRegion +{ + + final int low_x; + final int low_z; + + final int hi_x; + final int hi_z; + + final int world; + + boolean hasFile = false; + final File rootFolder; + RandomAccessFile raf = null; + + public void close() + { + try + { + if ( hasFile ) + { + raf.close(); + raf = null; + hasFile = false; + } + } + catch (Throwable t) + { + throw new CompassException( t ); + } + } + + public CompassRegion(int cx, int cz, int worldID, File rootFolder) { + + world = worldID; + this.rootFolder = rootFolder; + + int region_x = cx >> 10; + int region_z = cz >> 10; + + low_x = region_x << 10; + low_z = region_z << 10; + + hi_x = low_x + 1024; + hi_z = low_z + 1024; + + openFile( false ); + } + + public boolean hasBeacon(int cx, int cz) + { + if ( hasFile ) + { + cx = cx & 0x3FF; + cz = cz & 0x3FF; + + int val = read( cx, cz ); + if ( val != 0 ) + return true; + } + + return false; + } + + public void setHasBeacon(int cx, int cz, int cdy, boolean hasBeacon) + { + cx &= 0x3FF; + cz &= 0x3FF; + + openFile( hasBeacon ); + + if ( hasFile ) + { + int val = read( cx, cz ); + int originalVal = val; + + if ( hasBeacon ) + val |= 1 << cdy; + else + val &= ~(1 << cdy); + + if ( originalVal != val ) + write( cx, cz, val ); + } + } + + private void write(int cx, int cz, int val) + { + try + { + raf.seek( cx + cz * 0x400 ); + raf.writeByte( val ); + } + catch (Throwable t) + { + throw new CompassException( t ); + } + } + + private int read(int cx, int cz) + { + try + { + raf.seek( cx + cz * 0x400 ); + return raf.readByte(); + } + catch (EOFException eof) + { + return 0; + } + catch (Throwable t) + { + throw new CompassException( t ); + } + } + + private void openFile(boolean create) + { + File fName = getFileName(); + if ( hasFile ) + return; + + if ( create || fileExists( fName ) ) + { + try + { + raf = new RandomAccessFile( fName, "rw" ); + hasFile = true; + } + catch (Throwable t) + { + throw new CompassException( t ); + } + } + + } + + private boolean fileExists(File name) + { + return name.exists() && name.isFile(); + } + + private File getFileName() + { + String folder = rootFolder.getPath() + File.separatorChar + "compass"; + File folderFile = new File( folder ); + + if ( !folderFile.exists() || !folderFile.isDirectory() ) + folderFile.mkdir(); + + return new File( folder + File.separatorChar + world + "_" + low_x + "_" + low_z + ".dat" ); + } +} diff --git a/services/helpers/ICompassCallback.java b/services/helpers/ICompassCallback.java new file mode 100644 index 00000000..4b816488 --- /dev/null +++ b/services/helpers/ICompassCallback.java @@ -0,0 +1,15 @@ +package appeng.services.helpers; + +public interface ICompassCallback +{ + + /** + * Called from another thread. + * + * @param hasResult + * @param spin + * @param radians + */ + public void calculatedDirection(boolean hasResult, boolean spin, double radians); + +} diff --git a/tile/misc/TileSkyCompass.java b/tile/misc/TileSkyCompass.java new file mode 100644 index 00000000..9a31f0ef --- /dev/null +++ b/tile/misc/TileSkyCompass.java @@ -0,0 +1,14 @@ +package appeng.tile.misc; + +import appeng.tile.AEBaseTile; + +public class TileSkyCompass extends AEBaseTile +{ + + @Override + public boolean requiresTESR() + { + return true; + } + +} diff --git a/tile/networking/TileCableBus.java b/tile/networking/TileCableBus.java index 1ed35213..0ea8fc1a 100644 --- a/tile/networking/TileCableBus.java +++ b/tile/networking/TileCableBus.java @@ -28,7 +28,7 @@ import appeng.api.util.AEColor; import appeng.api.util.DimensionalCoord; import appeng.helpers.AEMultiTile; import appeng.helpers.ICustomCollision; -import appeng.helpers.TickHandler; +import appeng.hooks.TickHandler; import appeng.parts.CableBusContainer; import appeng.tile.AEBaseTile; import appeng.tile.events.AETileEventHandler; diff --git a/tile/storage/TileChest.java b/tile/storage/TileChest.java index f9757f95..2a367782 100644 --- a/tile/storage/TileChest.java +++ b/tile/storage/TileChest.java @@ -7,6 +7,7 @@ import java.util.ArrayList; import java.util.Arrays; import java.util.List; +import net.minecraft.entity.player.EntityPlayer; import net.minecraft.inventory.IInventory; import net.minecraft.item.Item; import net.minecraft.item.ItemStack; @@ -50,7 +51,6 @@ import appeng.api.storage.data.IAEFluidStack; import appeng.api.storage.data.IAEItemStack; import appeng.api.storage.data.IAEStack; import appeng.api.util.IConfigManager; -import appeng.helpers.AENoHandler; import appeng.helpers.IPriorityHost; import appeng.me.GridAccessException; import appeng.me.storage.MEInventoryHandler; @@ -67,14 +67,21 @@ import appeng.util.item.AEFluidStack; public class TileChest extends AENetworkPowerTile implements IMEChest, IFluidHandler, ITerminalHost, IPriorityHost, IConfigManagerHost { - static final AENoHandler noHandler = new AENoHandler(); + static private class ChestNoHandler extends Exception + { + + private static final long serialVersionUID = 7995805326136526631L; + + } + + static final ChestNoHandler noHandler = new ChestNoHandler(); static final int sides[] = new int[] { 0 }; static final int front[] = new int[] { 1 }; AppEngInternalInventory inv = new AppEngInternalInventory( this, 2 ); BaseActionSource mySrc = new MachineSource( this ); - IConfigManager config = new ConfigManager(this); + IConfigManager config = new ConfigManager( this ); ItemStack storageType; long lastStateChange = 0; @@ -219,14 +226,14 @@ public class TileChest extends AENetworkPowerTile implements IMEChest, IFluidHan @Override public void readFromNBT(NBTTagCompound data) { - config.readFromNBT(data); + config.readFromNBT( data ); priority = data.getInteger( "priority" ); } @Override public void writeToNBT(NBTTagCompound data) { - config.writeToNBT(data); + config.writeToNBT( data ); data.setInteger( "priority", priority ); } @@ -248,9 +255,9 @@ public class TileChest extends AENetworkPowerTile implements IMEChest, IFluidHan gridProxy.setFlags( GridFlags.REQUIRE_CHANNEL ); addNewHandler( new invManger() ); - config.registerSetting(Settings.SORT_BY, SortOrder.NAME); - config.registerSetting(Settings.VIEW_MODE, ViewItems.ALL); - config.registerSetting(Settings.SORT_DIRECTION, SortDir.ASCENDING); + config.registerSetting( Settings.SORT_BY, SortOrder.NAME ); + config.registerSetting( Settings.VIEW_MODE, ViewItems.ALL ); + config.registerSetting( Settings.SORT_DIRECTION, SortDir.ASCENDING ); internalPublicPowerStorage = true; internalPowerFlow = AccessRestriction.WRITE; @@ -345,7 +352,7 @@ public class TileChest extends AENetworkPowerTile implements IMEChest, IFluidHan return g; } - public IMEInventoryHandler getHandler(StorageChannel channel) throws AENoHandler + public IMEInventoryHandler getHandler(StorageChannel channel) throws ChestNoHandler { if ( !isCached ) { @@ -447,7 +454,7 @@ public class TileChest extends AENetworkPowerTile implements IMEChest, IFluidHan inv.setInventorySlotContents( 0, returns.getItemStack() ); } } - catch (AENoHandler t) + catch (ChestNoHandler t) { } } @@ -467,7 +474,7 @@ public class TileChest extends AENetworkPowerTile implements IMEChest, IFluidHan IAEItemStack returns = cell.injectItems( AEApi.instance().storage().createItemStack( inv.getStackInSlot( 0 ) ), Actionable.SIMULATE, mySrc ); return returns == null || returns.getStackSize() != itemstack.stackSize; } - catch (AENoHandler t) + catch (ChestNoHandler t) { } @@ -491,7 +498,7 @@ public class TileChest extends AENetworkPowerTile implements IMEChest, IFluidHan { return Arrays.asList( new IMEInventoryHandler[] { getHandler( channel ) } ); } - catch (AENoHandler e) + catch (ChestNoHandler e) { // :P } @@ -551,7 +558,7 @@ public class TileChest extends AENetworkPowerTile implements IMEChest, IFluidHan if ( ch != null && handler instanceof ChestMonitorHandler ) return ch.getStatusForCell( cell, ((ChestMonitorHandler) handler).getInternalHandler() ); } - catch (AENoHandler e) + catch (ChestNoHandler e) { } @@ -561,7 +568,7 @@ public class TileChest extends AENetworkPowerTile implements IMEChest, IFluidHan if ( ch != null && handler instanceof ChestMonitorHandler ) return ch.getStatusForCell( cell, ((ChestMonitorHandler) handler).getInternalHandler() ); } - catch (AENoHandler e) + catch (ChestNoHandler e) { } } @@ -588,7 +595,7 @@ public class TileChest extends AENetworkPowerTile implements IMEChest, IFluidHan return resource.amount - (int) results.getStackSize(); } - catch (AENoHandler e) + catch (ChestNoHandler e) { } } @@ -615,7 +622,7 @@ public class TileChest extends AENetworkPowerTile implements IMEChest, IFluidHan IMEInventoryHandler h = getHandler( StorageChannel.FLUIDS ); return h.canAccept( AEFluidStack.create( new FluidStack( fluid, 1 ) ) ); } - catch (AENoHandler e) + catch (ChestNoHandler e) { } return false; @@ -636,7 +643,7 @@ public class TileChest extends AENetworkPowerTile implements IMEChest, IFluidHan if ( h.getChannel() == StorageChannel.FLUIDS ) return new FluidTankInfo[] { new FluidTankInfo( null ) }; // eh? } - catch (AENoHandler e) + catch (ChestNoHandler e) { } @@ -720,13 +727,51 @@ public class TileChest extends AENetworkPowerTile implements IMEChest, IFluidHan } @Override - public IConfigManager getConfigManager() { + public IConfigManager getConfigManager() + { return config; } @Override - public void updateSetting(IConfigManager manager, Enum settingName, Enum newValue) { - + public void updateSetting(IConfigManager manager, Enum settingName, Enum newValue) + { + + } + + public boolean openGui(EntityPlayer p, ICellHandler ch, ItemStack cell, int side) + { + try + { + IMEInventoryHandler ih = this.getHandler( StorageChannel.ITEMS ); + if ( ch != null && ih != null ) + { + IMEInventoryHandler mine = ih; + ch.openChestGui( p, this, ch, mine, cell, StorageChannel.ITEMS ); + return true; + } + + } + catch (ChestNoHandler e) + { + // :P + } + + try + { + IMEInventoryHandler fh = this.getHandler( StorageChannel.FLUIDS ); + if ( ch != null && fh != null ) + { + IMEInventoryHandler mine = fh; + ch.openChestGui( p, this, ch, mine, cell, StorageChannel.FLUIDS ); + return true; + } + } + catch (ChestNoHandler e) + { + // :P + } + + return false; } }