Jump to content

[1.20.1] Why my custom entity thinks that air is food


btuh

Recommended Posts

I checked my isFood() method:

@Override
public boolean isFood(@NotNull ItemStack item) {
    return FOOD_ITEMS.test(item);
}

the FOOD_ITEMS:

protected static final Ingredient FOOD_ITEMS // sorry for protected static lol
            = Ingredient.of(Items.WHEAT_SEEDS,
            Items.MELON_SEEDS, Items.PUMPKIN_SEEDS,
            Items.BEETROOT_SEEDS, Items.TORCHFLOWER_SEEDS, Items.PITCHER_POD);

and the Ingredient class, but nothing seems to tell Minecraft that air is a food item. 

Tell me if you need full entity code

Edited by btuh
Link to comment
Share on other sites

Because air is good! :D Jokes aside, how can you tell that your mob is eating air? Like, there's an actual action in game that you can observe? Also show the full entity code, maybe there's something weird going on there as well

 

PS: don't bump posts, someone will eventually show up :D You should also consider asking questions in the discord server, wherre is more likely that you'll get a quick response

Don't blame me if i always ask for your help. I just want to learn to be better :)

Link to comment
Share on other sites

37 minutes ago, JimiIT92 said:

Because air is good! :D Jokes aside, how can you tell that your mob is eating air? Like, there's an actual action in game that you can observe? Also show the full entity code, maybe there's something weird going on there as well

 

PS: don't bump posts, someone will eventually show up :D You should also consider asking questions in the discord server, wherre is more likely that you'll get a quick response

I created a temp command with this syntax:

/isfood <entity to check> <player to check the item in main hand or off hand>

It outputs either string respiration of an ItemStack (<count of items> <item name>) that player holds in his hand if it's a food item for specified entity, or "none" if specified player isn't holding an item which is a food item for the specified entity.

Command's code if you didn't understand:

event.getDispatcher().register(Commands.literal("isfood").then(Commands.argument("animal", EntityArgument.entity())
                        .then(Commands.argument("player",
                                EntityArgument.player()).executes(context -> {
                            Entity entity = EntityArgument.getEntity(context, "animal");
                            Player player = EntityArgument.getPlayer(context, "player");
                            if (entity instanceof Animal mob) {
                                if (mob.isFood(player.getItemInHand(InteractionHand.MAIN_HAND)))
                                    context.getSource().sendSuccess(() ->
                                                    Component.literal(String.valueOf(
                                                            player.getItemInHand(InteractionHand.MAIN_HAND))),
                                            true);
                                else if (mob.isFood(player.getItemInHand(InteractionHand.OFF_HAND)))
                                    context.getSource().sendSuccess(() ->
                                            Component.literal(String.valueOf(
                                                    player.getItemInHand(InteractionHand.OFF_HAND)
                                            )), true);
                                else
                                    context.getSource().sendSuccess(() ->
                                            Component.literal("none"), true);
                            }
                            return 1;
                        }))));

So, I tested it on my entity, and command output was:

0 air

(also want to say that it happens only if I play Minecraft for a long time)

Anyways, the entity code:

package mymod.entities.chicken;

import net.minecraft.core.BlockPos;
import net.minecraft.server.level.ServerLevel;
import net.minecraft.sounds.SoundEvent;
import net.minecraft.sounds.SoundEvents;
import net.minecraft.util.Mth;
import net.minecraft.util.RandomSource;
import net.minecraft.world.damagesource.DamageSource;
import net.minecraft.world.entity.*;
import net.minecraft.world.entity.animal.Animal;
import net.minecraft.world.item.ItemStack;
import net.minecraft.world.item.Items;
import net.minecraft.world.item.crafting.Ingredient;
import net.minecraft.world.level.Level;
import net.minecraft.world.level.LevelAccessor;
import net.minecraft.world.level.block.state.BlockState;
import net.minecraft.world.level.pathfinder.BlockPathTypes;
import net.minecraft.world.phys.Vec3;
import org.jetbrains.annotations.NotNull;
import org.jetbrains.annotations.Nullable;
import mymod._Entities;


public abstract class AbstractChicken extends Animal implements IAbstractChicken {

    protected static final Ingredient FOOD_ITEMS
            = Ingredient.of(Items.WHEAT_SEEDS,
            Items.MELON_SEEDS, Items.PUMPKIN_SEEDS,
            Items.BEETROOT_SEEDS, Items.TORCHFLOWER_SEEDS, Items.PITCHER_POD);

    public float flap;
    public float flapSpeed;
    public float oFlapSpeed;
    public float oFlap;
    public float flapping = 1.0F;
    protected float nextFlap = 1.0F;

    protected AbstractChicken(EntityType<? extends AbstractChicken> entityType, Level world) {
        super(entityType, world);
        setPathfindingMalus(BlockPathTypes.WATER, 0.0F);
    }

    protected SoundEvent getAmbientSound() {
        return SoundEvents.CHICKEN_AMBIENT;
    }

    protected SoundEvent getHurtSound(@NotNull DamageSource damageSource) {
        return SoundEvents.CHICKEN_HURT;
    }

    protected SoundEvent getDeathSound() {
        return SoundEvents.CHICKEN_DEATH;
    }

    @Override
    protected void playStepSound(@NotNull BlockPos atPos,
                                 @NotNull BlockState atState) {
        playSound(SoundEvents.CHICKEN_STEP, .15f, 1);
    }

    @Nullable
    @Override
    public AgeableMob getBreedOffspring(@NotNull ServerLevel level,
                                        @NotNull AgeableMob mobBredWith) {
        return null;
    }

    @Override
    protected abstract void registerGoals();

    @Override
    public abstract boolean isBaby();

    @Override
    public abstract boolean canMate(@NotNull Animal other);

    @Override
    public final void aiStep() {
        super.aiStep();
        this.oFlap = flap;
        this.oFlapSpeed = flapSpeed;
        this.flapSpeed += (this.onGround() ? -1.0F : 4.0F) * 0.3F;
        this.flapSpeed = Mth.clamp(this.flapSpeed, 0.0F, 1.0F);
        if (!this.onGround() && this.flapping < 1.0F) {
            this.flapping = 1.0F;
        }
        this.flapping *= 0.9F;
        Vec3 vec3 = this.getDeltaMovement();
        if (!this.onGround() && vec3.y < 0.0D) {
            this.setDeltaMovement(vec3.multiply(1.0D, 0.6D, 1.0D));
        }
        this.flap += this.flapping * 2.0F;
        doAIStep();
    }

    protected abstract void doAIStep();


    @Override
    protected float getStandingEyeHeight(@NotNull Pose pose, @NotNull EntityDimensions dimensions) {
        return this.isBaby() ? dimensions.height * 0.85F : dimensions.height * 0.92F;
    }

    @Override
    public abstract void setBaby(boolean baby);


    @Override
    @Nullable
    public <T extends Mob> T convertTo(@NotNull EntityType<T> toType, boolean copyInventory) {
        if (isRemoved()) {
            return null;
        } else {
            T t = toType.create(level());
            if (t == null) {
                return null;
            } else {
                t.copyPosition(this);
                t.setNoAi(isNoAi());
                if (!(toType == EntityType.CHICKEN
                      || toType == _Entities.ROOSTER.get()
                      || toType == _Entities.CHICK.get())) t.setBaby(isBaby());
                if (hasCustomName()) {
                    t.setCustomName(getCustomName());
                    t.setCustomNameVisible(isCustomNameVisible());
                }

                if (isPersistenceRequired()) {
                    t.setPersistenceRequired();
                }

                t.setInvulnerable(isInvulnerable());
                if (copyInventory) {
                    t.setCanPickUpLoot(canPickUpLoot());

                    for (EquipmentSlot equipmentslot : EquipmentSlot.values()) {
                        ItemStack itemstack = self().getItemBySlot(equipmentslot);
                        if (!itemstack.isEmpty()) {
                            t.setItemSlot(equipmentslot, itemstack.copyAndClear());
                            t.setDropChance(equipmentslot, getEquipmentDropChance(equipmentslot));
                        }
                    }
                }

                level().addFreshEntity(t);
                if (isPassenger()) {
                    Entity entity = getVehicle();
                    stopRiding();
                    t.startRiding(entity, true);
                }

                discard();
                return t;
            }
        }
    }

    public abstract boolean isBoy();

    @Override
    public boolean isFood(@NotNull ItemStack item) {
        return FOOD_ITEMS.test(item);
    }


    @Override
    protected boolean isFlapping() {
        return flyDist > nextFlap;
    }

    @Override
    protected void onFlap() {
        nextFlap = flyDist + flapSpeed / 2f;
    }

    public static boolean canSpawn(EntityType<? extends AbstractChicken> entityType,
                                   LevelAccessor level,
                                   MobSpawnType spawnType,
                                   BlockPos pos,
                                   RandomSource random) {
        return entityType != _Entities.CHICK.get()
               && Animal.checkAnimalSpawnRules(entityType, level, spawnType, pos, random);
    }
}
package mymod.entities.chicken;

import com.google.common.collect.ImmutableList;
import com.google.errorprone.annotations.Immutable;
import net.minecraft.advancements.CriteriaTriggers;
import net.minecraft.nbt.CompoundTag;
import net.minecraft.nbt.Tag;
import net.minecraft.network.syncher.EntityDataAccessor;
import net.minecraft.network.syncher.EntityDataSerializers;
import net.minecraft.network.syncher.SynchedEntityData;
import net.minecraft.server.level.ServerLevel;
import net.minecraft.server.level.ServerPlayer;
import net.minecraft.sounds.SoundEvent;
import net.minecraft.sounds.SoundEvents;
import net.minecraft.stats.Stats;
import net.minecraft.util.RandomSource;
import net.minecraft.util.TimeUtil;
import net.minecraft.util.valueproviders.UniformInt;
import net.minecraft.world.DifficultyInstance;
import net.minecraft.world.InteractionHand;
import net.minecraft.world.InteractionResult;
import net.minecraft.world.damagesource.DamageSource;
import net.minecraft.world.entity.*;
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.ai.goal.target.ResetUniversalAngerTargetGoal;
import net.minecraft.world.entity.animal.*;
import net.minecraft.world.entity.monster.Zombie;
import net.minecraft.world.entity.player.Player;
import net.minecraft.world.item.Item;
import net.minecraft.world.item.ItemStack;
import net.minecraft.world.item.Items;
import net.minecraft.world.level.GameRules;
import net.minecraft.world.level.ItemLike;
import net.minecraft.world.level.Level;
import net.minecraft.world.level.ServerLevelAccessor;
import net.minecraft.world.level.block.Block;
import net.minecraft.world.level.block.Blocks;
import net.minecraft.world.phys.Vec3;
import org.jetbrains.annotations.NotNull;
import org.jetbrains.annotations.Nullable;
import oshi.util.tuples.Pair;
import ru.fokinatorr.chickenmod._Entities;
import ru.fokinatorr.chickenmod._EntityDataSerializers;
import mymod._Items;
import mymod._Sounds;
import mymod.ai.ZombieAttackChickenEggGoal;
import mymod.entities.BredWithMobStorable;
import mymod.util.delayedtask.DelayedTask;
import mymod.util.delayedtask.DelayedTasksHolder;

import java.util.EnumSet;
import java.util.Optional;
import java.util.UUID;
import java.util.function.Supplier;

public class Rooster extends AbstractChicken implements NeutralMob, BredWithMobStorable,
        DelayedTasksHolder<Rooster> {

    private static final UniformInt PERSISTENT_ANGER_TIME
            = TimeUtil.rangeOfSeconds(60, 1800);

    private int remainingPersistentAngerTime;
    private UUID persistentAngerTarget;


    private boolean crowing;
    private int crowTicks;


    private int diggingAnimTicks;

    private int featherDropCoolDown;

    private static final EntityDataAccessor<FourFeathers> DATA_FEATHERS
            = SynchedEntityData.defineId(Rooster.class, _EntityDataSerializers.ROOSTER_FEATHERS.get());

    private static final EntityDataAccessor<Optional<UUID>> DATA_MOB_BRED_WITH
            = SynchedEntityData.defineId(Rooster.class, EntityDataSerializers.OPTIONAL_UUID);


    public Rooster(EntityType<? extends Rooster> entityType, Level world) {
        super(entityType, world);
    }

    @Override
    public int getRemainingPersistentAngerTime() {
        return remainingPersistentAngerTime;
    }

    @Override
    public void setRemainingPersistentAngerTime(int remainingPersistentAngerTime) {
        this.remainingPersistentAngerTime = remainingPersistentAngerTime;
    }

    @Nullable
    @Override
    public UUID getPersistentAngerTarget() {
        return persistentAngerTarget;
    }

    @Override
    public void setPersistentAngerTarget(@Nullable UUID persistentAngerTarget) {
        this.persistentAngerTarget = persistentAngerTarget;
    }

    @Override
    public void startPersistentAngerTimer() {
        this.remainingPersistentAngerTime = PERSISTENT_ANGER_TIME.sample(random);
    }

    @Override
    protected void defineSynchedData() {
        super.defineSynchedData();
        entityData.define(DATA_FEATHERS, FourFeathers.NONE);
        entityData.define(DATA_MOB_BRED_WITH, Optional.empty());

    }


    public FourFeathers getFeatherData() {
        return entityData.get(DATA_FEATHERS);
    }

    public void setFeatherData(FourFeathers featherData) {
        entityData.set(DATA_FEATHERS, featherData);
    }

    @Override
    public void addAdditionalSaveData(@NotNull CompoundTag nbt) {
        super.addAdditionalSaveData(nbt);
        addPersistentAngerSaveData(nbt);
        nbt.put("FeatherData", getFeatherData().writeTag());
        nbt.putBoolean("isCrowing", crowing);
    }

    @Override
    public void readAdditionalSaveData(@NotNull CompoundTag nbt) {
        super.readAdditionalSaveData(nbt);
        readPersistentAngerSaveData(level(), nbt);
        if (nbt.contains("FeatherData", Tag.TAG_COMPOUND))
            setFeatherData(FourFeathers.readTag(nbt.getCompound("FeatherData")));
        else
            setFeatherData(FourFeathers.NONE);

        crowing = nbt.contains("isCrowing", Tag.TAG_BYTE) && nbt.getBoolean("isCrowing");
    }

    @Override
    protected void registerGoals() {
        goalSelector.addGoal(0, new FloatGoal(this));
        goalSelector.addGoal(1, new RoosterMeleeAttackGoal());
        goalSelector.addGoal(1, new RoosterRandomTryFindFoodGoal());
        goalSelector.addGoal(2, new RoosterBreedGoal());
        goalSelector.addGoal(3, new TemptGoal(this, 1, FOOD_ITEMS, false));
        goalSelector.addGoal(5, new WaterAvoidingRandomStrollGoal(this, 1));
        goalSelector.addGoal(6, new LookAtPlayerGoal(this, Player.class, 6));
        goalSelector.addGoal(7, new RandomLookAroundGoal(this));
        targetSelector.addGoal(4, new RoosterRandomAttackNearbyRoosterGoal());
        targetSelector.addGoal(1, new NearestAttackableTargetGoal<>(this, LivingEntity.class,
                true, entity -> entity instanceof Fox
                                || (entity instanceof Ocelot ocelot && !ocelot.isBaby())
                                || (entity instanceof Zombie zombie && zombie.goalSelector
                .getRunningGoals().anyMatch(wrappedGoal -> wrappedGoal.getGoal() instanceof ZombieAttackChickenEggGoal))
                                || isAngryAt(entity)));
        targetSelector.addGoal(2, new HurtByTargetGoal(this));
        targetSelector.addGoal(3, new ResetUniversalAngerTargetGoal<>(this, false));
    }

    @Override
    public void setMobBredWith(@Nullable UUID uuid) {
        entityData.set(DATA_MOB_BRED_WITH, Optional.ofNullable(uuid));
    }

    @Override
    @Nullable
    public UUID getMobBredWith() {
        return entityData.get(DATA_MOB_BRED_WITH).orElse(null);
    }

    // Goals
    class RoosterMeleeAttackGoal extends MeleeAttackGoal {

        RoosterMeleeAttackGoal() {
            super(Rooster.this, 1.4, true);
        }

        @Override
        public void tick() {
            super.tick();
            if (mob.getTarget() != null && mob.distanceToSqr(mob.getTarget()) <= 4) mob.getJumpControl().jump();
        }
    }

    class RoosterRandomAttackNearbyRoosterGoal extends NearestAttackableTargetGoal<Rooster> {
        RoosterRandomAttackNearbyRoosterGoal() {
            super(Rooster.this, Rooster.class, true);
        }

        @Override
        public boolean canUse() {
            return super.canUse() && random.nextInt(300) == 0;
        }

        @Override
        public boolean canContinueToUse() {
            return super.canContinueToUse() && mob.getLastHurtMob() != targetMob;
        }
    }

    class RoosterBreedGoal extends BreedGoal {

        RoosterBreedGoal() {
            super(Rooster.this, 1, Chicken.class);
        }

        @Override
        protected void breed() {
            ServerPlayer serverplayer = animal.getLoveCause();
            if (serverplayer == null && this.partner.getLoveCause() != null) {
                serverplayer = this.partner.getLoveCause();
            }

            if (serverplayer != null) {
                serverplayer.awardStat(Stats.ANIMALS_BRED);
                CriteriaTriggers.BRED_ANIMALS.trigger(serverplayer, this.animal, this.partner, null);
            }

            ((BredWithMobStorable) partner).setMobBredWith(animal.getUUID());
            ((BredWithMobStorable) animal).setMobBredWith(partner.getUUID());
            animal.setAge(6000);
            partner.setAge(6000);
            animal.resetLove();
            partner.resetLove();
            RandomSource randomsource = animal.getRandom();
            if (this.level.getGameRules().getBoolean(GameRules.RULE_DOMOBLOOT)) {
                this.level.addFreshEntity(new ExperienceOrb(this.level,
                        this.animal.getX(),
                        this.animal.getY(),
                        this.animal.getZ(),
                        randomsource.nextInt(7) + 1));
            }
        }
    }

    private static final DelayedTask<Rooster> CROW_LATER = new DelayedTask<>(30) {
        @Override
        protected void execute() {
            entity.crow();
        }
    };
    private static final DelayedTask<Rooster> ANGRY_CLUCK_LATER = new DelayedTask<>(30) {
        @Override
        protected void execute() {
            entity.playSound(_Sounds.ROOSTER_ANGRY_CLUCK.get());
        }
    };

    @Override
    public ImmutableList<DelayedTask<Rooster>> getTasks() {
        return ImmutableList.of(CROW_LATER, ANGRY_CLUCK_LATER);
    }


    class RoosterRandomTryFindFoodGoal extends Goal {

        private final Rooster rooster;
        private int tickCount;
        private int maxTickCount;
        private int lastDugTicks;
        private int roosterLastHurtByMobTimestamp;

        private double lookAtXOld,
                lookAtYOld,
                lookAtZOld;

        private Vec3 pos;

        private boolean didEndSuccessfully;

        private Vec3 lookingAtPos;


        private static final UniformInt POSSIBLE_MAX_TICK_COUNT
                = TimeUtil.rangeOfSeconds(4, 10);

        RoosterRandomTryFindFoodGoal() {
            super();
            this.rooster = Rooster.this;
            setFlags(EnumSet.of(Flag.LOOK));
        }

        @Override
        public boolean canUse() {
            return (isStandingOn(Blocks.GRASS_BLOCK)
                    || isStandingOn(Blocks.DIRT)
                    || isStandingOn(Blocks.PODZOL))
                   && rooster.random.nextInt(3000) == 20;
        }

        @Override
        public boolean canContinueToUse() {
            if (rooster.getLastHurtByMobTimestamp() != roosterLastHurtByMobTimestamp) {
                didEndSuccessfully = false;
                return false;
            } else if (tickCount >= maxTickCount) {
                didEndSuccessfully = true;
                return false;
            }
            return true;
        }

        @Override
        public boolean requiresUpdateEveryTick() {
            return true;
        }

        @Override
        public void start() {
            lastDugTicks = 20;
            roosterLastHurtByMobTimestamp = rooster.getLastHurtByMobTimestamp();
            lookAtXOld = rooster.getLookControl().getWantedX();
            lookAtYOld = rooster.getLookControl().getWantedY();
            lookAtZOld = rooster.getLookControl().getWantedZ();
            pos = new Vec3(rooster.position().toVector3f());
            lookingAtPos = rooster.position().subtract(0, 1, 0);
            rooster.getLookControl().setLookAt(lookingAtPos);
            maxTickCount = POSSIBLE_MAX_TICK_COUNT.sample(rooster.random);
        }

        @Override
        public void stop() {
            rooster.getLookControl().setLookAt(lookAtXOld, lookAtYOld, lookAtZOld);
            if (didEndSuccessfully) {
                int resultItemPercentage = rooster.random.nextInt(100);
                if (resultItemPercentage <= 1) {
                    rooster.spawnAtLocation(Items.DIAMOND, -1);
                    Rooster.ANGRY_CLUCK_LATER.startExecution(rooster);
                } else if (resultItemPercentage <= 5) {
                    rooster.spawnAtLocation(Items.GOLD_NUGGET, -1);
                    Rooster.ANGRY_CLUCK_LATER.startExecution(rooster);
                } else if (resultItemPercentage <= 20) {
                    Rooster.ANGRY_CLUCK_LATER.startExecution(rooster);
                } else {
                    rooster.spawnAtLocation(FOOD_ITEMS.getItems()[rooster.random.nextInt(
                            FOOD_ITEMS.getItems().length)], -1);
                    Rooster.CROW_LATER.startExecution(rooster);
                }
            }
        }

        @Override
        public void tick() {
            ++tickCount;
            rooster.getLookControl().setLookAt(lookingAtPos);
            rooster.getMoveControl().setWantedPosition(pos.x, pos.y, pos.z, rooster.getMoveControl().getSpeedModifier());
            if (lastDugTicks <= 0) {
                lastDugTicks = 20;
                rooster.diggingAnimTicks = 10;
                rooster.playSound(rooster.level().getBlockState(rooster.blockPosition().below())
                        .getSoundType(rooster.level(), rooster.blockPosition().below(), rooster)
                        .getHitSound());
            } else lastDugTicks--;
        }

        private boolean isStandingOn(Block block) {
            return rooster.level().getBlockState(rooster.blockPosition().below()).is(block);
        }
    }


    // Feather data storage
    @Immutable
    public record FourFeathers(@NotNull FeatherType first,
                               @NotNull FeatherType second,
                               @NotNull FeatherType third,
                               @NotNull FeatherType fourth)
    {
        public static final FourFeathers NONE = new FourFeathers(FeatherType.NONE, FeatherType.NONE,
                FeatherType.NONE, FeatherType.NONE);

        public FourFeathers(byte first, byte second, byte third, byte forth) {
            this(FeatherType.fromByte(first),
                    FeatherType.fromByte(second),
                    FeatherType.fromByte(third),
                    FeatherType.fromByte(forth));
        }


        public @NotNull Pair<ItemStack, FourFeathers> removeRandom(RandomSource randomSource) {
            if (NONE.equals(this)) return new Pair<>(ItemStack.EMPTY, this);
            int randomNum = randomSource.nextInt(4);
            while (get(randomNum) == null) randomNum = randomSource.nextInt(4);
            ItemStack retVal0 = get(randomNum).getDefaultInstance();
            FourFeathers retVal1 = switch (randomNum) {
                case 0 -> new FourFeathers(FeatherType.NONE, second, third, fourth);
                case 1 -> new FourFeathers(first, FeatherType.NONE, third, fourth);
                case 2 -> new FourFeathers(first, second, FeatherType.NONE, fourth);
                case 3 -> new FourFeathers(first, second, third, FeatherType.NONE);
                default -> null; // unreachable
            };
            return new Pair<>(retVal0, retVal1);
        }

        public void dropAll(Rooster asRooster) {
            asRooster.setFeatherData(FourFeathers.NONE);
            if (first != FeatherType.NONE) asRooster.spawnAtLocation(first);
            if (second != FeatherType.NONE) asRooster.spawnAtLocation(second);
            if (third != FeatherType.NONE) asRooster.spawnAtLocation(third);
            if (fourth != FeatherType.NONE) asRooster.spawnAtLocation(fourth);
        }


        @Nullable
        public Item get(int i) {
            return (switch (i) {
                case 0 -> first;
                case 1 -> second;
                case 2 -> third;
                case 3 -> fourth;
                default -> throw new IllegalStateException("Unexpected value: " + i);
            }).asItem();
        }


        // NBT Utils
        @NotNull
        public CompoundTag writeTag() {
            CompoundTag nbt = new CompoundTag();
            nbt.putString("first", first.name().toLowerCase());
            nbt.putString("second", second.name().toLowerCase());
            nbt.putString("third", third.name().toLowerCase());
            nbt.putString("fourth", fourth.name().toLowerCase());
            return nbt;
        }

        @NotNull
        public static FourFeathers readTag(@NotNull CompoundTag nbt) {
            return new FourFeathers(tryRead(nbt, "first"),
                    tryRead(nbt, "second"),
                    tryRead(nbt, "third"),
                    tryRead(nbt, "fourth"));
        }

        private static FeatherType tryRead(CompoundTag tag, String toRead) {
            if (tag.contains(toRead, Tag.TAG_STRING)) {
                try {
                    return FeatherType.valueOf(tag.getString(toRead).toUpperCase());
                } catch (IllegalArgumentException e) {
                    return FeatherType.NONE;
                }
            }
            return FeatherType.NONE;
        }

        public FourFeathers copy() {
            return new FourFeathers(first, second, third, fourth);
        }
    }

    public enum FeatherType implements ItemLike {
        RED(_Items.RED_FEATHER, (byte) 0),
        YELLOW(_Items.YELLOW_FEATHER, (byte) 1),
        GREEN(_Items.GREEN_FEATHER, (byte) 2),
        BLUE(_Items.BLUE_FEATHER, (byte) 3),
        NONE(() -> null, (byte) -1);

        private final Supplier<Item> itemSup;
        private final byte byteVal;

        FeatherType(Supplier<Item> itemSup, byte byteVal) {
            this.itemSup = itemSup;
            this.byteVal = byteVal;
        }

        public static FeatherType fromByte(byte item) {
            return switch (item) {
                case -1 -> NONE;
                case 0 -> RED;
                case 1 -> YELLOW;
                case 2 -> GREEN;
                case 3 -> BLUE;
                default -> throw new IllegalArgumentException("item: " + item);
            };
        }

        @Override
        public @Nullable Item asItem() {
            return itemSup.get();
        }

        public byte asByte() {
            return byteVal;
        }
    }

    @Override
    protected void dropCustomDeathLoot(@NotNull DamageSource damageSource, int what, boolean idk) {
        super.dropCustomDeathLoot(damageSource, what, idk);
        getFeatherData().dropAll(this);
    }


    // Sounds

    @Override
    protected SoundEvent getAmbientSound() {
        return _Sounds.ROOSTER_AMBIENT.get();
    }

    @Override
    protected SoundEvent getHurtSound(@NotNull DamageSource damageSource) {
        return _Sounds.ROOSTER_HURT.get();
    }

    @Override
    protected SoundEvent getDeathSound() {
        return _Sounds.ROOSTER_DEATH.get();
    }

    public static AttributeSupplier.Builder createAttributes() {
        return createMobAttributes()
                .add(Attributes.ATTACK_DAMAGE, 2)
                .add(Attributes.MAX_HEALTH, 8)
                .add(Attributes.MOVEMENT_SPEED, .3);
    }


    @Override
    public boolean isBaby() {
        return false;
    }

    @Override
    public boolean canMate(@NotNull Animal other) {
        if (this == other) return false;
        else if (!(other instanceof Chicken)) return false;
        else return isInLove() && other.isInLove();
    }

    @Override
    @Nullable
    public SpawnGroupData finalizeSpawn(@NotNull ServerLevelAccessor worldAccessor,
                                        @NotNull DifficultyInstance difficulty,
                                        @NotNull MobSpawnType mobSpawnType,
                                        @Nullable SpawnGroupData retVal,
                                        @Nullable CompoundTag nbt) {
        if (nbt == null) {
            setFeatherData(new FourFeathers((byte) random.nextIntBetweenInclusive(-1, 3),
                    (byte) random.nextIntBetweenInclusive(-1, 3),
                    (byte) random.nextIntBetweenInclusive(-1, 3),
                    (byte) random.nextIntBetweenInclusive(-1, 3)));
        } else {
            if (nbt.contains("FeatherData", Tag.TAG_COMPOUND)) {
                setFeatherData(FourFeathers.readTag(nbt.getCompound("FeatherData")));
            }
        }
        return super.finalizeSpawn(worldAccessor, difficulty, mobSpawnType, retVal, nbt);
    }

    @Override
    protected void doAIStep() {
        if (crowing && --crowTicks <= 0) {
            crowing = false;
        }
        if (!level().isClientSide) {
            updatePersistentAnger((ServerLevel) level(), true);
            if (level().getDayTime() % 24000L == 0L || level().getDayTime() % 24000L == 13000L)
                crow();
        }
    }

    @Override
    public void setBaby(boolean baby) {
        if (baby) {
            Chick me = convertTo(_Entities.CHICK.get(), false);
            if (me != null) {
                me.setBoy(true);
            }
        }
    }

    @Override
    public @NotNull InteractionResult mobInteract(@NotNull Player player, @NotNull InteractionHand hand) {
        if (isFood(player.getItemInHand(hand))) {
            return super.mobInteract(player, hand);
        } else if (player.getItemInHand(hand) == ItemStack.EMPTY) {
            dropFeather(player);
            return InteractionResult.CONSUME;
        }
        return InteractionResult.PASS;
    }

    private void dropFeather(@Nullable LivingEntity target) {
        Pair<ItemStack, FourFeathers> resFeathers = getFeatherData().removeRandom(random);
        setFeatherData(resFeathers.getB());
        if (resFeathers.getA() != null && featherDropCoolDown == 0 && target != null) {
            spawnAtLocation(resFeathers.getA());
            playSound(SoundEvents.ITEM_PICKUP);
            setTarget(target);
            featherDropCoolDown = random.nextIntBetweenInclusive(20, 30);
        }
    }

    @Override
    public void setTarget(@Nullable LivingEntity target) {
        super.setTarget(target);
        if (target != null) {
            setPersistentAngerTarget(target.getUUID());
            startPersistentAngerTimer();
        }
    }


    public void crow() {
        if (!crowing) {
            crowing = true;
            crowTicks = 70;
            var lookControl = getLookControl();
            lookControl.setLookAt(lookControl.getWantedX(), position().y + .2, lookControl.getWantedZ());
            playSound(_Sounds.ROOSTER_CROW.get());
            level().getEntitiesOfClass(Chicken.class, getBoundingBox().inflate(20))
                    .forEach(chicken -> chicken.setTarget(this));
        }
    }

    public boolean isCrowing() {
        return crowing;
    }

    @Override
    public void tick() {
        super.tick();
        if (diggingAnimTicks > 0) --diggingAnimTicks;
        if (featherDropCoolDown > 0) --featherDropCoolDown;
        tickTasks();
    }


    public int getDiggingAnimTicks() {
        return diggingAnimTicks;
    }

    @Override
    public boolean isBoy() {
        return true;
    }

}
package mymod.entities.chicken;

import net.minecraft.nbt.CompoundTag;
import net.minecraft.nbt.Tag;
import net.minecraft.network.syncher.EntityDataAccessor;
import net.minecraft.network.syncher.EntityDataSerializers;
import net.minecraft.network.syncher.SynchedEntityData;
import net.minecraft.sounds.SoundEvent;
import net.minecraft.world.DifficultyInstance;
import net.minecraft.world.damagesource.DamageSource;
import net.minecraft.world.entity.*;
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.animal.Animal;
import net.minecraft.world.entity.animal.Chicken;
import net.minecraft.world.entity.player.Player;
import net.minecraft.world.item.ItemStack;
import net.minecraft.world.level.Level;
import net.minecraft.world.level.ServerLevelAccessor;
import net.minecraft.world.phys.AABB;
import org.jetbrains.annotations.NotNull;
import mymod._Entities;
import mymod._Sounds;

import org.jetbrains.annotations.Nullable;

import java.util.ArrayList;
import java.util.List;

public class Chick extends AbstractChicken {


    private static final EntityDataAccessor<Boolean> DATA_IS_BOY
            = SynchedEntityData.defineId(Chick.class, EntityDataSerializers.BOOLEAN);

    private final boolean initializedIsBoy;


    public Chick(EntityType<? extends Chick> entityType, Level world) {
        super(entityType, world);
        setAge(-24000);
        initializedIsBoy = false;
    }


    public Chick(EntityType<? extends Chick> entityType, Level world, boolean isBoy) {
        super(entityType, world);
        setAge(-24000);
        setBoy(isBoy);
        initializedIsBoy = true;
    }


    @Override
    protected SoundEvent getAmbientSound() {
        return _Sounds.CHICK_AMBIENT.get();
    }

    @Override
    protected SoundEvent getHurtSound(@NotNull DamageSource damageSource) {
        return _Sounds.CHICK_HURT.get();
    }


    @Override
    protected SoundEvent getDeathSound() {
        return _Sounds.CHICK_DEATH.get();
    }

    @Override
    public float getVoicePitch() {
        return (this.random.nextFloat() - this.random.nextFloat()) * 0.2F + 1.0F;
    }

    @Override
    protected void defineSynchedData() {
        super.defineSynchedData();
        entityData.define(DATA_IS_BOY, false);
    }

    @Override
    public void addAdditionalSaveData(@NotNull CompoundTag nbt) {
        super.addAdditionalSaveData(nbt);
        nbt.putBoolean("IsBoy", isBoy());
    }


    @Override
    public void readAdditionalSaveData(@NotNull CompoundTag nbt) {
        super.readAdditionalSaveData(nbt);
        if (nbt.contains("IsBoy", Tag.TAG_BYTE)) setBoy(nbt.getBoolean("IsBoy"));
    }

    @Override
    protected void registerGoals() {
        goalSelector.addGoal(0, new FloatGoal(this));
        goalSelector.addGoal(1, new PanicGoal(this, 1.4));
        goalSelector.addGoal(2, new TemptGoal(this, 1, FOOD_ITEMS, false));
        goalSelector.addGoal(3, new ChickFollowParentGoal());
        goalSelector.addGoal(5, new WaterAvoidingRandomStrollGoal(this, 1));
        goalSelector.addGoal(6, new LookAtPlayerGoal(this, Player.class, 6));
        goalSelector.addGoal(7, new RandomLookAroundGoal(this));
    }


    @Override
    public void setLastHurtByMob(LivingEntity hurtByMob) {
        super.setLastHurtByMob(hurtByMob);
        if (getType() == _Entities.CHICK.get() && hurtByMob != null) {
            level().getEntitiesOfClass(Rooster.class,
                            new AABB(blockPosition().below(20).north(20).west(20),
                                    blockPosition().above(20).south(20).east(20)))
                    .stream()
                    .filter(r -> r.getPersistentAngerTarget() == null && r.getTarget() == null)
                    .forEach(r -> r.setTarget(hurtByMob));
        }
    }


    @Override
    public SpawnGroupData finalizeSpawn(@NotNull ServerLevelAccessor worldAccessor,
                                        @NotNull DifficultyInstance difficulty,
                                        @NotNull MobSpawnType mobSpawnType,
                                        @Nullable SpawnGroupData retVal,
                                        @Nullable CompoundTag nbt) {
        if (!initializedIsBoy) {
            if (nbt != null && nbt.contains("IsBoy", Tag.TAG_BYTE))
                setBoy(nbt.getBoolean("IsBoy"));
            else
                setBoy(random.nextBoolean());
        }
        return super.finalizeSpawn(worldAccessor, difficulty, mobSpawnType, retVal, nbt);
    }

    class ChickFollowParentGoal extends Goal {

        private Animal parent;
        private int timeToRecalculatePath;

        @Override
        public boolean canUse() {
            List<Animal> list = new ArrayList<>();
            list.addAll(level().getEntitiesOfClass(Chicken.class,
                    getBoundingBox().inflate(8, 4, 8)));
            list.addAll(level().getEntitiesOfClass(Rooster.class,
                    getBoundingBox().inflate(8, 4, 8)));
            Animal animal = null;
            double d0 = Double.MAX_VALUE;

            for (Animal animal1 : list) {
                if (animal1.getAge() >= 0) {
                    double d1 = distanceToSqr(animal1);
                    if (!(d1 > d0)) {
                        d0 = d1;
                        animal = animal1;
                    }
                }
            }

            if (animal == null) {
                return false;
            } else if (d0 < 9.0D) {
                return false;
            } else {
                parent = animal;
                return true;
            }
        }

        @Override
        public boolean canContinueToUse() {
            if (!parent.isAlive()) return false;
            double d = distanceToSqr(parent);
            return !(d < 9) && !(d > 256);
        }


        @Override
        public void start() {
            timeToRecalculatePath = 0;
        }

        @Override
        public void stop() {
            parent = null;
        }

        @Override
        public void tick() {
            if (--timeToRecalculatePath <= 0) {
                timeToRecalculatePath = adjustedTickDelay(10);
                getNavigation().moveTo(parent, 1.1);
            }
        }
    }


    public static AttributeSupplier.Builder createAttributes() {
        return createMobAttributes()
                .add(Attributes.MAX_HEALTH, 4)
                .add(Attributes.MOVEMENT_SPEED, .25);
    }

    @Override
    public void ageBoundaryReached() {
        super.ageBoundaryReached();
        if (getAge() >= 0) {
            if (isBoy())
                convertTo(_Entities.ROOSTER.get(), false);
            else
                convertTo(EntityType.CHICKEN, false);
        }
    }

    @Override
    public boolean isBaby() {
        return true;
    }

    @Override
    public boolean canMate(@NotNull Animal other) {
        return false;
    }

    @Override
    public void setBoy(boolean newBoolean) {
        entityData.set(DATA_IS_BOY, newBoolean);
    }

    @Override
    protected void doAIStep() {

    }

    @Override
    public void setBaby(boolean baby) {
        if (!baby) {
            if (isBoy()) {
                convertTo(_Entities.ROOSTER.get(), false);
            } else {
                convertTo(EntityType.CHICKEN, false);
            }
        }
    }

    @Override
    public boolean isBoy() {
        return entityData.get(DATA_IS_BOY);
    }
}

sorry for too long post lol

Link to comment
Share on other sites

It might just be a misleading log, if you run the command while debugging what's the outcome? 
I've tried checking the item inside the RightClickBlock event and it works just fine

private static final Ingredient FOOD_ITEMS = Ingredient.of(Items.WHEAT_SEEDS, Items.MELON_SEEDS, Items.PUMPKIN_SEEDS, Items.BEETROOT_SEEDS, Items.TORCHFLOWER_SEEDS, Items.PITCHER_POD);

@SubscribeEvent
public static void onRightClickBlock(final PlayerInteractEvent.RightClickBlock event) {
	final ItemStack itemStack = event.getItemStack();
    LOGGER.info(FOOD_ITEMS.test(itemStack) + "");
}

When I right click a block with an Item it checks if is one of the ingredients of FOOD_ITEMS. Clicking with an empty hand (air) logs false, as expected.

Tip: please use the "spoiler" tags for long code snippets and don't merge all your classes into one code snippet

EDIT: just noticed you are on 1.20.1. Maybe is just a bug with the Forge version? Try update to the latest Forge 1.20.2 and see if it still occurs

Edited by JimiIT92

Don't blame me if i always ask for your help. I just want to learn to be better :)

Link to comment
Share on other sites

23 hours ago, JimiIT92 said:

It might just be a misleading log, if you run the command while debugging what's the outcome? 
I've tried checking the item inside the RightClickBlock event and it works just fine

private static final Ingredient FOOD_ITEMS = Ingredient.of(Items.WHEAT_SEEDS, Items.MELON_SEEDS, Items.PUMPKIN_SEEDS, Items.BEETROOT_SEEDS, Items.TORCHFLOWER_SEEDS, Items.PITCHER_POD);

@SubscribeEvent
public static void onRightClickBlock(final PlayerInteractEvent.RightClickBlock event) {
	final ItemStack itemStack = event.getItemStack();
    LOGGER.info(FOOD_ITEMS.test(itemStack) + "");
}

When I right click a block with an Item it checks if is one of the ingredients of FOOD_ITEMS. Clicking with an empty hand (air) logs false, as expected.

Tip: please use the "spoiler" tags for long code snippets and don't merge all your classes into one code snippet

EDIT: just noticed you are on 1.20.1. Maybe is just a bug with the Forge version? Try update to the latest Forge 1.20.2 and see if it still occurs

I didn't yet see this happening on 1.20.2 forge, but sadly, I noticed that my mod is incompatible with this version because of this event handler:

@SubscribeEvent
    public static void onPlayerRightClickItem(PlayerInteractEvent.RightClickItem e) {
        if (e.getItemStack().getItem() instanceof EggItem) {
            List<ThrownEgg> eggs = e.getLevel().getEntitiesOfClass(ThrownEgg.class,
                    new AABB(e.getEntity().blockPosition().immutable()
                            .below(5)
                            .north(5)
                            .west(5),
                            e.getEntity().blockPosition().immutable()
                                    .above(10)
                                    .south(5)
                                    .east(5)));
            if (!eggs.isEmpty()) {
                eggs.forEach(ThrownEgg::discard);
                if (!e.getEntity().getAbilities().instabuild)
                    e.getItemStack().grow(1);
            }


            if (!e.getEntity().level().isClientSide) {
                ((ServerPlayer) e.getEntity()).connection.send(
                        new ClientboundStopSoundPacket(SoundEvents.EGG_THROW.getLocation(),
                                SoundSource.PLAYERS)); // Minecraft Forge 1.20.2 crashes because of NoSuchMethodError here
            }
            e.setCancellationResult(InteractionResult.SUCCESS);
            e.setCanceled(true);
        }
    }

 

Edited by btuh
Link to comment
Share on other sites

Also why roosters don't spawn naturally

Shouldn't this do the thing?

// CommonModEvents
@SubscribeEvent
public static void registerSpawnPlacements(SpawnPlacementRegisterEvent e) {
    e.register(_Entities.ROOSTER.get(), ON_GROUND, WORLD_SURFACE, AbstractChicken::canSpawn, AND);
}

 

public static boolean canSpawn(EntityType<? extends AbstractChicken> entityType,
                               LevelAccessor level,
                               MobSpawnType spawnType,
                               BlockPos pos,
                               RandomSource random) {
    return entityType != _Entities.CHICK.get()
           && Animal.checkAnimalSpawnRules(entityType, level, spawnType, pos, random);
}

 

 

 

Link to comment
Share on other sites

On 12/5/2023 at 2:13 PM, JimiIT92 said:

It might just be a misleading log, if you run the command while debugging what's the outcome? 
I've tried checking the item inside the RightClickBlock event and it works just fine

private static final Ingredient FOOD_ITEMS = Ingredient.of(Items.WHEAT_SEEDS, Items.MELON_SEEDS, Items.PUMPKIN_SEEDS, Items.BEETROOT_SEEDS, Items.TORCHFLOWER_SEEDS, Items.PITCHER_POD);

@SubscribeEvent
public static void onRightClickBlock(final PlayerInteractEvent.RightClickBlock event) {
	final ItemStack itemStack = event.getItemStack();
    LOGGER.info(FOOD_ITEMS.test(itemStack) + "");
}

When I right click a block with an Item it checks if is one of the ingredients of FOOD_ITEMS. Clicking with an empty hand (air) logs false, as expected.

Tip: please use the "spoiler" tags for long code snippets and don't merge all your classes into one code snippet

EDIT: just noticed you are on 1.20.1. Maybe is just a bug with the Forge version? Try update to the latest Forge 1.20.2 and see if it still occurs

Okay it doesn't happen anymore I think, but now I have two more problems that I posted before this one

Edited by btuh
Link to comment
Share on other sites

On 12/5/2023 at 12:45 PM, btuh said:
((ServerPlayer) e.getEntity()).connection.send(
                        new ClientboundStopSoundPacket(SoundEvents.EGG_THROW.getLocation(),
                                SoundSource.PLAYERS)); // Minecraft Forge 1.20.2 crashes because of NoSuchMethodError here

Why are you doing this instead of just playing the sound using the level or the player method? 

Don't blame me if i always ask for your help. I just want to learn to be better :)

Link to comment
Share on other sites

On 12/5/2023 at 2:13 PM, JimiIT92 said:

It might just be a misleading log, if you run the command while debugging what's the outcome? 
I've tried checking the item inside the RightClickBlock event and it works just fine

private static final Ingredient FOOD_ITEMS = Ingredient.of(Items.WHEAT_SEEDS, Items.MELON_SEEDS, Items.PUMPKIN_SEEDS, Items.BEETROOT_SEEDS, Items.TORCHFLOWER_SEEDS, Items.PITCHER_POD);

@SubscribeEvent
public static void onRightClickBlock(final PlayerInteractEvent.RightClickBlock event) {
	final ItemStack itemStack = event.getItemStack();
    LOGGER.info(FOOD_ITEMS.test(itemStack) + "");
}

When I right click a block with an Item it checks if is one of the ingredients of FOOD_ITEMS. Clicking with an empty hand (air) logs false, as expected.

Tip: please use the "spoiler" tags for long code snippets and don't merge all your classes into one code snippet

EDIT: just noticed you are on 1.20.1. Maybe is just a bug with the Forge version? Try update to the latest Forge 1.20.2 and see if it still occurs

I tried it, and when roosters started following me, I clicked a block with empty hand and it logged (air false). So the Ingredient class is totally not the issue, I guess so.

Link to comment
Share on other sites

On 12/5/2023 at 7:11 PM, btuh said:

Also why roosters don't spawn naturally

Shouldn't this do the thing?

// CommonModEvents
@SubscribeEvent
public static void registerSpawnPlacements(SpawnPlacementRegisterEvent e) {
    e.register(_Entities.ROOSTER.get(), ON_GROUND, WORLD_SURFACE, AbstractChicken::canSpawn, AND);
}

 

public static boolean canSpawn(EntityType<? extends AbstractChicken> entityType,
                               LevelAccessor level,
                               MobSpawnType spawnType,
                               BlockPos pos,
                               RandomSource random) {
    return entityType != _Entities.CHICK.get()
           && Animal.checkAnimalSpawnRules(entityType, level, spawnType, pos, random);
}

 

 

 

Have you ever had issues with this?

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.



  • Recently Browsing

    • No registered users viewing this page.
  • Posts

    • Add crash-reports with sites like https://paste.ee/   Remove the mod Augmented Interactions (auginter-1.1.0-1.12.x.jar)
    • It departs in 10 minutes ---- Minecraft Crash Report ---- WARNING: coremods are present:   LoadingPlugin (Bloodmoon_MC1.12.2_1.5.3.jar)   EntityCullingPlugin (entityculling-1.12.2-6.4.3.jar)   Inventory Tweaks Coremod (inventorytweaks-1.64dev.151.jar)   SurgeLoadingPlugin (surge-1.12.2-2.0.77.jar)   Do not report to Forge! (If you haven't disabled the FoamFix coremod, try disabling it in the config! Note that this bit of text will still appear.) (foamfix-0.10.15-1.12.2 (1).jar)   CorePlugin (SmoothFont-mc1.12.2-2.1.4.jar)   XaeroWorldMapPlugin (XaerosWorldMap_1.37.7_Forge_1.12.jar)   CTMCorePlugin (CTM-MC1.12.2-1.0.2.31.jar)   SSLoadingPlugin (sereneseasons-1.12.2-1.2.18-universal.jar)   Born in a Barn (borninabarn1.8-1.12-1.2.jar)   RenderLibPlugin (renderlib-1.12.2-1.3.4.jar) Contact their authors BEFORE contacting forge // I let you down. Sorry Time: 3/5/24 8:58 PM Description: Unexpected error java.lang.NullPointerException: Unexpected error     at com.pau101.auginter.client.interaction.InteractionHandler.rightClickMouse(InteractionHandler.java:91)     at com.pau101.auginter.client.ClientProxy$1.func_151468_f(ClientProxy.java:52)     at net.minecraft.client.Minecraft.func_184117_aA(Minecraft.java:2252)     at net.minecraft.client.Minecraft.func_184118_az(Minecraft.java:2020)     at net.minecraft.client.Minecraft.func_71407_l(Minecraft.java:1808)     at net.minecraft.client.Minecraft.func_71411_J(Minecraft.java:1098)     at net.minecraft.client.Minecraft.func_99999_d(Minecraft.java:398)     at net.minecraft.client.main.Main.main(SourceFile:123)     at sun.reflect.NativeMethodAccessorImpl.invoke0(Native Method)     at sun.reflect.NativeMethodAccessorImpl.invoke(Unknown Source)     at sun.reflect.DelegatingMethodAccessorImpl.invoke(Unknown Source)     at java.lang.reflect.Method.invoke(Unknown Source)     at net.minecraft.launchwrapper.Launch.launch(Launch.java:135)     at net.minecraft.launchwrapper.Launch.main(Launch.java:28)     at org.prismlauncher.launcher.impl.StandardLauncher.launch(StandardLauncher.java:87)     at org.prismlauncher.EntryPoint.listen(EntryPoint.java:130)     at org.prismlauncher.EntryPoint.main(EntryPoint.java:70) A detailed walkthrough of the error, its code path and all known details is as follows: --------------------------------------------------------------------------------------- -- Head -- Thread: Client thread Stacktrace:     at com.pau101.auginter.client.interaction.InteractionHandler.rightClickMouse(InteractionHandler.java:91)     at com.pau101.auginter.client.ClientProxy$1.func_151468_f(ClientProxy.java:52)     at net.minecraft.client.Minecraft.func_184117_aA(Minecraft.java:2252)     at net.minecraft.client.Minecraft.func_184118_az(Minecraft.java:2020) -- Affected level -- Details:     Level name: MpServer     All players: 1 total; [EntityPlayerSP['Its_Nismo'/1679, l='MpServer', x=265.43, y=61.65, z=261.49]]     Chunk stats: MultiplayerChunkCache: 287, 287     Level seed: 0     Level generator: ID 00 - default, ver 1. Features enabled: false     Level generator options:      Level spawn location: World: (128,64,248), Chunk: (at 0,4,8 in 8,15; contains blocks 128,0,240 to 143,255,255), Region: (0,0; contains chunks 0,0 to 31,31, blocks 0,0,0 to 511,255,511)     Level time: 13350 game time, 13350 day time     Level dimension: 0     Level storage version: 0x00000 - Unknown?     Level weather: Rain time: 0 (now: false), thunder time: 0 (now: false)     Level game mode: Game mode: survival (ID 0). Hardcore: false. Cheats: false     Forced entities: 62 total; [EntityZombie['Зомби'/28822, l='MpServer', x=259.50, y=26.00, z=289.50], EntityChicken['Курица'/157, l='MpServer', x=207.50, y=73.00, z=188.50], EntityChicken['Курица'/158, l='MpServer', x=207.50, y=73.00, z=188.50], EntityChicken['Курица'/159, l='MpServer', x=207.90, y=74.04, z=192.50], EntityChicken['Курица'/160, l='MpServer', x=209.50, y=68.00, z=193.50], EntityChicken['Курица'/179, l='MpServer', x=252.50, y=68.00, z=208.50], EntityChicken['Курица'/180, l='MpServer', x=254.50, y=67.00, z=208.50], EntityChicken['Курица'/181, l='MpServer', x=253.50, y=68.00, z=206.27], EntityChicken['Курица'/6391, l='MpServer', x=313.20, y=72.00, z=286.45], EntityChicken['Курица'/6392, l='MpServer', x=310.14, y=72.00, z=287.18], EntityChicken['Курица'/6393, l='MpServer', x=305.09, y=73.00, z=284.27], EntityChicken['Курица'/6394, l='MpServer', x=303.39, y=73.00, z=284.20], EntityChicken['Курица'/6401, l='MpServer', x=291.51, y=68.00, z=235.04], EntitySkeleton['Скелет'/6412, l='MpServer', x=247.45, y=63.00, z=276.77], EntityPig['Свинья'/6469, l='MpServer', x=318.50, y=63.00, z=188.50], EntityPig['Свинья'/6470, l='MpServer', x=318.50, y=63.00, z=187.50], EntityPig['Свинья'/6471, l='MpServer', x=317.50, y=64.00, z=191.50], EntityZotzpyre['Зоцпир'/20820, l='MpServer', x=285.50, y=59.00, z=292.50], EntityChicken['Курица'/6517, l='MpServer', x=326.50, y=66.00, z=232.50], EntityChicken['Курица'/6518, l='MpServer', x=324.50, y=66.00, z=233.50], EntityChicken['Курица'/6519, l='MpServer', x=327.50, y=67.00, z=233.50], EntityChicken['Курица'/6520, l='MpServer', x=326.50, y=66.00, z=233.50], EntityPig['Свинья'/6521, l='MpServer', x=327.50, y=66.00, z=187.50], EntityPig['Свинья'/6522, l='MpServer', x=327.50, y=66.00, z=186.50], EntityPig['Свинья'/6523, l='MpServer', x=327.50, y=66.00, z=184.50], EntityPig['Свинья'/6524, l='MpServer', x=321.50, y=64.00, z=188.50], EntitySkeleton['Скелет'/29124, l='MpServer', x=285.50, y=33.00, z=234.50], EntityEnderman['Эндермен'/25224, l='MpServer', x=251.50, y=62.00, z=278.06], EntityItem['item.tile.dirt.default'/21260, l='MpServer', x=274.14, y=73.00, z=271.88], EntityBat['Летучая мышь'/27497, l='MpServer', x=239.04, y=55.10, z=265.08], EntityWitherSkeleton['Визер-скелет'/29688, l='MpServer', x=265.83, y=57.00, z=266.50], EntitySpider['Паук'/29717, l='MpServer', x=318.50, y=20.00, z=316.50], EntityCreeper['Крипер'/29721, l='MpServer', x=191.50, y=16.00, z=308.50], EntityItem['item.item.egg'/29723, l='MpServer', x=301.54, y=73.00, z=283.56], EntityCreeper['Крипер'/29725, l='MpServer', x=307.50, y=27.00, z=265.50], EntityWitherSkeleton['Визер-скелет'/29829, l='MpServer', x=264.35, y=57.00, z=266.35], EntityBat['Летучая мышь'/29846, l='MpServer', x=235.13, y=50.12, z=254.80], EntityBat['Летучая мышь'/29847, l='MpServer', x=314.02, y=17.81, z=288.65], EntitySkeleton['Скелет'/29882, l='MpServer', x=195.49, y=28.00, z=268.30], EntitySkeleton['Скелет'/29883, l='MpServer', x=191.30, y=17.00, z=268.70], EntityBat['Летучая мышь'/29911, l='MpServer', x=230.51, y=30.72, z=339.75], EntityZotzpyre['Зоцпир'/29921, l='MpServer', x=323.50, y=20.00, z=317.50], EntitySpider['Паук'/29922, l='MpServer', x=320.50, y=20.00, z=319.50], EntitySpider['Паук'/23782, l='MpServer', x=225.50, y=19.00, z=301.50], EntityZombie['Зомби'/29947, l='MpServer', x=304.50, y=16.00, z=213.50], EntityZotzpyre['Зоцпир'/29948, l='MpServer', x=222.50, y=20.00, z=292.50], EntityZotzpyre['Зоцпир'/29949, l='MpServer', x=222.50, y=20.00, z=291.50], EntityBat['Летучая мышь'/29952, l='MpServer', x=214.73, y=35.11, z=201.42], EntityWitherSkeleton['Визер-скелет'/29992, l='MpServer', x=265.11, y=57.00, z=266.35], EntityCreeper['Крипер'/30001, l='MpServer', x=315.50, y=35.00, z=301.50], EntityCreeper['Крипер'/30004, l='MpServer', x=337.50, y=75.00, z=302.50], EntityZombie['Зомби'/30005, l='MpServer', x=334.80, y=68.00, z=247.59], EntityBat['Летучая мышь'/30007, l='MpServer', x=205.75, y=46.87, z=254.25], EntityCreeper['Крипер'/30009, l='MpServer', x=186.50, y=26.00, z=274.50], EntityWitherSkeleton['Визер-скелет'/30033, l='MpServer', x=262.51, y=73.00, z=268.66], EntityZombie['Зомби'/26035, l='MpServer', x=273.48, y=54.00, z=294.20], EntitySkeleton['Скелет'/28363, l='MpServer', x=289.27, y=35.00, z=236.50], EntitySkeleton['Скелет'/22299, l='MpServer', x=295.51, y=64.00, z=288.77], EntityPlayerSP['Its_Nismo'/1679, l='MpServer', x=265.43, y=61.65, z=261.49], EntityChicken['Курица'/6132, l='MpServer', x=293.08, y=69.00, z=237.92], EntityChicken['Курица'/6133, l='MpServer', x=280.59, y=69.00, z=243.22], EntityChicken['Курица'/6134, l='MpServer', x=295.16, y=70.00, z=250.55]]     Retry entities: 0 total; []     Server brand: fml,forge     Server type: Integrated singleplayer server Stacktrace:     at net.minecraft.client.multiplayer.WorldClient.func_72914_a(WorldClient.java:532)     at net.minecraft.client.Minecraft.func_71396_d(Minecraft.java:2741)     at net.minecraft.client.Minecraft.func_99999_d(Minecraft.java:427)     at net.minecraft.client.main.Main.main(SourceFile:123)     at sun.reflect.NativeMethodAccessorImpl.invoke0(Native Method)     at sun.reflect.NativeMethodAccessorImpl.invoke(Unknown Source)     at sun.reflect.DelegatingMethodAccessorImpl.invoke(Unknown Source)     at java.lang.reflect.Method.invoke(Unknown Source)     at net.minecraft.launchwrapper.Launch.launch(Launch.java:135)     at net.minecraft.launchwrapper.Launch.main(Launch.java:28)     at org.prismlauncher.launcher.impl.StandardLauncher.launch(StandardLauncher.java:87)     at org.prismlauncher.EntryPoint.listen(EntryPoint.java:130)     at org.prismlauncher.EntryPoint.main(EntryPoint.java:70) -- System Details -- Details:     Minecraft Version: 1.12.2     Operating System: Windows 11 (amd64) version 10.0     Java Version: 1.8.0_401, Oracle Corporation     Java VM Version: Java HotSpot(TM) 64-Bit Server VM (mixed mode), Oracle Corporation     Memory: 588005024 bytes (560 MB) / 1388363776 bytes (1324 MB) up to 7197425664 bytes (6864 MB)     JVM Flags: 18 total; -XX:+AggressiveOpts -XX:+UseConcMarkSweepGC -XX:+UseParNewGC -XX:+CMSConcurrentMTEnabled -XX:ParallelGCThreads=4 -XX:+UnlockExperimentalVMOptions -XX:+ExplicitGCInvokesConcurrent -XX:MaxGCPauseMillis=50 -XX:+AlwaysPreTouch -XX:+UseStringDeduplication -XX:-OmitStackTraceInFastThrow -XX:+OptimizeStringConcat -XX:+UseAdaptiveGCBoundary -XX:NewRatio=3 -XX:+UseFastAccessorMethods -XX:HeapDumpPath=MojangTricksIntelDriversForPerformance_javaw.exe_minecraft.exe.heapdump -Xms512m -Xmx7040m     IntCache: cache: 0, tcache: 0, allocated: 13, tallocated: 95     FML: MCP 9.42 Powered by Forge 14.23.5.2859 Optifine OptiFine_1.12.2_HD_U_G5 66 mods loaded, 66 mods active     States: 'U' = Unloaded 'L' = Loaded 'C' = Constructed 'H' = Pre-initialized 'I' = Initialized 'J' = Post-initialized 'A' = Available 'D' = Disabled 'E' = Errored     | State  | ID                   | Version              | Source                                            | Signature                                |     |:------ |:-------------------- |:-------------------- |:------------------------------------------------- |:---------------------------------------- |     | LCHIJA | minecraft            | 1.12.2               | minecraft.jar                                     | None                                     |     | LCHIJA | mcp                  | 9.42                 | minecraft.jar                                     | None                                     |     | LCHIJA | FML                  | 8.0.99.99            | forge-1.12.2-14.23.5.2859-universal.jar           | e3c3d50c7c986df74c645c0ac54639741c90a557 |     | LCHIJA | forge                | 14.23.5.2859         | forge-1.12.2-14.23.5.2859-universal.jar           | e3c3d50c7c986df74c645c0ac54639741c90a557 |     | LCHIJA | smoothfontcore       | mc1.12.2-2.1.4       | minecraft.jar                                     | None                                     |     | LCHIJA | xaeroworldmap_core   | 1.12.2-1.0           | minecraft.jar                                     | None                                     |     | LCHIJA | foamfixcore          | 7.7.4                | minecraft.jar                                     | None                                     |     | LCHIJA | smoothfont           | mc1.12.2-2.1.4       | SmoothFont-mc1.12.2-2.1.4.jar                     | None                                     |     | LCHIJA | additionalstructures | 2.5.0                | Additional-Structures-v.2.5.0-1.12.2.jar          | None                                     |     | LCHIJA | aiimprovements       | 0.0.1.3              | aiimprovements-1.12-0.0.1b3.jar                   | None                                     |     | LCHIJA | jei                  | 4.16.1.1012          | jei_1.12.2-4.16.1.1012.jar                        | None                                     |     | LCHIJA | appleskin            | 1.0.9                | appleskin-mc1.12-1.0.9.jar                        | None                                     |     | LCHIJA | auginter             | 1.1.0                | auginter-1.1.0-1.12.x.jar                         | None                                     |     | LCHIJA | backpack             | 3.0.2                | backpack_3.0.2_1.12.2.jar                         | None                                     |     | LCHIJA | betterbuilderswands  | 0.13.2               | BetterBuildersWands-1.12.2-0.13.2.271+5997513.jar | None                                     |     | LCHIJA | bibliocraft          | 2.4.5                | BiblioCraft-v2.4.5-MC1.12.2.jar                   | None                                     |     | LCHIJA | bloodmoon            | 1.5.3                | Bloodmoon_MC1.12.2_1.5.3.jar                      | d72e0dd57935b3e9476212aea0c0df352dd76291 |     | LCHIJA | bookshelf            | 2.3.590              | Bookshelf_1.12.2_2.3.590.jar                      | d476d1b22b218a10d845928d1665d45fce301b27 |     | LCHIJA | carryon              | 1.12.3               | carryon-1.12.2-1.12.6.20.jar                      | fd21553434f4905f2f73ea7838147ac4ea07bd88 |     | LCHIJA | chameleon            | 1.12-4.1.3           | Chameleon-1.12-4.1.3.jar                          | None                                     |     | LCHIJA | colouredtooltips     | 1.0.9                | colouredtooltips-1.12.2-1.0.9.jar                 | d476d1b22b218a10d845928d1665d45fce301b27 |     | LCHIJA | craftingtweaks       | 8.1.9                | craftingtweaks_1.12.2-8.1.9.jar                   | None                                     |     | LCHIJA | ctm                  | MC1.12.2-1.0.2.31    | CTM-MC1.12.2-1.0.2.31.jar                         | None                                     |     | LCHIJA | eplus                | 5.0.179              | enchantingplus-1.12.2-5.0.179.jar                 | d476d1b22b218a10d845928d1665d45fce301b27 |     | LCHIJA | renderlib            | 1.3.4                | renderlib-1.12.2-1.3.4.jar                        | None                                     |     | LCHIJA | entityculling        | 6.4.3                | entityculling-1.12.2-6.4.3.jar                    | None                                     |     | LCHIJA | foamfix              | @VERSION@            | foamfix-0.10.15-1.12.2 (1).jar                    | None                                     |     | LCHIJA | gokistats            | 1.2.10               | GokiStats-1.2.10.jar                              | None                                     |     | LCHIJA | gravestone           | 1.10.0               | gravestone_mc1.12.2_1.10.0.jar                    | None                                     |     | LCHIJA | harvest              | 1.12-1.2.7-20        | harvest-1.12-1.2.7-20.jar                         | None                                     |     | LCHIJA | infernalmobs         | 1.7.6                | InfernalMobs-1.12.2.jar                           | None                                     |     | LCHIJA | inventoryhud         | 3.4.4                | inventoryhud-1.12.2.forge-3.4.4.jar               | None                                     |     | LCHIJA | inventorytweaks      | 1.64+dev.151.822d839 | inventorytweaks-1.64dev.151.jar                   | 55d2cd4f5f0961410bf7b91ef6c6bf00a766dcbe |     | LCHIJA | ironchest            | 1.12.2-7.0.67.844    | ironchest-1.12.2-7.0.72.847.jar                   | None                                     |     | LCHIJA | ironfurnaces         | 1.3.5                | ironfurnaces-1.3.5.jar                            | None                                     |     | LCHIJA | mantle               | 1.12-1.3.3.55        | mantle-1.12-1.3.3.55.jar                          | None                                     |     | LCHIJA | memorycleaner        | 1.4                  | memorycleaner-1.4 (1).jar                         | None                                     |     | LCHIJA | twilightforest       | 3.11.1021            | twilightforest-1.12.2-3.11.1021-universal.jar     | None                                     |     | LCHIJA | tconstruct           | 1.12.2-2.13.0.183    | tconstruct-1.12.2-2.13.0.183.jar                  | None                                     |     | LCHIJA | moartinkers          | 0.6.0                | moartinkers-0.6.0.jar                             | None                                     |     | LCHIJA | mob_grinding_utils   | 0.3.13               | MobGrindingUtils_1.12.2_0.3.13.jar                | None                                     |     | LCHIJA | mousetweaks          | 2.10.1               | mousetweaks-2.10.1-mc1.12.2.jar                   | None                                     |     | LCHIJA | nopotionshift        | 1.2.0                | nopotionshift_1.12.2-1.2.0.jar                    | None                                     |     | LCHIJA | norecipebook         | 1.2.1                | norecipebook_v1.2.2formc1.12.2.jar                | None                                     |     | LCHIJA | oreexcavation        | 1.4.150              | oreexcavation-1.4.150.jar                         | None                                     |     | LCHIJA | patchouli            | 1.0-23.6             | Patchouli-1.0-23.6.jar                            | None                                     |     | LCHIJA | performant           | 1.12.2-1.5           | performant-1.11.jar                               | None                                     |     | LCHIJA | placebo              | 1.6.0                | placebo-1.12.2-1.6.1.jar                          | None                                     |     | LCHIJA | progressivebosses    | 1.5.4                | ProgressiveBosses_1.5.4_mc1.12.x.jar              | None                                     |     | LCHIJA | ruins                | 17.2                 | ruins-1.12.2.jar                                  | None                                     |     | LCHIJA | silentlib            | 3.0.13               | silentlib-1.12.2-3.0.14168.jar                    | None                                     |     | LCHIJA | scalinghealth        | 1.3.37               | scalinghealth-1.12.2-1.3.42147.jar                | None                                     |     | LCHIJA | sereneseasons        | 1.2.18               | sereneseasons-1.12.2-1.2.18-universal.jar         | None                                     |     | LCHIJA | spark                | 1.5.2                | spark-forge1122.jar                               | None                                     |     | LCHIJA | stg                  | 1.12.2-1.2.3         | stg-1.12.2-1.2.3.jar                              | None                                     |     | LCHIJA | storagedrawers       | 5.5.0                | StorageDrawers-1.12.2-5.5.0.jar                   | None                                     |     | LCHIJA | surge                | 2.0.77               | surge-1.12.2-2.0.77.jar                           | d476d1b22b218a10d845928d1665d45fce301b27 |     | LCHIJA | texfix               | 4.0                  | texfixv-1.12-4.0 (1).jar                          | None                                     |     | LCHIJA | theoneprobe          | 1.4.28               | theoneprobe-1.12-1.4.28.jar                       | None                                     |     | LCHIJA | tinkersjei           | 1.2                  | tinkersjei-1.2.jar                                | None                                     |     | LCHIJA | toastcontrol         | 1.8.1                | toastcontrol-1.12.2-1.8.1.jar                     | None                                     |     | LCHIJA | topaddons            | 1.12.2-1.13.0        | topaddons-1.12.2-1.13.0.jar                       | None                                     |     | LCHIJA | torohealthmod        | 1.12.2-11            | torohealth-1.12.2-11.jar                          | None                                     |     | LCHIJA | waystones            | 4.1.0                | waystones_1.12.2-4.1.0.jar                        | None                                     |     | LCHIJA | xaeroworldmap        | 1.37.7               | XaerosWorldMap_1.37.7_Forge_1.12.jar              | None                                     |     | LCHIJA | betteranimalsplus    | 9.0.1                | betteranimalsplus_1.12.2_9.0.1.jar                | None                                     |     Loaded coremods (and transformers):  LoadingPlugin (Bloodmoon_MC1.12.2_1.5.3.jar)   lumien.bloodmoon.asm.ClassTransformer EntityCullingPlugin (entityculling-1.12.2-6.4.3.jar)   meldexun.entityculling.asm.EntityCullingClassTransformer Inventory Tweaks Coremod (inventorytweaks-1.64dev.151.jar)   invtweaks.forge.asm.ContainerTransformer SurgeLoadingPlugin (surge-1.12.2-2.0.77.jar)    Do not report to Forge! (If you haven't disabled the FoamFix coremod, try disabling it in the config! Note that this bit of text will still appear.) (foamfix-0.10.15-1.12.2 (1).jar)   pl.asie.foamfix.coremod.FoamFixTransformer CorePlugin (SmoothFont-mc1.12.2-2.1.4.jar)   bre.smoothfont.asm.Transformer XaeroWorldMapPlugin (XaerosWorldMap_1.37.7_Forge_1.12.jar)   xaero.map.core.transformer.ChunkTransformer   xaero.map.core.transformer.NetHandlerPlayClientTransformer   xaero.map.core.transformer.EntityPlayerTransformer   xaero.map.core.transformer.AbstractClientPlayerTransformer   xaero.map.core.transformer.WorldClientTransformer   xaero.map.core.transformer.EntityPlayerMPTransformer   xaero.map.core.transformer.PlayerListTransformer   xaero.map.core.transformer.SaveFormatTransformer   xaero.map.core.transformer.BiomeColorHelperTransformer   xaero.map.core.transformer.MinecraftServerTransformer   xaero.map.core.transformer.MinecraftTransformer CTMCorePlugin (CTM-MC1.12.2-1.0.2.31.jar)   team.chisel.ctm.client.asm.CTMTransformer SSLoadingPlugin (sereneseasons-1.12.2-1.2.18-universal.jar)   sereneseasons.asm.transformer.EntityRendererTransformer   sereneseasons.asm.transformer.WorldTransformer Born in a Barn (borninabarn1.8-1.12-1.2.jar)   com.chocohead.biab.BornInABarn RenderLibPlugin (renderlib-1.12.2-1.3.4.jar)   meldexun.renderlib.asm.RenderLibClassTransformer     GL info: ' Vendor: 'ATI Technologies Inc.' Version: '4.6.0 Compatibility Profile Context 24.2.1.240215' Renderer: 'Radeon RX 5500 XT'     Pulsar/tconstruct loaded Pulses:          - TinkerCommons (Enabled/Forced)         - TinkerWorld (Enabled/Not Forced)         - TinkerTools (Enabled/Not Forced)         - TinkerHarvestTools (Enabled/Forced)         - TinkerMeleeWeapons (Enabled/Forced)         - TinkerRangedWeapons (Enabled/Forced)         - TinkerModifiers (Enabled/Forced)         - TinkerSmeltery (Enabled/Not Forced)         - TinkerGadgets (Enabled/Not Forced)         - TinkerOredict (Enabled/Forced)         - TinkerIntegration (Enabled/Forced)         - TinkerFluids (Enabled/Forced)         - TinkerMaterials (Enabled/Forced)         - TinkerModelRegister (Enabled/Forced)         - craftingtweaksIntegration (Enabled/Not Forced)         - theoneprobeIntegration (Enabled/Not Forced)     Patchouli open book context: n/a     Launched Version: 1.12.2     LWJGL: 2.9.4     OpenGL: Radeon RX 5500 XT GL version 4.6.0 Compatibility Profile Context 24.2.1.240215, ATI Technologies Inc.     GL Caps: Using GL 1.3 multitexturing. Using GL 1.3 texture combiners. Using framebuffer objects because OpenGL 3.0 is supported and separate blending is supported. Shaders are available because OpenGL 2.1 is supported. VBOs are available because OpenGL 1.5 is supported.     Using VBOs: Yes     Is Modded: Definitely; Client brand changed to 'fml,forge'     Type: Client (map_client.txt)     Resource Packs: ModdedFaithful 1.12.2-rv1 (1).zip, NotEnoughPixels1.12.2-1.1.4.zip, Classic Faithful 32x Programmer Art - 1.12.2 (2).zip     Current Language: Русский (Россия)     Profiler Position: N/A (disabled)     CPU: 12x Intel(R) Xeon(R) CPU E5-2620 v3 @ 2.40GHz     OptiFine Version: OptiFine_1.12.2_HD_U_G5     OptiFine Build: 20210124-142939     Render Distance Chunks: 8     Mipmaps: 0     Anisotropic Filtering: 1     Antialiasing: 0     Multitexture: false     Shaders: null     OpenGlVersion: 4.6.0 Compatibility Profile Context 24.2.1.240215     OpenGlRenderer: Radeon RX 5500 XT     OpenGlVendor: ATI Technologies Inc.     CpuCount: 12
    • Im trying to get a way to set a custome briefcase next to the player similar to the Bonus chest  Digging on the code i found this two events  @SubscribeEvent public static void onPlayerRespawn( PlayerEvent.PlayerRespawnEvent event) { Player pe = event.getEntity(); Level warudo = pe.level(); System.out.println("\n\n\n #### player has respawn " + ", " + warudo.isClientSide() + "\n\n\n" ); //PlayerEvent$Clone } @SubscribeEvent public static void onPlayerStarAWorld( LevelEvent.CreateSpawnPosition event) { //Player pe = event.getEntity; <--- dont exists in LevelEvent Level warudo = (Level)event.getLevel(); ServerLevelData settings = event.getSettings(); //ServerPlayer player = Minecraft.getInstance().player;<--- this crash the game PlayerEntity is null //player.position() //player.getRespawnPosition() System.out.println("\n\n\n #### onPlayerStarAWorld " + ", " + warudo.isClientSide() + ", " + "\n\n\n" ); //PlayerEvent$Clone } CreateSpawnPosition seems like he way to go but i cannot find a way extract a block position from it nor the player to then know wheres the player    ################################# what i want is to get the player from this event soo i can know where it is and spawns a briefcase next to it  or maybe another event that could do the same           
    • If you're experiencing lag with the Forge client on CurseForge but not with other loaders, it could be a specific issue with Forge or how it interacts with your Mac. Since you've tried updating and adjusting memory allocation without success, consider checking for any Forge-specific settings that might affect performance. Also, exploring forums for Mac users running Forge might reveal some Mac-specific tweaks. Another idea is to reach out to the Forge community directly for advice, as they might have insights specific to your setup.
  • Topics

×
×
  • Create New...

Important Information

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