もし一年後とかに読む方がいたら参考にならない可能性が高いので気を付けてください。(2020/04/05)
今回はクリーパーと似たようなモンスターモブを追加しました。
その中で "No render registered" を解決するためにやったことも書いておきます。
このクラスが解決してくれました。
DeferredRegisterを使わないといけなかったみたいです。
ModEntityType.java
public class ModEntityType{
public static final DeferredRegister<EntityType<?>> ENTITY_TYPES = new DeferredRegister<>(ForgeRegistries.ENTITIES, BiomeMod.MOD_ID);
public static final RegistryObject<EntityType> CREEPER_MAN = ENTITY_TYPES.register("creeper_man",() ->
EntityType.Builder.create(CreeperManEntity::new,EntityClassification.MONSTER)
.setTrackingRange(64)
.size(0.6f,2.9f)
.build(new ResourceLocation(MyMod.MOD_ID,"creeper_man").toString()));
}
ここでMobとそのRendererをレジスタしてます。
ClientModEventSubscriber.java
@Mod.EventBusSubscriber(modid = MyMod.MOD_ID,bus = Mod.EventBusSubscriber.Bus.MOD,value = Dist.CLIENT)
public final class ClientModEventSubscriber {
@SubscribeEvent
public static void FMLClientSetupEvent(final FMLClientSetupEvent event){
RenderingRegistry.registerEntityRenderingHandler(ModEntityType.CREEPER_MAN.get(), CreeperManRenderer::new);
}
}
MyMod.java
@Mod(MyMod.MOD_ID)
@Mod.EventBusSubscriber(modid = MyMod.MOD_ID,bus = Mod.EventBusSubscriber.Bus.MOD)
public class MyMod {
public static final String MOD_ID = "Mymod";
public MyMod(){
// Register the doClientStuff method for modloading
FMLJavaModLoadingContext.get().getModEventBus().addListener(this::doClientStuff);
// Register ourselves for server and other game events we are interested in
MinecraftForge.EVENT_BUS.register(this);
final IEventBus modEventBus = FMLJavaModLoadingContext.get().getModEventBus();
ModEntityType.ENTITY_TYPES.register(modEventBus);
}
private void doClientStuff(final FMLClientSetupEvent event){
}
これが肝心のEntityのクラスです。もとのコードが機能を付け足しなどでごちゃごちゃしているので最低限しか書いてないです。
CreeperManEntity.Java
public class CreeperManEntity extends MonsterEntity{
public CreeperManEntity(final EntityType<? extends CreeperManEntity> type,final World worldIn) {
super(type, worldIn);
)
protected void registerAttributes(){
super.registerAttributes();
this.getAttribute(SharedMonsterAttributes.MAX_HEALTH).setBaseValue(60D);
this.getAttribute(SharedMonsterAttributes.MOVEMENT_SPEED).setBaseValue((double)0.3f);
this.getAttribute(SharedMonsterAttributes.FOLLOW_RANGE).setBaseValue(64.00);
}
@Override
public IPacket<?> createSpawnPacket()
{
return NetworkHooks.getEntitySpawningPacket(this);
}
}
あとはCreeperManのRenderクラスとModelクラスを追加するだけ!今回はMobの名前がCreeperManになっていますがそのへんは好きに決めてください。
継承元がよくわからないときは IntelliJ IDEA であれば Ctrl + B で見られます。
自分もRenderクラスとModelクラスはエンダーマンのものをほぼ丸パクリしました。
もし欲しい機能とかがあれば例えば EndermanEntity に Ctrl + B をすればテレポートの仕方とかが見られます。
めちゃくちゃ参考にした海外のコードたち
https://github.com/MrCrayfish/MrCrayfishFurnitureMod/tree/1.15.X/src/main
https://github.com/mekanism/Mekanism/tree/1.15x/src/main
https://github.com/ChampionAsh5357/1.15-Minecraft-Tutorial/tree/30.0.11/src/main/java/com/championash5357
https://github.com/Cadiboo/Example-Mod/tree/1.15.2/src/mai
一番参考になったのは最後のやつです。
初めまして、記事参考にさせていただきました。
確かにこの方法でもレンダリングできましたが
1.14までの方法
RenderingRegistry.registerEntityRenderingHandler(TestEntity.class, TestRender::new);
の第一引数のクラスを、EntityType型に変えて
RenderingRegistry.registerEntityRenderingHandler(TEST_ENTITY, TestRender::new);
とするだけでも登録できました。
もし参考になればと思い、コメントを残しておきます。
ツイッターやっていますので、もしコメント等あればそちらにお願いします。
@JsonModder
返信遅れて申し訳ありません。
アドバイスありがとうございます!
自分は1.14以前のmodを作ったことがなかったのでとても参考になります。
Twitterのフォローさせていただきます。