riveting, block tooling crafting handler

This commit is contained in:
Boblet 2023-04-20 16:41:17 +02:00
parent ce5435f07d
commit ed829fc7ec
15 changed files with 309 additions and 102 deletions

View File

@ -1,6 +1,13 @@
package api.hbm.block;
import java.util.ArrayList;
import java.util.HashMap;
import java.util.List;
import com.hbm.inventory.RecipesCommon.ComparableStack;
import net.minecraft.entity.player.EntityPlayer;
import net.minecraft.item.ItemStack;
import net.minecraft.world.World;
public interface IToolable {
@ -13,6 +20,28 @@ public interface IToolable {
DEFUSER,
WRENCH,
TORCH,
BOLT
BOLT;
public List<ItemStack> stacksForDisplay = new ArrayList();
private static HashMap<ComparableStack, ToolType> map = new HashMap();
public void register(ItemStack stack) {
stacksForDisplay.add(stack);
}
public static ToolType getType(ItemStack stack) {
if(!map.isEmpty()) {
return map.get(new ComparableStack(stack));
}
for(ToolType type : ToolType.values()) {
for(ItemStack tool : type.stacksForDisplay) {
map.put(new ComparableStack(tool), type);
}
}
return map.get(new ComparableStack(stack));
}
}
}

View File

@ -23,6 +23,7 @@ import com.hbm.main.MainRegistry;
import com.hbm.tileentity.DoorDecl;
import com.hbm.tileentity.machine.storage.TileEntityFileCabinet;
import api.hbm.block.IToolable.ToolType;
import cpw.mods.fml.common.registry.GameRegistry;
import net.minecraft.block.Block;
import net.minecraft.block.BlockFalling;
@ -1981,7 +1982,7 @@ public class ModBlocks {
watz_element = new BlockPillar(Material.iron, RefStrings.MODID + ":watz_element_top").setBlockName("watz_element").setHardness(5.0F).setResistance(10.0F).setCreativeTab(MainRegistry.machineTab).setBlockTextureName(RefStrings.MODID + ":watz_element_side");
watz_control = new BlockPillar(Material.iron, RefStrings.MODID + ":watz_control_top").setBlockName("watz_control").setHardness(5.0F).setResistance(10.0F).setCreativeTab(MainRegistry.machineTab).setBlockTextureName(RefStrings.MODID + ":watz_control_side");
watz_cooler = new BlockGeneric(Material.iron).setBlockName("watz_cooler").setHardness(5.0F).setResistance(10.0F).setCreativeTab(MainRegistry.machineTab).setBlockTextureName(RefStrings.MODID + ":watz_cooler");
watz_end = new BlockBoltable(Material.iron).setBlockName("watz_end").setHardness(5.0F).setResistance(10.0F).setCreativeTab(MainRegistry.machineTab).setBlockTextureName(RefStrings.MODID + ":watz_casing");
watz_end = new BlockToolConversion(Material.iron).addVariant("_bolted").setBlockName("watz_end").setHardness(5.0F).setResistance(10.0F).setCreativeTab(MainRegistry.machineTab).setBlockTextureName(RefStrings.MODID + ":watz_casing");
watz_hatch = new WatzHatch(Material.iron).setBlockName("watz_hatch").setHardness(5.0F).setResistance(10.0F).setCreativeTab(MainRegistry.machineTab).setBlockTextureName(RefStrings.MODID + ":watz_hatch");
watz_conductor = new BlockCableConnect(Material.iron).setBlockName("watz_conductor").setHardness(5.0F).setResistance(10.0F).setCreativeTab(MainRegistry.machineTab).setBlockTextureName(RefStrings.MODID + ":watz_conductor_top");
watz_core = new WatzCore(Material.iron).setBlockName("watz_core").setHardness(5.0F).setResistance(10.0F).setCreativeTab(MainRegistry.machineTab).setBlockTextureName(RefStrings.MODID + ":watz_computer");

View File

@ -1,72 +0,0 @@
package com.hbm.blocks.generic;
import java.util.ArrayList;
import java.util.List;
import com.hbm.blocks.BlockBase;
import com.hbm.blocks.IBlockMulti;
import com.hbm.blocks.ILookOverlay;
import com.hbm.inventory.RecipesCommon.AStack;
import com.hbm.items.ModItems;
import com.hbm.util.I18nUtil;
import api.hbm.block.IToolable;
import cpw.mods.fml.relauncher.Side;
import cpw.mods.fml.relauncher.SideOnly;
import net.minecraft.block.material.Material;
import net.minecraft.client.Minecraft;
import net.minecraft.entity.player.EntityPlayer;
import net.minecraft.item.ItemStack;
import net.minecraft.util.EnumChatFormatting;
import net.minecraft.world.World;
import net.minecraftforge.client.event.RenderGameOverlayEvent.Pre;
public class BlockBoltable extends BlockBase implements IToolable, ILookOverlay, IBlockMulti {
public BlockBoltable(Material mat) {
super(mat);
}
@Override
public boolean onScrew(World world, EntityPlayer player, int x, int y, int z, int side, float fX, float fY, float fZ, ToolType tool) {
if(tool != ToolType.BOLT) return false;
return true;
}
public List<AStack> getMaterials(int meta) {
List<AStack> list = new ArrayList();
return list;
}
@Override
@SideOnly(Side.CLIENT)
public void printHook(Pre event, World world, int x, int y, int z) {
ItemStack held = Minecraft.getMinecraft().thePlayer.getHeldItem();
if(held == null || held.getItem() != ModItems.boltgun) return;
List<String> text = new ArrayList();
text.add(EnumChatFormatting.GOLD + "Requires:");
List<AStack> materials = getMaterials(world.getBlockMetadata(x, y, z));
for(AStack stack : materials) {
try {
ItemStack display = stack.extractForCyclingDisplay(20);
text.add("- " + display.getDisplayName() + " x" + display.stackSize);
} catch(Exception ex) {
text.add(EnumChatFormatting.RED + "- ERROR");
}
}
if(!materials.isEmpty()) {
ILookOverlay.printGeneric(event, I18nUtil.resolveKey(this.getUnlocalizedName() + ".name"), 0xffff00, 0x404000, text);
}
}
@Override
public int getSubCount() {
return 1;
}
}

View File

@ -0,0 +1,176 @@
package com.hbm.blocks.generic;
import java.util.ArrayList;
import java.util.HashMap;
import java.util.List;
import java.util.Map.Entry;
import com.hbm.blocks.BlockBase;
import com.hbm.blocks.IBlockMulti;
import com.hbm.blocks.ILookOverlay;
import com.hbm.blocks.ModBlocks;
import com.hbm.inventory.RecipesCommon.AStack;
import com.hbm.inventory.RecipesCommon.ComparableStack;
import com.hbm.inventory.RecipesCommon.MetaBlock;
import com.hbm.items.ModItems;
import com.hbm.util.I18nUtil;
import com.hbm.util.InventoryUtil;
import com.hbm.util.Tuple.Pair;
import api.hbm.block.IToolable;
import cpw.mods.fml.relauncher.Side;
import cpw.mods.fml.relauncher.SideOnly;
import net.minecraft.block.material.Material;
import net.minecraft.client.Minecraft;
import net.minecraft.client.renderer.texture.IIconRegister;
import net.minecraft.creativetab.CreativeTabs;
import net.minecraft.entity.player.EntityPlayer;
import net.minecraft.item.Item;
import net.minecraft.item.ItemStack;
import net.minecraft.util.EnumChatFormatting;
import net.minecraft.util.IIcon;
import net.minecraft.world.World;
import net.minecraftforge.client.event.RenderGameOverlayEvent.Pre;
public class BlockToolConversion extends BlockBase implements IToolable, ILookOverlay, IBlockMulti {
public IIcon[] icons;
public String[] names;
public BlockToolConversion(Material mat) {
super(mat);
}
public BlockToolConversion addVariant(String... name) {
this.names = name;
return this;
}
@Override
@SideOnly(Side.CLIENT)
public void getSubBlocks(Item item, CreativeTabs tab, List list) {
for(int i = 0; i < getSubCount(); ++i) {
list.add(new ItemStack(item, 1, i));
}
}
@Override
@SideOnly(Side.CLIENT)
public void registerBlockIcons(IIconRegister iconRegister) {
super.registerBlockIcons(iconRegister);
if(names != null) {
icons = new IIcon[names.length];
for(int i = 0; i < names.length; i++) {
icons[i] = iconRegister.registerIcon(getTextureName() + names[i]);
}
}
}
@Override
@SideOnly(Side.CLIENT)
public IIcon getIcon(int side, int metadata) {
metadata -= 1;
if(metadata == -1 || icons == null || metadata >= icons.length) {
return super.getIcon(side, metadata);
}
return icons[metadata];
}
@Override
public boolean onScrew(World world, EntityPlayer player, int x, int y, int z, int side, float fX, float fY, float fZ, ToolType tool) {
if(world.isRemote) return false;
Pair<AStack[], MetaBlock> result = conversions.get(new Pair(tool, new MetaBlock(this, world.getBlockMetadata(x, y, z))));
if(result == null) return false;
List<AStack> list = new ArrayList();
for(AStack stack : result.key) list.add(stack);
if(list == null || list.isEmpty() || InventoryUtil.doesPlayerHaveAStacks(player, list, true)) {
world.setBlock(x, y, z, result.value.block, result.value.meta, 3);
}
return true;
}
@Override
@SideOnly(Side.CLIENT)
public void printHook(Pre event, World world, int x, int y, int z) {
ItemStack held = Minecraft.getMinecraft().thePlayer.getHeldItem();
if(held == null) return;
ToolType tool = this.quickLookup(held);
if(tool == null) return;
Pair<AStack[], MetaBlock> result = conversions.get(new Pair(tool, new MetaBlock(this, world.getBlockMetadata(x, y, z))));
if(result == null) return;
List<String> text = new ArrayList();
text.add(EnumChatFormatting.GOLD + "Requires:");
List<AStack> materials = new ArrayList();
for(AStack stack : result.key) materials.add(stack);
List<ItemStack> tools = tool.stacksForDisplay;
ItemStack displayTool = tools.get((int) (Math.abs(System.currentTimeMillis() / 1000) % tools.size()));
text.add(EnumChatFormatting.BLUE + "- " + displayTool.getDisplayName());
for(AStack stack : materials) {
try {
ItemStack display = stack.extractForCyclingDisplay(20);
text.add("- " + display.getDisplayName() + " x" + display.stackSize);
} catch(Exception ex) {
text.add(EnumChatFormatting.RED + "- ERROR");
}
}
if(!materials.isEmpty()) {
ILookOverlay.printGeneric(event, I18nUtil.resolveKey(this.getUnlocalizedName() + ".name"), 0xffff00, 0x404000, text);
}
}
@Override
public int getSubCount() {
return names != null ? names.length + 1 : 1;
}
public static ToolType quickLookup(ItemStack stack) {
return ToolType.getType(stack);
}
public static HashMap<Pair<ToolType, MetaBlock>, Pair<AStack[], MetaBlock>> conversions = new HashMap();
public static void registerRecipes() {
conversions.put(new Pair(ToolType.BOLT, new MetaBlock(ModBlocks.watz_end, 0)), new Pair(new AStack[] {new ComparableStack(ModItems.bolt_dura_steel, 4)}, new MetaBlock(ModBlocks.watz_end, 1)));
}
public static HashMap<Object[], Object> bufferedRecipes = new HashMap();
public static HashMap<Object[], Object> bufferedTools = new HashMap();
public static HashMap<Object[], Object> getRecipes(boolean recipes) {
if(!bufferedRecipes.isEmpty()) return recipes ? bufferedRecipes : bufferedTools;
for(Entry<Pair<ToolType, MetaBlock>, Pair<AStack[], MetaBlock>> entry : conversions.entrySet()) {
List<AStack> list = new ArrayList();
for(AStack stack : entry.getValue().getKey()) {
list.add(stack);
}
list.add(new ComparableStack(entry.getKey().getValue().block, 1, entry.getKey().getValue().meta));
Object[] inputInstance = list.toArray(new AStack[0]); // the instance has to match for the machine lookup to succeed
bufferedRecipes.put(inputInstance, new ItemStack(entry.getValue().getValue().block, 1, entry.getValue().getValue().meta));
bufferedTools.put(inputInstance, entry.getKey().getKey().stacksForDisplay.toArray(new ItemStack[0]));
}
return recipes ? bufferedRecipes : bufferedTools;
}
}

View File

@ -32,12 +32,19 @@ public abstract class NEIUniversalHandler extends TemplateRecipeHandler {
public final String display;
public final ItemStack[] machine;
public final HashMap<Object, Object> recipes;
public HashMap<Object, Object> machineOverrides;
/// SETUP ///
public NEIUniversalHandler(String display, ItemStack machine[], HashMap recipes) {
this.display = display;
this.machine = machine;
this.recipes = recipes;
this.machineOverrides = null;
}
public NEIUniversalHandler(String display, HashMap recipes, HashMap machines) {
this(display, (ItemStack[]) null, recipes);
this.machineOverrides = machines;
}
public NEIUniversalHandler(String display, ItemStack machine, HashMap recipes) { this(display, new ItemStack[]{machine}, recipes); }
@ -50,7 +57,7 @@ public abstract class NEIUniversalHandler extends TemplateRecipeHandler {
PositionedStack[] output;
PositionedStack machinePositioned;
public RecipeSet(ItemStack[][] in, ItemStack[][] out) {
public RecipeSet(ItemStack[][] in, ItemStack[][] out, Object originalInputInstance /* for custom machine lookup */) {
input = new PositionedStack[in.length];
for(int i = 0; i < in.length; i++) {
@ -65,7 +72,17 @@ public abstract class NEIUniversalHandler extends TemplateRecipeHandler {
this.output[i] = new PositionedStack(sub, 102 + i * 18 - ((twos && i > 1) ? 36 : 0), 24 + (twos ? (i < 2 ? -9 : 9) : 0));
}
this.machinePositioned = new PositionedStack(machine, 75, 31);
ItemStack[] m = machine;
if(NEIUniversalHandler.this.machineOverrides != null) {
Object key = NEIUniversalHandler.this.machineOverrides.get(originalInputInstance);
if(key != null) {
this.machinePositioned = new PositionedStack(key, 75, 31);
}
}
if(machinePositioned == null) this.machinePositioned = new PositionedStack(m, 75, 31);
}
@Override
@ -123,7 +140,7 @@ public abstract class NEIUniversalHandler extends TemplateRecipeHandler {
for(Entry<Object, Object> recipe : recipes.entrySet()) {
ItemStack[][] ins = InventoryUtil.extractObject(recipe.getKey());
ItemStack[][] outs = InventoryUtil.extractObject(recipe.getValue());
this.arecipes.add(new RecipeSet(ins, outs));
this.arecipes.add(new RecipeSet(ins, outs, recipe.getKey()));
}
} else {
@ -142,7 +159,7 @@ public abstract class NEIUniversalHandler extends TemplateRecipeHandler {
for(ItemStack[] array : outs) {
for(ItemStack stack : array) {
if(NEIServerUtils.areStacksSameTypeCrafting(stack, result)) {
this.arecipes.add(new RecipeSet(ins, outs));
this.arecipes.add(new RecipeSet(ins, outs, recipe.getKey()));
break match;
}
}
@ -170,7 +187,7 @@ public abstract class NEIUniversalHandler extends TemplateRecipeHandler {
for(ItemStack[] array : ins) {
for(ItemStack stack : array) {
if(NEIServerUtils.areStacksSameTypeCrafting(stack, ingredient)) {
this.arecipes.add(new RecipeSet(ins, outs));
this.arecipes.add(new RecipeSet(ins, outs, recipe.getKey()));
break match;
}
}

View File

@ -0,0 +1,15 @@
package com.hbm.handler.nei;
import com.hbm.blocks.generic.BlockToolConversion;
public class ToolingHandler extends NEIUniversalHandler {
public ToolingHandler() {
super("Tooling", BlockToolConversion.getRecipes(true), BlockToolConversion.getRecipes(false));
}
@Override
public String getKey() {
return "ntmTooling";
}
}

View File

@ -455,17 +455,41 @@ public class RecipesCommon {
this.block = block;
this.meta = meta;
}
@Override
public int hashCode() {
final int prime = 31;
int result = 1;
result = prime * result + Block.blockRegistry.getNameForObject(block).hashCode();
result = prime * result + meta;
return result;
}
@Override
public boolean equals(Object obj) {
if(this == obj)
return true;
if(obj == null)
return false;
if(getClass() != obj.getClass())
return false;
MetaBlock other = (MetaBlock) obj;
if(block == null) {
if(other.block != null)
return false;
} else if(!block.equals(other.block))
return false;
if(meta != other.meta)
return false;
return true;
}
public MetaBlock(Block block) {
this(block, 0);
}
public int getID() {
final int prime = 31;
int result = 1;
result = prime * result + Block.getIdFromBlock(block);
result = prime * result + meta;
return result;
@Deprecated public int getID() {
return hashCode();
}
}

View File

@ -31,6 +31,8 @@ public class ItemBlowtorch extends Item implements IFillableItem {
this.setMaxStackSize(1);
this.setFull3D();
this.setCreativeTab(MainRegistry.controlTab);
ToolType.TORCH.register(new ItemStack(this));
}
@Override

View File

@ -26,6 +26,8 @@ public class ItemBoltgun extends Item implements IAnimatedItem {
public ItemBoltgun() {
this.setMaxStackSize(1);
ToolType.BOLT.register(new ItemStack(this));
}
@Override

View File

@ -18,6 +18,8 @@ public class ItemTooling extends ItemCraftingDegradation {
this.type = type;
this.setFull3D();
this.setCreativeTab(MainRegistry.controlTab);
type.register(new ItemStack(this));
}
@Override

View File

@ -46,6 +46,7 @@ import com.google.common.collect.ImmutableList;
import com.hbm.blocks.BlockEnums.EnumStoneType;
import com.hbm.blocks.ModBlocks;
import com.hbm.blocks.generic.BlockMotherOfAllOres;
import com.hbm.blocks.generic.BlockToolConversion;
import com.hbm.commands.CommandReloadRecipes;
import com.hbm.config.*;
import com.hbm.creativetabs.*;
@ -829,6 +830,7 @@ public class MainRegistry {
HazmatRegistry.registerHazmats();
FluidContainerRegistry.register();
TileEntityMachineReactorLarge.registerAll();
BlockToolConversion.registerRecipes();
proxy.registerMissileItems();

View File

@ -53,6 +53,7 @@ public class NEIConfig implements IConfigureNEI {
registerHandler(new CrucibleSmeltingHandler());
registerHandler(new CrucibleAlloyingHandler());
registerHandler(new CrucibleCastingHandler());
registerHandler(new ToolingHandler());
//universal boyes
registerHandler(new ZirnoxRecipeHandler());

View File

@ -44,15 +44,15 @@ public class RenderWatzMultiblock extends TileEntitySpecialRenderer {
SmallBlockPronter.drawSmolBlockAt(ModBlocks.watz_cooler, 0, 1F, i, -2F);
SmallBlockPronter.drawSmolBlockAt(ModBlocks.watz_cooler, 0, -1F, i, -2F);
for(int j = -1; j < 2; j++) {
SmallBlockPronter.drawSmolBlockAt(ModBlocks.watz_end, 0, 3F, i, j);
SmallBlockPronter.drawSmolBlockAt(ModBlocks.watz_end, 0, j, i, 3F);
SmallBlockPronter.drawSmolBlockAt(ModBlocks.watz_end, 0, -3F, i, j);
SmallBlockPronter.drawSmolBlockAt(ModBlocks.watz_end, 0, j, i, -3F);
SmallBlockPronter.drawSmolBlockAt(ModBlocks.watz_end, 1, 3F, i, j);
SmallBlockPronter.drawSmolBlockAt(ModBlocks.watz_end, 1, j, i, 3F);
SmallBlockPronter.drawSmolBlockAt(ModBlocks.watz_end, 1, -3F, i, j);
SmallBlockPronter.drawSmolBlockAt(ModBlocks.watz_end, 1, j, i, -3F);
}
SmallBlockPronter.drawSmolBlockAt(ModBlocks.watz_end, 0, 2F, i, 2F);
SmallBlockPronter.drawSmolBlockAt(ModBlocks.watz_end, 0, 2F, i, -2F);
SmallBlockPronter.drawSmolBlockAt(ModBlocks.watz_end, 0, -2F, i, 2F);
SmallBlockPronter.drawSmolBlockAt(ModBlocks.watz_end, 0, -2F, i, -2F);
SmallBlockPronter.drawSmolBlockAt(ModBlocks.watz_end, 1, 2F, i, 2F);
SmallBlockPronter.drawSmolBlockAt(ModBlocks.watz_end, 1, 2F, i, -2F);
SmallBlockPronter.drawSmolBlockAt(ModBlocks.watz_end, 1, -2F, i, 2F);
SmallBlockPronter.drawSmolBlockAt(ModBlocks.watz_end, 1, -2F, i, -2F);
}
SmallBlockPronter.draw();

View File

@ -49,15 +49,15 @@ public class TileEntityWatzStruct extends TileEntity {
if(!cbr(ModBlocks.watz_cooler, -1, i, -2)) return;
for(int j = -1; j < 2; j++) {
if(!cbr(ModBlocks.watz_end, 3, i, j)) return;
if(!cbr(ModBlocks.watz_end, j, i, 3)) return;
if(!cbr(ModBlocks.watz_end, -3, i, j)) return;
if(!cbr(ModBlocks.watz_end, j, i, -3)) return;
if(!cbr(ModBlocks.watz_end, 1, 3, i, j)) return;
if(!cbr(ModBlocks.watz_end, 1, j, i, 3)) return;
if(!cbr(ModBlocks.watz_end, 1, -3, i, j)) return;
if(!cbr(ModBlocks.watz_end, 1, j, i, -3)) return;
}
if(!cbr(ModBlocks.watz_end, 2, i, 2)) return;
if(!cbr(ModBlocks.watz_end, 2, i, -2)) return;
if(!cbr(ModBlocks.watz_end, -2, i, 2)) return;
if(!cbr(ModBlocks.watz_end, -2, i, -2)) return;
if(!cbr(ModBlocks.watz_end, 1, 2, i, 2)) return;
if(!cbr(ModBlocks.watz_end, 1, 2, i, -2)) return;
if(!cbr(ModBlocks.watz_end, 1, -2, i, 2)) return;
if(!cbr(ModBlocks.watz_end, 1, -2, i, -2)) return;
}
Watz watz = (Watz)ModBlocks.watz;
@ -72,10 +72,18 @@ public class TileEntityWatzStruct extends TileEntity {
return worldObj.getBlock(xCoord + x, yCoord + y, zCoord + z);
}
/** [G]et [M]eta at [R]elative position */
private int gmr(int x, int y, int z) {
return worldObj.getBlockMetadata(xCoord + x, yCoord + y, zCoord + z);
}
/** [C]heck [B]lock at [R]elative position */
private boolean cbr(Block b, int x, int y, int z) {
return b == gbr(x, y, z);
}
private boolean cbr(Block b, int meta, int x, int y, int z) {
return b == gbr(x, y, z) && meta == gmr(x, y, z);
}
AxisAlignedBB bb = null;

Binary file not shown.

After

Width:  |  Height:  |  Size: 410 B