Posted October 4, 20178 yr Hey, so I tried a way to extend a player's reach distance for block destruction, but the problem is that whenever I break a block that is farther than 5 blocks in radius from the player, the block is glitched and I get stuck in it. I have tried sending packets to the server but that didn't seem to work out. Please help. My classes: 1. ItemChlorophyteSword.java package me.mycustommod.items; import me.mycustommod.MyCustomMod; import me.mycustommod.Reference; import net.minecraft.entity.Entity; import net.minecraft.entity.EntityLivingBase; import net.minecraft.item.ItemStack; import net.minecraft.item.ItemSword; import net.minecraft.util.ResourceLocation; import net.minecraft.world.World; public class ItemChlorophyteSword extends ItemSword { public ItemChlorophyteSword(ToolMaterial material, String unlocalizedName) { super(material); this.setUnlocalizedName(unlocalizedName); this.setRegistryName(new ResourceLocation(Reference.MODID, unlocalizedName)); } @Override public boolean hitEntity(ItemStack stack, EntityLivingBase target, EntityLivingBase attacker) { if (attacker.isSneaking()) { if (target.hurtTime == target.maxHurtTime && target.deathTime <= 0) { target.addVelocity(0, 0.5, 0); } } return super.hitEntity(stack, target, attacker); } @Override public void onUpdate(ItemStack stack, World world, Entity entity, int itemSlot, boolean isSelected) { if (entity instanceof EntityLivingBase) { if (isSelected) { MyCustomMod.proxy.setExtraReach(((EntityLivingBase) entity), 10F); } else { MyCustomMod.proxy.setExtraReach(((EntityLivingBase) entity), 0F); } } super.onUpdate(stack, world, entity, itemSlot, isSelected); } } 2. DinocraftPlayerController.java package me.mycustommod.handlers; import net.minecraft.client.Minecraft; import net.minecraft.client.multiplayer.PlayerControllerMP; import net.minecraft.client.network.NetHandlerPlayClient; import net.minecraftforge.fml.relauncher.Side; import net.minecraftforge.fml.relauncher.SideOnly; @SideOnly(Side.CLIENT) public class DinocraftPlayerController extends PlayerControllerMP implements IExtendedPlayerController { private float distance = 0F; public DinocraftPlayerController(Minecraft mc, NetHandlerPlayClient netHandler) { super(mc, netHandler); } @Override public float getBlockReachDistance() { return super.getBlockReachDistance() + distance; } @Override public void setReachDistanceExtension(float f) { distance = f; } @Override public float getReachDistanceExtension() { return distance; } } 3. IExtendedPlayerController.java package me.mycustommod.handlers; public interface IExtendedPlayerController { /** Sets the extra reach the player should have */ public void setReachDistanceExtension(float f); /** Gets the current reach extension */ public float getReachDistanceExtension(); } 4. ClientProxy package me.mycustommod.proxy; import me.mycustommod.entity.EntityPoisonBall; import me.mycustommod.entity.EntityRayBullet; import me.mycustommod.entity.EntityVineBall; import me.mycustommod.handlers.DinocraftPlayerController; import me.mycustommod.handlers.IExtendedPlayerController; import me.mycustommod.init.DinocraftArmour; import me.mycustommod.init.DinocraftBlocks; import me.mycustommod.init.DinocraftItems; import me.mycustommod.init.DinocraftTools; import net.minecraft.client.Minecraft; import net.minecraft.client.entity.EntityPlayerSP; import net.minecraft.client.network.NetHandlerPlayClient; import net.minecraft.client.renderer.entity.RenderSnowball; import net.minecraft.entity.EntityLivingBase; import net.minecraft.entity.player.EntityPlayer; import net.minecraft.world.World; import net.minecraftforge.fml.client.FMLClientHandler; import net.minecraftforge.fml.client.registry.RenderingRegistry; import net.minecraftforge.fml.common.event.FMLPreInitializationEvent; public class ClientProxy extends CommonProxy { @Override public void preInit(FMLPreInitializationEvent event) { initRenderers(); } private void initRenderers() { RenderingRegistry.registerEntityRenderingHandler(EntityVineBall.class, renderManager -> new RenderSnowball(renderManager, DinocraftItems.VINE_BALL, Minecraft.getMinecraft().getRenderItem())); RenderingRegistry.registerEntityRenderingHandler(EntityPoisonBall.class, renderManager -> new RenderSnowball(renderManager, DinocraftItems.POISON_BALL, Minecraft.getMinecraft().getRenderItem())); RenderingRegistry.registerEntityRenderingHandler(EntityRayBullet.class, renderManager -> new RenderSnowball(renderManager, DinocraftItems.RAY_BULLET, Minecraft.getMinecraft().getRenderItem())); } @Override public void registerRenders() { DinocraftItems.registerRenders(); DinocraftBlocks.registerRenders(); DinocraftTools.registerRenders(); DinocraftArmour.registerRenders(); } @Override public EntityPlayer getPlayer() { return FMLClientHandler.instance().getClient().thePlayer; } @Override public World getClientWorld() { return FMLClientHandler.instance().getClient().theWorld; } @Override public void setExtraReach(EntityLivingBase entity, float reach) { Minecraft mc = Minecraft.getMinecraft(); EntityPlayerSP player = mc.thePlayer; if(entity == player) { if(!(mc.playerController instanceof IExtendedPlayerController)) { NetHandlerPlayClient net = player.connection; DinocraftPlayerController controller = new DinocraftPlayerController(mc, net); boolean isFlying = player.capabilities.isFlying; boolean allowFlying = player.capabilities.allowFlying; controller.setGameType(mc.playerController.getCurrentGameType()); player.capabilities.isFlying = isFlying; player.capabilities.allowFlying = allowFlying; mc.playerController = controller; } ((IExtendedPlayerController) mc.playerController).setReachDistanceExtension(Math.max(0, reach)); } } } 5. CommonProxy package me.mycustommod.proxy; import me.mycustommod.worldgen.OreGen; import net.minecraft.entity.EntityLivingBase; import net.minecraft.entity.player.EntityPlayer; import net.minecraft.entity.player.EntityPlayerMP; import net.minecraft.world.World; import net.minecraftforge.fml.common.event.FMLInitializationEvent; import net.minecraftforge.fml.common.event.FMLPostInitializationEvent; import net.minecraftforge.fml.common.event.FMLPreInitializationEvent; import net.minecraftforge.fml.common.registry.GameRegistry; public class CommonProxy implements IProxy { @Override public void preInit(FMLPreInitializationEvent event) {} @Override public void init(FMLInitializationEvent event) {} @Override public void postInit(FMLPostInitializationEvent event) {} public void init() { GameRegistry.registerWorldGenerator(new OreGen(), 0); } public void registerRenders() { } public EntityPlayer getPlayer() { return null; } public World getClientWorld() { return null; } @Override public void setExtraReach(EntityLivingBase entity, float reach) { if (entity instanceof EntityPlayerMP) ((EntityPlayerMP) entity).interactionManager.setBlockReachDistance(Math.max(11, reach)); } } 6. IProxy package me.mycustommod.proxy; import net.minecraft.entity.EntityLivingBase; import net.minecraft.world.World; import net.minecraftforge.fml.common.event.FMLInitializationEvent; import net.minecraftforge.fml.common.event.FMLPostInitializationEvent; import net.minecraftforge.fml.common.event.FMLPreInitializationEvent; public interface IProxy { void preInit(FMLPreInitializationEvent event); void init(FMLInitializationEvent event); void postInit(FMLPostInitializationEvent event); void setExtraReach(EntityLivingBase entity, float reach); } Thank you!
October 4, 20178 yr I'm trying to do something similar with identifying targeted Entities. Here's the code I have now: @Override public ActionResult<ItemStack> onItemRightClick(ItemStack itemStackIn, World worldIn, EntityPlayer player, EnumHand hand) { if(Minecraft.getMinecraft().objectMouseOver.entityHit != null){ Entity Target = Minecraft.getMinecraft().objectMouseOver.entityHit; if(Target instanceof EntityLiving){ } } } The code does what I want it to do but I have to be in very close proximity. What would I need to do to extend the reach for this?
October 5, 20178 yr I think both of your approaches won't work. Minecraft is built to prevent cheating. That means that the client doesn't get to decide what can be reached otherwise everyone would just put a client mod. So it is up to the server to determine the reach distance. The client can think it reached something but then the next time the server updates the client it will disallow it and things will get glitchy. So what you need to do is have the server process an alternate reach distance. I have a tutorial on how to do it here: http://jabelarminecraft.blogspot.com/p/minecraft-modding-extending-reach-of.html Check out my tutorials here: http://jabelarminecraft.blogspot.com/
October 5, 20178 yr Minecraft.getMinecraft() is client side only. You can't use it on the server. Apparently I'm a complete and utter jerk and come to this forum just like to make fun of people, be confrontational, and make your personal life miserable. If you think this is the case, JUST REPORT ME. Otherwise you're just going to get reported when you reply to my posts and point it out, because odds are, I was trying to be nice. Exception: If you do not understand Java, I WILL NOT HELP YOU and your thread will get locked. DO NOT PM ME WITH PROBLEMS. No help will be given.
October 5, 20178 yr Author Thanks guys! I just tweaked @jabelar 's tutorial to match my 1.10.2 version of code, and managed to make it happen!
Join the conversation
You can post now and register later. If you have an account, sign in now to post with your account.
Note: Your post will require moderator approval before it will be visible.