Skip to content

Commit

Permalink
Added Repair Kit and a crafting recipe with it to repair tools
Browse files Browse the repository at this point in the history
  • Loading branch information
kill05 committed Jun 17, 2024
1 parent 4625cf3 commit c2b722b
Show file tree
Hide file tree
Showing 10 changed files with 134 additions and 16 deletions.
17 changes: 8 additions & 9 deletions src/main/java/com/github/kill05/ArchitectTools.java
Original file line number Diff line number Diff line change
Expand Up @@ -11,6 +11,7 @@
import com.github.kill05.items.tool.ToolPartInfo;
import com.github.kill05.materials.ArchitectMaterial;
import com.github.kill05.materials.MaterialInfo;
import com.github.kill05.recipe.RecipeEntryRepairTool;
import com.github.kill05.utils.ClassUtils;
import com.github.kill05.utils.ItemUtils;
import com.mojang.nbt.ListTag;
Expand All @@ -29,7 +30,6 @@
import net.minecraft.core.item.Item;
import net.minecraft.core.item.ItemStack;
import net.minecraft.core.sound.BlockSounds;
import org.apache.commons.lang3.tuple.Pair;
import org.jetbrains.annotations.NotNull;
import org.jetbrains.annotations.Nullable;
import org.slf4j.Logger;
Expand All @@ -42,10 +42,7 @@
import java.net.URI;
import java.net.URISyntaxException;
import java.nio.file.*;
import java.util.ArrayList;
import java.util.Collections;
import java.util.Iterator;
import java.util.List;
import java.util.*;
import java.util.function.BiConsumer;
import java.util.stream.Stream;

Expand Down Expand Up @@ -206,17 +203,17 @@ public static void setToolPart(@NotNull ItemStack item, @NotNull PartType part,
return getMaterial(materialTag.getValue());
}

public static List<Pair<@NotNull ToolPartInfo, @Nullable ArchitectMaterial>> getToolParts(@NotNull ItemStack item, @Nullable PartType type) {
public static Map<@NotNull ToolPartInfo, @Nullable ArchitectMaterial> getToolParts(@NotNull ItemStack item, @Nullable PartType type) {
if (!(item.getItem() instanceof ArchitectTool tool))
throw new ArchitectItemException("Item is not an ArchitectTool.");

ArrayList<Pair<ToolPartInfo, ArchitectMaterial>> list = new ArrayList<>();
Map<ToolPartInfo, ArchitectMaterial> map = new LinkedHashMap<>();
for (ToolPartInfo info : tool.getPartList()) {
if (type != null && info.type() != type) continue;
list.add(Pair.of(info, getToolPart(item, info)));
map.put(info, getToolPart(item, info));
}

return list;
return map;
}

public static void iterateToolParts(@NotNull ItemStack item, boolean renderOrder, @NotNull BiConsumer<@NotNull ToolPartInfo, @Nullable ArchitectMaterial> consumer) {
Expand Down Expand Up @@ -343,6 +340,8 @@ public void onRecipesReady() {
.addInput('b', BLANK_PATTERN)
.addInput('w', Block.workbench)
.create("architect_table", ARCHITECT_TABLE_BLOCK.getDefaultStack());

Registries.RECIPES.addCustomRecipe(MOD_ID + ":workbench/repair_tool", new RecipeEntryRepairTool());
}

@Override
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -23,24 +23,28 @@ public PartModeOutputSlot(ArchitectTableTileEntity tile) {

@Override
public void onPickupFromSlot(ItemStack itemStack) {
// Remove 1 pattern
IInventory inv = tile.getPartInventory();
inv.decrStackSize(0, 1);
ArchitectPart part = tile.getSelectedPart();
if(part == null) return;

// Remove 1 pattern
if(part != ArchitectPart.REPAIR_KIT) inv.decrStackSize(0, 1);

// Remove the correct amount of material
MaterialInfo info = ArchitectTools.getMaterialInfo(inv.getStackInSlot(1));
ArchitectPart part = (ArchitectPart) itemStack.getItem();
inv.decrStackSize(1, part.getMaterialCost() / info.value());
}

@Override
public @Nullable ItemStack getOutput() {
if(tile.getSelectedPart() == null) return null;
if(!ItemUtils.compare(tile.getPartInventory().getStackInSlot(0), ArchitectTools.BLANK_PATTERN)) return null;
ArchitectPart part = tile.getSelectedPart();
ItemStack patternStack = tile.getPartInventory().getStackInSlot(0);
if(part == null) return null;
if(part != ArchitectPart.REPAIR_KIT && !ItemUtils.compare(patternStack, ArchitectTools.BLANK_PATTERN)) return null;

try {
ItemStack materialItem = tile.getPartInventory().getStackInSlot(1);
return ArchitectTools.createPartStack(materialItem, tile.getSelectedPart());
return ArchitectTools.createPartStack(materialItem, part);
} catch (InvalidMaterialException | ArchitectItemException e) {
return null;
}
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -23,6 +23,8 @@ public class ArchitectPart extends Item implements IArchitectItem, ICustomDescri

public static final List<ArchitectPart> VALUES = new ArrayList<>();

public static final ArchitectPart REPAIR_KIT = partItem("repair_kit", "part/repair_kit", 2);

public static final ArchitectPart TOOL_ROD = partItem("tool_rod", "part/tool_rod", 1)
.validTypes(PartType.HANDLE, PartType.EXTRA);

Expand Down Expand Up @@ -120,7 +122,7 @@ public String getDescription(ItemStack itemStack) {

@Override
public boolean renderPattern() {
return true;
return this != REPAIR_KIT;
}

@Override
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -216,6 +216,8 @@ public PartStatistics getExtraStatistics() {
}

public boolean isValidPart(ArchitectPart part) {
if(part == ArchitectPart.REPAIR_KIT) return true;

for (PartType type : part.getValidTypes()) {
if(getStatistics(type) != null) return true;
}
Expand Down
110 changes: 110 additions & 0 deletions src/main/java/com/github/kill05/recipe/RecipeEntryRepairTool.java
Original file line number Diff line number Diff line change
@@ -0,0 +1,110 @@
package com.github.kill05.recipe;

import com.github.kill05.ArchitectTools;
import com.github.kill05.items.part.ArchitectPart;
import com.github.kill05.items.part.PartType;
import com.github.kill05.items.tool.ArchitectTool;
import com.github.kill05.items.tool.ToolPartInfo;
import com.github.kill05.materials.ArchitectMaterial;
import net.minecraft.core.data.registry.recipe.SearchQuery;
import net.minecraft.core.data.registry.recipe.entry.RecipeEntryCraftingDynamic;
import net.minecraft.core.item.ItemStack;
import net.minecraft.core.player.inventory.InventoryCrafting;
import org.jetbrains.annotations.NotNull;
import org.jetbrains.annotations.Nullable;

import java.util.Map;

public class RecipeEntryRepairTool extends RecipeEntryCraftingDynamic {

@Override
public boolean matches(InventoryCrafting inv) {
ItemStack repairKit = getRepairKit(inv);
ItemStack tool = getTool(inv);

if(repairKit == null || tool == null) return false;
for(int i = 0; i < inv.getSizeInventory(); i++) {
ItemStack itemStack = inv.getStackInSlot(i);
if(itemStack != null && itemStack != tool && itemStack != repairKit) return false;
}

ArchitectMaterial kitMaterial = ArchitectTools.getPartMaterial(repairKit);
if(kitMaterial == null) return false;

for (Map.Entry<@NotNull ToolPartInfo, @Nullable ArchitectMaterial> entry : ArchitectTools.getToolParts(tool, PartType.HEAD).entrySet()) {
if(entry.getValue() == kitMaterial) return true;
}

return false;
}

@Override
public boolean matchesQuery(SearchQuery searchQuery) {
return false;
}

@Override
public ItemStack getCraftingResult(InventoryCrafting inv) {
ItemStack tool = getTool(inv);
if(tool == null) throw new AssertionError();

ItemStack itemStack = tool.copy();
itemStack.setMetadata(0);
return itemStack;
}

@Override
public int getRecipeSize() {
return 2;
}

@Override
public ItemStack[] onCraftResult(InventoryCrafting inv) {
ItemStack[] items = new ItemStack[inv.getSizeInventory()];

for(int i = 0; i < inv.getSizeInventory(); i++) {
ItemStack itemStack = inv.getStackInSlot(i);
if(itemStack == null) continue;

if(--itemStack.stackSize <= 0) {
inv.setInventorySlotContents(i, null);
}
}

return items;
}


private ItemStack getTool(InventoryCrafting inv) {
ItemStack tool = null;

for(int i = 0; i < inv.getSizeInventory(); i++) {
ItemStack itemStack = inv.getStackInSlot(i);
if(itemStack == null) continue;

if(itemStack.getItem() instanceof ArchitectTool) {
if(tool != null) return null;
tool = itemStack;
}
}

return tool;
}

private ItemStack getRepairKit(InventoryCrafting inv) {
ItemStack repairKit = null;

for(int i = 0; i < inv.getSizeInventory(); i++) {
ItemStack itemStack = inv.getStackInSlot(i);
if(itemStack == null) continue;

if(itemStack.getItem() == ArchitectPart.REPAIR_KIT) {
if(repairKit != null) return null;
repairKit = itemStack;
}
}

return repairKit;
}

}
1 change: 1 addition & 0 deletions src/main/resources/lang/architectstools/en_US.lang
Original file line number Diff line number Diff line change
@@ -1,6 +1,7 @@
# Items
item.architectstools.blank_pattern.name = Blank Pattern

item.architectstools.repair_kit.name = %s Repair Kit
item.architectstools.tool_rod.name = %s Tool Rod
item.architectstools.tool_binding.name = %s Tool Binding
item.architectstools.pickaxe_head.name = %s Pickaxe Head
Expand Down

0 comments on commit c2b722b

Please sign in to comment.