Categories
IT-tutorials

Hur man använder NMS i Bukkit

Även om Minecraft välkomnar olika plugins (som du kan använda för att ändra din spelupplevelse) är vissa delar av spelet skyddade från pluginmanipulation. Net.Minecraft.Server (NMS) är ett av dessa skyddade paket, eftersom det innehåller viktig serverkod för spelet. Den här koden kommer direkt från Minecrafts utvecklare, Mojang, och är inte tänkt att vara tillgänglig för spelare.

Med Bukkit kan spelare skapa ett abstraktionslager runt NMS-koden. Detta gör att de kan utveckla plug-ins som interagerar med serverns kod utan att göra direkta ändringar i kodbasen som är nödvändig för att spela spelet. Se det som ett fönster som låter dig titta på koden du vill använda i ditt plugin men också fungerar som en barriär som hindrar dig från att ändra koden direkt.

Låt oss utforska hur man använder Bukkit med Minecrafts NMS.

Innan du börjar – Vad du behöver veta om Bukkit

Bukkit är ett API som låter dig skapa och använda plugins som ändrar hur du upplever multiplayer-aspekten av Minecraft. Åtminstone var det. Den senaste versionen av Bukkit kom ut 2016, och den har sedan dess avvecklats för att ge plats åt ett annat API, som heter Spigot. Samtidigt som den fungerar på samma sätt som Bukkit erbjuder den bättre serverprestanda.

Så att använda Bukkit för dina plugins kräver att du både spelar en föråldrad version av Minecraft och accepterar det faktum att Bukkit inte är lika bra som dess ersättnings-API. Förutsatt att du är glad att acceptera dessa uppoffringar, här är de enda sakerna du behöver:

  • Java Development Kit (JDK) 7 eller högre, där de flesta rekommenderar JDK 8.

Med det är du redo att skapa några plugins.

Hur man skapar Bukkit-plugins för Minecraft

Innan du kan börja använda Bukkit för att komma åt Minecrafts NMS måste du lägga till API:et som ett beroende, ställa in en huvudklass som gör att Bukkit kan interagera med pluginet du skapar och förse Bukkit med den information den behöver för att ladda din plugin i spel. Varje steg kräver kodning, med exemplen som följer kommer från RIP handledning.

Steg 1 – Lägg till Bukkit som ett beroende

Tidigare kunde du lägga till Bukkit som ett beroende i Minecraft genom att ladda ner filen Bukkit.jar från Bukkit Repository och lägga till den i ditt projekts klassväg. Det alternativet är inte tillgängligt längre eftersom arkivet inte längre är tillgängligt.

Tack och lov finns det en alternativ metod som använder ditt spels pom.xml-fil. Öppna filen och lägg till följande rader:

<repositories>
    <repository>
        <id>spigot-repo</id>
        <url>https://hub.spigotmc.org/nexus/content/repositories/snapshots/</url>
    </repository>
</repositories>
<dependencies>
    <!--Bukkit API-->
    <dependency>
        <groupId>org.bukkit</groupId>
        <artifactId>bukkit</artifactId>
        <version>{VERSION}</version>
        <scope>provided</scope>
    </dependency>
</dependencies>

Steg 2 – Skapa din plugins huvudklass

Ditt plugin måste kunna skapa en enda instans av dess huvudklass, som används för att utöka “JavaPlugin” så att det känner igen och låter dig använda pluginet när du är i spelet. Tänk på denna huvudklass som dörren genom vilken Bukkit kan gå in för att både ladda och manipulera plugin. De flesta ger sin plugins huvudklass samma namn som själva pluginet, vilket gör det lättare att referera till huvudklassen vid kodning.

Följande exempelkod från RIP Tutorial erbjuder ett exempel på en huvudklass för en plugin som heter “MyPlugin:”

package com.example.myplugin; //{$TopLevelDomain}.{$Domain}.{$PluginName};
import org.bukkit.plugin.java.JavaPlugin;
public final class MyPlugin extends JavaPlugin {
    @Override
    public void onEnable() {
        //Called when the plugin is enabled
        getLogger().info("onEnable has been invoked!");
    }
    @Override
    public void onDisable() {
        //Called when the plugin is disabled
        getLogger().info("onDisable has been invoked!");
    }
}

Få åtkomst till ditt plugin från en annan klass

Du kanske vill komma åt ditt plugin via en annan klass än huvudklassen du skapar för det, vilket kan vara till hjälp för att komma åt flera plugins i ett enda Minecraft-spel.

För att göra det måste du först lagra en instans av huvudklassen du skapade med Bukkit så att andra klasser kan komma åt den. Återigen kommer följande exempelkod från RIP Tutorial och använder klassnamnet “MyPlugin”:

public class MyPlugin extends JavaPlugin {
    private static MyPlugin instance; //Effectively final variable containing your plugin's instance
    public MyPlugin(){
        if(MyPlugin.instance != null) { //Unnecessary check but ensures your plugin is only initialized once.
            throw new Error("Plugin already initialized!");
        }
        MyPlugin.instance = this; //A plugin's constructor should only be called once
    }
    public static MyPlugin getInstance(){ //Get's your plugin's instance
        return instance;
    }
    //your other code...
}

När du har instansen på plats kan du komma åt din huvudklass (skapad via Bukkit) med kommandot “getInstance()”. Här är ett exempel på det med RIP Tutorials “MyPlugin”-huvudklass:

public class MyOtherClass {
    public void doSomethingWithMainClass(){
        MyPlugin.getInstance().getLogger().info("We just used MyPlugin");
    }
}

Steg 3 – Skapa din plugin.yml-fil

En plugin.yml-fil innehåller viktig information om din plugin, vilket betyder att den fungerar som pluginens grundläggande konfigurationsfil. Utan den här filen kommer Bukkit inte att ha den information den behöver för att ladda ditt plugin till Minecraft, vilket leder till att plugin inte kan laddas och att spelet sannolikt kraschar.

Denna fil bör innehålla följande detaljer:

  • Namn – Detta är namnet du har gett ditt plugin (dvs. RIP Tutorials “MyPlugin”) och det kommer att visas i loggmeddelanden och din plugin-lista.
  • Version – Använd det här fältet för att ange pluginens versionshistorik, från och med 1.0.0 och går uppåt när du ändrar eller redigerar plugin-programmet.
  • Main – Innehåller namnet på pluginens huvudklass, som utökar “JavaPlugin”, vilket tillåter Bukkit att komma in i plugin. I exemplet RIP Tutorial skulle detta namn vara “package com.example.myplugin”, vilket du kan se i huvudklasskoden ovan.
  • Beskrivning – En grundläggande beskrivning av vad din plugin gör.
  • Författare – Du kan ha en enda författare eller flera författare, där den senare betecknas med hakparenteser och kommatecken enligt följande – [Author1, Author2, Author3].
  • Bidragsgivare – Du kommer att använda det här avsnittet för att notera alla som bidragit till ditt plugin, med formateringen som är densamma som för avsnittet “Författare”.
  • Webbplats – Om du har en webbplats att koppla in, eller vill länka personer till plugin-sidan eller GitHub-förrådet, kan du ange URL:en här.
  • API-version – Ange versionen av Bukkit API som du använder här. Om du inte anger en API-version kommer Minecraft att anta att den laddar ett äldre plugin. Insticksprogrammet kan fortfarande fungera, även om du kommer att se en varning om att det är en äldre version utskriven på din konsol när den laddas.

Följande är ett exempel på en plugin.yml-fil baserat på namnkonventionerna som används i RIP-handledningskoden som används i den här artikeln:

name: MyPlugin
version: 1.0.0
main: package com.example.myplugin
description: A test plugin for Minecraft
author: RIP Tutorial
website: https://riptutorial.com/bukkit
api-version: 1.17

Är Bukkit rätt för att komma åt och använda NMS?

Med det har du skapat ett Bukkit-beroende, byggt en huvudklass för att fungera som Bukkits dörr till plugin-programmet och har en plugin.yml-fil som Bukkit kan använda för att se vad plugin-programmet gör. Men du kanske inte vill göra det, eftersom Bukkit är så inaktuell att du måste köra en mycket gammal version av Minecraft för att kunna använda den effektivt. De flesta har redan gått vidare till Sprigot, vilket speglar det mesta av vad Bukkit gjorde samtidigt som det erbjuder bättre prestanda.

Om du fortfarande vill använda Bukkit för att komma åt plugins, varför valde du det före mer moderna API:er? Vilka typer av plugins använder du för att förbättra din Minecraft-upplevelse? Berätta allt om det i kommentarsfältet nedan.

Leave a Reply