package matteroverdrive.data.quest.logic;
import cpw.mods.fml.common.eventhandler.Event;
import matteroverdrive.api.events.MOEventScan;
import matteroverdrive.api.inventory.IBlockScanner;
import matteroverdrive.api.quest.IQuestReward;
import matteroverdrive.api.quest.QuestStack;
import net.minecraft.block.Block;
import net.minecraft.entity.player.EntityPlayer;
import net.minecraft.util.MovingObjectPosition;
import java.util.List;
import java.util.Random;
/**
* Created by Simeon on 1/5/2016.
*/
public class QuestLogicScanBlock extends QuestLogicBlock
{
private int minBlockScan;
private int maxBlockScan;
private int xpPerBlock;
private boolean onlyDestoryable;
public QuestLogicScanBlock(Block block, int blockMetadata,int minBlockScan,int maxBlockScan,int xpPerBlock)
{
super(block, blockMetadata);
this.minBlockScan = minBlockScan;
this.maxBlockScan = maxBlockScan;
this.xpPerBlock = xpPerBlock;
}
@Override
public String modifyInfo(QuestStack questStack, String info)
{
return replaceBlockNameInText(info);
}
@Override
public boolean isObjectiveCompleted(QuestStack questStack, EntityPlayer entityPlayer, int objectiveIndex)
{
return getBlockScan(questStack) >= getMaxBlockScan(questStack);
}
@Override
public String modifyObjective(QuestStack questStack, EntityPlayer entityPlayer, String objective, int objectiveIndex)
{
objective = replaceBlockNameInText(objective);
objective = objective.replace("$scanAmount",Integer.toString(getBlockScan(questStack)));
objective = objective.replace("$maxScanAmount",Integer.toString(getMaxBlockScan(questStack)));
return objective;
}
@Override
public void initQuestStack(Random random, QuestStack questStack)
{
setMaxBlockScan(questStack,random(random,minBlockScan,maxBlockScan));
}
@Override
public boolean onEvent(QuestStack questStack, Event event, EntityPlayer entityPlayer)
{
if (event instanceof MOEventScan)
{
MOEventScan eventScan = (MOEventScan)event;
if (eventScan.position.typeOfHit == MovingObjectPosition.MovingObjectType.BLOCK)
{
if (onlyDestoryable)
{
if (eventScan.scannerStack.getItem() instanceof IBlockScanner && !((IBlockScanner) eventScan.scannerStack.getItem()).destroysBlocks(eventScan.scannerStack))
{
return false;
}
}
Block block = entityPlayer.worldObj.getBlock(eventScan.position.blockX,eventScan.position.blockY,eventScan.position.blockZ);
int meta = entityPlayer.worldObj.getBlockMetadata(eventScan.position.blockX,eventScan.position.blockY,eventScan.position.blockZ);
if (block != null && areBlocksTheSame(block,meta))
{
if (getBlockScan(questStack) < getMaxBlockScan(questStack))
{
setBlocScan(questStack,getBlockScan(questStack)+1);
if (getBlockScan(questStack) >= getMaxBlockScan(questStack))
{
if (autoComplete)
{
questStack.markComplited(entityPlayer,false);
}
}
return true;
}
}
}
}
return false;
}
@Override
public int modifyXP(QuestStack questStack, EntityPlayer entityPlayer, int originalXp)
{
return originalXp + getMaxBlockScan(questStack) * xpPerBlock;
}
@Override
public void onTaken(QuestStack questStack, EntityPlayer entityPlayer)
{
}
@Override
public void onCompleted(QuestStack questStack, EntityPlayer entityPlayer)
{
}
@Override
public void modifyRewards(QuestStack questStack, EntityPlayer entityPlayer, List<IQuestReward> rewards)
{
}
protected void setMaxBlockScan(QuestStack questStack,int maxBlockScan)
{
initTag(questStack);
getTag(questStack).setShort("MaxBlockScan",(short) maxBlockScan);
}
protected int getMaxBlockScan(QuestStack questStack)
{
if (hasTag(questStack))
{
return getTag(questStack).getShort("MaxBlockScan");
}
return 0;
}
protected int getBlockScan(QuestStack questStack)
{
if (hasTag(questStack))
{
return getTag(questStack).getShort("BlockScan");
}
return 0;
}
protected void setBlocScan(QuestStack questStack,int blockScan)
{
initTag(questStack);
getTag(questStack).setShort("BlockScan",(short) blockScan);
}
public QuestLogicScanBlock setOnlyDestoryable(boolean onlyDestoryable)
{
this.onlyDestoryable = true;
return this;
}
}