1
0
mirror of https://github.com/SquidDev-CC/CC-Tweaked synced 2024-12-12 19:20:29 +00:00

Merge pull request #528 from SquidDev-CC/ComputerCraft/feature/computer-upgrade

Add recipes to upgrade computers
This commit is contained in:
SquidDev 2018-03-15 17:39:17 +00:00
commit 7c218361d9
15 changed files with 291 additions and 72 deletions

View File

@ -16,4 +16,5 @@ public interface IComputerItem
int getComputerID( @Nonnull ItemStack stack ); int getComputerID( @Nonnull ItemStack stack );
String getLabel( @Nonnull ItemStack stack ); String getLabel( @Nonnull ItemStack stack );
ComputerFamily getFamily( @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 class ItemComputer extends ItemComputerBase
{ {
public static int HIGHEST_DAMAGE_VALUE_ID = 16382; public static int HIGHEST_DAMAGE_VALUE_ID = 16382;
public ItemComputer( Block block ) public ItemComputer( Block block )
{ {
super( block ); super( block );
@ -87,7 +87,7 @@ public class ItemComputer extends ItemComputerBase
TileEntity tile = world.getTileEntity( pos ); TileEntity tile = world.getTileEntity( pos );
if( tile != null && tile instanceof IComputerTile ) if( tile != null && tile instanceof IComputerTile )
{ {
IComputerTile computer = (IComputerTile)tile; IComputerTile computer = (IComputerTile) tile;
setupComputerAfterPlacement( stack, computer ); setupComputerAfterPlacement( stack, computer );
} }
return true; return true;
@ -146,10 +146,16 @@ public class ItemComputer extends ItemComputerBase
else else
{ {
int damage = stack.getItemDamage() & 0x3fff; 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 @Override
public ComputerFamily getFamily( int damage ) 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 // IMedia
@Override @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 @Override
public ItemStack setColour( ItemStack stack, int colour ) public ItemStack setColour( ItemStack stack, int colour )
{ {

View File

@ -7,82 +7,41 @@
package dan200.computercraft.shared.turtle.recipes; package dan200.computercraft.shared.turtle.recipes;
import com.google.gson.JsonObject; import com.google.gson.JsonObject;
import com.google.gson.JsonSyntaxException;
import dan200.computercraft.shared.computer.core.ComputerFamily; import dan200.computercraft.shared.computer.core.ComputerFamily;
import dan200.computercraft.shared.computer.items.IComputerItem; import dan200.computercraft.shared.computer.items.IComputerItem;
import dan200.computercraft.shared.computer.recipe.ComputerConvertRecipe;
import dan200.computercraft.shared.turtle.items.TurtleItemFactory; import dan200.computercraft.shared.turtle.items.TurtleItemFactory;
import dan200.computercraft.shared.util.RecipeUtil; import dan200.computercraft.shared.util.RecipeUtil;
import net.minecraft.inventory.InventoryCrafting;
import net.minecraft.item.ItemStack; import net.minecraft.item.ItemStack;
import net.minecraft.item.crafting.IRecipe; import net.minecraft.item.crafting.IRecipe;
import net.minecraft.item.crafting.Ingredient;
import net.minecraft.item.crafting.ShapedRecipes;
import net.minecraft.util.JsonUtils; 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.CraftingHelper;
import net.minecraftforge.common.crafting.IRecipeFactory; import net.minecraftforge.common.crafting.IRecipeFactory;
import net.minecraftforge.common.crafting.JsonContext; import net.minecraftforge.common.crafting.JsonContext;
import javax.annotation.Nonnull; import javax.annotation.Nonnull;
public class TurtleRecipe extends ShapedRecipes public class TurtleRecipe extends ComputerConvertRecipe
{ {
private final NonNullList<Ingredient> m_recipe; private final ComputerFamily family;
private final ComputerFamily m_family;
public TurtleRecipe( String group, int width, int height, NonNullList<Ingredient> recipe, ComputerFamily family ) public TurtleRecipe( String group, @Nonnull CraftingHelper.ShapedPrimer primer, ComputerFamily family )
{ {
super( group, width, height, recipe, TurtleItemFactory.create( -1, null, -1, family, null, null, 0, null ) ); super( group, primer, TurtleItemFactory.create( -1, null, -1, family, null, null, 0, null ) );
m_recipe = recipe; this.family = family;
m_family = family;
}
@Override
public boolean matches( @Nonnull InventoryCrafting _inventory, @Nonnull World world )
{
return !getCraftingResult( _inventory ).isEmpty();
} }
@Nonnull @Nonnull
@Override @Override
public ItemStack getCraftingResult( @Nonnull InventoryCrafting inventory ) protected ItemStack convert( @Nonnull ItemStack stack )
{ {
// See if we match the recipe, and extract the input computercraft ID IComputerItem item = (IComputerItem) stack.getItem();
int computerID = -1; int computerID = item.getComputerID( stack );
String label = null; String label = item.getLabel( stack );
for( int y = 0; y < 3; ++y )
{
for( int x = 0; x < 3; ++x )
{
ItemStack item = inventory.getStackInRowAndColumn( x, y );
Ingredient target = m_recipe.get( x + y * 3 );
if( item.getItem() instanceof IComputerItem ) if( family == ComputerFamily.Beginners ) computerID = -1;
{
IComputerItem itemComputer = (IComputerItem) item.getItem();
if( itemComputer.getFamily( item ) != m_family ) return ItemStack.EMPTY;
computerID = itemComputer.getComputerID( item ); return TurtleItemFactory.create( computerID, label, -1, family, null, null, 0, null );
label = itemComputer.getLabel( item );
}
else if( !target.apply( item ) )
{
return ItemStack.EMPTY;
}
}
}
// Build a turtle with the same ID the computer had
// Construct the new stack
if( m_family != ComputerFamily.Beginners )
{
return TurtleItemFactory.create( computerID, label, -1, m_family, null, null, 0, null );
}
else
{
return TurtleItemFactory.create( -1, label, -1, m_family, null, null, 0, null );
}
} }
public static class Factory implements IRecipeFactory public static class Factory implements IRecipeFactory
@ -91,20 +50,10 @@ public class TurtleRecipe extends ShapedRecipes
public IRecipe parse( JsonContext context, JsonObject json ) public IRecipe parse( JsonContext context, JsonObject json )
{ {
String group = JsonUtils.getString( json, "group", "" ); String group = JsonUtils.getString( json, "group", "" );
ComputerFamily family = RecipeUtil.getFamily( json, "family" );
String familyName = JsonUtils.getString( json, "family" );
ComputerFamily family;
try
{
family = ComputerFamily.valueOf( familyName );
}
catch( IllegalArgumentException e )
{
throw new JsonSyntaxException( "Unknown computer family '" + familyName + "'" );
}
CraftingHelper.ShapedPrimer primer = RecipeUtil.getPrimer( context, json ); CraftingHelper.ShapedPrimer primer = RecipeUtil.getPrimer( context, json );
return new TurtleRecipe( group, primer.width, primer.height, primer.input, family );
return new TurtleRecipe( group, primer, family );
} }
} }
} }

View File

@ -9,6 +9,7 @@ package dan200.computercraft.shared.util;
import com.google.common.collect.Maps; import com.google.common.collect.Maps;
import com.google.common.collect.Sets; import com.google.common.collect.Sets;
import com.google.gson.*; import com.google.gson.*;
import dan200.computercraft.shared.computer.core.ComputerFamily;
import net.minecraft.item.crafting.Ingredient; import net.minecraft.item.crafting.Ingredient;
import net.minecraft.util.JsonUtils; import net.minecraft.util.JsonUtils;
import net.minecraft.util.NonNullList; import net.minecraft.util.NonNullList;
@ -102,4 +103,17 @@ public class RecipeUtil
return ings; 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" : { "recipes" : {
"impostor_shaped" : "dan200.computercraft.shared.util.ImpostorRecipe$Factory", "impostor_shaped" : "dan200.computercraft.shared.util.ImpostorRecipe$Factory",
"impostor_shapeless" : "dan200.computercraft.shared.util.ImpostorShapelessRecipe$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": {
"#": { "type": "forge:ore_dict", "ore": "ingotGold" },
"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": {
"#": { "type": "forge:ore_dict", "ore": "ingotGold" },
"C": { "item": "computercraft:pocket_computer", "data": 0 }
},
"family": "Advanced",
"result": { "item": "computercraft:pocket_computer", "data": 1 }
}

View File

@ -7,7 +7,7 @@
], ],
"key": { "key": {
"#": { "type": "forge:ore_dict", "ore": "ingotGold" }, "#": { "type": "forge:ore_dict", "ore": "ingotGold" },
"C": { "item": "computercraft:computer", "data": 16384 }, "C": { "type": "computercraft:computer", "item": "computercraft:computer", "data": 16384, "family": "Advanced" },
"I": { "type": "forge:ore_dict", "ore": "chestWood" } "I": { "type": "forge:ore_dict", "ore": "chestWood" }
}, },
"family": "Advanced" "family": "Advanced"

View File

@ -0,0 +1,18 @@
{
"type": "computercraft:computer_upgrade",
"pattern": [
"###",
"#C#",
" B "
],
"key": {
"#": { "type": "forge:ore_dict", "ore": "ingotGold" },
"B": { "type": "forge:ore_dict", "ore": "blockGold" },
"C": [
{ "type": "computercraft:computer", "item": "computercraft:turtle", "family": "Normal" },
{ "item": "computercraft:turtle_expanded", "data": 0 }
]
},
"family": "Advanced",
"result": { "item": "computercraft:turtle_advanced", "data": 0 }
}

View File

@ -7,7 +7,7 @@
], ],
"key": { "key": {
"#": { "type": "forge:ore_dict", "ore": "ingotIron" }, "#": { "type": "forge:ore_dict", "ore": "ingotIron" },
"C": { "item": "computercraft:computer", "data": 0 }, "C": { "type": "computercraft:computer", "item": "computercraft:computer", "family": "Normal" },
"I": { "type": "forge:ore_dict", "ore": "chestWood" } "I": { "type": "forge:ore_dict", "ore": "chestWood" }
}, },
"family": "Normal" "family": "Normal"