1. Wie erstelle ich einen Block?
2. Wie erstelle ich ein Item? (Auch Waffen und Werkzeuge)
3. Wie erstelle ich ein Material für Werkzeuge/Waffen?
4. Wie verändere ich die normalen Größen eines Blocks?
5. Wie erstelle ich ein eigenes Craftingrezept?
6. Wie erstelle ich ein Ofen-Rezept?
7. Wie lasse ich einen Block mitgenerieren?
8. Wie lasse ich einen Block in meine Richtung schauen? (wie bei Treppen)
9. Wie erstelle ich einen eigenen Mob (auch nicht-humanoide)?
10. Wie lasse ich meinen Mob spawnen?
11. Wie lasse ich meinen Mob in einem Dungeon spawnen? (also in dem Dungeonspawnerblock)
12. Wie lasse ich eigene Blöcke/Items in den Kisten im Dungeon spawnen?
13. Wie mache ich mein eigenes Biome?
14. Wie mache ich mein eigenes Essen?
15. Wie mache ich, dass mein Mob Waffen trägt?
--------------------------------------------------------------------------------------
16. Wie mache ich eine eigene Pflanze? (wie Getreide)
17. Wie lasse ich eigene Blöcke normal abbauen?
18. Wie mache ich, dass man eigene Blöcke nur mit einer Stein/Eisen/Gold/Diaspitzhacke abbauen kann?
19. Wie füge ich eigene Blöcke in den Creative-Mode ein?
20. Wie füge ich Ingame-Namen für meine Blöcke/Items ein?
21. Wie mache ich, dass ein Mob erst angreift, wenn ich ihn angegriffen habe?
22. Wie lasse ich einen Block bei Aktivierung mit Redstone explodieren?
23. Wie mache ich, das ein Block Schaden macht, wenn man darüber läuft?
--------------------------------------------------------------------------------------
24. Wie vergrößere ich das Inventar?
25. Wie erstelle ich ein eigenes Material für Blöcke?
26. Wie erstelle ich eine neue Tür, die nur mit Redstone geöffnet werden kann?
27. Wie lasse ich meine eig. Samen von Gras droppen?
28. Wie verwende ich meine eigenen Sticks fürs Craften von eigenen Tools?
29. Wie erstelle ich mehrere Blöcke/Items mit einer ID (wie Wolle/Farben)?
--------------------------------------------------------------------------------------
30. Wie erstelle ich mein eigenes Gebäude?
31. Wie lasse ich mein eigenes Gebäude spawnen?
32.Wie erstelle ich meinen eigenen Baum und lasse ihn spawnen?
Made by Zweistein2
2. Wie erstelle ich ein Item? (Auch Waffen und Werkzeuge)
3. Wie erstelle ich ein Material für Werkzeuge/Waffen?
4. Wie verändere ich die normalen Größen eines Blocks?
5. Wie erstelle ich ein eigenes Craftingrezept?
6. Wie erstelle ich ein Ofen-Rezept?
7. Wie lasse ich einen Block mitgenerieren?
8. Wie lasse ich einen Block in meine Richtung schauen? (wie bei Treppen)
9. Wie erstelle ich einen eigenen Mob (auch nicht-humanoide)?
10. Wie lasse ich meinen Mob spawnen?
11. Wie lasse ich meinen Mob in einem Dungeon spawnen? (also in dem Dungeonspawnerblock)
12. Wie lasse ich eigene Blöcke/Items in den Kisten im Dungeon spawnen?
13. Wie mache ich mein eigenes Biome?
14. Wie mache ich mein eigenes Essen?
15. Wie mache ich, dass mein Mob Waffen trägt?
--------------------------------------------------------------------------------------
16. Wie mache ich eine eigene Pflanze? (wie Getreide)
17. Wie lasse ich eigene Blöcke normal abbauen?
18. Wie mache ich, dass man eigene Blöcke nur mit einer Stein/Eisen/Gold/Diaspitzhacke abbauen kann?
19. Wie füge ich eigene Blöcke in den Creative-Mode ein?
20. Wie füge ich Ingame-Namen für meine Blöcke/Items ein?
21. Wie mache ich, dass ein Mob erst angreift, wenn ich ihn angegriffen habe?
22. Wie lasse ich einen Block bei Aktivierung mit Redstone explodieren?
23. Wie mache ich, das ein Block Schaden macht, wenn man darüber läuft?
--------------------------------------------------------------------------------------
24. Wie vergrößere ich das Inventar?
25. Wie erstelle ich ein eigenes Material für Blöcke?
26. Wie erstelle ich eine neue Tür, die nur mit Redstone geöffnet werden kann?
27. Wie lasse ich meine eig. Samen von Gras droppen?
28. Wie verwende ich meine eigenen Sticks fürs Craften von eigenen Tools?
29. Wie erstelle ich mehrere Blöcke/Items mit einer ID (wie Wolle/Farben)?
--------------------------------------------------------------------------------------
30. Wie erstelle ich mein eigenes Gebäude?
31. Wie lasse ich mein eigenes Gebäude spawnen?
32.Wie erstelle ich meinen eigenen Baum und lasse ihn spawnen?
Made by Zweistein2
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!
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
1. Wie erstelle ich einen Block?
Als erstes öffnet ihr die Block.java und scrollt runter bis ihr diese Zeilen seht:
Code:
Ihr schreibt über diese Zeilen folgendes:
Code:
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:
Darüber fügen wir die folgende Zeile ein:
Code:
.setLightValue(1.0F).disableStats().setLightOpacit y(3)
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))
Code:
Code:
public static final Block stone; public static final BlockGrass grass; public static final Block dirt;
Code:
Code:
public static final Block NAME;
Code:
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");
Code:
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:
Tools und Waffen:
Ihr öffnet die Item.java und scrollt wiedermal runter, bis ihr folgendes findet:
Code:
Ihr fügt nun zwischen
Code:
das hier ein:
Code:
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.
Code:
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");
Code:
Code:
public static Item axeSteel; public static Item flintAndSteel = (new ItemFlintAndSteel(3)).setIconCoord(5, 0).setItemName("flintAndSteel");
Code:
Code:
public static Item NAME = (new Item(127)).setIconCoord(5, 5).setItemName("NAME");
.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:
müsst ihr das hier schreiben:
Code:
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:
Hier fügt ihr nun diese Zeile hinzu:
Code:
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:
folgendes hinzufügen:
Code:
Item.CRAFTITEM
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:
Item.CRAFTITEM
Item.NAME
So, nun haben wir auch ein funktionierendes Schwert.
anstatt dem:
Code:
Code:
public static Item NAME = (new Item(127)).setIconCoord(5, 5).setItemName("NAME");
Code:
Code:
public static Item NAME;
Code:
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");
Code:
Code:
NAME = (new ItemTOOL(127, EnumToolMaterial.MATERIAL)).setIconCoord(5, 5).setItemName("NAME");
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:
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, } }); }
Code:
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 } }); }
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:
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 } }); }
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:
unser neues Material ein. Das sieht dann so aus:
Code:
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 NAME;
NAME = new EnumToolMaterial("NAME", 5, 3, 1600, 8F, 4, 10);
WOOD, STONE, IRON, EMERALD, GOLD, NAME
Nun kann das Material bei eigenen Werkzeugen und Waffen benutzt werden.
Code:
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);
Code:
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:
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 }); } */ }
NAME = new EnumToolMaterial("NAME", 5, 3, 1600, 8F, 4, 10);
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:
das hier:
Code:
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:
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)
Code:
Code:
NAME = (new Block(123, 226, Material.wood)).setHardness(1.5F).setResistance(10F).setStepSound(soundStoneFootstep).setBlockName("NAME");
Code:
Code:
NAME = (new BlockNAME(123)).setHardness(1.5F).setResistance(10F).setStepSound(soundStoneFootstep).setBlockName("NAME");
Code:
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; } }
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:
und fügen darüber unser Craftingrezept ein, welches wie folgt aussieht:
Code:
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:
"YYY",
, Character.valueOf('Y'), Item.CRAFTITEM2
Item.CRAFTITEM2 ist das 2te Item, welches zum Craften gebraucht wird.
Code:
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 });
Code:
Code:
addRecipe(new ItemStack(Item.NAME, X), new Object[] { "###", Character.valueOf('#'), Item.CRAFTITEM });
Code:
Code:
addRecipe(new ItemStack(Item.NAME, X), new Object[] { "###", "YYY", Character.valueOf('#'), Item.CRAFTITEM, Character.valueOf('Y'), Item.CRAFTITEM2 });
, 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:
Und schreiben diese Zeile darunter:
Code:
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 [COLOR="rgb(255, 140, 0)"]dunkelorange[/COLOR] 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 ))
Code:
Code:
private FurnaceRecipes() { smeltingList = new HashMap(); addSmelting(Block.oreIron.blockID, new ItemStack(Item.ingotIron));
Code:
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));
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 [COLOR="rgb(255, 140, 0)"]dunkelorange[/COLOR] 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:
Nun fügen wir unseren Block ein:
Code:
So, Nun wird unser Block NAME wie Kohle generiert.
Code:
, 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:
genStandardOre1(20, ERZGEN, 0, currentWorld.worldYMax);
Code:
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;
Code:
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; }
Code:
Code:
ERZGEN = new WorldGenMinable(Block.NAME.blockID, 16);
Zum Schluss müssen noch das hier einfügen:
Code:
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:
if(l == X) gibt die Richtung an, wie der Block gesetzt wurde (1 = Norden, 2 = Osten,3 = Süden,0 = Westen)
Code:
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); } }
9. Wie erstelle ich einen eigenen Mob (auch nicht-humanoide)?
Humanoid:
Freundlich gesinnte und Baby-Mobs:
Nicht-Humanoid:
Ihr erstellt erst die ModelXX.java (XX ist der Name des Mobs). In diese schreibt ihr folgendes hinein:
Code:
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:
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();
}
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:
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(; ).
Code:
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.
Code:
Code:
package net.minecraft.src; public class ModelXX extends ModelBiped { public ModelXX() { } }
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:
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; } }
{
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();
}
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:
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(); }
Code:
Code:
protected int getDropItemId() { return Item.DROPITEM.shiftedIndex; }
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.
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:
und das hier einfügen:
Code:
entityRenderMap.put(net.minecraft.src.EntityXX.cla ss, new RenderBiped(new ModelXX(), 0.5F));
So, fertig ist der humanoide Mob.
Code:
Code:
protected EntityAnimal spawnBabyAnimal(EntityAnimal entityanimal) { return new EntityXX(worldObj); }
{
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:
Code:
entityRenderMap = new HashMap(); entityRenderMap.put(net.minecraft.src.EntitySpider.class, new RenderSpider());
Code:
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.
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:
Zum Schluss sollte das so aussehen:
Code:
Nun macht ihr das Verhalten wie oben beschrieben. Dann zum Rendern:
Ihr macht eine neue Datei namens RenderXX.java und schreibt folgendes hinein:
Code:
des 0.5F gibt die Größe des Schattens um den Mob an.
In die Rendermanager.java kommt folgendes:
Code:
So, das wars dann auch schon
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:
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; }
Code:
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; }
Ihr macht eine neue Datei namens RenderXX.java und schreibt folgendes hinein:
Code:
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); } }
In die Rendermanager.java kommt folgendes:
Code:
Code:
entityRenderMap.put(net.minecraft.src.EntityXX.class, new RenderXX());
10. Wie lasse ich mein Mob spawnen ?
Erst mal öffnet ihr die BiomeGenBase.java und scrollt bis hierhin:
Nun fügen wir unseren Mob hinzu:
spawnableMonsterList.add(new SpawnListEntry(net.minecraft.src.EntityXX.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:
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).
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));
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));
(Für andere Biomes müsst ihr die jeweilige BiomeGenBIOMENAME öffnen).
11. Wie lasse ich mein Mob in einem Dungeon (Mobspawner) spawnen ?
Dazu müssen wir die WorldGenDungeons.java öffnen und bis hierhin runterscrollen:
Nun fügen wir unseren Mob hinzu:
(5)
if(i == 4)
{
return "XX";
} else
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.
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).
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 ""; } }
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 ""; } }
if(i == 4)
{
return "XX";
} else
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 ""; }
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:
Nun ändern wir den Code so um:
int i = random.nextInt(13);
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
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) ).
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; } }
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; } }
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
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:
Dort fügen wir wieder einen Codeschnipsel ein:
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(0xfa941 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:
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))
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);
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(0xfa941 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; } }
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:
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.
Code:
public static Item NAME = (new ItemFood(127, 5, 0.6F, false)).setIconCoord(10, 5).setItemName("NAME");
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:
Für alle Waffen, außer einem Bogen:
Für Bogen:
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 grünen Sachen sollten nur von erfahrenen Moddern, die sich damit auskennen verändert werden!
Code:
protected int getDropItemId() { return Item.DROPITEM.shiftedIndex; }
das hier ein:
Für WAFFE einfach des Item eintragen, welches er in der Hand halten soll.
Code:
public ItemStack getHeldItem() { return defaultHeldItem; } private static final ItemStack defaultHeldItem; static { defaultHeldItem = new ItemStack(Item.WAFFE, 1); }
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); }
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 grünen Sachen sollten nur von erfahrenen Moddern, die sich damit auskennen verändert werden!
16. Wie mache ich eine eigene Pflanze? (wie Getreide)
Als Erstes erstellen wir einen neuen Block namens FELD. Das wird unser Boden, auf dem die Pflanzen wachsen. Dazu schreiben wir in die Block.java das hier:
Was das bewirkt wissen wir schon von oben.
.setRequiresSelfNotify(); macht, dass der Block immer wieder überprüft wird, also ob das was in der Datei steht auch stimmt (ob der Block am Wasser ist, ob jemand darüber läuft,...).
Nun müssen wir noch die BlockFELD.java erstellen:
setzt die Kollisionsbox für den Block. Sprich: Der Block sieht 1x0.9375x1 groß aus, aber vom Dagegenlaufen ist er nach wievor 1x1x1 groß.
setzt die Textur für die Seiten/unten und oben. Unten und an den Seiten sieht der Block aus wie Dirt (das return 2; , damit er eine andere Textur an den Stellen habt, gebt ihr einfach für die 2 eine andere Zahl ein.). an der Oberseite hat er trocken die Textur 227 (blockIndexInTexture = 227; ) und nass hat er die Textur 226 (return blockIndexInTexture - 1; ,also 227 - 1 = 226. ).
public void updateTick(World world, int i, int j, int k, Random random) wiederholt mehrmals pro minute den Inhalt der Funktion.
macht, dass wenn jemand drüber läuft, sich der Block FELD in Dirt verwandelt.
|| k1 == Block.PFLANZE1.blockID || k1 == Block.PFLANZE2.blockID
überprüft, ob auf dem Block eine Pflanze gepflanzt wurde.
Mit || k1 == Block.PFLANZE1.blockID kann man mehrere Pflanzen auf dem Block pflanzen (also entweder PFLANZE, oder PFLANZE1, ...).
Überprüft, oben in der Nähe des Blocks ein Block Wasser ist.
Lässt einen Block Dirt droppen, wenn man den Block FELD abbaut.
So, nun haben wir zwar das Feld, aber noch keine Pflanze, deswegen erstellen wir noch einen neuen Block namens PFLANZE.
Block.java:
.disableStats() macht einfach nur, dass der Block nicht in den Statistiken erscheint (sprich, wie oft abgebaut/gesetzt/gecraftet/..)
Auch schreiben wir in die BlockPFLANZE.java etwas anderes:
Lässt bei der 7ten Stufe der Pflanze (die letzte Stufe also) das Item ERZEUGNIS droppen (also Weizen als bsp.)
Lässt per Zufall und je nach Stufe das Item SAMEN droppen.
Rendert (= anzeigen) den Block PFLANZE als Pflanze (also dieses Überkreuzen der Texturen (Ingame- Weizen/Blumen/Spinnenweben angucken )).
legt die Texturen fest. (228 - 236).
public void fertilize(World world, int i, int j, int k) macht, dass die Pflanze wächst.
private float getGrowthRate(World world, int i, int j, int k) rechnet die Wachstumsrate der Pflanze.
macht, dass die Pflanze nur auf dem Block FELD gepflanzt werden kann und dort auch wächst.
Nun müssen wir noch in der BlockFlower.java bis hierhin scrollen:
und unseren Block einfügen:
Nun kann man auch auf unser Feld etwas pflanzen. Das wars auch schon mit den Blöcken. Nun müssen wir aber noch die Items erstellen.
Dazu schreiben wir das in die Item.java:
public static Item SAMEN;
SAMEN = (new ItemSAMEN(103, Block.PFLANZE.blockID)).setIconCoord(9, 0).setItemName("SAMEN");
Dann müssen wir noch die ItemSAMEN.java erstellen:
macht, dass wenn ein Block FELD und darüber Luft ist und man Rechtsklick mit dem Item SAMEN macht, dass ein Item SAMEN aus dem Inventar genommen wird (itemstack.stackSize--; ) und der Block PFLANZE gepflanzt wird.
WICHTIG!: Bei den Blöcken und den Items muss noch das public static final ... hin, ich setze vorraus, dass ihr das mittlerweile selbständig könnt.
Code:
FELD = (new BlockFELD(110)).setHardness(0.6F).setStepSound(soundGravelFootstep).setBlockName("FELD").setRequiresSelfNotify();
.setRequiresSelfNotify(); macht, dass der Block immer wieder überprüft wird, also ob das was in der Datei steht auch stimmt (ob der Block am Wasser ist, ob jemand darüber läuft,...).
Nun müssen wir noch die BlockFELD.java erstellen:
Code:
package net.minecraft.src; import java.util.Random; public class BlockFELD extends Block { protected BlockFELD(int i) { super(i, Material.ground); blockIndexInTexture = 227; setTickOnLoad(true); setBlockBounds(0.0F, 0.0F, 0.0F, 1.0F, 0.9375F, 1.0F); setLightOpacity(255); } public AxisAlignedBB getCollisionBoundingBoxFromPool(World world, int i, int j, int k) { return AxisAlignedBB.getBoundingBoxFromPool(i + 0, j + 0, k + 0, i + 1, j + 1, k + 1); } public boolean isOpaqueCube() { return false; } public boolean renderAsNormalBlock() { return false; } public int getBlockTextureFromSideAndMetadata(int i, int j) { if(i == 1 && j > 0) { return blockIndexInTexture - 1; } if(i == 1) { return blockIndexInTexture; } else { return 2; } } public void onEntityWalking(World world, int i, int j, int k, Entity entity) { if(world.rand.nextInt(4) == 0) { world.setBlockWithNotify(i, j, k, Block.dirt.blockID); } } public void updateTick(World world, int i, int j, int k, Random random) { if(random.nextInt(5) == 0) { if(isWaterNearby(world, i, j, k) || world.canLightningStrikeAt(i, j + 1, k)) { world.setBlockMetadataWithNotify(i, j, k, 7); } else { int l = world.getBlockMetadata(i, j, k); if(l > 0) { world.setBlockMetadataWithNotify(i, j, k, l - 1); } else if(!isPFLANZENearby(world, i, j, k)) { world.setBlockWithNotify(i, j, k, Block.dirt.blockID); } } } } private boolean isPFLANZENearby(World world, int i, int j, int k) { int l = 0; for(int i1 = i - l; i1 <= i + l; i1++) { for(int j1 = k - l; j1 <= k + l; j1++) { int k1 = world.getBlockId(i1, j + 1, j1); if(k1 == Block.PFLANZE.blockID || k1 == Block.PFLANZE1.blockID || k1 == Block.PFLANZE2.blockID) { return true; } } } return false; } private boolean isWaterNearby(World world, int i, int j, int k) { for(int l = i - 4; l <= i + 4; l++) { for(int i1 = j; i1 <= j + 1; i1++) { for(int j1 = k - 4; j1 <= k + 4; j1++) { if(world.getBlockMaterial(l, i1, j1) == Material.water) { return true; } } } } return false; } public void onNeighborBlockChange(World world, int i, int j, int k, int l) { super.onNeighborBlockChange(world, i, j, k, l); Material material = world.getBlockMaterial(i, j + 1, k); if(material.isSolid()) { world.setBlockWithNotify(i, j, k, Block.dirt.blockID); } } public int idDropped(int i, Random random) { return Block.dirt.idDropped(0, random); } }
Code:
public AxisAlignedBB getCollisionBoundingBoxFromPool(World world, int i, int j, int k) { return AxisAlignedBB.getBoundingBoxFromPool(i + 0, j + 0, k + 0, i + 1, j + 1, k + 1); }
Code:
public int getBlockTextureFromSideAndMetadata(int i, int j) { if(i == 1 && j > 0) { return blockIndexInTexture - 1; } if(i == 1) { return blockIndexInTexture; } else { return 2; } }
public void updateTick(World world, int i, int j, int k, Random random) wiederholt mehrmals pro minute den Inhalt der Funktion.
Code:
public void onEntityWalking(World world, int i, int j, int k, Entity entity) { if(world.rand.nextInt(4) == 0) { world.setBlockWithNotify(i, j, k, Block.dirt.blockID); } }
Code:
private boolean isPFLANZENearby(World world, int i, int j, int k) { int l = 0; for(int i1 = i - l; i1 <= i + l; i1++) { for(int j1 = k - l; j1 <= k + l; j1++) { int k1 = world.getBlockId(i1, j + 1, j1); if(k1 == Block.PFLANZE.blockID || k1 == Block.PFLANZE1.blockID || k1 == Block.PFLANZE2.blockID) { return true; } } } return false; }
überprüft, ob auf dem Block eine Pflanze gepflanzt wurde.
Mit || k1 == Block.PFLANZE1.blockID kann man mehrere Pflanzen auf dem Block pflanzen (also entweder PFLANZE, oder PFLANZE1, ...).
Code:
private boolean isWaterNearby(World world, int i, int j, int k) { for(int l = i - 4; l <= i + 4; l++) { for(int i1 = j; i1 <= j + 1; i1++) { for(int j1 = k - 4; j1 <= k + 4; j1++) { if(world.getBlockMaterial(l, i1, j1) == Material.water) { return true; } } } } return false; }
Code:
public int idDropped(int i, Random random) { return Block.dirt.idDropped(0, random); }
So, nun haben wir zwar das Feld, aber noch keine Pflanze, deswegen erstellen wir noch einen neuen Block namens PFLANZE.
Block.java:
Code:
PFLANZE = (new BlockCrops(111, 228)).setHardness(0.0F).setStepSound(soundGrassFootstep).setBlockName("PFLANZE").disableStats().setRequiresSelfNotify();
Auch schreiben wir in die BlockPFLANZE.java etwas anderes:
Code:
package net.minecraft.src; import java.util.Random; public class BlockPFLANZE extends BlockFlower { protected BlockPFLANZE(int i, int j) { super(i, j); blockIndexInTexture = j; setTickOnLoad(true); float f = 0.5F; setBlockBounds(0.5F - f, 0.0F, 0.5F - f, 0.5F + f, 0.25F, 0.5F + f); } protected boolean canThisPlantGrowOnThisBlockID(int i) { return i == Block.FELD.blockID; } public void updateTick(World world, int i, int j, int k, Random random) { super.updateTick(world, i, j, k, random); if(world.getBlockLightValue(i, j + 1, k) >= 9) { int l = world.getBlockMetadata(i, j, k); if(l < 7) { float f = getGrowthRate(world, i, j, k); if(random.nextInt((int)(100F / f)) == 0) { l++; world.setBlockMetadataWithNotify(i, j, k, l); } } } } public void fertilize(World world, int i, int j, int k) { world.setBlockMetadataWithNotify(i, j, k, 7); } private float getGrowthRate(World world, int i, int j, int k) { float f = 1.0F; int l = world.getBlockId(i, j, k - 1); int i1 = world.getBlockId(i, j, k + 1); int j1 = world.getBlockId(i - 1, j, k); int k1 = world.getBlockId(i + 1, j, k); int l1 = world.getBlockId(i - 1, j, k - 1); int i2 = world.getBlockId(i + 1, j, k - 1); int j2 = world.getBlockId(i + 1, j, k + 1); int k2 = world.getBlockId(i - 1, j, k + 1); boolean flag = j1 == blockID || k1 == blockID; boolean flag1 = l == blockID || i1 == blockID; boolean flag2 = l1 == blockID || i2 == blockID || j2 == blockID || k2 == blockID; for(int l2 = i - 1; l2 <= i + 1; l2++) { for(int i3 = k - 1; i3 <= k + 1; i3++) { int j3 = world.getBlockId(l2, j - 1, i3); float f1 = 0.0F; if(j3 == Block.FELD.blockID) { f1 = 1.0F; if(world.getBlockMetadata(l2, j - 1, i3) > 0) { f1 = 3F; } } if(l2 != i || i3 != k) { f1 /= 4F; } f += f1; } } if(flag2 || flag && flag1) { f /= 2.0F; } return f; } public int getBlockTextureFromSideAndMetadata(int i, int j) { if(j < 0) { j = 7; } return blockIndexInTexture + j; } public int getRenderType() { return 6; } public void dropBlockAsItemWithChance(World world, int i, int j, int k, int l, float f) { super.dropBlockAsItemWithChance(world, i, j, k, l, f); if(world.multiplayerWorld) { return; } for(int i1 = 0; i1 < 3; i1++) { if(world.rand.nextInt(15) <= l) { float f1 = 0.7F; float f2 = world.rand.nextFloat() * f1 + (1.0F - f1) * 0.5F; float f3 = world.rand.nextFloat() * f1 + (1.0F - f1) * 0.5F; float f4 = world.rand.nextFloat() * f1 + (1.0F - f1) * 0.5F; EntityItem entityitem = new EntityItem(world, (float)i + f2, (float)j + f3, (float)k + f4, new ItemStack(Item.SAMEN)); entityitem.delayBeforeCanPickup = 10; world.entityJoinedWorld(entityitem); } } } public int idDropped(int i, Random random) { if(i == 7) { return Item.ERZEUGNIS.shiftedIndex; } else { return -1; } } public int quantityDropped(Random random) { return 1; } }
Code:
public int idDropped(int i, Random random) { if(i == 7) { return Item.ERZEUGNIS.shiftedIndex; } else { return -1; } }
Code:
public void dropBlockAsItemWithChance(World world, int i, int j, int k, int l, float f) { super.dropBlockAsItemWithChance(world, i, j, k, l, f); if(world.multiplayerWorld) { return; } for(int i1 = 0; i1 < 3; i1++) { if(world.rand.nextInt(15) <= l) { float f1 = 0.7F; float f2 = world.rand.nextFloat() * f1 + (1.0F - f1) * 0.5F; float f3 = world.rand.nextFloat() * f1 + (1.0F - f1) * 0.5F; float f4 = world.rand.nextFloat() * f1 + (1.0F - f1) * 0.5F; EntityItem entityitem = new EntityItem(world, (float)i + f2, (float)j + f3, (float)k + f4, new ItemStack(Item.SAMEN)); entityitem.delayBeforeCanPickup = 10; world.entityJoinedWorld(entityitem); } } }
Code:
public int getRenderType() { return 6; }
Code:
public int getBlockTextureFromSideAndMetadata(int i, int j) { if(j < 0) { j = 7; } return blockIndexInTexture + j; }
public void fertilize(World world, int i, int j, int k) macht, dass die Pflanze wächst.
private float getGrowthRate(World world, int i, int j, int k) rechnet die Wachstumsrate der Pflanze.
Code:
protected boolean canThisPlantGrowOnThisBlockID(int i) { return i == Block.FELD.blockID; }
Nun müssen wir noch in der BlockFlower.java bis hierhin scrollen:
Code:
protected boolean canThisPlantGrowOnThisBlockID(int i) { return i == Block.grass.blockID || i == Block.dirt.blockID || i == Block.tilledField.blockID; }
Code:
protected boolean canThisPlantGrowOnThisBlockID(int i) { return i == Block.grass.blockID || i == Block.dirt.blockID || i == Block.tilledField.blockID || i == Block.FELD.blockID; }
Dazu schreiben wir das in die Item.java:
Code:
[...] protected static Random itemRand = new Random(); public static Item itemsList[] = new Item[32000]; public static Item shovelSteel; public static Item pickaxeSteel; public static Item axeSteel; public static Item flintAndSteel = (new ItemFlintAndSteel(3)).setIconCoord(5, 0).setItemName("flintAndSteel"); public static Item appleRed = (new ItemFood(4, 4, 0.3F, false)).setIconCoord(10, 0).setItemName("apple"); public static Item bow = (new ItemBow(5)).setIconCoord(5, 1).setItemName("bow"); public static Item arrow = (new Item(6)).setIconCoord(5, 2).setItemName("arrow"); public static Item coal = (new ItemCoal(7)).setIconCoord(7, 0).setItemName("coal"); public static Item diamond = (new Item(8)).setIconCoord(7, 3).setItemName("emerald"); public static Item ingotIron = (new Item(9)).setIconCoord(7, 1).setItemName("ingotIron"); public static Item ingotGold = (new Item(10)).setIconCoord(7, 2).setItemName("ingotGold"); public static Item swordSteel; public static Item swordWood; public static Item shovelWood; public static Item pickaxeWood; public static Item axeWood; public static Item swordStone; public static Item shovelStone; public static Item pickaxeStone; public static Item axeStone; public static Item swordDiamond; public static Item shovelDiamond; public static Item pickaxeDiamond; public static Item SAMEN; public static Item axeDiamond; public static Item stick = (new Item(24)).setIconCoord(5, 3).setFull3D().setItemName("stick"); public static Item bowlEmpty = (new Item(25)).setIconCoord(7, 4).setItemName("bowl"); public static Item bowlSoup = (new ItemSoup(26, 8)).setIconCoord(8, 4).setItemName("mushroomStew"); public static Item swordGold; public static Item shovelGold; public static Item pickaxeGold; public static Item axeGold; public static Item silk = (new Item(31)).setIconCoord(8, 0).setItemName("string"); public static Item feather = (new Item(32)).setIconCoord(8, 1).setItemName("feather"); public static Item gunpowder = (new Item(33)).setIconCoord(8, 2).setItemName("sulphur"); public static Item hoeWood; public static Item hoeStone; public static Item hoeSteel; public static Item hoeDiamond; public static Item hoeGold; public static Item seeds; public static Item wheat = (new Item(40)).setIconCoord(9, 1).setItemName("wheat"); public static Item bread = (new ItemFood(41, 5, 0.6F, false)).setIconCoord(9, 2).setItemName("bread"); public static Item helmetLeather = (new ItemArmor(42, 0, 0, 0)).setIconCoord(0, 0).setItemName("helmetCloth"); public static Item plateLeather = (new ItemArmor(43, 0, 0, 1)).setIconCoord(0, 1).setItemName("chestplateCloth"); public static Item legsLeather = (new ItemArmor(44, 0, 0, 2)).setIconCoord(0, 2).setItemName("leggingsCloth"); public static Item bootsLeather = (new ItemArmor(45, 0, 0, 3)).setIconCoord(0, 3).setItemName("bootsCloth"); public static Item helmetChain = (new ItemArmor(46, 1, 1, 0)).setIconCoord(1, 0).setItemName("helmetChain"); public static Item plateChain = (new ItemArmor(47, 1, 1, 1)).setIconCoord(1, 1).setItemName("chestplateChain"); public static Item legsChain = (new ItemArmor(48, 1, 1, 2)).setIconCoord(1, 2).setItemName("leggingsChain"); public static Item bootsChain = (new ItemArmor(49, 1, 1, 3)).setIconCoord(1, 3).setItemName("bootsChain"); public static Item helmetSteel = (new ItemArmor(50, 2, 2, 0)).setIconCoord(2, 0).setItemName("helmetIron"); public static Item plateSteel = (new ItemArmor(51, 2, 2, 1)).setIconCoord(2, 1).setItemName("chestplateIron"); public static Item legsSteel = (new ItemArmor(52, 2, 2, 2)).setIconCoord(2, 2).setItemName("leggingsIron"); public static Item bootsSteel = (new ItemArmor(53, 2, 2, 3)).setIconCoord(2, 3).setItemName("bootsIron"); public static Item helmetDiamond = (new ItemArmor(54, 3, 3, 0)).setIconCoord(3, 0).setItemName("helmetDiamond"); public static Item plateDiamond = (new ItemArmor(55, 3, 3, 1)).setIconCoord(3, 1).setItemName("chestplateDiamond"); public static Item legsDiamond = (new ItemArmor(56, 3, 3, 2)).setIconCoord(3, 2).setItemName("leggingsDiamond"); public static Item bootsDiamond = (new ItemArmor(57, 3, 3, 3)).setIconCoord(3, 3).setItemName("bootsDiamond"); public static Item helmetGold = (new ItemArmor(58, 1, 4, 0)).setIconCoord(4, 0).setItemName("helmetGold"); public static Item plateGold = (new ItemArmor(59, 1, 4, 1)).setIconCoord(4, 1).setItemName("chestplateGold"); public static Item legsGold = (new ItemArmor(60, 1, 4, 2)).setIconCoord(4, 2).setItemName("leggingsGold"); public static Item bootsGold = (new ItemArmor(61, 1, 4, 3)).setIconCoord(4, 3).setItemName("bootsGold"); public static Item flint = (new Item(62)).setIconCoord(6, 0).setItemName("flint"); public static Item porkRaw = (new ItemFood(63, 3, 0.3F, true)).setIconCoord(7, 5).setItemName("porkchopRaw"); public static Item porkCooked = (new ItemFood(64, 8, 0.8F, true)).setIconCoord(8, 5).setItemName("porkchopCooked"); public static Item painting = (new ItemPainting(65)).setIconCoord(10, 1).setItemName("painting"); public static Item appleGold; public static Item sign = (new ItemSign(67)).setIconCoord(10, 2).setItemName("sign"); public static Item doorWood; public static Item bucketEmpty; public static Item bucketWater; public static Item bucketLava; public static Item minecartEmpty = (new ItemMinecart(72, 0)).setIconCoord(7, 8).setItemName("minecart"); public static Item saddle = (new ItemSaddle(73)).setIconCoord(8, 6).setItemName("saddle"); public static Item doorSteel; public static Item redstone = (new ItemRedstone(75)).setIconCoord(8, 3).setItemName("redstone"); public static Item snowball = (new ItemSnowball(76)).setIconCoord(14, 0).setItemName("snowball"); public static Item boat = (new ItemBoat(77)).setIconCoord(8, 8).setItemName("boat"); public static Item leather = (new Item(78)).setIconCoord(7, 6).setItemName("leather"); public static Item bucketMilk; public static Item brick = (new Item(80)).setIconCoord(6, 1).setItemName("brick"); public static Item clay = (new Item(81)).setIconCoord(9, 3).setItemName("clay"); public static Item reed; public static Item paper = (new Item(83)).setIconCoord(10, 3).setItemName("paper"); public static Item book = (new Item(84)).setIconCoord(11, 3).setItemName("book"); public static Item slimeBall = (new Item(85)).setIconCoord(14, 1).setItemName("slimeball"); public static Item minecartCrate = (new ItemMinecart(86, 1)).setIconCoord(7, 9).setItemName("minecartChest"); public static Item minecartPowered = (new ItemMinecart(87, 2)).setIconCoord(7, 10).setItemName("minecartFurnace"); public static Item egg = (new ItemEgg(88)).setIconCoord(12, 0).setItemName("egg"); public static Item compass = (new Item(89)).setIconCoord(6, 3).setItemName("compass"); public static Item fishingRod = (new ItemFishingRod(90)).setIconCoord(5, 4).setItemName("fishingRod"); public static Item pocketSundial = (new Item(91)).setIconCoord(6, 4).setItemName("clock"); public static Item lightStoneDust = (new Item(92)).setIconCoord(9, 4).setItemName("yellowDust"); public static Item fishRaw = (new ItemFood(93, 2, 0.3F, false)).setIconCoord(9, 5).setItemName("fishRaw"); public static Item fishCooked = (new ItemFood(94, 5, 0.6F, false)).setIconCoord(10, 5).setItemName("fishCooked"); public static Item dyePowder = (new ItemDye(95)).setIconCoord(14, 4).setItemName("dyePowder"); public static Item bone = (new Item(96)).setIconCoord(12, 1).setItemName("bone").setFull3D(); public static Item sugar = (new Item(97)).setIconCoord(13, 0).setItemName("sugar").setFull3D(); public static Item cake; public static Item bed = (new ItemBed(99)).setMaxStackSize(1).setIconCoord(13, 2).setItemName("bed"); public static Item redstoneRepeater; public static Item cookie = (new ItemFood(101, 1, 0.1F, false)).setIconCoord(12, 5).setItemName("cookie"); public static ItemMap map = (ItemMap)(new ItemMap(102)).setIconCoord(12, 3).setItemName("map"); public static ItemShears shears = (ItemShears)(new ItemShears(103)).setIconCoord(13, 5).setItemName("shears"); public static Item melon = (new ItemFood(104, 2, 0.3F, false)).setIconCoord(13, 6).setItemName("melon"); public static Item pumpkinSeeds; public static Item melonSeeds; public static Item beefRaw = (new ItemFood(107, 3, 0.3F, true)).setIconCoord(9, 6).setItemName("beefRaw"); public static Item beefCooked = (new ItemFood(108, 8, 0.8F, true)).setIconCoord(10, 6).setItemName("beefCooked"); public static Item chickenRaw; public static Item chickenCooked = (new ItemFood(110, 6, 0.6F, true)).setIconCoord(10, 7).setItemName("chickenCooked"); public static Item rottenFlesh; public static Item enderPearl = (new Item(112)).setIconCoord(11, 6).setItemName("enderPearl"); public static Item record13 = (new ItemRecord(2000, "13")).setIconCoord(0, 15).setItemName("record"); public static Item recordCat = (new ItemRecord(2001, "cat")).setIconCoord(1, 15).setItemName("record"); public final int shiftedIndex; protected int maxStackSize; private int maxDamage; protected int iconIndex; protected boolean bFull3D; protected boolean hasSubtypes; private Item containerItem; private String itemName; static { SAMEN = (new ItemSAMEN(103, Block.PFLANZE.blockID)).setIconCoord(9, 0).setItemName("SAMEN"); 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"); swordSteel = (new ItemSword(11, EnumToolMaterial.IRON)).setIconCoord(2, 4).setItemName("swordIron"); swordWood = (new ItemSword(12, EnumToolMaterial.WOOD)).setIconCoord(0, 4).setItemName("swordWood"); shovelWood = (new ItemSpade(13, EnumToolMaterial.WOOD)).setIconCoord(0, 5).setItemName("shovelWood"); pickaxeWood = (new ItemPickaxe(14, EnumToolMaterial.WOOD)).setIconCoord(0, 6).setItemName("pickaxeWood"); axeWood = (new ItemAxe(15, EnumToolMaterial.WOOD)).setIconCoord(0, 7).setItemName("hatchetWood"); swordStone = (new ItemSword(16, EnumToolMaterial.STONE)).setIconCoord(1, 4).setItemName("swordStone"); shovelStone = (new ItemSpade(17, EnumToolMaterial.STONE)).setIconCoord(1, 5).setItemName("shovelStone"); pickaxeStone = (new ItemPickaxe(18, EnumToolMaterial.STONE)).setIconCoord(1, 6).setItemName("pickaxeStone"); axeStone = (new ItemAxe(19, EnumToolMaterial.STONE)).setIconCoord(1, 7).setItemName("hatchetStone"); swordDiamond = (new ItemSword(20, EnumToolMaterial.EMERALD)).setIconCoord(3, 4).setItemName("swordDiamond"); shovelDiamond = (new ItemSpade(21, EnumToolMaterial.EMERALD)).setIconCoord(3, 5).setItemName("shovelDiamond"); pickaxeDiamond = (new ItemPickaxe(22, EnumToolMaterial.EMERALD)).setIconCoord(3, 6).setItemName("pickaxeDiamond"); axeDiamond = (new ItemAxe(23, EnumToolMaterial.EMERALD)).setIconCoord(3, 7).setItemName("hatchetDiamond"); swordGold = (new ItemSword(27, EnumToolMaterial.GOLD)).setIconCoord(4, 4).setItemName("swordGold"); shovelGold = (new ItemSpade(28, EnumToolMaterial.GOLD)).setIconCoord(4, 5).setItemName("shovelGold"); pickaxeGold = (new ItemPickaxe(29, EnumToolMaterial.GOLD)).setIconCoord(4, 6).setItemName("pickaxeGold"); axeGold = (new ItemAxe(30, EnumToolMaterial.GOLD)).setIconCoord(4, 7).setItemName("hatchetGold"); hoeWood = (new ItemHoe(34, EnumToolMaterial.WOOD)).setIconCoord(0, 8).setItemName("hoeWood"); hoeStone = (new ItemHoe(35, EnumToolMaterial.STONE)).setIconCoord(1, 8).setItemName("hoeStone"); hoeSteel = (new ItemHoe(36, EnumToolMaterial.IRON)).setIconCoord(2, 8).setItemName("hoeIron"); hoeDiamond = (new ItemHoe(37, EnumToolMaterial.EMERALD)).setIconCoord(3, 8).setItemName("hoeDiamond"); hoeGold = (new ItemHoe(38, EnumToolMaterial.GOLD)).setIconCoord(4, 8).setItemName("hoeGold"); seeds = (new ItemSeeds(39, Block.crops.blockID)).setIconCoord(9, 0).setItemName("seeds"); appleGold = (new ItemFood(66, 10, 1.2F, false)).func_35424_o().setPotionEffect(Potion.potionRegeneration.id, 30, 0, 1.0F).setIconCoord(11, 0).setItemName("appleGold"); doorWood = (new ItemDoor(68, Material.wood)).setIconCoord(11, 2).setItemName("doorWood"); bucketEmpty = (new ItemBucket(69, 0)).setIconCoord(10, 4).setItemName("bucket"); bucketWater = (new ItemBucket(70, Block.waterMoving.blockID)).setIconCoord(11, 4).setItemName("bucketWater").setContainerItem(bucketEmpty); bucketLava = (new ItemBucket(71, Block.lavaMoving.blockID)).setIconCoord(12, 4).setItemName("bucketLava").setContainerItem(bucketEmpty); doorSteel = (new ItemDoor(74, Material.iron)).setIconCoord(12, 2).setItemName("doorIron"); bucketMilk = (new ItemBucket(79, -1)).setIconCoord(13, 4).setItemName("milk").setContainerItem(bucketEmpty); reed = (new ItemReed(82, Block.reed)).setIconCoord(11, 1).setItemName("reeds"); cake = (new ItemReed(98, Block.cake)).setMaxStackSize(1).setIconCoord(13, 1).setItemName("cake"); redstoneRepeater = (new ItemReed(100, Block.redstoneRepeaterIdle)).setIconCoord(6, 5).setItemName("diode"); pumpkinSeeds = (new ItemSeeds(105, Block.pumpkinStem.blockID)).setIconCoord(13, 3).setItemName("seeds_pumpkin"); melonSeeds = (new ItemSeeds(106, Block.melonStem.blockID)).setIconCoord(14, 3).setItemName("seeds_melon"); chickenRaw = (new ItemFood(109, 2, 0.3F, true)).setPotionEffect(Potion.potionHunger.id, 30, 0, 0.3F).setIconCoord(9, 7).setItemName("chickenRaw"); rottenFlesh = (new ItemFood(111, 4, 0.1F, true)).setPotionEffect(Potion.potionHunger.id, 30, 0, 0.8F).setIconCoord(11, 5).setItemName("rottenFlesh"); StatList.initStats(); } }
SAMEN = (new ItemSAMEN(103, Block.PFLANZE.blockID)).setIconCoord(9, 0).setItemName("SAMEN");
Dann müssen wir noch die ItemSAMEN.java erstellen:
Code:
package net.minecraft.src; public class ItemSAMEN extends Item { public ItemSAMEN(int i, int j) { super(i); blockType = j; } public boolean onItemUse(ItemStack itemstack, EntityPlayer entityplayer, World world, int i, int j, int k, int l) { if(l != 1) { return false; } if(!entityplayer.func_35190_e(i, j, k) || !entityplayer.func_35190_e(i, j + 1, k)) { return false; } int i1 = world.getBlockId(i, j, k); if(i1 == Block.FELD.blockID && world.isAirBlock(i, j + 1, k)) { world.setBlockWithNotify(i, j + 1, k, blockType); itemstack.stackSize--; return true; } else { return false; } } private int blockType; }
WICHTIG!: Bei den Blöcken und den Items muss noch das public static final ... hin, ich setze vorraus, dass ihr das mittlerweile selbständig könnt.
17. Wie lasse ich eigene Blöcke normal abbauen?
Einfach in der ItemTOOL.java (je nach dem Werkzeug, mit dem man es abbauen soll, müsst ihr das TOOL durch das Werkzeug ersetzen (Hoe,Axe,Pickaxe,Spade und Sword)) bis hier scrollen:
Je nachdem, welche ItemTOOL.java ihr bearbeitet, ist unterscheidet sich das Dunkelblaue. (Hier ist es die ItemPickaxe.java)
Nun fügen wir hinter dem letzten Block unseren Block ein:
, Block.NAME
Anstatt NAME wieder den Namen eures Blocks einsetzen.
Code:
static { blocksEffectiveAgainst = (new Block[] { Block.cobblestone, Block.stairDouble, Block.stairSingle, Block.stone, Block.sandStone, Block.cobblestoneMossy, Block.oreIron, Block.blockSteel, Block.oreCoal, Block.blockGold, Block.oreGold, Block.oreDiamond, Block.blockDiamond, Block.ice, Block.netherrack, Block.oreLapis, Block.blockLapis }); }
Nun fügen wir hinter dem letzten Block unseren Block ein:
Code:
static { blocksEffectiveAgainst = (new Block[] { Block.cobblestone, Block.stairDouble, Block.stairSingle, Block.stone, Block.sandStone, Block.cobblestoneMossy, Block.oreIron, Block.blockSteel, Block.oreCoal, Block.blockGold, Block.oreGold, Block.oreDiamond, Block.blockDiamond, Block.ice, Block.netherrack, Block.oreLapis, Block.blockLapis, Block.NAME }); }
Anstatt NAME wieder den Namen eures Blocks einsetzen.