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.
--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.
Je vais omettre ceci car la procédure sortira si vous google.
Suivez les étapes ci-dessous pour ajouter un nouvel élément.
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.
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
.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"
}
}
Créez un package src / main / resources / assets / MOD_ID / textures / items
et enregistrez le fichier image sous celui-ci avec item name.png
.
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.
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));
}
}
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.
La méthode appelée lors de l'utilisation d'un élément par un clic droit est ʻActionResult
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.
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".
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.
Je l'ai téléchargé sur GitHub. https://github.com/inokinn/MountWhistle
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.
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