Jump to content

Recommended Posts

Posted

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);

	}
	
	@SubscribeEvent
	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) {
					System.out.println(t.getEntity());
					event.getPlayer().attack(t.getEntity());
				}
			}
		}
	}
}

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.

Posted
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();
			
			player.attack(entity);
			
          	System.out.println("Working!");
		});
		context.setPacketHandled(true);
	}
}

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!

Posted

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

Posted
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?

Posted
1 hour ago, diesieben07 said:

Entities have a network ID for precisely this reason. It can be used to identify an entity across the network. Use Entity#getId and World#getEntity(int).

Thanks for the suggestion, I’ll try it out when I can.

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



  • Recently Browsing

    • No registered users viewing this page.
  • Posts

    • What in particular? I barely used that mod this time around, and it's never been a problem in the past.
    • Im trying to build my mod using shade since i use the luaj library however i keep getting this error Reason: Task ':reobfJar' uses this output of task ':shadowJar' without declaring an explicit or implicit dependency. This can lead to incorrect results being produced, depending on what order the tasks are executed. So i try adding reobfJar.dependsOn shadowJar  Could not get unknown property 'reobfJar' for object of type org.gradle.api.internal.artifacts.dsl.dependencies.DefaultDependencyHandler. my gradle file plugins { id 'eclipse' id 'idea' id 'maven-publish' id 'net.minecraftforge.gradle' version '[6.0,6.2)' id 'com.github.johnrengelman.shadow' version '7.1.2' id 'org.spongepowered.mixin' version '0.7.+' } apply plugin: 'net.minecraftforge.gradle' apply plugin: 'org.spongepowered.mixin' apply plugin: 'com.github.johnrengelman.shadow' version = mod_version group = mod_group_id base { archivesName = mod_id } // Mojang ships Java 17 to end users in 1.18+, so your mod should target Java 17. java.toolchain.languageVersion = JavaLanguageVersion.of(17) //jarJar.enable() println "Java: ${System.getProperty 'java.version'}, JVM: ${System.getProperty 'java.vm.version'} (${System.getProperty 'java.vendor'}), Arch: ${System.getProperty 'os.arch'}" minecraft { mappings channel: mapping_channel, version: mapping_version copyIdeResources = true runs { configureEach { workingDirectory project.file('run') property 'forge.logging.markers', 'REGISTRIES' property 'forge.logging.console.level', 'debug' arg "-mixin.config=derp.mixin.json" mods { "${mod_id}" { source sourceSets.main } } } client { // Comma-separated list of namespaces to load gametests from. Empty = all namespaces. property 'forge.enabledGameTestNamespaces', mod_id } server { property 'forge.enabledGameTestNamespaces', mod_id args '--nogui' } gameTestServer { property 'forge.enabledGameTestNamespaces', mod_id } data { workingDirectory project.file('run-data') args '--mod', mod_id, '--all', '--output', file('src/generated/resources/'), '--existing', file('src/main/resources/') } } } sourceSets.main.resources { srcDir 'src/generated/resources' } repositories { flatDir { dirs './libs' } maven { url = "https://jitpack.io" } } configurations { shade implementation.extendsFrom shade } dependencies { minecraft "net.minecraftforge:forge:${minecraft_version}-${forge_version}" implementation 'org.luaj:luaj-jse-3.0.2' implementation fg.deobf("com.github.Virtuoel:Pehkui:${pehkui_version}") annotationProcessor 'org.spongepowered:mixin:0.8.5:processor' minecraftLibrary 'luaj:luaj-jse:3.0.2' shade 'luaj:luaj-jse:3.0.2' } // Example for how to get properties into the manifest for reading at runtime. tasks.named('jar', Jar).configure { manifest { attributes([ 'Specification-Title' : mod_id, 'Specification-Vendor' : mod_authors, 'Specification-Version' : '1', // We are version 1 of ourselves 'Implementation-Title' : project.name, 'Implementation-Version' : project.jar.archiveVersion, 'Implementation-Vendor' : mod_authors, 'Implementation-Timestamp': new Date().format("yyyy-MM-dd'T'HH:mm:ssZ"), "TweakClass" : "org.spongepowered.asm.launch.MixinTweaker", "TweakOrder" : 0, "MixinConfigs" : "derp.mixin.json" ]) } rename 'mixin.refmap.json', 'derp.mixin-refmap.json' } shadowJar { archiveClassifier = '' configurations = [project.configurations.shade] finalizedBy 'reobfShadowJar' } assemble.dependsOn shadowJar reobf { re shadowJar {} } publishing { publications { mavenJava(MavenPublication) { artifact jar } } repositories { maven { url "file://${project.projectDir}/mcmodsrepo" } } }  
    • All versions of Minecraft Forge suddenly black screen even without mods (tried reinstalling original Minecraft, Java, updating drivers doesn't work)
  • Topics

×
×
  • Create New...

Important Information

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