minecraft
Een basisblok maken met Forge
Zoeken…
Invoering
Het maken van een eenvoudig, decoratief blok met Forge is een van de eerste taken die een aspirant-modder moet leren. Hoe dat te doen is veranderd in de verschillende versies van Minecraft en bevindt zich waarschijnlijk op een "matige" moeilijkheidsgraad na 1.7.10 vanwege het grote aantal eenvoudig te maken fouten.
Opmerkingen
Als er iets misgaat en uw aangepaste blok (wanneer geplaatst of vastgehouden) een ontbrekende textuur (zwart / paars) of model (standaard kubus die te groot is wanneer vastgehouden) heeft, controleert u het logboek. Dit soort problemen zal bijna altijd in het logboek verschijnen, op voorwaarde dat u dingen correct hebt geregistreerd.
Het eerste dat zal verschijnen is de regel "Exception loading model for variant..."
of iets dergelijks, dat aangeeft welk blok of item niet correct kon worden geladen. Na een tiental regels beginnend met at...
komt er weer een regel die Caused by...
Deze regel 'Veroorzaakt door' is de belangrijkste, hij zal u vertellen welk bestand niet correct kon worden geladen en kan een van verschillende fouten zijn, zoals:
- Onjuiste JSON (uw JSON-bestand is niet geldig en heeft een typefout)
- Bestand niet gevonden (het bestand dat Minecraft zoekt, heeft niet de juiste naam of staat niet op de juiste plaats)
- Ontbrekende variantuitzondering (uw Blockstate JSON is onvolledig)
U kunt zelfs meer dan één falende fout krijgen voor een enkele fout! Als je niet weet welk blok het probleem is, geef dan commentaar op elk blok en item waarvan je weet dat het werkt, verminder de foutenlijst tot het blok (of blokken) in kwestie. Mogelijk moet u dit meerdere keren doen.
Bovendien wordt een mixtextuur net zo anders weergegeven als een eenvoudige lijst met alle ontbrekende bronnen voor een bepaald domein (mod ID).
De Block Class
Eerst hebben we een klasse nodig die het blok voorstelt
public class CustomBlock extends Block {
public CustomBlock () {
super(Material.ROCK);
setHardness(1.0f);
setHarvestLevel("pickaxe", 0);
setResistance(1.0f);
setCreativeTab(CreativeTabs.DECORATIONS);
this.setSoundType(SoundType.STONE);
}
}
Zelfs hier zijn er verschillende modificaties beschikbaar: materiaal (dat enkele eigenschappen regelt, zoals het kunnen worden geduwd door zuigers en of het met de hand kan worden gebroken), hardheid (hoe lang het duurt om te breken), oogstniveau (geschikt gereedschap en gereedschap materiaal: in dit geval houten houweel), weerstand (tegen explosies), het tabblad dat wordt weergegeven in het creatieve menu en welk stapgeluid het heeft.
Dit is waar alle fancy functionaliteitsblokken naartoe moeten, maar voor nu maken we een blok dat er gewoon mooi uitziet, dus we zijn klaar.
Het blokmodel JSON
Vervolgens moeten we Minecraft vertellen hoe we willen dat ons blok eruit ziet.
{
"parent": "block/cube_all",
"textures": {
"all": "example:blocks/decorative"
}
}
Dat is zo ongeveer alles wat nodig is om te werken zodra het blok is geregistreerd. Het enige belangrijke is dat de bestandsnaam overeenkomen met de naam register wordt gebruikt om het blok te registreren en moet in kleine letters (1.11+ bestandsnamen zijn verplicht om kleine letters te zijn, voorafgaand aan dat het gewoon hoofdlettergevoelig).
Noem het JSON-bestandsmodel my_block.json
(komt overeen met de registernaam die we het later gaan geven) en sla het op bij src\main\resources\assets\example\models\block\
(waarbij example
de mod-ID is opgegeven in de @Mod annotatie van uw belangrijkste mod-klasse).
Het blokmodel gebruikt hier een bovenliggend element van block / cube_all, wat betekent dat de enkele geleverde textuur op alle vlakken zal worden gebruikt. Er zijn ook andere standaardmodellen, zoals:
- blok / kubus (alle zes gezichten onafhankelijk toegewezen)
- block / cube_bottom_top (boven- en ondervlak onafhankelijk van de zijkanten)
- blok / richtbaar (richting gericht blok, bijv. oven)
- blok / kruis (bloemen, hoog gras)
- blok / gewas (tarwe, wortelen)
Houd er rekening mee dat elk model de texturen specificeert die het gebruikt met een naam-ID (bijvoorbeeld "all"
of "top"
). Kijk naar het bovenliggende model om te bepalen wat die namen zijn als u niet zeker bent. Onjuist gespecificeerde texturen kunnen leiden tot niet-foutrapportage ontbrekende textuurproblemen.
Het is ook mogelijk om een volledig aangepast model te maken of om een aangepast bovenliggend model te maken. Maar voorlopig zal dit voldoende zijn.
Vergeet niet om een textuur aan te maken, noem deze decorative.png
(want dat is wat het JSON-bestand heeft opgegeven) en sla deze op in src\main\resources\assets\example\textures\blocks\
Blok registratie
Het registreren van blokken gebeurt vanuit uw hoofdmod-klasse, of een ModBlocks-klassenmethode die tijdens preInit vanuit de hoofdmod-klasse is aangeroepen.
Block myBlock = new CustomBlock();
string registryname = "my_block";
block.setRegistryName(registryname);
block.setUnlocalizedName(block.getRegistryName().toString());
GameRegistry.register(block);
Er is een belangrijke reden om block.setUnlocalizedName(block.getRegistryName().toString());
ook! Het verzekert dat uw blok (en item) niet-gelokaliseerde namen de mod ID bevatten om conflicten tussen taalbestanden tussen mods te voorkomen.
Oh, je wilt ook een itemversie, zodat deze ook in je inventaris kan bestaan? Dat is apart gemaakt na 1.7.10 en zo gedaan:
ItemBlock ib = new ItemBlock(block);
ib.setRegistryName(registryname);
GameRegistry.register(ib);
Merk op dat we de registernaam van ItemBlock op dezelfde string instellen als ons blok. Dit is hoe blokken worden gesmeed en gekoppeld aan hun ItemBlock-tegenhanger en vice versa.
Maar wacht, er is meer!
Uw blok zou een artikel vorm te hebben, maar dat artikel is een model of structuur nog niet hebben! Modellen worden automatisch geregistreerd voor blokken, maar niet voor items. Dit kan alleen worden opgeroepen vanuit de Client Proxy en dekt geen blokken met varianten (zoals wol of bladeren).
ModelLoader.setCustomModelResourceLocation(
ib , 0, new ModelResourceLocation(ib.getRegistryName(),"normal"));
Over het algemeen heb je niet ook een itemmodel JSON nodig, omdat Forge en vanille in plaats daarvan terugvallen op het model van het blok, maar dit is niet altijd het geval. Als u vindt dat u een itemmodel JSON nodig hebt, laat u dit gewoon over aan uw blok JSON en slaat u het op in src\main\resources\assets\example\models\item\
met dezelfde bestandsnaam als de registernaam van het blok.
{
"parent": "example:block/my_block"
}