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.BlockPos; import net.minecraft.block.Block; import net.minecraft.entity.player.EntityPlayer; import net.minecraft.item.ItemStack; import net.minecraft.util.Vec3; import net.minecraftforge.common.util.Constants; import net.minecraftforge.event.world.BlockEvent; import java.util.List; import java.util.Random; /** * Created by Simeon on 1/3/2016. */ public class QuestLogicPlaceBlock extends QuestLogicBlock { private int radius; String namePattern; int minBlockPlace; int maxBlockPlace; public QuestLogicPlaceBlock(int radius,ItemStack blockStack) { this(radius,blockStack,1,1); } public QuestLogicPlaceBlock(int radius,ItemStack blockStack,int minBlockPlace,int maxBlockPlace) { super(blockStack); this.radius = radius; this.minBlockPlace = minBlockPlace; this.maxBlockPlace = maxBlockPlace; } public QuestLogicPlaceBlock(int radius,Block block) { this(radius,block,-1,1,1); } public QuestLogicPlaceBlock(int radius,Block block,int blockMetadata) { this(radius,block,blockMetadata,1,1); } public QuestLogicPlaceBlock(int radius,Block block,int blockMetadata,int minBlockPlace,int maxBlockPlace) { super(block,blockMetadata); this.radius = radius; this.minBlockPlace = minBlockPlace; this.maxBlockPlace = maxBlockPlace; } @Override public String modifyInfo(QuestStack questStack, String info) { return info; } @Override public boolean isObjectiveCompleted(QuestStack questStack, EntityPlayer entityPlayer, int objectiveIndex) { return getBlockPlaced(questStack) >= getMaxBlockPlace(questStack); } @Override public String modifyObjective(QuestStack questStack, EntityPlayer entityPlayer, String objective, int objectiveIndex) { objective = replaceBlockNameInText(objective); BlockPos pos = getPos(questStack); if (pos != null) { double distance = Vec3.createVectorHelper(Math.floor(entityPlayer.posX),Math.floor(entityPlayer.posY),Math.floor(entityPlayer.posZ)).distanceTo(Vec3.createVectorHelper(pos.x,pos.y,pos.z)); objective = objective.replace("$distance",Integer.toString((int)Math.max(distance - radius,0))+" blocks"); }else { objective = objective.replace("$distance","0 blocks"); } return objective; } @Override public void initQuestStack(Random random, QuestStack questStack) { setMaxBlockPlace(questStack,random(random,minBlockPlace,maxBlockPlace)); } @Override public boolean onEvent(QuestStack questStack, Event event, EntityPlayer entityPlayer) { if (event instanceof BlockEvent.PlaceEvent) { BlockEvent.PlaceEvent placeEvent = (BlockEvent.PlaceEvent)event; boolean isTheSameBlockFlag = false; boolean isNearTargetFlag = false; if (blockStack != null && placeEvent.itemInHand != null) { isTheSameBlockFlag = areBlockStackTheSame(placeEvent.itemInHand); } else { if (areBlocksTheSame(placeEvent.block,placeEvent.blockMetadata)) { if (namePattern != null && placeEvent.itemInHand != null) { isTheSameBlockFlag = placeEvent.itemInHand.getDisplayName().matches(namePattern); }else { isTheSameBlockFlag = true; } } } BlockPos pos = getPos(questStack); if (pos != null && isTheSameBlockFlag) { if (!(Vec3.createVectorHelper(placeEvent.x,placeEvent.y,placeEvent.z).distanceTo(Vec3.createVectorHelper(pos.x,pos.y,pos.z)) <= radius)) { return false; } } if (isTheSameBlockFlag) { setBlockPlaced(questStack,getBlockPlaced(questStack)+1); if (autoComplete) questStack.markComplited(entityPlayer,false); } return isTheSameBlockFlag; } return false; } @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 setBlockPlaced(QuestStack questStack,int placed) { initTag(questStack); getTag(questStack).setShort("Placed",(short) placed); } protected int getBlockPlaced(QuestStack questStack) { if (hasTag(questStack)) { return getTag(questStack).getShort("Placed"); } return 0; } protected void setMaxBlockPlace(QuestStack questStack,int maxBlockPlace) { initTag(questStack); getTag(questStack).setShort("MaxPlaced",(short) maxBlockPlace); } protected int getMaxBlockPlace(QuestStack questStack) { if (hasTag(questStack)) { return getTag(questStack).getShort("MaxPlaced"); } return 0; } protected BlockPos getPos(QuestStack questStack) { if (hasTag(questStack) && getTag(questStack).hasKey("Pos", Constants.NBT.TAG_INT_ARRAY)) { int[] pos = getTag(questStack).getIntArray("Pos"); return new BlockPos(pos[0],pos[1],pos[2]); } return null; } public void setNamePattern(String namePattern) { this.namePattern = namePattern; } }