/*******************************************************************************
* AbyssalCraft
* Copyright (c) 2012 - 2017 Shinoow.
* All rights reserved. This program and the accompanying materials
* are made available under the terms of the GNU Lesser Public License v3
* which accompanies this distribution, and is available at
* http://www.gnu.org/licenses/lgpl-3.0.txt
*
* Contributors:
* Shinoow - implementation
******************************************************************************/
package com.shinoow.abyssalcraft.client.handlers;
import java.util.List;
import net.minecraft.client.Minecraft;
import net.minecraft.entity.Entity;
import net.minecraft.entity.player.EntityPlayer;
import net.minecraft.util.EnumFacing;
import net.minecraft.util.math.AxisAlignedBB;
import net.minecraft.util.math.BlockPos;
import net.minecraft.util.math.RayTraceResult;
import net.minecraft.util.math.RayTraceResult.Type;
import net.minecraft.util.math.Vec3d;
import net.minecraft.world.World;
import net.minecraftforge.client.event.FOVUpdateEvent;
import net.minecraftforge.client.event.MouseEvent;
import net.minecraftforge.fml.client.FMLClientHandler;
import net.minecraftforge.fml.common.eventhandler.Event;
import net.minecraftforge.fml.common.eventhandler.SubscribeEvent;
import net.minecraftforge.fml.relauncher.Side;
import net.minecraftforge.fml.relauncher.SideOnly;
import org.lwjgl.input.Mouse;
import com.shinoow.abyssalcraft.api.block.ACBlocks;
import com.shinoow.abyssalcraft.api.item.ACItems;
import com.shinoow.abyssalcraft.common.network.PacketDispatcher;
import com.shinoow.abyssalcraft.common.network.server.FireMessage;
public class AbyssalCraftClientEventHooks {
@SubscribeEvent
public void onUpdateFOV(FOVUpdateEvent event) {
float fov = event.getFov();
if( event.getEntity().isHandActive() && event.getEntity().getActiveItemStack() != null
&& event.getEntity().getActiveItemStack().getItem() == ACItems.coralium_longbow) {
int duration = event.getEntity().getItemInUseCount();
float multiplier = duration / 20.0F;
if( multiplier > 1.0F )
multiplier = 1.0F;
else
multiplier *= multiplier;
fov *= 1.0F - multiplier * 0.15F;
}
event.setNewfov(fov);
}
@SubscribeEvent
public void onMouseEvent(MouseEvent event) {
int button = event.getButton() - 100;
Minecraft mc = Minecraft.getMinecraft();
EntityPlayer player = mc.player;
World world = mc.world;
int key = mc.gameSettings.keyBindAttack.getKeyCode();
if (button == key && Mouse.isButtonDown(button + 100))
if(mc.objectMouseOver != null && mc.objectMouseOver.typeOfHit == Type.BLOCK){
BlockPos pos = mc.objectMouseOver.getBlockPos();
EnumFacing face = mc.objectMouseOver.sideHit;
if(pos != null && face != null)
if (world.getBlockState(pos).getBlock() != null)
extinguishFire(player, pos, face, world, event);
}
}
private void extinguishFire(EntityPlayer player, BlockPos posIn, EnumFacing face, World world, Event event) {
BlockPos pos = posIn.offset(face);
if (world.getBlockState(pos).getBlock() == ACBlocks.mimic_fire ||
world.getBlockState(pos).getBlock() == ACBlocks.coralium_fire ||
world.getBlockState(pos).getBlock() == ACBlocks.dreaded_fire ||
world.getBlockState(pos).getBlock() == ACBlocks.omothol_fire)
if (event instanceof MouseEvent) {
PacketDispatcher.sendToServer(new FireMessage(pos));
PacketDispatcher.sendToAllAround(new FireMessage(pos), player, 30);
event.setCanceled(true);
}
}
@SideOnly(Side.CLIENT)
public static RayTraceResult getMouseOverExtended(float dist)
{
Minecraft mc = FMLClientHandler.instance().getClient();
Entity theRenderViewEntity = mc.getRenderViewEntity();
AxisAlignedBB theViewBoundingBox = new AxisAlignedBB(
theRenderViewEntity.posX-0.5D,
theRenderViewEntity.posY-0.0D,
theRenderViewEntity.posZ-0.5D,
theRenderViewEntity.posX+0.5D,
theRenderViewEntity.posY+1.5D,
theRenderViewEntity.posZ+0.5D
);
RayTraceResult returnMOP = null;
if (mc.world != null)
{
double var2 = dist;
returnMOP = theRenderViewEntity.rayTrace(var2, 0);
double calcdist = var2;
Vec3d pos = theRenderViewEntity.getPositionEyes(0);
var2 = calcdist;
if (returnMOP != null)
calcdist = returnMOP.hitVec.distanceTo(pos);
Vec3d lookvec = theRenderViewEntity.getLook(0);
Vec3d var8 = pos.addVector(lookvec.xCoord * var2,
lookvec.yCoord * var2,
lookvec.zCoord * var2);
Entity pointedEntity = null;
float var9 = 1.0F;
@SuppressWarnings("unchecked")
List<Entity> list = mc.world.getEntitiesWithinAABBExcludingEntity(
theRenderViewEntity,
theViewBoundingBox.addCoord(
lookvec.xCoord * var2,
lookvec.yCoord * var2,
lookvec.zCoord * var2).expand(var9, var9, var9));
double d = calcdist;
for (Entity entity : list)
if (entity.canBeCollidedWith())
{
float bordersize = entity.getCollisionBorderSize();
AxisAlignedBB aabb = new AxisAlignedBB(
entity.posX-entity.width/2,
entity.posY,
entity.posZ-entity.width/2,
entity.posX+entity.width/2,
entity.posY+entity.height,
entity.posZ+entity.width/2);
aabb.expand(bordersize, bordersize, bordersize);
RayTraceResult mop0 = aabb.calculateIntercept(pos, var8);
if (aabb.isVecInside(pos))
{
if (0.0D < d || d == 0.0D)
{
pointedEntity = entity;
d = 0.0D;
}
} else if (mop0 != null)
{
double d1 = pos.distanceTo(mop0.hitVec);
if (d1 < d || d == 0.0D)
{
pointedEntity = entity;
d = d1;
}
}
}
if (pointedEntity != null && (d < calcdist || returnMOP == null))
returnMOP = new RayTraceResult(pointedEntity);
}
return returnMOP;
}
}