package minefantasy.mf2.mechanics; import java.util.List; import mods.battlegear2.api.weapons.IExtendedReachWeapon; import net.minecraft.client.Minecraft; import net.minecraft.entity.Entity; import net.minecraft.entity.EntityLiving; import net.minecraft.entity.player.EntityPlayer; import net.minecraft.item.ItemStack; import net.minecraft.util.AxisAlignedBB; import net.minecraft.util.MovingObjectPosition; import net.minecraft.util.Vec3; import cpw.mods.fml.client.FMLClientHandler; import cpw.mods.fml.common.eventhandler.SubscribeEvent; import cpw.mods.fml.common.gameevent.TickEvent; /** * This class exists because minecraft hunger seems to decrease faster than windows stock */ public class ExtendedReachMF { //SPRINT JUMPING //DEFAULT:= 0:22 (50seconds till starve, 35s till nosprint) (16m in MC time for 4 missing bars) //SLOW=5: = 2:20 (5mins till starve, 3:30 till nosprint) (1h 40m in MC time for 4 missing bars) //EXHAUSTION SCALE = 3.0F = 1hunger @SubscribeEvent public void onPlayerTick(TickEvent.PlayerTickEvent event) { if(event.phase == TickEvent.Phase.END) { tickEnd(event.player); } } public void tickEnd(EntityPlayer entityPlayer) { //If we JUST swung an Item if (entityPlayer.swingProgressInt == 1) { ItemStack mainhand = entityPlayer.getCurrentEquippedItem(); if (mainhand != null && mainhand.getItem() instanceof IExtendedReachWeapon) { float extendedReach = ((IExtendedReachWeapon) mainhand.getItem()).getReachModifierInBlocks(mainhand); if(extendedReach > 0){ MovingObjectPosition mouseOver = getMouseOver(0, extendedReach + 4); if (mouseOver != null && mouseOver.typeOfHit == MovingObjectPosition.MovingObjectType.ENTITY) { Entity target = mouseOver.entityHit; if (target instanceof EntityLiving && target != entityPlayer) { if (target.hurtResistantTime != ((EntityLiving) target).maxHurtResistantTime) { FMLClientHandler.instance().getClient().playerController.attackEntity(entityPlayer, target); } } } } } } } public MovingObjectPosition getMouseOver(float tickPart, float maxDist) { Minecraft mc = FMLClientHandler.instance().getClient(); if (mc.renderViewEntity != null) { if (mc.theWorld != null) { mc.pointedEntity = null; double d0 = maxDist; MovingObjectPosition objectMouseOver = mc.renderViewEntity.rayTrace(d0, tickPart); double d1 = d0; Vec3 vec3 = mc.renderViewEntity.getPosition(tickPart); if (objectMouseOver != null) { d1 = objectMouseOver.hitVec.distanceTo(vec3); } Vec3 vec31 = mc.renderViewEntity.getLook(tickPart); Vec3 vec32 = vec3.addVector(vec31.xCoord * d0, vec31.yCoord * d0, vec31.zCoord * d0); Entity pointedEntity = null; float f1 = 1.0F; List list = mc.theWorld.getEntitiesWithinAABBExcludingEntity(mc.renderViewEntity, mc.renderViewEntity.boundingBox.addCoord(vec31.xCoord * d0, vec31.yCoord * d0, vec31.zCoord * d0).expand(f1, f1, f1)); double d2 = d1; for (int i = 0; i < list.size(); ++i) { Entity entity = (Entity)list.get(i); if (entity.canBeCollidedWith()) { float f2 = entity.getCollisionBorderSize(); AxisAlignedBB axisalignedbb = entity.boundingBox.expand(f2, f2, f2); MovingObjectPosition movingobjectposition = axisalignedbb.calculateIntercept(vec3, vec32); if (axisalignedbb.isVecInside(vec3)) { if (0.0D < d2 || d2 == 0.0D) { pointedEntity = entity; d2 = 0.0D; } } else if (movingobjectposition != null) { double d3 = vec3.distanceTo(movingobjectposition.hitVec); if (d3 < d2 || d2 == 0.0D) { pointedEntity = entity; d2 = d3; } } } } if (pointedEntity != null && (d2 < d1 || objectMouseOver == null)) { objectMouseOver = new MovingObjectPosition(pointedEntity); } return objectMouseOver; } } return null; } }