Are there multiple MouseEvents?
I will post all of the code that was changed from jabelar's tutorial to fit 1.10 in a bit. I'm not on the same computer that has it right now.
MouseEvent should be donenin client proxy because the server doesnt need to know what do you have inside that method? Are you importing the correct MouseEvent?
net.minecraftforge.client.event.MouseEvent is being imported. I moved it from CommonProxy to ClientProxy, still no difference.
MouseEventHandler:
package bloopers.spearmod.reach;
import java.awt.List;
import org.lwjgl.input.Mouse;
import bloopers.spearmod.SpearMod;
import net.minecraft.client.Minecraft;
import net.minecraft.entity.Entity;
import net.minecraft.entity.player.EntityPlayer;
import net.minecraft.item.ItemStack;
import net.minecraft.util.math.AxisAlignedBB;
import net.minecraft.util.math.RayTraceResult;
import net.minecraft.util.math.Vec3d;
import net.minecraftforge.client.event.MouseEvent;
import net.minecraftforge.fml.client.FMLClientHandler;
import net.minecraftforge.fml.common.Mod.EventHandler;
import net.minecraftforge.fml.common.eventhandler.EventPriority;
import net.minecraftforge.fml.common.eventhandler.SubscribeEvent;
import net.minecraftforge.fml.relauncher.Side;
import net.minecraftforge.fml.relauncher.SideOnly;
public class MouseEventHandler {
@SideOnly(Side.CLIENT)
@SubscribeEvent
@EventHandler
public void onEvent(MouseEvent event)
{
int button = event.getButton();
boolean buttonstate = event.isButtonstate();
if (button == 0 && buttonstate)
{
Minecraft mc = Minecraft.getMinecraft();
EntityPlayer thePlayer = mc.thePlayer;
if (thePlayer != null)
{
ItemStack itemstack = thePlayer.getHeldItemMainhand();
IExtendedReach ieri;
if (itemstack != null)
{
if (itemstack.getItem() instanceof IExtendedReach)
{
ieri = (IExtendedReach) itemstack.getItem();
} else
{
ieri = null;
}
if (ieri != null)
{
float reach = ieri.getReach();
RayTraceResult mov = getMouseOverExtended(reach);
if (mov != null)
{
if (mov.entityHit != null && mov.entityHit.hurtResistantTime == 0)
{
if (mov.entityHit != thePlayer )
{
SpearMod.network.sendToServer(new MessageExtendedReachAttack(
mov.entityHit.getEntityId()));
}
}
}
}
}
}
}
}
// This is mostly copied from the EntityRenderer#getMouseOver() method
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.theWorld != 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")
java.util.List<Entity> list = mc.theWorld.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;
}
}
MessageExtendedReachAttack:
package bloopers.spearmod.reach;
import bloopers.spearmod.SpearMod;
import io.netty.buffer.ByteBuf;
import net.minecraft.entity.Entity;
import net.minecraft.entity.player.EntityPlayerMP;
import net.minecraftforge.fml.common.network.ByteBufUtils;
import net.minecraftforge.fml.common.network.simpleimpl.IMessage;
import net.minecraftforge.fml.common.network.simpleimpl.IMessageHandler;
import net.minecraftforge.fml.common.network.simpleimpl.MessageContext;
public class MessageExtendedReachAttack implements IMessage
{
private int entityId ;
public MessageExtendedReachAttack()
{
// need this constructor
}
public MessageExtendedReachAttack(int parEntityId)
{
entityId = parEntityId;
// DEBUG
System.out.println("Constructor");
}
@Override
public void fromBytes(ByteBuf buf)
{
entityId = ByteBufUtils.readVarInt(buf, 4);
// DEBUG
System.out.println("fromBytes");
}
@Override
public void toBytes(ByteBuf buf)
{
ByteBufUtils.writeVarInt(buf, entityId, 4);
// DEBUG
System.out.println("toBytes encoded");
}
public static class Handler implements IMessageHandler<MessageExtendedReachAttack,
IMessage>
{
@Override
public IMessage onMessage(final MessageExtendedReachAttack message,
MessageContext ctx)
{
// DEBUG
System.out.println("Message received");
// Know it will be on the server so make it thread-safe
final EntityPlayerMP thePlayer = (EntityPlayerMP) SpearMod.proxy.
getPlayerEntityFromContext(ctx);
thePlayer.getServer().addScheduledTask(
new Runnable()
{
@Override
public void run()
{
Entity theEntity = thePlayer.worldObj.
getEntityByID(message.entityId);
// DEBUG
System.out.println("Entity = "+theEntity);
// Need to ensure that hackers can't cause trick kills,
// so double check weapon type and reach
if (thePlayer.getHeldItemMainhand() == null)
{
return;
}
if (thePlayer.getHeldItemMainhand().getItem() instanceof
IExtendedReach)
{
IExtendedReach theExtendedReachWeapon =
(IExtendedReach)thePlayer.getHeldItemMainhand().
getItem();
double distanceSq = thePlayer.getDistanceSqToEntity(
theEntity);
double reachSq =theExtendedReachWeapon.getReach()*
theExtendedReachWeapon.getReach();
if (reachSq >= distanceSq)
{
thePlayer.attackTargetEntityWithCurrentItem(
theEntity);
}
}
return; // no response in this case
}
}
);
return null; // no response message
}
}
}
IExtendedReach:
package bloopers.spearmod.reach;
public interface IExtendedReach {
public float getReach(); // default is 1.0D
}
And then in item classes to set the reach:
@Override
public float getReach()
{
return 15.0F;
}
At 15 for testing.
What is button 0?