/*
* 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.handler.weapon;
import cpw.mods.fml.common.eventhandler.SubscribeEvent;
import cpw.mods.fml.common.gameevent.TickEvent;
import cpw.mods.fml.relauncher.Side;
import cpw.mods.fml.relauncher.SideOnly;
import matteroverdrive.MatterOverdrive;
import matteroverdrive.api.weapon.IWeapon;
import matteroverdrive.network.packet.bi.PacketFirePlasmaShot;
import matteroverdrive.network.packet.bi.PacketWeaponTick;
import matteroverdrive.util.math.MOMathHelper;
import net.minecraft.client.Minecraft;
import net.minecraft.entity.player.EntityPlayer;
import net.minecraft.item.ItemStack;
import net.minecraft.world.World;
import net.minecraftforge.client.event.FOVUpdateEvent;
import java.util.HashMap;
import java.util.Map;
/**
* Created by Simeon on 7/31/2015.
*/
@SideOnly(Side.CLIENT)
public class ClientWeaponHandler extends CommonWeaponHandler
{
private static final float RECOIL_RESET_SPEED = 0.03f;
public static float ZOOM_TIME;
public static float RECOIL_TIME;
public static float RECOIL_AMOUNT;
private Map<IWeapon,Integer> shotTracker;
private float lastMouseSensitivity;
public ClientWeaponHandler()
{
shotTracker = new HashMap<>();
}
public void registerWeapon(IWeapon weapon)
{
shotTracker.put(weapon,0);
}
public void onClientTick(TickEvent.ClientTickEvent event)
{
if (!Minecraft.getMinecraft().isGamePaused() && Minecraft.getMinecraft().theWorld != null && Minecraft.getMinecraft().thePlayer != null)
{
for (IWeapon item : shotTracker.keySet())
{
int oldTime = shotTracker.get(item);
if (oldTime > 0) {
shotTracker.put(item, oldTime-1);
}
}
manageWeaponView();
}
}
@SideOnly(Side.CLIENT)
public void onTick(TickEvent.RenderTickEvent event)
{
if (Minecraft.getMinecraft().thePlayer != null)
{
EntityPlayer entityPlayer = Minecraft.getMinecraft().thePlayer;
if (entityPlayer.getHeldItem() != null && entityPlayer.getHeldItem().getItem() instanceof IWeapon)
{
ZOOM_TIME = MOMathHelper.Lerp(ZOOM_TIME, ((IWeapon) entityPlayer.getHeldItem().getItem()).isWeaponZoomed(entityPlayer,entityPlayer.getHeldItem()) ? 1f : 0, event.renderTickTime*0.2f);
}
else
{
ZOOM_TIME = MOMathHelper.Lerp(ZOOM_TIME, 0, 0.2f);
}
if (ZOOM_TIME == 0)
{
lastMouseSensitivity = Minecraft.getMinecraft().gameSettings.mouseSensitivity;
}else
{
if (entityPlayer.getHeldItem() != null && entityPlayer.getHeldItem().getItem() instanceof IWeapon)
{
Minecraft.getMinecraft().gameSettings.mouseSensitivity = lastMouseSensitivity * (1 - (ZOOM_TIME * ((IWeapon) entityPlayer.getHeldItem().getItem()).getZoomMultiply(entityPlayer,entityPlayer.getHeldItem())));
}else
{
Minecraft.getMinecraft().gameSettings.mouseSensitivity = lastMouseSensitivity;
}
}
if (RECOIL_TIME > 0)
{
RECOIL_TIME = Math.max(0,RECOIL_TIME - RECOIL_RESET_SPEED);
}
}
}
@SubscribeEvent
public void onFovUpdate(FOVUpdateEvent event)
{
if (Minecraft.getMinecraft().thePlayer.getHeldItem() != null && Minecraft.getMinecraft().thePlayer.getHeldItem().getItem() instanceof IWeapon) {
event.newfov -= event.fov * ZOOM_TIME * ((IWeapon) Minecraft.getMinecraft().thePlayer.getHeldItem().getItem()).getZoomMultiply(Minecraft.getMinecraft().thePlayer,Minecraft.getMinecraft().thePlayer.getHeldItem());
}
}
private void manageWeaponView()
{
for (Object playerObj : Minecraft.getMinecraft().theWorld.playerEntities)
{
EntityPlayer player = (EntityPlayer)playerObj;
ItemStack currentitem = player.getCurrentEquippedItem();
if (currentitem != null && currentitem.getItem() instanceof IWeapon && ((IWeapon) currentitem.getItem()).isAlwaysEquipped(currentitem))
{
if (player == Minecraft.getMinecraft().thePlayer && Minecraft.getMinecraft().gameSettings.thirdPersonView == 0)
{
//this disables the use animation of the weapon in first person
//to enable custom animations
currentitem.setItemDamage(0);
}else
{
//this allows the item to play the bow use animation when in 3rd person mode
currentitem.setItemDamage(1);
player.setItemInUse(currentitem,player.getItemInUseCount());
}
}
}
}
@SideOnly(Side.CLIENT)
public void sendWeaponTickToServer(World world, PacketFirePlasmaShot firePlasmaShot)
{
MatterOverdrive.packetPipeline.sendToServer(new PacketWeaponTick(world.getWorldTime(),firePlasmaShot));
}
public boolean shootDelayPassed(IWeapon item)
{
return shotTracker.get(item) <= 0;
}
public void addShootDelay(IWeapon item,ItemStack weaponStack)
{
if (shotTracker.containsKey(item))
shotTracker.put(item,shotTracker.get(item) + item.getShootCooldown(weaponStack));
}
public void addReloadDelay(IWeapon weapon,int delay)
{
if (shotTracker.containsKey(weapon))
shotTracker.put(weapon,shotTracker.get(weapon) + delay);
}
public float getEquippedWeaponAccuracyPercent(EntityPlayer entityPlayer)
{
if (entityPlayer.getHeldItem() != null && entityPlayer.getHeldItem().getItem() instanceof IWeapon)
{
return ((IWeapon) entityPlayer.getHeldItem().getItem()).getAccuracy(entityPlayer.getHeldItem(), entityPlayer, ((IWeapon) entityPlayer.getHeldItem().getItem()).isWeaponZoomed(entityPlayer,entityPlayer.getHeldItem())) / ((IWeapon) entityPlayer.getHeldItem().getItem()).getMaxHeat(entityPlayer.getHeldItem());
}
return 0;
}
}