投掷物模型渲染错误问题

dasffafa


版本信息
你使用的系统:win764位
你是用的JDK: jdk1.8.0_202 64bit
你使用的IDE:IntelliJ IDEA
你使用的IDE版本:2020.2.2
Minecraft版本: 1.15.2

错误情况简述
制作了一个叫“翔翔(飞翔的翔)”的投掷物,但是这个实体渲染的时候会是一个雪球,继承鸡蛋就会变成鸡蛋,继承ProjectItemEntity的时候会变成一个猪

相关代码
FlyingShitEntity.java

public class FlyingShitEntity extends SnowballEntity {
    public static final ScoreCriteria FLYING_SHIT = new ScoreCriteria("flying_shit");

    public FlyingShitEntity(EntityType<? extends SnowballEntity> p_i50159_1_, World p_i50159_2_) {
        super(p_i50159_1_, p_i50159_2_);
    }

    public FlyingShitEntity(World worldIn, LivingEntity throwerIn) {
        super(worldIn, throwerIn);
    }

    public FlyingShitEntity(World worldIn, double x, double y, double z) {
        super(worldIn, x, y, z);
    }

    protected void onImpact(RayTraceResult result) {
        if (result.getType() == RayTraceResult.Type.ENTITY) {
            Entity entity = ((EntityRayTraceResult) result).getEntity();
            entity.attackEntityFrom(ModDamageTypes.STINKY,6);
        }

        if (!this.world.isRemote) {
            this.world.setEntityState(this, (byte) 3);
            this.remove();
        }

    }
}

FlyingShitRenderer.java

@OnlyIn(Dist.CLIENT)
public class FlyingShitRenderer extends SpriteRenderer<FlyingShitEntity> {
    public FlyingShitRenderer(EntityRendererManager renderManagerIn) {
        super(renderManagerIn, Minecraft.getInstance().getItemRenderer());
    }
}

ModRenders.java

public class ModRenders {
    public static void register() {
        RenderingRegistry.registerEntityRenderingHandler(ModEntities.FEATHERED_SHEEP_ENTITY_ENTITY_TYPE, FeatheredSheepRenderer::new);
        RenderingRegistry.registerEntityRenderingHandler(ModEntities.FLYING_SHIT_ENTITY_ENTITY_TYPE, FlyingShitRenderer::new);
        ModLemon.LOGGER.info("fuzzy");//这一行被调用了
    }
}

ModLemon.java

@Mod("cnmb_nmsl")
@Mod.EventBusSubscriber
public class ModLemon {
    public static final String MOD_ID = "cnmb_nmsl";
    public static final String MOD_NAME = "Lemons are ripen";
    public static final ItemGroup LEMON_GROUP = new LemonCreativeTab();
    public static final Logger LOGGER = LogManager.getLogger(MOD_NAME);
    public ModLemon(){
        ......//有一些无关的东西所以省略了
        FMLJavaModLoadingContext.get().getModEventBus().addListener(this::doClientStuff);
    }
    @OnlyIn(Dist.CLIENT)
    private void doClientStuff(final FMLClientSetupEvent event) {
        ModRenders.register();
    }
}

查到的资料
没查到,我完全照ChromeBall抄的,但是还是不对劲


FledgeXu


看一下这个简单的markdown教程,你有很多该删的模版内容没有删去

我没懂这个有什么问题……



@Override
protected Item getDefaultItem() {
    return yourItem;
}

dasffafa


我像这样写了

@Override
protected Item getDefaultItem() {
     return ModItems.FLYING_SHIT.get();
 }

但是还是不行,我是哪里做错了吗


dasffafa


不好意思那天发的时候有些着急了,所以很多东西没有删
我已经改了



我重新看了一下 SpiritRenderer 的实现。我没有理解错的话,getDefaultItem() 这个方法需要在你的 FlyingShitEntity 里 override。


dasffafa


(帖子被作者删除,如无标记将在 24 小时后自动删除)


dasffafa


我确实是在FlyingShitEntity里面复写的啊


system


该主题在最后一个回复创建后7天后自动关闭。不再允许新的回复。


FledgeXu



dasffafa


找到了问题:投掷物渲染模型必须implements IRendersAsItem
添加implement之后成功了
新的源码:
FlyingShitEntity.java

public class FlyingShitEntity extends ProjectileItemEntity implements IRendersAsItem {
    public static final ScoreCriteria FLYING_SHIT = new ScoreCriteria("flying_shit");

    public FlyingShitEntity(World world, LivingEntity livingEntity) {
    super(ModEntities.FLYING_SHIT_ENTITY_ENTITY_TYPE, livingEntity, world);
  }
    public FlyingShitEntity(EntityType<FlyingShitEntity> flyingShitEntityEntityType, World world) {
        super(ModEntities.FLYING_SHIT_ENTITY_ENTITY_TYPE,world);
    }
    @Nonnull
    @Override
    public IPacket<?> createSpawnPacket() {
      return NetworkHooks.getEntitySpawningPacket(this);
    }

    @Override
    protected @NotNull Item getDefaultItem() {
        return ModItems.FLYING_SHIT.get();
    }

    protected void onImpact(RayTraceResult result) {
        if (result.getType() == RayTraceResult.Type.ENTITY) {
            Entity entity = ((EntityRayTraceResult) result).getEntity();
            entity.attackEntityFrom(ModDamageTypes.causeThrownStinkyDamage(this,this.getThrower()),6);
        }

        if (!this.world.isRemote) {
            this.world.setEntityState(this, (byte) 3);
            this.remove();
        }

    }
}