Jump to content

[1.16.5] Player.attack not working with EntityRayTraceResult


Recommended Posts

I am creating a mod in which I need to extend the attack reach of the player without the player using an item like a sword. I got an amazing EntityRayTraceResult variable from someone on the forums, and that is what you can see in the middle of my code. The RayTraceResult gets the entity successfully, and it is printed in the console, but I am having trouble getting the player to actually attack the entity.

@EventBusSubscriber(modid = TitanShiftersMod.MOD_ID, bus = Bus.FORGE)
public class EntityReachExtender {
	private static double range;
	public static void setEntityRange(double r) {
		range = r * 80;
	public static double getEntityRange() {
		return range;
	public static EntityRayTraceResult getPlayerPOVHitResult(PlayerEntity player) {
		  float playerRotX = player.xRot;
		  float playerRotY = player.yRot;
		  Vector3d startPos = player.getEyePosition(1);
		  float f2 = (float) Math.cos(-playerRotY * ((float)Math.PI / 180F) - (float)Math.PI);
		  float f3 = (float) Math.sin(-playerRotY * ((float)Math.PI / 180F) - (float)Math.PI);
		  float f4 = (float) -Math.cos(-playerRotX * ((float)Math.PI / 180F));
		  float additionY = (float) Math.sin(-playerRotX * ((float)Math.PI / 180F));
		  float additionX = f3 * f4;
		  float additionZ = f2 * f4;
		  double d0 = range;
		  Vector3d endVec = startPos.add((double)additionX * d0, (double)additionY * d0, (double)additionZ * d0);
		  AxisAlignedBB startEndBox = new AxisAlignedBB(startPos, endVec);
		  Entity entity = null;
		  for(Entity entity1 : player.level.getEntities(player, startEndBox, (val) -> true)) {
			AxisAlignedBB aabb = entity1.getBoundingBox().inflate(entity1.getPickRadius());
			Optional<Vector3d> optional = aabb.clip(startPos, endVec);
		    if (aabb.contains(startPos)) {
		      if (d0 >= 0.0D) {
		        entity = entity1;
		        startPos = optional.orElse(startPos);
		        d0 = 0.0D;
		    } else if (optional.isPresent()) {
		      Vector3d vec31 = optional.get();
		      double d1 = startPos.distanceToSqr(vec31);
		      if (d1 < d0 || d0 == 0.0D) {
		        if (entity1.getRootVehicle() == player.getRootVehicle() && !entity1.canRiderInteract()) {
		          if (d0 == 0.0D) {
		            entity = entity1;
		            startPos = vec31;
		        } else {
		          entity = entity1;
		          startPos = vec31;
		          d0 = d1;

		  return (entity == null) ? null:new EntityRayTraceResult(entity);

	public void entityReach(LeftClickEmpty event) {
		LazyOptional<ITitanShifters> titan = event.getPlayer().getCapability(TitanShiftersProvider.TITAN_SHIFTERS_CAPABILITY, TitanShiftersMod.direction);
		ITitanShifters titanShifter = titan.orElse(new TitanShifters());
		EntityRayTraceResult t = getPlayerPOVHitResult(event.getPlayer());
		if(titanShifter.getPureTitan()) {
			if(t != null) {
				if(t.getEntity() != null) {

The entity gets printed out successfully, but the entity does not get damaged. I have tried using a packet to make the player attack the entity on the server side, but that did not work. I got the same results as I am getting with this code.

Link to comment
Share on other sites

8 hours ago, poopoodice said:

Maybe something's wrong with your packet?

That's probably it. I've never used packets before, so I am not very familiar with how they work.

Here's my network:

public class TitanShiftersNetwork {

	public static final String NETWORK_VERSION = "0.1.0";
	public static final SimpleChannel CHANNEL = NetworkRegistry.newSimpleChannel(new ResourceLocation(TitanShiftersMod.MOD_ID, "network"),
			() -> NETWORK_VERSION, version -> version.equals(NETWORK_VERSION), version -> version.equals(NETWORK_VERSION));
	public static void init() {
		CHANNEL.registerMessage(0, InputMessage.class, InputMessage::encode, InputMessage::decode, InputMessage::handle);

And here's my Input Message:

public class InputMessage {
	private static Entity entity;
	public InputMessage() {
	public InputMessage(Entity e) {
		entity = e;
	public static void encode(InputMessage message, PacketBuffer buffer) {
	public static InputMessage decode(PacketBuffer buffer) {
		return new InputMessage(entity);
	public static void handle(InputMessage message, Supplier<NetworkEvent.Context> contextSupplier) {
		NetworkEvent.Context context = contextSupplier.get();
		context.enqueueWork(() -> {
			ServerPlayerEntity player = context.getSender();

And here's how I send a packet through to the server:

TitanShiftersNetwork.CHANNEL.sendToServer(new InputMessage(t.getEntity()));

This packet prints out the "Working!" line into the console, but does not attack the entity. Any help is much appreciated, thanks!

Link to comment
Share on other sites

2 hours ago, Luis_ST said:

the implementation of encode and decode is wrong,
in encode you need to write the Entity to the PacketBuffer
and in decode you need to read the Entity from the PacketBuffer

the entity field should als be non static and final

Thanks for the reply. How would I read and write the entity? I remember only having the methods of readint or writeint, readfloat or writefloat, etc. (only primal variables) how would I go about doing this but with an entity?

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.

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.


  • Create New...

Important Information

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