From 20ee64bfbdd372ad8e03f9f1117aaf8f96e05391 Mon Sep 17 00:00:00 2001 From: Redart15 Date: Sun, 6 Sep 2026 14:14:25 +0200 Subject: [PATCH 01/13] updated files to 8.0 --- .../moonsteel/ContainerStarBackpack.java | 2 + .../java/useless/moonsteel/MoonSteel.java | 38 +++++---- .../useless/moonsteel/MoonSteelBlocks.java | 18 ++-- .../useless/moonsteel/MoonSteelClient.java | 19 +++-- .../useless/moonsteel/MoonSteelItems.java | 58 +++++++------ .../moonsteel/MoonSteelMixinPlugin.java | 13 +-- .../useless/moonsteel/MoonSteelModels.java | 78 ++++++++---------- .../useless/moonsteel/MoonSteelRecipes.java | 12 +-- .../{ => backpack}/BackpackProxy.java | 3 +- .../{ => backpack}/GuiStarBackpack.java | 3 +- .../{item => backpack}/ItemStarBackpack.java | 3 +- .../{ => backpack}/SlotStarBackpack.java | 2 +- .../{ => backpack}/StarBackpackInventory.java | 3 +- .../block/BlockModelStellarRewinder.java | 2 +- .../moonsteel/block/BlockStellarRewinder.java | 9 +- .../moonsteel/block/BlockTorchStar.java | 60 ++++++++------ .../block/TileEntityStellarRewinder.java | 66 +++++++++------ .../moonsteel/fx/ParticleMagicSmoke.java | 82 +++++++++++-------- .../useless/moonsteel/fx/ParticleStar.java | 55 +++++++------ .../moonsteel/interfaces/IStarBackpack.java | 2 +- .../moonsteel/item/ItemConnectedStar.java | 20 +++-- .../moonsteel/item/ItemModelConnectStar.java | 5 +- .../moonsteel/mixin/BlockLogicMixin.java | 13 ++- .../mixin/ChunkProviderServerMixin.java | 5 +- .../mixin/ChunkProviderStaticMixin.java | 14 ++-- .../mixin/MobRenderZombieArmoredMixin.java | 25 ++++-- .../mixin/PacketHandlerClientMixin.java | 4 +- .../mixin/WorldFeatureLabyrinthMixin.java | 2 - .../useless/moonsteel/mixin/WorldMixin.java | 28 +++++-- .../mixin/backpack/MinecraftMixin.java | 4 +- .../mixin/backpack/PlayerLocalMixin.java | 2 +- .../moonsteel/mixin/backpack/PlayerMixin.java | 4 +- .../mixin/backpack/PlayerServerMixin.java | 8 +- .../mixin/entity/EntityItemMixin.java | 31 ++++--- .../moonsteel/mixin/entity/MobMixin.java | 8 +- .../mixin/entity/MobZombieArmoredMixin.java | 2 +- .../moonsteel/mixin/entity/PlayerMixin.java | 9 +- 37 files changed, 411 insertions(+), 301 deletions(-) rename src/main/java/useless/moonsteel/{ => backpack}/BackpackProxy.java (74%) rename src/main/java/useless/moonsteel/{ => backpack}/GuiStarBackpack.java (95%) rename src/main/java/useless/moonsteel/{item => backpack}/ItemStarBackpack.java (90%) rename src/main/java/useless/moonsteel/{ => backpack}/SlotStarBackpack.java (93%) rename src/main/java/useless/moonsteel/{ => backpack}/StarBackpackInventory.java (97%) diff --git a/src/main/java/useless/moonsteel/ContainerStarBackpack.java b/src/main/java/useless/moonsteel/ContainerStarBackpack.java index 47a7d42..005506f 100644 --- a/src/main/java/useless/moonsteel/ContainerStarBackpack.java +++ b/src/main/java/useless/moonsteel/ContainerStarBackpack.java @@ -4,6 +4,8 @@ import net.minecraft.core.entity.player.Player; import net.minecraft.core.player.inventory.menu.MenuAbstract; import net.minecraft.core.player.inventory.slot.Slot; +import useless.moonsteel.backpack.SlotStarBackpack; +import useless.moonsteel.backpack.StarBackpackInventory; import useless.moonsteel.interfaces.IStarBackpack; import java.util.List; diff --git a/src/main/java/useless/moonsteel/MoonSteel.java b/src/main/java/useless/moonsteel/MoonSteel.java index dda0a95..9309f88 100644 --- a/src/main/java/useless/moonsteel/MoonSteel.java +++ b/src/main/java/useless/moonsteel/MoonSteel.java @@ -2,6 +2,7 @@ import net.fabricmc.api.ModInitializer; import net.fabricmc.loader.api.FabricLoader; +import net.minecraft.core.block.entity.TileEntityDispatcher; import net.minecraft.core.item.ItemStack; import net.minecraft.core.sound.SoundTypes; import net.minecraft.core.util.collection.NamespaceID; @@ -9,18 +10,22 @@ import org.slf4j.Logger; import org.slf4j.LoggerFactory; import tosutosu.betterwithbackpacks.ModItems; +import turniplabs.halplibe.HalpLibe; +import turniplabs.halplibe.event.defs.CommonEvents; import turniplabs.halplibe.helper.CreativeHelper; import turniplabs.halplibe.helper.EntityHelper; import turniplabs.halplibe.util.ConfigHandler; import turniplabs.halplibe.util.GameStartEntrypoint; +import turniplabs.halplibe.util.dependency.Key; import useless.moonsteel.block.TileEntityStellarRewinder; import java.util.Properties; -public class MoonSteel implements ModInitializer, GameStartEntrypoint { - public static final String MOD_ID = "moonsteel"; - public static final Logger LOGGER = LoggerFactory.getLogger(MOD_ID); +public class MoonSteel implements ModInitializer { + public static final String MOD_ID = HalpLibe.registerMod("moonsteel"); + public static final Key KEY = Key.of(MOD_ID); + public static final Logger LOGGER = LoggerFactory.getLogger(MOD_ID); public static boolean backpackPresent = FabricLoader.getInstance().isModLoaded("betterwithbackpacks"); public static int blockId; public static int itemId; @@ -28,6 +33,9 @@ public class MoonSteel implements ModInitializer, GameStartEntrypoint { public static int FORTUNE_AMOUNT; public static int LOOTING_AMOUNT; public static int STAR_SPAWN_RATE; + public static ItemStack starZombieSword; + public static boolean forceChunkLoads = false; + static { final Properties prop = new Properties(); prop.setProperty("starting_block_id","6700"); @@ -47,32 +55,32 @@ public class MoonSteel implements ModInitializer, GameStartEntrypoint { config.updateConfig(); } - - public static ItemStack starZombieSword; - public static boolean forceChunkLoads = false; @Override public void onInitialize() { LOGGER.info("MoonSteel initialized."); + CommonEvents.BEFORE_GAME_START.listen(KEY, this::beforeGameStart); + CommonEvents.RECIPES_READY.listen(KEY, MoonSteelRecipes::onRecipesReady); + CommonEvents.RECIPES_NAMESPACE_INIT.listen(KEY, MoonSteelRecipes::initNamespaces); } - @Override public void beforeGameStart() { SoundTypes.loadSoundsJson(MOD_ID); - EntityHelper.createTileEntity(TileEntityStellarRewinder.class, NamespaceID.getPermanent(MOD_ID, "moonsteel$stellar_rewinder"), "moonsteel$stellar_rewinder"); + TileEntityDispatcher.addMapping( + TileEntityStellarRewinder.class, + NamespaceID.fromPool(MOD_ID, "moonsteel$stellar_rewinder") + ); MoonSteelBlocks.init(); MoonSteelItems.init(); if (backpackPresent){ - CreativeHelper.setParent(MoonSteelItems.BACKPACK_COSMIC.getDefaultStack(), ModItems.diamondBackpack.getDefaultStack()); + CreativeHelper.setParent( + MoonSteelItems.BACKPACK_COSMIC.getDefaultStack(), + ModItems.diamondBackpack.getDefaultStack() + ); } } - @Override - public void afterGameStart() { - - } - public static boolean isStarTime(final World world){ - if (world.worldType.hasCeiling()) return false; + if (world.getWorldType().hasCeiling()) return false; if (world.isDaytime()) return false; return world.getWorldTime() % 2000 <= 200; } diff --git a/src/main/java/useless/moonsteel/MoonSteelBlocks.java b/src/main/java/useless/moonsteel/MoonSteelBlocks.java index e5715d2..1348708 100644 --- a/src/main/java/useless/moonsteel/MoonSteelBlocks.java +++ b/src/main/java/useless/moonsteel/MoonSteelBlocks.java @@ -12,6 +12,7 @@ import net.minecraft.core.block.BlockLogicOreRedstone; import net.minecraft.core.block.BlockLogicTallGrass; import net.minecraft.core.block.material.Material; +import net.minecraft.core.block.material.Materials; import net.minecraft.core.block.tag.BlockTags; import net.minecraft.core.data.tag.Tag; import turniplabs.halplibe.helper.BlockBuilder; @@ -25,21 +26,26 @@ public class MoonSteelBlocks { .setHardness(5f) .setResistance(2000f) .addTags(BlockTags.MINEABLE_BY_PICKAXE) - .build("block", "block_moonsteel", MoonSteel.blockId++, b -> new BlockLogic(b, Material.metal)); + .build("block", "block_moonsteel", MoonSteel.blockId++, b -> new BlockLogic(b, Materials.METAL)); + + // TODO make sure this is always is set with notify public static Block TORCH_STAR = new BlockBuilder(MOD_ID) .setLuminance(15) - .build("torch.star", "torch_star", MoonSteel.blockId++,BlockTorchStar::new) - .withDisabledNeighborNotifyOnMetadataChange(); + .build("torch.star", "torch_star", MoonSteel.blockId++, BlockTorchStar::new); + // .withDisabledNeighborNotifyOnMetadataChange(); // need to be set with notify + + // TODO figure out what withImmovableFlag was public static Block STELLAR_REWINDER = new BlockBuilder(MOD_ID) .setHardness(3.5f) .addTags(BlockTags.MINEABLE_BY_PICKAXE) - .build("stellar.rewinder", "stellar_rewinder", MoonSteel.blockId++, b -> new BlockStellarRewinder(b, Material.metal)) - .withImmovableFlagSet(); + .build("stellar.rewinder", "stellar_rewinder", MoonSteel.blockId++, b -> new BlockStellarRewinder(b, Materials.METAL)); +// .withImmovableFlagSet(); public static Tag> FORCE_FORTUNE = Tag.of("moonsteel$force_enable_fortune"); public static Tag> FORCE_NO_FORTUNE = Tag.of("moonsteel$force_disable_fortune"); - public static boolean canBeFortuned(Block block){ + + public static boolean canBeFortuned(Block block) { if (block.hasTag(FORCE_FORTUNE)) return true; if (block.hasTag(FORCE_NO_FORTUNE)) return false; if (Block.hasLogicClass(block, BlockLogicLeavesBase.class)) return true; diff --git a/src/main/java/useless/moonsteel/MoonSteelClient.java b/src/main/java/useless/moonsteel/MoonSteelClient.java index 77a747f..f73a78b 100644 --- a/src/main/java/useless/moonsteel/MoonSteelClient.java +++ b/src/main/java/useless/moonsteel/MoonSteelClient.java @@ -1,20 +1,29 @@ package useless.moonsteel; -import net.minecraft.client.entity.particle.ParticleDispatcher; +import net.fabricmc.api.ClientModInitializer; +import net.minecraft.client.render.particle.ParticleDispatcher; import net.minecraft.client.render.texture.stitcher.AtlasStitcher; import net.minecraft.client.render.texture.stitcher.TextureRegistry; import net.minecraft.client.sound.SoundRepository; -import turniplabs.halplibe.util.ClientStartEntrypoint; +import turniplabs.halplibe.event.defs.ClientEvents; import useless.moonsteel.fx.ParticleMagicSmoke; import useless.moonsteel.fx.ParticleStar; import java.io.IOException; import java.net.URISyntaxException; +import static useless.moonsteel.MoonSteel.KEY; import static useless.moonsteel.MoonSteel.MOD_ID; -public class MoonSteelClient implements ClientStartEntrypoint { +public class MoonSteelClient implements ClientModInitializer { + @Override + public void onInitializeClient() { + ClientEvents.BEFORE_CLIENT_START.listen(KEY, this::beforeClientStart); + ClientEvents.AFTER_CLIENT_START.listen(KEY, this::afterClientStart); + } + + public void beforeClientStart() { for (final AtlasStitcher stitcher : TextureRegistry.stitcherMap.values()) { try { @@ -23,10 +32,10 @@ public void beforeClientStart() { MoonSteel.LOGGER.error("Failed to initialize texture files!", e); } } - SoundRepository.registerNamespace(MOD_ID); + SoundRepository.namespaceAdded(MOD_ID); } - @Override + public void afterClientStart() { ParticleDispatcher.getInstance().addDispatch("moonsteel$star", (world, x, y, z, motionX, motionY, motionZ, data) -> new ParticleStar(world, x, y, z, motionX, motionY, motionX)); ParticleDispatcher.getInstance().addDispatch("moonsteel$magic_smoke", (world, x, y, z, motionX, motionY, motionZ, data) -> new ParticleMagicSmoke(world, x, y, z, motionX, motionY, motionX)); diff --git a/src/main/java/useless/moonsteel/MoonSteelItems.java b/src/main/java/useless/moonsteel/MoonSteelItems.java index 88b975e..301859c 100644 --- a/src/main/java/useless/moonsteel/MoonSteelItems.java +++ b/src/main/java/useless/moonsteel/MoonSteelItems.java @@ -1,6 +1,6 @@ package useless.moonsteel; -import net.minecraft.core.item.IArmorItem; +import net.minecraft.core.enums.HumanArmorShape; import net.minecraft.core.item.Item; import net.minecraft.core.item.ItemArmor; import net.minecraft.core.item.material.ArmorMaterial; @@ -13,40 +13,48 @@ import net.minecraft.core.item.tool.ItemToolSword; import turniplabs.halplibe.helper.ArmorHelper; import turniplabs.halplibe.helper.ItemBuilder; +import useless.moonsteel.backpack.BackpackProxy; import useless.moonsteel.item.ItemConnectedStar; import static useless.moonsteel.MoonSteel.MOD_ID; public class MoonSteelItems { - public static ToolMaterial moonSteelTool = new ToolMaterial().setDurability(1536).setEfficiency(7.0f, 14.0f).setMiningLevel(3).setDamage(2); - public static Item INGOT_MOONSTEEL = new ItemBuilder(MOD_ID) + private MoonSteelItems(){} + + public static final ToolMaterial MOON_STEEL_TOOL = new ToolMaterial().setDurability(1536).setEfficiency(7.0f, 14.0f).setMiningLevel(3).setDamage(2); + public static final Item INGOT_MOONSTEEL = new ItemBuilder(MOD_ID) .build(new Item("ingot.moonsteel", MOD_ID + ":item/ingot_moonsteel", MoonSteel.itemId++)); - public static Item INGOT_MOONSTEEL_CRUDE = new ItemBuilder(MOD_ID) + public static final Item INGOT_MOONSTEEL_CRUDE = new ItemBuilder(MOD_ID) .build(new Item("crude.moonsteel", MOD_ID + ":item/ingot_moonsteel_crude", MoonSteel.itemId++)); - public static Item TOOL_PICKAXE_MOONSTEEL = new ItemBuilder(MOD_ID) - .build(new ItemToolPickaxe("tool.pickaxe.moonsteel", MOD_ID + ":item/tool_pickaxe_moonsteel", MoonSteel.itemId++, moonSteelTool)); - public static Item TOOL_AXE_MOONSTEEL = new ItemBuilder(MOD_ID) - .build(new ItemToolAxe("tool.axe.moonsteel", MOD_ID + ":item/tool_axe_moonsteel", MoonSteel.itemId++, moonSteelTool)); - public static Item TOOL_SHOVEL_MOONSTEEL = new ItemBuilder(MOD_ID) - .build(new ItemToolShovel("tool.shovel.moonsteel", MOD_ID + ":item/tool_shovel_moonsteel", MoonSteel.itemId++, moonSteelTool)); - public static Item TOOL_HOE_MOONSTEEL = new ItemBuilder(MOD_ID) - .build(new ItemToolHoe("tool.hoe.moonsteel", MOD_ID + ":item/tool_hoe_moonsteel", MoonSteel.itemId++, moonSteelTool)); - public static Item TOOL_SWORD_MOONSTEEL = new ItemBuilder(MOD_ID) - .build(new ItemToolSword("tool.sword.moonsteel", MOD_ID + ":item/tool_sword_moonsteel", MoonSteel.itemId++, moonSteelTool)); - public static ArmorMaterial moonSteelArmor = ArmorHelper.createArmorMaterial(MOD_ID, "moonsteel", 800, 51f, 45f, 45f, 100f); - public static Item ARMOR_HELMET_MOONSTEEL = new ItemBuilder(MOD_ID) - .build(new ItemArmor("helmet.moonsteel", MOD_ID + ":item/armor_helmet_moonsteel", MoonSteel.itemId++, moonSteelArmor, IArmorItem.PIECE_HEAD)); - public static Item ARMOR_CHESTPLATE_MOONSTEEL = new ItemBuilder(MOD_ID) - .build(new ItemArmor("chestplate.moonsteel", MOD_ID + ":item/armor_chestplate_moonsteel", MoonSteel.itemId++, moonSteelArmor, IArmorItem.PIECE_CHEST)); - public static Item ARMOR_LEGGINGS_MOONSTEEL = new ItemBuilder(MOD_ID) - .build(new ItemArmor("leggings.moonsteel", MOD_ID + ":item/armor_leggings_moonsteel", MoonSteel.itemId++, moonSteelArmor, IArmorItem.PIECE_LEGS)); - public static Item ARMOR_BOOTS_MOONSTEEL = new ItemBuilder(MOD_ID) - .build(new ItemArmor("boots.moonsteel", MOD_ID + ":item/armor_boots_moonsteel", MoonSteel.itemId++, moonSteelArmor, IArmorItem.PIECE_BOOTS)); - public static Item STAR_FALLEN = new ItemBuilder(MOD_ID) + public static final Item TOOL_PICKAXE_MOONSTEEL = new ItemBuilder(MOD_ID) + .build(new ItemToolPickaxe("tool.pickaxe.moonsteel", MOD_ID + ":item/tool_pickaxe_moonsteel", MoonSteel.itemId++, MOON_STEEL_TOOL)); + public static final Item TOOL_AXE_MOONSTEEL = new ItemBuilder(MOD_ID) + .build(new ItemToolAxe("tool.axe.moonsteel", MOD_ID + ":item/tool_axe_moonsteel", MoonSteel.itemId++, MOON_STEEL_TOOL)); + public static final Item TOOL_SHOVEL_MOONSTEEL = new ItemBuilder(MOD_ID) + .build(new ItemToolShovel("tool.shovel.moonsteel", MOD_ID + ":item/tool_shovel_moonsteel", MoonSteel.itemId++, MOON_STEEL_TOOL)); + public static final Item TOOL_HOE_MOONSTEEL = new ItemBuilder(MOD_ID) + .build(new ItemToolHoe("tool.hoe.moonsteel", MOD_ID + ":item/tool_hoe_moonsteel", MoonSteel.itemId++, MOON_STEEL_TOOL)); + public static final Item TOOL_SWORD_MOONSTEEL = new ItemBuilder(MOD_ID) + .build(new ItemToolSword("tool.sword.moonsteel", MOD_ID + ":item/tool_sword_moonsteel", MoonSteel.itemId++, MOON_STEEL_TOOL)); + + public static final ArmorMaterial MOON_STEEL_ARMOR = ArmorHelper.createArmorMaterial(MOD_ID, "moonsteel", 800, 51f, 45f, 45f, 100f); + + public static final Item ARMOR_HELMET_MOONSTEEL = new ItemBuilder(MOD_ID) + .build(new ItemArmor<>("helmet.moonsteel", MOD_ID + ":item/armor_helmet_moonsteel", MoonSteel.itemId++, MOON_STEEL_ARMOR, HumanArmorShape.HEAD)); + public static final Item ARMOR_CHESTPLATE_MOONSTEEL = new ItemBuilder(MOD_ID) + .build(new ItemArmor<>("chestplate.moonsteel", MOD_ID + ":item/armor_chestplate_moonsteel", MoonSteel.itemId++, MOON_STEEL_ARMOR, HumanArmorShape.CHEST)); + public static final Item ARMOR_LEGGINGS_MOONSTEEL = new ItemBuilder(MOD_ID) + .build(new ItemArmor<>("leggings.moonsteel", MOD_ID + ":item/armor_leggings_moonsteel", MoonSteel.itemId++, MOON_STEEL_ARMOR, HumanArmorShape.LEGS)); + public static final Item ARMOR_BOOTS_MOONSTEEL = new ItemBuilder(MOD_ID) + .build(new ItemArmor<>("boots.moonsteel", MOD_ID + ":item/armor_boots_moonsteel", MoonSteel.itemId++, MOON_STEEL_ARMOR, HumanArmorShape.BOOTS)); + + public static final Item STAR_FALLEN = new ItemBuilder(MOD_ID) .build(new Item("star.fallen", MOD_ID + ":item/star_fallen", MoonSteel.itemId++)); - public static Item STAR_CONNECTED = new ItemBuilder(MOD_ID) + public static final Item STAR_CONNECTED = new ItemBuilder(MOD_ID) .setStackSize(1) .build(new ItemConnectedStar("star.connected", MOD_ID + ":item/star_connected", MoonSteel.itemId++)); + + // TODO stop it from naging me here public static Item BACKPACK_COSMIC; public static void init() { diff --git a/src/main/java/useless/moonsteel/MoonSteelMixinPlugin.java b/src/main/java/useless/moonsteel/MoonSteelMixinPlugin.java index e4a6e68..5678c1e 100644 --- a/src/main/java/useless/moonsteel/MoonSteelMixinPlugin.java +++ b/src/main/java/useless/moonsteel/MoonSteelMixinPlugin.java @@ -5,15 +5,18 @@ import org.spongepowered.asm.mixin.extensibility.IMixinConfigPlugin; import org.spongepowered.asm.mixin.extensibility.IMixinInfo; +import java.util.Collections; import java.util.List; import java.util.Set; import java.util.function.Supplier; public class MoonSteelMixinPlugin implements IMixinConfigPlugin { + // TODO make Intelij happy private static final Supplier BACKPACKS = () -> FabricLoader.getInstance().isModLoaded("betterwithbackpacks"); + @Override public void onLoad(String mixinPackage) { - + /* not need */ } @Override @@ -29,21 +32,21 @@ public boolean shouldApplyMixin(String targetClassName, String mixinClassName) { @Override public void acceptTargets(Set myTargets, Set otherTargets) { - + /* not need */ } @Override public List getMixins() { - return null; + return Collections.emptyList(); } @Override public void preApply(String targetClassName, ClassNode targetClass, String mixinClassName, IMixinInfo mixinInfo) { - + /* not need */ } @Override public void postApply(String targetClassName, ClassNode targetClass, String mixinClassName, IMixinInfo mixinInfo) { - + /* not need */ } } diff --git a/src/main/java/useless/moonsteel/MoonSteelModels.java b/src/main/java/useless/moonsteel/MoonSteelModels.java index fb446aa..08af8ec 100644 --- a/src/main/java/useless/moonsteel/MoonSteelModels.java +++ b/src/main/java/useless/moonsteel/MoonSteelModels.java @@ -1,11 +1,8 @@ package useless.moonsteel; -import net.minecraft.client.render.EntityRenderDispatcher; -import net.minecraft.client.render.TileEntityRenderDispatcher; -import net.minecraft.client.render.block.color.BlockColorDispatcher; import net.minecraft.client.render.block.model.BlockModelDispatcher; import net.minecraft.client.render.block.model.BlockModelStandard; -import net.minecraft.client.render.block.model.BlockModelTorch; +import net.minecraft.client.render.block.model.generic.BlockModelGenericTorch; import net.minecraft.client.render.item.model.ItemModelDispatcher; import net.minecraft.client.render.item.model.ItemModelStandard; import net.minecraft.client.render.texture.stitcher.TextureRegistry; @@ -13,41 +10,44 @@ import net.minecraft.core.util.collection.NamespaceID; import net.minecraft.core.util.helper.Side; import org.jetbrains.annotations.NotNull; -import turniplabs.halplibe.util.ModelEntrypoint; import useless.moonsteel.block.BlockModelStellarRewinder; import useless.moonsteel.item.ItemModelConnectStar; +import static net.minecraft.client.render.item.model.ItemModelDispatcher.*; import static useless.moonsteel.MoonSteel.MOD_ID; -public class MoonSteelModels implements ModelEntrypoint { - @Override +public class MoonSteelModels { + + public void initBlockModels(final BlockModelDispatcher dispatcher) { final Side[] S_TB = {Side.TOP, Side.BOTTOM}; final Side[] S_SIDES = {Side.NORTH, Side.EAST, Side.SOUTH, Side.WEST}; - - dispatcher.addDispatch(new BlockModelStandard<>(MoonSteelBlocks.BLOCK_MOONSTEEL) - .setTex(BlockModelStandard.BLOCK_TEXTURES, MOD_ID + ":block/moonsteel_block_side", S_SIDES) - .setTex(BlockModelStandard.BLOCK_TEXTURES, MOD_ID + ":block/moonsteel_block_top", Side.TOP) - .setTex(BlockModelStandard.BLOCK_TEXTURES, MOD_ID + ":block/moonsteel_block_bottom", Side.BOTTOM)); - - dispatcher.addDispatch(new BlockModelTorch<>(MoonSteelBlocks.TORCH_STAR) - .setAllTextures(BlockModelStandard.BLOCK_TEXTURES, MOD_ID + ":block/startorch")); - - dispatcher.addDispatch(new BlockModelStellarRewinder<>(MoonSteelBlocks.STELLAR_REWINDER) - .setTex(BlockModelStandard.BLOCK_TEXTURES, MOD_ID + ":block/stellarrewinder_side", Side.SOUTH, Side.WEST, Side.EAST) - .setTex(BlockModelStandard.BLOCK_TEXTURES, MOD_ID + ":block/stellarrewinder_front", Side.NORTH) - .setTex(BlockModelStandard.BLOCK_TEXTURES, MOD_ID + ":block/stellarrewinder_top", S_TB)); + //TODO replace with BlockModelGeneric + dispatcher.addDispatch(new BlockModelStandard<>(MoonSteelBlocks.BLOCK_MOONSTEEL)); +// .setTex(BlockModelStandard.BLOCK_TEXTURES, MOD_ID + ":block/moonsteel_block_side", S_SIDES) +// .setTex(BlockModelStandard.BLOCK_TEXTURES, MOD_ID + ":block/moonsteel_block_top", Side.TOP) +// .setTex(BlockModelStandard.BLOCK_TEXTURES, MOD_ID + ":block/moonsteel_block_bottom", Side.BOTTOM)); + + // TODO especialy for this, replace the key + dispatcher.addDispatch(new BlockModelGenericTorch<>(MoonSteelBlocks.TORCH_STAR, "")); +// .setAllTextures(BlockModelStandard.BLOCK_TEXTURES, MOD_ID + ":block/startorch")); + + // TODO relace this by a generic model + dispatcher.addDispatch(new BlockModelStellarRewinder<>(MoonSteelBlocks.STELLAR_REWINDER)); +// .setTex(BlockModelStandard.BLOCK_TEXTURES, MOD_ID + ":block/stellarrewinder_side", Side.SOUTH, Side.WEST, Side.EAST) +// .setTex(BlockModelStandard.BLOCK_TEXTURES, MOD_ID + ":block/stellarrewinder_front", Side.NORTH) +// .setTex(BlockModelStandard.BLOCK_TEXTURES, MOD_ID + ":block/stellarrewinder_top", S_TB)); } - @Override + public void initItemModels(final ItemModelDispatcher dispatcher) { dispatcher.addDispatch(makeModel(MoonSteelItems.INGOT_MOONSTEEL, "moonsteel_ingot")); dispatcher.addDispatch(makeModel(MoonSteelItems.INGOT_MOONSTEEL_CRUDE, "moonsteel_crude")); - dispatcher.addDispatch(makeModel(MoonSteelItems.TOOL_PICKAXE_MOONSTEEL, "moonsteel_pickaxe").setFull3D()); - dispatcher.addDispatch(makeModel(MoonSteelItems.TOOL_AXE_MOONSTEEL, "moonsteel_axe").setFull3D()); - dispatcher.addDispatch(makeModel(MoonSteelItems.TOOL_SHOVEL_MOONSTEEL, "moonsteel_shovel").setFull3D()); - dispatcher.addDispatch(makeModel(MoonSteelItems.TOOL_HOE_MOONSTEEL, "moonsteel_hoe").setFull3D()); - dispatcher.addDispatch(makeModel(MoonSteelItems.TOOL_SWORD_MOONSTEEL, "moonsteel_sword").setFull3D()); + dispatcher.addDispatch(makeHoldModel(MoonSteelItems.TOOL_PICKAXE_MOONSTEEL, "moonsteel_pickaxe")); + dispatcher.addDispatch(makeHoldModel(MoonSteelItems.TOOL_AXE_MOONSTEEL, "moonsteel_axe")); + dispatcher.addDispatch(makeHoldModel(MoonSteelItems.TOOL_SHOVEL_MOONSTEEL, "moonsteel_shovel")); + dispatcher.addDispatch(makeHoldModel(MoonSteelItems.TOOL_HOE_MOONSTEEL, "moonsteel_hoe")); + dispatcher.addDispatch(makeHoldModel(MoonSteelItems.TOOL_SWORD_MOONSTEEL, "moonsteel_sword")); dispatcher.addDispatch(makeModel(MoonSteelItems.ARMOR_HELMET_MOONSTEEL, "moonsteel_helmet")); dispatcher.addDispatch(makeModel(MoonSteelItems.ARMOR_CHESTPLATE_MOONSTEEL, "moonsteel_chestplate")); dispatcher.addDispatch(makeModel(MoonSteelItems.ARMOR_LEGGINGS_MOONSTEEL, "moonsteel_leggings")); @@ -57,8 +57,17 @@ public void initItemModels(final ItemModelDispatcher dispatcher) { dispatcher.addDispatch(makeModel(MoonSteelItems.BACKPACK_COSMIC, "starpack")); } + public static @NotNull ItemModelStandard makeModel(@NotNull final Item item, @NotNull final String textureValue) { - return setIcon(new ItemModelStandard(item, null), NamespaceID.getTemp(MOD_ID, "item/" + textureValue)); + return setIcon(new ItemModelStandard(item, true), NamespaceID.fromPool(MOD_ID, "item/" + textureValue)); + } + + public static @NotNull ItemModelStandard makeHoldModel(@NotNull final Item item, @NotNull final String textureValue) { + return setIcon(new ItemModelStandard(item, true), NamespaceID.fromPool(MOD_ID, "item/" + textureValue)) + .setDisplayPos("firstperson_righthand", HANDHELD_FIRST_PERSON_RIGHT_HAND) + .setDisplayPos("firstperson_lefthand", HANDHELD_FIRST_PERSON_LEFT_HAND) + .setDisplayPos("thirdperson_righthand", HANDHELD_THIRD_PERSON_RIGHT_HAND) + .setDisplayPos("thirdperson_lefthand", HANDHELD_THIRD_PERSON_LEFT_HAND); } public static @NotNull T setIcon(@NotNull final T model, @NotNull final String texture) { @@ -70,19 +79,4 @@ public void initItemModels(final ItemModelDispatcher dispatcher) { model.icon = TextureRegistry.getTexture(texture); return model; } - - @Override - public void initEntityModels(final EntityRenderDispatcher dispatcher) { - - } - - @Override - public void initTileEntityModels(final TileEntityRenderDispatcher dispatcher) { - - } - - @Override - public void initBlockColors(final BlockColorDispatcher dispatcher) { - - } } diff --git a/src/main/java/useless/moonsteel/MoonSteelRecipes.java b/src/main/java/useless/moonsteel/MoonSteelRecipes.java index 03c9d1d..d6b32b7 100644 --- a/src/main/java/useless/moonsteel/MoonSteelRecipes.java +++ b/src/main/java/useless/moonsteel/MoonSteelRecipes.java @@ -8,13 +8,14 @@ import net.minecraft.core.util.helper.DyeColor; import tosutosu.betterwithbackpacks.ModItems; import turniplabs.halplibe.helper.RecipeBuilder; -import turniplabs.halplibe.util.RecipeEntrypoint; import static useless.moonsteel.MoonSteel.MOD_ID; -public class MoonSteelRecipes implements RecipeEntrypoint { - @Override - public void onRecipesReady() { +public class MoonSteelRecipes { + + private MoonSteelRecipes(){} + + public static void onRecipesReady() { LookupFuelFurnace.instance.addFuelEntry(MoonSteelItems.STAR_FALLEN.id, 9600); LookupFuelFurnaceBlast.instance.addFuelEntry(MoonSteelItems.STAR_FALLEN.id, 9600); @@ -163,8 +164,7 @@ public void onRecipesReady() { .create("fallenstar"); } - @Override - public void initNamespaces() { + public static void initNamespaces() { RecipeBuilder.initNameSpace(MOD_ID); } } diff --git a/src/main/java/useless/moonsteel/BackpackProxy.java b/src/main/java/useless/moonsteel/backpack/BackpackProxy.java similarity index 74% rename from src/main/java/useless/moonsteel/BackpackProxy.java rename to src/main/java/useless/moonsteel/backpack/BackpackProxy.java index 7d052a2..daba285 100644 --- a/src/main/java/useless/moonsteel/BackpackProxy.java +++ b/src/main/java/useless/moonsteel/backpack/BackpackProxy.java @@ -1,7 +1,6 @@ -package useless.moonsteel; +package useless.moonsteel.backpack; import net.minecraft.core.item.Item; -import useless.moonsteel.item.ItemStarBackpack; public class BackpackProxy { public static Item proxyBackpack(final String name, final String namespaceId, final int id) { diff --git a/src/main/java/useless/moonsteel/GuiStarBackpack.java b/src/main/java/useless/moonsteel/backpack/GuiStarBackpack.java similarity index 95% rename from src/main/java/useless/moonsteel/GuiStarBackpack.java rename to src/main/java/useless/moonsteel/backpack/GuiStarBackpack.java index 5f91553..103fdb6 100644 --- a/src/main/java/useless/moonsteel/GuiStarBackpack.java +++ b/src/main/java/useless/moonsteel/backpack/GuiStarBackpack.java @@ -1,10 +1,11 @@ -package useless.moonsteel; +package useless.moonsteel.backpack; import net.minecraft.client.gui.container.ScreenContainerAbstract; import net.minecraft.core.entity.player.Player; import net.minecraft.core.lang.I18n; import org.lwjgl.opengl.GL11; import tosutosu.betterwithbackpacks.BetterWithBackpacks; +import useless.moonsteel.ContainerStarBackpack; public class GuiStarBackpack extends ScreenContainerAbstract { private int GUIx; diff --git a/src/main/java/useless/moonsteel/item/ItemStarBackpack.java b/src/main/java/useless/moonsteel/backpack/ItemStarBackpack.java similarity index 90% rename from src/main/java/useless/moonsteel/item/ItemStarBackpack.java rename to src/main/java/useless/moonsteel/backpack/ItemStarBackpack.java index 566f1ea..7c2193a 100644 --- a/src/main/java/useless/moonsteel/item/ItemStarBackpack.java +++ b/src/main/java/useless/moonsteel/backpack/ItemStarBackpack.java @@ -1,11 +1,10 @@ -package useless.moonsteel.item; +package useless.moonsteel.backpack; import net.minecraft.core.entity.player.Player; import net.minecraft.core.item.ItemStack; import net.minecraft.core.world.World; import tosutosu.betterwithbackpacks.BetterWithBackpacks; import tosutosu.betterwithbackpacks.item.ItemBackpack; -import useless.moonsteel.StarBackpackInventory; import useless.moonsteel.interfaces.IStarBackpack; public class ItemStarBackpack extends ItemBackpack { diff --git a/src/main/java/useless/moonsteel/SlotStarBackpack.java b/src/main/java/useless/moonsteel/backpack/SlotStarBackpack.java similarity index 93% rename from src/main/java/useless/moonsteel/SlotStarBackpack.java rename to src/main/java/useless/moonsteel/backpack/SlotStarBackpack.java index 37ff236..6696353 100644 --- a/src/main/java/useless/moonsteel/SlotStarBackpack.java +++ b/src/main/java/useless/moonsteel/backpack/SlotStarBackpack.java @@ -1,4 +1,4 @@ -package useless.moonsteel; +package useless.moonsteel.backpack; import net.minecraft.core.item.ItemStack; import net.minecraft.core.player.inventory.container.Container; diff --git a/src/main/java/useless/moonsteel/StarBackpackInventory.java b/src/main/java/useless/moonsteel/backpack/StarBackpackInventory.java similarity index 97% rename from src/main/java/useless/moonsteel/StarBackpackInventory.java rename to src/main/java/useless/moonsteel/backpack/StarBackpackInventory.java index 0a2f95f..de1bd8e 100644 --- a/src/main/java/useless/moonsteel/StarBackpackInventory.java +++ b/src/main/java/useless/moonsteel/backpack/StarBackpackInventory.java @@ -1,4 +1,4 @@ -package useless.moonsteel; +package useless.moonsteel.backpack; import com.mojang.nbt.tags.CompoundTag; import com.mojang.nbt.tags.ListTag; @@ -7,6 +7,7 @@ import net.minecraft.core.player.inventory.InventorySorter; import net.minecraft.core.player.inventory.container.Container; import tosutosu.betterwithbackpacks.BetterWithBackpacks; +import useless.moonsteel.MoonSteelItems; public class StarBackpackInventory implements Container { public static int starBackpackSize = 18; diff --git a/src/main/java/useless/moonsteel/block/BlockModelStellarRewinder.java b/src/main/java/useless/moonsteel/block/BlockModelStellarRewinder.java index 6447bad..01b8d1a 100644 --- a/src/main/java/useless/moonsteel/block/BlockModelStellarRewinder.java +++ b/src/main/java/useless/moonsteel/block/BlockModelStellarRewinder.java @@ -19,7 +19,7 @@ public BlockModelStellarRewinder(Block block) { public IconCoordinate getBlockTexture(WorldSource blockAccess, int x, int y, int z, Side side) { IconCoordinate iconCoordinate = super.getBlockTexture(blockAccess, x, y, z, side); TileEntityStellarRewinder rewinder = (TileEntityStellarRewinder) blockAccess.getTileEntity(x,y,z); - if (rewinder.inUse && iconCoordinate == icon_front){ + if (rewinder.inUse() && iconCoordinate == icon_front){ iconCoordinate = icon_front_active; } return iconCoordinate; diff --git a/src/main/java/useless/moonsteel/block/BlockStellarRewinder.java b/src/main/java/useless/moonsteel/block/BlockStellarRewinder.java index 2e5305a..f866fb0 100644 --- a/src/main/java/useless/moonsteel/block/BlockStellarRewinder.java +++ b/src/main/java/useless/moonsteel/block/BlockStellarRewinder.java @@ -7,6 +7,9 @@ import net.minecraft.core.item.ItemStack; import net.minecraft.core.util.helper.Side; import net.minecraft.core.world.World; +import net.minecraft.core.world.pos.TilePosc; +import org.jetbrains.annotations.NotNull; +import org.jetbrains.annotations.Nullable; import useless.moonsteel.MoonSteelItems; public class BlockStellarRewinder extends BlockLogicRotatable { @@ -17,10 +20,10 @@ public BlockStellarRewinder(Block block, Material material) { } @Override - public boolean onBlockRightClicked(World world, int x, int y, int z, Player player, Side side, double xHit, double yHit) { + public boolean onInteracted(@NotNull World world, @NotNull TilePosc tilePos, @NotNull Player player, @Nullable Side side, double xHit, double yHit) { ItemStack heldItem = player.getHeldItem(); - TileEntityStellarRewinder rewinder = (TileEntityStellarRewinder) world.getTileEntity(x,y,z); - if (heldItem != null && heldItem.getItem() == MoonSteelItems.STAR_CONNECTED){ + TileEntityStellarRewinder rewinder = (TileEntityStellarRewinder) world.getTileEntity(tilePos); + if (heldItem != null && heldItem.getItem() == MoonSteelItems.STAR_CONNECTED && rewinder != null){ rewinder.linkStar(heldItem); return true; } diff --git a/src/main/java/useless/moonsteel/block/BlockTorchStar.java b/src/main/java/useless/moonsteel/block/BlockTorchStar.java index 2875086..d30d6fe 100644 --- a/src/main/java/useless/moonsteel/block/BlockTorchStar.java +++ b/src/main/java/useless/moonsteel/block/BlockTorchStar.java @@ -3,41 +3,53 @@ import net.minecraft.core.block.Block; import net.minecraft.core.block.BlockLogicTorch; import net.minecraft.core.world.World; +import net.minecraft.core.world.pos.TilePosc; +import org.jetbrains.annotations.NotNull; import java.util.Random; public class BlockTorchStar extends BlockLogicTorch { + + public static final String SMOKE = "moonsteel$magic_smoke"; + public static final String STAR = "moonsteel$star"; + public BlockTorchStar(final Block block) { super(block); } @Override - public void animationTick(final World world, final int x, final int y, final int z, final Random rand) { - final double xPos = x + 0.5; - final double yPos = y + 0.575; - final double zPos = z + 0.5; + public void animationTick(final World world, final @NotNull TilePosc tilePos, final @NotNull Random rand) { + final double xPos = tilePos.x() + 0.5; + final double yPos = tilePos.y() + 0.575; + final double zPos = tilePos.z() + 0.5; final double d3 = 0.22; final double d4 = 0.27; - final int side = world.getBlockMetadata(x, y, z) & MASK_DIRECTION; + double py = yPos + d3; + final int side = world.getBlockData(tilePos) & MASK_DIRECTION; switch (side) { - case SIDE_WEST: - world.spawnParticle("moonsteel$magic_smoke", xPos - d4, yPos + d3, zPos, 0.0F, 0.0F, 0.0F, 0); - world.spawnParticle("moonsteel$star", xPos - d4, yPos + d3, zPos, 0.0F, 0.0F, 0.0F, 0); - break; - case SIDE_EAST: - world.spawnParticle("moonsteel$magic_smoke", xPos + d4, yPos + d3, zPos, 0.0F, 0.0F, 0.0F, 0); - world.spawnParticle("moonsteel$star", xPos + d4, yPos + d3, zPos, 0.0F, 0.0F, 0.0F, 0); - break; - case SIDE_NORTH: - world.spawnParticle("moonsteel$magic_smoke", xPos, yPos + d3, zPos - d4, 0.0F, 0.0F, 0.0F, 0); - world.spawnParticle("moonsteel$star", xPos, yPos + d3, zPos - d4, 0.0F, 0.0F, 0.0F, 0); - break; - case SIDE_SOUTH: - world.spawnParticle("moonsteel$magic_smoke", xPos, yPos + d3, zPos + d4, 0.0F, 0.0F, 0.0F, 0); - world.spawnParticle("moonsteel$star", xPos, yPos + d3, zPos + d4, 0.0F, 0.0F, 0.0F, 0); - break; - case SIDE_BOTTOM: - world.spawnParticle("moonsteel$magic_smoke", xPos, yPos, zPos, 0.0F, 0.0F, 0.0F, 0); - world.spawnParticle("moonsteel$star", xPos, yPos, zPos, 0.0F, 0.0F, 0.0F, 0); + case SIDE_WEST -> { + double px = xPos - d4; + world.spawnParticle(SMOKE, px, py, zPos, 0.0F, 0.0F, 0.0F, 0, false); + world.spawnParticle(STAR, px, py, zPos, 0.0F, 0.0F, 0.0F, 0, false); + } + case SIDE_EAST -> { + double px = xPos + d4; + world.spawnParticle(SMOKE, px, py, zPos, 0.0F, 0.0F, 0.0F, 0, false); + world.spawnParticle(STAR, px, py, zPos, 0.0F, 0.0F, 0.0F, 0, false); + } + case SIDE_SOUTH -> { + double pz = zPos + d4; + world.spawnParticle(SMOKE, xPos, py, pz, 0.0F, 0.0F, 0.0F, 0, false); + world.spawnParticle(STAR, xPos, py, pz, 0.0F, 0.0F, 0.0F, 0, false); + } + case SIDE_BOTTOM -> { + world.spawnParticle(SMOKE, xPos, yPos, zPos, 0.0F, 0.0F, 0.0F, 0, false); + world.spawnParticle(STAR, xPos, yPos, zPos, 0.0F, 0.0F, 0.0F, 0, false); + } + default -> { // north side is default + double pz = zPos - d4; + world.spawnParticle(SMOKE, xPos, py, pz, 0.0F, 0.0F, 0.0F, 0, false); + world.spawnParticle(STAR, xPos, py, pz, 0.0F, 0.0F, 0.0F, 0, false); + } } } } diff --git a/src/main/java/useless/moonsteel/block/TileEntityStellarRewinder.java b/src/main/java/useless/moonsteel/block/TileEntityStellarRewinder.java index 3b0cfb4..80fd7a5 100644 --- a/src/main/java/useless/moonsteel/block/TileEntityStellarRewinder.java +++ b/src/main/java/useless/moonsteel/block/TileEntityStellarRewinder.java @@ -5,63 +5,79 @@ import net.minecraft.core.item.ItemStack; import net.minecraft.core.util.helper.Side; import net.minecraft.core.world.chunk.Chunk; +import net.minecraft.core.world.pos.ChunkPos; +import net.minecraft.core.world.pos.ChunkTilePos; +import org.jetbrains.annotations.NotNull; import useless.moonsteel.MoonSteel; public class TileEntityStellarRewinder extends TileEntity { - public boolean inUse = false; - public long checkCode = 0; - public Side side = Side.NORTH; + private boolean inUse = false; + private long checkCode = 0; + private Side side = Side.NORTH; + + public Side side(){ + return this.side; + } + + public boolean inUse(){ + return this.inUse; + } public ItemStack linkStar(ItemStack stack){ - checkCode = worldObj.rand.nextLong(); - side = Side.getSideById(worldObj.getBlockMetadata(x, y, z)); + if(this.worldObj == null){ + return stack; + } + this.checkCode = this.worldObj.rand.nextLong(); + int data = this.worldObj.getBlockData(this.tilePos); + this.side = Side.fromId(data); if (stack.getData().getBoolean("moonsteel$has_location")){ int destX = stack.getData().getInteger("moonsteel$x"); int destY = stack.getData().getInteger("moonsteel$y"); int destZ = stack.getData().getInteger("moonsteel$z"); MoonSteel.forceChunkLoads = true; - Chunk chunk = worldObj.getChunkProvider().provideChunk(destX >> 4, destZ >> 4); + Chunk chunk = this.worldObj.getChunkProvider().provideChunk(new ChunkPos(destX, destZ), true); MoonSteel.forceChunkLoads = false; - TileEntity te = chunk.getTileEntity(destX &0xF, destY, destZ &0xF); - if (te instanceof TileEntityStellarRewinder && ((TileEntityStellarRewinder) te).canTeleport(stack)){ - ((TileEntityStellarRewinder) te).setInUse(false); + TileEntity te = chunk.getTileEntity(new ChunkTilePos(destX &0xF, destY, destZ &0xF)); + if (te instanceof TileEntityStellarRewinder tileEntityStellarRewinder && tileEntityStellarRewinder.canTeleport(stack)){ + tileEntityStellarRewinder.setInUse(false); } } stack.getData().putBoolean("moonsteel$has_location", true); - stack.getData().putInt("moonsteel$x", x ); - stack.getData().putInt("moonsteel$y", y ); - stack.getData().putInt("moonsteel$z", z ); - stack.getData().putInt("moonsteel$dimension", worldObj.dimension.id); - stack.getData().putLong("moonsteel$checkcode", checkCode); + stack.getData().putInt("moonsteel$x", this.tilePos.x() ); + stack.getData().putInt("moonsteel$y", this.tilePos.y() ); + stack.getData().putInt("moonsteel$z", this.tilePos.z() ); + stack.getData().putInt("moonsteel$dimension", this.worldObj.dimension.id); + stack.getData().putLong("moonsteel$checkcode", this.checkCode); setInUse(true); return stack; } public boolean canTeleport(ItemStack stack){ boolean can = true; - can &= stack.getData().getInteger("moonsteel$x") == x; - can &= stack.getData().getInteger("moonsteel$y") == y; - can &= stack.getData().getInteger("moonsteel$z") == z; - can &= stack.getData().getLong("moonsteel$checkcode") == checkCode; + can &= stack.getData().getInteger("moonsteel$x") == this.tilePos.x(); + can &= stack.getData().getInteger("moonsteel$y") == this.tilePos.y(); + can &= stack.getData().getInteger("moonsteel$z") == this.tilePos.z(); + can &= stack.getData().getLong("moonsteel$checkcode") == this.checkCode; return can; } public void setInUse(boolean flag){ inUse = flag; - worldObj.notifyBlockChange(x, y, z, worldObj.getBlockId(x, y, z)); + if (this.worldObj != null) { + this.worldObj.notifyBlockChange(this.tilePos, this.worldObj.getBlockType(tilePos)); + } } @Override - public void readFromNBT(CompoundTag tag) { - super.readFromNBT(tag); + public void readAdditionalData(@NotNull CompoundTag tag) { this.inUse = tag.getBoolean("inuse"); this.checkCode = tag.getLong("checkcode"); - this.side = Side.getSideById(tag.getInteger("side")); + this.side = Side.fromId(tag.getInteger("side")); } @Override - public void writeToNBT(CompoundTag tag) { - super.writeToNBT(tag); + public void writeAdditionalData(@NotNull CompoundTag tag) { tag.putBoolean("inuse", inUse); tag.putLong("checkcode", checkCode); - tag.putInt("side", side.getId()); + tag.putInt("side", side.id); + } } diff --git a/src/main/java/useless/moonsteel/fx/ParticleMagicSmoke.java b/src/main/java/useless/moonsteel/fx/ParticleMagicSmoke.java index 1d08481..aa4ff01 100644 --- a/src/main/java/useless/moonsteel/fx/ParticleMagicSmoke.java +++ b/src/main/java/useless/moonsteel/fx/ParticleMagicSmoke.java @@ -1,70 +1,80 @@ package useless.moonsteel.fx; -import net.minecraft.client.entity.particle.ParticleSmoke; -import net.minecraft.client.render.LightmapHelper; -import net.minecraft.client.render.tessellator.Tessellator; +import net.minecraft.client.render.particle.ParticleSmoke; +import net.minecraft.client.render.tessellator.TessellatorParticle; import net.minecraft.client.render.texture.stitcher.IconCoordinate; import net.minecraft.client.render.texture.stitcher.TextureRegistry; import net.minecraft.core.util.helper.MathHelper; import net.minecraft.core.world.World; +import org.jetbrains.annotations.NotNull; import static useless.moonsteel.MoonSteel.MOD_ID; public class ParticleMagicSmoke extends ParticleSmoke { private static final IconCoordinate smoke = TextureRegistry.getTexture(MOD_ID + ":item/particle_magicsmoke"); public float sizeO; + public ParticleMagicSmoke(World world, double x, double y, double z, double xa, double ya, double za) { - super(world, x, y, z, xa, ya, za); + super(world, x, y, z, xa, ya, za, 1.0f, 0); // no scale unsure about data this.rCol = 1; this.gCol = 1; this.bCol = 1; this.tex = smoke; - this.lifetime = (int)(5.0 / (Math.random() * 0.9 + 0.2)); + this.lifetime = (int) (5.0 / (Math.random() * 0.9 + 0.2)); size *= 1.5f; sizeO = size; } + @Override - public void render(Tessellator t, float partialTick, double xOff, double yOff, double zOff, float xa, float ya, float za, float xa2, float za2) { - float f6 = ((float)this.age + partialTick) / (float)this.lifetime * 32.0f; - if (f6 < 0.0f) { - f6 = 0.0f; - } - if (f6 > 1.0f) { - f6 = 1.0f; - } - this.size = this.sizeO * f6; - if (this.tex != null) { - final float u0 = (float)this.tex.getIconUMin(); - final float u2 = (float)this.tex.getIconUMax(); - final float v0 = (float)this.tex.getIconVMin(); - final float v2 = (float)this.tex.getIconVMax(); - final float r = 0.1F * this.size; - final float x = (float)(this.xo + (this.x - this.xo) * (double)partialTick - xOff); - final float y = (float)(this.yo + (this.y - this.yo) * (double)partialTick - yOff); - final float z = (float)(this.zo + (this.z - this.zo) * (double)partialTick - zOff); - float br = 1.0F; - if (LightmapHelper.isLightmapEnabled()) { - t.setLightmapCoord(this.getLightmapCoord(partialTick)); - } else { - br = this.getBrightness(partialTick); - } + public void render(@NotNull TessellatorParticle tessellatorParticle, float partialTick) { + + } - t.setColorOpaque_F(this.rCol * br, this.gCol * br, this.bCol * br); - t.addVertexWithUV(x - xa * r - xa2 * r, y - ya * r, z - za * r - za2 * r, u2, v2); - t.addVertexWithUV(x - xa * r + xa2 * r, y + ya * r, z - za * r + za2 * r, u2, v0); - t.addVertexWithUV(x + xa * r + xa2 * r, y + ya * r, z + za * r + za2 * r, u0, v0); - t.addVertexWithUV(x + xa * r - xa2 * r, y - ya * r, z + za * r - za2 * r, u0, v2); - } + // TODO figure out what do to with this + public void render(TessellatorParticle t, float partialTick, double xOff, double yOff, double zOff, float xa, float ya, float za, float xa2, float za2) { +// float f6 = ((float) this.age + partialTick) / (float) this.lifetime * 32.0f; +// if (f6 < 0.0f) { +// f6 = 0.0f; +// } +// if (f6 > 1.0f) { +// f6 = 1.0f; +// } +// this.size = this.sizeO * f6; +// if (this.tex != null) { +// final float u0 = (float) this.tex.getIconUMin(); +// final float u2 = (float) this.tex.getIconUMax(); +// final float v0 = (float) this.tex.getIconVMin(); +// final float v2 = (float) this.tex.getIconVMax(); +// final float r = 0.1F * this.size; +// final float x = (float) (this.xo + (this.x - this.xo) * (double) partialTick - xOff); +// final float y = (float) (this.yo + (this.y - this.yo) * (double) partialTick - yOff); +// final float z = (float) (this.zo + (this.z - this.zo) * (double) partialTick - zOff); +// float br = 1.0F; +// if (LightmapHelper.isLightmapEnabled()) { +// t.setLightmapCoord(this.getLightmapCoord(partialTick)); +// } else { +// br = this.getBrightness(partialTick); +// } +// +// t.setColorOpaque_F(this.rCol * br, this.gCol * br, this.bCol * br); +// t.addVertexWithUV(x - xa * r - xa2 * r, y - ya * r, z - za * r - za2 * r, u2, v2); +// t.addVertexWithUV(x - xa * r + xa2 * r, y + ya * r, z - za * r + za2 * r, u2, v0); +// t.addVertexWithUV(x + xa * r + xa2 * r, y + ya * r, z + za * r + za2 * r, u0, v0); +// t.addVertexWithUV(x + xa * r - xa2 * r, y - ya * r, z + za * r - za2 * r, u0, v2); +// } } + @Override public float getBrightness(float partialTick) { - float decay = MathHelper.clamp(((float)this.age + partialTick) / (float)this.lifetime, 0.0f, 1.0f); + float decay = MathHelper.clamp((this.age + partialTick) / this.lifetime, 0.0f, 1.0f); return super.getBrightness(partialTick) * decay + (1.0f - decay); } + @Override public int getParticleTexture() { return 2; } + @Override public void tick() { super.tick(); diff --git a/src/main/java/useless/moonsteel/fx/ParticleStar.java b/src/main/java/useless/moonsteel/fx/ParticleStar.java index 41b0873..0f28377 100644 --- a/src/main/java/useless/moonsteel/fx/ParticleStar.java +++ b/src/main/java/useless/moonsteel/fx/ParticleStar.java @@ -1,7 +1,6 @@ package useless.moonsteel.fx; -import net.minecraft.client.entity.particle.ParticleFlame; -import net.minecraft.client.render.LightmapHelper; +import net.minecraft.client.render.particle.ParticleFlame; import net.minecraft.client.render.tessellator.Tessellator; import net.minecraft.client.render.texture.stitcher.IconCoordinate; import net.minecraft.client.render.texture.stitcher.TextureRegistry; @@ -18,33 +17,35 @@ public ParticleStar(final World world, final double x, final double y, final dou this.size *= 2.25f; this.sizeO = this.size; } - @Override - public void render(final Tessellator t, final float partialTick, final double xOff, final double yOff, final double zOff, final float xa, final float ya, final float za, final float xa2, final float za2) { - final float s = ((float)this.age + partialTick) / (float)this.lifetime; - this.size = this.sizeO * (1.0f - s * s * 0.5f); - if (this.tex != null) { - final float u0 = (float)this.tex.getIconUMin(); - final float u2 = (float)this.tex.getIconUMax(); - final float v0 = (float)this.tex.getIconVMin(); - final float v2 = (float)this.tex.getIconVMax(); - final float r = 0.1F * this.size; - final float x = (float)(this.xo + (this.x - this.xo) * (double)partialTick - xOff); - final float y = (float)(this.yo + (this.y - this.yo) * (double)partialTick - yOff); - final float z = (float)(this.zo + (this.z - this.zo) * (double)partialTick - zOff); - float br = 1.0F; - if (LightmapHelper.isLightmapEnabled()) { - t.setLightmapCoord(this.getLightmapCoord(partialTick)); - } else { - br = this.getBrightness(partialTick); - } - t.setColorOpaque_F(this.rCol * br, this.gCol * br, this.bCol * br); - t.addVertexWithUV(x - xa * r - xa2 * r, y - ya * r, z - za * r - za2 * r, u2, v2); - t.addVertexWithUV(x - xa * r + xa2 * r, y + ya * r, z - za * r + za2 * r, u2, v0); - t.addVertexWithUV(x + xa * r + xa2 * r, y + ya * r, z + za * r + za2 * r, u0, v0); - t.addVertexWithUV(x + xa * r - xa2 * r, y - ya * r, z + za * r - za2 * r, u0, v2); - } + // TODO figure out what do to with this + public void render(final Tessellator t, final float partialTick, final double xOff, final double yOff, final double zOff, final float xa, final float ya, final float za, final float xa2, final float za2) { +// final float s = ((float)this.age + partialTick) / (float)this.lifetime; +// this.size = this.sizeO * (1.0f - s * s * 0.5f); +// if (this.tex != null) { +// final float u0 = (float)this.tex.getIconUMin(); +// final float u2 = (float)this.tex.getIconUMax(); +// final float v0 = (float)this.tex.getIconVMin(); +// final float v2 = (float)this.tex.getIconVMax(); +// final float r = 0.1F * this.size; +// final float x = (float)(this.xo + (this.x - this.xo) * (double)partialTick - xOff); +// final float y = (float)(this.yo + (this.y - this.yo) * (double)partialTick - yOff); +// final float z = (float)(this.zo + (this.z - this.zo) * (double)partialTick - zOff); +// float br = 1.0F; +// if (LightmapHelper.isLightmapEnabled()) { +// t.setLightmapCoord(this.getLightmapCoord(partialTick)); +// } else { +// br = this.getBrightness(partialTick); +// } +// +// t.setColorOpaque_F(this.rCol * br, this.gCol * br, this.bCol * br); +// t.addVertexWithUV(x - xa * r - xa2 * r, y - ya * r, z - za * r - za2 * r, u2, v2); +// t.addVertexWithUV(x - xa * r + xa2 * r, y + ya * r, z - za * r + za2 * r, u2, v0); +// t.addVertexWithUV(x + xa * r + xa2 * r, y + ya * r, z + za * r + za2 * r, u0, v0); +// t.addVertexWithUV(x + xa * r - xa2 * r, y - ya * r, z + za * r - za2 * r, u0, v2); +// } } + @Override public void tick() { super.tick(); diff --git a/src/main/java/useless/moonsteel/interfaces/IStarBackpack.java b/src/main/java/useless/moonsteel/interfaces/IStarBackpack.java index ff1f551..57a397a 100644 --- a/src/main/java/useless/moonsteel/interfaces/IStarBackpack.java +++ b/src/main/java/useless/moonsteel/interfaces/IStarBackpack.java @@ -1,6 +1,6 @@ package useless.moonsteel.interfaces; -import useless.moonsteel.StarBackpackInventory; +import useless.moonsteel.backpack.StarBackpackInventory; public interface IStarBackpack { StarBackpackInventory moonsteel$getStarBackpackInventory(); diff --git a/src/main/java/useless/moonsteel/item/ItemConnectedStar.java b/src/main/java/useless/moonsteel/item/ItemConnectedStar.java index bee58ba..639614e 100644 --- a/src/main/java/useless/moonsteel/item/ItemConnectedStar.java +++ b/src/main/java/useless/moonsteel/item/ItemConnectedStar.java @@ -8,6 +8,10 @@ import net.minecraft.core.util.helper.Side; import net.minecraft.core.world.World; import net.minecraft.core.world.chunk.Chunk; +import net.minecraft.core.world.pos.ChunkPos; +import net.minecraft.core.world.pos.ChunkTilePos; +import org.jetbrains.annotations.NotNull; +import org.jetbrains.annotations.Nullable; import useless.moonsteel.MoonSteel; import useless.moonsteel.block.TileEntityStellarRewinder; import useless.moonsteel.interfaces.ITeleporter; @@ -18,32 +22,32 @@ public ItemConnectedStar(String name, String namespaceId, int id) { } @Override - public ItemStack onUseItem(ItemStack itemstack, World world, Player entityplayer) { + public @Nullable ItemStack onUse(@NotNull ItemStack itemstack, @NotNull World world, @NotNull Player entityplayer) { if (itemstack.getData().getBoolean("moonsteel$has_location")){ int destX = itemstack.getData().getInteger("moonsteel$x"); int destY = itemstack.getData().getInteger("moonsteel$y"); int destZ = itemstack.getData().getInteger("moonsteel$z"); int dim = itemstack.getData().getInteger("moonsteel$dimension"); if (dim != world.dimension.id) { - entityplayer.sendTranslatedChatMessage("moonsteel.teleport.fail.dimension"); + entityplayer.sendMessageTranslated("moonsteel.teleport.fail.dimension"); return itemstack; } int cost = MathHelper.floor(entityplayer.distanceTo(destX, destY, destZ)); if (entityplayer.score < cost) { - entityplayer.sendTranslatedChatMessage("moonsteel.teleport.fail.score"); + entityplayer.sendMessageTranslated("moonsteel.teleport.fail.score"); return itemstack; } MoonSteel.forceChunkLoads = true; - Chunk chunk = world.getChunkProvider().provideChunk(destX >> 4, destZ >> 4); + Chunk chunk = world.getChunkProvider().provideChunk(new ChunkPos(destX, destZ), true); MoonSteel.forceChunkLoads = false; - TileEntity te = chunk.getTileEntity(destX &0xF, destY, destZ &0xF); + TileEntity te = chunk.getTileEntity(new ChunkTilePos(destX &0xF, destY, destZ &0xF)); if (te instanceof TileEntityStellarRewinder && ((TileEntityStellarRewinder) te).canTeleport(itemstack)){ entityplayer.score -= cost; - Side side = ((TileEntityStellarRewinder) te).side; - ((ITeleporter) entityplayer).moonsteel$teleport(destX + side.getOffsetX() + 0.5f, destY + side.getOffsetY(), destZ + side.getOffsetZ() + 0.5f); + Side side = ((TileEntityStellarRewinder) te).side(); + ((ITeleporter) entityplayer).moonsteel$teleport(destX + side.offsetX() + 0.5f, destY + side.offsetY(), destZ + side.offsetZ() + 0.5f); ((TileEntityStellarRewinder) te).setInUse(false); } else if (!world.isClientSide) { - entityplayer.sendTranslatedChatMessage("moonsteel.teleport.fail.missing"); + entityplayer.sendMessageTranslated("moonsteel.teleport.fail.missing"); } itemstack.getData().putBoolean("moonsteel$has_location", false); } diff --git a/src/main/java/useless/moonsteel/item/ItemModelConnectStar.java b/src/main/java/useless/moonsteel/item/ItemModelConnectStar.java index 9f92fe6..387f9a3 100644 --- a/src/main/java/useless/moonsteel/item/ItemModelConnectStar.java +++ b/src/main/java/useless/moonsteel/item/ItemModelConnectStar.java @@ -12,13 +12,16 @@ public class ItemModelConnectStar extends ItemModelStandard { private static final IconCoordinate star_connected = TextureRegistry.getTexture(MoonSteel.MOD_ID + ":item/connected_star"); + + //TODO remove the namespace constructor with namespace, it still need for some textures so I leave it for later public ItemModelConnectStar(final Item item, final String namespace) { super(item, namespace); } + @NotNull @Override public IconCoordinate getIcon(@Nullable final Entity entity, final ItemStack itemStack) { - if (itemStack.getData().getBoolean("moonsteel$has_location")){ + if (itemStack.getData().getBoolean("moonsteel$has_location")) { return star_connected; } return super.getIcon(entity, itemStack); diff --git a/src/main/java/useless/moonsteel/mixin/BlockLogicMixin.java b/src/main/java/useless/moonsteel/mixin/BlockLogicMixin.java index 9a22352..76a4db3 100644 --- a/src/main/java/useless/moonsteel/mixin/BlockLogicMixin.java +++ b/src/main/java/useless/moonsteel/mixin/BlockLogicMixin.java @@ -8,6 +8,7 @@ import net.minecraft.core.item.ItemStack; import net.minecraft.core.item.tool.ItemTool; import net.minecraft.core.world.World; +import net.minecraft.core.world.pos.TilePosc; import org.jetbrains.annotations.NotNull; import org.spongepowered.asm.mixin.Final; import org.spongepowered.asm.mixin.Mixin; @@ -28,16 +29,14 @@ public abstract class BlockLogicMixin { public Block block; @Shadow - public abstract void dropBlockWithCause(World world, EnumDropCause cause, int x, int y, int z, int meta, TileEntity tileEntity, Player player); + public abstract void dropWithCause(World world, EnumDropCause cause, TilePosc tilePosc, int meta, TileEntity tileEntity, Player player); - @Inject(method = "harvestBlock(Lnet/minecraft/core/world/World;Lnet/minecraft/core/entity/player/Player;IIIILnet/minecraft/core/block/entity/TileEntity;)V", - at = @At(value = "INVOKE", target = "Lnet/minecraft/core/block/BlockLogic;dropBlockWithCause(Lnet/minecraft/core/world/World;Lnet/minecraft/core/enums/EnumDropCause;IIIILnet/minecraft/core/block/entity/TileEntity;Lnet/minecraft/core/entity/player/Player;)V", - shift = At.Shift.AFTER)) - private void multiplyHarvest(final World world, final Player entityplayer, final int x, final int y, final int z, final int meta, final TileEntity tileEntity, final CallbackInfo ci){ + @Inject(method = "onHarvest", at = @At(value = "INVOKE", target = "Lnet/minecraft/core/block/BlockLogic;dropWithCause(Lnet/minecraft/core/world/World;Lnet/minecraft/core/enums/EnumDropCause;Lnet/minecraft/core/world/pos/TilePosc;ILnet/minecraft/core/block/entity/TileEntity;Lnet/minecraft/core/entity/player/Player;)V")) + private void multiplyHarvest(World world, Player entityplayer, TilePosc tilePos, int data, TileEntity tileEntity, CallbackInfo ci){ final ItemStack heldItemStack = entityplayer.inventory.getCurrentItem(); - if (heldItemStack != null && heldItemStack.getItem() instanceof ItemTool && ((ItemTool) heldItemStack.getItem()).getMaterial() == MoonSteelItems.moonSteelTool && MoonSteelBlocks.canBeFortuned(this.block)){ + if (heldItemStack != null && heldItemStack.getItem() instanceof ItemTool itemTool && itemTool.getMaterial() == MoonSteelItems.MOON_STEEL_TOOL && MoonSteelBlocks.canBeFortuned(this.block)){ for (int i = 0; i < world.rand.nextInt(MoonSteel.FORTUNE_AMOUNT); i++) { - dropBlockWithCause(world, EnumDropCause.PROPER_TOOL, x, y, z, meta, tileEntity, entityplayer); + dropWithCause(world, EnumDropCause.PROPER_TOOL, tilePos, data, tileEntity, entityplayer); } } } diff --git a/src/main/java/useless/moonsteel/mixin/ChunkProviderServerMixin.java b/src/main/java/useless/moonsteel/mixin/ChunkProviderServerMixin.java index 38b3ae7..8be8689 100644 --- a/src/main/java/useless/moonsteel/mixin/ChunkProviderServerMixin.java +++ b/src/main/java/useless/moonsteel/mixin/ChunkProviderServerMixin.java @@ -1,6 +1,7 @@ package useless.moonsteel.mixin; import net.minecraft.core.world.chunk.Chunk; +import net.minecraft.core.world.pos.ChunkPosc; import net.minecraft.server.world.chunk.provider.ChunkProviderServer; import org.spongepowered.asm.mixin.Mixin; import org.spongepowered.asm.mixin.Shadow; @@ -14,8 +15,8 @@ public class ChunkProviderServerMixin { @Shadow public boolean chunkLoadOverride; - @Inject(method = "provideChunk(II)Lnet/minecraft/core/world/chunk/Chunk;", at = @At("HEAD")) - private void overrideChunks(final int chunkX, final int chunkZ, final CallbackInfoReturnable cir){ + @Inject(method = "provideChunk", at = @At("HEAD")) + private void overrideChunks(ChunkPosc chunkPos, boolean priority, CallbackInfoReturnable cir){ this.chunkLoadOverride = MoonSteel.forceChunkLoads; } } diff --git a/src/main/java/useless/moonsteel/mixin/ChunkProviderStaticMixin.java b/src/main/java/useless/moonsteel/mixin/ChunkProviderStaticMixin.java index 949ab8e..88824e6 100644 --- a/src/main/java/useless/moonsteel/mixin/ChunkProviderStaticMixin.java +++ b/src/main/java/useless/moonsteel/mixin/ChunkProviderStaticMixin.java @@ -1,18 +1,18 @@ package useless.moonsteel.mixin; +import com.llamalad7.mixinextras.injector.wrapmethod.WrapMethod; +import com.llamalad7.mixinextras.injector.wrapoperation.Operation; import net.minecraft.client.world.chunk.provider.ChunkProviderStatic; +import net.minecraft.core.world.pos.ChunkPosc; 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 useless.moonsteel.MoonSteel; @Mixin(value = ChunkProviderStatic.class, remap = false) public class ChunkProviderStaticMixin { - @Inject(method = "canChunkExist(II)Z", at = @At("HEAD"), cancellable = true) - private void overrideChunk(final int chunkX, final int chunkZ, final CallbackInfoReturnable cir){ - if (MoonSteel.forceChunkLoads){ - cir.setReturnValue(true); - } + + @WrapMethod(method = "canChunkExist") + private boolean overrideChunk(ChunkPosc chunkPos, Operation original){ + return MoonSteel.forceChunkLoads; } } diff --git a/src/main/java/useless/moonsteel/mixin/MobRenderZombieArmoredMixin.java b/src/main/java/useless/moonsteel/mixin/MobRenderZombieArmoredMixin.java index 20338e7..19ac118 100644 --- a/src/main/java/useless/moonsteel/mixin/MobRenderZombieArmoredMixin.java +++ b/src/main/java/useless/moonsteel/mixin/MobRenderZombieArmoredMixin.java @@ -1,26 +1,33 @@ package useless.moonsteel.mixin; -import net.minecraft.client.render.entity.MobRendererBiped; +import net.minecraft.client.Minecraft; +import net.minecraft.client.render.TextureManager; import net.minecraft.client.render.entity.MobRendererZombieArmored; -import net.minecraft.client.render.model.ModelBiped; import net.minecraft.core.entity.monster.MobZombieArmored; 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 org.useless.dragonfly.models.entity.StaticEntityModel; import useless.moonsteel.interfaces.IStarZombie; @Mixin(value = MobRendererZombieArmored.class, remap = false) -public class MobRenderZombieArmoredMixin extends MobRendererBiped { - public MobRenderZombieArmoredMixin(final ModelBiped model, final float shadowSize) { - super(model, shadowSize); - } +public class MobRenderZombieArmoredMixin { - @Inject(method = "prepareArmor(Lnet/minecraft/core/entity/monster/MobZombieArmored;IF)Z", + @Inject(method = "getAndSetupModelForLayer(Lnet/minecraft/core/entity/monster/MobZombieArmored;FFI)Lorg/useless/dragonfly/models/entity/StaticEntityModel;", at = @At(value = "INVOKE", target = "Lnet/minecraft/client/render/entity/MobRendererZombieArmored;bindTexture(Ljava/lang/String;)V", shift = At.Shift.AFTER)) - private void starZombie(final MobZombieArmored zombie, final int renderPass, final float partialTick, final CallbackInfoReturnable cir){ + private void starZombie( + MobZombieArmored zombie, + float brightness, + float partialTick, + int renderPass, + CallbackInfoReturnable cir + ){ if (((IStarZombie)zombie).moonsteel$isStarZombie()){ - this.bindTexture("/assets/moonsteel/textures/armor/moonsteel_" + (renderPass != 2 ? 1 : 2) + ".png"); + String texturePath = "/assets/moonsteel/textures/armor/moonsteel_" + (renderPass != 2 ? 1 : 2) + ".png"; + TextureManager textureManager = Minecraft.getMinecraft().textureManager; + textureManager.bindTexture(textureManager.loadTexture(texturePath)); + } } } diff --git a/src/main/java/useless/moonsteel/mixin/PacketHandlerClientMixin.java b/src/main/java/useless/moonsteel/mixin/PacketHandlerClientMixin.java index ae9194b..e0c6f04 100644 --- a/src/main/java/useless/moonsteel/mixin/PacketHandlerClientMixin.java +++ b/src/main/java/useless/moonsteel/mixin/PacketHandlerClientMixin.java @@ -18,11 +18,11 @@ public abstract class PacketHandlerClientMixin { @Shadow private Minecraft mc; - @Inject(method="handleOpenWindow",at=@At("TAIL")) + @Inject(method = "handleContainerOpen", at = @At("TAIL")) public void inject(final PacketContainerOpen packetContainerOpen, final CallbackInfo ci) { if (packetContainerOpen.inventoryType == MoonSteel.GUI_ID) { ((IStarBackpack)(this.mc.thePlayer)).moonsteel$displayGuiStarBackpack(); - this.mc.thePlayer.craftingInventory.containerId = packetContainerOpen.windowId; + this.mc.thePlayer.containerMenu.containerId = packetContainerOpen.windowId; } } } diff --git a/src/main/java/useless/moonsteel/mixin/WorldFeatureLabyrinthMixin.java b/src/main/java/useless/moonsteel/mixin/WorldFeatureLabyrinthMixin.java index 9d3ba24..4817d34 100644 --- a/src/main/java/useless/moonsteel/mixin/WorldFeatureLabyrinthMixin.java +++ b/src/main/java/useless/moonsteel/mixin/WorldFeatureLabyrinthMixin.java @@ -2,7 +2,6 @@ import net.minecraft.core.WeightedRandomBag; import net.minecraft.core.WeightedRandomLootObject; -import net.minecraft.core.item.ItemStack; import net.minecraft.core.world.World; import net.minecraft.core.world.generate.feature.WorldFeatureLabyrinth; import org.spongepowered.asm.mixin.Mixin; @@ -10,7 +9,6 @@ import org.spongepowered.asm.mixin.injection.At; import org.spongepowered.asm.mixin.injection.Inject; import org.spongepowered.asm.mixin.injection.callback.CallbackInfoReturnable; -import useless.moonsteel.MoonSteel; import useless.moonsteel.MoonSteelItems; import java.util.Random; diff --git a/src/main/java/useless/moonsteel/mixin/WorldMixin.java b/src/main/java/useless/moonsteel/mixin/WorldMixin.java index 1286579..45de57d 100644 --- a/src/main/java/useless/moonsteel/mixin/WorldMixin.java +++ b/src/main/java/useless/moonsteel/mixin/WorldMixin.java @@ -4,9 +4,14 @@ import net.minecraft.core.entity.EntityItem; import net.minecraft.core.item.ItemStack; import net.minecraft.core.world.World; +import net.minecraft.core.world.WorldSource; import net.minecraft.core.world.chunk.Chunk; import net.minecraft.core.world.chunk.ChunkCoordinate; +import net.minecraft.core.world.chunk.ChunkPosition; +import net.minecraft.core.world.pos.ChunkPos; +import net.minecraft.core.world.pos.ChunkTilePos; import net.minecraft.core.world.type.WorldType; +import org.jetbrains.annotations.NotNull; import org.spongepowered.asm.mixin.Mixin; import org.spongepowered.asm.mixin.Shadow; import org.spongepowered.asm.mixin.injection.At; @@ -25,28 +30,35 @@ public abstract class WorldMixin { @Shadow public abstract Chunk getChunkFromChunkCoords(int x, int z); - @Shadow - public WorldType worldType; @Shadow protected int updateLCG; + @Shadow + public Random rand; + @Shadow public abstract EntityItem dropItem(int x, int y, int z, ItemStack itemStack); @Shadow - public Random rand; + public abstract @NotNull WorldType getWorldType(); + @Inject(method = "updateBlocksAndPlayCaveSounds()V", at = @At(value = "INVOKE", target = "Lnet/minecraft/core/world/World;getChunkFromChunkCoords(II)Lnet/minecraft/core/world/chunk/Chunk;", shift = At.Shift.AFTER)) - private void makeTheStarsFall(final CallbackInfo ci, @Local(name = "coordinate") final ChunkCoordinate coordinate){ + private void makeTheStarsFall( + final CallbackInfo ci, +// @Local(name = "coordinate") final ChunkCoordinate coordinate, + @Local(name = "chunkTileQueryPos") ChunkTilePos coordinate + ){ if (!MoonSteel.isStarTime((World) (Object)this)) return; final Chunk chunk = this.getChunkFromChunkCoords(coordinate.x, coordinate.z); if (this.rand.nextInt(MoonSteel.STAR_SPAWN_RATE) == 0){ this.updateLCG = this.updateLCG * 3 + 1013904223; final int randVal = this.updateLCG >> 2; - final int blockX = chunk.xPosition * 16 + (randVal & 0xF); - final int blockZ = chunk.zPosition * 16 + (randVal / 256 & 0xF); - - ((IFallenStar)dropItem(blockX, this.worldType.getMaxY() + 32, blockZ, MoonSteelItems.STAR_FALLEN.getDefaultStack())).moonsteel$setDaylightSensitive(true); + ChunkPos chunkTilePos = chunk.pos; + final int blockX = chunkTilePos.x() + (randVal & 0xF); + final int blockZ = chunkTilePos.z() + (randVal / 256 & 0xF); + ((IFallenStar)dropItem(blockX, this.getWorldType().getMaxY((WorldSource) this) + 32, blockZ, MoonSteelItems.STAR_FALLEN.getDefaultStack())) + .moonsteel$setDaylightSensitive(true); } } } diff --git a/src/main/java/useless/moonsteel/mixin/backpack/MinecraftMixin.java b/src/main/java/useless/moonsteel/mixin/backpack/MinecraftMixin.java index b64b2b5..9b2b4be 100644 --- a/src/main/java/useless/moonsteel/mixin/backpack/MinecraftMixin.java +++ b/src/main/java/useless/moonsteel/mixin/backpack/MinecraftMixin.java @@ -18,6 +18,8 @@ public class MinecraftMixin { @Inject(method = "respawn", at = @At(value = "INVOKE", target = "Lnet/minecraft/client/entity/player/PlayerLocal;setGamemode(Lnet/minecraft/core/player/gamemode/Gamemode;)V", shift = At.Shift.AFTER)) public void keepBackpack(boolean flag, int i, CallbackInfo ci, @Local Player previousPlayer){ - ((IStarBackpack)thePlayer).moonsteel$setStarBackpackInventory(((IStarBackpack)previousPlayer).moonsteel$getStarBackpackInventory()); + IStarBackpack currentWearer = (IStarBackpack) thePlayer; + IStarBackpack previousWearer = (IStarBackpack) previousPlayer; + currentWearer.moonsteel$setStarBackpackInventory(previousWearer.moonsteel$getStarBackpackInventory()); } } diff --git a/src/main/java/useless/moonsteel/mixin/backpack/PlayerLocalMixin.java b/src/main/java/useless/moonsteel/mixin/backpack/PlayerLocalMixin.java index 8616cb9..0a56088 100644 --- a/src/main/java/useless/moonsteel/mixin/backpack/PlayerLocalMixin.java +++ b/src/main/java/useless/moonsteel/mixin/backpack/PlayerLocalMixin.java @@ -7,7 +7,7 @@ import org.spongepowered.asm.mixin.Mixin; import org.spongepowered.asm.mixin.Shadow; import org.spongepowered.asm.mixin.Unique; -import useless.moonsteel.GuiStarBackpack; +import useless.moonsteel.backpack.GuiStarBackpack; @Mixin(value = PlayerLocal.class, remap = false) public class PlayerLocalMixin extends PlayerMixin { diff --git a/src/main/java/useless/moonsteel/mixin/backpack/PlayerMixin.java b/src/main/java/useless/moonsteel/mixin/backpack/PlayerMixin.java index 52f4a6a..a42f841 100644 --- a/src/main/java/useless/moonsteel/mixin/backpack/PlayerMixin.java +++ b/src/main/java/useless/moonsteel/mixin/backpack/PlayerMixin.java @@ -11,7 +11,7 @@ import org.spongepowered.asm.mixin.injection.At; import org.spongepowered.asm.mixin.injection.Inject; import org.spongepowered.asm.mixin.injection.callback.CallbackInfo; -import useless.moonsteel.StarBackpackInventory; +import useless.moonsteel.backpack.StarBackpackInventory; import useless.moonsteel.interfaces.IStarBackpack; import useless.moonsteel.interfaces.ITeleporter; @@ -20,7 +20,7 @@ public abstract class PlayerMixin extends Mob implements IStarBackpack, ITelepor @Unique public StarBackpackInventory starBackpackInventory; - public PlayerMixin(@Nullable final World world) { + protected PlayerMixin(final World world) { super(world); } diff --git a/src/main/java/useless/moonsteel/mixin/backpack/PlayerServerMixin.java b/src/main/java/useless/moonsteel/mixin/backpack/PlayerServerMixin.java index d0f7461..d84caee 100644 --- a/src/main/java/useless/moonsteel/mixin/backpack/PlayerServerMixin.java +++ b/src/main/java/useless/moonsteel/mixin/backpack/PlayerServerMixin.java @@ -13,7 +13,7 @@ @Mixin(value = PlayerServer.class, remap = false) public abstract class PlayerServerMixin extends PlayerMixin { - public PlayerServerMixin(@Nullable World world) { + protected PlayerServerMixin(@Nullable World world) { super(world); } @@ -36,9 +36,9 @@ public PlayerServerMixin(@Nullable World world) { .sendPacket( new PacketContainerOpen(this.currentWindowId, MoonSteel.GUI_ID, "moonsteel$StarBackpack", backpack.backpackInventory.getContainerSize()) ); - this.thisAs.craftingInventory = backpack; - this.thisAs.craftingInventory.containerId = this.currentWindowId; - this.thisAs.craftingInventory.addSlotListener(this.thisAs); + this.thisAs.containerMenu = backpack; + this.thisAs.containerMenu.containerId = this.currentWindowId; + this.thisAs.containerMenu.addSlotListener(this.thisAs); } @Override diff --git a/src/main/java/useless/moonsteel/mixin/entity/EntityItemMixin.java b/src/main/java/useless/moonsteel/mixin/entity/EntityItemMixin.java index ca8d498..37aa677 100644 --- a/src/main/java/useless/moonsteel/mixin/entity/EntityItemMixin.java +++ b/src/main/java/useless/moonsteel/mixin/entity/EntityItemMixin.java @@ -22,21 +22,30 @@ public abstract class EntityItemMixin extends Entity implements IFallenStar { @Unique public boolean despawnInDay = false; - public EntityItemMixin(final World world) { + protected EntityItemMixin(final World world) { super(world); } + @Inject(method = "(Lnet/minecraft/core/world/World;DDDLnet/minecraft/core/item/ItemStack;)V", at = @At("TAIL")) - private void constuct1(final World world, final double d, final double d1, final double d2, final ItemStack itemstack, final CallbackInfo ci){ - if (itemstack.getItem() == MoonSteelItems.STAR_FALLEN){ + private void constuct1(final World world, final double d, final double d1, final double d2, final ItemStack itemstack, final CallbackInfo ci) { + if (itemstack.getItem() == MoonSteelItems.STAR_FALLEN) { this.viewScale = 30; - if (this.y > world.getWorldType().getMaxY()){ - world.playSoundEffect(null, SoundCategory.WEATHER_SOUNDS, (float) this.x, world.findTopSolidBlock((int) this.x, (int) this.z) + 10, (float) this.z, "moonsteel:starspawn", 5, 1f + this.random.nextFloat() * 0.1f); + if (this.y > world.getWorldType().getMaxY(world)) { + world.playSoundEffect(null, SoundCategory.WEATHER_SOUNDS, (float) this.x, + world.findTopSolidBlock( + (int) this.x, + (int) this.z) + 10, + (float) this.z, + "moonsteel:starspawn", + 5, 1f + this.random.nextFloat() * 0.1f + ); } } } + @Inject(method = "tick()V", at = @At("TAIL")) - private void tick(final CallbackInfo ci){ - if (this.despawnInDay && this.world.isDaytime()){ + private void tick(final CallbackInfo ci) { + if (this.despawnInDay && this.world.isDaytime()) { this.remove(); } } @@ -45,14 +54,16 @@ private void tick(final CallbackInfo ci){ public void moonsteel$setDaylightSensitive(final boolean flag) { this.despawnInDay = flag; } + @Inject(method = "addAdditionalSaveData", at = @At("TAIL")) - private void saveData(final CompoundTag tag, final CallbackInfo ci){ + private void saveData(final CompoundTag tag, final CallbackInfo ci) { tag.putBoolean("moonsteel$daydespawn", this.despawnInDay); } + @Inject(method = "readAdditionalSaveData", at = @At("TAIL")) - private void loadData(final CompoundTag tag, final CallbackInfo ci){ + private void loadData(final CompoundTag tag, final CallbackInfo ci) { this.despawnInDay = tag.getBoolean("moonsteel$daydespawn"); - if (this.item.getItem() == MoonSteelItems.STAR_FALLEN){ + if (this.item.getItem() == MoonSteelItems.STAR_FALLEN) { this.viewScale = 5; } } diff --git a/src/main/java/useless/moonsteel/mixin/entity/MobMixin.java b/src/main/java/useless/moonsteel/mixin/entity/MobMixin.java index d2cf89b..69c7cce 100644 --- a/src/main/java/useless/moonsteel/mixin/entity/MobMixin.java +++ b/src/main/java/useless/moonsteel/mixin/entity/MobMixin.java @@ -24,7 +24,7 @@ public abstract class MobMixin extends Entity { @Shadow protected abstract void dropDeathItems(); - public MobMixin(final World world) { + protected MobMixin(final World world) { super(world); } @@ -54,9 +54,9 @@ private int changeFallDamage(final int i){ @Inject(method = "onDeath(Lnet/minecraft/core/entity/Entity;)V", at = @At(value = "INVOKE", target = "Lnet/minecraft/core/entity/Mob;dropDeathItems()V")) private void multiplyDrop(final Entity entity, final CallbackInfo ci){ - if (entity instanceof Player){ - final ItemStack heldStack = ((Player) entity).getHeldItem(); - if (heldStack != null && heldStack.getItem() instanceof ItemToolSword && ((ItemToolSwordAccessor) heldStack.getItem()).getMaterial() == MoonSteelItems.moonSteelTool){ + if (entity instanceof Player player){ + final ItemStack heldStack = player.getHeldItem(); + if (heldStack != null && heldStack.getItem() instanceof ItemToolSword && ((ItemToolSwordAccessor) heldStack.getItem()).getMaterial() == MoonSteelItems.MOON_STEEL_TOOL){ for (int i = 0; i < this.random.nextInt(MoonSteel.LOOTING_AMOUNT); i++) { dropDeathItems(); } diff --git a/src/main/java/useless/moonsteel/mixin/entity/MobZombieArmoredMixin.java b/src/main/java/useless/moonsteel/mixin/entity/MobZombieArmoredMixin.java index 63556b7..e6cfaaf 100644 --- a/src/main/java/useless/moonsteel/mixin/entity/MobZombieArmoredMixin.java +++ b/src/main/java/useless/moonsteel/mixin/entity/MobZombieArmoredMixin.java @@ -29,7 +29,7 @@ public abstract class MobZombieArmoredMixin extends MobZombie implements IMoonGr @Shadow public abstract boolean isHoldingSword(); - public MobZombieArmoredMixin(final World world) { + protected MobZombieArmoredMixin(final World world) { super(world); } diff --git a/src/main/java/useless/moonsteel/mixin/entity/PlayerMixin.java b/src/main/java/useless/moonsteel/mixin/entity/PlayerMixin.java index 9d42e12..4006f0a 100644 --- a/src/main/java/useless/moonsteel/mixin/entity/PlayerMixin.java +++ b/src/main/java/useless/moonsteel/mixin/entity/PlayerMixin.java @@ -1,6 +1,7 @@ package useless.moonsteel.mixin.entity; import net.minecraft.core.entity.player.Player; +import net.minecraft.core.enums.HumanArmorShape; import net.minecraft.core.item.IArmorItem; import net.minecraft.core.player.inventory.container.ContainerInventory; import org.spongepowered.asm.mixin.Mixin; @@ -16,10 +17,10 @@ public class PlayerMixin implements IMoonGrav { @Override public double moonsteel$getGravScalar() { double scalar = 0d; - if (inventory.armorItemInSlot(IArmorItem.PIECE_HEAD) != null && inventory.armorItemInSlot(IArmorItem.PIECE_HEAD).getItem() == MoonSteelItems.ARMOR_HELMET_MOONSTEEL) scalar += 0.167d; - if (inventory.armorItemInSlot(IArmorItem.PIECE_CHEST) != null && inventory.armorItemInSlot(IArmorItem.PIECE_CHEST).getItem() == MoonSteelItems.ARMOR_CHESTPLATE_MOONSTEEL) scalar += 0.334d; - if (inventory.armorItemInSlot(IArmorItem.PIECE_LEGS) != null && inventory.armorItemInSlot(IArmorItem.PIECE_LEGS).getItem() == MoonSteelItems.ARMOR_LEGGINGS_MOONSTEEL) scalar += 0.167d; - if (inventory.armorItemInSlot(IArmorItem.PIECE_BOOTS) != null && inventory.armorItemInSlot(IArmorItem.PIECE_BOOTS).getItem() == MoonSteelItems.ARMOR_BOOTS_MOONSTEEL) scalar += 0.334d; + if (inventory.armorItemInSlot(HumanArmorShape.HEAD) != null && inventory.armorItemInSlot(HumanArmorShape.HEAD).getItem() == MoonSteelItems.ARMOR_HELMET_MOONSTEEL) scalar += 0.167d; + if (inventory.armorItemInSlot(HumanArmorShape.CHEST) != null && inventory.armorItemInSlot(HumanArmorShape.CHEST).getItem() == MoonSteelItems.ARMOR_CHESTPLATE_MOONSTEEL) scalar += 0.334d; + if (inventory.armorItemInSlot(HumanArmorShape.LEGS) != null && inventory.armorItemInSlot(HumanArmorShape.LEGS).getItem() == MoonSteelItems.ARMOR_LEGGINGS_MOONSTEEL) scalar += 0.167d; + if (inventory.armorItemInSlot(HumanArmorShape.BOOTS) != null && inventory.armorItemInSlot(HumanArmorShape.BOOTS).getItem() == MoonSteelItems.ARMOR_BOOTS_MOONSTEEL) scalar += 0.334d; return (1/(scalar + 1)); } } From 971b2a1fc10951c04115dc292567b61fa1281a65 Mon Sep 17 00:00:00 2001 From: Redart15 Date: Sun, 6 Sep 2026 14:14:56 +0200 Subject: [PATCH 02/13] updated build, kept the oldscript around for reference --- build.gradle => build.fff | 0 build.gradle.kts | 187 +++++++++++++++++++++++ gradle.properties | 32 ++-- gradle/gradle-daemon-jvm.properties | 13 ++ gradle/libs.versions.toml | 57 +++++++ gradle/wrapper/gradle-wrapper.jar | Bin 59536 -> 45457 bytes gradle/wrapper/gradle-wrapper.properties | 5 +- 7 files changed, 276 insertions(+), 18 deletions(-) rename build.gradle => build.fff (100%) create mode 100644 build.gradle.kts create mode 100644 gradle/gradle-daemon-jvm.properties create mode 100644 gradle/libs.versions.toml diff --git a/build.gradle b/build.fff similarity index 100% rename from build.gradle rename to build.fff diff --git a/build.gradle.kts b/build.gradle.kts new file mode 100644 index 0000000..7800efe --- /dev/null +++ b/build.gradle.kts @@ -0,0 +1,187 @@ +plugins { + alias(libs.plugins.loom) + java +} + +val lwjglNatives = resolveLwjglNatives() + +val modVersion = "${providers.gradleProperty("mod_version").get()}+${libs.versions.bta.get()}" +val modGroup: Provider = providers.gradleProperty("mod_group") +val modName: Provider = providers.gradleProperty("mod_name") + +val javaVersion: Provider = libs.versions.java.map { it.toInt() } + +base.archivesName = modName +group = modGroup.get() +version = modVersion +loom { + val btaChannel = libs.versions.btaChannel.get() + val btaVersion = (if (btaChannel == "nightly") "" else "v") + libs.versions.bta.get() + customMinecraftMetadata.set("https://downloads.betterthanadventure.net/bta-client/${btaChannel}/$btaVersion/manifest.json") +} +repositories { + mavenCentral() + ivy("https://piston-data.mojang.com") { + patternLayout { artifact("v1/[organisation]/[revision]/[module].jar") } + metadataSources { artifact() } + } + maven("https://maven.fabricmc.net/") { name = "Fabric" } + maven("https://maven.danygames2014.net/signalum") { name = "SignalumMavenMirror1" } + maven("https://maven.thesignalumproject.net/infrastructure") { name = "SignalumMavenInfrastructure" } + maven("https://maven.thesignalumproject.net/releases") { name = "SignalumMavenReleases" } + maven("https://maven.thesignalumproject.net/nightly") { name = "SignalumMavenNightly" } +} +dependencies { + minecraft("::${libs.versions.bta.get()}") + + // Required at compilation & runtime + // included in builds as a runtime dependency + implementation(libs.loader) + implementation(libs.halplibe) // If you do not need halplibe you can delete this line + +// implementation("useless:btabackpacks:1.1.10-7.3_03") +// modImplementation("turniplabs:modmenu-bta:${project.mod_menu_version}") + + // Only required at compilation + // provides documentation, can be removed if that isn't needed + compileOnly(libs.bundles.btaLwjgl) + compileOnly(libs.joml) + compileOnly(libs.joml.primitives) + compileOnly(libs.slf4jApi) + + // Only required for development/launch at runtime, won't be part of any builds + localRuntime(libs.modMenu) // Optional, can be removed + runtimeClasspath(libs.clientJar) + val lwjglVer = libs.versions.lwjgl.get() + localRuntime(platform("org.lwjgl:lwjgl-bom:${lwjglVer}")) + localRuntime("org.lwjgl:lwjgl::$lwjglNatives") + localRuntime("org.lwjgl:lwjgl-glfw::$lwjglNatives") + localRuntime("org.lwjgl:lwjgl-openal::$lwjglNatives") + localRuntime("org.lwjgl:lwjgl-opengl::$lwjglNatives") + localRuntime("org.lwjgl:lwjgl-stb::$lwjglNatives") +} +java { + toolchain { + languageVersion = javaVersion.map { JavaLanguageVersion.of(it) } + vendor = JvmVendorSpec.ADOPTIUM + } + sourceCompatibility = JavaVersion.toVersion(javaVersion.get()) + targetCompatibility = JavaVersion.toVersion(javaVersion.get()) + withSourcesJar() +} +val licenseFile = run { + val rootLicense = layout.projectDirectory.file("LICENSE") + val parentLicense = layout.projectDirectory.file("../LICENSE") + when { + rootLicense.asFile.exists() -> { + logger.lifecycle("Using LICENSE from project root: {}", rootLicense.asFile) + rootLicense + } + parentLicense.asFile.exists() -> { + logger.lifecycle("Using LICENSE from parent directory: {}", parentLicense.asFile) + parentLicense + } + else -> { + logger.warn("No LICENSE file found in project or parent directory.") + null + } + } +} +tasks { + withType().configureEach { + options.encoding = "UTF-8" + sourceCompatibility = javaVersion.get().toString() + targetCompatibility = javaVersion.get().toString() + if (javaVersion.get() > 8) options.release = javaVersion + } + named("updateDaemonJvm") { + languageVersion = libs.versions.gradleJava.map { JavaLanguageVersion.of(it.toInt()) } + vendor = JvmVendorSpec.ADOPTIUM + } + withType().configureEach { defaultCharacterEncoding = "UTF-8" } + withType().configureEach { options.encoding = "UTF-8" } + withType().configureEach { defaultCharacterEncoding = "UTF-8" } + withType().configureEach { + licenseFile?.let { + from(it) { + rename { original -> "${original}_${archiveBaseName.get()}" } + } + } + } + processResources { + val resourceMap = mapOf( + "version" to modVersion, + "fabricloader" to libs.versions.loader.get(), + "halplibe" to libs.versions.halplibe.get(), + "java" to libs.versions.java.get(), + "modmenu" to libs.versions.modMenu.get() + ) + // This is needed for gradle to recognize changes + // made to expanded files + inputs.properties(resourceMap) + + duplicatesStrategy = DuplicatesStrategy.INCLUDE + with(copySpec { + from("src/main/resources/") { + include("fabric.mod.json") + include("*.mixins.json") + expand(resourceMap) + } + }) + } +} +// Removes all outdated manifest.json dependencies +configurations.configureEach { + exclude(group = "org.lwjgl.lwjgl") + exclude(group = "net.java.jutils") + exclude(group = "net.java.jinput") + exclude(group = "net.sf.jopt-simple") + exclude(group = "net.minecraft", module = "launchwrapper") +} + +// not sure about this, so this is useless exclusive +//publishing { +// repositories { +// maven { +// name = "signalumMaven" +// url = "https://maven.thesignalumproject.net/releases" +// credentials(PasswordCredentials) +// authentication { +// basic(BasicAuthentication) +// } +// } +// } +// +// publications { +// maven(MavenPublication) { +// groupId = project.mod_group +// artifactId = project.mod_name +// version = project.mod_version +// from components.java +// } +// } +//} + +fun resolveLwjglNatives(): String { // Sourced from https://www.lwjgl.org/ + return Pair( + System.getProperty("os.name")!!, + System.getProperty("os.arch")!! + ).let { (name, arch) -> + when { + arrayOf("Linux", "SunOS", "Unit").any { name.startsWith(it) } -> + if (arrayOf("arm", "aarch64").any { arch.startsWith(it) }) + "natives-linux${if (arch.contains("64") || arch.startsWith("armv8")) "-arm64" else "-arm32"}" + else + "natives-linux" + arrayOf("Mac OS X", "Darwin").any { name.startsWith(it) } -> + "natives-macos${if (arch.startsWith("aarch64")) "-arm64" else ""}" + arrayOf("Windows").any { name.startsWith(it) } -> + if (arch.contains("64")) + "natives-windows${if (arch.startsWith("aarch64")) "-arm64" else ""}" + else + "natives-windows-x86" + else -> + throw Error("Unrecognized or unsupported platform. Please set \"lwjglNatives\" manually") + } + } +} diff --git a/gradle.properties b/gradle.properties index 94b9234..627a8f2 100644 --- a/gradle.properties +++ b/gradle.properties @@ -1,20 +1,18 @@ -org.gradle.jvmargs=-Xmx2G -org.gradle.parallel = true -org.gradle.daemon = true -fabric.loom.multiProjectOptimisation=true - -# BTA -bta_version=7.3_03 -bta_channel=release - -# Loader -loader_version=0.15.6-bta.7 - -# Other Mods -mod_menu_version=3.0.0 -halplibe_version=5.2.4 - -# Mod +########################################################################## +# Standard Properties +org.gradle.jvmargs = -Xmx2G +org.gradle.warning.mode = all +# This currently has to be set to false because the "Minecraft Client" and "Minecraft Server" configurations generated +# by IntelliJ aren't currently compatible with the configuration cache. If you use the runClient and runServer Gradle +# tasks instead, then this can (and should) be set to true. +org.gradle.configuration-cache = false +########################################################################## +# Mod Properties mod_version=1.1.0-7.3_03 mod_group=useless mod_name=moonsteel +########################################################################## +# Plugin Dependency +# Check this on https://plugins.gradle.org/plugin/org.gradle.toolchains.foojay-resolver-convention/ +foojay_resolver_version = 1.0.0 +########################################################################## diff --git a/gradle/gradle-daemon-jvm.properties b/gradle/gradle-daemon-jvm.properties new file mode 100644 index 0000000..e409a46 --- /dev/null +++ b/gradle/gradle-daemon-jvm.properties @@ -0,0 +1,13 @@ +#This file is generated by updateDaemonJvm +toolchainUrl.FREE_BSD.AARCH64=https\://api.foojay.io/disco/v3.0/ids/df211d3c3eefdc408b462041881bc575/redirect +toolchainUrl.FREE_BSD.X86_64=https\://api.foojay.io/disco/v3.0/ids/b41931cf1e70bc8e08d7dd19c343ef00/redirect +toolchainUrl.LINUX.AARCH64=https\://api.foojay.io/disco/v3.0/ids/df211d3c3eefdc408b462041881bc575/redirect +toolchainUrl.LINUX.X86_64=https\://api.foojay.io/disco/v3.0/ids/b41931cf1e70bc8e08d7dd19c343ef00/redirect +toolchainUrl.MAC_OS.AARCH64=https\://api.foojay.io/disco/v3.0/ids/46949723aaa20c7b64d7ecfed7207034/redirect +toolchainUrl.MAC_OS.X86_64=https\://api.foojay.io/disco/v3.0/ids/d6690dfd71c4c91e08577437b5b2beb0/redirect +toolchainUrl.UNIX.AARCH64=https\://api.foojay.io/disco/v3.0/ids/df211d3c3eefdc408b462041881bc575/redirect +toolchainUrl.UNIX.X86_64=https\://api.foojay.io/disco/v3.0/ids/b41931cf1e70bc8e08d7dd19c343ef00/redirect +toolchainUrl.WINDOWS.AARCH64=https\://api.foojay.io/disco/v3.0/ids/3cd7045fca9a72cd9bc7d14a385e594c/redirect +toolchainUrl.WINDOWS.X86_64=https\://api.foojay.io/disco/v3.0/ids/552c7bffe0370c66410a51c55985b511/redirect +toolchainVendor=ADOPTIUM +toolchainVersion=21 diff --git a/gradle/libs.versions.toml b/gradle/libs.versions.toml new file mode 100644 index 0000000..64559b8 --- /dev/null +++ b/gradle/libs.versions.toml @@ -0,0 +1,57 @@ +[versions] +########################################################################## +# Plugins +# Check this on https://github.com/FabricMC/fabric-loom/releases/latest/ +loom = "1.15-SNAPSHOT" +########################################################################## +# Java Configuration +# The Java version the JDK will be for compiling and running code. +java = "17" +# The Java version the JDK will be for running Gradle. +gradleJava = "21" +##########################################################################EEE +# Mod Dependencies +# Check this on https://downloads.betterthanadventure.net/bta-client/ +bta = "8.0.1" +# Options are release, prerelease, nightly, and misc. +btaChannel = "release" +# Check this on https://maven.thesignalumproject.net/#/infrastructure/net/fabricmc/fabric-loader/ +loader = "0.18.4-bta.11" +# Check this on https://github.com/Turnip-Labs/ModMenu/releases/latest/ +modMenu = "5.0.2" +# Check this on https://github.com/Turnip-Labs/bta-halplibe/releases/latest/ +halplibe = "6.2.0+8.0.1" +# Check this on https://github.com/Better-than-Adventure/legacy-lwjgl3/releases/latest/ +legacyLwjgl = "1.0.6" +########################################################################## +# Dependencies +# Check this on https://central.sonatype.com/artifact/org.slf4j/slf4j-api/ +slf4jApi = "2.0.17" +# This should match the version used by the current BTA release. +lwjgl = "3.3.3" + +joml = "1.10.8" # Note: BTA uses 1.10.7, patch 8 removes the kotlin stdlib dependency +jomlPrimitivess = "1.10.0" +########################################################################## + +[libraries] +loader = { group = "net.fabricmc", name = "fabric-loader", version.ref = "loader" } +halplibe = { group = "turniplabs", name = "halplibe", version.ref = "halplibe" } +modMenu = { group = "turniplabs", name = "modmenu-bta", version.ref = "modMenu" } +legacyLwjgl = { group = "com.github.Better-than-Adventure", name = "legacy-lwjgl3", version.ref = "legacyLwjgl" } +slf4jApi = { group = "org.slf4j", name = "slf4j-api", version.ref = "slf4jApi" } +# https://piston-data.mojang.com/v1/objects/43db9b498cb67058d2e12d394e6507722e71bb45/client.jar +clientJar = { group = "objects", name = "client", version = "43db9b498cb67058d2e12d394e6507722e71bb45" } +joml = { group = "org.joml", name = "joml", version.ref = "joml" } +joml-primitives = { group = "org.joml", name = "joml-primitives", version.ref = "jomlPrimitivess" } +lwjgl = { group = "org.lwjgl", name = "lwjgl", version.ref = "lwjgl"} +lwjgl-glfw = { group = "org.lwjgl", name = "lwjgl-glfw", version.ref = "lwjgl"} +lwjgl-openal = { group = "org.lwjgl", name = "lwjgl-openal", version.ref = "lwjgl"} +lwjgl-opengl = { group = "org.lwjgl", name = "lwjgl-opengl", version.ref = "lwjgl"} +lwjgl-stb = { group = "org.lwjgl", name = "lwjgl-stb", version.ref = "lwjgl"} + +[bundles] +btaLwjgl = [ "lwjgl", "lwjgl-glfw", "lwjgl-openal", "lwjgl-opengl", "lwjgl-stb", "legacyLwjgl" ] + +[plugins] +loom = { id = "net.fabricmc.fabric-loom", version.ref = "loom" } diff --git a/gradle/wrapper/gradle-wrapper.jar b/gradle/wrapper/gradle-wrapper.jar index 7454180f2ae8848c63b8b4dea2cb829da983f2fa..8bdaf60c75ab801e22807dde59e12a8735a34077 100644 GIT binary patch literal 45457 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 c82=K%QXLKFx%@O{wJjEi6Y56o#$)Bpeg literal 59536 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 QuEJmfE|#`Dqx|px0L@K;Y5)KL diff --git a/gradle/wrapper/gradle-wrapper.properties b/gradle/wrapper/gradle-wrapper.properties index d6e308a..56fd94f 100644 --- a/gradle/wrapper/gradle-wrapper.properties +++ b/gradle/wrapper/gradle-wrapper.properties @@ -1,5 +1,8 @@ +# Check this on https://gradle.org/releases/ distributionBase=GRADLE_USER_HOME distributionPath=wrapper/dists -distributionUrl=https\://services.gradle.org/distributions/gradle-8.12-bin.zip +distributionUrl=https\://services.gradle.org/distributions/gradle-9.3.1-all.zip +networkTimeout=10000 +validateDistributionUrl=true zipStoreBase=GRADLE_USER_HOME zipStorePath=wrapper/dists From 34bea9431d783d8902cfd2bf270045b7f0f7253d Mon Sep 17 00:00:00 2001 From: Redart15 Date: Sun, 6 Sep 2026 20:27:11 +0200 Subject: [PATCH 03/13] back pack fixed --- build.gradle.kts | 7 +++- gradle.properties | 2 +- gradle/libs.versions.toml | 3 ++ .../moonsteel/ContainerStarBackpack.java | 23 ++++++----- .../useless/moonsteel/MoonSteelClient.java | 2 + .../useless/moonsteel/MoonSteelModels.java | 4 +- .../moonsteel/backpack/GuiStarBackpack.java | 23 ++++++----- .../moonsteel/backpack/ItemStarBackpack.java | 7 ++-- .../moonsteel/backpack/SlotStarBackpack.java | 2 + .../backpack/StarBackpackInventory.java | 25 +++++++----- .../block/BlockModelStellarRewinder.java | 10 +++-- .../block/TileEntityStellarRewinder.java | 4 +- .../moonsteel/item/ItemConnectedStar.java | 11 +++--- .../mixin/backpack/PlayerLocalMixin.java | 10 ++++- .../moonsteel/lang/en_US}/en_US.lang | 0 .../moonsteel/lang/ru_RU}/ru_RU.lang | 0 .../item/armor_boots_moonsteel/full.png | Bin 0 -> 169 bytes .../item/armor_boots_moonsteel/half.png | Bin 0 -> 168 bytes .../armor_boots_moonsteel/half_flipped.png | Bin 0 -> 171 bytes .../item/armor_chestplate_moonsteel/full.png | Bin 0 -> 166 bytes .../item/armor_chestplate_moonsteel/half.png | Bin 0 -> 170 bytes .../half_flipped.png | Bin 0 -> 169 bytes .../item/armor_helmet_moonsteel/full.png | Bin 0 -> 158 bytes .../item/armor_helmet_moonsteel/half.png | Bin 0 -> 158 bytes .../armor_helmet_moonsteel/half_flipped.png | Bin 0 -> 157 bytes .../item/armor_leggings_moonsteel/full.png | Bin 0 -> 154 bytes .../item/armor_leggings_moonsteel/half.png | Bin 0 -> 154 bytes .../armor_leggings_moonsteel/half_flipped.png | Bin 0 -> 151 bytes src/main/resources/fabric.mod.json | 37 +++++------------- 29 files changed, 95 insertions(+), 75 deletions(-) rename src/main/resources/{lang/moonsteel => assets/moonsteel/lang/en_US}/en_US.lang (100%) rename src/main/resources/{lang/moonsteel => assets/moonsteel/lang/ru_RU}/ru_RU.lang (100%) create mode 100644 src/main/resources/assets/moonsteel/textures/gui/sprites/hud/armor_bar/item/armor_boots_moonsteel/full.png create mode 100644 src/main/resources/assets/moonsteel/textures/gui/sprites/hud/armor_bar/item/armor_boots_moonsteel/half.png create mode 100644 src/main/resources/assets/moonsteel/textures/gui/sprites/hud/armor_bar/item/armor_boots_moonsteel/half_flipped.png create mode 100644 src/main/resources/assets/moonsteel/textures/gui/sprites/hud/armor_bar/item/armor_chestplate_moonsteel/full.png create mode 100644 src/main/resources/assets/moonsteel/textures/gui/sprites/hud/armor_bar/item/armor_chestplate_moonsteel/half.png create mode 100644 src/main/resources/assets/moonsteel/textures/gui/sprites/hud/armor_bar/item/armor_chestplate_moonsteel/half_flipped.png create mode 100644 src/main/resources/assets/moonsteel/textures/gui/sprites/hud/armor_bar/item/armor_helmet_moonsteel/full.png create mode 100644 src/main/resources/assets/moonsteel/textures/gui/sprites/hud/armor_bar/item/armor_helmet_moonsteel/half.png create mode 100644 src/main/resources/assets/moonsteel/textures/gui/sprites/hud/armor_bar/item/armor_helmet_moonsteel/half_flipped.png create mode 100644 src/main/resources/assets/moonsteel/textures/gui/sprites/hud/armor_bar/item/armor_leggings_moonsteel/full.png create mode 100644 src/main/resources/assets/moonsteel/textures/gui/sprites/hud/armor_bar/item/armor_leggings_moonsteel/half.png create mode 100644 src/main/resources/assets/moonsteel/textures/gui/sprites/hud/armor_bar/item/armor_leggings_moonsteel/half_flipped.png diff --git a/build.gradle.kts b/build.gradle.kts index 7800efe..8dc526f 100644 --- a/build.gradle.kts +++ b/build.gradle.kts @@ -30,6 +30,11 @@ repositories { maven("https://maven.thesignalumproject.net/infrastructure") { name = "SignalumMavenInfrastructure" } maven("https://maven.thesignalumproject.net/releases") { name = "SignalumMavenReleases" } maven("https://maven.thesignalumproject.net/nightly") { name = "SignalumMavenNightly" } + maven("https://api.modrinth.com/maven") { name = "Modrinth" + content { + includeGroup("maven.modrinth") + } + } } dependencies { minecraft("::${libs.versions.bta.get()}") @@ -40,7 +45,7 @@ dependencies { implementation(libs.halplibe) // If you do not need halplibe you can delete this line // implementation("useless:btabackpacks:1.1.10-7.3_03") -// modImplementation("turniplabs:modmenu-bta:${project.mod_menu_version}") + compileOnly(libs.btabackpacks) // Only required at compilation // provides documentation, can be removed if that isn't needed diff --git a/gradle.properties b/gradle.properties index 627a8f2..aad43a4 100644 --- a/gradle.properties +++ b/gradle.properties @@ -8,7 +8,7 @@ org.gradle.warning.mode = all org.gradle.configuration-cache = false ########################################################################## # Mod Properties -mod_version=1.1.0-7.3_03 +mod_version=1.1.1 mod_group=useless mod_name=moonsteel ########################################################################## diff --git a/gradle/libs.versions.toml b/gradle/libs.versions.toml index 64559b8..e683c24 100644 --- a/gradle/libs.versions.toml +++ b/gradle/libs.versions.toml @@ -32,9 +32,12 @@ lwjgl = "3.3.3" joml = "1.10.8" # Note: BTA uses 1.10.7, patch 8 removes the kotlin stdlib dependency jomlPrimitivess = "1.10.0" + +btabackpacks = "1.2.0-8.0" ########################################################################## [libraries] +btabackpacks = { group = "maven.modrinth", name = "better-with-backpacks", version.ref = "btabackpacks" } loader = { group = "net.fabricmc", name = "fabric-loader", version.ref = "loader" } halplibe = { group = "turniplabs", name = "halplibe", version.ref = "halplibe" } modMenu = { group = "turniplabs", name = "modmenu-bta", version.ref = "modMenu" } diff --git a/src/main/java/useless/moonsteel/ContainerStarBackpack.java b/src/main/java/useless/moonsteel/ContainerStarBackpack.java index 005506f..3600b16 100644 --- a/src/main/java/useless/moonsteel/ContainerStarBackpack.java +++ b/src/main/java/useless/moonsteel/ContainerStarBackpack.java @@ -1,9 +1,11 @@ package useless.moonsteel; +import it.unimi.dsi.fastutil.ints.IntList; import net.minecraft.core.InventoryAction; import net.minecraft.core.entity.player.Player; import net.minecraft.core.player.inventory.menu.MenuAbstract; import net.minecraft.core.player.inventory.slot.Slot; +import org.jetbrains.annotations.NotNull; import useless.moonsteel.backpack.SlotStarBackpack; import useless.moonsteel.backpack.StarBackpackInventory; import useless.moonsteel.interfaces.IStarBackpack; @@ -12,35 +14,36 @@ public class ContainerStarBackpack extends MenuAbstract { public StarBackpackInventory backpackInventory; + public ContainerStarBackpack(final Player player) { - this.backpackInventory = ((IStarBackpack)player).moonsteel$getStarBackpackInventory(); + this.backpackInventory = ((IStarBackpack) player).moonsteel$getStarBackpackInventory(); final int slotsNum = this.backpackInventory.getContainerSize(); - final int rows = (int)Math.ceil((double)slotsNum / 9.0); + final int rows = (int) Math.ceil(slotsNum / 9.0); - for(int i = 0; i < rows; ++i) { + for (int i = 0; i < rows; ++i) { int width = 9; if (i == rows - 1) { width = slotsNum - 9 * i; } - for(int k = 0; k < width; ++k) { + for (int k = 0; k < width; ++k) { this.addSlot(new SlotStarBackpack(this.backpackInventory, k + i * 9, 8 + k * 18, 18 + 18 * i)); } } - for(int i = 0; i < 3; ++i) { - for(int k = 0; k < 9; ++k) { + for (int i = 0; i < 3; ++i) { + for (int k = 0; k < 9; ++k) { this.addSlot(new Slot(player.inventory, k + i * 9 + 9, 8 + k * 18, 84 + i * 18)); } } - for(int j = 0; j < 9; ++j) { + for (int j = 0; j < 9; ++j) { this.addSlot(new Slot(player.inventory, j, 8 + j * 18, 142)); } } @Override - public List getMoveSlots(final InventoryAction inventoryAction, final Slot slot, final int i, final Player entityPlayer) { + public IntList getMoveSlots(final @NotNull InventoryAction inventoryAction, final Slot slot, final int i, final Player entityPlayer) { final int chestSize = this.backpackInventory.getContainerSize(); if (slot.index >= 0 && slot.index < chestSize) { return this.getSlots(0, chestSize, false); @@ -62,13 +65,13 @@ public List getMoveSlots(final InventoryAction inventoryAction, final S } @Override - public List getTargetSlots(final InventoryAction inventoryAction, final Slot slot, final int i, final Player entityPlayer) { + public IntList getTargetSlots(final @NotNull InventoryAction inventoryAction, final Slot slot, final int i, final Player entityPlayer) { final int chestSize = this.backpackInventory.getContainerSize(); return slot.index < chestSize ? this.getSlots(chestSize, 36, true) : this.getSlots(0, chestSize, false); } @Override - public boolean stillValid(final Player entityPlayer) { + public boolean stillValid(final @NotNull Player entityPlayer) { return this.backpackInventory.stillValid(entityPlayer); } diff --git a/src/main/java/useless/moonsteel/MoonSteelClient.java b/src/main/java/useless/moonsteel/MoonSteelClient.java index f73a78b..49c18f4 100644 --- a/src/main/java/useless/moonsteel/MoonSteelClient.java +++ b/src/main/java/useless/moonsteel/MoonSteelClient.java @@ -21,6 +21,8 @@ public class MoonSteelClient implements ClientModInitializer { public void onInitializeClient() { ClientEvents.BEFORE_CLIENT_START.listen(KEY, this::beforeClientStart); ClientEvents.AFTER_CLIENT_START.listen(KEY, this::afterClientStart); + ClientEvents.ITEM_MODEL_RELOAD.listen(KEY, MoonSteelModels::initItemModels); + ClientEvents.BLOCK_MODEL_RELOAD.listen(KEY, MoonSteelModels::initBlockModels); } diff --git a/src/main/java/useless/moonsteel/MoonSteelModels.java b/src/main/java/useless/moonsteel/MoonSteelModels.java index 08af8ec..372599a 100644 --- a/src/main/java/useless/moonsteel/MoonSteelModels.java +++ b/src/main/java/useless/moonsteel/MoonSteelModels.java @@ -19,7 +19,7 @@ public class MoonSteelModels { - public void initBlockModels(final BlockModelDispatcher dispatcher) { + public static void initBlockModels(final BlockModelDispatcher dispatcher) { final Side[] S_TB = {Side.TOP, Side.BOTTOM}; final Side[] S_SIDES = {Side.NORTH, Side.EAST, Side.SOUTH, Side.WEST}; //TODO replace with BlockModelGeneric @@ -40,7 +40,7 @@ public void initBlockModels(final BlockModelDispatcher dispatcher) { } - public void initItemModels(final ItemModelDispatcher dispatcher) { + public static void initItemModels(final ItemModelDispatcher dispatcher) { dispatcher.addDispatch(makeModel(MoonSteelItems.INGOT_MOONSTEEL, "moonsteel_ingot")); dispatcher.addDispatch(makeModel(MoonSteelItems.INGOT_MOONSTEEL_CRUDE, "moonsteel_crude")); dispatcher.addDispatch(makeHoldModel(MoonSteelItems.TOOL_PICKAXE_MOONSTEEL, "moonsteel_pickaxe")); diff --git a/src/main/java/useless/moonsteel/backpack/GuiStarBackpack.java b/src/main/java/useless/moonsteel/backpack/GuiStarBackpack.java index 103fdb6..81387d1 100644 --- a/src/main/java/useless/moonsteel/backpack/GuiStarBackpack.java +++ b/src/main/java/useless/moonsteel/backpack/GuiStarBackpack.java @@ -8,8 +8,8 @@ import useless.moonsteel.ContainerStarBackpack; public class GuiStarBackpack extends ScreenContainerAbstract { - private int GUIx; - private int GUIy; + private int guiX; + private int guiY; private int rows; private int slotsNum; private final ContainerStarBackpack backpack; @@ -18,29 +18,32 @@ public GuiStarBackpack(Player player) { backpack = (ContainerStarBackpack) inventorySlots; } + @Override public void init() { - this.GUIx = (this.width - this.xSize) / 2; - this.GUIy = (this.height - this.ySize) / 2; + this.guiX = (this.width - this.xSize) / 2; + this.guiY = (this.height - this.ySize) / 2; this.slotsNum = this.backpack.backpackInventory.getContainerSize(); - this.rows = (int)Math.ceil((double)this.slotsNum / 9.0); + this.rows = (int)Math.ceil(this.slotsNum / 9.0); super.init(); } + @Override protected void drawGuiContainerForegroundLayer() { - this.font.drawString(I18n.getInstance().translateKey(this.backpack.backpackInventory.getNameTranslationKey()), 8, 6, BetterWithBackpacks.GUI_LABEL_COLOR); - this.font.drawString("Inventory", 8, this.ySize - 96 + 2, BetterWithBackpacks.GUI_LABEL_COLOR); + String name = I18n.getInstance().translateKey(this.backpack.backpackInventory.getNameTranslationKey()); + this.drawStringNoShadow(this.fontRenderer, name, 8, 6, BetterWithBackpacks.GUI_LABEL_COLOR); + this.drawStringNoShadow(this.fontRenderer, "Inventory", 8, this.ySize - 96 + 2, BetterWithBackpacks.GUI_LABEL_COLOR); } protected void drawGuiContainerBackgroundLayer(float f) { GL11.glColor3d(1.0, 1.0, 1.0); this.mc.textureManager.loadTexture("/assets/betterwithbackpacks/gui/backpack.png").bind(); - this.drawTexturedModalRect(this.GUIx, this.GUIy, 0, 0, this.xSize, this.ySize); + this.drawTexturedModalRect(this.guiX, this.guiY, 0, 0, this.xSize, this.ySize); for(int i = 0; i < this.rows; ++i) { if (i == this.rows - 1) { - this.drawTexturedModalRect(this.GUIx + 7, this.GUIy + 17 + 18 * i, 0, 166, 18 * (this.slotsNum - 9 * i), 18); + this.drawTexturedModalRect(this.guiX + 7, this.guiY + 17 + 18 * i, 0, 166, 18 * (this.slotsNum - 9 * i), 18); } else { - this.drawTexturedModalRect(this.GUIx + 7, this.GUIy + 17 + 18 * i, 0, 166, 162, 18); + this.drawTexturedModalRect(this.guiX + 7, this.guiY + 17 + 18 * i, 0, 166, 162, 18); } } } diff --git a/src/main/java/useless/moonsteel/backpack/ItemStarBackpack.java b/src/main/java/useless/moonsteel/backpack/ItemStarBackpack.java index 7c2193a..b7dc5cc 100644 --- a/src/main/java/useless/moonsteel/backpack/ItemStarBackpack.java +++ b/src/main/java/useless/moonsteel/backpack/ItemStarBackpack.java @@ -9,14 +9,15 @@ public class ItemStarBackpack extends ItemBackpack { public ItemStarBackpack(String name, String namespaceId, int id) { - super(name, namespaceId, id, StarBackpackInventory.starBackpackSize); + super(name, namespaceId, id, StarBackpackInventory.STAR_BACKPACK_SIZE); } + + @Override - public ItemStack onUseItem(ItemStack itemstack, World world, Player entityplayer) { + public ItemStack onUse(ItemStack itemstack, World world, Player entityplayer) { if (!world.isClientSide && BetterWithBackpacks.ENABLE_BACKPACKS) { ((IStarBackpack)entityplayer).moonsteel$displayGuiStarBackpack(); } - return itemstack; } } diff --git a/src/main/java/useless/moonsteel/backpack/SlotStarBackpack.java b/src/main/java/useless/moonsteel/backpack/SlotStarBackpack.java index 6696353..9999fcf 100644 --- a/src/main/java/useless/moonsteel/backpack/SlotStarBackpack.java +++ b/src/main/java/useless/moonsteel/backpack/SlotStarBackpack.java @@ -9,6 +9,8 @@ public class SlotStarBackpack extends Slot { public SlotStarBackpack(Container inventory, int id, int x, int y) { super(inventory, id, x, y); } + + @Override public boolean mayPlace(ItemStack itemstack) { return itemstack != null && !(itemstack.getItem() instanceof ItemBackpack) && !this.isLocked(); } diff --git a/src/main/java/useless/moonsteel/backpack/StarBackpackInventory.java b/src/main/java/useless/moonsteel/backpack/StarBackpackInventory.java index de1bd8e..4364fab 100644 --- a/src/main/java/useless/moonsteel/backpack/StarBackpackInventory.java +++ b/src/main/java/useless/moonsteel/backpack/StarBackpackInventory.java @@ -6,22 +6,23 @@ import net.minecraft.core.item.ItemStack; import net.minecraft.core.player.inventory.InventorySorter; import net.minecraft.core.player.inventory.container.Container; +import org.jetbrains.annotations.NotNull; import tosutosu.betterwithbackpacks.BetterWithBackpacks; import useless.moonsteel.MoonSteelItems; public class StarBackpackInventory implements Container { - public static int starBackpackSize = 18; - protected ItemStack[] backpackItemStacks; - public Player player; + public static final int STAR_BACKPACK_SIZE = 18; + private ItemStack[] backpackItemStacks; + private Player player; public StarBackpackInventory(Player player) { this.player = player; - this.backpackItemStacks = new ItemStack[starBackpackSize]; + this.backpackItemStacks = new ItemStack[STAR_BACKPACK_SIZE]; } @Override public int getContainerSize() { - return starBackpackSize; + return STAR_BACKPACK_SIZE; } @Override @@ -58,7 +59,7 @@ public void setItem(int i, ItemStack itemStack) { } @Override - public String getNameTranslationKey() { + public @NotNull String getNameTranslationKey() { return "moonsteel.container.backpack.star.name"; } @@ -69,7 +70,7 @@ public int getMaxStackSize() { @Override public void setChanged() { - + /* no need */ } public void readFromNBT(ListTag tagList) { @@ -98,7 +99,7 @@ public ListTag writeToNBT(ListTag tagList) { } @Override - public boolean stillValid(Player entityPlayer) { + public boolean stillValid(@NotNull Player entityPlayer) { if (!BetterWithBackpacks.ENABLE_BACKPACKS) { return false; } else if (entityPlayer.getHeldItem() == null) { @@ -110,7 +111,13 @@ public boolean stillValid(Player entityPlayer) { } @Override - public void sortContainer() { + public void sort() { InventorySorter.sortInventory(this.backpackItemStacks); } + + @Override + public boolean locked(int slot) { + return Container.super.locked(slot); + } + } diff --git a/src/main/java/useless/moonsteel/block/BlockModelStellarRewinder.java b/src/main/java/useless/moonsteel/block/BlockModelStellarRewinder.java index 01b8d1a..ae6ca17 100644 --- a/src/main/java/useless/moonsteel/block/BlockModelStellarRewinder.java +++ b/src/main/java/useless/moonsteel/block/BlockModelStellarRewinder.java @@ -7,6 +7,8 @@ import net.minecraft.core.block.BlockLogic; import net.minecraft.core.util.helper.Side; import net.minecraft.core.world.WorldSource; +import net.minecraft.core.world.pos.TilePosc; +import org.jetbrains.annotations.NotNull; import useless.moonsteel.MoonSteel; public class BlockModelStellarRewinder extends BlockModelHorizontalRotation { @@ -16,10 +18,10 @@ public BlockModelStellarRewinder(Block block) { super(block); } @Override - public IconCoordinate getBlockTexture(WorldSource blockAccess, int x, int y, int z, Side side) { - IconCoordinate iconCoordinate = super.getBlockTexture(blockAccess, x, y, z, side); - TileEntityStellarRewinder rewinder = (TileEntityStellarRewinder) blockAccess.getTileEntity(x,y,z); - if (rewinder.inUse() && iconCoordinate == icon_front){ + public IconCoordinate getBlockTexture(@NotNull WorldSource blockAccess, @NotNull TilePosc tilePosc, @NotNull Side side) { + IconCoordinate iconCoordinate = super.getBlockTexture(blockAccess, tilePosc, side); + TileEntityStellarRewinder rewinder = (TileEntityStellarRewinder) blockAccess.getTileEntity(tilePosc); + if (rewinder != null && rewinder.inUse() && iconCoordinate == icon_front){ iconCoordinate = icon_front_active; } return iconCoordinate; diff --git a/src/main/java/useless/moonsteel/block/TileEntityStellarRewinder.java b/src/main/java/useless/moonsteel/block/TileEntityStellarRewinder.java index 80fd7a5..1db6cde 100644 --- a/src/main/java/useless/moonsteel/block/TileEntityStellarRewinder.java +++ b/src/main/java/useless/moonsteel/block/TileEntityStellarRewinder.java @@ -35,9 +35,9 @@ public ItemStack linkStar(ItemStack stack){ int destY = stack.getData().getInteger("moonsteel$y"); int destZ = stack.getData().getInteger("moonsteel$z"); MoonSteel.forceChunkLoads = true; - Chunk chunk = this.worldObj.getChunkProvider().provideChunk(new ChunkPos(destX, destZ), true); + Chunk chunk = worldObj.getChunkProvider().provideChunk(new ChunkPos(destX >> 4, destZ >> 4), true); MoonSteel.forceChunkLoads = false; - TileEntity te = chunk.getTileEntity(new ChunkTilePos(destX &0xF, destY, destZ &0xF)); + TileEntity te = chunk.getTileEntity(new ChunkTilePos(destX & 0xF, destY, destZ & 0xF)); if (te instanceof TileEntityStellarRewinder tileEntityStellarRewinder && tileEntityStellarRewinder.canTeleport(stack)){ tileEntityStellarRewinder.setInUse(false); } diff --git a/src/main/java/useless/moonsteel/item/ItemConnectedStar.java b/src/main/java/useless/moonsteel/item/ItemConnectedStar.java index 639614e..6f31962 100644 --- a/src/main/java/useless/moonsteel/item/ItemConnectedStar.java +++ b/src/main/java/useless/moonsteel/item/ItemConnectedStar.java @@ -38,14 +38,15 @@ public ItemConnectedStar(String name, String namespaceId, int id) { return itemstack; } MoonSteel.forceChunkLoads = true; - Chunk chunk = world.getChunkProvider().provideChunk(new ChunkPos(destX, destZ), true); + Chunk chunk = world.getChunkProvider().provideChunk(new ChunkPos(destX >> 4, destZ >> 4), true); MoonSteel.forceChunkLoads = false; - TileEntity te = chunk.getTileEntity(new ChunkTilePos(destX &0xF, destY, destZ &0xF)); - if (te instanceof TileEntityStellarRewinder && ((TileEntityStellarRewinder) te).canTeleport(itemstack)){ + ChunkTilePos chunkTilePos = new ChunkTilePos(destX, destY, destZ); + TileEntity te = chunk.getTileEntity(chunkTilePos); + if (te instanceof TileEntityStellarRewinder tileEntityStellarRewinder && tileEntityStellarRewinder.canTeleport(itemstack)){ entityplayer.score -= cost; - Side side = ((TileEntityStellarRewinder) te).side(); + Side side = tileEntityStellarRewinder.side(); ((ITeleporter) entityplayer).moonsteel$teleport(destX + side.offsetX() + 0.5f, destY + side.offsetY(), destZ + side.offsetZ() + 0.5f); - ((TileEntityStellarRewinder) te).setInUse(false); + tileEntityStellarRewinder.setInUse(false); } else if (!world.isClientSide) { entityplayer.sendMessageTranslated("moonsteel.teleport.fail.missing"); } diff --git a/src/main/java/useless/moonsteel/mixin/backpack/PlayerLocalMixin.java b/src/main/java/useless/moonsteel/mixin/backpack/PlayerLocalMixin.java index 0a56088..f9d2e23 100644 --- a/src/main/java/useless/moonsteel/mixin/backpack/PlayerLocalMixin.java +++ b/src/main/java/useless/moonsteel/mixin/backpack/PlayerLocalMixin.java @@ -8,9 +8,11 @@ import org.spongepowered.asm.mixin.Shadow; import org.spongepowered.asm.mixin.Unique; import useless.moonsteel.backpack.GuiStarBackpack; +import useless.moonsteel.interfaces.IStarBackpack; +import useless.moonsteel.interfaces.ITeleporter; @Mixin(value = PlayerLocal.class, remap = false) -public class PlayerLocalMixin extends PlayerMixin { +public class PlayerLocalMixin extends PlayerMixin implements ITeleporter { @Shadow protected Minecraft mc; @Unique @@ -24,4 +26,10 @@ public PlayerLocalMixin(@Nullable World world) { public void moonsteel$displayGuiStarBackpack() { this.mc.displayScreen(new GuiStarBackpack(this.thisAs)); } + + + @Override + public void moonsteel$teleport(final double x, final double y, final double z) { + setPos(x, y + this.bbHeight, z); + } } diff --git a/src/main/resources/lang/moonsteel/en_US.lang b/src/main/resources/assets/moonsteel/lang/en_US/en_US.lang similarity index 100% rename from src/main/resources/lang/moonsteel/en_US.lang rename to src/main/resources/assets/moonsteel/lang/en_US/en_US.lang diff --git a/src/main/resources/lang/moonsteel/ru_RU.lang b/src/main/resources/assets/moonsteel/lang/ru_RU/ru_RU.lang similarity index 100% rename from src/main/resources/lang/moonsteel/ru_RU.lang rename to src/main/resources/assets/moonsteel/lang/ru_RU/ru_RU.lang diff --git a/src/main/resources/assets/moonsteel/textures/gui/sprites/hud/armor_bar/item/armor_boots_moonsteel/full.png b/src/main/resources/assets/moonsteel/textures/gui/sprites/hud/armor_bar/item/armor_boots_moonsteel/full.png new file mode 100644 index 0000000000000000000000000000000000000000..391be50e905ace55a2ba2df0f17cc27de5d74ae5 GIT binary patch literal 169 zcmeAS@N?(olHy`uVBq!ia0vp^oFL4>1|%O$WD@{VjKx9jP7LeL$-D$|l097t&BLv>)7StA^kzKyH=ps9UCIaf?)MuyAF?rINUQG;_qucx PXdQ#6tDnm{r-UW|U2Z%e literal 0 HcmV?d00001 diff --git a/src/main/resources/assets/moonsteel/textures/gui/sprites/hud/armor_bar/item/armor_boots_moonsteel/half.png b/src/main/resources/assets/moonsteel/textures/gui/sprites/hud/armor_bar/item/armor_boots_moonsteel/half.png new file mode 100644 index 0000000000000000000000000000000000000000..e7e12e23a54c6421e0820f798cabfdeaa33ffd57 GIT binary patch literal 168 zcmeAS@N?(olHy`uVBq!ia0vp^oFL4>1|%O$WD@{VjKx9jP7LeL$-D$|l001;LnNjq zCnzu(C~f@zcv5RPE@}0!Kzx<&G3LYQh6`8;AH{WcDJO+l2L>absoJk2l+Za4u L{an^LB{Ts5?Xx(N literal 0 HcmV?d00001 diff --git a/src/main/resources/assets/moonsteel/textures/gui/sprites/hud/armor_bar/item/armor_boots_moonsteel/half_flipped.png b/src/main/resources/assets/moonsteel/textures/gui/sprites/hud/armor_bar/item/armor_boots_moonsteel/half_flipped.png new file mode 100644 index 0000000000000000000000000000000000000000..4a850b8b4ee812621c456e69c6bb91ba655e118f GIT binary patch literal 171 zcmeAS@N?(olHy`uVBq!ia0vp^oFL4>1|%O$WD@{VjKx9jP7LeL$-D$|QaxQ9LnNm5 z_HX2EFc4tY7o2_JkD897qw7h7k^senLN`@d&m^r{z#-JRdd>E=(;u?yU0(Imj`a+W zF>}HUrb+V_>2G0-=zo3jYCxa=`g=XKr#H=K$SP7k#_?d=PT>~+z}C{G(Q~DZK1d!p Tu2!E8w2;Bm)z4*}Q$iB};#@nk literal 0 HcmV?d00001 diff --git a/src/main/resources/assets/moonsteel/textures/gui/sprites/hud/armor_bar/item/armor_chestplate_moonsteel/full.png b/src/main/resources/assets/moonsteel/textures/gui/sprites/hud/armor_bar/item/armor_chestplate_moonsteel/full.png new file mode 100644 index 0000000000000000000000000000000000000000..409f32590f97a05dcea6bd7b77a1bc8438b7fb03 GIT binary patch literal 166 zcmeAS@N?(olHy`uVBq!ia0vp^oFL4>1|%O$WD@{VjKx9jP7LeL$-D$|5)%>eGOVAW( O7lWs(pUXO@geCyAD?EAt literal 0 HcmV?d00001 diff --git a/src/main/resources/assets/moonsteel/textures/gui/sprites/hud/armor_bar/item/armor_chestplate_moonsteel/half.png b/src/main/resources/assets/moonsteel/textures/gui/sprites/hud/armor_bar/item/armor_chestplate_moonsteel/half.png new file mode 100644 index 0000000000000000000000000000000000000000..b90b9e3f00786d242e51e165693a29f73124d8d2 GIT binary patch literal 170 zcmeAS@N?(olHy`uVBq!ia0vp^oFL4>1|%O$WD@{VjKx9jP7LeL$-D$|QaoK8LnNlQ zPB_TfV8G)V-+VYl`1|K&>W<|fA28W&*?gqglx5;Cg%2nHt0)#EuT{DyeBew^rFP4L zm0GK~5|}o;5k1g+wuI$@g|;n=$7_?iS(fPyDt847@5&!mt}0);;C_A4f2K`OWoHFO SACLgr$KdJe=d#Wzp$Pz|Aw7Bk literal 0 HcmV?d00001 diff --git a/src/main/resources/assets/moonsteel/textures/gui/sprites/hud/armor_bar/item/armor_chestplate_moonsteel/half_flipped.png b/src/main/resources/assets/moonsteel/textures/gui/sprites/hud/armor_bar/item/armor_chestplate_moonsteel/half_flipped.png new file mode 100644 index 0000000000000000000000000000000000000000..e5e6a00424b7e7d9ffa292691bbb6cff006a9954 GIT binary patch literal 169 zcmeAS@N?(olHy`uVBq!ia0vp^oFL4>1|%O$WD@{VjKx9jP7LeL$-D$|l097fV!Oa;T6$B=Eb2JL?JrtZRyFjU_ z$_1+!Zv6}tPS#@ZIo+50E9GvU=94+`ODkm1|%O$WD@{VjKx9jP7LeL$-D$|B0OCjLnNjq zCnzu(C~f@zcv8FOumAt;UCypiEq|zWDLGUE1SAu=Ca5Mp`0;W#54YM*;|&V0+g_z4 z0D;Ge+nnjf3nh8kf#S(pN^F0QKeEnA+QG>1!cgWD)80xOpdAdJu6{1-oD!M<^kXw( literal 0 HcmV?d00001 diff --git a/src/main/resources/assets/moonsteel/textures/gui/sprites/hud/armor_bar/item/armor_helmet_moonsteel/half.png b/src/main/resources/assets/moonsteel/textures/gui/sprites/hud/armor_bar/item/armor_helmet_moonsteel/half.png new file mode 100644 index 0000000000000000000000000000000000000000..7e532ff2ef4d753634bce93e26c7fbb34f8cc71c GIT binary patch literal 158 zcmeAS@N?(olHy`uVBq!ia0vp^oFL4>1|%O$WD@{VjKx9jP7LeL$-D$|B0OCjLnNk7 z?Kk9VaNuE4Z};DLV)>fClehNYI=20YQxVG^=DArX`M4YTBTgE=4({qWZfJZ*mcf%@ z+meDg*Rzk^ohZWl;?Taer3)_`EtwFq@nf?@jrp##I~iFI%S&0BOp^iH!QkoY=d#Wz Gp$Pz}dN*1C literal 0 HcmV?d00001 diff --git a/src/main/resources/assets/moonsteel/textures/gui/sprites/hud/armor_bar/item/armor_helmet_moonsteel/half_flipped.png b/src/main/resources/assets/moonsteel/textures/gui/sprites/hud/armor_bar/item/armor_helmet_moonsteel/half_flipped.png new file mode 100644 index 0000000000000000000000000000000000000000..0b1db17d2b1e9e2de9b53f000ac7417d7324a120 GIT binary patch literal 157 zcmeAS@N?(olHy`uVBq!ia0vp^oFL4>1|%O$WD@{VjKx9jP7LeL$-D$|!aZFaLnNm5 zp5MrOK!Jz#qVXvW%?K@1>!s%c@{CUVH|osfP+7O>Los7cO6IjJd5^7O40mK#R&UPh z<5~2(^7qn~nJb?x-OYSqUGagZ{EHfxZ+T9>fA-$B+EdG9rZVYVe+smM!PC{xWt~$( F697I-IVu1E literal 0 HcmV?d00001 diff --git a/src/main/resources/assets/moonsteel/textures/gui/sprites/hud/armor_bar/item/armor_leggings_moonsteel/full.png b/src/main/resources/assets/moonsteel/textures/gui/sprites/hud/armor_bar/item/armor_leggings_moonsteel/full.png new file mode 100644 index 0000000000000000000000000000000000000000..ce95003c699e4e5a50084bf119359345da0d3a15 GIT binary patch literal 154 zcmeAS@N?(olHy`uVBq!ia0vp^oFL4>1|%O$WD@{VjKx9jP7LeL$-D$|LOfj@LnNjq zr#LkH=b6zku@MM3mp%CZ|38m`P4P$Bww66}3wm`<+)C5k*?rWY#gk|Av^%L5b-(nS ztJZMkx&C0_6_K^?Eif^f%_zo~k$9xz96Q6yUO6Ex(Ixso^BFu{{an^LB{Ts5$>TD~ literal 0 HcmV?d00001 diff --git a/src/main/resources/assets/moonsteel/textures/gui/sprites/hud/armor_bar/item/armor_leggings_moonsteel/half.png b/src/main/resources/assets/moonsteel/textures/gui/sprites/hud/armor_bar/item/armor_leggings_moonsteel/half.png new file mode 100644 index 0000000000000000000000000000000000000000..c1d308d529c5706cf1bfb99d067c560082ed414e GIT binary patch literal 154 zcmeAS@N?(olHy`uVBq!ia0vp^oFL4>1|%O$WD@{VjKx9jP7LeL$-D$|LOfj@LnNjq zr#LkH=b6zku@MM3mp%CZ|38nxnF9w7ELgaZ@%o9THM!R&?T+Aao^iw=`($j}ljSL+%lYFV6Ee<^s)U@O1TaS?83{1OOf4 BI-~#q literal 0 HcmV?d00001 diff --git a/src/main/resources/assets/moonsteel/textures/gui/sprites/hud/armor_bar/item/armor_leggings_moonsteel/half_flipped.png b/src/main/resources/assets/moonsteel/textures/gui/sprites/hud/armor_bar/item/armor_leggings_moonsteel/half_flipped.png new file mode 100644 index 0000000000000000000000000000000000000000..1254f2a9e291c304d0d0eee83d1ecfdf741a4ce8 GIT binary patch literal 151 zcmeAS@N?(olHy`uVBq!ia0vp^oFL4>1|%O$WD@{VjKx9jP7LeL$-D$|0zF+ELnNjq zr#LkH=b6zku@MM3mpM2)Gavf#U%oFFVdQ&MBb@0PejqOaK4? literal 0 HcmV?d00001 diff --git a/src/main/resources/fabric.mod.json b/src/main/resources/fabric.mod.json index 2449953..f384a73 100644 --- a/src/main/resources/fabric.mod.json +++ b/src/main/resources/fabric.mod.json @@ -9,7 +9,8 @@ "Useless" ], "contributors": [ - "BigJango" + "BigJango", + "Redart15" ], "contact": { "homepage": "https://github.com/UselessSolutions/moonmoonmoon", @@ -21,38 +22,20 @@ "environment": "*", "entrypoints": { - "main": [ - "useless.moonsteel.MoonSteel" - ], - "beforeGameStart": [ - "useless.moonsteel.MoonSteel" - ], - "afterGameStart": [ - "useless.moonsteel.MoonSteel" - ], - "recipesReady": [ - "useless.moonsteel.MoonSteelRecipes" - ], - "beforeClientStart": [ - "useless.moonsteel.MoonSteelClient" - ], - "afterClientStart": [ - "useless.moonsteel.MoonSteelClient" - ], - "initModels": [ - "useless.moonsteel.MoonSteelModels" - ] + "main": ["useless.moonsteel.MoonSteel"], + "client": ["useless.moonsteel.MoonSteelClient"] }, "mixins": [ "moonsteel.mixins.json" ], "depends": { - "minecraft": "~7.3", - "fabricloader": ">=0.13.3", - "halplibe": ">=5.2.0" - }, + "fabricloader": ">=${fabricloader}", + "halplibe": ">=${halplibe}", + "minecraft": "*", + "java": ">=${java}" + }, "suggests": { - "betterwithbackpacks": ">=1.1.10" + "betterwithbackpacks": ">=1.2.0-8.0" } } From bfef473ef63e6403ff2815140e840c3e06c65ac2 Mon Sep 17 00:00:00 2001 From: Redart15 Date: Sun, 6 Sep 2026 23:27:32 +0200 Subject: [PATCH 04/13] got rewinder to work. --- build.gradle.kts | 3 +- .../mixin/{backpack => }/MinecraftMixin.java | 0 .../{backpack => }/PlayerLocalMixin.java | 10 +--- .../mixin/{backpack => }/PlayerMixin.java | 21 ++++---- .../moonsteel/mixin/PlayerServerMixin.java | 48 +++++++++++++++++++ .../mixin/backpack/PlayerServerMixin.java | 8 ++-- 6 files changed, 63 insertions(+), 27 deletions(-) rename src/main/java/useless/moonsteel/mixin/{backpack => }/MinecraftMixin.java (100%) rename src/main/java/useless/moonsteel/mixin/{backpack => }/PlayerLocalMixin.java (70%) rename src/main/java/useless/moonsteel/mixin/{backpack => }/PlayerMixin.java (97%) create mode 100644 src/main/java/useless/moonsteel/mixin/PlayerServerMixin.java diff --git a/build.gradle.kts b/build.gradle.kts index 8dc526f..bd455fa 100644 --- a/build.gradle.kts +++ b/build.gradle.kts @@ -1,4 +1,4 @@ -plugins { + plugins { alias(libs.plugins.loom) java } @@ -44,7 +44,6 @@ dependencies { implementation(libs.loader) implementation(libs.halplibe) // If you do not need halplibe you can delete this line -// implementation("useless:btabackpacks:1.1.10-7.3_03") compileOnly(libs.btabackpacks) // Only required at compilation diff --git a/src/main/java/useless/moonsteel/mixin/backpack/MinecraftMixin.java b/src/main/java/useless/moonsteel/mixin/MinecraftMixin.java similarity index 100% rename from src/main/java/useless/moonsteel/mixin/backpack/MinecraftMixin.java rename to src/main/java/useless/moonsteel/mixin/MinecraftMixin.java diff --git a/src/main/java/useless/moonsteel/mixin/backpack/PlayerLocalMixin.java b/src/main/java/useless/moonsteel/mixin/PlayerLocalMixin.java similarity index 70% rename from src/main/java/useless/moonsteel/mixin/backpack/PlayerLocalMixin.java rename to src/main/java/useless/moonsteel/mixin/PlayerLocalMixin.java index f9d2e23..0a56088 100644 --- a/src/main/java/useless/moonsteel/mixin/backpack/PlayerLocalMixin.java +++ b/src/main/java/useless/moonsteel/mixin/PlayerLocalMixin.java @@ -8,11 +8,9 @@ import org.spongepowered.asm.mixin.Shadow; import org.spongepowered.asm.mixin.Unique; import useless.moonsteel.backpack.GuiStarBackpack; -import useless.moonsteel.interfaces.IStarBackpack; -import useless.moonsteel.interfaces.ITeleporter; @Mixin(value = PlayerLocal.class, remap = false) -public class PlayerLocalMixin extends PlayerMixin implements ITeleporter { +public class PlayerLocalMixin extends PlayerMixin { @Shadow protected Minecraft mc; @Unique @@ -26,10 +24,4 @@ public PlayerLocalMixin(@Nullable World world) { public void moonsteel$displayGuiStarBackpack() { this.mc.displayScreen(new GuiStarBackpack(this.thisAs)); } - - - @Override - public void moonsteel$teleport(final double x, final double y, final double z) { - setPos(x, y + this.bbHeight, z); - } } diff --git a/src/main/java/useless/moonsteel/mixin/backpack/PlayerMixin.java b/src/main/java/useless/moonsteel/mixin/PlayerMixin.java similarity index 97% rename from src/main/java/useless/moonsteel/mixin/backpack/PlayerMixin.java rename to src/main/java/useless/moonsteel/mixin/PlayerMixin.java index a42f841..4ec65a8 100644 --- a/src/main/java/useless/moonsteel/mixin/backpack/PlayerMixin.java +++ b/src/main/java/useless/moonsteel/mixin/PlayerMixin.java @@ -5,7 +5,6 @@ import net.minecraft.core.entity.Mob; import net.minecraft.core.entity.player.Player; import net.minecraft.core.world.World; -import org.jetbrains.annotations.Nullable; import org.spongepowered.asm.mixin.Mixin; import org.spongepowered.asm.mixin.Unique; import org.spongepowered.asm.mixin.injection.At; @@ -24,6 +23,15 @@ protected PlayerMixin(final World world) { super(world); } + @Override + public void moonsteel$displayGuiStarBackpack() { + + } + + @Override + public void moonsteel$teleport(final double x, final double y, final double z) { + setPos(x, y + this.bbHeight, z); + } @Inject(method = "(Lnet/minecraft/core/world/World;)V", at = @At("TAIL")) private void createBackpack(final World world, final CallbackInfo ci){ this.starBackpackInventory = new StarBackpackInventory((Player) (Object)this); @@ -36,6 +44,7 @@ private void addData(final CompoundTag tag, final CallbackInfo ci){ private void loadData(final CompoundTag tag, final CallbackInfo ci){ this.starBackpackInventory.readFromNBT(tag.getList("moonsteel$InventoryStardust")); } + @Override public StarBackpackInventory moonsteel$getStarBackpackInventory() { return this.starBackpackInventory; @@ -45,14 +54,4 @@ private void loadData(final CompoundTag tag, final CallbackInfo ci){ public void moonsteel$setStarBackpackInventory(final StarBackpackInventory backpackInventory) { this.starBackpackInventory = backpackInventory; } - - @Override - public void moonsteel$displayGuiStarBackpack() { - - } - - @Override - public void moonsteel$teleport(final double x, final double y, final double z) { - setPos(x, y + this.bbHeight, z); - } } diff --git a/src/main/java/useless/moonsteel/mixin/PlayerServerMixin.java b/src/main/java/useless/moonsteel/mixin/PlayerServerMixin.java new file mode 100644 index 0000000..d84caee --- /dev/null +++ b/src/main/java/useless/moonsteel/mixin/PlayerServerMixin.java @@ -0,0 +1,48 @@ +package useless.moonsteel.mixin.backpack; + +import net.minecraft.core.net.packet.PacketContainerOpen; +import net.minecraft.core.world.World; +import net.minecraft.server.entity.player.PlayerServer; +import net.minecraft.server.net.handler.PacketHandlerServer; +import org.jetbrains.annotations.Nullable; +import org.spongepowered.asm.mixin.Mixin; +import org.spongepowered.asm.mixin.Shadow; +import org.spongepowered.asm.mixin.Unique; +import useless.moonsteel.ContainerStarBackpack; +import useless.moonsteel.MoonSteel; + +@Mixin(value = PlayerServer.class, remap = false) +public abstract class PlayerServerMixin extends PlayerMixin { + protected PlayerServerMixin(@Nullable World world) { + super(world); + } + + @Shadow + protected abstract void getNextWindowId(); + + @Shadow + private int currentWindowId; + @Shadow + public PacketHandlerServer playerNetServerHandler; + @Unique + public PlayerServer thisAs = (PlayerServer) (Object)this; + + @Override + public void moonsteel$displayGuiStarBackpack() { + this.getNextWindowId(); + ContainerStarBackpack backpack = new ContainerStarBackpack(thisAs); + this.thisAs + .playerNetServerHandler + .sendPacket( + new PacketContainerOpen(this.currentWindowId, MoonSteel.GUI_ID, "moonsteel$StarBackpack", backpack.backpackInventory.getContainerSize()) + ); + this.thisAs.containerMenu = backpack; + this.thisAs.containerMenu.containerId = this.currentWindowId; + this.thisAs.containerMenu.addSlotListener(this.thisAs); + } + + @Override + public void moonsteel$teleport(final double x, final double y, final double z) { + this.playerNetServerHandler.teleport(x, y, z); + } +} diff --git a/src/main/java/useless/moonsteel/mixin/backpack/PlayerServerMixin.java b/src/main/java/useless/moonsteel/mixin/backpack/PlayerServerMixin.java index d84caee..0d663eb 100644 --- a/src/main/java/useless/moonsteel/mixin/backpack/PlayerServerMixin.java +++ b/src/main/java/useless/moonsteel/mixin/backpack/PlayerServerMixin.java @@ -1,4 +1,4 @@ -package useless.moonsteel.mixin.backpack; +package useless.moonsteel.mixin; import net.minecraft.core.net.packet.PacketContainerOpen; import net.minecraft.core.world.World; @@ -10,6 +10,7 @@ import org.spongepowered.asm.mixin.Unique; import useless.moonsteel.ContainerStarBackpack; import useless.moonsteel.MoonSteel; +import useless.moonsteel.mixin.backpack.PlayerMixin; @Mixin(value = PlayerServer.class, remap = false) public abstract class PlayerServerMixin extends PlayerMixin { @@ -41,8 +42,5 @@ protected PlayerServerMixin(@Nullable World world) { this.thisAs.containerMenu.addSlotListener(this.thisAs); } - @Override - public void moonsteel$teleport(final double x, final double y, final double z) { - this.playerNetServerHandler.teleport(x, y, z); - } + } From 93d73abe93db586acb22479a1f99c677f221a1fd Mon Sep 17 00:00:00 2001 From: Redart15 Date: Sun, 6 Sep 2026 23:28:02 +0200 Subject: [PATCH 05/13] back pack fixed --- .../useless/moonsteel/MoonSteelModels.java | 7 ++- .../moonsteel/mixin/PlayerServerMixin.java | 48 ------------------- ...=> WorldFeatureLabyrinthMixinRewards.java} | 2 +- .../mixin/{entity => armor}/MobMixin.java | 2 +- .../MobRenderZombieArmoredMixin.java | 2 +- .../MobZombieArmoredMixin.java | 2 +- .../PlayerMixinEquipment.java} | 5 +- .../MinecraftMixinRespawn.java} | 2 +- .../PacketHandlerClientMixinGui.java} | 4 +- .../PlayerListMixinRespawn.java} | 4 +- .../PlayerLocalMixinGui.java} | 4 +- .../mixin/{ => backpack}/PlayerMixin.java | 7 +-- .../mixin/backpack/PlayerServerMixin.java | 6 +-- .../ChunkProviderServerMixin.java | 2 +- .../ChunkProviderStaticMixin.java | 3 +- .../mixin/{ => fortune}/BlockLogicMixin.java | 2 +- .../EntityItemMixin.java | 2 +- .../WorldMixinStarFall.java} | 11 ++--- .../mixin/stella/PlayerMixinStella.java | 22 +++++++++ .../mixin/stella/PlayerServerMixinStella.java | 24 ++++++++++ src/main/resources/moonsteel.mixins.json | 37 +++++++------- 21 files changed, 95 insertions(+), 103 deletions(-) delete mode 100644 src/main/java/useless/moonsteel/mixin/PlayerServerMixin.java rename src/main/java/useless/moonsteel/mixin/{WorldFeatureLabyrinthMixin.java => WorldFeatureLabyrinthMixinRewards.java} (95%) rename src/main/java/useless/moonsteel/mixin/{entity => armor}/MobMixin.java (98%) rename src/main/java/useless/moonsteel/mixin/{ => armor}/MobRenderZombieArmoredMixin.java (97%) rename src/main/java/useless/moonsteel/mixin/{entity => armor}/MobZombieArmoredMixin.java (98%) rename src/main/java/useless/moonsteel/mixin/{entity/PlayerMixin.java => armor/PlayerMixinEquipment.java} (90%) rename src/main/java/useless/moonsteel/mixin/{MinecraftMixin.java => backpack/MinecraftMixinRespawn.java} (96%) rename src/main/java/useless/moonsteel/mixin/{PacketHandlerClientMixin.java => backpack/PacketHandlerClientMixinGui.java} (91%) rename src/main/java/useless/moonsteel/mixin/{PlayerListMixin.java => backpack/PlayerListMixinRespawn.java} (92%) rename src/main/java/useless/moonsteel/mixin/{PlayerLocalMixin.java => backpack/PlayerLocalMixinGui.java} (86%) rename src/main/java/useless/moonsteel/mixin/{ => backpack}/PlayerMixin.java (90%) rename src/main/java/useless/moonsteel/mixin/{ => chunkprovider}/ChunkProviderServerMixin.java (94%) rename src/main/java/useless/moonsteel/mixin/{ => chunkprovider}/ChunkProviderStaticMixin.java (87%) rename src/main/java/useless/moonsteel/mixin/{ => fortune}/BlockLogicMixin.java (98%) rename src/main/java/useless/moonsteel/mixin/{entity => starfallen}/EntityItemMixin.java (98%) rename src/main/java/useless/moonsteel/mixin/{WorldMixin.java => starfallen/WorldMixinStarFall.java} (86%) create mode 100644 src/main/java/useless/moonsteel/mixin/stella/PlayerMixinStella.java create mode 100644 src/main/java/useless/moonsteel/mixin/stella/PlayerServerMixinStella.java diff --git a/src/main/java/useless/moonsteel/MoonSteelModels.java b/src/main/java/useless/moonsteel/MoonSteelModels.java index 372599a..14e36be 100644 --- a/src/main/java/useless/moonsteel/MoonSteelModels.java +++ b/src/main/java/useless/moonsteel/MoonSteelModels.java @@ -2,6 +2,7 @@ import net.minecraft.client.render.block.model.BlockModelDispatcher; import net.minecraft.client.render.block.model.BlockModelStandard; +import net.minecraft.client.render.block.model.generic.BlockModelGeneric; import net.minecraft.client.render.block.model.generic.BlockModelGenericTorch; import net.minecraft.client.render.item.model.ItemModelDispatcher; import net.minecraft.client.render.item.model.ItemModelStandard; @@ -13,6 +14,7 @@ import useless.moonsteel.block.BlockModelStellarRewinder; import useless.moonsteel.item.ItemModelConnectStar; +import static net.minecraft.client.render.block.model.BlockModelDispatcher.loadDataModel; import static net.minecraft.client.render.item.model.ItemModelDispatcher.*; import static useless.moonsteel.MoonSteel.MOD_ID; @@ -23,13 +25,14 @@ public static void initBlockModels(final BlockModelDispatcher dispatcher) { final Side[] S_TB = {Side.TOP, Side.BOTTOM}; final Side[] S_SIDES = {Side.NORTH, Side.EAST, Side.SOUTH, Side.WEST}; //TODO replace with BlockModelGeneric - dispatcher.addDispatch(new BlockModelStandard<>(MoonSteelBlocks.BLOCK_MOONSTEEL)); + dispatcher.addDispatch(new BlockModelGeneric<>(MoonSteelBlocks.BLOCK_MOONSTEEL, loadDataModel(MOD_ID + "block/moonsteel"))); +// dispatcher.addDispatch(new BlockModelStandard<>(MoonSteelBlocks.BLOCK_MOONSTEEL)) // .setTex(BlockModelStandard.BLOCK_TEXTURES, MOD_ID + ":block/moonsteel_block_side", S_SIDES) // .setTex(BlockModelStandard.BLOCK_TEXTURES, MOD_ID + ":block/moonsteel_block_top", Side.TOP) // .setTex(BlockModelStandard.BLOCK_TEXTURES, MOD_ID + ":block/moonsteel_block_bottom", Side.BOTTOM)); // TODO especialy for this, replace the key - dispatcher.addDispatch(new BlockModelGenericTorch<>(MoonSteelBlocks.TORCH_STAR, "")); + dispatcher.addDispatch(new BlockModelGenericTorch<>(MoonSteelBlocks.TORCH_STAR, MOD_ID + ":block/start_torch")); // .setAllTextures(BlockModelStandard.BLOCK_TEXTURES, MOD_ID + ":block/startorch")); // TODO relace this by a generic model diff --git a/src/main/java/useless/moonsteel/mixin/PlayerServerMixin.java b/src/main/java/useless/moonsteel/mixin/PlayerServerMixin.java deleted file mode 100644 index d84caee..0000000 --- a/src/main/java/useless/moonsteel/mixin/PlayerServerMixin.java +++ /dev/null @@ -1,48 +0,0 @@ -package useless.moonsteel.mixin.backpack; - -import net.minecraft.core.net.packet.PacketContainerOpen; -import net.minecraft.core.world.World; -import net.minecraft.server.entity.player.PlayerServer; -import net.minecraft.server.net.handler.PacketHandlerServer; -import org.jetbrains.annotations.Nullable; -import org.spongepowered.asm.mixin.Mixin; -import org.spongepowered.asm.mixin.Shadow; -import org.spongepowered.asm.mixin.Unique; -import useless.moonsteel.ContainerStarBackpack; -import useless.moonsteel.MoonSteel; - -@Mixin(value = PlayerServer.class, remap = false) -public abstract class PlayerServerMixin extends PlayerMixin { - protected PlayerServerMixin(@Nullable World world) { - super(world); - } - - @Shadow - protected abstract void getNextWindowId(); - - @Shadow - private int currentWindowId; - @Shadow - public PacketHandlerServer playerNetServerHandler; - @Unique - public PlayerServer thisAs = (PlayerServer) (Object)this; - - @Override - public void moonsteel$displayGuiStarBackpack() { - this.getNextWindowId(); - ContainerStarBackpack backpack = new ContainerStarBackpack(thisAs); - this.thisAs - .playerNetServerHandler - .sendPacket( - new PacketContainerOpen(this.currentWindowId, MoonSteel.GUI_ID, "moonsteel$StarBackpack", backpack.backpackInventory.getContainerSize()) - ); - this.thisAs.containerMenu = backpack; - this.thisAs.containerMenu.containerId = this.currentWindowId; - this.thisAs.containerMenu.addSlotListener(this.thisAs); - } - - @Override - public void moonsteel$teleport(final double x, final double y, final double z) { - this.playerNetServerHandler.teleport(x, y, z); - } -} diff --git a/src/main/java/useless/moonsteel/mixin/WorldFeatureLabyrinthMixin.java b/src/main/java/useless/moonsteel/mixin/WorldFeatureLabyrinthMixinRewards.java similarity index 95% rename from src/main/java/useless/moonsteel/mixin/WorldFeatureLabyrinthMixin.java rename to src/main/java/useless/moonsteel/mixin/WorldFeatureLabyrinthMixinRewards.java index 4817d34..70ca34f 100644 --- a/src/main/java/useless/moonsteel/mixin/WorldFeatureLabyrinthMixin.java +++ b/src/main/java/useless/moonsteel/mixin/WorldFeatureLabyrinthMixinRewards.java @@ -14,7 +14,7 @@ import java.util.Random; @Mixin(value = WorldFeatureLabyrinth.class, remap = false) -public class WorldFeatureLabyrinthMixin { +public class WorldFeatureLabyrinthMixinRewards { @Shadow public WeightedRandomBag chestLoot; diff --git a/src/main/java/useless/moonsteel/mixin/entity/MobMixin.java b/src/main/java/useless/moonsteel/mixin/armor/MobMixin.java similarity index 98% rename from src/main/java/useless/moonsteel/mixin/entity/MobMixin.java rename to src/main/java/useless/moonsteel/mixin/armor/MobMixin.java index 69c7cce..0f95cd2 100644 --- a/src/main/java/useless/moonsteel/mixin/entity/MobMixin.java +++ b/src/main/java/useless/moonsteel/mixin/armor/MobMixin.java @@ -1,4 +1,4 @@ -package useless.moonsteel.mixin.entity; +package useless.moonsteel.mixin.armor; import net.minecraft.core.entity.Entity; import net.minecraft.core.entity.Mob; diff --git a/src/main/java/useless/moonsteel/mixin/MobRenderZombieArmoredMixin.java b/src/main/java/useless/moonsteel/mixin/armor/MobRenderZombieArmoredMixin.java similarity index 97% rename from src/main/java/useless/moonsteel/mixin/MobRenderZombieArmoredMixin.java rename to src/main/java/useless/moonsteel/mixin/armor/MobRenderZombieArmoredMixin.java index 19ac118..509329f 100644 --- a/src/main/java/useless/moonsteel/mixin/MobRenderZombieArmoredMixin.java +++ b/src/main/java/useless/moonsteel/mixin/armor/MobRenderZombieArmoredMixin.java @@ -1,4 +1,4 @@ -package useless.moonsteel.mixin; +package useless.moonsteel.mixin.armor; import net.minecraft.client.Minecraft; import net.minecraft.client.render.TextureManager; diff --git a/src/main/java/useless/moonsteel/mixin/entity/MobZombieArmoredMixin.java b/src/main/java/useless/moonsteel/mixin/armor/MobZombieArmoredMixin.java similarity index 98% rename from src/main/java/useless/moonsteel/mixin/entity/MobZombieArmoredMixin.java rename to src/main/java/useless/moonsteel/mixin/armor/MobZombieArmoredMixin.java index e6cfaaf..1fc9885 100644 --- a/src/main/java/useless/moonsteel/mixin/entity/MobZombieArmoredMixin.java +++ b/src/main/java/useless/moonsteel/mixin/armor/MobZombieArmoredMixin.java @@ -1,4 +1,4 @@ -package useless.moonsteel.mixin.entity; +package useless.moonsteel.mixin.armor; import com.mojang.nbt.tags.CompoundTag; import net.minecraft.core.entity.EntityItem; diff --git a/src/main/java/useless/moonsteel/mixin/entity/PlayerMixin.java b/src/main/java/useless/moonsteel/mixin/armor/PlayerMixinEquipment.java similarity index 90% rename from src/main/java/useless/moonsteel/mixin/entity/PlayerMixin.java rename to src/main/java/useless/moonsteel/mixin/armor/PlayerMixinEquipment.java index 4006f0a..fc3efea 100644 --- a/src/main/java/useless/moonsteel/mixin/entity/PlayerMixin.java +++ b/src/main/java/useless/moonsteel/mixin/armor/PlayerMixinEquipment.java @@ -1,8 +1,7 @@ -package useless.moonsteel.mixin.entity; +package useless.moonsteel.mixin.armor; import net.minecraft.core.entity.player.Player; import net.minecraft.core.enums.HumanArmorShape; -import net.minecraft.core.item.IArmorItem; import net.minecraft.core.player.inventory.container.ContainerInventory; import org.spongepowered.asm.mixin.Mixin; import org.spongepowered.asm.mixin.Shadow; @@ -10,7 +9,7 @@ import useless.moonsteel.interfaces.IMoonGrav; @Mixin(value = Player.class, remap = false) -public class PlayerMixin implements IMoonGrav { +public class PlayerMixinEquipment implements IMoonGrav { @Shadow public ContainerInventory inventory; diff --git a/src/main/java/useless/moonsteel/mixin/MinecraftMixin.java b/src/main/java/useless/moonsteel/mixin/backpack/MinecraftMixinRespawn.java similarity index 96% rename from src/main/java/useless/moonsteel/mixin/MinecraftMixin.java rename to src/main/java/useless/moonsteel/mixin/backpack/MinecraftMixinRespawn.java index 9b2b4be..783ad68 100644 --- a/src/main/java/useless/moonsteel/mixin/MinecraftMixin.java +++ b/src/main/java/useless/moonsteel/mixin/backpack/MinecraftMixinRespawn.java @@ -12,7 +12,7 @@ import useless.moonsteel.interfaces.IStarBackpack; @Mixin(value = Minecraft.class, remap = false) -public class MinecraftMixin { +public class MinecraftMixinRespawn { @Shadow public PlayerLocal thePlayer; diff --git a/src/main/java/useless/moonsteel/mixin/PacketHandlerClientMixin.java b/src/main/java/useless/moonsteel/mixin/backpack/PacketHandlerClientMixinGui.java similarity index 91% rename from src/main/java/useless/moonsteel/mixin/PacketHandlerClientMixin.java rename to src/main/java/useless/moonsteel/mixin/backpack/PacketHandlerClientMixinGui.java index e0c6f04..79afa31 100644 --- a/src/main/java/useless/moonsteel/mixin/PacketHandlerClientMixin.java +++ b/src/main/java/useless/moonsteel/mixin/backpack/PacketHandlerClientMixinGui.java @@ -1,4 +1,4 @@ -package useless.moonsteel.mixin; +package useless.moonsteel.mixin.backpack; import net.minecraft.client.Minecraft; import net.minecraft.client.net.handler.PacketHandlerClient; @@ -13,7 +13,7 @@ import useless.moonsteel.interfaces.IStarBackpack; @Mixin(value= PacketHandlerClient.class,remap = false) -public abstract class PacketHandlerClientMixin { +public abstract class PacketHandlerClientMixinGui { @Final @Shadow private Minecraft mc; diff --git a/src/main/java/useless/moonsteel/mixin/PlayerListMixin.java b/src/main/java/useless/moonsteel/mixin/backpack/PlayerListMixinRespawn.java similarity index 92% rename from src/main/java/useless/moonsteel/mixin/PlayerListMixin.java rename to src/main/java/useless/moonsteel/mixin/backpack/PlayerListMixinRespawn.java index ce6c351..f17f196 100644 --- a/src/main/java/useless/moonsteel/mixin/PlayerListMixin.java +++ b/src/main/java/useless/moonsteel/mixin/backpack/PlayerListMixinRespawn.java @@ -1,4 +1,4 @@ -package useless.moonsteel.mixin; +package useless.moonsteel.mixin.backpack; import com.llamalad7.mixinextras.sugar.Local; import net.minecraft.server.entity.player.PlayerServer; @@ -10,7 +10,7 @@ import useless.moonsteel.interfaces.IStarBackpack; @Mixin(value = PlayerList.class, remap = false) -public class PlayerListMixin { +public class PlayerListMixinRespawn { @Inject(method = "recreatePlayerEntity", at = @At(value = "INVOKE", target = "Lnet/minecraft/core/player/inventory/container/ContainerInventory;transferAllContents(Lnet/minecraft/core/player/inventory/container/ContainerInventory;)V", shift = At.Shift.AFTER)) public void keepBackpackMP(final PlayerServer previousPlayer, final int i, final CallbackInfoReturnable cir, @Local(name = "newPlayer") final PlayerServer newPlayer){ ((IStarBackpack)newPlayer).moonsteel$setStarBackpackInventory(((IStarBackpack)previousPlayer).moonsteel$getStarBackpackInventory()); diff --git a/src/main/java/useless/moonsteel/mixin/PlayerLocalMixin.java b/src/main/java/useless/moonsteel/mixin/backpack/PlayerLocalMixinGui.java similarity index 86% rename from src/main/java/useless/moonsteel/mixin/PlayerLocalMixin.java rename to src/main/java/useless/moonsteel/mixin/backpack/PlayerLocalMixinGui.java index 0a56088..fec9fc5 100644 --- a/src/main/java/useless/moonsteel/mixin/PlayerLocalMixin.java +++ b/src/main/java/useless/moonsteel/mixin/backpack/PlayerLocalMixinGui.java @@ -10,13 +10,13 @@ import useless.moonsteel.backpack.GuiStarBackpack; @Mixin(value = PlayerLocal.class, remap = false) -public class PlayerLocalMixin extends PlayerMixin { +public class PlayerLocalMixinGui extends PlayerMixin { @Shadow protected Minecraft mc; @Unique public PlayerLocal thisAs = (PlayerLocal) (Object)this; - public PlayerLocalMixin(@Nullable World world) { + public PlayerLocalMixinGui(@Nullable World world) { super(world); } diff --git a/src/main/java/useless/moonsteel/mixin/PlayerMixin.java b/src/main/java/useless/moonsteel/mixin/backpack/PlayerMixin.java similarity index 90% rename from src/main/java/useless/moonsteel/mixin/PlayerMixin.java rename to src/main/java/useless/moonsteel/mixin/backpack/PlayerMixin.java index 4ec65a8..3a1abf3 100644 --- a/src/main/java/useless/moonsteel/mixin/PlayerMixin.java +++ b/src/main/java/useless/moonsteel/mixin/backpack/PlayerMixin.java @@ -12,10 +12,9 @@ import org.spongepowered.asm.mixin.injection.callback.CallbackInfo; import useless.moonsteel.backpack.StarBackpackInventory; import useless.moonsteel.interfaces.IStarBackpack; -import useless.moonsteel.interfaces.ITeleporter; @Mixin(value = Player.class, remap = false) -public abstract class PlayerMixin extends Mob implements IStarBackpack, ITeleporter { +public abstract class PlayerMixin extends Mob implements IStarBackpack { @Unique public StarBackpackInventory starBackpackInventory; @@ -28,10 +27,6 @@ protected PlayerMixin(final World world) { } - @Override - public void moonsteel$teleport(final double x, final double y, final double z) { - setPos(x, y + this.bbHeight, z); - } @Inject(method = "(Lnet/minecraft/core/world/World;)V", at = @At("TAIL")) private void createBackpack(final World world, final CallbackInfo ci){ this.starBackpackInventory = new StarBackpackInventory((Player) (Object)this); diff --git a/src/main/java/useless/moonsteel/mixin/backpack/PlayerServerMixin.java b/src/main/java/useless/moonsteel/mixin/backpack/PlayerServerMixin.java index 0d663eb..3accf15 100644 --- a/src/main/java/useless/moonsteel/mixin/backpack/PlayerServerMixin.java +++ b/src/main/java/useless/moonsteel/mixin/backpack/PlayerServerMixin.java @@ -1,16 +1,14 @@ -package useless.moonsteel.mixin; +package useless.moonsteel.mixin.backpack; import net.minecraft.core.net.packet.PacketContainerOpen; import net.minecraft.core.world.World; import net.minecraft.server.entity.player.PlayerServer; -import net.minecraft.server.net.handler.PacketHandlerServer; import org.jetbrains.annotations.Nullable; import org.spongepowered.asm.mixin.Mixin; import org.spongepowered.asm.mixin.Shadow; import org.spongepowered.asm.mixin.Unique; import useless.moonsteel.ContainerStarBackpack; import useless.moonsteel.MoonSteel; -import useless.moonsteel.mixin.backpack.PlayerMixin; @Mixin(value = PlayerServer.class, remap = false) public abstract class PlayerServerMixin extends PlayerMixin { @@ -23,8 +21,6 @@ protected PlayerServerMixin(@Nullable World world) { @Shadow private int currentWindowId; - @Shadow - public PacketHandlerServer playerNetServerHandler; @Unique public PlayerServer thisAs = (PlayerServer) (Object)this; diff --git a/src/main/java/useless/moonsteel/mixin/ChunkProviderServerMixin.java b/src/main/java/useless/moonsteel/mixin/chunkprovider/ChunkProviderServerMixin.java similarity index 94% rename from src/main/java/useless/moonsteel/mixin/ChunkProviderServerMixin.java rename to src/main/java/useless/moonsteel/mixin/chunkprovider/ChunkProviderServerMixin.java index 8be8689..b6fd316 100644 --- a/src/main/java/useless/moonsteel/mixin/ChunkProviderServerMixin.java +++ b/src/main/java/useless/moonsteel/mixin/chunkprovider/ChunkProviderServerMixin.java @@ -1,4 +1,4 @@ -package useless.moonsteel.mixin; +package useless.moonsteel.mixin.chunkprovider; import net.minecraft.core.world.chunk.Chunk; import net.minecraft.core.world.pos.ChunkPosc; diff --git a/src/main/java/useless/moonsteel/mixin/ChunkProviderStaticMixin.java b/src/main/java/useless/moonsteel/mixin/chunkprovider/ChunkProviderStaticMixin.java similarity index 87% rename from src/main/java/useless/moonsteel/mixin/ChunkProviderStaticMixin.java rename to src/main/java/useless/moonsteel/mixin/chunkprovider/ChunkProviderStaticMixin.java index 88824e6..4021a89 100644 --- a/src/main/java/useless/moonsteel/mixin/ChunkProviderStaticMixin.java +++ b/src/main/java/useless/moonsteel/mixin/chunkprovider/ChunkProviderStaticMixin.java @@ -1,11 +1,10 @@ -package useless.moonsteel.mixin; +package useless.moonsteel.mixin.chunkprovider; import com.llamalad7.mixinextras.injector.wrapmethod.WrapMethod; import com.llamalad7.mixinextras.injector.wrapoperation.Operation; import net.minecraft.client.world.chunk.provider.ChunkProviderStatic; import net.minecraft.core.world.pos.ChunkPosc; import org.spongepowered.asm.mixin.Mixin; -import org.spongepowered.asm.mixin.injection.At; import useless.moonsteel.MoonSteel; @Mixin(value = ChunkProviderStatic.class, remap = false) diff --git a/src/main/java/useless/moonsteel/mixin/BlockLogicMixin.java b/src/main/java/useless/moonsteel/mixin/fortune/BlockLogicMixin.java similarity index 98% rename from src/main/java/useless/moonsteel/mixin/BlockLogicMixin.java rename to src/main/java/useless/moonsteel/mixin/fortune/BlockLogicMixin.java index 76a4db3..6f57b79 100644 --- a/src/main/java/useless/moonsteel/mixin/BlockLogicMixin.java +++ b/src/main/java/useless/moonsteel/mixin/fortune/BlockLogicMixin.java @@ -1,4 +1,4 @@ -package useless.moonsteel.mixin; +package useless.moonsteel.mixin.fortune; import net.minecraft.core.block.Block; import net.minecraft.core.block.BlockLogic; diff --git a/src/main/java/useless/moonsteel/mixin/entity/EntityItemMixin.java b/src/main/java/useless/moonsteel/mixin/starfallen/EntityItemMixin.java similarity index 98% rename from src/main/java/useless/moonsteel/mixin/entity/EntityItemMixin.java rename to src/main/java/useless/moonsteel/mixin/starfallen/EntityItemMixin.java index 37aa677..e05d3e9 100644 --- a/src/main/java/useless/moonsteel/mixin/entity/EntityItemMixin.java +++ b/src/main/java/useless/moonsteel/mixin/starfallen/EntityItemMixin.java @@ -1,4 +1,4 @@ -package useless.moonsteel.mixin.entity; +package useless.moonsteel.mixin.starfallen; import com.mojang.nbt.tags.CompoundTag; import net.minecraft.core.entity.Entity; diff --git a/src/main/java/useless/moonsteel/mixin/WorldMixin.java b/src/main/java/useless/moonsteel/mixin/starfallen/WorldMixinStarFall.java similarity index 86% rename from src/main/java/useless/moonsteel/mixin/WorldMixin.java rename to src/main/java/useless/moonsteel/mixin/starfallen/WorldMixinStarFall.java index 45de57d..54c31b1 100644 --- a/src/main/java/useless/moonsteel/mixin/WorldMixin.java +++ b/src/main/java/useless/moonsteel/mixin/starfallen/WorldMixinStarFall.java @@ -1,4 +1,4 @@ -package useless.moonsteel.mixin; +package useless.moonsteel.mixin.starfallen; import com.llamalad7.mixinextras.sugar.Local; import net.minecraft.core.entity.EntityItem; @@ -6,8 +6,6 @@ import net.minecraft.core.world.World; import net.minecraft.core.world.WorldSource; import net.minecraft.core.world.chunk.Chunk; -import net.minecraft.core.world.chunk.ChunkCoordinate; -import net.minecraft.core.world.chunk.ChunkPosition; import net.minecraft.core.world.pos.ChunkPos; import net.minecraft.core.world.pos.ChunkTilePos; import net.minecraft.core.world.type.WorldType; @@ -17,16 +15,14 @@ import org.spongepowered.asm.mixin.injection.At; import org.spongepowered.asm.mixin.injection.Inject; import org.spongepowered.asm.mixin.injection.callback.CallbackInfo; -import org.spongepowered.asm.mixin.injection.callback.LocalCapture; import useless.moonsteel.MoonSteel; import useless.moonsteel.MoonSteelItems; import useless.moonsteel.interfaces.IFallenStar; -import java.util.Iterator; import java.util.Random; @Mixin(value = World.class, remap = false) -public abstract class WorldMixin { +public abstract class WorldMixinStarFall { @Shadow public abstract Chunk getChunkFromChunkCoords(int x, int z); @@ -51,7 +47,8 @@ private void makeTheStarsFall( ){ if (!MoonSteel.isStarTime((World) (Object)this)) return; final Chunk chunk = this.getChunkFromChunkCoords(coordinate.x, coordinate.z); - if (this.rand.nextInt(MoonSteel.STAR_SPAWN_RATE) == 0){ +// if (this.rand.nextInt(MoonSteel.STAR_SPAWN_RATE) == 0){ + if (true){ this.updateLCG = this.updateLCG * 3 + 1013904223; final int randVal = this.updateLCG >> 2; ChunkPos chunkTilePos = chunk.pos; diff --git a/src/main/java/useless/moonsteel/mixin/stella/PlayerMixinStella.java b/src/main/java/useless/moonsteel/mixin/stella/PlayerMixinStella.java new file mode 100644 index 0000000..f6a1697 --- /dev/null +++ b/src/main/java/useless/moonsteel/mixin/stella/PlayerMixinStella.java @@ -0,0 +1,22 @@ +package useless.moonsteel.mixin.stella; + +import net.minecraft.core.entity.Mob; +import net.minecraft.core.entity.player.Player; +import net.minecraft.core.world.World; +import org.jetbrains.annotations.NotNull; +import org.spongepowered.asm.mixin.Mixin; +import useless.moonsteel.interfaces.ITeleporter; + +@Mixin(Player.class) +public class PlayerMixinStella extends Mob implements ITeleporter { + + public PlayerMixinStella(@NotNull World world) { + super(world); + } + + @Override + public void moonsteel$teleport(final double x, final double y, final double z) { + setPos(x, y + this.bbHeight, z); + } + +} diff --git a/src/main/java/useless/moonsteel/mixin/stella/PlayerServerMixinStella.java b/src/main/java/useless/moonsteel/mixin/stella/PlayerServerMixinStella.java new file mode 100644 index 0000000..ceefb87 --- /dev/null +++ b/src/main/java/useless/moonsteel/mixin/stella/PlayerServerMixinStella.java @@ -0,0 +1,24 @@ +package useless.moonsteel.mixin.stella; + + +import net.minecraft.core.world.World; +import net.minecraft.server.entity.player.PlayerServer; +import net.minecraft.server.net.handler.PacketHandlerServer; +import org.jetbrains.annotations.NotNull; +import org.spongepowered.asm.mixin.Mixin; +import org.spongepowered.asm.mixin.Shadow; + +@Mixin(PlayerServer.class) +public class PlayerServerMixinStella extends PlayerMixinStella { + @Shadow + public PacketHandlerServer playerNetServerHandler; + + public PlayerServerMixinStella(@NotNull World world) { + super(world); + } + + @Override + public void moonsteel$teleport(final double x, final double y, final double z) { + this.playerNetServerHandler.teleport(x, y, z); + } +} diff --git a/src/main/resources/moonsteel.mixins.json b/src/main/resources/moonsteel.mixins.json index 6d15536..0c00886 100644 --- a/src/main/resources/moonsteel.mixins.json +++ b/src/main/resources/moonsteel.mixins.json @@ -2,32 +2,37 @@ "required": true, "minVersion": "0.8", "package": "useless.moonsteel.mixin", - "compatibilityLevel": "JAVA_8", + "compatibilityLevel": "JAVA_${java}", "plugin": "useless.moonsteel.MoonSteelMixinPlugin", + "mixinextras": { + "minVersion": "0.5.0" + }, "injectors": { "defaultRequire": 1 }, "server": [ - "ChunkProviderServerMixin", - "PlayerListMixin", - "backpack.PlayerServerMixin" + "backpack.PlayerListMixinRespawn", + "backpack.PlayerServerMixin", + "chunkprovider.ChunkProviderServerMixin", + "stella.PlayerServerMixinStella" ], "mixins": [ - "BlockLogicMixin", - "WorldFeatureLabyrinthMixin", - "WorldMixin", + "WorldFeatureLabyrinthMixinRewards", "accessor.ItemToolSwordAccessor", + "armor.MobMixin", + "armor.MobZombieArmoredMixin", + "armor.PlayerMixinEquipment", + "backpack.MinecraftMixinRespawn", "backpack.PlayerMixin", - "entity.EntityItemMixin", - "entity.MobMixin", - "entity.MobZombieArmoredMixin", - "entity.PlayerMixin" + "fortune.BlockLogicMixin", + "starfallen.EntityItemMixin", + "starfallen.WorldMixinStarFall", + "stella.PlayerMixinStella" ], "client": [ - "ChunkProviderStaticMixin", - "MobRenderZombieArmoredMixin", - "PacketHandlerClientMixin", - "backpack.MinecraftMixin", - "backpack.PlayerLocalMixin" + "armor.MobRenderZombieArmoredMixin", + "backpack.PacketHandlerClientMixinGui", + "backpack.PlayerLocalMixinGui", + "chunkprovider.ChunkProviderStaticMixin" ] } From fad1f5d83e3f45fb28e05ae9da1ee0f063cccba7 Mon Sep 17 00:00:00 2001 From: Redart15 Date: Mon, 7 Sep 2026 01:44:01 +0200 Subject: [PATCH 06/13] even more fixes --- .../java/useless/moonsteel/MoonSteel.java | 45 +++++++++-- .../useless/moonsteel/MoonSteelBlocks.java | 76 ++++++++++--------- .../useless/moonsteel/MoonSteelModels.java | 15 +--- .../moonsteel/block/BlockStellarRewinder.java | 5 ++ .../moonsteel/fx/ParticleMagicSmoke.java | 58 ++++---------- .../useless/moonsteel/fx/ParticleStar.java | 47 ++++-------- .../mixin/starfallen/WorldMixinStarFall.java | 19 ++--- .../moonsteel/models/block/moonsteel.json | 8 ++ .../moonsteel/models/block/rewinder.json | 0 .../moonsteel/models/block/star_torch.json | 6 ++ .../models/block/star_torch_wall.json | 6 ++ 11 files changed, 144 insertions(+), 141 deletions(-) create mode 100644 src/main/resources/assets/moonsteel/models/block/moonsteel.json create mode 100644 src/main/resources/assets/moonsteel/models/block/rewinder.json create mode 100644 src/main/resources/assets/moonsteel/models/block/star_torch.json create mode 100644 src/main/resources/assets/moonsteel/models/block/star_torch_wall.json diff --git a/src/main/java/useless/moonsteel/MoonSteel.java b/src/main/java/useless/moonsteel/MoonSteel.java index 9309f88..2c49c2d 100644 --- a/src/main/java/useless/moonsteel/MoonSteel.java +++ b/src/main/java/useless/moonsteel/MoonSteel.java @@ -2,24 +2,31 @@ import net.fabricmc.api.ModInitializer; import net.fabricmc.loader.api.FabricLoader; +import net.minecraft.core.block.Blocks; import net.minecraft.core.block.entity.TileEntityDispatcher; +import net.minecraft.core.item.IItemConvertible; import net.minecraft.core.item.ItemStack; +import net.minecraft.core.item.Items; import net.minecraft.core.sound.SoundTypes; import net.minecraft.core.util.collection.NamespaceID; import net.minecraft.core.world.World; +import org.jetbrains.annotations.NotNull; import org.slf4j.Logger; import org.slf4j.LoggerFactory; -import tosutosu.betterwithbackpacks.ModItems; import turniplabs.halplibe.HalpLibe; import turniplabs.halplibe.event.defs.CommonEvents; -import turniplabs.halplibe.helper.CreativeHelper; -import turniplabs.halplibe.helper.EntityHelper; +import turniplabs.halplibe.helper.creativeInventory.CreativeInventoryCategory; +import turniplabs.halplibe.helper.creativeInventory.CreativeInventoryPlacement; +import turniplabs.halplibe.helper.creativeInventory.CreativeInventoryRegistry; import turniplabs.halplibe.util.ConfigHandler; -import turniplabs.halplibe.util.GameStartEntrypoint; import turniplabs.halplibe.util.dependency.Key; import useless.moonsteel.block.TileEntityStellarRewinder; import java.util.Properties; +import java.util.function.Supplier; + +import static useless.moonsteel.MoonSteelBlocks.*; +import static useless.moonsteel.MoonSteelItems.*; public class MoonSteel implements ModInitializer { @@ -71,14 +78,36 @@ public void beforeGameStart() { ); MoonSteelBlocks.init(); MoonSteelItems.init(); + // blocks + CreativeInventoryRegistry.INSTANCE.register(BLOCK_MOONSTEEL, place(() -> Blocks.BLOCK_OLIVINE)); + CreativeInventoryRegistry.INSTANCE.register(TORCH_STAR, place(() -> Blocks.TORCH_COAL)); + CreativeInventoryRegistry.INSTANCE.register(STELLAR_REWINDER, place()); + // items + CreativeInventoryRegistry.INSTANCE.register(INGOT_MOONSTEEL, place(() -> Items.INGOT_STEEL_CRUDE)); + CreativeInventoryRegistry.INSTANCE.register(STAR_FALLEN, place(() -> Items.INGOT_STEEL_CRUDE)); + CreativeInventoryRegistry.INSTANCE.register(STAR_CONNECTED, place(() -> Items.INGOT_STEEL_CRUDE)); + CreativeInventoryRegistry.INSTANCE.register(TOOL_SHOVEL_MOONSTEEL, place(() -> Items.TOOL_SWORD_STEEL)); + CreativeInventoryRegistry.INSTANCE.register(TOOL_PICKAXE_MOONSTEEL, place(() -> Items.TOOL_SWORD_STEEL)); + CreativeInventoryRegistry.INSTANCE.register(TOOL_AXE_MOONSTEEL, place(() -> Items.TOOL_SWORD_STEEL)); + CreativeInventoryRegistry.INSTANCE.register(TOOL_HOE_MOONSTEEL, place(() -> Items.TOOL_SWORD_STEEL)); + CreativeInventoryRegistry.INSTANCE.register(TOOL_SWORD_MOONSTEEL, place(() -> Items.TOOL_SWORD_STEEL)); + CreativeInventoryRegistry.INSTANCE.register(ARMOR_HELMET_MOONSTEEL, place(() -> Items.ARMOR_WOLF_STEEL)); + CreativeInventoryRegistry.INSTANCE.register(ARMOR_CHESTPLATE_MOONSTEEL, place(() -> Items.ARMOR_WOLF_STEEL)); + CreativeInventoryRegistry.INSTANCE.register(ARMOR_LEGGINGS_MOONSTEEL, place(() -> Items.ARMOR_WOLF_STEEL)); + CreativeInventoryRegistry.INSTANCE.register(ARMOR_BOOTS_MOONSTEEL, place(() -> Items.ARMOR_WOLF_STEEL)); if (backpackPresent){ - CreativeHelper.setParent( - MoonSteelItems.BACKPACK_COSMIC.getDefaultStack(), - ModItems.diamondBackpack.getDefaultStack() - ); + CreativeInventoryRegistry.INSTANCE.register(BACKPACK_COSMIC, place(() -> Items.ARMOR_WOLF_STEEL)); } } + private static CreativeInventoryPlacement.@NotNull After place(Supplier iItemConvertibleSupplier) { + return new CreativeInventoryPlacement.After(iItemConvertibleSupplier); + } + + private static CreativeInventoryPlacement.@NotNull Category place() { + return new CreativeInventoryPlacement.Category(CreativeInventoryCategory.WORKBENCHES); + } + public static boolean isStarTime(final World world){ if (world.getWorldType().hasCeiling()) return false; if (world.isDaytime()) return false; diff --git a/src/main/java/useless/moonsteel/MoonSteelBlocks.java b/src/main/java/useless/moonsteel/MoonSteelBlocks.java index 1348708..8d8655a 100644 --- a/src/main/java/useless/moonsteel/MoonSteelBlocks.java +++ b/src/main/java/useless/moonsteel/MoonSteelBlocks.java @@ -1,49 +1,58 @@ package useless.moonsteel; -import net.minecraft.core.block.Block; -import net.minecraft.core.block.BlockLogic; -import net.minecraft.core.block.BlockLogicLeavesBase; -import net.minecraft.core.block.BlockLogicOreCoal; -import net.minecraft.core.block.BlockLogicOreDiamond; -import net.minecraft.core.block.BlockLogicOreGold; -import net.minecraft.core.block.BlockLogicOreIron; -import net.minecraft.core.block.BlockLogicOreLapis; -import net.minecraft.core.block.BlockLogicOreNetherCoal; -import net.minecraft.core.block.BlockLogicOreRedstone; -import net.minecraft.core.block.BlockLogicTallGrass; -import net.minecraft.core.block.material.Material; +import net.minecraft.core.block.*; import net.minecraft.core.block.material.Materials; import net.minecraft.core.block.tag.BlockTags; import net.minecraft.core.data.tag.Tag; -import turniplabs.halplibe.helper.BlockBuilder; import useless.moonsteel.block.BlockStellarRewinder; import useless.moonsteel.block.BlockTorchStar; import static useless.moonsteel.MoonSteel.MOD_ID; public class MoonSteelBlocks { - public static Block BLOCK_MOONSTEEL = new BlockBuilder(MOD_ID) - .setHardness(5f) - .setResistance(2000f) - .addTags(BlockTags.MINEABLE_BY_PICKAXE) - .build("block", "block_moonsteel", MoonSteel.blockId++, b -> new BlockLogic(b, Materials.METAL)); - // TODO make sure this is always is set with notify - public static Block TORCH_STAR = new BlockBuilder(MOD_ID) - .setLuminance(15) - .build("torch.star", "torch_star", MoonSteel.blockId++, BlockTorchStar::new); - // .withDisabledNeighborNotifyOnMetadataChange(); // need to be set with notify + private MoonSteelBlocks(){} - // TODO figure out what withImmovableFlag was - public static Block STELLAR_REWINDER = new BlockBuilder(MOD_ID) - .setHardness(3.5f) - .addTags(BlockTags.MINEABLE_BY_PICKAXE) - .build("stellar.rewinder", "stellar_rewinder", MoonSteel.blockId++, b -> new BlockStellarRewinder(b, Materials.METAL)); -// .withImmovableFlagSet(); + private static String formatTranslationKey(String key) { + return String.format("%s.%s", MOD_ID, key); + } + + private static String formatName(String name) { + return String.format("%s:block/%s", MOD_ID, name); + } + public static final Block BLOCK_MOONSTEEL = + Blocks.register( + formatTranslationKey("block"), + formatName("block_moonsteel"), + MoonSteel.blockId++, + b -> new BlockLogic(b, Materials.METAL) + ) + .withHardness(5f) + .withBlastResistance(2000f) + .withTags(BlockTags.MINEABLE_BY_PICKAXE); - public static Tag> FORCE_FORTUNE = Tag.of("moonsteel$force_enable_fortune"); - public static Tag> FORCE_NO_FORTUNE = Tag.of("moonsteel$force_disable_fortune"); + public static final Block TORCH_STAR = + Blocks.register( + formatTranslationKey("torch.star"), + formatName("torch_star"), + MoonSteel.blockId++, + BlockTorchStar::new + ) + .withLightEmission(15); + + public static final Block STELLAR_REWINDER = + Blocks.register( + formatTranslationKey("stellar.rewinder"), + formatName("stellar_rewinder"), + MoonSteel.blockId++, + b -> new BlockStellarRewinder(b, Materials.METAL) + ) + .withHardness(3.5f) + .withTags(BlockTags.MINEABLE_BY_PICKAXE); + + public static final Tag> FORCE_FORTUNE = Tag.of("moonsteel$force_enable_fortune"); + public static final Tag> FORCE_NO_FORTUNE = Tag.of("moonsteel$force_disable_fortune"); public static boolean canBeFortuned(Block block) { if (block.hasTag(FORCE_FORTUNE)) return true; @@ -56,11 +65,10 @@ public static boolean canBeFortuned(Block block) { if (Block.hasLogicClass(block, BlockLogicOreLapis.class)) return true; if (Block.hasLogicClass(block, BlockLogicOreNetherCoal.class)) return true; if (Block.hasLogicClass(block, BlockLogicOreRedstone.class)) return true; - if (Block.hasLogicClass(block, BlockLogicTallGrass.class)) return true; - return false; + return Block.hasLogicClass(block, BlockLogicTallGrass.class); } public static void init() { - + /* no need */ } } diff --git a/src/main/java/useless/moonsteel/MoonSteelModels.java b/src/main/java/useless/moonsteel/MoonSteelModels.java index 14e36be..a17eb6f 100644 --- a/src/main/java/useless/moonsteel/MoonSteelModels.java +++ b/src/main/java/useless/moonsteel/MoonSteelModels.java @@ -3,6 +3,7 @@ import net.minecraft.client.render.block.model.BlockModelDispatcher; import net.minecraft.client.render.block.model.BlockModelStandard; import net.minecraft.client.render.block.model.generic.BlockModelGeneric; +import net.minecraft.client.render.block.model.generic.BlockModelGenericRotatable; import net.minecraft.client.render.block.model.generic.BlockModelGenericTorch; import net.minecraft.client.render.item.model.ItemModelDispatcher; import net.minecraft.client.render.item.model.ItemModelStandard; @@ -22,18 +23,8 @@ public class MoonSteelModels { public static void initBlockModels(final BlockModelDispatcher dispatcher) { - final Side[] S_TB = {Side.TOP, Side.BOTTOM}; - final Side[] S_SIDES = {Side.NORTH, Side.EAST, Side.SOUTH, Side.WEST}; - //TODO replace with BlockModelGeneric - dispatcher.addDispatch(new BlockModelGeneric<>(MoonSteelBlocks.BLOCK_MOONSTEEL, loadDataModel(MOD_ID + "block/moonsteel"))); -// dispatcher.addDispatch(new BlockModelStandard<>(MoonSteelBlocks.BLOCK_MOONSTEEL)) -// .setTex(BlockModelStandard.BLOCK_TEXTURES, MOD_ID + ":block/moonsteel_block_side", S_SIDES) -// .setTex(BlockModelStandard.BLOCK_TEXTURES, MOD_ID + ":block/moonsteel_block_top", Side.TOP) -// .setTex(BlockModelStandard.BLOCK_TEXTURES, MOD_ID + ":block/moonsteel_block_bottom", Side.BOTTOM)); - - // TODO especialy for this, replace the key - dispatcher.addDispatch(new BlockModelGenericTorch<>(MoonSteelBlocks.TORCH_STAR, MOD_ID + ":block/start_torch")); -// .setAllTextures(BlockModelStandard.BLOCK_TEXTURES, MOD_ID + ":block/startorch")); + dispatcher.addDispatch(new BlockModelGeneric<>(MoonSteelBlocks.BLOCK_MOONSTEEL, loadDataModel(MOD_ID + ":block/moonsteel"))); + dispatcher.addDispatch(new BlockModelGenericTorch<>(MoonSteelBlocks.TORCH_STAR, MOD_ID + ":block/star_torch").render3D(false)); // TODO relace this by a generic model dispatcher.addDispatch(new BlockModelStellarRewinder<>(MoonSteelBlocks.STELLAR_REWINDER)); diff --git a/src/main/java/useless/moonsteel/block/BlockStellarRewinder.java b/src/main/java/useless/moonsteel/block/BlockStellarRewinder.java index f866fb0..855740a 100644 --- a/src/main/java/useless/moonsteel/block/BlockStellarRewinder.java +++ b/src/main/java/useless/moonsteel/block/BlockStellarRewinder.java @@ -29,4 +29,9 @@ public boolean onInteracted(@NotNull World world, @NotNull TilePosc tilePos, @No } return false; } + + @Override + public int getPistonPushReaction(@NotNull World world, @NotNull TilePosc tilePos) { + return 2; + } } diff --git a/src/main/java/useless/moonsteel/fx/ParticleMagicSmoke.java b/src/main/java/useless/moonsteel/fx/ParticleMagicSmoke.java index aa4ff01..bf0668d 100644 --- a/src/main/java/useless/moonsteel/fx/ParticleMagicSmoke.java +++ b/src/main/java/useless/moonsteel/fx/ParticleMagicSmoke.java @@ -12,7 +12,7 @@ public class ParticleMagicSmoke extends ParticleSmoke { private static final IconCoordinate smoke = TextureRegistry.getTexture(MOD_ID + ":item/particle_magicsmoke"); - public float sizeO; + private float sizeO; public ParticleMagicSmoke(World world, double x, double y, double z, double xa, double ya, double za) { super(world, x, y, z, xa, ya, za, 1.0f, 0); // no scale unsure about data @@ -21,47 +21,21 @@ public ParticleMagicSmoke(World world, double x, double y, double z, double xa, this.bCol = 1; this.tex = smoke; this.lifetime = (int) (5.0 / (Math.random() * 0.9 + 0.2)); - size *= 1.5f; - sizeO = size; + this.size *= 1.5f; + this.sizeO = size; } @Override public void render(@NotNull TessellatorParticle tessellatorParticle, float partialTick) { - - } - - // TODO figure out what do to with this - public void render(TessellatorParticle t, float partialTick, double xOff, double yOff, double zOff, float xa, float ya, float za, float xa2, float za2) { -// float f6 = ((float) this.age + partialTick) / (float) this.lifetime * 32.0f; -// if (f6 < 0.0f) { -// f6 = 0.0f; -// } -// if (f6 > 1.0f) { -// f6 = 1.0f; -// } -// this.size = this.sizeO * f6; -// if (this.tex != null) { -// final float u0 = (float) this.tex.getIconUMin(); -// final float u2 = (float) this.tex.getIconUMax(); -// final float v0 = (float) this.tex.getIconVMin(); -// final float v2 = (float) this.tex.getIconVMax(); -// final float r = 0.1F * this.size; -// final float x = (float) (this.xo + (this.x - this.xo) * (double) partialTick - xOff); -// final float y = (float) (this.yo + (this.y - this.yo) * (double) partialTick - yOff); -// final float z = (float) (this.zo + (this.z - this.zo) * (double) partialTick - zOff); -// float br = 1.0F; -// if (LightmapHelper.isLightmapEnabled()) { -// t.setLightmapCoord(this.getLightmapCoord(partialTick)); -// } else { -// br = this.getBrightness(partialTick); -// } -// -// t.setColorOpaque_F(this.rCol * br, this.gCol * br, this.bCol * br); -// t.addVertexWithUV(x - xa * r - xa2 * r, y - ya * r, z - za * r - za2 * r, u2, v2); -// t.addVertexWithUV(x - xa * r + xa2 * r, y + ya * r, z - za * r + za2 * r, u2, v0); -// t.addVertexWithUV(x + xa * r + xa2 * r, y + ya * r, z + za * r + za2 * r, u0, v0); -// t.addVertexWithUV(x + xa * r - xa2 * r, y - ya * r, z + za * r - za2 * r, u0, v2); -// } + float f6 = ((float) this.age + partialTick) / (float) this.lifetime * 32.0f; + if (f6 < 0.0f) { + f6 = 0.0f; + } + if (f6 > 1.0f) { + f6 = 1.0f; + } + this.size = this.sizeO * f6; + super.render(tessellatorParticle, partialTick); } @Override @@ -70,10 +44,10 @@ public float getBrightness(float partialTick) { return super.getBrightness(partialTick) * decay + (1.0f - decay); } - @Override - public int getParticleTexture() { - return 2; - } +// @Override +// public int getParticleTexture() { +// return 2; +// } @Override public void tick() { diff --git a/src/main/java/useless/moonsteel/fx/ParticleStar.java b/src/main/java/useless/moonsteel/fx/ParticleStar.java index 0f28377..2772d40 100644 --- a/src/main/java/useless/moonsteel/fx/ParticleStar.java +++ b/src/main/java/useless/moonsteel/fx/ParticleStar.java @@ -2,15 +2,19 @@ import net.minecraft.client.render.particle.ParticleFlame; import net.minecraft.client.render.tessellator.Tessellator; +import net.minecraft.client.render.tessellator.TessellatorParticle; import net.minecraft.client.render.texture.stitcher.IconCoordinate; import net.minecraft.client.render.texture.stitcher.TextureRegistry; +import net.minecraft.core.util.helper.MathHelper; import net.minecraft.core.world.World; +import org.jetbrains.annotations.NotNull; import static useless.moonsteel.MoonSteel.MOD_ID; public class ParticleStar extends ParticleFlame { private static final IconCoordinate star = TextureRegistry.getTexture(MOD_ID + ":item/particle_star"); - public float sizeO; + private float sizeO; + public ParticleStar(final World world, final double x, final double y, final double z, final double xd, final double yd, final double zd) { super(world, x, y, z, xd, yd, zd, Type.ORANGE); this.tex = star; @@ -18,41 +22,22 @@ public ParticleStar(final World world, final double x, final double y, final dou this.sizeO = this.size; } - // TODO figure out what do to with this - public void render(final Tessellator t, final float partialTick, final double xOff, final double yOff, final double zOff, final float xa, final float ya, final float za, final float xa2, final float za2) { -// final float s = ((float)this.age + partialTick) / (float)this.lifetime; -// this.size = this.sizeO * (1.0f - s * s * 0.5f); -// if (this.tex != null) { -// final float u0 = (float)this.tex.getIconUMin(); -// final float u2 = (float)this.tex.getIconUMax(); -// final float v0 = (float)this.tex.getIconVMin(); -// final float v2 = (float)this.tex.getIconVMax(); -// final float r = 0.1F * this.size; -// final float x = (float)(this.xo + (this.x - this.xo) * (double)partialTick - xOff); -// final float y = (float)(this.yo + (this.y - this.yo) * (double)partialTick - yOff); -// final float z = (float)(this.zo + (this.z - this.zo) * (double)partialTick - zOff); -// float br = 1.0F; -// if (LightmapHelper.isLightmapEnabled()) { -// t.setLightmapCoord(this.getLightmapCoord(partialTick)); -// } else { -// br = this.getBrightness(partialTick); -// } -// -// t.setColorOpaque_F(this.rCol * br, this.gCol * br, this.bCol * br); -// t.addVertexWithUV(x - xa * r - xa2 * r, y - ya * r, z - za * r - za2 * r, u2, v2); -// t.addVertexWithUV(x - xa * r + xa2 * r, y + ya * r, z - za * r + za2 * r, u2, v0); -// t.addVertexWithUV(x + xa * r + xa2 * r, y + ya * r, z + za * r + za2 * r, u0, v0); -// t.addVertexWithUV(x + xa * r - xa2 * r, y - ya * r, z + za * r - za2 * r, u0, v2); -// } + + @Override + public void render(@NotNull TessellatorParticle tessellatorParticle, float partialTick) { + final float s = (this.age + partialTick) / (float)this.lifetime; + this.size = this.sizeO * (1.0f - s * s * 0.5f); + super.render(tessellatorParticle, partialTick); } + @Override public void tick() { super.tick(); this.tex = star; } - @Override - public int getParticleTexture() { - return 2; - } +// @Override +// public int getParticleTexture() { +// return 2; +// } } diff --git a/src/main/java/useless/moonsteel/mixin/starfallen/WorldMixinStarFall.java b/src/main/java/useless/moonsteel/mixin/starfallen/WorldMixinStarFall.java index 54c31b1..93423ef 100644 --- a/src/main/java/useless/moonsteel/mixin/starfallen/WorldMixinStarFall.java +++ b/src/main/java/useless/moonsteel/mixin/starfallen/WorldMixinStarFall.java @@ -5,9 +5,6 @@ import net.minecraft.core.item.ItemStack; import net.minecraft.core.world.World; import net.minecraft.core.world.WorldSource; -import net.minecraft.core.world.chunk.Chunk; -import net.minecraft.core.world.pos.ChunkPos; -import net.minecraft.core.world.pos.ChunkTilePos; import net.minecraft.core.world.type.WorldType; import org.jetbrains.annotations.NotNull; import org.spongepowered.asm.mixin.Mixin; @@ -23,9 +20,6 @@ @Mixin(value = World.class, remap = false) public abstract class WorldMixinStarFall { - @Shadow - public abstract Chunk getChunkFromChunkCoords(int x, int z); - @Shadow protected int updateLCG; @@ -42,18 +36,15 @@ public abstract class WorldMixinStarFall { @Inject(method = "updateBlocksAndPlayCaveSounds()V", at = @At(value = "INVOKE", target = "Lnet/minecraft/core/world/World;getChunkFromChunkCoords(II)Lnet/minecraft/core/world/chunk/Chunk;", shift = At.Shift.AFTER)) private void makeTheStarsFall( final CallbackInfo ci, -// @Local(name = "coordinate") final ChunkCoordinate coordinate, - @Local(name = "chunkTileQueryPos") ChunkTilePos coordinate + @Local(name = "chunkBlockX") int chunkBlockX, + @Local(name = "chunkBlockZ") int chunkBlockZ ){ if (!MoonSteel.isStarTime((World) (Object)this)) return; - final Chunk chunk = this.getChunkFromChunkCoords(coordinate.x, coordinate.z); -// if (this.rand.nextInt(MoonSteel.STAR_SPAWN_RATE) == 0){ - if (true){ + if (this.rand.nextInt(MoonSteel.STAR_SPAWN_RATE) == 0){ this.updateLCG = this.updateLCG * 3 + 1013904223; final int randVal = this.updateLCG >> 2; - ChunkPos chunkTilePos = chunk.pos; - final int blockX = chunkTilePos.x() + (randVal & 0xF); - final int blockZ = chunkTilePos.z() + (randVal / 256 & 0xF); + final int blockX = chunkBlockX + (randVal & 0xF); + final int blockZ = chunkBlockZ + (randVal / 256 & 0xF); ((IFallenStar)dropItem(blockX, this.getWorldType().getMaxY((WorldSource) this) + 32, blockZ, MoonSteelItems.STAR_FALLEN.getDefaultStack())) .moonsteel$setDaylightSensitive(true); } diff --git a/src/main/resources/assets/moonsteel/models/block/moonsteel.json b/src/main/resources/assets/moonsteel/models/block/moonsteel.json new file mode 100644 index 0000000..5d045dd --- /dev/null +++ b/src/main/resources/assets/moonsteel/models/block/moonsteel.json @@ -0,0 +1,8 @@ +{ + "parent": "minecraft:block/cube_bottom_top", + "textures": { + "top": "moonsteel:block/moonsteel_block_top", + "bottom": "moonsteel:block/moonsteel_block_bottom", + "side": "moonsteel:block/moonsteel_block_side" + } +} diff --git a/src/main/resources/assets/moonsteel/models/block/rewinder.json b/src/main/resources/assets/moonsteel/models/block/rewinder.json new file mode 100644 index 0000000..e69de29 diff --git a/src/main/resources/assets/moonsteel/models/block/star_torch.json b/src/main/resources/assets/moonsteel/models/block/star_torch.json new file mode 100644 index 0000000..36e14b1 --- /dev/null +++ b/src/main/resources/assets/moonsteel/models/block/star_torch.json @@ -0,0 +1,6 @@ +{ + "parent": "minecraft:block/template_torch", + "textures": { + "torch": "moonsteel:block/startorch" + } +} diff --git a/src/main/resources/assets/moonsteel/models/block/star_torch_wall.json b/src/main/resources/assets/moonsteel/models/block/star_torch_wall.json new file mode 100644 index 0000000..9fadfa2 --- /dev/null +++ b/src/main/resources/assets/moonsteel/models/block/star_torch_wall.json @@ -0,0 +1,6 @@ +{ + "parent": "minecraft:block/template_torch_wall", + "textures": { + "torch": "moonsteel:block/startorch" + } +} \ No newline at end of file From a3c2eb903ac304199bd1e32fd65e2e4abb96f2c4 Mon Sep 17 00:00:00 2001 From: Redart15 Date: Wed, 9 Sep 2026 01:22:42 +0200 Subject: [PATCH 07/13] lamp from mayo and some minor changes --- build.gradle.kts | 1 + .../java/useless/moonsteel/MoonSteel.java | 5 + .../useless/moonsteel/MoonSteelBlocks.java | 14 ++ .../useless/moonsteel/MoonSteelModels.java | 12 +- .../useless/moonsteel/MoonSteelRecipes.java | 6 + .../moonsteel/block/BlockLogicStarLamp.java | 128 ++++++++++++++++++ .../moonsteel/block/BlockModelStarLamp.java | 45 ++++++ .../block/BlockModelStellarRewinder.java | 68 ++++++++-- .../moonsteel/block/BlockStellarRewinder.java | 4 + .../moonsteel/block/BlockTorchStar.java | 26 ++-- .../moonsteel/fx/ParticleMagicSmoke.java | 9 +- .../useless/moonsteel/fx/ParticleStar.java | 18 +-- .../mixin/accessor/ParticleFlameAccessor.java | 14 ++ .../assets/moonsteel/lang/en_US/en_US.lang | 3 + .../assets/moonsteel/lang/ru_RU/ru_RU.lang | 2 + .../moonsteel/models/block/rewinder.json | 0 .../moonsteel/models/block/starlamp.json | 86 ++++++++++++ .../models/block/stellarrewinder.json | 18 +++ .../models/block/stellarrewinder_active.json | 6 + .../moonsteel/textures/block/starlamp.png | Bin 0 -> 797 bytes src/main/resources/moonsteel.mixins.json | 1 + 21 files changed, 408 insertions(+), 58 deletions(-) create mode 100644 src/main/java/useless/moonsteel/block/BlockLogicStarLamp.java create mode 100644 src/main/java/useless/moonsteel/block/BlockModelStarLamp.java create mode 100644 src/main/java/useless/moonsteel/mixin/accessor/ParticleFlameAccessor.java delete mode 100644 src/main/resources/assets/moonsteel/models/block/rewinder.json create mode 100644 src/main/resources/assets/moonsteel/models/block/starlamp.json create mode 100644 src/main/resources/assets/moonsteel/models/block/stellarrewinder.json create mode 100644 src/main/resources/assets/moonsteel/models/block/stellarrewinder_active.json create mode 100644 src/main/resources/assets/moonsteel/textures/block/starlamp.png diff --git a/build.gradle.kts b/build.gradle.kts index bd455fa..5ed1cdb 100644 --- a/build.gradle.kts +++ b/build.gradle.kts @@ -45,6 +45,7 @@ dependencies { implementation(libs.halplibe) // If you do not need halplibe you can delete this line compileOnly(libs.btabackpacks) + //-Dmixin.debug.export=true // Only required at compilation // provides documentation, can be removed if that isn't needed diff --git a/src/main/java/useless/moonsteel/MoonSteel.java b/src/main/java/useless/moonsteel/MoonSteel.java index 2c49c2d..06721db 100644 --- a/src/main/java/useless/moonsteel/MoonSteel.java +++ b/src/main/java/useless/moonsteel/MoonSteel.java @@ -33,6 +33,8 @@ public class MoonSteel implements ModInitializer { public static final String MOD_ID = HalpLibe.registerMod("moonsteel"); public static final Key KEY = Key.of(MOD_ID); public static final Logger LOGGER = LoggerFactory.getLogger(MOD_ID); + public static final String SMOKE = "moonsteel$magic_smoke"; + public static final String STAR = "moonsteel$star"; public static boolean backpackPresent = FabricLoader.getInstance().isModLoaded("betterwithbackpacks"); public static int blockId; public static int itemId; @@ -62,6 +64,7 @@ public class MoonSteel implements ModInitializer { config.updateConfig(); } + @Override public void onInitialize() { LOGGER.info("MoonSteel initialized."); @@ -82,7 +85,9 @@ public void beforeGameStart() { CreativeInventoryRegistry.INSTANCE.register(BLOCK_MOONSTEEL, place(() -> Blocks.BLOCK_OLIVINE)); CreativeInventoryRegistry.INSTANCE.register(TORCH_STAR, place(() -> Blocks.TORCH_COAL)); CreativeInventoryRegistry.INSTANCE.register(STELLAR_REWINDER, place()); + CreativeInventoryRegistry.INSTANCE.register(STAR_LAMP, place(() -> Blocks.TORCH_COAL)); // items + CreativeInventoryRegistry.INSTANCE.register(INGOT_MOONSTEEL_CRUDE, place(() -> Items.INGOT_STEEL_CRUDE)); CreativeInventoryRegistry.INSTANCE.register(INGOT_MOONSTEEL, place(() -> Items.INGOT_STEEL_CRUDE)); CreativeInventoryRegistry.INSTANCE.register(STAR_FALLEN, place(() -> Items.INGOT_STEEL_CRUDE)); CreativeInventoryRegistry.INSTANCE.register(STAR_CONNECTED, place(() -> Items.INGOT_STEEL_CRUDE)); diff --git a/src/main/java/useless/moonsteel/MoonSteelBlocks.java b/src/main/java/useless/moonsteel/MoonSteelBlocks.java index 8d8655a..2784338 100644 --- a/src/main/java/useless/moonsteel/MoonSteelBlocks.java +++ b/src/main/java/useless/moonsteel/MoonSteelBlocks.java @@ -4,6 +4,8 @@ import net.minecraft.core.block.material.Materials; import net.minecraft.core.block.tag.BlockTags; import net.minecraft.core.data.tag.Tag; +import net.minecraft.core.sound.BlockSounds; +import useless.moonsteel.block.BlockLogicStarLamp; import useless.moonsteel.block.BlockStellarRewinder; import useless.moonsteel.block.BlockTorchStar; @@ -51,6 +53,18 @@ private static String formatName(String name) { .withHardness(3.5f) .withTags(BlockTags.MINEABLE_BY_PICKAXE); + public static final Block STAR_LAMP = + Blocks.register( + formatTranslationKey("star.lamp"), + formatName("star_lamp"), + MoonSteel.blockId++, + b -> new BlockLogicStarLamp(b, Materials.METAL) + ) + .withSound(BlockSounds.GLASS) + .withHardness(0.5F) + .withLightEmission(15) + .withTags(new Tag[]{BlockTags.NOT_IN_CREATIVE_MENU, BlockTags.MINEABLE_BY_PICKAXE}); + public static final Tag> FORCE_FORTUNE = Tag.of("moonsteel$force_enable_fortune"); public static final Tag> FORCE_NO_FORTUNE = Tag.of("moonsteel$force_disable_fortune"); diff --git a/src/main/java/useless/moonsteel/MoonSteelModels.java b/src/main/java/useless/moonsteel/MoonSteelModels.java index a17eb6f..f9f6092 100644 --- a/src/main/java/useless/moonsteel/MoonSteelModels.java +++ b/src/main/java/useless/moonsteel/MoonSteelModels.java @@ -1,7 +1,6 @@ package useless.moonsteel; import net.minecraft.client.render.block.model.BlockModelDispatcher; -import net.minecraft.client.render.block.model.BlockModelStandard; import net.minecraft.client.render.block.model.generic.BlockModelGeneric; import net.minecraft.client.render.block.model.generic.BlockModelGenericRotatable; import net.minecraft.client.render.block.model.generic.BlockModelGenericTorch; @@ -10,8 +9,8 @@ import net.minecraft.client.render.texture.stitcher.TextureRegistry; import net.minecraft.core.item.Item; import net.minecraft.core.util.collection.NamespaceID; -import net.minecraft.core.util.helper.Side; import org.jetbrains.annotations.NotNull; +import useless.moonsteel.block.BlockModelStarLamp; import useless.moonsteel.block.BlockModelStellarRewinder; import useless.moonsteel.item.ItemModelConnectStar; @@ -21,16 +20,13 @@ public class MoonSteelModels { + private MoonSteelModels(){} public static void initBlockModels(final BlockModelDispatcher dispatcher) { dispatcher.addDispatch(new BlockModelGeneric<>(MoonSteelBlocks.BLOCK_MOONSTEEL, loadDataModel(MOD_ID + ":block/moonsteel"))); dispatcher.addDispatch(new BlockModelGenericTorch<>(MoonSteelBlocks.TORCH_STAR, MOD_ID + ":block/star_torch").render3D(false)); - - // TODO relace this by a generic model - dispatcher.addDispatch(new BlockModelStellarRewinder<>(MoonSteelBlocks.STELLAR_REWINDER)); -// .setTex(BlockModelStandard.BLOCK_TEXTURES, MOD_ID + ":block/stellarrewinder_side", Side.SOUTH, Side.WEST, Side.EAST) -// .setTex(BlockModelStandard.BLOCK_TEXTURES, MOD_ID + ":block/stellarrewinder_front", Side.NORTH) -// .setTex(BlockModelStandard.BLOCK_TEXTURES, MOD_ID + ":block/stellarrewinder_top", S_TB)); + dispatcher.addDispatch(new BlockModelStellarRewinder<>(MoonSteelBlocks.STELLAR_REWINDER, MOD_ID + ":block/stellarrewinder")); + dispatcher.addDispatch(new BlockModelStarLamp<>(MoonSteelBlocks.STAR_LAMP, loadDataModel(MOD_ID + ":block/starlamp"))); } diff --git a/src/main/java/useless/moonsteel/MoonSteelRecipes.java b/src/main/java/useless/moonsteel/MoonSteelRecipes.java index d6b32b7..6ed578d 100644 --- a/src/main/java/useless/moonsteel/MoonSteelRecipes.java +++ b/src/main/java/useless/moonsteel/MoonSteelRecipes.java @@ -162,6 +162,12 @@ public static void onRecipesReady() { .addEntry(new WeightedRandomLootObject(Items.ORE_RAW_IRON.getDefaultStack(), 1), 5) .addEntry(new WeightedRandomLootObject(Items.ORE_RAW_GOLD.getDefaultStack(), 1), 1) .create("fallenstar"); + + RecipeBuilder.Shaped(MOD_ID) + .setShape("OSO", "OSO") + .addInput('O', Items.OLIVINE) + .addInput('S', MoonSteelItems.STAR_FALLEN) + .create("star_lamp", new ItemStack(MoonSteelBlocks.STAR_LAMP, 8)); } public static void initNamespaces() { diff --git a/src/main/java/useless/moonsteel/block/BlockLogicStarLamp.java b/src/main/java/useless/moonsteel/block/BlockLogicStarLamp.java new file mode 100644 index 0000000..b3e0e66 --- /dev/null +++ b/src/main/java/useless/moonsteel/block/BlockLogicStarLamp.java @@ -0,0 +1,128 @@ +package useless.moonsteel.block; + +import net.minecraft.core.block.Block; +import net.minecraft.core.block.BlockLogic; +import net.minecraft.core.block.Blocks; +import net.minecraft.core.block.material.Material; +import net.minecraft.core.block.support.FullSupport; +import net.minecraft.core.block.support.ISupport; +import net.minecraft.core.block.support.ISupportable; +import net.minecraft.core.block.support.PartialSupport; +import net.minecraft.core.enums.EnumDropCause; +import net.minecraft.core.util.helper.Side; +import net.minecraft.core.world.World; +import net.minecraft.core.world.WorldSource; +import net.minecraft.core.world.pos.TilePosc; +import org.jetbrains.annotations.NotNull; +import org.joml.primitives.AABBd; +import org.joml.primitives.AABBdc; + +public class BlockLogicStarLamp extends BlockLogic implements ISupportable { + + public static final float MIN_LENGTH = 0.0F; + public static final float MAX_LENGTH = 1.0F; + public static final float THINNESS = 2.0f / 16.0f; + public static final float HEIGHT = 5.0f /16.0F; + public static final float START = 5.5F / 16.0F; + + public BlockLogicStarLamp(@NotNull Block block, @NotNull Material material) { + super(block, material); + this.setBlockBounds(MAX_LENGTH - THINNESS, START, MIN_LENGTH, MAX_LENGTH, START + HEIGHT, MAX_LENGTH); + } + + @Override + public void onPlacedOnSide(@NotNull World world, @NotNull TilePosc tilePos, @NotNull Side side, double xHit, double yHit) { + int meta = world.getBlockData(tilePos); + side = side.opposite(); + if (!this.isSupported(world, tilePos, side)) { + side = this.getDefaultSide(world, tilePos); + } + + if (side != Side.NONE) { + world.setBlockData(tilePos, setSide(meta, side)); + } else { + this.dropWithCause(world, EnumDropCause.WORLD, tilePos, meta, null, null); + world.setBlockTypeNotify(tilePos, Blocks.AIR); + } + } + + @Override + public @NotNull AABBdc getBoundsFromState(@NotNull WorldSource source, @NotNull TilePosc tilePos) { + int meta = source.getBlockData(tilePos); + AABBd aabbd; + switch (sideFromMeta(meta)) { + case BOTTOM -> aabbd = new AABBd(MIN_LENGTH, MIN_LENGTH, START, MAX_LENGTH, THINNESS, START + HEIGHT); + case TOP -> aabbd = new AABBd(MIN_LENGTH, MAX_LENGTH - THINNESS, START, MAX_LENGTH, MAX_LENGTH, START + HEIGHT); + case NORTH -> aabbd = new AABBd(MIN_LENGTH, START, MIN_LENGTH, MAX_LENGTH, START + HEIGHT, THINNESS); + case SOUTH -> aabbd = new AABBd(MIN_LENGTH, START, MAX_LENGTH - THINNESS, MAX_LENGTH, START + HEIGHT, MAX_LENGTH); + case WEST -> aabbd = new AABBd(MIN_LENGTH, START, MIN_LENGTH, THINNESS, START + HEIGHT, MAX_LENGTH); + default -> aabbd = new AABBd(MAX_LENGTH - THINNESS, START, MIN_LENGTH, MAX_LENGTH, START + HEIGHT, MAX_LENGTH); + } + return aabbd; + } + + @Override + public void onNeighborChanged(@NotNull World world, @NotNull TilePosc tilePos, @NotNull Block block) { + if (!this.isSupported(world, tilePos, sideFromMeta(world.getBlockData(tilePos)))) { + this.dropWithCause(world, EnumDropCause.WORLD, tilePos, world.getBlockData(tilePos), null, null); + world.setBlockTypeNotify(tilePos, Blocks.AIR); + } + + } + + public static int setSide(int meta, @NotNull Side side) { + return meta & -15 | side.id << 1; + } + + public static @NotNull Side sideFromMeta(int meta) { + return Side.fromId((meta & 14) >> 1); + } + + private @NotNull Side getDefaultSide(@NotNull World world, @NotNull TilePosc tilePos) { + for (int i = 0; i < Side.sides.length; ++i) { + Side side = Side.sides[i]; + if (this.isSupported(world, tilePos, side)) { + return side; + } + } + + return Side.NONE; + } + + @Override + public int getPistonPushReaction(@NotNull World world, @NotNull TilePosc tilePos) { + return 1; + } + + @Override + public boolean canPlaceAt(@NotNull World world, @NotNull TilePosc tilePos) { + return this.isSupported(world, tilePos, Side.BOTTOM) + || this.isSupported(world, tilePos, Side.TOP) + || this.isSupported(world, tilePos, Side.NORTH) + || this.isSupported(world, tilePos, Side.SOUTH) + || this.isSupported(world, tilePos, Side.WEST) + || this.isSupported(world, tilePos, Side.EAST); + } + + @Override + public boolean isSolidRender() { + return false; + } + + @Override + public boolean isCubeShaped() { + return false; + } + + + @Override + public @NotNull ISupport getSupport(@NotNull World world, @NotNull TilePosc tilePos, @NotNull Side side) { + return PartialSupport.INSTANCE; + } + + @Override + public @NotNull ISupport getSupportConstraint(@NotNull World world, @NotNull TilePosc tilePos, @NotNull Side side) { + return PartialSupport.INSTANCE.center(); + } + +} diff --git a/src/main/java/useless/moonsteel/block/BlockModelStarLamp.java b/src/main/java/useless/moonsteel/block/BlockModelStarLamp.java new file mode 100644 index 0000000..2b6fa35 --- /dev/null +++ b/src/main/java/useless/moonsteel/block/BlockModelStarLamp.java @@ -0,0 +1,45 @@ +package useless.moonsteel.block; + +import net.minecraft.client.render.block.model.generic.BlockModelGeneric; +import net.minecraft.client.render.tessellator.TessellatorGeneral; +import net.minecraft.client.render.texture.stitcher.IconCoordinate; +import net.minecraft.core.block.Block; +import net.minecraft.core.block.BlockLogic; +import net.minecraft.core.block.BlockLogicPressurePlate; +import net.minecraft.core.util.helper.Side; +import net.minecraft.core.world.WorldSource; +import net.minecraft.core.world.pos.TilePosc; +import org.jetbrains.annotations.NotNull; +import org.jetbrains.annotations.Nullable; +import org.useless.dragonfly.data.block.BlockModelData; + +public class BlockModelStarLamp extends BlockModelGeneric { + + public BlockModelStarLamp(@NotNull Block block, @NotNull BlockModelData staticModel) { + super(block, staticModel); + } + + @Override + public boolean renderAttached(@NotNull TessellatorGeneral tessellator, @NotNull WorldSource worldSource, @NotNull TilePosc tilePos, boolean cullFaces, @Nullable IconCoordinate overrideTexture) { + Side direction = BlockLogicPressurePlate.sideFromMeta(worldSource.getBlockData(tilePos)); + boolean var10000; + switch (direction) { + // int rotX, int rotY, int rotZ, double xOff, double yOff, double zOff, + case BOTTOM -> var10000 = this.getModel(worldSource, tilePos) + .renderAttached(this, tessellator, worldSource, tilePos, 1, 0, 0, 0.0F, 0.0F, 0.0F, false, cullFaces, overrideTexture); + case TOP -> var10000 = this.getModel(worldSource, tilePos) + .renderAttached(this, tessellator, worldSource, tilePos, 3, 0, 0, 0.0F, 0.0F, 0.0F, false, cullFaces, overrideTexture); + case NORTH -> var10000 = this.getModel(worldSource, tilePos) + .renderAttached(this, tessellator, worldSource, tilePos, 0, 2, 0, 0.0F, 0.0F, 0.0F, false, cullFaces, overrideTexture); + case SOUTH -> var10000 = this.getModel(worldSource, tilePos) + .renderAttached(this, tessellator, worldSource, tilePos, 0, 0, 0, 0.0F, 0.0F, 0.0F, false, cullFaces, overrideTexture); + case WEST -> var10000 = this.getModel(worldSource, tilePos) + .renderAttached(this, tessellator, worldSource, tilePos, 0, 3, 0, 0.0F, 0.0F, 0.0F, false, cullFaces, overrideTexture); + default -> var10000 = this.getModel(worldSource, tilePos) + .renderAttached(this, tessellator, worldSource, tilePos, 0, 1, 0, 0.0F, 0.0F, 0.0F, false, cullFaces, overrideTexture); + } + + return var10000; + } + +} diff --git a/src/main/java/useless/moonsteel/block/BlockModelStellarRewinder.java b/src/main/java/useless/moonsteel/block/BlockModelStellarRewinder.java index ae6ca17..5e2c02d 100644 --- a/src/main/java/useless/moonsteel/block/BlockModelStellarRewinder.java +++ b/src/main/java/useless/moonsteel/block/BlockModelStellarRewinder.java @@ -1,29 +1,67 @@ package useless.moonsteel.block; -import net.minecraft.client.render.block.model.BlockModelHorizontalRotation; +import net.minecraft.client.render.block.model.BlockModelDispatcher; +import net.minecraft.client.render.block.model.generic.BlockModelGeneric; +import net.minecraft.client.render.tessellator.TessellatorGeneral; import net.minecraft.client.render.texture.stitcher.IconCoordinate; -import net.minecraft.client.render.texture.stitcher.TextureRegistry; import net.minecraft.core.block.Block; import net.minecraft.core.block.BlockLogic; -import net.minecraft.core.util.helper.Side; +import net.minecraft.core.block.BlockLogicRotatable; +import net.minecraft.core.block.entity.TileEntity; +import net.minecraft.core.util.helper.Direction; import net.minecraft.core.world.WorldSource; import net.minecraft.core.world.pos.TilePosc; import org.jetbrains.annotations.NotNull; -import useless.moonsteel.MoonSteel; +import org.jetbrains.annotations.Nullable; +import org.useless.dragonfly.models.block.StaticBlockModel; -public class BlockModelStellarRewinder extends BlockModelHorizontalRotation { - private static IconCoordinate icon_front = TextureRegistry.getTexture(MoonSteel.MOD_ID + ":block/stellarrewinder_front"); - private static IconCoordinate icon_front_active = TextureRegistry.getTexture(MoonSteel.MOD_ID + ":block/stellarrewinder_front_active"); - public BlockModelStellarRewinder(Block block) { - super(block); +public class BlockModelStellarRewinder extends BlockModelGeneric { + public final StaticBlockModel active; + + + public BlockModelStellarRewinder(Block block, String baseKey) { + super(block, BlockModelDispatcher.loadDataModel(baseKey)); + this.active = BlockModelDispatcher.loadDataModel(baseKey + "_active").asModel(); + } + + @Override + public @NotNull StaticBlockModel getModel(@NotNull WorldSource source, @NotNull TilePosc tilePosc) { + TileEntity tileEntity = source.getTileEntity(tilePosc); + if (tileEntity instanceof TileEntityStellarRewinder rewinder && rewinder.inUse()) { + return this.active; + } + return super.getModel(source, tilePosc); } + + @Override - public IconCoordinate getBlockTexture(@NotNull WorldSource blockAccess, @NotNull TilePosc tilePosc, @NotNull Side side) { - IconCoordinate iconCoordinate = super.getBlockTexture(blockAccess, tilePosc, side); - TileEntityStellarRewinder rewinder = (TileEntityStellarRewinder) blockAccess.getTileEntity(tilePosc); - if (rewinder != null && rewinder.inUse() && iconCoordinate == icon_front){ - iconCoordinate = icon_front_active; + public boolean renderAttached(@NotNull TessellatorGeneral tessellator, @NotNull WorldSource worldSource, @NotNull TilePosc tilePos, boolean cullFaces, @Nullable IconCoordinate overrideTexture) { + Direction direction = BlockLogicRotatable.getDirectionFromMeta(worldSource.getBlockData(tilePos)); + switch (direction) { + case UP -> { + return this.getModel(worldSource, tilePos) + .renderAttached(this, tessellator, worldSource, tilePos, 1, 2, 0, 0.0F, 0.0F, 0.0F, false, cullFaces, overrideTexture); + } + case DOWN -> { + return this.getModel(worldSource, tilePos) + .renderAttached(this, tessellator, worldSource, tilePos, -1, 2, 0, 0.0F, 0.0F, 0.0F, false, cullFaces, overrideTexture); + } + case NORTH -> { + return this.getModel(worldSource, tilePos) + .renderAttached(this, tessellator, worldSource, tilePos, 0, 0, 0, 0.0F, 0.0F, 0.0F, false, cullFaces, overrideTexture); + } + case WEST -> { + return this.getModel(worldSource, tilePos) + .renderAttached(this, tessellator, worldSource, tilePos, 0, 1, 0, 0.0F, 0.0F, 0.0F, false, cullFaces, overrideTexture); + } + case EAST -> { + return this.getModel(worldSource, tilePos) + .renderAttached(this, tessellator, worldSource, tilePos, 0, 3, 0, 0.0F, 0.0F, 0.0F, false, cullFaces, overrideTexture); + } + default -> { + return this.getModel(worldSource, tilePos) + .renderAttached(this, tessellator, worldSource, tilePos, 0, 2, 0, 0.0F, 0.0F, 0.0F, false, cullFaces, overrideTexture); + } } - return iconCoordinate; } } diff --git a/src/main/java/useless/moonsteel/block/BlockStellarRewinder.java b/src/main/java/useless/moonsteel/block/BlockStellarRewinder.java index 855740a..dd60f44 100644 --- a/src/main/java/useless/moonsteel/block/BlockStellarRewinder.java +++ b/src/main/java/useless/moonsteel/block/BlockStellarRewinder.java @@ -2,6 +2,7 @@ import net.minecraft.core.block.Block; import net.minecraft.core.block.BlockLogicRotatable; +import net.minecraft.core.block.entity.TileEntity; import net.minecraft.core.block.material.Material; import net.minecraft.core.entity.player.Player; import net.minecraft.core.item.ItemStack; @@ -10,8 +11,11 @@ import net.minecraft.core.world.pos.TilePosc; import org.jetbrains.annotations.NotNull; import org.jetbrains.annotations.Nullable; +import useless.moonsteel.MoonSteel; import useless.moonsteel.MoonSteelItems; +import java.util.Random; + public class BlockStellarRewinder extends BlockLogicRotatable { //Uses BlockTileEntityRotatable for its rotation properties not because its a tileEntity public BlockStellarRewinder(Block block, Material material) { diff --git a/src/main/java/useless/moonsteel/block/BlockTorchStar.java b/src/main/java/useless/moonsteel/block/BlockTorchStar.java index d30d6fe..797de3b 100644 --- a/src/main/java/useless/moonsteel/block/BlockTorchStar.java +++ b/src/main/java/useless/moonsteel/block/BlockTorchStar.java @@ -5,21 +5,19 @@ import net.minecraft.core.world.World; import net.minecraft.core.world.pos.TilePosc; import org.jetbrains.annotations.NotNull; +import useless.moonsteel.MoonSteel; import java.util.Random; public class BlockTorchStar extends BlockLogicTorch { - public static final String SMOKE = "moonsteel$magic_smoke"; - public static final String STAR = "moonsteel$star"; - public BlockTorchStar(final Block block) { super(block); } @Override public void animationTick(final World world, final @NotNull TilePosc tilePos, final @NotNull Random rand) { final double xPos = tilePos.x() + 0.5; - final double yPos = tilePos.y() + 0.575; + final double yPos = tilePos.y() + 0.6F; final double zPos = tilePos.z() + 0.5; final double d3 = 0.22; final double d4 = 0.27; @@ -28,27 +26,27 @@ public void animationTick(final World world, final @NotNull TilePosc tilePos, fi switch (side) { case SIDE_WEST -> { double px = xPos - d4; - world.spawnParticle(SMOKE, px, py, zPos, 0.0F, 0.0F, 0.0F, 0, false); - world.spawnParticle(STAR, px, py, zPos, 0.0F, 0.0F, 0.0F, 0, false); + world.spawnParticle(MoonSteel.SMOKE, px, py, zPos, 0.0F, 0.0F, 0.0F, 0, false); + world.spawnParticle(MoonSteel.STAR, px, py, zPos, 0.0F, 0.0F, 0.0F, 0, false); } case SIDE_EAST -> { double px = xPos + d4; - world.spawnParticle(SMOKE, px, py, zPos, 0.0F, 0.0F, 0.0F, 0, false); - world.spawnParticle(STAR, px, py, zPos, 0.0F, 0.0F, 0.0F, 0, false); + world.spawnParticle(MoonSteel.SMOKE, px, py, zPos, 0.0F, 0.0F, 0.0F, 0, false); + world.spawnParticle(MoonSteel.STAR, px, py, zPos, 0.0F, 0.0F, 0.0F, 0, false); } case SIDE_SOUTH -> { double pz = zPos + d4; - world.spawnParticle(SMOKE, xPos, py, pz, 0.0F, 0.0F, 0.0F, 0, false); - world.spawnParticle(STAR, xPos, py, pz, 0.0F, 0.0F, 0.0F, 0, false); + world.spawnParticle(MoonSteel.SMOKE, xPos, py, pz, 0.0F, 0.0F, 0.0F, 0, false); + world.spawnParticle(MoonSteel.STAR, xPos, py, pz, 0.0F, 0.0F, 0.0F, 0, false); } case SIDE_BOTTOM -> { - world.spawnParticle(SMOKE, xPos, yPos, zPos, 0.0F, 0.0F, 0.0F, 0, false); - world.spawnParticle(STAR, xPos, yPos, zPos, 0.0F, 0.0F, 0.0F, 0, false); + world.spawnParticle(MoonSteel.SMOKE, xPos, yPos, zPos, 0.0F, 0.0F, 0.0F, 0, false); + world.spawnParticle(MoonSteel.STAR, xPos, yPos, zPos, 0.0F, 0.0F, 0.0F, 0, false); } default -> { // north side is default double pz = zPos - d4; - world.spawnParticle(SMOKE, xPos, py, pz, 0.0F, 0.0F, 0.0F, 0, false); - world.spawnParticle(STAR, xPos, py, pz, 0.0F, 0.0F, 0.0F, 0, false); + world.spawnParticle(MoonSteel.SMOKE, xPos, py, pz, 0.0F, 0.0F, 0.0F, 0, false); + world.spawnParticle(MoonSteel.STAR, xPos, py, pz, 0.0F, 0.0F, 0.0F, 0, false); } } } diff --git a/src/main/java/useless/moonsteel/fx/ParticleMagicSmoke.java b/src/main/java/useless/moonsteel/fx/ParticleMagicSmoke.java index bf0668d..56b147d 100644 --- a/src/main/java/useless/moonsteel/fx/ParticleMagicSmoke.java +++ b/src/main/java/useless/moonsteel/fx/ParticleMagicSmoke.java @@ -12,7 +12,7 @@ public class ParticleMagicSmoke extends ParticleSmoke { private static final IconCoordinate smoke = TextureRegistry.getTexture(MOD_ID + ":item/particle_magicsmoke"); - private float sizeO; + private final float sizeO; public ParticleMagicSmoke(World world, double x, double y, double z, double xa, double ya, double za) { super(world, x, y, z, xa, ya, za, 1.0f, 0); // no scale unsure about data @@ -27,7 +27,7 @@ public ParticleMagicSmoke(World world, double x, double y, double z, double xa, @Override public void render(@NotNull TessellatorParticle tessellatorParticle, float partialTick) { - float f6 = ((float) this.age + partialTick) / (float) this.lifetime * 32.0f; + float f6 = (this.age + partialTick) / this.lifetime * 16.0f; if (f6 < 0.0f) { f6 = 0.0f; } @@ -44,10 +44,7 @@ public float getBrightness(float partialTick) { return super.getBrightness(partialTick) * decay + (1.0f - decay); } -// @Override -// public int getParticleTexture() { -// return 2; -// } + @Override public void tick() { diff --git a/src/main/java/useless/moonsteel/fx/ParticleStar.java b/src/main/java/useless/moonsteel/fx/ParticleStar.java index 2772d40..c3ec48c 100644 --- a/src/main/java/useless/moonsteel/fx/ParticleStar.java +++ b/src/main/java/useless/moonsteel/fx/ParticleStar.java @@ -8,26 +8,18 @@ import net.minecraft.core.util.helper.MathHelper; import net.minecraft.core.world.World; import org.jetbrains.annotations.NotNull; +import useless.moonsteel.mixin.accessor.ParticleFlameAccessor; import static useless.moonsteel.MoonSteel.MOD_ID; public class ParticleStar extends ParticleFlame { private static final IconCoordinate star = TextureRegistry.getTexture(MOD_ID + ":item/particle_star"); - private float sizeO; public ParticleStar(final World world, final double x, final double y, final double z, final double xd, final double yd, final double zd) { super(world, x, y, z, xd, yd, zd, Type.ORANGE); this.tex = star; - this.size *= 2.25f; - this.sizeO = this.size; - } - - - @Override - public void render(@NotNull TessellatorParticle tessellatorParticle, float partialTick) { - final float s = (this.age + partialTick) / (float)this.lifetime; - this.size = this.sizeO * (1.0f - s * s * 0.5f); - super.render(tessellatorParticle, partialTick); + this.size *= 1.25f; + ((ParticleFlameAccessor) this).setOSize(this.size); } @@ -36,8 +28,4 @@ public void tick() { super.tick(); this.tex = star; } -// @Override -// public int getParticleTexture() { -// return 2; -// } } diff --git a/src/main/java/useless/moonsteel/mixin/accessor/ParticleFlameAccessor.java b/src/main/java/useless/moonsteel/mixin/accessor/ParticleFlameAccessor.java new file mode 100644 index 0000000..b28fea1 --- /dev/null +++ b/src/main/java/useless/moonsteel/mixin/accessor/ParticleFlameAccessor.java @@ -0,0 +1,14 @@ +package useless.moonsteel.mixin.accessor; + +import net.minecraft.client.render.particle.ParticleFlame; +import org.spongepowered.asm.mixin.Mixin; +import org.spongepowered.asm.mixin.Mutable; +import org.spongepowered.asm.mixin.gen.Accessor; + +@Mixin(ParticleFlame.class) +public interface ParticleFlameAccessor { + + @Mutable + @Accessor + void setOSize(float oSize); +} diff --git a/src/main/resources/assets/moonsteel/lang/en_US/en_US.lang b/src/main/resources/assets/moonsteel/lang/en_US/en_US.lang index 8f86ac3..4595967 100644 --- a/src/main/resources/assets/moonsteel/lang/en_US/en_US.lang +++ b/src/main/resources/assets/moonsteel/lang/en_US/en_US.lang @@ -42,3 +42,6 @@ moonsteel.teleport.fail.dimension=Star is linked to a different dimension. moonsteel.container.backpack.star.name=Stardust Backpack subtitles.moonsteel.starspawn=Starfall + +tile.moonsteel.star.lamp.name=Star Lamp +tile.moonsteel.star.lamp.desc=Shiny new lamp. diff --git a/src/main/resources/assets/moonsteel/lang/ru_RU/ru_RU.lang b/src/main/resources/assets/moonsteel/lang/ru_RU/ru_RU.lang index 9e3dec1..d3de3fb 100644 --- a/src/main/resources/assets/moonsteel/lang/ru_RU/ru_RU.lang +++ b/src/main/resources/assets/moonsteel/lang/ru_RU/ru_RU.lang @@ -40,3 +40,5 @@ moonsteel.teleport.fail.missing=Якорь был сломан, невозмож moonsteel.teleport.fail.dimension=Якорь в другом измерение! moonsteel.container.backpack.star.name=Звезвдный Рюкзак +tile.moonsteel.star.lamp.name=Звёздная лампа +tile.moonsteel.star.lamp.desc=Новая блестящая лампа. diff --git a/src/main/resources/assets/moonsteel/models/block/rewinder.json b/src/main/resources/assets/moonsteel/models/block/rewinder.json deleted file mode 100644 index e69de29..0000000 diff --git a/src/main/resources/assets/moonsteel/models/block/starlamp.json b/src/main/resources/assets/moonsteel/models/block/starlamp.json new file mode 100644 index 0000000..dec524c --- /dev/null +++ b/src/main/resources/assets/moonsteel/models/block/starlamp.json @@ -0,0 +1,86 @@ +{ + "format_version": "1.21.11", + "credit": "Made with Blockbench", + "textures": { + "0": "moonsteel:block/starlamp", + "particle": "moonsteel:block/starlamp" + }, + "elements": [ + { + "name": "top_lamp", + "from": [0, 8.5, 14], + "to": [16, 9.5, 15], + "rotation": {"angle": 0, "axis": "y", "origin": [0, 8.5, 13]}, + "faces": { + "north": {"uv": [0, 11, 16, 12], "texture": "#0"}, + "east": {"uv": [0, 11, 1, 12], "texture": "#0"}, + "west": {"uv": [15, 11, 16, 12], "texture": "#0"}, + "up": {"uv": [0, 10, 16, 11], "texture": "#0"}, + "down": {"uv": [0, 12, 16, 13], "texture": "#0"} + } + }, + { + "name": "bottom_lamp", + "from": [0, 6.5, 14], + "to": [16, 7.5, 15], + "rotation": {"angle": 0, "axis": "y", "origin": [0, 6.5, 13]}, + "faces": { + "north": {"uv": [0, 11, 16, 12], "texture": "#0"}, + "east": {"uv": [0, 11, 1, 12], "texture": "#0"}, + "west": {"uv": [15, 11, 16, 12], "texture": "#0"}, + "up": {"uv": [0, 10, 16, 11], "texture": "#0"}, + "down": {"uv": [0, 12, 16, 13], "texture": "#0"} + } + }, + { + "name": "holder", + "from": [0, 5.5, 15], + "to": [16, 10.5, 16], + "rotation": {"angle": 0, "axis": "y", "origin": [0, 5.5, 15]}, + "faces": { + "north": {"uv": [0, 3, 16, 8], "texture": "#0"}, + "east": {"uv": [0, 3, 1, 8], "texture": "#0"}, + "south": {"uv": [1, 7, 15, 4], "texture": "#0"}, + "west": {"uv": [15, 3, 16, 8], "texture": "#0"}, + "up": {"uv": [0, 3, 16, 4], "texture": "#0"}, + "down": {"uv": [0, 7, 16, 8], "texture": "#0"} + } + } + ], + "display": { + "thirdperson_righthand": { + "rotation": [-90, 90, 10], + "translation": [-7.5, 1.25, 1.25], + "scale": [0.5, 1, 1] + }, + "thirdperson_lefthand": { + "rotation": [-90, 90, 10], + "translation": [-7.5, 1.25, 1.25], + "scale": [0.5, 1, 1] + }, + "firstperson_righthand": { + "rotation": [45, 70, 0], + "translation": [0, 0, -7.5], + "scale": [0.5, 1, 1] + }, + "firstperson_lefthand": { + "rotation": [45, 70, 0], + "translation": [0, 0, -7.5], + "scale": [0.5, 1, 1] + }, + "ground": { + "translation": [0, 0, -8], + "scale": [0.5, 1, 1] + }, + "gui": { + "rotation": [20, -135, 0], + "translation": [10, -3.75, 80], + "scale": [1, 2, 2] + }, + "head": { + "rotation": [90, 0, 0], + "translation": [-0.25, 22, -0.25], + "scale": [1, 1, 2] + } + } +} \ No newline at end of file diff --git a/src/main/resources/assets/moonsteel/models/block/stellarrewinder.json b/src/main/resources/assets/moonsteel/models/block/stellarrewinder.json new file mode 100644 index 0000000..0314495 --- /dev/null +++ b/src/main/resources/assets/moonsteel/models/block/stellarrewinder.json @@ -0,0 +1,18 @@ +{ + "parent": "minecraft:block/orientable_with_sides", + "display": { + "firstperson_righthand": { + "rotation": [ 0, -45, 0 ], + "translation": [ 0, 0, 0 ], + "scale": [ 0.40, 0.40, 0.40 ] + } + }, + "textures": { + "top": "moonsteel:block/stellarrewinder_top", + "bottom": "moonsteel:block/stellarrewinder_top", + "back": "moonsteel:block/stellarrewinder_side", + "front": "moonsteel:block/stellarrewinder_front", + "left": "moonsteel:block/stellarrewinder_side", + "right": "moonsteel:block/stellarrewinder_side" + } +} diff --git a/src/main/resources/assets/moonsteel/models/block/stellarrewinder_active.json b/src/main/resources/assets/moonsteel/models/block/stellarrewinder_active.json new file mode 100644 index 0000000..c2c799e --- /dev/null +++ b/src/main/resources/assets/moonsteel/models/block/stellarrewinder_active.json @@ -0,0 +1,6 @@ +{ + "parent": "moonsteel:block/stellarrewinder", + "textures": { + "front": "moonsteel:block/stellarrewinder_front_active" + } +} diff --git a/src/main/resources/assets/moonsteel/textures/block/starlamp.png b/src/main/resources/assets/moonsteel/textures/block/starlamp.png new file mode 100644 index 0000000000000000000000000000000000000000..ed20ee3d4060277b5265d3d63975fd54c9be903b GIT binary patch literal 797 zcmeAS@N?(olHy`uVBq!ia0vp^0wB!6#=yXs@#Xw?AcwIy$lZxy-8q?;Kn_c~qpu?a z!^VE@KZ&eBK4*bPWHAE+-(e7DJf6QI1t=(4;u=vBoS#-wo>-L15RjOeSEA?V8lqsT zXQ*dr*u^1s4yb5HYJ_K+r>7PJ2av3CK2NWMU8m z(osO1+0FtM&jGSQAOVO$`e8J>tqcsz3=9+48CZa742+Bo7#Bdy1?gd305NMCkPQM% zK$DojDuXO7fGnskLjwblESu?-;!XWU)J_i3`l$Cd!%@^2oDd4iAfUHQ1l7qpNk5Vpcer()*@8)+t^>bpH0WB?uCayb| z@$B5(V)^F%2M=zp{aReL#HoJOp2_{EZoHFU^fGHh4ttyB`n!6Ld+NUjy?uA5J&&Wt z_FqhXeAADTFCM*a$`N7Ak3Saftz|uOS-t=2y?c6XhZ*xtA6n>5GC7pB^T3hM33qP) zZ1Vfg^Y)y`wp{1SraQbGR~qN2?tf)*o$KSbv)raKJP+>e=yf~XD&R2h_zWMlA7=mf zeBBIF<|ue(yku=pY%z#X?n#k-&ed_4pFec_W!L=O=S9vR7T4%znrD7A$E);qUJZU@^E9j}*eTiUXU zDJ(pYU=h2M6bkdET7`L?nR8@#h!Crl~12^#V93z@|?A)=Ve-LT#wG_ zg+J>$M9=awtqI$r&@zQHenO4z%^6b+uVtUSRowMr^Ag=@c7F`k2>)d7xV~O)h4ovr z=U>#K)<&lYFUu?{lRb6*hP5mcn=S8>De^4Et0EM9wLi(%U9D&PAid?>kMDCuWI(Bl N!PC{xWt~$(6988e8HWG> literal 0 HcmV?d00001 diff --git a/src/main/resources/moonsteel.mixins.json b/src/main/resources/moonsteel.mixins.json index 0c00886..89dbd5e 100644 --- a/src/main/resources/moonsteel.mixins.json +++ b/src/main/resources/moonsteel.mixins.json @@ -17,6 +17,7 @@ "stella.PlayerServerMixinStella" ], "mixins": [ + "accessor.ParticleFlameAccessor", "WorldFeatureLabyrinthMixinRewards", "accessor.ItemToolSwordAccessor", "armor.MobMixin", From f8fc9ac11ff571c6fc387c5905b639c9d7761504 Mon Sep 17 00:00:00 2001 From: Redart15 Date: Thu, 17 Sep 2026 15:42:23 +0200 Subject: [PATCH 08/13] some small changes --- .../java/useless/moonsteel/MoonSteel.java | 2 ++ .../useless/moonsteel/MoonSteelItems.java | 1 + .../moonsteel/MoonSteelMixinPlugin.java | 7 +++---- .../useless/moonsteel/MoonSteelModels.java | 2 +- .../moonsteel/block/BlockStellarRewinder.java | 17 +++++++++++------ .../moonsteel/item/ItemConnectedStar.java | 19 ++++++++++++++----- .../moonsteel/item/ItemModelConnectStar.java | 5 ++--- .../assets/moonsteel/lang/en_US/en_US.lang | 1 + 8 files changed, 35 insertions(+), 19 deletions(-) diff --git a/src/main/java/useless/moonsteel/MoonSteel.java b/src/main/java/useless/moonsteel/MoonSteel.java index 06721db..5acd0ad 100644 --- a/src/main/java/useless/moonsteel/MoonSteel.java +++ b/src/main/java/useless/moonsteel/MoonSteel.java @@ -31,6 +31,7 @@ public class MoonSteel implements ModInitializer { public static final String MOD_ID = HalpLibe.registerMod("moonsteel"); + public static final String MOJANG_ID = HalpLibe.registerMod("sound3"); public static final Key KEY = Key.of(MOD_ID); public static final Logger LOGGER = LoggerFactory.getLogger(MOD_ID); public static final String SMOKE = "moonsteel$magic_smoke"; @@ -75,6 +76,7 @@ public void onInitialize() { public void beforeGameStart() { SoundTypes.loadSoundsJson(MOD_ID); + SoundTypes.loadSoundsJson(MOJANG_ID); TileEntityDispatcher.addMapping( TileEntityStellarRewinder.class, NamespaceID.fromPool(MOD_ID, "moonsteel$stellar_rewinder") diff --git a/src/main/java/useless/moonsteel/MoonSteelItems.java b/src/main/java/useless/moonsteel/MoonSteelItems.java index 301859c..ebd5d04 100644 --- a/src/main/java/useless/moonsteel/MoonSteelItems.java +++ b/src/main/java/useless/moonsteel/MoonSteelItems.java @@ -35,6 +35,7 @@ private MoonSteelItems(){} public static final Item TOOL_HOE_MOONSTEEL = new ItemBuilder(MOD_ID) .build(new ItemToolHoe("tool.hoe.moonsteel", MOD_ID + ":item/tool_hoe_moonsteel", MoonSteel.itemId++, MOON_STEEL_TOOL)); public static final Item TOOL_SWORD_MOONSTEEL = new ItemBuilder(MOD_ID) + .addTags(ItemTags.PREVENT_CREATIVE_MINING) .build(new ItemToolSword("tool.sword.moonsteel", MOD_ID + ":item/tool_sword_moonsteel", MoonSteel.itemId++, MOON_STEEL_TOOL)); public static final ArmorMaterial MOON_STEEL_ARMOR = ArmorHelper.createArmorMaterial(MOD_ID, "moonsteel", 800, 51f, 45f, 45f, 100f); diff --git a/src/main/java/useless/moonsteel/MoonSteelMixinPlugin.java b/src/main/java/useless/moonsteel/MoonSteelMixinPlugin.java index 5678c1e..7b2aa4a 100644 --- a/src/main/java/useless/moonsteel/MoonSteelMixinPlugin.java +++ b/src/main/java/useless/moonsteel/MoonSteelMixinPlugin.java @@ -8,11 +8,10 @@ import java.util.Collections; import java.util.List; import java.util.Set; -import java.util.function.Supplier; +import java.util.function.BooleanSupplier; public class MoonSteelMixinPlugin implements IMixinConfigPlugin { - // TODO make Intelij happy - private static final Supplier BACKPACKS = () -> FabricLoader.getInstance().isModLoaded("betterwithbackpacks"); + private static final BooleanSupplier BACKPACKS = () -> FabricLoader.getInstance().isModLoaded("betterwithbackpacks"); @Override public void onLoad(String mixinPackage) { @@ -26,7 +25,7 @@ public String getRefMapperConfig() { @Override public boolean shouldApplyMixin(String targetClassName, String mixinClassName) { - if (mixinClassName.startsWith("useless.moonsteel.mixin.backpack")) return BACKPACKS.get(); + if (mixinClassName.startsWith("useless.moonsteel.mixin.backpack")) return BACKPACKS.getAsBoolean(); return true; } diff --git a/src/main/java/useless/moonsteel/MoonSteelModels.java b/src/main/java/useless/moonsteel/MoonSteelModels.java index f9f6092..090925e 100644 --- a/src/main/java/useless/moonsteel/MoonSteelModels.java +++ b/src/main/java/useless/moonsteel/MoonSteelModels.java @@ -43,7 +43,7 @@ public static void initItemModels(final ItemModelDispatcher dispatcher) { dispatcher.addDispatch(makeModel(MoonSteelItems.ARMOR_LEGGINGS_MOONSTEEL, "moonsteel_leggings")); dispatcher.addDispatch(makeModel(MoonSteelItems.ARMOR_BOOTS_MOONSTEEL, "moonsteel_boots")); dispatcher.addDispatch(makeModel(MoonSteelItems.STAR_FALLEN, "fallen_star").setFullBright()); - dispatcher.addDispatch(setIcon(new ItemModelConnectStar(MoonSteelItems.STAR_CONNECTED, null), MOD_ID + ":item/connected_star_off").setFullBright()); + dispatcher.addDispatch(setIcon(new ItemModelConnectStar(MoonSteelItems.STAR_CONNECTED), MOD_ID + ":item/connected_star_off").setFullBright()); dispatcher.addDispatch(makeModel(MoonSteelItems.BACKPACK_COSMIC, "starpack")); } diff --git a/src/main/java/useless/moonsteel/block/BlockStellarRewinder.java b/src/main/java/useless/moonsteel/block/BlockStellarRewinder.java index dd60f44..0313417 100644 --- a/src/main/java/useless/moonsteel/block/BlockStellarRewinder.java +++ b/src/main/java/useless/moonsteel/block/BlockStellarRewinder.java @@ -11,12 +11,13 @@ import net.minecraft.core.world.pos.TilePosc; import org.jetbrains.annotations.NotNull; import org.jetbrains.annotations.Nullable; -import useless.moonsteel.MoonSteel; import useless.moonsteel.MoonSteelItems; import java.util.Random; public class BlockStellarRewinder extends BlockLogicRotatable { + private static final Random random = new Random(); + //Uses BlockTileEntityRotatable for its rotation properties not because its a tileEntity public BlockStellarRewinder(Block block, Material material) { super(block, material); @@ -26,11 +27,15 @@ public BlockStellarRewinder(Block block, Material material) { @Override public boolean onInteracted(@NotNull World world, @NotNull TilePosc tilePos, @NotNull Player player, @Nullable Side side, double xHit, double yHit) { ItemStack heldItem = player.getHeldItem(); - TileEntityStellarRewinder rewinder = (TileEntityStellarRewinder) world.getTileEntity(tilePos); - if (heldItem != null && heldItem.getItem() == MoonSteelItems.STAR_CONNECTED && rewinder != null){ - rewinder.linkStar(heldItem); - return true; - } + TileEntity tileEntity = world.getTileEntity(tilePos); + if(tileEntity instanceof TileEntityStellarRewinder rewinder + && heldItem != null + && heldItem.getItem() == MoonSteelItems.STAR_CONNECTED + ){ + rewinder.linkStar(heldItem); + world.playSoundAtEntity(null, player, "ui.ui_click", 5, 1f + random.nextFloat() * 0.1f); + return true; + } return false; } diff --git a/src/main/java/useless/moonsteel/item/ItemConnectedStar.java b/src/main/java/useless/moonsteel/item/ItemConnectedStar.java index 6f31962..67ae286 100644 --- a/src/main/java/useless/moonsteel/item/ItemConnectedStar.java +++ b/src/main/java/useless/moonsteel/item/ItemConnectedStar.java @@ -4,6 +4,7 @@ import net.minecraft.core.entity.player.Player; import net.minecraft.core.item.Item; import net.minecraft.core.item.ItemStack; +import net.minecraft.core.sound.SoundCategory; import net.minecraft.core.util.helper.MathHelper; import net.minecraft.core.util.helper.Side; import net.minecraft.core.world.World; @@ -16,14 +17,19 @@ import useless.moonsteel.block.TileEntityStellarRewinder; import useless.moonsteel.interfaces.ITeleporter; +import java.util.Random; + public class ItemConnectedStar extends Item { + private Random RANDOM = new Random(); + + public ItemConnectedStar(String name, String namespaceId, int id) { super(name, namespaceId, id); } @Override public @Nullable ItemStack onUse(@NotNull ItemStack itemstack, @NotNull World world, @NotNull Player entityplayer) { - if (itemstack.getData().getBoolean("moonsteel$has_location")){ + if (itemstack.getData().getBoolean("moonsteel$has_location")) { int destX = itemstack.getData().getInteger("moonsteel$x"); int destY = itemstack.getData().getInteger("moonsteel$y"); int destZ = itemstack.getData().getInteger("moonsteel$z"); @@ -37,20 +43,23 @@ public ItemConnectedStar(String name, String namespaceId, int id) { entityplayer.sendMessageTranslated("moonsteel.teleport.fail.score"); return itemstack; } + ChunkPos chunkPosc = new ChunkPos(destX >> 4, destZ >> 4); + ChunkTilePos chunkTilePos = new ChunkTilePos(destX, destY, destZ); MoonSteel.forceChunkLoads = true; - Chunk chunk = world.getChunkProvider().provideChunk(new ChunkPos(destX >> 4, destZ >> 4), true); + world.isChunkLoaded(chunkPosc); + Chunk chunk = world.getChunkProvider().provideChunk(chunkPosc, true); MoonSteel.forceChunkLoads = false; - ChunkTilePos chunkTilePos = new ChunkTilePos(destX, destY, destZ); TileEntity te = chunk.getTileEntity(chunkTilePos); - if (te instanceof TileEntityStellarRewinder tileEntityStellarRewinder && tileEntityStellarRewinder.canTeleport(itemstack)){ + if (te instanceof TileEntityStellarRewinder tileEntityStellarRewinder && tileEntityStellarRewinder.canTeleport(itemstack)) { entityplayer.score -= cost; Side side = tileEntityStellarRewinder.side(); ((ITeleporter) entityplayer).moonsteel$teleport(destX + side.offsetX() + 0.5f, destY + side.offsetY(), destZ + side.offsetZ() + 0.5f); tileEntityStellarRewinder.setInUse(false); + world.playSoundEffect(null, SoundCategory.WORLD_SOUNDS, entityplayer.x, entityplayer.y, entityplayer.z, "moonsteel:starspawn", 5, 1f + RANDOM.nextFloat() * 0.1f); + itemstack.getData().putBoolean("moonsteel$has_location", false); } else if (!world.isClientSide) { entityplayer.sendMessageTranslated("moonsteel.teleport.fail.missing"); } - itemstack.getData().putBoolean("moonsteel$has_location", false); } return itemstack; } diff --git a/src/main/java/useless/moonsteel/item/ItemModelConnectStar.java b/src/main/java/useless/moonsteel/item/ItemModelConnectStar.java index 387f9a3..eb120c5 100644 --- a/src/main/java/useless/moonsteel/item/ItemModelConnectStar.java +++ b/src/main/java/useless/moonsteel/item/ItemModelConnectStar.java @@ -13,9 +13,8 @@ public class ItemModelConnectStar extends ItemModelStandard { private static final IconCoordinate star_connected = TextureRegistry.getTexture(MoonSteel.MOD_ID + ":item/connected_star"); - //TODO remove the namespace constructor with namespace, it still need for some textures so I leave it for later - public ItemModelConnectStar(final Item item, final String namespace) { - super(item, namespace); + public ItemModelConnectStar(final Item item) { + super(item, true); } @NotNull diff --git a/src/main/resources/assets/moonsteel/lang/en_US/en_US.lang b/src/main/resources/assets/moonsteel/lang/en_US/en_US.lang index 4595967..8db1269 100644 --- a/src/main/resources/assets/moonsteel/lang/en_US/en_US.lang +++ b/src/main/resources/assets/moonsteel/lang/en_US/en_US.lang @@ -42,6 +42,7 @@ moonsteel.teleport.fail.dimension=Star is linked to a different dimension. moonsteel.container.backpack.star.name=Stardust Backpack subtitles.moonsteel.starspawn=Starfall +subtitles.moonsteel.click.rewinder=Star Link tile.moonsteel.star.lamp.name=Star Lamp tile.moonsteel.star.lamp.desc=Shiny new lamp. From 7176c26981e3580c9a7581012926b52a938bd8ec Mon Sep 17 00:00:00 2001 From: Redart15 Date: Thu, 17 Sep 2026 17:38:15 +0200 Subject: [PATCH 09/13] small adjustments --- src/main/java/useless/moonsteel/item/ItemConnectedStar.java | 1 + 1 file changed, 1 insertion(+) diff --git a/src/main/java/useless/moonsteel/item/ItemConnectedStar.java b/src/main/java/useless/moonsteel/item/ItemConnectedStar.java index 67ae286..ada8019 100644 --- a/src/main/java/useless/moonsteel/item/ItemConnectedStar.java +++ b/src/main/java/useless/moonsteel/item/ItemConnectedStar.java @@ -59,6 +59,7 @@ public ItemConnectedStar(String name, String namespaceId, int id) { itemstack.getData().putBoolean("moonsteel$has_location", false); } else if (!world.isClientSide) { entityplayer.sendMessageTranslated("moonsteel.teleport.fail.missing"); + itemstack.getData().putBoolean("moonsteel$has_location", false); } } return itemstack; From 4e247b41fe62508e7dcf085eb4523faf94384a9e Mon Sep 17 00:00:00 2001 From: Redart15 Date: Mon, 21 Sep 2026 01:34:01 +0200 Subject: [PATCH 10/13] added a couple of block, some items, wolf armor, fixed rewinder, added some textures for later, --- build.gradle.kts | 9 +- gradle/libs.versions.toml | 6 +- .../java/useless/moonsteel/MoonSteel.java | 17 +- .../useless/moonsteel/MoonSteelBlocks.java | 88 ---------- .../useless/moonsteel/MoonSteelClient.java | 10 ++ .../useless/moonsteel/MoonSteelItems.java | 75 --------- .../useless/moonsteel/MoonSteelModels.java | 19 ++- .../useless/moonsteel/MoonSteelServer.java | 13 ++ .../moonsteel/api/MoonSteelCompat.java | 25 +++ .../moonsteel/api/MoonSteelCompatClient.java | 20 +++ .../{ => api}/MoonSteelMixinPlugin.java | 2 +- .../{ => api}/backpack/BackpackProxy.java | 2 +- .../backpack}/ContainerStarBackpack.java | 7 +- .../{ => api}/backpack/GuiStarBackpack.java | 3 +- .../backpack}/IStarBackpack.java | 4 +- .../{ => api}/backpack/ItemStarBackpack.java | 3 +- .../{ => api}/backpack/SlotStarBackpack.java | 2 +- .../backpack/StarBackpackInventory.java | 4 +- .../moonsteel/api/paxel/MoonSteelPaxel.java | 54 ++++++ .../moonsteel/block/MoonSteelBlocks.java | 148 +++++++++++++++++ .../block/jar/BlockLogicLantern.java | 136 +++++++++++++++ .../block/{ => lamp}/BlockLogicStarLamp.java | 3 +- .../block/{ => lamp}/BlockModelStarLamp.java | 2 +- .../BlockModelStellarRewinder.java | 2 +- .../{ => rewinder}/BlockStellarRewinder.java | 4 +- .../TileEntityStellarRewinder.java | 2 +- .../moonsteel/command/CommandScore.java | 157 ++++++++++++++++++ .../moonsteel/item/MoonSteelItems.java | 114 +++++++++++++ .../connectstar}/ITeleporter.java | 2 +- .../{ => connectstar}/ItemConnectedStar.java | 47 ++++-- .../ItemModelConnectStar.java | 2 +- .../WorldFeatureLabyrinthMixinRewards.java | 2 +- .../accessor/ChunkProviderServerAccessor.java | 14 ++ .../ChunkProviderThreadedAccessor.java | 14 ++ .../moonsteel/mixin/armor/MobMixin.java | 2 +- .../armor/MobRenderZombieArmoredMixin.java | 2 +- .../moonsteel/mixin/armor/MobWolfMixin.java | 22 +++ .../mixin/armor/MobZombieArmoredMixin.java | 2 +- .../mixin/armor/PlayerMixinEquipment.java | 2 +- .../mixin/backpack/MinecraftMixinRespawn.java | 2 +- .../backpack/PacketHandlerClientMixinGui.java | 2 +- .../backpack/PlayerListMixinRespawn.java | 2 +- .../mixin/backpack/PlayerLocalMixinGui.java | 2 +- .../moonsteel/mixin/backpack/PlayerMixin.java | 4 +- .../mixin/backpack/PlayerServerMixin.java | 2 +- .../mixin/fortune/BlockLogicMixin.java | 70 +++++++- .../mixin/starfallen/EntityItemMixin.java | 2 +- .../mixin/starfallen/WorldMixinStarFall.java | 2 +- .../mixin/stella/PlayerMixinStella.java | 2 +- .../{ => recipe}/MoonSteelRecipes.java | 17 +- .../assets/moonsteel/lang/en_US/en_US.lang | 24 +++ .../assets/moonsteel/lang/ru_RU/ru_RU.lang | 10 ++ .../moonsteel/models/block/jar_star.json | 6 + .../models/block/jar_star_hanging.json | 6 + .../models/block/moonsteel_brick.json | 6 + .../models/block/moonsteel_stair.json | 8 + .../moonsteel/models/block/slab/full.json | 6 + .../moonsteel/models/block/slab/lower.json | 8 + .../moonsteel/models/block/slab/upper.json | 8 + .../assets/moonsteel/oldTex/build.txt | 0 .../moonsteel/oldTex/chestplate/full.png | Bin 0 -> 166 bytes .../moonsteel/oldTex/chestplate/half.png | Bin 0 -> 170 bytes .../oldTex/chestplate/half_flipped.png | Bin 0 -> 169 bytes .../armor/boots/full/moonsteel.png | Bin 0 -> 430 bytes .../armor/boots/half/flipped/gold.png | Bin 0 -> 436 bytes .../armor/boots/half/moonsteel.png | Bin 0 -> 434 bytes .../armor/chestplate/full/moonsteel.png | Bin 0 -> 459 bytes .../chestplate/half/flipped/moonsteel.png | Bin 0 -> 451 bytes .../armor/chestplate/half/moonsteel.png | Bin 0 -> 462 bytes .../armor/helmet/full/moonsteel.png | Bin 0 -> 430 bytes .../armor/helmet/half/flipped/moonsteel.png | Bin 0 -> 435 bytes .../armor/helmet/half/moonsteel.png | Bin 0 -> 430 bytes .../armor/leggings/full/moonsteel.png | Bin 0 -> 425 bytes .../armor/leggings/half/flipped/moonsteel.png | Bin 0 -> 425 bytes .../armor/leggings/half/moonsteel.png | Bin 0 -> 429 bytes .../climbing_pickaxe_moonsteel.png | Bin 0 -> 812 bytes .../extra_armor_moonsteel_1.png | Bin 0 -> 952 bytes .../fishingrod_moonsteel.png | Bin 0 -> 239 bytes .../ingot_moonsteel_crude.png | Bin 0 -> 908 bytes .../mining_hammer_moonsteel.png | Bin 0 -> 812 bytes .../moonsteel ruby assets/moonsteel_crown.png | Bin 0 -> 765 bytes .../moonsteel_pendant_and_gloves.png | Bin 0 -> 647 bytes .../moonsteel_shield.png | Bin 0 -> 255 bytes .../moonsteelchestbottom.png | Bin 0 -> 1007 bytes .../moonsteelchestfront.png | Bin 0 -> 1189 bytes .../moonsteelchestside.png | Bin 0 -> 1151 bytes .../moonsteelchesttop.png | Bin 0 -> 962 bytes .../tool_hammer_moonsteel.png | Bin 0 -> 494 bytes .../tool_sickle_moonsteel.png | Bin 0 -> 490 bytes .../textures/armor/wolf/moonsteel.png | Bin 0 -> 718 bytes .../textures/art/borders/border_moonsteel.png | Bin 0 -> 2870 bytes .../moonsteel/textures/block/jar_star.png | Bin 0 -> 3183 bytes .../textures/block/moonsteel_brick.png | Bin 0 -> 830 bytes .../item/armor_chestplate_moonsteel/full.png | Bin 166 -> 459 bytes .../item/armor_chestplate_moonsteel/half.png | Bin 170 -> 462 bytes .../half_flipped.png | Bin 169 -> 451 bytes .../textures/item/armor_gloves_moonsteel.png | Bin 0 -> 486 bytes .../textures/item/armor_pendant_moonsteel.png | Bin 0 -> 475 bytes .../moonsteel/textures/item/jar_star.png | Bin 0 -> 526 bytes .../textures/item/moonsteel_paxel.png | Bin 0 -> 273 bytes .../textures/item/moonsteel_wolf_armor.png | Bin 0 -> 277 bytes src/main/resources/fabric.mod.json | 3 +- src/main/resources/moonsteel.mixins.json | 7 +- 103 files changed, 1001 insertions(+), 240 deletions(-) delete mode 100644 src/main/java/useless/moonsteel/MoonSteelBlocks.java delete mode 100644 src/main/java/useless/moonsteel/MoonSteelItems.java create mode 100644 src/main/java/useless/moonsteel/MoonSteelServer.java create mode 100644 src/main/java/useless/moonsteel/api/MoonSteelCompat.java create mode 100644 src/main/java/useless/moonsteel/api/MoonSteelCompatClient.java rename src/main/java/useless/moonsteel/{ => api}/MoonSteelMixinPlugin.java (97%) rename src/main/java/useless/moonsteel/{ => api}/backpack/BackpackProxy.java (84%) rename src/main/java/useless/moonsteel/{ => api/backpack}/ContainerStarBackpack.java (92%) rename src/main/java/useless/moonsteel/{ => api}/backpack/GuiStarBackpack.java (95%) rename src/main/java/useless/moonsteel/{interfaces => api/backpack}/IStarBackpack.java (69%) rename src/main/java/useless/moonsteel/{ => api}/backpack/ItemStarBackpack.java (88%) rename src/main/java/useless/moonsteel/{ => api}/backpack/SlotStarBackpack.java (92%) rename src/main/java/useless/moonsteel/{ => api}/backpack/StarBackpackInventory.java (97%) create mode 100644 src/main/java/useless/moonsteel/api/paxel/MoonSteelPaxel.java create mode 100644 src/main/java/useless/moonsteel/block/MoonSteelBlocks.java create mode 100644 src/main/java/useless/moonsteel/block/jar/BlockLogicLantern.java rename src/main/java/useless/moonsteel/block/{ => lamp}/BlockLogicStarLamp.java (98%) rename src/main/java/useless/moonsteel/block/{ => lamp}/BlockModelStarLamp.java (98%) rename src/main/java/useless/moonsteel/block/{ => rewinder}/BlockModelStellarRewinder.java (98%) rename src/main/java/useless/moonsteel/block/{ => rewinder}/BlockStellarRewinder.java (94%) rename src/main/java/useless/moonsteel/block/{ => rewinder}/TileEntityStellarRewinder.java (98%) create mode 100644 src/main/java/useless/moonsteel/command/CommandScore.java create mode 100644 src/main/java/useless/moonsteel/item/MoonSteelItems.java rename src/main/java/useless/moonsteel/{interfaces => item/connectstar}/ITeleporter.java (67%) rename src/main/java/useless/moonsteel/item/{ => connectstar}/ItemConnectedStar.java (59%) rename src/main/java/useless/moonsteel/item/{ => connectstar}/ItemModelConnectStar.java (95%) create mode 100644 src/main/java/useless/moonsteel/mixin/accessor/ChunkProviderServerAccessor.java create mode 100644 src/main/java/useless/moonsteel/mixin/accessor/ChunkProviderThreadedAccessor.java create mode 100644 src/main/java/useless/moonsteel/mixin/armor/MobWolfMixin.java rename src/main/java/useless/moonsteel/{ => recipe}/MoonSteelRecipes.java (90%) create mode 100644 src/main/resources/assets/moonsteel/models/block/jar_star.json create mode 100644 src/main/resources/assets/moonsteel/models/block/jar_star_hanging.json create mode 100644 src/main/resources/assets/moonsteel/models/block/moonsteel_brick.json create mode 100644 src/main/resources/assets/moonsteel/models/block/moonsteel_stair.json create mode 100644 src/main/resources/assets/moonsteel/models/block/slab/full.json create mode 100644 src/main/resources/assets/moonsteel/models/block/slab/lower.json create mode 100644 src/main/resources/assets/moonsteel/models/block/slab/upper.json rename build.fff => src/main/resources/assets/moonsteel/oldTex/build.txt (100%) create mode 100644 src/main/resources/assets/moonsteel/oldTex/chestplate/full.png create mode 100644 src/main/resources/assets/moonsteel/oldTex/chestplate/half.png create mode 100644 src/main/resources/assets/moonsteel/oldTex/chestplate/half_flipped.png create mode 100644 src/main/resources/assets/moonsteel/oldTex/moonsteel ruby assets/armor/boots/full/moonsteel.png create mode 100644 src/main/resources/assets/moonsteel/oldTex/moonsteel ruby assets/armor/boots/half/flipped/gold.png create mode 100644 src/main/resources/assets/moonsteel/oldTex/moonsteel ruby assets/armor/boots/half/moonsteel.png create mode 100644 src/main/resources/assets/moonsteel/oldTex/moonsteel ruby assets/armor/chestplate/full/moonsteel.png create mode 100644 src/main/resources/assets/moonsteel/oldTex/moonsteel ruby assets/armor/chestplate/half/flipped/moonsteel.png create mode 100644 src/main/resources/assets/moonsteel/oldTex/moonsteel ruby assets/armor/chestplate/half/moonsteel.png create mode 100644 src/main/resources/assets/moonsteel/oldTex/moonsteel ruby assets/armor/helmet/full/moonsteel.png create mode 100644 src/main/resources/assets/moonsteel/oldTex/moonsteel ruby assets/armor/helmet/half/flipped/moonsteel.png create mode 100644 src/main/resources/assets/moonsteel/oldTex/moonsteel ruby assets/armor/helmet/half/moonsteel.png create mode 100644 src/main/resources/assets/moonsteel/oldTex/moonsteel ruby assets/armor/leggings/full/moonsteel.png create mode 100644 src/main/resources/assets/moonsteel/oldTex/moonsteel ruby assets/armor/leggings/half/flipped/moonsteel.png create mode 100644 src/main/resources/assets/moonsteel/oldTex/moonsteel ruby assets/armor/leggings/half/moonsteel.png create mode 100644 src/main/resources/assets/moonsteel/oldTex/moonsteel ruby assets/climbing_pickaxe_moonsteel.png create mode 100644 src/main/resources/assets/moonsteel/oldTex/moonsteel ruby assets/extra_armor_moonsteel_1.png create mode 100644 src/main/resources/assets/moonsteel/oldTex/moonsteel ruby assets/fishingrod_moonsteel.png create mode 100644 src/main/resources/assets/moonsteel/oldTex/moonsteel ruby assets/ingot_moonsteel_crude.png create mode 100644 src/main/resources/assets/moonsteel/oldTex/moonsteel ruby assets/mining_hammer_moonsteel.png create mode 100644 src/main/resources/assets/moonsteel/oldTex/moonsteel ruby assets/moonsteel_crown.png create mode 100644 src/main/resources/assets/moonsteel/oldTex/moonsteel ruby assets/moonsteel_pendant_and_gloves.png create mode 100644 src/main/resources/assets/moonsteel/oldTex/moonsteel ruby assets/moonsteel_shield.png create mode 100644 src/main/resources/assets/moonsteel/oldTex/moonsteel ruby assets/moonsteelchestbottom.png create mode 100644 src/main/resources/assets/moonsteel/oldTex/moonsteel ruby assets/moonsteelchestfront.png create mode 100644 src/main/resources/assets/moonsteel/oldTex/moonsteel ruby assets/moonsteelchestside.png create mode 100644 src/main/resources/assets/moonsteel/oldTex/moonsteel ruby assets/moonsteelchesttop.png create mode 100644 src/main/resources/assets/moonsteel/oldTex/moonsteel ruby assets/tool_hammer_moonsteel.png create mode 100644 src/main/resources/assets/moonsteel/oldTex/moonsteel ruby assets/tool_sickle_moonsteel.png create mode 100644 src/main/resources/assets/moonsteel/textures/armor/wolf/moonsteel.png create mode 100644 src/main/resources/assets/moonsteel/textures/art/borders/border_moonsteel.png create mode 100644 src/main/resources/assets/moonsteel/textures/block/jar_star.png create mode 100644 src/main/resources/assets/moonsteel/textures/block/moonsteel_brick.png create mode 100644 src/main/resources/assets/moonsteel/textures/item/armor_gloves_moonsteel.png create mode 100644 src/main/resources/assets/moonsteel/textures/item/armor_pendant_moonsteel.png create mode 100644 src/main/resources/assets/moonsteel/textures/item/jar_star.png create mode 100644 src/main/resources/assets/moonsteel/textures/item/moonsteel_paxel.png create mode 100644 src/main/resources/assets/moonsteel/textures/item/moonsteel_wolf_armor.png diff --git a/build.gradle.kts b/build.gradle.kts index 5ed1cdb..a9da41c 100644 --- a/build.gradle.kts +++ b/build.gradle.kts @@ -44,8 +44,15 @@ dependencies { implementation(libs.loader) implementation(libs.halplibe) // If you do not need halplibe you can delete this line + //-Dmixin.debug.export=true mixin flag + compileOnly(libs.btabackpacks) - //-Dmixin.debug.export=true + compileOnly(libs.paxels) + + // for later +// compileOnly(libs.commandly) +// compileOnly(libs.aether) + // Only required at compilation // provides documentation, can be removed if that isn't needed diff --git a/gradle/libs.versions.toml b/gradle/libs.versions.toml index e683c24..5c71e94 100644 --- a/gradle/libs.versions.toml +++ b/gradle/libs.versions.toml @@ -29,10 +29,10 @@ legacyLwjgl = "1.0.6" slf4jApi = "2.0.17" # This should match the version used by the current BTA release. lwjgl = "3.3.3" - joml = "1.10.8" # Note: BTA uses 1.10.7, patch 8 removes the kotlin stdlib dependency jomlPrimitivess = "1.10.0" - +commandly = "1.1.6+8.0.1" +paxels = "1.5.0+8.0.1" btabackpacks = "1.2.0-8.0" ########################################################################## @@ -43,6 +43,8 @@ halplibe = { group = "turniplabs", name = "halplibe", version.ref = "halplibe" } modMenu = { group = "turniplabs", name = "modmenu-bta", version.ref = "modMenu" } legacyLwjgl = { group = "com.github.Better-than-Adventure", name = "legacy-lwjgl3", version.ref = "legacyLwjgl" } slf4jApi = { group = "org.slf4j", name = "slf4j-api", version.ref = "slf4jApi" } +commandly = { group = "maven.modrinth", name = "commandly", version.ref = "commandly" } +paxels = { group = "maven.modrinth", name = "paxels-bta", version.ref = "paxels" } # https://piston-data.mojang.com/v1/objects/43db9b498cb67058d2e12d394e6507722e71bb45/client.jar clientJar = { group = "objects", name = "client", version = "43db9b498cb67058d2e12d394e6507722e71bb45" } joml = { group = "org.joml", name = "joml", version.ref = "joml" } diff --git a/src/main/java/useless/moonsteel/MoonSteel.java b/src/main/java/useless/moonsteel/MoonSteel.java index 5acd0ad..a9318c9 100644 --- a/src/main/java/useless/moonsteel/MoonSteel.java +++ b/src/main/java/useless/moonsteel/MoonSteel.java @@ -20,13 +20,17 @@ import turniplabs.halplibe.helper.creativeInventory.CreativeInventoryRegistry; import turniplabs.halplibe.util.ConfigHandler; import turniplabs.halplibe.util.dependency.Key; -import useless.moonsteel.block.TileEntityStellarRewinder; +import useless.moonsteel.api.MoonSteelCompat; +import useless.moonsteel.block.MoonSteelBlocks; +import useless.moonsteel.block.rewinder.TileEntityStellarRewinder; +import useless.moonsteel.item.MoonSteelItems; +import useless.moonsteel.recipe.MoonSteelRecipes; import java.util.Properties; import java.util.function.Supplier; -import static useless.moonsteel.MoonSteelBlocks.*; -import static useless.moonsteel.MoonSteelItems.*; +import static useless.moonsteel.block.MoonSteelBlocks.*; +import static useless.moonsteel.item.MoonSteelItems.*; public class MoonSteel implements ModInitializer { @@ -72,6 +76,7 @@ public void onInitialize() { CommonEvents.BEFORE_GAME_START.listen(KEY, this::beforeGameStart); CommonEvents.RECIPES_READY.listen(KEY, MoonSteelRecipes::onRecipesReady); CommonEvents.RECIPES_NAMESPACE_INIT.listen(KEY, MoonSteelRecipes::initNamespaces); + MoonSteelCompat.init(); } public void beforeGameStart() { @@ -88,6 +93,10 @@ public void beforeGameStart() { CreativeInventoryRegistry.INSTANCE.register(TORCH_STAR, place(() -> Blocks.TORCH_COAL)); CreativeInventoryRegistry.INSTANCE.register(STELLAR_REWINDER, place()); CreativeInventoryRegistry.INSTANCE.register(STAR_LAMP, place(() -> Blocks.TORCH_COAL)); + CreativeInventoryRegistry.INSTANCE.register(STAR_JAR, place(() -> Blocks.LANTERN_FIREFLY_RED)); + CreativeInventoryRegistry.INSTANCE.register(MOONSTEEL_BRICKS, place(() -> Blocks.SLAB_BRICK_RUBYGLASS)); + CreativeInventoryRegistry.INSTANCE.register(SLAB_MOONSTEEL_BRICK, place(() -> Blocks.SLAB_BRICK_RUBYGLASS)); + CreativeInventoryRegistry.INSTANCE.register(STAIR_MOONSTEEL_BRICKS, place(() -> Blocks.SLAB_BRICK_RUBYGLASS)); // items CreativeInventoryRegistry.INSTANCE.register(INGOT_MOONSTEEL_CRUDE, place(() -> Items.INGOT_STEEL_CRUDE)); CreativeInventoryRegistry.INSTANCE.register(INGOT_MOONSTEEL, place(() -> Items.INGOT_STEEL_CRUDE)); @@ -102,6 +111,8 @@ public void beforeGameStart() { CreativeInventoryRegistry.INSTANCE.register(ARMOR_CHESTPLATE_MOONSTEEL, place(() -> Items.ARMOR_WOLF_STEEL)); CreativeInventoryRegistry.INSTANCE.register(ARMOR_LEGGINGS_MOONSTEEL, place(() -> Items.ARMOR_WOLF_STEEL)); CreativeInventoryRegistry.INSTANCE.register(ARMOR_BOOTS_MOONSTEEL, place(() -> Items.ARMOR_WOLF_STEEL)); + CreativeInventoryRegistry.INSTANCE.register(ARMOR_WOLF_MOONSTEEL, place(() -> Items.ARMOR_WOLF_STEEL)); + if (backpackPresent){ CreativeInventoryRegistry.INSTANCE.register(BACKPACK_COSMIC, place(() -> Items.ARMOR_WOLF_STEEL)); } diff --git a/src/main/java/useless/moonsteel/MoonSteelBlocks.java b/src/main/java/useless/moonsteel/MoonSteelBlocks.java deleted file mode 100644 index 2784338..0000000 --- a/src/main/java/useless/moonsteel/MoonSteelBlocks.java +++ /dev/null @@ -1,88 +0,0 @@ -package useless.moonsteel; - -import net.minecraft.core.block.*; -import net.minecraft.core.block.material.Materials; -import net.minecraft.core.block.tag.BlockTags; -import net.minecraft.core.data.tag.Tag; -import net.minecraft.core.sound.BlockSounds; -import useless.moonsteel.block.BlockLogicStarLamp; -import useless.moonsteel.block.BlockStellarRewinder; -import useless.moonsteel.block.BlockTorchStar; - -import static useless.moonsteel.MoonSteel.MOD_ID; - -public class MoonSteelBlocks { - - private MoonSteelBlocks(){} - - private static String formatTranslationKey(String key) { - return String.format("%s.%s", MOD_ID, key); - } - - private static String formatName(String name) { - return String.format("%s:block/%s", MOD_ID, name); - } - - public static final Block BLOCK_MOONSTEEL = - Blocks.register( - formatTranslationKey("block"), - formatName("block_moonsteel"), - MoonSteel.blockId++, - b -> new BlockLogic(b, Materials.METAL) - ) - .withHardness(5f) - .withBlastResistance(2000f) - .withTags(BlockTags.MINEABLE_BY_PICKAXE); - - public static final Block TORCH_STAR = - Blocks.register( - formatTranslationKey("torch.star"), - formatName("torch_star"), - MoonSteel.blockId++, - BlockTorchStar::new - ) - .withLightEmission(15); - - public static final Block STELLAR_REWINDER = - Blocks.register( - formatTranslationKey("stellar.rewinder"), - formatName("stellar_rewinder"), - MoonSteel.blockId++, - b -> new BlockStellarRewinder(b, Materials.METAL) - ) - .withHardness(3.5f) - .withTags(BlockTags.MINEABLE_BY_PICKAXE); - - public static final Block STAR_LAMP = - Blocks.register( - formatTranslationKey("star.lamp"), - formatName("star_lamp"), - MoonSteel.blockId++, - b -> new BlockLogicStarLamp(b, Materials.METAL) - ) - .withSound(BlockSounds.GLASS) - .withHardness(0.5F) - .withLightEmission(15) - .withTags(new Tag[]{BlockTags.NOT_IN_CREATIVE_MENU, BlockTags.MINEABLE_BY_PICKAXE}); - - public static final Tag> FORCE_FORTUNE = Tag.of("moonsteel$force_enable_fortune"); - public static final Tag> FORCE_NO_FORTUNE = Tag.of("moonsteel$force_disable_fortune"); - - public static boolean canBeFortuned(Block block) { - if (block.hasTag(FORCE_FORTUNE)) return true; - if (block.hasTag(FORCE_NO_FORTUNE)) return false; - if (Block.hasLogicClass(block, BlockLogicLeavesBase.class)) return true; - if (Block.hasLogicClass(block, BlockLogicOreCoal.class)) return true; - if (Block.hasLogicClass(block, BlockLogicOreDiamond.class)) return true; - if (Block.hasLogicClass(block, BlockLogicOreGold.class)) return true; - if (Block.hasLogicClass(block, BlockLogicOreIron.class)) return true; - if (Block.hasLogicClass(block, BlockLogicOreLapis.class)) return true; - if (Block.hasLogicClass(block, BlockLogicOreNetherCoal.class)) return true; - if (Block.hasLogicClass(block, BlockLogicOreRedstone.class)) return true; - return Block.hasLogicClass(block, BlockLogicTallGrass.class); - } - - public static void init() { - /* no need */ - } -} diff --git a/src/main/java/useless/moonsteel/MoonSteelClient.java b/src/main/java/useless/moonsteel/MoonSteelClient.java index 49c18f4..8c489bc 100644 --- a/src/main/java/useless/moonsteel/MoonSteelClient.java +++ b/src/main/java/useless/moonsteel/MoonSteelClient.java @@ -5,9 +5,15 @@ import net.minecraft.client.render.texture.stitcher.AtlasStitcher; import net.minecraft.client.render.texture.stitcher.TextureRegistry; import net.minecraft.client.sound.SoundRepository; +import net.minecraft.core.entity.EntityPainting; +import net.minecraft.core.net.command.CommandManager; +import net.minecraft.core.util.collection.NamespaceID; import turniplabs.halplibe.event.defs.ClientEvents; +import useless.moonsteel.api.MoonSteelCompatClient; +import useless.moonsteel.command.CommandScore; import useless.moonsteel.fx.ParticleMagicSmoke; import useless.moonsteel.fx.ParticleStar; +import useless.moonsteel.item.MoonSteelItems; import java.io.IOException; import java.net.URISyntaxException; @@ -23,6 +29,8 @@ public void onInitializeClient() { ClientEvents.AFTER_CLIENT_START.listen(KEY, this::afterClientStart); ClientEvents.ITEM_MODEL_RELOAD.listen(KEY, MoonSteelModels::initItemModels); ClientEvents.BLOCK_MODEL_RELOAD.listen(KEY, MoonSteelModels::initBlockModels); + CommandManager.registerCommand(new CommandScore()); + MoonSteelCompatClient.init(); } @@ -41,5 +49,7 @@ public void beforeClientStart() { public void afterClientStart() { ParticleDispatcher.getInstance().addDispatch("moonsteel$star", (world, x, y, z, motionX, motionY, motionZ, data) -> new ParticleStar(world, x, y, z, motionX, motionY, motionX)); ParticleDispatcher.getInstance().addDispatch("moonsteel$magic_smoke", (world, x, y, z, motionX, motionY, motionZ, data) -> new ParticleMagicSmoke(world, x, y, z, motionX, motionY, motionX)); + EntityPainting.addBorder(MoonSteelItems.INGOT_MOONSTEEL.getDefaultStack(), NamespaceID.fromPool(MOD_ID, "border_moonsteel")); + } } diff --git a/src/main/java/useless/moonsteel/MoonSteelItems.java b/src/main/java/useless/moonsteel/MoonSteelItems.java deleted file mode 100644 index ebd5d04..0000000 --- a/src/main/java/useless/moonsteel/MoonSteelItems.java +++ /dev/null @@ -1,75 +0,0 @@ -package useless.moonsteel; - -import net.minecraft.core.enums.HumanArmorShape; -import net.minecraft.core.item.Item; -import net.minecraft.core.item.ItemArmor; -import net.minecraft.core.item.material.ArmorMaterial; -import net.minecraft.core.item.material.ToolMaterial; -import net.minecraft.core.item.tag.ItemTags; -import net.minecraft.core.item.tool.ItemToolAxe; -import net.minecraft.core.item.tool.ItemToolHoe; -import net.minecraft.core.item.tool.ItemToolPickaxe; -import net.minecraft.core.item.tool.ItemToolShovel; -import net.minecraft.core.item.tool.ItemToolSword; -import turniplabs.halplibe.helper.ArmorHelper; -import turniplabs.halplibe.helper.ItemBuilder; -import useless.moonsteel.backpack.BackpackProxy; -import useless.moonsteel.item.ItemConnectedStar; - -import static useless.moonsteel.MoonSteel.MOD_ID; - -public class MoonSteelItems { - private MoonSteelItems(){} - - public static final ToolMaterial MOON_STEEL_TOOL = new ToolMaterial().setDurability(1536).setEfficiency(7.0f, 14.0f).setMiningLevel(3).setDamage(2); - public static final Item INGOT_MOONSTEEL = new ItemBuilder(MOD_ID) - .build(new Item("ingot.moonsteel", MOD_ID + ":item/ingot_moonsteel", MoonSteel.itemId++)); - public static final Item INGOT_MOONSTEEL_CRUDE = new ItemBuilder(MOD_ID) - .build(new Item("crude.moonsteel", MOD_ID + ":item/ingot_moonsteel_crude", MoonSteel.itemId++)); - public static final Item TOOL_PICKAXE_MOONSTEEL = new ItemBuilder(MOD_ID) - .build(new ItemToolPickaxe("tool.pickaxe.moonsteel", MOD_ID + ":item/tool_pickaxe_moonsteel", MoonSteel.itemId++, MOON_STEEL_TOOL)); - public static final Item TOOL_AXE_MOONSTEEL = new ItemBuilder(MOD_ID) - .build(new ItemToolAxe("tool.axe.moonsteel", MOD_ID + ":item/tool_axe_moonsteel", MoonSteel.itemId++, MOON_STEEL_TOOL)); - public static final Item TOOL_SHOVEL_MOONSTEEL = new ItemBuilder(MOD_ID) - .build(new ItemToolShovel("tool.shovel.moonsteel", MOD_ID + ":item/tool_shovel_moonsteel", MoonSteel.itemId++, MOON_STEEL_TOOL)); - public static final Item TOOL_HOE_MOONSTEEL = new ItemBuilder(MOD_ID) - .build(new ItemToolHoe("tool.hoe.moonsteel", MOD_ID + ":item/tool_hoe_moonsteel", MoonSteel.itemId++, MOON_STEEL_TOOL)); - public static final Item TOOL_SWORD_MOONSTEEL = new ItemBuilder(MOD_ID) - .addTags(ItemTags.PREVENT_CREATIVE_MINING) - .build(new ItemToolSword("tool.sword.moonsteel", MOD_ID + ":item/tool_sword_moonsteel", MoonSteel.itemId++, MOON_STEEL_TOOL)); - - public static final ArmorMaterial MOON_STEEL_ARMOR = ArmorHelper.createArmorMaterial(MOD_ID, "moonsteel", 800, 51f, 45f, 45f, 100f); - - public static final Item ARMOR_HELMET_MOONSTEEL = new ItemBuilder(MOD_ID) - .build(new ItemArmor<>("helmet.moonsteel", MOD_ID + ":item/armor_helmet_moonsteel", MoonSteel.itemId++, MOON_STEEL_ARMOR, HumanArmorShape.HEAD)); - public static final Item ARMOR_CHESTPLATE_MOONSTEEL = new ItemBuilder(MOD_ID) - .build(new ItemArmor<>("chestplate.moonsteel", MOD_ID + ":item/armor_chestplate_moonsteel", MoonSteel.itemId++, MOON_STEEL_ARMOR, HumanArmorShape.CHEST)); - public static final Item ARMOR_LEGGINGS_MOONSTEEL = new ItemBuilder(MOD_ID) - .build(new ItemArmor<>("leggings.moonsteel", MOD_ID + ":item/armor_leggings_moonsteel", MoonSteel.itemId++, MOON_STEEL_ARMOR, HumanArmorShape.LEGS)); - public static final Item ARMOR_BOOTS_MOONSTEEL = new ItemBuilder(MOD_ID) - .build(new ItemArmor<>("boots.moonsteel", MOD_ID + ":item/armor_boots_moonsteel", MoonSteel.itemId++, MOON_STEEL_ARMOR, HumanArmorShape.BOOTS)); - - public static final Item STAR_FALLEN = new ItemBuilder(MOD_ID) - .build(new Item("star.fallen", MOD_ID + ":item/star_fallen", MoonSteel.itemId++)); - public static final Item STAR_CONNECTED = new ItemBuilder(MOD_ID) - .setStackSize(1) - .build(new ItemConnectedStar("star.connected", MOD_ID + ":item/star_connected", MoonSteel.itemId++)); - - // TODO stop it from naging me here - public static Item BACKPACK_COSMIC; - - public static void init() { - MoonSteel.LOGGER.info("Backpacks present: {}", MoonSteel.backpackPresent); - if (MoonSteel.backpackPresent){ - BACKPACK_COSMIC = new ItemBuilder(MOD_ID) - .setStackSize(1) - .build( BackpackProxy.proxyBackpack("backpack.cosmic", MOD_ID + ":item/backpack_cosmic", MoonSteel.itemId++)); - } else { - BACKPACK_COSMIC = new ItemBuilder(MOD_ID) - .setStackSize(1) - .setTags(ItemTags.NOT_IN_CREATIVE_MENU) - .build(new Item("backpack.cosmic.missing", MOD_ID + ":item/backpack_cosmic", MoonSteel.itemId++)); - } - MoonSteel.starZombieSword = MoonSteelItems.TOOL_SWORD_MOONSTEEL.getDefaultStack(); - } -} diff --git a/src/main/java/useless/moonsteel/MoonSteelModels.java b/src/main/java/useless/moonsteel/MoonSteelModels.java index 090925e..bcaba27 100644 --- a/src/main/java/useless/moonsteel/MoonSteelModels.java +++ b/src/main/java/useless/moonsteel/MoonSteelModels.java @@ -1,18 +1,18 @@ package useless.moonsteel; import net.minecraft.client.render.block.model.BlockModelDispatcher; -import net.minecraft.client.render.block.model.generic.BlockModelGeneric; -import net.minecraft.client.render.block.model.generic.BlockModelGenericRotatable; -import net.minecraft.client.render.block.model.generic.BlockModelGenericTorch; +import net.minecraft.client.render.block.model.generic.*; import net.minecraft.client.render.item.model.ItemModelDispatcher; import net.minecraft.client.render.item.model.ItemModelStandard; import net.minecraft.client.render.texture.stitcher.TextureRegistry; import net.minecraft.core.item.Item; import net.minecraft.core.util.collection.NamespaceID; import org.jetbrains.annotations.NotNull; -import useless.moonsteel.block.BlockModelStarLamp; -import useless.moonsteel.block.BlockModelStellarRewinder; -import useless.moonsteel.item.ItemModelConnectStar; +import useless.moonsteel.block.lamp.BlockModelStarLamp; +import useless.moonsteel.block.rewinder.BlockModelStellarRewinder; +import useless.moonsteel.block.MoonSteelBlocks; +import useless.moonsteel.item.connectstar.ItemModelConnectStar; +import useless.moonsteel.item.MoonSteelItems; import static net.minecraft.client.render.block.model.BlockModelDispatcher.loadDataModel; import static net.minecraft.client.render.item.model.ItemModelDispatcher.*; @@ -27,6 +27,11 @@ public static void initBlockModels(final BlockModelDispatcher dispatcher) { dispatcher.addDispatch(new BlockModelGenericTorch<>(MoonSteelBlocks.TORCH_STAR, MOD_ID + ":block/star_torch").render3D(false)); dispatcher.addDispatch(new BlockModelStellarRewinder<>(MoonSteelBlocks.STELLAR_REWINDER, MOD_ID + ":block/stellarrewinder")); dispatcher.addDispatch(new BlockModelStarLamp<>(MoonSteelBlocks.STAR_LAMP, loadDataModel(MOD_ID + ":block/starlamp"))); + dispatcher.addDispatch(new BlockModelGenericLantern<>(MoonSteelBlocks.JAR_STAR, loadDataModel(MOD_ID + ":block/jar_star"), loadDataModel(MOD_ID + ":block/jar_star_hanging"))); + + dispatcher.addDispatch(new BlockModelGeneric<>(MoonSteelBlocks.MOONSTEEL_BRICKS, loadDataModel(MOD_ID + ":block/moonsteel_brick"))); + dispatcher.addDispatch(new BlockModelGenericSlab<>(MoonSteelBlocks.SLAB_MOONSTEEL_BRICK, loadDataModel(MOD_ID + ":block/slab/lower"), loadDataModel(MOD_ID + ":block/slab/upper"), loadDataModel(MOD_ID + ":block/slab/full"))); + dispatcher.addDispatch(new BlockModelGenericStairs<>(MoonSteelBlocks.STAIR_MOONSTEEL_BRICKS, loadDataModel(MOD_ID + ":block/moonsteel_stair"))); } @@ -45,6 +50,8 @@ public static void initItemModels(final ItemModelDispatcher dispatcher) { dispatcher.addDispatch(makeModel(MoonSteelItems.STAR_FALLEN, "fallen_star").setFullBright()); dispatcher.addDispatch(setIcon(new ItemModelConnectStar(MoonSteelItems.STAR_CONNECTED), MOD_ID + ":item/connected_star_off").setFullBright()); dispatcher.addDispatch(makeModel(MoonSteelItems.BACKPACK_COSMIC, "starpack")); + dispatcher.addDispatch(makeModel(MoonSteelItems.STAR_JAR, "jar_star")); + dispatcher.addDispatch(makeModel(MoonSteelItems.ARMOR_WOLF_MOONSTEEL, "moonsteel_wolf_armor")); } diff --git a/src/main/java/useless/moonsteel/MoonSteelServer.java b/src/main/java/useless/moonsteel/MoonSteelServer.java new file mode 100644 index 0000000..fde0dfb --- /dev/null +++ b/src/main/java/useless/moonsteel/MoonSteelServer.java @@ -0,0 +1,13 @@ +package useless.moonsteel; + +import net.fabricmc.api.DedicatedServerModInitializer; +import net.minecraft.core.net.command.CommandManager; +import useless.moonsteel.command.CommandScore; + +public class MoonSteelServer implements DedicatedServerModInitializer { + + @Override + public void onInitializeServer() { + CommandManager.registerCommand(new CommandScore()); + } +} diff --git a/src/main/java/useless/moonsteel/api/MoonSteelCompat.java b/src/main/java/useless/moonsteel/api/MoonSteelCompat.java new file mode 100644 index 0000000..d98c071 --- /dev/null +++ b/src/main/java/useless/moonsteel/api/MoonSteelCompat.java @@ -0,0 +1,25 @@ +package useless.moonsteel.api; + +import net.fabricmc.loader.api.FabricLoader; +import turniplabs.halplibe.event.defs.CommonEvents; +import turniplabs.halplibe.util.dependency.Key; +import useless.moonsteel.MoonSteel; +import useless.moonsteel.api.paxel.MoonSteelPaxel; + +public class MoonSteelCompat { + private MoonSteelCompat() { + } + + public static void init() { + if(FabricLoader.getInstance().isModLoaded("commandly")){ + /* gona work on it later */ + } + if(FabricLoader.getInstance().isModLoaded("aether")){ + /* gona work on it later */ + } + if(FabricLoader.getInstance().isModLoaded("paxels")){ + CommonEvents.AFTER_ITEM_INIT.listen(Key.of(MoonSteel.MOD_ID ,"paxels"), MoonSteelPaxel::initItem); + CommonEvents.RECIPES_READY.listen(Key.of(MoonSteel.MOD_ID ,"paxels"), MoonSteelPaxel::recipeReady); + } + } +} diff --git a/src/main/java/useless/moonsteel/api/MoonSteelCompatClient.java b/src/main/java/useless/moonsteel/api/MoonSteelCompatClient.java new file mode 100644 index 0000000..cf5bc24 --- /dev/null +++ b/src/main/java/useless/moonsteel/api/MoonSteelCompatClient.java @@ -0,0 +1,20 @@ +package useless.moonsteel.api; + +import net.fabricmc.loader.api.FabricLoader; +import turniplabs.halplibe.event.defs.ClientEvents; +import useless.moonsteel.api.paxel.MoonSteelPaxel; + +import static useless.moonsteel.MoonSteel.KEY; + +public class MoonSteelCompatClient { + + private MoonSteelCompatClient(){ + + } + + public static void init(){ + if(FabricLoader.getInstance().isModLoaded("paxels")){ + ClientEvents.ITEM_MODEL_RELOAD.listen(KEY, MoonSteelPaxel::initItemModels); + } + } +} diff --git a/src/main/java/useless/moonsteel/MoonSteelMixinPlugin.java b/src/main/java/useless/moonsteel/api/MoonSteelMixinPlugin.java similarity index 97% rename from src/main/java/useless/moonsteel/MoonSteelMixinPlugin.java rename to src/main/java/useless/moonsteel/api/MoonSteelMixinPlugin.java index 7b2aa4a..214f263 100644 --- a/src/main/java/useless/moonsteel/MoonSteelMixinPlugin.java +++ b/src/main/java/useless/moonsteel/api/MoonSteelMixinPlugin.java @@ -1,4 +1,4 @@ -package useless.moonsteel; +package useless.moonsteel.api; import net.fabricmc.loader.api.FabricLoader; import org.objectweb.asm.tree.ClassNode; diff --git a/src/main/java/useless/moonsteel/backpack/BackpackProxy.java b/src/main/java/useless/moonsteel/api/backpack/BackpackProxy.java similarity index 84% rename from src/main/java/useless/moonsteel/backpack/BackpackProxy.java rename to src/main/java/useless/moonsteel/api/backpack/BackpackProxy.java index daba285..a07e54c 100644 --- a/src/main/java/useless/moonsteel/backpack/BackpackProxy.java +++ b/src/main/java/useless/moonsteel/api/backpack/BackpackProxy.java @@ -1,4 +1,4 @@ -package useless.moonsteel.backpack; +package useless.moonsteel.api.backpack; import net.minecraft.core.item.Item; diff --git a/src/main/java/useless/moonsteel/ContainerStarBackpack.java b/src/main/java/useless/moonsteel/api/backpack/ContainerStarBackpack.java similarity index 92% rename from src/main/java/useless/moonsteel/ContainerStarBackpack.java rename to src/main/java/useless/moonsteel/api/backpack/ContainerStarBackpack.java index 3600b16..fa16306 100644 --- a/src/main/java/useless/moonsteel/ContainerStarBackpack.java +++ b/src/main/java/useless/moonsteel/api/backpack/ContainerStarBackpack.java @@ -1,4 +1,4 @@ -package useless.moonsteel; +package useless.moonsteel.api.backpack; import it.unimi.dsi.fastutil.ints.IntList; import net.minecraft.core.InventoryAction; @@ -6,11 +6,6 @@ import net.minecraft.core.player.inventory.menu.MenuAbstract; import net.minecraft.core.player.inventory.slot.Slot; import org.jetbrains.annotations.NotNull; -import useless.moonsteel.backpack.SlotStarBackpack; -import useless.moonsteel.backpack.StarBackpackInventory; -import useless.moonsteel.interfaces.IStarBackpack; - -import java.util.List; public class ContainerStarBackpack extends MenuAbstract { public StarBackpackInventory backpackInventory; diff --git a/src/main/java/useless/moonsteel/backpack/GuiStarBackpack.java b/src/main/java/useless/moonsteel/api/backpack/GuiStarBackpack.java similarity index 95% rename from src/main/java/useless/moonsteel/backpack/GuiStarBackpack.java rename to src/main/java/useless/moonsteel/api/backpack/GuiStarBackpack.java index 81387d1..7531819 100644 --- a/src/main/java/useless/moonsteel/backpack/GuiStarBackpack.java +++ b/src/main/java/useless/moonsteel/api/backpack/GuiStarBackpack.java @@ -1,11 +1,10 @@ -package useless.moonsteel.backpack; +package useless.moonsteel.api.backpack; import net.minecraft.client.gui.container.ScreenContainerAbstract; import net.minecraft.core.entity.player.Player; import net.minecraft.core.lang.I18n; import org.lwjgl.opengl.GL11; import tosutosu.betterwithbackpacks.BetterWithBackpacks; -import useless.moonsteel.ContainerStarBackpack; public class GuiStarBackpack extends ScreenContainerAbstract { private int guiX; diff --git a/src/main/java/useless/moonsteel/interfaces/IStarBackpack.java b/src/main/java/useless/moonsteel/api/backpack/IStarBackpack.java similarity index 69% rename from src/main/java/useless/moonsteel/interfaces/IStarBackpack.java rename to src/main/java/useless/moonsteel/api/backpack/IStarBackpack.java index 57a397a..1a25843 100644 --- a/src/main/java/useless/moonsteel/interfaces/IStarBackpack.java +++ b/src/main/java/useless/moonsteel/api/backpack/IStarBackpack.java @@ -1,6 +1,4 @@ -package useless.moonsteel.interfaces; - -import useless.moonsteel.backpack.StarBackpackInventory; +package useless.moonsteel.api.backpack; public interface IStarBackpack { StarBackpackInventory moonsteel$getStarBackpackInventory(); diff --git a/src/main/java/useless/moonsteel/backpack/ItemStarBackpack.java b/src/main/java/useless/moonsteel/api/backpack/ItemStarBackpack.java similarity index 88% rename from src/main/java/useless/moonsteel/backpack/ItemStarBackpack.java rename to src/main/java/useless/moonsteel/api/backpack/ItemStarBackpack.java index b7dc5cc..499dd23 100644 --- a/src/main/java/useless/moonsteel/backpack/ItemStarBackpack.java +++ b/src/main/java/useless/moonsteel/api/backpack/ItemStarBackpack.java @@ -1,11 +1,10 @@ -package useless.moonsteel.backpack; +package useless.moonsteel.api.backpack; import net.minecraft.core.entity.player.Player; import net.minecraft.core.item.ItemStack; import net.minecraft.core.world.World; import tosutosu.betterwithbackpacks.BetterWithBackpacks; import tosutosu.betterwithbackpacks.item.ItemBackpack; -import useless.moonsteel.interfaces.IStarBackpack; public class ItemStarBackpack extends ItemBackpack { public ItemStarBackpack(String name, String namespaceId, int id) { diff --git a/src/main/java/useless/moonsteel/backpack/SlotStarBackpack.java b/src/main/java/useless/moonsteel/api/backpack/SlotStarBackpack.java similarity index 92% rename from src/main/java/useless/moonsteel/backpack/SlotStarBackpack.java rename to src/main/java/useless/moonsteel/api/backpack/SlotStarBackpack.java index 9999fcf..ea23bf8 100644 --- a/src/main/java/useless/moonsteel/backpack/SlotStarBackpack.java +++ b/src/main/java/useless/moonsteel/api/backpack/SlotStarBackpack.java @@ -1,4 +1,4 @@ -package useless.moonsteel.backpack; +package useless.moonsteel.api.backpack; import net.minecraft.core.item.ItemStack; import net.minecraft.core.player.inventory.container.Container; diff --git a/src/main/java/useless/moonsteel/backpack/StarBackpackInventory.java b/src/main/java/useless/moonsteel/api/backpack/StarBackpackInventory.java similarity index 97% rename from src/main/java/useless/moonsteel/backpack/StarBackpackInventory.java rename to src/main/java/useless/moonsteel/api/backpack/StarBackpackInventory.java index 4364fab..b469aeb 100644 --- a/src/main/java/useless/moonsteel/backpack/StarBackpackInventory.java +++ b/src/main/java/useless/moonsteel/api/backpack/StarBackpackInventory.java @@ -1,4 +1,4 @@ -package useless.moonsteel.backpack; +package useless.moonsteel.api.backpack; import com.mojang.nbt.tags.CompoundTag; import com.mojang.nbt.tags.ListTag; @@ -8,7 +8,7 @@ import net.minecraft.core.player.inventory.container.Container; import org.jetbrains.annotations.NotNull; import tosutosu.betterwithbackpacks.BetterWithBackpacks; -import useless.moonsteel.MoonSteelItems; +import useless.moonsteel.item.MoonSteelItems; public class StarBackpackInventory implements Container { public static final int STAR_BACKPACK_SIZE = 18; diff --git a/src/main/java/useless/moonsteel/api/paxel/MoonSteelPaxel.java b/src/main/java/useless/moonsteel/api/paxel/MoonSteelPaxel.java new file mode 100644 index 0000000..160f206 --- /dev/null +++ b/src/main/java/useless/moonsteel/api/paxel/MoonSteelPaxel.java @@ -0,0 +1,54 @@ +package useless.moonsteel.api.paxel; + +import luke.paxels.ItemToolPaxel; +import luke.paxels.PaxelItems; +import luke.paxels.PaxelMod; +import net.fabricmc.api.EnvType; +import net.fabricmc.api.Environment; +import net.minecraft.client.render.item.model.ItemModelDispatcher; +import net.minecraft.client.render.item.model.ItemModelStandard; +import net.minecraft.core.item.Item; +import net.minecraft.core.item.ItemStack; +import net.minecraft.core.item.Items; +import turniplabs.halplibe.helper.ItemBuilder; +import turniplabs.halplibe.helper.creativeInventory.CreativeInventoryPlacement; +import turniplabs.halplibe.helper.recipeBuilders.RecipeBuilderShaped; +import useless.moonsteel.item.MoonSteelItems; + +import static net.minecraft.client.render.item.model.ItemModelDispatcher.*; +import static net.minecraft.client.render.item.model.ItemModelDispatcher.HANDHELD_THIRD_PERSON_LEFT_HAND; +import static useless.moonsteel.MoonSteel.MOD_ID; +import static useless.moonsteel.item.MoonSteelItems.MOON_STEEL_TOOL; + +public class MoonSteelPaxel { + + private MoonSteelPaxel(){} + + public static final int ID = 21000; + public static Item TOOL_PAXEL_MOONSTEEL; + + public static void initItem(){ + TOOL_PAXEL_MOONSTEEL = new ItemBuilder(MOD_ID) + .setCreativeInventoryPlacement(new CreativeInventoryPlacement.After(() -> Items.TOOL_SWORD_STEEL)) + .build(new ItemToolPaxel("tool.paxel.moonsteel", MOD_ID + ":item/tool_paxel_moonsteel", ID, MOON_STEEL_TOOL)); + } + + public static void recipeReady(){ + new RecipeBuilderShaped(PaxelMod.MOD_ID, "A5P", " S ", " S ") + .addInput('A', MoonSteelItems.TOOL_AXE_MOONSTEEL) + .addInput('5', MoonSteelItems.TOOL_SHOVEL_MOONSTEEL) + .addInput('P', MoonSteelItems.TOOL_PICKAXE_MOONSTEEL) + .addInput('S', Items.STICK) + .create("moonsteel_paxel", new ItemStack(TOOL_PAXEL_MOONSTEEL)); + } + + @Environment(EnvType.CLIENT) + public static void initItemModels(ItemModelDispatcher dispatcher) { + dispatcher.addDispatch(new ItemModelStandard(TOOL_PAXEL_MOONSTEEL).setIcon("moonsteel:item/moonsteel_paxel") + .setDisplayPos("firstperson_righthand", HANDHELD_FIRST_PERSON_RIGHT_HAND) + .setDisplayPos("firstperson_lefthand", HANDHELD_FIRST_PERSON_LEFT_HAND) + .setDisplayPos("thirdperson_righthand", HANDHELD_THIRD_PERSON_RIGHT_HAND) + .setDisplayPos("thirdperson_lefthand", HANDHELD_THIRD_PERSON_LEFT_HAND) + ); + } +} diff --git a/src/main/java/useless/moonsteel/block/MoonSteelBlocks.java b/src/main/java/useless/moonsteel/block/MoonSteelBlocks.java new file mode 100644 index 0000000..4bae69e --- /dev/null +++ b/src/main/java/useless/moonsteel/block/MoonSteelBlocks.java @@ -0,0 +1,148 @@ +package useless.moonsteel.block; + +import net.minecraft.core.block.*; +import net.minecraft.core.block.material.MaterialColor; +import net.minecraft.core.block.material.Materials; +import net.minecraft.core.block.tag.BlockTags; +import net.minecraft.core.data.tag.Tag; +import net.minecraft.core.sound.BlockSounds; +import useless.moonsteel.MoonSteel; +import useless.moonsteel.block.jar.BlockLogicLantern; +import useless.moonsteel.block.lamp.BlockLogicStarLamp; +import useless.moonsteel.block.rewinder.BlockStellarRewinder; +import useless.moonsteel.item.MoonSteelItems; + +import static useless.moonsteel.MoonSteel.MOD_ID; + +public class MoonSteelBlocks { + + private MoonSteelBlocks() { + } + + private static String formatTranslationKey(String key) { + return String.format("%s.%s", MOD_ID, key); + } + + private static String formatName(String name) { + return String.format("%s:block/%s", MOD_ID, name); + } + + public static final Block BLOCK_MOONSTEEL = + Blocks.register( + formatTranslationKey("block"), + formatName("block_moonsteel"), + MoonSteel.blockId++, + b -> new BlockLogic(b, Materials.METAL) + ) + .withHardness(5f) + .withBlastResistance(2000f) + .withTags(BlockTags.MINEABLE_BY_PICKAXE); + + public static final Block TORCH_STAR = + Blocks.register( + formatTranslationKey("torch.star"), + formatName("torch_star"), + MoonSteel.blockId++, + BlockTorchStar::new + ) + .withLightEmission(15); + + public static final Block STELLAR_REWINDER = + Blocks.register( + formatTranslationKey("stellar.rewinder"), + formatName("stellar_rewinder"), + MoonSteel.blockId++, + b -> new BlockStellarRewinder(b, Materials.METAL) + ) + .withHardness(3.5f) + .withTags(BlockTags.MINEABLE_BY_PICKAXE); + + public static final Block STAR_LAMP = + Blocks.register( + formatTranslationKey("star.lamp"), + formatName("star_lamp"), + MoonSteel.blockId++, + b -> new BlockLogicStarLamp(b, Materials.METAL) + ) + .withSound(BlockSounds.GLASS) + .withHardness(0.5F) + .withLightEmission(15) + .withTags(BlockTags.NOT_IN_CREATIVE_MENU, BlockTags.MINEABLE_BY_PICKAXE); + + public static final Block JAR_STAR = + Blocks.register( + formatTranslationKey("jar.star"), + formatName("jar_star"), + MoonSteel.blockId++, + b -> new BlockLogicLantern(b, () -> MoonSteelItems.STAR_JAR ) + ) + .withSound(BlockSounds.GLASS) + .withHardness(0.1F) + .setStatParent(() -> MoonSteelItems.STAR_JAR) + .withLightEmission(15) + .withTags(BlockTags.BROKEN_BY_FLUIDS, BlockTags.MINEABLE_BY_PICKAXE, BlockTags.NOT_IN_CREATIVE_MENU); + + + public static final Block MOONSTEEL_BRICKS = + Blocks.register( + formatTranslationKey("brick.moonsteel"), + formatName("brick_moonsteel"), + MoonSteel.blockId++, + b -> new BlockLogic(b, Materials.STONE) + ) + .withSound(BlockSounds.STONE) + .withHardness(5f) + .withBlastResistance(2000f) + .withTags(BlockTags.MINEABLE_BY_PICKAXE, BlockTags.CHAINLINK_FENCES_CONNECT); + ; + + + public static final Block SLAB_MOONSTEEL_BRICK = + Blocks.register( + formatTranslationKey("slab.brick.moonsteel"), + formatName("slab_brick_moonsteel"), + MoonSteel.blockId++, + b -> new BlockLogicSlab(b, MOONSTEEL_BRICKS) + ) + .withSound(BlockSounds.METAL) + .withHardness(5f) + .withBlastResistance(2000f) + .withLitInteriorSurface(true). + withTags(BlockTags.MINEABLE_BY_PICKAXE); + + + public static final Block STAIR_MOONSTEEL_BRICKS = + Blocks.register( + formatTranslationKey("stair.brick.moonsteel"), + formatName("stair"), + MoonSteel.blockId++, + b -> new BlockLogicStairs(b, MOONSTEEL_BRICKS) + ) + .withSound(BlockSounds.METAL) + .withBlastResistance(2000f) + .withHardness(5f) + .withLitInteriorSurface(true) + .withTags(BlockTags.MINEABLE_BY_PICKAXE); + + + public static final Tag> FORCE_FORTUNE = Tag.of("moonsteel$force_enable_fortune"); + public static final Tag> FORCE_NO_FORTUNE = Tag.of("moonsteel$force_disable_fortune"); + + public static boolean canBeFortuned(Block block) { + if (block.hasTag(FORCE_FORTUNE)) return true; + if (block.hasTag(FORCE_NO_FORTUNE)) return false; + if (Block.hasLogicClass(block, BlockLogicLeavesBase.class)) return true; + if (Block.hasLogicClass(block, BlockLogicOreCoal.class)) return true; + if (Block.hasLogicClass(block, BlockLogicOreDiamond.class)) return true; + if (Block.hasLogicClass(block, BlockLogicOreGold.class)) return true; + if (Block.hasLogicClass(block, BlockLogicOreIron.class)) return true; + if (Block.hasLogicClass(block, BlockLogicOreLapis.class)) return true; + if (Block.hasLogicClass(block, BlockLogicOreNetherCoal.class)) return true; + if (Block.hasLogicClass(block, BlockLogicOreRedstone.class)) return true; + return Block.hasLogicClass(block, BlockLogicTallGrass.class); + } + + public static void init() { + /* no need */ + } +} diff --git a/src/main/java/useless/moonsteel/block/jar/BlockLogicLantern.java b/src/main/java/useless/moonsteel/block/jar/BlockLogicLantern.java new file mode 100644 index 0000000..98e3923 --- /dev/null +++ b/src/main/java/useless/moonsteel/block/jar/BlockLogicLantern.java @@ -0,0 +1,136 @@ +package useless.moonsteel.block.jar; + +import net.minecraft.core.block.Block; +import net.minecraft.core.block.BlockLogic; +import net.minecraft.core.block.Blocks; +import net.minecraft.core.block.entity.TileEntity; +import net.minecraft.core.block.material.Materials; +import net.minecraft.core.block.support.ISupport; +import net.minecraft.core.block.support.ISupportable; +import net.minecraft.core.block.support.PartialSupport; +import net.minecraft.core.block.tag.BlockTags; +import net.minecraft.core.entity.animal.MobFireflyCluster; +import net.minecraft.core.entity.player.Player; +import net.minecraft.core.enums.EnumDropCause; +import net.minecraft.core.item.Item; +import net.minecraft.core.item.ItemStack; +import net.minecraft.core.util.helper.Side; +import net.minecraft.core.world.World; +import net.minecraft.core.world.WorldSource; +import net.minecraft.core.world.pos.TilePos; +import net.minecraft.core.world.pos.TilePosc; +import org.jetbrains.annotations.NotNull; +import org.jetbrains.annotations.Nullable; +import org.joml.primitives.AABBd; +import org.joml.primitives.AABBdc; + +import java.util.function.Supplier; + +public class BlockLogicLantern extends BlockLogic implements ISupportable { + public static final int MASK_HANGING = 1; + public static final int MASK_ANGLED = 2; + private final Supplier itemSupplier; + + public BlockLogicLantern(@NotNull Block block, @NotNull Supplier itemSupplier) { + super(block, Materials.GLASS); + this.itemSupplier = itemSupplier; + this.setBlockBounds(0.3125F, 0.0F, 0.3125F, 0.6875F, 0.5F, 0.6875F); + } + + @Override + public @NotNull AABBdc getBoundsFromState(@NotNull WorldSource source, @NotNull TilePosc tilePos) { + int metadata = source.getBlockData(tilePos); + float offset = 0.0F; + if ((metadata & 1) != 0) { + offset = 0.3875F; + } + + return new AABBd(0.3125F, offset, 0.3125F, 0.6875F, 0.5F + offset, 0.6875F); + } + + @Override + public boolean isSolidRender() { + return false; + } + + @Override + public boolean isCubeShaped() { + return false; + } + + @Override + public @NotNull ISupport getSupport(@NotNull World world, @NotNull TilePosc tilePos, @NotNull Side side) { + return PartialSupport.INSTANCE; + } + + + @Override + public boolean onInteracted(@NotNull World world, @NotNull TilePosc tilePos, @NotNull Player player, @Nullable Side side, double xHit, double yHit) { + world.setBlockTypeRaw(tilePos, Blocks.AIR); + world.playSoundAtEntity(player, player, "item.pickup", 1.0F, 1.0F); + if (!world.isClientSide) { + world.dropItem(tilePos, new ItemStack(this.itemSupplier.get(), 1, 0)); + } + + world.markBlockDirty(tilePos); + return true; + } + + @Override + public void onPlacedOnSide(@NotNull World world, @NotNull TilePosc tilePos, @NotNull Side side, double xHit, double yHit) { + if (side != Side.BOTTOM && (side == Side.TOP || yHit < 0.5F) || !this.isSupported(world, tilePos, Side.TOP) && !world.getBlockType(tilePos.up(new TilePos())).hasTag(BlockTags.CAN_HANG_OFF)) { + if ((side == Side.TOP || side != Side.BOTTOM && yHit < 0.5F) && this.isSupported(world, tilePos, Side.BOTTOM)) { + world.setBlockDataNotify(tilePos, 0); + } else { + if (!this.isSupported(world, tilePos, Side.TOP) && !world.getBlockType(tilePos.up(new TilePos())).hasTag(BlockTags.CAN_HANG_OFF)) { + world.setBlockDataNotify(tilePos, 0); + } else { + world.setBlockDataNotify(tilePos, MASK_HANGING); + } + + } + } else { + world.setBlockDataNotify(tilePos, MASK_HANGING); + } + } + + @Override + public boolean canPlaceAt(@NotNull World world, @NotNull TilePosc tilePos) { + return this.isSupported(world, tilePos, Side.TOP) || world.getBlockType(tilePos.up(new TilePos())).hasTag(BlockTags.CAN_HANG_OFF) || this.isSupported(world, tilePos, Side.BOTTOM); + } + + @Override + public void onNeighborChanged(@NotNull World world, @NotNull TilePosc tilePos, @NotNull Block block) { + if (!this.canStay(world, tilePos)) { + this.dropWithCause(world, EnumDropCause.WORLD, tilePos, world.getBlockData(tilePos), null, null); + world.setBlockTypeNotify(tilePos, Blocks.AIR); + } + + } + + @Override + public ItemStack[] getBreakResult(@NotNull World world, @NotNull EnumDropCause dropCause, int data, @Nullable TileEntity tileEntity) { + return switch (dropCause) { + case PICK_BLOCK, SILK_TOUCH, WORLD -> new ItemStack[]{new ItemStack(this.itemSupplier.get())}; + default -> null; + }; + } + + @Override + public boolean canStay(@NotNull World world, @NotNull TilePosc tilePos) { + int meta = world.getBlockData(tilePos); + if ((meta & 1) == 0) { + return this.isSupported(world, tilePos, Side.BOTTOM); + } else { + return this.isSupported(world, tilePos, Side.TOP) || world.getBlockType(tilePos.up(new TilePos())).hasTag(BlockTags.CAN_HANG_OFF); + } + } + + public int getPistonPushReaction(@NotNull World world, @NotNull TilePosc tilePos) { + return 1; + } + + public @NotNull ISupport getSupportConstraint(@NotNull World world, @NotNull TilePosc tilePos, @NotNull Side side) { + return side.isVertical() ? PartialSupport.INSTANCE.center() : PartialSupport.INSTANCE; + } +} diff --git a/src/main/java/useless/moonsteel/block/BlockLogicStarLamp.java b/src/main/java/useless/moonsteel/block/lamp/BlockLogicStarLamp.java similarity index 98% rename from src/main/java/useless/moonsteel/block/BlockLogicStarLamp.java rename to src/main/java/useless/moonsteel/block/lamp/BlockLogicStarLamp.java index b3e0e66..0b08864 100644 --- a/src/main/java/useless/moonsteel/block/BlockLogicStarLamp.java +++ b/src/main/java/useless/moonsteel/block/lamp/BlockLogicStarLamp.java @@ -1,10 +1,9 @@ -package useless.moonsteel.block; +package useless.moonsteel.block.lamp; import net.minecraft.core.block.Block; import net.minecraft.core.block.BlockLogic; import net.minecraft.core.block.Blocks; import net.minecraft.core.block.material.Material; -import net.minecraft.core.block.support.FullSupport; import net.minecraft.core.block.support.ISupport; import net.minecraft.core.block.support.ISupportable; import net.minecraft.core.block.support.PartialSupport; diff --git a/src/main/java/useless/moonsteel/block/BlockModelStarLamp.java b/src/main/java/useless/moonsteel/block/lamp/BlockModelStarLamp.java similarity index 98% rename from src/main/java/useless/moonsteel/block/BlockModelStarLamp.java rename to src/main/java/useless/moonsteel/block/lamp/BlockModelStarLamp.java index 2b6fa35..eff7bf3 100644 --- a/src/main/java/useless/moonsteel/block/BlockModelStarLamp.java +++ b/src/main/java/useless/moonsteel/block/lamp/BlockModelStarLamp.java @@ -1,4 +1,4 @@ -package useless.moonsteel.block; +package useless.moonsteel.block.lamp; import net.minecraft.client.render.block.model.generic.BlockModelGeneric; import net.minecraft.client.render.tessellator.TessellatorGeneral; diff --git a/src/main/java/useless/moonsteel/block/BlockModelStellarRewinder.java b/src/main/java/useless/moonsteel/block/rewinder/BlockModelStellarRewinder.java similarity index 98% rename from src/main/java/useless/moonsteel/block/BlockModelStellarRewinder.java rename to src/main/java/useless/moonsteel/block/rewinder/BlockModelStellarRewinder.java index 5e2c02d..edcb3a6 100644 --- a/src/main/java/useless/moonsteel/block/BlockModelStellarRewinder.java +++ b/src/main/java/useless/moonsteel/block/rewinder/BlockModelStellarRewinder.java @@ -1,4 +1,4 @@ -package useless.moonsteel.block; +package useless.moonsteel.block.rewinder; import net.minecraft.client.render.block.model.BlockModelDispatcher; import net.minecraft.client.render.block.model.generic.BlockModelGeneric; diff --git a/src/main/java/useless/moonsteel/block/BlockStellarRewinder.java b/src/main/java/useless/moonsteel/block/rewinder/BlockStellarRewinder.java similarity index 94% rename from src/main/java/useless/moonsteel/block/BlockStellarRewinder.java rename to src/main/java/useless/moonsteel/block/rewinder/BlockStellarRewinder.java index 0313417..db29cf9 100644 --- a/src/main/java/useless/moonsteel/block/BlockStellarRewinder.java +++ b/src/main/java/useless/moonsteel/block/rewinder/BlockStellarRewinder.java @@ -1,4 +1,4 @@ -package useless.moonsteel.block; +package useless.moonsteel.block.rewinder; import net.minecraft.core.block.Block; import net.minecraft.core.block.BlockLogicRotatable; @@ -11,7 +11,7 @@ import net.minecraft.core.world.pos.TilePosc; import org.jetbrains.annotations.NotNull; import org.jetbrains.annotations.Nullable; -import useless.moonsteel.MoonSteelItems; +import useless.moonsteel.item.MoonSteelItems; import java.util.Random; diff --git a/src/main/java/useless/moonsteel/block/TileEntityStellarRewinder.java b/src/main/java/useless/moonsteel/block/rewinder/TileEntityStellarRewinder.java similarity index 98% rename from src/main/java/useless/moonsteel/block/TileEntityStellarRewinder.java rename to src/main/java/useless/moonsteel/block/rewinder/TileEntityStellarRewinder.java index 1db6cde..72ce9fc 100644 --- a/src/main/java/useless/moonsteel/block/TileEntityStellarRewinder.java +++ b/src/main/java/useless/moonsteel/block/rewinder/TileEntityStellarRewinder.java @@ -1,4 +1,4 @@ -package useless.moonsteel.block; +package useless.moonsteel.block.rewinder; import com.mojang.nbt.tags.CompoundTag; import net.minecraft.core.block.entity.TileEntity; diff --git a/src/main/java/useless/moonsteel/command/CommandScore.java b/src/main/java/useless/moonsteel/command/CommandScore.java new file mode 100644 index 0000000..663005b --- /dev/null +++ b/src/main/java/useless/moonsteel/command/CommandScore.java @@ -0,0 +1,157 @@ +package useless.moonsteel.command; + +import com.mojang.brigadier.Command; +import com.mojang.brigadier.CommandDispatcher; +import com.mojang.brigadier.LiteralMessage; +import com.mojang.brigadier.arguments.ArgumentTypeInteger; +import com.mojang.brigadier.builder.ArgumentBuilderLiteral; +import com.mojang.brigadier.builder.ArgumentBuilderRequired; +import com.mojang.brigadier.context.CommandContext; +import com.mojang.brigadier.exceptions.CommandSyntaxException; +import com.mojang.brigadier.exceptions.SimpleCommandExceptionType; +import net.minecraft.core.entity.player.Player; +import net.minecraft.core.lang.I18n; +import net.minecraft.core.net.command.CommandManager; +import net.minecraft.core.net.command.CommandSource; +import net.minecraft.core.net.command.arguments.ArgumentTypeEntity; +import net.minecraft.core.net.command.helpers.EntitySelector; + +import static useless.moonsteel.command.CommandScore.ReturnValues.*; + +public class CommandScore implements CommandManager.CommandRegistry { + + public static SimpleCommandExceptionType INVALID_ENTITY; + + @Override + public void register(CommandDispatcher commandDispatcher) { + INVALID_ENTITY = new SimpleCommandExceptionType(new LiteralMessage(I18n.getInstance().translateKey("score.command.not.applicable"))); + commandDispatcher.register(ArgumentBuilderLiteral.literal("moonsteel:score") + .then(ArgumentBuilderLiteral.literal("add") + .requires(src -> src.hasAdmin() && src.getSender() != null) + .then(ArgumentBuilderRequired.argument("player", ArgumentTypeEntity.username()) + .then(ArgumentBuilderRequired.argument("value", ArgumentTypeInteger.integer()) + .executes(ctx -> addScore(ctx, 0)) + ) + ) + ) + .then(ArgumentBuilderLiteral.literal("set") + .requires(src -> src.hasAdmin() && src.getSender() != null) + .then(ArgumentBuilderRequired.argument("player", ArgumentTypeEntity.username()) + .then(ArgumentBuilderRequired.argument("value", ArgumentTypeInteger.integer()) + .executes(CommandScore::setScore) + ) + ) + ) + .then(ArgumentBuilderLiteral.literal("remove") + .requires(src -> src.hasAdmin() && src.getSender() != null) + .then(ArgumentBuilderRequired.argument("player", ArgumentTypeEntity.username()) + .then(ArgumentBuilderRequired.argument("value", ArgumentTypeInteger.integer()) + .executes(ctx -> removeScore(ctx, 0)) + ) + ) + ) + .then(ArgumentBuilderLiteral.literal("list") + .then(ArgumentBuilderRequired.argument("player", ArgumentTypeEntity.username()) + .executes(CommandScore::infoScore) + ) + ) + ); + } + + private static Player getPlayer(CommandContext ctx) throws CommandSyntaxException { + Player player = null; + try { + player = ctx.getArgument("player", Player.class); + } catch (IllegalArgumentException e) { + player = ctx.getSource().getSender(); + } + if (player == null) { + throw INVALID_ENTITY.create(); + } + return player; + } + + private static int addScore(CommandContext ctx, int counter) throws CommandSyntaxException { + if (counter > 2) { + ctx.getSource().sendTranslatableMessage("score.command.cannot"); + return code(FAIL); + } + final Player player = getPlayer(ctx); + int value = ctx.getArgument("value", Integer.class); + if (value < 0) { + return removeScore(ctx, counter + 1); + } + value = CommandScore.addScore(player, value); + ctx.getSource().sendTranslatableMessage("score.command.add", player.getDisplayName(), value); + return Command.SINGLE_SUCCESS; + } + + private static int setScore(CommandContext ctx) throws CommandSyntaxException { + final Player player = getPlayer(ctx); + final int value = ctx.getArgument("value", Integer.class); + CommandScore.setScore(player, value); + ctx.getSource().sendTranslatableMessage("score.command.set", player.getDisplayName(), value); + return code(OK); + } + + private static int removeScore(CommandContext ctx, int counter) throws CommandSyntaxException { + if (counter > 2) { + ctx.getSource().sendTranslatableMessage("score.command.cannot"); + return code(FAIL); + } + final Player player = getPlayer(ctx); + int value = ctx.getArgument("value", Integer.class); + if (value < 0) { + return addScore(ctx, counter + 1); + } + value = CommandScore.subScore(player, value); + ctx.getSource().sendTranslatableMessage("score.command.remove", player.getDisplayName(), value); + return Command.SINGLE_SUCCESS; + } + + private static int infoScore(CommandContext ctx) throws CommandSyntaxException { + Player player = getPlayer(ctx); + ctx.getSource().sendTranslatableMessage("score.command.info", player.getDisplayName(), player.getScore()); + return Command.SINGLE_SUCCESS; + } + + public static int addScore(Player player, int value) { + int currentScore = player.getScore(); + if (currentScore > Integer.MAX_VALUE - value) { + player.score = Integer.MAX_VALUE; + return Integer.MAX_VALUE - currentScore; + } + player.score += value; + return value; + } + + public static int subScore(Player player, int value) { + int currentScore = player.getScore(); + if (currentScore < Integer.MIN_VALUE + value) { + player.score = Integer.MIN_VALUE; + return currentScore - Integer.MIN_VALUE + 1; + } + player.score -= value; + return value; + } + + public static void setScore(Player player, int value) { + player.score = value; + } + + public enum ReturnValues { + CANNOT(-2), + FAIL(-1), + OK(0); + private final int code; + + ReturnValues(int code) { + this.code = code; + } + + public static int code(ReturnValues v) { + return v.code; + } + } + +} diff --git a/src/main/java/useless/moonsteel/item/MoonSteelItems.java b/src/main/java/useless/moonsteel/item/MoonSteelItems.java new file mode 100644 index 0000000..9f284de --- /dev/null +++ b/src/main/java/useless/moonsteel/item/MoonSteelItems.java @@ -0,0 +1,114 @@ +package useless.moonsteel.item; + +import net.minecraft.core.block.Blocks; +import net.minecraft.core.entity.animal.MobWolf; +import net.minecraft.core.enums.HumanArmorShape; +import net.minecraft.core.enums.WolfArmorShape; +import net.minecraft.core.item.*; +import net.minecraft.core.item.material.ArmorMaterial; +import net.minecraft.core.item.material.ToolMaterial; +import net.minecraft.core.item.tag.ItemTags; +import net.minecraft.core.item.tool.ItemToolAxe; +import net.minecraft.core.item.tool.ItemToolHoe; +import net.minecraft.core.item.tool.ItemToolPickaxe; +import net.minecraft.core.item.tool.ItemToolShovel; +import net.minecraft.core.item.tool.ItemToolSword; +import org.jetbrains.annotations.NotNull; +import turniplabs.halplibe.helper.ArmorHelper; +import turniplabs.halplibe.helper.ItemBuilder; +import useless.moonsteel.MoonSteel; +import useless.moonsteel.api.backpack.BackpackProxy; +import useless.moonsteel.block.MoonSteelBlocks; +import useless.moonsteel.item.connectstar.ItemConnectedStar; + +import static useless.moonsteel.MoonSteel.MOD_ID; + +public class MoonSteelItems { + private MoonSteelItems(){} + + + public static final ToolMaterial MOON_STEEL_TOOL = new ToolMaterial().setDurability(1536).setEfficiency(7.0f, 14.0f).setMiningLevel(3).setDamage(2); + public static final ArmorMaterial MOON_STEEL_ARMOR = ArmorHelper.createArmorMaterial(MOD_ID, "moonsteel", 800, 51f, 45f, 45f, 100f); + + public static Item INGOT_MOONSTEEL; + public static Item INGOT_MOONSTEEL_CRUDE ; + public static Item TOOL_PICKAXE_MOONSTEEL; + public static Item TOOL_AXE_MOONSTEEL; + public static Item TOOL_SHOVEL_MOONSTEEL; + public static Item TOOL_HOE_MOONSTEEL; + public static Item TOOL_SWORD_MOONSTEEL; + + + public static Item ARMOR_HELMET_MOONSTEEL; + public static Item ARMOR_CHESTPLATE_MOONSTEEL; + public static Item ARMOR_LEGGINGS_MOONSTEEL; + public static Item ARMOR_BOOTS_MOONSTEEL; + + public static Item STAR_FALLEN; + public static Item STAR_CONNECTED; + + public static Item BACKPACK_COSMIC; + + // new Items + public static Item STAR_JAR; + public static Item ARMOR_WOLF_MOONSTEEL; + + public static void init() { + // 7.3 and before Items + INGOT_MOONSTEEL = new ItemBuilder(MOD_ID) + .build(new Item("ingot.moonsteel", MOD_ID + ":item/ingot_moonsteel", MoonSteel.itemId++)); + INGOT_MOONSTEEL_CRUDE = new ItemBuilder(MOD_ID) + .build(new Item("crude.moonsteel", MOD_ID + ":item/ingot_moonsteel_crude", MoonSteel.itemId++)); + TOOL_PICKAXE_MOONSTEEL = new ItemBuilder(MOD_ID) + .build(new ItemToolPickaxe("tool.pickaxe.moonsteel", MOD_ID + ":item/tool_pickaxe_moonsteel", MoonSteel.itemId++, MOON_STEEL_TOOL)); + + TOOL_AXE_MOONSTEEL = new ItemBuilder(MOD_ID) + .build(new ItemToolAxe("tool.axe.moonsteel", MOD_ID + ":item/tool_axe_moonsteel", MoonSteel.itemId++, MOON_STEEL_TOOL)); + TOOL_SHOVEL_MOONSTEEL = new ItemBuilder(MOD_ID) + .build(new ItemToolShovel("tool.shovel.moonsteel", MOD_ID + ":item/tool_shovel_moonsteel", MoonSteel.itemId++, MOON_STEEL_TOOL)); + TOOL_HOE_MOONSTEEL = new ItemBuilder(MOD_ID) + .build(new ItemToolHoe("tool.hoe.moonsteel", MOD_ID + ":item/tool_hoe_moonsteel", MoonSteel.itemId++, MOON_STEEL_TOOL)); + TOOL_SWORD_MOONSTEEL = new ItemBuilder(MOD_ID) + .addTags(ItemTags.PREVENT_CREATIVE_MINING) + .build(new ItemToolSword("tool.sword.moonsteel", MOD_ID + ":item/tool_sword_moonsteel", MoonSteel.itemId++, MOON_STEEL_TOOL)); + + ARMOR_HELMET_MOONSTEEL = new ItemBuilder(MOD_ID) + .build(new ItemArmor<>("helmet.moonsteel", MOD_ID + ":item/armor_helmet_moonsteel", MoonSteel.itemId++, MOON_STEEL_ARMOR, HumanArmorShape.HEAD)); + ARMOR_CHESTPLATE_MOONSTEEL = new ItemBuilder(MOD_ID) + .build(new ItemArmor<>("chestplate.moonsteel", MOD_ID + ":item/armor_chestplate_moonsteel", MoonSteel.itemId++, MOON_STEEL_ARMOR, HumanArmorShape.CHEST)); + ARMOR_LEGGINGS_MOONSTEEL = new ItemBuilder(MOD_ID) + .build(new ItemArmor<>("leggings.moonsteel", MOD_ID + ":item/armor_leggings_moonsteel", MoonSteel.itemId++, MOON_STEEL_ARMOR, HumanArmorShape.LEGS)); + ARMOR_BOOTS_MOONSTEEL = new ItemBuilder(MOD_ID) + .build(new ItemArmor<>("boots.moonsteel", MOD_ID + ":item/armor_boots_moonsteel", MoonSteel.itemId++, MOON_STEEL_ARMOR, HumanArmorShape.BOOTS)); + + STAR_FALLEN = new ItemBuilder(MOD_ID) + .build(new Item("star.fallen", MOD_ID + ":item/star_fallen", MoonSteel.itemId++)); + STAR_CONNECTED = new ItemBuilder(MOD_ID) + .setStackSize(1) + .build(new ItemConnectedStar("star.connected", MOD_ID + ":item/star_connected", MoonSteel.itemId++)); + + MoonSteelItems.initBackpack(); + MoonSteel.starZombieSword = MoonSteelItems.TOOL_SWORD_MOONSTEEL.getDefaultStack(); + + // 8.0.1 Items + STAR_JAR = new ItemBuilder(MOD_ID) + .build(new ItemPlaceable("jar.star", MOD_ID + ":item/jar_star", MoonSteel.itemId++, MoonSteelBlocks.JAR_STAR)); + + ARMOR_WOLF_MOONSTEEL = new ItemBuilder(MOD_ID) + .build(new ItemArmor<>("armor.wolf.moonsteel", MOD_ID + ":item/armor_wolf_moonsteel", MoonSteel.itemId++, MOON_STEEL_ARMOR, WolfArmorShape.BODY)); + } + + private static void initBackpack() { + MoonSteel.LOGGER.info("Backpacks present: {}", MoonSteel.backpackPresent); + if (MoonSteel.backpackPresent){ + BACKPACK_COSMIC = new ItemBuilder(MOD_ID) + .setStackSize(1) + .build( BackpackProxy.proxyBackpack("backpack.cosmic", MOD_ID + ":item/backpack_cosmic", MoonSteel.itemId++)); + } else { + BACKPACK_COSMIC = new ItemBuilder(MOD_ID) + .setStackSize(1) + .setTags(ItemTags.NOT_IN_CREATIVE_MENU) + .build(new Item("backpack.cosmic.missing", MOD_ID + ":item/backpack_cosmic", MoonSteel.itemId++)); + } + } +} diff --git a/src/main/java/useless/moonsteel/interfaces/ITeleporter.java b/src/main/java/useless/moonsteel/item/connectstar/ITeleporter.java similarity index 67% rename from src/main/java/useless/moonsteel/interfaces/ITeleporter.java rename to src/main/java/useless/moonsteel/item/connectstar/ITeleporter.java index 74795e1..112cdb5 100644 --- a/src/main/java/useless/moonsteel/interfaces/ITeleporter.java +++ b/src/main/java/useless/moonsteel/item/connectstar/ITeleporter.java @@ -1,4 +1,4 @@ -package useless.moonsteel.interfaces; +package useless.moonsteel.item.connectstar; public interface ITeleporter { void moonsteel$teleport(double x, double y, double z); diff --git a/src/main/java/useless/moonsteel/item/ItemConnectedStar.java b/src/main/java/useless/moonsteel/item/connectstar/ItemConnectedStar.java similarity index 59% rename from src/main/java/useless/moonsteel/item/ItemConnectedStar.java rename to src/main/java/useless/moonsteel/item/connectstar/ItemConnectedStar.java index ada8019..5a2c9ac 100644 --- a/src/main/java/useless/moonsteel/item/ItemConnectedStar.java +++ b/src/main/java/useless/moonsteel/item/connectstar/ItemConnectedStar.java @@ -1,4 +1,4 @@ -package useless.moonsteel.item; +package useless.moonsteel.item.connectstar; import net.minecraft.core.block.entity.TileEntity; import net.minecraft.core.entity.player.Player; @@ -9,13 +9,17 @@ import net.minecraft.core.util.helper.Side; import net.minecraft.core.world.World; import net.minecraft.core.world.chunk.Chunk; +import net.minecraft.core.world.chunk.provider.ChunkProvider; +import net.minecraft.core.world.chunk.provider.ChunkProviderThreaded; import net.minecraft.core.world.pos.ChunkPos; import net.minecraft.core.world.pos.ChunkTilePos; +import net.minecraft.server.world.chunk.provider.ChunkProviderServer; import org.jetbrains.annotations.NotNull; import org.jetbrains.annotations.Nullable; -import useless.moonsteel.MoonSteel; -import useless.moonsteel.block.TileEntityStellarRewinder; -import useless.moonsteel.interfaces.ITeleporter; +import turniplabs.halplibe.helper.EnvironmentHelper; +import useless.moonsteel.block.rewinder.TileEntityStellarRewinder; +import useless.moonsteel.mixin.accessor.ChunkProviderServerAccessor; +import useless.moonsteel.mixin.accessor.ChunkProviderThreadedAccessor; import java.util.Random; @@ -43,25 +47,42 @@ public ItemConnectedStar(String name, String namespaceId, int id) { entityplayer.sendMessageTranslated("moonsteel.teleport.fail.score"); return itemstack; } - ChunkPos chunkPosc = new ChunkPos(destX >> 4, destZ >> 4); - ChunkTilePos chunkTilePos = new ChunkTilePos(destX, destY, destZ); - MoonSteel.forceChunkLoads = true; - world.isChunkLoaded(chunkPosc); - Chunk chunk = world.getChunkProvider().provideChunk(chunkPosc, true); - MoonSteel.forceChunkLoads = false; - TileEntity te = chunk.getTileEntity(chunkTilePos); + Chunk chunk = ItemConnectedStar.provideChunk(world.getChunkProvider(), new ChunkPos(destX >> 4, destZ >> 4)); + TileEntity te = chunk.getTileEntity(new ChunkTilePos(destX, destY, destZ)); if (te instanceof TileEntityStellarRewinder tileEntityStellarRewinder && tileEntityStellarRewinder.canTeleport(itemstack)) { entityplayer.score -= cost; Side side = tileEntityStellarRewinder.side(); ((ITeleporter) entityplayer).moonsteel$teleport(destX + side.offsetX() + 0.5f, destY + side.offsetY(), destZ + side.offsetZ() + 0.5f); tileEntityStellarRewinder.setInUse(false); world.playSoundEffect(null, SoundCategory.WORLD_SOUNDS, entityplayer.x, entityplayer.y, entityplayer.z, "moonsteel:starspawn", 5, 1f + RANDOM.nextFloat() * 0.1f); - itemstack.getData().putBoolean("moonsteel$has_location", false); } else if (!world.isClientSide) { entityplayer.sendMessageTranslated("moonsteel.teleport.fail.missing"); - itemstack.getData().putBoolean("moonsteel$has_location", false); } + itemstack.getData().putBoolean("moonsteel$has_location", false); } return itemstack; } + + private static Chunk provideChunk(ChunkProvider provider, ChunkPos chunkPosc) { + Chunk chunk = provider.provideChunk(chunkPosc, true); + // single Player + if (EnvironmentHelper.isSingleplayerClient() && provider instanceof ChunkProviderThreaded providerThreaded) { + chunk = providerThreaded.provideChunk(chunkPosc, true); + if (!chunk.isLoaded) { + chunk = ((ChunkProviderThreadedAccessor) provider).callLoadChunk(chunkPosc); + } + return chunk; + } + if(EnvironmentHelper.isMultiplayerClient()){ + return chunk; + } + if (provider instanceof ChunkProviderServer providerThreaded) { + chunk = providerThreaded.provideChunk(chunkPosc, true); + if (!chunk.isLoaded) { + chunk = ((ChunkProviderServerAccessor) provider).callLoadChunkFromFile(chunkPosc); + } + return chunk; + } + return chunk; + } } diff --git a/src/main/java/useless/moonsteel/item/ItemModelConnectStar.java b/src/main/java/useless/moonsteel/item/connectstar/ItemModelConnectStar.java similarity index 95% rename from src/main/java/useless/moonsteel/item/ItemModelConnectStar.java rename to src/main/java/useless/moonsteel/item/connectstar/ItemModelConnectStar.java index eb120c5..1d35d4f 100644 --- a/src/main/java/useless/moonsteel/item/ItemModelConnectStar.java +++ b/src/main/java/useless/moonsteel/item/connectstar/ItemModelConnectStar.java @@ -1,4 +1,4 @@ -package useless.moonsteel.item; +package useless.moonsteel.item.connectstar; import net.minecraft.client.render.item.model.ItemModelStandard; import net.minecraft.client.render.texture.stitcher.IconCoordinate; diff --git a/src/main/java/useless/moonsteel/mixin/WorldFeatureLabyrinthMixinRewards.java b/src/main/java/useless/moonsteel/mixin/WorldFeatureLabyrinthMixinRewards.java index 70ca34f..5018167 100644 --- a/src/main/java/useless/moonsteel/mixin/WorldFeatureLabyrinthMixinRewards.java +++ b/src/main/java/useless/moonsteel/mixin/WorldFeatureLabyrinthMixinRewards.java @@ -9,7 +9,7 @@ import org.spongepowered.asm.mixin.injection.At; import org.spongepowered.asm.mixin.injection.Inject; import org.spongepowered.asm.mixin.injection.callback.CallbackInfoReturnable; -import useless.moonsteel.MoonSteelItems; +import useless.moonsteel.item.MoonSteelItems; import java.util.Random; diff --git a/src/main/java/useless/moonsteel/mixin/accessor/ChunkProviderServerAccessor.java b/src/main/java/useless/moonsteel/mixin/accessor/ChunkProviderServerAccessor.java new file mode 100644 index 0000000..05e240f --- /dev/null +++ b/src/main/java/useless/moonsteel/mixin/accessor/ChunkProviderServerAccessor.java @@ -0,0 +1,14 @@ +package useless.moonsteel.mixin.accessor; + +import net.minecraft.core.world.chunk.Chunk; +import net.minecraft.core.world.pos.ChunkPosc; +import net.minecraft.server.world.chunk.provider.ChunkProviderServer; +import org.jetbrains.annotations.NotNull; +import org.spongepowered.asm.mixin.Mixin; +import org.spongepowered.asm.mixin.gen.Invoker; + +@Mixin(ChunkProviderServer.class) +public interface ChunkProviderServerAccessor { + @Invoker + Chunk callLoadChunkFromFile(@NotNull ChunkPosc chunkPos); +} diff --git a/src/main/java/useless/moonsteel/mixin/accessor/ChunkProviderThreadedAccessor.java b/src/main/java/useless/moonsteel/mixin/accessor/ChunkProviderThreadedAccessor.java new file mode 100644 index 0000000..ed98bc4 --- /dev/null +++ b/src/main/java/useless/moonsteel/mixin/accessor/ChunkProviderThreadedAccessor.java @@ -0,0 +1,14 @@ +package useless.moonsteel.mixin.accessor; + +import net.minecraft.core.world.chunk.Chunk; +import net.minecraft.core.world.chunk.provider.ChunkProviderThreaded; +import net.minecraft.core.world.pos.ChunkPosc; +import org.jetbrains.annotations.NotNull; +import org.spongepowered.asm.mixin.Mixin; +import org.spongepowered.asm.mixin.gen.Invoker; + +@Mixin(ChunkProviderThreaded.class) +public interface ChunkProviderThreadedAccessor { + @Invoker + Chunk callLoadChunk(@NotNull ChunkPosc chunkPos); +} diff --git a/src/main/java/useless/moonsteel/mixin/armor/MobMixin.java b/src/main/java/useless/moonsteel/mixin/armor/MobMixin.java index 0f95cd2..2e28891 100644 --- a/src/main/java/useless/moonsteel/mixin/armor/MobMixin.java +++ b/src/main/java/useless/moonsteel/mixin/armor/MobMixin.java @@ -14,7 +14,7 @@ import org.spongepowered.asm.mixin.injection.ModifyVariable; import org.spongepowered.asm.mixin.injection.Redirect; import org.spongepowered.asm.mixin.injection.callback.CallbackInfo; -import useless.moonsteel.MoonSteelItems; +import useless.moonsteel.item.MoonSteelItems; import useless.moonsteel.interfaces.IMoonGrav; import useless.moonsteel.MoonSteel; import useless.moonsteel.mixin.accessor.ItemToolSwordAccessor; diff --git a/src/main/java/useless/moonsteel/mixin/armor/MobRenderZombieArmoredMixin.java b/src/main/java/useless/moonsteel/mixin/armor/MobRenderZombieArmoredMixin.java index 509329f..050ebcc 100644 --- a/src/main/java/useless/moonsteel/mixin/armor/MobRenderZombieArmoredMixin.java +++ b/src/main/java/useless/moonsteel/mixin/armor/MobRenderZombieArmoredMixin.java @@ -24,7 +24,7 @@ private void starZombie( CallbackInfoReturnable cir ){ if (((IStarZombie)zombie).moonsteel$isStarZombie()){ - String texturePath = "/assets/moonsteel/textures/armor/moonsteel_" + (renderPass != 2 ? 1 : 2) + ".png"; + String texturePath = "/assets/moonsteel/textures/armor/moonsteel_" + (renderPass != 3 ? 1 : 2) + ".png"; TextureManager textureManager = Minecraft.getMinecraft().textureManager; textureManager.bindTexture(textureManager.loadTexture(texturePath)); diff --git a/src/main/java/useless/moonsteel/mixin/armor/MobWolfMixin.java b/src/main/java/useless/moonsteel/mixin/armor/MobWolfMixin.java new file mode 100644 index 0000000..2c8fa4a --- /dev/null +++ b/src/main/java/useless/moonsteel/mixin/armor/MobWolfMixin.java @@ -0,0 +1,22 @@ +package useless.moonsteel.mixin.armor; + +import net.minecraft.core.entity.animal.MobWolf; +import net.minecraft.core.item.IArmorItem; +import org.spongepowered.asm.mixin.Mixin; +import useless.moonsteel.interfaces.IMoonGrav; + +import static useless.moonsteel.item.MoonSteelItems.ARMOR_WOLF_MOONSTEEL; +import static useless.moonsteel.item.MoonSteelItems.MOON_STEEL_ARMOR; + +@Mixin(MobWolf.class) +public class MobWolfMixin implements IMoonGrav { + + static { + MobWolf.ARMOR_MATERIALS.put(MOON_STEEL_ARMOR, (IArmorItem) ARMOR_WOLF_MOONSTEEL); + } + + @Override + public double moonsteel$getGravScalar() { + return 0.5d; + } +} diff --git a/src/main/java/useless/moonsteel/mixin/armor/MobZombieArmoredMixin.java b/src/main/java/useless/moonsteel/mixin/armor/MobZombieArmoredMixin.java index 1fc9885..f88e33b 100644 --- a/src/main/java/useless/moonsteel/mixin/armor/MobZombieArmoredMixin.java +++ b/src/main/java/useless/moonsteel/mixin/armor/MobZombieArmoredMixin.java @@ -15,7 +15,7 @@ import org.spongepowered.asm.mixin.injection.callback.CallbackInfo; import org.spongepowered.asm.mixin.injection.callback.CallbackInfoReturnable; import useless.moonsteel.MoonSteel; -import useless.moonsteel.MoonSteelItems; +import useless.moonsteel.item.MoonSteelItems; import useless.moonsteel.interfaces.IMoonGrav; import useless.moonsteel.interfaces.IStarZombie; diff --git a/src/main/java/useless/moonsteel/mixin/armor/PlayerMixinEquipment.java b/src/main/java/useless/moonsteel/mixin/armor/PlayerMixinEquipment.java index fc3efea..2f5a30c 100644 --- a/src/main/java/useless/moonsteel/mixin/armor/PlayerMixinEquipment.java +++ b/src/main/java/useless/moonsteel/mixin/armor/PlayerMixinEquipment.java @@ -5,7 +5,7 @@ import net.minecraft.core.player.inventory.container.ContainerInventory; import org.spongepowered.asm.mixin.Mixin; import org.spongepowered.asm.mixin.Shadow; -import useless.moonsteel.MoonSteelItems; +import useless.moonsteel.item.MoonSteelItems; import useless.moonsteel.interfaces.IMoonGrav; @Mixin(value = Player.class, remap = false) diff --git a/src/main/java/useless/moonsteel/mixin/backpack/MinecraftMixinRespawn.java b/src/main/java/useless/moonsteel/mixin/backpack/MinecraftMixinRespawn.java index 783ad68..a4496b8 100644 --- a/src/main/java/useless/moonsteel/mixin/backpack/MinecraftMixinRespawn.java +++ b/src/main/java/useless/moonsteel/mixin/backpack/MinecraftMixinRespawn.java @@ -9,7 +9,7 @@ import org.spongepowered.asm.mixin.injection.At; import org.spongepowered.asm.mixin.injection.Inject; import org.spongepowered.asm.mixin.injection.callback.CallbackInfo; -import useless.moonsteel.interfaces.IStarBackpack; +import useless.moonsteel.api.backpack.IStarBackpack; @Mixin(value = Minecraft.class, remap = false) public class MinecraftMixinRespawn { diff --git a/src/main/java/useless/moonsteel/mixin/backpack/PacketHandlerClientMixinGui.java b/src/main/java/useless/moonsteel/mixin/backpack/PacketHandlerClientMixinGui.java index 79afa31..e82fd4f 100644 --- a/src/main/java/useless/moonsteel/mixin/backpack/PacketHandlerClientMixinGui.java +++ b/src/main/java/useless/moonsteel/mixin/backpack/PacketHandlerClientMixinGui.java @@ -10,7 +10,7 @@ import org.spongepowered.asm.mixin.injection.Inject; import org.spongepowered.asm.mixin.injection.callback.CallbackInfo; import useless.moonsteel.MoonSteel; -import useless.moonsteel.interfaces.IStarBackpack; +import useless.moonsteel.api.backpack.IStarBackpack; @Mixin(value= PacketHandlerClient.class,remap = false) public abstract class PacketHandlerClientMixinGui { diff --git a/src/main/java/useless/moonsteel/mixin/backpack/PlayerListMixinRespawn.java b/src/main/java/useless/moonsteel/mixin/backpack/PlayerListMixinRespawn.java index f17f196..5a091c5 100644 --- a/src/main/java/useless/moonsteel/mixin/backpack/PlayerListMixinRespawn.java +++ b/src/main/java/useless/moonsteel/mixin/backpack/PlayerListMixinRespawn.java @@ -7,7 +7,7 @@ import org.spongepowered.asm.mixin.injection.At; import org.spongepowered.asm.mixin.injection.Inject; import org.spongepowered.asm.mixin.injection.callback.CallbackInfoReturnable; -import useless.moonsteel.interfaces.IStarBackpack; +import useless.moonsteel.api.backpack.IStarBackpack; @Mixin(value = PlayerList.class, remap = false) public class PlayerListMixinRespawn { diff --git a/src/main/java/useless/moonsteel/mixin/backpack/PlayerLocalMixinGui.java b/src/main/java/useless/moonsteel/mixin/backpack/PlayerLocalMixinGui.java index fec9fc5..b15e102 100644 --- a/src/main/java/useless/moonsteel/mixin/backpack/PlayerLocalMixinGui.java +++ b/src/main/java/useless/moonsteel/mixin/backpack/PlayerLocalMixinGui.java @@ -7,7 +7,7 @@ import org.spongepowered.asm.mixin.Mixin; import org.spongepowered.asm.mixin.Shadow; import org.spongepowered.asm.mixin.Unique; -import useless.moonsteel.backpack.GuiStarBackpack; +import useless.moonsteel.api.backpack.GuiStarBackpack; @Mixin(value = PlayerLocal.class, remap = false) public class PlayerLocalMixinGui extends PlayerMixin { diff --git a/src/main/java/useless/moonsteel/mixin/backpack/PlayerMixin.java b/src/main/java/useless/moonsteel/mixin/backpack/PlayerMixin.java index 3a1abf3..725bd29 100644 --- a/src/main/java/useless/moonsteel/mixin/backpack/PlayerMixin.java +++ b/src/main/java/useless/moonsteel/mixin/backpack/PlayerMixin.java @@ -10,8 +10,8 @@ import org.spongepowered.asm.mixin.injection.At; import org.spongepowered.asm.mixin.injection.Inject; import org.spongepowered.asm.mixin.injection.callback.CallbackInfo; -import useless.moonsteel.backpack.StarBackpackInventory; -import useless.moonsteel.interfaces.IStarBackpack; +import useless.moonsteel.api.backpack.StarBackpackInventory; +import useless.moonsteel.api.backpack.IStarBackpack; @Mixin(value = Player.class, remap = false) public abstract class PlayerMixin extends Mob implements IStarBackpack { diff --git a/src/main/java/useless/moonsteel/mixin/backpack/PlayerServerMixin.java b/src/main/java/useless/moonsteel/mixin/backpack/PlayerServerMixin.java index 3accf15..ecb313a 100644 --- a/src/main/java/useless/moonsteel/mixin/backpack/PlayerServerMixin.java +++ b/src/main/java/useless/moonsteel/mixin/backpack/PlayerServerMixin.java @@ -7,7 +7,7 @@ import org.spongepowered.asm.mixin.Mixin; import org.spongepowered.asm.mixin.Shadow; import org.spongepowered.asm.mixin.Unique; -import useless.moonsteel.ContainerStarBackpack; +import useless.moonsteel.api.backpack.ContainerStarBackpack; import useless.moonsteel.MoonSteel; @Mixin(value = PlayerServer.class, remap = false) diff --git a/src/main/java/useless/moonsteel/mixin/fortune/BlockLogicMixin.java b/src/main/java/useless/moonsteel/mixin/fortune/BlockLogicMixin.java index 6f57b79..9068e2c 100644 --- a/src/main/java/useless/moonsteel/mixin/fortune/BlockLogicMixin.java +++ b/src/main/java/useless/moonsteel/mixin/fortune/BlockLogicMixin.java @@ -1,5 +1,10 @@ package useless.moonsteel.mixin.fortune; +import com.llamalad7.mixinextras.injector.wrapmethod.WrapMethod; +import com.llamalad7.mixinextras.injector.wrapoperation.Operation; +import com.llamalad7.mixinextras.sugar.Local; +import com.llamalad7.mixinextras.sugar.Share; +import com.llamalad7.mixinextras.sugar.ref.LocalRef; import net.minecraft.core.block.Block; import net.minecraft.core.block.BlockLogic; import net.minecraft.core.block.entity.TileEntity; @@ -17,10 +22,14 @@ import org.spongepowered.asm.mixin.injection.Inject; import org.spongepowered.asm.mixin.injection.callback.CallbackInfo; import useless.moonsteel.MoonSteel; -import useless.moonsteel.MoonSteelBlocks; -import useless.moonsteel.MoonSteelItems; +import useless.moonsteel.block.MoonSteelBlocks; +import useless.moonsteel.item.MoonSteelItems; -@Mixin(value = BlockLogic.class,remap = false) +import java.util.ArrayList; +import java.util.Arrays; +import java.util.List; + +@Mixin(value = BlockLogic.class, remap = false) public abstract class BlockLogicMixin { @Shadow @@ -31,13 +40,62 @@ public abstract class BlockLogicMixin { @Shadow public abstract void dropWithCause(World world, EnumDropCause cause, TilePosc tilePosc, int meta, TileEntity tileEntity, Player player); - @Inject(method = "onHarvest", at = @At(value = "INVOKE", target = "Lnet/minecraft/core/block/BlockLogic;dropWithCause(Lnet/minecraft/core/world/World;Lnet/minecraft/core/enums/EnumDropCause;Lnet/minecraft/core/world/pos/TilePosc;ILnet/minecraft/core/block/entity/TileEntity;Lnet/minecraft/core/entity/player/Player;)V")) - private void multiplyHarvest(World world, Player entityplayer, TilePosc tilePos, int data, TileEntity tileEntity, CallbackInfo ci){ + @Inject(method = "onHarvest", + at = @At(value = "INVOKE", target = "Lnet/minecraft/core/block/BlockLogic;dropWithCause(Lnet/minecraft/core/world/World;Lnet/minecraft/core/enums/EnumDropCause;Lnet/minecraft/core/world/pos/TilePosc;ILnet/minecraft/core/block/entity/TileEntity;Lnet/minecraft/core/entity/player/Player;)V") + ) + private void multiplyHarvest( + World world, Player entityplayer, + TilePosc tilePos, int data, TileEntity tileEntity, + CallbackInfo ci, + @Share("player") LocalRef sharedPlayer + ) { + sharedPlayer.set(entityplayer); final ItemStack heldItemStack = entityplayer.inventory.getCurrentItem(); - if (heldItemStack != null && heldItemStack.getItem() instanceof ItemTool itemTool && itemTool.getMaterial() == MoonSteelItems.MOON_STEEL_TOOL && MoonSteelBlocks.canBeFortuned(this.block)){ + if (heldItemStack != null && heldItemStack.getItem() instanceof ItemTool itemTool && itemTool.getMaterial() == MoonSteelItems.MOON_STEEL_TOOL && MoonSteelBlocks.canBeFortuned(this.block)) { for (int i = 0; i < world.rand.nextInt(MoonSteel.FORTUNE_AMOUNT); i++) { dropWithCause(world, EnumDropCause.PROPER_TOOL, tilePos, data, tileEntity, entityplayer); } } } + +// @WrapMethod(method = "getBreakResult(Lnet/minecraft/core/world/World;Lnet/minecraft/core/enums/EnumDropCause;Lnet/minecraft/core/world/pos/TilePosc;ILnet/minecraft/core/block/entity/TileEntity;)[Lnet/minecraft/core/item/ItemStack;") +// private ItemStack[] multiplyBreakResults( +// World world, EnumDropCause dropCause, +// TilePosc tilePos, int data, +// TileEntity tileEntity, Operation original, +// @Share("player") LocalRef sharedPlayer +// ) { +// Player player = sharedPlayer.get(); +// ItemStack[] breakResults = original.call(world, dropCause, tilePos, data, tileEntity); +// if(player != null){ +// final ItemStack heldItemStack = player.inventory.getCurrentItem(); +// if (heldItemStack != null +// && heldItemStack.getItem() instanceof ItemTool itemTool +// && itemTool.getMaterial() == MoonSteelItems.MOON_STEEL_TOOL +// && MoonSteelBlocks.canBeFortuned(this.block) +// ) { +// List extraStacks = new ArrayList<>(); +// for (ItemStack stack : breakResults) { +// int extra = world.rand.nextInt(MoonSteel.FORTUNE_AMOUNT); +// if (stack.stackSize + extra <= stack.getMaxStackSize()) { +// stack.stackSize += extra; +// } else { +// int remaining = stack.stackSize + extra - stack.getMaxStackSize(); +// stack.stackSize = stack.getMaxStackSize(); +// ItemStack extraStack = stack.copy(); +// extraStack.stackSize = remaining; +// extraStacks.add(extraStack); +// } +// } +// ItemStack[] returnValue = Arrays.copyOf(breakResults, breakResults.length + extraStacks.size()); +// for (int i = 0; i < extraStacks.size(); i++) { +// returnValue[breakResults.length + i] = extraStacks.get(i); +// } +// return returnValue; +// } +// } +// return breakResults; +// } + + } diff --git a/src/main/java/useless/moonsteel/mixin/starfallen/EntityItemMixin.java b/src/main/java/useless/moonsteel/mixin/starfallen/EntityItemMixin.java index e05d3e9..521a325 100644 --- a/src/main/java/useless/moonsteel/mixin/starfallen/EntityItemMixin.java +++ b/src/main/java/useless/moonsteel/mixin/starfallen/EntityItemMixin.java @@ -12,7 +12,7 @@ import org.spongepowered.asm.mixin.injection.At; import org.spongepowered.asm.mixin.injection.Inject; import org.spongepowered.asm.mixin.injection.callback.CallbackInfo; -import useless.moonsteel.MoonSteelItems; +import useless.moonsteel.item.MoonSteelItems; import useless.moonsteel.interfaces.IFallenStar; @Mixin(value = EntityItem.class, remap = false) diff --git a/src/main/java/useless/moonsteel/mixin/starfallen/WorldMixinStarFall.java b/src/main/java/useless/moonsteel/mixin/starfallen/WorldMixinStarFall.java index 93423ef..956eed9 100644 --- a/src/main/java/useless/moonsteel/mixin/starfallen/WorldMixinStarFall.java +++ b/src/main/java/useless/moonsteel/mixin/starfallen/WorldMixinStarFall.java @@ -13,7 +13,7 @@ import org.spongepowered.asm.mixin.injection.Inject; import org.spongepowered.asm.mixin.injection.callback.CallbackInfo; import useless.moonsteel.MoonSteel; -import useless.moonsteel.MoonSteelItems; +import useless.moonsteel.item.MoonSteelItems; import useless.moonsteel.interfaces.IFallenStar; import java.util.Random; diff --git a/src/main/java/useless/moonsteel/mixin/stella/PlayerMixinStella.java b/src/main/java/useless/moonsteel/mixin/stella/PlayerMixinStella.java index f6a1697..4edda2b 100644 --- a/src/main/java/useless/moonsteel/mixin/stella/PlayerMixinStella.java +++ b/src/main/java/useless/moonsteel/mixin/stella/PlayerMixinStella.java @@ -5,7 +5,7 @@ import net.minecraft.core.world.World; import org.jetbrains.annotations.NotNull; import org.spongepowered.asm.mixin.Mixin; -import useless.moonsteel.interfaces.ITeleporter; +import useless.moonsteel.item.connectstar.ITeleporter; @Mixin(Player.class) public class PlayerMixinStella extends Mob implements ITeleporter { diff --git a/src/main/java/useless/moonsteel/MoonSteelRecipes.java b/src/main/java/useless/moonsteel/recipe/MoonSteelRecipes.java similarity index 90% rename from src/main/java/useless/moonsteel/MoonSteelRecipes.java rename to src/main/java/useless/moonsteel/recipe/MoonSteelRecipes.java index 6ed578d..c4397a9 100644 --- a/src/main/java/useless/moonsteel/MoonSteelRecipes.java +++ b/src/main/java/useless/moonsteel/recipe/MoonSteelRecipes.java @@ -1,4 +1,4 @@ -package useless.moonsteel; +package useless.moonsteel.recipe; import net.minecraft.core.WeightedRandomLootObject; import net.minecraft.core.crafting.LookupFuelFurnace; @@ -8,6 +8,9 @@ import net.minecraft.core.util.helper.DyeColor; import tosutosu.betterwithbackpacks.ModItems; import turniplabs.halplibe.helper.RecipeBuilder; +import useless.moonsteel.MoonSteel; +import useless.moonsteel.block.MoonSteelBlocks; +import useless.moonsteel.item.MoonSteelItems; import static useless.moonsteel.MoonSteel.MOD_ID; @@ -168,6 +171,18 @@ public static void onRecipesReady() { .addInput('O', Items.OLIVINE) .addInput('S', MoonSteelItems.STAR_FALLEN) .create("star_lamp", new ItemStack(MoonSteelBlocks.STAR_LAMP, 8)); + + RecipeBuilder.Shaped(MOD_ID) + .setShape("S", "J") + .addInput('S', MoonSteelItems.STAR_FALLEN) + .addInput('J', Items.JAR) + .create("jar_star", new ItemStack(MoonSteelItems.STAR_JAR)); + + + RecipeBuilder.Shaped(MOD_ID) + .setShape(" MM", "MMM", "M M") + .addInput('M', MoonSteelItems.INGOT_MOONSTEEL) + .create("moonstee_wolf_armor", new ItemStack(MoonSteelItems.ARMOR_WOLF_MOONSTEEL)); } public static void initNamespaces() { diff --git a/src/main/resources/assets/moonsteel/lang/en_US/en_US.lang b/src/main/resources/assets/moonsteel/lang/en_US/en_US.lang index 8db1269..83573da 100644 --- a/src/main/resources/assets/moonsteel/lang/en_US/en_US.lang +++ b/src/main/resources/assets/moonsteel/lang/en_US/en_US.lang @@ -44,5 +44,29 @@ moonsteel.container.backpack.star.name=Stardust Backpack subtitles.moonsteel.starspawn=Starfall subtitles.moonsteel.click.rewinder=Star Link +score.command.not.applicable= The command is not applicable to this entity. +score.command.cannot= Invalid target. +score.command.add= Added %2$d score to %1$s. +score.command.remove= Subtracted %2$d from %1$s. +score.command.info= Player %1$s has a score of %2$d. +score.command.set= Set %1$s score to %2$d. + +# compat 1 +item.moonsteel.tool.paxel.moonsteel.name=Moonsteel Paxel + tile.moonsteel.star.lamp.name=Star Lamp tile.moonsteel.star.lamp.desc=Shiny new lamp. +item.moonsteel.jar.star.name=Jar Star +item.moonsteel.jar.star.desc=A star in a jar, let off dim light. +tile.moonsteel.jar.star.name=Jar Star +tile.moonsteel.jar.star.desc=How did you get this item? +item.moonsteel.armor.wolf.moonsteel.name=Moonsteel Wolf Armor +item.moonsteel.armor.wolf.moonsteel.desc=Keep your best friend spacy! + +tile.moonsteel.brick.moonsteel.name=Moonsteel Bricks +tile.moonsteel.brick.moonsteel.desc=Stacked bricks of moonsteel. +tile.moonsteel.slab.brick.moonsteel.name=Moonsteel Bricks Slab +tile.moonsteel.slab.brick.moonsteel.desc=A slab of moonsteel bricks. +tile.moonsteel.stair.brick.moonsteel.name=Moonsteel Bricks Stairs +tile.moonsteel.stair.brick.moonsteel.desc=Moonsteel brick block used for vertical movement. + diff --git a/src/main/resources/assets/moonsteel/lang/ru_RU/ru_RU.lang b/src/main/resources/assets/moonsteel/lang/ru_RU/ru_RU.lang index d3de3fb..799ed5e 100644 --- a/src/main/resources/assets/moonsteel/lang/ru_RU/ru_RU.lang +++ b/src/main/resources/assets/moonsteel/lang/ru_RU/ru_RU.lang @@ -42,3 +42,13 @@ moonsteel.teleport.fail.dimension=Якорь в другом измерение! moonsteel.container.backpack.star.name=Звезвдный Рюкзак tile.moonsteel.star.lamp.name=Звёздная лампа tile.moonsteel.star.lamp.desc=Новая блестящая лампа. + +score.command.not.applicable= Команда не применима к этой сущности. +score.command.cannot= Неверная цель. +score.command.add= Счет игрока %1$s увеличен на %2$d очков. +score.command.remove= Счёт игрока %1$s уменьшен на %2$d очков. +score.command.info= Счёт игрока %1$s: %2$d. +score.command.set= Счёт игрока %1$s установлен на %2$d. + +#paxel +item.moonsteel.tool.paxel.moonsteel.name=Лунсталный паксель diff --git a/src/main/resources/assets/moonsteel/models/block/jar_star.json b/src/main/resources/assets/moonsteel/models/block/jar_star.json new file mode 100644 index 0000000..4aaf70f --- /dev/null +++ b/src/main/resources/assets/moonsteel/models/block/jar_star.json @@ -0,0 +1,6 @@ +{ + "parent": "minecraft:block/template_lantern", + "textures": { + "all": "moonsteel:block/jar_star" + } +} diff --git a/src/main/resources/assets/moonsteel/models/block/jar_star_hanging.json b/src/main/resources/assets/moonsteel/models/block/jar_star_hanging.json new file mode 100644 index 0000000..da3ce0a --- /dev/null +++ b/src/main/resources/assets/moonsteel/models/block/jar_star_hanging.json @@ -0,0 +1,6 @@ +{ + "parent": "minecraft:block/template_lantern_hanging", + "textures": { + "all": "moonsteel:block/jar_star" + } +} diff --git a/src/main/resources/assets/moonsteel/models/block/moonsteel_brick.json b/src/main/resources/assets/moonsteel/models/block/moonsteel_brick.json new file mode 100644 index 0000000..334d704 --- /dev/null +++ b/src/main/resources/assets/moonsteel/models/block/moonsteel_brick.json @@ -0,0 +1,6 @@ +{ + "parent": "minecraft:block/cube_all", + "textures": { + "all": "moonsteel:block/moonsteel_brick" + } +} diff --git a/src/main/resources/assets/moonsteel/models/block/moonsteel_stair.json b/src/main/resources/assets/moonsteel/models/block/moonsteel_stair.json new file mode 100644 index 0000000..9f92def --- /dev/null +++ b/src/main/resources/assets/moonsteel/models/block/moonsteel_stair.json @@ -0,0 +1,8 @@ +{ + "parent": "minecraft:block/stairs", + "textures": { + "top": "moonsteel:block/moonsteel_brick", + "bottom": "moonsteel:block/moonsteel_brick", + "side": "moonsteel:block/moonsteel_brick" + } +} diff --git a/src/main/resources/assets/moonsteel/models/block/slab/full.json b/src/main/resources/assets/moonsteel/models/block/slab/full.json new file mode 100644 index 0000000..334d704 --- /dev/null +++ b/src/main/resources/assets/moonsteel/models/block/slab/full.json @@ -0,0 +1,6 @@ +{ + "parent": "minecraft:block/cube_all", + "textures": { + "all": "moonsteel:block/moonsteel_brick" + } +} diff --git a/src/main/resources/assets/moonsteel/models/block/slab/lower.json b/src/main/resources/assets/moonsteel/models/block/slab/lower.json new file mode 100644 index 0000000..8aa6e5c --- /dev/null +++ b/src/main/resources/assets/moonsteel/models/block/slab/lower.json @@ -0,0 +1,8 @@ +{ + "parent": "minecraft:block/slab/lower", + "textures": { + "top": "moonsteel:block/moonsteel_brick", + "bottom": "moonsteel:block/moonsteel_brick", + "side": "moonsteel:block/moonsteel_brick" + } +} diff --git a/src/main/resources/assets/moonsteel/models/block/slab/upper.json b/src/main/resources/assets/moonsteel/models/block/slab/upper.json new file mode 100644 index 0000000..106076c --- /dev/null +++ b/src/main/resources/assets/moonsteel/models/block/slab/upper.json @@ -0,0 +1,8 @@ +{ + "parent": "minecraft:block/slab/upper", + "textures": { + "top": "moonsteel:block/moonsteel_brick", + "bottom": "moonsteel:block/moonsteel_brick", + "side": "moonsteel:block/moonsteel_brick" + } +} diff --git a/build.fff b/src/main/resources/assets/moonsteel/oldTex/build.txt similarity index 100% rename from build.fff rename to src/main/resources/assets/moonsteel/oldTex/build.txt diff --git a/src/main/resources/assets/moonsteel/oldTex/chestplate/full.png b/src/main/resources/assets/moonsteel/oldTex/chestplate/full.png new file mode 100644 index 0000000000000000000000000000000000000000..409f32590f97a05dcea6bd7b77a1bc8438b7fb03 GIT binary patch literal 166 zcmeAS@N?(olHy`uVBq!ia0vp^oFL4>1|%O$WD@{VjKx9jP7LeL$-D$|5)%>eGOVAW( O7lWs(pUXO@geCyAD?EAt literal 0 HcmV?d00001 diff --git a/src/main/resources/assets/moonsteel/oldTex/chestplate/half.png b/src/main/resources/assets/moonsteel/oldTex/chestplate/half.png new file mode 100644 index 0000000000000000000000000000000000000000..b90b9e3f00786d242e51e165693a29f73124d8d2 GIT binary patch literal 170 zcmeAS@N?(olHy`uVBq!ia0vp^oFL4>1|%O$WD@{VjKx9jP7LeL$-D$|QaoK8LnNlQ zPB_TfV8G)V-+VYl`1|K&>W<|fA28W&*?gqglx5;Cg%2nHt0)#EuT{DyeBew^rFP4L zm0GK~5|}o;5k1g+wuI$@g|;n=$7_?iS(fPyDt847@5&!mt}0);;C_A4f2K`OWoHFO SACLgr$KdJe=d#Wzp$Pz|Aw7Bk literal 0 HcmV?d00001 diff --git a/src/main/resources/assets/moonsteel/oldTex/chestplate/half_flipped.png b/src/main/resources/assets/moonsteel/oldTex/chestplate/half_flipped.png new file mode 100644 index 0000000000000000000000000000000000000000..e5e6a00424b7e7d9ffa292691bbb6cff006a9954 GIT binary patch literal 169 zcmeAS@N?(olHy`uVBq!ia0vp^oFL4>1|%O$WD@{VjKx9jP7LeL$-D$|l097fV!Oa;T6$B=Eb2JL?JrtZRyFjU_ z$_1+!Zv6}tPS#@ZIo+50E9GvU=94+`ODkm3?#4ne^UZdjKx9jP7LeL$-D$|SkfJR9T^xl z_H+M9WCim11AIbUf%O0X|5J%FBlnrva1|u_AoC(M_WMpCx1kzDJoY~F-7S92)K_CH$ zLHc1dx~&WhK<`grXJ7%UF)%VVU|aw(7o>-E0mQ6nKsE?40Zn28s|>QV0J5OE3=IrG zvNxB{ntF0OcRY}(=jq}YA`x!dvyqp3?#4ne^UZdjKx9jP7LeL$-D$|SkfJR9T^xl z_H+M9WCikt0(?STfwYE(#{d8SQ;YY_UV0D6H8@wdA4sv41o;I6#sB|j*t~xUNQAS% zBeIx*f$uN~Gak=hkpdKyEOCt}3C>R|DNig)We7;j%q!9Ja}7~2)icyHG!kZXF99mr zks9Hd=IN=$zyaj2GDtD9GB5&JUO+4jWrLir!N?32X9BVf8JQRafpioQXSTC|#dCmc z5J&)GkbW4AZYu)=FbF2FGq3>F7#JBFFfM?Y3(~{70AkiOAR7djfF?14RR&pF09jC7 zh6V;8*_+E}O+C4tJ08e1@N{tukqCD^#_g!J2`moUKUVEQC=A8A@kWJ k-q}G&E?6+9>TUPCZQN=e47XaiPlFxp>FVdQ&MBb@0O&JaIRF3v literal 0 HcmV?d00001 diff --git a/src/main/resources/assets/moonsteel/oldTex/moonsteel ruby assets/armor/boots/half/moonsteel.png b/src/main/resources/assets/moonsteel/oldTex/moonsteel ruby assets/armor/boots/half/moonsteel.png new file mode 100644 index 0000000000000000000000000000000000000000..5f5df0cca666992207740edd3283805d851dd115 GIT binary patch literal 434 zcmeAS@N?(olHy`uVBq!ia0vp^oFL4>3?#4ne^UZdjKx9jP7LeL$-D$|SkfJR9T^xl z_H+M9WCikt0(?STf%O0X|5Jow zY!FBQVvv3qjczLg1270Cursg#)fgBV8!#?_mmdKI;Vst0BopTcmMzZ literal 0 HcmV?d00001 diff --git a/src/main/resources/assets/moonsteel/oldTex/moonsteel ruby assets/armor/chestplate/full/moonsteel.png b/src/main/resources/assets/moonsteel/oldTex/moonsteel ruby assets/armor/chestplate/full/moonsteel.png new file mode 100644 index 0000000000000000000000000000000000000000..3e02269de6416c6b8d98ae4e25540ceea02aef25 GIT binary patch literal 459 zcmeAS@N?(olHy`uVBq!ia0vp^oFL4>3?#4ne^UZdjKx9jP7LeL$-D$|SkfJR9T^xl z_H+M9WCil&0(?STf%O0X|7S0~ms-4UVfF6+|L6VxU-I`q!>6+nK&e@OjqU;|u96_X zV4yMxVAym<=R8o9v%n*=n1O-sFbFdq&tH)O6qGD+jVKAuPb(=;EJ|evNX*PD(erZ+ zQ83jr)H5^^W^^wBD%z16;hE;?sl~tnIesvJDxT z7zBZI6cA^&vw+2OfNT&*0Ai4S7>#Z#0|PKfCa^QG0M!^685=MzfS3!?!@2-s)-)g+ z1eky(F@aSESy}*DP+f)w1|Zp+%V$kJxt%*6$TatKaSV|Nm+fZcVld=6RJ3jPwg2@M z76%0c3~w;j9AfmSY7LqnmiqtvnIxa{KK7TtJxkTbP0 Hl+XkK_7rnL literal 0 HcmV?d00001 diff --git a/src/main/resources/assets/moonsteel/oldTex/moonsteel ruby assets/armor/chestplate/half/flipped/moonsteel.png b/src/main/resources/assets/moonsteel/oldTex/moonsteel ruby assets/armor/chestplate/half/flipped/moonsteel.png new file mode 100644 index 0000000000000000000000000000000000000000..d75fd3abb7bf7741cdd31714c8698ba1a3ec13e2 GIT binary patch literal 451 zcmeAS@N?(olHy`uVBq!ia0vp^oFL4>3?#4ne^UZdjKx9jP7LeL$-D$|SkfJR9T^xl z_H+M9WCil21AIbUfwYE(#{d8SXD_|CuzGiD@xH(R89tqr0E+we_b&!goFzei!9WFI zz!2lBSEK+1B}-f*N`mv#O3D+9QW*jgGxJLH{9Hp6O!W-) z42^^t-AjOqcBDplrg?g5F>nAmtPE0&tPG4mmKP99L)jp&XfQH^#hHL?Lq;YBK_DFk z#F_0ZVDTIv8w3)77^ELYqua{Bz|6offt`T`sK&s^*nn{X#9WXb)&&r=rUBU?zyvgj z39K^6(gMhW>M}Gi0Lk85K5Od9?cDJ|rm?4sV~9k!=}AYf0}cXA2hHB4{QckEJmKR7 y5f6n-2PK9h{PNy2{g2h^*H?W+cRgWNvtoF5iXreT$S6-&KbLh*2~7ZyU}~KJ literal 0 HcmV?d00001 diff --git a/src/main/resources/assets/moonsteel/oldTex/moonsteel ruby assets/armor/chestplate/half/moonsteel.png b/src/main/resources/assets/moonsteel/oldTex/moonsteel ruby assets/armor/chestplate/half/moonsteel.png new file mode 100644 index 0000000000000000000000000000000000000000..caf85abfa4c01f6273e51870e1f60afde50c707f GIT binary patch literal 462 zcmeAS@N?(olHy`uVBq!ia0vp^oFL4>3?#4ne^UZdjKx9jP7LeL$-D$|SkfJR9T^xl z_H+M9WCijS1AIbUf%O0X|7S0~r=g*dTD)&z_3r=wOaA|#_xC@;r?V13+2Di0Cx8@p zNswPKP$d*Fc=y)37&w3&Rt70XRt82O%L|C5p=^+sG#Ht|;!Hrc zAtMumAdrp%;>>myuy_uT4FU;34AKvy(QRd500zqhb_N!p8UrI^1I7gqb3uAo7eLIK z24sT(6VN0ku*x7y3m^-s%h138BztrDtf?orbH@XjW}YsNArj%HCms133aEwiV@<{-0!8%V6llsFtz$>U5B4p00i_ I>zopr03LmD(f|Me literal 0 HcmV?d00001 diff --git a/src/main/resources/assets/moonsteel/oldTex/moonsteel ruby assets/armor/helmet/full/moonsteel.png b/src/main/resources/assets/moonsteel/oldTex/moonsteel ruby assets/armor/helmet/full/moonsteel.png new file mode 100644 index 0000000000000000000000000000000000000000..57808a949676d928c7abb731db782bde0a778104 GIT binary patch literal 430 zcmeAS@N?(olHy`uVBq!ia0vp^oFL4>3?#4ne^UZdjKx9jP7LeL$-D$|SkfJR9T^xl z_H+M9WCim11AIbUf%O0X|7S0~ms-3J$UY&nND4@?mIV0)1I7O{{NBbF3>4rj@Q5sC zVBk9p!i>lBSEK+1B}-f*N`mv#O3D+9QW*jgGxJLH{9Hp6O!W-)42^^t-AjOqcBDpl zrg?g5F>rv)WsqWIWncudynt95$_6=IgOM35&IDu|GBPm;0_i9q&TMA^i{}8@AdmpW zApI~J-Btz$p!X-RGq3>F7#JBFFfM?Y3(~{70AkiOAR7djfF?14RR&pF09jC7h6V;8 z*_+E}O+C4tJ08f?^K@|xkq8g%HsoVa5IB_e^nbqDoWc#vB@CYw7G8<)R=seIS7XER fwC|C>vbX55%ba4Eua{&83R?zGS3j3^P63?#4ne^UZdjKx9jP7LeL$-D$|SkfJR9T^xl z_H+M9WCikt0(?STfwYE(#{d8SXD_{%TD%X)H8%~20#a-xL4LtN@&ErBHt%1uA1K0E z;1OBOz`%DHgc*+|!sT9~=#lYVnf1^c0Xt{yM kqE(%Ywr0D}&xu#s8lxD(uxt9&pj?nKp00i_>zopr0QZ+$#{d8T literal 0 HcmV?d00001 diff --git a/src/main/resources/assets/moonsteel/oldTex/moonsteel ruby assets/armor/helmet/half/moonsteel.png b/src/main/resources/assets/moonsteel/oldTex/moonsteel ruby assets/armor/helmet/half/moonsteel.png new file mode 100644 index 0000000000000000000000000000000000000000..72e35a2bd353b1ae0b46d202b61636ee32fe947e GIT binary patch literal 430 zcmeAS@N?(olHy`uVBq!ia0vp^oFL4>1|%O$WD@{VjKx9jP7LeL$-D$|SkfJR9T^xl z_H+M9WCf`#@Q5sCVBk9p!i>lBSEK+1B}-f*N`mv#O3D+9QW*jgGxJLH{9Hp6O!W-) z42^^t-AjOqcBDplrg?g5F>nAmtPE0&tPG4mmKP99L)jqbXfQH^#hHL?Lq;YBK_DFk z#F_0ZVDTIv8w3)77^ELYqua{Bz|6offt`T`sK&s^*nn{X#9WXb)&&r=rUBU?zyvgj z39K^6(gMhW>M}Gi0Lk85K5Od9?cDJ|W|XIkV~9p@Z~sQ#0|p!{{QZ-<<_4u}U!T`` zZt(;qreKRn>mBqh_Oi$*s8*kBe8O<&Z?OwYDC>bU3`<%s9ADBuQ`F(ay#^b*@2sm8 oGX3?#4ne^UZdjKx9jP7LeL$-D$|SkfJR9T^xl z_H+M9WCim11AIbUf%O0X|7S0~ms-3J$UY&nND4@?mIV0)1I7O{{NBbF3>4rj@Q5sC zVBk9p!i>lBSEK+1B}-f*N`mv#O3D+9QW*jgGxJLH{9Hp6O!W-)42^^t-AjOqcBDpl zrg?g5F>rv)WsqWIWncudynt95$_6=IgOM35&IDu|GBPm;0_i9q&TMA^i{}8@AdmpW zApI~J-Btz$p!X-RGq3>F7#JBFFfM?Y3(~{70AkiOAR7djfF?14RR&pF09jC7h6V;8 z*_+E}O+C4tJ08f?^mK6ykqB=+c956Bfaj0{`;Gc%U0ePuDa&%kI?a%rIrWRm_Wf_d a3hNo9+ZkpXbH2F-GQiW-&t;ucLK6U|Sy^@f literal 0 HcmV?d00001 diff --git a/src/main/resources/assets/moonsteel/oldTex/moonsteel ruby assets/armor/leggings/half/flipped/moonsteel.png b/src/main/resources/assets/moonsteel/oldTex/moonsteel ruby assets/armor/leggings/half/flipped/moonsteel.png new file mode 100644 index 0000000000000000000000000000000000000000..62eabf99a149fcc4d415f34d81f59ba3edddcb00 GIT binary patch literal 425 zcmeAS@N?(olHy`uVBq!ia0vp^oFL4>1|%O$WD@{VjKx9jP7LeL$-D$|SkfJR9T^xl z_H+M9WCf`#@Q5sCVBk9p!i>lBSEK+1B}-f*N`mv#O3D+9QW*jgGxJLH{9Hp6O!W-) z42^^t-AjOqcBDplrg?g5F>nAmtPE0&tPG4mmKP99L)jqbXfQH^#hHL?Lq;YBK_DFk z#F_0ZVDTIv8w3)77^ELYqua{Bz|6offt`T`sK&s^*nn{X#9WXb)&&r=rUBU?zyvgj z39K^6(gMhW>M}Gi0Lk85K5Od9?cDJ|W~ir&V~9p@a*9L4e~%oAgp>pzXe#=bosr=n z@&CW^nYgNc#jO?c%s$FKf-+|!%j9D@LMOJhu{mdL5!xic%)Cn}rr}tZ-`whkL+LG- fP9z@bILFTL@`8}I#>@E?Aj>>m{an^LB{Ts53%6P= literal 0 HcmV?d00001 diff --git a/src/main/resources/assets/moonsteel/oldTex/moonsteel ruby assets/armor/leggings/half/moonsteel.png b/src/main/resources/assets/moonsteel/oldTex/moonsteel ruby assets/armor/leggings/half/moonsteel.png new file mode 100644 index 0000000000000000000000000000000000000000..594873999d826b93d943b13e4d357c292d3c760e GIT binary patch literal 429 zcmeAS@N?(olHy`uVBq!ia0vp^oFL4>3?#4ne^UZdjKx9jP7LeL$-D$|SkfJR9T^xl z_H+M9WCikt0(?STf%O0X|1~r;W-q;$TD%X)J=K_^45Zjfg8YJkQvd%mY~H_QKTw3T zz$3Dlfr0NZ2s0kfUy%Y7lq_+LC<)F_D=AMbN@WO0%*-p%^K%VRFx4~EGc*!rbT0ua z+L0RJnda%K#lQjNurf$7vNA9NSzbUa4P}FzuffO+7H0yo4H=mj1c7uE5NEctfW>ow zY!FBQVvv3qjczLg12Y4|1a<}%pc(@sV*|zo5OYC#SQkLdng(Qp029z8Ca}sNOA8{&803>^J`K+lYw{yn>nVOz1jv*4^$qA{c42)r6Y+-C}ZfkjZ-wb5*(6RTy*#Bo}uyNT*35&WX&6FIyENy zxTLdlb#qu9KQJcgM`+&anDbw)kwvkI`*huzcRaf{Kd?VDYuarCu4!}2lO_x5PMmYS zNuMQSL1$dku9wdiZ5A$k)py>yCTs88@W?;;Tb4|V6|R}}Va3eiPlvn@9e(|D&ZF3e z8+I;Q-g3U>x6IB3ADS=q8tvCQH|559qr-kSW@<8G*NjYau58%(DB_Uwp;*n+(`xD$ zozXlh-L*F7;F>$ZdkwbaoIk4-o2EY5M=+I*x0z{m%E`<6t984)eZDD|{*hJv-?M|K zaBWgo@*Gp0FO%fIvhUwrdbyeT>5>2zsrk0=_ewY2{t)|R&wAzazwO!%2*=zC{eMfb zr=}xrO;#-Xgx>8!#?_nEL-eSTn;qrYXNAgmW~3ybw+=4_^38n<$v#^3iAdr2EA9(XH=plWPaYrsh6;fanZKM-#bnls;}W*6t=$n oylP7Ri+KiB2i`DluCJR_&9GIIy~y>>^CXaMp00i_>zopr0D^`u!TWn z&^SMJqOHea2brVsm$O{8_;i&XO;~6ZDIi*?6ROkHdMPa9>cJq*)c5pR4VDH%6Jb6*~lpp(-Tu=)6@L-4h`**hQ?lC$oJ`{3UoHgXEQP9U3 zGtRE<`WODgphcm|P}4Bje~Gy93#)za9zJ{>+mimUKH1^qY@QDtM*^2gi+yDK_-5JC z;(O|R8z(Ihm@n)vQR4W>ecfrj{e^l~Iv>tVnCN*{xV__O68mY{GhS_8HqJ6(A-$hk z*PP~hu6r(P>9MHqPxN`7Y@KRyJ+n`#PgP|?3x}lXl)%PTjcumz<^KMCW7}-?hVPO)F5UW< z#XRG;%HDg|4!IwAU{+9g_u3QN2Sw}>b(d6~i&XS|7X~ogJO5&Kk;4bE7xBf_*>4|z zVLTBKe%k!NK}CbOC2zj!y?^)m&D-sJ*g3%X`Y^13>-iX zD}xjxD+42t3F*3YhM$l-M zG63~YU}sp{u6PTQ*i(^QJ^V^H3y$&S`uzvU) zufpo+(!D@^WoY<`-@QJ9;(Ob6N2P4h5ZV=>kQT)G?v-OqhQHxzqsDG-6bc&=6z@ir&uBkg~{&f#V1JUza~^3=>XY<7Ajw(#s&w zAIib7I$PYna)UT0|GQ&4mU7Gy--Hn-&izjCDz5bcl4OAEI?tdorwTW??^V9oP zRTq+~e$PAVH2I)IXWB8KvBrz*Hy_zs(|lSxT}NzIkE^zc@v-E^yJqJX)IOf1{@a&N zzJAW0hyIKW=glAbF_!F>|MBNla#oSaXB+G0#e=O!+2@Z^0BGlS)%hVak#u7SeM)78&qol`;+02e5H{r~^~ literal 0 HcmV?d00001 diff --git a/src/main/resources/assets/moonsteel/oldTex/moonsteel ruby assets/fishingrod_moonsteel.png b/src/main/resources/assets/moonsteel/oldTex/moonsteel ruby assets/fishingrod_moonsteel.png new file mode 100644 index 0000000000000000000000000000000000000000..496454528043849d70e3fee3d9c2b910b5ef43ba GIT binary patch literal 239 zcmeAS@N?(olHy`uVBq!ia0vp^0wB!63?wyl`GbKJV{wqX6T`Z5GB1G~mUKs7M+SzC z{oH>NS%G|s0G|+77Z;bf^jRK(o!@SnmDVgbH8uVJ|36SNilKiikm4u_@(TuvfB?h2 z=Dm?XG0p;y$YKTtzQZ8Qcszea3Q*9;)5S4FBRKZFp%8;22g^a%*1!MzbzLkiHf5>^ z{Nb%y$ed!*aE9&P*C+3U{lq)|Jt#Z$nk8~QbIQc12YbptIBe0%+|nTU-Q@j0%lW)K XZLE9cKCDs%n#gTe~DWM4f&8kub literal 0 HcmV?d00001 diff --git a/src/main/resources/assets/moonsteel/oldTex/moonsteel ruby assets/ingot_moonsteel_crude.png b/src/main/resources/assets/moonsteel/oldTex/moonsteel ruby assets/ingot_moonsteel_crude.png new file mode 100644 index 0000000000000000000000000000000000000000..574fc6ce90849daa94bc924604c0e73832647748 GIT binary patch literal 908 zcmeAS@N?(olHy`uVBq!ia0vp^0wB!63?wyl`GXl47+W%(odZ0bofQI#^3yVNQh^fZ zr%tr>I2<6->L0vRX)51Zg+~(>THSPYmGKtsPFT1_G^*5~@};~a|Coa|?&)o(~oB&-WJZcyH&Badk%4x1)@qn|pkW6rXXg zPI@59)F#-*uh==WN^AEF=kvdIEw2tKH=Nh{|LTMw6Uhg{osWIYbsq6Py6Nlve2>3O zqNt~$o%%eJ6^@VG*PYheU#MrT^WjX##M5Vl-8+sJiJy)=qt)hR<17;z()+1(&uOmb zy63Xi9^7O1le^h9SM_vhRI*1Br{)qxCpYHMD+!8jyWP4vdFHBD{cxA9pA}=Yb5+8V z2nSg$mE-*X*!QPrPg}P9&XNSC7xf$8_7^H_;NCKO+uz!p+i!&r{O5_ul&#;(dZu>L zy*C*bl@+$|#>AAHRPyh*!{|1zhicD5N zm45I*V1`EUx2pbf{*v==&s*R7Q^(-{a{Saw-_j~`Gn!PCVtL?d`=pSMt}0|)c$ z#>$?a@AmJtMRe`8H+u_fCDwN6GhC8k5Xcl^xU%NI%T0#7On3Q3zi03Iy0OEBWsSg! z>E5psg?rt$F0hNfXSDIE+RUl<%R~N2l=$swm>u_kf9f`l%Jh<~tss|py85}Sb4q9e E0Qy5j9smFU literal 0 HcmV?d00001 diff --git a/src/main/resources/assets/moonsteel/oldTex/moonsteel ruby assets/mining_hammer_moonsteel.png b/src/main/resources/assets/moonsteel/oldTex/moonsteel ruby assets/mining_hammer_moonsteel.png new file mode 100644 index 0000000000000000000000000000000000000000..48f656ff3a5875e2366839fa80df62df65dd08b7 GIT binary patch literal 812 zcmeAS@N?(olHy`uVBq!ia0vp^0wB!63?wyl`GXl47#lO4odZ0bofQI#^3yVNQh^fZ zr%tr?V0M&fu@_cV>S|?l)mayyeR)O4QWrxGE=9Kwp%vwZfhXoZ)H`@AXajG=kBpwE z8xh&riP{`Z`~uYny)L>P`k61}A)vHl!<*x8&TX*f-sf~{%bjC}8{VuD?rz!ov(;7i zL)Ux;-4dY-zUIcp){@KL{n)kKac#Nc)T961qLZ$gE_4)@GdA`Mt8lGIF`gZ`M_}6#XX_U` zeVmr0J=a+Kdx(Bc?AGULQ}s5ta|E9ea6PPW+$wWZOUhQ)!p@U*JNowTe$wA{THw0X zG7GgE2b}bO2G)Pr9c^xD65*G{>wLNUdF>a+1o5uQ^S|xB?RmucWB$Wa>wcMY8T`_$ z+PCVfoa1k^n3!^Dmi?EM5Il z+QOpc-;@;n>y_ojx%u_;R(|=;Z0lMyu^`-WF)&V~1AIbUJpwzw-8Ac%c(}A?d4`{y zr7PJ2av6dP~gxGQU726u}MVS{m?~b zk%b5L&t8`IEN<~COV1uPuHxz^1xB7V<{sPMTCTq`$?=GchR*Stumi&4hR3byPy5u~ l57gYt?4JMVnsUKwL4Dr)Y=Xh@o8&-Ndb;|#taD0e0sy!dBfJ0r literal 0 HcmV?d00001 diff --git a/src/main/resources/assets/moonsteel/oldTex/moonsteel ruby assets/moonsteel_crown.png b/src/main/resources/assets/moonsteel/oldTex/moonsteel ruby assets/moonsteel_crown.png new file mode 100644 index 0000000000000000000000000000000000000000..6a372600e91583c9c6859ffa9862e5eebfa4d2b6 GIT binary patch literal 765 zcmeAS@N?(olHy`uVBq!ia0vp^0wB!63?wyl`GXl47@IPkodZ0bofQI#^3yVNQh^fZ zr%tr?V0M&fu@`m~JbFk(Ni5t&J2%8-181PfK?e_|A6k2M&(L_H_fRh>S@Q;)PK}A1 zZqAymTQ`WZ9AxjGWqS-4&Cb&kn(q@(UUTo_f@`-Kryl+9R$X+|bfKd#-%Lw&{XIH1n#~rZ(Dm~bK%m{ZxXvQm0T_wM5OofRI;UPbuH{XS+}Ea|L!OKU8e=E zOD(fdJCU?-`kxi{KklxbEhVL+zO{AX%bTC?RWGb$-^V@gd+C$P`^O*DH+k=VbzUs- zi}M$!P;NP=<6?8-Lrs&#^|md1ZMfXJ%Jb9dFH3_ylxf{J;h$@MVOPYvwVTeLv{hNM zdS>PD}ZWxQX@RmJUz7-IDi~h1}R2X21X#u3y7tm zY*2F1U}Of1GXdF#j7;F<69r^vwzGi6vw&<6_*BNo@B)~sU^JSg3_$%8*cn)WDh-T` z4Hy?dOa=M_4CX97bm(E?Z;($-JzX3_G=h(wG2~)U5MVyoyYtWg(@hJSZbZy1QtNn{1`0|R_QTw`PRB}6f#ryu(JpCKS%=clt0k&%1K%TM_F?ud@w7ZS2NG4Vif z@UF11-O0%Za&wO)B<%n7>sLw1@syN<;o*A<3y)P)oXpBPTw8mpq2V;p)D82PB!QH4 zNswRgf1H3p-Gti|sEo6~BeIx*f$uN~Gak=hkpdKyC~=J_3C>R|DNig)We7;j%q!9J za}7~2)iczy%*nfD2UN2yHNrE^(^HFq1IS@zkYZ$IU<9(ffLI#J28D3CK2N zWMU8i(osO1+0FtM&jPYRAOVO$`e8Jhr3}C@oxsk(0#spOWNg5=0Aeag2kQceNmGDq z5MTnD!vt0tWN86pL3J4#7=UDb&L8kl?Z3VN$lT=V;uzxL{dV$Qu4V%sx5+o%7O$P< z_xSOH`=V%Qdd#1|5Y2F2#X?h3axfni{o%o%=*v<6)=avJN z@4x-r!oaDct}%V%0*(wx?yiJGhb{Ln;P|xtS|H2h@0E)ea1;PV5A;Pch+eFVdQ&MBb@0PyYAEC2ui literal 0 HcmV?d00001 diff --git a/src/main/resources/assets/moonsteel/oldTex/moonsteel ruby assets/moonsteel_shield.png b/src/main/resources/assets/moonsteel/oldTex/moonsteel ruby assets/moonsteel_shield.png new file mode 100644 index 0000000000000000000000000000000000000000..1345aa2a37a9e507ffada27aec81c1d541e5dc82 GIT binary patch literal 255 zcmeAS@N?(olHy`uVBq!ia0vp^0wB!63?wyl`GbKJV{wqX6T`Z5GB1G~mUKs7M+SzC z{oH>NS%G}%0G|+7kHF53iHE=4G}Dmd_B0diOjpnFlbgNt9#CG@cT~KO@%x0}ke3>C6BAA3dy)lg+RB zWWuT&>>n;~VKC?k4eiNvi?EpNb1Px-CY7m~j+`EQm0BYL>Z~>}{S?%E@IzVkoLHc4 kN^1XJvEAYO`+k3BkUz})uVSmucc2{%p00i_>zopr0JLvb1poj5 literal 0 HcmV?d00001 diff --git a/src/main/resources/assets/moonsteel/oldTex/moonsteel ruby assets/moonsteelchestbottom.png b/src/main/resources/assets/moonsteel/oldTex/moonsteel ruby assets/moonsteelchestbottom.png new file mode 100644 index 0000000000000000000000000000000000000000..5020970c786c911a9677a64999d98c0ef98dae07 GIT binary patch literal 1007 zcmeAS@N?(olHy`uVBq!ia0vp^0wB!61SBU+%rIkMU~I^Ab`J1#c2)=|%1_J8No8Qr zI6rlwuZByY%+dO^4ik+uMbG?3QE3(LwpmwJWCpNtzu#-p@8 zS#vY$hSt)WDLJ`oI(nBquTNi=7PR=zuDkKi?-lR*9`oVprDadA^);oY&yBEHa`x!+ zt-r$mY+*WE@^aa1$!<605ZUV_V4W1X$tr)r~eXYPiali$yZ zS}v>z-Z(YR-1~coK9A1r&6mBV-}Ic}xvXPR;)ZitnVY_x&gy<7H2H6UXubPEdC}>L z>q31BeKxeU#(h})??L(YyrO~yGekHX?{+`0{o?Rf?@77M``FaO40Y(XDfk$L90|Vb75M~tB@M-`G zN|v}rlmzFem6RtIr7{F0X6BXX`MHKDnCcno85#*Qx|aYI^`%C5rg?g5F>nAmtPE0& ztPG4mmKP99L)oC%*I;A@i-Y3dkdcW&5J*P>ab`OUSUd;F27ymyj0`WB5j4833=BXM zCa^QG0M!~885=MzfSCLLKUh0M>m`;SCk{6r2d1wuPZ!4!3xD592eZNq1zOMh6rB#` ziq+^^uwzr}uA-;E?Ry@0X?Au0PCxftY3EycCkquzFUcK+_-uK11x!E_PzvbB8o|b#M zEV$IeOS+LoLR_y!#Z^OTacbVo=(OoqoMuX%c+k4RfQLh%SYNFut?$$4k1uB?Sv|{~ z$<$voZ|MxaCF0AMq!wJYh?#!R=p*;}qPbE!2h3Oxi!G+i&(4Sme!e(q)Al0?%n8BE-ZXM&xlUX%XR23D$mUH6IWc9r>X*Y#80k)#$oU|V z|F@C)m8?bW**BV{zIB{o@pBS0*`>tky5^XN!|xvt-@f0!_EkY_jQiEV(tzZy;<#t- yRmI{Te>}bX_H}HK*U|}BTw+^Y1Fz+*e`wF`QIq)nmYNVKyggn0T-G@yGywn$mZDGq literal 0 HcmV?d00001 diff --git a/src/main/resources/assets/moonsteel/oldTex/moonsteel ruby assets/moonsteelchestfront.png b/src/main/resources/assets/moonsteel/oldTex/moonsteel ruby assets/moonsteelchestfront.png new file mode 100644 index 0000000000000000000000000000000000000000..b8bc37af198beb1e6fa34e75bc41f7b0e653f43b GIT binary patch literal 1189 zcmeAS@N?(olHy`uVBq!ia0vp^0wB!61SBU+%rIkMU~I^Ab`J1#c2)=|%1_J8No8Qr zI6rlwuZByY%+dO^4ik+uMbG?3QE3(LwpmwJWCpNtzu#-p@8 zS#vY$hSt)WDLJ`oI(nBquTNi=7PR=zuDkKi?-lR*9`oVprDadA^);oY&yBEHa`x!+ zt-r$mY+*WE@^aa1$!<605ZUV_V4W1X$tr)r~eXYPiali$yZ zS}v>z-Z(YR-1~coK9A1r&6mBV-}Ic}xvXPR;)ZitnVY_x&gy<7H2H6UXubPEdC}>L z>q31BeKxeU#(h})??L(YyrO~yGekHX?{+`0{o?Rf?@77M``FaO40Y(XDfk$L90|Vb75M~tB@M-`G zN|v}rlmzFem6RtIr7{F0X6BXX`MHKDnCcno85#*Qx|aYI^`%C5rg?g5F>nAmtPE0& ztPG4mmKP99L)oC%*I;A@i-Y3dkdcW&5J*P>ab`OUSUd;F27ymyj0`WB5j4833=BXM zCa^QG0M!~885=MzfSCLLKUh0M>m`;SCk{6r2dd-oba4!^@b?YeohRZbu;$&(z1Qb$ zOr4;r9I4d6Af$5qgwjEwC4aaCABA`PV7FuLWD#PTO{ayvTXo8>8@4RVOxqk8{48{% zmRWfB&F{<3S>F~Ye3V>cvCoKwg^9W6;Dxi#Ki|zOxA|!-R}!*jRHI9~t%7IW8Geb(2nJq-#?{&GZ3 zmZvj9U zgV^p@8 zS#vY$hSt)WDLJ`oI(nBquTNi=7PR=zuDkKi?-lR*9`oVprDadA^);oY&yBEHa`x!+ zt-r$mY+*WE@^aa1$!<605ZUV_V4W1X$tr)r~eXYPiali$yZ zS}v>z-Z(YR-1~coK9A1r&6mBV-}Ic}xvXPR;)ZitnVY_x&gy<7H2H6UXubPEdC}>L z>q31BeKxeU#(h})??L(YyrO~yGekHX?{+`0{o?Rf?@77M``FaO40Y(XDfk$L90|Vb75M~tB@M-`G zN|v}rlmzFem6RtIr7{F0X6BXX`MHKDnCcno85#*Qx|aYI^`%C5rg?g5F>nAmtPE0& ztPG4mmKP99L)oC%*I;A@i-Y3dkdcW&5J*P>ab`OUSUd;F27ymyj0`WB5j4833=BXM zCa^QG0M!~885=MzfSCLLKUh0M>m`;SCk{6r2d1xQo-U3d7XH40r}Kmz1=hUVSbjZ9 z!LG4Igi~=xf#WC9#DhnL?9Uu`(O^t*Tzt9(LMQ=%Dhl zbBqR?*I0dee#3UlmMFb1kJt~K(V3*8{(RXHnKrQ_N}LXXXPj&z&+%`!&)gdG<5jd5 z=Y|K><}{w&zAqBmuCe#X`qo}<^NG%X3Z`gz^W8J>}Qbyn@l-=@izW~KW|Vpsk4@cd_U ztLuMO-9K;k{rcI$#fx0l+2(zpz2DMR(DF^*p9}MUIrk_&U#Mp*yj!HUE3U}qO@7(y z*AGifE`W>KlFZ`d$UK_SekdSJcICz8-k4;A+7TsdRk4| z$St^e=1fP^!#oYE>^eifo-CH*D3-ss_wU#0wL+mm=MMUWO!gA-T~)bfx=g6B;rOL_d$K=JSC>gTe~DWM4fV@>46 literal 0 HcmV?d00001 diff --git a/src/main/resources/assets/moonsteel/oldTex/moonsteel ruby assets/moonsteelchesttop.png b/src/main/resources/assets/moonsteel/oldTex/moonsteel ruby assets/moonsteelchesttop.png new file mode 100644 index 0000000000000000000000000000000000000000..ce367c298c6183fb40cc3260ba6cfd0ceb50a26e GIT binary patch literal 962 zcmeAS@N?(olHy`uVBq!ia0vp^0wB!63?wyl`GXl47#lL3odZ0bofQI#^3yVNQh^fZ zr%v?Ma0!$-TA$WoqLHTPncpZXt>WD_>&lAE05RxkVRW;X3qSmciz5;{3+ zZbseET3RzDCwEOp@3QCh>C4iB7T?)*H~#s(;$7ckK0Lj&?CG_>rquMg5f)3%9(}&` zSNNYTOlM18E}Jdc?WPvim&V9Q$Oy%I3=RYcg4jP_p?2dMdO6z?wv>zdC$#$ zR@7FpM(@t^6RfTBQ}aZA`WCJ_U^i8=BrWOjA;(1B(1UKQv$gwFZB*{e-H>zg`&m)T zg%!aYr^cCke-F{;(Yd|(ve)#Ro-;g`bu3EUa84_8)0fj(-H(JO{|ykWcRwgEI$d#H zs86BKhPKwY4~zdjDBqq}RIp%%2#4d{?&q~%9RBJ(DYtq5`^M)_>JRGMw0FOWKYj4T z@)y>rYkzY@ZF}%&*BZ&{f}Ol?{Uz^SO{07Rg zu6Yk02vh}6+8gooF7MR6e=C<=xzBIgSTr$x{mnPPC@Br_331g{lQ-5=H8)f@Gf>k| zk+pZtvUkmPaLaLU%QiL-H!+VeHV-p03pLeOb9Bo!v4}9!S2Z#VGqH#?G7YhF&NMU$ zwslT7G!4-=4%9dDw{=Q2Gz~T|2{Hh3jRS0*(rleGY@AYU9DyiBOI6kas9jghk@ub$ z&;gtU9+AZi415Pcm~qF%?6*Kc$r9IylHmNblJdl&REB`W%)AmkKi3ciQ$0gHLnC2E z_Y$C@zSIcMG*3@01`Z&Hl|hP;m4Ok+@&aOMC>xagG#Ht|;!HrcAtMumAdrp%;>>my zuy_uT4FWgI7#UswQz?u_x0QhbXusE0YdppILKL5>`WAQ3N?x@xktqJV@X&Ve= zWNXbVpFbB@TPOSOmGF^=FUt2=GX+NS%G}H0G|+7kHF5^OYeQVY1T3Ea9sKowY!FBQVvv3qjczLg129M?ursg#)fgBV8!#?_m{gcqYK2&4FOUvbL q@8)b(_|0!|U;K`xK;6@S5m&jV)UjL13w48>$KdJe=d#Wzp$Pyg7Ijbn literal 0 HcmV?d00001 diff --git a/src/main/resources/assets/moonsteel/oldTex/moonsteel ruby assets/tool_sickle_moonsteel.png b/src/main/resources/assets/moonsteel/oldTex/moonsteel ruby assets/tool_sickle_moonsteel.png new file mode 100644 index 0000000000000000000000000000000000000000..bb9f642c5a22df24791a0655c482c61cce04adc9 GIT binary patch literal 490 zcmeAS@N?(olHy`uVBq!ia0vp^0wB!63?wyl`GbKJV{wqX6T`Z5GB1G~mUKs7M+SzC z{oH>NS%G}H0G|+7kHF5^OYe0|JpApZnWvd(hM$~<9Cv5Bx{gsOP|1|Yf(#(VRTAVE z{2vAwHl5Kq4;1Ar@Q5sCVBk9p!i>lBSEK+1B}-f*N`mv#O3D+9QW*jgGxJLH{9Hp6 zO!W-)42^^t-AjOqcBDplrg?g5F>nAmtPE0&tPG4mmKP99L)jqjXfQH^#hHL?Lq;YB zK_DFk#F_0ZVDTIv8w3)77^ELYqua{B01T1|>qTc|Nn;* zXWL5XO!$c3*8Gp00i_>zopr0Qo3>$^ZZW literal 0 HcmV?d00001 diff --git a/src/main/resources/assets/moonsteel/textures/armor/wolf/moonsteel.png b/src/main/resources/assets/moonsteel/textures/armor/wolf/moonsteel.png new file mode 100644 index 0000000000000000000000000000000000000000..d966c3a66c3706c32ca9fbe63b93dccec70c36db GIT binary patch literal 718 zcmeAS@N?(olHy`uVBq!ia0vp^4nVBH!3-p)I`?e@QjEnx?oJHr&dIz4a;gJ-LR@3x z)&&GD4Gmuw7`)oscTsTI3KzFoVPVVMJ(qa-EdT%ie?rnqph!UQ8gIXaL7|I+LRME) z@2YLQSyO)|Fl1?N;r6ibML@QH;EJC9n~hCpYU++v*I(=Ey$(b`OKR&+RMwsWDkvV9>2%%>G7^WmD#L0cBh|ApFexkpWv|B zA{lATC({@&++)<8qOx?C?DJPSlg~1}n(Mdk-qjUXGG2*1={p@iW|{a?**ISy6s z^0{oObF#sz`bF!$c`U~tru1G*oV83-$BIetrf_!D)zVc**P5L3%D7d`@w|+a;d-cu z{>uHwofL}t8aqD(^lUdTJo$s2;ks%28{QZWhUBSd_Z?cw(Cd^Uf6=Ld?fpk{_lzCi zf8S@YsEP*)@dm7YUdeyK^rhQ9Nk<(QuTQfAMb^7KJR$MJ4Y{j5L-`}6q?i;a|< z?<(ka+Zifo=5A9y)_3mN&k2nU{}T9>eyKF{*zVCtb8}g+IEaZ&n(@<$I-UzpehGe^ zUSO5hd~3($4_-%}2M8O_ur@UNbUJ^xpDw%0*}HenZBv+AT3D)fd-7%mx!DK)RmSrC excTFM!~W+6mmBt(oaqE61_n=8KbLh*2~7Ys1Yj5d literal 0 HcmV?d00001 diff --git a/src/main/resources/assets/moonsteel/textures/art/borders/border_moonsteel.png b/src/main/resources/assets/moonsteel/textures/art/borders/border_moonsteel.png new file mode 100644 index 0000000000000000000000000000000000000000..d46c84c50ce3158d7816ffda19469ebdddc768a4 GIT binary patch literal 2870 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 literal 0 HcmV?d00001 diff --git a/src/main/resources/assets/moonsteel/textures/block/moonsteel_brick.png b/src/main/resources/assets/moonsteel/textures/block/moonsteel_brick.png new file mode 100644 index 0000000000000000000000000000000000000000..0db3cd23efd7b443e69bc7fe6382e641a8d8fb8f GIT binary patch literal 830 zcmeAS@N?(olHy`uVBq!ia0vp^0wB!63?wyl`GbKJV{wqX6T`Z5GB1G~mUKs7M+SzC z{oH>NS%Lfy0X`wF;*#d#l4c@e1_FXAy!=YMe6mVvu6ia>TKd7#@>X(6c6|Ku77ke! z4msA&`R4YS##Tw@cA0$q3X(Er(sCA(vSt#}CK6KShURgWj=7eOIYyR=rnYIumPvd9 z3JNNYDw-bhDvnaJ=2Eg2d;;=1Mq#?f5qc&OCe|q?)~Oo0{*p4LQnF^6`auR}F>2aA zs+wNX@|NO~rfOQ=YTCX!M&bHq(b963eEf1^5=Q!_(fVewimJ}?$_~7Iaw4MoynOOJ zyi!8Kn!LQy+&mK8+~WL#YP@_h;!-9&ypsF^O8f$f;*!SVk|zB83Oqa#jL!ov0R7Hc z;1OBOz`%DHgc*ow zY!FBQVvv3qjczLg128%#ursg#)fgBV8!#?_mK-s~D9XvrFPdeL=zEVvM!AS9@~GTOv=PUeaS(>o{ptczZ6QoeJC^SAq{ fA3tvBKNS0oJ?E8b=$3<#;9&A}^>bP0l+XkKZ{*hb literal 0 HcmV?d00001 diff --git a/src/main/resources/assets/moonsteel/textures/gui/sprites/hud/armor_bar/item/armor_chestplate_moonsteel/full.png b/src/main/resources/assets/moonsteel/textures/gui/sprites/hud/armor_bar/item/armor_chestplate_moonsteel/full.png index 409f32590f97a05dcea6bd7b77a1bc8438b7fb03..3e02269de6416c6b8d98ae4e25540ceea02aef25 100644 GIT binary patch literal 459 zcmeAS@N?(olHy`uVBq!ia0vp^oFL4>3?#4ne^UZdjKx9jP7LeL$-D$|SkfJR9T^xl z_H+M9WCil&0(?STf%O0X|7S0~ms-4UVfF6+|L6VxU-I`q!>6+nK&e@OjqU;|u96_X zV4yMxVAym<=R8o9v%n*=n1O-sFbFdq&tH)O6qGD+jVKAuPb(=;EJ|evNX*PD(erZ+ zQ83jr)H5^^W^^wBD%z16;hE;?sl~tnIesvJDxT z7zBZI6cA^&vw+2OfNT&*0Ai4S7>#Z#0|PKfCa^QG0M!^685=MzfS3!?!@2-s)-)g+ z1eky(F@aSESy}*DP+f)w1|Zp+%V$kJxt%*6$TatKaSV|Nm+fZcVld=6RJ3jPwg2@M z76%0c3~w;j9AfmSY7LqnmiqtvnIxa{KK7TtJxkTbP0 Hl+XkK_7rnL delta 149 zcmV;G0BZls1Ev9x8Gi-<007{T1`q%M00DDSM?wIu&K&6g003Y~L_t&-m5q?W4S*mF zMPG@dxRz&U!Yl6L!4+_pau8}o4!)#G^ZrjsfE%sjF&6+;RbtAx;>!hqZNC6a#+1#q zOC0ATY7y_Ho%dm5U1k6YpJc$V($v2{Lfqc}ljQ{tg(>|bnhp^)00000NkvXXu0mjf DlF&RZ diff --git a/src/main/resources/assets/moonsteel/textures/gui/sprites/hud/armor_bar/item/armor_chestplate_moonsteel/half.png b/src/main/resources/assets/moonsteel/textures/gui/sprites/hud/armor_bar/item/armor_chestplate_moonsteel/half.png index b90b9e3f00786d242e51e165693a29f73124d8d2..caf85abfa4c01f6273e51870e1f60afde50c707f 100644 GIT binary patch literal 462 zcmeAS@N?(olHy`uVBq!ia0vp^oFL4>3?#4ne^UZdjKx9jP7LeL$-D$|SkfJR9T^xl z_H+M9WCijS1AIbUf%O0X|7S0~r=g*dTD)&z_3r=wOaA|#_xC@;r?V13+2Di0Cx8@p zNswPKP$d*Fc=y)37&w3&Rt70XRt82O%L|C5p=^+sG#Ht|;!Hrc zAtMumAdrp%;>>myuy_uT4FU;34AKvy(QRd500zqhb_N!p8UrI^1I7gqb3uAo7eLIK z24sT(6VN0ku*x7y3m^-s%h138BztrDtf?orbH@XjW}YsNArj%HCms133aEwiV@<{-0!8%V6llsFtz$>U5B4p00i_ I>zopr03LmD(f|Me delta 153 zcmV;K0A~Nr1F8X#8Gi-<007{T1`q%M00DDSM?wIu&K&6g003l3L_t&-m4%SO34kyR zMPGx%WE1!ErYAvn@!$eIw6ny6H3X6RAn?imBq4BPts>qNz|4$!D}nXMiN#5pmrg!y|fkrJ&z`a{mId3?#4ne^UZdjKx9jP7LeL$-D$|SkfJR9T^xl z_H+M9WCil21AIbUfwYE(#{d8SXD_|CuzGiD@xH(R89tqr0E+we_b&!goFzei!9WFI zz!2lBSEK+1B}-f*N`mv#O3D+9QW*jgGxJLH{9Hp6O!W-) z42^^t-AjOqcBDplrg?g5F>nAmtPE0&tPG4mmKP99L)jp&XfQH^#hHL?Lq;YBK_DFk z#F_0ZVDTIv8w3)77^ELYqua{Bz|6offt`T`sK&s^*nn{X#9WXb)&&r=rUBU?zyvgj z39K^6(gMhW>M}Gi0Lk85K5Od9?cDJ|rm?4sV~9k!=}AYf0}cXA2hHB4{QckEJmKR7 y5f6n-2PK9h{PNy2{g2h^*H?W+cRgWNvtoF5iXreT$S6-&KbLh*2~7ZyU}~KJ delta 152 zcmV;J0B8Th1E~R!8Gi-<007{T1`q%M00DDSM?wIu&K&6g003i2L_t&-m5q?W34kyR z0I%XO*~I<))t69r@!i9TA!hh(3S-0000NS%G}%0G|+7IS`QlcGK+t|Npa>-b*Uj%>@M9AX5t$L@xnSoFzei!9ZCsU{&803_>k{(y&S|MdkxW~8T!V~9p@Z=WY$g8>h-ui2mf;>x?9Hce1yKQ*&wQd9pS z`G(|R2U$TuHEo88k!u6f!x&bql9PO_vLIag+`R=+T`Y{}UY(riP!Ph#w_y5@HO$wZ enBCj|k5SK1lg-q5@x;|23q4)^T-G@yGywo=NOLU! literal 0 HcmV?d00001 diff --git a/src/main/resources/assets/moonsteel/textures/item/armor_pendant_moonsteel.png b/src/main/resources/assets/moonsteel/textures/item/armor_pendant_moonsteel.png new file mode 100644 index 0000000000000000000000000000000000000000..9ebf6fe74c6821c5ad8905b12ed02757e7628564 GIT binary patch literal 475 zcmeAS@N?(olHy`uVBq!ia0vp^0wB!63?wyl`GbKJV{wqX6T`Z5GB1G~mUKs7M+SzC z{oH>NS%G}f0G|+7IXSui|NqZkdM~M9Hy0Pzx0_}_8Rtp0Wk8C(B*-rqC<_D(Qr^sN zKq1ZokH}&M2EM}}%y>M1MG8<*qQo_#Bsf2L5h);ff2~^0%B<>8{`8GMrN=$6Oe7l$OQIL6p)?S&H@(C z0jH>LQ-Ev`U;>)M1XdYjX#r$G zbr~8MfMk8nAMjA^zrFy-4D)nx4ABVA?Z3$9pvd9m`QhJxb@MZCcZumgo7wnicZ+(1 zDZ{m{1mPXaRZKM%_Ro@VVf-*fzU1Q@)<4n?b6yw;Nir_W^`DkJaptVm-I<#UyHl=z aFASD$=wdmq&ikAlWSgg}pUXO@geCxNOmRE_ literal 0 HcmV?d00001 diff --git a/src/main/resources/assets/moonsteel/textures/item/jar_star.png b/src/main/resources/assets/moonsteel/textures/item/jar_star.png new file mode 100644 index 0000000000000000000000000000000000000000..039b7672ae9d5f57bf781ea58347199d2be7cb1f GIT binary patch literal 526 zcmeAS@N?(olHy`uVBq!ia0vp^0wB!63?wyl`GbKJV{wqX6T`Z5GB1G~mUKs7M+SzC z{oH>NS%G}r0G|+74LNR4Gttg;^>}xw17H9B|NlQBiedA$+yDR1`}?24$DQH-|B_E< zCFUJF1Jp6)C=VNu;x7sE3kIr00t{E~%vcDN;w5| zM#ct=3n1o#^sp{~m^BT^1_36ZNlajsL6#Ok7F3s^fdNSN=JHunPj2Uq2Qt$NS%G}T0G|+7kHF5^OYeQVY1T3EaB0o*Kby~8Gdp=RSwn6+kg~z zNswRge>h<9@@M=66y_}Oh%9Dc;5!V$jK}j=qyPnzJY5_^G=f9>1Njapa5#Gxp8NWb zJx;(_B7RSLrqUI5hJCC;J(>ycR1#!#3k@SQjl^PzX3J&8vk%ms?Pa+1iDlOL zF74AnJ(cV4PF^o@?(A~g8_Lm-jx+7p?RCUn>NTtGIkpJ>#qKpg+Za4u{an^LB{Ts5 DMH^pY literal 0 HcmV?d00001 diff --git a/src/main/resources/assets/moonsteel/textures/item/moonsteel_wolf_armor.png b/src/main/resources/assets/moonsteel/textures/item/moonsteel_wolf_armor.png new file mode 100644 index 0000000000000000000000000000000000000000..1ba0a53927847ba2f8d9d1584312275d1bcbb729 GIT binary patch literal 277 zcmV+w0qXvVP)Px#&q+i@Q7aC@KoEUxdW4$Q=#kKH1Uv~2!3nreQ6x*~2`bP80jdrX7P)3L zm4n*JhSD@hcxLv^n@{E~@bgH93W!L;o0$Os-h1s!0Kga{d7k$UX_^M@tx#UfTO9@> zlF~YfQCcUZb+TF?goxyMok(e&#?WJoku2V{**!YjnHlzS1OV8}9;fpi05oRItmGZj z@d$O*%`-FVY6 Date: Mon, 21 Sep 2026 14:57:17 +0200 Subject: [PATCH 11/13] commandly support --- build.gradle.kts | 2 +- .../java/useless/moonsteel/MoonSteel.java | 16 ++-- .../useless/moonsteel/MoonSteelClient.java | 9 +-- .../useless/moonsteel/MoonSteelConstants.java | 17 ++++ .../moonsteel/api/MoonSteelCompat.java | 6 +- .../moonsteel/api/MoonSteelCompatClient.java | 3 +- .../moonsteel/api/MoonSteelMixinPlugin.java | 11 ++- .../moonsteel/item/MoonSteelItems.java | 9 +-- .../mixin/commandly/VeinMinerMixin.java | 76 ++++++++++++++++++ .../mixin/commandly/VeinMiningAccessor.java | 12 +++ .../mixin/fortune/BlockLogicMixin.java | 7 -- .../moonsteel/recipe/MoonSteelRecipes.java | 26 +++++- .../assets/moonsteel/lang/ru_RU/ru_RU.lang | 21 ++++- .../moonsteel/oldTex/old_moonsteel_crude.png | Bin 0 -> 854 bytes .../textures/item/moonsteel_crude.png | Bin 854 -> 348 bytes src/main/resources/moonsteel.mixins.json | 2 + 16 files changed, 174 insertions(+), 43 deletions(-) create mode 100644 src/main/java/useless/moonsteel/MoonSteelConstants.java create mode 100644 src/main/java/useless/moonsteel/mixin/commandly/VeinMinerMixin.java create mode 100644 src/main/java/useless/moonsteel/mixin/commandly/VeinMiningAccessor.java create mode 100644 src/main/resources/assets/moonsteel/oldTex/old_moonsteel_crude.png diff --git a/build.gradle.kts b/build.gradle.kts index a9da41c..9590f0c 100644 --- a/build.gradle.kts +++ b/build.gradle.kts @@ -48,9 +48,9 @@ dependencies { compileOnly(libs.btabackpacks) compileOnly(libs.paxels) + compileOnly(libs.commandly) // for later -// compileOnly(libs.commandly) // compileOnly(libs.aether) diff --git a/src/main/java/useless/moonsteel/MoonSteel.java b/src/main/java/useless/moonsteel/MoonSteel.java index a9318c9..0559e0c 100644 --- a/src/main/java/useless/moonsteel/MoonSteel.java +++ b/src/main/java/useless/moonsteel/MoonSteel.java @@ -1,7 +1,6 @@ package useless.moonsteel; import net.fabricmc.api.ModInitializer; -import net.fabricmc.loader.api.FabricLoader; import net.minecraft.core.block.Blocks; import net.minecraft.core.block.entity.TileEntityDispatcher; import net.minecraft.core.item.IItemConvertible; @@ -11,8 +10,6 @@ import net.minecraft.core.util.collection.NamespaceID; import net.minecraft.core.world.World; import org.jetbrains.annotations.NotNull; -import org.slf4j.Logger; -import org.slf4j.LoggerFactory; import turniplabs.halplibe.HalpLibe; import turniplabs.halplibe.event.defs.CommonEvents; import turniplabs.halplibe.helper.creativeInventory.CreativeInventoryCategory; @@ -34,13 +31,11 @@ public class MoonSteel implements ModInitializer { - public static final String MOD_ID = HalpLibe.registerMod("moonsteel"); - public static final String MOJANG_ID = HalpLibe.registerMod("sound3"); + public static final String MOD_ID = HalpLibe.registerMod(MoonSteelConstants.MOD_ID); public static final Key KEY = Key.of(MOD_ID); - public static final Logger LOGGER = LoggerFactory.getLogger(MOD_ID); - public static final String SMOKE = "moonsteel$magic_smoke"; public static final String STAR = "moonsteel$star"; - public static boolean backpackPresent = FabricLoader.getInstance().isModLoaded("betterwithbackpacks"); + public static final String SMOKE = "moonsteel$magic_smoke"; + // Settings public static int blockId; public static int itemId; public static int GUI_ID; @@ -72,7 +67,7 @@ public class MoonSteel implements ModInitializer { @Override public void onInitialize() { - LOGGER.info("MoonSteel initialized."); + MoonSteelConstants.LOGGER.info("MoonSteel initialized."); CommonEvents.BEFORE_GAME_START.listen(KEY, this::beforeGameStart); CommonEvents.RECIPES_READY.listen(KEY, MoonSteelRecipes::onRecipesReady); CommonEvents.RECIPES_NAMESPACE_INIT.listen(KEY, MoonSteelRecipes::initNamespaces); @@ -81,7 +76,6 @@ public void onInitialize() { public void beforeGameStart() { SoundTypes.loadSoundsJson(MOD_ID); - SoundTypes.loadSoundsJson(MOJANG_ID); TileEntityDispatcher.addMapping( TileEntityStellarRewinder.class, NamespaceID.fromPool(MOD_ID, "moonsteel$stellar_rewinder") @@ -113,7 +107,7 @@ public void beforeGameStart() { CreativeInventoryRegistry.INSTANCE.register(ARMOR_BOOTS_MOONSTEEL, place(() -> Items.ARMOR_WOLF_STEEL)); CreativeInventoryRegistry.INSTANCE.register(ARMOR_WOLF_MOONSTEEL, place(() -> Items.ARMOR_WOLF_STEEL)); - if (backpackPresent){ + if (MoonSteelConstants.BACKPACKS.getAsBoolean()){ CreativeInventoryRegistry.INSTANCE.register(BACKPACK_COSMIC, place(() -> Items.ARMOR_WOLF_STEEL)); } } diff --git a/src/main/java/useless/moonsteel/MoonSteelClient.java b/src/main/java/useless/moonsteel/MoonSteelClient.java index 8c489bc..027ab02 100644 --- a/src/main/java/useless/moonsteel/MoonSteelClient.java +++ b/src/main/java/useless/moonsteel/MoonSteelClient.java @@ -18,8 +18,7 @@ import java.io.IOException; import java.net.URISyntaxException; -import static useless.moonsteel.MoonSteel.KEY; -import static useless.moonsteel.MoonSteel.MOD_ID; +import static useless.moonsteel.MoonSteel.*; public class MoonSteelClient implements ClientModInitializer { @@ -39,7 +38,7 @@ public void beforeClientStart() { try { TextureRegistry.initializeAllFiles(MOD_ID, stitcher, true); } catch (URISyntaxException | IOException e) { - MoonSteel.LOGGER.error("Failed to initialize texture files!", e); + MoonSteelConstants.LOGGER.error("Failed to initialize texture files!", e); } } SoundRepository.namespaceAdded(MOD_ID); @@ -47,8 +46,8 @@ public void beforeClientStart() { public void afterClientStart() { - ParticleDispatcher.getInstance().addDispatch("moonsteel$star", (world, x, y, z, motionX, motionY, motionZ, data) -> new ParticleStar(world, x, y, z, motionX, motionY, motionX)); - ParticleDispatcher.getInstance().addDispatch("moonsteel$magic_smoke", (world, x, y, z, motionX, motionY, motionZ, data) -> new ParticleMagicSmoke(world, x, y, z, motionX, motionY, motionX)); + ParticleDispatcher.getInstance().addDispatch(STAR, (world, x, y, z, motionX, motionY, motionZ, data) -> new ParticleStar(world, x, y, z, motionX, motionY, motionX)); + ParticleDispatcher.getInstance().addDispatch(SMOKE, (world, x, y, z, motionX, motionY, motionZ, data) -> new ParticleMagicSmoke(world, x, y, z, motionX, motionY, motionX)); EntityPainting.addBorder(MoonSteelItems.INGOT_MOONSTEEL.getDefaultStack(), NamespaceID.fromPool(MOD_ID, "border_moonsteel")); } diff --git a/src/main/java/useless/moonsteel/MoonSteelConstants.java b/src/main/java/useless/moonsteel/MoonSteelConstants.java new file mode 100644 index 0000000..7cce5d4 --- /dev/null +++ b/src/main/java/useless/moonsteel/MoonSteelConstants.java @@ -0,0 +1,17 @@ +package useless.moonsteel; + +import net.fabricmc.loader.api.FabricLoader; +import org.slf4j.Logger; +import org.slf4j.LoggerFactory; + +import java.util.function.BooleanSupplier; + +public class MoonSteelConstants { + private MoonSteelConstants(){} + // called to be seperate from game classes to allow use in configs as well as mixin configurations + public static final String MOD_ID = "moonsteel"; + public static final BooleanSupplier BACKPACKS = () -> FabricLoader.getInstance().isModLoaded("betterwithbackpacks"); + public static final BooleanSupplier PAXEL = () -> FabricLoader.getInstance().isModLoaded("paxels"); + public static final BooleanSupplier COMMANDLY = () -> FabricLoader.getInstance().isModLoaded("commandly"); + public static final Logger LOGGER = LoggerFactory.getLogger(MOD_ID); +} diff --git a/src/main/java/useless/moonsteel/api/MoonSteelCompat.java b/src/main/java/useless/moonsteel/api/MoonSteelCompat.java index d98c071..9d41bdc 100644 --- a/src/main/java/useless/moonsteel/api/MoonSteelCompat.java +++ b/src/main/java/useless/moonsteel/api/MoonSteelCompat.java @@ -5,19 +5,17 @@ import turniplabs.halplibe.util.dependency.Key; import useless.moonsteel.MoonSteel; import useless.moonsteel.api.paxel.MoonSteelPaxel; +import useless.moonsteel.MoonSteelConstants; public class MoonSteelCompat { private MoonSteelCompat() { } public static void init() { - if(FabricLoader.getInstance().isModLoaded("commandly")){ - /* gona work on it later */ - } if(FabricLoader.getInstance().isModLoaded("aether")){ /* gona work on it later */ } - if(FabricLoader.getInstance().isModLoaded("paxels")){ + if(MoonSteelConstants.PAXEL.getAsBoolean()){ CommonEvents.AFTER_ITEM_INIT.listen(Key.of(MoonSteel.MOD_ID ,"paxels"), MoonSteelPaxel::initItem); CommonEvents.RECIPES_READY.listen(Key.of(MoonSteel.MOD_ID ,"paxels"), MoonSteelPaxel::recipeReady); } diff --git a/src/main/java/useless/moonsteel/api/MoonSteelCompatClient.java b/src/main/java/useless/moonsteel/api/MoonSteelCompatClient.java index cf5bc24..bed1ca8 100644 --- a/src/main/java/useless/moonsteel/api/MoonSteelCompatClient.java +++ b/src/main/java/useless/moonsteel/api/MoonSteelCompatClient.java @@ -2,6 +2,7 @@ import net.fabricmc.loader.api.FabricLoader; import turniplabs.halplibe.event.defs.ClientEvents; +import useless.moonsteel.MoonSteelConstants; import useless.moonsteel.api.paxel.MoonSteelPaxel; import static useless.moonsteel.MoonSteel.KEY; @@ -13,7 +14,7 @@ private MoonSteelCompatClient(){ } public static void init(){ - if(FabricLoader.getInstance().isModLoaded("paxels")){ + if(MoonSteelConstants.PAXEL.getAsBoolean()){ ClientEvents.ITEM_MODEL_RELOAD.listen(KEY, MoonSteelPaxel::initItemModels); } } diff --git a/src/main/java/useless/moonsteel/api/MoonSteelMixinPlugin.java b/src/main/java/useless/moonsteel/api/MoonSteelMixinPlugin.java index 214f263..350b1e5 100644 --- a/src/main/java/useless/moonsteel/api/MoonSteelMixinPlugin.java +++ b/src/main/java/useless/moonsteel/api/MoonSteelMixinPlugin.java @@ -1,17 +1,15 @@ package useless.moonsteel.api; -import net.fabricmc.loader.api.FabricLoader; import org.objectweb.asm.tree.ClassNode; import org.spongepowered.asm.mixin.extensibility.IMixinConfigPlugin; import org.spongepowered.asm.mixin.extensibility.IMixinInfo; +import useless.moonsteel.MoonSteelConstants; import java.util.Collections; import java.util.List; import java.util.Set; -import java.util.function.BooleanSupplier; public class MoonSteelMixinPlugin implements IMixinConfigPlugin { - private static final BooleanSupplier BACKPACKS = () -> FabricLoader.getInstance().isModLoaded("betterwithbackpacks"); @Override public void onLoad(String mixinPackage) { @@ -25,7 +23,12 @@ public String getRefMapperConfig() { @Override public boolean shouldApplyMixin(String targetClassName, String mixinClassName) { - if (mixinClassName.startsWith("useless.moonsteel.mixin.backpack")) return BACKPACKS.getAsBoolean(); + if (mixinClassName.startsWith("useless.moonsteel.mixin.backpack")) { + return MoonSteelConstants.BACKPACKS.getAsBoolean(); + } + if (mixinClassName.startsWith("useless.moonsteel.mixin.commandly")) { + return MoonSteelConstants.COMMANDLY.getAsBoolean(); + } return true; } diff --git a/src/main/java/useless/moonsteel/item/MoonSteelItems.java b/src/main/java/useless/moonsteel/item/MoonSteelItems.java index 9f284de..99b7481 100644 --- a/src/main/java/useless/moonsteel/item/MoonSteelItems.java +++ b/src/main/java/useless/moonsteel/item/MoonSteelItems.java @@ -1,7 +1,5 @@ package useless.moonsteel.item; -import net.minecraft.core.block.Blocks; -import net.minecraft.core.entity.animal.MobWolf; import net.minecraft.core.enums.HumanArmorShape; import net.minecraft.core.enums.WolfArmorShape; import net.minecraft.core.item.*; @@ -13,13 +11,13 @@ import net.minecraft.core.item.tool.ItemToolPickaxe; import net.minecraft.core.item.tool.ItemToolShovel; import net.minecraft.core.item.tool.ItemToolSword; -import org.jetbrains.annotations.NotNull; import turniplabs.halplibe.helper.ArmorHelper; import turniplabs.halplibe.helper.ItemBuilder; import useless.moonsteel.MoonSteel; import useless.moonsteel.api.backpack.BackpackProxy; import useless.moonsteel.block.MoonSteelBlocks; import useless.moonsteel.item.connectstar.ItemConnectedStar; +import useless.moonsteel.MoonSteelConstants; import static useless.moonsteel.MoonSteel.MOD_ID; @@ -99,8 +97,9 @@ public static void init() { } private static void initBackpack() { - MoonSteel.LOGGER.info("Backpacks present: {}", MoonSteel.backpackPresent); - if (MoonSteel.backpackPresent){ + boolean backPackIncluded = MoonSteelConstants.BACKPACKS.getAsBoolean(); + MoonSteelConstants.LOGGER.info("Backpacks present: {}", backPackIncluded); + if (backPackIncluded){ BACKPACK_COSMIC = new ItemBuilder(MOD_ID) .setStackSize(1) .build( BackpackProxy.proxyBackpack("backpack.cosmic", MOD_ID + ":item/backpack_cosmic", MoonSteel.itemId++)); diff --git a/src/main/java/useless/moonsteel/mixin/commandly/VeinMinerMixin.java b/src/main/java/useless/moonsteel/mixin/commandly/VeinMinerMixin.java new file mode 100644 index 0000000..689ccf4 --- /dev/null +++ b/src/main/java/useless/moonsteel/mixin/commandly/VeinMinerMixin.java @@ -0,0 +1,76 @@ +package useless.moonsteel.mixin.commandly; + +import com.llamalad7.mixinextras.injector.wrapoperation.Operation; +import com.llamalad7.mixinextras.injector.wrapoperation.WrapOperation; +import net.minecraft.core.block.Block; +import net.minecraft.core.block.entity.TileEntity; +import net.minecraft.core.entity.player.Player; +import net.minecraft.core.enums.EnumDropCause; +import net.minecraft.core.item.ItemStack; +import net.minecraft.core.item.tool.ItemTool; +import net.minecraft.core.world.World; +import net.minecraft.core.world.pos.TilePosc; +import org.jetbrains.annotations.NotNull; +import org.spongepowered.asm.mixin.Mixin; +import org.spongepowered.asm.mixin.injection.At; +import redart15.commandly.veincapitator.VeinMining; +import useless.moonsteel.MoonSteel; +import useless.moonsteel.block.MoonSteelBlocks; +import useless.moonsteel.item.MoonSteelItems; + +import java.util.ArrayList; +import java.util.Arrays; +import java.util.List; + +@Mixin(VeinMining.class) +public abstract class VeinMinerMixin { + + @WrapOperation(method = "breakBlock", at = @At(value = "INVOKE", target = "Lredart15/commandly/veincapitator/VeinMining;getBreakResult(Lnet/minecraft/core/block/Block;Lnet/minecraft/core/world/World;Lnet/minecraft/core/enums/EnumDropCause;Lnet/minecraft/core/world/pos/TilePosc;ILnet/minecraft/core/block/entity/TileEntity;)[Lnet/minecraft/core/item/ItemStack;")) + private ItemStack[] withItemClumping( + VeinMining veinmining, + @NotNull Block block, + World world, + EnumDropCause dropCause, + TilePosc tilePos, int meta, + TileEntity tileEntity, Operation original + ) { + ItemStack heldItemStack = ((VeinMiningAccessor) veinmining).getTool(); + ItemStack[] result = original.call(veinmining, block, world, dropCause, tilePos, meta, tileEntity); + if (heldItemStack != null + && heldItemStack.getItem() instanceof ItemTool itemTool + && itemTool.getMaterial() == MoonSteelItems.MOON_STEEL_TOOL + && MoonSteelBlocks.canBeFortuned(block) + ) { + List drops = new ArrayList<>(Arrays.asList(result)); + for (int i = 0; i < world.rand.nextInt(MoonSteel.FORTUNE_AMOUNT); i++) { + drops.addAll(Arrays.asList(original.call(veinmining, block, world, dropCause, tilePos, meta, tileEntity))); + } + return drops.toArray(ItemStack[]::new); + } + return result; + } + + + + @WrapOperation(method = "breakBlock", at = @At(value = "INVOKE", target = "Lnet/minecraft/core/block/Block;dropWithCause(Lnet/minecraft/core/world/World;Lnet/minecraft/core/enums/EnumDropCause;Lnet/minecraft/core/world/pos/TilePosc;ILnet/minecraft/core/block/entity/TileEntity;Lnet/minecraft/core/entity/player/Player;)V")) + private void withOutItemClumping( + Block block, + World world, + EnumDropCause dropCause, + TilePosc tilePos, int data, + TileEntity tileEntity, + Player player, Operation original + ){ + original.call(block, world, dropCause, tilePos, data, tileEntity, player); + ItemStack heldItemStack = ((VeinMiningAccessor)this).getTool(); + if (heldItemStack != null + && heldItemStack.getItem() instanceof ItemTool itemTool + && itemTool.getMaterial() == MoonSteelItems.MOON_STEEL_TOOL + && MoonSteelBlocks.canBeFortuned(block) + ) { + for (int i = 0; i < world.rand.nextInt(MoonSteel.FORTUNE_AMOUNT); i++) { + block.dropWithCause(world, EnumDropCause.PROPER_TOOL, tilePos, data, tileEntity, player); + } + } + } +} diff --git a/src/main/java/useless/moonsteel/mixin/commandly/VeinMiningAccessor.java b/src/main/java/useless/moonsteel/mixin/commandly/VeinMiningAccessor.java new file mode 100644 index 0000000..838b2e6 --- /dev/null +++ b/src/main/java/useless/moonsteel/mixin/commandly/VeinMiningAccessor.java @@ -0,0 +1,12 @@ +package useless.moonsteel.mixin.commandly; + +import net.minecraft.core.item.ItemStack; +import org.spongepowered.asm.mixin.Mixin; +import org.spongepowered.asm.mixin.gen.Accessor; +import redart15.commandly.veincapitator.VeinMining; + +@Mixin(VeinMining.class) +public interface VeinMiningAccessor { + @Accessor + ItemStack getTool(); +} diff --git a/src/main/java/useless/moonsteel/mixin/fortune/BlockLogicMixin.java b/src/main/java/useless/moonsteel/mixin/fortune/BlockLogicMixin.java index 9068e2c..53cd5e7 100644 --- a/src/main/java/useless/moonsteel/mixin/fortune/BlockLogicMixin.java +++ b/src/main/java/useless/moonsteel/mixin/fortune/BlockLogicMixin.java @@ -1,8 +1,5 @@ package useless.moonsteel.mixin.fortune; -import com.llamalad7.mixinextras.injector.wrapmethod.WrapMethod; -import com.llamalad7.mixinextras.injector.wrapoperation.Operation; -import com.llamalad7.mixinextras.sugar.Local; import com.llamalad7.mixinextras.sugar.Share; import com.llamalad7.mixinextras.sugar.ref.LocalRef; import net.minecraft.core.block.Block; @@ -25,10 +22,6 @@ import useless.moonsteel.block.MoonSteelBlocks; import useless.moonsteel.item.MoonSteelItems; -import java.util.ArrayList; -import java.util.Arrays; -import java.util.List; - @Mixin(value = BlockLogic.class, remap = false) public abstract class BlockLogicMixin { diff --git a/src/main/java/useless/moonsteel/recipe/MoonSteelRecipes.java b/src/main/java/useless/moonsteel/recipe/MoonSteelRecipes.java index c4397a9..540b601 100644 --- a/src/main/java/useless/moonsteel/recipe/MoonSteelRecipes.java +++ b/src/main/java/useless/moonsteel/recipe/MoonSteelRecipes.java @@ -8,7 +8,7 @@ import net.minecraft.core.util.helper.DyeColor; import tosutosu.betterwithbackpacks.ModItems; import turniplabs.halplibe.helper.RecipeBuilder; -import useless.moonsteel.MoonSteel; +import useless.moonsteel.MoonSteelConstants; import useless.moonsteel.block.MoonSteelBlocks; import useless.moonsteel.item.MoonSteelItems; @@ -116,6 +116,11 @@ public static void onRecipesReady() { .addInput('M', MoonSteelItems.INGOT_MOONSTEEL) .create("block_of_moonsteel", MoonSteelBlocks.BLOCK_MOONSTEEL.getDefaultStack()); + RecipeBuilder.Shaped(MOD_ID) + .setShape("M") + .addInput('M', MoonSteelBlocks.BLOCK_MOONSTEEL) + .create("block_to_moonsteel", new ItemStack(MoonSteelItems.INGOT_MOONSTEEL, 9)); + RecipeBuilder.Shaped(MOD_ID) .setShape( "F", @@ -144,7 +149,7 @@ public static void onRecipesReady() { .addInput('C', MoonSteelItems.STAR_CONNECTED) .create("stellar_rewinder", MoonSteelBlocks.STELLAR_REWINDER.getDefaultStack()); - if (MoonSteel.backpackPresent){ + if (MoonSteelConstants.BACKPACKS.getAsBoolean()){ RecipeBuilder.Shaped(MOD_ID) .setShape( "MMM", @@ -178,11 +183,26 @@ public static void onRecipesReady() { .addInput('J', Items.JAR) .create("jar_star", new ItemStack(MoonSteelItems.STAR_JAR)); - RecipeBuilder.Shaped(MOD_ID) .setShape(" MM", "MMM", "M M") .addInput('M', MoonSteelItems.INGOT_MOONSTEEL) .create("moonstee_wolf_armor", new ItemStack(MoonSteelItems.ARMOR_WOLF_MOONSTEEL)); + + RecipeBuilder.Shaped(MOD_ID) + .setShape("MM", "MM") + .addInput('M', MoonSteelBlocks.BLOCK_MOONSTEEL) + .create("moonsteel_bricks", new ItemStack(MoonSteelBlocks.MOONSTEEL_BRICKS, 4)); + + RecipeBuilder.Shaped(MOD_ID) + .setShape("M", "MM", "MMM") + .addInput('M', MoonSteelBlocks.MOONSTEEL_BRICKS) + .create("moonsteel_bricks_stairs", new ItemStack(MoonSteelBlocks.STAIR_MOONSTEEL_BRICKS)); + + + RecipeBuilder.Shaped(MOD_ID) + .setShape("MMM") + .addInput('M', MoonSteelBlocks.MOONSTEEL_BRICKS) + .create("moonsteel_bricks_slab", new ItemStack(MoonSteelBlocks.SLAB_MOONSTEEL_BRICK)); } public static void initNamespaces() { diff --git a/src/main/resources/assets/moonsteel/lang/ru_RU/ru_RU.lang b/src/main/resources/assets/moonsteel/lang/ru_RU/ru_RU.lang index 799ed5e..89979d9 100644 --- a/src/main/resources/assets/moonsteel/lang/ru_RU/ru_RU.lang +++ b/src/main/resources/assets/moonsteel/lang/ru_RU/ru_RU.lang @@ -37,11 +37,12 @@ tile.moonsteel.stellar.rewinder.name=Звездная перемотка tile.moonsteel.stellar.rewinder.desc=Якорь для соединенный звезды, на которую можно ссылаться. moonsteel.teleport.fail.missing=Якорь был сломан, невозможно вернутса! +moonsteel.teleport.fail.score=Not enough score to establish link. moonsteel.teleport.fail.dimension=Якорь в другом измерение! moonsteel.container.backpack.star.name=Звезвдный Рюкзак -tile.moonsteel.star.lamp.name=Звёздная лампа -tile.moonsteel.star.lamp.desc=Новая блестящая лампа. +subtitles.moonsteel.starspawn=Звездопад +subtitles.moonsteel.click.rewinder=Звёздный линк score.command.not.applicable= Команда не применима к этой сущности. score.command.cannot= Неверная цель. @@ -52,3 +53,19 @@ score.command.set= Счёт игрока %1$s установлен на %2$d. #paxel item.moonsteel.tool.paxel.moonsteel.name=Лунсталный паксель + +tile.moonsteel.star.lamp.name=Звёздный лампа +tile.moonsteel.star.lamp.desc=Новая сверкающая лампа. +item.moonsteel.jar.star.name=Звёздный фонарь +item.moonsteel.jar.star.desc=Звезда в банке. +tile.moonsteel.jar.star.name=Jar Star +tile.moonsteel.jar.star.desc=Как вы этого добились? +item.moonsteel.armor.wolf.moonsteel.name=Лунстальная волчья броня +item.moonsteel.armor.wolf.moonsteel.desc=Пусть ваш лучший друг будет космическим! + +tile.moonsteel.brick.moonsteel.name=Лунстальные кирпичи +tile.moonsteel.brick.moonsteel.desc=Сложенные кирпичи из лунстали. +tile.moonsteel.slab.brick.moonsteel.name=Плита лунстальных кирпичей +tile.moonsteel.slab.brick.moonsteel.desc=Плита из лунстальных кирпичей. +tile.moonsteel.stair.brick.moonsteel.name=Ступени из лунстальных кирпичей +tile.moonsteel.stair.brick.moonsteel.desc=Блок лунстальных кирпичей для вертикального подъёма. diff --git a/src/main/resources/assets/moonsteel/oldTex/old_moonsteel_crude.png b/src/main/resources/assets/moonsteel/oldTex/old_moonsteel_crude.png new file mode 100644 index 0000000000000000000000000000000000000000..cb21d4c2696847c8f9c7dc922ac0b3bf26d94902 GIT binary patch literal 854 zcmV-c1F8IpP)EX>4Tx04R}tkv&MmP!xqvQ>7x64y_>KkfA!+MMWG-6^me@v=v%)FnQ@8G-*gu zTpR`0f`dPcRRe3JS* zOq3~m-Q(Q@y>t7wr!&7FPU>=)LA~@s00006VoOIv0Gj}%0N&wE%_aZ<010qNS#tmY zE+YT{E+YYWr9XB6000McNliru=mHiB1p=p^c+&s?02y>eSad^gZEa<4bO1wgWnpw> zWFU8GbZ8()Nlj2!fese{00AyZL_t(I%e|AaO2a?^hQBnuUWB5HN~4~36>K3iWOH%! z0SYeNd;s6b**EYF94bL{a1lxase)Uxlp~FcS8^t$AmYCq+}-!zfB$jtALeiZ@K!A(O8#7frKi)YT4Ss^zJR_Nm=|`iANwW^@MtdV$z;r)-@}uVqm$4w zX_VpU{CWi&rPCPI4Uw%D=``lxI6w%oI?OS!uL1y6Hzb|LppjG8fv*BoH?%-s1$@50ptZJ4tOVsvMnVX7J7>5J zmwcI5Oso#{B16cwHF{e+w6{9|yuIF65;RNqD!!ixO0ZEKT-$-Kf>rYXAL-ND0xJgV gx~Kzx{dxXeU$tqa^=vy&bpQYW07*qoM6N<$f~>Y`@&Et; literal 0 HcmV?d00001 diff --git a/src/main/resources/assets/moonsteel/textures/item/moonsteel_crude.png b/src/main/resources/assets/moonsteel/textures/item/moonsteel_crude.png index cb21d4c2696847c8f9c7dc922ac0b3bf26d94902..c15b1df2a0508214ff6d26992b563310f7a019b7 100644 GIT binary patch delta 322 zcmV-I0log#2HXOWBYyw^b5ch_0Itp)=>Px$7D+@wR5*>*k+Dj{KmdlnlZs1=C<>+! zhz^B<5uy&d`2byXD2VUid$>6G5<(Xjp)b)=H3lJri-ih}9hww+$q=VI(j;O>{o&y5 zlJC3!IQaJw%l>$Ha+LxkNrKz&Xs)sh1kiLY0T_>5fK*8ef`2TuwX;vtJ_8^Kz5v)Z zZ1p*H`yElq!|NLs2gfbFr@(BKM9#ys&|r0~%1iH&x^-H5t+&Db!dhf&@0uU&-N3M;y{f5$W$0?^ny zXY?^33Ma&JMmx2(sYgBnz&>iHs6x&O@aFC6V*+SLko$8|5Z? U3Z9CHX8-^I07*qoM6N<$f^8+0y8r+H delta 832 zcmV-G1Hb&-0@enQBYy#eX+uL$Nkc;*aB^>EX>4Tx04R}tkv&MmP!xqvQ>7x64y_>K zkfA!+MMWG-6^me@v=v%)FnQ@8G-*guTpR`0f`dPcRR|zd{^>t5u zRCh6+<=yvZ4Jk#F0X~s9&UC{f-XNacv~;xC;s~)=?qRuyS;bI^XNaSUs!_g>cUj@Q#aXR2Sm&Png~6h>lI1$BF(k2s6w(kO zqk$@Fun?nNBY(w2hRzcn{!z!DCYMaEDi}EyP=^Z1@q_=t@7bEA=_xlUm;m};Z2Myz z2T;Mtz4Sr= z000JJOGiWin*gN%-r-HnCIA2c32;bRa{vG?BLDy{BLR4&KXw2B00(qQO+^Rj0u~Ad z0;ivN(*OVf8FWQhbVF}#ZDnqB07G(RVRU6=Aa`kWXdp*PO;A^X4i^9b0WL{IK~y-) zy_2y@!+$^khQBnuUWB5HN~4~36>K3iWOH%!0SYeNd;s6b**EYF94bL{a1lxase)Ux zlp~FcS8^t$AmYCq+}-!zfB$jtALeiZ@K!A(O8#7frKi)YT4Ss^zJR_Nm z=|`iANwW^@MtdV$z;r)-@}uVqm$4wX@8XA==^#G8>Q12)eVuY7U?wR;5a}C zu{z8#u&)9DR5v7@#^lQ!0Jq@+uz%QRmc-1G7yy&NDJKv@a2j0UNomE7A8yfFTcD9s z*MYABR5!FhUj=-=zo50YOsoXuO-4cpb~|Ud4VQeGS4^x9^ddvZwl#WNJG8eu0KC24 zS2+?iOZO_ip9o5@Q5{^{fv|)7k Date: Mon, 21 Sep 2026 19:50:43 +0200 Subject: [PATCH 12/13] recipe adjustments, creative inventory fixing --- src/main/java/useless/moonsteel/MoonSteel.java | 2 +- .../java/useless/moonsteel/recipe/MoonSteelRecipes.java | 6 +++--- 2 files changed, 4 insertions(+), 4 deletions(-) diff --git a/src/main/java/useless/moonsteel/MoonSteel.java b/src/main/java/useless/moonsteel/MoonSteel.java index 0559e0c..fc06e85 100644 --- a/src/main/java/useless/moonsteel/MoonSteel.java +++ b/src/main/java/useless/moonsteel/MoonSteel.java @@ -87,7 +87,7 @@ public void beforeGameStart() { CreativeInventoryRegistry.INSTANCE.register(TORCH_STAR, place(() -> Blocks.TORCH_COAL)); CreativeInventoryRegistry.INSTANCE.register(STELLAR_REWINDER, place()); CreativeInventoryRegistry.INSTANCE.register(STAR_LAMP, place(() -> Blocks.TORCH_COAL)); - CreativeInventoryRegistry.INSTANCE.register(STAR_JAR, place(() -> Blocks.LANTERN_FIREFLY_RED)); + CreativeInventoryRegistry.INSTANCE.register(STAR_JAR, place(() -> Items.LANTERN_FIREFLY_RED)); CreativeInventoryRegistry.INSTANCE.register(MOONSTEEL_BRICKS, place(() -> Blocks.SLAB_BRICK_RUBYGLASS)); CreativeInventoryRegistry.INSTANCE.register(SLAB_MOONSTEEL_BRICK, place(() -> Blocks.SLAB_BRICK_RUBYGLASS)); CreativeInventoryRegistry.INSTANCE.register(STAIR_MOONSTEEL_BRICKS, place(() -> Blocks.SLAB_BRICK_RUBYGLASS)); diff --git a/src/main/java/useless/moonsteel/recipe/MoonSteelRecipes.java b/src/main/java/useless/moonsteel/recipe/MoonSteelRecipes.java index 540b601..b4f1ed5 100644 --- a/src/main/java/useless/moonsteel/recipe/MoonSteelRecipes.java +++ b/src/main/java/useless/moonsteel/recipe/MoonSteelRecipes.java @@ -190,19 +190,19 @@ public static void onRecipesReady() { RecipeBuilder.Shaped(MOD_ID) .setShape("MM", "MM") - .addInput('M', MoonSteelBlocks.BLOCK_MOONSTEEL) + .addInput('M', MoonSteelItems.INGOT_MOONSTEEL_CRUDE) .create("moonsteel_bricks", new ItemStack(MoonSteelBlocks.MOONSTEEL_BRICKS, 4)); RecipeBuilder.Shaped(MOD_ID) .setShape("M", "MM", "MMM") .addInput('M', MoonSteelBlocks.MOONSTEEL_BRICKS) - .create("moonsteel_bricks_stairs", new ItemStack(MoonSteelBlocks.STAIR_MOONSTEEL_BRICKS)); + .create("moonsteel_bricks_stairs", new ItemStack(MoonSteelBlocks.STAIR_MOONSTEEL_BRICKS, 6)); RecipeBuilder.Shaped(MOD_ID) .setShape("MMM") .addInput('M', MoonSteelBlocks.MOONSTEEL_BRICKS) - .create("moonsteel_bricks_slab", new ItemStack(MoonSteelBlocks.SLAB_MOONSTEEL_BRICK)); + .create("moonsteel_bricks_slab", new ItemStack(MoonSteelBlocks.SLAB_MOONSTEEL_BRICK, 6)); } public static void initNamespaces() { From 9973717c86305e85c5d5b8d9cee0b545b8ba10d9 Mon Sep 17 00:00:00 2001 From: Redart15 Date: Mon, 21 Sep 2026 19:52:41 +0200 Subject: [PATCH 13/13] version bump --- gradle.properties | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/gradle.properties b/gradle.properties index aad43a4..09abd50 100644 --- a/gradle.properties +++ b/gradle.properties @@ -8,7 +8,7 @@ org.gradle.warning.mode = all org.gradle.configuration-cache = false ########################################################################## # Mod Properties -mod_version=1.1.1 +mod_version=1.1.2 mod_group=useless mod_name=moonsteel ##########################################################################