(Cet article fait partie d'une série d'articles de commentaires)
Premier article: Introduction Article précédent: 7. Add progress Article suivant: 9. Ajouter et générer des arbres
Enfin, nous entrerons dans la partie grandeur nature. Si vous créez un matériau unique pour un mod, vous devez préparer un moyen de l'obtenir. S'il s'agissait d'une ressource primaire, il faudrait qu'elle soit générée dans le monde. Cette fois, nous allons apprendre à ajouter du minerai.
Tout d'abord, ajoutons un bloc de minerai comme déjà expliqué dans 2. Ajouter un bloc. Puisque le processus est exactement le même, je vais omettre l'explication, mais j'ai ajouté BlockList.ExampleOre
.
BlockList.java
//...
public class BlockList {
public static Block ExampleOre = new Block(
Block.Properties.create(Material.ROCK)
.hardnessAndResistance(3.0F, 3.0F)
.lightValue(15))
.setRegistryName(new ResourceLocation(ExampleMod.MOD_ID, "example_ore"));
@SubscribeEvent
public static void registerBlocks(RegistryEvent.Register<Block> event) {
event.getRegistry().registerAll(
ExampleOre
);
}
@SubscribeEvent
public static void registerBlockItems(RegistryEvent.Register<Item> event) {
event.getRegistry().registerAll(
new BlockItem(ExampleOre, new Item.Properties().group(ExampleItemGroup.DEFAULT))
.setRegistryName(new ResourceLocation(ExampleMod.MOD_ID, "example_ore"))
);
}
}
** * Une addition **
Il aurait été préférable de définir notre propre classe BlockExampleOre
, qui hérite de la classe Block
, au lieu de la classe Block
pour définir la perte d'expérience pendant l'extraction.
BlockExampleOre.java
package jp.koteko.example_mod.blocks;
import net.minecraft.block.Block;
import net.minecraft.block.BlockState;
import net.minecraft.util.math.BlockPos;
import net.minecraft.util.math.MathHelper;
public class BlockExampleOre extends Block {
public BlockExampleOre(Block.Properties properties) {
super(properties);
}
@Override
public int getExpDrop(BlockState state, net.minecraft.world.IWorldReader reader, BlockPos pos, int fortune, int silktouch) {
return silktouch == 0 ? MathHelper.nextInt(RANDOM, 3, 7) : 0;
}
}
\src\main\resources
├ assets
│ └ example_mod
│ ├ blockstates
│ │ └ example_ore.json
│ ├ lang
│ │ └ en_us.json
│ │ └ ja_jp.json
│ ├ models
│ │ ├ block
│ │ │ └ example_ore.json
│ │ └ item
│ │ └ example_ore.json
│ └ textures
│ ├ blocks
│ │ └ example_ore.png
│ └ items
└ data
└ example_mod
└ loot_tables
└ blocks
└ example_ore.json
Ajoutez des recettes le cas échéant.
Ajoutons maintenant du code pour générer ceci.
\src\main\java\jp\koteko\example_mod\
├ items
├ lists
├ world
│ └ WorldGenOres.java
└ ExampleMod.java
Placez WorldGenOres.java
.
WorldGenOres.java
package jp.koteko.example_mod.world;
import jp.koteko.example_mod.lists.BlockList;
import net.minecraft.block.Block;
import net.minecraft.world.biome.Biome;
import net.minecraft.world.gen.GenerationStage;
import net.minecraft.world.gen.feature.Feature;
import net.minecraft.world.gen.feature.OreFeatureConfig;
import net.minecraft.world.gen.placement.CountRangeConfig;
import net.minecraft.world.gen.placement.Placement;
import net.minecraftforge.registries.ForgeRegistries;
public class WorldGenOres {
public static void setup() {
addOreToOverworld(
BlockList.ExampleOre,
17,
new CountRangeConfig(20, 0, 0, 128)
);
}
private static void addOreToOverworld(Block blockIn, int size, CountRangeConfig countRangeConfigIn) {
for(Biome biome : ForgeRegistries.BIOMES) {
if(!biome.getCategory().equals(Biome.Category.NETHER) && !biome.getCategory().equals(Biome.Category.THEEND)) {
biome.addFeature(
GenerationStage.Decoration.UNDERGROUND_ORES,
Biome.createDecoratedFeature(
Feature.ORE,
new OreFeatureConfig(
OreFeatureConfig.FillerBlockType.NATURAL_STONE,
blockIn.getDefaultState(),
size
),
Placement.COUNT_RANGE,
countRangeConfigIn
)
);
}
}
}
}
La méthode d'écriture n'est qu'un exemple, vous pouvez donc l'écrire plus simplement ou avec un degré d'abstraction plus élevé. ~~ Plus je pense à ce qui est le mieux, plus je ne comprends pas. ~~
La partie principale est biome.addFeature ()
, qui est une méthode pour ajouter une Feature
ou une fonctionnalité à une instance de la classe Biome
. Cela générera des fonctionnalités lors de la génération du biome.
Commentaire
// net\minecraft\world\biome\DefaultBiomeFeatures.Il existe de nombreux exemples en java
biome.addFeature(
//Type de fonctionnalité à ajouter
// net\minecraft\gen\GenerationStage.Regardez java et choisissez quelque chose qui fait du bien
GenerationStage.Decoration.UNDERGROUND_ORES,
//Instance de la fonction configurée
Biome.createDecoratedFeature(
//Type de fonctionnalité Il semble que celui correspondant à l'argument suivant soit passé ici
Feature.ORE,
//Configuration des fonctionnalités
new OreFeatureConfig(
//Type de bloc à remplacer
// NATURAL_LA PIERRE est LA PIERRE,GRANITE,DIORITE,ANDESITE
OreFeatureConfig.FillerBlockType.NATURAL_STONE,
//État de bloc du minerai à générer
BlockList.ExampleOre.getDefaultState(),
//Nombre maximum généré en un seul endroit
17
),
// Placement(Un objet qui gère une plage?)Type: Il semble que celui correspondant à l'argument suivant soit passé ici
Placement.COUNT_RANGE,
//Configuration de l'emplacement
// (count, bottomOffset, topOffset, maximum)
//Je ne sais pas si les détails sont corrects,
//0 au maximum-À un nombre sélectionné au hasard dans la plage allant jusqu'en haut
//Il semble que cela bouge comme dessiner une valeur entière avec bottomOffset ajouté nombre de fois
//En bref, il semble qu'il détermine les coordonnées y qui génèrent le nombre de minerai par morceau.
new CountRangeConfig(20, 0, 0, 128)
)
)
Enfin, appelez le WorldGenOres.setup ()
juste défini dans setup
dans le fichier principal.
ExampleMod.java
//...
public class ExampleMod
{
//...
private void setup(final FMLCommonSetupEvent event)
{
WorldGenOres.setup();
}
//...
}
Commencer le jeu. ** Du minerai supplémentaire a été généré. ** **
Q. Je veux le générer dans le bas-fond
Q. Je souhaite générer uniquement pour un biome spécifique
** A. Jugons l'authenticité avec biome.getCategory (). Equals ()
. ** **
Cet exemple a été généré dans tous les biomes au sol. Le code est ci-dessous.
python
if(!biome.getCategory().equals(Biome.Category.NETHER) && !biome.getCategory().equals(Biome.Category.THEEND))
Je l'ai tourné avec for et ʻaddFeature () `vers tous les non-nether et non-end de tous les biomes. J'écris ceci parce que je pense que ce serait bien de préparer une nouvelle méthode qui modifie cette partie comme il convient. Ou je pense qu'il est possible de recevoir la séquence du biome comme argument.
Minecraft 1.14.4 Forge Mod Creation Part 8 [Ajout et génération de minerai]
9. Ajouter et générer des arbres
Recommended Posts