diff --git a/projects/common-api/src/client/java/dan200/computercraft/api/client/turtle/TurtleUpgradeModeller.java b/projects/common-api/src/client/java/dan200/computercraft/api/client/turtle/TurtleUpgradeModeller.java index ebeb997e5..c382c4073 100644 --- a/projects/common-api/src/client/java/dan200/computercraft/api/client/turtle/TurtleUpgradeModeller.java +++ b/projects/common-api/src/client/java/dan200/computercraft/api/client/turtle/TurtleUpgradeModeller.java @@ -10,8 +10,8 @@ import dan200.computercraft.api.turtle.ITurtleAccess; import dan200.computercraft.api.turtle.ITurtleUpgrade; import dan200.computercraft.api.turtle.TurtleSide; import dan200.computercraft.api.turtle.TurtleUpgradeSerialiser; -import dan200.computercraft.api.upgrades.UpgradeData; import net.minecraft.client.resources.model.ModelResourceLocation; +import net.minecraft.nbt.CompoundTag; import net.minecraft.resources.ResourceLocation; import javax.annotation.Nonnull; @@ -43,12 +43,13 @@ public interface TurtleUpgradeModeller { * Used when turtle access object doesn't exist. For compatibility reasons, by default this method call getModel * that depend on turtle. * + * @param upgrade The upgrade that you're getting the model for. * @param data Upgrade data instance for current turtle side * @param side Which side of the turtle (left or right) the upgrade resides on. * @return The model that you wish to be used to render your upgrade. */ - default TransformedModel getModel(@Nonnull UpgradeData data, TurtleSide side) { - return getModel(data.upgrade(), null, side); + default TransformedModel getModel(@Nonnull T upgrade, @Nonnull CompoundTag data, TurtleSide side) { + return getModel(upgrade, (ITurtleAccess) null, side); } /** diff --git a/projects/common/src/client/java/dan200/computercraft/client/model/turtle/TurtleModelParts.java b/projects/common/src/client/java/dan200/computercraft/client/model/turtle/TurtleModelParts.java index 73c69caaf..434de2ac1 100644 --- a/projects/common/src/client/java/dan200/computercraft/client/model/turtle/TurtleModelParts.java +++ b/projects/common/src/client/java/dan200/computercraft/client/model/turtle/TurtleModelParts.java @@ -99,11 +99,11 @@ public final class TurtleModelParts { parts.add(transform(ClientPlatformHelper.get().getModel(modelManager, overlayModelLocation), transformation)); } if (combo.leftUpgrade() != null) { - var model = TurtleUpgradeModellers.getModel(combo.leftUpgrade(), TurtleSide.LEFT); + var model = TurtleUpgradeModellers.getModel(combo.leftUpgrade().upgrade(), combo.leftUpgrade().data(), TurtleSide.LEFT); parts.add(transform(model.getModel(), transformation.compose(model.getMatrix()))); } if (combo.rightUpgrade() != null) { - var model = TurtleUpgradeModellers.getModel(combo.rightUpgrade(), TurtleSide.RIGHT); + var model = TurtleUpgradeModellers.getModel(combo.rightUpgrade().upgrade(), combo.rightUpgrade().data(), TurtleSide.RIGHT); parts.add(transform(model.getModel(), transformation.compose(model.getMatrix()))); } diff --git a/projects/common/src/client/java/dan200/computercraft/client/turtle/TurtleUpgradeModellers.java b/projects/common/src/client/java/dan200/computercraft/client/turtle/TurtleUpgradeModellers.java index d8e4de22e..02257f6bd 100644 --- a/projects/common/src/client/java/dan200/computercraft/client/turtle/TurtleUpgradeModellers.java +++ b/projects/common/src/client/java/dan200/computercraft/client/turtle/TurtleUpgradeModellers.java @@ -15,6 +15,7 @@ import dan200.computercraft.api.upgrades.UpgradeData; import dan200.computercraft.impl.TurtleUpgrades; import dan200.computercraft.impl.UpgradeManager; import net.minecraft.client.Minecraft; +import net.minecraft.nbt.CompoundTag; import javax.annotation.Nonnull; import java.util.Map; @@ -59,10 +60,10 @@ public final class TurtleUpgradeModellers { return modeller.getModel(upgrade, access, side); } - public static TransformedModel getModel(@Nonnull UpgradeData data, TurtleSide side) { + public static TransformedModel getModel(@Nonnull ITurtleUpgrade upgrade, @Nonnull CompoundTag data, TurtleSide side) { @SuppressWarnings("unchecked") - var modeller = (TurtleUpgradeModeller) modelCache.computeIfAbsent(data.upgrade(), TurtleUpgradeModellers::getModeller); - return modeller.getModel(data, side); + var modeller = (TurtleUpgradeModeller) modelCache.computeIfAbsent(upgrade, TurtleUpgradeModellers::getModeller); + return modeller.getModel(upgrade, data, side); } private static TurtleUpgradeModeller getModeller(ITurtleUpgrade upgradeA) { diff --git a/projects/common/src/main/java/dan200/computercraft/shared/pocket/apis/PocketAPI.java b/projects/common/src/main/java/dan200/computercraft/shared/pocket/apis/PocketAPI.java index 3d6a8d6ad..9caae073c 100644 --- a/projects/common/src/main/java/dan200/computercraft/shared/pocket/apis/PocketAPI.java +++ b/projects/common/src/main/java/dan200/computercraft/shared/pocket/apis/PocketAPI.java @@ -62,13 +62,10 @@ public class PocketAPI implements ILuaAPI { // Attempt to find the upgrade, starting in the main segment, and then looking in the opposite // one. We start from the position the item is currently in and loop round to the start. - var newUpgradeItem = findUpgrade(inventory.items, inventory.selected, previousUpgrade); - if (newUpgradeItem == null) { - newUpgradeItem = findUpgrade(inventory.offhand, 0, previousUpgrade); + var newUpgrade = findUpgrade(inventory.items, inventory.selected, previousUpgrade); + if (newUpgrade == null) { + newUpgrade = findUpgrade(inventory.offhand, 0, previousUpgrade); } - if (newUpgradeItem == null) return new Object[]{ false, "Cannot find a valid upgrade" }; - // Unpack new upgrade here and ensure some mystical error is not happened - var newUpgrade = PocketUpgrades.instance().get(newUpgradeItem); if (newUpgrade == null) return new Object[]{ false, "Cannot find a valid upgrade" }; // Remove the current upgrade @@ -109,7 +106,7 @@ public class PocketAPI implements ILuaAPI { } } - private static @Nullable ItemStack findUpgrade(NonNullList inv, int start, @Nullable UpgradeData previous) { + private static @Nullable UpgradeData findUpgrade(NonNullList inv, int start, @Nullable UpgradeData previous) { for (var i = 0; i < inv.size(); i++) { var invStack = inv.get((i + start) % inv.size()); if (!invStack.isEmpty()) { @@ -121,7 +118,7 @@ public class PocketAPI implements ILuaAPI { invStack.shrink(1); inv.set((i + start) % inv.size(), invStack.isEmpty() ? ItemStack.EMPTY : invStack); - return invStack.copyWithCount(1); + return newUpgrade; } } } diff --git a/projects/forge/src/testMod/java/dan200/computercraft/gametest/core/TestMod.java b/projects/forge/src/testMod/java/dan200/computercraft/gametest/core/TestMod.java index ad295ffd1..7eafb2b85 100644 --- a/projects/forge/src/testMod/java/dan200/computercraft/gametest/core/TestMod.java +++ b/projects/forge/src/testMod/java/dan200/computercraft/gametest/core/TestMod.java @@ -4,7 +4,12 @@ package dan200.computercraft.gametest.core; +import dan200.computercraft.api.client.ComputerCraftAPIClient; +import dan200.computercraft.api.client.turtle.TurtleUpgradeModeller; +import dan200.computercraft.api.turtle.TurtleUpgradeSerialiser; import dan200.computercraft.export.Exporter; +import dan200.computercraft.testmod.EnchantableTurtleTool; +import dan200.computercraft.testmod.ModEntrypoint; import net.minecraftforge.api.distmarker.Dist; import net.minecraftforge.client.event.RegisterClientCommandsEvent; import net.minecraftforge.client.event.ScreenEvent; @@ -16,10 +21,25 @@ import net.minecraftforge.event.server.ServerStartedEvent; import net.minecraftforge.eventbus.api.EventPriority; import net.minecraftforge.fml.DistExecutor; import net.minecraftforge.fml.common.Mod; +import net.minecraftforge.fml.event.lifecycle.FMLClientSetupEvent; +import net.minecraftforge.fml.event.lifecycle.FMLCommonSetupEvent; import net.minecraftforge.fml.javafmlmod.FMLJavaModLoadingContext; +import net.minecraftforge.registries.DeferredRegister; +import net.minecraftforge.registries.RegistryObject; + +import java.util.function.Supplier; @Mod("cctest") public class TestMod { + public static DeferredRegister> turtleRegistry = DeferredRegister.create( + TurtleUpgradeSerialiser.registryId(), + "cctest" + ); + public static Supplier> ENCHANTED_TOOL = turtleRegistry.register( + ModEntrypoint.ENCHANTABLE_TOOL, + ModEntrypoint.buildEnchantableTurtleTool() + ); + public TestMod() { TestHooks.init(); @@ -30,6 +50,7 @@ public class TestMod { var modBus = FMLJavaModLoadingContext.get().getModEventBus(); modBus.addListener((RegisterGameTestsEvent event) -> TestHooks.loadTests(event::register)); + turtleRegistry.register(modBus); } private static void onInitializeClient() { @@ -42,5 +63,12 @@ public class TestMod { if (ClientTestHooks.onOpenScreen(e.getScreen())) e.setCanceled(true); }); bus.addListener((RegisterClientCommandsEvent e) -> Exporter.register(e.getDispatcher())); + + var modBus = FMLJavaModLoadingContext.get().getModEventBus(); + modBus.addListener((FMLClientSetupEvent e) -> { + for (int i = 0; i < 100; i++) + System.out.println("JGHASVDFHGVSDFSDFSDF"); + ComputerCraftAPIClient.registerTurtleUpgradeModeller(ENCHANTED_TOOL.get(), TurtleUpgradeModeller.flatItem()); + }); } }