Jump to content

Recommended Posts

Posted (edited)

I'm trying to add a feature to a mod (1.12.2 currently, and ideally 1.8.9 as well) which will allow me to spawn an entity (armor stand) and control its movement. For testing, I'm having the entity copy my movements, offset by x = 2. I need to do everything client-side because I want it to run on a server to which I don't have access. Here is a thread which I am running via a command. "player" is the command sender, "world" is Minecraft.getInstance().world, and "mil" is just the milliseconds between updates.

class EntityThread extends Thread {
	Entity player;
	int mil;
	World world;
	EntityThread(EntityPlayer player, World world, int mil) {
		this.player = player;
		this.mil = mil;
		this.world = world;
	}

	public void run() {
		if (this.world.isRemote == true) {
			TKRS.message("Not server side.");
		}
		double x = player.posX + 2;
		double y = player.posY;
		double z = player.posZ;
		double vx = player.motionX;
		double vy = player.motionY;
		double vz = player.motionZ;
		float yaw = player.rotationYaw;
		float pitch = player.rotationPitch;
		Entity entity = new net.minecraft.entity.item.EntityArmorStand(world, x, y, z);
		world.spawnEntity(entity);
		for (int i = 0; i < (int)(10000/mil); i++) {
			try {
				Thread.sleep(this.mil);
			} catch (InterruptedException e) {
				e.printStackTrace();
			}
			
			x = player.posX + 2;
			y = player.posY;
			z = player.posZ;
			vx = player.motionX;
			vy = player.motionY;
			vz = player.motionZ;
			yaw = player.rotationYaw;
			pitch = player.rotationPitch;
			
			entity.setLocationAndAngles(x, y, z, yaw, pitch);
			entity.setVelocity(vx, vy, vz);
			entity.velocityChanged = true;
			world.updateEntity(entity);
		}
		world.removeEntity(entity);
	}
}

This works OK both in single-player and on a server, except that it is very jittery because the position is only updating 20 times per second, and the velocity does not update at all. If I provide a server world to the EntityThread (only possible in singleplayer), it is smooth with velocity updates, but lags behind my movements for some reason (client-side world doesn't lag, just jittery).

 

So my question is, how can I update the velocity for an entity spawned on client-side, without significant lag? I've tried looking up how to simulate clientbound packets from a non-existent server to update the velocity, but no luck so far.

Edited by Solitary_Knight
  • Solitary_Knight changed the title to [1.12.2] Smooth Velocity for Client-Side Entity
Posted
  • Maybe using a different thread is iffy, but it's working perfectly fine for me so far.
  • I am spawning the entity client-side, so that statement isn't true. I can't interact with it, and that's fine, I just want to be able to control its visual movement, which I can do, just not smoothly.

I did get it able to be a little smoother by using .setLocationAndAngles() every tick, and .move() 5 times per tick, but a better solution would be appreciated.

Posted
1 hour ago, diesieben07 said:

It's not iffy, it is broken. It will break. And in unpredictable and seemingly inexplicable and strange ways.

 

The entity will behave strangely and this is in general not an intended use. If you want something to be client-side only use something other than entities, such as particles.

If a thread is going to break, do you have a recommendation for an alternative way to get/set player/entity position ~100 times per second?

I need the object which I am moving to be an armor stand (so that I can put a block on its head). I assume there is no such thing as a particle armor stand?

Posted
9 hours ago, Solitary_Knight said:

so that I can put a block on its head

Perhaps you just want to render a block there instead? I'm not sure exactly what your intent here is, but that might be what you're looking for.

Fancy 3D Graphing Calculator mod, with many different coordinate systems.

Lightweight 3D/2D position/vector transformations library, also with support for different coordinate systems.

Posted
9 hours ago, Solitary_Knight said:

I need the object which I am moving to be an armor stand (so that I can put a block on its head)

You realize that this entity you've created on the client side basically is a ghost, right? Nothing you do will ever show up on any other client's view of what you're doing. Placing a block "on" the armor stand won't take that block out of your inventory, etc.

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.

Posted

What are you trying to achieve, from a player’s perspective?

About Me

Spoiler

My Discord - Cadiboo#8887

My WebsiteCadiboo.github.io

My ModsCadiboo.github.io/projects

My TutorialsCadiboo.github.io/tutorials

Versions below 1.14.4 are no longer supported on this forum. Use the latest version to receive support.

When asking support remember to include all relevant log files (logs are found in .minecraft/logs/), code if applicable and screenshots if possible.

Only download mods from trusted sites like CurseForge (minecraft.curseforge.com). A list of bad sites can be found here, with more information available at stopmodreposts.org

Edit your own signature at www.minecraftforge.net/forum/settings/signature/ (Make sure to check its compatibility with the Dark Theme)

Posted

I think OP wants to create a visual effect of an armor stand. There is no need for interaction or synchronizing to other clients.

 

Entities are not meant to be used as client-side rendering techniques. Instead of spawning the entity in the client world, you should subscribe to RenderWorldLastEvent and manually render the armor stand there. One approach would be to create a static list of all the visual armor stand's data, and render ArmorStandEntity in RenderWorldLastEvent according to the list.

 

Then, instead of creating another thread to handle the updating, simply subscribe to ClientTickEvent and make a timer to determine when movements should be applied to the rendered armor stand.

  • Like 1

Some tips:

Spoiler

Modder Support:

Spoiler

1. Do not follow tutorials on YouTube, especially TechnoVision (previously called Loremaster) and HarryTalks, due to their promotion of bad practice and usage of outdated code.

2. Always post your code.

3. Never copy and paste code. You won't learn anything from doing that.

4. 

Quote

Programming via Eclipse's hotfixes will get you nowhere

5. Learn to use your IDE, especially the debugger.

6.

Quote

The "picture that's worth 1000 words" only works if there's an obvious problem or a freehand red circle around it.

Support & Bug Reports:

Spoiler

1. Read the EAQ before asking for help. Remember to provide the appropriate log(s).

2. Versions below 1.11 are no longer supported due to their age. Update to a modern version of Minecraft to receive support.

 

 

Posted
45 minutes ago, DavidM said:

I think OP wants to create a visual effect of an armor stand. There is no need for interaction or synchronizing to other clients.

 

Entities are not meant to be used as client-side rendering techniques. Instead of spawning the entity in the client world, you should subscribe to RenderWorldLastEvent and manually render the armor stand there. One approach would be to create a static list of all the visual armor stand's data, and render ArmorStandEntity in RenderWorldLastEvent according to the list.

 

Then, instead of creating another thread to handle the updating, simply subscribe to ClientTickEvent and make a timer to determine when movements should be applied to the rendered armor stand.

Yes, you are correct about what I am trying to do. Although I don't understand it completely yet, what you are suggesting sounds useful, and I'll try it. Thanks

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

    • 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)
    • When i join minecraft all ok, when i join world all working fine, but when i open indentity menu, i get this The game crashed whilst unexpected error Error: java.lang.NullPointerException: Cannot invoke "top.ribs.scguns.common.Gun$Projectile.getDamage()" because "this.projectile" is null crash report here https://paste.ee/p/0vKaf
  • Topics

×
×
  • Create New...

Important Information

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