/* * This file is part of Matter Overdrive * Copyright (c) 2015., Simeon Radivoev, All rights reserved. * * Matter Overdrive is free software: you can redistribute it and/or modify * it under the terms of the GNU General Public License as published by * the Free Software Foundation, either version 3 of the License, or * (at your option) any later version. * * Matter Overdrive is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the * GNU General Public License for more details. * * You should have received a copy of the GNU General Public License * along with Matter Overdrive. If not, see <http://www.gnu.org/licenses>. */ package matteroverdrive.tile; import cpw.mods.fml.relauncher.Side; import matteroverdrive.MatterOverdrive; import matteroverdrive.api.inventory.UpgradeTypes; import matteroverdrive.api.quest.Quest; import matteroverdrive.api.quest.QuestStack; import matteroverdrive.data.Inventory; import matteroverdrive.data.inventory.RemoveOnlySlot; import matteroverdrive.data.inventory.SlotContract; import matteroverdrive.data.quest.WeightedRandomQuest; import matteroverdrive.init.MatterOverdriveQuests; import matteroverdrive.machines.MOTileEntityMachine; import matteroverdrive.machines.MachineNBTCategory; import net.minecraft.entity.EntityLivingBase; import net.minecraft.item.ItemStack; import net.minecraft.nbt.NBTTagCompound; import net.minecraft.util.WeightedRandom; import net.minecraft.world.World; import java.util.EnumSet; /** * Created by Simeon on 11/22/2015. */ public class TileEntityMachineContractMarket extends MOTileEntityMachine { public static final int QUEST_GENERATE_DELAY_MIN = 20*60*30; public static final int QUEST_GENERATE_DELAY_PER_SLOT = 20*60*5; public static final int CONTRACT_SLOTS = 18; private long lastGenerationTime; public TileEntityMachineContractMarket() { super(0); playerSlotsMain = true; playerSlotsHotbar = true; } @Override protected void RegisterSlots(Inventory inventory) { super.RegisterSlots(inventory); inventory.AddSlot(new RemoveOnlySlot(true)); for (int i = 0;i < CONTRACT_SLOTS;i++) { inventory.AddSlot(new SlotContract(false)); } } @Override public void updateEntity() { super.updateEntity(); if (!worldObj.isRemote) { manageContractGeneration(); } } protected void manageContractGeneration() { if (getRedstoneActive() && getTimeUntilNextQuest() <= 0) { generateContract(); } } private void generateContract() { Quest quest = ((WeightedRandomQuest)WeightedRandom.getRandomItem(random,MatterOverdriveQuests.contractGeneration)).getQuest(); QuestStack questStack = MatterOverdrive.questFactory.generateQuestStack(random,quest); for (int i = 0;i < inventory.getSizeInventory();i++) { if (inventory.getSlot(i).getItem() != null) { ItemStack itemStack = inventory.getSlot(i).getItem(); if (itemStack.getTagCompound() != null) { QuestStack qs = QuestStack.loadFromNBT(itemStack.getTagCompound()); if (questStack.getQuest().areQuestStacksEqual(questStack,qs)) { return; } } } } inventory.addItem(questStack.getContract()); addGenerationDelay(); forceSync(); } public void addGenerationDelay() { int freeSlots = getFreeSlots(); lastGenerationTime = worldObj.getTotalWorldTime() + QUEST_GENERATE_DELAY_MIN + (inventory.getSizeInventory() - freeSlots) * QUEST_GENERATE_DELAY_PER_SLOT; } @Override public void readCustomNBT(NBTTagCompound nbt, EnumSet<MachineNBTCategory> categories) { super.readCustomNBT(nbt,categories); if (categories.contains(MachineNBTCategory.DATA)) { lastGenerationTime = nbt.getLong("LastGenerationTime"); } } @Override public void writeCustomNBT(NBTTagCompound nbt, EnumSet<MachineNBTCategory> categories, boolean toDisk) { super.writeCustomNBT(nbt,categories, toDisk); if (categories.contains(MachineNBTCategory.DATA)) { nbt.setLong("LastGenerationTime",lastGenerationTime); } } public int getFreeSlots() { int freeSlots = 0; for (int i = 0;i < inventory.getSizeInventory();i++) { if (inventory.getSlot(i).getItem() == null) { freeSlots++; } } return freeSlots; } public int getTimeUntilNextQuest() { return Math.max(0,(int)(lastGenerationTime - worldObj.getTotalWorldTime())); } @Override public String getSound() { return null; } @Override public boolean hasSound() { return false; } @Override public boolean getServerActive() { return false; } @Override public float soundVolume() { return 0; } @Override protected void onActiveChange() { } @Override public boolean isAffectedByUpgrade(UpgradeTypes type) { return false; } @Override protected void onAwake(Side side) { } @Override public void onAdded(World world, int x, int y, int z) { addGenerationDelay(); } @Override public void onPlaced(World world, EntityLivingBase entityLiving) { } @Override public void onDestroyed() { } }