/* * 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.data.quest.logic; import cpw.mods.fml.common.eventhandler.Event; import matteroverdrive.api.quest.IQuestReward; import matteroverdrive.api.quest.QuestStack; import matteroverdrive.data.quest.QuestItem; import net.minecraft.entity.player.EntityPlayer; import net.minecraft.item.Item; import net.minecraft.item.ItemStack; import net.minecraftforge.event.entity.player.EntityItemPickupEvent; import java.util.List; import java.util.Random; /** * Created by Simeon on 11/25/2015. */ public class QuestLogicCollectItem extends QuestLogicRandomItem { int dimensionID; boolean inSpecificDimension; boolean destroyOnCollect; int xpPerItem; int minItemCount; int maxItemCount; public QuestLogicCollectItem(QuestItem questItem,int minItemCount,int maxItemCount,int xpPerItem) { init(new QuestItem[]{questItem},minItemCount,maxItemCount,xpPerItem); } public QuestLogicCollectItem(ItemStack itemStack,int minItemCount,int maxItemCount,int xpPerItem) { init(new QuestItem[]{QuestItem.fromItemStack(itemStack)},minItemCount,maxItemCount,xpPerItem); } public QuestLogicCollectItem(Item item, int minItemCount, int maxItemCount, int xpPerItem) { init(new QuestItem[]{QuestItem.fromItemStack(new ItemStack(item))},minItemCount,maxItemCount,xpPerItem); } protected void init(QuestItem[] questItems,int minItemCount,int maxItemCount,int xpPerItem) { super.init(questItems); this.minItemCount = minItemCount; this.maxItemCount = maxItemCount; this.xpPerItem = xpPerItem; } public QuestLogicCollectItem(ItemStack[] itemStacks,int minItemCount,int maxItemCount,int xpPerItem) { QuestItem[] questItems = new QuestItem[itemStacks.length]; for (int i = 0;i < itemStacks.length;i++) { questItems[i] = QuestItem.fromItemStack(itemStacks[i]); } init(questItems,minItemCount,maxItemCount,xpPerItem); } public QuestLogicCollectItem(Item[] items,int minItemCount,int maxItemCount,int xpPerItem) { QuestItem[] questItems = new QuestItem[items.length]; for (int i = 0;i < items.length;i++) { questItems[i] = QuestItem.fromItemStack(new ItemStack(items[i])); } init(questItems,minItemCount,maxItemCount,xpPerItem); } public QuestLogicCollectItem(QuestItem[] questItems,int minItemCount,int maxItemCount,int xpPerItem) { init(questItems,minItemCount,maxItemCount,xpPerItem); } @Override public String modifyInfo(QuestStack questStack, String info) { ItemStack itemStack = getItem(questStack); return String.format(info,"",getMaxItemCount(questStack),itemStack != null ? itemStack.getDisplayName() : "Unknown Item"); } @Override public boolean isObjectiveCompleted(QuestStack questStack, EntityPlayer entityPlayer, int objectiveIndex) { return getItemCount(entityPlayer,questStack) >= getMaxItemCount(questStack); } @Override public String modifyObjective(QuestStack questStack, EntityPlayer entityPlayer, String objective, int objectiveIndex) { ItemStack itemStack = getItem(questStack); return String.format(objective,"", getItemCount(entityPlayer,questStack),getMaxItemCount(questStack),itemStack != null ? itemStack.getDisplayName() : "Unknown Item"); } @Override public void initQuestStack(Random random, QuestStack questStack) { initTag(questStack); initItemType(random,questStack); getTag(questStack).setInteger("MaxItemCount",random(random,minItemCount,maxItemCount)); } public int getItemCount(EntityPlayer entityPlayer, QuestStack questStack) { if (destroyOnCollect) { if (hasTag(questStack)) { return getTag(questStack).getInteger("ItemCount"); } return 0; } else { int itemCount = 0; ItemStack itemStack = getItem(questStack); if (itemStack != null) { for (int i = 0; i < entityPlayer.inventory.getSizeInventory(); i++) { ItemStack stackInSlot = entityPlayer.inventory.getStackInSlot(i); if (stackInSlot != null) { if (stackInSlot.isItemEqual(itemStack)) { itemCount += stackInSlot.stackSize; } } } } return itemCount; } } public void setItemCount(QuestStack questStack,int count) { if (destroyOnCollect) { initTag(questStack); getTag(questStack).setInteger("ItemCount",count); } } public int getMaxItemCount(QuestStack questStack) { if (hasTag(questStack)) { ItemStack itemStack = getItem(questStack); return itemStack.stackSize + getTag(questStack).getInteger("MaxItemCount"); } return 0; } @Override public boolean onEvent(QuestStack questStack, Event event, EntityPlayer entityPlayer) { if (destroyOnCollect && event instanceof EntityItemPickupEvent && ((EntityItemPickupEvent) event).item.getEntityItem() != null) { if (inSpecificDimension && entityPlayer.worldObj.provider.dimensionId != dimensionID) return false; ItemStack itemStack = ((EntityItemPickupEvent) event).item.getEntityItem(); ItemStack questItem = getItem(questStack); if (itemStack != null && questItem != null && ItemStack.areItemStacksEqual(itemStack,questItem)) { initTag(questStack); int currentItemCount = getItemCount(entityPlayer,questStack); if (currentItemCount < getMaxItemCount(questStack)) { setItemCount(questStack,++currentItemCount); if (isObjectiveCompleted(questStack,entityPlayer,0) && autoComplete) { questStack.markComplited(entityPlayer,false); } return true; } } } return false; } @Override public void onTaken(QuestStack questStack, EntityPlayer entityPlayer) { } @Override public void onCompleted(QuestStack questStack, EntityPlayer entityPlayer) { if (!destroyOnCollect) { int itemCount = getMaxItemCount(questStack); ItemStack itemStack = getItem(questStack); if (itemStack != null) { for (int i = 0; i < entityPlayer.inventory.getSizeInventory(); i++) { ItemStack stackInSlot = entityPlayer.inventory.getStackInSlot(i); if (stackInSlot != null) { if (stackInSlot.isItemEqual(itemStack) && itemCount > 0) { int newItemCount = Math.max(0, itemCount - stackInSlot.stackSize); int takenFromStack = itemCount - newItemCount; entityPlayer.inventory.decrStackSize(i, takenFromStack); itemCount = newItemCount; } } } } } } @Override public void modifyRewards(QuestStack questStack, EntityPlayer entityPlayer, List<IQuestReward> rewards) { } @Override public int modifyXP(QuestStack questStack, EntityPlayer entityPlayer, int originalXp) { return originalXp + getMaxItemCount(questStack) * xpPerItem; } public QuestLogicCollectItem setDestroyOnCollect(boolean destroyOnCollect) { this.destroyOnCollect = destroyOnCollect; return this; } public QuestLogicCollectItem setDimensionID(int dimensionID) { this.inSpecificDimension = true; this.dimensionID = dimensionID; return this; } }