+ Antworten
Seite 1 von 78 1 2 3 11 51 ... LetzteLetzte
Ergebnis 1 bis 10 von 778
  1. #1
    Forengestein Avatar von Zweistein2
    Registriert seit
    21.10.2010
    Beiträge
    2.571

    [Tutorial] MCP V.5.0 - Coden 1.0.0 -32 Anleitungen-

    Ich weis, dass es schon 2 Tutorials gibt, die an sich sehr gut sind, aber einfach zu wenig beinhalten (nichts gegen Gerbon oder gethero) Deswegen hab ich mir gedacht, ich schreib euch ein möglichst ausführliches Tutorial.

    Damit ihr wisst, was alles wo zu finden ist :



    Hier gehts zu den Tuts 16 - 23: Klick mich!
    Hier gehts zu den Tuts 24 - 29: Klick mich!
    Hier gehts zu den Tuts 30 +: Klick mich!

    Was noch kommt:

    Wie lasse ich einen Mob fliegen?
    Wie erstelle ich eigene Songs/Musikdiscs?
    Wie erstelle ich ein Gui?
    Wie erstelle ich eine neue Welt und das Portal dorthin?
    Wie erstelle ich eigene Bäume?
    Und das ganz Tut nochmal für Modloader

    Legende:
    Diese markierten Sätze sind optional
    Diese Sätze sind neu hinzugefügt

    1.Wo finde ich das MCP und wie installiere ich es?

    Das MCP (Minecraft Coder Pack) "übersetzt" die .class Dateien von Minecraft in .java Dateien, die mithilfe von Eclipse (oder auch dem Windows-Editor) geöffnet und modifiziert werden können. Zu finden ist das MCP hier

    Zusätzlich zum MCP braucht man auch das Java Development Kit, kurz JDK, welches hier zu finden ist.

    Als erstes muss man das heruntergeladene MCP entpacken (am besten nach C:\ ). Danach muss man die .exe des JDK's ausführen.

    Nur, wenn, die javac.exe nicht gefunden wird:

    Nun sucht man die javac.exe, die standardmäßig hier zu finden ist: C:\Program Files\Java\jdk1.7.0\bin (evlt. habt ihr das jdk woanders installiert). Dann öffnet man folgendes: Systemsteuerung -> System und Sicherheit -> System -> erweiterte Systemeinstellungen. Nun sollte sich ein neues Fenster öffnen, wo ihr auf Umgebungsvariablen klickt. Dort sucht ihr nach Path und klickt bearbeiten. Ganz am Ende der Code-Zeile macht ihr ein ; und fügt den oberen, fettgedruckten Pfad der javac.exe ein. (wenn ihr das JDK woanders installiert habt, müsst ihr euren Pfad nehmen).

    So, nun geht in den .minecraft-Ordner ( bei Start auf Suche und das eingeben: %appdata% -> roaming\.minecraft) und kopiert den kompletten Inhalt (alle Ordner und Dateien darin (WICHTIG: Ohne Mods!)) in den MCP-Ordner: mcp61\jars . Dann startet ihr die decompile.bat

    Herzlichen Glückwunsch, ihr habt nun erfolgreich das MCP installiert und die Minecraft-Dateien übersetzen lassen!

    2.Das Modden

    Vorwort: Alle .java Dateien zum modden findet ihr unter: mcp61\src\minecraft\src. Die wichtigste Regel beim Modden ist nicht zu verzweifeln, wenn etwas nicht so läuft, wie man sich das vorgestellt hat. Modden lernt man nicht in 1-2 Stunden!

    1. Wie erstelle ich einen Block?

    Als erstes öffnet ihr die Block.java und scrollt runter bis ihr diese Zeilen seht:

    Code:
        public static final Block stone;
        public static final BlockGrass grass;
        public static final Block dirt;
    Ihr schreibt über diese Zeilen folgendes:

    Code:
        public static final Block NAME;
    Diese Zeile sagt Minecraft eigentlich bloß, dass es einen weiteren Block gibt, der NAME heißt. Nun weis Minecraft zwar, dass es einen neuen Block gibt, der NAME heißt, aber nicht wie er ingame heißt, welche ID er hat, ob er Spezialfunktionen hat, und, und, und... Das würde aber einen Fehler ausgeben. Deshalb scrollen wir weiter runter, bis wir auf diesen Codeschnipsel stoßen:

    Code:
            stone = (new BlockStone(1, 1)).setHardness(1.5F).setResistance(10F).setStepSound(soundStoneFootstep).setBlockName("stone");
            grass = (BlockGrass)(new BlockGrass(2)).setHardness(0.6F).setStepSound(soundGrassFootstep).setBlockName("grass");
            dirt = (new BlockDirt(3, 2)).setHardness(0.5F).setStepSound(soundGravelFootstep).setBlockName("dirt");
    Darüber fügen wir die folgende Zeile ein:

    Code:
            NAME = (new Block(123, 226, Material.wood)).setHardness(1.5F).setResistance(10F).setStepSound(soundStoneFootstep).setLightValue(1.0F).disableStats().setLightOpacity(3).setBlockName("NAME");
    Dieser Teil sagt Minecraft, dass der Block NAME die ID 123 (du kannst die ID's 123- 255 verwenden) und die Textur 226 hat. Die Texturen sind einzeln durchnummeriert. ganz oben links in der Terrain.png ist die 0. Cleanstone ist 1, Dirt ist 2, Grass ist 3,... (226 ist direkt neben grauer Wolle).
    Material.wood legt fest, dass der Block aus Holz besteht. (man kann auch diese anstatt wood nehmen: iron, rock,... (weitere stehen in der Material.java))
    .setHardness() legt die Festigkeit des Blockes fest (wichtig für die Abbaugeschwindigkeit).
    .setResistance() legt die Explosionsresistenz fest.
    .setStepSound() legt den Ton fest, der ertönt, wenn man über den Block läuft.
    .setBlockName() legt fest, wie der Block in der en_US.lang heißen muss (für die Ingame-Name)
    .setLightValue() legt die Leuchtkraft des Blocks fest. (von 0.1F - 1.0F )
    .disableStats() legt fest, dass der Block nicht in den Statistiken erscheint (wie oft gecraftet/abgebaut/...)
    .setLightOpacity() legt die Lichtundurchlässigkeit eines Blocks fest (von 1 (Blätter) bis 3 (Eis))

    2. Wie erstelle ich ein Item?

    Normal:

    Ihr öffnet die Item.java und scrollt wiedermal runter, bis ihr folgendes findet:

    Code:
        public static Item shovelSteel;
        public static Item pickaxeSteel;
        public static Item axeSteel;
        public static Item flintAndSteel = (new ItemFlintAndSteel(3)).setIconCoord(5, 0).setItemName("flintAndSteel");
    Ihr fügt nun zwischen

    Code:
        public static Item axeSteel;
        public static Item flintAndSteel = (new ItemFlintAndSteel(3)).setIconCoord(5, 0).setItemName("flintAndSteel");
    das hier ein:

    Code:
        public static Item NAME = (new Item(127)).setIconCoord(5, 5).setItemName("NAME");
    Das sagt Minecraft, dass es ein Item namens NAME gibt, welches die ID 127 (Ihr könnt natürlich auch eine andere nehmen (von 127 - 2000)) hat.
    .setItemCoord(X, Y) legt die Textur fest. Wie bei den Blöcken sind die Texturen durchnummeriert und fangen bei 0 an. die erste Zahl gibt die Spalte von links an: (3, 0) heißt also in der 4.Reihe ganz oben (Der Diamant-Helm). Die zweite Zahl legt die Reihe von oben aus fest. .setItemName() legt wieder den Namen für die en_US.lang fest.

    Tools und Waffen:

    Im Prinzip genauso wie bei den normalen Item, aber doch mit einem kleinem Unterschied

    anstatt dem:

    Code:
        public static Item NAME = (new Item(127)).setIconCoord(5, 5).setItemName("NAME");
    müsst ihr das hier schreiben:

    Code:
        public static Item NAME;
    Nun weis Minecraft, dass es ein Item namens Name gibt, aber wie ihr von den Blöcken wisst ist das zu wenig, deshalb scrollen wir weiter nach unten:

    Code:
            shovelSteel = (new ItemSpade(0, EnumToolMaterial.IRON)).setIconCoord(2, 5).setItemName("shovelIron");
            pickaxeSteel = (new ItemPickaxe(1, EnumToolMaterial.IRON)).setIconCoord(2, 6).setItemName("pickaxeIron");
            axeSteel = (new ItemAxe(2, EnumToolMaterial.IRON)).setIconCoord(2, 7).setItemName("hatchetIron");
    Hier fügt ihr nun diese Zeile hinzu:

    Code:
            NAME = (new ItemTOOL(127, EnumToolMaterial.MATERIAL)).setIconCoord(5, 5).setItemName("NAME");
    je nach dem was ihr für ein Item machen wollt müsst ihr nun das TOOL durch etwas ersetzen:

    Spade = für Schaufel
    Pickaxe = für Spitzhacke
    Axe = für Axt
    Sword = für Schwert
    Hoe = Hacke

    127 ist wieder die ID. Und was .setIconCoord(X, Y) und .setItemName() machen wissen wir auch schon.
    EnumToolMaterial.MATERIAL legt das Material des Werkzeugs fest: es gibt STONE, IRON, EMERALD, WOOD und GOLD. (= Stein, Eisen, Diamant, Holz und Gold)

    Da Werkzeuge aber nicht vom Himmel fallen, müssen wir ein Craftingrezept dafür erstellen. Dazu müsst ihr die RecipesTools.java öffnen und hier:

    Code:
        public RecipesTools()
        {
            recipeItems = (new Object[][] {
                new Object[] {
                    Block.planks, Block.cobblestone, Item.ingotIron, Item.diamond, Item.ingotGold
                }, new Object[] {
                    Item.pickaxeWood, Item.pickaxeStone, Item.pickaxeSteel, Item.pickaxeDiamond, Item.pickaxeGold
                }, new Object[] {
                    Item.shovelWood, Item.shovelStone, Item.shovelSteel, Item.shovelDiamond, Item.shovelGold
                }, new Object[] {
                    Item.axeWood, Item.axeStone, Item.axeSteel, Item.axeDiamond, Item.axeGold
                }, new Object[] {
                    Item.hoeWood, Item.hoeStone, Item.hoeSteel, Item.hoeDiamond, Item.hoeGold,
                }
            });
        }
    folgendes hinzufügen:

    Code:
        public RecipesTools()
        {
            recipeItems = (new Object[][] {
                new Object[] {
                    Block.planks, Block.cobblestone, Item.ingotIron, Item.diamond, Item.ingotGold, Item.CRAFTITEM
                }, new Object[] {
                    Item.pickaxeWood, Item.pickaxeStone, Item.pickaxeSteel, Item.pickaxeDiamond, Item.pickaxeGold, Item.NAME
                }, new Object[] {
                    Item.shovelWood, Item.shovelStone, Item.shovelSteel, Item.shovelDiamond, Item.shovelGold, Item.NAME
                }, new Object[] {
                    Item.axeWood, Item.axeStone, Item.axeSteel, Item.axeDiamond, Item.axeGold, Item.NAME
                }, new Object[] {
                    Item.hoeWood, Item.hoeStone, Item.hoeSteel, Item.hoeDiamond, Item.hoeGold, Item.NAME
                }
            });
        }
    Ihr müsst bei CRAFTITEM das Item, welches man zum Craften des Werkzeugs benötigt einfügen und bei NAME das Item, was schließlich herauskommen soll. Die Craftingrezepte sind wie bei den normalen Werkzeugen, bloß dass man sein CRAFTITEM zum Craften verwenden muss.

    Dasselbe müssen wir auch für Schwerter machen:

    Code:
        public RecipesWeapons()
        {
            recipeItems = (new Object[][] {
                new Object[] {
                    Block.planks, Block.cobblestone, Item.ingotIron, Item.diamond, Item.ingotGold, Item.CRAFTITEM
                }, new Object[] {
                    Item.swordWood, Item.swordStone, Item.swordSteel, Item.swordDiamond, Item.swordGold, Item.NAME
                }
            });
        }
    So, nun haben wir auch ein funktionierendes Schwert.

    3. Wie erstelle ich ein Material für Werkzeuge/Waffen?

    Als Erstes öffnen wir die EnumToolMaterial.java und fügen hier:

    Code:
        WOOD("WOOD", 0, 0, 59, 2.0F, 0, 15),
        STONE("STONE", 1, 1, 131, 4F, 1, 5),
        IRON("IRON", 2, 2, 250, 6F, 2, 14),
        EMERALD("EMERALD", 3, 3, 1561, 8F, 3, 10),
        GOLD("GOLD", 4, 0, 32, 12F, 0, 22);
    unser neues Material ein. Das sieht dann so aus:

    Code:
        WOOD("WOOD", 0, 0, 59, 2.0F, 0, 15),
        STONE("STONE", 1, 1, 131, 4F, 1, 5),
        IRON("IRON", 2, 2, 250, 6F, 2, 14),
        EMERALD("EMERALD", 3, 3, 1561, 8F, 3, 10),
        GOLD("GOLD", 4, 0, 32, 12F, 0, 22),
        NAME("NAME", 5, 3, 1600, 8F, 4, 10);
    NAME ist der Name des Materials (also wie IRON, GOLD,...) 5 ist die ID für das Material.1600 ist die Anzahl der Benutzungen, bevor das Werkzeug kaputt geht, 8F ist die Effizienz gegen Blöcke (Abbaugeschw.) und 4 der Schaden gegen Mobs. Was 3 ist weiß ich nicht so genau (Laut EnumToolMaterial das Erntelevel. Da würde ich mich an ein ähnliches Material halten). 10 ist die Verzauberbarkeit, also wie oft/wie gut man die Waffe/Werkzeug verzaubern kann.

    Zum Schluss muss man ganz unten das hinzufügen:

    Code:
        public static final EnumToolMaterial IRON;
        public static final EnumToolMaterial EMERALD;
        public static final EnumToolMaterial GOLD;
        public static final EnumToolMaterial NAME;
    */
        private final int harvestLevel;
        private final int maxUses;
        private final float efficiencyOnProperMaterial;
        private final int damageVsEntity;
        //private static final EnumToolMaterial field_21209_j[]; /* synthetic field */
    /*
        static 
        {
            WOOD = new EnumToolMaterial("WOOD", 0, 0, 59, 2.0F, 0, 15);
            STONE = new EnumToolMaterial("STONE", 1, 1, 131, 4F, 1, 5);
            IRON = new EnumToolMaterial("IRON", 2, 2, 250, 6F, 2, 14);
            EMERALD = new EnumToolMaterial("EMERALD", 3, 3, 1561, 8F, 3, 10);
            GOLD = new EnumToolMaterial("GOLD", 4, 0, 32, 12F, 0, 22);
            NAME = new EnumToolMaterial("NAME", 5, 3, 1600, 8F, 4, 10);
            field_21209_j = (new EnumToolMaterial[] {
                WOOD, STONE, IRON, EMERALD, GOLD, NAME
            });
        }
    */
    }
    Nun kann das Material bei eigenen Werkzeugen und Waffen benutzt werden.

    4. Wie verändere ich die normalen Größen eines Blocks?

    Zuerst erstellen wir einen neuen Block wie oben beschrieben. Allerdings schreiben wir anstatt:

    Code:
            NAME = (new Block(123, 226, Material.wood)).setHardness(1.5F).setResistance(10F).setStepSound(soundStoneFootstep).setBlockName("NAME");
    das hier:

    Code:
            NAME = (new BlockNAME(123)).setHardness(1.5F).setResistance(10F).setStepSound(soundStoneFootstep).setBlockName("NAME");
    Dann müssen wir eine neue .java Datei erstellen (oder wir kopieren die Block.java, benennen sie in BlockNAME.java um und löschen den Inhalt), die wir BlockNAME.java nennen. Danach schreiben wir folgendes in die BlockNAME.java rein:

    Code:
    package net.minecraft.src;
    
    import java.util.Random;
    
    public class BlockNAME extends Block
    {
    
        protected BlockNAME(int i)
        {
            super(i, Material.wood);
            setBlockBounds(0.0F, 0.0F, 0.0F, 1.0F, 2.0F, 1.0F);
            blockIndexInTexture = 226;
        }
    
        public int quantityDropped(Random random)
        {
            return 1;
        }
    
        public int idDropped(int i, Random random)
        {
            return Block.NAME.blockID;
        }
    }
    Damit wäre der Block 1x2x1 groß.

    setBlockBounds(0.0F, 0.0F, 0.0F, 1.0F, 1.0F, 1.0F); legt die Größen der Blöcke fest.
    WICHTIG: Nur die 1.0F ändern! Wenn man die Größen der Blöcke ändert kann Minecraft sie evtl. nicht mehr richtig beleuchten (Teile sind evtl. ganz im Schatten, obwohl die Sonne draufscheint).
    import java.util.Random; erlaubt uns, auf den Zufallsgenerator von Java zuzugreifen.
    blockIndexInTexture = 226; legt die Textur fest (hier 226)

    5. Wie erstelle ich ein eigenes Craftingrezept?

    Zuerst öffnen wir die CraftingManager.java und scrollen bis hier hin runter:

    Code:
            addRecipe(new ItemStack(Item.paper, 3), new Object[] {
                "###", Character.valueOf('#'), Item.reed
            });
            addRecipe(new ItemStack(Item.book, 1), new Object[] {
                "#", "#", "#", Character.valueOf('#'), Item.paper
            });
    und fügen darüber unser Craftingrezept ein, welches wie folgt aussieht:

    Code:
            addRecipe(new ItemStack(Item.NAME, X), new Object[] {
                "###", Character.valueOf('#'), Item.CRAFTITEM
            });
    Item.NAME ist das Item, was beim Craften herauskommen soll. X ist die Anzahl des Items, welches man bekommt. Item.CRAFTITEM ist das Item die man zum Craften benötigt. Im oberen Fall bekommt man X-mal das Item NAME, wenn man 3mal das CRAFTITEM nebeneinander legt (wie beim Craften von Papier. Wenn ihr aber 2 oder mehr Items zum Craften verwenden wollt, müsst ihr das so machen:

    Code:
            addRecipe(new ItemStack(Item.NAME, X), new Object[] {
                "###", "YYY", Character.valueOf('#'), Item.CRAFTITEM, Character.valueOf('Y'), Item.CRAFTITEM2
            });
    Item.CRAFTITEM2 ist das 2te Item, welches zum Craften gebraucht wird.

    6. Wie erstelle ich ein Ofen-Rezept?

    Zuerst scrollen wir in der FurnaceRecipes.java bis hier hinunter:

    Code:
        private FurnaceRecipes()
        {
            smeltingList = new HashMap();
            addSmelting(Block.oreIron.blockID, new ItemStack(Item.ingotIron));
    Und schreiben diese Zeile darunter:

    Code:
        private FurnaceRecipes()
        {
            smeltingList = new HashMap();
            addSmelting(Block.oreIron.blockID, new ItemStack(Item.ingotIron));
            addSmelting(Block.XXX.blockID, new ItemStack(Item.YYY));
           addSmelting(Item.YYY.shiftedIndex, new ItemStack(Block.XXX));
    Damit sagen wir Minecraft, dass ein Block XXX zu einem Item YYY wird, wenn man es in den Ofen tut.
    Natürlich kann man auch Items in Blöcke verwandeln lassen. Dazu schreiben wir die dunkelorange Zeile hinein.

    Wichtig: bei Blöcken .blockID, bei Items .shiftedIndex am Ende, sonst gibts Fehler.

    addSmelting() fügt ein neues Ofenrezept hinzu.
    new ItemStack() macht ein/en neues/en Item/Block ins Inventar (in dem Fall das "Ofeninventar" (Also rechts das Kästchen neben dem Pfeil ))

    7. Wie lasse ich einen Block mitgenerieren?

    Zuerst öffnet ihr die BiomeDecorator.java und scrollt bis hier herunter:

    Code:
    public class BiomeDecorator
    {
    
        protected World currentWorld;
        protected Random randomGenerator;
        protected int chunk_X;
        protected int chunk_Z;
        protected BiomeGenBase biome;
        protected WorldGenerator clayGen;
        protected WorldGenerator sandGen;
        protected WorldGenerator gravelAsSandGen;
        protected WorldGenerator dirtGen;
        protected WorldGenerator gravelGen;
        protected WorldGenerator coalGen;
        protected WorldGenerator ironGen;
        protected WorldGenerator goldGen;
        protected WorldGenerator redstoneGen;
        protected WorldGenerator diamondGen;
        protected WorldGenerator lapisGen;
        protected WorldGenerator plantYellowGen;
        protected WorldGenerator plantRedGen;
        protected WorldGenerator mushroomBrownGen;
        protected WorldGenerator mushroomRedGen;
        protected WorldGenerator bigMushroomGen;
        protected WorldGenerator reedGen;
        protected WorldGenerator cactusGen;
        protected WorldGenerator waterlilyGen;
        protected int waterlilyPerChunk;
        protected int treesPerChunk;
        protected int flowersPerChunk;
        protected int grassPerChunk;
        protected int deadBushPerChunk;
        protected int mushroomsPerChunk;
        protected int reedsPerChunk;
        protected int cactiPerChunk;
        protected int sandPerChunk;
        protected int sandPerChunk2;
        protected int clayPerChunk;
        protected int bigMushroomsPerChunk;
        public boolean generateLakes;
    
        public BiomeDecorator(BiomeGenBase biomegenbase)
        {
            clayGen = new WorldGenClay(4);
            sandGen = new WorldGenSand(7, Block.sand.blockID);
            gravelAsSandGen = new WorldGenSand(6, Block.gravel.blockID);
            dirtGen = new WorldGenMinable(Block.dirt.blockID, 32);
            gravelGen = new WorldGenMinable(Block.gravel.blockID, 32);
            coalGen = new WorldGenMinable(Block.oreCoal.blockID, 16);
            ironGen = new WorldGenMinable(Block.oreIron.blockID, 8);
            goldGen = new WorldGenMinable(Block.oreGold.blockID, 8);
            redstoneGen = new WorldGenMinable(Block.oreRedstone.blockID, 7);
            diamondGen = new WorldGenMinable(Block.oreDiamond.blockID, 7);
            lapisGen = new WorldGenMinable(Block.oreLapis.blockID, 6);
            plantYellowGen1 = new WorldGenFlowers(Block.plantYellow.blockID);
            plantYellowGen2 = new WorldGenFlowers(Block.plantYellow.blockID);
            mushroomBrownGen = new WorldGenFlowers(Block.mushroomBrown.blockID);
            mushroomRedGen = new WorldGenFlowers(Block.mushroomRed.blockID);
            reedGen = new WorldGenReed();
            cactusGen = new WorldGenCactus();
            treesPerChunk = 0;
            flowersPerChunk = 2;
            grassPerChunk = 1;
            deadBushPerChunk = 0;
            mushroomsPerChunk = 0;
            reedsPerChunk = 0;
            cactiPerChunk = 0;
            sandPerChunk = 1;
            sandPerChunk2 = 3;
            clayPerChunk = 1;
            biome = biomegenbase;
        }
    Nun fügen wir unseren Block ein:

    Code:
    public class BiomeDecorator
    {
    
        protected World currentWorld;
        protected Random randomGenerator;
        protected int chunk_X;
        protected int chunk_Z;
        protected BiomeGenBase biome;
        protected WorldGenerator clayGen;
        protected WorldGenerator sandGen;
        protected WorldGenerator gravelAsSandGen;
        protected WorldGenerator dirtGen;
        protected WorldGenerator gravelGen;
        protected WorldGenerator coalGen;
        protected WorldGenerator ironGen;
        protected WorldGenerator goldGen;
        protected WorldGenerator redstoneGen;
        protected WorldGenerator diamondGen;
        protected WorldGenerator lapisGen;
        protected WorldGenerator ERZGEN;
        protected WorldGenerator plantYellowGen;
        protected WorldGenerator plantRedGen;
        protected WorldGenerator mushroomBrownGen;
        protected WorldGenerator mushroomRedGen;
        protected WorldGenerator bigMushroomGen;
        protected WorldGenerator reedGen;
        protected WorldGenerator cactusGen;
        protected WorldGenerator waterlilyGen;
        protected int waterlilyPerChunk;
        protected int treesPerChunk;
        protected int flowersPerChunk;
        protected int grassPerChunk;
        protected int deadBushPerChunk;
        protected int mushroomsPerChunk;
        protected int reedsPerChunk;
        protected int cactiPerChunk;
        protected int sandPerChunk;
        protected int sandPerChunk2;
        protected int clayPerChunk;
        protected int bigMushroomsPerChunk;
        public boolean generateLakes;
    
        public BiomeDecorator(BiomeGenBase biomegenbase)
        {
            clayGen = new WorldGenClay(4);
            sandGen = new WorldGenSand(7, Block.sand.blockID);
            gravelAsSandGen = new WorldGenSand(6, Block.gravel.blockID);
            dirtGen = new WorldGenMinable(Block.dirt.blockID, 32);
            gravelGen = new WorldGenMinable(Block.gravel.blockID, 32);
            coalGen = new WorldGenMinable(Block.oreCoal.blockID, 16);
            ironGen = new WorldGenMinable(Block.oreIron.blockID, 8);
            goldGen = new WorldGenMinable(Block.oreGold.blockID, 8);
            redstoneGen = new WorldGenMinable(Block.oreRedstone.blockID, 7);
            diamondGen = new WorldGenMinable(Block.oreDiamond.blockID, 7);
            lapisGen = new WorldGenMinable(Block.oreLapis.blockID, 6);
            ERZGEN = new WorldGenMinable(Block.NAME.blockID, 16);
            plantYellowGen1 = new WorldGenFlowers(Block.plantYellow.blockID);
            plantYellowGen2 = new WorldGenFlowers(Block.plantYellow.blockID);
            mushroomBrownGen = new WorldGenFlowers(Block.mushroomBrown.blockID);
            mushroomRedGen = new WorldGenFlowers(Block.mushroomRed.blockID);
            reedGen = new WorldGenReed();
            cactusGen = new WorldGenCactus();
            treesPerChunk = 0;
            flowersPerChunk = 2;
            grassPerChunk = 1;
            deadBushPerChunk = 0;
            mushroomsPerChunk = 0;
            reedsPerChunk = 0;
            cactiPerChunk = 0;
            sandPerChunk = 1;
            sandPerChunk2 = 3;
            clayPerChunk = 1;
            biome = biomegenbase;
        }
    So, Nun wird unser Block NAME wie Kohle generiert.

    Code:
    ERZGEN = new WorldGenMinable(Block.NAME.blockID, 16);
    , 16); legt wieder die Spawnhäufigkeit fest (wieder in 2er Schritten ändern: 2,4,6,8,10,...)

    Zum Schluss müssen noch das hier einfügen:

    Code:
        protected void generateOres()
        {
            genStandardOre1(20, dirtGen, 0, currentWorld.worldYMax);
            genStandardOre1(10, gravelGen, 0, currentWorld.worldYMax);
            genStandardOre1(20, coalGen, 0, currentWorld.worldYMax);
            genStandardOre1(20, ironGen, 0, currentWorld.worldYMax / 2);
            genStandardOre1(2, goldGen, 0, currentWorld.worldYMax / 4);
            genStandardOre1(8, redstoneGen, 0, currentWorld.worldYMax / 8);
            genStandardOre1(1, diamondGen, 0, currentWorld.worldYMax / 8);
            genStandardOre2(1, lapisGen, currentWorld.worldYMax / 8, currentWorld.worldYMax / 8);
            genStandardOre1(20, ERZGEN, 0, currentWorld.worldYMax);
        }
    }
    8. Wie lasse ich einen Block in meine Richtung schauen? (wie bei Treppen)

    Dazu fügt iht einfach dieses Codeschnipselchen in die BlockNAME.java ein:

    Code:
        public void onBlockPlacedBy(World world, int i, int j, int k, EntityLiving entityliving)
        {
            int l = MathHelper.floor_double((double)((entityliving.rotationYaw * 4F) / 360F) + 0.5D) & 3;
            if(l == 0)
            {
                world.setBlockMetadataWithNotify(i, j, k, 2);
            }
            if(l == 1)
            {
                world.setBlockMetadataWithNotify(i, j, k, 1);
            }
            if(l == 2)
            {
                world.setBlockMetadataWithNotify(i, j, k, 3);
            }
            if(l == 3)
            {
                world.setBlockMetadataWithNotify(i, j, k, 0);
            }
        }
    if(l == X) gibt die Richtung an, wie der Block gesetzt wurde (1 = Norden, 2 = Osten,3 = Süden,0 = Westen)


    9. Wie erstelle ich einen eigenen Mob (auch nicht-humanoide)?

    Humanoid:

    Ihr erstellt erst die ModelXX.java (XX ist der Name des Mobs). In diese schreibt ihr folgendes hinein:

    Code:
    package net.minecraft.src;
    
    public class ModelXX extends ModelBiped
    {
    
        public ModelXX()
        {
        }
    }
    Das macht nichts anderes als Alles aus der ModelBiped zu laden und zu verwenden. (public class ModelXX extends ModelBiped)
    So, nun haben wir das Modell eines menschlichen Mobs, was kommt nun?

    Richtig, das Verhalten. Dazu erstellen wir die EntityXX.java und fügen das hier ein:

    Code:
    package net.minecraft.src;
    
    import java.util.Random;
    
    public class EntityXX extends EntityMob
    {
    
        public EntityXX(World world)
        {
            super(world);
            texture = "/mob/XX.png";
            moveSpeed = 0.5F;
            attackStrength = 5;
        }
    
        public int getMaxHealth()
        {
            return 20;
        }
    
        public void onLivingUpdate()
        {
            if(worldObj.isDaytime() && !worldObj.multiplayerWorld)
            {
                float f = getEntityBrightness(1.0F);
                if(f > 0.5F && worldObj.canBlockSeeTheSky(MathHelper.floor_double(posX), MathHelper.floor_double(posY), MathHelper.floor_double(posZ)) && rand.nextFloat() * 30F < (f - 0.4F) * 2.0F)
                {
                    setFire(8);
                }
            }
            super.onLivingUpdate();
        }
    
        protected String getLivingSound()
        {
            return "mob.zombie";
        }
    
        protected String getHurtSound()
        {
            return "mob.zombiehurt";
        }
    
        protected String getDeathSound()
        {
            return "mob.zombiedeath";
        }
    
        protected int getDropItemId()
        {
            return Item.DROPITEM.shiftedIndex;
        }
    }
    Nun haben wir einen aggressiven Mob erstellt.

    texture = "/mob/XX.png"; heißt, dass die Textur des Mobs im Ordner mob ist und XX.png heißt (die Textur muss dann aber auch XX.png heißen und im mod-Ordner sein. Für die Textur nehmt ihr am Besten die Char.png, kopiert sie und benennt sie in XX.png um. Danach müsst ihr sie nur noch bemalen.)
    moveSpeed = 0.5F; legt die Geschwiendigkeit des Mobs fest (0.5F ist Zombie, 1.0F ist Spieler).
    attackStrength = 5; legt die Angriffstärke fest (5 ist Zombie).
    public int getMaxHealth() legt das Leben des Mobs fest.


    Code:
    public void onLivingUpdate()
        {
            if(worldObj.isDaytime() && !worldObj.multiplayerWorld)
            {
                float f = getEntityBrightness(1.0F);
                if(f > 0.5F && worldObj.canBlockSeeTheSky(MathHelper.floor_double(posX), MathHelper.floor_double(posY), MathHelper.floor_double(posZ)) && rand.nextFloat() * 30F < (f - 0.4F) * 2.0F)
                {
                    setFire(8);
                }
            }
            super.onLivingUpdate();
        }
    macht, dass wenn es Tag ist (worldObj.isDaytime) und die Helligkeit 1.0F (float f = getEntityBrightness(1.0F)) überschreitet und der Mob den Himmel sehen kann (if(f > 0.5F && worldObj.canBlockSeeTheSky)) ,dass der Mob brennt und einen Feuerschaden von 8 bekommt (setFire(8); ).

    Code:
    protected int getDropItemId()
        {
            return Item.DROPITEM.shiftedIndex;
        }
    macht, dass der Mob das Item DROPITEM fallen lässt, wenn er stirbt.

    protected String getLivingSound()

    macht den Sound für den Mob. Leider kann man ohne Audiomod keinen eigenen Sound einbinden, deswegen ist diese Funktion für uns mehr oder weniger sinnlos.

    Freundlich gesinnte und Baby-Mobs:

    Für freundliche Mobs (Kuh, als Bsp.) müsst ihr anstatt extends EntityMob ein extends EntityAnimal hinschreiben, dann darf man aber auch das attackStrength = 5; und das mit dem am Tageslicht brennen nicht dazuschreiben. Zusätzlich muss man noch das hier unten (vor die letzte Klammer) einfügen:

    Code:
        protected EntityAnimal spawnBabyAnimal(EntityAnimal entityanimal)
        {
            return new EntityXX(worldObj);
        }
    Das lässt einfach nur Baby-Mobs spawnen


    So, nun haben wir das Verhalten und das Modell, fehlt nur noch das rendern (anzeigen):

    Dazu müsst ihr noch in der RenderManager.java bis hierhin scrollen:

    Code:
            entityRenderMap = new HashMap();
            entityRenderMap.put(net.minecraft.src.EntitySpider.class, new RenderSpider());
    und das hier einfügen:

    Code:
            entityRenderMap = new HashMap();
            entityRenderMap.put(net.minecraft.src.EntitySpider.class, new RenderSpider());
            entityRenderMap.put(net.minecraft.src.EntityXX.class, new RenderBiped(new ModelXX(), 0.5F));
    So, fertig ist der humanoide Mob.

    Nicht-Humanoid:

    Als Erstes müssen/können wir Techne downloaden, mit welchem wir die Mobs erstellen.

    Wenn ihr Techne heruntergeladen und installiert habt, könnt ihr es starten (oh welch Wunder ! ) und fröhlich drauflos modelln. Wenn ihr zufrieden mit eurem Mob seid, speichert das ganz, beendet aber Techne nicht! Ihr müsst nämlich nun auf File -> export as Java klicken und das speichern. Dasselbe macht ihr mit File -> export as texturemap.

    Nun habt ihr ein XX.png und eine XX.java

    Die XX.java benennt ihr in ModelXX.java um und schreibt alles was mit

    .rotateAngleY/X/Z

    endet, so auf:

    Code:
         public void setRotationAngles(float f, float f1, float f2, float f3, float f4, float f5)
         {
     		super.setRotationAngles(f, f1, f2, f3, f4, f5);
     		KÖRPERTEIL1.rotateAngleY = -0.87266F;
         }
    Zum Schluss sollte das so aussehen:

    Code:
    package net.minecraft.src;
    //Exported java file
    //Keep in mind that you still need to fill in some blanks
    // - ZeuX
    
    public class ModelXX extends ModelBase
    {
    
         public ModelXX()
         {
    	float scale = 0F;
    	KÖRPERTEIL1 = new ModelRenderer(this, 0, 0);
    	KÖRPERTEIL1.addBox(-6F, 0F, -9F, 12, 3, 9, scale);
    	KÖRPERTEIL1.setRotationPoint(0F, 15F, -8F);
    	KÖRPERTEIL2 = new ModelRenderer(this, 18, 4);
    	KÖRPERTEIL2.addBox(-6F, -10F, -5F, 12, 18, 6, scale);
    	KÖRPERTEIL2.setRotationPoint(0F, 13F, 2F);
         }
         
         public void setRotationAngles(float f, float f1, float f2, float f3, float f4, float f5)
         {
     		super.setRotationAngles(f, f1, f2, f3, f4, f5);
     		KÖRPERTEIL2.rotateAngleX = 1.5708F;
         }
    
         public void render(float f, float f1, float f2, float f3, float f4, float f5)
         {
    	KÖRPERTEIL1.render(f5);
    	KÖRPERTEIL2.renderWithRotation(f5);
         }
    
    	ModelRenderer Skorpionhead;
    	ModelRenderer Skorpionbody;
    }
    Nun macht ihr das Verhalten wie oben beschrieben. Dann zum Rendern:

    Ihr macht eine neue Datei namens RenderXX.java und schreibt folgendes hinein:

    Code:
    package net.minecraft.src;
    // Decompiled by Jad v1.5.8g. Copyright 2001 Pavel Kouznetsov.
    // Jad home page: http://www.kpdus.com/jad.html
    // Decompiler options: packimports(3) braces deadcode 
    
    public class RenderXX extends RenderLiving
    {
        public RenderXX()
        {
            super(new ModelXX(), 0.5F);
        }
    }
    des 0.5F gibt die Größe des Schattens um den Mob an.

    In die Rendermanager.java kommt folgendes:

    Code:
            entityRenderMap.put(net.minecraft.src.EntityXX.class, new RenderXX());
    So, das wars dann auch schon

    10. Wie lasse ich meinen Mob spawnen?

    Erst mal öffnet ihr die BiomeGenBase.java und scrollt bis hierhin:

    Code:
            spawnableCreatureList.add(new SpawnListEntry(net.minecraft.src.EntityCow.class, 8, 4, 4));
            spawnableMonsterList.add(new SpawnListEntry(net.minecraft.src.EntitySpider.class, 10, 4, 4));
    Nun fügen wir unseren Mob hinzu:

    Code:
            spawnableCreatureList.add(new SpawnListEntry(net.minecraft.src.EntityCow.class, 8, 4, 4));
            spawnableMonsterList.add(new SpawnListEntry(net.minecraft.src.EntityXX.class, 10, 4, 4));
            spawnableMonsterList.add(new SpawnListEntry(net.minecraft.src.EntitySpider.class, 10, 4, 4));
    So, nun spawnt unser Mob in jedem Biome.
    die 8 bei der Cow und die 10 bei der Spider geben die Spawnwahrscheinlichkeit der Mobs an.
    die erste 4 gibt den Minimalwert an gespawnten Mobs an.
    die zweite 4 gibt den Maximalwert an gespawnten Mobs an.
    WICHTIG: Der Minimalwert muss kleiner oder gleich als/wie der Maximalwert sein!
    Für freundliche Mobs müsst ihr das, anstatt dem Roten hinschreiben:

    Code:
            spawnableCreatureList.add(new SpawnListEntry(net.minecraft.src.EntityXX.class, 8, 4, 4));
    Wenn ihr allerdings wollt, dass euer Mob nur in einem bestimmten Biome spawnt (hier Wüste) Dann müsst ihr die BiomeGenDesert.java öffnen und dasselbe wie oben beschrieben machen. Dann darf allerdings nichts in der BiomeGenBase.java geaddet werden.
    (Für andere Biomes müsst ihr die jeweilige BiomeGenBIOMENAME öffnen).

    11. Wie lasse ich meinen Mob in einem Dungeon spawnen? (also in dem Dungeonspawnerblock)

    Dazu müssen wir die WorldGenDungeons.java öffnen und bis hierhin runterscrollen:

    Code:
        private String pickMobSpawner(Random random)
        {
            int i = random.nextInt(4);
            if(i == 0)
            {
                return "Skeleton";
            }
            if(i == 1)
            {
                return "Zombie";
            }
            if(i == 2)
            {
                return "Zombie";
            }
            if(i == 3)
            {
                return "Spider";
            } else
            {
                return "";
            }
        }
    Nun fügen wir unseren Mob hinzu:

    Code:
        private String pickMobSpawner(Random random)
        {
            int i = random.nextInt(5);
            if(i == 0)
            {
                return "Skeleton";
            }
            if(i == 1)
            {
                return "Zombie";
            }
            if(i == 2)
            {
                return "Zombie";
            }
            if(i == 3)
            {
                return "Spider";
            }
            if(i == 4)
            {
                return "XX";
            } else
            {
                return "";
            }
        }
    Nun haben wir unseren Mob hinzugefügt.
    int i = random.nextInt(5); Das hier "würfelt" für die Variable i eine zufälligen Wert zwischen 0 und 4 (Wichtig!: Der PC fängt bei 0 mit dem Zählen an -> bei random.nextInt(5) können folgende Zahlen rauskommen: 0,1,2,3,5) aus.

    Code:
            if(i == 4)
            {
                return "XX";
            } else
            {
                return "";
            }
    Macht, dass wenn die Variable i den Wert 4 bekommt (durchs "Würfeln" von oben) der Mob XX spawnt.
    Das else + dem danach macht, dass wenn die gewürfelte Zahl i weder 0-4 ist (also 5) die Funktion wiederholt wird (es wird also nochmal gewürfelt).

    12. Wie lasse ich eigene Blöcke/Items in den Kisten im Dungeon spawnen?

    Wiedermal öffnen wir die WorldGenDungeons.java und scrollen bis hier runter:

    Code:
        private ItemStack pickCheckLootItem(Random random)
        {
            int i = random.nextInt(11);
            if(i == 0)
            {
                return new ItemStack(Item.saddle);
            }
            if(i == 1)
            {
                return new ItemStack(Item.ingotIron, random.nextInt(4) + 1);
            }
            if(i == 2)
            {
                return new ItemStack(Item.bread);
            }
            if(i == 3)
            {
                return new ItemStack(Item.wheat, random.nextInt(4) + 1);
            }
            if(i == 4)
            {
                return new ItemStack(Item.gunpowder, random.nextInt(4) + 1);
            }
            if(i == 5)
            {
                return new ItemStack(Item.silk, random.nextInt(4) + 1);
            }
            if(i == 6)
            {
                return new ItemStack(Item.bucketEmpty);
            }
            if(i == 7 && random.nextInt(100) == 0)
            {
                return new ItemStack(Item.appleGold);
            }
            if(i == 8 && random.nextInt(2) == 0)
            {
                return new ItemStack(Item.redstone, random.nextInt(4) + 1);
            }
            if(i == 9 && random.nextInt(10) == 0)
            {
                return new ItemStack(Item.itemsList[Item.record13.shiftedIndex + random.nextInt(2)]);
            }
            if(i == 10)
            {
                return new ItemStack(Item.dyePowder, 1, 3);
            } else
            {
                return null;
            }
        }
    Nun ändern wir den Code so um:

    Code:
        private ItemStack pickCheckLootItem(Random random)
        {
            int i = random.nextInt(13);
            if(i == 0)
            {
                return new ItemStack(Item.saddle);
            }
            if(i == 1)
            {
                return new ItemStack(Item.ingotIron, random.nextInt(4) + 1);
            }
            if(i == 2)
            {
                return new ItemStack(Item.bread);
            }
            if(i == 3)
            {
                return new ItemStack(Item.wheat, random.nextInt(4) + 1);
            }
            if(i == 4)
            {
                return new ItemStack(Item.gunpowder, random.nextInt(4) + 1);
            }
            if(i == 5)
            {
                return new ItemStack(Item.silk, random.nextInt(4) + 1);
            }
            if(i == 6)
            {
                return new ItemStack(Item.bucketEmpty);
            }
            if(i == 7 && random.nextInt(100) == 0)
            {
                return new ItemStack(Item.appleGold);
            }
            if(i == 8 && random.nextInt(2) == 0)
            {
                return new ItemStack(Item.redstone, random.nextInt(4) + 1);
            }
            if(i == 9 && random.nextInt(10) == 0)
            {
                return new ItemStack(Item.itemsList[Item.record13.shiftedIndex + random.nextInt(2)]);
            }
            if(i == 10)
            {
                return new ItemStack(Item.dyePowder, 1, 3);
            }
            if(i == 11)
            {
                return new ItemStack(Item.NAME, random.nextInt(4) + 1);
            }
            if(i == 12)
            {
                return new ItemStack(Block.NAME, random.nextInt(4) + 1);
            } else
            {
                return null;
            }
        }
    Was das mit dem i auf sich hat, wissen wir schon vom Spawner. Nur wird diesmal nicht der mob, der spawnt ausgewürfelt, sonder das Item. Neu ist allerdings das:
    , random.nextInt(4) + 1)
    Das macht, dass er wieder eine Zahl zwischen 0-3 (random.nextInt(4)) auswürfelt und diese um 1 erhöht. Damit wird die Menge des Items berechnet. In dem Fall ist min. 1 von dem Item/Block und max. 4 in einer Kiste. (Also muss man für das Item-/Blockmaximum nur hier random.nextInt(4) die 4 ändern. Für das Minimum die + 1) ).

    13. Wie mache ich mein eigenes Biome?

    Als Erstes öffnet ihr die BiomeGenBase.java und scrollt hierhin:

    Code:
        public static final BiomeGenBase biomeList[] = new BiomeGenBase[256];
        public static final BiomeGenBase ocean = (new BiomeGenOcean(0)).setColor(112).setBiomeName("Ocean").setMinMaxHeight(-1F, 0.4F);
        public static final BiomeGenBase plains = (new BiomeGenPlains(1)).setColor(0x8db360).setBiomeName("Plains").setTemperatureRainfall(0.8F, 0.4F);
        public static final BiomeGenBase desert = (new BiomeGenDesert(2)).setColor(0xfa9418).setBiomeName("Desert").setDisableRain().setTemperatureRainfall(2.0F, 0.0F).setMinMaxHeight(0.1F, 0.2F);
        public static final BiomeGenBase hills = (new BiomeGenHills(3)).setColor(0x606060).setBiomeName("Extreme Hills").setMinMaxHeight(0.2F, 1.8F).setTemperatureRainfall(0.2F, 0.3F);
        public static final BiomeGenBase forest = (new BiomeGenForest(4)).setColor(0x56621).setBiomeName("Forest").func_4124_a(0x4eba31).setTemperatureRainfall(0.7F, 0.8F);
        public static final BiomeGenBase taiga = (new BiomeGenTaiga(5)).setColor(0xb6659).setBiomeName("Taiga").func_4124_a(0x4eba31).setTemperatureRainfall(0.3F, 0.8F).setMinMaxHeight(0.1F, 0.4F);
        public static final BiomeGenBase swampland = (new BiomeGenSwamp(6)).setColor(0x7f9b2).setBiomeName("Swampland").func_4124_a(0x8baf48).setMinMaxHeight(-0.2F, 0.1F).setTemperatureRainfall(0.8F, 0.9F);
        public static final BiomeGenBase river = (new BiomeGenRiver(7)).setColor(255).setBiomeName("River").setMinMaxHeight(-0.5F, 0.0F);
        public static final BiomeGenBase hell = (new BiomeGenHell(8)).setColor(0xff0000).setBiomeName("Hell").setDisableRain().setTemperatureRainfall(2.0F, 0.0F);
        public static final BiomeGenBase sky = (new BiomeGenEnd(9)).setColor(0x8080ff).setBiomeName("Sky").setDisableRain();
        public static final BiomeGenBase frozenOcean = (new BiomeGenOcean(10)).setColor(0x9090a0).setBiomeName("FrozenOcean").setMinMaxHeight(-1F, 0.5F).setTemperatureRainfall(0.0F, 0.5F);
        public static final BiomeGenBase frozenRiver = (new BiomeGenRiver(11)).setColor(0xa0a0ff).setBiomeName("FrozenRiver").setMinMaxHeight(-0.5F, 0.0F).setTemperatureRainfall(0.0F, 0.5F);
        public static final BiomeGenBase icePlains = (new BiomeGenSnow(12)).setColor(0xffffff).setBiomeName("Ice Plains").setTemperatureRainfall(0.0F, 0.5F);
        public static final BiomeGenBase iceMountains = (new BiomeGenSnow(13)).setColor(0xa0a0a0).setBiomeName("Ice Mountains").setMinMaxHeight(0.2F, 1.8F).setTemperatureRainfall(0.0F, 0.5F);
        public static final BiomeGenBase mushroomIsland = (new BiomeGenMushroomIsland(14)).setColor(0xff00ff).setBiomeName("MushroomIsland").setTemperatureRainfall(0.9F, 1.0F).setMinMaxHeight(0.2F, 1.0F);
        public static final BiomeGenBase mushroomIslandShore = (new BiomeGenMushroomIsland(15)).setColor(0xa000ff).setBiomeName("MushroomIslandShore").setTemperatureRainfall(0.9F, 1.0F).setMinMaxHeight(-1F, 0.1F);
    Dort fügen wir wieder einen Codeschnipsel ein:

    Code:
        public static final BiomeGenBase biomeList[] = new BiomeGenBase[256];
        public static final BiomeGenBase ocean = (new BiomeGenOcean(0)).setColor(112).setBiomeName("Ocean").setMinMaxHeight(-1F, 0.4F);
        public static final BiomeGenBase plains = (new BiomeGenPlains(1)).setColor(0x8db360).setBiomeName("Plains").setTemperatureRainfall(0.8F, 0.4F);
        public static final BiomeGenBase desert = (new BiomeGenDesert(2)).setColor(0xfa9418).setBiomeName("Desert").setDisableRain().setTemperatureRainfall(2.0F, 0.0F).setMinMaxHeight(0.1F, 0.2F);
        public static final BiomeGenBase hills = (new BiomeGenHills(3)).setColor(0x606060).setBiomeName("Extreme Hills").setMinMaxHeight(0.2F, 1.8F).setTemperatureRainfall(0.2F, 0.3F);
        public static final BiomeGenBase forest = (new BiomeGenForest(4)).setColor(0x56621).setBiomeName("Forest").func_4124_a(0x4eba31).setTemperatureRainfall(0.7F, 0.8F);
        public static final BiomeGenBase taiga = (new BiomeGenTaiga(5)).setColor(0xb6659).setBiomeName("Taiga").func_4124_a(0x4eba31).setTemperatureRainfall(0.3F, 0.8F).setMinMaxHeight(0.1F, 0.4F);
        public static final BiomeGenBase swampland = (new BiomeGenSwamp(6)).setColor(0x7f9b2).setBiomeName("Swampland").func_4124_a(0x8baf48).setMinMaxHeight(-0.2F, 0.1F).setTemperatureRainfall(0.8F, 0.9F);
        public static final BiomeGenBase river = (new BiomeGenRiver(7)).setColor(255).setBiomeName("River").setMinMaxHeight(-0.5F, 0.0F);
        public static final BiomeGenBase hell = (new BiomeGenHell(8)).setColor(0xff0000).setBiomeName("Hell").setDisableRain().setTemperatureRainfall(2.0F, 0.0F);
        public static final BiomeGenBase sky = (new BiomeGenEnd(9)).setColor(0x8080ff).setBiomeName("Sky").setDisableRain();
        public static final BiomeGenBase frozenOcean = (new BiomeGenOcean(10)).setColor(0x9090a0).setBiomeName("FrozenOcean").setMinMaxHeight(-1F, 0.5F).setTemperatureRainfall(0.0F, 0.5F);
        public static final BiomeGenBase frozenRiver = (new BiomeGenRiver(11)).setColor(0xa0a0ff).setBiomeName("FrozenRiver").setMinMaxHeight(-0.5F, 0.0F).setTemperatureRainfall(0.0F, 0.5F);
        public static final BiomeGenBase icePlains = (new BiomeGenSnow(12)).setColor(0xffffff).setBiomeName("Ice Plains").setTemperatureRainfall(0.0F, 0.5F);
        public static final BiomeGenBase iceMountains = (new BiomeGenSnow(13)).setColor(0xa0a0a0).setBiomeName("Ice Mountains").setMinMaxHeight(0.2F, 1.8F).setTemperatureRainfall(0.0F, 0.5F);
        public static final BiomeGenBase mushroomIsland = (new BiomeGenMushroomIsland(14)).setColor(0xff00ff).setBiomeName("MushroomIsland").setTemperatureRainfall(0.9F, 1.0F).setMinMaxHeight(0.2F, 1.0F);
        public static final BiomeGenBase mushroomIslandShore = (new BiomeGenMushroomIsland(15)).setColor(0xa000ff).setBiomeName("MushroomIslandShore").setTemperatureRainfall(0.9F, 1.0F).setMinMaxHeight(-1F, 0.1F);
        public static final BiomeGenBase BIOMENAME = (new BiomeGenNAME(16)).setColor(0xa000ff).setBiomeName("BIOMENAME").setTemperatureRainfall(0.9F, 1.0F).setMinMaxHeight(0.2F, 1.0F);
    Das fügt unser Biome BIOMENAME mit ein.
    16 ist die ID des Biomes.
    .setColor(0xfa9418) gibt die Farbe des Biomes an (ich glaub fürs Gras/).
    .setBiomeName("BIOMENAME") gibt den Namen an (WOW, oder? :O ).
    .setDisableRain() deaktiviert den Regen.
    .setTemperatureRainfall(0.9F, 1.0F) setzt die Temperatur und die Feuchtigkeit des Biomes.
    .setMinMaxHeight(0.2F, 1.0F); setzt die Minimale und Maximale Höhe der Berge/Hügel.

    Nun müssen wir noch eine BiomeGenNAME.java erstellen, in die folgendes kommt:

    Code:
    package net.minecraft.src;
    
    import java.util.List;
    
    public class BiomeGenNAME extends BiomeGenBase
    {
    
        public BiomeGenNAME(int i)
        {
            super(i);
            spawnableMonsterList.clear();
            spawnableCreatureList.clear();
            spawnableWaterCreatureList.clear();
            biomeDecorator.treesPerChunk = -999;
            biomeDecorator.deadBushPerChunk = 2;
            biomeDecorator.reedsPerChunk = 50;
            biomeDecorator.cactiPerChunk = 10;
            topBlock = (byte)Block.sand.blockID;
            fillerBlock = (byte)Block.sand.blockID;
        }
    }
    spawnableMonsterList.clear(); macht, dass keine Monster spawnen.
    spawnableCreatureList.clear(); macht, dass keine friedlichen Mobs spawnen.
    spawnableWaterCreatureList.clear(); macht, dass keine Wassermobs (Tintenfisch) spawnen. Um eigene Mobs in diesem Biome spawnen zu lassen einfach wieder wie oben beschrieben machen (spawnableCreatureList.Add()...).
    topBlock = (byte)Block.XX.blockID; Ist der Block, der ganz oben ist. (im normalen Biome Gras).
    fillerBlock = (byte)Block.XX.blockID; Ist der Block, der ab 1 von oben bis zum 5ten Block von oben (im normalen Biome Erde). Wenn man ganz normal Erde und Grass im Biome haben will, muss man die zwei orangen Zeilen weglassen.
    biomeDecorator.treesPerChunk = -999; setzt die Bäume in dem Biome (in dem Fall 0)
    biomeDecorator.deadBushPerChunk = 2; setzt die toten Büsche im Biome (hier mit einer Wahrscheinlichkeit von 2 (nur auf Sand))
    biomeDecorator.reedsPerChunk = 50; setzt das Gras im Biome (hier mit einer Wahrscheinlichkeit von 50 (nur auf Erde/Gras))
    biomeDecorator.cactiPerChunk = 10; setzt die Kakteen im Biome (hier mit einer Wahrscheinlichkeit von 10 (nur auf Sand))

    14. Wie mache ich mein eigenes Essen?

    Als Erstes erstellt ihr wieder ein Item, welches wie folgt aussieht:

    Code:
        public static Item NAME = (new ItemFood(127, 5, 0.6F, false)).setIconCoord(10, 5).setItemName("NAME");
    so. 127 ist wieder die ID.
    die 5 gibt die Anzahl des geheilten Lebens an, dabei ist zu beachten, dass 2 Leben = 1 Herz/Hungerpunkt. (also heilt das Item hier 2.5 Herzen/Hungerpunkt)
    false gibt an, dass das Item nicht an einen Wolf verfüttert werden kann (mit true ist es verfütterbar).
    0.6F setzt die Sättigung. Das bedeutet, dass der Spieler nach 0.6 (sekunden?) wieder Hungerpunkte verliert.

    15. Wie mache ich, dass mein Mob Waffen trägt?

    Als Erstes öffnet ihr die EntityXX.java und fügt ganz unten unter dem:

    Code:
        protected int getDropItemId()
        {
            return Item.DROPITEM.shiftedIndex;
        }
    Für alle Waffen, außer einem Bogen:

    das hier ein:

    Code:
        public ItemStack getHeldItem()
        {
            return defaultHeldItem;
        }
    
        private static final ItemStack defaultHeldItem;
    
        static 
        {
            defaultHeldItem = new ItemStack(Item.WAFFE, 1);
        }
    Für WAFFE einfach des Item eintragen, welches er in der Hand halten soll.

    Für Bogen:

    Code:
        protected void attackEntity(Entity entity, float f)
        {
            if(f < 10F)
            {
                double d = entity.posX - posX;
                double d1 = entity.posZ - posZ;
                if(attackTime == 0)
                {
                    EntityArrow entityarrow = new EntityArrow(worldObj, this, 1.0F);
                    double d2 = (entity.posY + (double)entity.getEyeHeight()) - 0.69999998807907104D - entityarrow.posY;
                    float f1 = MathHelper.sqrt_double(d * d + d1 * d1) * 0.2F;
                    worldObj.playSoundAtEntity(this, "random.bow", 1.0F, 1.0F / (rand.nextFloat() * 0.4F + 0.8F));
                    worldObj.entityJoinedWorld(entityarrow);
                    entityarrow.setArrowHeading(d, d2 + (double)f1, d1, 1.6F, 12F);
                    attackTime = 60;
                }
                rotationYaw = (float)((Math.atan2(d1, d) * 180D) / 3.1415927410125732D) - 90F;
                hasAttacked = true;
            }
        }
    
        public ItemStack getHeldItem()
        {
            return defaultHeldItem;
        }
    
        private static final ItemStack defaultHeldItem;
    
        static 
        {
            defaultHeldItem = new ItemStack(Item.bow, 1);
        }
    Den unteren Teil kennen wir schon. Der obere Teil ist neu:

    EntityArrow entityarrow = new EntityArrow(worldObj, this, 1.0F); legt fest, dass er einen Pfeil (EntityArrow) verschießt.
    worldObj.playSoundAtEntity(this, "random.bow", 1.0F, 1.0F / (rand.nextFloat() * 0.4F + 0.8F)); legt fest, das der Sound für den Bogen bei abschießen des Pfeils abgespielt wird.
    worldObj.entityJoinedWorld(entityarrow); lässt dann schließlich den Pfeil erscheinen.
    entityarrow.setArrowHeading(d, d2 + (double)f1, d1, 1.6F, 12F); legt die Pfeilausrichtung/flugbahn fest. (Da können wir aber eh nichts ändern )
    attackTime = 60; legt die Angriffszeit fest, also wie viel Zeit vergeht, bis er wieder einen Pfeil abschießt
    double d2 = (entity.posY + (double)entity.getEyeHeight()) - 0.69999998807907104D - entityarrow.posY; legt die Sichthöhe fest, ab wann der Mob den Pfeil abschießt. (also wenn er dir in die Augen schaut, als Bsp)
    float f1 = MathHelper.sqrt_double(d * d + d1 * d1) * 0.2F; wird zum Berechnen der Pfeilflugbahn gebraucht.
    rotationYaw = (float)((Math.atan2(d1, d) * 180D) / 3.1415927410125732D) - 90F; legt die Drehung des Pfeil fest (und ab wann der Pfeil den höchsten Punkt der Flugbahn erreicht hat und wieder sinkt, bis er stecken bleibt).

    Die dunkelgrünen Sachen sollten nur von erfahrenen Moddern, die sich damit auskennen verändert werden!

    Hier gehts zu den Tuts 16 - 23: Klick mich!
    Hier gehts zu den Tuts 24 - 29: Klick mich!
    Hier gehts zu den Tuts 30 +: Klick mich!
    Geändert von Zweistein2 (01.04.2012 um 16:37 Uhr) Grund: Tutorial geupdated.


  2. #2
    Team Hund Avatar von gerbon
    Registriert seit
    17.11.2010
    Beiträge
    1.861
    Wie lass ich eigene Blöcke mitgenerieren?- Zeige ich
    Wie erstelle ich ein Material? - Wenn du für Tools meinst , zeige ich
    ...
    Und ne mich freut es immer wenn Leute meine Tuts verwenden
    Ehm Glieder es besser , benutzt Farbe und Spoiler, dass es anschaulicher fürs Auge ist
    Do the complete list

  3. #3
    Forengestein Avatar von Zweistein2
    Registriert seit
    21.10.2010
    Beiträge
    2.571
    Zitat Zitat von gerbon Beitrag anzeigen
    Wie lass ich eigene Blöcke mitgenerieren?- Zeige ich
    Wie erstelle ich ein Material? - Wenn du für Tools meinst , zeige ich
    Ja, und? Vlt. finden die Leute meines besser, weil es ausführlicher ist/sein könnte. Aber schön, dass du es auch machst.

    Zitat Zitat von gerbon Beitrag anzeigen
    Und ne mich freut es immer wenn Leute meine Tuts verwenden
    Ehm Glieder es besser , benutzt Farbe und Spoiler, dass es anschaulicher fürs Auge ist
    Ich hab dein Tut nicht verwendet. Java hab ich mir größtenteils selbst beigebracht. Und das Tut. hab ich komplett aus dem FF geschrieben, nachdem mich mehrere Leute in Skype gefragt haben, ob ich auch ein Tut. schreiben kann.


  4. #4
    Team Hund Avatar von gerbon
    Registriert seit
    17.11.2010
    Beiträge
    1.861
    >.< lass mir doch meinen Stolz, sowas brauche ich scherzbeiseite
    Umso besser , wenn du alles selber beigebracht hast

    Und des andere sollte nicht heißen das es doppelt ist ,sondern weil es für mich rüberkam als würd ich des net erklären
    Do the complete list

  5. #5
    Forengestein Avatar von Zweistein2
    Registriert seit
    21.10.2010
    Beiträge
    2.571
    Zitat Zitat von gerbon Beitrag anzeigen
    Und des andere sollte nicht heißen das es doppelt ist ,sondern weil es für mich rüberkam als würd ich des net erklären
    Nee ,du erklärst es schön und alles, aber leider ein wenig kurz. Die Leute denen ich dein Tut gezeigt habe (komplette Neulinge, die noch nie was vom MCP gehört haben) meinten, deines sei zu kurz und etwas unübersichtlich (mit den Tuts. die über mehrere Seiten verteilt sind). Deswegen haben mich viele gebeten ein Tutorial zu schreiben, was ich ja jetzt auch getan habe
    Geändert von Zweistein2 (15.09.2011 um 15:30 Uhr)


  6. #6
    Team Hund Avatar von gerbon
    Registriert seit
    17.11.2010
    Beiträge
    1.861
    Ja , das passt schon Wollt eig. garkeinen "kleinen zoff" anfangen sry
    Do the complete list

  7. #7
    Team Jung-Stuten
    Registriert seit
    09.08.2011
    Beiträge
    156
    Ich mag beide Tuts und weerde auch beide benutzen wenn ich mit minecraft modden anfange.

  8. #8
    Team Jung-Stuten Avatar von God of Crafting
    Registriert seit
    15.07.2011
    Beiträge
    265
    Gutes tutorial
    Ich bin gerade dabei das modden zu lernen.
    Die tuts sind wirklich hilfreich.

    @gerbon

    Deine tutorials helfen mir wirklich weiter.

    Ich will meeehhhr!

  9. #9
    Das mit der neuen Welt, kommt das noch oder hast du das vergessen

    BTW nimm am besten die ShockAPI dafür und vll lohnt es sich zu warten bis du dir 1.8 angeschaut hat, weil da sich einiges im Generator geändert hat.


  10. #10
    Forengestein Avatar von Zweistein2
    Registriert seit
    21.10.2010
    Beiträge
    2.571
    @pitman-87 :

    Das kommt noch . Wenn das MCP für 1.8 erscheint werde ich das Tutorial natürlich updaten.
    Geändert von Zweistein2 (15.09.2011 um 15:31 Uhr)


+ Antworten