mirror of
https://github.com/HbmMods/Hbm-s-Nuclear-Tech-GIT.git
synced 2026-01-25 10:32:49 +00:00
174 lines
4.9 KiB
Java
174 lines
4.9 KiB
Java
package com.hbm.items.weapon;
|
|
|
|
import java.util.List;
|
|
|
|
import com.hbm.inventory.fluid.FluidType;
|
|
import com.hbm.inventory.fluid.Fluids;
|
|
import com.hbm.items.ISyncButtons;
|
|
import com.hbm.lib.ModDamageSource;
|
|
import com.hbm.packet.AuxParticlePacketNT;
|
|
import com.hbm.packet.PacketDispatcher;
|
|
|
|
import api.hbm.fluid.IFillableItem;
|
|
import net.minecraft.entity.Entity;
|
|
import net.minecraft.entity.EntityLivingBase;
|
|
import net.minecraft.entity.player.EntityPlayer;
|
|
import net.minecraft.entity.player.EntityPlayerMP;
|
|
import net.minecraft.item.Item;
|
|
import net.minecraft.item.ItemStack;
|
|
import net.minecraft.nbt.NBTTagCompound;
|
|
import net.minecraft.util.AxisAlignedBB;
|
|
import net.minecraft.util.EntityDamageSource;
|
|
import net.minecraft.util.MovingObjectPosition;
|
|
import net.minecraft.util.Vec3;
|
|
import net.minecraft.world.World;
|
|
import net.minecraftforge.client.event.MouseEvent;
|
|
|
|
public class ItemPlasmaSpear extends Item implements IFillableItem, ISyncButtons {
|
|
|
|
public static final int maxFuel = 3_000;
|
|
|
|
@Override
|
|
public boolean showDurabilityBar(ItemStack stack) {
|
|
return getFill(stack) < maxFuel;
|
|
}
|
|
|
|
@Override
|
|
public double getDurabilityForDisplay(ItemStack stack) {
|
|
return 1 - (double) getFill(stack) / (double) maxFuel;
|
|
}
|
|
|
|
public int getFill(ItemStack stack) {
|
|
if(stack.stackTagCompound == null) {
|
|
stack.stackTagCompound = new NBTTagCompound();
|
|
setFill(stack, maxFuel);
|
|
return maxFuel;
|
|
}
|
|
|
|
return stack.stackTagCompound.getInteger("fuel");
|
|
}
|
|
|
|
public void setFill(ItemStack stack, int fill) {
|
|
if(stack.stackTagCompound == null) {
|
|
stack.stackTagCompound = new NBTTagCompound();
|
|
}
|
|
|
|
stack.stackTagCompound.setInteger("fuel", fill);
|
|
}
|
|
|
|
public static ItemStack getEmptyTool(Item item) {
|
|
ItemPlasmaSpear tool = (ItemPlasmaSpear) item;
|
|
ItemStack stack = new ItemStack(item);
|
|
tool.setFill(stack, 0);
|
|
return stack;
|
|
}
|
|
|
|
@Override
|
|
public ItemStack onItemRightClick(ItemStack stack, World world, EntityPlayer player) {
|
|
|
|
if(world.isRemote) return stack;
|
|
|
|
if(!stack.hasTagCompound()) {
|
|
stack.stackTagCompound = new NBTTagCompound();
|
|
}
|
|
|
|
stack.stackTagCompound.setBoolean("melee", !stack.stackTagCompound.getBoolean("melee"));
|
|
world.playSoundAtEntity(player, "random.orb", 0.25F, 1.25F);
|
|
|
|
return stack;
|
|
}
|
|
|
|
@Override
|
|
public boolean onLeftClickEntity(ItemStack stack, EntityPlayer player, Entity entity) {
|
|
|
|
if(stack.hasTagCompound() && !stack.stackTagCompound.getBoolean("melee")) {
|
|
return true; //cancel hitting, it's ranged
|
|
}
|
|
|
|
return false;
|
|
}
|
|
|
|
@Override
|
|
public boolean onEntitySwing(EntityLivingBase entityLiving, ItemStack stack) {
|
|
|
|
if(!(entityLiving instanceof EntityPlayerMP))
|
|
return false;
|
|
|
|
if(getFill(stack) <= 0)
|
|
return false;
|
|
|
|
if(stack.hasTagCompound() && stack.stackTagCompound.getBoolean("melee")) {
|
|
return true; //cancel hitting, it's ranged
|
|
}
|
|
|
|
NBTTagCompound nbt = new NBTTagCompound();
|
|
nbt.setString("type", "anim");
|
|
nbt.setString("mode", "lSwing");
|
|
PacketDispatcher.wrapper.sendTo(new AuxParticlePacketNT(nbt, 0, 0, 0), (EntityPlayerMP)entityLiving);
|
|
|
|
return false;
|
|
}
|
|
|
|
@Override
|
|
public boolean canReceiveMouse(EntityPlayer player, ItemStack stack, MouseEvent event, int button, boolean buttonstate) {
|
|
|
|
if(stack.hasTagCompound() && stack.stackTagCompound.getBoolean("melee")) {
|
|
return false;
|
|
}
|
|
|
|
if(button == 0) {
|
|
event.setCanceled(true);
|
|
return true;
|
|
}
|
|
|
|
return false;
|
|
}
|
|
|
|
@Override
|
|
public void receiveMouse(EntityPlayer player, ItemStack stack, int button, boolean buttonstate) {
|
|
Vec3 start = Vec3.createVectorHelper(player.posX, player.posY + player.getEyeHeight() - player.yOffset, player.posZ);
|
|
Vec3 look = player.getLookVec();
|
|
Vec3 end = start.addVector(look.xCoord * 100, look.yCoord * 100, look.zCoord * 100);
|
|
|
|
List<Entity> targets = player.worldObj.getEntitiesWithinAABBExcludingEntity(player, AxisAlignedBB.getBoundingBox(
|
|
Math.min(start.xCoord, end.xCoord),
|
|
Math.min(start.yCoord, end.yCoord),
|
|
Math.min(start.zCoord, end.zCoord),
|
|
Math.max(start.xCoord, end.xCoord),
|
|
Math.max(start.yCoord, end.yCoord),
|
|
Math.max(start.zCoord, end.zCoord)
|
|
));
|
|
|
|
for(Entity target : targets) {
|
|
|
|
AxisAlignedBB aabb = target.boundingBox;
|
|
MovingObjectPosition hitMop = aabb.calculateIntercept(start, end);
|
|
|
|
if(hitMop != null) {
|
|
target.attackEntityFrom(new EntityDamageSource(ModDamageSource.s_laser, player).setDamageBypassesArmor(), 15F);
|
|
}
|
|
}
|
|
}
|
|
|
|
@Override
|
|
public boolean acceptsFluid(FluidType type, ItemStack stack) {
|
|
return type == Fluids.SCHRABIDIC;
|
|
}
|
|
|
|
@Override
|
|
public int tryFill(FluidType type, int amount, ItemStack stack) {
|
|
|
|
int fill = this.getFill(stack);
|
|
int toFill = this.maxFuel - fill;
|
|
toFill = Math.min(toFill, amount);
|
|
toFill = Math.min(toFill, 10);
|
|
|
|
this.setFill(stack, fill + toFill);
|
|
|
|
return amount - toFill;
|
|
}
|
|
|
|
@Override public boolean providesFluid(FluidType type, ItemStack stack) { return false; }
|
|
@Override public int tryEmpty(FluidType type, int amount, ItemStack stack) { return 0; }
|
|
}
|