mirror of
https://github.com/SquidDev-CC/CC-Tweaked
synced 2025-10-25 02:47:39 +00:00
Automatically generate impostor recipes
Previously we would register the recipes within our code, but the advancements were written manually. This now generates JSON files for both the advancement and recipe. While this does mean we're shipping even more JSON, we'll need to do this for 1.13 anyway, and means our advancements are guaranteed to be consistent. On a side note, a couple of other changes: - Turtle upgrades are now mounted on the right in the creative menu/fake recipes. This means the upgrade is now clearly visible in the inventory. - We no longer generate legacy turtle items at all: we'll always construct turtle_expanded. - Several peripheral items are no longer registered as having sub-types (namely advanced and full-block modems). - We only have one disk advancement now, which unlocks all 16 recipes. - We have removed the disk conversion recipes - these can be exposed through JEI if needed.
This commit is contained in:
@@ -39,6 +39,9 @@ public final class PocketUpgrades
|
||||
|
||||
public static IPocketUpgrade get( String id )
|
||||
{
|
||||
// Fix a typo in the advanced modem upgrade's name. I'm sorry, I realise this is horrible.
|
||||
if( id.equals( "computercraft:advanved_modem" ) ) id = "computercraft:advanced_modem";
|
||||
|
||||
return upgrades.get( id );
|
||||
}
|
||||
|
||||
|
||||
@@ -8,13 +8,10 @@ package dan200.computercraft.shared;
|
||||
|
||||
import dan200.computercraft.ComputerCraft;
|
||||
import dan200.computercraft.api.ComputerCraftAPI;
|
||||
import dan200.computercraft.api.pocket.IPocketUpgrade;
|
||||
import dan200.computercraft.api.turtle.ITurtleUpgrade;
|
||||
import dan200.computercraft.shared.computer.blocks.BlockCommandComputer;
|
||||
import dan200.computercraft.shared.computer.blocks.BlockComputer;
|
||||
import dan200.computercraft.shared.computer.blocks.TileCommandComputer;
|
||||
import dan200.computercraft.shared.computer.blocks.TileComputer;
|
||||
import dan200.computercraft.shared.computer.core.ComputerFamily;
|
||||
import dan200.computercraft.shared.computer.items.ItemCommandComputer;
|
||||
import dan200.computercraft.shared.computer.items.ItemComputer;
|
||||
import dan200.computercraft.shared.media.items.ItemDiskExpanded;
|
||||
@@ -33,7 +30,6 @@ import dan200.computercraft.shared.peripheral.monitor.TileMonitor;
|
||||
import dan200.computercraft.shared.peripheral.printer.TilePrinter;
|
||||
import dan200.computercraft.shared.peripheral.speaker.TileSpeaker;
|
||||
import dan200.computercraft.shared.pocket.items.ItemPocketComputer;
|
||||
import dan200.computercraft.shared.pocket.items.PocketComputerItemFactory;
|
||||
import dan200.computercraft.shared.pocket.peripherals.PocketModem;
|
||||
import dan200.computercraft.shared.pocket.peripherals.PocketSpeaker;
|
||||
import dan200.computercraft.shared.turtle.blocks.BlockTurtle;
|
||||
@@ -43,19 +39,11 @@ import dan200.computercraft.shared.turtle.blocks.TileTurtleExpanded;
|
||||
import dan200.computercraft.shared.turtle.items.ItemTurtleAdvanced;
|
||||
import dan200.computercraft.shared.turtle.items.ItemTurtleLegacy;
|
||||
import dan200.computercraft.shared.turtle.items.ItemTurtleNormal;
|
||||
import dan200.computercraft.shared.turtle.items.TurtleItemFactory;
|
||||
import dan200.computercraft.shared.turtle.upgrades.*;
|
||||
import dan200.computercraft.shared.util.Colour;
|
||||
import dan200.computercraft.shared.util.ImpostorRecipe;
|
||||
import dan200.computercraft.shared.util.ImpostorShapelessRecipe;
|
||||
import net.minecraft.block.Block;
|
||||
import net.minecraft.init.Items;
|
||||
import net.minecraft.item.Item;
|
||||
import net.minecraft.item.ItemBlock;
|
||||
import net.minecraft.item.ItemStack;
|
||||
import net.minecraft.item.crafting.IRecipe;
|
||||
import net.minecraft.item.crafting.Ingredient;
|
||||
import net.minecraft.util.NonNullList;
|
||||
import net.minecraft.util.ResourceLocation;
|
||||
import net.minecraftforge.event.RegistryEvent;
|
||||
import net.minecraftforge.fml.common.Mod;
|
||||
@@ -203,98 +191,7 @@ public final class Registry
|
||||
registerLegacyUpgrades();
|
||||
}
|
||||
|
||||
@SubscribeEvent
|
||||
public static void registerRecipes( RegistryEvent.Register<IRecipe> event )
|
||||
{
|
||||
IForgeRegistry<IRecipe> registry = event.getRegistry();
|
||||
|
||||
// Register fake recipes for the recipe book and JEI. We have several dynamic recipes,
|
||||
// and we'd like people to be able to see them.
|
||||
|
||||
// Turtle upgrades
|
||||
// TODO: Figure out a way to do this in a "nice" way.
|
||||
for( ITurtleUpgrade upgrade : TurtleUpgrades.getVanillaUpgrades() )
|
||||
{
|
||||
ItemStack craftingItem = upgrade.getCraftingItem();
|
||||
|
||||
// A turtle just containing this upgrade
|
||||
for( ComputerFamily family : ComputerFamily.values() )
|
||||
{
|
||||
if( !TurtleUpgrades.suitableForFamily( family, upgrade ) ) continue;
|
||||
|
||||
ItemStack baseTurtle = TurtleItemFactory.create( -1, null, -1, family, null, null, 0, null );
|
||||
if( !baseTurtle.isEmpty() )
|
||||
{
|
||||
ItemStack craftedTurtle = TurtleItemFactory.create( -1, null, -1, family, upgrade, null, 0, null );
|
||||
ItemStack craftedTurtleFlipped = TurtleItemFactory.create( -1, null, -1, family, null, upgrade, 0, null );
|
||||
registry.register(
|
||||
new ImpostorRecipe( "computercraft:" + family.toString() + "_turtle_upgrade", 2, 1, new ItemStack[] { baseTurtle, craftingItem }, craftedTurtle )
|
||||
.setRegistryName( new ResourceLocation( "computercraft:" + family + "_turtle_upgrade_" + upgrade.getUpgradeID().toString().replace( ':', '_' ) + "_1" ) )
|
||||
);
|
||||
registry.register(
|
||||
new ImpostorRecipe( "computercraft:" + family.toString() + "_turtle_upgrade", 2, 1, new ItemStack[] { craftingItem, baseTurtle }, craftedTurtleFlipped )
|
||||
.setRegistryName( new ResourceLocation( "computercraft:" + family + "_turtle_upgrade_" + upgrade.getUpgradeID().toString().replace( ':', '_' ) + "_2" ) )
|
||||
);
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
// Coloured disks
|
||||
ItemStack paper = new ItemStack( Items.PAPER, 1 );
|
||||
ItemStack redstone = new ItemStack( Items.REDSTONE, 1 );
|
||||
for( int colour = 0; colour < 16; colour++ )
|
||||
{
|
||||
ItemStack disk = ItemDiskLegacy.createFromIDAndColour( -1, null, Colour.values()[colour].getHex() );
|
||||
ItemStack dye = new ItemStack( Items.DYE, 1, colour );
|
||||
|
||||
int diskIdx = 0;
|
||||
ItemStack[] disks = new ItemStack[15];
|
||||
for( int otherColour = 0; otherColour < 16; otherColour++ )
|
||||
{
|
||||
if( colour != otherColour )
|
||||
{
|
||||
disks[diskIdx++] = ItemDiskLegacy.createFromIDAndColour( -1, null, Colour.values()[otherColour].getHex() );
|
||||
}
|
||||
}
|
||||
|
||||
// Normal recipe
|
||||
registry.register(
|
||||
new ImpostorShapelessRecipe( "computercraft:disk", disk, new ItemStack[] { redstone, paper, dye } )
|
||||
.setRegistryName( new ResourceLocation( "computercraft:disk_imposter_" + colour ) )
|
||||
);
|
||||
|
||||
// Conversion recipe
|
||||
registry.register(
|
||||
new ImpostorShapelessRecipe( "computercraft:disk", disk, NonNullList.from( Ingredient.EMPTY, Ingredient.fromStacks( disks ), Ingredient.fromStacks( dye ) ) )
|
||||
.setRegistryName( new ResourceLocation( "computercraft:disk_imposter_convert_" + colour ) )
|
||||
);
|
||||
}
|
||||
|
||||
// Pocket computer upgrades
|
||||
ItemStack pocketComputer = PocketComputerItemFactory.create( -1, null, -1, ComputerFamily.Normal, null );
|
||||
ItemStack advancedPocketComputer = PocketComputerItemFactory.create( -1, null, -1, ComputerFamily.Advanced, null );
|
||||
for( IPocketUpgrade upgrade : PocketUpgrades.getVanillaUpgrades() )
|
||||
{
|
||||
registry.register( new ImpostorRecipe(
|
||||
"computercraft:normal_pocket_upgrade",
|
||||
1, 2,
|
||||
new ItemStack[] { upgrade.getCraftingItem(), pocketComputer },
|
||||
PocketComputerItemFactory.create( -1, null, -1, ComputerFamily.Normal, upgrade )
|
||||
).setRegistryName( new ResourceLocation( "computercraft:normal_pocket_upgrade_" + upgrade.getUpgradeID().toString().replace( ':', '_' ) ) )
|
||||
);
|
||||
|
||||
registry.register(
|
||||
new ImpostorRecipe( "computercraft:advanced_pocket_upgrade",
|
||||
1, 2,
|
||||
new ItemStack[] { upgrade.getCraftingItem(), advancedPocketComputer },
|
||||
PocketComputerItemFactory.create( -1, null, -1, ComputerFamily.Advanced, upgrade )
|
||||
).setRegistryName( new ResourceLocation( "computercraft:advanced_pocket_upgrade_" + upgrade.getUpgradeID().toString().replace( ':', '_' ) ) )
|
||||
);
|
||||
}
|
||||
}
|
||||
|
||||
|
||||
public static void registerTurtleUpgrades()
|
||||
private static void registerTurtleUpgrades()
|
||||
{
|
||||
// Upgrades
|
||||
ComputerCraft.TurtleUpgrades.wirelessModem = new TurtleModem( false, new ResourceLocation( "computercraft", "wireless_modem" ), 1 );
|
||||
@@ -325,7 +222,7 @@ public final class Registry
|
||||
TurtleUpgrades.registerInternal( ComputerCraft.TurtleUpgrades.diamondHoe );
|
||||
}
|
||||
|
||||
public static void registerPocketUpgrades()
|
||||
private static void registerPocketUpgrades()
|
||||
{
|
||||
// Register pocket upgrades
|
||||
ComputerCraft.PocketUpgrades.wirelessModem = new PocketModem( false );
|
||||
|
||||
@@ -29,6 +29,7 @@ public class ItemPeripheral extends ItemPeripheralBase
|
||||
super( block );
|
||||
setTranslationKey( "computercraft:peripheral" );
|
||||
setCreativeTab( ComputerCraft.mainCreativeTab );
|
||||
setHasSubtypes( true );
|
||||
}
|
||||
|
||||
@Nonnull
|
||||
|
||||
@@ -23,7 +23,6 @@ public abstract class ItemPeripheralBase extends ItemBlock implements IPeriphera
|
||||
{
|
||||
super( block );
|
||||
setMaxStackSize( 64 );
|
||||
setHasSubtypes( true );
|
||||
}
|
||||
|
||||
public abstract PeripheralType getPeripheralType( int damage );
|
||||
|
||||
@@ -31,6 +31,7 @@ public class ItemCable extends ItemPeripheralBase
|
||||
super( block );
|
||||
setTranslationKey( "computercraft:cable" );
|
||||
setCreativeTab( ComputerCraft.mainCreativeTab );
|
||||
setHasSubtypes( true );
|
||||
}
|
||||
|
||||
@Nonnull
|
||||
|
||||
@@ -25,11 +25,8 @@ public class PocketModem extends AbstractPocketUpgrade
|
||||
{
|
||||
super(
|
||||
advanced
|
||||
? new ResourceLocation( "computercraft", "advanved_modem" )
|
||||
? new ResourceLocation( "computercraft", "advanced_modem" )
|
||||
: new ResourceLocation( "computercraft", "wireless_modem" ),
|
||||
advanced
|
||||
? "upgrade.computercraft:advanced_modem.adjective"
|
||||
: "upgrade.computercraft:wireless_modem.adjective",
|
||||
PeripheralItemFactory.create(
|
||||
advanced ? PeripheralType.AdvancedModem : PeripheralType.WirelessModem,
|
||||
null, 1
|
||||
|
||||
@@ -38,8 +38,6 @@ public abstract class ItemTurtleBase extends ItemComputerBase implements ITurtle
|
||||
setHasSubtypes( true );
|
||||
}
|
||||
|
||||
public abstract ItemStack create( int id, String label, int colour, ITurtleUpgrade leftUpgrade, ITurtleUpgrade rightUpgrade, int fuelLevel, ResourceLocation overlay );
|
||||
|
||||
public abstract ComputerFamily getFamily();
|
||||
|
||||
@Override
|
||||
@@ -62,7 +60,7 @@ public abstract class ItemTurtleBase extends ItemComputerBase implements ITurtle
|
||||
{
|
||||
if( !TurtleUpgrades.suitableForFamily( family, upgrade ) ) continue;
|
||||
|
||||
ItemStack stack = TurtleItemFactory.create( -1, null, -1, family, upgrade, null, 0, null );
|
||||
ItemStack stack = TurtleItemFactory.create( -1, null, -1, family, null, upgrade, 0, null );
|
||||
if( !stack.isEmpty() && stack.getItem() == this ) list.add( stack );
|
||||
}
|
||||
}
|
||||
|
||||
@@ -10,7 +10,6 @@ import dan200.computercraft.ComputerCraft;
|
||||
import dan200.computercraft.api.turtle.ITurtleUpgrade;
|
||||
import dan200.computercraft.api.turtle.TurtleSide;
|
||||
import dan200.computercraft.shared.computer.core.ComputerFamily;
|
||||
import dan200.computercraft.shared.computer.items.ItemComputer;
|
||||
import net.minecraft.block.Block;
|
||||
import net.minecraft.item.ItemStack;
|
||||
import net.minecraft.nbt.NBTTagCompound;
|
||||
@@ -27,59 +26,6 @@ public class ItemTurtleLegacy extends ItemTurtleBase
|
||||
setCreativeTab( ComputerCraft.mainCreativeTab );
|
||||
}
|
||||
|
||||
@Override
|
||||
public ItemStack create( int id, String label, int colour, ITurtleUpgrade leftUpgrade, ITurtleUpgrade rightUpgrade, int fuelLevel, ResourceLocation overlay )
|
||||
{
|
||||
// Legacy turtles only support pickaxes and modems
|
||||
if( (leftUpgrade != null && leftUpgrade != ComputerCraft.TurtleUpgrades.diamondPickaxe) ||
|
||||
(rightUpgrade != null && rightUpgrade != ComputerCraft.TurtleUpgrades.wirelessModem) ||
|
||||
(colour != -1) || (overlay != null) )
|
||||
{
|
||||
return null;
|
||||
}
|
||||
|
||||
// Build the subtype
|
||||
int subType = 0;
|
||||
if( leftUpgrade != null )
|
||||
{
|
||||
subType = subType + 1;
|
||||
}
|
||||
if( rightUpgrade != null )
|
||||
{
|
||||
subType = subType + 2;
|
||||
}
|
||||
|
||||
// Build the ID
|
||||
int damage = subType;
|
||||
if( id >= 0 && id <= ItemComputer.HIGHEST_DAMAGE_VALUE_ID )
|
||||
{
|
||||
damage += ((id + 1) << 2);
|
||||
}
|
||||
|
||||
// Build the stack
|
||||
ItemStack stack = new ItemStack( this, 1, damage );
|
||||
if( fuelLevel > 0 || id > ItemComputer.HIGHEST_DAMAGE_VALUE_ID )
|
||||
{
|
||||
NBTTagCompound nbt = new NBTTagCompound();
|
||||
if( fuelLevel > 0 )
|
||||
{
|
||||
nbt.setInteger( "fuelLevel", fuelLevel );
|
||||
}
|
||||
if( id > ItemComputer.HIGHEST_DAMAGE_VALUE_ID )
|
||||
{
|
||||
nbt.setInteger( "computerID", id );
|
||||
}
|
||||
stack.setTagCompound( nbt );
|
||||
}
|
||||
if( label != null )
|
||||
{
|
||||
stack.setStackDisplayName( label );
|
||||
}
|
||||
|
||||
// Return the stack
|
||||
return stack;
|
||||
}
|
||||
|
||||
// IComputerItem implementation
|
||||
|
||||
@Override
|
||||
|
||||
@@ -29,7 +29,6 @@ public class ItemTurtleNormal extends ItemTurtleBase
|
||||
setCreativeTab( ComputerCraft.mainCreativeTab );
|
||||
}
|
||||
|
||||
@Override
|
||||
public ItemStack create( int id, String label, int colour, ITurtleUpgrade leftUpgrade, ITurtleUpgrade rightUpgrade, int fuelLevel, ResourceLocation overlay )
|
||||
{
|
||||
// Build the stack
|
||||
|
||||
@@ -41,17 +41,9 @@ public class TurtleItemFactory
|
||||
switch( family )
|
||||
{
|
||||
case Normal:
|
||||
{
|
||||
ItemTurtleBase legacy = ComputerCraft.Items.turtle;
|
||||
ItemTurtleBase normal = ComputerCraft.Items.turtleExpanded;
|
||||
ItemStack legacyStack = legacy.create( id, label, colour, leftUpgrade, rightUpgrade, fuelLevel, overlay );
|
||||
return legacyStack != null ? legacyStack : normal.create( id, label, colour, leftUpgrade, rightUpgrade, fuelLevel, overlay );
|
||||
}
|
||||
return ComputerCraft.Items.turtleExpanded.create( id, label, colour, leftUpgrade, rightUpgrade, fuelLevel, overlay );
|
||||
case Advanced:
|
||||
{
|
||||
ItemTurtleBase advanced = ComputerCraft.Items.turtleAdvanced;
|
||||
return advanced.create( id, label, colour, leftUpgrade, rightUpgrade, fuelLevel, overlay );
|
||||
}
|
||||
return ComputerCraft.Items.turtleAdvanced.create( id, label, colour, leftUpgrade, rightUpgrade, fuelLevel, overlay );
|
||||
default:
|
||||
return ItemStack.EMPTY;
|
||||
}
|
||||
|
||||
@@ -11,11 +11,11 @@ import net.minecraft.inventory.InventoryCrafting;
|
||||
import net.minecraft.item.ItemStack;
|
||||
import net.minecraft.item.crafting.IRecipe;
|
||||
import net.minecraft.item.crafting.Ingredient;
|
||||
import net.minecraft.item.crafting.ShapedRecipes;
|
||||
import net.minecraft.item.crafting.ShapelessRecipes;
|
||||
import net.minecraft.util.JsonUtils;
|
||||
import net.minecraft.util.NonNullList;
|
||||
import net.minecraft.world.World;
|
||||
import net.minecraftforge.common.crafting.CraftingHelper;
|
||||
import net.minecraftforge.common.crafting.IRecipeFactory;
|
||||
import net.minecraftforge.common.crafting.JsonContext;
|
||||
|
||||
@@ -60,7 +60,7 @@ public class ImpostorShapelessRecipe extends ShapelessRecipes
|
||||
{
|
||||
String group = JsonUtils.getString( json, "group", "" );
|
||||
NonNullList<Ingredient> ings = RecipeUtil.getIngredients( context, json );
|
||||
ItemStack itemstack = ShapedRecipes.deserializeItem( JsonUtils.getJsonObject( json, "result" ), true );
|
||||
ItemStack itemstack = CraftingHelper.getItemStack( JsonUtils.getJsonObject( json, "result" ), context );
|
||||
return new ImpostorShapelessRecipe( group, itemstack, ings );
|
||||
}
|
||||
}
|
||||
|
||||
Reference in New Issue
Block a user