package net.tropicraft.entity.ai.jobs;
import java.util.ArrayList;
import java.util.List;
import java.util.Random;
import net.minecraft.block.Block;
import net.minecraft.entity.Entity;
import net.minecraft.entity.player.EntityPlayer;
import net.minecraft.item.ItemStack;
import net.minecraft.server.MinecraftServer;
import net.minecraft.tileentity.TileEntity;
import net.minecraft.util.AxisAlignedBB;
import net.minecraft.util.ChunkCoordinates;
import net.minecraft.util.MathHelper;
import net.tropicraft.Tropicraft;
import net.tropicraft.block.tileentity.TileEntityPurchasePlate;
import net.tropicraft.economy.ItemEntry;
import net.tropicraft.economy.ItemValues;
import net.tropicraft.registry.TCBlockRegistry;
import net.tropicraft.registry.TCKoaCurrencyRegistry;
import CoroUtil.componentAI.jobSystem.JobBase;
import CoroUtil.componentAI.jobSystem.JobManager;
import CoroUtil.util.CoroUtilBlock;
public class JobTrade extends JobBase {
public float tradeDistTrigger;
public int tradeLastItemOffer;
public ChunkCoordinates tradeBlockPos;
//public ChunkCoordinates frameBlockPos;
public TileEntityPurchasePlate tradePlate;
public EntityPlayer activeTrader;
public ArrayList<ItemStack> offeredItems = new ArrayList();
public Block idTradeBlock;
public JobTrade(JobManager jm) {
super(jm);
}
public void convertOfferingsToCurrency(int newCredit) {
offeredItems.clear();
int leftToConvert = newCredit;
while (leftToConvert > TCKoaCurrencyRegistry.currency.getMaxStackSize()) {
offeredItems.add(new ItemStack(TCKoaCurrencyRegistry.currency.getItem(), TCKoaCurrencyRegistry.currency.getMaxStackSize()));
//activeTrader.inventory.addItemStackToInventory();
leftToConvert -= TCKoaCurrencyRegistry.currency.getMaxStackSize();
}
if (leftToConvert > 0) {
offeredItems.add(new ItemStack(TCKoaCurrencyRegistry.currency.getItem(), leftToConvert));
}
}
public int getOfferedItemsValue() {
int value = 0;
try {
for (int i = 0; i < offeredItems.size(); i++) {
//value += (float)ValuedItems.getItemCost(offeredItems.get(i).getItem()) / (float)ValuedItems.getBuyItemCount(offeredItems.get(i).getItem()) * offeredItems.get(i).stackSize;
value += ItemValues.getItemEntry(offeredItems.get(i)).getTotalValue(offeredItems.get(i));//(float)ValuedItems.getItemCost(offeredItems.get(i).getItem()) / (float)ValuedItems.getBuyItemCount(offeredItems.get(i).getItem()) * offeredItems.get(i).stackSize;
}
} catch (Exception ex) {
ex.printStackTrace();
}
return value;
}
public int returnCredit() {
int value = 0;
try {
for (int i = 0; i < offeredItems.size(); i++) {
activeTrader.inventory.addItemStackToInventory(offeredItems.get(i));
}
offeredItems.clear();
} catch (Exception ex) {
ex.printStackTrace();
}
return value;
}
@Override
public void tick() {
//something is making trader wander off way too far, fuck whatever that code is, eat this bandaid
if (tradeBlockPos != null && (ai.targX != tradeBlockPos.posX || ai.targY != tradeBlockPos.posY+1 || ai.targZ != tradeBlockPos.posZ) && ent.getDistance(tradeBlockPos.posX, tradeBlockPos.posY, tradeBlockPos.posZ) > 15) {
//System.out.println("shitty fix go!");
ent.getNavigator().clearPathEntity();
ai.walkTo(ent, tradeBlockPos.posX, tradeBlockPos.posY+1, tradeBlockPos.posZ, ai.maxPFRange, 600);
}
//setJobState(EnumJobState.IDLE);
//TEMP!!!!!!!!
idTradeBlock = TCBlockRegistry.purchasePlate;
ai.maxDistanceFromHome = 0.5F;
tradeDistTrigger = 4F;
if (tradeBlockPos == null) {
/*if (ent.worldObj.getWorldTime() % 10 == 0) */tradeBlockPos = tickFind(idTradeBlock, 25);
if (tradeBlockPos != null) {
TileEntity tile = ent.worldObj.getTileEntity(tradeBlockPos.posX, tradeBlockPos.posY, tradeBlockPos.posZ);
if (tile != null) {
((TileEntityPurchasePlate)tile).tradeKoa = entInt;
tradePlate = (TileEntityPurchasePlate)tile;
}
//set home as tradeplate now
ai.homeX = tradeBlockPos.posX;
ai.homeY = tradeBlockPos.posY;
ai.homeZ = tradeBlockPos.posZ;
}
}/* else if (frameBlockPos == null) {
}*/
//TODO: koa item frame usage
/*if (ent.worldObj.getTotalWorldTime() % 100 == 0) {
List list = ent.worldObj.getEntitiesWithinAABBExcludingEntity(ent, ent.boundingBox.expand(6, 3, 6));
for(int j = 0; j < list.size(); j++)
{
Entity entity1 = (Entity)list.get(j);
if(entity1 instanceof EntityTCItemFrame && !((EntityTCItemFrame)entity1).getShouldDropContents()) {
if (((EntityTCItemFrame)entity1).getDisplayedItem() == null) {
((EntityTCItemFrame)entity1).setDisplayedItem(ItemValues.itemsBuyable.get(ent.worldObj.rand.nextInt(ItemValues.itemsBuyable.size())).item);//new ItemStack(ValuedItems.getItemBuyable(ent.worldObj.rand.nextInt(ValuedItems.buyables.size()))));
}
}
}
}*/
if (activeTrader == null) {
activeTrader = ent.worldObj.getClosestPlayerToEntity(ent, tradeDistTrigger);
if (activeTrader != null) {
tradeStart();
}
} else {
if (ent.getDistanceToEntity(activeTrader) > tradeDistTrigger * 1.5) {
//walked away, reset trade (give back anything?)
tradeReset();
} else {
tradeTick();
}
}
}
public void tradeStart() {
//System.out.println("trade start");
if (tradePlate != null) {
tradePlate.tradeState = 1;
tradePlate.credit = getOfferedItemsValue();
}
}
public void tradeConfirmCallback() {
int credit = getOfferedItemsValue();
ItemEntry ie = ItemValues.itemsBuyable.get(tradePlate.itemIndex);
int cost = ie.value;
if (credit >= cost) {
credit -= cost;
convertOfferingsToCurrency(credit);
ItemStack is = ie.item.copy();
activeTrader.inventory.addItemStackToInventory(is);
} else {
//not enough credit!
}
tradeSuccess();
}
public void tradeSuccess() {
//dont use reset here, reset is for when player leaves
//System.out.println("trade success");
if (tradePlate != null) {
tradePlate.tradeState = 1;
tradePlate.credit = getOfferedItemsValue();
}
}
public void tradeReset() {
if (offeredItems != null) returnCredit();
activeTrader = null;
if (tradePlate != null) {
tradePlate.tradeState = 0;
tradePlate.credit = 0;
tradePlate.activeTrader = null;
}
Tropicraft.dbg("trade reset");
}
public void tradeTick() {
TileEntity tEnt = null;//
if (tradeBlockPos != null) tEnt = ent.worldObj.getTileEntity(tradeBlockPos.posX, tradeBlockPos.posY, tradeBlockPos.posZ);
if (tradeBlockPos != null && tEnt == null) {
tradeBlockPos = null;
} else {
if (tEnt instanceof TileEntityPurchasePlate) {
((TileEntityPurchasePlate) tEnt).activeTrader = this.activeTrader;
}
}
}
public ChunkCoordinates tickFind(Block id, int range) {
for (int i = 0; i < 30; i++) {
int randX = (int) ent.posX+ent.worldObj.rand.nextInt(range) - (range/2);
int randY = (int) ent.posY+ent.worldObj.rand.nextInt(range) - (range/2);
int randZ = (int) ent.posZ+ent.worldObj.rand.nextInt(range) - (range/2);
Block foundID = ent.worldObj.getBlock(randX, randY, randZ);
if (foundID == id) {
Tropicraft.dbg("found trade block");
return new ChunkCoordinates(randX, randY, randZ);
} else {
//System.out.println("fail");
}
}
return null;
}
@Override
public boolean shouldExecute() {
//execute if no threat
return isAreaSecure();
}
@Override
public boolean shouldContinue() {
//continue if there is a threat
return !isAreaSecure();
}
public boolean isAreaSecure() {
if (tradeBlockPos != null) {
List list = ent.worldObj.getEntitiesWithinAABBExcludingEntity(ent, AxisAlignedBB.getBoundingBox(tradeBlockPos.posX, tradeBlockPos.posY, tradeBlockPos.posZ, tradeBlockPos.posX, tradeBlockPos.posY, tradeBlockPos.posZ).expand(6, 3, 6));
for(int j = 0; j < list.size(); j++)
{
Entity entity1 = (Entity)list.get(j);
if(entInt.isEnemy(entity1)) {
return false;
}
}
}
return true;
}
@Override
public void onIdleTickAct() {
//ent.setHealth(20);
//System.out.println(ent.currentAction);////getFoodStats().getFoodLevel());
//System.out.println(ent.job.getPrimaryJobClass().state);
//System.out.println(ent.entityId);
if (activeTrader != null) {
ent.faceEntity(activeTrader, 15, 15);
} else if (tradeBlockPos != null) {
//ai.faceCoord(tradeBlockPos.posX, tradeBlockPos.posY, tradeBlockPos.posZ, 15, 15);
}
if (activeTrader == null && ent.getNavigator().noPath()) {
//EntityPlayer clPl = ent.worldObj.getClosestPlayerToEntity(ent, 5F);
Random rand = new Random();
if (tradeBlockPos != null && ent.worldObj.rand.nextInt(100) == 0) {
int tryX = tradeBlockPos.posX;// - 1 + rand.nextInt(2);
int tryZ = tradeBlockPos.posZ;// - 1 + rand.nextInt(2);
if (!CoroUtilBlock.isAir(ent.worldObj.getBlock(tryX, MathHelper.floor_double(ent.posY-1), tryZ))/* && ent.worldObj.getBlockId(tryX, MathHelper.floor_double(ent.posY+1), tryZ) == 0*/) {
ai.walkTo(ent, tradeBlockPos.posX, MathHelper.floor_double(ent.posY), tradeBlockPos.posZ, ai.maxPFRange, 600);
}
}
/*if (tradeBlockPos != null && ent.getDistance(tradeBlockPos.posX, tradeBlockPos.posY, tradeBlockPos.posZ) > 4) {
ai.walkTo(ent, tradeBlockPos.posX - 1 + rand.nextInt(2), tradeBlockPos.posY, tradeBlockPos.posZ - 1 + rand.nextInt(2), ai.maxPFRange, 600);
} else {
if (ent.worldObj.rand.nextInt(100) == 0) {
int randsize = 2;
ai.walkTo(ent, ai.homeX+ent.worldObj.rand.nextInt(randsize) - (randsize/2), ai.homeY+0, ai.homeZ+ent.worldObj.rand.nextInt(randsize) - (randsize/2),ai.maxPFRange, 600);
}
}*/
/*if (ent.getDistance(ai.homeX, ai.homeY, ai.homeZ) > ai.maxDistanceFromHome) {
int randsize = 4;
//ai.walkTo(ent, ai.homeX+ai.rand.nextInt(randsize) - (randsize/2), ai.homeY+0, ai.homeZ+ai.rand.nextInt(randsize) - (randsize/2),ai.maxPFRange, 600);
ai.walkTo(ent, ai.homeX, ai.homeY, ai.homeZ,ai.maxPFRange, 600);
} else {
if (ent.worldObj.rand.nextInt(10) == 0) {
int randsize = 2;
ai.walkTo(ent, ai.homeX+ent.worldObj.rand.nextInt(randsize) - (randsize/2), ai.homeY+0, ai.homeZ+ent.worldObj.rand.nextInt(randsize) - (randsize/2),ai.maxPFRange, 600);
}
}*/
}
}
@Override
public boolean hookInteract(EntityPlayer par1EntityPlayer) {
if (!ent.worldObj.isRemote) {
if (offeredItems == null) offeredItems = new ArrayList();
ItemStack is = par1EntityPlayer.getCurrentEquippedItem();
if (is != null) {
//System.out.println(is);
if (ItemValues.getItemEntry(is) != null) {
par1EntityPlayer.inventory.mainInventory[par1EntityPlayer.inventory.currentItem] = null;
offeredItems.add(is);
if (tradePlate != null) {
tradePlate.credit = getOfferedItemsValue();
System.out.println("VERIFY THIS CODE IN hookInteract()");
MinecraftServer.getServer().getConfigurationManager().sendPacketToAllPlayers(tradePlate.getDescriptionPacket());
}
}
//System.out.println();
}
return true;
}
return super.hookInteract(par1EntityPlayer);
}
}