[JAVA] J'ai créé un MOD qui appelle instantanément un véhicule avec Minecraft

introduction

Bonjour. Récemment, inokinn pense à Minecraft, qu'il dorme ou se réveille.

Minecraft est amusant, n'est-ce pas? C'est amusant de créer des choses dans le jeu, mais ces jours-ci, vous pouvez créer un serveur multijoueur sur AWS et l'exploiter tout en vous amusant avec vos proches, ou créer votre propre skin d'avatar pour créer un personnage unique. , Présentation du programme d'extension de jeu (MOD) créé par diverses personnes, profitant du monde chaotique et profitant de l'artisanat dans différentes directions.

Eh bien, avec un tel Minecraft, vous pouvez également garder un animal de compagnie dans ce jeu. Vous pouvez garder un cheval et le monter, mais si vous le laissez à distance, il sera difficile de le trouver.

Alors, j'ai pensé: "J'aimerais pouvoir appeler mon cheval bien-aimé instantanément ...", mais quand je l'ai cherché, je n'ai pas trouvé un tel MOD, alors j'ai pensé essayer d'en faire un s'il n'était pas là, alors j'ai créé le titre MOD, donc ci-dessous Le processus de travail jusqu'à présent est résumé dans.

Exigences MOD

--Ajoutez un élément «Mount Whistle» qui enregistre un véhicule MOB (ci-après dénommé «montage») et appelle immédiatement la monture enregistrée lors de l'utilisation de l'objet.

Ce que j'ai fait

Préparer l'environnement de développement MOD

Je vais omettre ceci car la procédure sortira si vous google.

Ajouter un article

Suivez les étapes ci-dessous pour ajouter un nouvel élément.

Ecrire le processus d'enregistrement de l'article dans le programme principal MOD

Le code réel est indiqué ci-dessous. (Instruction d'importation omise)

MountWhistle.java


@Mod(modid = MountWhistle.MODID, name = MountWhistle.NAME, version = MountWhistle.VERSION)
public class MountWhistle {
    public static final String MODID = "mountwhistle";
    public static final String NAME = "Mount Whistle";
    public static final String VERSION = "1.0.2";
    public static final String PAKETNAME = "MountWhistle";

    public static Item mountWhistle;

    @Mod.EventHandler
    public void construct(FMLConstructionEvent event) {
        MinecraftForge.EVENT_BUS.register(this);
    }

    @SubscribeEvent
    public void registerItems(RegistryEvent.Register<Item> event) {
    	mountWhistle = new Whistle()
    			.setCreativeTab(CreativeTabs.TRANSPORTATION)
    			.setUnlocalizedName("mountwhistle")
    			.setRegistryName("mountwhistle")
    			.setMaxStackSize(1);
        event.getRegistry().register(mountWhistle);
    }

    @SubscribeEvent
    @SideOnly(Side.CLIENT)
    public void registerModels(ModelRegistryEvent event) {
        ModelLoader.setCustomModelResourceLocation(mountWhistle, 0, new ModelResourceLocation(new ResourceLocation("mountwhistle", "mountwhistle"), "inventory"));
    }
}

--Dans la méthode registerItems (RegistryEvent.Register <Item> event), écrivez le processus d'enregistrement de l'élément.
Les informations sur les articles sont décrites ici.

  • Dans la méthode registerModels (ModelRegistryEvent event), écrivez le processus d'enregistrement du modèle d'élément. Cela référencera le fichier json sous src.main.resources.assets.MOD_ID.models.items.

Décrivez les informations sur la texture de l'élément dans le fichier json

Créez un package src / main / resources / assets / MOD_ID / models / items et écrivez un fichier json dessous qui spécifie le fichier image avec item name.json.

mountwhistle.json


{
	"parent": "item/generated",
	"textures": {
		"layer0": "mountwhistle:items/whistle"
	}
}

Ajouter une texture d'élément au projet

Créez un package src / main / resources / assets / MOD_ID / textures / items et enregistrez le fichier image sous celui-ci avec item name.png.

Implémenter le comportement lors de l'utilisation de l'élément

De là, c'est la production. Tout d'abord, créez une classe d'objets Mount Whistle. Étant donné que la classe de base des éléments Minecraft est net.minecraft.item.Item, nous allons l'implémenter en remplaçant ceci.

Tout d'abord, le code source implémenté est montré ci-dessous, puis l'explication est lancée.

Code source de Whistle.java

Whistle.java


public class Whistle extends Item {

	@Override
	public void setDamage(ItemStack stack, int damage) {
		return;
	}

	@Override
	public ActionResult<ItemStack> onItemRightClick(World worldIn, EntityPlayer playerIn, EnumHand handIn) {
		Entity mount = playerIn.getRidingEntity();
		ItemStack itemStack = playerIn.getHeldItem(handIn);
		//Tu roules
		if (mount != null) {
			//Enregistrez la monture sur laquelle vous roulez actuellement
			NBTTagCompound nbtTag = itemStack.getTagCompound();
			if (nbtTag == null) {
				nbtTag = new NBTTagCompound();
				itemStack.setTagCompound(nbtTag);
			}

			if (nbtTag.hasKey("MountId") &&
					!UUID.fromString(nbtTag.getString("MountId")).equals(mount.getUniqueID())) {
				return new ActionResult<ItemStack>(EnumActionResult.PASS, playerIn.getHeldItem(handIn));
			}

			String name = mount.getName();

			if (worldIn.isRemote) {
				Minecraft.getMinecraft().ingameGUI.getChatGUI().printChatMessage(new TextComponentString("Sur le sifflet de la montagne" + name + "Je me suis inscrit!"));
			} else {
				nbtTag.setString("MountId", mount.getUniqueID().toString());
				nbtTag.setString("Name", name);
				itemStack.setStackDisplayName(name);

				//Rendre la monture immortelle
				mount.setEntityInvulnerable(true);
			}
		} else {
			NBTTagCompound nbtTag = itemStack.getTagCompound();
			if (nbtTag == null || !nbtTag.hasKey("MountId")) {
				if (worldIn.isRemote) {
					Minecraft.getMinecraft().ingameGUI.getChatGUI().printChatMessage(new TextComponentString("Vous pouvez enregistrer la monture en l'utilisant pendant la conduite."));
				}
				return new ActionResult<ItemStack>(EnumActionResult.PASS, playerIn.getHeldItem(handIn));
			}

			UUID mountId = UUID.fromString(nbtTag.getString("MountId"));

			MinecraftServer server =  worldIn.getMinecraftServer();

			if(server == null) {
				Minecraft.getMinecraft().ingameGUI.getChatGUI().printChatMessage(new TextComponentString("J'ai essayé de le convoquer."));
			} else {
				//Trouver des montures de toutes les entités
				mount = server.getEntityFromUuid(mountId);
				mount.setLocationAndAngles(playerIn.posX, playerIn.posY, playerIn.posZ, 0.0F, 0.0F);

				if (worldIn.isRemote) {
					if (mount != null) {
						String name = mount.getName();
						Minecraft.getMinecraft().ingameGUI.getChatGUI().printChatMessage(new TextComponentString(name + "A été convoqué."));
					}
				}
			}
		}

		return new ActionResult<ItemStack>(EnumActionResult.PASS, playerIn.getHeldItem(handIn));
	}
}

Commentaire

Évitez de consommer des articles

Normalement, les objets disparaissent après utilisation, mais le sifflet de montage est un objet que vous souhaitez utiliser encore et encore. La méthode qui gère la consommation lorsqu'elle est utilisée est setDamage (ItemStack stack, int damage), donc je remplace cela et immédiatement return pour éviter que quoi que ce soit ne se passe.

Comportement lors de l'utilisation d'éléments

La méthode appelée lors de l'utilisation d'un élément par un clic droit est ʻActionResult onItemRightClick (World worldIn, EntityPlayer playerIn, EnumHand handIn) `. En remplaçant cela, vous pouvez implémenter l'événement de clic droit.

Ici, nous déterminons d'abord si le joueur monte sur la monture. Si vous roulez, enregistrez la monture avec le NBT du sifflet de monture et traitez la monture pour qu'elle soit immortelle. Si vous ne roulez pas, invoquez la monture enregistrée dans le sifflet de monture NBT aux coordonnées du joueur.

Qu'est-ce que NBT

Lorsque nous donnons des informations à un élément, nous utilisons un mécanisme appelé «NBT». NBT est une abréviation de «Named Binary Tag», et Minecraft stocke diverses données dans un format de données appelé NBT. Si l'élément n'a pas de balise NBT, créez une instance de NBTTagCompound, d'abord setTagCompound (nbtTag), puis enregistrez l'UUID (identificateur unique de l'objet entité) du montage. Veuillez noter que l'élément ne conservera aucune information à moins que vous ne fassiez le premier setTagCompound (nbtTag). Une chose à garder à l'esprit lors de l'affectation de balises NBT à des éléments est que les balises NBT ne peuvent pas être attachées aux éléments, et la cible réelle est ʻItemStack`. ItemStack est un ensemble d'articles et fait référence à "un cadre dans l'inventaire".

Choses à savoir lors de la lecture multijoueur

Le programme MOD se déclenche à la fois sur le client et le serveur. Cependant, j'aimerais que ce processus ne fonctionne que sur le client, ou vice versa. Comme traitement à ce moment-là, vous pouvez créer une branche en regardant la valeur de ʻisRemote de l'objet World`. "True" côté client et "false" côté serveur. Ici, le message de discussion ne s'affiche que lorsqu'il est exécuté côté client et les coordonnées de montage ne sont modifiées que lorsqu'il est exécuté côté serveur. Si vous ne gérez pas le serveur et le client, la monture se déplacera vers vous pendant un moment, puis la monture commencera à marcher à partir des coordonnées côté serveur, de sorte qu'elle reviendra instantanément à sa position d'origine.

Ce qui a été fait

Je l'ai téléchargé sur GitHub. https://github.com/inokinn/MountWhistle

Je vais vraiment le déplacer

Tout d'abord, prenez le sifflet de monture. Par défaut, vous pouvez fabriquer avec 9 objets "Gisar's Vegetables" ajoutés par le MOD Chococraft . Je vais. En utilisant le sifflet de monture lors de la conduite de la monture, l'enregistrement est réussi si le nom de l'élément devient le nom de la monture. Après cela, vous pouvez utiliser le sifflet de monture lorsque vous ne roulez pas et que la monture arrive au joueur.

  • En raison des spécifications de Minecraft, qui ne peuvent faire référence qu'aux entités en mémoire, il n'est pas possible d'appeler une monture trop éloignée.

en conclusion

Concernant le développement de Minecraft MOD, il y a peu d'informations, il faut du temps pour construire et vérifier le fonctionnement, le comportement est différent entre le jeu unique et le multijoueur, etc. En raison de la répétition d'essais et d'erreurs, du début du développement à l'achèvement 2 Cela a pris environ un jour. En particulier, la documentation japonaise était ancienne et rare, et j'avais l'impression de devoir lire le code source réel. J'espère que le développement de Minecraft MOD sera également plus excitant au Japon.

Recommended Posts

J'ai créé un MOD qui appelle instantanément un véhicule avec Minecraft
J'ai créé un Wrapper qui appelle KNP depuis Java
J'ai créé une interface graphique avec Swing
J'ai fait une mort risquée avec Ruby
J'ai créé une application Janken avec kotlin
J'ai créé une application Janken avec Android
J'ai créé une classe qui génère automatiquement Json qui spécifie la texture de Minecraft [1.12.2]
J'ai créé un site qui résume les informations sur la restriction du sucre avec Vue.js
04. J'ai fait un frontal avec SpringBoot + Thymeleaf
J'ai fait de l'art de la mosaïque avec des images Pokemon
J'ai créé une application de visualisation qui affiche le PDF
J'ai créé un robot LINE avec Rails + heroku
J'ai fait un portfolio avec Ruby On Rails
[Ruby] J'ai fait un robot avec de l'anémone et du nokogiri.
J'ai créé une bibliothèque qui fonctionne comme un onglet dans Safari !!
J'ai créé une application Android qui GET avec HTTP
J'ai créé un environnement de développement avec rails6 + docker + postgreSQL + Materialise.
J'ai créé un plug-in qui exécute jextract avec des tâches Gradle
J'ai créé une application de chat.
J'ai essayé de créer un programme en Java qui résout le problème du voyageur de commerce avec un algorithme génétique
J'ai créé une interface de ligne de commande avec WinMerge Plugin en utilisant JD-Core
Une histoire que j'ai eu du mal à défier le pro de la concurrence avec Java
[Rails] J'ai créé une mini-application de calendrier simple avec des spécifications personnalisées.
J'ai créé un formulaire de recherche simple avec Spring Boot + GitHub Search API.
J'ai créé une source qui génère automatiquement un fichier de classe d'entité JPA
J'ai posé une question qui peut être utilisée pour des entretiens techniques
J'ai créé une application shopify @java
Comment signer Minecraft MOD
J'ai fait une simple fonction de recommandation.
J'ai créé une application correspondante (application Android)
J'ai créé un outil de génération package.xml.
[Android] J'ai créé une application de podomètre.
J'ai essayé d'apprendre Java avec une série que les débutants peuvent comprendre clairement
J'ai essayé de créer une API Web qui se connecte à DB avec Quarkus
J'ai créé une classe qui peut utiliser JUMAN et KNP de Java
[LINE BOT] J'ai créé un Ramen BOT avec Java (Maven) + Heroku + Spring Boot (1)
[Ruby] J'ai créé un simple client Ping
J'ai créé un serveur écologique avec scala
J'ai essayé de jouer un peu avec BottomNavigationView ①
J'ai créé un plug-in pour IntelliJ IDEA
J'ai créé une application de calculatrice sur Android
J'ai créé un nouvel outil de déploiement Java
Apprendre Java avec Progate → Je vais vous expliquer parce que j'ai moi-même créé un jeu de base
Une histoire dans laquelle j'étais vraiment quand j'ai fait triple DES avec ruby