minecraft
Modding met Forge
Zoeken…
Syntaxis
- MODID = staat voor de identificatie van de MOD
- MODPath = staat voor het volledige gekwalificeerde mappad naar uw mod-map
Opmerkingen
Dit onderwerp moet de meest gebruikte patronen / voorbeelden en goed geteste code bevatten voor het modelleren van de Minecraft-toepassing met forge. Misschien kan dit op een dag de officiële documentatie vervangen.
Implementatiepatroon voor initialisatieproxy's
Dit voorbeeld laat zien hoe u proxyklassen voor uw Minecraft Mod-toepassing kunt implementeren, die worden gebruikt om uw mod te initialiseren.
Allereerst moet u de basisklasse CommonProxy.java implementeren die de 3 meest gebruikte methode bevat:
public class CommonProxy {
public void preInit(FMLPreInitializationEvent e) {}
public void init(FMLInitializationEvent e) {}
public void postInit(FMLPostInitializationEvent e) {}
}
Normaal heeft uw mod 2 verschillende pakketten voor client- en servercode, dus u hebt in elk pakket een onderliggende klasse CommonProxy.java nodig, zoals:
public class ClientProxy extends CommonProxy {
@Override
public void preInit(FMLPreInitializationEvent e) {
super.preInit(e);
}
@Override
public void init(FMLInitializationEvent e) {
super.init(e);
}
@Override
public void postInit(FMLPostInitializationEvent e) {
super.postInit(e);
}
}
en voor de server:
public class ServerProxy extends CommonProxy {
@Override
public void preInit(FMLPreInitializationEvent e) {
super.preInit(e);
}
@Override
public void init(FMLInitializationEvent e) {
super.init(e);
}
@Override
public void postInit(FMLPostInitializationEvent e) {
super.postInit(e);
}
}
Nadat u deze klassen hebt gemaakt, kunt u ze uitbreiden met methoden die alleen aan client- of serverzijde moeten worden uitgevoerd, maar u kunt ze ook aan beide koppelen als u de methoden in de klasse 'base' aanroept.
Ten slotte moet u bepalen welke proxy tijdens runtime wordt gebruikt. Je moet je @Mod
klasse uitbreiden met de @Mod
annotatie, door:
private static final String CLIENTPROXY = "com.yourpackage.client.ClientProxy";
private static final String SERVERPROXY = "com.yourpackage.client.ServerProxy";
@SidedProxy(clientSide = CLIENTPROXY, serverSide = SERVERPROXY)
public static CommonProxy PROXY;
Hiermee kan Forge detecteren welke klasse tijdens runtime moet worden genomen. In de initialisatiemethoden van uw Mod kunt u nu deze statische PROXY-eigenschap gebruiken.
@EventHandler
public void init(FMLInitializationEvent event) {
PROXY.init(event);
}
@Mod.EventHandler
public void preInit(FMLPreInitializationEvent event) {
PROXY.preInit(event);
}
@EventHandler
public void postInit(FMLPostInitializationEvent event) {
PROXY.postInit(event);
}
Aangepaste geluiden aan uw MOD toevoegen
Dit voorbeeld laat zien hoe je nieuwe geluiden aan je MOD toevoegt en speelt. Allereerst heb je een geluidsbestand nodig met het formaat *.ogg
. Een ander formaat is niet toegestaan door de Minecraft-toepassing en wordt geweigerd.
De soundfile heeft de naam: sound1.ogg
Plaats het geluidsbestand onder het volgende pad:
/YourPath/src/main/resources/assets/MODID/sounds/sound1.ogg
Vervang 'MODID' door de identificatie die u voor uw MOD hebt gedefinieerd
Vervolgens moet je een sounds.json
in UTF-8 (Standard) -codering die naam, bron, ... en andere dingen voor je aangepaste geluid definieert. Dit bestand ziet eruit als:
{
"sound1": {
"category" : "player",
"sounds": [{
"name": "MODID:sound1",
"stream": false
}
]
},
"sound2": {
"category" : "ambient",
"sounds": [{
"name": "MODID:subfolder/sound2",
"stream": true
}
]
}
}
Als verklaring voor dit geluid. Json.
Er zijn 2 geluiden gedefinieerd, zoals ik een voorbeeld heb toegevoegd dat je kunt onderzoeken hoe je meerdere geluiden kunt toevoegen. sound1
heeft de categorie- player
de tweede is van categorie ambient
wat betekent dat het volume van het geluid wordt beïnvloed door de volume-instellingen die de gebruiker heeft ingesteld voor speler / omgevingsgeluiden. name
is de belangrijkste eigenschap omdat deze verwijst naar de bron van het geluid. De MODID
is de identificatie van uw MOD en is verplicht omdat de toepassing in de bronnen van uw mod naar het bestand zal zoeken, anders zal het in de Minecraft-bronnen zoeken en niets vinden. De eigenschap stream
betekent dat het geluid wordt gestreamd vanuit het bestandssysteem, wat alleen nodig is voor geluiden langer dan 4 seconden.
Uw aangepaste sounds.json
bestand moet het volgende pad ingaan:
/YourPath/src/main/resources/assets/MODID/sounds.json
Nu kun je de geluiden in het register van het spel laden. U moet dus een klasse maken die SoundEvent
s initialiseert en de registratie afhandelt.
public class SoundRegistrator {
public static final SoundEvent SOUND_1;
public static final SoundEvent SOUND_2;
static {
SOUND_1 = addSoundsToRegistry("sound1");
SOUND_2 = addSoundsToRegistry("sound2");
}
private static SoundEvent addSoundsToRegistry(String soundId) {
ResourceLocation shotSoundLocation = new ResourceLocation("MODID", soundId);
SoundEvent soundEvent = new SoundEvent(shotSoundLocation);
soundEvent.setRegistryName(shotSoundLocation);
return soundEvent;
}
}
Daarna moet u een SoundRegisterListener
:
public class SoundRegisterListener {
@SubscribeEvent(priority = EventPriority.NORMAL, receiveCanceled = true)
public void registerSoundEvents(RegistryEvent.Register<SoundEvent> event) {
event.getRegistry().registerAll(SoundRegistrator.SOUND_1,SoundRegistrator.SOUND_2);
}
}
en registreer het bij de MinecraftForge.EVENT_BUS
zoals:
MinecraftForge.EVENT_BUS.register(new SoundRegisterListener());
Eindelijk kun je je geluiden spelen:
void playSound(SoundEvent sound) {
try {
if (Minecraft.getMinecraft().world.isRemote) {
EntityPlayerSP player = Minecraft.getMinecraft().player;
Minecraft.getMinecraft().world.playSound(player, player.getPosition(), sound, SoundCategory.PLAYERS, RandomGenerator.getNextRandomVolumeLoud(), 1.0F);
}
} catch (Exception ex) {
//Error happened
}
}
Een opdracht verzenden
Dit voorbeeld toont u verschillende manieren om 'opdrachten' uit te voeren voor Minecraft vanuit code:
EntityPlayerSP player = Minecraft.getMinecraft().player;
player.sendChatMessage("/Command here");
om een opdracht in SinglePlayer te verzenden