Files
CustomNPC-Plus/src/main/java/noppes/npcs/items/ItemMachineGun.java
T
2025-03-12 05:00:21 -04:00

155 lines
6.0 KiB
Java
Raw Blame History

This file contains ambiguous Unicode characters
This file contains Unicode characters that might be confused with other characters. If you think that this is intentional, you can safely ignore this warning. Use the Escape button to reveal them.
package noppes.npcs.items;
import cpw.mods.fml.relauncher.Side;
import cpw.mods.fml.relauncher.SideOnly;
import net.minecraft.entity.player.EntityPlayer;
import net.minecraft.item.EnumAction;
import net.minecraft.item.ItemStack;
import net.minecraft.nbt.NBTTagCompound;
import net.minecraft.util.StatCollector;
import net.minecraft.world.World;
import noppes.npcs.CustomItems;
import noppes.npcs.config.ConfigItem;
import noppes.npcs.entity.EntityProjectile;
import org.lwjgl.opengl.GL11;
import java.util.List;
public class ItemMachineGun extends ItemNpcInterface {
public ItemMachineGun(int par1) {
super(par1);
this.setMaxDamage(80);
setCreativeTab(CustomItems.tabWeapon);
}
@SideOnly(Side.CLIENT)
@Override
public void addInformation(ItemStack stack, EntityPlayer player, List list, boolean par4) {
if (stack.stackTagCompound != null && stack.stackTagCompound.hasKey("ShotsLeft")) {
list.add(StatCollector.translateToLocalFormatted("item.npcMachineGun.info") + ": " +
stack.stackTagCompound.getInteger("ShotsLeft"));
}
}
@Override
public void onUsingTick(ItemStack stack, EntityPlayer player, int count) {
if (player.worldObj.isRemote) { // Skip if on client side
return;
}
int ticks = getMaxItemUseDuration(stack) - count; // How many ticks you’ve been holding
ensureNBT(stack); // Make sure the item has its data tags
int shotsLeft = stack.stackTagCompound.getInteger("ShotsLeft");
boolean isReloading = stack.stackTagCompound.getBoolean("IsReloading");
if (!isReloading && shotsLeft > 0) {
if (ticks >= ConfigItem.MachineGunTickSpeed && ticks % ConfigItem.MachineGunTickSpeed == 0) {
fireShot(stack, player); // Fire a shot (decrements ShotsLeft)
shotsLeft = stack.stackTagCompound.getInteger("ShotsLeft");
if (shotsLeft <= 0 && hasItem(player, CustomItems.bulletBlack)) {
stack.stackTagCompound.setBoolean("IsReloading", true);
}
}
} else if (isReloading && shotsLeft < ConfigItem.MachineGunAmmo && hasItem(player, CustomItems.bulletBlack)) {
if (ticks % ConfigItem.MachineGunTickSpeed - 1 == 0) {
reloadShot(stack, player); // Add a shot and consume a bullet
player.worldObj.playSoundAtEntity(player, "customnpcs:gun.ak47.load", 1.0F, 1.0F); // Play reload sound
}
} else if (ticks % ConfigItem.MachineGunTickSpeed == 0) {
// No shots or bullets left, play empty sound
player.worldObj.playSoundAtEntity(player, "customnpcs:gun.empty", 1.0F, 1.0F);
}
}
@Override
public void onPlayerStoppedUsing(ItemStack stack, World par2World, EntityPlayer player, int count) {
if (stack.stackTagCompound == null) {
return;
}
// Stop reloading when you let go
stack.stackTagCompound.setBoolean("IsReloading", false);
}
@Override
public ItemStack onItemRightClick(ItemStack stack, World world, EntityPlayer player) {
if (player.isUsingItem()) {
return stack; // Avoid glitches from spamming
}
ensureNBT(stack); // Set up data tags if missing
int shotsLeft = stack.stackTagCompound.getInteger("ShotsLeft");
stack.stackTagCompound.setBoolean("IsReloading", shotsLeft == 0 && hasItem(player, CustomItems.bulletBlack));
player.setItemInUse(stack, this.getMaxItemUseDuration(stack)); // Start the hold action
return stack;
}
@Override
public int getMaxItemUseDuration(ItemStack par1ItemStack) {
return 72000;
}
@Override
public EnumAction getItemUseAction(ItemStack stack) {
if (stack.stackTagCompound == null || !stack.stackTagCompound.getBoolean("IsReloading")) {
return EnumAction.bow; // Firing animation
}
return EnumAction.block; // Reloading animation
}
@Override
public void renderSpecial() {
GL11.glRotatef(-6, 0, 0, 1f);
GL11.glScalef(0.8f, 0.7f, 0.7f);
GL11.glTranslatef(0.2f, 0.0f, 0.2F);
}
private void ensureNBT(ItemStack stack) {
if (stack.stackTagCompound == null) {
stack.stackTagCompound = new NBTTagCompound();
}
if (!stack.stackTagCompound.hasKey("ShotsLeft")) {
stack.stackTagCompound.setInteger("ShotsLeft", 0);
}
if (!stack.stackTagCompound.hasKey("IsReloading")) {
stack.stackTagCompound.setBoolean("IsReloading", false);
}
}
private void fireShot(ItemStack stack, EntityPlayer player) {
if (!ConfigItem.GunsEnabled && !player.capabilities.isCreativeMode) {
return;
}
int shotsLeft = stack.stackTagCompound.getInteger("ShotsLeft");
if (shotsLeft <= 0) {
return;
}
EntityProjectile projectile = new EntityProjectile(player.worldObj, player,
new ItemStack(CustomItems.bulletBlack, 1, 0), false);
projectile.damage = 4;
projectile.setSpeed(40);
projectile.shoot(2);
player.worldObj.playSoundAtEntity(player, "customnpcs:gun.pistol.shot", 0.9F,
itemRand.nextFloat() * 0.3F + 0.8F);
player.worldObj.spawnEntityInWorld(projectile);
stack.stackTagCompound.setInteger("ShotsLeft", shotsLeft - 1);
if (!player.capabilities.isCreativeMode) {
consumeItem(player, CustomItems.bulletBlack);
}
}
private void reloadShot(ItemStack stack, EntityPlayer player) {
int shotsLeft = stack.stackTagCompound.getInteger("ShotsLeft");
if (shotsLeft < ConfigItem.MachineGunAmmo && hasItem(player, CustomItems.bulletBlack)) {
stack.stackTagCompound.setInteger("ShotsLeft", shotsLeft + 1); // Add one shot
if (!player.capabilities.isCreativeMode) {
consumeItem(player, CustomItems.bulletBlack); // Use up a bullet
}
}
}
}