Industrial glass blocks, panes and recipes

This commit is contained in:
DBotThePony 2022-01-24 17:07:28 +07:00
parent b79dd85a25
commit 5d8e0e8c48
Signed by: DBot
GPG Key ID: DCC23B5715498507
4 changed files with 229 additions and 17 deletions

View File

@ -1,12 +1,19 @@
package ru.dbotthepony.mc.otm.datagen
import net.minecraft.core.Direction
import net.minecraft.data.recipes.ShapedRecipeBuilder
import net.minecraft.data.recipes.ShapelessRecipeBuilder
import net.minecraft.resources.ResourceLocation
import net.minecraft.tags.ItemTags
import net.minecraft.tags.Tag
import net.minecraft.world.item.Item
import net.minecraft.world.level.block.Block
import net.minecraftforge.common.Tags
import net.minecraftforge.eventbus.api.SubscribeEvent
import net.minecraftforge.fml.common.Mod
import net.minecraftforge.forge.event.lifecycle.GatherDataEvent
import ru.dbotthepony.mc.otm.OverdriveThatMatters
import ru.dbotthepony.mc.otm.Registry
import ru.dbotthepony.mc.otm.Registry.Blocks
import ru.dbotthepony.mc.otm.Registry.Items
import ru.dbotthepony.mc.otm.block.BlockDriveViewer
@ -22,6 +29,7 @@ import ru.dbotthepony.mc.otm.datagen.loot.MatteryLootTableProvider
import ru.dbotthepony.mc.otm.datagen.loot.TileNbtCopy
import ru.dbotthepony.mc.otm.datagen.models.BlockMatteryModelProvider
import ru.dbotthepony.mc.otm.datagen.recipes.MatteryRecipeProvider
import ru.dbotthepony.mc.otm.datagen.recipes.has
@Mod.EventBusSubscriber(modid = DataGen.MOD_ID, bus = Mod.EventBusSubscriber.Bus.MOD)
object DataGen {
@ -311,6 +319,60 @@ object DataGen {
for (thing in hardMetals) {
plate(thing, workTicks = 300)
}
lambda { _, consumer ->
ShapelessRecipeBuilder(Registry.INDUSTRIAL_GLASS.item, 8)
.requires(net.minecraft.world.item.Items.GLASS, 8)
.requires(Registry.Tags.Items.PLATE_TRITANIUM)
.unlockedBy("has_plate", has(Registry.Tags.Items.PLATE_TRITANIUM))
.unlockedBy("has_glass", has(net.minecraft.world.item.Items.GLASS))
.save(consumer)
ShapedRecipeBuilder(Registry.INDUSTRIAL_GLASS.paneItem, 16)
.define('#', Registry.INDUSTRIAL_GLASS.item)
.pattern("###").pattern("###")
.unlockedBy("has_tritanium_glass", has(Registry.INDUSTRIAL_GLASS.item))
.save(consumer)
val mapping = mapOf<Registry.IndustrialGlassProps, Tag<Item>>(
Registry.INDUSTRIAL_GLASS_BLACK to Tags.Items.DYES_BLACK,
Registry.INDUSTRIAL_GLASS_RED to Tags.Items.DYES_RED,
Registry.INDUSTRIAL_GLASS_GREEN to Tags.Items.DYES_GREEN,
Registry.INDUSTRIAL_GLASS_BROWN to Tags.Items.DYES_BROWN,
Registry.INDUSTRIAL_GLASS_BLUE to Tags.Items.DYES_BLUE,
Registry.INDUSTRIAL_GLASS_PURPLE to Tags.Items.DYES_PURPLE,
Registry.INDUSTRIAL_GLASS_CYAN to Tags.Items.DYES_CYAN,
Registry.INDUSTRIAL_GLASS_LIGHT_GRAY to Tags.Items.DYES_LIGHT_GRAY,
Registry.INDUSTRIAL_GLASS_GRAY to Tags.Items.DYES_GRAY,
Registry.INDUSTRIAL_GLASS_PINK to Tags.Items.DYES_PINK,
Registry.INDUSTRIAL_GLASS_LIME to Tags.Items.DYES_LIME,
Registry.INDUSTRIAL_GLASS_YELLOW to Tags.Items.DYES_YELLOW,
Registry.INDUSTRIAL_GLASS_LIGHT_BLUE to Tags.Items.DYES_LIGHT_BLUE,
Registry.INDUSTRIAL_GLASS_MAGENTA to Tags.Items.DYES_MAGENTA,
Registry.INDUSTRIAL_GLASS_ORANGE to Tags.Items.DYES_ORANGE,
Registry.INDUSTRIAL_GLASS_WHITE to Tags.Items.DYES_WHITE,
)
for ((item, tag) in mapping) {
ShapelessRecipeBuilder(item.item, 8)
.requires(Registry.INDUSTRIAL_GLASS.item, 8)
.requires(tag)
.unlockedBy("has_tritanium_glass", has(Registry.INDUSTRIAL_GLASS.item))
.save(consumer)
ShapelessRecipeBuilder(item.paneItem, 8)
.requires(Registry.INDUSTRIAL_GLASS.paneItem, 8)
.requires(tag)
.unlockedBy("has_tritanium_glass_pane", has(Registry.INDUSTRIAL_GLASS.paneItem))
.save(consumer)
ShapedRecipeBuilder(item.paneItem, 16)
.define('#', item.item)
.pattern("###").pattern("###")
.unlockedBy("has_colored_tritanium_glass", has(item.paneItem))
.save(consumer, ResourceLocation(MOD_ID, "${item.namePane.path}_alt"))
}
}
}
}
}

View File

@ -1,16 +1,45 @@
package ru.dbotthepony.mc.otm.datagen.recipes
import net.minecraft.advancements.critereon.EntityPredicate
import net.minecraft.advancements.critereon.InventoryChangeTrigger
import net.minecraft.advancements.critereon.ItemPredicate
import net.minecraft.advancements.critereon.MinMaxBounds
import net.minecraft.data.DataGenerator
import net.minecraft.data.recipes.FinishedRecipe
import net.minecraft.data.recipes.RecipeProvider
import net.minecraft.resources.ResourceLocation
import net.minecraft.tags.Tag
import net.minecraft.world.item.Item
import net.minecraft.world.item.crafting.Ingredient
import net.minecraft.world.level.ItemLike
import ru.dbotthepony.mc.otm.datagen.DataGen
import ru.dbotthepony.mc.otm.recipe.PlatePressRecipe
import java.util.function.Consumer
private typealias RecipeLambda = (MatteryRecipeProvider, Consumer<FinishedRecipe>) -> Unit
private fun has(p_176521_: MinMaxBounds.Ints, p_176522_: ItemLike): InventoryChangeTrigger.TriggerInstance {
return inventoryTrigger(ItemPredicate.Builder.item().of(p_176522_).withCount(p_176521_).build())
}
fun has(p_125978_: ItemLike): InventoryChangeTrigger.TriggerInstance {
return inventoryTrigger(ItemPredicate.Builder.item().of(p_125978_).build())
}
fun has(p_125976_: Tag<Item>): InventoryChangeTrigger.TriggerInstance {
return inventoryTrigger(ItemPredicate.Builder.item().of(p_125976_).build())
}
fun inventoryTrigger(vararg p_126012_: ItemPredicate): InventoryChangeTrigger.TriggerInstance {
return InventoryChangeTrigger.TriggerInstance(
EntityPredicate.Composite.ANY,
MinMaxBounds.Ints.ANY,
MinMaxBounds.Ints.ANY,
MinMaxBounds.Ints.ANY,
p_126012_
)
}
class MatteryRecipeProvider(generatorIn: DataGenerator) : RecipeProvider(generatorIn) {
private val lambdas = ArrayList<RecipeLambda>()

View File

@ -80,7 +80,8 @@ public class OverdriveThatMatters {
if (event.phase != TickEvent.Phase.START || event.side != LogicalSide.SERVER)
return;
final var until = tick_until.get(event.world);
// удаляем список сразу что бы если кто-либо добавит туда элементы у нас была "копия"
final var until = tick_until.remove(event.world);
if (until != null) {
for (int i = until.size() - 1; i >= 0; i--) {
@ -89,12 +90,16 @@ public class OverdriveThatMatters {
}
}
if (until.size() == 0) {
tick_until.remove(event.world);
if (until.size() != 0) {
final var replaced = tick_until.put(event.world, until);
if (replaced != null) {
until.addAll(replaced);
}
}
}
final var once = tick_once.get(event.world);
final var once = tick_once.remove(event.world);
if (once != null) {
ArrayList<Supplier<Boolean>> invalid = new ArrayList<>();
@ -102,8 +107,6 @@ public class OverdriveThatMatters {
for (var ticker : once) {
ticker.accept(event.world);
}
tick_once.remove(event.world);
}
}
@ -120,6 +123,13 @@ public class OverdriveThatMatters {
}
public OverdriveThatMatters() {
CREATIVE_TAB = new CreativeModeTab("otm") {
@Override
public ItemStack makeIcon() {
return new ItemStack(Registry.Items.BATTERY_CREATIVE, 1);
}
};
// Register the setup method for modloading
FMLJavaModLoadingContext.get().getModEventBus().addListener(this::setup);
FMLJavaModLoadingContext.get().getModEventBus().addListener(this::setupClient);
@ -151,13 +161,6 @@ public class OverdriveThatMatters {
// force Registry static initializer to be called
Registry.dummy();
CREATIVE_TAB = new CreativeModeTab("otm") {
@Override
public ItemStack makeIcon() {
return new ItemStack(Registry.Items.BATTERY_CREATIVE, 1);
}
};
}
public static StorageObjectTuple<ItemStackWrapper> ITEM_STORAGE;

View File

@ -21,9 +21,7 @@ import net.minecraft.world.item.crafting.Recipe;
import net.minecraft.world.item.crafting.RecipeSerializer;
import net.minecraft.world.item.crafting.RecipeType;
import net.minecraft.world.level.Level;
import net.minecraft.world.level.block.Block;
import net.minecraft.world.level.block.OreBlock;
import net.minecraft.world.level.block.SoundType;
import net.minecraft.world.level.block.*;
import net.minecraft.world.level.block.entity.BlockEntityType;
import net.minecraft.world.level.block.state.BlockBehaviour;
import net.minecraft.world.level.material.Material;
@ -62,10 +60,17 @@ import ru.dbotthepony.mc.otm.recipe.PlatePressRecipeFactory;
import net.minecraftforge.common.Tags.IOptionalNamedTag;
import javax.annotation.Nonnull;
import java.util.ConcurrentModificationException;
import java.util.List;
import java.util.Set;
public class Registry {
static {
if (OverdriveThatMatters.CREATIVE_TAB == null) {
throw new ConcurrentModificationException("Accessing Registry before OverdriveThatMatters class is initialized. This is not supported! If no other mods are installed this is a bug.");
}
}
public static final DamageSource DAMAGE_BECOME_ANDROID = new DamageSource("otm_become_android");
public static final DamageSource DAMAGE_BECOME_HUMANE = new DamageSource("otm_become_humane");
public static final DamageSource DAMAGE_EVENT_HORIZON = new DamageSource("otm_event_horizon");
@ -118,6 +123,109 @@ public class Registry {
new CrateProps(MaterialColor.COLOR_PURPLE, "purple"),
};
public record IndustrialGlassProps(@Nullable DyeColor color, ResourceLocation name, ResourceLocation namePane, Block block, Block pane, BlockItem item, BlockItem paneItem) {
public IndustrialGlassProps(@Nullable DyeColor color, ResourceLocation name, ResourceLocation namePane, Block block, Block pane, BlockItem item, BlockItem paneItem) {
this.color = color;
this.name = name;
this.namePane = namePane;
this.block = block;
this.pane = pane;
this.item = item;
this.paneItem = paneItem;
this.block.setRegistryName(this.name);
this.pane.setRegistryName(this.namePane);
this.item.setRegistryName(this.name);
this.paneItem.setRegistryName(this.namePane);
}
IndustrialGlassProps(@Nullable DyeColor color, ResourceLocation name, ResourceLocation namePane, Block block, Block pane) {
this(color, name, namePane, block, pane,
new BlockItem(block, new Item.Properties().tab(OverdriveThatMatters.CREATIVE_TAB).stacksTo(64)),
new BlockItem(pane, new Item.Properties().tab(OverdriveThatMatters.CREATIVE_TAB).stacksTo(64)));
}
IndustrialGlassProps(@Nullable DyeColor color, ResourceLocation name, ResourceLocation namePane) {
this(color, name, namePane,
glass(color, BlockBehaviour.Properties.of(Material.GLASS, color != null ? color.getMaterialColor() : MaterialColor.NONE)
.strength(1.5F, 5.0F)
.requiresCorrectToolForDrops()
.sound(SoundType.GLASS)
.noOcclusion()
.isValidSpawn((_a, _b, _c, _d) -> false)
.isRedstoneConductor((_a, _b, _c) -> false)
.isSuffocating((_a, _b, _c) -> false)
.isViewBlocking((_a, _b, _c) -> false)),
pane(color, BlockBehaviour.Properties.of(Material.GLASS, color != null ? color.getMaterialColor() : MaterialColor.NONE)
.strength(1.25F, 5.0F)
.requiresCorrectToolForDrops()
.sound(SoundType.GLASS)
.noOcclusion())
);
}
private static Block glass(@Nullable DyeColor color, BlockBehaviour.Properties props) {
if (color == null) {
return new GlassBlock(props);
}
return new StainedGlassBlock(color, props);
}
private static Block pane(@Nullable DyeColor color, BlockBehaviour.Properties props) {
if (color == null) {
return new IronBarsBlock(props);
}
return new StainedGlassPaneBlock(color, props);
}
IndustrialGlassProps(@Nullable DyeColor color) {
this(color,
new ResourceLocation(OverdriveThatMatters.MOD_ID, color != null ? "industrial_glass_" + color.getName() : "industrial_glass"),
new ResourceLocation(OverdriveThatMatters.MOD_ID, color != null ? "industrial_glass_pane_" + color.getName() : "industrial_glass_pane")
);
}
}
public static final IndustrialGlassProps INDUSTRIAL_GLASS = new IndustrialGlassProps(null);
public static final IndustrialGlassProps INDUSTRIAL_GLASS_WHITE = new IndustrialGlassProps(DyeColor.WHITE);
public static final IndustrialGlassProps INDUSTRIAL_GLASS_ORANGE = new IndustrialGlassProps(DyeColor.ORANGE);
public static final IndustrialGlassProps INDUSTRIAL_GLASS_MAGENTA = new IndustrialGlassProps(DyeColor.MAGENTA);
public static final IndustrialGlassProps INDUSTRIAL_GLASS_LIGHT_BLUE = new IndustrialGlassProps(DyeColor.LIGHT_BLUE);
public static final IndustrialGlassProps INDUSTRIAL_GLASS_YELLOW = new IndustrialGlassProps(DyeColor.YELLOW);
public static final IndustrialGlassProps INDUSTRIAL_GLASS_LIME = new IndustrialGlassProps(DyeColor.LIME);
public static final IndustrialGlassProps INDUSTRIAL_GLASS_PINK = new IndustrialGlassProps(DyeColor.PINK);
public static final IndustrialGlassProps INDUSTRIAL_GLASS_GRAY = new IndustrialGlassProps(DyeColor.GRAY);
public static final IndustrialGlassProps INDUSTRIAL_GLASS_LIGHT_GRAY = new IndustrialGlassProps(DyeColor.LIGHT_GRAY);
public static final IndustrialGlassProps INDUSTRIAL_GLASS_CYAN = new IndustrialGlassProps(DyeColor.CYAN);
public static final IndustrialGlassProps INDUSTRIAL_GLASS_PURPLE = new IndustrialGlassProps(DyeColor.PURPLE);
public static final IndustrialGlassProps INDUSTRIAL_GLASS_BLUE = new IndustrialGlassProps(DyeColor.BLUE);
public static final IndustrialGlassProps INDUSTRIAL_GLASS_BROWN = new IndustrialGlassProps(DyeColor.BROWN);
public static final IndustrialGlassProps INDUSTRIAL_GLASS_GREEN = new IndustrialGlassProps(DyeColor.GREEN);
public static final IndustrialGlassProps INDUSTRIAL_GLASS_RED = new IndustrialGlassProps(DyeColor.RED);
public static final IndustrialGlassProps INDUSTRIAL_GLASS_BLACK = new IndustrialGlassProps(DyeColor.BLACK);
public static final IndustrialGlassProps[] INDUSTRIAL_GLASS_LIST = new IndustrialGlassProps[] {
INDUSTRIAL_GLASS,
INDUSTRIAL_GLASS_WHITE,
INDUSTRIAL_GLASS_ORANGE,
INDUSTRIAL_GLASS_MAGENTA,
INDUSTRIAL_GLASS_LIGHT_BLUE,
INDUSTRIAL_GLASS_YELLOW,
INDUSTRIAL_GLASS_LIME,
INDUSTRIAL_GLASS_PINK,
INDUSTRIAL_GLASS_GRAY,
INDUSTRIAL_GLASS_LIGHT_GRAY,
INDUSTRIAL_GLASS_CYAN,
INDUSTRIAL_GLASS_PURPLE,
INDUSTRIAL_GLASS_BLUE,
INDUSTRIAL_GLASS_BROWN,
INDUSTRIAL_GLASS_GREEN,
INDUSTRIAL_GLASS_RED,
INDUSTRIAL_GLASS_BLACK,
};
public static class Names {
private static ResourceLocation loc(String path) {
return new ResourceLocation(OverdriveThatMatters.MOD_ID, path);
@ -141,7 +249,6 @@ public class Registry {
public static final ResourceLocation CHEMICAL_GENERATOR = loc("chemical_generator"); // есть рецепт
public static final ResourceLocation PLATE_PRESS = loc("plate_press"); // есть рецепт
public static final ResourceLocation DEBUG_EXPLOSION_SMALL = loc("debug_explosion_small");
public static final ResourceLocation DEBUG_SPHERE_POINTS = loc("debug_sphere_points");
@ -438,6 +545,11 @@ public class Registry {
event.getRegistry().register(crate);
}
for (var glass : INDUSTRIAL_GLASS_LIST) {
event.getRegistry().register(glass.block);
event.getRegistry().register(glass.pane);
}
// OverdriveThatMatters.LOGGER.info("Registered blocks");
}
}
@ -791,6 +903,11 @@ public class Registry {
event.getRegistry().register(crate);
}
for (var glass : INDUSTRIAL_GLASS_LIST) {
event.getRegistry().register(glass.item);
event.getRegistry().register(glass.paneItem);
}
event.getRegistry().register(TRITANIUM_SWORD);
event.getRegistry().register(TRITANIUM_SHOVEL);
event.getRegistry().register(TRITANIUM_AXE);
@ -1269,6 +1386,7 @@ public class Registry {
public static class Tags {
public static class Items {
public static final IOptionalNamedTag<Item> INGOT_TRITANIUM = ItemTags.createOptional(new ResourceLocation("forge", "ingots/tritanium"), Set.of(() -> Registry.Items.TRITANIUM_INGOT));
public static final IOptionalNamedTag<Item> PLATE_TRITANIUM = ItemTags.createOptional(new ResourceLocation("forge", "plates/tritanium"), Set.of(() -> Registry.Items.TRITANIUM_PLATE));
}
}
}