提供: Minecraft Modding Wiki
2020年10月12日 (月) 22:44時点におけるRedice (トーク | 投稿記録)による版
(差分) ← 古い版 | 最新版 (差分) | 新しい版 → (差分)
移動先: 案内検索

この記事は"Fabric API 0.3.2 build 230~"を前提MODとしています。

Stone pickaxe.png
中級者向けのチュートリアルです。
C block.png
Blockに関係のあるチュートリアルです。

ワールド上で鉱石のようにブロックを生成する方法

鉱石を生成する

ソースコード

  • SampleMod.java
package com.example.ore;

import net.fabricmc.api.ModInitializer;
import net.minecraft.block.Blocks;
import net.minecraft.util.Identifier;
import net.minecraft.util.registry.BuiltinRegistries;
import net.minecraft.util.registry.Registry;
import net.minecraft.world.gen.decorator.Decorator;
import net.minecraft.world.gen.decorator.RangeDecoratorConfig;
import net.minecraft.world.gen.feature.ConfiguredFeature;
import net.minecraft.world.gen.feature.Feature;
import net.minecraft.world.gen.feature.OreFeatureConfig;

public class SampleMod implements ModInitializer
    {
        /**
         * ModID文字列
         */
        public static final String MOD_ID = "samplemod";

        //鉱石作成
	public static ConfiguredFeature<?, ?> ORE_OAK_LOG_OVERWORLD = Feature.ORE
        .configure(new OreFeatureConfig(
          OreFeatureConfig.Rules.BASE_STONE_OVERWORLD,
          Blocks.OAK_LOG.getDefaultState(),//オークの原木を指定
          9)) //鉱石(生成物)の最大サイズ
        .decorate(Decorator.RANGE.configure(new RangeDecoratorConfig(
          0, 
          0, //鉱石(生成物)Y座標の最小レベル
          64))) //鉱石(生成物)Y座標の最大レベル
        .spreadHorizontally()
        .repeat(20); //1チャンクあたりの鉱石(生成物)の数

        @Override
        public void onInitialize()
        {
		//つくった鉱石(生成物)を登録
		Registry.register(BuiltinRegistries.CONFIGURED_FEATURE, new Identifier(MOD_ID, "ore_oak_log_overworld"), ORE_OAK_LOG_OVERWORLD);
        }
    }
}
  • SampleDefaultBiomeFeaturesMixin.java
package com.example.ore.mixin;

import net.minecraft.world.biome.GenerationSettings;
import net.minecraft.world.gen.GenerationStep;
import net.minecraft.world.gen.feature.DefaultBiomeFeatures;

import com.example.ore.SampleMod;

import org.spongepowered.asm.mixin.Mixin;
import org.spongepowered.asm.mixin.injection.At;
import org.spongepowered.asm.mixin.injection.Inject;
import org.spongepowered.asm.mixin.injection.callback.CallbackInfo;

@Mixin(DefaultBiomeFeatures.class)
public class SampleDefaultBiomeFeaturesMixin {
  @Inject(method = "addDefaultOres(Lnet/minecraft/world/biome/GenerationSettings$Builder;)V", at = @At("TAIL"))
  private static void addDefaultOres(GenerationSettings.Builder builder, CallbackInfo ci) {
    builder.feature(GenerationStep.Feature.UNDERGROUND_ORES, SampleMod.ORE_OAK_LOG_OVERWORLD);
  }
}
  • samplemod.mixins.json
{
  "required": true,
  "minVersion": "0.8",
  "package": "com.example.ore.mixin",
  "compatibilityLevel": "JAVA_8",
  "$comment": "↓SampleDefaultBiomeFeaturesMixinをミックスインに追加",
  "mixins": [
    "SampleDefaultBiomeFeaturesMixin"
  ],
  "client": [
    "SampleMixin"
  ],
  "injectors": {
    "defaultRequire": 1
  }
}

解説

  • SampleMod.java

ここでの構成は、「src/java/main/com/example/ore/SampleMod.java」となっている。

public static ConfiguredFeature<?, ?> ORE_OAK_LOG_OVERWORLD = Feature.ORE
        .configure(new OreFeatureConfig(
          OreFeatureConfig.Rules.BASE_STONE_OVERWORLD,
          Blocks.OAK_LOG.getDefaultState(),
          9))
        .decorate(Decorator.RANGE.configure(new RangeDecoratorConfig(
          0, 
          0,
          64)))
        .spreadHorizontally()
        .repeat(20);

Blocks.OAK_LOGでminecraft:oak_logを指定している。
追加したブロックにしたいなら、Blocks.OAK_LOGをクラス名.ブロック(例:SampleMod.SAMPLE_BLOCK)に指定すればよい。

  • SampleDefaultBiomeFeaturesMixin.java

ここでの構成は、「src/java/main/com/example/ore/mixin/SampleDefaultBiomeFeaturesMixin.java」となっている。

  • samplemod.mixins.json

ここでの構成は、「src/resources/samplemod.mixins.json」となっている。 名前は(MOD ID).mixins.jsonにして保存すること。

"mixins": [
    "SampleDefaultBiomeFeaturesMixin"
  ],

ここで「SampleDefaultBiomeFeaturesMixin.java」を指定している。 詳しくはMixinを参照すること。