1
0
Fork 0

change inventory system

This commit is contained in:
Sen 2025-09-04 16:36:37 +02:00
parent 771a8bfa89
commit 6bb1c7c050
Signed by: sen
GPG key ID: 3AC50A6F47D1B722
18 changed files with 333 additions and 1082 deletions

View file

@ -655,7 +655,7 @@ public abstract class GuiContainer extends Gui
} }
Slot slot = this.getSlotAtPosition(mouseX, mouseY); Slot slot = this.getSlotAtPosition(mouseX, mouseY);
if(slot != null && Bind.CRAFT.isDown() && slot.canCheatItem() && slot.getHasStack() && this.gm.player.inventoryContainer.getSingleRecipe(slot.getStack()) != null) { if(slot != null && Bind.CRAFT.isDown() && slot.canCheatItem() && slot.getHasStack() && this.gm.player.inventoryContainer.getSingleRecipe(slot.getStack()) != null) {
this.gm.player.client.addToSendQueue(new CPacketAction(CPacketAction.Action.CRAFT_ITEM, slot.slotNumber)); this.gm.player.client.addToSendQueue(new CPacketAction(CPacketAction.Action.CRAFT_SINGLE, slot.slotNumber));
this.ignoreMouseUp = true; this.ignoreMouseUp = true;
return; return;
} }
@ -1026,7 +1026,7 @@ public abstract class GuiContainer extends Gui
this.gm.player.client.addToSendQueue(new CPacketCheat(ITEM_LIST.get(idx).getItem(), slot < 0 ? slot : -2 - slot, full)); this.gm.player.client.addToSendQueue(new CPacketCheat(ITEM_LIST.get(idx).getItem(), slot < 0 ? slot : -2 - slot, full));
} }
else { else {
this.cheatStack = ITEM_LIST.get(idx).copy(full ? ITEM_LIST.get(idx).getMaxStackSize() : 1); this.cheatStack = ITEM_LIST.get(idx).copy(full ? Math.min(ITEM_LIST.get(idx).getMaxStackSize(), 100) : 1);
} }
return true; return true;
} }

View file

@ -12,11 +12,11 @@ public class GuiCrafting extends GuiContainer {
public GuiCrafting(EntityNPC inv, World world, BlockWorkbench type) { public GuiCrafting(EntityNPC inv, World world, BlockWorkbench type) {
super(new ContainerWorkbench(inv, world, LocalPos.ORIGIN, type)); super(new ContainerWorkbench(inv, world, LocalPos.ORIGIN, type));
this.type = type; this.type = type;
this.ySize = 36 + 18 * ((inv.getInventoryCapacity() + 11) / 12) + 18 * this.type.getSize(); this.ySize = 36 + 18 * ((inv.getInventoryCapacity() + 11) / 12) + 18 * 3;
} }
public void addElements() { public void addElements() {
this.label(this.type.getDisplay(), 8, 16); this.label(this.type.getDisplay(), 8, 16);
this.label("Inventar", 8, 36 - 8 + 18 * this.type.getSize()); this.label("Inventar", 8, 36 - 8 + 18 * 3);
} }
} }

View file

@ -1128,7 +1128,7 @@ public class ClientPlayer implements IClientPlayer
// flag = true; // guicontainercreative.getSelectedTabIndex() != CheatTab.tabInventory.getIndex(); // flag = true; // guicontainercreative.getSelectedTabIndex() != CheatTab.tabInventory.getIndex();
// } // }
if (packetIn.getWindowId() == 0 && packetIn.getSlot() >= 5 + Equipment.ARMOR_SLOTS && packetIn.getSlot() < 5 + Equipment.ARMOR_SLOTS + entityplayer.getInventoryCapacity()) if (packetIn.getWindowId() == 0 && packetIn.getSlot() >= Equipment.ARMOR_SLOTS && packetIn.getSlot() < Equipment.ARMOR_SLOTS + entityplayer.getInventoryCapacity())
{ {
ItemStack itemstack = entityplayer.inventoryContainer.getSlot(packetIn.getSlot()).getStack(); ItemStack itemstack = entityplayer.inventoryContainer.getSlot(packetIn.getSlot()).getStack();

View file

@ -15,17 +15,17 @@ import common.world.World;
public class BlockWorkbench extends Block public class BlockWorkbench extends Block
{ {
private final int size; private final int tier;
public BlockWorkbench(int size) public BlockWorkbench(int tier)
{ {
super(Material.WOOD); super(Material.WOOD);
this.setTab(CheatTab.TECHNOLOGY); this.setTab(CheatTab.TECHNOLOGY);
this.size = size; this.tier = tier;
} }
public int getSize() { public int getTier() {
return this.size; return this.tier;
} }
public boolean onUse(World worldIn, LocalPos pos, State state, EntityNPC playerIn, Facing side, float hitX, float hitY, float hitZ) public boolean onUse(World worldIn, LocalPos pos, State state, EntityNPC playerIn, Facing side, float hitX, float hitY, float hitZ)

View file

@ -14,15 +14,11 @@ import common.entity.item.EntityItem;
import common.entity.npc.EntityNPC; import common.entity.npc.EntityNPC;
import common.entity.types.EntityAnimal; import common.entity.types.EntityAnimal;
import common.entity.types.EntityLiving; import common.entity.types.EntityLiving;
import common.init.CraftingRegistry;
import common.init.ItemRegistry; import common.init.ItemRegistry;
import common.init.Items; import common.init.Items;
import common.init.SoundEvent; import common.init.SoundEvent;
import common.inventory.Container;
import common.inventory.InventoryCrafting;
import common.item.Item; import common.item.Item;
import common.item.ItemStack; import common.item.ItemStack;
import common.item.material.ItemDye;
import common.item.tool.ItemTool; import common.item.tool.ItemTool;
import common.pathfinding.PathNavigateGround; import common.pathfinding.PathNavigateGround;
import common.rng.Random; import common.rng.Random;
@ -35,22 +31,6 @@ import common.world.World;
public class EntitySheep extends EntityAnimal public class EntitySheep extends EntityAnimal
{ {
/**
* Internal crafting inventory used to check the result of mixing dyes corresponding to the fleece color when
* breeding sheep.
*/
private final InventoryCrafting inventoryCrafting = new InventoryCrafting(new Container()
{
public boolean canInteractWith(EntityNPC playerIn)
{
return false;
}
}, 2, 1);
/**
* Used to control movement as well as wool regrowth. Set to 40 on handleHealthUpdate and counts down with each
* tick.
*/
private int sheepTimer; private int sheepTimer;
private EntityAIEatGrass entityAIEatGrass = new EntityAIEatGrass(this); private EntityAIEatGrass entityAIEatGrass = new EntityAIEatGrass(this);
@ -298,7 +278,7 @@ public class EntitySheep extends EntityAnimal
{ {
EntitySheep entitysheep = (EntitySheep)ageable; EntitySheep entitysheep = (EntitySheep)ageable;
EntitySheep entitysheep1 = new EntitySheep(this.worldObj); EntitySheep entitysheep1 = new EntitySheep(this.worldObj);
entitysheep1.setFleeceColor(this.getDyeColorMixFromParents(this, entitysheep)); entitysheep1.setFleeceColor(this.worldObj.rand.chance() ? this.getFleeceColor() : entitysheep.getFleeceColor());
return entitysheep1; return entitysheep1;
} }
@ -323,27 +303,6 @@ public class EntitySheep extends EntityAnimal
return livingdata; return livingdata;
} }
private Color getDyeColorMixFromParents(EntityAnimal father, EntityAnimal mother)
{
Color i = ((EntitySheep)father).getFleeceColor();
Color j = ((EntitySheep)mother).getFleeceColor();
this.inventoryCrafting.setInventorySlotContents(0, new ItemStack(ItemDye.getByColor(i)));
this.inventoryCrafting.setInventorySlotContents(1, new ItemStack(ItemDye.getByColor(j)));
ItemStack itemstack = CraftingRegistry.getMatching(this.inventoryCrafting);
Color k;
if (itemstack != null && itemstack.getItem() instanceof ItemDye dye)
{
k = dye.getColor();
}
else
{
k = this.worldObj.rand.chance() ? i : j;
}
return k;
}
public float getEyeHeight() public float getEyeHeight()
{ {
return 0.95F * this.height; return 0.95F * this.height;

View file

@ -543,9 +543,9 @@ public abstract class BlockRegistry {
register("core", new BlockCore().setHardness(1.5F).setResistance(10.0F).setSound(SoundType.STONE).setDisplay("Chunk-Lade-Kern")); register("core", new BlockCore().setHardness(1.5F).setResistance(10.0F).setSound(SoundType.STONE).setDisplay("Chunk-Lade-Kern"));
register("mob_spawner", (new BlockMobSpawner()).setHardness(3.0F).setResistance(8.0F).setSound(SoundType.STONE).setDisplay("Mob-Spawner")); register("mob_spawner", (new BlockMobSpawner()).setHardness(3.0F).setResistance(8.0F).setSound(SoundType.STONE).setDisplay("Mob-Spawner"));
register("workbench", (new BlockWorkbench(3)).setHardness(2.5F).setSound(SoundType.WOOD).setDisplay("Werkbank")); register("workbench", (new BlockWorkbench(1)).setHardness(2.5F).setSound(SoundType.WOOD).setDisplay("Werkbank"));
register("construction_table", (new BlockWorkbench(4)).setHardness(2.5F).setSound(SoundType.WOOD).setDisplay("Konstruktionstisch")); register("construction_table", (new BlockWorkbench(2)).setHardness(2.5F).setSound(SoundType.WOOD).setDisplay("Konstruktionstisch"));
register("assembly_unit", (new BlockWorkbench(5)).setHardness(2.5F).setSound(SoundType.WOOD).setDisplay("Fertigungseinheit")); register("assembly_unit", (new BlockWorkbench(3)).setHardness(2.5F).setSound(SoundType.WOOD).setDisplay("Fertigungseinheit"));
BlockFurnace stone_furnace = (BlockFurnace)register("stone_furnace", new BlockFurnace(200, 100).setDisplay("Steinofen")); BlockFurnace stone_furnace = (BlockFurnace)register("stone_furnace", new BlockFurnace(200, 100).setDisplay("Steinofen"));
register("lit_stone_furnace", new BlockFurnace(stone_furnace)); register("lit_stone_furnace", new BlockFurnace(stone_furnace));

View file

@ -1,34 +1,25 @@
package common.init; package common.init;
import java.util.Collections;
import java.util.Comparator;
import java.util.List; import java.util.List;
import java.util.Map;
import java.util.Set;
import common.block.artificial.BlockBed;
import common.block.artificial.BlockCarpet;
import common.block.artificial.BlockStainedGlass;
import common.block.artificial.BlockStainedGlassPane;
import common.block.artificial.BlockWool;
import common.block.natural.BlockColoredClay;
import common.collect.Lists; import common.collect.Lists;
import common.collect.Maps; import common.entity.npc.EntityNPC;
import common.inventory.InventoryCrafting; import common.inventory.IInventory;
import common.item.Item; import common.item.Item;
import common.item.ItemStack; import common.item.ItemStack;
import common.item.material.ItemDye;
import common.util.Color;
import common.util.Equipment; import common.util.Equipment;
public abstract class CraftingRegistry public abstract class CraftingRegistry
{ {
private static final List<IRecipe> recipes = Lists.<IRecipe>newArrayList(); private static final List<IRecipe> RECIPES = Lists.<IRecipe>newArrayList();
private static void registerTools(ToolMaterial material, Item item, String name) { private static void registerTools(int tier, ToolMaterial material, Item item, String name) {
for(Equipment tool : Equipment.values()) { for(Equipment tool : Equipment.values()) {
if(tool.getRecipe().length > 0 && tool.canRegister(material)) if((tool.getRecipeItems() > 0 || tool.getRecipeSticks() > 0) && tool.canRegister(material)) {
add(new ItemStack(ItemRegistry.byName(name + "_" + tool.getName())), tool.getRecipe(), '#', Items.stick, 'X', item); if(tool.getRecipeSticks() > 0)
add(tier, new ItemStack(ItemRegistry.byName(name + "_" + tool.getName())), tool.getRecipeItems(), item, tool.getRecipeSticks(), Items.stick);
else
add(tier, new ItemStack(ItemRegistry.byName(name + "_" + tool.getName())), tool.getRecipeItems(), item);
}
} }
} }
@ -37,26 +28,27 @@ public abstract class CraftingRegistry
for(OreType ore : OreType.values()) { for(OreType ore : OreType.values()) {
Item item = ItemRegistry.byName(ore.item); Item item = ItemRegistry.byName(ore.item);
ore.material.addRepairItem(item); ore.material.addRepairItem(item);
registerTools(ore.material, item, ore.name); registerTools(1, ore.material, item, ore.name);
Item block = ItemRegistry.byName(ore.name + "_block"); Item block = ItemRegistry.byName(ore.name + "_block");
add(new ItemStack(block), "###", "###", "###", '#', item); add(1, new ItemStack(block), 9, item);
add(new ItemStack(item, 9), "#", '#', block); add(1, new ItemStack(item, 9), block);
} }
for(MetalType metal : MetalType.values()) { for(MetalType metal : MetalType.values()) {
Item item = ItemRegistry.byName(metal.isPowder ? (metal.name + "_powder") : (metal.name + "_ingot")); Item item = ItemRegistry.byName(metal.isPowder ? (metal.name + "_powder") : (metal.name + "_ingot"));
metal.material.addRepairItem(item); metal.material.addRepairItem(item);
registerTools(metal.material, item, metal.name); registerTools(1, metal.material, item, metal.name);
Item block = ItemRegistry.byName(metal.name + "_block"); Item block = ItemRegistry.byName(metal.name + "_block");
add(new ItemStack(block), "###", "###", "###", '#', item); add(1, new ItemStack(block), 9, item);
add(new ItemStack(item, 9), "#", '#', block); add(1, new ItemStack(item, 9), block);
} }
for(ToolType tool : ToolType.values()) { for(ToolType tool : ToolType.values()) {
for(String itm : tool.items) { for(String itm : tool.items) {
Item item = ItemRegistry.byName(itm); Item item = ItemRegistry.byName(itm);
tool.material.addRepairItem(item); tool.material.addRepairItem(item);
registerTools(tool.material, item, tool.name); registerTools(1, tool.material, item, tool.name);
} }
} }
/*
for(MineralType mineral : MineralType.values()) { for(MineralType mineral : MineralType.values()) {
Item item = ItemRegistry.byName(mineral.name + "_block"); Item item = ItemRegistry.byName(mineral.name + "_block");
Item carved = ItemRegistry.byName(mineral.name + "_ornaments"); Item carved = ItemRegistry.byName(mineral.name + "_ornaments");
@ -153,9 +145,6 @@ public abstract class CraftingRegistry
add(new ItemStack(BlockCarpet.getByColor(color).getItem(), 3), "##", '#', BlockWool.getByColor(color).getItem()); add(new ItemStack(BlockCarpet.getByColor(color).getItem(), 3), "##", '#', BlockWool.getByColor(color).getItem());
} }
recipes.add(new RecipesDyes());
recipes.add(new RecipeRepairItem());
add(new ItemStack(Items.paper, 3), "###", '#', Items.reeds); add(new ItemStack(Items.paper, 3), "###", '#', Items.reeds);
addShapeless(new ItemStack(Items.book, 1), Items.paper, Items.paper, Items.paper, Items.leather); addShapeless(new ItemStack(Items.book, 1), Items.paper, Items.paper, Items.paper, Items.leather);
for(WoodType wood : WoodType.values()) { for(WoodType wood : WoodType.values()) {
@ -282,287 +271,189 @@ public abstract class CraftingRegistry
add(new ItemStack(Items.construction_table), "---", "-#-", "---", '#', Items.workbench, '-', Items.iron_ingot); add(new ItemStack(Items.construction_table), "---", "-#-", "---", '#', Items.workbench, '-', Items.iron_ingot);
add(new ItemStack(Items.bedrock), "#####", "#####", "#####", "#####", "#####", '#', Items.obsidian); add(new ItemStack(Items.bedrock), "#####", "#####", "#####", "#####", "#####", '#', Items.obsidian);
*/
Collections.sort(recipes, new Comparator<IRecipe>()
{
public int compare(IRecipe r1, IRecipe r2)
{
return r1 instanceof ShapelessRecipes && r2 instanceof ShapedRecipes ? 1 : (r2 instanceof ShapelessRecipes && r1 instanceof ShapedRecipes ? -1 : (r2.getRecipeSize() < r1.getRecipeSize() ? -1 : (r2.getRecipeSize() > r1.getRecipeSize() ? 1 : 0)));
}
});
}
private static ShapedRecipes add(ItemStack stack, Object ... recipeComponents)
{
String s = "";
int i = 0;
int j = 0;
int k = 0;
if (recipeComponents[i] instanceof String[])
{
String[] astring = (String[])((String[])recipeComponents[i++]);
for (int l = 0; l < astring.length; ++l)
{
String s2 = astring[l];
++k;
j = s2.length();
s = s + s2;
}
}
else
{
while (recipeComponents[i] instanceof String)
{
String s1 = (String)recipeComponents[i++];
++k;
j = s1.length();
s = s + s1;
}
}
Map<Character, ItemStack> map;
for (map = Maps.<Character, ItemStack>newHashMap(); i < recipeComponents.length; i += 2)
{
Character character = (Character)recipeComponents[i];
ItemStack itemstack = null;
if (recipeComponents[i + 1] instanceof Item)
{
itemstack = new ItemStack((Item)recipeComponents[i + 1]);
}
else if (recipeComponents[i + 1] instanceof ItemStack)
{
itemstack = (ItemStack)recipeComponents[i + 1];
}
else
{
throw new IllegalArgumentException("Invalid shaped recipe: unknown type " + recipeComponents[i + 1].getClass().getName() + "!");
}
map.put(character, itemstack);
}
ItemStack[] aitemstack = new ItemStack[j * k];
for (int i1 = 0; i1 < j * k; ++i1)
{
char c0 = s.charAt(i1);
if (map.containsKey(Character.valueOf(c0)))
{
aitemstack[i1] = ((ItemStack)map.get(Character.valueOf(c0))).copy();
}
else
{
aitemstack[i1] = null;
}
}
ShapedRecipes shapedrecipes = new ShapedRecipes(j, k, aitemstack, stack);
recipes.add(shapedrecipes);
return shapedrecipes;
}
private static void addShapeless(ItemStack stack, Object ... recipeComponents)
{
List<ItemStack> list = Lists.<ItemStack>newArrayList();
for (Object object : recipeComponents)
{
if (object instanceof ItemStack)
{
list.add(((ItemStack)object).copy());
}
else if (object instanceof Item)
{
list.add(new ItemStack((Item)object));
}
else
{
throw new IllegalArgumentException("Invalid shapeless recipe: unknown type " + object.getClass().getName() + "!");
}
}
recipes.add(new ShapelessRecipes(stack, list));
}
public static ItemStack getMatching(InventoryCrafting inv)
{
for (IRecipe irecipe : recipes)
{
if (irecipe.matches(inv))
{
return irecipe.getCraftingResult(inv);
}
}
return null;
} }
public static ItemStack[] getRemaining(InventoryCrafting inv) private static void add(int tier, ItemStack stack, Object... recipeComponents) {
{ List<ItemStack> list = Lists.<ItemStack>newArrayList();
for (IRecipe irecipe : recipes) int amount = 0;
{ for(Object object : recipeComponents) {
if (irecipe.matches(inv)) if(object instanceof Integer amt) {
{ if(amt <= 0)
return irecipe.getRemainingItems(inv); throw new IllegalArgumentException("Ungültiges Rezept: Anzahl muss mindestens 1 betragen");
} amount = amt;
} }
else if(object instanceof ItemStack item) {
if(amount != 0)
throw new IllegalArgumentException("Ungültiges Rezept: Kann keine Anzahl mit einem Stapel kombinieren");
list.add(item.copy());
}
else if(object instanceof Item item) {
list.add(new ItemStack(item, amount == 0 ? 1 : amount));
amount = 0;
}
else {
throw new IllegalArgumentException("Ungültiges Rezept: unbekannter Typ " + object.getClass().getName());
}
}
RECIPES.add(new IRecipe(RECIPES.size(), tier, list.toArray(new ItemStack[list.size()]), stack));
}
ItemStack[] aitemstack = new ItemStack[inv.getSizeInventory()]; private static boolean matches(IInventory input, IInventory output, IRecipe recipe, int tier, boolean allowDrop) {
if(tier < recipe.getTier())
return false;
if(input != null) {
for(ItemStack stack : recipe.getRequiredItems()) {
int amount = stack.getSize();
int size = input instanceof EntityNPC entity ? entity.getInventoryCapacity() : input.getSizeInventory();
for(int z = 0; z < size && amount > 0; z++) {
ItemStack current = input.getStackInSlot(z);
if(current != null && stack.itemEquals(current) && stack.dataEquals(current)) {
amount -= Math.min(amount, current.getSize());
if(amount <= 0)
break;
}
}
if(amount > 0)
return false;
}
}
if(output != null && (!allowDrop || !(output instanceof EntityNPC))) {
for(ItemStack stack : recipe.getCraftedItems()) {
int amount = stack.getSize();
int size = output instanceof EntityNPC entity ? entity.getInventoryCapacity() : output.getSizeInventory();
for(int z = 0; z < size && amount > 0; z++) {
ItemStack current = output.getStackInSlot(z);
if(current == null) {
amount = 0;
break;
}
else if(current != null && stack.itemEquals(current) && stack.dataEquals(current)) {
int incr = Math.min(amount, current.getMaxStackSize() - current.getSize());
if(incr > 0) {
amount -= incr;
if(amount <= 0)
break;
}
}
}
if(amount > 0)
return false;
}
}
return true;
}
public static void doCrafting(IInventory input, IInventory output, int tier, IRecipe recipe) {
if(matches(input, output, recipe, tier, false))
swapItems(input, output, recipe);
}
public static void doCrafting(EntityNPC entity, int tier, int id) {
if(id >= 0 && id < RECIPES.size()) {
IRecipe recipe = RECIPES.get(id);
if(matches(entity, entity, recipe, tier, true))
swapItems(entity, entity, recipe);
}
}
for (int i = 0; i < aitemstack.length; ++i) public static List<IRecipe> getMatching(EntityNPC entity, int tier) {
{ List<IRecipe> list = Lists.newArrayList();
aitemstack[i] = inv.getStackInSlot(i); for(IRecipe recipe : RECIPES) {
} if(matches(entity, entity, recipe, tier, true))
list.add(recipe);
}
return list;
}
return aitemstack; private static void swapItems(IInventory input, IInventory output, IRecipe recipe) {
} for(ItemStack stack : recipe.getRequiredItems()) {
int amount = stack.getSize();
int size = input instanceof EntityNPC entity ? entity.getInventoryCapacity() : input.getSizeInventory();
for(int z = 0; z < size && amount > 0; z++) {
ItemStack current = input.getStackInSlot(z);
if(current != null && stack.itemEquals(current) && stack.dataEquals(current)) {
int decr = Math.min(amount, current.getSize());
input.decrStackSize(z, decr);
amount -= decr;
if(amount <= 0)
break;
}
}
}
for(ItemStack stack : recipe.getCraftedItems()) {
int amount = stack.getSize();
int size = output instanceof EntityNPC entity ? entity.getInventoryCapacity() : output.getSizeInventory();
for(int z = 0; z < size && amount > 0; z++) {
ItemStack current = output.getStackInSlot(z);
if(current == null) {
output.setInventorySlotContents(z, stack.copy(amount));
amount = 0;
break;
}
else if(current != null && stack.itemEquals(current) && stack.dataEquals(current)) {
int incr = Math.min(amount, current.getMaxStackSize() - current.getSize());
if(incr > 0) {
current.incrSize(incr);
output.setInventorySlotContents(z, current);
amount -= incr;
if(amount <= 0)
break;
}
}
}
if(amount > 0 && output instanceof EntityNPC entity)
entity.dropItem(stack.copy(amount), false);
}
}
public static void getRecipeList(Set<Item> set) public static List<IRecipe> getRecipeList(int tier) {
{ List<IRecipe> list = Lists.newArrayList();
for (IRecipe irecipe : recipes) for(IRecipe irecipe : RECIPES) {
{ if(irecipe.getTier() <= tier)
if (irecipe.getRecipeOutput() != null) list.add(irecipe);
{ }
set.add(irecipe.getRecipeOutput().getItem()); return list;
} }
}
}
private static interface IRecipe {
boolean matches(InventoryCrafting inv);
ItemStack getCraftingResult(InventoryCrafting inv);
int getRecipeSize();
ItemStack getRecipeOutput();
ItemStack[] getRemainingItems(InventoryCrafting inv);
}
private static class RecipeRepairItem implements IRecipe
{
/**
* Used to check if a recipe matches current crafting inventory
*/
public boolean matches(InventoryCrafting inv)
{
List<ItemStack> list = Lists.<ItemStack>newArrayList();
for (int i = 0; i < inv.getSizeInventory(); ++i) public static class IRecipe {
{ private final int id;
ItemStack itemstack = inv.getStackInSlot(i); private final int tier;
private final ItemStack[] recipeItems;
private final ItemStack[] recipeOutput;
if (itemstack != null) public IRecipe(int id, int tier, ItemStack[] inputs, ItemStack output) {
{ this.id = id;
list.add(itemstack); this.tier = tier;
this.recipeItems = inputs;
List<ItemStack> out = Lists.newArrayList(output);
for(ItemStack stack : inputs) {
if(stack.getItem().hasContainerItem())
out.add(new ItemStack(stack.getItem().getContainerItem()));
}
this.recipeOutput = out.toArray(new ItemStack[out.size()]);
}
if (list.size() > 1) public int getId() {
{ return this.id;
ItemStack itemstack1 = (ItemStack)list.get(0); }
if (itemstack.getItem() != itemstack1.getItem() || itemstack1.getSize() != 1 || itemstack.getSize() != 1 || !itemstack1.getItem().isDamageable()) public int getTier() {
{ return this.tier;
return false; }
}
}
}
}
return list.size() == 2; public ItemStack[] getRequiredItems() {
} return this.recipeItems;
}
/** public ItemStack[] getCraftedItems() {
* Returns an Item that is the result of this recipe return this.recipeOutput;
*/ }
public ItemStack getCraftingResult(InventoryCrafting inv) }
{
List<ItemStack> list = Lists.<ItemStack>newArrayList();
for (int i = 0; i < inv.getSizeInventory(); ++i) /*
{
ItemStack itemstack = inv.getStackInSlot(i);
if (itemstack != null)
{
list.add(itemstack);
if (list.size() > 1)
{
ItemStack itemstack1 = (ItemStack)list.get(0);
if (itemstack.getItem() != itemstack1.getItem() || itemstack1.getSize() != 1 || itemstack.getSize() != 1 || !itemstack1.getItem().isDamageable())
{
return null;
}
}
}
}
if (list.size() == 2)
{
ItemStack itemstack2 = (ItemStack)list.get(0);
ItemStack itemstack3 = (ItemStack)list.get(1);
if (itemstack2.getItem() == itemstack3.getItem() && itemstack2.getSize() == 1 && itemstack3.getSize() == 1 && itemstack2.getItem().isDamageable())
{
Item item = itemstack2.getItem();
int j = item.getMaxDamage() - itemstack2.getItemDamage();
int k = item.getMaxDamage() - itemstack3.getItemDamage();
int l = j + k + item.getMaxDamage() * 5 / 100;
int i1 = item.getMaxDamage() - l;
if (i1 < 0)
{
i1 = 0;
}
ItemStack stack = new ItemStack(itemstack2.getItem());
stack.setItemDamage(i1);
return stack;
}
}
return null;
}
/**
* Returns the size of the recipe area
*/
public int getRecipeSize()
{
return 4;
}
public ItemStack getRecipeOutput()
{
return null;
}
public ItemStack[] getRemainingItems(InventoryCrafting inv)
{
ItemStack[] aitemstack = new ItemStack[inv.getSizeInventory()];
for (int i = 0; i < aitemstack.length; ++i)
{
ItemStack itemstack = inv.getStackInSlot(i);
if (itemstack != null && itemstack.getItem().hasContainerItem())
{
aitemstack[i] = new ItemStack(itemstack.getItem().getContainerItem());
}
}
return aitemstack;
}
}
private static class RecipesDyes implements IRecipe private static class RecipesDyes implements IRecipe
{ {
/**
* Used to check if a recipe matches current crafting inventory
*/
public boolean matches(InventoryCrafting inv) public boolean matches(InventoryCrafting inv)
{ {
ItemStack itemstack = null; ItemStack itemstack = null;
@ -598,9 +489,6 @@ public abstract class CraftingRegistry
return itemstack != null && !list.isEmpty(); return itemstack != null && !list.isEmpty();
} }
/**
* Returns an Item that is the result of this recipe
*/
public ItemStack getCraftingResult(InventoryCrafting inv) public ItemStack getCraftingResult(InventoryCrafting inv)
{ {
ItemStack itemstack = null; ItemStack itemstack = null;
@ -677,9 +565,6 @@ public abstract class CraftingRegistry
} }
} }
/**
* Returns the size of the recipe area
*/
public int getRecipeSize() public int getRecipeSize()
{ {
return 10; return 10;
@ -707,223 +592,5 @@ public abstract class CraftingRegistry
return aitemstack; return aitemstack;
} }
} }
*/
private static class ShapedRecipes implements IRecipe
{
/** How many horizontal slots this recipe is wide. */
private final int recipeWidth;
/** How many vertical slots this recipe uses. */
private final int recipeHeight;
/** Is a array of ItemStack that composes the recipe. */
private final ItemStack[] recipeItems;
/** Is the ItemStack that you get when craft the recipe. */
private final ItemStack recipeOutput;
public ShapedRecipes(int width, int height, ItemStack[] p_i1917_3_, ItemStack output)
{
this.recipeWidth = width;
this.recipeHeight = height;
this.recipeItems = p_i1917_3_;
this.recipeOutput = output;
}
public ItemStack getRecipeOutput()
{
return this.recipeOutput;
}
public ItemStack[] getRemainingItems(InventoryCrafting inv)
{
ItemStack[] aitemstack = new ItemStack[inv.getSizeInventory()];
for (int i = 0; i < aitemstack.length; ++i)
{
ItemStack itemstack = inv.getStackInSlot(i);
if (itemstack != null && itemstack.getItem().hasContainerItem())
{
aitemstack[i] = new ItemStack(itemstack.getItem().getContainerItem());
}
}
return aitemstack;
}
/**
* Used to check if a recipe matches current crafting inventory
*/
public boolean matches(InventoryCrafting inv)
{
for (int i = 0; i <= inv.getWidth() - this.recipeWidth; ++i)
{
for (int j = 0; j <= inv.getHeight() - this.recipeHeight; ++j)
{
if (this.checkMatch(inv, i, j, true))
{
return true;
}
if (this.checkMatch(inv, i, j, false))
{
return true;
}
}
}
return false;
}
/**
* Checks if the region of a crafting inventory is match for the recipe.
*/
private boolean checkMatch(InventoryCrafting inv, int xPos, int yPos, boolean mirror)
{
for (int x = 0; x < inv.getWidth(); ++x)
{
for (int y = 0; y < inv.getHeight(); ++y)
{
int rx = x - xPos;
int ry = y - yPos;
ItemStack stack = null;
if (rx >= 0 && ry >= 0 && rx < this.recipeWidth && ry < this.recipeHeight)
{
if (mirror)
{
stack = this.recipeItems[this.recipeWidth - rx - 1 + ry * this.recipeWidth];
}
else
{
stack = this.recipeItems[rx + ry * this.recipeWidth];
}
}
ItemStack ingredient = inv.getStackInRowAndColumn(x, y);
if (ingredient != null || stack != null)
{
if (ingredient == null && stack != null || ingredient != null && stack == null)
{
return false;
}
if (stack.getItem() != ingredient.getItem())
{
return false;
}
}
}
}
return true;
}
/**
* Returns an Item that is the result of this recipe
*/
public ItemStack getCraftingResult(InventoryCrafting inv)
{
return this.getRecipeOutput().copy();
}
/**
* Returns the size of the recipe area
*/
public int getRecipeSize()
{
return this.recipeWidth * this.recipeHeight;
}
}
private static class ShapelessRecipes implements IRecipe
{
/** Is the ItemStack that you get when craft the recipe. */
private final ItemStack recipeOutput;
private final List<ItemStack> recipeItems;
public ShapelessRecipes(ItemStack output, List<ItemStack> inputList)
{
this.recipeOutput = output;
this.recipeItems = inputList;
}
public ItemStack getRecipeOutput()
{
return this.recipeOutput;
}
public ItemStack[] getRemainingItems(InventoryCrafting inv)
{
ItemStack[] aitemstack = new ItemStack[inv.getSizeInventory()];
for (int i = 0; i < aitemstack.length; ++i)
{
ItemStack itemstack = inv.getStackInSlot(i);
if (itemstack != null && itemstack.getItem().hasContainerItem())
{
aitemstack[i] = new ItemStack(itemstack.getItem().getContainerItem());
}
}
return aitemstack;
}
/**
* Used to check if a recipe matches current crafting inventory
*/
public boolean matches(InventoryCrafting inv)
{
List<ItemStack> list = Lists.newArrayList(this.recipeItems);
for (int i = 0; i < inv.getHeight(); ++i)
{
for (int j = 0; j < inv.getWidth(); ++j)
{
ItemStack itemstack = inv.getStackInRowAndColumn(j, i);
if (itemstack != null)
{
boolean flag = false;
for (ItemStack itemstack1 : list)
{
if (itemstack.getItem() == itemstack1.getItem())
{
flag = true;
list.remove(itemstack1);
break;
}
}
if (!flag)
{
return false;
}
}
}
}
return list.isEmpty();
}
/**
* Returns an Item that is the result of this recipe
*/
public ItemStack getCraftingResult(InventoryCrafting inv)
{
return this.recipeOutput.copy();
}
/**
* Returns the size of the recipe area
*/
public int getRecipeSize()
{
return this.recipeItems.size();
}
}
} }

View file

@ -526,14 +526,6 @@ public abstract class Container
} }
} }
/**
* Callback for when the crafting matrix is changed.
*/
public void onCraftMatrixChanged(IInventory inventoryIn)
{
this.detectAndSendChanges();
}
/** /**
* args: slotID, itemStack to put in slot * args: slotID, itemStack to put in slot
*/ */

View file

@ -38,7 +38,7 @@ public class ContainerEnchantment extends Container
public void markDirty() public void markDirty()
{ {
super.markDirty(); super.markDirty();
ContainerEnchantment.this.onCraftMatrixChanged(this); ContainerEnchantment.this.onChanged(this);
} }
}; };
this.rand = new Random(); this.rand = new Random();
@ -126,7 +126,7 @@ public class ContainerEnchantment extends Container
} }
} }
public void onCraftMatrixChanged(IInventory inventoryIn) private void onChanged(IInventory inventoryIn)
{ {
if (inventoryIn == this.table) if (inventoryIn == this.table)
{ {
@ -248,7 +248,7 @@ public class ContainerEnchantment extends Container
this.table.markDirty(); this.table.markDirty();
this.seed = player.getEnchSeed(); this.seed = player.getEnchSeed();
this.onCraftMatrixChanged(this.table); this.onChanged(this.table);
} }
} }

View file

@ -52,15 +52,6 @@ public class ContainerMerchant extends Container
super.detectAndSendChanges(); super.detectAndSendChanges();
} }
/**
* Callback for when the crafting matrix is changed.
*/
public void onCraftMatrixChanged(IInventory inventoryIn)
{
this.merchantInventory.resetRecipeAndSlots();
super.onCraftMatrixChanged(inventoryIn);
}
public void setCurrentRecipeIndex(int currentRecipeIndex) public void setCurrentRecipeIndex(int currentRecipeIndex)
{ {
this.merchantInventory.setCurrentRecipeIndex(currentRecipeIndex); this.merchantInventory.setCurrentRecipeIndex(currentRecipeIndex);

View file

@ -1,37 +1,16 @@
package common.inventory; package common.inventory;
import common.entity.npc.EntityNPC; import common.entity.npc.EntityNPC;
import common.init.CraftingRegistry;
import common.item.ItemStack; import common.item.ItemStack;
import common.item.material.ItemArmor; import common.item.material.ItemArmor;
import common.util.Equipment; import common.util.Equipment;
public class ContainerPlayer extends Container { public class ContainerPlayer extends Container {
private final InventoryCrafting baseCrafting = new InventoryCrafting(new Container() {
public boolean canInteractWith(EntityNPC playerIn) {
return false;
}
}, 1, 1);
private final InventoryCrafting craftMatrix = new InventoryCrafting(this, 2, 2);
private final IInventory craftResult = new InventoryCraftResult();
private final EntityNPC thePlayer; private final EntityNPC thePlayer;
public ContainerPlayer(EntityNPC player) public ContainerPlayer(EntityNPC player)
{ {
this.thePlayer = player; this.thePlayer = player;
this.addSlotToContainer(new SlotCrafting(player, this.craftMatrix, this.craftResult, 0, 144, 36));
for (int i = 0; i < 2; ++i)
{
for (int j = 0; j < 2; ++j)
{
this.addSlotToContainer(new Slot(this.craftMatrix, j + i * 2, 88 + j * 18, 26 + i * 18) {
public boolean canEditItem() {
return false;
}
});
}
}
for (Equipment slot : Equipment.ARMOR) for (Equipment slot : Equipment.ARMOR)
{ {
@ -56,53 +35,24 @@ public class ContainerPlayer extends Container {
{ {
this.addSlotToContainer(new Slot(player, l, 8 + (l % 12) * 18, 84 + (l / 12) * 18)); this.addSlotToContainer(new Slot(player, l, 8 + (l % 12) * 18, 84 + (l / 12) * 18));
} }
this.onCraftMatrixChanged(this.craftMatrix);
}
/**
* Callback for when the crafting matrix is changed.
*/
public void onCraftMatrixChanged(IInventory inventoryIn)
{
this.craftResult.setInventorySlotContents(0, CraftingRegistry.getMatching(this.craftMatrix));
} }
public ItemStack getSingleRecipe(ItemStack stack) { public ItemStack getSingleRecipe(ItemStack stack) {
this.baseCrafting.setInventorySlotContents(0, stack); return null;
stack = CraftingRegistry.getMatching(this.baseCrafting); // this.baseCrafting.setInventorySlotContents(0, stack);
this.baseCrafting.setInventorySlotContents(0, null); // stack = CraftingRegistry.getMatching(this.baseCrafting);
return stack; // this.baseCrafting.setInventorySlotContents(0, null);
// return stack;
} }
public ItemStack craftSingleRecipe(ItemStack stack) { public ItemStack craftSingleRecipe(ItemStack stack) {
this.baseCrafting.setInventorySlotContents(0, stack); // this.baseCrafting.setInventorySlotContents(0, stack);
SlotCrafting.handleRemaining(this.baseCrafting, this.thePlayer); // SlotCrafting.handleRemaining(this.baseCrafting, this.thePlayer);
stack = this.baseCrafting.getStackInSlot(0); // stack = this.baseCrafting.getStackInSlot(0);
this.baseCrafting.setInventorySlotContents(0, null); // this.baseCrafting.setInventorySlotContents(0, null);
return stack; return stack;
} }
/**
* Called when the container is closed.
*/
public void onContainerClosed(EntityNPC playerIn)
{
super.onContainerClosed(playerIn);
for (int i = 0; i < 4; ++i)
{
ItemStack itemstack = this.craftMatrix.removeStackFromSlot(i);
if (itemstack != null)
{
playerIn.dropItem(itemstack, false);
}
}
this.craftResult.setInventorySlotContents(0, (ItemStack)null);
}
public boolean canInteractWith(EntityNPC playerIn) public boolean canInteractWith(EntityNPC playerIn)
{ {
return true; return true;
@ -110,8 +60,8 @@ public class ContainerPlayer extends Container {
private int getFreeSlotFor(Equipment type) { private int getFreeSlotFor(Equipment type) {
for(Equipment slot : type.getPossibleSlots(this.thePlayer)) { for(Equipment slot : type.getPossibleSlots(this.thePlayer)) {
if(!this.inventorySlots.get(5 + slot.getIndex()).getHasStack()) if(!this.inventorySlots.get(slot.getIndex()).getHasStack())
return 5 + slot.getIndex(); return slot.getIndex();
} }
return -1; return -1;
} }
@ -127,25 +77,9 @@ public class ContainerPlayer extends Container {
ItemStack itemstack1 = slot.getStack(); ItemStack itemstack1 = slot.getStack();
itemstack = itemstack1.copy(); itemstack = itemstack1.copy();
if (index == 0) if (index >= 0 && index < Equipment.ARMOR_SLOTS)
{ {
if (!this.mergeItemStack(itemstack1, 5 + Equipment.ARMOR_SLOTS, 5 + Equipment.ARMOR_SLOTS + playerIn.getInventoryCapacity(), true)) if (!this.mergeItemStack(itemstack1, Equipment.ARMOR_SLOTS, Equipment.ARMOR_SLOTS + playerIn.getInventoryCapacity(), false))
{
return null;
}
slot.onSlotChange(itemstack1, itemstack);
}
else if (index >= 1 && index < 5)
{
if (!this.mergeItemStack(itemstack1, 5 + Equipment.ARMOR_SLOTS, 5 + Equipment.ARMOR_SLOTS + playerIn.getInventoryCapacity(), false))
{
return null;
}
}
else if (index >= 5 && index < 5 + Equipment.ARMOR_SLOTS)
{
if (!this.mergeItemStack(itemstack1, 5 + Equipment.ARMOR_SLOTS, 5 + Equipment.ARMOR_SLOTS + playerIn.getInventoryCapacity(), false))
{ {
return null; return null;
} }
@ -157,11 +91,11 @@ public class ContainerPlayer extends Container {
return null; return null;
} }
} }
else if (index >= 5 + Equipment.ARMOR_SLOTS && index < 5 + Equipment.ARMOR_SLOTS + playerIn.getInventoryCapacity()) else if (index >= Equipment.ARMOR_SLOTS && index < Equipment.ARMOR_SLOTS + playerIn.getInventoryCapacity())
{ {
return null; return null;
} }
else if (!this.mergeItemStack(itemstack1, 5 + Equipment.ARMOR_SLOTS, 5 + Equipment.ARMOR_SLOTS + playerIn.getInventoryCapacity(), false)) else if (!this.mergeItemStack(itemstack1, Equipment.ARMOR_SLOTS, Equipment.ARMOR_SLOTS + playerIn.getInventoryCapacity(), false))
{ {
return null; return null;
} }
@ -185,13 +119,4 @@ public class ContainerPlayer extends Container {
return itemstack; return itemstack;
} }
/**
* Called to determine if the current slot is valid for the stack merging (double-click) code. The stack passed in
* is null for the initial slot that was double-clicked.
*/
public boolean canMergeSlot(ItemStack stack, Slot slotIn)
{
return slotIn.inventory != this.craftResult && super.canMergeSlot(stack, slotIn);
}
} }

View file

@ -37,7 +37,7 @@ public class ContainerRepair extends Container
public void markDirty() public void markDirty()
{ {
super.markDirty(); super.markDirty();
ContainerRepair.this.onCraftMatrixChanged(this); ContainerRepair.this.onChanged(this);
} }
}; };
this.selfPosition = blockPosIn; this.selfPosition = blockPosIn;
@ -127,17 +127,10 @@ public class ContainerRepair extends Container
} }
} }
/** private void onChanged(IInventory inventoryIn)
* Callback for when the crafting matrix is changed.
*/
public void onCraftMatrixChanged(IInventory inventoryIn)
{ {
super.onCraftMatrixChanged(inventoryIn); this.detectAndSendChanges();
this.updateRepairOutput();
if (inventoryIn == this.inputSlots)
{
this.updateRepairOutput();
}
} }
/** /**

View file

@ -2,151 +2,34 @@ package common.inventory;
import common.block.tech.BlockWorkbench; import common.block.tech.BlockWorkbench;
import common.entity.npc.EntityNPC; import common.entity.npc.EntityNPC;
import common.init.CraftingRegistry;
import common.item.ItemStack; import common.item.ItemStack;
import common.util.LocalPos; import common.util.LocalPos;
import common.world.World; import common.world.World;
public class ContainerWorkbench extends Container public class ContainerWorkbench extends Container {
{ private final World worldObj;
private final int craftSlots; private final LocalPos pos;
public final InventoryCrafting craftMatrix; private final BlockWorkbench block;
public final IInventory craftResult = new InventoryCraftResult();
private final World worldObj;
private final LocalPos pos;
private final BlockWorkbench block;
public ContainerWorkbench(EntityNPC playerInventory, World worldIn, LocalPos posIn, BlockWorkbench block) public ContainerWorkbench(EntityNPC playerInventory, World worldIn, LocalPos posIn, BlockWorkbench block) {
{ this.block = block;
int size = block.getSize(); this.worldObj = worldIn;
this.block = block; this.pos = posIn;
this.worldObj = worldIn; for(int l = 0; l < playerInventory.getInventoryCapacity(); ++l) {
this.pos = posIn; this.addSlotToContainer(new Slot(playerInventory, l, 8 + (l % 12) * 18, 30 + 3 * 18 + (l / 12) * 18));
this.craftSlots = size * size; }
this.craftMatrix = new InventoryCrafting(this, size, size); }
this.addSlotToContainer(new SlotCrafting(playerInventory, this.craftMatrix, this.craftResult, 0, 134, 17 + ((size - 1) * 18) / 2));
public int getTier() {
return this.block.getTier();
}
for (int i = 0; i < size; ++i) public boolean canInteractWith(EntityNPC playerIn) {
{ return this.worldObj.getState(this.pos).getBlock() != this.block ? false
for (int j = 0; j < size; ++j) : playerIn.getDistanceSq((double)this.pos.getX() + 0.5D, (double)this.pos.getY() + 0.5D, (double)this.pos.getZ() + 0.5D) <= 64.0D;
{ }
this.addSlotToContainer(new Slot(this.craftMatrix, j + i * size, 26 + j * 18, 17 + i * 18) {
public boolean canEditItem() {
return false;
}
});
}
}
for (int l = 0; l < playerInventory.getInventoryCapacity(); ++l) public ItemStack transferStackInSlot(EntityNPC playerIn, int index) {
{ return null;
this.addSlotToContainer(new Slot(playerInventory, l, 8 + (l % 12) * 18, 30 + size * 18 + (l / 12) * 18)); }
}
this.onCraftMatrixChanged(this.craftMatrix);
}
/**
* Callback for when the crafting matrix is changed.
*/
public void onCraftMatrixChanged(IInventory inventoryIn)
{
this.craftResult.setInventorySlotContents(0, CraftingRegistry.getMatching(this.craftMatrix));
}
/**
* Called when the container is closed.
*/
public void onContainerClosed(EntityNPC playerIn)
{
super.onContainerClosed(playerIn);
if (!this.worldObj.client)
{
for (int i = 0; i < this.craftSlots; ++i)
{
ItemStack itemstack = this.craftMatrix.removeStackFromSlot(i);
if (itemstack != null)
{
playerIn.dropItem(itemstack, false);
}
}
}
}
public boolean canInteractWith(EntityNPC playerIn)
{
return this.worldObj.getState(this.pos).getBlock() != this.block ? false : playerIn.getDistanceSq((double)this.pos.getX() + 0.5D, (double)this.pos.getY() + 0.5D, (double)this.pos.getZ() + 0.5D) <= 64.0D;
}
/**
* Take a stack from the specified inventory slot.
*/
public ItemStack transferStackInSlot(EntityNPC playerIn, int index)
{
ItemStack itemstack = null;
Slot slot = this.inventorySlots.get(index);
if (slot != null && slot.getHasStack())
{
ItemStack itemstack1 = slot.getStack();
itemstack = itemstack1.copy();
if (index == 0)
{
if (!this.mergeItemStack(itemstack1, this.craftSlots + 1, this.craftSlots + 37, true))
{
return null;
}
slot.onSlotChange(itemstack1, itemstack);
}
else if (index >= this.craftSlots + 1 && index < this.craftSlots + 28)
{
if (!this.mergeItemStack(itemstack1, this.craftSlots + 28, this.craftSlots + 37, false))
{
return null;
}
}
else if (index >= this.craftSlots + 28 && index < this.craftSlots + 37)
{
if (!this.mergeItemStack(itemstack1, this.craftSlots + 1, this.craftSlots + 28, false))
{
return null;
}
}
else if (!this.mergeItemStack(itemstack1, this.craftSlots + 1, this.craftSlots + 37, false))
{
return null;
}
if (itemstack1.isEmpty())
{
slot.putStack((ItemStack)null);
}
else
{
slot.onSlotChanged();
}
if (itemstack1.getSize() == itemstack.getSize())
{
return null;
}
slot.onPickupFromSlot(playerIn, itemstack1);
}
return itemstack;
}
/**
* Called to determine if the current slot is valid for the stack merging (double-click) code. The stack passed in
* is null for the initial slot that was double-clicked.
*/
public boolean canMergeSlot(ItemStack stack, Slot slotIn)
{
return slotIn.inventory != this.craftResult && super.canMergeSlot(stack, slotIn);
}
} }

View file

@ -1,128 +0,0 @@
package common.inventory;
import common.item.ItemStack;
public class InventoryCrafting implements IInventory
{
/** List of the stacks in the crafting matrix. */
private final ItemStack[] stackList;
/** the width of the crafting inventory */
private final int inventoryWidth;
private final int inventoryHeight;
/**
* Class containing the callbacks for the events on_GUIClosed and on_CraftMaxtrixChanged.
*/
private final Container eventHandler;
public InventoryCrafting(Container eventHandlerIn, int width, int height)
{
int i = width * height;
this.stackList = new ItemStack[i];
this.eventHandler = eventHandlerIn;
this.inventoryWidth = width;
this.inventoryHeight = height;
}
/**
* Returns the number of slots in the inventory.
*/
public int getSizeInventory()
{
return this.stackList.length;
}
/**
* Returns the stack in the given slot.
*/
public ItemStack getStackInSlot(int index)
{
return index >= this.getSizeInventory() ? null : this.stackList[index];
}
/**
* Returns the itemstack in the slot specified (Top left is 0, 0). Args: row, column
*/
public ItemStack getStackInRowAndColumn(int row, int column)
{
return row >= 0 && row < this.inventoryWidth && column >= 0 && column <= this.inventoryHeight ? this.getStackInSlot(row + column * this.inventoryWidth) : null;
}
/**
* Removes a stack from the given slot and returns it.
*/
public ItemStack removeStackFromSlot(int index)
{
if (this.stackList[index] != null)
{
ItemStack itemstack = this.stackList[index];
this.stackList[index] = null;
return itemstack;
}
else
{
return null;
}
}
/**
* Removes up to a specified number of items from an inventory slot and returns them in a new stack.
*/
public ItemStack decrStackSize(int index, int count)
{
if (this.stackList[index] != null)
{
if (this.stackList[index].getSize() <= count)
{
ItemStack itemstack1 = this.stackList[index];
this.stackList[index] = null;
this.eventHandler.onCraftMatrixChanged(this);
return itemstack1;
}
else
{
ItemStack itemstack = this.stackList[index].split(count);
if (this.stackList[index].isEmpty())
{
this.stackList[index] = null;
}
this.eventHandler.onCraftMatrixChanged(this);
return itemstack;
}
}
else
{
return null;
}
}
/**
* Sets the given item stack to the specified slot in the inventory (can be crafting or armor sections).
*/
public void setInventorySlotContents(int index, ItemStack stack)
{
this.stackList[index] = stack;
this.eventHandler.onCraftMatrixChanged(this);
}
public void clear()
{
for (int i = 0; i < this.stackList.length; ++i)
{
this.stackList[i] = null;
}
}
public int getHeight()
{
return this.inventoryHeight;
}
public int getWidth()
{
return this.inventoryWidth;
}
}

View file

@ -1,79 +0,0 @@
package common.inventory;
import common.entity.npc.EntityNPC;
import common.init.CraftingRegistry;
import common.item.ItemStack;
public class SlotCrafting extends Slot
{
private final InventoryCrafting craftMatrix;
private final EntityNPC thePlayer;
public static void handleRemaining(InventoryCrafting craftMatrix, EntityNPC thePlayer) {
ItemStack[] aitemstack = CraftingRegistry.getRemaining(craftMatrix);
for (int i = 0; i < aitemstack.length; ++i)
{
ItemStack itemstack = craftMatrix.getStackInSlot(i);
ItemStack itemstack1 = aitemstack[i];
if (itemstack != null)
{
craftMatrix.decrStackSize(i, 1);
}
if (itemstack1 != null)
{
if (craftMatrix.getStackInSlot(i) == null)
{
craftMatrix.setInventorySlotContents(i, itemstack1);
}
else if (!thePlayer.addItemStackToInventory(itemstack1))
{
thePlayer.dropItem(itemstack1, false);
}
}
}
}
public SlotCrafting(EntityNPC player, InventoryCrafting craftingInventory, IInventory p_i45790_3_, int slotIndex, int xPosition, int yPosition)
{
super(p_i45790_3_, slotIndex, xPosition, yPosition);
this.thePlayer = player;
this.craftMatrix = craftingInventory;
}
/**
* Check if the stack is a valid item for this slot. Always true beside for the armor slots.
*/
public boolean isItemValid(ItemStack stack)
{
return false;
}
/**
* the itemStack passed in is the output - ie, iron ingots, and pickaxes, not ore and wood. Typically increases an
* internal count then calls onCrafting(item).
*/
protected void onCrafting(ItemStack stack, int amount)
{
this.onCrafting(stack);
}
/**
* the itemStack passed in is the output - ie, iron ingots, and pickaxes, not ore and wood.
*/
protected void onCrafting(ItemStack stack)
{
}
public void onPickupFromSlot(EntityNPC playerIn, ItemStack stack)
{
this.onCrafting(stack);
handleRemaining(this.craftMatrix, this.thePlayer);
}
public boolean canCheatItem() {
return false;
}
}

View file

@ -45,9 +45,46 @@ public class CPacketAction implements Packet<IPlayer> {
} }
public static enum Action { public static enum Action {
OPEN_EDITOR, CLOSE_EDITOR, CANCEL_EDITOR, SELECT_CHARACTER, DELETE_CHARACTER, SWING_ARM, SET_ITEMSLOT, START_SNEAKING, STOP_SNEAKING, OPEN_EDITOR,
START_SPRINTING, STOP_SPRINTING, START_HOVER, STOP_HOVER, RIDING_JUMP, OPEN_INVENTORY, START_FLYING, STOP_FLYING, PERFORM_RESPAWN, SET_HEIGHT, CLOSE_EDITOR,
SET_SPECIES, SET_CLASS, SELECT_TRADE, INTERACT, ATTACK, CLOSE_CONTAINER, CONFIRM_TRANSACTION, ENCHANT_ITEM, SET_ALIGN, ITEM_ACTION, GOD, CANCEL_EDITOR,
NOCLIP, SPEED, HEAL, REPAIR, PERF, MAGNET, WARP_MODE, START_PROFILING, STOP_PROFILING, CRAFT_ITEM; SELECT_CHARACTER,
DELETE_CHARACTER,
SWING_ARM,
SET_ITEMSLOT,
START_SNEAKING,
STOP_SNEAKING,
START_SPRINTING,
STOP_SPRINTING,
START_HOVER,
STOP_HOVER,
RIDING_JUMP,
OPEN_INVENTORY,
START_FLYING,
STOP_FLYING,
PERFORM_RESPAWN,
SET_HEIGHT,
SET_SPECIES,
SET_CLASS,
SELECT_TRADE,
INTERACT,
ATTACK,
CLOSE_CONTAINER,
CONFIRM_TRANSACTION,
ENCHANT_ITEM,
SET_ALIGN,
ITEM_ACTION,
GOD,
NOCLIP,
SPEED,
HEAL,
REPAIR,
PERF,
MAGNET,
WARP_MODE,
START_PROFILING,
STOP_PROFILING,
CRAFT_SINGLE,
CRAFT_ITEM;
} }
} }

View file

@ -7,17 +7,17 @@ import common.entity.types.EntityLiving;
import common.init.ToolMaterial; import common.init.ToolMaterial;
public enum Equipment implements Identifyable, Displayable { public enum Equipment implements Identifyable, Displayable {
PICKAXE("pickaxe", "Spitzhacke", ItemType.HARVEST_LEVELLED, 2, "XXX", " # ", " # "), PICKAXE("pickaxe", "Spitzhacke", ItemType.HARVEST_LEVELLED, 2, 3, 2),
AXE("axe", "Axt", ItemType.HARVEST_BASIC, 3, "XX", "X#", " #"), AXE("axe", "Axt", ItemType.HARVEST_BASIC, 3, 3, 2),
SHOVEL("shovel", "Schaufel", ItemType.HARVEST_BASIC, 1, "X", "#", "#"), SHOVEL("shovel", "Schaufel", ItemType.HARVEST_BASIC, 1, 1, 2),
SHEARS("shears", "Schere", ItemType.HARVEST_OPTIONAL, " X", "X "), SHEARS("shears", "Schere", ItemType.HARVEST_OPTIONAL, 2, 0),
SWORD("sword", "Schwert", ItemType.MELEE_WEAPON, 4, "X", "X", "#"), SWORD("sword", "Schwert", ItemType.MELEE_WEAPON, 4, 2, 1),
HELMET("helmet", "Helm", "Kappe", 11, 0, EnchantmentType.ARMOR_HEAD, 1.0f, 1.0f, "XXX", "X X"), HELMET("helmet", "Helm", "Kappe", 11, 0, EnchantmentType.ARMOR_HEAD, 1.0f, 1.0f, 5, 0),
CHESTPLATE("chestplate", "Brustpanzer", "Jacke", 16, 1, EnchantmentType.ARMOR_TORSO, 1.7f, 1.2f, "X X", "XXX", "XXX"), CHESTPLATE("chestplate", "Brustpanzer", "Jacke", 16, 1, EnchantmentType.ARMOR_TORSO, 1.7f, 1.2f, 8, 0),
LEGGINGS("leggings", "Beinschutz", "Hose", 15, 2, EnchantmentType.ARMOR_LEGS, 1.6f, 1.1f, "XXX", "X X", "X X"), LEGGINGS("leggings", "Beinschutz", "Hose", 15, 2, EnchantmentType.ARMOR_LEGS, 1.6f, 1.1f, 7, 0),
BOOTS("boots", "Stiefel", "Stiefel", 13, 3, EnchantmentType.ARMOR_FEET, 1.4f, 1.0f, "X X", "X X"), BOOTS("boots", "Stiefel", "Stiefel", 13, 3, EnchantmentType.ARMOR_FEET, 1.4f, 1.0f, 4, 0),
CROWN("crown", "Krone", 0, 4, null, 0.3f, 1.0f), CROWN("crown", "Krone", 0, 4, null, 0.3f, 1.0f),
RING_LEFT_A("ring_left_a", "Linker Ring 1", 0, 5, EnchantmentType.RING, 1.0f), RING_LEFT_A("ring_left_a", "Linker Ring 1", 0, 5, EnchantmentType.RING, 1.0f),
@ -28,7 +28,7 @@ public enum Equipment implements Identifyable, Displayable {
RING_RIGHT_B("ring_right_b", "Rechter Ring 2", 0, 10, EnchantmentType.RING, 1.0f), RING_RIGHT_B("ring_right_b", "Rechter Ring 2", 0, 10, EnchantmentType.RING, 1.0f),
BELT("belt", "Gürtel", 0, 11, null, 1.0f), BELT("belt", "Gürtel", 0, 11, null, 1.0f),
HORSE_ARMOR("horse_armor", "Pferderüstung", EntityHorse.class, "X X", "XXX", "XXX"); HORSE_ARMOR("horse_armor", "Pferderüstung", EntityHorse.class, 8, 0);
public static final int ARMOR_SLOTS; public static final int ARMOR_SLOTS;
public static final Equipment[] ARMOR; public static final Equipment[] ARMOR;
@ -36,7 +36,8 @@ public enum Equipment implements Identifyable, Displayable {
private final String name; private final String name;
private final String display; private final String display;
private final String altDisplay; private final String altDisplay;
private final String[] recipe; private final int recipeItems;
private final int recipeSticks;
private final ItemType type; private final ItemType type;
private final int damage; private final int damage;
private final int index; private final int index;
@ -59,13 +60,14 @@ public enum Equipment implements Identifyable, Displayable {
} }
} }
private Equipment(String name, String display, String alt, ItemType type, int dmg, int index, EnchantmentType ench, float phy, float mag, Class<? extends EntityLiving> clazz, String... recipe) { private Equipment(String name, String display, String alt, ItemType type, int dmg, int index, EnchantmentType ench, float phy, float mag, Class<? extends EntityLiving> clazz, int items, int sticks) {
this.name = name; this.name = name;
this.display = display; this.display = display;
this.altDisplay = alt; this.altDisplay = alt;
this.type = type; this.type = type;
this.damage = dmg; this.damage = dmg;
this.recipe = recipe; this.recipeItems = items;
this.recipeSticks = sticks;
this.index = index; this.index = index;
this.phyResist = phy; this.phyResist = phy;
this.magicResist = mag; this.magicResist = mag;
@ -73,28 +75,28 @@ public enum Equipment implements Identifyable, Displayable {
this.animalType = clazz; this.animalType = clazz;
} }
private Equipment(String name, String display, ItemType type, int damage, String... recipe) { private Equipment(String name, String display, ItemType type, int damage, int items, int sticks) {
this(name, display, null, type, damage, -1, null, 0.0f, 0.0f, null, recipe); this(name, display, null, type, damage, -1, null, 0.0f, 0.0f, null, items, sticks);
} }
private Equipment(String name, String display, ItemType type, String... recipe) { private Equipment(String name, String display, ItemType type, int items, int sticks) {
this(name, display, type, -1, recipe); this(name, display, type, -1, items, sticks);
} }
private Equipment(String name, String display, Class<? extends EntityLiving> clazz, String... recipe) { private Equipment(String name, String display, Class<? extends EntityLiving> clazz, int items, int sticks) {
this(name, display, null, ItemType.ANIMAL_ARMOR, -1, -1, null, 0.0f, 0.0f, clazz, recipe); this(name, display, null, ItemType.ANIMAL_ARMOR, -1, -1, null, 0.0f, 0.0f, clazz, items, sticks);
} }
private Equipment(String name, String display, String altDisplay, int damage, int index, EnchantmentType ench, float phy, float mag, String... recipe) { private Equipment(String name, String display, String altDisplay, int damage, int index, EnchantmentType ench, float phy, float mag, int items, int sticks) {
this(name, display, altDisplay, ItemType.MAIN_ARMOR, damage, index, ench, phy, mag, null, recipe); this(name, display, altDisplay, ItemType.MAIN_ARMOR, damage, index, ench, phy, mag, null, items, sticks);
} }
private Equipment(String name, String display, int damage, int index, EnchantmentType ench, float mag) { private Equipment(String name, String display, int damage, int index, EnchantmentType ench, float mag) {
this(name, display, null, ItemType.ACCESSORY, damage, index, ench, 0.0f, mag, null); this(name, display, null, ItemType.ACCESSORY, damage, index, ench, 0.0f, mag, null, 0, 0);
} }
private Equipment(String name, String display, int damage, int index, EnchantmentType ench, float phy, float mag) { private Equipment(String name, String display, int damage, int index, EnchantmentType ench, float phy, float mag) {
this(name, display, null, ItemType.RENDERED_ACCESSORY, damage, index, ench, phy, mag, null); this(name, display, null, ItemType.RENDERED_ACCESSORY, damage, index, ench, phy, mag, null, 0, 0);
} }
public String toString() { public String toString() {
@ -162,8 +164,12 @@ public enum Equipment implements Identifyable, Displayable {
return this.damage; return this.damage;
} }
public String[] getRecipe() { public int getRecipeItems() {
return this.recipe; return this.recipeItems;
}
public int getRecipeSticks() {
return this.recipeSticks;
} }
public int getIndex() { public int getIndex() {

View file

@ -32,6 +32,7 @@ import common.entity.projectile.EntityArrow;
import common.entity.types.EntityLiving; import common.entity.types.EntityLiving;
import common.init.BlockRegistry; import common.init.BlockRegistry;
import common.init.Blocks; import common.init.Blocks;
import common.init.CraftingRegistry;
import common.init.EntityRegistry; import common.init.EntityRegistry;
import common.init.Items; import common.init.Items;
import common.init.SoundEvent; import common.init.SoundEvent;
@ -41,10 +42,10 @@ import common.inventory.ContainerEnchantment;
import common.inventory.ContainerEntityInventory; import common.inventory.ContainerEntityInventory;
import common.inventory.ContainerMerchant; import common.inventory.ContainerMerchant;
import common.inventory.ContainerTile; import common.inventory.ContainerTile;
import common.inventory.ContainerWorkbench;
import common.inventory.IInventory; import common.inventory.IInventory;
import common.inventory.InventoryBasic; import common.inventory.InventoryBasic;
import common.inventory.Slot; import common.inventory.Slot;
import common.inventory.SlotCrafting;
import common.item.Item; import common.item.Item;
import common.item.ItemControl; import common.item.ItemControl;
import common.item.ItemStack; import common.item.ItemStack;
@ -836,12 +837,9 @@ public class Player extends User implements Executor, IPlayer
public void sendSlot(Container container, int index, ItemStack stack) public void sendSlot(Container container, int index, ItemStack stack)
{ {
if (!(container.getSlot(index) instanceof SlotCrafting)) if (!this.isChangingQuantityOnly)
{ {
if (!this.isChangingQuantityOnly) this.sendPacket(new SPacketSetSlot(container.windowId, index, stack));
{
this.sendPacket(new SPacketSetSlot(container.windowId, index, stack));
}
} }
} }
@ -1948,7 +1946,7 @@ public class Player extends User implements Executor, IPlayer
if(msg.length() > 30) if(msg.length() > 30)
throw new IllegalArgumentException("Ungültiger Name"); throw new IllegalArgumentException("Ungültiger Name");
if(packetIn.getArg() == -1) if(packetIn.getArg() == -1)
this.entity.inventoryContainer.renameItem(5 + Equipment.ARMOR_SLOTS + this.entity.getSelectedIndex(), msg); this.entity.inventoryContainer.renameItem(Equipment.ARMOR_SLOTS + this.entity.getSelectedIndex(), msg);
else else
this.entity.openContainer.renameItem(packetIn.getArg(), msg); this.entity.openContainer.renameItem(packetIn.getArg(), msg);
this.entity.openContainer.detectAndSendChanges(); this.entity.openContainer.detectAndSendChanges();
@ -2803,7 +2801,7 @@ public class Player extends User implements Executor, IPlayer
this.profiling = false; this.profiling = false;
break; break;
case CRAFT_ITEM: { case CRAFT_SINGLE: {
if(this.entity.getMouseItem() == null) { if(this.entity.getMouseItem() == null) {
Slot slot = this.entity.openContainer.getSlot(packetIn.getAuxData()); Slot slot = this.entity.openContainer.getSlot(packetIn.getAuxData());
if(slot != null && slot.canCheatItem() && slot.getHasStack()) { if(slot != null && slot.canCheatItem() && slot.getHasStack()) {
@ -2818,6 +2816,13 @@ public class Player extends User implements Executor, IPlayer
} }
break; break;
} }
case CRAFT_ITEM: {
int tier = this.entity.openContainer == this.entity.inventoryContainer ? 0 : (this.entity.openContainer instanceof ContainerWorkbench bench ? bench.getTier() : -1);
if(tier >= 0)
CraftingRegistry.doCrafting(this.entity, tier, packetIn.getAuxData());
break;
}
default: default:
throw new IllegalArgumentException("Ungültige Aktion!"); throw new IllegalArgumentException("Ungültige Aktion!");
@ -2889,7 +2894,7 @@ public class Player extends User implements Executor, IPlayer
Item item = packet.getItem(); Item item = packet.getItem();
if(item == null) if(item == null)
return; return;
ItemStack stack = new ItemStack(item, packet.isStacked() ? item.getMaxAmount() : 1); ItemStack stack = new ItemStack(item, packet.isStacked() ? Math.min(item.getMaxAmount(), 100) : 1);
int amount = stack.getSize(); int amount = stack.getSize();
if(amount <= 0) if(amount <= 0)
return; return;
@ -2903,7 +2908,7 @@ public class Player extends User implements Executor, IPlayer
this.entity.dropItem(stack, false, true); this.entity.dropItem(stack, false, true);
} }
else { else {
Slot slot = packet.getSlot() < 0 ? this.entity.inventoryContainer.getSlot(5 + Equipment.ARMOR_SLOTS + -2 - packet.getSlot()) : this.entity.openContainer.getSlot(packet.getSlot()); Slot slot = packet.getSlot() < 0 ? this.entity.inventoryContainer.getSlot(Equipment.ARMOR_SLOTS + -2 - packet.getSlot()) : this.entity.openContainer.getSlot(packet.getSlot());
if(slot == null || !slot.canCheatItem()) if(slot == null || !slot.canCheatItem())
return; return;
stack.setSize(Math.min(slot.getItemStackLimit(stack), stack.getSize())); stack.setSize(Math.min(slot.getItemStackLimit(stack), stack.getSize()));