Skip to content

Commit

Permalink
Update smithing recipe registration (#2520)
Browse files Browse the repository at this point in the history
* Update Smithing recipes to support `SmithingTransformRecipe`s

Support for "SmithingTrimRecipes" coming soon

* Change creation of `NamespacedKey`

Also remove all trim related things. I just don't understand how this is supposed to work?? :(

* Check if `originalMeta` is `null`

* Change recipe classes back to the `NMS` ones.

* Optimize some import stuff.

* Change names and optimize ternary operator

* Accidentally renamed the wrong variables
  • Loading branch information
BreadcrumbIsTaken committed Aug 18, 2023
1 parent 185edd0 commit 95e7d5b
Show file tree
Hide file tree
Showing 7 changed files with 55 additions and 46 deletions.
Expand Up @@ -47,7 +47,7 @@ public abstract class ItemHelper {

public abstract ItemStack setNbtData(ItemStack itemStack, CompoundTag compoundTag);

public abstract void registerSmithingRecipe(String keyName, ItemStack result, ItemStack[] baseItem, boolean baseExact, ItemStack[] upgradeItem, boolean upgradeExact);
public abstract void registerSmithingRecipe(String keyName, ItemStack result, ItemStack[] baseItem, boolean baseExact, ItemStack[] upgradeItem, boolean upgradeExact, ItemStack[] templateItem, boolean templateExact);

public abstract void setInventoryItem(Inventory inventory, ItemStack item, int slot);

Expand Down
Expand Up @@ -176,7 +176,9 @@ public class ItemScriptContainer extends ScriptContainer {
// input: ItemTag
// 6:
// # Smithing recipes take one base item and one upgrade item.
// # In versions 1.20 and up, smithing recipes take one template item, one base item, and one upgrade item.
// type: smithing
// template: ItemTag
// base: ItemTag
// # Optionally, choose what values to retain, as a simple pipe-separated list of parts to retain.
// # If unspecified, no values will be retained.
Expand Down
@@ -1,6 +1,7 @@
package com.denizenscript.denizen.scripts.containers.core;

import com.denizenscript.denizen.Denizen;
import com.denizenscript.denizen.nms.NMSVersion;
import com.denizenscript.denizen.nms.util.jnbt.CompoundTag;
import com.denizenscript.denizen.objects.EntityTag;
import com.denizenscript.denizen.objects.MaterialTag;
Expand Down Expand Up @@ -238,27 +239,39 @@ public static void registerStonecuttingRecipe(ItemScriptContainer container, Ite
NMSHandler.itemHelper.registerStonecuttingRecipe(internalId, group, item, items, exact);
}

public static void registerSmithingRecipe(ItemScriptContainer container, ItemStack item, String baseItemString, String upgradeItemString, String internalId, String retain) {
public static void registerSmithingRecipe(ItemScriptContainer container, ItemStack item, String templateString, String baseString, String additionString, String internalId, String retain) {
ItemStack[] template = null;
boolean templateExact = true;
if (templateString != null) {
if (templateString.startsWith("material:")) {
templateExact = false;
templateString = templateString.substring("material:".length());
}
template = textToItemArray(container, templateString, templateExact);
if (template == null) {
return;
}
}
boolean baseExact = true;
if (baseItemString.startsWith("material:")) {
if (baseString.startsWith("material:")) {
baseExact = false;
baseItemString = baseItemString.substring("material:".length());
baseString = baseString.substring("material:".length());
}
ItemStack[] baseItems = textToItemArray(container, baseItemString, baseExact);
ItemStack[] baseItems = textToItemArray(container, baseString, baseExact);
if (baseItems == null) {
return;
}
boolean upgradeExact = true;
if (upgradeItemString.startsWith("material:")) {
upgradeExact = false;
upgradeItemString = upgradeItemString.substring("material:".length());
boolean additionExact = true;
if (additionString.startsWith("material:")) {
additionExact = false;
additionString = additionString.substring("material:".length());
}
ItemStack[] upgradeItems = textToItemArray(container, upgradeItemString, upgradeExact);
if (upgradeItems == null) {
ItemStack[] additionItems = textToItemArray(container, additionString, additionExact);
if (additionItems == null) {
return;
}
smithingRetain.put(internalId, retain == null ? new String[0] : CoreUtilities.split(CoreUtilities.toLowerCase(retain), '|').toArray(new String[0]));
NMSHandler.itemHelper.registerSmithingRecipe(internalId, item, baseItems, baseExact, upgradeItems, upgradeExact);
NMSHandler.itemHelper.registerSmithingRecipe(internalId, item, baseItems, baseExact, additionItems, additionExact, template, templateExact);
}

public static void registerBrewingRecipe(ItemScriptContainer container, ItemStack item, String inputItemString, String ingredientItemString, String internalId) {
Expand Down Expand Up @@ -309,19 +322,10 @@ public static void rebuildRecipes() {
item.setAmount(Integer.parseInt(getString.apply("output_quantity")));
}
switch (type) {
case "shaped":
registerShapedRecipe(container, item, subSection.getStringList("input"), internalId, group); // tagged in register code
break;
case "shapeless":
registerShapelessRecipe(container, item, getString.apply("input"), internalId, group, subSection.getString("category"));
break;
case "stonecutting":
registerStonecuttingRecipe(container, item, getString.apply("input"), internalId, group);
break;
case "furnace":
case "blast":
case "smoker":
case "campfire":
case "shaped" -> registerShapedRecipe(container, item, subSection.getStringList("input"), internalId, group); // tagged in register code
case "shapeless" -> registerShapelessRecipe(container, item, getString.apply("input"), internalId, group, subSection.getString("category"));
case "stonecutting" -> registerStonecuttingRecipe(container, item, getString.apply("input"), internalId, group);
case "furnace", "blast", "smoker", "campfire" -> {
float exp = 0;
int cookTime = 40;
if (subSection.contains("experience")) {
Expand All @@ -331,17 +335,19 @@ public static void rebuildRecipes() {
cookTime = DurationTag.valueOf(getString.apply("cook_time"), context).getTicksAsInt();
}
registerFurnaceRecipe(container, item, getString.apply("input"), exp, cookTime, type, internalId, group, subSection.getString("category"));
break;
case "smithing":
}
case "smithing" -> {
String retain = null;
if (subSection.contains("retain")) {
retain = getString.apply("retain");
}
registerSmithingRecipe(container, item, getString.apply("base"), getString.apply("upgrade"), internalId, retain);
break;
case "brewing":
registerBrewingRecipe(container, item, getString.apply("input"), getString.apply("ingredient"), internalId);
break;
String template = null;
if (NMSHandler.getVersion().isAtLeast(NMSVersion.v1_20)) {
template = getString.apply("template");
}
registerSmithingRecipe(container, item, template, getString.apply("base"), getString.apply("upgrade"), internalId, retain);
}
case "brewing" -> registerBrewingRecipe(container, item, getString.apply("input"), getString.apply("ingredient"), internalId);
}
}
}
Expand Down Expand Up @@ -628,7 +634,10 @@ public void onBrewingStandFuel(BrewingStandFuelEvent event) {

@EventHandler(priority = EventPriority.LOW)
public void onItemSmithing(PrepareSmithingEvent event) {
ItemStack inputItem = event.getInventory().getItem(0);
ItemStack inputItem = event.getInventory().getItem(NMSHandler.getVersion().isAtLeast(NMSVersion.v1_20) ? 1 : 0);
if (inputItem == null) {
return;
}
Recipe recipe = event.getInventory().getRecipe();
SmithingRecipe smithRecipe = (SmithingRecipe) recipe;
if (smithRecipe == null || !(smithRecipe.getKey().getNamespace().equals("denizen"))) {
Expand Down Expand Up @@ -668,7 +677,7 @@ public void onItemSmithing(PrepareSmithingEvent event) {
ItemMeta newMeta = got.getItemMeta();
for (String retainable : retain) {
switch (retainable) {
case "display":
case "display" -> {
if (originalMeta.hasDisplayName()) {
String originalName = NMSHandler.itemHelper.getDisplayName(new ItemTag(inputItem));
ItemScriptContainer origScript = getItemScriptContainer(inputItem);
Expand All @@ -677,14 +686,14 @@ public void onItemSmithing(PrepareSmithingEvent event) {
}
}
newMeta = got.getItemMeta();
break;
case "enchantments":
}
case "enchantments" -> {
if (originalMeta.hasEnchants()) {
for (Map.Entry<Enchantment, Integer> enchant : originalMeta.getEnchants().entrySet()) {
newMeta.addEnchant(enchant.getKey(), enchant.getValue(), true);
}
}
break;
}
}
}
got.setItemMeta(newMeta);
Expand Down
Expand Up @@ -150,7 +150,7 @@ public void registerStonecuttingRecipe(String keyName, String group, ItemStack r
}

@Override
public void registerSmithingRecipe(String keyName, ItemStack result, ItemStack[] baseItem, boolean baseExact, ItemStack[] upgradeItem, boolean upgradeExact) {
public void registerSmithingRecipe(String keyName, ItemStack result, ItemStack[] baseItem, boolean baseExact, ItemStack[] upgradeItem, boolean upgradeExact, ItemStack[] templateItem, boolean templateExact) {
ResourceLocation key = new ResourceLocation("denizen", keyName);
Ingredient baseItemRecipe = itemArrayToRecipe(baseItem, baseExact);
Ingredient upgradeItemRecipe = itemArrayToRecipe(upgradeItem, upgradeExact);
Expand Down
Expand Up @@ -166,7 +166,7 @@ public void registerStonecuttingRecipe(String keyName, String group, ItemStack r
}

@Override
public void registerSmithingRecipe(String keyName, ItemStack result, ItemStack[] baseItem, boolean baseExact, ItemStack[] upgradeItem, boolean upgradeExact) {
public void registerSmithingRecipe(String keyName, ItemStack result, ItemStack[] baseItem, boolean baseExact, ItemStack[] upgradeItem, boolean upgradeExact, ItemStack[] templateItem, boolean templateExact) {
ResourceLocation key = new ResourceLocation("denizen", keyName);
Ingredient baseItemRecipe = itemArrayToRecipe(baseItem, baseExact);
Ingredient upgradeItemRecipe = itemArrayToRecipe(upgradeItem, upgradeExact);
Expand Down
Expand Up @@ -168,11 +168,11 @@ public void registerStonecuttingRecipe(String keyName, String group, ItemStack r
}

@Override
public void registerSmithingRecipe(String keyName, ItemStack result, ItemStack[] baseItem, boolean baseExact, ItemStack[] upgradeItem, boolean upgradeExact) {
public void registerSmithingRecipe(String keyName, ItemStack result, ItemStack[] baseItem, boolean baseExact, ItemStack[] upgradeItem, boolean upgradeExact, ItemStack[] templateItem, boolean templateExact) {
ResourceLocation key = new ResourceLocation("denizen", keyName);
Ingredient baseItemRecipe = itemArrayToRecipe(baseItem, baseExact);
Ingredient upgradeItemRecipe = itemArrayToRecipe(upgradeItem, upgradeExact);
LegacyUpgradeRecipe recipe = new LegacyUpgradeRecipe(key, baseItemRecipe, upgradeItemRecipe, CraftItemStack.asNMSCopy(result)); // TODO: 1.19.4: smithing system was changed
LegacyUpgradeRecipe recipe = new LegacyUpgradeRecipe(key, baseItemRecipe, upgradeItemRecipe, CraftItemStack.asNMSCopy(result));
((CraftServer) Bukkit.getServer()).getServer().getRecipeManager().addRecipe(recipe);
}

Expand Down
Expand Up @@ -169,15 +169,13 @@ public void registerStonecuttingRecipe(String keyName, String group, ItemStack r
}

@Override
public void registerSmithingRecipe(String keyName, ItemStack result, ItemStack[] baseItem, boolean baseExact, ItemStack[] upgradeItem, boolean upgradeExact) {
/*
public void registerSmithingRecipe(String keyName, ItemStack result, ItemStack[] baseItem, boolean baseExact, ItemStack[] upgradeItem, boolean upgradeExact, ItemStack[] templateItem, boolean templateExact) {
ResourceLocation key = new ResourceLocation("denizen", keyName);
Ingredient templateItemRecipe = itemArrayToRecipe(templateItem, templateExact);
Ingredient baseItemRecipe = itemArrayToRecipe(baseItem, baseExact);
Ingredient upgradeItemRecipe = itemArrayToRecipe(upgradeItem, upgradeExact);
LegacyUpgradeRecipe recipe = new LegacyUpgradeRecipe(key, baseItemRecipe, upgradeItemRecipe, CraftItemStack.asNMSCopy(result));
SmithingTransformRecipe recipe = new SmithingTransformRecipe(key, templateItemRecipe, baseItemRecipe, upgradeItemRecipe, CraftItemStack.asNMSCopy(result));
((CraftServer) Bukkit.getServer()).getServer().getRecipeManager().addRecipe(recipe);
*/
// TODO: 1.19.4/1.20: smithing system was changed
}

@Override
Expand Down

0 comments on commit 95e7d5b

Please sign in to comment.