I'm having problem with my TileEntity. When the progress > power_needed it is supposed to remove one item from each input slot and put items in output, also incrementing essence_stored and setting its type. It works fine, but when i update one of the item slots, it resets and if i reload the world, the progress, essence, and everything else also resets.
What am i supposed to do to fix this?
Please help, i'm trying to fix this 5 days and still no idea how to do this.
Tile Entity code:
package com.villfuk02.essence.tileentities;
import org.xml.sax.InputSource;
import com.villfuk02.essence.Essence;
import com.villfuk02.essence.gui.ContainerManualMill;
import com.villfuk02.essence.init.ModItems;
import jline.internal.Log;
import net.minecraft.entity.player.EntityPlayer;
import net.minecraft.init.Blocks;
import net.minecraft.init.Items;
import net.minecraft.inventory.IInventory;
import net.minecraft.item.Item;
import net.minecraft.item.ItemStack;
import net.minecraft.nbt.NBTTagCompound;
import net.minecraft.nbt.NBTTagList;
import net.minecraft.network.Packet;
import net.minecraft.tileentity.TileEntity;
import net.minecraft.util.ITickable;
import net.minecraft.util.math.MathHelper;
import net.minecraft.world.World;
import net.minecraftforge.fml.relauncher.Side;
import net.minecraftforge.fml.relauncher.SideOnly;
public class TileEntityManualMill extends TileEntity implements IInventory, ITickable {
public static final int fuel_slots = 0;
public static final int input_slots = 4;
public static final int output_slots = 1;
public static final int total_slots = input_slots + output_slots + fuel_slots;
public static final int first_fuel_slot = 0;
public static final int first_input_slot = first_fuel_slot + fuel_slots;
public static final int first_output_slot = first_input_slot + input_slots;
private static int recipe_count = 3;
public boolean powered = false;
private ItemStack[] itemStacks = new ItemStack[total_slots];
private String customName;
private static ItemStack[] inputs = {new ItemStack(Items.FEATHER),new ItemStack(Items.STRING),new ItemStack(Items.GLOWSTONE_DUST),new ItemStack(Items.PAPER),new ItemStack(Blocks.LEAVES),new ItemStack(Blocks.TALLGRASS),new ItemStack(Items.WHEAT),new ItemStack(Items.MELON),new ItemStack(Blocks.LEAVES2),new ItemStack(Blocks.TALLGRASS),new ItemStack(Items.WHEAT),new ItemStack(Items.MELON)};
private static ItemStack[] outputs = {new ItemStack(ModItems.essence_dust, 1, 0),new ItemStack(ModItems.essence_dust, 1, 1),new ItemStack(ModItems.essence_dust, 1, 1)};
private static Essence[] essence_outputs ={new Essence(40, 0),new Essence(40, 1),new Essence(40, 1)};
private int speed;
private int average_speed = 0;
private int cache_speed = -1;
private int speed_decrement = 3;
private int power_needed = 8000;
private int progress;
private int rotation;
private int rotation_stage;
private int max_essence = 1000;
private int essence_stored = 0;
private int essence_type = -1;
public int getAvgSpeed(){
return average_speed;
}
public int getSpeed(){
return speed;
}
public boolean getPowered(){
return powered;
}
public int getEssence(){
return essence_stored;
}
public int getEssenceType(){
return essence_type;
}
public double fractionEssence(){
double fraction = 39.0 *((double)essence_stored / (double)max_essence);
if (fraction > 0.0)
fraction++;
return MathHelper.clamp_double(fraction, 0.0, 40.0);
}
public double fractionProgress(){
double fraction = ((double)progress / (double)power_needed);
return MathHelper.clamp_double(fraction, 0.0, 1.0);
}
public double fractionSpeed(){
double fraction = ((double)average_speed / (double)(30 * speed_decrement));
return MathHelper.clamp_double(fraction, 0.0, 1.0);
}
public int getRotationStage() {
return rotation_stage;
}
@Override
public void update(){
if (essence_stored == 0){
essence_type = -1;
}
if(powered){
speed += 80;
}else if(speed > 0){
speed -= 1 + (int)((double)speed / (double)speed_decrement);
}
if (speed < 0)
speed = 0;
if (progress >= power_needed){
finishRecipe();
progress = 0;
}
average_speed = (average_speed * 39 + speed) / 40;
if(validRecipe()){
if(average_speed > 0){
rotation += average_speed;
progress += average_speed;
}
if (progress <0)
progress = 0;
rotation_stage = ((int)((double)rotation / 37.5)) % 4;
if (rotation > 149)
rotation -= 150;
}else {
progress = 0;
}
if (essence_stored == 0){
essence_type = -1;
}
powered = false;
this.markDirty();
}
private boolean validRecipe(){
ItemStack result = null;
boolean validi = false;
boolean valide = false;
result = getOutput(this.itemStacks[0],this.itemStacks[1],this.itemStacks[2],this.itemStacks[3]);
if (result != null) {
ItemStack outputStack = this.itemStacks[4];
if (outputStack == null){
validi = true;
}else if (outputStack.getItem() == result.getItem() && outputStack.getMetadata() == result.getMetadata() && ItemStack.areItemStackTagsEqual(outputStack, result)){
int combinedSize = outputStack.stackSize + result.stackSize;
if (combinedSize <= 64 && combinedSize <= outputStack.getMaxStackSize()){
validi = true;
}
}
}
if (validi){
Essence essence = getEssenceOutput(this.itemStacks[0],this.itemStacks[1],this.itemStacks[2],this.itemStacks[3]);
if (essence != null){
if(essence_type == -1){
valide = true;
}else if(essence.getType() == essence_type){
int combined_amount = essence.getAmount() + essence_stored;
if (combined_amount <= max_essence){
valide = true;
}
}
}
}
if (!valide){
validi = false;
}
this.markDirty();
return validi;
}
public void finishRecipe(){
ItemStack out = getOutput(this.itemStacks[0],this.itemStacks[1],this.itemStacks[2],this.itemStacks[3]);
if (this.getStackInSlot(4) == null){
this.setInventorySlotContents(4, out);
}else{
this.setInventorySlotContents(4, new ItemStack(this.itemStacks[4].getItem(), this.itemStacks[4].stackSize + out.stackSize, this.itemStacks[4].getMetadata()));
}
for(int i = 0; i < 4; i++){
ItemStack stack = this.itemStacks[i];
stack.stackSize--;
if (stack.stackSize <= 0){
stack = null;
}
this.setInventorySlotContents(i, stack);
}
essence_stored += getEssenceOutput(this.itemStacks[0],this.itemStacks[1],this.itemStacks[2],this.itemStacks[3]).getAmount();
essence_type = getEssenceOutput(this.itemStacks[0],this.itemStacks[1],this.itemStacks[2],this.itemStacks[3]).getType();
this.markDirty();
}
public static ItemStack getOutput(ItemStack in1, ItemStack in2, ItemStack in3, ItemStack in4){
ItemStack result = null;
ItemStack[] in = {in1, in2, in3, in4};
if (in1 == null || in2 == null || in3 == null || in4 == null){
return null;
}else{
for(int x = 0; x < recipe_count; x++){
for (int a = 0; a < 4; a++){
if (in[a].getItem() == inputs[4*x].getItem()){
for (int b = 0; b < 4; b++){
if (in[b].getItem() == inputs[4*x + 1].getItem()){
for (int c = 0; c < 4; c++){
if (in[c].getItem() == inputs[4*x + 2].getItem()){
for (int d = 0; d < 4; d++){
if (in[d].getItem() == inputs[4*x + 3].getItem()){
result = outputs[x];
}
}
}
}
}
}
}
}
}
if (in1.getItem() == ModItems.essence_dust && in2.getItem() == ModItems.essence_dust && in3.getItem() == ModItems.essence_dust && in4.getItem() == ModItems.essence_dust){
int data = in1.getMetadata();
if (in2.getMetadata() == data && in3.getMetadata() == data && in4.getMetadata() == data)
result = new ItemStack(ModItems.essence_dust, 3, data);
}
}
return result;
}
public static Essence getEssenceOutput(ItemStack in1, ItemStack in2, ItemStack in3, ItemStack in4){
Essence result = null;
ItemStack[] in = {in1, in2, in3, in4};
if (in1 == null || in2 == null || in3 == null || in4 == null){
return null;
}else{
for(int x = 0; x < recipe_count; x++){
for (int a = 0; a < 4; a++){
if (in[a].getItem() == inputs[4*x].getItem()){
for (int b = 0; b < 4; b++){
if (in[b].getItem() == inputs[4*x + 1].getItem()){
for (int c = 0; c < 4; c++){
if (in[c].getItem() == inputs[4*x + 2].getItem()){
for (int d = 0; d < 4; d++){
if (in[d].getItem() == inputs[4*x + 3].getItem()){
result = essence_outputs[x];
}
}
}
}
}
}
}
}
}
if (in1.getItem() == ModItems.essence_dust && in2.getItem() == ModItems.essence_dust && in3.getItem() == ModItems.essence_dust && in4.getItem() == ModItems.essence_dust){
int data = in1.getMetadata();
if (in2.getMetadata() == data && in3.getMetadata() == data && in4.getMetadata() == data)
result = new Essence(20, data);
}
}
return result;
}
public String getCustomName(){
return this.customName;
}
public void setCustomName(String customName){
this.customName = customName;
}
public ItemStack[] getStacks(){
return this.itemStacks;
}
@Override
public String getName() {
return this.hasCustomName() ? this.customName : "Manual Essence Mill";
}
@Override
public boolean hasCustomName() {
return this.customName != null && !this.customName.equals("");
}
@Override
public int getSizeInventory() {
return 5;
}
@Override
public ItemStack getStackInSlot(int index) {
if(index < 0 || index >= this.getSizeInventory()){
return null;
}
return this.itemStacks[index];
}
@Override
public ItemStack decrStackSize(int index, int count) {
if(this.getStackInSlot(index)!= null){
ItemStack itemStack;
if (this.getStackInSlot(index).stackSize <= count) {
itemStack = this.getStackInSlot(index);
this.setInventorySlotContents(index, null);
this.markDirty();
return itemStack;
}else{
itemStack = this.getStackInSlot(index).splitStack(count);
if(this.getStackInSlot(index).stackSize <= 0){
this.setInventorySlotContents(index, null);
}else{
this.setInventorySlotContents(index, this.getStackInSlot(index));
}
this.markDirty();
return itemStack;
}
} else {
return null;
}
}
@Override
public ItemStack removeStackFromSlot(int index) {
ItemStack stack = this.getStackInSlot(index);
this.setInventorySlotContents(index, null);
return stack;
}
@Override
public void setInventorySlotContents(int index, ItemStack stack) {
if (index < 0 || index >= this.getSizeInventory())
return;
if (stack != null && stack.stackSize > this.getInventoryStackLimit())
stack.stackSize = this.getInventoryStackLimit();
if (stack != null && stack.stackSize == 0)
stack = null;
this.itemStacks[index] = stack;
this.markDirty();
}
@Override
public int getInventoryStackLimit() {
return 64;
}
@Override
public boolean isUseableByPlayer(EntityPlayer player) {
return this.worldObj.getTileEntity(this.getPos()) == this && player.getDistanceSq(this.pos.add(0.5, 0.5, 0.5)) <= 64;
}
@Override
public void openInventory(EntityPlayer player) {
}
@Override
public void closeInventory(EntityPlayer player) {
}
@Override
public boolean isItemValidForSlot(int index, ItemStack stack) {
return true;
}
@Override
public int getField(int id) {
int value = 0;
if (id == 0)
value = progress;
if (id == 1)
value = speed;
if (id == 2)
value = rotation;
if (id == 3)
value = essence_stored;
if (id == 4)
value = essence_type;
return value;
}
@Override
public void setField(int id, int value) {
if (id == 0)
progress = value;
if (id == 1)
speed = value;
if (id == 2)
rotation = value;
if (id == 3)
essence_stored = value;
if (id == 4)
essence_type = value;
}
@Override
public int getFieldCount() {
return 5;
}
@Override
public void clear() {
for(int i = 0; i < this.getSizeInventory(); i++){
this.setInventorySlotContents(i, null);
}
}
@Override
public NBTTagCompound writeToNBT(NBTTagCompound nbt){
super.writeToNBT(nbt);
NBTTagList list = new NBTTagList();
for (int i = 0; i < this.getSizeInventory(); i++){
if (this.itemStacks[i] != null){
NBTTagCompound stackTag = new NBTTagCompound();
stackTag.setByte("Slot", ((byte)i));
this.itemStacks[i].writeToNBT(stackTag);
list.appendTag(stackTag);
}
}
nbt.setTag("Items", list);
nbt.setInteger("progress", progress);
nbt.setInteger("speed", speed);
nbt.setInteger("rotation", rotation);
nbt.setInteger("essence_stored", essence_stored);
nbt.setInteger("essence_type", essence_type);
if (this.hasCustomName()){
nbt.setString("CustomName",this.getCustomName());
}
return nbt;
}
@Override
public void readFromNBT(NBTTagCompound nbt){
super.readFromNBT(nbt);
NBTTagList list = nbt.getTagList("Items", 10);
for(int i = 0; i < list.tagCount(); ++i){
NBTTagCompound stackTag = list.getCompoundTagAt(i);
int slot = stackTag.getByte("Slot") & 255;
this.setInventorySlotContents(slot, ItemStack.loadItemStackFromNBT(stackTag));
}
progress = nbt.getInteger("progress");
speed = nbt.getInteger("speed");
rotation = nbt.getInteger("rotation");
essence_stored = nbt.getInteger("essence_stored");
essence_type = nbt.getInteger("essence_type");
if(nbt.hasKey(customName, ){
this.setCustomName(nbt.getString("CustomName"));
}
}
}
HELP
Thanks for any response