Jump to content

[1.12.2] Making player move/float towards certain destination


Naomiora

Recommended Posts

Basically what the title says, cancelling WASD and Spacebar keys. Then make the player float/move towards a certain destination. I got it to work for entities such as a cow or skeleton etc. the code I currently use to move an entity towards a location (in this case the location is another entity) is this:

 

	public void pullEntityToEntity(Entity entity, Entity secondEntity, double moveFactor) {
		double distX = entity.posX - secondEntity.posX;
		double distZ = entity.posZ - secondEntity.posZ;
		double dir = MathHelper.atan2(distZ, distX);
		double speed = 1f / secondEntity.getDistance(entity.posX, entity.posY, entity.posZ) * moveFactor;

		secondEntity.motionX = MathHelper.cos((float) dir) * speed;
		secondEntity.motionZ = MathHelper.sin((float) dir) * speed;
	}

 

 

the code I use to freeze certain entities is:

 

	public void freezeEntity(Entity entity) {
		entity.setVelocity(0, 0, 0);
		if (entity.prevPosX != entity.posX || entity.prevPosY != entity.posY || entity.prevPosZ != entity.posZ) {
			entity.posX = entity.prevPosX;
			entity.posY = entity.prevPosY;
			entity.posZ = entity.prevPosZ;
		}
    }

 

 

I also tried a simple network message to disable the WASD and spacebar key, which eventually turned out not to work.

 

I googled around why I couldn't change the entityplayer's position + velocity but I could not find why. The code above does work for other entities that isn't a EntityPlayer.

 

 

Thanks for reading and possibly your help! ^^

Link to comment
Share on other sites

	@SubscribeEvent
	public static void inputListener(InputUpdateEvent event) {
		if(ClientModule.isFrozen) {
			event.getMovementInput().moveStrafe = 0;
			event.getMovementInput().backKeyDown = false;
			event.getMovementInput().forwardKeyDown = false;
			event.getMovementInput().jump = false;
			event.getMovementInput().leftKeyDown = false;
			event.getMovementInput().rightKeyDown = false;
		}
	}

 

 

It does freeze most of my movement keys, except for my forwardkey and backkey. why do exactly those 2 keys still work?

Link to comment
Share on other sites

22 minutes ago, diesieben07 said:

Maybe you should set MovementInput#moveForward to 0 as well.

Oh, I didn't see that one! Ill look better next time! Thank you! Now the freezing part is solved, but how do I make the player float/move towards the certain location though? The code I currently have only works on Living AI-entities. Do I do that part in the InputUpdateEvent? I don't think so, if so thats gonna be alot of hard work xD

Edited by Naomiora
Link to comment
Share on other sites

48 minutes ago, diesieben07 said:

You'll have to adjust the position every tick. There is no "automatic movement" for players.

So something like this:
 

	public void pullEntityToEntity(Entity entity, Entity secondEntity, double moveFactor) {
		double distX = entity.posX - secondEntity.posX;
		double distZ = entity.posZ - secondEntity.posZ;
		double dir = MathHelper.atan2(distZ, distX);
		double speed = 1f / secondEntity.getDistance(entity.posX, entity.posY, entity.posZ) * moveFactor;

		secondEntity.motionX = MathHelper.cos((float) dir) * speed;
		secondEntity.motionZ = MathHelper.sin((float) dir) * speed;
	}

 

shouldn't work for an EntityPlayer? (secondEntity is the EntityPlayer in this case) If you think it should work, it doesn't for me. All it does is nothing, it does get casted though.

Link to comment
Share on other sites

You can use linear interpolation to smoothly move between two points. You will need the original start position, the final destination position and the amount between them the player should be. 

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)

Link to comment
Share on other sites

  • 2 weeks later...
On 3/25/2019 at 4:24 AM, Cadiboo said:

You can use linear interpolation to smoothly move between two points. You will need the original start position, the final destination position and the amount between them the player should be. 

Sorry for the horribly late reply, I tried doing this but I already knew maths wasn't my strongest part in life. I couldn't get it to work, and eventually recoded parts of my mod because I thought the reason why it didn't work was because of some other parts affecting the entities movement etc etc. So sorry for asking more help into the linear interpolation part, but could you explain how that'd work?

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



  • Recently Browsing

    • No registered users viewing this page.
  • Posts

    • This is now replaced in the latest version, under Advanced Settings. Not available under the registry anymore.
    • You have to set the java path in your start script
    • i tried that and i got rid of java to install the new one but it still says i have the old one and i cant get the new one because of the old one  
    • I created a boss for Minecraft and when is it called «An unexpected error occurred while trying to run this command» "net.minecraft.world.entity.ai.attributes.attribute instance.m_22100_ (double)" because the return value "net.minecraft.world.entity.monster.zombie.m_21051_(net.minecraft.world.entity.ai.attributes.attribute)" is null. I don't fully understand what the error is. But it seems to be related to attributes. Please help me figure it out   Here is the boss class itself: package org.mymod.afraid; import net.minecraft.world.entity.EntityType; import net.minecraft.world.entity.EquipmentSlot; import net.minecraft.world.entity.ai.attributes.AttributeSupplier; import net.minecraft.world.entity.ai.attributes.Attributes; import net.minecraft.world.entity.ai.goal.*; import net.minecraft.world.entity.ai.goal.target.HurtByTargetGoal; import net.minecraft.world.entity.ai.goal.target.NearestAttackableTargetGoal; import net.minecraft.world.entity.monster.Zombie; import net.minecraft.world.entity.player.Player; import net.minecraft.world.item.ItemStack; import net.minecraft.world.item.Items; import net.minecraft.world.level.Level; import net.minecraft.world.damagesource.DamageSource; import net.minecraft.world.phys.Vec3; import net.minecraft.core.BlockPos; import net.minecraft.world.level.block.Blocks; import net.minecraft.world.entity.projectile.SmallFireball; import org.jetbrains.annotations.NotNull; public class AfraidBoss extends Zombie { private static final int MAX_HEALTH = 1000; private static final double ATTACK_DAMAGE = 10.0D; private static final double FOLLOW_RANGE = 50.0D; private static final double ATTACK_KNOCKBACK = 1.0D; private static final double MOVEMENT_SPEED = 0.25D; private static final int TELEPORT_RADIUS = 20; private static final int FIREBALL_COOLDOWN = 100; // 5 seconds (20 ticks per second) private static final int FIREBALL_COUNT = 3; private int fireballCooldown = 0; private int fireDashCooldown = 0; public AfraidBoss(EntityType<? extends Zombie> type, Level level) { super(type, level); this.setHealth(MAX_HEALTH); this.setItemSlot(EquipmentSlot.MAINHAND, new ItemStack(Items.DIAMOND_SWORD)); this.setItemSlot(EquipmentSlot.OFFHAND, new ItemStack(Items.DIAMOND_SWORD)); } @Override protected void registerGoals() { this.goalSelector.addGoal(1, new MeleeAttackGoal(this, 1.0, true)); this.goalSelector.addGoal(2, new MoveTowardsTargetGoal(this, 1.0, (float) TELEPORT_RADIUS)); this.goalSelector.addGoal(3, new LookAtPlayerGoal(this, Player.class, 8.0F)); this.goalSelector.addGoal(4, new WaterAvoidingRandomStrollGoal(this, 1.0)); this.goalSelector.addGoal(5, new HurtByTargetGoal(this)); this.targetSelector.addGoal(1, new NearestAttackableTargetGoal<>(this, Player.class, true)); } @Override public void aiStep() { super.aiStep(); if (this.getTarget() instanceof Player) { Player player = (Player) this.getTarget(); double distanceToPlayer = this.distanceToSqr(player); // Fire Dash ability if (distanceToPlayer <= TELEPORT_RADIUS * TELEPORT_RADIUS && fireDashCooldown == 0) { this.fireDash(player); fireDashCooldown = 200; // Cooldown for fire dash (10 seconds) } // Fireball attack if (fireballCooldown == 0) { this.shootFireballs(player); fireballCooldown = FIREBALL_COOLDOWN; // Cooldown for fireball attack (5 seconds) } // Decrement cooldowns if (fireDashCooldown > 0) { fireDashCooldown--; } if (fireballCooldown > 0) { fireballCooldown--; } } } private void fireDash(Player player) { Vec3 direction = player.position().subtract(this.position()).normalize(); Vec3 newPos = this.position().add(direction.scale(10)); this.teleportTo(newPos.x, newPos.y, newPos.z); this.createFireTrail(newPos); player.hurt(DamageSource.mobAttack(this), 20.0F); // Damage the player } private void createFireTrail(Vec3 position) { for (int x = -2; x <= 2; x++) { for (int z = -2; z <= 2; z++) { BlockPos firePos = new BlockPos(position.x + x, position.y, position.z + z); this.level.setBlock(firePos, Blocks.FIRE.defaultBlockState(), 11); } } } private void shootFireballs(Player player) { Vec3 direction = player.position().subtract(this.position()).normalize(); for (int i = 0; i < FIREBALL_COUNT; i++) { SmallFireball fireball = new SmallFireball(this.level, this, direction.x, direction.y, direction.z); fireball.setPos(this.getX() + direction.x, this.getY() + direction.y, this.getZ() + direction.z); this.level.addFreshEntity(fireball); } } public static AttributeSupplier.Builder createAttributes() { return Zombie.createMobAttributes() .add(Attributes.MAX_HEALTH, MAX_HEALTH) .add(Attributes.ATTACK_DAMAGE, ATTACK_DAMAGE) .add(Attributes.FOLLOW_RANGE, FOLLOW_RANGE) .add(Attributes.ATTACK_KNOCKBACK, ATTACK_KNOCKBACK) .add(Attributes.MOVEMENT_SPEED, MOVEMENT_SPEED); } @Override public boolean hurt(@NotNull DamageSource source, float amount) { boolean flag = super.hurt(source, amount); if (flag && source.getEntity() instanceof Player) { Player player = (Player) source.getEntity(); if (this.random.nextInt(10) == 0) { this.teleportAndAttack(player); } } return flag; } private void teleportAndAttack(Player player) { Vec3 randomPos = player.position().add((this.random.nextDouble() - 0.5) * 4, 0, (this.random.nextDouble() - 0.5) * 4); if (this.randomTeleport(randomPos.x, randomPos.y, randomPos.z, true)) { player.hurt(DamageSource.mobAttack(this), 10.0F); // Damage the player } } }  
  • Topics

×
×
  • Create New...

Important Information

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