WIP: Ender Ore generation
This commit is contained in:
parent
d272597e87
commit
ad0834b25f
10 changed files with 90 additions and 18 deletions
|
@ -19,6 +19,7 @@ import net.minecraft.world.World;
|
|||
import net.minecraft.world.WorldAccess;
|
||||
import net.minecraft.world.WorldView;
|
||||
import net.minecraft.world.gen.feature.DefaultFeatureConfig;
|
||||
import net.minecraft.world.gen.feature.Feature;
|
||||
import ru.betterend.client.ERenderLayer;
|
||||
import ru.betterend.client.IRenderTypeable;
|
||||
import ru.betterend.registry.BlockTagRegistry;
|
||||
|
@ -81,7 +82,9 @@ public class BlockFeatureSapling extends BlockBaseNotFull implements Fertilizabl
|
|||
@Override
|
||||
public void grow(ServerWorld world, Random random, BlockPos pos, BlockState state) {
|
||||
BlocksHelper.setWithoutUpdate(world, pos, Blocks.AIR.getDefaultState());
|
||||
feature.getFeature().generate(world, world.getChunkManager().getChunkGenerator(), random, pos, DefaultFeatureConfig.INSTANCE);
|
||||
@SuppressWarnings("unchecked")
|
||||
Feature<DefaultFeatureConfig> defFeature = (Feature<DefaultFeatureConfig>) feature.getFeature();
|
||||
defFeature.generate(world, world.getChunkManager().getChunkGenerator(), random, pos, DefaultFeatureConfig.INSTANCE);
|
||||
}
|
||||
|
||||
@Override
|
||||
|
|
|
@ -8,6 +8,7 @@ import com.mojang.blaze3d.systems.RenderSystem;
|
|||
|
||||
import net.fabricmc.api.EnvType;
|
||||
import net.fabricmc.api.Environment;
|
||||
|
||||
import net.minecraft.client.gui.DrawableHelper;
|
||||
import net.minecraft.client.gui.screen.Screen;
|
||||
import net.minecraft.client.gui.screen.recipebook.BlastFurnaceRecipeBookScreen;
|
||||
|
@ -18,6 +19,7 @@ import net.minecraft.recipe.Ingredient;
|
|||
import net.minecraft.recipe.Recipe;
|
||||
import net.minecraft.screen.slot.Slot;
|
||||
import net.minecraft.util.collection.DefaultedList;
|
||||
|
||||
import ru.betterend.blocks.entities.EndStoneSmelterBlockEntity;
|
||||
|
||||
@Environment(EnvType.CLIENT)
|
||||
|
@ -33,6 +35,14 @@ public class EndStoneSmelterRecipeBookScreen extends BlastFurnaceRecipeBookScree
|
|||
return EndStoneSmelterBlockEntity.availableFuels().keySet();
|
||||
}
|
||||
|
||||
@Override
|
||||
public void slotClicked(Slot slot) {
|
||||
super.slotClicked(slot);
|
||||
if (slot != null && slot.id < this.craftingScreenHandler.getCraftingSlotCount()) {
|
||||
this.fuelSlot = null;
|
||||
}
|
||||
}
|
||||
|
||||
@Override
|
||||
public void showGhostRecipe(Recipe<?> recipe, List<Slot> slots) {
|
||||
this.ghostSlots.reset();
|
||||
|
|
|
@ -3,6 +3,7 @@ package ru.betterend.client.gui;
|
|||
import net.fabricmc.api.EnvType;
|
||||
import net.fabricmc.api.Environment;
|
||||
import net.fabricmc.fabric.api.screenhandler.v1.ScreenHandlerRegistry;
|
||||
|
||||
import net.minecraft.entity.player.PlayerEntity;
|
||||
import net.minecraft.entity.player.PlayerInventory;
|
||||
import net.minecraft.inventory.Inventory;
|
||||
|
@ -19,6 +20,7 @@ import net.minecraft.screen.ScreenHandlerType;
|
|||
import net.minecraft.screen.slot.Slot;
|
||||
import net.minecraft.util.Identifier;
|
||||
import net.minecraft.world.World;
|
||||
|
||||
import ru.betterend.BetterEnd;
|
||||
import ru.betterend.blocks.EndStoneSmelter;
|
||||
import ru.betterend.blocks.entities.EndStoneSmelterBlockEntity;
|
||||
|
|
|
@ -0,0 +1,21 @@
|
|||
package ru.betterend.mixin.common;
|
||||
|
||||
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.CallbackInfoReturnable;
|
||||
|
||||
import net.minecraft.world.biome.Biome;
|
||||
import net.minecraft.world.biome.DefaultBiomeCreator;
|
||||
import net.minecraft.world.biome.GenerationSettings;
|
||||
import net.minecraft.world.gen.GenerationStep;
|
||||
|
||||
import ru.betterend.registry.FeatureRegistry;
|
||||
|
||||
@Mixin(DefaultBiomeCreator.class)
|
||||
public abstract class DefaultBiomeCreatorMixin {
|
||||
@Inject(method = "composeEndSpawnSettings(Lnet/minecraft/world/biome/GenerationSettings$Builder;)Lnet/minecraft/world/biome/Biome;", at = @At("HEAD"))
|
||||
private static void addEndOres(GenerationSettings.Builder builder, CallbackInfoReturnable<Biome> rcinfo) {
|
||||
//builder.feature(GenerationStep.Feature.UNDERGROUND_ORES, FeatureRegistry.ENDER_ORE.getFeatureConfigured());
|
||||
}
|
||||
}
|
|
@ -33,10 +33,10 @@ public class AlloyingRecipe implements Recipe<Inventory> {
|
|||
protected final int smeltTime;
|
||||
|
||||
|
||||
public AlloyingRecipe(Identifier id, Ingredient primaryInput, Ingredient secondaryInput,
|
||||
public AlloyingRecipe(Identifier id, String group, Ingredient primaryInput, Ingredient secondaryInput,
|
||||
ItemStack output, float experience, int smeltTime) {
|
||||
|
||||
this.group = String.format("%s:%s", GROUP, id.getPath());
|
||||
this.group = group;
|
||||
this.id = id;
|
||||
this.primaryInput = primaryInput;
|
||||
this.secondaryInput = secondaryInput;
|
||||
|
@ -113,6 +113,7 @@ public class AlloyingRecipe implements Recipe<Inventory> {
|
|||
|
||||
public static Builder create(String id) {
|
||||
INSTANCE.id = BetterEnd.getResId(id);
|
||||
INSTANCE.group = String.format("%s:%s", GROUP, id);
|
||||
INSTANCE.primaryInput = null;
|
||||
INSTANCE.secondaryInput = null;
|
||||
INSTANCE.output = null;
|
||||
|
@ -126,11 +127,17 @@ public class AlloyingRecipe implements Recipe<Inventory> {
|
|||
private Ingredient primaryInput;
|
||||
private Ingredient secondaryInput;
|
||||
private ItemStack output;
|
||||
private String group;
|
||||
private float experience;
|
||||
private int smeltTime;
|
||||
|
||||
private Builder() {}
|
||||
|
||||
public Builder setGroup(String group) {
|
||||
this.group = group;
|
||||
return this;
|
||||
}
|
||||
|
||||
public Builder setPrimaryInput(ItemConvertible... inputs) {
|
||||
this.primaryInput = Ingredient.ofItems(inputs);
|
||||
return this;
|
||||
|
@ -192,7 +199,7 @@ public class AlloyingRecipe implements Recipe<Inventory> {
|
|||
} else if(output == null) {
|
||||
throw new IllegalArgumentException("Output can't be null!");
|
||||
}
|
||||
EndRecipeManager.addRecipe(AlloyingRecipe.TYPE, new AlloyingRecipe(id, primaryInput, secondaryInput, output, experience, smeltTime));
|
||||
EndRecipeManager.addRecipe(AlloyingRecipe.TYPE, new AlloyingRecipe(id, group, primaryInput, secondaryInput, output, experience, smeltTime));
|
||||
}
|
||||
}
|
||||
}
|
||||
|
|
|
@ -19,6 +19,7 @@ public class AlloyingRecipeSerializer implements RecipeSerializer<AlloyingRecipe
|
|||
Ingredient primaryInput = Ingredient.fromJson(ingredients.get(0));
|
||||
Ingredient secondaryInput = Ingredient.fromJson(ingredients.get(1));
|
||||
String rusultStr = JsonHelper.getString(json, "result");
|
||||
String group = JsonHelper.getString(json, "group", "");
|
||||
Identifier resultId = new Identifier(rusultStr);
|
||||
ItemStack output = new ItemStack(Registry.ITEM.getOrEmpty(resultId).orElseThrow(() -> {
|
||||
return new IllegalStateException("Item: " + rusultStr + " does not exist");
|
||||
|
@ -26,22 +27,24 @@ public class AlloyingRecipeSerializer implements RecipeSerializer<AlloyingRecipe
|
|||
float experience = JsonHelper.getFloat(json, "experience", 0.0F);
|
||||
int smeltTime = JsonHelper.getInt(json, "smelttime", 350);
|
||||
|
||||
return new AlloyingRecipe(id, primaryInput, secondaryInput, output, experience, smeltTime);
|
||||
return new AlloyingRecipe(id, group, primaryInput, secondaryInput, output, experience, smeltTime);
|
||||
}
|
||||
|
||||
@Override
|
||||
public AlloyingRecipe read(Identifier id, PacketByteBuf packetBuffer) {
|
||||
String group = packetBuffer.readString();
|
||||
Ingredient primaryInput = Ingredient.fromPacket(packetBuffer);
|
||||
Ingredient secondaryInput = Ingredient.fromPacket(packetBuffer);
|
||||
ItemStack output = packetBuffer.readItemStack();
|
||||
float experience = packetBuffer.readFloat();
|
||||
int smeltTime = packetBuffer.readVarInt();
|
||||
|
||||
return new AlloyingRecipe(id, primaryInput, secondaryInput, output, experience, smeltTime);
|
||||
return new AlloyingRecipe(id, group, primaryInput, secondaryInput, output, experience, smeltTime);
|
||||
}
|
||||
|
||||
@Override
|
||||
public void write(PacketByteBuf packetBuffer, AlloyingRecipe recipe) {
|
||||
packetBuffer.writeString(recipe.group);
|
||||
recipe.primaryInput.write(packetBuffer);
|
||||
recipe.secondaryInput.write(packetBuffer);
|
||||
packetBuffer.writeItemStack(recipe.output);
|
||||
|
|
|
@ -6,7 +6,8 @@ import ru.betterend.world.features.MossyGlowshroomFeature;
|
|||
|
||||
public class FeatureRegistry {
|
||||
public static final EndFeature MOSSY_GLOWSHROOM = new EndFeature("mossy_glowshroom", new MossyGlowshroomFeature(), 1);
|
||||
public static final EndFeature END_LAKE = EndFeature.MakeLakeFeature("end_lake", new EndLakeFeature(), 100);
|
||||
public static final EndFeature END_LAKE = EndFeature.makeLakeFeature("end_lake", new EndLakeFeature(), 100);
|
||||
public static final EndFeature ENDER_ORE = EndFeature.makeOreFeature("ender_ore", BlockRegistry.ENDER_ORE, 2, 3, 0, 4, 128);
|
||||
|
||||
public static void register() {}
|
||||
}
|
||||
|
|
|
@ -12,6 +12,7 @@ public class BiomeFoggyMushroomland extends EndBiome {
|
|||
.setWaterFogColor(119, 227, 250)
|
||||
.setSurface(BlockRegistry.END_MOSS, BlockRegistry.END_MYCELIUM)
|
||||
.addFeature(FeatureRegistry.END_LAKE)
|
||||
.addFeature(FeatureRegistry.MOSSY_GLOWSHROOM));
|
||||
.addFeature(FeatureRegistry.MOSSY_GLOWSHROOM)
|
||||
.addFeature(FeatureRegistry.ENDER_ORE));
|
||||
}
|
||||
}
|
||||
|
|
|
@ -1,56 +1,79 @@
|
|||
package ru.betterend.world.features;
|
||||
|
||||
import net.minecraft.block.Block;
|
||||
import net.minecraft.block.Blocks;
|
||||
import net.minecraft.structure.rule.BlockMatchRuleTest;
|
||||
import net.minecraft.util.Identifier;
|
||||
import net.minecraft.util.registry.BuiltinRegistries;
|
||||
import net.minecraft.util.registry.Registry;
|
||||
|
||||
import net.minecraft.world.gen.GenerationStep;
|
||||
import net.minecraft.world.gen.decorator.ChanceDecoratorConfig;
|
||||
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.ConfiguredFeatures;
|
||||
import net.minecraft.world.gen.feature.DefaultFeatureConfig;
|
||||
import net.minecraft.world.gen.feature.Feature;
|
||||
import net.minecraft.world.gen.feature.FeatureConfig;
|
||||
import net.minecraft.world.gen.feature.OreFeatureConfig;
|
||||
import ru.betterend.BetterEnd;
|
||||
|
||||
public class EndFeature {
|
||||
private final Feature<DefaultFeatureConfig> feature;
|
||||
private final ConfiguredFeature<?, ?> featureConfigured;
|
||||
private final GenerationStep.Feature featureStep;
|
||||
private Feature<?> feature;
|
||||
private ConfiguredFeature<?, ?> featureConfigured;
|
||||
private GenerationStep.Feature featureStep;
|
||||
|
||||
private EndFeature() {}
|
||||
|
||||
public EndFeature(String name, Feature<DefaultFeatureConfig> feature, GenerationStep.Feature featureStep, ConfiguredFeature<?, ?> configuredFeature) {
|
||||
Identifier id = new Identifier(BetterEnd.MOD_ID, name);
|
||||
Identifier id = BetterEnd.getResId(name);
|
||||
this.featureStep = featureStep;
|
||||
this.feature = Registry.register(Registry.FEATURE, id, feature);
|
||||
this.featureConfigured = Registry.register(BuiltinRegistries.CONFIGURED_FEATURE, id, configuredFeature);
|
||||
}
|
||||
|
||||
public EndFeature(String name, Feature<DefaultFeatureConfig> feature) {
|
||||
Identifier id = new Identifier(BetterEnd.MOD_ID, name);
|
||||
Identifier id = BetterEnd.getResId(name);
|
||||
this.featureStep = GenerationStep.Feature.VEGETAL_DECORATION;
|
||||
this.feature = Registry.register(Registry.FEATURE, id, feature);
|
||||
this.featureConfigured = Registry.register(BuiltinRegistries.CONFIGURED_FEATURE, id, feature.configure(FeatureConfig.DEFAULT).decorate(Decorator.CHANCE.configure(new ChanceDecoratorConfig(100))));
|
||||
}
|
||||
|
||||
public EndFeature(String name, Feature<DefaultFeatureConfig> feature, int density) {
|
||||
Identifier id = new Identifier(BetterEnd.MOD_ID, name);
|
||||
Identifier id = BetterEnd.getResId(name);
|
||||
this.featureStep = GenerationStep.Feature.VEGETAL_DECORATION;
|
||||
this.feature = Registry.register(Registry.FEATURE, id, feature);
|
||||
this.featureConfigured = Registry.register(BuiltinRegistries.CONFIGURED_FEATURE, id, feature.configure(FeatureConfig.DEFAULT).decorate(ConfiguredFeatures.Decorators.SQUARE_HEIGHTMAP).repeatRandomly(density));
|
||||
//return new EndFeature(name, feature, GenerationStep.Feature.VEGETAL_DECORATION, feature.configure(FeatureConfig.DEFAULT).decorate(ConfiguredFeatures.Decorators.SQUARE_HEIGHTMAP).repeatRandomly(4));
|
||||
}
|
||||
|
||||
public static EndFeature MakeRawGenFeature(String name, Feature<DefaultFeatureConfig> feature, int chance) {
|
||||
public static EndFeature makeRawGenFeature(String name, Feature<DefaultFeatureConfig> feature, int chance) {
|
||||
ConfiguredFeature<?, ?> configured = feature.configure(FeatureConfig.DEFAULT).decorate(Decorator.CHANCE.configure(new ChanceDecoratorConfig(100)));
|
||||
return new EndFeature(name, feature, GenerationStep.Feature.RAW_GENERATION, configured);
|
||||
}
|
||||
|
||||
public static EndFeature MakeLakeFeature(String name, Feature<DefaultFeatureConfig> feature, int chance) {
|
||||
public static EndFeature makeLakeFeature(String name, Feature<DefaultFeatureConfig> feature, int chance) {
|
||||
ConfiguredFeature<?, ?> configured = feature.configure(FeatureConfig.DEFAULT).decorate(Decorator.CHANCE.configure(new ChanceDecoratorConfig(100)));
|
||||
return new EndFeature(name, feature, GenerationStep.Feature.LAKES, configured);
|
||||
}
|
||||
|
||||
public Feature<DefaultFeatureConfig> getFeature() {
|
||||
|
||||
public static EndFeature makeOreFeature(String name, Block blockOre, int veins, int veinSize, int offset, int minY, int maxY) {
|
||||
EndFeature newFeature = new EndFeature();
|
||||
OreFeatureConfig featureConfig = new OreFeatureConfig(new BlockMatchRuleTest(Blocks.END_STONE), blockOre.getDefaultState(), veinSize);
|
||||
RangeDecoratorConfig rangeDecorator = new RangeDecoratorConfig(offset, minY, maxY);
|
||||
ConfiguredFeature<?, ?> oreFeature = Feature.ORE.configure(featureConfig)
|
||||
.decorate(Decorator.RANGE.configure(rangeDecorator))
|
||||
.spreadHorizontally()
|
||||
.repeat(veins);
|
||||
newFeature.feature = Feature.ORE;
|
||||
newFeature.featureStep = GenerationStep.Feature.UNDERGROUND_ORES;
|
||||
newFeature.featureConfigured = Registry.register(BuiltinRegistries.CONFIGURED_FEATURE, BetterEnd.getResId(name), oreFeature);
|
||||
|
||||
return newFeature;
|
||||
}
|
||||
|
||||
public Feature<?> getFeature() {
|
||||
return feature;
|
||||
}
|
||||
|
||||
|
|
|
@ -9,6 +9,7 @@
|
|||
"ServerPlayNetworkHandlerMixin",
|
||||
"TagGroupLoaderMixin",
|
||||
"CraftingScreenHandlerMixin",
|
||||
"DefaultBiomeCreatorMixin",
|
||||
"TagAccessor"
|
||||
],
|
||||
"injectors": {
|
||||
|
|
Loading…
Add table
Add a link
Reference in a new issue