From 6d53f009bd82739a1b2c807497a3efdc269faad4 Mon Sep 17 00:00:00 2001 From: Indyuce Date: Tue, 24 Dec 2019 15:58:50 +0100 Subject: [PATCH] !Moved compatibility methods to MI --- lib/{MMOItems Premium.jar => MMOItems.jar} | Bin pom.xml | 20 +- .../java/net/Indyuce/mmocore/MMOCore.java | 4 - .../source/MineMIBlockExperienceSource.java | 66 ---- .../comp/mmoitems/MMOItemsMMOLoader.java | 44 --- .../mmocore/listener/profession/Alchemy.java | 351 ------------------ .../mmocore/listener/profession/Smelting.java | 134 ------- 7 files changed, 10 insertions(+), 609 deletions(-) rename lib/{MMOItems Premium.jar => MMOItems.jar} (100%) delete mode 100644 src/main/java/net/Indyuce/mmocore/api/experience/source/MineMIBlockExperienceSource.java delete mode 100644 src/main/java/net/Indyuce/mmocore/comp/mmoitems/MMOItemsMMOLoader.java delete mode 100644 src/main/java/net/Indyuce/mmocore/listener/profession/Alchemy.java delete mode 100644 src/main/java/net/Indyuce/mmocore/listener/profession/Smelting.java diff --git a/lib/MMOItems Premium.jar b/lib/MMOItems.jar similarity index 100% rename from lib/MMOItems Premium.jar rename to lib/MMOItems.jar diff --git a/pom.xml b/pom.xml index 6af94ce3..0b6d61a7 100644 --- a/pom.xml +++ b/pom.xml @@ -59,14 +59,14 @@ spigot-repo https://hub.spigotmc.org/nexus/content/repositories/snapshots/ - - sk89q-repo - https://maven.enginehub.org/repo/ - - - placeholderapi - http://repo.extendedclip.com/content/repositories/placeholderapi/ - + + sk89q-repo + https://maven.enginehub.org/repo/ + + + placeholderapi + http://repo.extendedclip.com/content/repositories/placeholderapi/ + @@ -85,9 +85,9 @@ net.Indyuce MMOItems - 4.7.14 + 5.1.2 system - ${basedir}/lib/MMOItems Premium.jar + ${basedir}/lib/MMOItems.jar com.nisovin diff --git a/src/main/java/net/Indyuce/mmocore/MMOCore.java b/src/main/java/net/Indyuce/mmocore/MMOCore.java index 375f2855..7fa769ec 100644 --- a/src/main/java/net/Indyuce/mmocore/MMOCore.java +++ b/src/main/java/net/Indyuce/mmocore/MMOCore.java @@ -40,7 +40,6 @@ import net.Indyuce.mmocore.comp.holograms.CMIPlugin; import net.Indyuce.mmocore.comp.holograms.HologramSupport; import net.Indyuce.mmocore.comp.holograms.HologramsPlugin; import net.Indyuce.mmocore.comp.holograms.HolographicDisplaysPlugin; -import net.Indyuce.mmocore.comp.mmoitems.MMOItemsMMOLoader; import net.Indyuce.mmocore.comp.mythicmobs.MythicMobsDrops; import net.Indyuce.mmocore.comp.mythicmobs.MythicMobsMMOLoader; import net.Indyuce.mmocore.comp.placeholder.DefaultParser; @@ -140,9 +139,6 @@ public class MMOCore extends JavaPlugin { /* * register extra objective, drop items... */ - if (Bukkit.getPluginManager().getPlugin("MMOItems") != null) - loadManager.registerLoader(new MMOItemsMMOLoader()); - if (Bukkit.getPluginManager().getPlugin("WorldGuard") != null) loadManager.registerLoader(new WorldGuardMMOLoader()); diff --git a/src/main/java/net/Indyuce/mmocore/api/experience/source/MineMIBlockExperienceSource.java b/src/main/java/net/Indyuce/mmocore/api/experience/source/MineMIBlockExperienceSource.java deleted file mode 100644 index 5566f49e..00000000 --- a/src/main/java/net/Indyuce/mmocore/api/experience/source/MineMIBlockExperienceSource.java +++ /dev/null @@ -1,66 +0,0 @@ -package net.Indyuce.mmocore.api.experience.source; - -import org.bukkit.GameMode; -import org.bukkit.enchantments.Enchantment; -import org.bukkit.event.EventHandler; -import org.bukkit.event.EventPriority; -import org.bukkit.event.block.BlockBreakEvent; -import org.bukkit.inventory.ItemStack; - -import net.Indyuce.mmocore.api.experience.Profession; -import net.Indyuce.mmocore.api.experience.source.type.SpecificExperienceSource; -import net.Indyuce.mmocore.api.load.MMOLineConfig; -import net.Indyuce.mmocore.api.player.PlayerData; -import net.Indyuce.mmocore.manager.profession.ExperienceManager; -import net.Indyuce.mmoitems.MMOItems; -import net.Indyuce.mmoitems.api.CustomBlock; - -public class MineMIBlockExperienceSource extends SpecificExperienceSource { - public final int id; - private final boolean silkTouch; - private final boolean playerPlaced; - - public MineMIBlockExperienceSource(Profession profession, MMOLineConfig config) { - super(profession, config); - - config.validate("id"); - id = config.getInt("id", 1); - silkTouch = config.getBoolean("silk-touch", true); - playerPlaced = config.getBoolean("player-placed", false); - } - - @Override - public ExperienceManager newManager() { - return new ExperienceManager() { - - @EventHandler(priority = EventPriority.HIGHEST) - public void a(BlockBreakEvent event) { - if (event.isCancelled() || event.getPlayer().getGameMode() != GameMode.SURVIVAL) - return; - PlayerData data = PlayerData.get(event.getPlayer()); - - for (MineMIBlockExperienceSource source : getSources()) - { - if (!MMOItems.plugin.getCustomBlocks().isMushroomBlock(event.getBlock().getType())) - continue; - if (source.silkTouch && hasSilkTouch(event.getPlayer().getInventory().getItemInMainHand())) - continue; - if ((!source.playerPlaced) && event.getBlock().hasMetadata("player_placed")) - continue; - - if (source.matches(data, CustomBlock.getFromData(event.getBlock().getBlockData()).getId())) - source.giveExperience(data, event.getBlock().getLocation()); - } - } - }; - } - - private boolean hasSilkTouch(ItemStack item) { - return item != null && item.hasItemMeta() && item.getItemMeta().hasEnchant(Enchantment.SILK_TOUCH); - } - - @Override - public boolean matches(PlayerData player, Integer blockId) { - return id == blockId && hasRightClass(player); - } -} diff --git a/src/main/java/net/Indyuce/mmocore/comp/mmoitems/MMOItemsMMOLoader.java b/src/main/java/net/Indyuce/mmocore/comp/mmoitems/MMOItemsMMOLoader.java deleted file mode 100644 index 921536b7..00000000 --- a/src/main/java/net/Indyuce/mmocore/comp/mmoitems/MMOItemsMMOLoader.java +++ /dev/null @@ -1,44 +0,0 @@ -package net.Indyuce.mmocore.comp.mmoitems; - -import org.bukkit.configuration.ConfigurationSection; - -import net.Indyuce.mmocore.api.droptable.condition.Condition; -import net.Indyuce.mmocore.api.droptable.dropitem.DropItem; -import net.Indyuce.mmocore.api.experience.Profession; -import net.Indyuce.mmocore.api.experience.source.MineMIBlockExperienceSource; -import net.Indyuce.mmocore.api.experience.source.type.ExperienceSource; -import net.Indyuce.mmocore.api.load.MMOLineConfig; -import net.Indyuce.mmocore.api.load.MMOLoader; -import net.Indyuce.mmocore.api.quest.objective.Objective; -import net.Indyuce.mmocore.api.quest.trigger.Trigger; - -public class MMOItemsMMOLoader implements MMOLoader { - - @Override - public Condition loadCondition(MMOLineConfig config) { - return null; - } - - @Override - public Trigger loadTrigger(MMOLineConfig config) { - return null; - } - - @Override - public DropItem loadDropItem(MMOLineConfig config) { - return null; - } - - @Override - public Objective loadObjective(MMOLineConfig config, ConfigurationSection section) { - return null; - } - - @Override - public ExperienceSource loadExperienceSource(MMOLineConfig config, Profession profession) { - if (config.getKey().equals("minemiblock")) - return new MineMIBlockExperienceSource(profession, config); - - return null; - } -} diff --git a/src/main/java/net/Indyuce/mmocore/listener/profession/Alchemy.java b/src/main/java/net/Indyuce/mmocore/listener/profession/Alchemy.java deleted file mode 100644 index ad35e1f0..00000000 --- a/src/main/java/net/Indyuce/mmocore/listener/profession/Alchemy.java +++ /dev/null @@ -1,351 +0,0 @@ -package net.Indyuce.mmocore.listener.profession; - -import java.util.HashSet; -import java.util.Set; -import java.util.logging.Level; - -import org.bukkit.Location; -import org.bukkit.Material; -import org.bukkit.Particle; -import org.bukkit.Sound; -import org.bukkit.block.Block; -import org.bukkit.block.BrewingStand; -import org.bukkit.configuration.ConfigurationSection; -import org.bukkit.entity.Player; -import org.bukkit.event.EventHandler; -import org.bukkit.event.Listener; -import org.bukkit.event.inventory.InventoryClickEvent; -import org.bukkit.event.inventory.InventoryType; -import org.bukkit.inventory.BrewerInventory; -import org.bukkit.inventory.ItemStack; -import org.bukkit.inventory.meta.PotionMeta; -import org.bukkit.scheduler.BukkitRunnable; - -import net.Indyuce.mmocore.MMOCore; -import net.Indyuce.mmocore.api.player.PlayerData; -import net.Indyuce.mmoitems.MMOItems; -import net.Indyuce.mmoitems.api.Type; -import net.mmogroup.mmolib.api.item.NBTItem; - -public class Alchemy implements Listener { - private Set runnables = new HashSet<>(); - - private static Set recipes = new HashSet<>(); - - public Alchemy(ConfigurationSection config) { - Alchemy.recipes.clear(); - for (String key : config.getKeys(false)) { - BrewingRecipe recipe = new BrewingRecipe(config.getConfigurationSection(key)); - if (recipe.isValid()) - recipes.add(recipe); - } - } - - /* - * force place the item in the brewing stand inventory so it can start the - * recipe. - */ - @EventHandler - public void a(InventoryClickEvent event) { - if (event.getInventory().getType() != InventoryType.BREWING) - return; - - event.setCancelled(true); - ItemStack item = event.getCurrentItem(); - if (item == null || item.getType() == Material.AIR) - return; - - Player player = (Player) event.getWhoClicked(); - BrewingStand stand = (BrewingStand) event.getInventory().getHolder(); - BrewerInventory inv = (BrewerInventory) event.getInventory(); - - // send ingredient back in the player inventory - if (event.getRawSlot() == 3) { - if (player.getInventory().firstEmpty() == -1) - return; - - player.getInventory().addItem(inv.getIngredient()); - inv.setIngredient(null); - - player.playSound(player.getLocation(), Sound.ENTITY_ITEM_PICKUP, 1, 1); - checkForBrewing(player, stand); - return; - } - - // send fuel back in the player inventory - if (event.getRawSlot() == 4) { - if (player.getInventory().firstEmpty() == -1) - return; - - player.getInventory().addItem(inv.getFuel()); - inv.setFuel(null); - - player.playSound(player.getLocation(), Sound.ENTITY_ITEM_PICKUP, 1, 1); - checkForBrewing(player, stand); - return; - } - - // send bottle back in the player inventory - if (event.getRawSlot() >= 0 && event.getRawSlot() < 3) { - if (player.getInventory().firstEmpty() == -1) - return; - - player.getInventory().addItem(inv.getItem(event.getRawSlot())); - inv.setItem(event.getRawSlot(), null); - - player.playSound(player.getLocation(), Sound.ENTITY_ITEM_PICKUP, 1, 1); - checkForBrewing(player, stand); - return; - } - - BrewingRecipe recipe = getCorrespondingRecipe(NBTItem.get(item)); - - // send fuel in the brewing stand - if (recipe == null) { - if (item.getType() == Material.BLAZE_POWDER && (inv.getFuel() == null || inv.getFuel().getType() == Material.AIR || item.isSimilar(inv.getFuel()))) { - int fuel = inv.getFuel() == null ? 0 : inv.getFuel().getAmount(); - int needed = 64 - fuel; - int sent = Math.min(needed, item.getAmount()); - - if (sent == 0) - return; - - ItemStack fuelItem = item.clone(); - fuelItem.setAmount(fuel + sent); - inv.setFuel(fuelItem); - - if (sent == item.getAmount()) - event.setCurrentItem(null); - else - item.setAmount(item.getAmount() - sent); - - player.playSound(player.getLocation(), Sound.BLOCK_END_PORTAL_FRAME_FILL, 1, 2); - checkForBrewing(player, stand); - return; - } - - // send potion in the brewing stand - if (item.getType() == Material.POTION && ((PotionMeta) item.getItemMeta()).getCustomEffects().isEmpty()) { - int empty = getEmptyBottleSlot(inv); - if (empty == -1) - return; - - inv.setItem(empty, event.getCurrentItem()); - event.setCurrentItem(null); - - player.playSound(player.getLocation(), Sound.BLOCK_END_PORTAL_FRAME_FILL, 1, 2); - checkForBrewing(player, stand); - } - return; - } - - // send ingredient in the brewing stand - if (inv.getIngredient() == null || inv.getIngredient().getType() == Material.AIR || item.isSimilar(inv.getIngredient())) { - int ingredient = inv.getIngredient() == null ? 0 : inv.getIngredient().getAmount(); - int needed = 64 - ingredient; - int sent = Math.min(needed, item.getAmount()); - - if (sent == 0) - return; - - ItemStack ingredientItem = item.clone(); - ingredientItem.setAmount(ingredient + sent); - inv.setIngredient(ingredientItem); - - if (sent == item.getAmount()) - event.setCurrentItem(null); - else - item.setAmount(item.getAmount() - sent); - - player.playSound(player.getLocation(), Sound.BLOCK_END_PORTAL_FRAME_FILL, 1, 2); - checkForBrewing(player, stand); - } - } - - private void checkForBrewing(Player player, BrewingStand stand) { - BrewingRecipe recipe = getCorrespondingRecipe(NBTItem.get(stand.getInventory().getIngredient())); - Location loc = stand.getLocation(); - if (!runnables.contains(loc.getBlockY() + "-" + loc.getBlockY() + "-" + loc.getBlockZ()) && recipe != null && stand.getFuelLevel() > 0 && hasAtLeastOnePotion(stand.getInventory())) - new BrewingRunnable(player, stand).start(recipe); - } - - private int getEmptyBottleSlot(BrewerInventory inv) { - ItemStack item; - for (int j = 0; j < 3; j++) - if ((item = inv.getItem(j)) == null || item.getType() == Material.AIR) - return j; - return -1; - } - - /* - * returns if the corresponding brewing inventory has at least ONE potion - * and if - */ - private boolean hasAtLeastOnePotion(BrewerInventory inv) { - ItemStack item; - for (int j = 0; j < 3; j++) - if ((item = inv.getItem(j)) != null) - return item.getType() == Material.POTION; - return false; - } - - private boolean hasNoBottle(BrewerInventory inv) { - ItemStack item; - for (int j = 0; j < 3; j++) - if ((item = inv.getItem(j)) != null && item.getType() == Material.POTION) - return false; - return true; - } - - private BrewingRecipe getCorrespondingRecipe(NBTItem item) { - for (BrewingRecipe recipe : recipes) - if (recipe.matchesIngredient(item)) - return recipe; - return null; - } - - private ItemStack consume(ItemStack item) { - if (item.getAmount() < 2) - return null; - - item.setAmount(item.getAmount() - 1); - return item; - } - - public class BrewingRunnable extends BukkitRunnable { - private int time = 0; - private Block block; - private Location loc; - private BrewingRecipe recipe; - private String mapPath; - private Player player; - - public BrewingRunnable(Player player, BrewingStand stand) { - this.block = stand.getBlock(); - this.player = player; - loc = stand.getLocation().add(.5, .5, .5); - } - - public void start(BrewingRecipe recipe) { - this.recipe = recipe; - BrewingStand stand = (BrewingStand) block.getState(); - stand.setFuelLevel(stand.getFuelLevel() - 1); - stand.update(); - runnables.add(mapPath = loc.getBlockY() + "-" + loc.getBlockY() + "-" + loc.getBlockZ()); - runTaskTimer(MMOCore.plugin, 1, 1); - } - - @Override - public void run() { - BrewingStand stand = (BrewingStand) block.getState(); - stand.getWorld().spawnParticle(Particle.SPELL_MOB, loc.clone().add(Math.cos((double) time / 3.) * .4, 0, Math.sin((double) time / 3.) * .4), 0); - - // cancel the recipe if ingredient was changed - if (!recipe.matchesIngredient(stand.getInventory().getIngredient()) || hasNoBottle(stand.getInventory())) { - runnables.remove(mapPath); - cancel(); - return; - } - - if (time++ > recipe.getCookingTime()) { - runnables.remove(mapPath); - stand.getInventory().setIngredient(consume(stand.getInventory().getIngredient())); - - int count = 0; - ItemStack item, result = recipe.getResult(); - for (int j = 0; j < 3; j++) - if ((item = stand.getInventory().getItem(j)) != null && item.getType() != Material.AIR) { - count++; - stand.getInventory().setItem(j, result); - } - - if (MMOCore.plugin.professionManager.has("alchemy")) - PlayerData.get(player).getCollectionSkills().giveExperience(MMOCore.plugin.professionManager.get("alchemy"), count * recipe.experience, loc); - - stand.getWorld().playSound(stand.getLocation(), Sound.BLOCK_BREWING_STAND_BREW, 1, 1); - cancel(); - return; - } - - stand.setBrewingTime((int) (400. * (1. - (double) time / recipe.getCookingTime()))); - stand.update(); - } - } - - public class BrewingRecipe { - - // ingredient - private Type ingredientType; - private String ingredientId; - - private int time, experience; - - // result - private Type type; - private String id; - - private boolean valid = true; - - public BrewingRecipe(ConfigurationSection section) { - try { - String[] split = section.getString("ingredient").split("\\."); - ingredientType = MMOItems.plugin.getTypes().get(split[0]); - ingredientId = split[1]; - - split = section.getString("result").split("\\."); - type = MMOItems.plugin.getTypes().get(split[0]); - id = split[1]; - - time = (int) (section.getDouble("cook-time") * 20.); - experience = section.getInt("exp"); - } catch (Exception e) { - MMOCore.plugin.getLogger().log(Level.WARNING, "Could not register brewing recipe named " + section.getName()); - valid = false; - } - } - - public BrewingRecipe(Type ingredientType, String ingredientId, int time, Type type, String id) { - this.ingredientType = ingredientType; - this.ingredientId = ingredientId; - this.time = time; - this.type = type; - this.id = id; - } - - public boolean isValid() { - return valid; - } - - public boolean matchesIngredient(NBTItem nbt) { - return nbt.getString("MMOITEMS_ITEM_TYPE").equals(ingredientType.getId()) && nbt.getString("MMOITEMS_ITEM_ID").equals(ingredientId); - } - - public boolean matchesIngredient(ItemStack item) { - return matchesIngredient(NBTItem.get(item)); - } - - public int getCookingTime() { - return time; - } - - public ItemStack getResult() { - return MMOItems.plugin.getItems().getItem(type, id); - } - } - - // @EventHandler - // public void a(ProjectileLaunchEvent event) { - // if (!(event.getEntity() instanceof ThrownPotion) || - // !(event.getEntity().getShooter() instanceof Player)) - // return; - // - // double c = 1 + random.nextDouble() * 2; - // - // Vector vec = event.getEntity().getVelocity(); - // vec.setX(vec.getX() * c); - // vec.setZ(vec.getZ() * c); - // event.getEntity().setVelocity(vec); - // - // new PotionParticles((ThrownPotion) event.getEntity()).start(); - // } -} diff --git a/src/main/java/net/Indyuce/mmocore/listener/profession/Smelting.java b/src/main/java/net/Indyuce/mmocore/listener/profession/Smelting.java deleted file mode 100644 index c15563b6..00000000 --- a/src/main/java/net/Indyuce/mmocore/listener/profession/Smelting.java +++ /dev/null @@ -1,134 +0,0 @@ -package net.Indyuce.mmocore.listener.profession; - -import java.util.HashSet; -import java.util.Iterator; -import java.util.Set; -import java.util.logging.Level; - -import org.bukkit.Bukkit; -import org.bukkit.Material; -import org.bukkit.NamespacedKey; -import org.bukkit.configuration.ConfigurationSection; -import org.bukkit.event.EventHandler; -import org.bukkit.event.Listener; -import org.bukkit.event.inventory.FurnaceSmeltEvent; -import org.bukkit.inventory.ItemStack; -import org.bukkit.inventory.Recipe; - -import net.Indyuce.mmocore.MMOCore; -import net.Indyuce.mmoitems.MMOItems; -import net.Indyuce.mmoitems.api.Type; -import net.mmogroup.mmolib.MMOLib; -import net.mmogroup.mmolib.api.item.NBTItem; - -public class Smelting implements Listener { - - /* - * FurnaceSmeltEvent is called when an item has actually been smelted. - * FurnaceBurnEvent is called when a fuel piece is used to refill up the - * furnace fuel bar. - */ - - private static Set recipes = new HashSet<>(); - private static Set vanillaKeys = new HashSet<>(); - - public Smelting(ConfigurationSection config) { - for (Iterator iterator = Bukkit.recipeIterator(); iterator.hasNext();) { - //Recipe recipe = iterator.next(); - //if (recipe instanceof FurnaceRecipe && vanillaKeys.contains(((FurnaceRecipe) recipe).getKey())) - // iterator.remove(); - } - - Smelting.recipes.clear(); - Smelting.vanillaKeys.clear(); - - for (String key : config.getKeys(false)) { - SmeltingRecipe recipe = new SmeltingRecipe(config.getConfigurationSection(key)); - if (recipe.isValid()) { - recipes.add(recipe); - NamespacedKey vanillaKey = new NamespacedKey(MMOCore.plugin, "furnace_recipe_" + key.replace("-", "_").toLowerCase()); - vanillaKeys.add(vanillaKey); - Bukkit.addRecipe(MMOLib.plugin.getVersion().getWrapper().getFurnaceRecipe(vanillaKey, new ItemStack(Material.BARRIER), recipe.getIngredientMaterial(), 0, recipe.getCookingTime())); - } - } - } - - @EventHandler - public void a(FurnaceSmeltEvent event) { - NBTItem ingredient = NBTItem.get(event.getSource()); - SmeltingRecipe recipe = getCorrespondingRecipe(ingredient); - if (recipe == null) - event.setCancelled(true); - else - event.setResult(recipe.getResult()); - } - - private SmeltingRecipe getCorrespondingRecipe(NBTItem item) { - for (SmeltingRecipe recipe : recipes) - if (recipe.matchesIngredient(item)) - return recipe; - return null; - } - - public class SmeltingRecipe { - - // ingredient & result - private Type ingredientType, resultType; - private String ingredientId, resultId; - private Material ingredientMaterial; - - private int time; - - public SmeltingRecipe(ConfigurationSection section) { - try { - String[] split = section.getString("ingredient").split("\\."); - ingredientMaterial = MMOItems.plugin.getItems().getItem(ingredientType = MMOItems.plugin.getTypes().get(split[0]), ingredientId = split[1]).getType(); - - split = section.getString("result").split("\\."); - resultType = MMOItems.plugin.getTypes().get(split[0]); - resultId = split[1]; - - time = (int) (section.getDouble("cook-time") * 20.); - } catch (Exception e) { - MMOCore.plugin.getLogger().log(Level.WARNING, "Could not load furnace recipe named " + section.getName()); - } - } - - public SmeltingRecipe(Type ingredientType, String ingredientId, int time, Type resultType, String resultId) { - this.ingredientType = ingredientType; - this.ingredientId = ingredientId; - this.time = time; - this.resultType = resultType; - this.resultId = resultId; - } - - public boolean isValid() { - return ingredientType != null && ingredientId != null && time > 0 && resultType != null && resultId != null && ingredientMaterial != null; - } - - public boolean matchesIngredient(NBTItem nbt) { - return nbt.getString("MMOITEMS_ITEM_TYPE").equals(ingredientType.getId()) && nbt.getString("MMOITEMS_ITEM_ID").equals(ingredientId); - } - - @Deprecated - public boolean matchesIngredient(ItemStack item) { - return matchesIngredient(NBTItem.get(item)); - } - - public int getCookingTime() { - return time; - } - - public ItemStack getResult() { - return MMOItems.plugin.getItems().getItem(resultType, resultId); - } - - public Material getIngredientMaterial() { - return ingredientMaterial; - } - - public String toString() { - return "{ingredient=" + ingredientType.getId() + "." + ingredientId + ", time" + time + ", result=" + resultType.getId() + "." + resultId + ", valid=" + isValid() + "}"; - } - } -}