[JAVA] Ich habe einen MOD erstellt, der sofort ein Fahrzeug mit Minecraft anruft

Einführung

Hallo. In letzter Zeit denkt Inokinn über Minecraft nach, ob er schläft oder aufwacht.

Minecraft macht Spaß, nicht wahr? Es macht Spaß, Dinge im Spiel zu machen, aber heutzutage können Sie einen Server für den Mehrspielermodus in AWS erstellen und ihn betreiben, während Sie Spaß mit Ihren Verwandten haben, oder Ihren eigenen Avatar-Skin erstellen, um einen einzigartigen Charakter zu erstellen. , Einführung in das Game Extension Program (MOD), das von verschiedenen Personen erstellt wurde, die chaotische Welt genießen und das Basteln aus verschiedenen Richtungen genießen.

Nun, mit solch Minecraft kannst du auch ein Haustier in diesem Spiel behalten. Sie können ein Pferd behalten und es reiten, aber wenn Sie es in einiger Entfernung lassen, wird es schwierig sein, es zu finden.

Also dachte ich: "Ich wünschte, ich könnte mein geliebtes Pferd sofort anrufen ...", aber als ich danach suchte, konnte ich keinen solchen MOD finden, also dachte ich, ich würde versuchen, einen zu machen, wenn er nicht da wäre, also habe ich den Titel MOD gemacht, also unten Der bisherige Arbeitsprozess ist in zusammengefasst.

MOD-Anforderungen

Was ich getan habe

Bereiten Sie die MOD-Entwicklungsumgebung vor

Ich werde dies weglassen, da die Prozedur herauskommt, wenn Sie googeln.

Fügen Sie einen Artikel hinzu

Führen Sie die folgenden Schritte aus, um ein neues Element hinzuzufügen.

Schreiben Sie den Artikelregistrierungsprozess in das MOD-Hauptprogramm

Der tatsächliche Code wird unten angezeigt. (Importanweisung weggelassen)

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"));
    }
}
  • Schreiben Sie in der Methode registerItems (RegistryEvent.Register <Item> event) den Artikelregistrierungsprozess.
    Artikelinformationen werden hier beschrieben.
  • Schreiben Sie in der Methode "registerModels (ModelRegistryEvent event)" den Registrierungsprozess des Elementmodells. Dies verweist auf die json-Datei unter "src.main.resources.assets.MOD_ID.models.items".

Beschreiben der Informationen zur Textur des Elements in der JSON-Datei

Erstellen Sie ein Paket "src / main / resources / assets / MOD_ID / models / items" und schreiben Sie eine JSON-Datei darunter, die die Bilddatei mit "item name.json" angibt.

mountwhistle.json


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

Elementtextur zum Projekt hinzufügen

Erstellen Sie ein Paket "src / main / resources / assets / MOD_ID / textures / items" und speichern Sie die Bilddatei darunter mit "item name.png ".

Implementieren Sie das Verhalten bei Verwendung des Elements

Ab hier ist die Produktion. Erstellen Sie zunächst eine Klasse von Mount Whistle-Elementen. Da die Basisklasse der Minecraft-Elemente "net.minecraft.item.Item" ist, werden wir sie implementieren, indem wir dies überschreiben.

Zuerst wird der implementierte Quellcode unten gezeigt, und dann wird die Erklärung gestartet.

Whistle.java Quellcode

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);
		//Reitest du
		if (mount != null) {
			//Registrieren Sie das Reittier, auf dem Sie gerade fahren
			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("Auf dem Berg pfeifen" + name + "Ich registrierte!"));
			} else {
				nbtTag.setString("MountId", mount.getUniqueID().toString());
				nbtTag.setString("Name", name);
				itemStack.setStackDisplayName(name);

				//Machen Sie die Montierung unsterblich
				mount.setEntityInvulnerable(true);
			}
		} else {
			NBTTagCompound nbtTag = itemStack.getTagCompound();
			if (nbtTag == null || !nbtTag.hasKey("MountId")) {
				if (worldIn.isRemote) {
					Minecraft.getMinecraft().ingameGUI.getChatGUI().printChatMessage(new TextComponentString("Sie können die Halterung registrieren, indem Sie sie während der Fahrt verwenden."));
				}
				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("Ich habe versucht, es zu beschwören."));
			} else {
				//Finden Sie Reittiere von allen Entitäten
				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 + "Wurde gerufen."));
					}
				}
			}
		}

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

Kommentar

Vermeiden Sie den Konsum von Gegenständen

Normalerweise verschwinden Gegenstände nach dem Gebrauch, aber Mount Whistle ist ein Gegenstand, den Sie immer wieder verwenden möchten. Die Methode, die den Verbrauch bei Verwendung behandelt, ist "setDamage (ItemStack-Stapel, int-Schaden)". Ich überschreibe dies und "kehre sofort zurück", um zu verhindern, dass etwas passiert.

Verhalten bei der Verwendung von Gegenständen

Die Methode, die bei Verwendung eines Elements durch Klicken mit der rechten Maustaste aufgerufen wird, lautet "ActionResult onItemRightClick (World worldIn, EntityPlayer playerIn, EnumHand handIn)". Wenn Sie dies überschreiben, können Sie das Ereignis mit der rechten Maustaste implementieren.

Hier bestimmen wir zuerst, ob der Spieler auf dem Reittier reitet. Wenn Sie fahren, registrieren Sie die Montierung mit dem NBT der Mount-Pfeife und verarbeiten Sie die Montierung als unsterblich. Wenn Sie nicht reiten, rufen Sie das in der Reitpfeife NBT registrierte Reittier zu den Koordinaten des Spielers.

Was ist NBT?

Wenn wir einem Artikel Informationen geben, verwenden wir einen Mechanismus namens "NBT". NBT ist eine Abkürzung für "Named Binary Tag", und Minecraft speichert verschiedene Daten in einem Datenformat namens NBT. Wenn das Element kein NBT-Tag hat, erstellen Sie eine Instanz von "NBTTagCompound", setzen Sie zuerst "setTagCompound (nbtTag)" und registrieren Sie dann die UUID (eindeutige Kennung des Entitätsobjekts) des Mount. Bitte beachten Sie, dass das Element keine Informationen speichert, es sei denn, Sie führen das erste "setTagCompound (nbtTag)" aus. Beachten Sie beim Zuweisen von NBT-Tags zu Elementen, dass NBT-Tags nicht an Elemente angehängt werden können und das eigentliche Ziel, das angehängt werden soll, "ItemStack" ist. ItemStack ist ein Bündel von Artikeln und bezieht sich auf "einen Frame im Inventar".

Dinge, die Sie beim Spielen im Mehrspielermodus beachten sollten

Das MOD-Programm wird sowohl auf dem Client als auch auf dem Server ausgelöst. Ich möchte jedoch, dass dieser Prozess nur auf dem Client funktioniert oder umgekehrt. Zu diesem Zeitpunkt können Sie verzweigen, indem Sie den Wert von "isRemote" des "World" -Objekts betrachten. True auf der Client-Seite und false auf der Server-Seite. Hier wird die Chat-Nachricht nur angezeigt, wenn sie auf der Clientseite ausgeführt wird, und die Mount-Koordinaten werden nur geändert, wenn sie auf der Serverseite ausgeführt wird. Wenn Sie den Server und den Client nicht verwalten, bewegt sich der Mount für einen Moment zu Ihnen, und dann beginnt der Mount, von den Koordinaten auf der Serverseite aus zu laufen, sodass er sofort an seine ursprüngliche Position zurückkehrt.

Was wurde gemacht

Ich habe es auf GitHub hochgeladen. https://github.com/inokinn/MountWhistle

Ich werde es tatsächlich bewegen

Holen Sie sich zuerst die Mount-Pfeife. Standardmäßig können Sie mit 9 Gegenständen "Gisars Gemüse" basteln, die vom MOD Chococraft hinzugefügt wurden. Ich werde. Durch die Verwendung der Reitpfeife beim Reiten ist die Registrierung erfolgreich, wenn der Name des Elements zum Namen des Reittiers wird. Danach ist es in Ordnung, wenn Sie die Mount-Pfeife verwenden, wenn Sie nicht fahren, und das Mount zum Player kommt.

  • Aufgrund der Spezifikationen von Minecraft, die sich nur auf On-Memory-Entitäten beziehen können, ist es nicht möglich, ein zu weit entferntes Mount aufzurufen.

abschließend

In Bezug auf die Entwicklung von Minecraft MOD gibt es nur wenige Informationen, das Erstellen und Überprüfen des Betriebs dauert einige Zeit, das Verhalten unterscheidet sich zwischen Einzelspiel und Mehrspielermodus usw. Aufgrund wiederholter Versuche und Irrtümer vom Beginn der Entwicklung bis zur Fertigstellung 2 Es dauerte ungefähr einen Tag. Insbesondere die japanische Dokumentation war alt und selten, und ich hatte das Gefühl, den eigentlichen Quellcode lesen zu müssen. Ich hoffe, dass die Entwicklung von Minecraft MOD auch in Japan spannender wird.

Recommended Posts

Ich habe einen MOD erstellt, der sofort ein Fahrzeug mit Minecraft anruft
Ich habe einen Wrapper erstellt, der KNP von Java aus aufruft
Ich habe mit Swing eine GUI erstellt
Ich habe mit Ruby einen riskanten Würfel gemacht
Ich habe eine Janken App mit Kotlin gemacht
Ich habe eine Janken App mit Android gemacht
Ich habe eine Klasse erstellt, die automatisch Json generiert, die die Textur von Minecraft angibt [1.12.2]
Ich habe mit Vue.js eine Seite erstellt, die Informationen zur Zuckereinschränkung zusammenfasst
04. Ich habe mit SpringBoot + Thymeleaf ein Frontend gemacht
Ich habe Mosaikkunst mit Pokemon-Bildern gemacht
Ich habe eine Viewer-App erstellt, die PDF anzeigt
Ich habe einen LINE Bot mit Rails + Heroku gemacht
Ich habe mit Ruby On Rails ein Portfolio erstellt
[Ruby] Ich habe einen Crawler mit Anemone und Nokogiri gemacht.
Ich habe eine Bibliothek erstellt, die in Safari wie ein Tab funktioniert !!
Ich habe eine Android-App erstellt, die mit HTTP abgerufen wird
Ich habe eine Entwicklungsumgebung mit Rails6 + Docker + PostgreSQL + Materialise erstellt.
Ich habe ein Plug-In erstellt, das Jextract mit Gradle-Aufgaben ausführt
Ich habe eine Chat-App erstellt.
Ich habe versucht, ein Programm in Java zu erstellen, das das Problem des Handlungsreisenden mit einem genetischen Algorithmus löst
Ich habe mit JD-Core eine Befehlszeilenschnittstelle mit dem WinMerge Plugin erstellt
Eine Geschichte, die ich mit Java nur schwer herausfordern konnte
[Rails] Ich habe eine einfache Kalender-Mini-App mit benutzerdefinierten Spezifikationen erstellt.
Ich habe ein einfaches Suchformular mit Spring Boot + GitHub Search API erstellt.
Ich habe eine Quelle erstellt, die automatisch eine JPA-Entitätsklassendatei generiert
Ich habe eine shopify App @java erstellt
Wie unterschreibe ich Minecraft MOD?
Ich habe eine einfache Empfehlungsfunktion erstellt.
Ich habe eine passende App erstellt (Android App)
Ich habe ein Tool zur Generierung von package.xml erstellt.
[Android] Ich habe eine Schrittzähler-App erstellt.
Ich habe versucht, Java mit einer Reihe zu lernen, die Anfänger klar verstehen können
Ich habe versucht, eine Web-API zu erstellen, die mit Quarkus eine Verbindung zur Datenbank herstellt
Ich habe eine Klasse erstellt, die JUMAN und KNP aus Java verwenden kann
[LINE BOT] Ich habe einen Ramen BOT mit Java (Maven) + Heroku + Spring Boot (1) gemacht.
[Ruby] Ich habe einen einfachen Ping-Client erstellt
Ich habe einen Öko-Server mit Scala gemacht
Ich habe versucht, ein wenig mit BottomNavigationView zu spielen ①
Ich habe ein Plug-In für IntelliJ IDEA erstellt
Ich habe eine Taschenrechner-App für Android erstellt
Ich habe ein neues Java-Bereitstellungstool erstellt
Lerne Java mit Progate → Ich werde es erklären, weil ich selbst ein einfaches Spiel gemacht habe
Eine Geschichte, die mir sehr gut gefallen hat, als ich mit Ruby Triple DES gemacht habe