Å lage en mod til Minecraft er egentlig ikke så vanskelig som det høres ut som. Du trenger egentlig ikke mye Java-erfaring. Alt du trenger er 2 øyne, og en lærer - gjerne en person som nettopp har laget en tråd i dette forumet med tittelen "Hvordan lage en Minecraft mod".
Om det er noe du lurer på, bare post et innlegg her
Du trenger:
-
MCP (Minecraft Coder Pack)
-
Java JDK - Lastes ned fra Oracle
-Minecraft
-Klartekst-behandlingsprogram eller IDE (som f. eks. Notepad++, Eclipse IDE, NetBeans IDE, WordPad)
-
Om ønsket: En Minecraft Mod API (som f. eks. ModLoader, MinecraftForge, ScotTools API, ShockAhPI, GUI API)Her kommer jeg for det meste til å bruke Notepad++ og Risugami's ModLoader, men vi kommer nok til å svippe innom noen av de andre også.
Leksjon 1, Uke 13 [Lett] Hvordan sette opp MCPIDE: N/AAPI: N/AHvor?: N/AMCP (Minecraft Coder Pack) er en slags Java kildekode-dekompilator, akkurat som DJ Java Decompiler og JD-GUI. Den store forskjellen er at MCP har en slags navneliste. Om du tar en titt i Minecraft.jar finner du mange meningsløse filnavn. aa, ab, ac... adw, arf... pl, pm, pn osv. Hvordan skal det være mulig å holde styr på alle disse filene. Det er der MCP kommer inn i bildet. Når MCP dekompilerer kildekoden, endrer den også filnavnene for å gjøre det enkelt å holde styr på og oppdatere mods. For eksempel, blir "adw" gjort om til "Achievements", og dette vil også skje med kildekoden til alle filer som kaller på eller bruker filen "adw", blir endret til "Achievements" for å forhindre feil under rekompilering.
MCP-skriptene er skrevet i Python og dekompileringen baseres på Jad (Java Decompiler).
I ZIP-filen du kan laster ned fra
http://mcp.ocean-labs.de/index.php/MCP_Releases finner vi 11 .bat filer (.sh for Linux):
- cleanup.bat - Angrer og sletter alle endringer som er gjort i mappen.
- decompile.bat - Dekompilerer kildekoden som er lagt inn i mappen /jars.
- getchangedsrc.bat - Gir deg kildekoden til alt du har endret i mappen /src (hvor kildekoden ligger etter du har kjørt decompile.bat).
- recompile.bat - Rekompilerer hele kildekoden som ligger i mappen /src.
- reformat.bat - Er litt usikker, men tror den reformaterer kildekoden på en eller annen måte.
- reobfuscate.bat - Kompilerer de modifiserte filene i mappen /src og legger de i mappen /reobf (elns).
- startclient.bat - Starter Minecraft med den modifiserte kildekoden.
- startserver.bat - Starter Minecraft-serveren med den modifiserte server-kildekoden.
- updatemcp.bat - Ser etter nyere versjon av MCP, laster den ned og installerer den. NB! Personlig velger jeg å laste ned oppdateringer manuelt, på grunn av at den automatiserte oppdaterings-metoden har en tendens til å feile, noe jeg sier av erfaring.
- updatemd5.bat - Oppdaterer MD5-kryptering slik at MCP vet hvilke filer som er modifiserte og hvilke som ikke er det (?). Tror dette skjer automatisk under dekompilering.
- updatenames.bat - Oppdaterer navnene og navnelisten, og legger også til navneoppdateringene i den dekompilerte koden. (Brukes etter "updatemcp".
Trinn 1: Last ned nyeste versjon av MCP fra
http://mcp.ocean-labs.de/index.php/MCP_Releases(om du ønsker å modde en eldre versjon av Minecraft, må du finne den riktige MCP-versjonen på http://mcp.ocean-labs.de/index.php/MCP_Old_Releases)Trinn 2: Pakk ut alle filene fra ZIP-arkivet til ønsket plassering.
Trinn 3a: Gå til .minecraft-mappen i %AppData%, og kopier mappene /bin og /resources
(UMODIFISERT!) til mappen /jars i MCP-mappen.
Trinn 3b: Om modding av server er ønsket: Last ned en umodifisert versjon av "minecraft_server.jar" fra
Minecraft.net og lagre den i mappen /jars i MCP-mappen.
Trinn 4: Om ModLoader er ønsket (ANBEFALT): Last ned nyeste eller ønsket versjon av ModLoader fra
http://www.minecraftforum.net/topic/75440-v124-risugamis-mods-everything-updated/, pakk ut filene, og legg de til i /jars/bin/minecraft.jar i MCP-mappen.
Trinn 5: Kjør "decompile.bat" i MCP-mappen for å starte dekompilering av kildekoden (filene i /jars).
Trinn 6: Blant de nye mappene som nå skal ha dukket opp i MCP-mappen, skal det være en mappe som heter /src. I /src/minecraft/net/minecraft/src skal nå den dekompilerte kildekoden ligge.
Leksjon 2, Uke 14 [Lett] Hvordan lage en ny BlokkIDE: ingen (Notepad++ anbefales)
API: ModLoader
Hvor?:../src/minecraft/net/minecraft/src/
Første leksjon der vi skal begynne å programmere! Pass på at du har dugelig med niste, energi og et lett tilgjengelig toalett. Nå slipper helvete løs!
Det første vi må gjøre er å lage en ny fil i mappen der vi dekompilerte minecraft.jar til i leksjon 1 (../src/minecraft/net/minecraft/src/). Omdøp filen til
mod_Greenstone.java. Om du ønsker at modden din skal hete noe annet enn Greenstone, bytter du ut Greenstone med hva enn du måtte ønske, og for all del:
PASS PÅ at filetternavnet er .java og ikke .java.txt eller lignende.Nå som den nye filen burde være klar, åpner vi den og skriver:
package net.minecraft.src;
public class mod_Greenstone extends BaseMod
{
public void load()
{
}
public String Version()
{
return "0.1";
}
}
Bytt ut "0.1" i kroken "public String Version()" til hvilken versjon av modden det er.
Så legger vi til dette i "public class mod_Greenstone":
// Her skal vi definere blokkens egenskaper, som f. eks. ID, sprite, hardhet, TNT-motstand, hvor mye den skal lyse/gløde, og hvilket navn vi skal bruke for å kalle blokken når vi f. eks. definerer blokkens klasse etc., IKKE hva den heter in-game.
// Greenstone-malm:
public static final Block greenstoneOre = new BlockGreenstoneOre(190,0).setHardness(3F).setResistance(5F).setBlockName("greenstoneOre");
// Greenstone-blokk:
public static final Block greenstoneBlock = new BlockGreenstone(191,0).setHardness(3F).setResistance(10F).setLightValue("0.1F").setBlockName("greenstoneBlock");
Parametrene til BlockXXXXX sier hvilken ID den skal ha og hvilken sprite ID den skal bruke. Nå har vi satt sprite ID'en til 0 fordi vi skal bruke ModLoader sin override-funksjon som jeg skal vise deg snart. "setHardness()" bestemmer hvor hard blokken skal være (hvor lang tid det skal ta å ødelegge den). "setResistance()" bestemmer hvor mye den skal beskytte mot eksplosjoner. "setLightValue()" bestemmer hvor mye lys den skal gi fra seg.
Nå mangler vi bare 3 ting til i denne classen: registrering av blokkenes klasse, blokkenes tekstur og blokkenes navn. Alt dette skal inn i load()-kroken
// Først registrerer vi blokkene:
ModLoader.RegisterBlock(greenstoneOre);
ModLoader.RegisterBlock(greenstoneBlock);
// Så legger vi til en tekstur ved hjelp av ModLoader´s fantastiske override-funksjon:
//Først definerer vi filen som skal overskrives (/terrain.png), så definerer vi filen vi skal overskrive med (f. eks. /mod/greenstone/greenstone_ore).
greenstoneOre.blockIndexInTexture = ModLoader.addOverride("/terrain.png", "/mod/greenstone/greenstone_ore.png");
greenstoneBlock.blockIndexInTexture = ModLoader.addOverride("/terrain.png", "/mod/greenstone/greenstone_block.png");
// Til slutt skriver vi hva blokkene skal hete in-game:
ModLoader.AddName(greenstoneOre, "Greenstone Ore");
ModLoader.AddName(greenstoneBlock, "Greenstone Block");
Nå som vi er ferdig med denne filen for denne gang, skal filen mod_Greenstone.java se slik ut:
package net.minecraft.src;
public class mod_Greenstone extends BaseMod
{
// Her skal vi definere blokkens egenskaper, som f. eks. ID, sprite, hardhet, TNT-motstand, hvor mye den skal lyse/gløde, og hvilket navn vi skal bruke for å kalle blokken når vi f. eks. definerer blokkens klasse etc., IKKE hva den heter in-game.
// Greenstone-malm:
public static final Block greenstoneOre = new BlockGreenstoneOre(190,0).setHardness(3F).setResistance(5F).setBlockName("greenstoneOre");
// Greenstone-blokk:
public static final Block greenstoneBlock = new BlockGreenstone(191,0).setHardness(3F).setResistance(10F).setLightValue("0.1F").setBlockName("greenstoneBlock");
public void load()
{
// Først registrerer vi blokkene:
ModLoader.RegisterBlock(greenstoneOre);
ModLoader.RegisterBlock(greenstoneBlock);
// Så legger vi til en tekstur ved hjelp av ModLoader´s fantastiske override-funksjon:
//Først definerer vi filen som skal overskrives (/terrain.png), så definerer vi filen vi skal overskrive med (f. eks. /mod/greenstone/greenstone_ore).
greenstoneOre.blockIndexInTexture = ModLoader.addOverride("/terrain.png", "/mod/greenstone/greenstone_ore.png");
greenstoneBlock.blockIndexInTexture = ModLoader.addOverride("/terrain.png", "/mod/greenstone/greenstone_block.png");
// Til slutt skriver vi hva blokkene skal hete in-game:
ModLoader.AddName(greenstoneOre, "Greenstone Ore");
ModLoader.AddName(greenstoneBlock, "Greenstone Block");
}
public String Version()
{
return "0.1";
}
}
Men, nei! - Vi er nok ikke helt ferdige enda! Når vi definerte greenstoneOre kalte vi på klassen BlockGreenstoneOre, som ikke eksisterer enda! Dermed må vi lage en ny fil som heter
BlockGreenstoneOre.java. Og nok en gang; pass på at etternavnet er
.java.
Sånn skal BlockGreenstoneOre.java se ut:
package net.minecraft.src;
public class BlockGreenstoneOre extends Block
{
protected BlockGreenstoneOre(int i, int j)
{
super(i, j, Material.iron); //Her kan du velge hvilket materiale blokken skal være basert på (f. eks. Material.iron). Forskjellige materialer oppfører seg forskjellig og har forskjellig farge på et kart. Du kan finne alle materialene i Material.java.
}
}
Eller om du ønsker at Greenstone-malmen skal droppe Greenstone item (som vi skal lage i en leksjon senere) istedenfor at den dropper Greenstone-malm:
package net.minecraft.src;
public class BlockGreenstoneOre extends Block
{
protected BlockGreenstoneOre(int i, int j)
{
super(i, j, Material.iron);
}
public int idDropped(int i, Random random)
{
return mod_Greenstone.greenstoneItem.shiftedIndex;
}
}
som ikke vil virke fordi vi ikke har noe som heter
greenstoneItem enda.
Gjør det samme med BlockGreenstone.
Om du ønsker å bruke min tekstur til denne tutorialen, er den her:
(Redigert 28. juli 2012)
Leksjon 3, Uke 30 [Lett] Hvordan lage en ny GjenstandIDE: ingen (Notepad++ anbefales)
API: ModLoader
Hvor?:../src/minecraft/net/minecraft/src/
Ok, nå er jeg endelig ute med en tut igjen, og som du sikkert har lest skal jeg vise deg hvordan du lager en ny gjenstand. Jeg regner at du allerede har lest de tidligere tutorialene, og har mod_Greenstone.java klar.
Det første vi gjør er å legge til variabelen til gjenstanden, og det gjør vi slik:
public static final Item greenstoneItem = new Item(192).setItemName("greenstoneItem");
Plasser den under GreenstoneBlock sin variabel, omtrent slik:
public static final Block greenstoneOre = new BlockGreenstoneOre(190,0).setHardness(3F).setResistance(5F).setBlockName("greenstoneOre");
public static final Block greenstoneBlock = new BlockGreenstone(191,0).setHardness(3F).setResistance(10F).setLightValue("0.1F").setBlockName("greenstoneBlock");
public static final Item greenstoneItem = new Item(192).setItemName("greenstoneItem");
Neste trinn er å legge inn en tekstur og så klart et navn til den nye super-duper-gjenstanden vår.
Først legger vi inne en texture-override, slik:
greenstoneItem.iconIndex = ModLoader.addOverride("/gui/items.png", "/mod/greenstone/greenstone_item.png");
Så definerer vi in-game navnet til gjenstanden vår.
ModLoader.addName(greenstoneItem, "Greenstone Gem");
Sånn, ja!
Omtrent som dette skal mod_Greenstone se ut når du er ferdig:
package net.minecraft.src;
public class mod_Greenstone extends BaseMod
{
public static final Block greenstoneOre = new BlockGreenstoneOre(190,0).setHardness(3F).setResistance(5F).setBlockName("greenstoneOre");
public static final Block greenstoneBlock = new BlockGreenstone(191,0).setHardness(3F).setResistance(10F).setLightValue("0.1F").setBlockName("greenstoneBlock");
public static final Item emeraldItem = new ItemGreenstone(192).setItemName("emeraldItem");
public void load()
{
ModLoader.RegisterBlock(greenstoneOre);
ModLoader.RegisterBlock(greenstoneBlock);
greenstoneOre.blockIndexInTexture = ModLoader.addOverride("/terrain.png", "/mod/greenstone/greenstone_ore.png");
greenstoneBlock.blockIndexInTexture = ModLoader.addOverride("/terrain.png", "/mod/greenstone/greenstone_block.png");
greenstoneItem.iconIndex = ModLoader.addOverride("/gui/items.png", "/mod/greenstone/greenstone_item.png");
ModLoader.addName(greenstoneOre, "Greenstone Ore");
ModLoader.addName(greenstoneBlock, "Greenstone Block");
ModLoader.addName(greenstoneItem, "Greenstone Gem");
}
public String Version()
{
return "0.1";
}
Ja, da er vi vel ferdige, da? Ja, med mindre du har lyst til å endre størrelsen på en stack til noe annet en 64. Da må vi lage en egen fil til gjenstanden, istedenfor å bruke Item.java. Lag den nye filen og kall den f. eks. ItemGreenstone. Slik skal den nye filen se ut:
package net.minecraft.src;
public class ItemGreenstone extends Item
{
public ItemGreenstone(int i)
{
super(i);
maxStackSize = (64);
}
}
Erstatt "64" med ønsket stack-størrelse. Husk at den må være mellom 1 og 64!
Da må vi også endre variabelen greenstoneItem i mod_Greenstone.java til å kalle ItemGreenstone istedenfor Item:
public static final Item greenstoneItem = new ItemGreenstone(192).setItemName("greenstoneItem");
Da var vel alt på plass, ja.. Å, ja, lykke til!
Om du ønsker å bruke min tekstur til denne tutorialen, er den her:
Jeg håper å slippe neste leksjon på fredag/lørdag neste uke (Uke 31). Tema: Hvordan lage en ny Oppskrift. (Crafting-oppskrifter, formløse crafting-oppskrifter, furnace-oppskrifter og furnace-brensel)Om du har oppdaget noen feil eller ikke fikk det til, bare legg inn et svar her