+ Antworten
Seite 1 von 4 1 2 3 ... LetzteLetzte
Ergebnis 1 bis 10 von 32
  1. #1
    Creeper-Jäger Avatar von Lurchi029
    Registriert seit
    30.10.2011
    Beiträge
    289
    Minecraft
    Lurchi029

    [Tutorial] Mods für Multiplayer erstellen

    Hallo, willkommen zu meinem kleinen Multiplayer-Crashkurs! Hier möchte ich euch die Grundlagen zum Modden für Server näherbringen! Allgemein ist das nicht viel anders als "normales" SP Modding, man hat nur viel mehr IDs für alles mögliche.

    1. Ihr benötigt:
    -Einen selbst erstellten SP Mod, den ihr umschreiben wollt
    -Ein frisches und aktuelles Coder Pack
    -Risugamis ModLoader
    -SDKs ModLoaderMP für Client und Server
    -ggf. weitere APIs, wenn ihr diese einbauen wollt (wie AudioMod oder CreativeAPI)
    -Moddingkenntnisse für Singleplayer

    Wenn ihr diese Sachen erfolgreich heruntergeladen habt, müsst ihr natürlich (wie normal) decompilen, aber hier gibt's ein paar Besonderheiten! Das möchte ich euch nun erklären:

    2. Das decompilen:
    -Wie üblich packt ihr einen frischen bin und resources-Ordner in den jars-Ordner vom MCP
    -In die minecraft.jar packt ihr nun den ModLoader (wie üblich) und den extrahierten ModLoaderMP für Client! Solltet ihr APIs verwenden, wie zum Beispiel AudioMod oder CreativeAPI, packt diese nur in die normale minecraft.jar, also den Client!
    -META-INF Ordner löschen und dann ist der Client schon fertig
    -Da ihr für den Server modden wollt, benötigt ihr eine frische minecraft_server.jar, die ihr ebenfalls in den jars-Ordner vom MCP packt (Wichtig: Den META-INF Ordner auf keinen Fall löschen!)
    -Diesen Server öffnet ihr nun und zieht per Drag&Drop die extrahierten Datein vom ModLoaderMP (Server) hinein

    Damit sind die Vorbereitungen abgeschlossen. Jetzt könnt ihr die decompile.bat ausführen! Das wird jetzt etwas länger dauern. Wenn er fertig ist, werdet ihr höchstwahrscheinlich einen Error angezeigt bekommen. (Bei MLMP für 1.3.1 aber nur noch sehr selten bis gar nicht). Da steht dann irgendwas von wegen exception2. Das Problem ist schnell gelöst. Geht im neuen src Ordner unter minecraft_server -> net -> minecraft -> server in die MinecraftServer.java, denn da liegt der Fehler. Dort löscht ihr folgenden Code:
    Code:
    break MISSING_BLOCK_LABEL_350;
            }
            try
            {
                stopServer();
                serverStopped = true;
            }
            catch(Throwable throwable)
            {
                throwable.printStackTrace();
            }
            finally
            {
                System.exit(0);
            }
            break MISSING_BLOCK_LABEL_350;
            Exception exception2;
            exception2;
            try
            {
                stopServer();
                serverStopped = true;
            }
            catch(Throwable throwable3)
            {
                throwable3.printStackTrace();
            }
            finally
            {
                System.exit(0);
            }
            throw exception2;
        }
    ...und ersetzt das alles mit einer "}".
    Dann recompilen und keine Errors mehr bekommen. Was jetzt kommt ist wichtig: Damit später auch reobfuscaten könnt, führt einmal die "updateMD5.bat" aus. Dadurch wird der fehlerfreie Code als "normaler" Code angesehen und alles, was später kommt, wird als neu angesehen und später auch reobfuscated! Vorher konnten diese MD5s nicht generiert werden, weil der Servercode fehlerhaft war.

    Jetzt der spannende Teil:
    Kopiert euch eure Moddatein aus einem alten MCP und fügt sie in den neuen src-Ordner vom Client ein. Kopiert aber nur euren Code, nicht irgendwelche Notchklassen! Zu diesem Zeitpunkt dürfte alles noch laufen.
    Jetzt nehmt ihr wiederum euren alten Modcode, aber ohne die "Model", "GUI" und "Render"-Datein und fügt sie in eure Server-src ein (unter src - minecraft_server - net - minecraft - src). Jetzt werdet ihr sehr viele Errors bekommen, was aber ganz normal ist. Die einzelnen Errorquellen gucken wir uns nun näher an:

    1. Die mod_-Datei
    Das Wichtigste ist, dass sowohl die mod_-Datei vom Client als auch die mod_-Dateiatei vom Server nun BaseModMp extenden, und nicht mehr BaseMod.
    Als nächstes schmeißt ihr serverseits alle ModLoader.addName-Sachen raus. Die Namen laufen alle über den Client! Gleiches gilt für die addRender-Methode, wenn ihr sie habt. Ein import net.minecraft.client.Minecraft; muss serverseits auch rausfliegen. Wo soll der Server denn euren Minecraftclient herbekommen?!
    Soweit so gut. In den nächsten Schritten werdet ihr hin und wieder an euren mod_Datei (Client und Server) noch etwas ergänzen müssen, aber dazu später mehr.

    2. GUIs
    GUIs sind auf dem Server... Nunja, sie sind nicht schwer, eher "anders". Sicherlich erinnert ihr euch noch, das alle GUI-Dateien nicht in der Server reinsollten. Das hat den Grund, dass nun der Server vom Client das GUI bekommen soll. Das geht mit sogenannten GUI-IDs. Die müsst ihr nur einbauen und dann klappt das auch.
    Dazu geht ihr in die Datei, in der das GUI (serverseits) geöffnet werden soll. Meist in der BlockSowieso-Datei unter blockActivated. Gewöhlich öffnet ihr das GUI mit "ModLoader.openGUI" und so weiter und so fort. Genau da wird euch aber nun der Fehler angezeigt, da ihr noch eine GUI-ID einbauen müsst. Das macht ihr dann so:
    Code:
    ModLoader.openGUI(entityplayer, GUI-ID, entityplayer.inventory, new ContainerWasauchimmer(entityplayer.inventory, tileentitywieauchimmer));
    Die GUI-ID ist eine Zahl eurer Wahl, zum Beispiel 5, 33 oder 42, allerdings sollten die IDs nicht höher als 128 sein.
    Dieser Code ist übrigens typisch für 08/15 Öfen und muss je nach Typ angepasst werden. Auf jeden Fall muss nun das GUI auch geöffnet werden. Dazu müsst ihr dem Client sagen, was er wie und wann machen soll. Zunächst sagen wir ihm also die GUI-ID mit folgendem Code, der clientseits in die load()-Methode der mod_-Datei gehört:

    Code:
    ModLoaderMp.registerGUI(this, GUI-ID von eben);
    Damit weiß der Client, dass eine GUI-ID eurer Wahl gibt. Damit kann der Client aber noch immer nichts anfangen, also muss er wissen, was passiert, wenn er vom Server den Befehl "Öffne das GUI mit dieser oder jeder ID" bekommt. Daher kommt (wieder Clientseits) in die mod_Datei, aber außerhalb der load() folgendes:

    Code:
    public GuiScreen handleGUI(int i) //int i ist die Variable für die GUI-ID
              {      	  
              TileEntityWasauchimmer tileentity = new TileEntityWasauchimmer(); //macht die TE nutzbar
        		  
               if(i == GUI-ID von eben) // wenn die GUI-ID die von eben ist....
              {
               return new GuiDeinGUI(ModLoader.getMinecraftInstance().thePlayer.inventory, tileentity); //...rufe das GUI auf
              }        	  
              else return null; //und wenn nichts passt, mache nichts        	  
              }
    Sogesehen heißt das: Wenn die empfangene GUI-ID diese oder jede ist, dann wird die entsprechende GUI-Datei abgerufen und das GUI geöffnet.
    Diese Schritte wiederholt ihr nun für jedes einzelne GUI, natürlich immer mit einer anderen GUI-ID. Macht aber auf keinen Fall mehrere Methoden dafür, packt alles in diese eine "handleGUI" rein!

    3. Entities (Keine Mobs!)
    Auch Entities müssen einen Umweg gehen, aber nicht so kompliziert wie die GUIs. Zwar bekommen sie auch eine ID (nämlich eine Entity-ID), aber das muss nur in der mod_-Datei gemacht werden.
    Serverseits registriert ihr die Entity-ID in der load()-Methode der mod_-Datei so:
    Code:
    ModLoader.registerEntityID(EntityDeinEntity.class, "Name", ModLoader.getUniqueEntityId());
    .
    Aber das war noch nicht alles, jetzt geht's erst richtig los. Weiterhin serverseits kommt drunter:

    Code:
    ModLoaderMp.registerEntityTrackerEntry(EntityDasEntity.class, ID);
    ModLoaderMp.registerEntityTracker(EntityDasEntity.class, 160, 5); //Die Zahlen sind mir ein Rätsel
    Damit ist das Entity auf dem Server schonmal registriert, fehlt noch der Client. Da geht ihr wieder in die load() und ergänzt folgendes:

    Code:
    ModLoaderMp.registerNetClientHandlerEntity(EntityDasEntity.class, ID);
    Bei ID einfach eine selbst ausgesuchte Entity-ID rein und dann ist's fertig.

    Mobs müssen in der Regel nicht angepasst werden. Wenn es aber doch Fehler gibt, probiert die Schritte oben aus!
    Eine ganz wichtige Regel für den Server ist: Spawne nie ein Entity, wenn world.isRemote wahr/erfüllt ist!


    4. EntityPlayer umgehen und kleine Tricks (serverseits, danke an @Foerster44 )

    Wie ihr sicher wisst, kann man im Singleplayer "Minecraft" mit ModLoader.getMinecraftInstance(); umgehen. Dadurch kann man auch auf den EntityPlayer zugreifen (ModLoader.getMinecraftInstance().thePlayer; wäre das dann).
    Im Multiplayer kann man den EntiyPlayerMP mit folgendem umgehen/ersetzen:
    Code:
    mc.configManager.getPlayerEntity(name);
    Wie ich oben bereits erwähnt habe, kann der Server nicht auf den Minecraft-Client zugreifen. Stellt sich nun die Frage, für was das "mc" hier steht. Eigentlich ganz simpel: mc steht hier für den MinecraftServer. Diesen könnt ihr mit ModLoader.getMinecraftServerInstance(); erreichen.

    Wir fassen zusammen:

    Code:
    MinecraftServer mc = ModLoader.getMinecraftServerInstance(); 
    EntityPlayerMP player = mc.configManager.getPlayerEntity(name);
    Wenn man jetzt auf einen Spielernamen zugreifen will, benötigt man logischerweise:

    Code:
    String name = mc.getUserName();
    In eine Zeile gequetscht wäre es dann:

    Code:
    ModLoader.getMinecraftServerInstance().configManager.getPlayerEntity(ModLoader.getMinecraftServerInstance().getUserName);
    Der Sinn des Ganzen ist ganz einfach: Durch den Zugriff auf den Server und den EntityPlayer im MP könnt ihr vieles machen: Feuerresistenz, Geschwindigkeit erhöhen, usw. Für die Möglichkeiten, die ihr dadurch bekommt, solltet ihr am besten selbst ein wenig herumexperimientieren!
    __

    Das war jetzt ein grober Überblick über MP-Modding. An vielen Stellen heißen Clientmethoden auf dem Server anders, da müsst ihr euch etwas selbst umsehen, aber die meisten Errors sollten gefixt sein. Wenn ich etwas vergessen oder falsch erklärt habe, meldet euch! Jetzt noch allgemeine Sachen:

    -Keybinds können serverseits rausgeworfen werfen
    -Texturen müssen nicht in der Server rein
    -Client = Singelplayer
    -Zum testen vom Server führt die Startserver.bat aus und connected mit der Startclient.bat drauf
    -Zum veröffentlichen einfach reobfuscaten und kurz testen
    -Man benötigt den ModLoaderMP auch, wenn man nur im SP spielen will!
    -Hier noch ein Link zu Flans Tutorial zum Thema MP-Mods (englisch, aber mit einigen optionalen Anleitungen: http://www.minecraftforum.net/topic/...odding-310511/)

    Das war's jetzt aber wirklich. Nicht vergessen, dass das hier nur ein kleiner Crashkurs ist und nicht alle Errors beheben wird. Bei anderen Errors orientiert euch bitte zunächst am "Notchcode" oder fragt hier im Thread!
    Ich hoffe, ich konnte euch damit etwas helfen
    Geändert von Lurchi029 (11.08.2012 um 17:20 Uhr) Grund: Kleine Ergänzung


  2. #2
    Creeper-Jäger Avatar von chRIs-_-
    Registriert seit
    05.12.2011
    Beiträge
    371
    Minecraft
    Sephirot_
    @Lurchi029
    Danke
    Jetzt kann ich endlich SMP-Mods machen

    Wäre übrigens echt cool wenn ihr in die Threads @(NAME)
    schreibt, wenn ihr jemandem antwortet. Das ist dazu, dass er/sie sieht das jemand ihr/ihm
    geantwortet hat(z.B. @chRIs-_-)


  3. #3
    ♫ ٩(͡๏̯͡๏)۶ ♪ Avatar von pitman-87
    Registriert seit
    10.01.2011
    Beiträge
    1.599
    Super Tut

    Übrigens, weist du wie das mit dem Partikel spawnen direkt läuft? Weil hatte da so meine Probleme damit, da diese nur clientseitig gespawnt werden, aber im server der vorgang abläuft

  4. #4
    Creeper-Jäger Avatar von Hiroscho
    Registriert seit
    16.10.2011
    Beiträge
    370
    Minecraft
    hiroscho
    Auf dem Server wird nur die Methode ausgeführt:
    Code:
    spawnParticle(String par1Str, double par2, double par4, double par6, double par8, double par10, double par12);

  5. #5
    ♫ ٩(͡๏̯͡๏)۶ ♪ Avatar von pitman-87
    Registriert seit
    10.01.2011
    Beiträge
    1.599
    @Hiroscho

    Ist mir schon klar, jedoch wird das im Clienten nicht angezeigt

    Zumindest war es bei der beta 1.7 mal oder so, als ich noch damit herumgespielt habe.

  6. #6
    Creeper-Jäger
    Registriert seit
    09.03.2011
    Beiträge
    258
    Gutes Tutorial, ich hab nur noch ein paar kleine (sicher hilfreiche) ergänzende Anmerkungen:
    Was im Singleplayermodding
    Code:
    Minecraft mc = ModLoader.getMinecraftInstance();
    EntityPlayerSP player = mc.thePlayer;
    war, wird beim Servermodding etwas erweitert zu
    Code:
    MinecraftServer mc = ModLoader.getMinecraftServerInstance();
    String name = mc.getUserName();
    EntityPlayerMP player = mc.configManager.getPlayerEntity(name);
    Danke schon mal im Voraus (optionaler Zusatz )
    Liebe Grüße

    Förster44

  7. Mag ich Lurchi029, pitman-87 mag diesen Beitrag
  8. #7
    Creeper-Jäger Avatar von Lurchi029
    Registriert seit
    30.10.2011
    Beiträge
    289
    Minecraft
    Lurchi029
    Danke, werde ich sofort einbauen! Das mit dem EntityPlayer umgehen wusste ich selbst noch nicht


  9. #8
    Bergarbeiter
    Registriert seit
    11.02.2012
    Beiträge
    105
    Minecraft
    Florianos
    Dein Postfach ist voll . Ich kann dir keine Pm schicken !

  10. #9
    ♫ ٩(͡๏̯͡๏)۶ ♪ Avatar von pitman-87
    Registriert seit
    10.01.2011
    Beiträge
    1.599
    Bin grad dabei mein TF2 Teleporter lauffähig zu bekommen, leider bekomme ich immer die Meldung, dass ich gekickt wurde wegen Hacking.
    Obwohl ich Serverseitig teleportiere und nicht clientseitig, sogar mit der selben Funktion, die der /tp-command benutzt.

    Ich weis grad echt nicht mehr weiter XD

  11. #10
    Creeper-Jäger Avatar von Hiroscho
    Registriert seit
    16.10.2011
    Beiträge
    370
    Minecraft
    hiroscho
    @pitman-87 Dann steht bei dir wohl im serverseitigen Code sowas wie ein playerEntity.teleportTo(double, double, double, float, float)? Aber du wirst wahrscheinlich auch noch eine Clientseitige Teleportation für den Singleplayer haben, vielleicht wird diese vor der Serverseitigen aufgerufen?

+ Antworten