Jump to content

vandy22

Members
  • Posts

    224
  • Joined

  • Last visited

Posts posted by vandy22

  1. Have you also wanted a fun, colorful set of tools, armor, blocks and custom items that can make your minecraft experience 1000x times better?!

     

    This is the ColorMod with loads of amazing armor sets, magical and powerful tools, blocks and much more!

     

    There are tiers of colors that range from just above iron to god-like weapons and armor.

    The tiers are:

     

    Red->Orange->Yellow->Warm

    Blue->Green->Purple->Cool

    Warm->Cool->Rainbow

     

    What to expect?:

    An item that makes you fly

    A custom furnace

    Colored Hardwood

    Colored Stairs

    Colored Slabs

    Colored Doors

    A custom crafting table

    9 Custom Tool and Armor Sets

    7 Custom Ores and Ingots

    9 Custom Blocks

    Cryptic Dimension

    Cryptic Tree's

    Magical Weapons

    Craftable Tool Repair

    Caves are filled with colorful ores

    Your minecraft experience is alot better!

     

    Things to know:

    The shiner is what lights the portal to the Cryptic. The Cryptic is made out of rainbow blocks in the same pattern as a Nether Portal.

    All tools and armor can be repaired with 1 ingot in the crafting table unless its warm or cool which must be repaired with blocks.

    The Cryptic Dimension has no use to this point but will in the following updates

    The warm, cool, and rainbow armor sets when equipped fully come with a special effect.

    Most of the rainbow tools have magical powers.

    When the Cryptic Artifact is in your inventory, you can fly.

    Ebonite is used as the Cryptic Infuser fuel.

     

    The rainbow tools

    ~Can not enchant rainbow tools

    ~Sword can shoot lightning on right click

    ~Pickaxe can generate torches on right click

    ~Axe can break whole tree

     

    Why does this mod make minecraft better:

    This mod adds many unique features that vanilla minecraft could never offer. If you have always wanted stuff better than... diamonds! Well then this is the mod for you!

     

    More updates will come:

    If you have suggestions please leave them in the comments below! The next update will invole the cryptic dimension and hopefully the adding of new mobs, fixing of possible bugs and much more.

     

    Mods that can make this mod better:

    Forge(Needed)

    Not Enough Items (Help with recipes)

    Optifine (Run's mod faster and minecraft in general)

     

    To see more about this mod and to download go here:

    http://www.planetminecraft.com/mod/1710colormod/

  2. If you want certain items to go into certain slots (a.k.a fuel) you need to make a custom transferStackInSlot method in your container class. For fuels in general, vanilla handles it by using the isItemFuel method in the TileEntity.

  3. The lines inside the if statement are doing this:

     

    flag1 = true;

    When set true, is making sure that when your furnace is not in a loaded chunk, it will save items inside.

     

    CrypticInfuser.updateFurnaceBlockState(this.isInfusing(), this.worldObj, this.xCoord, this.yCoord, this.zCoord);

    Is changing the texture of the furnace when on/off.

     

    Just for reference here is: updateFurnaceBlockState

    public static void updateFurnaceBlockState(boolean isInfusing, World world, int xCoord, int yCoord, int zCoord) {
    	int i = world.getBlockMetadata(xCoord, yCoord, zCoord);
    	TileEntity entity = world.getTileEntity(xCoord, yCoord, zCoord);
    	TileEntityCrypticInfuser infuser = new TileEntityCrypticInfuser();
    	keepInventory = true;
    
    	if(isInfusing){
    		world.setBlock(xCoord, yCoord, zCoord, BlockHandler.blockCrypticInfuserActive);
    	}else{
    		world.setBlock(xCoord, yCoord, zCoord, BlockHandler.blockCrypticInfuserIdle);
    	}
    
    	keepInventory = false;
    	world.setBlockMetadataWithNotify(xCoord, yCoord, zCoord, i, 2);
    
    	if(entity != null){
    		entity.validate();
    		world.setTileEntity(xCoord, yCoord, zCoord, entity);
    	}
    }

     

    Draco, with what you said here:

    Try recording that line so it makes sense.  You're checking for "foo is not equal to foo" which will always be false.

     

    It doesn't make since to me, that this statement only works correctly when its set to false. When set to false, it can check for true or false. When set to true, it stays true. When set to true, the "active furnace texture" will stay on forever.

     

     

  4. I've been sitting here for 5 minutes trying to figure out how this actually makes the texture turn off and on, and work.

     

    When you said this:

    if (flag != this.isInfusing()) { //essentially this line is "this.isInfusing() != this.isInfusing()"

     

    I knew that it meant that, but I never really thought about it deeply. I'm actually super confused right now.

     

    Can you at least explain to me how this would make the textures work for the furnace?

     

    If I were to make flag be static (either false or true), if it was false the texture wouldn't work. If it was true the texture would always stay on once starting the smelting.

     

    Basically if I set the flag to anything else, rather than this.isInfusing() the gui will work.

     

    Anything you can think of?

     

    Thanks

  5. Edit:

     

    So I figured out what line of code directly impacts this problem:

    boolean flag = this.isInfusing();

     

    If this boolean is set to this.isInfusing(), the furnace texturing works, as in, it lights up when stuff is infusing (smelting).

     

    But for some reason if this is set to this.isInfusing() the gui progress bars don't work properly.

     

    To have the gui work properly you have to change that line to:

    boolean flag = this.hasPower();

     

    But now, the textures don't work, as in, it doesn't light up when stuff is infusing (smelting).

     

    It's kind of ironic because this is a boolean and two different values make two different things true / false all at the same time. There has to be something in my code that I'm doing wrong that can fix this. It also most likely has to do with the TE Class (updateEntity method specifically).

     

    Here's the TE Code:

    package com.mjj.colormod.tileentity;
    
    import com.mjj.colormod.blocks.CrypticInfuser;
    import com.mjj.colormod.crafting.CrypticInfuserRecipes;
    import com.mjj.colormod.handler.BlockHandler;
    import com.mjj.colormod.handler.ItemHandler;
    
    import net.minecraft.entity.player.EntityPlayer;
    import net.minecraft.init.Blocks;
    import net.minecraft.init.Items;
    import net.minecraft.inventory.IInventory;
    import net.minecraft.inventory.ISidedInventory;
    import net.minecraft.item.Item;
    import net.minecraft.item.ItemStack;
    import net.minecraft.nbt.NBTTagCompound;
    import net.minecraft.nbt.NBTTagList;
    import net.minecraft.tileentity.TileEntity;
    
    public class TileEntityCrypticInfuser extends TileEntity implements ISidedInventory{
    
    private ItemStack slots[];
    
    public int dualPower;
    public int dualCookTime;
    public static final int maxPower = 10000;
    public static final int infusingSpeed = 100;
    
    private static final int[] slots_top = new int[] {0, 1};
    private static final int[] slots_bottom = new int[] {3};
    private static final int[] slots_side = new int[] {2};
    
    private String customName;
    
    public TileEntityCrypticInfuser(){
    	slots = new ItemStack[4];
    }
    @Override
    public int getSizeInventory() {
    	return slots.length;
    }
    @Override
    public ItemStack getStackInSlot(int i) {
    	return slots[i];
    }
    @Override
    public ItemStack getStackInSlotOnClosing(int i) {
    	if(slots[i] != null){
    		ItemStack itemstack = slots[i];
    		slots[i] = null;
    		return itemstack;
    	}else{
    		return null;
    	}
    }
    @Override
    public void setInventorySlotContents(int i, ItemStack itemstack) {
    	slots[i] = itemstack;
    	if(itemstack != null && itemstack.stackSize > getInventoryStackLimit()){
    		itemstack.stackSize = getInventoryStackLimit();
    	}
    
    }
    
    
    //public static ItemStack getSmeltingResultForItem(ItemStack stack) { return FurnaceRecipes.instance().getSmeltingResult(stack); }
    
    public void setGuiDisplayName(String name){
    	this.customName = name;
    }
    
    @Override
    public String getInventoryName() {
    	return "container.crypticinfuser";
    }
    @Override
    public boolean hasCustomInventoryName() {
    	return this.customName != null && this.customName.length() > 0;
    }
    
    @Override
    public int getInventoryStackLimit() {
    	return 64;
    }
    @Override
    public boolean isUseableByPlayer(EntityPlayer player) {
    	if(worldObj.getTileEntity(xCoord, yCoord, zCoord) != this){
    		return false;
    	}else{
    		return player.getDistanceSq((double)xCoord + 0.5D, (double)yCoord + 0.5D, (double)zCoord + 0.5D) <= 64;
    	}
    }
    
    public void openInventory() {}
    public void closeInventory() {}
    
    @Override
    public boolean isItemValidForSlot(int i, ItemStack itemstack) {
    	return i == 2 ? false : (i == 1 ? hasItemPower(itemstack) : true);
    }
    
    public boolean hasItemPower(ItemStack itemstack){
    	return getItemPower(itemstack) > 0;
    }
    
    private static int getItemPower(ItemStack itemstack){
    	if(itemstack == null){
    		return 0; 
    	}else{
    		Item item = itemstack.getItem();
    
    		if(item == ItemHandler.ebonite) return 50;
    
    		return 0;
    	}
    }
    
    public ItemStack decrStackSize(int i, int j){
    	if(slots[i] != null){
    		if(slots[i].stackSize <= j){
    			ItemStack itemstack = slots[i];
    			slots[i] = null;
    			return itemstack;
    		}
    		ItemStack itemstack1 = slots[i].splitStack(j);
    
    		if(slots[i].stackSize == 0){
    			slots[i] = null;
    		}
    		return itemstack1;
    	}else{
    		return null;
    	}
    }
    
    public void readFromNBT (NBTTagCompound nbt){
    	super.readFromNBT(nbt);
    	NBTTagList list = nbt.getTagList("Items", 10);
    	slots = new ItemStack[getSizeInventory()];
    
    	for(int i = 0; i < list.tagCount(); i++){
    		NBTTagCompound nbt1 = (NBTTagCompound)list.getCompoundTagAt(i);
    		byte b0 = nbt1.getByte("Slot");
    
    		if(b0 >= 0 && b0 < slots.length){
    			slots[b0] = ItemStack.loadItemStackFromNBT(nbt1);
    		}
    	}
    	dualPower = nbt.getShort("PowerTime");
    	dualCookTime = nbt.getShort("CookTime");
    
    }
    public void writeToNBT(NBTTagCompound nbt){
    	super.writeToNBT(nbt);
    	nbt.setShort("PowerTime", (short)dualPower);
    	nbt.setShort("CookTime", (short)dualCookTime);
    	NBTTagList list = new NBTTagList();
    
    	for(int i = 0; i < slots.length; i++){
    		if(slots[i] != null){
    			NBTTagCompound nbt1 = new NBTTagCompound();
    			nbt1.setByte("Slot", (byte)i);
    			slots[i].writeToNBT(nbt1);
    			list.appendTag(nbt1);
    		}
    	}
    	nbt.setTag("Items", list);
    }
    
    @Override
    public int[] getAccessibleSlotsFromSide (int i){
    	return i == 0 ? slots_bottom : (i == 1 ? slots_top : slots_side);
    }
    @Override
    public boolean canInsertItem(int var1, ItemStack itemstack, int var3) {
    	return this.isItemValidForSlot(var1, itemstack);
    }
    @Override
    public boolean canExtractItem(int i, ItemStack itemstack, int j) {
    	return j != 0 || i != 1 || itemstack.getItem() == Items.bucket;
    }
    
    public int getInfuserProgressScaled(int i){
    	return (dualCookTime * i) /this.infusingSpeed;
    }
    
    public int getPowerRemainingScaled(int i){
    	return (dualPower * i) / maxPower;
    }
    
    private boolean canInfuse() {
    
    	if (slots[0] == null || slots[1] == null) {
    		return false;
    	}
    
    	ItemStack itemstack = CrypticInfuserRecipes.getInfusedResult(slots[0].getItem(), slots[1].getItem());
    
    	if (itemstack == null) {
    		return false;
    	}
    
    	if (slots[3] == null) {
    		return true;
    	}
    
    	if (!slots[3].isItemEqual(itemstack)) {
    		return false;
    	}
    
    	if (slots[3].stackSize < getInventoryStackLimit() && slots[3].stackSize < slots[3].getMaxStackSize()) {
    		return true;
    	}else{
    		return slots[3].stackSize < itemstack.getMaxStackSize();
    	}
    }
    
    private void infuseItem() {
    	if (canInfuse()) {
    		ItemStack itemstack = CrypticInfuserRecipes.getInfusedResult(slots[0].getItem(), slots[1].getItem());
    
    		if (slots[3] == null) {
    			slots[3] = itemstack.copy();
    		}else if (slots[3].isItemEqual(itemstack)) {
    			slots[3].stackSize += itemstack.stackSize;
    		}
    
    		for (int i = 0; i < 2; i++) {
    			if (slots[i].stackSize <= 0) {
    				slots[i] = new ItemStack(slots[i].getItem().setFull3D());
    			}else{
    				slots[i].stackSize--;
    			}
    
    			if (slots[i].stackSize <= 0){
    				slots[i] = null;
    			}
    		}
    	}
    }
    
    public boolean hasPower(){
    	return dualPower > 0;
    }
    
    public boolean isInfusing(){
    	return this.dualCookTime > 0;
    }
    
    public void updateEntity() {
    	boolean flag = this.isInfusing();
    	boolean flag1= false;
    
    	if(hasPower() && this.isInfusing()) {
    		this.dualPower--;
    	}
    		if (this.hasItemPower(this.slots[2]) && this.dualPower <= (this.maxPower - this.getItemPower(this.slots[2]))) {
    			this.dualPower += getItemPower(this.slots[2]);
    
    			if(this.slots[2] != null) {
    				flag1 = true;
    
    				this.slots[2].stackSize--;
    
    				if(this.slots[2].stackSize == 0) {
    					this.slots[2] = this.slots[2].getItem().getContainerItem(this.slots[2]);
    				}
    			}
    		}
    
    		if (hasPower() && canInfuse()) {
    			this.dualCookTime++;
    
    			if (this.dualCookTime == this.infusingSpeed) {
    				this.dualCookTime = 0;
    				this.infuseItem();
    				flag1 = true;
    			}
    		}else{
    			dualCookTime = 0;
    		}
    
    		if (flag != this.isInfusing()) {
    			flag1 = true;
    			CrypticInfuser.updateFurnaceBlockState(this.isInfusing(), this.worldObj, this.xCoord, this.yCoord, this.zCoord);
    		}
    
    	if (flag1) {
    		this.markDirty();
    	}
        }
    }
    
    

     

    Now that I've narrowed down the problem I just need to figure out what is going on.

     

    Thanks

    ~vandy22

  6. First off, you guys are great coders, and your organization is amazing. I also love how you use comments, one to help you, and also to help people like me. The transferStackInSlot im using is straight up vanilla code. Which now makes since why its not working. I have a fuel slot, 2 input slots, and an output slot. Vanilla uses only one input slot. I like how you defined variables as it makes your code very easy to read and nice and organized.

     

    But I am still kind of confused what I would need to change the vanilla transferStackInSlot to in order for it to work with two input slots. I understand that it has to do with the number of slots. Like you said I believe my total slot number would be 39 though. Since player is 0-35 and my tile entity is 0-3.

     

    I would love if you could just give a small example with how I would do this with my code. I know it seems fairly obvious to you. It's just all these numbers everywhere, I don't want to mess something up. I do understand conceptually what I need to be doing though.

     

    Also for the fuel slot it uses a method called .getSmeltingResult() in the furnace recipe class. Since I have a custom recipe class, do you have any idea what I would do with that? Although not as important as my first question, I would love to know if you have the time.

     

    Thanks

    ~vandy22

  7. Wow.. I' dumb. I got it to work, the reason was the flag boolean was returning whether or not the system had fuel. Not if it was actually infusing.

     

    Now, I just need to figure out the second issue:

     

    The furnace to the container/ the container to the furnace when shift clicking is messed up. Even if someone could point me to the specific class they think the problem would lie in, that would be great. I'm assuming there has to be a method in one of these classes that has to do with shift-clicking items. Maybe Its because I haven't overrode it yet.

     

    If anyone has had this issue, or know where the shift clicking stuff occurs. In which class. I would love to know.

     

    Thanks!

    ~vandy22

  8. I like the way you did your block, but I don't really want to re-code most of code unless I necessarily have to. I am using the updateFurnaceBlockState and you aren't. I want to be closer to the vanilla side of things, unless for some reason I have to change my code to be similar to yours.

     

    I did make some progress though. At least I think.

    In the method updateEntity() in the TileEntity class, when updating the blockFurnaceState there was a problem.

    Here's the original updateEntity code:

    public void updateEntity() {
    	boolean flag = this.hasPower();
    	boolean flag1= false;
    
    	if(hasPower() && this.isInfusing()) {
    		this.dualPower--;
    	}
    
    		if (this.hasItemPower(this.slots[2]) && this.dualPower <= (this.maxPower - this.getItemPower(this.slots[2]))) {
    			this.dualPower += getItemPower(this.slots[2]);
    
    			if(this.slots[2] != null) {
    				flag1 = true;
    
    				this.slots[2].stackSize--;
    
    				if(this.slots[2].stackSize == 0) {
    					this.slots[2] = this.slots[2].getItem().getContainerItem(this.slots[2]);
    				}
    			}
    		}
    
    		if (hasPower() && canInfuse()) {
    			dualCookTime++;
    
    			if (this.dualCookTime == this.infusingSpeed) {
    				this.dualCookTime = 0;
    				this.infuseItem();
    				flag1 = true;
    			}
    		}else{
    			dualCookTime = 0;
    		}
    
    		if (flag != this.isInfusing()) {
    			flag1 = true;
    			CrypticInfuser.updateFurnaceBlockState(this.isInfusing(), this.worldObj, this.xCoord, this.yCoord, this.zCoord);
    
    	if (flag1) {
    		this.markDirty();
    	}
        }
    }

     

    You want to be looking at this:

    if (flag != this.isInfusing()) {
    			flag1 = true;
    			CrypticInfuser.updateFurnaceBlockState(this.isInfusing(), this.worldObj, this.xCoord, this.yCoord, this.zCoord);
    
    	if (flag1) {
    		this.markDirty();
    	}
        }

     

    This never works, and hasen't worked.

     

    When I do this:

    if (flag = this.isInfusing()) {
    			flag1 = true;
    			System.out.println(isInfusing());
    			CrypticInfuser.updateFurnaceBlockState(this.isInfusing(), this.worldObj, this.xCoord, this.yCoord, this.zCoord);
    
    	if (flag1) {
    		this.markDirty();
    	}

     

    It will work, but there's nothing here to say stop infusing if there not equal. Trust me I have tried else statements, if statements and i get all sorts of crazy glitches.

     

    Here's the updateFurnaceBlockState method:

    public static void updateFurnaceBlockState(boolean isInfusing, World world, int xCoord, int yCoord, int zCoord) {
    	System.out.println("Here!");
    	int i = world.getBlockMetadata(xCoord, yCoord, zCoord);
    	TileEntity entity = world.getTileEntity(xCoord, yCoord, zCoord);
    	TileEntityCrypticInfuser infuser = new TileEntityCrypticInfuser();
    	keepInventory = true;
    
    	if(isInfusing){
    		System.out.println("HERE!");
    		world.setBlock(xCoord, yCoord, zCoord, BlockHandler.blockCrypticInfuserActive);
    	}else{
    		world.setBlock(xCoord, yCoord, zCoord, BlockHandler.blockCrypticInfuserIdle);
    	}
    
    	keepInventory = false;
    	world.setBlockMetadataWithNotify(xCoord, yCoord, zCoord, i, 2);
    
    	if(entity != null){
    		entity.validate();
    		world.setTileEntity(xCoord, yCoord, zCoord, entity);
    	}
    }

     

    You can see my println's for testing purposes. The first one println() is always reached by both of the different if statements I showed you in the updateEntity method(). The only one that gets the the second println() is the second if statement I showed you, that I said got it to turn on.

     

    By the way, the first if statement: if(flag != this.isInfusing()) is how vanilla is written. Which makes my brain hurt even more. I'm very confused and not sure why this is happening.

     

    Thanks shadowfacts for the code referencing, it helped me dig deeper into my code, and find different ways (that almost work). If you know of a way closer to vanilla that will work, I would love to know.

     

    Thanks, any help is much appreciated!

    ~vandy22

  9. In getIcon, you should be checking if the metadata == side, instead you are checking if the metadata == 0 and the side == 3. This will only use the front furnace texture on side 3. I suggest you use something like this to check if the furnace is active:

    Code: [select]

    @SideOnly(Side.CLIENT)

    public IIcon getIcon(IBlockAccess world, int x, int y, int z, int side) {

    // get wether the furnace is active, then return the propper texture

    }

     

    I think you are referring to two different methods of getIcon in that responce, but I'm pretty sure I know which is which.

     

    I think your saying I need to do this? It does not show the front angle of the item though.

    @SideOnly(Side.CLIENT)
    public IIcon getIcon(int side, int metadata){
    	//return metadata == 0 && side == 3 ? this.iconFront : (side == metadata ? this.iconFront : this.blockIcon);
    	return side == metadata ? this.iconFront : this.blockIcon;
    }

     

    And for this method your saying something like this? Although I'm not positive what I should be returning in this getIcon method.

    @SideOnly(Side.CLIENT)
    public IIcon getIcon(IBlockAccess world, int x, int y, int z, int side){
    	if(isActive){
    		return //what do I put here
    	}
    }

     

    Thanks

    ~vandy22

     

  10. There are only two issues with my furnace right now that need to be fixed. Before I carry on I want to say that, before I ever post on this forum I take a lot of time reviewing my code, comparing it to vanilla, make sure things are matching up right, so on and so forth. The two issues are not very big and I think are most likely the issue is hidden behind one line of code.

     

    Issue 1:

     

    The activated furnace texture does not turn on.

     

    Issue 2:

     

    When using shift click and an item is in the a certain slot in the furnace, it will go into the output slot.

     

    TE:

     

    package com.mjj.colormod.tileentity;
    
    import com.mjj.colormod.blocks.CrypticInfuser;
    import com.mjj.colormod.crafting.CrypticInfuserRecipes;
    import com.mjj.colormod.handler.BlockHandler;
    import com.mjj.colormod.handler.ItemHandler;
    
    import net.minecraft.entity.player.EntityPlayer;
    import net.minecraft.init.Blocks;
    import net.minecraft.init.Items;
    import net.minecraft.inventory.IInventory;
    import net.minecraft.inventory.ISidedInventory;
    import net.minecraft.item.Item;
    import net.minecraft.item.ItemStack;
    import net.minecraft.nbt.NBTTagCompound;
    import net.minecraft.nbt.NBTTagList;
    import net.minecraft.tileentity.TileEntity;
    
    public class TileEntityCrypticInfuser extends TileEntity implements ISidedInventory{
    
    private ItemStack slots[];
    
    public int dualPower;
    public int dualCookTime;
    public static final int maxPower = 10000;
    public static final int infusingSpeed = 100;
    
    private static final int[] slots_top = new int[] {0, 1};
    private static final int[] slots_bottom = new int[] {3};
    private static final int[] slots_side = new int[] {2};
    
    private String customName;
    
    public TileEntityCrypticInfuser(){
    	slots = new ItemStack[4];
    }
    @Override
    public int getSizeInventory() {
    	return slots.length;
    }
    @Override
    public ItemStack getStackInSlot(int i) {
    	return slots[i];
    }
    @Override
    public ItemStack getStackInSlotOnClosing(int i) {
    	if(slots[i] != null){
    		ItemStack itemstack = slots[i];
    		slots[i] = null;
    		return itemstack;
    	}else{
    		return null;
    	}
    }
    @Override
    public void setInventorySlotContents(int i, ItemStack itemstack) {
    	slots[i] = itemstack;
    	if(itemstack != null && itemstack.stackSize > getInventoryStackLimit()){
    		itemstack.stackSize = getInventoryStackLimit();
    	}
    
    }
    
    public void setGuiDisplayName(String name){
    	this.customName = name;
    }
    
    @Override
    public String getInventoryName() {
    	return "container.crypticinfuser";
    }
    @Override
    public boolean hasCustomInventoryName() {
    	return this.customName != null && this.customName.length() > 0;
    }
    
    @Override
    public int getInventoryStackLimit() {
    	return 64;
    }
    @Override
    public boolean isUseableByPlayer(EntityPlayer player) {
    	if(worldObj.getTileEntity(xCoord, yCoord, zCoord) != this){
    		return false;
    	}else{
    		return player.getDistanceSq((double)xCoord + 0.5D, (double)yCoord + 0.5D, (double)zCoord + 0.5D) <= 64;
    	}
    }

     

     

    Block:

     

    package com.mjj.colormod.blocks;
    
    import java.util.Random;
    
    import com.mjj.colormod.ColorMod;
    import com.mjj.colormod.handler.BlockHandler;
    import com.mjj.colormod.tileentity.TileEntityCrypticInfuser;
    
    import cpw.mods.fml.common.network.internal.FMLNetworkHandler;
    import cpw.mods.fml.relauncher.Side;
    import cpw.mods.fml.relauncher.SideOnly;
    
    import net.minecraft.block.Block;
    import net.minecraft.block.BlockContainer;
    import net.minecraft.block.material.Material;
    import net.minecraft.client.renderer.texture.IIconRegister;
    import net.minecraft.entity.EntityLivingBase;
    import net.minecraft.entity.item.EntityItem;
    import net.minecraft.entity.player.EntityPlayer;
    import net.minecraft.item.ItemStack;
    import net.minecraft.nbt.NBTTagCompound;
    import net.minecraft.tileentity.TileEntity;
    import net.minecraft.util.IIcon;
    import net.minecraft.util.MathHelper;
    import net.minecraft.world.World;
    
    public class CrypticInfuser extends BlockContainer{
    
    private Random rand;
    private Random rand1;
    private final boolean isActive;
    private static boolean keepInventory = true;
    
    @SideOnly(Side.CLIENT)
    private IIcon iconFront;
    
    public CrypticInfuser(boolean blockState) {
    	super(Material.iron);
    	rand = new Random();
    	rand1 = new Random();
    	isActive = blockState;
    
    }
    
    @SideOnly(Side.CLIENT)
    public void registerBlockIcons(IIconRegister iconRegister){
    	this.blockIcon = iconRegister.registerIcon(ColorMod.modid + ":" + (this.isActive ? "CrypticInfuserSideOn" : "CrypticInfuserSideOff"));
    	this.iconFront = iconRegister.registerIcon(ColorMod.modid + ":" + (this.isActive ? "CrypticInfuserFrontOn" : "CrypticInfuserFrontOff"));
    }
    
    @SideOnly(Side.CLIENT)
    public IIcon getIcon(int side, int metadata){
    	return metadata == 0 && side == 3 ? this.iconFront : (side == metadata ? this.iconFront : this.blockIcon);
    }
    
    public void onBlockAdded(World world, int x, int y, int z){
    	super.onBlockAdded(world, x, y, z);
    	this.setDefaultDirection(world, x, y, z);
    }
    @Override
    public void breakBlock(World world, int x, int y, int z, Block oldBlock, int oldMetadata){
    	if(!keepInventory){
    		TileEntityCrypticInfuser tileentity = (TileEntityCrypticInfuser) world.getTileEntity(x, y, z);
    
    		if(tileentity != null){
    			for(int i = 0; i < tileentity.getSizeInventory(); i++){
    				ItemStack itemstack = tileentity.getStackInSlot(i);
    
    				if(itemstack != null){
    					float f = this.rand1.nextFloat() * 0.8F + 0.1F;
    					float f1 = this.rand1.nextFloat() * 0.8F + 0.1F;
    					float f2 = this.rand1.nextFloat() * 0.8F + 0.1F;
    
    					while(itemstack.stackSize > 0){
    						int j = this.rand1.nextInt(21) + 10;
    
    						if(j > itemstack.stackSize){
    							j = itemstack.stackSize;
    						}
    
    						itemstack.stackSize -= j;
    
    						EntityItem item = new EntityItem(world, (double)((float)x + f), (double)((float)y + f1), (double)((float)z + f2), new ItemStack(itemstack.getItem(), j, itemstack.getItemDamage()));
    
    						if(itemstack.hasTagCompound()){
    							item.getEntityItem().setTagCompound((NBTTagCompound)itemstack.getTagCompound().copy());
    						}
    
    						float f3 = 0.05F;
    						item.motionX = (double)((float)this.rand.nextGaussian() * f3);
    						item.motionY = (double)((float)this.rand.nextGaussian() * f3 + 0.2F);
    						item.motionX = (double)((float)this.rand.nextGaussian() * f3);
    
    						world.spawnEntityInWorld(item);
    					}
    				}
    			}
    
    			world.func_147453_f(x, y, z, oldBlock);
    		}
    	}
    	super.breakBlock(world, x, y, z, oldBlock, oldMetadata);
    }
    
    private void setDefaultDirection(World world, int x, int y, int z){
    	if(!world.isRemote){
    		Block block1 = world.getBlock(x, y, z - 1);
    		Block block2 = world.getBlock(x, y, z + 1);
    		Block block3 = world.getBlock(x - 1, y, z);
    		Block block4 = world.getBlock(x + 1, y, z);
    
    		byte b0 = 3;
    
    		if(block1.func_149730_j() && !block2.func_149730_j()){
    			b0 = 3;
    		}
    		if(block2.func_149730_j() && !block1.func_149730_j()){
    			b0 = 2;
    		}
    		if(block3.func_149730_j() && !block4.func_149730_j()){
    			b0 = 5;
    		}
    		if(block4.func_149730_j() && !block3.func_149730_j()){
    			b0 = 4;
    		}
    		world.setBlockMetadataWithNotify(x, y, z, b0, 2);
    	}
    }
    
    public void onBlockPlacedBy(World world, int x, int y, int z, EntityLivingBase entityPlayer, ItemStack itemstack){
    	int i = MathHelper.floor_double((double)(entityPlayer.rotationYaw * 4.0F / 360F) + 0.5D) & 3;
    
    	if(i == 0){
    		world.setBlockMetadataWithNotify(x, y, z, 2, 2);
    	}
    	if(i == 1){
    		world.setBlockMetadataWithNotify(x, y, z, 5, 2);
    	}
    	if(i == 2){
    		world.setBlockMetadataWithNotify(x, y, z, 3, 2);
    	}
    	if(i == 3){
    		world.setBlockMetadataWithNotify(x, y, z, 4, 2);
    	}
    
    	if(itemstack.hasDisplayName()){
    		((TileEntityCrypticInfuser)world.getTileEntity(x, y, z)).setGuiDisplayName(itemstack.getDisplayName());
    	}
    }
    @Override
    public boolean onBlockActivated(World world, int x, int y, int z, EntityPlayer player, int side, float hitX, float hitY, float hitZ){
    	if(world.isRemote){
    		return true;
    	}else if(!player.isSneaking()){
    		TileEntityCrypticInfuser entity = (TileEntityCrypticInfuser) world.getTileEntity(x, y, z);
    		if (entity != null){
    			FMLNetworkHandler.openGui(player, ColorMod.instance, BlockHandler.guiIDCrypticInfuser, world, x, y, z);
    		}
    		return true;
    	}else{
    		return false;
    	}
    }
    
    @Override
    public TileEntity createNewTileEntity(World p_149915_1_, int p_149915_2_) {
    	return new TileEntityCrypticInfuser();
    }
    
    public static void updateFurnaceBlockState(boolean isInfusing, World world, int xCoord, int yCoord, int zCoord) {
    	int i = world.getBlockMetadata(xCoord, yCoord, zCoord);
    	TileEntity entity = world.getTileEntity(xCoord, yCoord, zCoord);
    	TileEntityCrypticInfuser infuser = new TileEntityCrypticInfuser();
    	keepInventory = true;
    
    	if(isInfusing){
    		world.setBlock(xCoord, yCoord, zCoord, BlockHandler.blockCrypticInfuserActive);
    	}else{
    		world.setBlock(xCoord, yCoord, zCoord, BlockHandler.blockCrypticInfuserIdle);
    	}
    
    	keepInventory = false;
    	world.setBlockMetadataWithNotify(xCoord, yCoord, zCoord, i, 2);
    
    	if(entity != null){
    		entity.validate();
    		world.setTileEntity(xCoord, yCoord, zCoord, entity);
    	}
    }
    
    }
    

     

     

    Container:

     

    package com.mjj.colormod.container;
    
    import com.mjj.colormod.slot.SlotCrypticInfuser;
    import com.mjj.colormod.tileentity.TileEntityCrypticInfuser;
    
    import net.minecraft.entity.player.EntityPlayer;
    import net.minecraft.entity.player.InventoryPlayer;
    import net.minecraft.inventory.Container;
    import net.minecraft.inventory.ICrafting;
    import net.minecraft.inventory.Slot;
    import net.minecraft.item.ItemStack;
    import net.minecraft.item.crafting.FurnaceRecipes;
    import net.minecraft.tileentity.TileEntityFurnace;
    
    public class ContainerCrypticInfuser extends Container {
    
    private TileEntityCrypticInfuser infuser;
    private int dualCookTime;
    private int dualPower;
    private int lastItemBurnTime;
    
    public ContainerCrypticInfuser(InventoryPlayer invPlayer, TileEntityCrypticInfuser teCrypticInfuser){
    	dualCookTime = 0;
    	dualPower = 0;
    	lastItemBurnTime = 0;
    
    	infuser = teCrypticInfuser;
    
    	this.addSlotToContainer(new Slot(teCrypticInfuser, 0, 35, 34));
    	this.addSlotToContainer(new Slot(teCrypticInfuser, 1, 58, 34));
    	this.addSlotToContainer(new Slot(teCrypticInfuser, 2, 8, 61));
    	this.addSlotToContainer(new SlotCrypticInfuser(invPlayer.player, teCrypticInfuser, 3, 125, 35));
    
    	//Inventory
    	for(int i = 0; i < 3; i++) {
    		for(int j = 0; j < 9; j++) {
    			this.addSlotToContainer(new Slot(invPlayer, j + i * 9 + 9, 8 + j * 18, 84 + i * 18));
    		}
    	}
    
    	//ActionBar
    	for(int i = 0; i < 9; i++) {
    		this.addSlotToContainer(new Slot(invPlayer, i, 8 + i * 18, 142));
    	}
    
    }
    
    public void addCraftingToCrafters (ICrafting crafting){
    	super.addCraftingToCrafters(crafting);
    	crafting.sendProgressBarUpdate(this, 0, this.infuser.dualCookTime);
    	crafting.sendProgressBarUpdate(this, 1, this.infuser.dualPower);
    }
    
    public ItemStack transferStackInSlot(EntityPlayer p_82846_1_, int p_82846_2_)
        {
            ItemStack itemstack = null;
            Slot slot = (Slot)this.inventorySlots.get(p_82846_2_);
    
            if (slot != null && slot.getHasStack())
            {
                ItemStack itemstack1 = slot.getStack();
                itemstack = itemstack1.copy();
    
                if (p_82846_2_ == 2)
                {
                    if (!this.mergeItemStack(itemstack1, 3, 39, true))
                    {
                        return null;
                    }
    
                    slot.onSlotChange(itemstack1, itemstack);
                }
                else if (p_82846_2_ != 1 && p_82846_2_ != 0)
                {
                    if (FurnaceRecipes.smelting().getSmeltingResult(itemstack1) != null)
                    {
                        if (!this.mergeItemStack(itemstack1, 0, 1, false))
                        {
                            return null;
                        }
                    }
                    else if (TileEntityFurnace.isItemFuel(itemstack1))
                    {
                        if (!this.mergeItemStack(itemstack1, 1, 2, false))
                        {
                            return null;
                        }
                    }
                    else if (p_82846_2_ >= 3 && p_82846_2_ < 30)
                    {
                        if (!this.mergeItemStack(itemstack1, 30, 39, false))
                        {
                            return null;
                        }
                    }
                    else if (p_82846_2_ >= 30 && p_82846_2_ < 39 && !this.mergeItemStack(itemstack1, 3, 30, false))
                    {
                        return null;
                    }
                }
                else if (!this.mergeItemStack(itemstack1, 3, 39, false))
                {
                    return null;
                }
    
                if (itemstack1.stackSize == 0)
                {
                    slot.putStack((ItemStack)null);
                }
                else
                {
                    slot.onSlotChanged();
                }
    
                if (itemstack1.stackSize == itemstack.stackSize)
                {
                    return null;
                }
    
                slot.onPickupFromSlot(p_82846_1_, itemstack1);
            }
    
            return itemstack;
        }
    
    @Override
    public boolean canInteractWith(EntityPlayer player) {
    	return infuser.isUseableByPlayer(player);
    }
    
    public void detectandSendChanges(){
    	super.detectAndSendChanges();
    
    	for(int i = 0; i < this.crafters.size(); i++){
    		ICrafting k = (ICrafting)this.crafters.get(i);
    
    		if(this.dualCookTime != this.infuser.dualCookTime){
    			k.sendProgressBarUpdate(this, 0, this.infuser.dualCookTime);
    		}
    
    		if(this.dualPower != this.infuser.dualPower){
    			k.sendProgressBarUpdate(this, 1, this.infuser.dualPower);
    		}
    	}
    
    	this.dualCookTime = this.infuser.dualCookTime;
    	this.dualPower = this.infuser.dualPower;
    }
    
    public void updateProgressBar(int i, int j){
    	if (i == 0){
    		infuser.dualCookTime = j;
    	}
    	if (i == 1){
    		infuser.dualPower = j;
    	}
    }
    
    }
    

     

     

    Slot:

     

    package com.mjj.colormod.slot;
    
    import com.mjj.colormod.tileentity.TileEntityCrypticInfuser;
    
    import net.minecraft.entity.player.EntityPlayer;
    import net.minecraft.inventory.IInventory;
    import net.minecraft.inventory.Slot;
    import net.minecraft.item.ItemStack;
    import net.minecraft.util.MathHelper;
    
    public class SlotCrypticInfuser extends Slot {
    
    private EntityPlayer thePlayer;
    private int field_75228_b;
    
    public SlotCrypticInfuser(EntityPlayer par1EntityPlayer, IInventory par2IInventory, int par3, int par4, int par5)
    {
    	super(par2IInventory, par3, par4, par5);
    	this.thePlayer = par1EntityPlayer;
    }
    
    public boolean isItemValid(ItemStack par1ItemStack)
    {
    	return false;
    }
    
    public ItemStack decrStackSize(int par1)
    {
    	if (this.getHasStack()){
    	this.field_75228_b += Math.min(par1, this.getStack().stackSize);
    }
    return super.decrStackSize(par1);
    }
    
    public void onPickupFromSlot(EntityPlayer par1EntityPlayer, ItemStack par2ItemStack)
    {
    	this.onCrafting(par2ItemStack);
    	super.onPickupFromSlot(par1EntityPlayer, par2ItemStack);
    }
    
    protected void onCrafting(ItemStack par1ItemStack, int par2)
    {
    	this.field_75228_b += par2;
    	this.onCrafting(par1ItemStack);
    }
    
    }

     

     

    If anyone has made a furnace before in 1.7.10 and has all this stuff working, I would love to have some advice from you.

     

    Thanks!

    ~vandy22

  11. Wow.. It was a simple as that. I was registering it with this code:

    MinecraftForge.EVENT_BUS.register(new ArtifactEvent());

     

    Not this:

    FMLCommonHandler.instance().bus().register(new ArtifactEvent());

     

    Thanks coolAlias!

  12. I want to run it on both, so I removed

    !event.player.worldObj.isRemote

     

    Looks like this:

    package com.mjj.colormod.event;
    
    import com.mjj.colormod.handler.ItemHandler;
    
    import cpw.mods.fml.common.eventhandler.SubscribeEvent;
    import cpw.mods.fml.common.gameevent.TickEvent.Phase;
    import cpw.mods.fml.common.gameevent.TickEvent.PlayerTickEvent;
    import net.minecraft.entity.player.EntityPlayer;
    import net.minecraft.entity.player.EntityPlayerMP;
    import net.minecraft.item.ItemStack;
    import net.minecraft.network.play.client.C13PacketPlayerAbilities;
    import net.minecraft.world.World;
    
    public class ArtifactEvent {
    
    
    @SubscribeEvent
    public void onTickPlayerEvent(PlayerTickEvent event){
    
    	//if(!event.player.worldObj.isRemote){
    		if(event.phase == Phase.START){
    			EntityPlayer player = (EntityPlayer) event.player;
    			if(player.inventory.hasItem(ItemHandler.crypticArtifact)){
    				player.capabilities.allowFlying = true;
    			}else{
    				if(player.capabilities.isFlying == true){
    					player.capabilities.isFlying = player.capabilities.isCreativeMode ? true : false;
    					player.capabilities.allowFlying = player.capabilities.isCreativeMode ? true : false;
    				}
    			}
    			if(event.phase == Phase.END){
    
    			}
    			}
    		}
    	}
    //}

     

    Still doesn't work though?

  13. Must still be doing this wrong?

    package com.mjj.colormod.event;
    
    import com.mjj.colormod.handler.ItemHandler;
    
    import cpw.mods.fml.common.eventhandler.SubscribeEvent;
    import cpw.mods.fml.common.gameevent.TickEvent.Phase;
    import cpw.mods.fml.common.gameevent.TickEvent.PlayerTickEvent;
    import net.minecraft.entity.player.EntityPlayer;
    import net.minecraft.item.ItemStack;
    import net.minecraft.world.World;
    
    public class ArtifactEvent {
    
    public World world;
    
    @SubscribeEvent
    public void onTickPlayerEvent(PlayerTickEvent event){
    
    	if(!event.player.worldObj.isRemote){
    		if(event.phase == Phase.START){
    			EntityPlayer player = (EntityPlayer) event.player;
    			if(player.inventory.hasItem(ItemHandler.crypticArtifact)){
    				player.capabilities.allowFlying = true;
    			}else{
    				if(player.capabilities.isFlying == true){
    					player.capabilities.isFlying = player.capabilities.isCreativeMode ? true : false;
    					player.capabilities.allowFlying = player.capabilities.isCreativeMode ? true : false;
    				}
    			}
    				if(event.phase == Phase.END){
    
    				}
    			}
    		}
    	}
    }

  14. Don't think I'm doing this right:

    package com.mjj.colormod.event;
    
    import com.mjj.colormod.handler.ItemHandler;
    
    import cpw.mods.fml.common.eventhandler.SubscribeEvent;
    import cpw.mods.fml.common.gameevent.TickEvent.Phase;
    import cpw.mods.fml.common.gameevent.TickEvent.PlayerTickEvent;
    import net.minecraft.entity.player.EntityPlayer;
    import net.minecraft.item.ItemStack;
    import net.minecraft.world.World;
    
    public class ArtifactEvent {
    
    public World world;
    
    @SubscribeEvent
    public void onTickPlayerEvent(PlayerTickEvent event){
    
    	if(!world.isRemote){
    		if(event.phase == Phase.START){
    			EntityPlayer player = (EntityPlayer) event.player;
    			if(player.inventory.hasItem(ItemHandler.crypticArtifact)){
    				player.capabilities.allowFlying = true;
    			}else{
    				if(event.phase == Phase.END){
    					if(player.capabilities.isFlying == true){
    						player.capabilities.isFlying = player.capabilities.isCreativeMode ? true : false;
    						player.capabilities.allowFlying = player.capabilities.isCreativeMode ? true : false;
    					}
    				}
    			}
    		}
    	}
    }
    }

  15. So I could be doing something obviously wrong? But the cryptic artifact isn't allowing flight when in the inventory.

     

    package com.mjj.colormod.event;
    
    import com.mjj.colormod.handler.ItemHandler;
    
    import cpw.mods.fml.common.eventhandler.SubscribeEvent;
    import cpw.mods.fml.common.gameevent.TickEvent.PlayerTickEvent;
    import net.minecraft.entity.player.EntityPlayer;
    import net.minecraft.item.ItemStack;
    import net.minecraftforge.event.entity.living.LivingEvent.LivingUpdateEvent;
    
    public class ArtifactEvent {
    
    @SubscribeEvent
    public void onTickPlayerEvent(PlayerTickEvent event){
    
    	if(event.player instanceof EntityPlayer){
    		EntityPlayer player = (EntityPlayer) event.player;
    		if(player.inventory.hasItem(ItemHandler.crypticArtifact)){
    			player.capabilities.allowFlying = true;
    		}else{
    			if(player.capabilities.isFlying == true){
    				player.capabilities.isFlying = player.capabilities.isCreativeMode ? true : false;
    				player.capabilities.allowFlying = player.capabilities.isCreativeMode ? true : false;
    			}
    		}
    	}
    }
    }
    

  16. Ok but I want to iterate through the players inventory because if your holding this item, you wont be able to build and do stuff like that while flying. Also why is it bad to iterate through it. With I'm assuming the use of a for loop?

  17. Thanks for the reply. I went ahead and just used a LivingUpdateEvent instead. I was not sure If I was able to have the event be inside my item class, so I just made it separately. I made it so the player can only fly if the item is held, although I still want it to be if its in the inventory, which I'm not sure how to do. I know you can get the inventory of the player and even the container, but I'm not sure how I would use that in order check all the slots and return my item. Also not sure if I messed up on breaking other mods  :-\. Hope not!

     

    Class (for reference):

    package com.mjj.colormod.event;
    
    import com.mjj.colormod.handler.ItemHandler;
    
    import cpw.mods.fml.common.eventhandler.SubscribeEvent;
    import net.minecraft.entity.player.EntityPlayer;
    import net.minecraft.item.ItemStack;
    import net.minecraftforge.event.entity.living.LivingEvent.LivingUpdateEvent;
    
    public class ArtifactEvent {
    
    @SubscribeEvent
    public void onLivingUpdateEvent(LivingUpdateEvent event){
    
    	if(event.entity instanceof EntityPlayer){
    		EntityPlayer player = (EntityPlayer) event.entity;
    		ItemStack heldItem = player.getHeldItem();
    		if(heldItem != null && heldItem.getItem() == ItemHandler.crypticArtifact){
    			player.capabilities.allowFlying = true;
    		}else{
    			if(player.capabilities.isFlying == true){
    				player.capabilities.isFlying = player.capabilities.isCreativeMode ? true : false;
    				player.capabilities.allowFlying = player.capabilities.isCreativeMode ? true : false;
    			}
    		}
    	}
    }
    }
    

  18. How would you check for an item if in the inventory would allow the player to fly. I'm assuming you would do this through the Item class. I tried using the onUpdate as it calls a tick every time the item is in your inventory. Though it doesn't have a Player Entity parameter to allow flying.

     

    Any idea's?

     

    Thanks.

  19. I want to be able and have a tool when on right click places a torch using the normal torch mechanics. Getting the torch to face the right faces is very hard for me to understand. I may be over thinking this but I'm not sure. I used this simple method and return statement that will place a torch but the mechanics are messed up.

     

    Here's what I tried:

    public boolean onItemUse(ItemStack par1ItemStack, EntityPlayer par2EntityPlayer, World par3World, int par4, int par5, int par6, int par7, float par8, float par9, float par10){
    
    	return par3World.setBlock(par4, par5, par6, Blocks.torch);
    }

     

    I'm not sure If I'm being really dumb and not thinking right but I think this would be the way to do it but I need to incorporate the par4, par5, par6 (x, y, z) and with the world and entityplayer to do the torch mechanics. If anyone knows how to do this help would be much appreciated.

     

    Thanks

    ~vandy22

×
×
  • Create New...

Important Information

By using this site, you agree to our Terms of Use.