Модель игрока не поворачивается вслед за головой

Версия Minecraft
1.12.2
API
Forge
51
8
5
Заголовок вопроса должен отражать проблему
Я хочу при спавне сущности с помощью предмета присваивать ей ротацию тела и головы игрока, голова вращается, но тело применяет свою ротацию только после перезахода в мир, до этого тело направлено четко в какую-либо сторону света. Как мне исправить данную проблему?

Класс сущности

Java:
package com.afp.entity;

import com.afp.main.ElementsAFP;
import com.afp.item.ArmorExo;
import net.minecraftforge.fml.relauncher.SideOnly;
import net.minecraftforge.fml.relauncher.Side;
import net.minecraftforge.fml.common.registry.EntityEntry;
import net.minecraftforge.fml.common.registry.EntityEntryBuilder;
import net.minecraftforge.fml.common.event.FMLPreInitializationEvent;
import net.minecraftforge.fml.client.registry.RenderingRegistry;
import net.minecraft.world.World;
import net.minecraft.util.ResourceLocation;
import net.minecraft.util.DamageSource;
import net.minecraft.item.ItemStack;
import net.minecraft.inventory.EntityEquipmentSlot;
import net.minecraft.entity.SharedMonsterAttributes;
import net.minecraft.entity.EntityCreature;
import net.minecraft.client.renderer.entity.RenderBiped;
import net.minecraft.client.renderer.entity.layers.LayerBipedArmor;
import net.minecraft.client.model.ModelBiped;

@ElementsAFP.ModElement.Tag
public class EntityFrame extends ElementsAFP.ModElement {
    public static final int ENTITYID = 1;

    public EntityFrame(ElementsAFP instance) {
        super(instance, 1);
    }

    @Override
    @SuppressWarnings("unchecked")
    public void initElements() {
        elements.entities.add(() -> (EntityEntry) EntityEntryBuilder.create()
                .entity(Frame.class)
                .id(new ResourceLocation("afp", "frame"), ENTITYID)
                .name("frame")
                .tracker(64, 3, true)
                .build());
    }

    @SideOnly(Side.CLIENT)
    @Override
    public void preInit(FMLPreInitializationEvent event) {
        RenderingRegistry.registerEntityRenderingHandler(Frame.class, renderManager -> {
            RenderBiped<Frame> renderer = new RenderBiped<Frame>(renderManager, new ModelBiped(), 0.5f) {
                @Override
                protected ResourceLocation getEntityTexture(Frame entity) {
                    return new ResourceLocation("afp:textures/blank.png");
                }
            };

            renderer.addLayer(new LayerBipedArmor(renderer) {
                @Override
                protected void initArmor() {
                    this.modelLeggings = new ModelBiped(0.5F);
                    this.modelArmor = new ModelBiped(1.0F);
                }
            });

            return renderer;
        });
    }

    public static class Frame extends EntityCreature {
        public Frame(World world) {
            super(world);
            setSize(0.6f, 1.8f);
            setNoAI(true);
            enablePersistence();
            isImmuneToFire = true;

            setItemStackToSlot(EntityEquipmentSlot.HEAD, new ItemStack(ArmorExo.helmet));
            setItemStackToSlot(EntityEquipmentSlot.CHEST, new ItemStack(ArmorExo.body));
            setItemStackToSlot(EntityEquipmentSlot.LEGS, new ItemStack(ArmorExo.legs));
            setItemStackToSlot(EntityEquipmentSlot.FEET, new ItemStack(ArmorExo.boots));
        }

        @Override
        protected void applyEntityAttributes() {
            super.applyEntityAttributes();
            getEntityAttribute(SharedMonsterAttributes.MAX_HEALTH).setBaseValue(20.0D);
            getEntityAttribute(SharedMonsterAttributes.MOVEMENT_SPEED).setBaseValue(0.0D);
            getEntityAttribute(SharedMonsterAttributes.KNOCKBACK_RESISTANCE).setBaseValue(1.0D);
        }

        @Override
        public boolean isEntityInvulnerable(DamageSource source) {
            return true;
        }

        @Override
        public boolean attackEntityFrom(DamageSource source, float amount) {
            return false;
        }

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

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

        @Override
        public void onUpdate() {
            double prevX = this.posX;
            double prevZ = this.posZ;

            super.onUpdate();

            this.posX = prevX;
            this.posZ = prevZ;
            this.motionX = 0;
            this.motionZ = 0;
        }

        @Override
        protected boolean canDespawn() {
            return false;
        }
    }
}
Класс предмета для спавна сущности

Java:
package com.afp.item;

import com.afp.entity.EntityFrame.Frame;
import com.afp.main.ElementsAFP;
import com.afp.tab.EquipmentTab;
import net.minecraftforge.fml.relauncher.SideOnly;
import net.minecraftforge.fml.relauncher.Side;
import net.minecraftforge.fml.common.registry.GameRegistry;
import net.minecraftforge.client.model.ModelLoader;
import net.minecraftforge.client.event.ModelRegistryEvent;
import net.minecraft.item.Item;
import net.minecraft.client.renderer.block.model.ModelResourceLocation;
import net.minecraft.util.EnumActionResult;
import net.minecraft.util.EnumFacing;
import net.minecraft.util.EnumHand;
import net.minecraft.entity.player.EntityPlayer;
import net.minecraft.util.math.BlockPos;
import net.minecraft.world.World;

@ElementsAFP.ModElement.Tag
public class ItemFrame extends ElementsAFP.ModElement {
    @GameRegistry.ObjectHolder("afp:frame")
    public static final Item block = null;

    public ItemFrame(ElementsAFP instance) {
        super(instance, 1);
    }

    @Override
    public void initElements() {
        elements.items.add(() -> new ItemCustom());
    }

    @SideOnly(Side.CLIENT)
    @Override
    public void registerModels(ModelRegistryEvent event) {
        ModelLoader.setCustomModelResourceLocation(block, 0, new ModelResourceLocation("afp:frame", "inventory"));
    }

    public static class ItemCustom extends Item {
        public ItemCustom() {
            setMaxDamage(0);
            maxStackSize = 1;
            setTranslationKey("frame");
            setRegistryName("frame");
            setCreativeTab(EquipmentTab.tab);
        }

        @Override
        public EnumActionResult onItemUse(EntityPlayer player, World world, BlockPos pos,
                                          EnumHand hand, EnumFacing facing,
                                          float hitX, float hitY, float hitZ) {
            BlockPos placementPos = pos.offset(facing);

            if (!world.isRemote && player.canPlayerEdit(placementPos, facing, player.getHeldItem(hand))) {
                Frame entity = new Frame(world);
                entity.setPosition(placementPos.getX() + 0.5, placementPos.getY(), placementPos.getZ() + 0.5);
                entity.rotationYaw = player.rotationYaw;
                entity.rotationPitch = player.rotationPitch;

                if (world.getCollisionBoxes(entity, entity.getEntityBoundingBox()).isEmpty() &&
                        world.getEntitiesWithinAABBExcludingEntity(entity, entity.getEntityBoundingBox()).isEmpty()) {
                    world.spawnEntity(entity);
                    if (!player.capabilities.isCreativeMode) {
                        player.getHeldItem(hand).shrink(1);
                    }
                    return EnumActionResult.SUCCESS;
                }
            }
            return EnumActionResult.PASS;
        }
    }
}
 
Решение
я решил проблему, вот код
Java:
package com.afp.item;

import com.afp.entity.EntityExoskeleton.Exoskeleton;
import com.afp.main.ElementsAFP;
import com.afp.tab.EquipmentTab;
import net.minecraftforge.fml.relauncher.SideOnly;
import net.minecraftforge.fml.relauncher.Side;
import net.minecraftforge.fml.common.registry.GameRegistry;
import net.minecraftforge.client.model.ModelLoader;
import net.minecraftforge.client.event.ModelRegistryEvent;
import net.minecraft.item.Item;
import net.minecraft.client.renderer.block.model.ModelResourceLocation;
import net.minecraft.util.EnumActionResult;
import net.minecraft.util.EnumFacing;
import net.minecraft.util.EnumHand;
import net.minecraft.entity.player.EntityPlayer;
import...
я решил проблему, вот код
Java:
package com.afp.item;

import com.afp.entity.EntityExoskeleton.Exoskeleton;
import com.afp.main.ElementsAFP;
import com.afp.tab.EquipmentTab;
import net.minecraftforge.fml.relauncher.SideOnly;
import net.minecraftforge.fml.relauncher.Side;
import net.minecraftforge.fml.common.registry.GameRegistry;
import net.minecraftforge.client.model.ModelLoader;
import net.minecraftforge.client.event.ModelRegistryEvent;
import net.minecraft.item.Item;
import net.minecraft.client.renderer.block.model.ModelResourceLocation;
import net.minecraft.util.EnumActionResult;
import net.minecraft.util.EnumFacing;
import net.minecraft.util.EnumHand;
import net.minecraft.entity.player.EntityPlayer;
import net.minecraft.util.math.BlockPos;
import net.minecraft.world.World;

@ElementsAFP.ModElement.Tag
public class ItemExoskeleton extends ElementsAFP.ModElement {
    @GameRegistry.ObjectHolder("afp:exoskeleton")
    public static final Item itemExoskeleton = null;

    public ItemExoskeleton(ElementsAFP instance) {
        super(instance, 1);
    }

    @переопределение
    публичные недействительные вложения() {
        elements.items.добавить(() -> создать ItemCustom());
    }

    @Только на стороне (Сторона.КЛИЕНТ)
    @переопределение
    public void registerModels(событие ModelRegistryEvent) {
        ModelLoader.setCustomModelResourceLocation(itemExoskeleton, 0, новая ModelResourceLocation("afp: экзоскелет", "инвентарь"));
    }

    открытый статический класс ItemCustom расширяет Item {
        общедоступный ItemCustom() {
            setmaxповреждение(0);
            макСималЬный размер пакета = 1;
            setTranslationKey("экзоскелет");
            setRegistryName("exoskeleton");
            setCreativeTab(вкладка EquipmentTab.tab);
        }

        @переопределение
        публичный EnumActionResult onItemUse(EntityPlayer player, World world, BlockPos pos,
                                          Перечисляющая рука, обращенная к перечисляющей стороне,
                                          плавающий хитХ, плавающий хитИ, плавающий хитЦ) {
            Размещение blockpospos = поз.смещение (обращенное);

            if (!world.isRemote && player.canPlayerEdit(размещение), лицом к лицу, player.getHeldItem(рука))) {
                Объект экзоскелета = новый Экзоскелет (мир);

                сущность.setLocationAndAngles(
                        placementPos.getX() + 0.5,
                        Возможные варианты размещения(),
                        placementPos.getZ() + 0.5,
                        игрок.Ротация,
                        0
                );

                if (world.getCollisionBoxes(entity, entity.getEntityBoundingBox()).пусто() &&
                        world.getEntitiesWithinAABBExcludingEntity(сущность, entity.getEntityBoundingBox()).isEmpty()) {
                    world.spawnEntity(сущность);
                    if (!player.capabilities.isCreativeMode) {
                        игрок.getthelditem(рука).сжиматься(1);
                    }
                    возвращает EnumActionResult.УСПЕХ;
                }
            }
            возвращает EnumActionResult.PASS;
        }
    }
}[/Код]
 
[CODE=java]package com.afp.entity;

import com.afp.main.ElementsAFP;
import com.afp.item.ArmorExo;
import net.minecraftforge.fml.relauncher.SideOnly;
import net.minecraftforge.fml.relauncher.Side;
import net.minecraftforge.fml.common.registry.EntityEntry;
import net.minecraftforge.fml.common.registry.EntityEntryBuilder;
import net.minecraftforge.fml.common.event.FMLPreInitializationEvent;
import net.minecraftforge.fml.client.registry.RenderingRegistry;
import net.minecraft.world.World;
import net.minecraft.util.ResourceLocation;
import net.minecraft.util.DamageSource;
import net.minecraft.item.ItemStack;
import net.minecraft.inventory.EntityEquipmentSlot;
import net.minecraft.entity.EntityCreature;
import net.minecraft.client.renderer.entity.RenderBiped;
import net.minecraft.client.renderer.entity.layers.LayerBipedArmor;
import net.minecraft.client.model.ModelBiped;

@ElementsAFP.ModElement.Tag
public class EntityExoskeleton extends ElementsAFP.ModElement {
    public static final int ENTITYID = 1;

    public EntityExoskeleton(ElementsAFP instance) {
        super(instance, 1);
    }

    @Override
    @SuppressWarnings("unchecked")
    public void initElements() {
        elements.entities.add(() -> (EntityEntry) EntityEntryBuilder.create()
                .entity(Exoskeleton.class)
                .id(new ResourceLocation("afp", "entity_exoskeleton"), ENTITYID)
                .name("entity_exoskeleton")
                .tracker(64, 3, true)
                .build());
    }

    @SideOnly(Side.CLIENT)
    @Override
    public void preInit(FMLPreInitializationEvent event) {
        RenderingRegistry.registerEntityRenderingHandler(Exoskeleton.class, renderManager -> {
            RenderBiped<Exoskeleton> renderer = new RenderBiped<Exoskeleton>(renderManager, new ModelBiped(), 0.5f) {
                @Override
                protected ResourceLocation getEntityTexture(Exoskeleton entity) {
                    return new ResourceLocation("afp:textures/blank.png");
                }
            };

            renderer.addLayer(new LayerBipedArmor(renderer) {
                @Override
                protected void initArmor() {
                    this.modelLeggings = new ModelBiped(0.5F);
                    this.modelArmor = new ModelBiped(1.0F);
                }
            });

            return renderer;
        });
    }

    public static class Exoskeleton extends EntityCreature {
        public Exoskeleton(World world) {
            super(world);
            setSize(0.6f, 1.8f);
            setNoAI(true);
            enablePersistence();
            isImmuneToFire = true;

            setItemStackToSlot(EntityEquipmentSlot.HEAD, new ItemStack(ArmorExo.helmet));
            setItemStackToSlot(EntityEquipmentSlot.CHEST, new ItemStack(ArmorExo.body));
            setItemStackToSlot(EntityEquipmentSlot.LEGS, new ItemStack(ArmorExo.legs));
            setItemStackToSlot(EntityEquipmentSlot.FEET, new ItemStack(ArmorExo.boots));
        }

        @Override
        public boolean isEntityInvulnerable(DamageSource source) {
            return true;
        }

        @Override
        public boolean attackEntityFrom(DamageSource source, float amount) {
            возвращает false;
        }

        @переопределение
        общедоступное логическое значение canBePushed() {
            возвращает false;
        }

        @переопределение
        общедоступное логическое значение может столкнуться с() {
            возвращает значение true;
        }

        @переопределение
        общедоступный набор значений void и углов (double x, double y, double z, плавающее отклонение от курса, шаг с плавающей точкой) {
            супер.Установите местоположение и углы (x, y, z, рыскание, тангаж);
            this.rotationYawHead = рыскание;
            this.renderYawOffset = рыскание;
        }

        @переопределение
        защищенное логическое значение canDespawn() {
            возвращает false;
        }
    }
}
 
Назад
Сверху