From 70a7e60c6f5728c1cc4396200df95662c0a2a4d7 Mon Sep 17 00:00:00 2001 From: James Hall Date: Mon, 30 Sep 2024 10:24:19 +0100 Subject: [PATCH] feat: sentry suit can be walked into from behind --- .../timeless/suit/ironman/IronManEntity.java | 42 +++++++++++++++++++ 1 file changed, 42 insertions(+) diff --git a/src/main/java/mc/duzo/timeless/suit/ironman/IronManEntity.java b/src/main/java/mc/duzo/timeless/suit/ironman/IronManEntity.java index d6644b5..57b4a5d 100644 --- a/src/main/java/mc/duzo/timeless/suit/ironman/IronManEntity.java +++ b/src/main/java/mc/duzo/timeless/suit/ironman/IronManEntity.java @@ -5,10 +5,12 @@ import net.minecraft.entity.EntityType; import net.minecraft.entity.EquipmentSlot; import net.minecraft.entity.LivingEntity; +import net.minecraft.entity.damage.DamageSource; import net.minecraft.entity.data.DataTracker; import net.minecraft.entity.data.TrackedData; import net.minecraft.entity.data.TrackedDataHandlerRegistry; import net.minecraft.entity.player.PlayerEntity; +import net.minecraft.entity.projectile.ProjectileUtil; import net.minecraft.item.ItemStack; import net.minecraft.nbt.NbtCompound; import net.minecraft.server.network.ServerPlayerEntity; @@ -16,13 +18,16 @@ import net.minecraft.util.Arm; import net.minecraft.util.Hand; import net.minecraft.util.Identifier; +import net.minecraft.util.hit.EntityHitResult; import net.minecraft.util.math.Vec3d; import net.minecraft.world.World; import java.util.List; +import java.util.Optional; public class IronManEntity extends LivingEntity { // todo - PathAwareEntity for sentry mode private static final TrackedData SUIT = DataTracker.registerData(IronManEntity.class, TrackedDataHandlerRegistry.STRING); + private int cooldown = 0; public IronManEntity(EntityType entityType, World world) { super(entityType, world); @@ -31,6 +36,7 @@ public IronManEntity(World world, IronManSuit suit) { this(Register.Entities.IRON_MAN, world); this.setSuit(suit); + this.cooldown = 60; } public IronManEntity(World world, IronManSuit suit, Vec3d pos, float yaw, float pitch) { this(world, suit); @@ -65,6 +71,42 @@ public ActionResult interact(PlayerEntity player, Hand hand) { return success ? ActionResult.SUCCESS : ActionResult.FAIL; } + @Override + public void tick() { + super.tick(); + + if (!this.getWorld().isClient()){ + if (this.cooldown > 0) { + this.cooldown--; + } else { + this.tryApply(); + } + } + } + + private void tryApply() { + PlayerEntity found = findNearbyPlayer().orElse(null); + + if (found == null) return; + + boolean success = this.getSuit().getSet().wear(found); + + if (success) { + this.discard(); + } + } + + private Optional findNearbyPlayer() { + EntityHitResult ray = ProjectileUtil.getEntityCollision(this.getWorld(), this, this.getPos(), this.getPos().offset(this.getMovementDirection().getOpposite(), 0.25f).add(0, 1.5, 0), this.getBoundingBox().stretch(this.getVelocity()).expand(1.0), (entity -> (entity instanceof PlayerEntity)));; + if (ray == null) return Optional.empty(); + return Optional.of((PlayerEntity) ray.getEntity()); + } + + @Override + public boolean damage(DamageSource source, float amount) { + return false; + } + @Override protected void initDataTracker() { super.initDataTracker();