[JAVA] [Forge] Comment enregistrer votre propre Entité et Entité Render dans 1.13.2

Environnement de développement

OS IDE Forge JDK Lang
Windows10 1809 17763.593 IntelliJ IDEA 2019 1.13.2-25.0.74 1.8.0_202 Java

introduction

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.

Changements depuis 1.12 que j'ai remarqués

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é.

Le traitement d'initialisation du mod est maintenant chargé en parallèle

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.

L'initialisation du client peut désormais être effectuée sans utiliser SidedProxy

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.

La méthode d'enregistrement pour les blocs, les éléments, l'entité, etc. a changé.

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

La méthode d'ajout d'entité a changé

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 «». Vous pouvez donc voir que vous devez spécifier <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.

Source de référence

Serpentin

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

[Forge] Comment enregistrer votre propre Entité et Entité Render dans 1.13.2
Comment créer votre propre annotation en Java et obtenir la valeur
Comment lire votre propre fichier YAML (*****. Yml) en Java
Comment développer et enregistrer une application Sota en Java
[Spring Boot Actuator] Comment enregistrer manuellement votre propre processus de vérification de l'état
Réflexion: Comment utiliser une interface fonctionnelle pour vos propres fonctions (java)
Comment convertir A en A et A en A en utilisant le produit logique et la somme en Java
Comment gérer les fichiers TSV et les fichiers CSV dans Ruby
Comment écrire un mod de base dans Minecraft Forge 1.15.2
Comment lancer Swagger UI et Swagger Editor dans Docker
Comment spécifier le code de caractère et le code de saut de ligne avec JAXB
Comment séparer les mots dans les noms dans les classes, les méthodes et les variables
[Rails] Comment définir des macros dans Rspec et standardiser le traitement
Comment définir le code de caractère et le code de saut de ligne dans Eclipse
[Rails] Différentes différences entre redirect_to et méthode de rendu et méthode de sortie de la méthode de rendu
Que s'est-il passé dans «Java 8 to Java 11» et comment créer un environnement
Comment appeler et utiliser l'API en Java (Spring Boot)
Comment déployer jQuery dans les applications Rails à l'aide de Webpacker
Créez votre propre serveur simple avec Java et comprenez HTTP
Différences dans la gestion des chaînes entre Java et Perl
Comment installer les pilotes PHP 7.4 et SQL Server dans CentOS 7.7
Comment inclure PKCE Code_Verifier et Code_Challenge dans la requête JMeter
Comment basculer dynamiquement entre FIN et RST dans Netty
Créez votre propre clavier QMK dans Docker. Volume unique à Windows
Comment POST JSON dans la méthode Java en utilisant OkHttp3 et la méthode en utilisant HttpUrlConnection-
[Webpacker] Résumé de l'installation de Bootstrap et jQuery dans Rails 6.0
Comment créer votre propre contrôleur correspondant à / error avec Spring Boot
Comment définir et utiliser un profil avec une configuration basée sur des annotations dans le framework Spring
[jOOQ] Comment utiliser CASE WHEN dans la clause WHERE / AND / OR
Comment supprimer de grandes quantités de données dans Rails et problèmes
Comment installer le langage utilisé dans Ubuntu et comment créer l'environnement
Comment obtenir et ajouter des données depuis Firebase Firestore dans Ruby
Comment installer confortablement JDK 11 dans votre Mac
Comment utiliser Lombok au printemps
Comment utiliser StringBurrer et Arrays.toString.
Comment trouver May'n dans XPath
Comment masquer la barre de défilement dans WebView
Comment exécuter JUnit dans Eclipse
Comment utiliser EventBus3 et ThreadMode
Comment itérer indéfiniment en Ruby
Comment maîtriser la programmation en 3 mois
Comment apprendre JAVA en 7 jours
Comment obtenir des paramètres dans Spark
Comment appeler des classes et des méthodes
Gérez vos propres annotations en Java
Comment utiliser l'égalité et l'égalité (comment utiliser l'égalité)
Comment installer Bootstrap dans Ruby
Comment connecter Heroku et Sequel
Comment utiliser InjectorHolder dans OpenAM
Comment convertir LocalDate et Timestamp
Comment installer jQuery dans Rails 6
Comment utiliser les classes en Java?
Comment nommer des variables en Java
Comment définir Lombok dans Eclipse
[Introduction aux rails] Comment utiliser le rendu
Comment concaténer des chaînes avec Java
Comment installer Swiper in Rails
Comment créer votre propre API headless à l'aide de REST Builder de Liferay (partie 3)