Added Sky Stone Tracking.

Added Meteorite Compass Block / Item.
Added Meteorite Spawner Debug Item.
Some Refactoring.
This commit is contained in:
AlgorithmX2 2014-03-02 02:35:11 -06:00
parent fb6bb1a964
commit 792249f8fd
62 changed files with 2472 additions and 754 deletions

View file

@ -12,6 +12,7 @@ import net.minecraftforge.client.MinecraftForgeClient;
import net.minecraftforge.common.util.ForgeDirection; import net.minecraftforge.common.util.ForgeDirection;
import appeng.api.util.IOrientable; import appeng.api.util.IOrientable;
import appeng.api.util.IOrientableBlock; import appeng.api.util.IOrientableBlock;
import appeng.block.misc.BlockSkyCompass;
import appeng.block.networking.BlockWireless; import appeng.block.networking.BlockWireless;
import appeng.client.render.ItemRenderer; import appeng.client.render.ItemRenderer;
import appeng.me.helpers.IGridProxyable; import appeng.me.helpers.IGridProxyable;
@ -62,7 +63,7 @@ public class AEBaseItemBlock extends ItemBlock
if ( blockType.hasBlockTileEntity() ) if ( blockType.hasBlockTileEntity() )
{ {
if ( blockType instanceof BlockWireless ) if ( blockType instanceof BlockWireless || blockType instanceof BlockSkyCompass )
{ {
forward = ForgeDirection.getOrientation( side ); forward = ForgeDirection.getOrientation( side );
if ( forward == ForgeDirection.UP || forward == ForgeDirection.DOWN ) if ( forward == ForgeDirection.UP || forward == ForgeDirection.DOWN )

View file

@ -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<? extends BaseBlockRender> 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<AxisAlignedBB> 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
}
}

View file

@ -27,8 +27,8 @@ import appeng.core.AppEng;
import appeng.core.features.AEFeature; import appeng.core.features.AEFeature;
import appeng.entity.EntityIds; import appeng.entity.EntityIds;
import appeng.entity.EntityTinyTNTPrimed; import appeng.entity.EntityTinyTNTPrimed;
import appeng.helpers.DispenserBehaviorTinyTNT;
import appeng.helpers.ICustomCollision; import appeng.helpers.ICustomCollision;
import appeng.hooks.DispenserBehaviorTinyTNT;
import cpw.mods.fml.common.registry.EntityRegistry; import cpw.mods.fml.common.registry.EntityRegistry;
public class BlockTinyTNT extends AEBaseBlock implements ICustomCollision public class BlockTinyTNT extends AEBaseBlock implements ICustomCollision

View file

@ -3,6 +3,7 @@ package appeng.block.solids;
import java.util.EnumSet; import java.util.EnumSet;
import java.util.List; import java.util.List;
import net.minecraft.block.Block;
import net.minecraft.block.material.Material; import net.minecraft.block.material.Material;
import net.minecraft.client.renderer.texture.IIconRegister; import net.minecraft.client.renderer.texture.IIconRegister;
import net.minecraft.creativetab.CreativeTabs; import net.minecraft.creativetab.CreativeTabs;
@ -15,6 +16,7 @@ import net.minecraft.world.World;
import appeng.api.util.IOrientable; import appeng.api.util.IOrientable;
import appeng.api.util.IOrientableBlock; import appeng.api.util.IOrientableBlock;
import appeng.block.AEBaseBlock; import appeng.block.AEBaseBlock;
import appeng.core.WorldSettings;
import appeng.core.features.AEFeature; import appeng.core.features.AEFeature;
import appeng.helpers.LocationRotation; import appeng.helpers.LocationRotation;
import cpw.mods.fml.relauncher.Side; import cpw.mods.fml.relauncher.Side;
@ -110,4 +112,18 @@ public class BlockSkyStone extends AEBaseBlock implements IOrientableBlock
l.add( new ItemStack( i, 1, 3 ) ); 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 );
}
} }

View file

@ -9,15 +9,12 @@ import net.minecraft.world.World;
import net.minecraftforge.common.util.ForgeDirection; import net.minecraftforge.common.util.ForgeDirection;
import appeng.api.AEApi; import appeng.api.AEApi;
import appeng.api.storage.ICellHandler; import appeng.api.storage.ICellHandler;
import appeng.api.storage.IMEInventoryHandler;
import appeng.api.storage.StorageChannel;
import appeng.block.AEBaseBlock; import appeng.block.AEBaseBlock;
import appeng.client.render.BaseBlockRender; import appeng.client.render.BaseBlockRender;
import appeng.client.render.blocks.RenderMEChest; import appeng.client.render.blocks.RenderMEChest;
import appeng.core.features.AEFeature; import appeng.core.features.AEFeature;
import appeng.core.localization.PlayerMessages; import appeng.core.localization.PlayerMessages;
import appeng.core.sync.GuiBridge; import appeng.core.sync.GuiBridge;
import appeng.helpers.AENoHandler;
import appeng.tile.storage.TileChest; import appeng.tile.storage.TileChest;
import appeng.util.Platform; import appeng.util.Platform;
@ -56,36 +53,7 @@ public class BlockChest extends AEBaseBlock
{ {
ICellHandler ch = AEApi.instance().registries().cell().getHander( cell ); ICellHandler ch = AEApi.instance().registries().cell().getHander( cell );
try tg.openGui( p, ch, cell, side );
{
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
}
} }
p.addChatMessage( PlayerMessages.ChestCannotReadStorageCell.get() ); p.addChatMessage( PlayerMessages.ChestCannotReadStorageCell.get() );

View file

@ -16,6 +16,7 @@ import net.minecraft.item.ItemStack;
import net.minecraft.tileentity.TileEntity; import net.minecraft.tileentity.TileEntity;
import net.minecraft.util.IIcon; import net.minecraft.util.IIcon;
import net.minecraft.world.IBlockAccess; import net.minecraft.world.IBlockAccess;
import net.minecraftforge.client.IItemRenderer.ItemRenderType;
import net.minecraftforge.common.util.ForgeDirection; import net.minecraftforge.common.util.ForgeDirection;
import org.lwjgl.BufferUtils; 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; Tessellator tess = Tessellator.instance;

View file

@ -38,7 +38,7 @@ public class ItemRenderer implements IItemRenderer
if ( type == ItemRenderType.INVENTORY ) if ( type == ItemRenderType.INVENTORY )
GL11.glTranslatef( 0.0f, -0.1f, 0.0f ); GL11.glTranslatef( 0.0f, -0.1f, 0.0f );
WorldRender.instance.renderItemBlock( item ); WorldRender.instance.renderItemBlock( item, type );
GL11.glPopAttrib(); GL11.glPopAttrib();
GL11.glPopMatrix(); GL11.glPopMatrix();

View file

@ -6,6 +6,7 @@ import net.minecraft.block.Block;
import net.minecraft.client.renderer.RenderBlocks; import net.minecraft.client.renderer.RenderBlocks;
import net.minecraft.item.ItemStack; import net.minecraft.item.ItemStack;
import net.minecraft.world.IBlockAccess; import net.minecraft.world.IBlockAccess;
import net.minecraftforge.client.IItemRenderer.ItemRenderType;
import appeng.block.AEBaseBlock; import appeng.block.AEBaseBlock;
import appeng.core.AELog; import appeng.core.AELog;
import cpw.mods.fml.client.registry.ISimpleBlockRenderingHandler; import cpw.mods.fml.client.registry.ISimpleBlockRenderingHandler;
@ -57,21 +58,21 @@ public class WorldRender implements ISimpleBlockRenderingHandler
return renderID; return renderID;
} }
public void renderItemBlock(ItemStack item) public void renderItemBlock(ItemStack item, ItemRenderType type)
{ {
Block blk = Block.getBlockFromItem( item.getItem() ); Block blk = Block.getBlockFromItem( item.getItem() );
if ( blk instanceof AEBaseBlock ) if ( blk instanceof AEBaseBlock )
{ {
AEBaseBlock block = (AEBaseBlock)blk; AEBaseBlock block = (AEBaseBlock) blk;
renderer.setRenderBoundsFromBlock( block ); renderer.setRenderBoundsFromBlock( block );
renderer.uvRotateBottom = renderer.uvRotateEast = renderer.uvRotateNorth = renderer.uvRotateSouth = renderer.uvRotateTop = renderer.uvRotateWest = 0; 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; renderer.uvRotateBottom = renderer.uvRotateEast = renderer.uvRotateNorth = renderer.uvRotateSouth = renderer.uvRotateTop = renderer.uvRotateWest = 0;
} }
else else
{ {
AELog.severe( "Invalid render: "+item.getUnlocalizedName() +" as ae block" ); AELog.severe( "Invalid render: " + item.getUnlocalizedName() + " as ae block" );
} }
} }

View file

@ -9,6 +9,7 @@ import net.minecraft.client.renderer.Tessellator;
import net.minecraft.inventory.IInventory; import net.minecraft.inventory.IInventory;
import net.minecraft.item.ItemStack; import net.minecraft.item.ItemStack;
import net.minecraft.world.IBlockAccess; import net.minecraft.world.IBlockAccess;
import net.minecraftforge.client.IItemRenderer.ItemRenderType;
import net.minecraftforge.common.util.ForgeDirection; import net.minecraftforge.common.util.ForgeDirection;
import org.lwjgl.opengl.GL11; import org.lwjgl.opengl.GL11;
@ -31,7 +32,7 @@ public class RenderBlockCharger extends BaseBlockRender
} }
@Override @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; Tessellator tess = Tessellator.instance;

View file

@ -7,6 +7,7 @@ import net.minecraft.client.renderer.Tessellator;
import net.minecraft.client.renderer.texture.TextureMap; import net.minecraft.client.renderer.texture.TextureMap;
import net.minecraft.item.ItemStack; import net.minecraft.item.ItemStack;
import net.minecraft.world.IBlockAccess; import net.minecraft.world.IBlockAccess;
import net.minecraftforge.client.IItemRenderer.ItemRenderType;
import net.minecraftforge.common.util.ForgeDirection; import net.minecraftforge.common.util.ForgeDirection;
import org.lwjgl.opengl.GL11; import org.lwjgl.opengl.GL11;
@ -24,15 +25,15 @@ public class RenderBlockCrank extends BaseBlockRender
} }
@Override @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.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 ); 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 ); 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; renderer.renderAllFaces = false;
} }

View file

@ -3,6 +3,7 @@ package appeng.client.render.blocks;
import net.minecraft.client.renderer.RenderBlocks; import net.minecraft.client.renderer.RenderBlocks;
import net.minecraft.item.ItemStack; import net.minecraft.item.ItemStack;
import net.minecraft.world.IBlockAccess; import net.minecraft.world.IBlockAccess;
import net.minecraftforge.client.IItemRenderer.ItemRenderType;
import appeng.api.implementations.items.IAEItemPowerStorage; import appeng.api.implementations.items.IAEItemPowerStorage;
import appeng.block.AEBaseBlock; import appeng.block.AEBaseBlock;
import appeng.client.render.BaseBlockRender; import appeng.client.render.BaseBlockRender;
@ -15,7 +16,7 @@ public class RenderBlockEnergyCube extends BaseBlockRender
} }
@Override @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(); IAEItemPowerStorage myItem = (IAEItemPowerStorage) is.getItem();
double internalCurrentPower = myItem.getAECurrentPower( is ); double internalCurrentPower = myItem.getAECurrentPower( is );
@ -29,7 +30,7 @@ public class RenderBlockEnergyCube extends BaseBlockRender
meta = 0; meta = 0;
renderer.setOverrideBlockTexture( blk.getIcon( 0, meta ) ); renderer.setOverrideBlockTexture( blk.getIcon( 0, meta ) );
super.renderInventory( blk, is, renderer ); super.renderInventory( blk, is, renderer, type );
renderer.setOverrideBlockTexture( null ); renderer.setOverrideBlockTexture( null );
} }

View file

@ -7,6 +7,7 @@ import net.minecraft.client.renderer.Tessellator;
import net.minecraft.item.ItemStack; import net.minecraft.item.ItemStack;
import net.minecraft.util.ResourceLocation; import net.minecraft.util.ResourceLocation;
import net.minecraft.world.IBlockAccess; import net.minecraft.world.IBlockAccess;
import net.minecraftforge.client.IItemRenderer.ItemRenderType;
import org.lwjgl.opengl.GL11; import org.lwjgl.opengl.GL11;
@ -25,7 +26,7 @@ public class RenderBlockSkyChest extends BaseBlockRender
} }
@Override @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.glEnable( 32826 /* GL_RESCALE_NORMAL_EXT */);
GL11.glColor4f( 1.0F, 1.0F, 1.0F, 1.0F ); GL11.glColor4f( 1.0F, 1.0F, 1.0F, 1.0F );

View file

@ -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 );
}
}

View file

@ -7,6 +7,7 @@ import net.minecraft.client.renderer.Tessellator;
import net.minecraft.item.ItemStack; import net.minecraft.item.ItemStack;
import net.minecraft.util.IIcon; import net.minecraft.util.IIcon;
import net.minecraft.world.IBlockAccess; import net.minecraft.world.IBlockAccess;
import net.minecraftforge.client.IItemRenderer.ItemRenderType;
import net.minecraftforge.common.util.ForgeDirection; import net.minecraftforge.common.util.ForgeDirection;
import appeng.api.util.AEColor; import appeng.api.util.AEColor;
import appeng.block.AEBaseBlock; import appeng.block.AEBaseBlock;
@ -26,7 +27,7 @@ public class RenderBlockWireless extends BaseBlockRender
} }
@Override @Override
public void renderInventory(AEBaseBlock blk, ItemStack is, RenderBlocks renderer) public void renderInventory(AEBaseBlock blk, ItemStack is, RenderBlocks renderer, ItemRenderType type)
{ {
this.blk = blk; this.blk = blk;
cenx = 0; cenx = 0;

View file

@ -7,6 +7,7 @@ import net.minecraft.client.renderer.Tessellator;
import net.minecraft.item.ItemStack; import net.minecraft.item.ItemStack;
import net.minecraft.util.IIcon; import net.minecraft.util.IIcon;
import net.minecraft.world.IBlockAccess; import net.minecraft.world.IBlockAccess;
import net.minecraftforge.client.IItemRenderer.ItemRenderType;
import net.minecraftforge.common.util.ForgeDirection; import net.minecraftforge.common.util.ForgeDirection;
import appeng.block.AEBaseBlock; import appeng.block.AEBaseBlock;
import appeng.client.render.BaseBlockRender; import appeng.client.render.BaseBlockRender;
@ -22,13 +23,13 @@ public class RenderDrive extends BaseBlockRender
} }
@Override @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(); renderer.overrideBlockTexture = ExtraTextures.getMissing();
this.renderInvBlock( EnumSet.of( ForgeDirection.SOUTH ), block, is, Tessellator.instance, 0x000000, renderer ); this.renderInvBlock( EnumSet.of( ForgeDirection.SOUTH ), block, is, Tessellator.instance, 0x000000, renderer );
renderer.overrideBlockTexture = null; renderer.overrideBlockTexture = null;
super.renderInventory( block, is, renderer ); super.renderInventory( block, is, renderer, type );
} }
@Override @Override

View file

@ -7,6 +7,7 @@ import net.minecraft.client.renderer.Tessellator;
import net.minecraft.item.ItemStack; import net.minecraft.item.ItemStack;
import net.minecraft.util.IIcon; import net.minecraft.util.IIcon;
import net.minecraft.world.IBlockAccess; import net.minecraft.world.IBlockAccess;
import net.minecraftforge.client.IItemRenderer.ItemRenderType;
import net.minecraftforge.common.util.ForgeDirection; import net.minecraftforge.common.util.ForgeDirection;
import appeng.api.AEApi; import appeng.api.AEApi;
import appeng.api.storage.ICellHandler; import appeng.api.storage.ICellHandler;
@ -26,7 +27,7 @@ public class RenderMEChest extends BaseBlockRender
} }
@Override @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(); renderer.overrideBlockTexture = ExtraTextures.getMissing();
this.renderInvBlock( EnumSet.of( ForgeDirection.SOUTH ), block, is, Tessellator.instance, 0x000000, renderer ); 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 ); this.renderInvBlock( EnumSet.of( ForgeDirection.UP ), block, is, Tessellator.instance, 0xffffff, renderer );
renderer.overrideBlockTexture = null; renderer.overrideBlockTexture = null;
super.renderInventory( block, is, renderer ); super.renderInventory( block, is, renderer, type );
} }
@Override @Override

View file

@ -3,6 +3,7 @@ package appeng.client.render.blocks;
import net.minecraft.client.renderer.RenderBlocks; import net.minecraft.client.renderer.RenderBlocks;
import net.minecraft.item.ItemStack; import net.minecraft.item.ItemStack;
import net.minecraft.world.IBlockAccess; import net.minecraft.world.IBlockAccess;
import net.minecraftforge.client.IItemRenderer.ItemRenderType;
import appeng.block.AEBaseBlock; import appeng.block.AEBaseBlock;
import appeng.client.render.BaseBlockRender; import appeng.client.render.BaseBlockRender;
@ -14,7 +15,7 @@ public class RenderNull extends BaseBlockRender
} }
@Override @Override
public void renderInventory(AEBaseBlock block, ItemStack is, RenderBlocks renderer) public void renderInventory(AEBaseBlock block, ItemStack is, RenderBlocks renderer, ItemRenderType type)
{ {
} }

View file

@ -8,6 +8,7 @@ import net.minecraft.item.Item;
import net.minecraft.item.ItemStack; import net.minecraft.item.ItemStack;
import net.minecraft.util.IIcon; import net.minecraft.util.IIcon;
import net.minecraft.world.IBlockAccess; import net.minecraft.world.IBlockAccess;
import net.minecraftforge.client.IItemRenderer.ItemRenderType;
import net.minecraftforge.common.util.ForgeDirection; import net.minecraftforge.common.util.ForgeDirection;
import appeng.api.AEApi; import appeng.api.AEApi;
import appeng.api.util.AEColor; import appeng.api.util.AEColor;
@ -71,13 +72,13 @@ public class RenderQNB extends BaseBlockRender
} }
@Override @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 px = 2.0f / 16.0f;
float maxpx = 14.0f / 16.0f; float maxpx = 14.0f / 16.0f;
renderer.setRenderBounds( px, px, px, maxpx, maxpx, maxpx ); renderer.setRenderBounds( px, px, px, maxpx, maxpx, maxpx );
super.renderInventory( block, item, renderer ); super.renderInventory( block, item, renderer, type );
} }
@Override @Override
@ -101,7 +102,8 @@ public class RenderQNB extends BaseBlockRender
EnumSet<ForgeDirection> sides = tqb.getConnections(); EnumSet<ForgeDirection> sides = tqb.getConnections();
renderCableAt( 0.11D, world, x, y, z, block, renderer, cable.getIconIndex( cabldef.stack( AEColor.Transparent, 1 ) ), 0.141D, sides ); 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; float px = 2.0f / 16.0f;
@ -127,7 +129,8 @@ public class RenderQNB extends BaseBlockRender
AEColoredItemDefinition ccabldef = AEApi.instance().parts().partCableCovered; AEColoredItemDefinition ccabldef = AEApi.instance().parts().partCableCovered;
Item ccable = ccabldef.item( AEColor.Transparent ); 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 px = 4.0f / 16.0f;
float maxpx = 12.0f / 16.0f; float maxpx = 12.0f / 16.0f;

View file

@ -5,6 +5,7 @@ import java.util.Random;
import net.minecraft.client.renderer.RenderBlocks; import net.minecraft.client.renderer.RenderBlocks;
import net.minecraft.item.ItemStack; import net.minecraft.item.ItemStack;
import net.minecraft.world.IBlockAccess; import net.minecraft.world.IBlockAccess;
import net.minecraftforge.client.IItemRenderer.ItemRenderType;
import net.minecraftforge.common.util.ForgeDirection; import net.minecraftforge.common.util.ForgeDirection;
import appeng.api.AEApi; import appeng.api.AEApi;
import appeng.block.AEBaseBlock; import appeng.block.AEBaseBlock;
@ -113,12 +114,12 @@ public class RenderQuartzGlass extends BaseBlockRender
} }
@Override @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(); renderer.overrideBlockTexture = ExtraTextures.GlassFrame.getIcon();
super.renderInventory( block, is, renderer ); super.renderInventory( block, is, renderer, type );
renderer.overrideBlockTexture = null; renderer.overrideBlockTexture = null;
super.renderInventory( block, is, renderer ); super.renderInventory( block, is, renderer, type );
} }
@Override @Override

View file

@ -3,6 +3,7 @@ package appeng.client.render.blocks;
import net.minecraft.client.renderer.RenderBlocks; import net.minecraft.client.renderer.RenderBlocks;
import net.minecraft.item.ItemStack; import net.minecraft.item.ItemStack;
import net.minecraft.world.IBlockAccess; import net.minecraft.world.IBlockAccess;
import net.minecraftforge.client.IItemRenderer.ItemRenderType;
import appeng.block.AEBaseBlock; import appeng.block.AEBaseBlock;
import appeng.block.solids.OreQuartz; import appeng.block.solids.OreQuartz;
import appeng.client.render.BaseBlockRender; import appeng.client.render.BaseBlockRender;
@ -16,11 +17,11 @@ public class RenderQuartzOre extends BaseBlockRender
} }
@Override @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() ); blk.getRendererInstance().setTemporaryRenderIcon( ExtraTextures.OreQuartzStone.getIcon() );
super.renderInventory( blk, is, renderer ); super.renderInventory( blk, is, renderer, type );
blk.getRendererInstance().setTemporaryRenderIcon( null ); blk.getRendererInstance().setTemporaryRenderIcon( null );
} }

View file

@ -7,6 +7,7 @@ import net.minecraft.client.renderer.Tessellator;
import net.minecraft.init.Blocks; import net.minecraft.init.Blocks;
import net.minecraft.item.ItemStack; import net.minecraft.item.ItemStack;
import net.minecraft.world.IBlockAccess; import net.minecraft.world.IBlockAccess;
import net.minecraftforge.client.IItemRenderer.ItemRenderType;
import net.minecraftforge.common.util.ForgeDirection; import net.minecraftforge.common.util.ForgeDirection;
import appeng.api.util.IOrientable; import appeng.api.util.IOrientable;
import appeng.block.AEBaseBlock; import appeng.block.AEBaseBlock;
@ -21,7 +22,7 @@ public class RenderQuartzTorch extends BaseBlockRender
} }
@Override @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; Tessellator tess = Tessellator.instance;

View file

@ -5,6 +5,7 @@ import net.minecraft.client.renderer.Tessellator;
import net.minecraft.item.ItemStack; import net.minecraft.item.ItemStack;
import net.minecraft.util.IIcon; import net.minecraft.util.IIcon;
import net.minecraft.world.IBlockAccess; import net.minecraft.world.IBlockAccess;
import net.minecraftforge.client.IItemRenderer.ItemRenderType;
import net.minecraftforge.common.util.ForgeDirection; import net.minecraftforge.common.util.ForgeDirection;
import appeng.block.AEBaseBlock; import appeng.block.AEBaseBlock;
import appeng.client.render.BaseBlockRender; import appeng.client.render.BaseBlockRender;
@ -20,12 +21,12 @@ public class RenderSpatialPylon extends BaseBlockRender
} }
@Override @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(); renderer.overrideBlockTexture = ExtraTextures.BlockSpatialPylon_dim.getIcon();
super.renderInventory( block, is, renderer ); super.renderInventory( block, is, renderer, type );
renderer.overrideBlockTexture = null; renderer.overrideBlockTexture = null;
super.renderInventory( block, is, renderer ); super.renderInventory( block, is, renderer, type );
} }
@Override @Override

View file

@ -3,6 +3,7 @@ package appeng.client.render.blocks;
import net.minecraft.client.renderer.RenderBlocks; import net.minecraft.client.renderer.RenderBlocks;
import net.minecraft.item.ItemStack; import net.minecraft.item.ItemStack;
import net.minecraft.world.IBlockAccess; import net.minecraft.world.IBlockAccess;
import net.minecraftforge.client.IItemRenderer.ItemRenderType;
import appeng.block.AEBaseBlock; import appeng.block.AEBaseBlock;
import appeng.client.render.BaseBlockRender; import appeng.client.render.BaseBlockRender;
@ -14,10 +15,10 @@ public class RenderTinyTNT extends BaseBlockRender
} }
@Override @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 ); 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 @Override

View file

@ -4,6 +4,7 @@ import net.minecraft.client.renderer.RenderBlocks;
import net.minecraft.client.renderer.Tessellator; import net.minecraft.client.renderer.Tessellator;
import net.minecraft.item.ItemStack; import net.minecraft.item.ItemStack;
import net.minecraft.world.IBlockAccess; import net.minecraft.world.IBlockAccess;
import net.minecraftforge.client.IItemRenderer.ItemRenderType;
import appeng.block.AEBaseBlock; import appeng.block.AEBaseBlock;
import appeng.client.render.BaseBlockRender; import appeng.client.render.BaseBlockRender;
import appeng.client.render.BusRenderer; import appeng.client.render.BusRenderer;
@ -18,7 +19,7 @@ public class RendererCableBus extends BaseBlockRender
} }
@Override @Override
public void renderInventory(AEBaseBlock blk, ItemStack is, RenderBlocks renderer) public void renderInventory(AEBaseBlock blk, ItemStack is, RenderBlocks renderer, ItemRenderType type)
{ {
// nothin. // nothin.
} }

View file

@ -7,6 +7,7 @@ import net.minecraft.client.renderer.Tessellator;
import net.minecraft.item.ItemStack; import net.minecraft.item.ItemStack;
import net.minecraft.util.IIcon; import net.minecraft.util.IIcon;
import net.minecraft.world.IBlockAccess; import net.minecraft.world.IBlockAccess;
import net.minecraftforge.client.IItemRenderer.ItemRenderType;
import net.minecraftforge.common.util.ForgeDirection; import net.minecraftforge.common.util.ForgeDirection;
import appeng.block.AEBaseBlock; import appeng.block.AEBaseBlock;
import appeng.client.render.BaseBlockRender; import appeng.client.render.BaseBlockRender;
@ -21,7 +22,7 @@ public class RendererSecurity extends BaseBlockRender
} }
@Override @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(); renderer.overrideBlockTexture = ExtraTextures.getMissing();
this.renderInvBlock( EnumSet.of( ForgeDirection.SOUTH ), block, is, Tessellator.instance, 0x000000, renderer ); 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 ); this.renderInvBlock( EnumSet.of( ForgeDirection.UP ), block, is, Tessellator.instance, 0xffffff, renderer );
renderer.overrideBlockTexture = null; renderer.overrideBlockTexture = null;
super.renderInventory( block, is, renderer ); super.renderInventory( block, is, renderer, type );
} }
@Override @Override

View file

@ -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 );
}
}

View file

@ -7,7 +7,7 @@ import appeng.core.crash.CrashInfo;
import appeng.core.features.AEFeature; import appeng.core.features.AEFeature;
import appeng.core.sync.GuiBridge; import appeng.core.sync.GuiBridge;
import appeng.core.sync.network.NetworkHandler; import appeng.core.sync.network.NetworkHandler;
import appeng.helpers.TickHandler; import appeng.hooks.TickHandler;
import appeng.integration.IntegrationRegistry; import appeng.integration.IntegrationRegistry;
import appeng.integration.IntegrationSide; import appeng.integration.IntegrationSide;
import appeng.server.AECommand; import appeng.server.AECommand;

View file

@ -36,6 +36,7 @@ import appeng.block.misc.BlockInterface;
import appeng.block.misc.BlockQuartzGrowthAccelerator; import appeng.block.misc.BlockQuartzGrowthAccelerator;
import appeng.block.misc.BlockQuartzTorch; import appeng.block.misc.BlockQuartzTorch;
import appeng.block.misc.BlockSecurity; import appeng.block.misc.BlockSecurity;
import appeng.block.misc.BlockSkyCompass;
import appeng.block.misc.BlockTinyTNT; import appeng.block.misc.BlockTinyTNT;
import appeng.block.misc.BlockVibrationChamber; import appeng.block.misc.BlockVibrationChamber;
import appeng.block.networking.BlockCableBus; import appeng.block.networking.BlockCableBus;
@ -78,11 +79,11 @@ import appeng.core.localization.PlayerMessages;
import appeng.debug.BlockChunkloader; import appeng.debug.BlockChunkloader;
import appeng.debug.BlockItemGen; import appeng.debug.BlockItemGen;
import appeng.debug.ToolDebugCard; import appeng.debug.ToolDebugCard;
import appeng.debug.ToolMeteoritePlacer;
import appeng.debug.ToolReplicatorCard; import appeng.debug.ToolReplicatorCard;
import appeng.helpers.AETrading; import appeng.hooks.AETrading;
import appeng.helpers.PartPlacement; import appeng.hooks.QuartzWorldGen;
import appeng.helpers.QuartzWorldGen; import appeng.hooks.TickHandler;
import appeng.helpers.TickHandler;
import appeng.items.materials.ItemMaterial; import appeng.items.materials.ItemMaterial;
import appeng.items.materials.MaterialType; import appeng.items.materials.MaterialType;
import appeng.items.misc.ItemCrystalSeed; import appeng.items.misc.ItemCrystalSeed;
@ -115,6 +116,7 @@ import appeng.me.cache.SecurityCache;
import appeng.me.cache.SpatialPylonCache; import appeng.me.cache.SpatialPylonCache;
import appeng.me.cache.TickManagerCache; import appeng.me.cache.TickManagerCache;
import appeng.me.storage.AEExternalHandler; import appeng.me.storage.AEExternalHandler;
import appeng.parts.PartPlacement;
import appeng.recipes.AEItemResolver; import appeng.recipes.AEItemResolver;
import appeng.recipes.RecipeHandler; import appeng.recipes.RecipeHandler;
import appeng.recipes.Recipes.ShapedRecipe; import appeng.recipes.Recipes.ShapedRecipe;
@ -249,6 +251,7 @@ public class Registration
blocks.blockFluix = addFeature( BlockFluix.class ); blocks.blockFluix = addFeature( BlockFluix.class );
blocks.blockSkyStone = addFeature( BlockSkyStone.class ); blocks.blockSkyStone = addFeature( BlockSkyStone.class );
blocks.blockSkyChest = addFeature( BlockSkyChest.class ); blocks.blockSkyChest = addFeature( BlockSkyChest.class );
blocks.blockSkyCompass = addFeature( BlockSkyCompass.class );
blocks.blockQuartzGlass = addFeature( BlockQuartzGlass.class ); blocks.blockQuartzGlass = addFeature( BlockQuartzGlass.class );
blocks.blockQuartzVibrantGlass = addFeature( BlockQuartzLamp.class ); blocks.blockQuartzVibrantGlass = addFeature( BlockQuartzLamp.class );
@ -340,6 +343,7 @@ public class Registration
items.itemFacade = addFeature( ItemFacade.class ); items.itemFacade = addFeature( ItemFacade.class );
items.itemCrystalSeed = addFeature( ItemCrystalSeed.class ); items.itemCrystalSeed = addFeature( ItemCrystalSeed.class );
addFeature( ToolMeteoritePlacer.class );
addFeature( ToolDebugCard.class ); addFeature( ToolDebugCard.class );
addFeature( ToolReplicatorCard.class ); addFeature( ToolReplicatorCard.class );
addFeature( BlockItemGen.class ); addFeature( BlockItemGen.class );

View file

@ -13,6 +13,7 @@ import net.minecraftforge.common.config.Property;
import appeng.api.util.WorldCoord; import appeng.api.util.WorldCoord;
import appeng.me.GridStorage; import appeng.me.GridStorage;
import appeng.me.GridStorageSearch; import appeng.me.GridStorageSearch;
import appeng.services.CompassService;
public class WorldSettings extends Configuration public class WorldSettings extends Configuration
{ {
@ -22,8 +23,17 @@ public class WorldSettings extends Configuration
long lastGridStorage = 0; long lastGridStorage = 0;
int lastPlayer = 0; int lastPlayer = 0;
public WorldSettings(File f) { private CompassService compass;
super( f );
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 try
{ {
lastGridStorage = Long.parseLong( get( "Counters", "lastGridStorage", 0 ).getString() ); 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() public static WorldSettings getInstance()
{ {
if ( instance == null ) 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 ); instance = new WorldSettings( f );
} }
@ -60,6 +80,7 @@ public class WorldSettings extends Configuration
public void shutdown() public void shutdown()
{ {
save(); save();
compass.kill();
instance = null; instance = null;
} }
@ -181,4 +202,5 @@ public class WorldSettings extends Configuration
return prop.getInt(); return prop.getInt();
} }
} }
} }

View file

@ -29,8 +29,8 @@ import appeng.api.parts.LayerBase;
import appeng.client.render.BusRenderer; import appeng.client.render.BusRenderer;
import appeng.core.AELog; import appeng.core.AELog;
import appeng.core.AppEng; import appeng.core.AppEng;
import appeng.helpers.PartPlacement;
import appeng.integration.abstraction.IFMP; import appeng.integration.abstraction.IFMP;
import appeng.parts.PartPlacement;
import appeng.tile.networking.TileCableBus; import appeng.tile.networking.TileCableBus;
import appeng.util.Platform; import appeng.util.Platform;

View file

@ -8,6 +8,8 @@ import java.util.HashMap;
import java.util.Map; import java.util.Map;
import appeng.core.sync.packets.PacketClick; 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.PacketConfigButton;
import appeng.core.sync.packets.PacketInventoryAction; import appeng.core.sync.packets.PacketInventoryAction;
import appeng.core.sync.packets.PacketLightning; import appeng.core.sync.packets.PacketLightning;
@ -28,6 +30,10 @@ public class AppEngPacketHandlerBase
public enum PacketTypes public enum PacketTypes
{ {
PACKET_COMPASS_REQUEST(PacketCompassRequest.class),
PACKET_COMPASS_RESPONSE(PacketCompassResponse.class),
PACKET_INVENTORY_ACTION(PacketInventoryAction.class), PACKET_INVENTORY_ACTION(PacketInventoryAction.class),
PACKET_ME_INVENTORY_UPDATE(PacketMEInventoryUpdate.class), PACKET_ME_INVENTORY_UPDATE(PacketMEInventoryUpdate.class),

View file

@ -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 );
}
}

View file

@ -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 );
}
}

View file

@ -9,7 +9,7 @@ import net.minecraft.entity.player.EntityPlayer;
import net.minecraft.entity.player.EntityPlayerMP; import net.minecraft.entity.player.EntityPlayerMP;
import appeng.core.sync.AppEngPacket; import appeng.core.sync.AppEngPacket;
import appeng.core.sync.network.INetworkInfo; import appeng.core.sync.network.INetworkInfo;
import appeng.helpers.PartPlacement; import appeng.parts.PartPlacement;
public class PacketPartPlacement extends AppEngPacket public class PacketPartPlacement extends AppEngPacket
{ {

View file

@ -17,7 +17,7 @@ import appeng.api.networking.ticking.ITickManager;
import appeng.api.parts.IPart; import appeng.api.parts.IPart;
import appeng.api.parts.IPartHost; import appeng.api.parts.IPartHost;
import appeng.core.features.AEFeature; import appeng.core.features.AEFeature;
import appeng.helpers.TickHandler; import appeng.hooks.TickHandler;
import appeng.items.AEBaseItem; import appeng.items.AEBaseItem;
import appeng.me.Grid; import appeng.me.Grid;
import appeng.me.GridNode; import appeng.me.GridNode;

View file

@ -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;
}
}

View file

@ -1,8 +0,0 @@
package appeng.helpers;
public class AENoHandler extends Exception
{
private static final long serialVersionUID = 7995805326136526631L;
}

View file

@ -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<Block> validSpawn = new HashSet();
HashSet<Block> 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 );
}
}

View file

@ -1,85 +1,85 @@
package appeng.helpers; package appeng.hooks;
import java.util.Random; import java.util.Random;
import net.minecraft.entity.passive.EntityVillager; import net.minecraft.entity.passive.EntityVillager;
import net.minecraft.init.Items; import net.minecraft.init.Items;
import net.minecraft.item.ItemStack; import net.minecraft.item.ItemStack;
import net.minecraft.village.MerchantRecipe; import net.minecraft.village.MerchantRecipe;
import net.minecraft.village.MerchantRecipeList; import net.minecraft.village.MerchantRecipeList;
import appeng.api.AEApi; import appeng.api.AEApi;
import cpw.mods.fml.common.registry.VillagerRegistry.IVillageTradeHandler; import cpw.mods.fml.common.registry.VillagerRegistry.IVillageTradeHandler;
public class AETrading implements IVillageTradeHandler public class AETrading implements IVillageTradeHandler
{ {
private void addToList(MerchantRecipeList l, ItemStack a, ItemStack b) private void addToList(MerchantRecipeList l, ItemStack a, ItemStack b)
{ {
if ( a.stackSize < 1 ) if ( a.stackSize < 1 )
a.stackSize = 1; a.stackSize = 1;
if ( b.stackSize < 1 ) if ( b.stackSize < 1 )
b.stackSize = 1; b.stackSize = 1;
if ( a.stackSize > a.getMaxStackSize() ) if ( a.stackSize > a.getMaxStackSize() )
a.stackSize = a.getMaxStackSize(); a.stackSize = a.getMaxStackSize();
if ( b.stackSize > b.getMaxStackSize() ) if ( b.stackSize > b.getMaxStackSize() )
b.stackSize = b.getMaxStackSize(); b.stackSize = b.getMaxStackSize();
l.add( new MerchantRecipe( a, b ) ); l.add( new MerchantRecipe( a, b ) );
} }
private void addTrade(MerchantRecipeList list, ItemStack a, ItemStack b, Random rand, int convertion_Variance) private void addTrade(MerchantRecipeList list, ItemStack a, ItemStack b, Random rand, int convertion_Variance)
{ {
// Sell // Sell
ItemStack From = a.copy(); ItemStack From = a.copy();
ItemStack To = b.copy(); ItemStack To = b.copy();
From.stackSize = 1 + (Math.abs( rand.nextInt() ) % (1 + convertion_Variance)); From.stackSize = 1 + (Math.abs( rand.nextInt() ) % (1 + convertion_Variance));
To.stackSize = 1; To.stackSize = 1;
addToList( list, From, To ); addToList( list, From, To );
} }
private void addMerchent(MerchantRecipeList list, ItemStack item, int emera, Random rand, int greed) private void addMerchent(MerchantRecipeList list, ItemStack item, int emera, Random rand, int greed)
{ {
// Sell // Sell
ItemStack From = item.copy(); ItemStack From = item.copy();
ItemStack To = new ItemStack( Items.emerald ); ItemStack To = new ItemStack( Items.emerald );
int multiplier = (Math.abs( rand.nextInt() ) % 6); int multiplier = (Math.abs( rand.nextInt() ) % 6);
emera += (Math.abs( rand.nextInt() ) % greed) - multiplier; emera += (Math.abs( rand.nextInt() ) % greed) - multiplier;
int mood = rand.nextInt() % 2; int mood = rand.nextInt() % 2;
From.stackSize = multiplier + mood; From.stackSize = multiplier + mood;
To.stackSize = multiplier * emera - mood; To.stackSize = multiplier * emera - mood;
if ( To.stackSize < 0 ) if ( To.stackSize < 0 )
{ {
From.stackSize -= To.stackSize; From.stackSize -= To.stackSize;
To.stackSize -= To.stackSize; To.stackSize -= To.stackSize;
} }
addToList( list, From, To ); addToList( list, From, To );
// Buy // Buy
ItemStack reverseTo = From.copy(); ItemStack reverseTo = From.copy();
ItemStack reverseFrom = To.copy(); ItemStack reverseFrom = To.copy();
reverseFrom.stackSize = (int) (reverseFrom.stackSize * (rand.nextFloat() * 3.0f + 1.0f)); reverseFrom.stackSize = (int) (reverseFrom.stackSize * (rand.nextFloat() * 3.0f + 1.0f));
reverseTo.stackSize = reverseTo.stackSize; reverseTo.stackSize = reverseTo.stackSize;
addToList( list, reverseFrom, reverseTo ); addToList( list, reverseFrom, reverseTo );
} }
@Override @Override
public void manipulateTradesForVillager(EntityVillager villager, MerchantRecipeList recipeList, Random random) 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().materialSilicon.stack( 1 ), 1, random, 2 );
addMerchent( recipeList, AEApi.instance().materials().materialCertusQuartzCrystal.stack( 1 ), 2, random, 3 ); addMerchent( recipeList, AEApi.instance().materials().materialCertusQuartzCrystal.stack( 1 ), 2, random, 4 );
addMerchent( recipeList, AEApi.instance().materials().materialCertusQuartzDust.stack( 1 ), 1, random, 2 ); addMerchent( recipeList, AEApi.instance().materials().materialCertusQuartzDust.stack( 1 ), 1, random, 3 );
addTrade( recipeList, AEApi.instance().materials().materialCertusQuartzDust.stack( 1 ), addTrade( recipeList, AEApi.instance().materials().materialCertusQuartzDust.stack( 1 ),
AEApi.instance().materials().materialCertusQuartzCrystal.stack( 1 ), random, 1 ); AEApi.instance().materials().materialCertusQuartzCrystal.stack( 1 ), random, 2 );
} }
} }

104
hooks/CompassManager.java Normal file
View file

@ -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<CompassReq, CompassResult> 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<CompassResult> 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 );
}
}
}

20
hooks/CompassResult.java Normal file
View file

@ -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();
}
}

View file

@ -1,4 +1,4 @@
package appeng.helpers; package appeng.hooks;
import net.minecraft.block.BlockDispenser; import net.minecraft.block.BlockDispenser;
import net.minecraft.dispenser.BehaviorDefaultDispenseItem; import net.minecraft.dispenser.BehaviorDefaultDispenseItem;

View file

@ -1,4 +1,4 @@
package appeng.helpers; package appeng.hooks;
import net.minecraft.block.BlockDispenser; import net.minecraft.block.BlockDispenser;
import net.minecraft.dispenser.BehaviorDefaultDispenseItem; import net.minecraft.dispenser.BehaviorDefaultDispenseItem;

View file

@ -1,4 +1,4 @@
package appeng.helpers; package appeng.hooks;
import net.minecraft.block.BlockDispenser; import net.minecraft.block.BlockDispenser;
import net.minecraft.dispenser.BehaviorDefaultDispenseItem; import net.minecraft.dispenser.BehaviorDefaultDispenseItem;

View file

@ -1,54 +1,54 @@
package appeng.helpers; package appeng.hooks;
import java.util.Random; import java.util.Random;
import net.minecraft.block.Block; import net.minecraft.block.Block;
import net.minecraft.init.Blocks; import net.minecraft.init.Blocks;
import net.minecraft.world.World; import net.minecraft.world.World;
import net.minecraft.world.chunk.IChunkProvider; import net.minecraft.world.chunk.IChunkProvider;
import net.minecraft.world.gen.feature.WorldGenMinable; import net.minecraft.world.gen.feature.WorldGenMinable;
import appeng.api.AEApi; import appeng.api.AEApi;
import appeng.core.AEConfig; import appeng.core.AEConfig;
import cpw.mods.fml.common.IWorldGenerator; import cpw.mods.fml.common.IWorldGenerator;
final public class QuartzWorldGen implements IWorldGenerator final public class QuartzWorldGen implements IWorldGenerator
{ {
final WorldGenMinable oreNormal; final WorldGenMinable oreNormal;
final WorldGenMinable oreCharged; final WorldGenMinable oreCharged;
public QuartzWorldGen() { public QuartzWorldGen() {
Block normal = AEApi.instance().blocks().blockQuartzOre.block(); Block normal = AEApi.instance().blocks().blockQuartzOre.block();
Block charged = AEApi.instance().blocks().blockQuartzOreCharged.block(); Block charged = AEApi.instance().blocks().blockQuartzOreCharged.block();
if ( normal != null && charged != null ) if ( normal != null && charged != null )
{ {
oreNormal = new WorldGenMinable( normal, 0, AEConfig.instance.oresPerCluster, Blocks.stone ); oreNormal = new WorldGenMinable( normal, 0, AEConfig.instance.oresPerCluster, Blocks.stone );
oreCharged = new WorldGenMinable( charged, 0, AEConfig.instance.oresPerCluster, Blocks.stone ); oreCharged = new WorldGenMinable( charged, 0, AEConfig.instance.oresPerCluster, Blocks.stone );
} }
else else
oreNormal = oreCharged = null; oreNormal = oreCharged = null;
}; };
@Override @Override
public void generate(Random r, int chunkX, int chunkZ, World w, IChunkProvider chunkGenerator, IChunkProvider chunkProvider) public void generate(Random r, int chunkX, int chunkZ, World w, IChunkProvider chunkGenerator, IChunkProvider chunkProvider)
{ {
int sealevel = w.provider.getAverageGroundLevel() + 1; int sealevel = w.provider.getAverageGroundLevel() + 1;
if ( oreNormal == null || oreCharged == null ) if ( oreNormal == null || oreCharged == null )
return; return;
double oreDepthMultiplier = 15 * sealevel / 64; double oreDepthMultiplier = 15 * sealevel / 64;
int scale = (int) Math.round( r.nextGaussian() * Math.sqrt( oreDepthMultiplier ) + oreDepthMultiplier ); int scale = (int) Math.round( r.nextGaussian() * Math.sqrt( oreDepthMultiplier ) + oreDepthMultiplier );
for (int x = 0; x < (r.nextBoolean() ? scale * 2 : scale) / 2; ++x) for (int x = 0; x < (r.nextBoolean() ? scale * 2 : scale) / 2; ++x)
{ {
WorldGenMinable whichOre = r.nextFloat() > 0.92 ? oreCharged : oreNormal; WorldGenMinable whichOre = r.nextFloat() > 0.92 ? oreCharged : oreNormal;
int a = chunkX * 16 + r.nextInt( 22 ); int a = chunkX * 16 + r.nextInt( 22 );
int b = r.nextInt( 40 * sealevel / 64 ) + r.nextInt( 22 * sealevel / 64 ) + 12 * sealevel / 64; int b = r.nextInt( 40 * sealevel / 64 ) + r.nextInt( 22 * sealevel / 64 ) + 12 * sealevel / 64;
int c = chunkZ * 16 + r.nextInt( 22 ); int c = chunkZ * 16 + r.nextInt( 22 );
whichOre.generate( w, r, a, b, c ); whichOre.generate( w, r, a, b, c );
} }
} }
} }

View file

@ -1,136 +1,136 @@
package appeng.helpers; package appeng.hooks;
import java.util.Collection; import java.util.Collection;
import java.util.LinkedList; import java.util.LinkedList;
import java.util.Queue; import java.util.Queue;
import java.util.concurrent.Callable; import java.util.concurrent.Callable;
import net.minecraftforge.event.world.WorldEvent; import net.minecraftforge.event.world.WorldEvent;
import appeng.api.networking.IGridNode; import appeng.api.networking.IGridNode;
import appeng.core.AELog; import appeng.core.AELog;
import appeng.me.Grid; import appeng.me.Grid;
import appeng.me.NetworkList; import appeng.me.NetworkList;
import appeng.tile.AEBaseTile; import appeng.tile.AEBaseTile;
import appeng.util.Platform; import appeng.util.Platform;
import cpw.mods.fml.common.eventhandler.SubscribeEvent; import cpw.mods.fml.common.eventhandler.SubscribeEvent;
import cpw.mods.fml.common.gameevent.TickEvent; import cpw.mods.fml.common.gameevent.TickEvent;
import cpw.mods.fml.common.gameevent.TickEvent.Type; import cpw.mods.fml.common.gameevent.TickEvent.Type;
public class TickHandler public class TickHandler
{ {
class HandlerRep class HandlerRep
{ {
public Queue<AEBaseTile> tiles = new LinkedList(); public Queue<AEBaseTile> tiles = new LinkedList();
public Collection<Grid> networks = new NetworkList(); public Collection<Grid> networks = new NetworkList();
public void clear() public void clear()
{ {
tiles = new LinkedList(); tiles = new LinkedList();
networks = new NetworkList(); networks = new NetworkList();
} }
}; };
final public static TickHandler instance = new TickHandler(); final public static TickHandler instance = new TickHandler();
final private Queue<Callable> callQueue = new LinkedList(); final private Queue<Callable> callQueue = new LinkedList();
final private HandlerRep server = new HandlerRep(); final private HandlerRep server = new HandlerRep();
final private HandlerRep client = new HandlerRep(); final private HandlerRep client = new HandlerRep();
HandlerRep getRepo() HandlerRep getRepo()
{ {
if ( Platform.isServer() ) if ( Platform.isServer() )
return server; return server;
return client; return client;
} }
public void addCallable(Callable c) public void addCallable(Callable c)
{ {
callQueue.add( c ); callQueue.add( c );
} }
public void addInit(AEBaseTile tile) public void addInit(AEBaseTile tile)
{ {
getRepo().tiles.add( tile ); getRepo().tiles.add( tile );
} }
public void addNetwork(Grid grid) public void addNetwork(Grid grid)
{ {
if ( Platform.isServer() ) if ( Platform.isServer() )
getRepo().networks.add( grid ); getRepo().networks.add( grid );
} }
public void removeNetwork(Grid grid) public void removeNetwork(Grid grid)
{ {
if ( Platform.isServer() ) if ( Platform.isServer() )
getRepo().networks.remove( grid ); getRepo().networks.remove( grid );
} }
public Iterable<Grid> getGridList() public Iterable<Grid> getGridList()
{ {
return getRepo().networks; return getRepo().networks;
} }
public void shutdown() public void shutdown()
{ {
getRepo().clear(); getRepo().clear();
} }
@SubscribeEvent @SubscribeEvent
public void unloadWorld(WorldEvent.Unload ev) public void unloadWorld(WorldEvent.Unload ev)
{ {
if ( Platform.isServer() ) if ( Platform.isServer() )
{ {
LinkedList<IGridNode> toDestroy = new LinkedList(); LinkedList<IGridNode> toDestroy = new LinkedList();
for (Grid g : getRepo().networks) for (Grid g : getRepo().networks)
{ {
for (IGridNode n : g.getNodes()) for (IGridNode n : g.getNodes())
{ {
if ( n.getWorld() == ev.world ) if ( n.getWorld() == ev.world )
toDestroy.add( n ); toDestroy.add( n );
} }
} }
for (IGridNode n : toDestroy) for (IGridNode n : toDestroy)
n.destroy(); n.destroy();
} }
} }
@SubscribeEvent @SubscribeEvent
public void onTick(TickEvent ev) public void onTick(TickEvent ev)
{ {
if ( ev.type == Type.SERVER ) if ( ev.type == Type.SERVER )
{ {
HandlerRep repo = getRepo(); HandlerRep repo = getRepo();
while (!repo.tiles.isEmpty()) while (!repo.tiles.isEmpty())
{ {
AEBaseTile bt = repo.tiles.poll(); AEBaseTile bt = repo.tiles.poll();
bt.onReady(); bt.onReady();
} }
for (Grid g : getRepo().networks) for (Grid g : getRepo().networks)
{ {
g.update(); g.update();
} }
Callable c = null; Callable c = null;
while ((c = callQueue.poll()) != null) while ((c = callQueue.poll()) != null)
{ {
try try
{ {
c.call(); c.call();
} }
catch (Exception e) catch (Exception e)
{ {
AELog.error( e ); AELog.error( e );
} }
} }
} }
} }
} }

View file

@ -24,7 +24,7 @@ import net.minecraftforge.oredict.OreDictionary;
import appeng.block.misc.BlockTinyTNT; import appeng.block.misc.BlockTinyTNT;
import appeng.core.AEConfig; import appeng.core.AEConfig;
import appeng.core.features.AEFeature; import appeng.core.features.AEFeature;
import appeng.helpers.DispenserEntropyManipulator; import appeng.hooks.DispenserEntropyManipulator;
import appeng.items.tools.powered.powersink.AEBasePoweredItem; import appeng.items.tools.powered.powersink.AEBasePoweredItem;
import appeng.util.InWorldToolOperationResult; import appeng.util.InWorldToolOperationResult;
import appeng.util.Platform; import appeng.util.Platform;

View file

@ -36,7 +36,7 @@ import appeng.core.features.AEFeature;
import appeng.core.localization.GuiText; import appeng.core.localization.GuiText;
import appeng.core.localization.PlayerMessages; import appeng.core.localization.PlayerMessages;
import appeng.core.sync.packets.PacketMatterCannon; import appeng.core.sync.packets.PacketMatterCannon;
import appeng.helpers.DispenserMatterCannon; import appeng.hooks.DispenserMatterCannon;
import appeng.items.contents.CellConfig; import appeng.items.contents.CellConfig;
import appeng.items.contents.CellUpgrades; import appeng.items.contents.CellUpgrades;
import appeng.items.tools.powered.powersink.AEBasePoweredItem; import appeng.items.tools.powered.powersink.AEBasePoweredItem;

View file

@ -15,7 +15,7 @@ import appeng.api.networking.events.MENetworkEvent;
import appeng.api.networking.events.MENetworkPostCacheConstruction; import appeng.api.networking.events.MENetworkPostCacheConstruction;
import appeng.api.util.IReadOnlyCollection; import appeng.api.util.IReadOnlyCollection;
import appeng.core.WorldSettings; import appeng.core.WorldSettings;
import appeng.helpers.TickHandler; import appeng.hooks.TickHandler;
import appeng.util.ReadOnlyCollection; import appeng.util.ReadOnlyCollection;
public class Grid implements IGrid public class Grid implements IGrid

View file

@ -27,7 +27,7 @@ import appeng.api.util.AEColor;
import appeng.api.util.DimensionalCoord; import appeng.api.util.DimensionalCoord;
import appeng.api.util.IReadOnlyCollection; import appeng.api.util.IReadOnlyCollection;
import appeng.core.WorldSettings; import appeng.core.WorldSettings;
import appeng.helpers.TickHandler; import appeng.hooks.TickHandler;
import appeng.me.pathfinding.IPathItem; import appeng.me.pathfinding.IPathItem;
import appeng.util.ReadOnlyCollection; import appeng.util.ReadOnlyCollection;

View file

@ -23,7 +23,7 @@ import appeng.api.util.AEColor;
import appeng.api.util.DimensionalCoord; import appeng.api.util.DimensionalCoord;
import appeng.api.util.IOrientable; import appeng.api.util.IOrientable;
import appeng.core.WorldSettings; import appeng.core.WorldSettings;
import appeng.helpers.TickHandler; import appeng.hooks.TickHandler;
import appeng.me.GridAccessException; import appeng.me.GridAccessException;
import appeng.me.cache.P2PCache; import appeng.me.cache.P2PCache;
import appeng.parts.networking.PartCable; import appeng.parts.networking.PartCable;

View file

@ -1,356 +1,356 @@
package appeng.helpers; package appeng.parts;
import java.io.IOException; import java.io.IOException;
import java.util.LinkedList; import java.util.LinkedList;
import java.util.List; import java.util.List;
import net.minecraft.block.Block; import net.minecraft.block.Block;
import net.minecraft.block.Block.SoundType; import net.minecraft.block.Block.SoundType;
import net.minecraft.entity.player.EntityPlayer; import net.minecraft.entity.player.EntityPlayer;
import net.minecraft.item.ItemBlock; import net.minecraft.item.ItemBlock;
import net.minecraft.item.ItemStack; import net.minecraft.item.ItemStack;
import net.minecraft.tileentity.TileEntity; import net.minecraft.tileentity.TileEntity;
import net.minecraft.util.MovingObjectPosition; import net.minecraft.util.MovingObjectPosition;
import net.minecraft.world.World; import net.minecraft.world.World;
import net.minecraftforge.common.MinecraftForge; import net.minecraftforge.common.MinecraftForge;
import net.minecraftforge.common.util.ForgeDirection; import net.minecraftforge.common.util.ForgeDirection;
import net.minecraftforge.event.entity.player.PlayerDestroyItemEvent; import net.minecraftforge.event.entity.player.PlayerDestroyItemEvent;
import net.minecraftforge.event.entity.player.PlayerInteractEvent; import net.minecraftforge.event.entity.player.PlayerInteractEvent;
import net.minecraftforge.event.entity.player.PlayerInteractEvent.Action; import net.minecraftforge.event.entity.player.PlayerInteractEvent.Action;
import appeng.api.AEApi; import appeng.api.AEApi;
import appeng.api.parts.IFacadePart; import appeng.api.parts.IFacadePart;
import appeng.api.parts.IPartHost; import appeng.api.parts.IPartHost;
import appeng.api.parts.IPartItem; import appeng.api.parts.IPartItem;
import appeng.api.parts.PartItemStack; import appeng.api.parts.PartItemStack;
import appeng.api.parts.SelectedPart; import appeng.api.parts.SelectedPart;
import appeng.core.AELog; import appeng.core.AELog;
import appeng.core.AppEng; import appeng.core.AppEng;
import appeng.core.sync.network.NetworkHandler; import appeng.core.sync.network.NetworkHandler;
import appeng.core.sync.packets.PacketPartPlacement; import appeng.core.sync.packets.PacketPartPlacement;
import appeng.facade.IFacadeItem; import appeng.facade.IFacadeItem;
import appeng.integration.abstraction.IBC; import appeng.integration.abstraction.IBC;
import appeng.integration.abstraction.IFMP; import appeng.integration.abstraction.IFMP;
import appeng.util.LookDirection; import appeng.util.LookDirection;
import appeng.util.Platform; import appeng.util.Platform;
import cpw.mods.fml.common.eventhandler.SubscribeEvent; import cpw.mods.fml.common.eventhandler.SubscribeEvent;
public class PartPlacement public class PartPlacement
{ {
private ThreadLocal<Object> placing = new ThreadLocal<Object>(); private ThreadLocal<Object> placing = new ThreadLocal<Object>();
@SubscribeEvent @SubscribeEvent
public void playerInteract(PlayerInteractEvent event) public void playerInteract(PlayerInteractEvent event)
{ {
if ( event.action == Action.RIGHT_CLICK_BLOCK && event.entityPlayer.worldObj.isRemote ) if ( event.action == Action.RIGHT_CLICK_BLOCK && event.entityPlayer.worldObj.isRemote )
{ {
if ( placing.get() != null ) if ( placing.get() != null )
return; return;
placing.set( event ); placing.set( event );
ItemStack held = event.entityPlayer.getHeldItem(); 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 ) ) if ( place( held, event.x, event.y, event.z, event.face, event.entityPlayer, event.entityPlayer.worldObj, PlaceType.INTERACT_FIRST_PASS, 0 ) )
event.setCanceled( true ); event.setCanceled( true );
placing.set( null ); placing.set( null );
} }
} }
public enum PlaceType public enum PlaceType
{ {
PLACE_ITEM, INTERACT_FIRST_PASS, INTERACT_SECOND_PASS 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) 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 ) if ( depth > 3 )
return false; return false;
ForgeDirection side = ForgeDirection.getOrientation( face ); ForgeDirection side = ForgeDirection.getOrientation( face );
if ( held != null && Platform.isWrench( player, held, x, y, z ) && player.isSneaking() ) if ( held != null && Platform.isWrench( player, held, x, y, z ) && player.isSneaking() )
{ {
Block block = world.getBlock( x, y, z ); Block block = world.getBlock( x, y, z );
TileEntity tile = world.getTileEntity( x, y, z ); TileEntity tile = world.getTileEntity( x, y, z );
IPartHost host = null; IPartHost host = null;
if ( tile instanceof IPartHost ) if ( tile instanceof IPartHost )
host = (IPartHost) tile; host = (IPartHost) tile;
if ( host != null ) if ( host != null )
{ {
if ( !world.isRemote ) if ( !world.isRemote )
{ {
LookDirection dir = Platform.getPlayerRay( player ); LookDirection dir = Platform.getPlayerRay( player );
MovingObjectPosition mop = block.collisionRayTrace( world, x, y, z, dir.a, dir.b ); MovingObjectPosition mop = block.collisionRayTrace( world, x, y, z, dir.a, dir.b );
if ( mop != null ) if ( mop != null )
{ {
List<ItemStack> is = new LinkedList(); List<ItemStack> is = new LinkedList();
SelectedPart sp = host.selectPart( mop.hitVec.addVector( -mop.blockX, -mop.blockY, -mop.blockZ ) ); SelectedPart sp = host.selectPart( mop.hitVec.addVector( -mop.blockX, -mop.blockY, -mop.blockZ ) );
if ( sp.part != null ) if ( sp.part != null )
{ {
is.add( sp.part.getItemStack( PartItemStack.Wrench ) ); is.add( sp.part.getItemStack( PartItemStack.Wrench ) );
sp.part.getDrops( is, true ); sp.part.getDrops( is, true );
host.removePart( sp.side, false ); host.removePart( sp.side, false );
} }
if ( sp.facade != null ) if ( sp.facade != null )
{ {
is.add( sp.facade.getItemStack() ); is.add( sp.facade.getItemStack() );
host.getFacadeContainer().removeFacade( host, sp.side ); host.getFacadeContainer().removeFacade( host, sp.side );
world.notifyBlocksOfNeighborChange( x, y, z, Platform.air ); world.notifyBlocksOfNeighborChange( x, y, z, Platform.air );
} }
if ( host.isEmpty() ) if ( host.isEmpty() )
world.setBlock( x, y, z, Platform.air ); world.setBlock( x, y, z, Platform.air );
if ( is != null && !is.isEmpty() ) if ( is != null && !is.isEmpty() )
{ {
Platform.spawnDrops( world, x, y, z, is ); Platform.spawnDrops( world, x, y, z, is );
} }
} }
} }
else else
{ {
player.swingItem(); player.swingItem();
try try
{ {
NetworkHandler.instance.sendToServer( new PacketPartPlacement( x, y, z, face ) ); NetworkHandler.instance.sendToServer( new PacketPartPlacement( x, y, z, face ) );
} }
catch (IOException e) catch (IOException e)
{ {
AELog.error( e ); AELog.error( e );
} }
} }
return true; return true;
} }
return false; return false;
} }
TileEntity tile = world.getTileEntity( x, y, z ); TileEntity tile = world.getTileEntity( x, y, z );
IPartHost host = null; IPartHost host = null;
if ( tile instanceof IPartHost ) if ( tile instanceof IPartHost )
host = (IPartHost) tile; host = (IPartHost) tile;
if ( held != null ) if ( held != null )
{ {
IFacadePart fp = isFacade( held, side ); IFacadePart fp = isFacade( held, side );
if ( fp != null ) if ( fp != null )
{ {
if ( host != null ) if ( host != null )
{ {
if ( !world.isRemote ) if ( !world.isRemote )
{ {
if ( host.getPart( ForgeDirection.UNKNOWN ) == null ) if ( host.getPart( ForgeDirection.UNKNOWN ) == null )
return false; return false;
if ( host.getFacadeContainer().addFacade( fp ) ) if ( host.getFacadeContainer().addFacade( fp ) )
{ {
host.markForUpdate(); host.markForUpdate();
if ( !player.capabilities.isCreativeMode ) if ( !player.capabilities.isCreativeMode )
{ {
held.stackSize--; held.stackSize--;
if ( held.stackSize == 0 ) if ( held.stackSize == 0 )
{ {
player.inventory.mainInventory[player.inventory.currentItem] = null; player.inventory.mainInventory[player.inventory.currentItem] = null;
MinecraftForge.EVENT_BUS.post( new PlayerDestroyItemEvent( player, held ) ); MinecraftForge.EVENT_BUS.post( new PlayerDestroyItemEvent( player, held ) );
} }
} }
return true; return true;
} }
} }
else else
{ {
player.swingItem(); player.swingItem();
try try
{ {
NetworkHandler.instance.sendToServer( new PacketPartPlacement( x, y, z, face ) ); NetworkHandler.instance.sendToServer( new PacketPartPlacement( x, y, z, face ) );
return true; return true;
} }
catch (IOException e) catch (IOException e)
{ {
AELog.error( e ); AELog.error( e );
} }
} }
} }
return false; return false;
} }
} }
if ( host == null && tile != null && AppEng.instance.isIntegrationEnabled( "FMP" ) ) if ( host == null && tile != null && AppEng.instance.isIntegrationEnabled( "FMP" ) )
host = ((IFMP) AppEng.instance.getIntegration( "FMP" )).getOrCreateHost( tile ); host = ((IFMP) AppEng.instance.getIntegration( "FMP" )).getOrCreateHost( tile );
// if ( held == null ) // if ( held == null )
{ {
Block block = world.getBlock( x, y, z ); Block block = world.getBlock( x, y, z );
if ( host != null && player.isSneaking() && block != null ) if ( host != null && player.isSneaking() && block != null )
{ {
LookDirection dir = Platform.getPlayerRay( player ); LookDirection dir = Platform.getPlayerRay( player );
MovingObjectPosition mop = block.collisionRayTrace( world, x, y, z, dir.a, dir.b ); MovingObjectPosition mop = block.collisionRayTrace( world, x, y, z, dir.a, dir.b );
if ( mop != null ) if ( mop != null )
{ {
mop.hitVec = mop.hitVec.addVector( -mop.blockX, -mop.blockY, -mop.blockZ ); mop.hitVec = mop.hitVec.addVector( -mop.blockX, -mop.blockY, -mop.blockZ );
SelectedPart sPart = host.selectPart( mop.hitVec ); SelectedPart sPart = host.selectPart( mop.hitVec );
if ( sPart != null && sPart.part != null ) if ( sPart != null && sPart.part != null )
if ( sPart.part.onShiftActivate( player, mop.hitVec ) ) if ( sPart.part.onShiftActivate( player, mop.hitVec ) )
{ {
if ( world.isRemote ) if ( world.isRemote )
{ {
try try
{ {
NetworkHandler.instance.sendToServer( new PacketPartPlacement( x, y, z, face ) ); NetworkHandler.instance.sendToServer( new PacketPartPlacement( x, y, z, face ) );
} }
catch (IOException e) catch (IOException e)
{ {
AELog.error( e ); AELog.error( e );
} }
} }
return true; return true;
} }
} }
} }
} }
if ( held == null || !(held.getItem() instanceof IPartItem) ) if ( held == null || !(held.getItem() instanceof IPartItem) )
return false; return false;
int te_x = x; int te_x = x;
int te_y = y; int te_y = y;
int te_z = z; int te_z = z;
if ( host == null && pass == PlaceType.PLACE_ITEM ) if ( host == null && pass == PlaceType.PLACE_ITEM )
{ {
ItemStack is = AEApi.instance().blocks().blockMultiPart.stack( 1 ); ItemStack is = AEApi.instance().blocks().blockMultiPart.stack( 1 );
ItemBlock ib = (ItemBlock) is.getItem(); ItemBlock ib = (ItemBlock) is.getItem();
ForgeDirection offset = ForgeDirection.UNKNOWN; ForgeDirection offset = ForgeDirection.UNKNOWN;
Block blkID = world.getBlock( x, y, z ); Block blkID = world.getBlock( x, y, z );
if ( blkID != null && !blkID.isReplaceable( world, x, y, z ) ) if ( blkID != null && !blkID.isReplaceable( world, x, y, z ) )
{ {
offset = side; offset = side;
if ( Platform.isServer() ) if ( Platform.isServer() )
side = side.getOpposite(); side = side.getOpposite();
} }
te_x = x + offset.offsetX; te_x = x + offset.offsetX;
te_y = y + offset.offsetY; te_y = y + offset.offsetY;
te_z = z + offset.offsetZ; te_z = z + offset.offsetZ;
tile = world.getTileEntity( te_x, te_y, te_z ); tile = world.getTileEntity( te_x, te_y, te_z );
if ( tile instanceof IPartHost ) if ( tile instanceof IPartHost )
host = (IPartHost) tile; host = (IPartHost) tile;
if ( host == null && tile != null && AppEng.instance.isIntegrationEnabled( "FMP" ) ) if ( host == null && tile != null && AppEng.instance.isIntegrationEnabled( "FMP" ) )
host = ((IFMP) AppEng.instance.getIntegration( "FMP" )).getOrCreateHost( tile ); host = ((IFMP) AppEng.instance.getIntegration( "FMP" )).getOrCreateHost( tile );
if ( host == null && AEApi.instance().blocks().blockMultiPart.block().canPlaceBlockAt( world, te_x, te_y, te_z ) 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 ) ) && ib.placeBlockAt( is, player, world, te_x, te_y, te_z, side.ordinal(), 0.5f, 0.5f, 0.5f, 0 ) )
{ {
if ( !world.isRemote ) if ( !world.isRemote )
{ {
tile = world.getTileEntity( te_x, te_y, te_z ); tile = world.getTileEntity( te_x, te_y, te_z );
if ( tile instanceof IPartHost ) if ( tile instanceof IPartHost )
host = (IPartHost) tile; host = (IPartHost) tile;
pass = PlaceType.INTERACT_SECOND_PASS; pass = PlaceType.INTERACT_SECOND_PASS;
} }
else else
{ {
player.swingItem(); player.swingItem();
try try
{ {
NetworkHandler.instance.sendToServer( new PacketPartPlacement( x, y, z, face ) ); NetworkHandler.instance.sendToServer( new PacketPartPlacement( x, y, z, face ) );
} }
catch (IOException e) catch (IOException e)
{ {
AELog.error( e ); AELog.error( e );
} }
return true; return true;
} }
} }
else if ( host != null && !host.canAddPart( held, side ) ) else if ( host != null && !host.canAddPart( held, side ) )
return false; return false;
} }
if ( host == null ) if ( host == null )
return false; return false;
if ( !host.canAddPart( held, side ) ) if ( !host.canAddPart( held, side ) )
{ {
if ( pass == PlaceType.INTERACT_FIRST_PASS || pass == PlaceType.PLACE_ITEM ) if ( pass == PlaceType.INTERACT_FIRST_PASS || pass == PlaceType.PLACE_ITEM )
{ {
ForgeDirection offset = side; ForgeDirection offset = side;
te_x = x + offset.offsetX; te_x = x + offset.offsetX;
te_y = y + offset.offsetY; te_y = y + offset.offsetY;
te_z = z + offset.offsetZ; te_z = z + offset.offsetZ;
Block blkID = world.getBlock( te_x, te_y, te_z ); Block blkID = world.getBlock( te_x, te_y, te_z );
tile = world.getTileEntity( te_x, te_y, te_z ); tile = world.getTileEntity( te_x, te_y, te_z );
if ( tile != null && AppEng.instance.isIntegrationEnabled( "FMP" ) ) if ( tile != null && AppEng.instance.isIntegrationEnabled( "FMP" ) )
host = ((IFMP) AppEng.instance.getIntegration( "FMP" )).getOrCreateHost( tile ); 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 ) 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, 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 ); pass == PlaceType.INTERACT_FIRST_PASS ? PlaceType.INTERACT_SECOND_PASS : PlaceType.PLACE_ITEM, depth + 1 );
} }
return false; return false;
} }
if ( !world.isRemote ) if ( !world.isRemote )
{ {
ForgeDirection mySide = host.addPart( held, side, player ); ForgeDirection mySide = host.addPart( held, side, player );
if ( mySide != null ) if ( mySide != null )
{ {
SoundType ss = AEApi.instance().blocks().blockMultiPart.block().stepSound; SoundType ss = AEApi.instance().blocks().blockMultiPart.block().stepSound;
// ss.getPlaceSound() // 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 ); 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 ) if ( !player.capabilities.isCreativeMode )
{ {
held.stackSize--; held.stackSize--;
if ( held.stackSize == 0 ) if ( held.stackSize == 0 )
{ {
player.inventory.mainInventory[player.inventory.currentItem] = null; player.inventory.mainInventory[player.inventory.currentItem] = null;
MinecraftForge.EVENT_BUS.post( new PlayerDestroyItemEvent( player, held ) ); MinecraftForge.EVENT_BUS.post( new PlayerDestroyItemEvent( player, held ) );
} }
} }
} }
} }
else else
{ {
player.swingItem(); player.swingItem();
try try
{ {
NetworkHandler.instance.sendToServer( new PacketPartPlacement( x, y, z, face ) ); NetworkHandler.instance.sendToServer( new PacketPartPlacement( x, y, z, face ) );
} }
catch (IOException e) catch (IOException e)
{ {
AELog.error( e ); AELog.error( e );
} }
} }
return true; return true;
} }
private static IFacadePart isFacade(ItemStack held, ForgeDirection side) private static IFacadePart isFacade(ItemStack held, ForgeDirection side)
{ {
if ( held.getItem() instanceof IFacadeItem ) if ( held.getItem() instanceof IFacadeItem )
return ((IFacadeItem) held.getItem()).createPartFromItemStack( held, side ); return ((IFacadeItem) held.getItem()).createPartFromItemStack( held, side );
if ( AppEng.instance.isIntegrationEnabled( "BC" ) ) if ( AppEng.instance.isIntegrationEnabled( "BC" ) )
{ {
IBC bc = (IBC) AppEng.instance.getIntegration( "BC" ); IBC bc = (IBC) AppEng.instance.getIntegration( "BC" );
if ( bc.isFacade( held ) ) if ( bc.isFacade( held ) )
return bc.createFacadePart( held, side ); return bc.createFacadePart( held, side );
} }
return null; return null;
} }
} }

View file

@ -36,7 +36,7 @@ import appeng.api.storage.data.IAEItemStack;
import appeng.client.texture.CableBusTextures; import appeng.client.texture.CableBusTextures;
import appeng.core.AELog; import appeng.core.AELog;
import appeng.core.sync.packets.PacketTransitionEffect; import appeng.core.sync.packets.PacketTransitionEffect;
import appeng.helpers.TickHandler; import appeng.hooks.TickHandler;
import appeng.me.GridAccessException; import appeng.me.GridAccessException;
import appeng.parts.PartBasicState; import appeng.parts.PartBasicState;
import appeng.server.ServerHelper; import appeng.server.ServerHelper;

View file

@ -20,7 +20,7 @@ import appeng.api.networking.ticking.TickingRequest;
import appeng.api.parts.IPartHost; import appeng.api.parts.IPartHost;
import appeng.api.util.AECableType; import appeng.api.util.AECableType;
import appeng.core.AELog; import appeng.core.AELog;
import appeng.helpers.TickHandler; import appeng.hooks.TickHandler;
import appeng.me.GridAccessException; import appeng.me.GridAccessException;
import appeng.me.cache.helpers.Connections; import appeng.me.cache.helpers.Connections;
import appeng.me.cache.helpers.TunnelConnection; import appeng.me.cache.helpers.TunnelConnection;

View file

@ -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<CompassMessage> 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<World, CompassReader> 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
}
}
}
}

View file

@ -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;
}
}

View file

@ -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<Long, CompassRegion> 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;
}
}

View file

@ -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" );
}
}

View file

@ -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);
}

View file

@ -0,0 +1,14 @@
package appeng.tile.misc;
import appeng.tile.AEBaseTile;
public class TileSkyCompass extends AEBaseTile
{
@Override
public boolean requiresTESR()
{
return true;
}
}

View file

@ -28,7 +28,7 @@ import appeng.api.util.AEColor;
import appeng.api.util.DimensionalCoord; import appeng.api.util.DimensionalCoord;
import appeng.helpers.AEMultiTile; import appeng.helpers.AEMultiTile;
import appeng.helpers.ICustomCollision; import appeng.helpers.ICustomCollision;
import appeng.helpers.TickHandler; import appeng.hooks.TickHandler;
import appeng.parts.CableBusContainer; import appeng.parts.CableBusContainer;
import appeng.tile.AEBaseTile; import appeng.tile.AEBaseTile;
import appeng.tile.events.AETileEventHandler; import appeng.tile.events.AETileEventHandler;

View file

@ -7,6 +7,7 @@ import java.util.ArrayList;
import java.util.Arrays; import java.util.Arrays;
import java.util.List; import java.util.List;
import net.minecraft.entity.player.EntityPlayer;
import net.minecraft.inventory.IInventory; import net.minecraft.inventory.IInventory;
import net.minecraft.item.Item; import net.minecraft.item.Item;
import net.minecraft.item.ItemStack; 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.IAEItemStack;
import appeng.api.storage.data.IAEStack; import appeng.api.storage.data.IAEStack;
import appeng.api.util.IConfigManager; import appeng.api.util.IConfigManager;
import appeng.helpers.AENoHandler;
import appeng.helpers.IPriorityHost; import appeng.helpers.IPriorityHost;
import appeng.me.GridAccessException; import appeng.me.GridAccessException;
import appeng.me.storage.MEInventoryHandler; 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 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 sides[] = new int[] { 0 };
static final int front[] = new int[] { 1 }; static final int front[] = new int[] { 1 };
AppEngInternalInventory inv = new AppEngInternalInventory( this, 2 ); AppEngInternalInventory inv = new AppEngInternalInventory( this, 2 );
BaseActionSource mySrc = new MachineSource( this ); BaseActionSource mySrc = new MachineSource( this );
IConfigManager config = new ConfigManager(this); IConfigManager config = new ConfigManager( this );
ItemStack storageType; ItemStack storageType;
long lastStateChange = 0; long lastStateChange = 0;
@ -219,14 +226,14 @@ public class TileChest extends AENetworkPowerTile implements IMEChest, IFluidHan
@Override @Override
public void readFromNBT(NBTTagCompound data) public void readFromNBT(NBTTagCompound data)
{ {
config.readFromNBT(data); config.readFromNBT( data );
priority = data.getInteger( "priority" ); priority = data.getInteger( "priority" );
} }
@Override @Override
public void writeToNBT(NBTTagCompound data) public void writeToNBT(NBTTagCompound data)
{ {
config.writeToNBT(data); config.writeToNBT( data );
data.setInteger( "priority", priority ); data.setInteger( "priority", priority );
} }
@ -248,9 +255,9 @@ public class TileChest extends AENetworkPowerTile implements IMEChest, IFluidHan
gridProxy.setFlags( GridFlags.REQUIRE_CHANNEL ); gridProxy.setFlags( GridFlags.REQUIRE_CHANNEL );
addNewHandler( new invManger() ); addNewHandler( new invManger() );
config.registerSetting(Settings.SORT_BY, SortOrder.NAME); config.registerSetting( Settings.SORT_BY, SortOrder.NAME );
config.registerSetting(Settings.VIEW_MODE, ViewItems.ALL); config.registerSetting( Settings.VIEW_MODE, ViewItems.ALL );
config.registerSetting(Settings.SORT_DIRECTION, SortDir.ASCENDING); config.registerSetting( Settings.SORT_DIRECTION, SortDir.ASCENDING );
internalPublicPowerStorage = true; internalPublicPowerStorage = true;
internalPowerFlow = AccessRestriction.WRITE; internalPowerFlow = AccessRestriction.WRITE;
@ -345,7 +352,7 @@ public class TileChest extends AENetworkPowerTile implements IMEChest, IFluidHan
return g; return g;
} }
public IMEInventoryHandler getHandler(StorageChannel channel) throws AENoHandler public IMEInventoryHandler getHandler(StorageChannel channel) throws ChestNoHandler
{ {
if ( !isCached ) if ( !isCached )
{ {
@ -447,7 +454,7 @@ public class TileChest extends AENetworkPowerTile implements IMEChest, IFluidHan
inv.setInventorySlotContents( 0, returns.getItemStack() ); 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 ); IAEItemStack returns = cell.injectItems( AEApi.instance().storage().createItemStack( inv.getStackInSlot( 0 ) ), Actionable.SIMULATE, mySrc );
return returns == null || returns.getStackSize() != itemstack.stackSize; 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 ) } ); return Arrays.asList( new IMEInventoryHandler[] { getHandler( channel ) } );
} }
catch (AENoHandler e) catch (ChestNoHandler e)
{ {
// :P // :P
} }
@ -551,7 +558,7 @@ public class TileChest extends AENetworkPowerTile implements IMEChest, IFluidHan
if ( ch != null && handler instanceof ChestMonitorHandler ) if ( ch != null && handler instanceof ChestMonitorHandler )
return ch.getStatusForCell( cell, ((ChestMonitorHandler) handler).getInternalHandler() ); 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 ) if ( ch != null && handler instanceof ChestMonitorHandler )
return ch.getStatusForCell( cell, ((ChestMonitorHandler) handler).getInternalHandler() ); 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(); 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 ); IMEInventoryHandler h = getHandler( StorageChannel.FLUIDS );
return h.canAccept( AEFluidStack.create( new FluidStack( fluid, 1 ) ) ); return h.canAccept( AEFluidStack.create( new FluidStack( fluid, 1 ) ) );
} }
catch (AENoHandler e) catch (ChestNoHandler e)
{ {
} }
return false; return false;
@ -636,7 +643,7 @@ public class TileChest extends AENetworkPowerTile implements IMEChest, IFluidHan
if ( h.getChannel() == StorageChannel.FLUIDS ) if ( h.getChannel() == StorageChannel.FLUIDS )
return new FluidTankInfo[] { new FluidTankInfo( null ) }; // eh? 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 @Override
public IConfigManager getConfigManager() { public IConfigManager getConfigManager()
{
return config; return config;
} }
@Override @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;
} }
} }