- 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;
}
}
}