Jump to content

[1.10.2] Extending reach distance


Differentiation

Recommended Posts

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! :)

Link to comment
Share on other sites

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?

Link to comment
Share on other sites

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

  • Like 2

Check out my tutorials here: http://jabelarminecraft.blogspot.com/

Link to comment
Share on other sites

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.

Link to comment
Share on other sites

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.

Guest
Unfortunately, your content contains terms that we do not allow. Please edit your content to remove the highlighted words below.
Reply to this topic...

×   Pasted as rich text.   Restore formatting

  Only 75 emoji are allowed.

×   Your link has been automatically embedded.   Display as a link instead

×   Your previous content has been restored.   Clear editor

×   You cannot paste images directly. Upload or insert images from URL.

Announcements



×
×
  • Create New...

Important Information

By using this site, you agree to our Terms of Use.