Changed how lenses work.

Better to see now.
Still needs documentation however.
This commit is contained in:
Ellpeck 2015-12-03 22:49:31 +01:00
parent d5462f693f
commit 2a4b3a8a4f
22 changed files with 414 additions and 285 deletions

View file

@ -41,10 +41,9 @@ The two Brackets will have to get replaced with one of the parts of Information
- To the Compound, add an int with the name "maxAmount" that contains the maximum size of the ItemStack
- Send the Message with "registerTreasureChestRecipe" as the [X] Argument, the Compound as the [Y] Argument.
##### Reconstructor Recipes
##### Reconstructor Recipes (For Recipes without a Lens)
- Create an NBTTagCompound
- To the Compound, add a String with the name "input" that is the Input's OreDictionary Name
- To the Compound, add a String with the name "output" that is the Output's OreDictionary Name
- To the Compound, add an int with the name "energyUse" that is the amount of RF used
- To the Compound, add an int with the name "lensType" that contains the LensType's ID (found in LensType in ReconstructorRecipeHandler, the ID is the ordinal)
- Send the Message with "registerReconstructorRecipe" as the [X] Argument, the Compound as the [Y] Argument.

View file

@ -30,6 +30,7 @@ import ellpeck.actuallyadditions.inventory.GuiHandler;
import ellpeck.actuallyadditions.items.InitForeignPaxels;
import ellpeck.actuallyadditions.items.InitItems;
import ellpeck.actuallyadditions.items.ItemCoffee;
import ellpeck.actuallyadditions.items.lens.LensNoneRecipeHandler;
import ellpeck.actuallyadditions.material.InitArmorMaterials;
import ellpeck.actuallyadditions.material.InitToolMaterials;
import ellpeck.actuallyadditions.misc.*;
@ -38,7 +39,6 @@ import ellpeck.actuallyadditions.ore.InitOreDict;
import ellpeck.actuallyadditions.proxy.IProxy;
import ellpeck.actuallyadditions.recipe.FuelHandler;
import ellpeck.actuallyadditions.recipe.HairyBallHandler;
import ellpeck.actuallyadditions.recipe.ReconstructorRecipeHandler;
import ellpeck.actuallyadditions.recipe.TreasureChestHandler;
import ellpeck.actuallyadditions.tile.TileEntityBase;
import ellpeck.actuallyadditions.update.UpdateChecker;
@ -102,7 +102,7 @@ public class ActuallyAdditions{
ItemCrafting.initMashedFoodRecipes();
HairyBallHandler.init();
TreasureChestHandler.init();
ReconstructorRecipeHandler.init();
LensNoneRecipeHandler.init();
InitForeignPaxels.init();
InitBooklet.init();

View file

@ -13,7 +13,7 @@ package ellpeck.actuallyadditions.blocks;
import cpw.mods.fml.relauncher.Side;
import cpw.mods.fml.relauncher.SideOnly;
import ellpeck.actuallyadditions.blocks.base.BlockContainerBase;
import ellpeck.actuallyadditions.items.IReconstructorLens;
import ellpeck.actuallyadditions.items.lens.ItemLens;
import ellpeck.actuallyadditions.tile.TileEntityAtomicReconstructor;
import ellpeck.actuallyadditions.util.ModUtil;
import net.minecraft.block.Block;
@ -82,7 +82,7 @@ public class BlockAtomicReconstructor extends BlockContainerBase{
if(!player.isSneaking()){
ItemStack heldItem = player.getCurrentEquippedItem();
if(heldItem != null){
if(heldItem.getItem() instanceof IReconstructorLens && reconstructor.getStackInSlot(0) == null){
if(heldItem.getItem() instanceof ItemLens && reconstructor.getStackInSlot(0) == null){
ItemStack toPut = heldItem.copy();
toPut.stackSize = 1;
reconstructor.setInventorySlotContents(0, toPut);

View file

@ -10,7 +10,7 @@
package ellpeck.actuallyadditions.blocks.render;
import ellpeck.actuallyadditions.items.IReconstructorLens;
import ellpeck.actuallyadditions.items.lens.ItemLens;
import ellpeck.actuallyadditions.tile.TileEntityAtomicReconstructor;
import ellpeck.actuallyadditions.util.AssetUtil;
import net.minecraft.client.renderer.tileentity.TileEntitySpecialRenderer;
@ -27,7 +27,7 @@ public class RenderReconstructorLens extends TileEntitySpecialRenderer{
}
ItemStack stack = ((TileEntityAtomicReconstructor)tile).getStackInSlot(0);
if(stack != null && stack.getItem() instanceof IReconstructorLens){
if(stack != null && stack.getItem() instanceof ItemLens){
GL11.glPushMatrix();
GL11.glTranslatef((float)x+0.5F, (float)y-0.5F, (float)z+0.5F);
GL11.glRotatef(180F, 0.0F, 0.0F, 1.0F);

View file

@ -23,10 +23,10 @@ import ellpeck.actuallyadditions.config.values.ConfigIntValues;
import ellpeck.actuallyadditions.crafting.*;
import ellpeck.actuallyadditions.gen.OreGen;
import ellpeck.actuallyadditions.items.InitItems;
import ellpeck.actuallyadditions.items.lens.LensNoneRecipeHandler;
import ellpeck.actuallyadditions.items.metalists.TheFoods;
import ellpeck.actuallyadditions.items.metalists.TheMiscItems;
import ellpeck.actuallyadditions.items.metalists.TheSpecialDrops;
import ellpeck.actuallyadditions.recipe.ReconstructorRecipeHandler;
import ellpeck.actuallyadditions.tile.*;
import ellpeck.actuallyadditions.util.Util;
import net.minecraft.item.ItemStack;
@ -62,13 +62,13 @@ public class InitBooklet{
//Getting Started
chapterIntro = new BookletChapter("intro", entryGettingStarted, new ItemStack(InitItems.itemBooklet), new PageTextOnly(1), new PageTextOnly(2), new PageTextOnly(3));
new BookletChapter("bookTutorial", entryGettingStarted, new ItemStack(InitItems.itemBooklet), new PageTextOnly(1), new PageTextOnly(2), new PageCrafting(3, ItemCrafting.recipeBook));
new BookletChapter("crystals", entryGettingStarted, new ItemStack(InitBlocks.blockAtomicReconstructor), new PageTextOnly(1).addTextReplacement("<rf>", TileEntityAtomicReconstructor.ENERGY_USE), new PageTextOnly(2), new PagePicture(3, "pageAtomicReconstructor", 0).setNoText(), new PageTextOnly(4), new PageCrafting(5, BlockCrafting.recipeAtomicReconstructor).setNoText(), new PageCrafting(6, MiscCrafting.recipesCrystals).setNoText(), new PageCrafting(7, MiscCrafting.recipesCrystalBlocks).setNoText(), new PageReconstructor(8, ReconstructorRecipeHandler.mainPageRecipes).setNoText()).setSpecial();
new BookletChapter("crystals", entryGettingStarted, new ItemStack(InitBlocks.blockAtomicReconstructor), new PageTextOnly(1).addTextReplacement("<rf>", TileEntityAtomicReconstructor.ENERGY_USE), new PageTextOnly(2), new PagePicture(3, "pageAtomicReconstructor", 0).setNoText(), new PageTextOnly(4), new PageCrafting(5, BlockCrafting.recipeAtomicReconstructor).setNoText(), new PageCrafting(6, MiscCrafting.recipesCrystals).setNoText(), new PageCrafting(7, MiscCrafting.recipesCrystalBlocks).setNoText(), new PageReconstructor(8, LensNoneRecipeHandler.mainPageRecipes).setNoText()).setSpecial();
new BookletChapter("coalGen", entryGettingStarted, new ItemStack(InitBlocks.blockCoalGenerator), new PageCrafting(1, BlockCrafting.recipeCoalGen).addTextReplacement("<rf>", TileEntityCoalGenerator.PRODUCE));
new BookletChapter("craftingIngs", entryGettingStarted, new ItemStack(InitItems.itemMisc, 1, TheMiscItems.COIL.ordinal()), new PageTextOnly(1), new PageCrafting(2, ItemCrafting.recipeCoil).setNoText(), new PageCrafting(3, ItemCrafting.recipeCoilAdvanced).setNoText(), new PageCrafting(4, BlockCrafting.recipeCase).setNoText(), new PageCrafting(5, BlockCrafting.recipeStoneCase).setNoText(), new PageCrafting(6, BlockCrafting.recipeEnderPearlBlock).setNoText(), new PageCrafting(7, BlockCrafting.recipeEnderCase).setNoText(), new PageCrafting(8, ItemCrafting.recipeRing).setNoText(), new PageCrafting(9, ItemCrafting.recipeKnifeHandle).setNoText(), new PageCrafting(10, ItemCrafting.recipeKnifeBlade).setNoText(), new PageCrafting(11, ItemCrafting.recipeKnife).setNoText(), new PageCrafting(12, ItemCrafting.recipeDough).setNoText(), new PageCrafting(13, ItemCrafting.recipeRiceDough).setNoText(), new PageCrafting(14, BlockCrafting.recipeIronCase).setNoText()).setImportant();
//Miscellaneous
new BookletChapter("reconstructorLenses", entryMisc, new ItemStack(InitItems.itemMisc, 1, TheMiscItems.LENS.ordinal()), new PageTextOnly(1), new PageCrafting(2, ItemCrafting.recipeLens).setNoText(), new PageReconstructor(3, ReconstructorRecipeHandler.recipeColorLens), new PageReconstructor(4, ReconstructorRecipeHandler.colorConversionRecipes).setNoText(), new PageReconstructor(5, ReconstructorRecipeHandler.recipeExplosionLens), new PageReconstructor(6, ReconstructorRecipeHandler.recipeDamageLens), new PageReconstructor(7, ReconstructorRecipeHandler.recipeSoulSand).setNoText(), new PageReconstructor(8, ReconstructorRecipeHandler.recipeLeather).setNoText()).setImportant();
new BookletChapter("miscDecorStuffsAndThings", entryMisc, new ItemStack(InitBlocks.blockTestifiBucksGreenWall), new PageTextOnly(1), new PageReconstructor(2, ReconstructorRecipeHandler.recipeWhiteWall).setNoText(), new PageReconstructor(3, ReconstructorRecipeHandler.recipeGreenWall).setNoText());
new BookletChapter("reconstructorLenses", entryMisc, new ItemStack(InitItems.itemMisc, 1, TheMiscItems.LENS.ordinal()), new PageTextOnly(1), new PageCrafting(2, ItemCrafting.recipeLens).setNoText(), new PageReconstructor(3, LensNoneRecipeHandler.recipeColorLens), new PageReconstructor(4, LensNoneRecipeHandler.recipeExplosionLens), new PageReconstructor(5, LensNoneRecipeHandler.recipeDamageLens), new PageReconstructor(6, LensNoneRecipeHandler.recipeSoulSand).setNoText(), new PageReconstructor(7, LensNoneRecipeHandler.recipeLeather).setNoText()).setImportant();
new BookletChapter("miscDecorStuffsAndThings", entryMisc, new ItemStack(InitBlocks.blockTestifiBucksGreenWall), new PageTextOnly(1), new PageReconstructor(2, LensNoneRecipeHandler.recipeWhiteWall).setNoText(), new PageReconstructor(3, LensNoneRecipeHandler.recipeGreenWall).setNoText());
new BookletChapter("bookStand", entryMisc, new ItemStack(InitBlocks.blockBookletStand), new PageTextOnly(1), new PageCrafting(2, BlockCrafting.recipeBookStand));
new BookletChapter("quartz", entryMisc, new ItemStack(InitItems.itemMisc, 1, TheMiscItems.QUARTZ.ordinal()), new PageTextOnly(1).setStack(new ItemStack(InitBlocks.blockMisc, 1, TheMiscBlocks.ORE_QUARTZ.ordinal())).addTextReplacement("<lowest>", OreGen.QUARTZ_MIN).addTextReplacement("<highest>", OreGen.QUARTZ_MAX), new PageTextOnly(2).setStack(new ItemStack(InitItems.itemMisc, 1, TheMiscItems.QUARTZ.ordinal())), new PageCrafting(3, BlockCrafting.recipeQuartzBlock).setNoText(), new PageCrafting(4, BlockCrafting.recipeQuartzPillar).setNoText(), new PageCrafting(5, BlockCrafting.recipeQuartzChiseled).setNoText());
new BookletChapter("cloud", entryMisc, new ItemStack(InitBlocks.blockSmileyCloud), new PageTextOnly(1), new PageCrafting(2, BlockCrafting.recipeSmileyCloud).setNoText()).setSpecial();

View file

@ -14,8 +14,8 @@ import cpw.mods.fml.relauncher.Side;
import cpw.mods.fml.relauncher.SideOnly;
import ellpeck.actuallyadditions.blocks.InitBlocks;
import ellpeck.actuallyadditions.booklet.GuiBooklet;
import ellpeck.actuallyadditions.items.lens.LensNoneRecipeHandler;
import ellpeck.actuallyadditions.proxy.ClientProxy;
import ellpeck.actuallyadditions.recipe.ReconstructorRecipeHandler;
import ellpeck.actuallyadditions.util.ModUtil;
import ellpeck.actuallyadditions.util.StringUtil;
import ellpeck.actuallyadditions.util.Util;
@ -27,14 +27,14 @@ import java.util.List;
public class PageReconstructor extends BookletPage{
private ReconstructorRecipeHandler.Recipe[] recipes;
private LensNoneRecipeHandler.Recipe[] recipes;
private int recipePos;
public PageReconstructor(int id, ArrayList<ReconstructorRecipeHandler.Recipe> recipes){
this(id, recipes.toArray(new ReconstructorRecipeHandler.Recipe[recipes.size()]));
public PageReconstructor(int id, ArrayList<LensNoneRecipeHandler.Recipe> recipes){
this(id, recipes.toArray(new LensNoneRecipeHandler.Recipe[recipes.size()]));
}
public PageReconstructor(int id, ReconstructorRecipeHandler.Recipe... recipes){
public PageReconstructor(int id, LensNoneRecipeHandler.Recipe... recipes){
super(id);
this.recipes = recipes;
this.addToPagesWithItemStackData();
@ -44,7 +44,7 @@ public class PageReconstructor extends BookletPage{
public ItemStack[] getItemStacksForPage(){
if(this.recipes != null){
ArrayList<ItemStack> stacks = new ArrayList<ItemStack>();
for(ReconstructorRecipeHandler.Recipe recipe : this.recipes){
for(LensNoneRecipeHandler.Recipe recipe : this.recipes){
if(recipe != null){
stacks.addAll(recipe.getOutputs());
}
@ -67,18 +67,13 @@ public class PageReconstructor extends BookletPage{
@Override
@SideOnly(Side.CLIENT)
public void render(GuiBooklet gui, int mouseX, int mouseY, int ticksElapsed, boolean mousePressed){
ReconstructorRecipeHandler.Recipe recipe = this.recipes[this.recipePos];
LensNoneRecipeHandler.Recipe recipe = this.recipes[this.recipePos];
if(recipe == null){
gui.mc.fontRenderer.drawSplitString(EnumChatFormatting.DARK_RED+StringUtil.localize("booklet."+ModUtil.MOD_ID_LOWER+".recipeDisabled"), gui.guiLeft+14, gui.guiTop+15, 115, 0);
}
else{
String strg = "Atomic Reconstructor";
gui.mc.fontRenderer.drawString(strg, gui.guiLeft+gui.xSize/2-gui.mc.fontRenderer.getStringWidth(strg)/2, gui.guiTop+10, 0);
//Lens
ItemStack lens = recipe.type.lens;
strg = lens == null ? StringUtil.localize("info."+ModUtil.MOD_ID_LOWER+".noLens") : lens.getItem().getItemStackDisplayName(lens);
gui.mc.fontRenderer.drawString(strg, gui.guiLeft+gui.xSize/2-gui.mc.fontRenderer.getStringWidth(strg)/2, gui.guiTop+75, 0);
}
String text = gui.currentPage.getText();

View file

@ -12,9 +12,9 @@ package ellpeck.actuallyadditions.communication;
import cpw.mods.fml.common.event.FMLInterModComms;
import ellpeck.actuallyadditions.items.ItemCoffee;
import ellpeck.actuallyadditions.items.lens.LensNoneRecipeHandler;
import ellpeck.actuallyadditions.recipe.CrusherRecipeRegistry;
import ellpeck.actuallyadditions.recipe.HairyBallHandler;
import ellpeck.actuallyadditions.recipe.ReconstructorRecipeHandler;
import ellpeck.actuallyadditions.recipe.TreasureChestHandler;
import ellpeck.actuallyadditions.util.ModUtil;
import net.minecraft.item.ItemStack;
@ -108,20 +108,13 @@ public class InterModCommunications{
String input = compound.getString("input");
String output = compound.getString("output");
int energyUse = compound.getInteger("energyUse");
int lensType = compound.getInteger("lensType");
if(ReconstructorRecipeHandler.LensType.values().length > lensType && input != null && output != null){
ReconstructorRecipeHandler.LensType type = ReconstructorRecipeHandler.LensType.values()[lensType];
if(type.hasRecipes){
ReconstructorRecipeHandler.addRecipe(input, output, energyUse, type);
ModUtil.LOGGER.info("Reconstructor Recipe that was sent from Mod "+message.getSender()+" has been registered successfully: "+input+" -> "+output+" @ "+energyUse+" with LensType "+lensType);
}
else{
ModUtil.LOGGER.error("Reconstructor Recipe that was sent from Mod "+message.getSender()+" could not be registered: It's trying to register for a Lens Type ("+lensType+") that can't have recipes added!");
}
if(input != null && output != null){
LensNoneRecipeHandler.addRecipe(input, output, energyUse);
ModUtil.LOGGER.info("Reconstructor Recipe that was sent from Mod "+message.getSender()+" has been registered successfully: "+input+" -> "+output+" @ "+energyUse+".");
}
else{
ModUtil.LOGGER.error("Reconstructor Recipe that was sent from Mod "+message.getSender()+" could not be registered: It's missing an Output, an Input or a LensType!");
ModUtil.LOGGER.error("Reconstructor Recipe that was sent from Mod "+message.getSender()+" could not be registered: It's missing an Input or an Output!");
}
}
}

View file

@ -1,18 +0,0 @@
/*
* This file ("ILens.java") is part of the Actually Additions Mod for Minecraft.
* It is created and owned by Ellpeck and distributed
* under the Actually Additions License to be found at
* http://github.com/Ellpeck/ActuallyAdditions/blob/master/README.md
* View the source code at https://github.com/Ellpeck/ActuallyAdditions
*
* © 2015 Ellpeck
*/
package ellpeck.actuallyadditions.items;
import ellpeck.actuallyadditions.recipe.ReconstructorRecipeHandler;
public interface IReconstructorLens{
ReconstructorRecipeHandler.LensType getLensType();
}

View file

@ -12,11 +12,12 @@ package ellpeck.actuallyadditions.items;
import ellpeck.actuallyadditions.blocks.InitBlocks;
import ellpeck.actuallyadditions.items.base.*;
import ellpeck.actuallyadditions.items.lens.ItemLens;
import ellpeck.actuallyadditions.items.lens.Lenses;
import ellpeck.actuallyadditions.items.metalists.TheFoods;
import ellpeck.actuallyadditions.items.metalists.TheMiscItems;
import ellpeck.actuallyadditions.material.InitArmorMaterials;
import ellpeck.actuallyadditions.material.InitToolMaterials;
import ellpeck.actuallyadditions.recipe.ReconstructorRecipeHandler;
import ellpeck.actuallyadditions.util.CompatUtil;
import ellpeck.actuallyadditions.util.ModUtil;
import net.minecraft.init.Items;
@ -136,9 +137,9 @@ public class InitItems{
public static void init(){
ModUtil.LOGGER.info("Initializing Items...");
itemColorLens = new ItemLens("itemColorLens", ReconstructorRecipeHandler.LensType.COLOR);
itemExplosionLens = new ItemLens("itemExplosionLens", ReconstructorRecipeHandler.LensType.DETONATION);
itemDamageLens = new ItemLens("itemDamageLens", ReconstructorRecipeHandler.LensType.JUST_DAMAGE);
itemColorLens = new ItemLens("itemColorLens", Lenses.LENS_COLOR);
itemExplosionLens = new ItemLens("itemExplosionLens", Lenses.LENS_DETONATION);
itemDamageLens = new ItemLens("itemDamageLens", Lenses.LENS_DEATH);
itemCrystal = new ItemCrystal("itemCrystal");
itemLaserWrench = new ItemLaserWrench("itemLaserWrench");
itemChestToCrateUpgrade = new ItemChestToCrateUpgrade("itemChestToCrateUpgrade");

View file

@ -8,26 +8,25 @@
* © 2015 Ellpeck
*/
package ellpeck.actuallyadditions.items;
package ellpeck.actuallyadditions.items.lens;
import cpw.mods.fml.relauncher.Side;
import cpw.mods.fml.relauncher.SideOnly;
import ellpeck.actuallyadditions.items.base.ItemBase;
import ellpeck.actuallyadditions.recipe.ReconstructorRecipeHandler;
import ellpeck.actuallyadditions.util.ModUtil;
import net.minecraft.client.renderer.texture.IIconRegister;
import net.minecraft.item.EnumRarity;
import net.minecraft.item.ItemStack;
import net.minecraft.util.IIcon;
public class ItemLens extends ItemBase implements IReconstructorLens{
public class ItemLens extends ItemBase{
private ReconstructorRecipeHandler.LensType type;
private Lens type;
public ItemLens(String name, ReconstructorRecipeHandler.LensType type){
public ItemLens(String name, Lens type){
super(name);
this.type = type;
this.type.setLens(this);
this.type.setLensItem(this);
this.setMaxStackSize(1);
}
@ -48,8 +47,7 @@ public class ItemLens extends ItemBase implements IReconstructorLens{
return this.itemIcon;
}
@Override
public ReconstructorRecipeHandler.LensType getLensType(){
public Lens getLensType(){
return this.type;
}
}

View file

@ -0,0 +1,35 @@
/*
* This file ("Lens.java") is part of the Actually Additions Mod for Minecraft.
* It is created and owned by Ellpeck and distributed
* under the Actually Additions License to be found at
* http://github.com/Ellpeck/ActuallyAdditions/blob/master/README.md
* View the source code at https://github.com/Ellpeck/ActuallyAdditions
*
* © 2015 Ellpeck
*/
package ellpeck.actuallyadditions.items.lens;
import ellpeck.actuallyadditions.tile.TileEntityAtomicReconstructor;
import ellpeck.actuallyadditions.util.WorldPos;
import net.minecraft.item.Item;
public abstract class Lens{
protected Item lensItem;
public abstract boolean invoke(WorldPos hitBlock, TileEntityAtomicReconstructor tile);
public abstract float[] getColor();
public abstract int getDistance();
public Lens register(){
Lenses.allLenses.add(this);
return this;
}
public void setLensItem(Item item){
this.lensItem = item;
}
}

View file

@ -0,0 +1,95 @@
/*
* This file ("LensColor.java") is part of the Actually Additions Mod for Minecraft.
* It is created and owned by Ellpeck and distributed
* under the Actually Additions License to be found at
* http://github.com/Ellpeck/ActuallyAdditions/blob/master/README.md
* View the source code at https://github.com/Ellpeck/ActuallyAdditions
*
* © 2015 Ellpeck
*/
package ellpeck.actuallyadditions.items.lens;
import ellpeck.actuallyadditions.blocks.InitBlocks;
import ellpeck.actuallyadditions.tile.TileEntityAtomicReconstructor;
import ellpeck.actuallyadditions.util.Util;
import ellpeck.actuallyadditions.util.WorldPos;
import net.minecraft.block.Block;
import net.minecraft.entity.item.EntityItem;
import net.minecraft.init.Blocks;
import net.minecraft.init.Items;
import net.minecraft.util.AxisAlignedBB;
import java.util.ArrayList;
public class LensColor extends Lens{
//Thanks to xdjackiexd for this, as I couldn't be bothered
private static final float[][] possibleColorLensColors = {
{158F, 43F, 39F}, //Red
{234F, 126F, 53F}, //Orange
{194F, 181F, 28F}, //Yellow
{57F, 186F, 46F}, //Lime Green
{54F, 75F, 24F}, //Green
{99F, 135F, 210F}, //Light Blue
{38F, 113F, 145F}, //Cyan
{37F, 49F, 147F}, //Blue
{126F, 52F, 191F}, //Purple
{190F, 73F, 201F}, //Magenta
{217F, 129F, 153F}, //Pink
{86F, 51F, 28F}, //Brown
};
private static final Object[] CONVERTABLE_BLOCKS = new Object[]{
Items.dye,
Blocks.wool,
Blocks.stained_glass,
Blocks.stained_glass_pane,
Blocks.stained_hardened_clay,
InitBlocks.blockColoredLamp,
InitBlocks.blockColoredLampOn
};
@SuppressWarnings("unchecked")
@Override
public boolean invoke(WorldPos hitBlock, TileEntityAtomicReconstructor tile){
if(hitBlock != null){
if(Util.arrayContains(CONVERTABLE_BLOCKS, hitBlock.getBlock()) >= 0){
int meta = hitBlock.getMetadata();
if(meta >= 15){
hitBlock.setMetadata(0, 2);
}
else{
hitBlock.setMetadata(meta+1, 2);
}
}
ArrayList<EntityItem> items = (ArrayList<EntityItem>)tile.getWorldObj().getEntitiesWithinAABB(EntityItem.class, AxisAlignedBB.getBoundingBox(hitBlock.getX(), hitBlock.getY(), hitBlock.getZ(), hitBlock.getX()+1, hitBlock.getY()+1, hitBlock.getZ()+1));
for(EntityItem item : items){
if(item.getEntityItem() != null){
if(Util.arrayContains(CONVERTABLE_BLOCKS, item.getEntityItem().getItem()) >= 0 || Util.arrayContains(CONVERTABLE_BLOCKS, Block.getBlockFromItem(item.getEntityItem().getItem())) >= 0){
int meta = item.getEntityItem().getItemDamage();
if(meta >= 15){
item.getEntityItem().setItemDamage(0);
}
else{
item.getEntityItem().setItemDamage(meta+1);
}
}
}
}
}
return false;
}
@Override
public float[] getColor(){
float[] colors = possibleColorLensColors[Util.RANDOM.nextInt(possibleColorLensColors.length)];
return new float[]{colors[0]/255F, colors[1]/255F, colors[2]/255F};
}
@Override
public int getDistance(){
return 10;
}
}

View file

@ -0,0 +1,48 @@
/*
* This file ("LensDeath.java") is part of the Actually Additions Mod for Minecraft.
* It is created and owned by Ellpeck and distributed
* under the Actually Additions License to be found at
* http://github.com/Ellpeck/ActuallyAdditions/blob/master/README.md
* View the source code at https://github.com/Ellpeck/ActuallyAdditions
*
* © 2015 Ellpeck
*/
package ellpeck.actuallyadditions.items.lens;
import ellpeck.actuallyadditions.misc.DamageSources;
import ellpeck.actuallyadditions.tile.TileEntityAtomicReconstructor;
import ellpeck.actuallyadditions.util.WorldPos;
import net.minecraft.entity.EntityLivingBase;
import net.minecraft.util.AxisAlignedBB;
import java.util.ArrayList;
public class LensDeath extends Lens{
@SuppressWarnings("unchecked")
@Override
public boolean invoke(WorldPos hitBlock, TileEntityAtomicReconstructor tile){
int use = 150; //Per Block (because it doesn't only activate when something is hit like the other lenses!)
if(tile.storage.getEnergyStored() >= use){
tile.storage.extractEnergy(use, false);
ArrayList<EntityLivingBase> entities = (ArrayList<EntityLivingBase>)tile.getWorldObj().getEntitiesWithinAABB(EntityLivingBase.class, AxisAlignedBB.getBoundingBox(hitBlock.getX(), hitBlock.getY(), hitBlock.getZ(), hitBlock.getX()+1, hitBlock.getY()+1, hitBlock.getZ()+1));
for(EntityLivingBase entity : entities){
entity.attackEntityFrom(DamageSources.DAMAGE_ATOMIC_RECONSTRUCTOR, 20F);
}
}
return hitBlock != null && !hitBlock.getBlock().isAir(hitBlock.getWorld(), hitBlock.getX(), hitBlock.getY(), hitBlock.getZ());
}
@Override
public float[] getColor(){
return new float[]{188F/255F, 222F/255F, 1F};
}
@Override
public int getDistance(){
return 15;
}
}

View file

@ -0,0 +1,40 @@
/*
* This file ("LensDetonation.java") is part of the Actually Additions Mod for Minecraft.
* It is created and owned by Ellpeck and distributed
* under the Actually Additions License to be found at
* http://github.com/Ellpeck/ActuallyAdditions/blob/master/README.md
* View the source code at https://github.com/Ellpeck/ActuallyAdditions
*
* © 2015 Ellpeck
*/
package ellpeck.actuallyadditions.items.lens;
import ellpeck.actuallyadditions.tile.TileEntityAtomicReconstructor;
import ellpeck.actuallyadditions.util.WorldPos;
public class LensDetonation extends Lens{
@Override
public boolean invoke(WorldPos hitBlock, TileEntityAtomicReconstructor tile){
if(hitBlock != null && !hitBlock.getBlock().isAir(hitBlock.getWorld(), hitBlock.getX(), hitBlock.getY(), hitBlock.getZ())){
int use = 500000;
if(tile.storage.getEnergyStored() >= use){
tile.getWorldObj().newExplosion(null, hitBlock.getX()+0.5, hitBlock.getY()+0.5, hitBlock.getZ()+0.5, 10F, true, true);
tile.storage.extractEnergy(use, false);
}
return true;
}
return false;
}
@Override
public float[] getColor(){
return new float[]{158F/255F, 43F/255F, 39F/255F};
}
@Override
public int getDistance(){
return 30;
}
}

View file

@ -0,0 +1,96 @@
/*
* This file ("LensNone.java") is part of the Actually Additions Mod for Minecraft.
* It is created and owned by Ellpeck and distributed
* under the Actually Additions License to be found at
* http://github.com/Ellpeck/ActuallyAdditions/blob/master/README.md
* View the source code at https://github.com/Ellpeck/ActuallyAdditions
*
* © 2015 Ellpeck
*/
package ellpeck.actuallyadditions.items.lens;
import ellpeck.actuallyadditions.tile.TileEntityAtomicReconstructor;
import ellpeck.actuallyadditions.util.WorldPos;
import net.minecraft.block.Block;
import net.minecraft.entity.item.EntityItem;
import net.minecraft.item.ItemBlock;
import net.minecraft.item.ItemStack;
import net.minecraft.util.AxisAlignedBB;
import java.util.ArrayList;
import java.util.List;
public class LensNone extends Lens{
@SuppressWarnings("unchecked")
@Override
public boolean invoke(WorldPos hitBlock, TileEntityAtomicReconstructor tile){
if(hitBlock != null && !hitBlock.getBlock().isAir(hitBlock.getWorld(), hitBlock.getX(), hitBlock.getY(), hitBlock.getZ())){
int range = 2;
//Converting the Blocks
for(int reachX = -range; reachX < range+1; reachX++){
for(int reachZ = -range; reachZ < range+1; reachZ++){
for(int reachY = -range; reachY < range+1; reachY++){
WorldPos pos = new WorldPos(tile.getWorldObj(), hitBlock.getX()+reachX, hitBlock.getY()+reachY, hitBlock.getZ()+reachZ);
ArrayList<LensNoneRecipeHandler.Recipe> recipes = LensNoneRecipeHandler.getRecipesFor(new ItemStack(pos.getBlock(), 1, pos.getMetadata()));
for(LensNoneRecipeHandler.Recipe recipe : recipes){
if(recipe != null && tile.storage.getEnergyStored() >= recipe.energyUse){
List<ItemStack> outputs = recipe.getOutputs();
if(outputs != null && !outputs.isEmpty()){
ItemStack output = outputs.get(0);
if(output.getItem() instanceof ItemBlock){
tile.getWorldObj().playAuxSFX(2001, pos.getX(), pos.getY(), pos.getZ(), Block.getIdFromBlock(pos.getBlock())+(pos.getMetadata() << 12));
pos.setBlock(Block.getBlockFromItem(output.getItem()), output.getItemDamage(), 2);
}
else{
EntityItem item = new EntityItem(tile.getWorldObj(), pos.getX()+0.5, pos.getY()+0.5, pos.getZ()+0.5, output.copy());
tile.getWorldObj().spawnEntityInWorld(item);
}
tile.storage.extractEnergy(recipe.energyUse, false);
break;
}
}
}
}
}
}
//Converting the Items
ArrayList<EntityItem> items = (ArrayList<EntityItem>)tile.getWorldObj().getEntitiesWithinAABB(EntityItem.class, AxisAlignedBB.getBoundingBox(hitBlock.getX()-range, hitBlock.getY()-range, hitBlock.getZ()-range, hitBlock.getX()+range, hitBlock.getY()+range, hitBlock.getZ()+range));
for(EntityItem item : items){
ItemStack stack = item.getEntityItem();
if(stack != null){
ArrayList<LensNoneRecipeHandler.Recipe> recipes = LensNoneRecipeHandler.getRecipesFor(stack);
for(LensNoneRecipeHandler.Recipe recipe : recipes){
if(recipe != null && tile.storage.getEnergyStored() >= recipe.energyUse){
List<ItemStack> outputs = recipe.getOutputs();
if(outputs != null && !outputs.isEmpty()){
ItemStack outputCopy = outputs.get(0).copy();
outputCopy.stackSize = stack.stackSize;
item.setEntityItemStack(outputCopy);
tile.storage.extractEnergy(recipe.energyUse, false);
break;
}
}
}
}
}
return true;
}
return false;
}
@Override
public float[] getColor(){
return new float[]{27F/255F, 109F/255F, 1F};
}
@Override
public int getDistance(){
return 10;
}
}

View file

@ -1,5 +1,5 @@
/*
* This file ("AtomicReconstructorRecipeHandler.java") is part of the Actually Additions Mod for Minecraft.
* This file ("LensNoneRecipeHandler.java") is part of the Actually Additions Mod for Minecraft.
* It is created and owned by Ellpeck and distributed
* under the Actually Additions License to be found at
* http://github.com/Ellpeck/ActuallyAdditions/blob/master/README.md
@ -8,10 +8,9 @@
* © 2015 Ellpeck
*/
package ellpeck.actuallyadditions.recipe;
package ellpeck.actuallyadditions.items.lens;
import ellpeck.actuallyadditions.blocks.InitBlocks;
import ellpeck.actuallyadditions.blocks.metalists.TheColoredLampColors;
import ellpeck.actuallyadditions.config.values.ConfigCrafting;
import ellpeck.actuallyadditions.items.InitItems;
import ellpeck.actuallyadditions.items.metalists.TheCrystals;
@ -20,7 +19,6 @@ import ellpeck.actuallyadditions.util.ItemUtil;
import ellpeck.actuallyadditions.util.Util;
import net.minecraft.init.Blocks;
import net.minecraft.init.Items;
import net.minecraft.item.Item;
import net.minecraft.item.ItemStack;
import net.minecraftforge.oredict.OreDictionary;
@ -28,7 +26,7 @@ import java.util.ArrayList;
import java.util.Collections;
import java.util.List;
public class ReconstructorRecipeHandler{
public class LensNoneRecipeHandler{
public static ArrayList<Recipe> recipes = new ArrayList<Recipe>();
@ -40,7 +38,6 @@ public class ReconstructorRecipeHandler{
public static Recipe recipeExplosionLens;
public static Recipe recipeDamageLens;
public static Recipe recipeLeather;
public static ArrayList<Recipe> colorConversionRecipes = new ArrayList<Recipe>();
public static void init(){
//Crystal Blocks
@ -94,48 +91,20 @@ public class ReconstructorRecipeHandler{
recipeLeather = Util.GetRecipes.lastReconstructorRecipe();
addRecipe(new ItemStack(Blocks.quartz_block), new ItemStack(InitBlocks.blockTestifiBucksWhiteWall), 10);
recipeWhiteWall = Util.GetRecipes.lastReconstructorRecipe();
addRecipe(new ItemStack(Blocks.quartz_block), new ItemStack(InitBlocks.blockTestifiBucksGreenWall), 10, LensType.COLOR);
addRecipe(new ItemStack(Blocks.quartz_block, 1, 1), new ItemStack(InitBlocks.blockTestifiBucksGreenWall), 10);
recipeGreenWall = Util.GetRecipes.lastReconstructorRecipe();
//Colors
for(int i = 0; i < TheColoredLampColors.values().length-1; i++){
addRecipe("dye"+TheColoredLampColors.values()[i].name, "dye"+TheColoredLampColors.values()[i+1].name, 2000, LensType.COLOR);
colorConversionRecipes.add(Util.GetRecipes.lastReconstructorRecipe());
addRecipe(new ItemStack(Blocks.wool, 1, i), new ItemStack(Blocks.wool, 1, i+1), 2000, LensType.COLOR);
colorConversionRecipes.add(Util.GetRecipes.lastReconstructorRecipe());
addRecipe(new ItemStack(Blocks.stained_hardened_clay, 1, i), new ItemStack(Blocks.stained_hardened_clay, 1, i+1), 2000, LensType.COLOR);
colorConversionRecipes.add(Util.GetRecipes.lastReconstructorRecipe());
addRecipe("blockGlass"+TheColoredLampColors.values()[i].name, "blockGlass"+TheColoredLampColors.values()[i+1].name, 2000, LensType.COLOR);
colorConversionRecipes.add(Util.GetRecipes.lastReconstructorRecipe());
}
addRecipe("dye"+TheColoredLampColors.values()[15].name, "dye"+TheColoredLampColors.values()[0].name, 2000, LensType.COLOR);
colorConversionRecipes.add(Util.GetRecipes.lastReconstructorRecipe());
addRecipe(new ItemStack(Blocks.wool, 1, 15), new ItemStack(Blocks.wool, 1, 0), 2000, LensType.COLOR);
colorConversionRecipes.add(Util.GetRecipes.lastReconstructorRecipe());
addRecipe(new ItemStack(Blocks.stained_hardened_clay, 1, 15), new ItemStack(Blocks.stained_hardened_clay, 1, 0), 2000, LensType.COLOR);
colorConversionRecipes.add(Util.GetRecipes.lastReconstructorRecipe());
addRecipe("blockGlass"+TheColoredLampColors.values()[15].name, "blockGlass"+TheColoredLampColors.values()[0].name, 2000, LensType.COLOR);
colorConversionRecipes.add(Util.GetRecipes.lastReconstructorRecipe());
}
}
public static void addRecipe(ItemStack input, ItemStack output, int energyUse){
addRecipe(input, output, energyUse, LensType.NONE);
recipes.add(new Recipe(input, output, energyUse));
}
public static void addRecipe(ItemStack input, ItemStack output, int energyUse, LensType type){
if(type.hasRecipes){
recipes.add(new Recipe(input, output, energyUse, type));
}
public static void addRecipe(String input, String output, int energyUse){
recipes.add(new Recipe(input, output, energyUse));
}
public static void addRecipe(String input, String output, int energyUse, LensType type){
if(type.hasRecipes){
recipes.add(new Recipe(input, output, energyUse, type));
}
}
public static ArrayList<Recipe> getRecipes(ItemStack input){
public static ArrayList<Recipe> getRecipesFor(ItemStack input){
ArrayList<Recipe> possibleRecipes = new ArrayList<Recipe>();
for(Recipe recipe : recipes){
if(ItemUtil.contains(recipe.getInputs(), input, true)){
@ -145,82 +114,25 @@ public class ReconstructorRecipeHandler{
return possibleRecipes;
}
public enum LensType{
NONE(true),
COLOR(true),
DETONATION(false),
JUST_DAMAGE(false);
//Thanks to xdjackiexd for this, as I couldn't be bothered
private static final float[][] possibleColorLensColors = {
{158F, 43F, 39F}, //Red
{234F, 126F, 53F}, //Orange
{194F, 181F, 28F}, //Yellow
{57F, 186F, 46F}, //Lime Green
{54F, 75F, 24F}, //Green
{99F, 135F, 210F}, //Light Blue
{38F, 113F, 145F}, //Cyan
{37F, 49F, 147F}, //Blue
{126F, 52F, 191F}, //Purple
{190F, 73F, 201F}, //Magenta
{217F, 129F, 153F}, //Pink
{86F, 51F, 28F}, //Brown
};
public ItemStack lens;
public boolean hasRecipes;
LensType(boolean hasRecipes){
this.hasRecipes = hasRecipes;
}
public float[] getColor(){
if(this == COLOR){
float[] colors = possibleColorLensColors[Util.RANDOM.nextInt(possibleColorLensColors.length)];
return new float[]{colors[0]/255F, colors[1]/255F, colors[2]/255F};
}
else if(this == DETONATION){
return new float[]{158F/255F, 43F/255F, 39F/255F};
}
else if(this == JUST_DAMAGE){
return new float[]{188F/255F, 222F/255F, 1F};
}
else{
return new float[]{27F/255F, 109F/255F, 1F};
}
}
public void setLens(Item lens){
this.lens = new ItemStack(lens);
}
public int getDistance(){
return this == DETONATION ? 30 : (this == JUST_DAMAGE ? 15 : 10);
}
}
public static class Recipe{
private String input;
private String output;
public int energyUse;
public LensType type;
private ItemStack inputStack;
private ItemStack outputStack;
public Recipe(ItemStack input, ItemStack output, int energyUse, LensType type){
public Recipe(ItemStack input, ItemStack output, int energyUse){
this.inputStack = input;
this.outputStack = output;
this.energyUse = energyUse;
this.type = type;
}
public Recipe(String input, String output, int energyUse, LensType type){
public Recipe(String input, String output, int energyUse){
this.input = input;
this.output = output;
this.energyUse = energyUse;
this.type = type;
}
public List<ItemStack> getOutputs(){
@ -255,5 +167,4 @@ public class ReconstructorRecipeHandler{
return stacks;
}
}
}

View file

@ -0,0 +1,23 @@
/*
* This file ("Lenses.java") is part of the Actually Additions Mod for Minecraft.
* It is created and owned by Ellpeck and distributed
* under the Actually Additions License to be found at
* http://github.com/Ellpeck/ActuallyAdditions/blob/master/README.md
* View the source code at https://github.com/Ellpeck/ActuallyAdditions
*
* © 2015 Ellpeck
*/
package ellpeck.actuallyadditions.items.lens;
import java.util.ArrayList;
public class Lenses{
public static ArrayList<Lens> allLenses = new ArrayList<Lens>();
public static final Lens LENS_NONE = new LensNone().register();
public static final Lens LENS_DETONATION = new LensDetonation().register();
public static final Lens LENS_DEATH = new LensDeath().register();
public static final Lens LENS_COLOR = new LensColor().register();
}

View file

@ -17,7 +17,7 @@ import codechicken.nei.recipe.TemplateRecipeHandler;
import ellpeck.actuallyadditions.blocks.InitBlocks;
import ellpeck.actuallyadditions.booklet.BookletUtils;
import ellpeck.actuallyadditions.booklet.page.BookletPage;
import ellpeck.actuallyadditions.recipe.ReconstructorRecipeHandler;
import ellpeck.actuallyadditions.items.lens.LensNoneRecipeHandler;
import ellpeck.actuallyadditions.util.ItemUtil;
import ellpeck.actuallyadditions.util.ModUtil;
import ellpeck.actuallyadditions.util.StringUtil;
@ -58,8 +58,8 @@ public class NEIReconstructorRecipe extends TemplateRecipeHandler implements INE
@Override
public void loadCraftingRecipes(String outputId, Object... results){
if(outputId.equals(NAME) && getClass() == NEIReconstructorRecipe.class){
ArrayList<ReconstructorRecipeHandler.Recipe> recipes = ReconstructorRecipeHandler.recipes;
for(ReconstructorRecipeHandler.Recipe recipe : recipes){
ArrayList<LensNoneRecipeHandler.Recipe> recipes = LensNoneRecipeHandler.recipes;
for(LensNoneRecipeHandler.Recipe recipe : recipes){
arecipes.add(new CachedReconstructorRecipe(recipe));
}
}
@ -70,8 +70,8 @@ public class NEIReconstructorRecipe extends TemplateRecipeHandler implements INE
@Override
public void loadCraftingRecipes(ItemStack result){
ArrayList<ReconstructorRecipeHandler.Recipe> recipes = ReconstructorRecipeHandler.recipes;
for(ReconstructorRecipeHandler.Recipe recipe : recipes){
ArrayList<LensNoneRecipeHandler.Recipe> recipes = LensNoneRecipeHandler.recipes;
for(LensNoneRecipeHandler.Recipe recipe : recipes){
if(ItemUtil.contains(recipe.getOutputs(), result, true)){
arecipes.add(new CachedReconstructorRecipe(recipe));
}
@ -80,8 +80,8 @@ public class NEIReconstructorRecipe extends TemplateRecipeHandler implements INE
@Override
public void loadUsageRecipes(ItemStack ingredient){
ArrayList<ReconstructorRecipeHandler.Recipe> recipes = ReconstructorRecipeHandler.recipes;
for(ReconstructorRecipeHandler.Recipe recipe : recipes){
ArrayList<LensNoneRecipeHandler.Recipe> recipes = LensNoneRecipeHandler.recipes;
for(LensNoneRecipeHandler.Recipe recipe : recipes){
if(ItemUtil.contains(recipe.getInputs(), ingredient, true)){
CachedReconstructorRecipe theRecipe = new CachedReconstructorRecipe(recipe);
theRecipe.setIngredientPermutation(Collections.singletonList(theRecipe.input), ingredient);
@ -117,9 +117,6 @@ public class NEIReconstructorRecipe extends TemplateRecipeHandler implements INE
if(Minecraft.getMinecraft().currentScreen != null){
BookletPage.renderItem(Minecraft.getMinecraft().currentScreen, new ItemStack(InitBlocks.blockAtomicReconstructor), 32+34, 19, 1.0F);
}
CachedReconstructorRecipe cache = (CachedReconstructorRecipe)this.arecipes.get(recipe);
GuiDraw.drawString(cache.lens == null ? StringUtil.localize("info."+ModUtil.MOD_ID_LOWER+".noLens") : cache.lens.getItem().getItemStackDisplayName(cache.lens), 10, 45, StringUtil.DECIMAL_COLOR_GRAY_TEXT, false);
}
@Override
@ -131,12 +128,10 @@ public class NEIReconstructorRecipe extends TemplateRecipeHandler implements INE
public PositionedStack result;
public PositionedStack input;
public ItemStack lens;
public CachedReconstructorRecipe(ReconstructorRecipeHandler.Recipe recipe){
public CachedReconstructorRecipe(LensNoneRecipeHandler.Recipe recipe){
this.result = new PositionedStack(recipe.getOutputs(), 67+32, 19);
this.input = new PositionedStack(recipe.getInputs(), 5+32, 19);
this.lens = recipe.type.lens;
}
@Override

View file

@ -15,7 +15,8 @@ import cpw.mods.fml.common.network.simpleimpl.IMessageHandler;
import cpw.mods.fml.common.network.simpleimpl.MessageContext;
import cpw.mods.fml.relauncher.Side;
import cpw.mods.fml.relauncher.SideOnly;
import ellpeck.actuallyadditions.recipe.ReconstructorRecipeHandler;
import ellpeck.actuallyadditions.items.lens.Lens;
import ellpeck.actuallyadditions.items.lens.Lenses;
import io.netty.buffer.ByteBuf;
import net.minecraft.client.Minecraft;
import net.minecraft.client.particle.EntityReddustFX;
@ -37,14 +38,14 @@ public class PacketAtomicReconstructor implements IMessage{
}
public PacketAtomicReconstructor(int startX, int startY, int startZ, int endX, int endY, int endZ, ReconstructorRecipeHandler.LensType type){
public PacketAtomicReconstructor(int startX, int startY, int startZ, int endX, int endY, int endZ, Lens type){
this.startX = startX;
this.startY = startY;
this.startZ = startZ;
this.endX = endX;
this.endY = endY;
this.endZ = endZ;
this.lensTypeOrdinal = type.ordinal();
this.lensTypeOrdinal = Lenses.allLenses.indexOf(type);
}
@Override
@ -84,7 +85,7 @@ public class PacketAtomicReconstructor implements IMessage{
for(int times = 0; times < 5; times++){
for(double i = 0; i <= 1; i += 1/(distance*8)){
ReconstructorRecipeHandler.LensType type = ReconstructorRecipeHandler.LensType.values()[message.lensTypeOrdinal];
Lens type = Lenses.allLenses.get(message.lensTypeOrdinal);
float[] color = type.getColor();
Minecraft.getMinecraft().effectRenderer.addEffect(new EntityReddustFX(world, (difX*i)+message.endX+0.5, (difY*i)+message.endY+0.5, (difZ*i)+message.endZ+0.5, 2F, color[0], color[1], color[2]));
}

View file

@ -13,25 +13,17 @@ package ellpeck.actuallyadditions.tile;
import cofh.api.energy.EnergyStorage;
import cofh.api.energy.IEnergyReceiver;
import cpw.mods.fml.common.network.NetworkRegistry;
import ellpeck.actuallyadditions.items.IReconstructorLens;
import ellpeck.actuallyadditions.misc.DamageSources;
import ellpeck.actuallyadditions.items.lens.ItemLens;
import ellpeck.actuallyadditions.items.lens.Lens;
import ellpeck.actuallyadditions.items.lens.Lenses;
import ellpeck.actuallyadditions.network.PacketAtomicReconstructor;
import ellpeck.actuallyadditions.network.PacketHandler;
import ellpeck.actuallyadditions.recipe.ReconstructorRecipeHandler;
import ellpeck.actuallyadditions.util.WorldPos;
import ellpeck.actuallyadditions.util.WorldUtil;
import net.minecraft.block.Block;
import net.minecraft.entity.EntityLivingBase;
import net.minecraft.entity.item.EntityItem;
import net.minecraft.item.ItemBlock;
import net.minecraft.item.ItemStack;
import net.minecraft.nbt.NBTTagCompound;
import net.minecraft.util.AxisAlignedBB;
import net.minecraftforge.common.util.ForgeDirection;
import java.util.ArrayList;
import java.util.List;
public class TileEntityAtomicReconstructor extends TileEntityInventoryBase implements IEnergyReceiver{
public static final int ENERGY_USE = 200;
@ -56,86 +48,13 @@ public class TileEntityAtomicReconstructor extends TileEntityInventoryBase imple
this.storage.extractEnergy(ENERGY_USE, false);
//The Lens the Reconstructor currently has installed
ReconstructorRecipeHandler.LensType currentLens = this.getCurrentLens();
Lens currentLens = this.getCurrentLens();
int distance = currentLens.getDistance();
for(int i = 0; i < distance; i++){
WorldPos hitBlock = WorldUtil.getCoordsFromSide(sideToManipulate, worldObj, xCoord, yCoord, zCoord, i);
float damage = 5F;
if(currentLens == ReconstructorRecipeHandler.LensType.JUST_DAMAGE){
int use = 150; //Per Block (because it doesn't only activate when something is hit like the other lenses!)
if(this.storage.getEnergyStored() >= use){
damage = 20F;
this.storage.extractEnergy(use, false);
}
}
this.damagePlayer(hitBlock.getX(), hitBlock.getY(), hitBlock.getZ(), damage);
if(hitBlock != null && !hitBlock.getBlock().isAir(hitBlock.getWorld(), hitBlock.getX(), hitBlock.getY(), hitBlock.getZ())){
if(currentLens.invoke(hitBlock, this)){
this.shootLaser(hitBlock.getX(), hitBlock.getY(), hitBlock.getZ(), currentLens);
//Detonation
if(currentLens == ReconstructorRecipeHandler.LensType.DETONATION){
int use = 500000;
if(this.storage.getEnergyStored() >= use){
this.worldObj.newExplosion(null, hitBlock.getX()+0.5, hitBlock.getY()+0.5, hitBlock.getZ()+0.5, 10F, true, true);
this.storage.extractEnergy(use, false);
}
}
//Conversion Recipes
else if(currentLens.hasRecipes){
int range = 2;
//Converting the Blocks
for(int reachX = -range; reachX < range+1; reachX++){
for(int reachZ = -range; reachZ < range+1; reachZ++){
for(int reachY = -range; reachY < range+1; reachY++){
WorldPos pos = new WorldPos(worldObj, hitBlock.getX()+reachX, hitBlock.getY()+reachY, hitBlock.getZ()+reachZ);
ArrayList<ReconstructorRecipeHandler.Recipe> recipes = ReconstructorRecipeHandler.getRecipes(new ItemStack(pos.getBlock(), 1, pos.getMetadata()));
for(ReconstructorRecipeHandler.Recipe recipe : recipes){
if(recipe != null && this.storage.getEnergyStored() >= recipe.energyUse && recipe.type == currentLens){
List<ItemStack> outputs = recipe.getOutputs();
if(outputs != null && !outputs.isEmpty()){
ItemStack output = outputs.get(0);
if(output.getItem() instanceof ItemBlock){
this.worldObj.playAuxSFX(2001, pos.getX(), pos.getY(), pos.getZ(), Block.getIdFromBlock(pos.getBlock())+(pos.getMetadata() << 12));
pos.setBlock(Block.getBlockFromItem(output.getItem()), output.getItemDamage(), 2);
}
else{
EntityItem item = new EntityItem(worldObj, pos.getX()+0.5, pos.getY()+0.5, pos.getZ()+0.5, output.copy());
worldObj.spawnEntityInWorld(item);
}
this.storage.extractEnergy(recipe.energyUse, false);
break;
}
}
}
}
}
}
//Converting the Items
ArrayList<EntityItem> items = (ArrayList<EntityItem>)worldObj.getEntitiesWithinAABB(EntityItem.class, AxisAlignedBB.getBoundingBox(hitBlock.getX()-range, hitBlock.getY()-range, hitBlock.getZ()-range, hitBlock.getX()+range, hitBlock.getY()+range, hitBlock.getZ()+range));
for(EntityItem item : items){
ItemStack stack = item.getEntityItem();
if(stack != null){
ArrayList<ReconstructorRecipeHandler.Recipe> recipes = ReconstructorRecipeHandler.getRecipes(stack);
for(ReconstructorRecipeHandler.Recipe recipe : recipes){
if(recipe != null && this.storage.getEnergyStored() >= recipe.energyUse && recipe.type == currentLens){
List<ItemStack> outputs = recipe.getOutputs();
if(outputs != null && !outputs.isEmpty()){
ItemStack outputCopy = outputs.get(0).copy();
outputCopy.stackSize = stack.stackSize;
item.setEntityItemStack(outputCopy);
this.storage.extractEnergy(recipe.energyUse, false);
break;
}
}
}
}
}
}
break;
}
else if(i >= distance-1){
@ -152,24 +71,16 @@ public class TileEntityAtomicReconstructor extends TileEntityInventoryBase imple
}
public ReconstructorRecipeHandler.LensType getCurrentLens(){
public Lens getCurrentLens(){
if(this.slots[0] != null){
if(this.slots[0].getItem() instanceof IReconstructorLens){
return ((IReconstructorLens)this.slots[0].getItem()).getLensType();
if(this.slots[0].getItem() instanceof ItemLens){
return ((ItemLens)this.slots[0].getItem()).getLensType();
}
}
return ReconstructorRecipeHandler.LensType.NONE;
return Lenses.LENS_NONE;
}
@SuppressWarnings("unchecked")
public void damagePlayer(int x, int y, int z, float damage){
ArrayList<EntityLivingBase> entities = (ArrayList<EntityLivingBase>)worldObj.getEntitiesWithinAABB(EntityLivingBase.class, AxisAlignedBB.getBoundingBox(x, y, z, x+1, y+1, z+1));
for(EntityLivingBase entity : entities){
entity.attackEntityFrom(DamageSources.DAMAGE_ATOMIC_RECONSTRUCTOR, damage);
}
}
private void shootLaser(int endX, int endY, int endZ, ReconstructorRecipeHandler.LensType currentLens){
private void shootLaser(int endX, int endY, int endZ, Lens currentLens){
PacketHandler.theNetwork.sendToAllAround(new PacketAtomicReconstructor(xCoord, yCoord, zCoord, endX, endY, endZ, currentLens), new NetworkRegistry.TargetPoint(worldObj.provider.dimensionId, xCoord, yCoord, zCoord, 64));
}
@ -194,7 +105,7 @@ public class TileEntityAtomicReconstructor extends TileEntityInventoryBase imple
@Override
public boolean isItemValidForSlot(int i, ItemStack stack){
return stack != null && stack.getItem() instanceof IReconstructorLens;
return stack != null && stack.getItem() instanceof ItemLens;
}
@Override

View file

@ -11,8 +11,8 @@
package ellpeck.actuallyadditions.util;
import cpw.mods.fml.common.FMLCommonHandler;
import ellpeck.actuallyadditions.items.lens.LensNoneRecipeHandler;
import ellpeck.actuallyadditions.recipe.CrusherRecipeRegistry;
import ellpeck.actuallyadditions.recipe.ReconstructorRecipeHandler;
import net.minecraft.block.BlockDispenser;
import net.minecraft.dispenser.BehaviorDefaultDispenseItem;
import net.minecraft.item.EnumRarity;
@ -66,8 +66,8 @@ public class Util{
public static class GetRecipes{
public static ReconstructorRecipeHandler.Recipe lastReconstructorRecipe(){
ArrayList<ReconstructorRecipeHandler.Recipe> list = ReconstructorRecipeHandler.recipes;
public static LensNoneRecipeHandler.Recipe lastReconstructorRecipe(){
ArrayList<LensNoneRecipeHandler.Recipe> list = LensNoneRecipeHandler.recipes;
return list.get(list.size()-1);
}

View file

@ -64,6 +64,12 @@ public class WorldPos{
return this.getWorld() != null ? this.getWorld().getBlockMetadata(this.x, this.y, this.z) : 0;
}
public void setMetadata(int meta, int flag){
if(this.getWorld() != null){
this.getWorld().setBlockMetadataWithNotify(this.x, this.y, this.z, meta, flag);
}
}
public boolean isEqual(WorldPos pos){
return pos != null && this.x == pos.getX() && this.y == pos.getY() && this.z == pos.getZ() && this.getWorld() == pos.getWorld();
}