diff --git a/build.gradle b/build.gradle index d89641f..6bd5887 100644 --- a/build.gradle +++ b/build.gradle @@ -29,6 +29,7 @@ repositories { name = "ModMaven" url = "https://modmaven.dev" } + maven { url = "https://api.modrinth.com/maven" } //for moonlight and everycompat } base { @@ -129,20 +130,11 @@ dependencies { // We add the full version to localRuntime, not runtimeOnly, so that we do not publish a dependency on it localRuntime "mezz.jei:jei-${jei_minecraft_version}-neoforge:${jei_version}" - // Example mod dependency using a mod jar from ./libs with a flat dir repository - // This maps to ./libs/coolmod-${mc_version}-${coolmod_version}.jar - // The group id is ignored when searching -- in this case, it is "blank" - // implementation "blank:coolmod-${mc_version}:${coolmod_version}" + implementation "maven.modrinth:twkfQtEc:${moonlight_version}" //moonlight + implementation "maven.modrinth:eiktJyw1:${everycomp_version}" //everycompat - // Example mod dependency using a file as dependency - // implementation files("libs/coolmod-${mc_version}-${coolmod_version}.jar") - - // Example project dependency using a sister or child project: - // implementation project(":myproject") - - // For more info: - // http://www.gradle.org/docs/current/userguide/artifact_dependencies_tutorial.html - // http://www.gradle.org/docs/current/userguide/dependency_management.html + runtimeOnly "maven.modrinth:VsM5EDoI:${blueprint_version}" //blueprint for atmopsheric + runtimeOnly "maven.modrinth:U9sJOFmJ:${atmospheric_version}" //atmospheric for wood testing } // This block of code expands all declared replace properties in the specified resource targets. diff --git a/gradle.properties b/gradle.properties index 2dd4f88..433bd71 100644 --- a/gradle.properties +++ b/gradle.properties @@ -15,7 +15,7 @@ parchment_mappings_version=2024.11.17 # The Minecraft version must agree with the Neo version to get a valid artifact minecraft_version=1.21.1 minecraft_version_range=[1.21.1] -neo_version=21.1.219 +neo_version=21.1.250 neo_version_range=[21.1.92,) loader_version_range=[1,) @@ -23,6 +23,12 @@ loader_version_range=[1,) jei_version=19.8.2.99 jei_minecraft_version=1.21 +moonlight_version=BnjVBHVl +everycomp_version=vcMMscKB + +blueprint_version=FHOjk8Ez +atmospheric_version=XIvPRE4O + ## Mod Properties mod_id=blockbox mod_name=The Block Box diff --git a/src/main/java/vectorwing/blockbox/BlockBox.java b/src/main/java/vectorwing/blockbox/BlockBox.java index 2004e7c..b9109b6 100644 --- a/src/main/java/vectorwing/blockbox/BlockBox.java +++ b/src/main/java/vectorwing/blockbox/BlockBox.java @@ -1,13 +1,17 @@ package vectorwing.blockbox; import com.mojang.logging.LogUtils; -import net.minecraft.resources.ResourceLocation; +import net.mehvahdjukaar.every_compat.EveryCompat; +import net.mehvahdjukaar.every_compat.api.EveryCompatAPI; import net.neoforged.bus.api.IEventBus; import net.neoforged.fml.ModContainer; +import net.neoforged.fml.ModList; import net.neoforged.fml.common.Mod; import net.neoforged.fml.config.ModConfig; +import net.neoforged.fml.loading.LoadingModList; import org.slf4j.Logger; import vectorwing.blockbox.common.registry.*; +import vectorwing.blockbox.compat.BlockBoxEveryCompatModule; @Mod(BlockBox.MODID) public class BlockBox @@ -24,5 +28,11 @@ public BlockBox(IEventBus modEventBus, ModContainer modContainer) { ModSounds.SOUNDS.register(modEventBus); ModParticleTypes.PARTICLE_TYPES.register(modEventBus); ModCreativeTabs.CREATIVE_MODE_TABS.register(modEventBus); + + if(ModList.get().isLoaded("everycomp")){ //there is probably a better way to check? + BlockBox.LOGGER.info("EveryCompat detected. Starting compat module"); + EveryCompatAPI.registerModule(new BlockBoxEveryCompatModule(BlockBox.MODID)); + //EveryCompat.addOptionalModule(BlockBox.MODID, () -> BlockBoxEveryCompatModule.class); //everycompat internal version? + } } } diff --git a/src/main/java/vectorwing/blockbox/common/registry/ModBlocks.java b/src/main/java/vectorwing/blockbox/common/registry/ModBlocks.java index 0d87008..e9e7066 100644 --- a/src/main/java/vectorwing/blockbox/common/registry/ModBlocks.java +++ b/src/main/java/vectorwing/blockbox/common/registry/ModBlocks.java @@ -218,27 +218,27 @@ private static Block slab(BlockBehaviour.Properties properties) { return new SlabBlock(properties); } - private static Block palisade(Supplier spikedForm, @Nullable Supplier strippedForm, MapColor mapColor) { + public static Block palisade(Supplier spikedForm, @Nullable Supplier strippedForm, MapColor mapColor) { return palisade(spikedForm, strippedForm, mapColor, SoundType.WOOD); } - private static Block palisade(Supplier spikedForm, @Nullable Supplier strippedForm, MapColor mapColor, SoundType soundType) { + public static Block palisade(Supplier spikedForm, @Nullable Supplier strippedForm, MapColor mapColor, SoundType soundType) { return new PalisadeBlock(spikedForm, strippedForm, PROPERTIES_PALISADE.mapColor(mapColor).sound(soundType).ignitedByLava()); } - private static Block netherPalisade(Supplier spikedForm, @Nullable Supplier strippedForm, MapColor mapColor) { + public static Block netherPalisade(Supplier spikedForm, @Nullable Supplier strippedForm, MapColor mapColor) { return new PalisadeBlock(spikedForm, strippedForm, PROPERTIES_PALISADE.mapColor(mapColor).sound(SoundType.STEM)); } - private static Block spikedPalisade(@Nullable Supplier strippedForm, MapColor mapColor) { + public static Block spikedPalisade(@Nullable Supplier strippedForm, MapColor mapColor) { return spikedPalisade(strippedForm, mapColor, SoundType.WOOD); } - private static Block spikedPalisade(@Nullable Supplier strippedForm, MapColor mapColor, SoundType soundType) { + public static Block spikedPalisade(@Nullable Supplier strippedForm, MapColor mapColor, SoundType soundType) { return new SpikedPalisadeBlock(strippedForm, PROPERTIES_PALISADE.mapColor(mapColor).sound(soundType).ignitedByLava()); } - private static Block netherSpikedPalisade(@Nullable Supplier strippedForm, MapColor mapColor) { + public static Block netherSpikedPalisade(@Nullable Supplier strippedForm, MapColor mapColor) { return new SpikedPalisadeBlock(strippedForm, PROPERTIES_PALISADE.mapColor(mapColor).sound(SoundType.STEM)); } } diff --git a/src/main/java/vectorwing/blockbox/compat/BlockBoxEveryCompatModule.java b/src/main/java/vectorwing/blockbox/compat/BlockBoxEveryCompatModule.java new file mode 100644 index 0000000..9c40296 --- /dev/null +++ b/src/main/java/vectorwing/blockbox/compat/BlockBoxEveryCompatModule.java @@ -0,0 +1,138 @@ +package vectorwing.blockbox.compat; + +import net.mehvahdjukaar.every_compat.api.SimpleEntrySet; +import net.mehvahdjukaar.every_compat.modules.EveryCompatModule; +import net.mehvahdjukaar.moonlight.api.set.wood.VanillaWoodTypes; +import net.mehvahdjukaar.moonlight.api.set.wood.WoodType; +import net.minecraft.core.registries.Registries; +import net.minecraft.resources.ResourceLocation; +import net.minecraft.tags.BlockTags; +import net.minecraft.world.level.block.Block; +import net.minecraft.world.level.block.state.BlockBehaviour; +import vectorwing.blockbox.common.block.SeatBlock; +import vectorwing.blockbox.common.registry.ModBlocks; +import vectorwing.blockbox.common.registry.ModCreativeTabs; + +import java.util.function.Supplier; + +import static net.mehvahdjukaar.moonlight.api.set.wood.VanillaWoodChildKeys.*; + +public class BlockBoxEveryCompatModule extends EveryCompatModule { + + public final SimpleEntrySet seat; + + public final SimpleEntrySet palisade; + public final SimpleEntrySet spikedPalisade; + public final SimpleEntrySet strippedPalisade; + public final SimpleEntrySet strippedSpikedPalisade; + + //texture constants since they are used more than once + public static final String BLOCK_OAK_PALISADE_CORE = "block/oak_palisade_core"; + public static final String BLOCK_OAK_PALISADE_SIDE = "block/oak_palisade_side"; + public static final String BLOCK_OAK_PALISADE_TOP = "block/oak_palisade_top"; + public static final String BLOCK_STRIPPED_OAK_PALISADE_CORE = "block/stripped_oak_palisade_core"; + public static final String BLOCK_STRIPPED_OAK_PALISADE_SIDE = "block/stripped_oak_palisade_side"; + public static final String BLOCK_STRIPPED_OAK_PALISADE_TOP = "block/stripped_oak_palisade_top"; + + + public BlockBoxEveryCompatModule(String modId) { + super(modId, "bb"); + //"bb" is not currently used by anything else to my knowledge, + //but I think it will cause issues if another mod tries to use the same string for its module? + //but it's not like there's a database of everycompat module short IDs + ResourceLocation creativeTabRL = ModCreativeTabs.TAB_BLOCK_BOX.getId(); + + this.seat = SimpleEntrySet.builder(WoodType.class, "seat", + getModBlock("oak_seat"), () -> VanillaWoodTypes.OAK, + w -> new SeatBlock(BlockBehaviour.Properties.ofFullCopy(w.planks))) + .requiresChildren(PLANKS) //REASON: recipes + .addTag(BlockTags.MINEABLE_WITH_AXE, Registries.BLOCK) + .addTag(modRes("wooden_seats"), Registries.BLOCK, Registries.ITEM) + .setTab(getTab(creativeTabRL)) + .addRecipe(modRes("oak_seat")) + .copyParentDrop() + .addTexture(modRes("block/oak_seat_side")) + .addTexture(modRes("block/oak_seat_top")) + .build(); + this.addEntry(seat); + + this.palisade = SimpleEntrySet.builder(WoodType.class, "palisade", + getModBlock("oak_palisade"), () -> VanillaWoodTypes.OAK, + w -> w.canBurn() ? //only affects sounds? no palisade can burn + ModBlocks.netherPalisade(getPalisadeForm(w, PalisadeForm.SPIKED), getPalisadeForm(w, PalisadeForm.STRIPPED), w.getColor()) : + ModBlocks.palisade(getPalisadeForm(w, PalisadeForm.SPIKED), getPalisadeForm(w, PalisadeForm.STRIPPED), w.getColor()) + ) + .requiresChildren(LOG) //REASON: recipes + .addTag(BlockTags.MINEABLE_WITH_AXE, Registries.BLOCK) + .addTag(modRes("palisades"), Registries.BLOCK, Registries.ITEM) + .setTab(getTab(creativeTabRL)) + .copyParentDrop() + .addRecipe(modRes("oak_palisade")) + .addTexture(modRes(BLOCK_OAK_PALISADE_CORE)) + .addTexture(modRes(BLOCK_OAK_PALISADE_SIDE)) + .addTexture(modRes(BLOCK_OAK_PALISADE_TOP)) //<-- spike texture in here + .build(); + this.addEntry(palisade); + this.spikedPalisade = SimpleEntrySet.builder(WoodType.class, "palisade", "spiked", + getModBlock("spiked_oak_palisade"), () -> VanillaWoodTypes.OAK, + w -> ModBlocks.spikedPalisade(getPalisadeForm(w, PalisadeForm.STRIPPED_SPIKED), w.getColor())) + .requiresChildren(LOG) + .addTag(BlockTags.MINEABLE_WITH_AXE, Registries.BLOCK) + .addTag(modRes("spiked_palisades"), Registries.BLOCK, Registries.ITEM) + .setTab(getTab(creativeTabRL)) + .copyParentDrop() + .addRecipe(modRes("spiked_oak_palisade")) + .addTexture(modRes(BLOCK_OAK_PALISADE_CORE)) + .addTexture(modRes(BLOCK_OAK_PALISADE_SIDE)) + .addTexture(modRes(BLOCK_OAK_PALISADE_TOP)) + .build(); + this.addEntry(spikedPalisade); + + this.strippedPalisade = SimpleEntrySet.builder(WoodType.class, "palisade", "stripped", + getModBlock("stripped_oak_palisade"), () -> VanillaWoodTypes.OAK, + w -> ModBlocks.palisade(getPalisadeForm(w, PalisadeForm.STRIPPED_SPIKED), null, w.getColor())) + .requiresChildren(LOG) + .addTag(BlockTags.MINEABLE_WITH_AXE, Registries.BLOCK) + .addTag(modRes("palisades"), Registries.BLOCK, Registries.ITEM) + .setTab(getTab(creativeTabRL)) + .copyParentDrop() + .addRecipe(modRes("stripped_oak_palisade")) + .addTexture(modRes(BLOCK_STRIPPED_OAK_PALISADE_CORE)) + .addTexture(modRes(BLOCK_STRIPPED_OAK_PALISADE_SIDE)) + .addTexture(modRes(BLOCK_STRIPPED_OAK_PALISADE_TOP)) + .build(); + this.addEntry(strippedPalisade); + this.strippedSpikedPalisade = SimpleEntrySet.builder(WoodType.class, "palisade", "stripped_spiked", + getModBlock("stripped_spiked_oak_palisade"), () -> VanillaWoodTypes.OAK, + w -> ModBlocks.spikedPalisade(getPalisadeForm(w, PalisadeForm.STRIPPED_SPIKED), w.getColor())) + .requiresChildren(LOG) + .addTag(BlockTags.MINEABLE_WITH_AXE, Registries.BLOCK) + .addTag(modRes("spiked_palisades"), Registries.BLOCK, Registries.ITEM) + .setTab(getTab(creativeTabRL)) + .copyParentDrop() + .addRecipe(modRes("stripped_spiked_oak_palisade")) + .addTexture(modRes(BLOCK_STRIPPED_OAK_PALISADE_CORE)) + .addTexture(modRes(BLOCK_STRIPPED_OAK_PALISADE_SIDE)) + .addTexture(modRes(BLOCK_STRIPPED_OAK_PALISADE_TOP)) + .build(); + this.addEntry(strippedSpikedPalisade); + + } + + public Supplier getPalisadeForm(WoodType woodType, PalisadeForm palisadeForm){ + return () -> switch (palisadeForm){ + case NORMAL -> palisade.blocks.get(woodType); + case SPIKED -> spikedPalisade.blocks.get(woodType); + case STRIPPED -> strippedPalisade.blocks.get(woodType); + case STRIPPED_SPIKED -> strippedSpikedPalisade.blocks.get(woodType); + }; + } + + public enum PalisadeForm { + NORMAL, + SPIKED, + STRIPPED, + STRIPPED_SPIKED + } + +} diff --git a/src/main/resources/assets/blockbox/lang/en_us.json b/src/main/resources/assets/blockbox/lang/en_us.json index 03300b9..a9b54c5 100644 --- a/src/main/resources/assets/blockbox/lang/en_us.json +++ b/src/main/resources/assets/blockbox/lang/en_us.json @@ -172,5 +172,11 @@ "blockbox.subtitles.sword.carve": "Sword carves", - "death.attack.blockbox.palisade": "%1$s was skewered by a spiked palisade" + "death.attack.blockbox.palisade": "%1$s was skewered by a spiked palisade", + + "block_type.blockbox.seat": "%s Seat", + "block_type.blockbox.palisade": "%s Palisade", + "block_type.blockbox.spiked_palisade": "Spiked %s Palisade", + "block_type.blockbox.stripped_palisade": "Stripped %s Palisade", + "block_type.blockbox.stripped_spiked_palisade": "Stripped Spiked Palisade" }