1
0
mirror of https://github.com/SquidDev-CC/CC-Tweaked synced 2024-09-28 15:08:47 +00:00

Add recipes to convert computer items into their upgraded counterparts

This adds IComputerItem.withFamily(ItemStack, ComputerFamily) as well as
a ComputerFamilyRecipe class. Each type of computer (normal, turtle,
pocket) defines a recipe using this class, as they require a different
number of gold ingots to upgrade.
This commit is contained in:
SquidDev 2018-03-13 14:14:36 +00:00
parent 3b3dd8071b
commit db825a7aab
13 changed files with 275 additions and 17 deletions

View File

@ -16,4 +16,5 @@ public interface IComputerItem
int getComputerID( @Nonnull ItemStack stack );
String getLabel( @Nonnull ItemStack stack );
ComputerFamily getFamily( @Nonnull ItemStack stack );
ItemStack withFamily(@Nonnull ItemStack stack, @Nonnull ComputerFamily family);
}

View File

@ -27,7 +27,7 @@ import javax.annotation.Nullable;
public class ItemComputer extends ItemComputerBase
{
public static int HIGHEST_DAMAGE_VALUE_ID = 16382;
public ItemComputer( Block block )
{
super( block );
@ -87,7 +87,7 @@ public class ItemComputer extends ItemComputerBase
TileEntity tile = world.getTileEntity( pos );
if( tile != null && tile instanceof IComputerTile )
{
IComputerTile computer = (IComputerTile)tile;
IComputerTile computer = (IComputerTile) tile;
setupComputerAfterPlacement( stack, computer );
}
return true;
@ -146,10 +146,16 @@ public class ItemComputer extends ItemComputerBase
else
{
int damage = stack.getItemDamage() & 0x3fff;
return ( damage - 1 );
return (damage - 1);
}
}
@Override
public ItemStack withFamily( @Nonnull ItemStack stack, @Nonnull ComputerFamily family )
{
return ComputerItemFactory.create( getComputerID( stack ), getLabel( stack ), family );
}
@Override
public ComputerFamily getFamily( int damage )
{

View File

@ -0,0 +1,66 @@
package dan200.computercraft.shared.computer.recipe;
import dan200.computercraft.shared.computer.items.IComputerItem;
import net.minecraft.inventory.InventoryCrafting;
import net.minecraft.item.ItemStack;
import net.minecraft.item.crafting.Ingredient;
import net.minecraft.item.crafting.ShapedRecipes;
import net.minecraft.world.World;
import net.minecraftforge.common.crafting.CraftingHelper;
import javax.annotation.Nonnull;
/**
* Represents a recipe which converts a computer from one form into another.
*/
public abstract class ComputerConvertRecipe extends ShapedRecipes
{
public ComputerConvertRecipe( String group, @Nonnull CraftingHelper.ShapedPrimer primer, @Nonnull ItemStack result )
{
super( group, primer.width, primer.height, primer.input, result );
}
@Nonnull
protected abstract ItemStack convert( @Nonnull ItemStack stack );
@Override
public boolean matches( @Nonnull InventoryCrafting inventory, @Nonnull World world )
{
// See if we match the recipe, and extract the input computercraft ID
ItemStack computerStack = null;
for( int y = 0; y < 3; ++y )
{
for( int x = 0; x < 3; ++x )
{
ItemStack stack = inventory.getStackInRowAndColumn( x, y );
Ingredient target = getIngredients().get( x + y * 3 );
// First verify we match the ingredient
if( !target.apply( stack ) ) return false;
// We want to ensure we have a computer item somewhere in the recipe
if( stack.getItem() instanceof IComputerItem ) computerStack = stack;
}
}
return computerStack != null;
}
@Nonnull
@Override
public ItemStack getCraftingResult( @Nonnull InventoryCrafting inventory )
{
for( int y = 0; y < 3; ++y )
{
for( int x = 0; x < 3; ++x )
{
ItemStack item = inventory.getStackInRowAndColumn( x, y );
// If we're a computer, convert!
if( item.getItem() instanceof IComputerItem ) return convert( item );
}
}
return ItemStack.EMPTY;
}
}

View File

@ -0,0 +1,47 @@
package dan200.computercraft.shared.computer.recipe;
import com.google.gson.JsonObject;
import dan200.computercraft.shared.computer.core.ComputerFamily;
import dan200.computercraft.shared.computer.items.IComputerItem;
import dan200.computercraft.shared.util.RecipeUtil;
import net.minecraft.item.ItemStack;
import net.minecraft.item.crafting.IRecipe;
import net.minecraft.util.JsonUtils;
import net.minecraftforge.common.crafting.CraftingHelper;
import net.minecraftforge.common.crafting.IRecipeFactory;
import net.minecraftforge.common.crafting.JsonContext;
import javax.annotation.Nonnull;
public class ComputerFamilyRecipe extends ComputerConvertRecipe
{
private final ComputerFamily family;
public ComputerFamilyRecipe( String group, @Nonnull CraftingHelper.ShapedPrimer primer, @Nonnull ItemStack result, ComputerFamily family )
{
super( group, primer, result );
this.family = family;
}
@Nonnull
@Override
protected ItemStack convert( @Nonnull ItemStack stack )
{
return ((IComputerItem) stack.getItem()).withFamily( stack, family );
}
public static class Factory implements IRecipeFactory
{
@Override
public IRecipe parse( JsonContext context, JsonObject json )
{
String group = JsonUtils.getString( json, "group", "" );
ComputerFamily family = RecipeUtil.getFamily( json, "family" );
CraftingHelper.ShapedPrimer primer = RecipeUtil.getPrimer( context, json );
ItemStack result = deserializeItem( JsonUtils.getJsonObject( json, "result" ), false );
return new ComputerFamilyRecipe( group, primer, result, family );
}
}
}

View File

@ -0,0 +1,66 @@
package dan200.computercraft.shared.computer.recipe;
import com.google.gson.JsonObject;
import com.google.gson.JsonSyntaxException;
import dan200.computercraft.shared.computer.core.ComputerFamily;
import dan200.computercraft.shared.computer.items.IComputerItem;
import dan200.computercraft.shared.util.RecipeUtil;
import net.minecraft.item.Item;
import net.minecraft.item.ItemStack;
import net.minecraft.item.crafting.Ingredient;
import net.minecraft.util.JsonUtils;
import net.minecraft.util.ResourceLocation;
import net.minecraftforge.common.crafting.IIngredientFactory;
import net.minecraftforge.common.crafting.JsonContext;
import net.minecraftforge.fml.common.registry.ForgeRegistries;
import javax.annotation.Nonnull;
import javax.annotation.Nullable;
/**
* Represents an ingredient which requires an item to have a specific
* computer family. This allows us to have operations which only work
* on normal or
*/
public class ComputerIngredient extends Ingredient
{
private final IComputerItem item;
private final ComputerFamily family;
public <T extends Item & IComputerItem> ComputerIngredient( T item, int data, ComputerFamily family )
{
super( new ItemStack( item, 1, data ) );
this.item = item;
this.family = family;
}
@Override
public boolean apply( @Nullable ItemStack stack )
{
return stack != null && stack.getItem() == item && item.getFamily( stack ) == family;
}
public static class Factory implements IIngredientFactory
{
@Nonnull
@Override
public Ingredient parse( JsonContext context, JsonObject json )
{
String itemName = context.appendModId( JsonUtils.getString( json, "item" ) );
int data = JsonUtils.getInt( json, "data", 0 );
ComputerFamily family = RecipeUtil.getFamily( json, "family" );
Item item = ForgeRegistries.ITEMS.getValue( new ResourceLocation( itemName ) );
if( item == null ) throw new JsonSyntaxException( "Unknown item '" + itemName + "'" );
if( !(item instanceof IComputerItem) )
{
throw new JsonSyntaxException( "Item '" + itemName + "' is not a computer item" );
}
return new ComputerIngredient( (Item & IComputerItem) item, data, family );
}
}
}

View File

@ -371,6 +371,15 @@ public class ItemPocketComputer extends Item implements IComputerItem, IMedia, I
}
}
@Override
public ItemStack withFamily( @Nonnull ItemStack stack, @Nonnull ComputerFamily family )
{
return PocketComputerItemFactory.create(
getComputerID( stack ), getLabel( stack ), getColour( stack ),
family, getUpgrade( stack )
);
}
// IMedia
@Override

View File

@ -170,6 +170,17 @@ public abstract class ItemTurtleBase extends ItemComputerBase implements ITurtle
}
}
@Override
public ItemStack withFamily( @Nonnull ItemStack stack, @Nonnull ComputerFamily family )
{
return TurtleItemFactory.create(
getComputerID( stack ), getLabel( stack ),
getColour( stack ), family,
getUpgrade( stack, TurtleSide.Left ), getUpgrade( stack, TurtleSide.Right ),
getFuelLevel( stack ), getOverlay( stack )
);
}
@Override
public ItemStack setColour( ItemStack stack, int colour )
{

View File

@ -7,7 +7,6 @@
package dan200.computercraft.shared.turtle.recipes;
import com.google.gson.JsonObject;
import com.google.gson.JsonSyntaxException;
import dan200.computercraft.shared.computer.core.ComputerFamily;
import dan200.computercraft.shared.computer.items.IComputerItem;
import dan200.computercraft.shared.turtle.items.TurtleItemFactory;
@ -91,18 +90,7 @@ public class TurtleRecipe extends ShapedRecipes
public IRecipe parse( JsonContext context, JsonObject json )
{
String group = JsonUtils.getString( json, "group", "" );
String familyName = JsonUtils.getString( json, "family" );
ComputerFamily family;
try
{
family = ComputerFamily.valueOf( familyName );
}
catch( IllegalArgumentException e )
{
throw new JsonSyntaxException( "Unknown computer family '" + familyName + "'" );
}
ComputerFamily family = RecipeUtil.getFamily( json, "family" );
CraftingHelper.ShapedPrimer primer = RecipeUtil.getPrimer( context, json );
return new TurtleRecipe( group, primer.width, primer.height, primer.input, family );
}

View File

@ -9,6 +9,7 @@ package dan200.computercraft.shared.util;
import com.google.common.collect.Maps;
import com.google.common.collect.Sets;
import com.google.gson.*;
import dan200.computercraft.shared.computer.core.ComputerFamily;
import net.minecraft.item.crafting.Ingredient;
import net.minecraft.util.JsonUtils;
import net.minecraft.util.NonNullList;
@ -102,4 +103,17 @@ public class RecipeUtil
return ings;
}
public static ComputerFamily getFamily( JsonObject json, String name )
{
String familyName = JsonUtils.getString( json, name );
try
{
return ComputerFamily.valueOf( familyName );
}
catch( IllegalArgumentException e )
{
throw new JsonSyntaxException( "Unknown computer family '" + familyName + "' for field " + name );
}
}
}

View File

@ -2,6 +2,10 @@
"recipes" : {
"impostor_shaped" : "dan200.computercraft.shared.util.ImpostorRecipe$Factory",
"impostor_shapeless" : "dan200.computercraft.shared.util.ImpostorShapelessRecipe$Factory",
"turtle" : "dan200.computercraft.shared.turtle.recipes.TurtleRecipe$Factory"
"turtle" : "dan200.computercraft.shared.turtle.recipes.TurtleRecipe$Factory",
"computer_upgrade" : "dan200.computercraft.shared.computer.recipe.ComputerFamilyRecipe$Factory"
},
"ingredients": {
"computer": "dan200.computercraft.shared.computer.recipe.ComputerIngredient$Factory"
}
}

View File

@ -0,0 +1,14 @@
{
"type": "computercraft:computer_upgrade",
"pattern": [
"###",
"#C#",
"# #"
],
"key": {
"#": { "item": "minecraft:gold_ingot" },
"C": { "type": "computercraft:computer", "item": "computercraft:computer", "family": "Normal" }
},
"family": "Advanced",
"result": { "item": "computercraft:computer", "data": 16384 }
}

View File

@ -0,0 +1,14 @@
{
"type": "computercraft:computer_upgrade",
"pattern": [
"###",
"#C#",
"# #"
],
"key": {
"#": { "item": "minecraft:gold_ingot" },
"C": { "item": "computercraft:pocket_computer", "data": 0 }
},
"family": "Advanced",
"result": { "item": "computercraft:pocket_computer", "data": 1 }
}

View File

@ -0,0 +1,18 @@
{
"type": "computercraft:computer_upgrade",
"pattern": [
"###",
"#C#",
" B "
],
"key": {
"#": { "item": "minecraft:gold_ingot" },
"B": { "item": "minecraft:gold_block" },
"C": [
{ "type": "computercraft:computer", "item": "computercraft:turtle", "family": "Normal" },
{ "item": "computercraft:turtle_expanded", "data": 0 }
]
},
"family": "Advanced",
"result": { "item": "computercraft:turtle_advanced", "data": 0 }
}