Skip to content

Commit

Permalink
Made different parts cost different amount of materials + added bone …
Browse files Browse the repository at this point in the history
…material stats
  • Loading branch information
kill05 committed Jun 15, 2024
1 parent 6db6fc8 commit 7ca3e34
Show file tree
Hide file tree
Showing 7 changed files with 158 additions and 101 deletions.
25 changes: 16 additions & 9 deletions src/main/java/com/github/kill05/ArchitectTools.java
Original file line number Diff line number Diff line change
Expand Up @@ -10,6 +10,7 @@
import com.github.kill05.items.tool.ArchitectTool;
import com.github.kill05.items.tool.ToolPartInfo;
import com.github.kill05.materials.ArchitectMaterial;
import com.github.kill05.materials.MaterialInfo;
import com.github.kill05.utils.ClassUtils;
import com.github.kill05.utils.ItemUtils;
import com.mojang.nbt.ListTag;
Expand Down Expand Up @@ -62,7 +63,6 @@ public final class ArchitectTools implements ModInitializer, RecipeEntrypoint, C
public static final RecipeGroup<RecipeEntryCrafting<?, ?>> RECIPE_WORKBENCH = new RecipeGroup<>(new RecipeSymbol(new ItemStack(Block.workbench)));



// Items and Blocks
public static final Item BLANK_PATTERN = item("blank_pattern", "blank_pattern");

Expand Down Expand Up @@ -93,19 +93,20 @@ public static Item item(String name, String texture) {
return ArchitectMaterial.MATERIAL_REGISTRY.getItem(id);
}

public static @Nullable ArchitectMaterial getMaterial(@Nullable ItemStack item) {
if (item == null) return null;
public static @NotNull MaterialInfo getMaterialInfo(@Nullable ItemStack item) {
if (item == null) return new MaterialInfo(null, 0);
for (ArchitectMaterial material : ArchitectMaterial.MATERIAL_REGISTRY) {
if (material.isThisMaterial(item)) return material;
Integer value = material.getMaterialValue(item);
if (value != null) return new MaterialInfo(material, value);
}

return null;
return new MaterialInfo(null, 0);
}


// Tool Parts
public static @NotNull ItemStack createPartStack(@NotNull ArchitectMaterial material, ArchitectPart part) throws ArchitectItemException {
if(!material.isValidPart(part))
if (!material.isValidPart(part))
throw new ArchitectItemException(String.format("Part '%s' can't be made out of material '%s'", part.getPartId(), material.id()));

ItemStack item = new ItemStack(part);
Expand All @@ -120,9 +121,10 @@ public static Item item(String name, String texture) {
}

public static @NotNull ItemStack createPartStack(@NotNull ItemStack materialItem, @NotNull ArchitectPart part) throws InvalidMaterialException, ArchitectItemException {
ArchitectMaterial material = getMaterial(materialItem);
if (material == null) throw new InvalidMaterialException("Invalid material: " + materialItem);
return createPartStack(material, part);
MaterialInfo info = getMaterialInfo(materialItem);
if (info.material() == null) throw new InvalidMaterialException("Invalid material: " + materialItem);
if (info.value() * materialItem.stackSize < part.getMaterialCost()) throw new InvalidMaterialException("Not enough material.");
return createPartStack(info.material(), part);
}

public static @Nullable ArchitectMaterial getPartMaterial(@NotNull ItemStack item) {
Expand Down Expand Up @@ -316,6 +318,11 @@ public void afterClientStart() {

@Override
public void onRecipesReady() {
ArchitectMaterial.lock();
for (ArchitectMaterial material : ArchitectMaterial.MATERIAL_REGISTRY) {
material.initGroups();
}

RecipeBuilder.Shaped(MOD_ID, "xo", "ox")
.addInput('x', Item.stick)
.addInput('o', "minecraft:planks")
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -43,7 +43,7 @@ public List<Integer> getTargetSlots(InventoryAction inventoryAction, Slot slot,
return List.of(0);
}

if(ArchitectTools.getMaterial(slot.getStack()) != null) {
if(ArchitectTools.getMaterialInfo(slot.getStack()).material() != null) {
return List.of(1);
}

Expand Down
Original file line number Diff line number Diff line change
@@ -1,14 +1,20 @@
package com.github.kill05.blocks.architectstation.part;

import com.github.kill05.ArchitectTools;
import com.github.kill05.blocks.architectstation.ArchitectTableButton;
import com.github.kill05.blocks.architectstation.ArchitectTableTileEntity;
import com.github.kill05.blocks.architectstation.ChangePageButton;
import com.github.kill05.blocks.architectstation.tool.ToolModeGui;
import com.github.kill05.inventory.container.TileContainer;
import com.github.kill05.inventory.gui.TileContainerGui;
import com.github.kill05.items.part.ArchitectPart;
import com.github.kill05.materials.ArchitectMaterial;
import com.github.kill05.materials.MaterialInfo;
import com.github.kill05.utils.RenderUtils;
import net.minecraft.client.Minecraft;
import net.minecraft.client.render.FontRenderer;
import net.minecraft.core.entity.player.EntityPlayer;
import net.minecraft.core.item.ItemStack;
import net.minecraft.core.player.inventory.IInventory;
import org.lwjgl.opengl.GL11;

Expand Down Expand Up @@ -63,4 +69,18 @@ protected void drawGuiContainerBackgroundLayer(float f) {
}
}
}

@Override
protected void drawGuiContainerForegroundLayer() {
FontRenderer fontRenderer = Minecraft.getMinecraft(this).fontRenderer;
ArchitectTableTileEntity tile = ((ArchitectTableTileEntity) getContainer().getTile());
IInventory inv = tile.getPartInventory();
ItemStack materialStack = inv.getStackInSlot(1);

ArchitectPart part = tile.getSelectedPart();
MaterialInfo info = ArchitectTools.getMaterialInfo(materialStack);
float amount = ArchitectMaterial.getDisplayMaterialValue(info.value() * (materialStack != null ? materialStack.stackSize : 0));
float materialCost = part != null ? ArchitectMaterial.getDisplayMaterialValue(part.getMaterialCost()) : 0;
fontRenderer.drawCenteredString(amount + "/" + materialCost, 151, 83, materialCost > amount ? 0x00c00000 : 0x0000c000);
}
}
Original file line number Diff line number Diff line change
Expand Up @@ -4,63 +4,45 @@
import com.github.kill05.blocks.architectstation.ArchitectTableTileEntity;
import com.github.kill05.exceptions.ArchitectItemException;
import com.github.kill05.exceptions.InvalidMaterialException;
import com.github.kill05.inventory.OutputInventory;
import com.github.kill05.inventory.slot.OutputSlot;
import com.github.kill05.items.part.ArchitectPart;
import com.github.kill05.materials.MaterialInfo;
import com.github.kill05.utils.ItemUtils;
import net.minecraft.core.item.ItemStack;
import net.minecraft.core.player.inventory.IInventory;
import net.minecraft.core.player.inventory.slot.Slot;
import org.jetbrains.annotations.Nullable;

public class PartModeOutputSlot extends Slot {
public class PartModeOutputSlot extends OutputSlot {

private final IInventory inv;
private final ArchitectTableTileEntity tile;

public PartModeOutputSlot(ArchitectTableTileEntity tile) {
super(new OutputSlotInventory(tile), 0, 0, 0);
this.inv = tile.getPartInventory();
super(0, 0);
this.tile = tile;
}

@Override
public boolean canPutStackInSlot(ItemStack itemstack) {
return false;
}

@Override
public boolean allowItemInteraction() {
return false;
}
public void onPickupFromSlot(ItemStack itemStack) {
// Remove 1 pattern
IInventory inv = tile.getPartInventory();
inv.decrStackSize(0, 1);

@Override
public boolean enableDragAndPickup() {
return false;
// 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 void onPickupFromSlot(ItemStack itemstack) {
inv.decrStackSize(0, 1);
inv.decrStackSize(1, 1);
}


private static class OutputSlotInventory extends OutputInventory {

private final ArchitectTableTileEntity tile;

private OutputSlotInventory(ArchitectTableTileEntity tile) {
this.tile = tile;
}

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

try {
ItemStack materialItem = tile.getPartInventory().getStackInSlot(1);
return ArchitectTools.createPartStack(materialItem, tile.getSelectedPart());
} catch (InvalidMaterialException | ArchitectItemException e) {
return null;
}
public @Nullable ItemStack getOutput() {
if(tile.getSelectedPart() == null) return null;
if(!ItemUtils.compare(tile.getPartInventory().getStackInSlot(0), ArchitectTools.BLANK_PATTERN)) return null;

try {
ItemStack materialItem = tile.getPartInventory().getStackInSlot(1);
return ArchitectTools.createPartStack(materialItem, tile.getSelectedPart());
} catch (InvalidMaterialException | ArchitectItemException e) {
return null;
}
}
}
29 changes: 15 additions & 14 deletions src/main/java/com/github/kill05/items/part/ArchitectPart.java
Original file line number Diff line number Diff line change
Expand Up @@ -22,45 +22,43 @@ public class ArchitectPart extends Item implements ArchitectItem, ICustomDescrip

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

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

public static final ArchitectPart TOOL_BINDING = partItem("tool_binding", "part/binding")
public static final ArchitectPart TOOL_BINDING = partItem("tool_binding", "part/binding", 1)
.validTypes(PartType.EXTRA);

public static final ArchitectPart SWORD_GUARD = partItem("sword_guard", "part/wide_guard")
public static final ArchitectPart SWORD_GUARD = partItem("sword_guard", "part/wide_guard", 1)
.validTypes(PartType.EXTRA);

public static final ArchitectPart PICKAXE_HEAD = partItem("pickaxe_head", "pickaxe/head")
public static final ArchitectPart PICKAXE_HEAD = partItem("pickaxe_head", "pickaxe/head", 3)
.validTypes(PartType.HEAD);

public static final ArchitectPart AXE_HEAD = partItem("axe_head", "axe/head")
public static final ArchitectPart AXE_HEAD = partItem("axe_head", "axe/head", 2)
.validTypes(PartType.HEAD);

public static final ArchitectPart SHOVEL_HEAD = partItem("shovel_head", "shovel/head")
public static final ArchitectPart SHOVEL_HEAD = partItem("shovel_head", "shovel/head", 2)
.validTypes(PartType.HEAD);

public static final ArchitectPart SWORD_BLADE = partItem("sword_blade")
public static final ArchitectPart SWORD_BLADE = partItem("sword_blade", "part/sword_blade", 2)
.validTypes(PartType.HEAD);


public static ArchitectPart partItem(String id) {
return partItem(id, "part/" + id);
}

public static ArchitectPart partItem(String id, String texture) {
public static ArchitectPart partItem(String id, String texture, float materialCost) {
return new ItemBuilder(ArchitectTools.MOD_ID)
.setItemModel(item -> new ArchitectPartModel((ArchitectPart) item, texture))
.build(new ArchitectPart(id));
.build(new ArchitectPart(id, ArchitectMaterial.getActualMaterialValue(materialCost)));
}

private final String partId;
private final int ordinal;
private final int materialCost;
private final List<PartType> validTypes;

public ArchitectPart(String partId) {
public ArchitectPart(String partId, int materialCost) {
super(partId + "_part", ArchitectConfig.PART_ID++);
this.partId = partId;
this.materialCost = materialCost;
this.ordinal = VALUES.size();
this.validTypes = new ArrayList<>();

Expand Down Expand Up @@ -133,4 +131,7 @@ public int ordinal() {
return ordinal;
}

public int getMaterialCost() {
return materialCost;
}
}
Loading

0 comments on commit 7ca3e34

Please sign in to comment.