Files
CustomNPC-Plus/src/main/java/noppes/npcs/controllers/RecipeController.java
T

373 lines
12 KiB
Java
Raw Normal View History

2018-09-13 12:03:28 -04:00
package noppes.npcs.controllers;
2025-01-30 09:26:10 -05:00
import kamkeel.npcs.controllers.SyncController;
2018-09-13 12:03:28 -04:00
import net.minecraft.inventory.InventoryCrafting;
import net.minecraft.item.ItemStack;
import net.minecraft.item.crafting.CraftingManager;
import net.minecraft.nbt.CompressedStreamTools;
import net.minecraft.nbt.NBTTagCompound;
import net.minecraft.nbt.NBTTagList;
import noppes.npcs.CustomNpcs;
2022-11-15 15:25:53 -05:00
import noppes.npcs.api.handler.IRecipeHandler;
2025-02-09 20:49:45 -05:00
import noppes.npcs.api.handler.data.IAnvilRecipe;
2022-11-15 15:25:53 -05:00
import noppes.npcs.api.handler.data.IRecipe;
2025-02-09 20:49:45 -05:00
import noppes.npcs.controllers.data.RecipeAnvil;
2023-01-12 21:33:06 -05:00
import noppes.npcs.controllers.data.RecipeCarpentry;
import noppes.npcs.controllers.data.RecipesDefault;
import java.io.File;
import java.io.FileInputStream;
import java.io.FileOutputStream;
import java.io.IOException;
import java.util.*;
2018-09-13 12:03:28 -04:00
2022-01-10 15:21:48 -06:00
public class RecipeController implements IRecipeHandler {
2018-09-13 12:03:28 -04:00
private static Collection<RecipeCarpentry> prevRecipes;
2025-02-09 20:49:45 -05:00
public HashMap<Integer, RecipeCarpentry> globalRecipes = new HashMap<Integer, RecipeCarpentry>();
public HashMap<Integer, RecipeCarpentry> carpentryRecipes = new HashMap<Integer, RecipeCarpentry>();
public HashMap<Integer, RecipeAnvil> anvilRecipes = new HashMap<Integer, RecipeAnvil>();
public static RecipeController Instance;
2018-09-13 12:03:28 -04:00
public static final int version = 1;
public int nextId = 1;
2025-02-09 20:49:45 -05:00
public int nextAnvilId = 1;
2025-02-09 20:49:45 -05:00
public static HashMap<Integer, RecipeCarpentry> syncRecipes = new HashMap<Integer, RecipeCarpentry>();
public static HashMap<Integer, RecipeAnvil> syncAnvilRecipes = new HashMap<Integer, RecipeAnvil>();
2018-09-13 12:03:28 -04:00
public RecipeController(){
2023-06-05 22:12:48 -04:00
Instance = this;
2018-09-13 12:03:28 -04:00
}
public void load(){
loadCategories();
reloadGlobalRecipes(globalRecipes);
}
2025-02-09 20:49:45 -05:00
2018-09-13 12:03:28 -04:00
public static void reloadGlobalRecipes(HashMap<Integer,RecipeCarpentry> globalRecipes){
List list = CraftingManager.getInstance().getRecipeList();
if(prevRecipes != null){
list.removeAll(prevRecipes);
}
2018-09-13 12:03:28 -04:00
prevRecipes = new HashSet<RecipeCarpentry>();
for(RecipeCarpentry recipe : globalRecipes.values()){
if(recipe.isValid())
prevRecipes.add(recipe);
}
list.addAll(prevRecipes);
}
2018-09-13 12:03:28 -04:00
private void loadCategories(){
File saveDir = CustomNpcs.getWorldSaveDirectory();
try {
File file = new File(saveDir, "recipes.dat");
if(file.exists()){
loadCategories(file);
}
else{
globalRecipes.clear();
2025-01-30 09:22:43 -05:00
carpentryRecipes.clear();
2025-02-09 20:49:45 -05:00
anvilRecipes.clear();
2018-09-13 12:03:28 -04:00
loadDefaultRecipes(-1);
}
} catch (Exception e) {
e.printStackTrace();
try {
File file = new File(saveDir, "recipes.dat_old");
if(file.exists()){
loadCategories(file);
}
} catch (Exception ee) {
e.printStackTrace();
}
}
}
private void loadDefaultRecipes(int i) {
if(i == version)
return;
RecipesDefault.loadDefaultRecipes(i);
2018-09-13 12:03:28 -04:00
saveCategories();
}
private void loadCategories(File file) throws Exception{
NBTTagCompound nbttagcompound1 = CompressedStreamTools.readCompressed(new FileInputStream(file));
nextId = nbttagcompound1.getInteger("LastId");
2025-02-09 20:49:45 -05:00
nextAnvilId = nbttagcompound1.getInteger("LastAnvilId");
2018-09-13 12:03:28 -04:00
NBTTagList list = nbttagcompound1.getTagList("Data", 10);
HashMap<Integer,RecipeCarpentry> globalRecipes = new HashMap<Integer, RecipeCarpentry>();
2025-02-09 20:49:45 -05:00
HashMap<Integer,RecipeCarpentry> carpentryRecipes = new HashMap<Integer, RecipeCarpentry>();
HashMap<Integer,RecipeAnvil> anvilRecipes = new HashMap<Integer, RecipeAnvil>();
2018-09-13 12:03:28 -04:00
if(list != null){
for(int i = 0; i < list.tagCount(); i++)
{
2025-02-09 20:49:45 -05:00
NBTTagCompound compound = list.getCompoundTagAt(i);
if(compound.hasKey("IsAnvil")){
RecipeAnvil anvil = RecipeAnvil.read(compound);
anvilRecipes.put(anvil.id, anvil);
if(anvil.id > nextAnvilId)
nextAnvilId = anvil.id;
} else {
RecipeCarpentry recipe = RecipeCarpentry.read(compound);
if(recipe.isGlobal)
globalRecipes.put(recipe.id,recipe);
else
carpentryRecipes.put(recipe.id,recipe);
if(recipe.id > nextId)
nextId = recipe.id;
}
2018-09-13 12:03:28 -04:00
}
}
2025-02-09 20:49:45 -05:00
this.carpentryRecipes = carpentryRecipes;
2018-09-13 12:03:28 -04:00
this.globalRecipes = globalRecipes;
2025-02-09 20:49:45 -05:00
this.anvilRecipes = anvilRecipes;
2018-09-13 12:03:28 -04:00
loadDefaultRecipes(nbttagcompound1.getInteger("Version"));
}
private void saveCategories(){
try {
File saveDir = CustomNpcs.getWorldSaveDirectory();
NBTTagList list = new NBTTagList();
for(RecipeCarpentry recipe : globalRecipes.values()){
list.appendTag(recipe.writeNBT());
}
2025-01-30 09:22:43 -05:00
for(RecipeCarpentry recipe : carpentryRecipes.values()){
2018-09-13 12:03:28 -04:00
list.appendTag(recipe.writeNBT());
}
2025-02-09 20:49:45 -05:00
for(RecipeAnvil recipe : anvilRecipes.values()){
list.appendTag(recipe.writeNBT());
}
2018-09-13 12:03:28 -04:00
NBTTagCompound nbttagcompound = new NBTTagCompound();
nbttagcompound.setTag("Data", list);
nbttagcompound.setInteger("LastId", nextId);
2025-02-09 20:49:45 -05:00
nbttagcompound.setInteger("LastAnvilId", nextAnvilId);
2018-09-13 12:03:28 -04:00
nbttagcompound.setInteger("Version", version);
File file = new File(saveDir, "recipes.dat_new");
File file1 = new File(saveDir, "recipes.dat_old");
File file2 = new File(saveDir, "recipes.dat");
CompressedStreamTools.writeCompressed(nbttagcompound, new FileOutputStream(file));
if(file1.exists())
{
file1.delete();
}
file2.renameTo(file1);
if(file2.exists())
{
file2.delete();
}
file.renameTo(file2);
if(file.exists())
{
file.delete();
}
} catch (Exception e) {
e.printStackTrace();
}
}
2018-09-13 12:03:28 -04:00
public RecipeCarpentry findMatchingRecipe(InventoryCrafting par1InventoryCrafting){
2025-01-30 09:22:43 -05:00
for(RecipeCarpentry recipe : carpentryRecipes.values()){
2018-09-13 12:03:28 -04:00
if(recipe.isValid() && recipe.matches(par1InventoryCrafting,null))
return recipe;
}
return null;
}
public RecipeCarpentry getRecipe(int id) {
if(globalRecipes.containsKey(id))
return globalRecipes.get(id);
2025-01-30 09:22:43 -05:00
if(carpentryRecipes.containsKey(id))
return carpentryRecipes.get(id);
2018-09-13 12:03:28 -04:00
return null;
}
2025-02-09 20:49:45 -05:00
public RecipeAnvil getAnvilRecipe(int id) {
if(anvilRecipes.containsKey(id))
return anvilRecipes.get(id);
return null;
}
2018-09-13 12:03:28 -04:00
public RecipeCarpentry saveRecipe(NBTTagCompound compound) throws IOException {
RecipeCarpentry recipe = RecipeCarpentry.read(compound);
2018-09-13 12:03:28 -04:00
RecipeCarpentry current = getRecipe(recipe.id);
if(current != null && !current.name.equals(recipe.name)){
while(containsRecipeName(recipe.name))
recipe.name += "_";
}
2018-09-13 12:03:28 -04:00
if(recipe.id == -1){
recipe.id = getUniqueId();
while(containsRecipeName(recipe.name))
recipe.name += "_";
}
if(recipe.isGlobal){
2025-01-30 09:22:43 -05:00
carpentryRecipes.remove(recipe.id);
2018-09-13 12:03:28 -04:00
globalRecipes.put(recipe.id, recipe);
}
else{
globalRecipes.remove(recipe.id);
2025-01-30 09:22:43 -05:00
carpentryRecipes.put(recipe.id, recipe);
2018-09-13 12:03:28 -04:00
}
saveCategories();
reloadGlobalRecipes(globalRecipes);
return recipe;
}
2025-02-09 20:49:45 -05:00
public RecipeAnvil saveAnvilRecipe(NBTTagCompound compound) throws IOException {
RecipeAnvil recipe = RecipeAnvil.read(compound);
RecipeAnvil current = getAnvilRecipe(recipe.id);
if(current != null && !current.name.equals(recipe.name)){
while(containsRecipeName(recipe.name))
recipe.name += "_";
}
if(recipe.id == -1){
recipe.id = getUniqueAnvilId();
while(containsRecipeName(recipe.name))
recipe.name += "_";
}
anvilRecipes.put(recipe.id, recipe);
saveCategories();
return recipe;
}
2018-09-13 12:03:28 -04:00
private int getUniqueId() {
return nextId++;
}
2025-02-09 20:49:45 -05:00
private int getUniqueAnvilId() {
return nextAnvilId++;
}
2018-09-13 12:03:28 -04:00
private boolean containsRecipeName(String name) {
name = name.toLowerCase();
for(RecipeCarpentry recipe : globalRecipes.values()){
if(recipe.name.toLowerCase().equals(name))
return true;
}
2025-01-30 09:22:43 -05:00
for(RecipeCarpentry recipe : carpentryRecipes.values()){
2018-09-13 12:03:28 -04:00
if(recipe.name.toLowerCase().equals(name))
return true;
}
return false;
}
2025-02-09 20:49:45 -05:00
private boolean containsAnvilRecipeName(String name) {
name = name.toLowerCase();
for(RecipeAnvil recipe : anvilRecipes.values()){
if(recipe.name.toLowerCase().equals(name))
return true;
}
return false;
}
2022-01-10 15:21:48 -06:00
public RecipeCarpentry delete(int id) {
2018-09-13 12:03:28 -04:00
RecipeCarpentry recipe = getRecipe(id);
if(recipe == null)
return null;
2025-01-30 09:22:43 -05:00
RecipeCarpentry globalRecipe = globalRecipes.remove(recipe.id);
if(globalRecipe != null)
2025-01-30 09:26:10 -05:00
SyncController.syncAllWorkbenchRecipes();
2025-01-30 09:22:43 -05:00
RecipeCarpentry carpentry = carpentryRecipes.remove(recipe.id);
if(carpentry != null)
2025-02-09 20:49:45 -05:00
SyncController.syncAllCarpentryRecipes();
2025-01-30 09:22:43 -05:00
2018-09-13 12:03:28 -04:00
saveCategories();
reloadGlobalRecipes(globalRecipes);
return recipe;
}
2025-02-09 20:49:45 -05:00
public RecipeAnvil deleteAnvil(int id) {
RecipeAnvil recipe = getAnvilRecipe(id);
if(recipe == null)
return null;
RecipeAnvil anvilRecipe = anvilRecipes.remove(recipe.id);
if(anvilRecipe != null)
// SyncController.syncAllWorkbenchRecipes();
saveCategories();
return recipe;
}
public void addRecipe(RecipeCarpentry recipeCarpentry) {
recipeCarpentry.id = getUniqueId();
if(!recipeCarpentry.isGlobal)
RecipeController.Instance.carpentryRecipes.put(recipeCarpentry.id, recipeCarpentry);
2018-09-13 12:03:28 -04:00
else{
2025-02-09 20:49:45 -05:00
RecipeController.Instance.globalRecipes.put(recipeCarpentry.id, recipeCarpentry);
2018-09-13 12:03:28 -04:00
}
}
2022-01-10 15:21:48 -06:00
2025-02-09 20:49:45 -05:00
public void addAnvilRecipe(RecipeAnvil recipeAnvil) {
recipeAnvil.id = getUniqueAnvilId();
anvilRecipes.put(recipeAnvil.id, recipeAnvil);
}
@Override
2022-01-10 15:21:48 -06:00
public List<IRecipe> getGlobalList() {
return new ArrayList(this.globalRecipes.values());
}
2025-02-09 20:49:45 -05:00
@Override
2022-01-10 15:21:48 -06:00
public List<IRecipe> getCarpentryList() {
2025-01-30 09:22:43 -05:00
return new ArrayList(this.carpentryRecipes.values());
2022-01-10 15:21:48 -06:00
}
2025-02-09 20:49:45 -05:00
@Override
public List<IAnvilRecipe> getAnvilList() {
List<IAnvilRecipe> list = new ArrayList<>();
list.addAll(anvilRecipes.values());
return list;
}
@Override
2022-01-10 15:21:48 -06:00
public void addRecipe(String name, boolean global, ItemStack result, Object... objects) {
RecipeCarpentry recipe = new RecipeCarpentry(name);
recipe.isGlobal = global;
recipe = RecipeCarpentry.saveRecipe(recipe, result, objects);
try {
this.saveRecipe(recipe.writeNBT());
} catch (Exception var7) {
var7.printStackTrace();
}
}
2025-02-09 20:49:45 -05:00
@Override
2022-01-10 15:21:48 -06:00
public void addRecipe(String name, boolean global, ItemStack result, int width, int height, ItemStack... objects) {
ArrayList<ItemStack> list = new ArrayList<>();
int var9 = objects.length;
for(int var10 = 0; var10 < var9; ++var10) {
ItemStack item = objects[var10];
if (item.stackSize > 0) {
list.add(item);
}
}
RecipeCarpentry recipe = new RecipeCarpentry(width, height, list.toArray(new ItemStack[0]), result);
recipe.isGlobal = global;
recipe.name = name;
try {
this.saveRecipe(recipe.writeNBT());
} catch (IOException var12) {
var12.printStackTrace();
}
}
2025-02-09 20:49:45 -05:00
@Override
public void addAnvilRecipe(String name, boolean global, ItemStack itemToRepair, ItemStack repairMaterial, int xpCost, float repairPercentage) {
RecipeAnvil recipe = new RecipeAnvil(name, itemToRepair, repairMaterial, xpCost, repairPercentage);
try {
this.saveAnvilRecipe(recipe.writeNBT());
} catch (Exception e) {
e.printStackTrace();
}
}
2018-09-13 12:03:28 -04:00
}