OS | IDE | Forge | JDK | Lang |
---|---|---|---|---|
Windows10 1809 17763.593 | IntelliJ IDEA 2019 | 1.13.2-25.0.74 | 1.8.0_202 | Java |
Je pensais qu'il y avait peu de documents japonais sur l'enregistrement d'entités dans la version 1.13.2, donc j'espère que cela vous sera utile. Le code source sera expliqué sur la base du TorchBowMod de mon propre mod.
Cette fois, j'ai résumé l'ajout de l'entité sur laquelle je suis tombé par hasard. Les parties en gras sont des changements liés à l'ajout d'entité.
preInit
@Mod.EventHandler
public void preInit(FMLPreInitializationEvent event) {
}
Dans le passé, les processus tels que preInit et postInit étaient annotés comme décrit ci-dessus, mais avec ce changement, le constructeur de la classe avec l'annotation @ Mod
est changé pour enregistrer l'auditeur pour le processus d'initialisation. c'était fait.
Par exemple, si le nom du fichier de classe avec l'annotation @ Mod
est TorchBowMod
, le constructeur sera comme suit.
TorchBowMod.java
public class TorchBowMod {
public TorchBowMod() {
final IEventBus modEventBus = FMLJavaModLoadingContext.get().getModEventBus();
modEventBus.addListener(this::preInit);//Enregistrez ici l'écouteur qui reçoit l'événement de traitement d'initialisation
MinecraftForge.EVENT_BUS.register(this);
}
//Correspond à preInit car l'argument formel est FMLCommonSetupEvent
//FMLLoadCompleteEvent est équivalent à postInit
//Divers autres événements sont préparés, mais cette fois omis
private void preInit(final FMLCommonSetupEvent event) {
//Traitement effectué par preInit ~~~
}
}
J'ai eu une description inconnue de this :: preInit
.
Étant donné que l'expression lambda est activement utilisée dans cette mise à jour, la description de l'expression lambda apparaît souvent.
Veuillez vous référer à d'autres articles pour les expressions lambda.
En 1.12, je pense qu'une interface ou une classe appelée «CommonProxy» a été créée, et le traitement client / serveur a été ramifié entre ClientProxy hérité et ServerProxy.
En plus de l'événement de traitement d'initialisation ci-dessus, 1.13.2 fournit un événement côté client FMLClientSetupEvent
.
java:1.13.2
//Écouteur d'événements côté client
private void initClient(final FMLClientSetupEvent event) {
//Traitement côté client
}
Ça ressemble à ça. Vous pouvez enregistrer un événement de la même manière qu'un événement de traitement d'initialisation.
Au fait, concernant le rendu d'Entity, en 1.12 et 1.13.2, il n'y a pas de changement dans la méthode d'enregistrement, donc je l'ai écrit avec ClientProxy
.
ClientProxy
//Dans ce cas, le Self-made Entity → EntityTorch et le RenderTorch qui est le rendu de cette Entity sont enregistrés.
enderingRegistry.registerEntityRenderingHandler(EntityTorch.class, RenderTorch::new);
Peut être enregistré en écrivant dans l'écouteur d'événement du côté client tel quel.
En 1.12, je pense que vous avez utilisé l'annotation @ SubscribeEvent
pour enregistrer des éléments, des blocs, des modèles, etc.
1.13.2 utilise la même annotation, mais la méthode a légèrement changé.
Vous devez d'abord créer une classe statique avec l'annotation @ Mod.EventBusSubscriber (bus = Mod.EventBusSubscriber.Bus.MOD)
et écrire une méthode de registre avec l'annotation @ SubscribeEvent
dans cette classe. devenu.
RegistryEvents
@Mod.EventBusSubscriber(bus = Mod.EventBusSubscriber.Bus.MOD)
public static class RegistryEvents {
//Puisque l'argument formel est le générique de Item, l'élément est enregistré, mais si les génériques de Block sont utilisés, le processus d'enregistrement de bloc peut être effectué.
@SubscribeEvent
public static void onItemsRegistry(RegistryEvent.Register<Item> event) {
//Dans ce cas, enregistrement de l'article
}
}
Eh bien, enfin le sujet principal. Jusqu'au 1.12, ʻEntity Registry` était utilisé pour enregistrer Entity, mais il semble qu'il ait été supprimé dans 1.13.2. Par conséquent, il est nécessaire d'utiliser le «RegistryEvent» ci-dessus pour enregistrer l'entité. Cependant, si vous regardez la liste des génériques définis dans Forge.
ForgeRegistries.class
public static final IForgeRegistry<Block> BLOCKS;
public static final IForgeRegistry<Item> ITEMS;
public static final IForgeRegistry<Potion> POTIONS;
public static final IForgeRegistry<Biome> BIOMES;
public static final IForgeRegistry<SoundEvent> SOUND_EVENTS;
public static final IForgeRegistry<PotionType> POTION_TYPES;
public static final IForgeRegistry<Enchantment> ENCHANTMENTS;
public static final IForgeRegistry<VillagerProfession> VILLAGER_PROFESSIONS;
public static final IForgeRegistry<EntityType<?>> ENTITIES;
public static final IForgeRegistry<TileEntityType<?>> TILE_ENTITIES;
public static final IForgeRegistry<ModDimension> MOD_DIMENSIONS;
C'est simplement «<EntityType <? >>» au lieu de «<EntityType <? >>
pour les génériques.
Et puisque les génériques de ʻEntityTypesont ʻEntityType <T extend Entity>
, vous pouvez voir que le type spécifié pour les génériques de ʻEntityType` doit être de type Entity.
Je vais donc créer immédiatement un EntityType de ma propre entité. Supposons que vous souhaitiez enregistrer une entité appelée "Entity Torch" qui apparaissait également lorsque vous étiez un rendu.
public static EntityType<EntityTorch> TORCH;
Tout d'abord, définissez une variable globale de type EntityType qui est une version générique de votre propre Entity.
RegistryEvents
@SubscribeEvent
public static void registerEntityTypes(final RegistryEvent.Register<EntityType<?>> event) {
}
Ajoutez ensuite la méthode ci-dessus à la classe RegistryEvents comme décrit dans «La méthode d'enregistrement pour les blocs, les éléments, l'entité, etc. a changé».
Dans cette méthode, c'est un processus comme l'écriture d'une chose semblable à une propriété de Entity dans TORCH
qui reste nulle, puis l'enregistre.
Dans la méthode registerEntityTypes
TORCH= EntityType.Builder.create(EntityTorch.class, EntityTorch::new).tracker(60, 5, true).build(MODID + ":entitytorch");
TORCH.setRegistryName(new ResourceLocation(MODID, "entitytorch"));
event.getRegistry().register(TORCH);
EntityType est créé par ʻEntityType.Builder, mais pour le moment, il est nécessaire de réécrire le côté Entity avec le style d'écriture de 1.13.2. Je pense que cela peut être fait en faisant référence à l'entité existante, etc., veuillez donc la vérifier.
tracker ()est spécifié dans l'ordre de range, updateFrequency et sendVelocityUpdates, respectivement. C'est la même chose que les 6ème, 7ème et 8ème arguments de ʻEntityRegistry.registerModEntity ()
dans 1.12, donc vous n'aurez aucun problème.
Le nom du registre, etc. peut être le même que l'élément, etc.
Puisque Modding et Qiita viennent de commencer, je vous serais reconnaissant de bien vouloir signaler les erreurs ou les points qui ne sont pas bons. Q: Pourquoi avez-vous écrit sur 1.13.2 maintenant? R: Je me suis récemment inscrit sur Qiita, j'ai donc publié un article que j'ai écrit sur mon blog il y a environ 3 mois.
Recommended Posts