fun getMouseOver(partialTicks: Float, distance: Double, canBeCollidedWith: Boolean): Entity? {
val mc = Minecraft.getMinecraft()
var pointedEntity: Entity? = null
var rayTrace: RayTraceResult?
if(mc.renderViewEntity != null) {
if(mc.world != null) {
rayTrace = mc.renderViewEntity!!.rayTrace(distance, partialTicks)
val positionVec = mc.renderViewEntity!!.positionVector
var distanceToVec3 = distance
if(rayTrace != null) {
distanceToVec3 = rayTrace.hitVec.distanceTo(positionVec)
}
val lookVec = mc.renderViewEntity!!.getLook(partialTicks)
val posDistVec = positionVec.addVector(lookVec.x * distance, lookVec.y * distance, lookVec.z * distance)
var tempVec: Vec3d? = null
val boxExpand = 1.0
val entities = mc.world.getEntitiesWithinAABBExcludingEntity(mc.renderViewEntity, mc.renderViewEntity!!.renderBoundingBox.expand(lookVec.x * distance, lookVec.y * distance, lookVec.z * distance).expand(boxExpand, boxExpand, boxExpand))
var vecInsideDist = distanceToVec3
for(i in entities.indices) {
val entity = entities[i]
if(!canBeCollidedWith || entity.canBeCollidedWith()) {
val borderSize = entity.collisionBorderSize.toDouble()
val expEntityBox = entity.renderBoundingBox.expand(borderSize, borderSize, borderSize)
val calculateInterceptPos = expEntityBox.calculateIntercept(positionVec, posDistVec)
if(expEntityBox.contains(positionVec)) {
if(0.0 < vecInsideDist || vecInsideDist == 0.0) {
pointedEntity = entity
tempVec = if(calculateInterceptPos == null) positionVec else calculateInterceptPos.hitVec
vecInsideDist = 0.0
}
} else if(calculateInterceptPos != null) {
val calcInterceptPosDist = positionVec.distanceTo(calculateInterceptPos.hitVec)
if(calcInterceptPosDist < vecInsideDist || vecInsideDist == 0.0) {
if(entity === mc.renderViewEntity!!.ridingEntity && !entity.canRiderInteract()) {
if(vecInsideDist == 0.0) {
pointedEntity = entity
tempVec = calculateInterceptPos.hitVec
}
} else {
pointedEntity = entity
tempVec = calculateInterceptPos.hitVec
vecInsideDist = calcInterceptPosDist
}
}
}
}
}
if(pointedEntity != null && (vecInsideDist < distanceToVec3 || rayTrace == null)) {
return pointedEntity
}
}
}
return null
}