Jump to content
Search In
  • More options...
Find results that contain...
Find results in...

[1.16.5] How to make my Entity invincible to any type of damage


alowave
 Share

Recommended Posts

Hello, my question explained in title, there is my entity class:

Spoiler
public class JumpingBlockEntity extends MobEntity implements IMob {
    private static final DataParameter<Float> ENTITY_SIZE;
    public float squishAmount;
    public float squishFactor;
    public float prevSquishFactor;
    private boolean wasOnGround;

    public JumpingBlockEntity(EntityType<? extends JumpingBlockEntity> p_i48552_1_, World p_i48552_2_) {
        super(p_i48552_1_, p_i48552_2_);
        this.moveController = new JumpingBlockEntity.MoveHelperController(this);
    }

    @Override
    public CreatureAttribute getCreatureAttribute() {
        return CreatureAttribute.UNDEAD;
    }

    public static AttributeModifierMap.MutableAttribute setCustomAttributes() {
        return MobEntity.func_233666_p_()
                .createMutableAttribute(Attributes.MAX_HEALTH,39.0D)
                .createMutableAttribute(Attributes.MOVEMENT_SPEED,1.6D);

    }

    protected void registerGoals() {
        this.goalSelector.addGoal(1, new JumpingBlockEntity.FloatGoal(this));
        this.goalSelector.addGoal(2, new JumpingBlockEntity.FaceRandomGoal(this));
        this.goalSelector.addGoal(4, new JumpingBlockEntity.HopGoal(this));
    }

    protected void registerData() {
        super.registerData();
        this.dataManager.register(ENTITY_SIZE, 0.5F);
    }

    protected void setSlimeSize(float p_70799_1_, boolean p_70799_2_) {
        this.dataManager.set(ENTITY_SIZE, p_70799_1_);
        this.recenterBoundingBox();
        this.recalculateSize();
        this.getAttribute(Attributes.MAX_HEALTH).setBaseValue(p_70799_1_ * p_70799_1_);
        this.getAttribute(Attributes.MOVEMENT_SPEED).setBaseValue(0.2F + 0.1F * p_70799_1_);

        if (p_70799_2_) {
            this.setHealth(this.getMaxHealth());
        }

        this.experienceValue = 0;
    }

    public float getEntitySize() {
        return this.dataManager.get(ENTITY_SIZE);
    }

    public void writeAdditional(CompoundNBT p_213281_1_) {
        super.writeAdditional(p_213281_1_);
        p_213281_1_.putInt("Size", (int) (this.getEntitySize() - 1));
        p_213281_1_.putBoolean("wasOnGround", this.wasOnGround);
    }

    public void readAdditional(CompoundNBT p_70037_1_) {
        int i = p_70037_1_.getInt("Size");
        if (i < 0) {
            i = 0;
        }

        this.setSlimeSize(i + 1, false);
        super.readAdditional(p_70037_1_);
        this.wasOnGround = p_70037_1_.getBoolean("wasOnGround");
    }

    public boolean isSmallSlime() {
        return this.getEntitySize() <= 1;
    }

    protected IParticleData getSquishParticle() {
        return ParticleTypes.ITEM_SLIME;
    }

    protected boolean isDespawnPeaceful() {
        return this.getEntitySize() > 0;
    }

    public void tick() {
        this.squishFactor += (this.squishAmount - this.squishFactor) * 0.5F;
        this.prevSquishFactor = this.squishFactor;
        super.tick();
        if (this.onGround && !this.wasOnGround) {
            float i = this.getEntitySize();
            if (this.spawnCustomParticles()) {
                i = 0;
            }

            for(int j = 0; j < i * 8; ++j) {
                float f = this.rand.nextFloat() * 6.2831855F;
                float f1 = this.rand.nextFloat() * 0.5F + 0.5F;
                float f2 = MathHelper.sin(f) * (float)i * 0.5F * f1;
                float f3 = MathHelper.cos(f) * (float)i * 0.5F * f1;
                this.world.addParticle(this.getSquishParticle(), this.getPosX() + (double)f2, this.getPosY(), this.getPosZ() + (double)f3, 0.0D, 0.0D, 0.0D);
            }

            this.playSound(this.getSquishSound(), this.getSoundVolume(), ((this.rand.nextFloat() - this.rand.nextFloat()) * 0.2F + 1.0F) / 0.8F);
            this.squishAmount = -0.5F;
        } else if (!this.onGround && this.wasOnGround) {
            this.squishAmount = 1.0F;
        }

        this.wasOnGround = this.onGround;
        this.alterSquishAmount();
    }

    protected void alterSquishAmount() {
        this.squishAmount *= 0.6F;
    }

    protected int getJumpDelay() {
        return this.rand.nextInt(20) + 10;
    }

    public void recalculateSize() {
        double d0 = this.getPosX();
        double d1 = this.getPosY();
        double d2 = this.getPosZ();
        super.recalculateSize();
        this.setPosition(d0, d1, d2);
    }

    public void notifyDataManagerChange(DataParameter<?> p_184206_1_) {
        if (ENTITY_SIZE.equals(p_184206_1_)) {
            this.recalculateSize();
            this.rotationYaw = this.rotationYawHead;
            this.renderYawOffset = this.rotationYawHead;
            if (this.isInWater() && this.rand.nextInt(20) == 0) {
                this.doWaterSplashEffect();
            }
        }

        super.notifyDataManagerChange(p_184206_1_);
    }

    public EntityType<? extends JumpingBlockEntity> getType() {
        return (EntityType<? extends JumpingBlockEntity>) super.getType();
    }

    public void remove(boolean p_remove_1_) {
        super.remove(p_remove_1_);
    }

    public void applyEntityCollision(Entity p_70108_1_) {
    }

    public void onCollideWithPlayer(PlayerEntity p_70100_1_) {

    }

    protected float getStandingEyeHeight(Pose p_213348_1_, EntitySize p_213348_2_) {
        return 0.625F * p_213348_2_.height;
    }

    protected SoundEvent getHurtSound(DamageSource p_184601_1_) {
        return this.isSmallSlime() ? SoundEvents.ENTITY_SLIME_HURT_SMALL : SoundEvents.ENTITY_SLIME_HURT;
    }

    protected SoundEvent getDeathSound() {
        return this.isSmallSlime() ? SoundEvents.ENTITY_SLIME_DEATH_SMALL : SoundEvents.ENTITY_SLIME_DEATH;
    }

    protected SoundEvent getSquishSound() {
        return this.isSmallSlime() ? SoundEvents.ENTITY_SLIME_SQUISH_SMALL : SoundEvents.ENTITY_SLIME_SQUISH;
    }

    protected float getSoundVolume() {
        return 0.4F * this.getEntitySize();
    }

    public int getVerticalFaceSpeed() {
        return 0;
    }

    protected void jump() {
        Vector3d vector3d = this.getMotion();
        this.setMotion(vector3d.x, this.getJumpUpwardsMotion(), vector3d.z);
        this.isAirBorne = true;
    }

    @Nullable
    public ILivingEntityData onInitialSpawn(IServerWorld serverWorld, DifficultyInstance difficultyInstance, SpawnReason spawnReason, @Nullable ILivingEntityData livingEntityData, @Nullable CompoundNBT compoundNBT) {
        Eatgoodgaintool.LOGGER.info(spawnReason == SpawnReason.NATURAL);

        return super.onInitialSpawn(serverWorld, difficultyInstance, spawnReason, livingEntityData, compoundNBT);
    }

    protected SoundEvent getJumpSound() {
        return this.isSmallSlime() ? SoundEvents.ENTITY_SLIME_JUMP_SMALL : SoundEvents.ENTITY_SLIME_JUMP;
    }

    public EntitySize getSize(Pose p_213305_1_) {
        return super.getSize(p_213305_1_).scale(0.255F * (float)this.getEntitySize());
    }

    protected boolean spawnCustomParticles() {
        return false;
    }

    static {
        ENTITY_SIZE = EntityDataManager.createKey(JumpingBlockEntity.class, DataSerializers.FLOAT);
    }

    static class MoveHelperController extends MovementController {
        private float yRot;
        private int jumpDelay;
        private final JumpingBlockEntity slime;
        private boolean isAggressive;

        public MoveHelperController(JumpingBlockEntity p_i45821_1_) {
            super(p_i45821_1_);
            this.slime = p_i45821_1_;
            this.yRot = 180.0F * p_i45821_1_.rotationYaw / 3.1415927F;
        }

        public void setDirection(float p_179920_1_, boolean p_179920_2_) {
            this.yRot = p_179920_1_;
            this.isAggressive = p_179920_2_;
        }

        public void setSpeed(double p_179921_1_) {
            this.speed = p_179921_1_;
            this.action = Action.MOVE_TO;
        }

        public void tick() {
            this.mob.rotationYaw = this.limitAngle(this.mob.rotationYaw, this.yRot, 90.0F);
            this.mob.rotationYawHead = this.mob.rotationYaw;
            this.mob.renderYawOffset = this.mob.rotationYaw;
            if (this.action != Action.MOVE_TO) {
                this.mob.setMoveForward(0.0F);
            } else {
                this.action = Action.WAIT;
                if (this.mob.isOnGround()) {
                    this.mob.setAIMoveSpeed((float)(this.speed * this.mob.getAttributeValue(Attributes.MOVEMENT_SPEED)));
                    if (this.jumpDelay-- <= 0) {
                        this.jumpDelay = this.slime.getJumpDelay();
                        if (this.isAggressive) {
                            this.jumpDelay /= 3;
                        }

                        this.slime.getJumpController().setJumping();

                        this.slime.playSound(this.slime.getJumpSound(), this.slime.getSoundVolume(), 0.8F);
                    } else {
                        this.slime.moveStrafing = 0.0F;
                        this.slime.moveForward = 0.0F;
                        this.mob.setAIMoveSpeed(0.0F);
                    }
                } else {
                    this.mob.setAIMoveSpeed((float)(this.speed * this.mob.getAttributeValue(Attributes.MOVEMENT_SPEED)));
                }
            }

        }
    }

    static class HopGoal extends Goal {
        private final JumpingBlockEntity slime;

        public HopGoal(JumpingBlockEntity p_i45822_1_) {
            this.slime = p_i45822_1_;
            this.setMutexFlags(EnumSet.of(Flag.JUMP, Flag.MOVE));
        }

        public boolean shouldExecute() {
            return !this.slime.isPassenger();
        }

        public void tick() {
            ((JumpingBlockEntity.MoveHelperController)this.slime.getMoveHelper()).setSpeed(1.0D);
        }
    }

    static class FloatGoal extends Goal {
        private final JumpingBlockEntity slime;

        public FloatGoal(JumpingBlockEntity p_i45823_1_) {
            this.slime = p_i45823_1_;
            this.setMutexFlags(EnumSet.of(Flag.JUMP, Flag.MOVE));
            p_i45823_1_.getNavigator().setCanSwim(true);
        }

        public boolean shouldExecute() {
            return (this.slime.isInWater() || this.slime.isInLava()) && this.slime.getMoveHelper() instanceof JumpingBlockEntity.MoveHelperController;
        }

        public void tick() {
            if (this.slime.getRNG().nextFloat() < 0.8F) {
                this.slime.getJumpController().setJumping();
            }

            ((JumpingBlockEntity.MoveHelperController)this.slime.getMoveHelper()).setSpeed(1.2D);
        }
    }

    static class FaceRandomGoal extends Goal {
        private final JumpingBlockEntity block;
        private float chosenDegrees;
        private int nextRandomizeTime;

        public FaceRandomGoal(JumpingBlockEntity p_i45820_1_) {
            this.block = p_i45820_1_;
            this.setMutexFlags(EnumSet.of(Flag.LOOK));
        }

        public boolean shouldExecute() {
            return this.block.getAttackTarget() == null && (this.block.onGround || this.block.isInWater() || this.block.isInLava() || this.block.isPotionActive(Effects.LEVITATION)) && this.block.getMoveHelper() instanceof JumpingBlockEntity.MoveHelperController;
        }

        public void tick() {
            if (--this.nextRandomizeTime <= 0) {
                this.nextRandomizeTime = 40 + this.block.getRNG().nextInt(60);
                this.chosenDegrees = (float)this.block.getRNG().nextInt(360);
            }

            ((JumpingBlockEntity.MoveHelperController)this.block.getMoveHelper()).setDirection(this.chosenDegrees, false);
        }
    }
}

 


 

So, little introducion, i want to make entity, that always be following player and it's have texture of specific block, now i need to make it invincible and neutral to all mobs, i figured out how to make my entity neutral, but can't understand how to make it invincible. (i take codebase from SlimeEntity)

Link to comment
Share on other sites

Override the hurt method, check if the source that's passed isn't DamageSource.OUT_OF_WORLD (this is in order to allow your entity to be killed via commands or the void) and then return false. If the check is false then just return call to the hurt method in the super class.

Link to comment
Share on other sites

12 hours ago, uSkizzik said:

Override the hurt method, check if the source that's passed isn't DamageSource.OUT_OF_WORLD (this is in order to allow your entity to be killed via commands or the void) and then return false. If the check is false then just return call to the hurt method in the super class.

unknown.png

Can't see that method lol

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
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.

 Share



  • Recently Browsing

    No registered users viewing this page.

  • Posts

    • @EventBusSubscriber(modid=ElderNorseGods.MOD_ID, bus=EventBusSubscriber.Bus.FORGE) public abstract class ENGCapabilities { @SubscribeEvent public static void registerCapabilities(final FMLCommonSetupEvent event) { CapabilityManager.INSTANCE.register(IManaHandler.class, new ManaStorage(), ManaHandler::new); } @SubscribeEvent public static void attachCapabilities(final AttachCapabilitiesEvent<Entity> event) { if(!(event.getObject() instanceof PlayerEntity)) return; ManaProvider provider=new ManaProvider(); event.addCapability(ManaCapability.LOCATION, provider); event.addListener(provider::invalidate); } }
    • I tried downloading forge client just right now, and when I downloaded it, there was a error message from the java app. 
    • The issue Updating from 1.16.5 to 1.17.1, a problem with the availability of the Kotlin stdlib at runtime emerged. Up until now, the following build script setup worked without issue (same thing, just different versions specified): Getting the Kotlin Gradle plugin and applying it buildscript { repositories { maven { url = 'https://maven.minecraftforge.net' } mavenCentral() } dependencies { classpath group: 'net.minecraftforge.gradle', name: 'ForgeGradle', version: '5.1.+', changing: true classpath "org.jetbrains.kotlin:kotlin-gradle-plugin:$kotlin_version" // Kotlin version: 1.6.0 } } apply plugin: 'net.minecraftforge.gradle' apply plugin: 'kotlin' // Some other things java.toolchain.languageVersion = JavaLanguageVersion.of(16) // This is new Including the Standard Library as a dependency (actually unnecessary) dependencies { minecraft "net.minecraftforge:forge:1.17.1-37.0.126" // Used to call for a Forge version for 1.16.5 implementation "org.jetbrains.kotlin:kotlin-stdlib-jdk8:$kotlin_version" // This being jdk8 is not an issue // JEI would be here too } Packaging the Standard Library into the jar jar { dependsOn(classes) duplicatesStrategy(DuplicatesStrategy.INCLUDE) // Manifest here configurations { kotlinstdlib } dependencies { kotlinstdlib "org.jetbrains.kotlin:kotlin-stdlib-jdk8:$kotlin_version" } from { configurations.kotlinstdlib.collect() { it.isDirectory() ? it : zipTree(it) } } } Setting the Kotlin JVM target version to 16 (used to be 1.8) def kotlinCompilerArgs = ["-Xopt-in=kotlin.RequiresOptIn", "-Xjvm-default=all"] compileKotlin { kotlinOptions { jvmTarget = "16" freeCompilerArgs += kotlinCompilerArgs } } compileTestKotlin { kotlinOptions { jvmTarget = "16" freeCompilerArgs += kotlinCompilerArgs } } This still compiles the project correctly, running it however throws the following exception as soon as the mod annotated class gets loaded (when a Logger instance is requested to be more specific, probably does a null check under the hood - because Kotlin): java.lang.ClassNotFoundException: kotlin.jvm.internal.Intrinsics This class is part of the kotlin-stdlib-1.6.0.jar file. (Not kotlin-stdlib-jdk8-1.6.0.jar) It shows up under "External Libraries", but appears to be missing at runtime for the workspace. Running 'build' outputs a jar that gets loaded correctly though, so the problem only appears when running in IDE using 'runClient'. JEI does seem to get loaded though, only the Kotlin Standard Library does not. Versions Gradle - 7.2 ForgeGradle - 5.1.X Java for building: 11 (1.8 when testing on a different computer) Java for compiling and running: 16 Kotlin: 1.6.0 Minecraft: 1.17.1 Forge: 37.0.126 (Currently latest) IDE is IntelliJ What I already tried Using kotlin-stdlib instead of kotlin-stdlib-jdk8 Setting the Java version to 16 for the 1.16.5 version of the project (worked, but not the goal) Using a different PC (different caches, same output) Running the 'clean' task Using 'api, 'compileOnly' and 'runtimeOnly' in the dependencies block instead of 'implementation'. Applying the Kotlin plugin using the plugins block Creating a raw Kotlin project with JVM 16 target (not Forge; worked) Creating a raw Forge mod project using the Forge MDK, adding the Kotlin plugin to it, and converting the ExampleMod class to Kotlin (failed with same output) Removing the implementation line for the Standard Library in both the 1.16.5 version and the 1.17.1 (the 1.17.1 version failed, the 1.16.5 version ran successfully, which means that this line does not have any effect) This abomination compileOnly "org.jetbrains.kotlin:kotlin-stdlib-jdk8:$kotlin_version" runtimeOnly fg.deobf("org.jetbrains.kotlin:kotlin-stdlib-common:$kotlin_version") runtimeOnly fg.deobf("org.jetbrains.kotlin:kotlin-stdlib:$kotlin_version") runtimeOnly fg.deobf("org.jetbrains.kotlin:kotlin-stdlib-jdk7:$kotlin_version") runtimeOnly fg.deobf("org.jetbrains.kotlin:kotlin-stdlib-jdk8:$kotlin_version") Combinations of the things mentioned above. My guess As this problem only appears with a difference in the build script of the mappings and Forge version, the only thing I guess would be left is Forge having an issue itself. I do not know how Forge loads mods and libraries in the development environment, I have checked what System.getenv("CLASSPATH") outputs using a breakpoint, and it returned null. It is remapping and including JEI correctly though, so it confuses me why the Kotlin Standard Library would not be present. This makes me a bit unsure whether it is Forge's fault, but again, the only real change I did for the build script was changing the mappings and Forge version (and adding the Java 16 line, but I have already checked doing that for 1.16.5). It is also not an incompatibility between Java versions because building a mod jar and running Minecraft Forge 1.17.1 with it normally (outside of IDE) works. Are there any workarounds/fixes for this? Of course, any help much appreciated!
    • can you run a 1.16 example mod on that setup? for 1.17 (which you are trying to start), you will need a parallel setup with java 16.
    • As always I'd return to conclude my inquiries, if successful. To solve my issue, I just had to create a custom screen, extend any "furnace" type screen to access the recipe book functions(AbstractFurnaceScreen actually turned out to be quite a hassle, so I moved on using FurnaceScreen). To implement the recipe book button into my "ContainerScreenCampfire", I just mimicked and adjusted the client code found in AbstractFurnaceScreen, and then I had to do the following code, to close the screen, and press the right mouse button to simulate returning to the original campfire screen, instead of the furnace screen: What's left to do is importing all the client particle, and server side burn time logic functions etc., from my original campfire. But this should be pretty straight forward.
  • Topics

  • Who's Online (See full list)

×
×
  • Create New...

Important Information

By using this site, you agree to our Privacy Policy.