/** * This class was created by <Vazkii>. It's distributed as * part of the Botania Mod. Get the Source Code in github: * https://github.com/Vazkii/Botania * * Botania is Open Source and distributed under the * Botania License: http://botaniamod.net/license.php * * File Created @ [Mar 17, 2015, 6:36:43 PM (GMT)] */ package vazkii.botania.common.entity; import java.awt.Color; import javax.annotation.Nonnull; import net.minecraft.block.Block; import net.minecraft.block.state.IBlockState; import net.minecraft.entity.item.EntityMinecart; import net.minecraft.inventory.Container; import net.minecraft.item.Item; import net.minecraft.item.ItemStack; import net.minecraft.nbt.NBTTagCompound; import net.minecraft.network.datasync.DataParameter; import net.minecraft.network.datasync.DataSerializers; import net.minecraft.network.datasync.EntityDataManager; import net.minecraft.tileentity.TileEntity; import net.minecraft.util.DamageSource; import net.minecraft.util.EnumFacing; import net.minecraft.util.math.BlockPos; import net.minecraft.util.math.MathHelper; import net.minecraft.util.math.RayTraceResult; import net.minecraft.world.World; import vazkii.botania.api.internal.VanillaPacketDispatcher; import vazkii.botania.api.mana.IManaPool; import vazkii.botania.api.state.BotaniaStateProps; import vazkii.botania.common.Botania; import vazkii.botania.common.block.ModBlocks; import vazkii.botania.common.block.tile.mana.TilePool; import vazkii.botania.common.block.tile.mana.TilePump; import vazkii.botania.common.item.ModItems; public class EntityPoolMinecart extends EntityMinecart { private static final int TRANSFER_RATE = 10000; private static final String TAG_MANA = "mana"; private static final DataParameter<Integer> MANA = EntityDataManager.createKey(EntityPoolMinecart.class, DataSerializers.VARINT); public EntityPoolMinecart(World world) { super(world); } public EntityPoolMinecart(World world, double x, double y, double z) { super(world, x, y, z); } @Override protected void entityInit() { super.entityInit(); dataManager.register(MANA, 0); } @Nonnull @Override public IBlockState getDisplayTile() { return ModBlocks.pool.getDefaultState(); } @Nonnull @Override public ItemStack getCartItem() { return new ItemStack(ModItems.poolMinecart); } @Nonnull @Override public EntityMinecart.Type getType() { return Type.RIDEABLE; } @Override public boolean canBeRidden() { return false; } @Override protected void applyDrag() { float f = 0.98F; this.motionX *= (double)f; this.motionY *= 0.0D; this.motionZ *= (double)f; } @Nonnull @Override public ItemStack getPickedResult(RayTraceResult target) { return new ItemStack(ModItems.poolMinecart); } @Override public void killMinecart(DamageSource source) { super.killMinecart(source); dropItemWithOffset(Item.getItemFromBlock(ModBlocks.pool), 1, 0.0F); } @Override public int getDefaultDisplayTileOffset() { return 8; } @Override public void onUpdate() { super.onUpdate(); if(world.isRemote) { double particleChance = 1F - (double) getMana() / (double) TilePool.MAX_MANA * 0.1; Color color = TilePool.PARTICLE_COLOR; double x = MathHelper.floor(posX); double y = MathHelper.floor(posY); double z = MathHelper.floor(posZ); if(Math.random() > particleChance) Botania.proxy.wispFX(x + 0.3 + Math.random() * 0.5, y + 0.85 + Math.random() * 0.25, z + Math.random(), color.getRed(), color.getGreen() / 255F, color.getBlue() / 255F, (float) Math.random() / 3F, (float) -Math.random() / 25F, 2F); } } @Override public void moveMinecartOnRail(BlockPos pos) { super.moveMinecartOnRail(pos); for(EnumFacing dir : EnumFacing.HORIZONTALS) { BlockPos posP = pos.offset(dir); Block block = world.getBlockState(posP).getBlock(); if(block == ModBlocks.pump) { BlockPos posP_ = posP.offset(dir); TileEntity tile = world.getTileEntity(posP_); TileEntity tile_ = world.getTileEntity(posP); TilePump pump = (TilePump) tile_; if(tile != null && tile instanceof IManaPool) { IManaPool pool = (IManaPool) tile; EnumFacing pumpDir = world.getBlockState(posP).getValue(BotaniaStateProps.CARDINALS); boolean did = false; boolean can = false; if(pumpDir == dir) { // Pool -> Cart can = true; if(!pump.hasRedstone) { int cartMana = getMana(); int poolMana = pool.getCurrentMana(); int transfer = Math.min(TRANSFER_RATE, poolMana); int actualTransfer = Math.min(TilePool.MAX_MANA - cartMana, transfer); if(actualTransfer > 0) { pool.recieveMana(-transfer); setMana(cartMana + actualTransfer); did = true; } } } else if(pumpDir == dir.getOpposite()) { // Cart -> Pool can = true; if(!pump.hasRedstone && !pool.isFull()) { int cartMana = getMana(); int transfer = Math.min(TRANSFER_RATE, cartMana); if(transfer > 0) { pool.recieveMana(transfer); setMana(cartMana - transfer); did = true; } } } if(did) { VanillaPacketDispatcher.dispatchTEToNearbyPlayers(world, posP_); pump.hasCart = true; if(!pump.active) pump.setActive(true); } if(can) { pump.hasCartOnTop = true; pump.comparator = (int) ((double) getMana() / (double) TilePool.MAX_MANA * 15); } } } } } @Override protected void writeEntityToNBT(@Nonnull NBTTagCompound cmp) { super.writeEntityToNBT(cmp); cmp.setInteger(TAG_MANA, getMana()); } @Override protected void readEntityFromNBT(NBTTagCompound cmp) { super.readEntityFromNBT(cmp); setMana(cmp.getInteger(TAG_MANA)); } public int getMana() { return dataManager.get(MANA); } public void setMana(int mana) { dataManager.set(MANA, mana); } }