/* * This file is part of Matter Overdrive * Copyright (c) 2015., Simeon Radivoev, All rights reserved. * * Matter Overdrive is free software: you can redistribute it and/or modify * it under the terms of the GNU General Public License as published by * the Free Software Foundation, either version 3 of the License, or * (at your option) any later version. * * Matter Overdrive is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the * GNU General Public License for more details. * * You should have received a copy of the GNU General Public License * along with Matter Overdrive. If not, see <http://www.gnu.org/licenses>. */ package matteroverdrive.items.weapon; import cpw.mods.fml.relauncher.Side; import cpw.mods.fml.relauncher.SideOnly; import matteroverdrive.Reference; import matteroverdrive.api.weapon.IWeaponModule; import matteroverdrive.api.weapon.WeaponShot; import matteroverdrive.client.sound.MOPositionedSound; import matteroverdrive.client.sound.WeaponSound; import matteroverdrive.entity.weapon.PlasmaBolt; import matteroverdrive.handler.weapon.ClientWeaponHandler; import matteroverdrive.items.weapon.module.WeaponModuleBarrel; import matteroverdrive.util.WeaponHelper; import net.minecraft.client.Minecraft; import net.minecraft.entity.EntityLivingBase; import net.minecraft.entity.player.EntityPlayer; import net.minecraft.item.EnumAction; import net.minecraft.item.ItemStack; import net.minecraft.util.MathHelper; import net.minecraft.util.MovingObjectPosition; import net.minecraft.util.ResourceLocation; import net.minecraft.util.Vec3; import net.minecraft.world.World; import org.lwjgl.input.Mouse; import org.lwjgl.util.vector.Vector2f; import java.util.List; /** * Created by Simeon on 12/8/2015. */ public class IonSniper extends EnergyWeapon { private static final int MAX_HEAT = 100; private static final int MAX_USE_TIME = 512; private static final int ENERGY_PER_SHOT = 3072; public static final int RANGE = 96; public IonSniper(String name) { super(name, 32000, 128, 128, RANGE); setFull3D(); leftClickFire = true; } @Override @SideOnly(Side.CLIENT) protected void addCustomDetails(ItemStack weapon, EntityPlayer player, List infos) { } @Override public int getBaseEnergyUse(ItemStack item) { return ENERGY_PER_SHOT / getShootCooldown(item); } @Override protected int getBaseMaxHeat(ItemStack item) { return MAX_HEAT; } @Override public float getWeaponBaseDamage(ItemStack weapon) { return 21; } @Override public float getWeaponBaseAccuracy(ItemStack weapon,boolean zoomed) { if (zoomed) { return 1f + getHeat(weapon) * 0.1f; }else { return 5 + getHeat(weapon) * 0.3f; } } @Override public boolean canFire(ItemStack weapon,World world,EntityLivingBase shooter) { return DrainEnergy(weapon, getShootCooldown(weapon), true) && !isOverheated(weapon); } @Override public float getShotSpeed(ItemStack weapon, EntityLivingBase shooter) { return 8; } @Override public int getBaseShootCooldown(ItemStack weapon) { return 30; } @Override public float getBaseZoom(ItemStack weapon, EntityLivingBase shooter) { return 0.4f; } @Override @SideOnly(Side.CLIENT) public void onShooterClientUpdate(ItemStack itemStack, World world, EntityPlayer entityPlayer, boolean sendServerTick) { if (Mouse.isButtonDown(0) && hasShootDelayPassed()) { if (canFire(itemStack,world,entityPlayer)) { if (Minecraft.getMinecraft().gameSettings.thirdPersonView == 0) { if (isWeaponZoomed(entityPlayer, itemStack)) { ClientWeaponHandler.RECOIL_AMOUNT = 2f + Math.min(2,getAccuracy(itemStack, entityPlayer, true)); Minecraft.getMinecraft().renderViewEntity.hurtTime = 30 + (int) ((getHeat(itemStack) / getMaxHeat(itemStack)) * 8); Minecraft.getMinecraft().renderViewEntity.maxHurtTime = 45; } else { ClientWeaponHandler.RECOIL_AMOUNT = 4f + Math.min(2,getAccuracy(itemStack, entityPlayer, true)); Minecraft.getMinecraft().renderViewEntity.hurtTime = 30 + (int) ((getHeat(itemStack) / getMaxHeat(itemStack)) * 8); Minecraft.getMinecraft().renderViewEntity.maxHurtTime = 45; } ClientWeaponHandler.RECOIL_TIME = 1; } Vec3 dir = entityPlayer.getLook(1); Vec3 pos = getFirePosition(entityPlayer, dir, isWeaponZoomed(entityPlayer,itemStack)); WeaponShot shot = createShot(itemStack,entityPlayer, isWeaponZoomed(entityPlayer,itemStack)); onClientShot(itemStack, entityPlayer, pos, dir, shot); addShootDelay(itemStack); sendShootTickToServer(world,shot,dir,pos); return; }else if (needsRecharge(itemStack)) { chargeFromEnergyPack(itemStack,entityPlayer); } } super.onShooterClientUpdate(itemStack,world,entityPlayer,sendServerTick); } @SideOnly(Side.CLIENT) private Vec3 getFirePosition(EntityPlayer entityPlayer,Vec3 dir,boolean isAiming) { Vec3 pos = Vec3.createVectorHelper(entityPlayer.posX, entityPlayer.posY, entityPlayer.posZ); if (!isAiming) { pos.xCoord -= (double)(MathHelper.cos(entityPlayer.rotationYaw / 180.0F * (float) Math.PI) * 0.16F); pos.zCoord -= (double)(MathHelper.sin(entityPlayer.rotationYaw / 180.0F * (float) Math.PI) * 0.16F); } pos = pos.addVector(dir.xCoord,dir.yCoord,dir.zCoord); return pos; } @Override @SideOnly(Side.CLIENT) public void onClientShot(ItemStack weapon, EntityLivingBase shooter, Vec3 position, Vec3 dir, WeaponShot shot) { MOPositionedSound sound = new MOPositionedSound(new ResourceLocation(Reference.MOD_ID + ":" + "sniper_rifle_fire"),3f + itemRand.nextFloat()*0.5f, 0.9f + itemRand.nextFloat() * 0.2f); sound.setPosition((float) position.xCoord,(float)position.yCoord,(float)position.zCoord); Minecraft.getMinecraft().getSoundHandler().playSound(sound); spawnProjectile(weapon,shooter,position,dir,shot); } @Override public void onProjectileHit(MovingObjectPosition hit, ItemStack weapon, World world, float amount) { } @Override @SideOnly(Side.CLIENT) public Vector2f getSlotPosition(int slot, ItemStack weapon) { switch (slot) { case Reference.MODULE_BATTERY: return new Vector2f(170,115); case Reference.MODULE_COLOR: return new Vector2f(60,45); case Reference.MODULE_BARREL: return new Vector2f(60,115); case Reference.MODULE_OTHER: return new Vector2f(205,80); case Reference.MODULE_SIGHTS: return new Vector2f(150,35); } return new Vector2f(0,0); } @Override @SideOnly(Side.CLIENT) public Vector2f getModuleScreenPosition(int slot, ItemStack weapon) { switch(slot) { case Reference.MODULE_BATTERY: return new Vector2f(165,80); case Reference.MODULE_COLOR: return new Vector2f(110,90); case Reference.MODULE_BARREL: return new Vector2f(90,95); case Reference.MODULE_SIGHTS: return new Vector2f(150,72); } return getSlotPosition(slot,weapon); } public PlasmaBolt spawnProjectile(ItemStack weapon,EntityLivingBase shooter,Vec3 position,Vec3 dir,WeaponShot shot) { //PlasmaBolt fire = new PlasmaBolt(entityPlayer.worldObj, entityPlayer,position,dir, getWeaponScaledDamage(weapon), 2, getAccuracy(weapon, zoomed), getRange(weapon), WeaponHelper.getColor(weapon).getColor(), zoomed,seed); PlasmaBolt fire = new PlasmaBolt(shooter.worldObj, shooter,position,dir, shot,getShotSpeed(weapon,shooter)); fire.setWeapon(weapon); fire.setFireDamageMultiply(WeaponHelper.modifyStat(Reference.WS_FIRE_DAMAGE, weapon,0)); fire.setKnockBack(1); shooter.worldObj.spawnEntityInWorld(fire); return fire; } @Override public EnumAction getItemUseAction(ItemStack itemStack) { return itemStack.getItemDamage() == 1 ? EnumAction.bow : EnumAction.none; } @Override public int getMaxItemUseDuration(ItemStack item) { return MAX_USE_TIME; } @Override public boolean supportsModule(int slot, ItemStack weapon) { return true; } @Override public ItemStack onItemRightClick(ItemStack item, World world, EntityPlayer player) { player.setItemInUse(item, Integer.MAX_VALUE); if(world.isRemote) { for(int i = 0; i < 3; i++) Minecraft.getMinecraft().entityRenderer.itemRenderer.updateEquippedItem(); } return item; } @Override public boolean supportsModule(ItemStack weapon, ItemStack module) { if (module != null && module.getItem() instanceof IWeaponModule && ((IWeaponModule) module.getItem()).getSlot(module) == Reference.MODULE_BARREL) { return module.getItemDamage() != WeaponModuleBarrel.EXPLOSION_BARREL_ID && module.getItemDamage() != WeaponModuleBarrel.HEAL_BARREL_ID; } return true; } @Override public boolean onServerFire(ItemStack weapon, EntityLivingBase shooter, WeaponShot shot,Vec3 position,Vec3 dir,int delay) { DrainEnergy(weapon, getShootCooldown(weapon), false); float newHeat = getHeat(weapon) + getMaxHeat(weapon) * 0.8f; setHeat(weapon, newHeat); manageOverheat(weapon, shooter.worldObj, shooter); PlasmaBolt fire = spawnProjectile(weapon,shooter,position,dir,shot); fire.simulateDelay(delay); return true; } @Override public boolean isAlwaysEquipped(ItemStack weapon) { return true; } @Override @SideOnly(Side.CLIENT) public boolean isWeaponZoomed(EntityPlayer entityPlayer, ItemStack weapon) { return Mouse.isButtonDown(1) && entityPlayer.isUsingItem(); } @Override @SideOnly(Side.CLIENT) public WeaponSound getFireSound(ItemStack weapon, EntityLivingBase entity) { return null; } }