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

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.entity.EntityIds;
import appeng.entity.EntityTinyTNTPrimed;
import appeng.helpers.DispenserBehaviorTinyTNT;
import appeng.helpers.ICustomCollision;
import appeng.hooks.DispenserBehaviorTinyTNT;
import cpw.mods.fml.common.registry.EntityRegistry;
public class BlockTinyTNT extends AEBaseBlock implements ICustomCollision

View file

@ -3,6 +3,7 @@ package appeng.block.solids;
import java.util.EnumSet;
import java.util.List;
import net.minecraft.block.Block;
import net.minecraft.block.material.Material;
import net.minecraft.client.renderer.texture.IIconRegister;
import net.minecraft.creativetab.CreativeTabs;
@ -15,6 +16,7 @@ import net.minecraft.world.World;
import appeng.api.util.IOrientable;
import appeng.api.util.IOrientableBlock;
import appeng.block.AEBaseBlock;
import appeng.core.WorldSettings;
import appeng.core.features.AEFeature;
import appeng.helpers.LocationRotation;
import cpw.mods.fml.relauncher.Side;
@ -110,4 +112,18 @@ public class BlockSkyStone extends AEBaseBlock implements IOrientableBlock
l.add( new ItemStack( i, 1, 3 ) );
}
@Override
public void onBlockAdded(World w, int x, int y, int z)
{
super.onBlockAdded( w, x, y, z );
WorldSettings.getInstance().getCompass().updateArea( w, x, y, z );
}
@Override
public void breakBlock(World w, int x, int y, int z, Block b, int WTF)
{
super.breakBlock( w, x, y, z, b, WTF );
WorldSettings.getInstance().getCompass().updateArea( w, x, y, z );
}
}

View file

@ -9,15 +9,12 @@ import net.minecraft.world.World;
import net.minecraftforge.common.util.ForgeDirection;
import appeng.api.AEApi;
import appeng.api.storage.ICellHandler;
import appeng.api.storage.IMEInventoryHandler;
import appeng.api.storage.StorageChannel;
import appeng.block.AEBaseBlock;
import appeng.client.render.BaseBlockRender;
import appeng.client.render.blocks.RenderMEChest;
import appeng.core.features.AEFeature;
import appeng.core.localization.PlayerMessages;
import appeng.core.sync.GuiBridge;
import appeng.helpers.AENoHandler;
import appeng.tile.storage.TileChest;
import appeng.util.Platform;
@ -56,36 +53,7 @@ public class BlockChest extends AEBaseBlock
{
ICellHandler ch = AEApi.instance().registries().cell().getHander( cell );
try
{
IMEInventoryHandler ih = tg.getHandler( StorageChannel.ITEMS );
if ( ch != null && ih != null )
{
IMEInventoryHandler mine = ih;
ch.openChestGui( p, tg, ch, mine, cell, StorageChannel.ITEMS );
return true;
}
}
catch (AENoHandler e)
{
// :P
}
try
{
IMEInventoryHandler fh = tg.getHandler( StorageChannel.FLUIDS );
if ( ch != null && fh != null )
{
IMEInventoryHandler mine = fh;
ch.openChestGui( p, tg, ch, mine, cell, StorageChannel.FLUIDS );
return true;
}
}
catch (AENoHandler e)
{
// :P
}
tg.openGui( p, ch, cell, side );
}
p.addChatMessage( PlayerMessages.ChestCannotReadStorageCell.get() );

View file

@ -16,6 +16,7 @@ import net.minecraft.item.ItemStack;
import net.minecraft.tileentity.TileEntity;
import net.minecraft.util.IIcon;
import net.minecraft.world.IBlockAccess;
import net.minecraftforge.client.IItemRenderer.ItemRenderType;
import net.minecraftforge.common.util.ForgeDirection;
import org.lwjgl.BufferUtils;
@ -356,7 +357,7 @@ public class BaseBlockRender
}
}
public void renderInventory(AEBaseBlock block, ItemStack item, RenderBlocks renderer)
public void renderInventory(AEBaseBlock block, ItemStack item, RenderBlocks renderer, ItemRenderType type)
{
Tessellator tess = Tessellator.instance;

View file

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

View file

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

View file

@ -9,6 +9,7 @@ import net.minecraft.client.renderer.Tessellator;
import net.minecraft.inventory.IInventory;
import net.minecraft.item.ItemStack;
import net.minecraft.world.IBlockAccess;
import net.minecraftforge.client.IItemRenderer.ItemRenderType;
import net.minecraftforge.common.util.ForgeDirection;
import org.lwjgl.opengl.GL11;
@ -31,7 +32,7 @@ public class RenderBlockCharger extends BaseBlockRender
}
@Override
public void renderInventory(AEBaseBlock blk, ItemStack is, RenderBlocks renderer)
public void renderInventory(AEBaseBlock blk, ItemStack is, RenderBlocks renderer, ItemRenderType type)
{
Tessellator tess = Tessellator.instance;

View file

@ -7,6 +7,7 @@ import net.minecraft.client.renderer.Tessellator;
import net.minecraft.client.renderer.texture.TextureMap;
import net.minecraft.item.ItemStack;
import net.minecraft.world.IBlockAccess;
import net.minecraftforge.client.IItemRenderer.ItemRenderType;
import net.minecraftforge.common.util.ForgeDirection;
import org.lwjgl.opengl.GL11;
@ -24,15 +25,15 @@ public class RenderBlockCrank extends BaseBlockRender
}
@Override
public void renderInventory(AEBaseBlock blk, ItemStack is, RenderBlocks renderer)
public void renderInventory(AEBaseBlock blk, ItemStack is, RenderBlocks renderer, ItemRenderType type)
{
renderer.renderAllFaces = true;
renderer.setRenderBounds( 0.5D - 0.05, 0.5D - 0.5, 0.5D - 0.05, 0.5D + 0.05, 0.5D + 0.3, 0.5D + 0.05 );
super.renderInventory( blk, is, renderer );
super.renderInventory( blk, is, renderer, type );
renderer.setRenderBounds( 0.70D - 0.15, 0.75D - 0.05, 0.5D - 0.05, 0.70D + 0.28, 0.75D + 0.05, 0.5D + 0.05 );
super.renderInventory( blk, is, renderer );
super.renderInventory( blk, is, renderer, type );
renderer.renderAllFaces = false;
}

View file

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

View file

@ -7,6 +7,7 @@ import net.minecraft.client.renderer.Tessellator;
import net.minecraft.item.ItemStack;
import net.minecraft.util.ResourceLocation;
import net.minecraft.world.IBlockAccess;
import net.minecraftforge.client.IItemRenderer.ItemRenderType;
import org.lwjgl.opengl.GL11;
@ -25,7 +26,7 @@ public class RenderBlockSkyChest extends BaseBlockRender
}
@Override
public void renderInventory(AEBaseBlock blk, ItemStack is, RenderBlocks renderer)
public void renderInventory(AEBaseBlock blk, ItemStack is, RenderBlocks renderer, ItemRenderType type)
{
GL11.glEnable( 32826 /* GL_RESCALE_NORMAL_EXT */);
GL11.glColor4f( 1.0F, 1.0F, 1.0F, 1.0F );

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

View file

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

View file

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

View file

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

View file

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

View file

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

View file

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

View file

@ -7,6 +7,7 @@ import net.minecraft.client.renderer.Tessellator;
import net.minecraft.init.Blocks;
import net.minecraft.item.ItemStack;
import net.minecraft.world.IBlockAccess;
import net.minecraftforge.client.IItemRenderer.ItemRenderType;
import net.minecraftforge.common.util.ForgeDirection;
import appeng.api.util.IOrientable;
import appeng.block.AEBaseBlock;
@ -21,7 +22,7 @@ public class RenderQuartzTorch extends BaseBlockRender
}
@Override
public void renderInventory(AEBaseBlock blk, ItemStack is, RenderBlocks renderer)
public void renderInventory(AEBaseBlock blk, ItemStack is, RenderBlocks renderer, ItemRenderType type)
{
Tessellator tess = Tessellator.instance;

View file

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

View file

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

View file

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

View file

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

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.sync.GuiBridge;
import appeng.core.sync.network.NetworkHandler;
import appeng.helpers.TickHandler;
import appeng.hooks.TickHandler;
import appeng.integration.IntegrationRegistry;
import appeng.integration.IntegrationSide;
import appeng.server.AECommand;

View file

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

View file

@ -13,6 +13,7 @@ import net.minecraftforge.common.config.Property;
import appeng.api.util.WorldCoord;
import appeng.me.GridStorage;
import appeng.me.GridStorageSearch;
import appeng.services.CompassService;
public class WorldSettings extends Configuration
{
@ -22,8 +23,17 @@ public class WorldSettings extends Configuration
long lastGridStorage = 0;
int lastPlayer = 0;
public WorldSettings(File f) {
super( f );
private CompassService compass;
File AEFolder;
public WorldSettings(File aeFolder) {
super( new File( aeFolder.getPath() + File.separatorChar + "settings.cfg" ) );
AEFolder = aeFolder;
compass = new CompassService( AEFolder );
(new Thread( compass, "AE Compass Service" )).start();
try
{
lastGridStorage = Long.parseLong( get( "Counters", "lastGridStorage", 0 ).getString() );
@ -36,11 +46,21 @@ public class WorldSettings extends Configuration
}
}
public CompassService getCompass()
{
return compass;
}
public static WorldSettings getInstance()
{
if ( instance == null )
{
File f = DimensionManager.getWorld( 0 ).getSaveHandler().getMapFileFromName( "AppEng" );
File world = DimensionManager.getWorld( 0 ).getSaveHandler().getWorldDirectory();
File f = new File( world.getPath() + File.separatorChar + "AE2" );
if ( !f.exists() || !f.isDirectory() )
f.mkdir();
instance = new WorldSettings( f );
}
@ -60,6 +80,7 @@ public class WorldSettings extends Configuration
public void shutdown()
{
save();
compass.kill();
instance = null;
}
@ -181,4 +202,5 @@ public class WorldSettings extends Configuration
return prop.getInt();
}
}
}

View file

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

View file

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

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 appeng.core.sync.AppEngPacket;
import appeng.core.sync.network.INetworkInfo;
import appeng.helpers.PartPlacement;
import appeng.parts.PartPlacement;
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.IPartHost;
import appeng.core.features.AEFeature;
import appeng.helpers.TickHandler;
import appeng.hooks.TickHandler;
import appeng.items.AEBaseItem;
import appeng.me.Grid;
import appeng.me.GridNode;

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

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.dispenser.BehaviorDefaultDispenseItem;

View file

@ -1,4 +1,4 @@
package appeng.helpers;
package appeng.hooks;
import net.minecraft.block.BlockDispenser;
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.dispenser.BehaviorDefaultDispenseItem;

View file

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

View file

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

View file

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

View file

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

View file

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

View file

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

View file

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

View file

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

View file

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

View file

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

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.helpers.AEMultiTile;
import appeng.helpers.ICustomCollision;
import appeng.helpers.TickHandler;
import appeng.hooks.TickHandler;
import appeng.parts.CableBusContainer;
import appeng.tile.AEBaseTile;
import appeng.tile.events.AETileEventHandler;

View file

@ -7,6 +7,7 @@ import java.util.ArrayList;
import java.util.Arrays;
import java.util.List;
import net.minecraft.entity.player.EntityPlayer;
import net.minecraft.inventory.IInventory;
import net.minecraft.item.Item;
import net.minecraft.item.ItemStack;
@ -50,7 +51,6 @@ import appeng.api.storage.data.IAEFluidStack;
import appeng.api.storage.data.IAEItemStack;
import appeng.api.storage.data.IAEStack;
import appeng.api.util.IConfigManager;
import appeng.helpers.AENoHandler;
import appeng.helpers.IPriorityHost;
import appeng.me.GridAccessException;
import appeng.me.storage.MEInventoryHandler;
@ -67,14 +67,21 @@ import appeng.util.item.AEFluidStack;
public class TileChest extends AENetworkPowerTile implements IMEChest, IFluidHandler, ITerminalHost, IPriorityHost, IConfigManagerHost
{
static final AENoHandler noHandler = new AENoHandler();
static private class ChestNoHandler extends Exception
{
private static final long serialVersionUID = 7995805326136526631L;
}
static final ChestNoHandler noHandler = new ChestNoHandler();
static final int sides[] = new int[] { 0 };
static final int front[] = new int[] { 1 };
AppEngInternalInventory inv = new AppEngInternalInventory( this, 2 );
BaseActionSource mySrc = new MachineSource( this );
IConfigManager config = new ConfigManager(this);
IConfigManager config = new ConfigManager( this );
ItemStack storageType;
long lastStateChange = 0;
@ -219,14 +226,14 @@ public class TileChest extends AENetworkPowerTile implements IMEChest, IFluidHan
@Override
public void readFromNBT(NBTTagCompound data)
{
config.readFromNBT(data);
config.readFromNBT( data );
priority = data.getInteger( "priority" );
}
@Override
public void writeToNBT(NBTTagCompound data)
{
config.writeToNBT(data);
config.writeToNBT( data );
data.setInteger( "priority", priority );
}
@ -248,9 +255,9 @@ public class TileChest extends AENetworkPowerTile implements IMEChest, IFluidHan
gridProxy.setFlags( GridFlags.REQUIRE_CHANNEL );
addNewHandler( new invManger() );
config.registerSetting(Settings.SORT_BY, SortOrder.NAME);
config.registerSetting(Settings.VIEW_MODE, ViewItems.ALL);
config.registerSetting(Settings.SORT_DIRECTION, SortDir.ASCENDING);
config.registerSetting( Settings.SORT_BY, SortOrder.NAME );
config.registerSetting( Settings.VIEW_MODE, ViewItems.ALL );
config.registerSetting( Settings.SORT_DIRECTION, SortDir.ASCENDING );
internalPublicPowerStorage = true;
internalPowerFlow = AccessRestriction.WRITE;
@ -345,7 +352,7 @@ public class TileChest extends AENetworkPowerTile implements IMEChest, IFluidHan
return g;
}
public IMEInventoryHandler getHandler(StorageChannel channel) throws AENoHandler
public IMEInventoryHandler getHandler(StorageChannel channel) throws ChestNoHandler
{
if ( !isCached )
{
@ -447,7 +454,7 @@ public class TileChest extends AENetworkPowerTile implements IMEChest, IFluidHan
inv.setInventorySlotContents( 0, returns.getItemStack() );
}
}
catch (AENoHandler t)
catch (ChestNoHandler t)
{
}
}
@ -467,7 +474,7 @@ public class TileChest extends AENetworkPowerTile implements IMEChest, IFluidHan
IAEItemStack returns = cell.injectItems( AEApi.instance().storage().createItemStack( inv.getStackInSlot( 0 ) ), Actionable.SIMULATE, mySrc );
return returns == null || returns.getStackSize() != itemstack.stackSize;
}
catch (AENoHandler t)
catch (ChestNoHandler t)
{
}
@ -491,7 +498,7 @@ public class TileChest extends AENetworkPowerTile implements IMEChest, IFluidHan
{
return Arrays.asList( new IMEInventoryHandler[] { getHandler( channel ) } );
}
catch (AENoHandler e)
catch (ChestNoHandler e)
{
// :P
}
@ -551,7 +558,7 @@ public class TileChest extends AENetworkPowerTile implements IMEChest, IFluidHan
if ( ch != null && handler instanceof ChestMonitorHandler )
return ch.getStatusForCell( cell, ((ChestMonitorHandler) handler).getInternalHandler() );
}
catch (AENoHandler e)
catch (ChestNoHandler e)
{
}
@ -561,7 +568,7 @@ public class TileChest extends AENetworkPowerTile implements IMEChest, IFluidHan
if ( ch != null && handler instanceof ChestMonitorHandler )
return ch.getStatusForCell( cell, ((ChestMonitorHandler) handler).getInternalHandler() );
}
catch (AENoHandler e)
catch (ChestNoHandler e)
{
}
}
@ -588,7 +595,7 @@ public class TileChest extends AENetworkPowerTile implements IMEChest, IFluidHan
return resource.amount - (int) results.getStackSize();
}
catch (AENoHandler e)
catch (ChestNoHandler e)
{
}
}
@ -615,7 +622,7 @@ public class TileChest extends AENetworkPowerTile implements IMEChest, IFluidHan
IMEInventoryHandler h = getHandler( StorageChannel.FLUIDS );
return h.canAccept( AEFluidStack.create( new FluidStack( fluid, 1 ) ) );
}
catch (AENoHandler e)
catch (ChestNoHandler e)
{
}
return false;
@ -636,7 +643,7 @@ public class TileChest extends AENetworkPowerTile implements IMEChest, IFluidHan
if ( h.getChannel() == StorageChannel.FLUIDS )
return new FluidTankInfo[] { new FluidTankInfo( null ) }; // eh?
}
catch (AENoHandler e)
catch (ChestNoHandler e)
{
}
@ -720,13 +727,51 @@ public class TileChest extends AENetworkPowerTile implements IMEChest, IFluidHan
}
@Override
public IConfigManager getConfigManager() {
public IConfigManager getConfigManager()
{
return config;
}
@Override
public void updateSetting(IConfigManager manager, Enum settingName, Enum newValue) {
public void updateSetting(IConfigManager manager, Enum settingName, Enum newValue)
{
}
public boolean openGui(EntityPlayer p, ICellHandler ch, ItemStack cell, int side)
{
try
{
IMEInventoryHandler ih = this.getHandler( StorageChannel.ITEMS );
if ( ch != null && ih != null )
{
IMEInventoryHandler mine = ih;
ch.openChestGui( p, this, ch, mine, cell, StorageChannel.ITEMS );
return true;
}
}
catch (ChestNoHandler e)
{
// :P
}
try
{
IMEInventoryHandler fh = this.getHandler( StorageChannel.FLUIDS );
if ( ch != null && fh != null )
{
IMEInventoryHandler mine = fh;
ch.openChestGui( p, this, ch, mine, cell, StorageChannel.FLUIDS );
return true;
}
}
catch (ChestNoHandler e)
{
// :P
}
return false;
}
}