From c0e4733eb82f3e4ef023c36b594118e108fa9de6 Mon Sep 17 00:00:00 2001 From: CocoTheOwner Date: Fri, 6 Aug 2021 02:46:04 +0200 Subject: [PATCH 01/12] Auto stash before merge of "master" and "upstream/master" --- src/main/java/com/volmit/iris/Iris.java | 34 ++++++++++++++++++++++--- 1 file changed, 31 insertions(+), 3 deletions(-) diff --git a/src/main/java/com/volmit/iris/Iris.java b/src/main/java/com/volmit/iris/Iris.java index f5ff4df3b..83dbb91d1 100644 --- a/src/main/java/com/volmit/iris/Iris.java +++ b/src/main/java/com/volmit/iris/Iris.java @@ -55,21 +55,37 @@ import com.volmit.iris.util.scheduling.J; import com.volmit.iris.util.scheduling.Queue; import com.volmit.iris.util.scheduling.ShurikenQueue; import io.papermc.lib.PaperLib; -import org.bukkit.Bukkit; -import org.bukkit.World; +import org.bukkit.*; +import org.bukkit.attribute.Attribute; +import org.bukkit.attribute.AttributeInstance; +import org.bukkit.block.Block; +import org.bukkit.block.BlockFace; +import org.bukkit.block.PistonMoveReaction; import org.bukkit.command.Command; import org.bukkit.command.CommandSender; +import org.bukkit.entity.EntityType; import org.bukkit.entity.Player; import org.bukkit.event.Event; +import org.bukkit.event.EventHandler; import org.bukkit.event.HandlerList; import org.bukkit.event.Listener; +import org.bukkit.event.entity.EntityDamageEvent; +import org.bukkit.event.entity.EntitySpawnEvent; +import org.bukkit.event.player.PlayerTeleportEvent; +import org.bukkit.event.world.StructureGrowEvent; import org.bukkit.generator.ChunkGenerator; +import org.bukkit.inventory.EntityEquipment; +import org.bukkit.loot.LootTable; +import org.bukkit.metadata.MetadataValue; +import org.bukkit.permissions.PermissionAttachment; +import org.bukkit.permissions.PermissionAttachmentInfo; +import org.bukkit.persistence.PersistentDataContainer; import org.bukkit.plugin.Plugin; import java.io.*; import java.lang.annotation.Annotation; import java.net.URL; -import java.util.Date; +import java.util.*; @SuppressWarnings("CanBeFinal") public class Iris extends VolmitPlugin implements Listener { @@ -88,6 +104,17 @@ public class Iris extends VolmitPlugin implements Listener { public static IrisCompat compat; public static FileWatcher configWatcher; + // TODO: Fix maps' behaviour so it doesn't crash Iris worlds + static class NoDolphin implements Listener { + @EventHandler + public void on(EntitySpawnEvent event) { + if (event.getEntityType().equals(EntityType.DOLPHIN)) { + Iris.debug("Cancelled Dolphin because of the map glitch (https://github.com/VolmitSoftware/Iris/issues/499) @ " + event.getLocation().getBlockX() + "/" + event.getLocation().getBlockY() + "/" + event.getLocation().getBlockZ()); + event.setCancelled(true); + } + } + } + @Permission public static PermissionIris perm; @@ -140,6 +167,7 @@ public class Iris extends VolmitPlugin implements Listener { configWatcher = new FileWatcher(getDataFile("settings.json")); getServer().getPluginManager().registerEvents(new CommandLocate(), this); getServer().getPluginManager().registerEvents(new WandManager(), this); + getServer().getPluginManager().registerEvents(new NoDolphin(), this); super.onEnable(); Bukkit.getPluginManager().registerEvents(this, this); J.s(this::lateBind); From bd93918d9bdb97f62cd2c1245d6784ef86240936 Mon Sep 17 00:00:00 2001 From: CocoTheOwner Date: Fri, 6 Aug 2021 11:00:09 +0200 Subject: [PATCH 02/12] Better --- src/main/java/com/volmit/iris/Iris.java | 13 +-- .../volmit/iris/core/InteractionManager.java | 64 +++++++++++++++ .../object/dimensional/IrisDimension.java | 4 + .../entity/IrisEntityVillagerOverride.java | 42 ++++++++++ .../IrisEntityVillagerOverrideItems.java | 81 +++++++++++++++++++ 5 files changed, 192 insertions(+), 12 deletions(-) create mode 100644 src/main/java/com/volmit/iris/core/InteractionManager.java create mode 100644 src/main/java/com/volmit/iris/engine/object/entity/IrisEntityVillagerOverride.java create mode 100644 src/main/java/com/volmit/iris/engine/object/entity/IrisEntityVillagerOverrideItems.java diff --git a/src/main/java/com/volmit/iris/Iris.java b/src/main/java/com/volmit/iris/Iris.java index 83dbb91d1..054751536 100644 --- a/src/main/java/com/volmit/iris/Iris.java +++ b/src/main/java/com/volmit/iris/Iris.java @@ -104,17 +104,6 @@ public class Iris extends VolmitPlugin implements Listener { public static IrisCompat compat; public static FileWatcher configWatcher; - // TODO: Fix maps' behaviour so it doesn't crash Iris worlds - static class NoDolphin implements Listener { - @EventHandler - public void on(EntitySpawnEvent event) { - if (event.getEntityType().equals(EntityType.DOLPHIN)) { - Iris.debug("Cancelled Dolphin because of the map glitch (https://github.com/VolmitSoftware/Iris/issues/499) @ " + event.getLocation().getBlockX() + "/" + event.getLocation().getBlockY() + "/" + event.getLocation().getBlockZ()); - event.setCancelled(true); - } - } - } - @Permission public static PermissionIris perm; @@ -167,7 +156,7 @@ public class Iris extends VolmitPlugin implements Listener { configWatcher = new FileWatcher(getDataFile("settings.json")); getServer().getPluginManager().registerEvents(new CommandLocate(), this); getServer().getPluginManager().registerEvents(new WandManager(), this); - getServer().getPluginManager().registerEvents(new NoDolphin(), this); + getServer().getPluginManager().registerEvents(new InteractionManager(), this); super.onEnable(); Bukkit.getPluginManager().registerEvents(this, this); J.s(this::lateBind); diff --git a/src/main/java/com/volmit/iris/core/InteractionManager.java b/src/main/java/com/volmit/iris/core/InteractionManager.java new file mode 100644 index 000000000..1de34dd61 --- /dev/null +++ b/src/main/java/com/volmit/iris/core/InteractionManager.java @@ -0,0 +1,64 @@ +package com.volmit.iris.core; + +import com.volmit.iris.Iris; +import com.volmit.iris.core.tools.IrisToolbelt; +import com.volmit.iris.engine.object.entity.IrisEntityVillagerOverride; +import com.volmit.iris.util.math.RNG; +import org.bukkit.Material; +import org.bukkit.entity.EntityType; +import org.bukkit.event.EventHandler; +import org.bukkit.event.Listener; +import org.bukkit.event.entity.EntityInteractEvent; +import org.bukkit.event.entity.EntityPickupItemEvent; +import org.bukkit.event.entity.VillagerAcquireTradeEvent; +import org.bukkit.inventory.MerchantRecipe; + +public class InteractionManager implements Listener { + + /** + * Prevents dolphins from trying to locate a treasure map. + * Note: This results in odd dolphin behaviour, but it's the best we can do. + */ + @EventHandler + public void on(EntityPickupItemEvent event){ + if (!IrisToolbelt.isIrisWorld(event.getEntity().getWorld())){ + return; + } + + if (event.getEntityType().equals(EntityType.DOLPHIN)){ + event.setCancelled(true); + } + } + + /** + * Replace or disable villager trade add event to prevent explorer map + */ + @EventHandler + public void on(VillagerAcquireTradeEvent event){ + if (!IrisToolbelt.isIrisWorld((event.getEntity().getWorld()))){ + return; + } + + // Iris.info("Trade event: type " + event.getRecipe().getResult().getType() + " / meta " + event.getRecipe().getResult().getItemMeta() + " / data " + event.getRecipe().getResult().getData()); + if (event.getRecipe().getResult().getType().equals(Material.FILLED_MAP)){ + IrisEntityVillagerOverride override = IrisToolbelt.access(event.getEntity().getWorld()).getCompound().getRootDimension().getVillagerTrade(); + + if (override.isDisableTrade()){ + event.setCancelled(true); + Iris.debug("Cancelled cartographer trade @ " + event.getEntity().getLocation()); + return; + } + + if (!override.getItems().isValidItems()){ + event.setCancelled(true); + Iris.debug("Cancelled cartographer trade because override items not valid @ " + event.getEntity().getLocation()); + return; + } + + MerchantRecipe recipe = new MerchantRecipe(override.getItems().getResult(), override.getItems().getAmount()); + recipe.setIngredients(override.getItems().getIngredients()); + event.setRecipe(recipe); + Iris.debug("Overrode cartographer trade with: " + recipe + " to prevent allowing cartography map trades"); + } + } +} diff --git a/src/main/java/com/volmit/iris/engine/object/dimensional/IrisDimension.java b/src/main/java/com/volmit/iris/engine/object/dimensional/IrisDimension.java index c78be70e0..c9eedcc6e 100644 --- a/src/main/java/com/volmit/iris/engine/object/dimensional/IrisDimension.java +++ b/src/main/java/com/volmit/iris/engine/object/dimensional/IrisDimension.java @@ -34,6 +34,7 @@ import com.volmit.iris.engine.object.carve.IrisCaveFluid; import com.volmit.iris.engine.object.carve.IrisCaveLayer; import com.volmit.iris.engine.object.carve.IrisCaverns; import com.volmit.iris.engine.object.deposits.IrisDepositGenerator; +import com.volmit.iris.engine.object.entity.IrisEntityVillagerOverride; import com.volmit.iris.engine.object.feature.IrisFeaturePositional; import com.volmit.iris.engine.object.feature.IrisFeaturePotential; import com.volmit.iris.engine.object.jigsaw.IrisJigsawStructure; @@ -330,6 +331,9 @@ public class IrisDimension extends IrisRegistrant { @Desc("Define biome mutations for this dimension") private KList mutations = new KList<>(); + @Desc("Cartographer map trade overrides") + private IrisEntityVillagerOverride villagerTrade = new IrisEntityVillagerOverride().setDisableTrade(false); + private final transient AtomicCache parallaxSize = new AtomicCache<>(); private final transient AtomicCache rockLayerGenerator = new AtomicCache<>(); private final transient AtomicCache fluidLayerGenerator = new AtomicCache<>(); diff --git a/src/main/java/com/volmit/iris/engine/object/entity/IrisEntityVillagerOverride.java b/src/main/java/com/volmit/iris/engine/object/entity/IrisEntityVillagerOverride.java new file mode 100644 index 000000000..90ed5e23a --- /dev/null +++ b/src/main/java/com/volmit/iris/engine/object/entity/IrisEntityVillagerOverride.java @@ -0,0 +1,42 @@ +package com.volmit.iris.engine.object.entity; + +import com.volmit.iris.engine.object.annotations.DependsOn; +import com.volmit.iris.engine.object.annotations.Desc; +import com.volmit.iris.engine.object.annotations.Required; +import lombok.AllArgsConstructor; +import lombok.Data; +import lombok.EqualsAndHashCode; +import lombok.NoArgsConstructor; +import lombok.experimental.Accessors; +import org.bukkit.Material; +import org.bukkit.inventory.ItemStack; + +@Accessors(chain = true) +@NoArgsConstructor +@AllArgsConstructor + +@Desc("Override cartographer map trades with others or disable the trade altogether") +@Data +@EqualsAndHashCode(callSuper = false) +public class IrisEntityVillagerOverride { + @Desc(""" + Disable the trade altogether. + If a cartographer villager gets a new explorer map trade: + If this is enabled -> the trade is removed + If this is disabled -> the trade is replaced with the "override" setting below + Default is true, so if you omit this, trades will be removed.""") + private boolean disableTrade = true; + + @DependsOn("disableTrade") + @Required + @Desc(""" + The items to override the cartographer trade with. + By default, this is 3 emeralds + 3 glass blocks -> 1 spyglass. + Can trade 3 to 5 times""") + private IrisEntityVillagerOverrideItems items = new IrisEntityVillagerOverrideItems() + .setIngredient1(new ItemStack(Material.EMERALD, 3)) + .setIngredient2(new ItemStack(Material.GLASS, 3)) + .setResult(new ItemStack(Material.SPYGLASS)) + .setMinTrades(3) + .setMaxTrades(5); +} diff --git a/src/main/java/com/volmit/iris/engine/object/entity/IrisEntityVillagerOverrideItems.java b/src/main/java/com/volmit/iris/engine/object/entity/IrisEntityVillagerOverrideItems.java new file mode 100644 index 000000000..4f065144e --- /dev/null +++ b/src/main/java/com/volmit/iris/engine/object/entity/IrisEntityVillagerOverrideItems.java @@ -0,0 +1,81 @@ +package com.volmit.iris.engine.object.entity; + + +import com.volmit.iris.engine.object.annotations.*; +import com.volmit.iris.util.collection.KList; +import com.volmit.iris.util.math.RNG; +import lombok.AllArgsConstructor; +import lombok.Data; +import lombok.EqualsAndHashCode; +import lombok.NoArgsConstructor; +import lombok.experimental.Accessors; +import org.bukkit.inventory.ItemStack; + +import java.util.List; + + +@Accessors(chain = true) +@NoArgsConstructor +@AllArgsConstructor + +@SuppressWarnings("BooleanMethodIsAlwaysInverted") +@Desc("Override cartographer map trades with these items. ") +@Data +@EqualsAndHashCode(callSuper = false) +public class IrisEntityVillagerOverrideItems { + + @Required + @RegistryListItemType + @Desc("The first, required, ingredient for the trade.\nNote: this MUST be an item, and may not be a non-obtainable block!") + private ItemStack ingredient1; + + @RegistryListItemType + @Desc("The second, optional, ingredient for the trade.\nNote: this MUST be an item, and may not be a non-obtainable block!") + private ItemStack ingredient2 = null; + + @Required + @RegistryListItemType + @Desc("The result of the trade.\nNote: this MUST be an item, and may not be a non-obtainable block!") + private ItemStack result; + + @Desc("The min amount of times this trade can be done. Default 3") + @MinNumber(1) + @MaxNumber(64) + private int minTrades = 3; + + @Desc("The max amount of times this trade can be done. Default 5") + @MinNumber(1) + @MaxNumber(64) + private int maxTrades = 5; + + /** + * @return true if:
+ * ingredient 1 & result are non-null,
+ * mintrades > 0, maxtrades > 0, maxtrades > mintrades, and
+ * ingredient 1, (if defined ingredient 2) and the result are valid items + */ + public boolean isValidItems(){ + if (ingredient1 == null || result == null || minTrades <= 0 || maxTrades <= 0 || maxTrades < minTrades){ + return false; + } + return ingredient1.getType().isItem() && (ingredient2 == null || ingredient2.getType().isItem()) && result.getType().isItem(); + } + + /** + * Get the ingredients + * @return The list of 1 or 2 ingredients (depending on if ing2 is null) + */ + public List getIngredients() { + if (!isValidItems()){ + return null; + } + return ingredient2 == null ? new KList<>(ingredient1) : new KList<>(ingredient1, ingredient2); + } + + /** + * @return the amount of trades (RNG.r.i(min, max)) + */ + public int getAmount() { + return RNG.r.i(minTrades, maxTrades); + } +} From a3889fe36968dd527deef1c04df0df9585e83e26 Mon Sep 17 00:00:00 2001 From: CocoTheOwner Date: Fri, 6 Aug 2021 11:31:25 +0200 Subject: [PATCH 03/12] Rename var in dimension --- .../volmit/iris/engine/object/dimensional/IrisDimension.java | 2 +- ...sEntityVillagerOverrideItems.java => IrisVillagerTrade.java} | 0 2 files changed, 1 insertion(+), 1 deletion(-) rename src/main/java/com/volmit/iris/engine/object/entity/{IrisEntityVillagerOverrideItems.java => IrisVillagerTrade.java} (100%) diff --git a/src/main/java/com/volmit/iris/engine/object/dimensional/IrisDimension.java b/src/main/java/com/volmit/iris/engine/object/dimensional/IrisDimension.java index c9eedcc6e..f0301dd93 100644 --- a/src/main/java/com/volmit/iris/engine/object/dimensional/IrisDimension.java +++ b/src/main/java/com/volmit/iris/engine/object/dimensional/IrisDimension.java @@ -332,7 +332,7 @@ public class IrisDimension extends IrisRegistrant { private KList mutations = new KList<>(); @Desc("Cartographer map trade overrides") - private IrisEntityVillagerOverride villagerTrade = new IrisEntityVillagerOverride().setDisableTrade(false); + private IrisEntityVillagerOverride patchCartographers = new IrisEntityVillagerOverride().setDisableTrade(false); private final transient AtomicCache parallaxSize = new AtomicCache<>(); private final transient AtomicCache rockLayerGenerator = new AtomicCache<>(); diff --git a/src/main/java/com/volmit/iris/engine/object/entity/IrisEntityVillagerOverrideItems.java b/src/main/java/com/volmit/iris/engine/object/entity/IrisVillagerTrade.java similarity index 100% rename from src/main/java/com/volmit/iris/engine/object/entity/IrisEntityVillagerOverrideItems.java rename to src/main/java/com/volmit/iris/engine/object/entity/IrisVillagerTrade.java From a1110a847d6967092e424060f1e97abe5aec52ad Mon Sep 17 00:00:00 2001 From: CocoTheOwner Date: Fri, 6 Aug 2021 11:33:12 +0200 Subject: [PATCH 04/12] Patch dolphin, generify trades, move to dir, trades list repl. one --- .../volmit/iris/core/InteractionManager.java | 30 +++++++++---------- .../object/dimensional/IrisDimension.java | 4 +-- .../IrisVillagerOverride.java} | 17 ++++++++--- .../IrisVillagerTrade.java | 17 +++++++++-- 4 files changed, 43 insertions(+), 25 deletions(-) rename src/main/java/com/volmit/iris/engine/object/{entity/IrisEntityVillagerOverride.java => villager/IrisVillagerOverride.java} (70%) rename src/main/java/com/volmit/iris/engine/object/{entity => villager}/IrisVillagerTrade.java (84%) diff --git a/src/main/java/com/volmit/iris/core/InteractionManager.java b/src/main/java/com/volmit/iris/core/InteractionManager.java index 1de34dd61..f7c6ecbd0 100644 --- a/src/main/java/com/volmit/iris/core/InteractionManager.java +++ b/src/main/java/com/volmit/iris/core/InteractionManager.java @@ -2,30 +2,29 @@ package com.volmit.iris.core; import com.volmit.iris.Iris; import com.volmit.iris.core.tools.IrisToolbelt; -import com.volmit.iris.engine.object.entity.IrisEntityVillagerOverride; -import com.volmit.iris.util.math.RNG; +import com.volmit.iris.engine.object.villager.IrisVillagerOverride; +import com.volmit.iris.engine.object.villager.IrisVillagerTrade; import org.bukkit.Material; import org.bukkit.entity.EntityType; import org.bukkit.event.EventHandler; import org.bukkit.event.Listener; -import org.bukkit.event.entity.EntityInteractEvent; -import org.bukkit.event.entity.EntityPickupItemEvent; import org.bukkit.event.entity.VillagerAcquireTradeEvent; -import org.bukkit.inventory.MerchantRecipe; +import org.bukkit.event.player.PlayerInteractEntityEvent; public class InteractionManager implements Listener { /** - * Prevents dolphins from trying to locate a treasure map. + * Prevents dolphins from being fed, to locate a treasure map. * Note: This results in odd dolphin behaviour, but it's the best we can do. */ @EventHandler - public void on(EntityPickupItemEvent event){ - if (!IrisToolbelt.isIrisWorld(event.getEntity().getWorld())){ + public void on(PlayerInteractEntityEvent event){ + if (!IrisToolbelt.isIrisWorld(event.getPlayer().getWorld())){ return; } - if (event.getEntityType().equals(EntityType.DOLPHIN)){ + Material hand = event.getPlayer().getInventory().getItem(event.getHand()).getType(); + if (event.getRightClicked().getType().equals(EntityType.DOLPHIN) && (hand.equals(Material.TROPICAL_FISH) || hand.equals(Material.PUFFERFISH) || hand.equals(Material.COD) || hand.equals(Material.SALMON))){ event.setCancelled(true); } } @@ -41,7 +40,7 @@ public class InteractionManager implements Listener { // Iris.info("Trade event: type " + event.getRecipe().getResult().getType() + " / meta " + event.getRecipe().getResult().getItemMeta() + " / data " + event.getRecipe().getResult().getData()); if (event.getRecipe().getResult().getType().equals(Material.FILLED_MAP)){ - IrisEntityVillagerOverride override = IrisToolbelt.access(event.getEntity().getWorld()).getCompound().getRootDimension().getVillagerTrade(); + IrisVillagerOverride override = IrisToolbelt.access(event.getEntity().getWorld()).getCompound().getRootDimension().getPatchCartographers(); if (override.isDisableTrade()){ event.setCancelled(true); @@ -49,16 +48,15 @@ public class InteractionManager implements Listener { return; } - if (!override.getItems().isValidItems()){ + if (override.getValidItems() == null){ event.setCancelled(true); - Iris.debug("Cancelled cartographer trade because override items not valid @ " + event.getEntity().getLocation()); + Iris.debug("Cancelled cartographer trade because no override items are valid @ " + event.getEntity().getLocation()); return; } - MerchantRecipe recipe = new MerchantRecipe(override.getItems().getResult(), override.getItems().getAmount()); - recipe.setIngredients(override.getItems().getIngredients()); - event.setRecipe(recipe); - Iris.debug("Overrode cartographer trade with: " + recipe + " to prevent allowing cartography map trades"); + IrisVillagerTrade trade = override.getValidItems().getRandom(); + event.setRecipe(trade.convert()); + Iris.debug("Overrode cartographer trade with: " + trade + " to prevent allowing cartography map trades"); } } } diff --git a/src/main/java/com/volmit/iris/engine/object/dimensional/IrisDimension.java b/src/main/java/com/volmit/iris/engine/object/dimensional/IrisDimension.java index f0301dd93..34b8ac4e9 100644 --- a/src/main/java/com/volmit/iris/engine/object/dimensional/IrisDimension.java +++ b/src/main/java/com/volmit/iris/engine/object/dimensional/IrisDimension.java @@ -34,7 +34,7 @@ import com.volmit.iris.engine.object.carve.IrisCaveFluid; import com.volmit.iris.engine.object.carve.IrisCaveLayer; import com.volmit.iris.engine.object.carve.IrisCaverns; import com.volmit.iris.engine.object.deposits.IrisDepositGenerator; -import com.volmit.iris.engine.object.entity.IrisEntityVillagerOverride; +import com.volmit.iris.engine.object.villager.IrisVillagerOverride; import com.volmit.iris.engine.object.feature.IrisFeaturePositional; import com.volmit.iris.engine.object.feature.IrisFeaturePotential; import com.volmit.iris.engine.object.jigsaw.IrisJigsawStructure; @@ -332,7 +332,7 @@ public class IrisDimension extends IrisRegistrant { private KList mutations = new KList<>(); @Desc("Cartographer map trade overrides") - private IrisEntityVillagerOverride patchCartographers = new IrisEntityVillagerOverride().setDisableTrade(false); + private IrisVillagerOverride patchCartographers = new IrisVillagerOverride().setDisableTrade(false); private final transient AtomicCache parallaxSize = new AtomicCache<>(); private final transient AtomicCache rockLayerGenerator = new AtomicCache<>(); diff --git a/src/main/java/com/volmit/iris/engine/object/entity/IrisEntityVillagerOverride.java b/src/main/java/com/volmit/iris/engine/object/villager/IrisVillagerOverride.java similarity index 70% rename from src/main/java/com/volmit/iris/engine/object/entity/IrisEntityVillagerOverride.java rename to src/main/java/com/volmit/iris/engine/object/villager/IrisVillagerOverride.java index 90ed5e23a..a7c82c246 100644 --- a/src/main/java/com/volmit/iris/engine/object/entity/IrisEntityVillagerOverride.java +++ b/src/main/java/com/volmit/iris/engine/object/villager/IrisVillagerOverride.java @@ -1,8 +1,10 @@ -package com.volmit.iris.engine.object.entity; +package com.volmit.iris.engine.object.villager; +import com.volmit.iris.engine.object.annotations.ArrayType; import com.volmit.iris.engine.object.annotations.DependsOn; import com.volmit.iris.engine.object.annotations.Desc; import com.volmit.iris.engine.object.annotations.Required; +import com.volmit.iris.util.collection.KList; import lombok.AllArgsConstructor; import lombok.Data; import lombok.EqualsAndHashCode; @@ -18,7 +20,7 @@ import org.bukkit.inventory.ItemStack; @Desc("Override cartographer map trades with others or disable the trade altogether") @Data @EqualsAndHashCode(callSuper = false) -public class IrisEntityVillagerOverride { +public class IrisVillagerOverride { @Desc(""" Disable the trade altogether. If a cartographer villager gets a new explorer map trade: @@ -33,10 +35,17 @@ public class IrisEntityVillagerOverride { The items to override the cartographer trade with. By default, this is 3 emeralds + 3 glass blocks -> 1 spyglass. Can trade 3 to 5 times""") - private IrisEntityVillagerOverrideItems items = new IrisEntityVillagerOverrideItems() + @ArrayType(min = 1, type = IrisVillagerTrade.class) + private KList items = new KList<>(new IrisVillagerTrade() .setIngredient1(new ItemStack(Material.EMERALD, 3)) .setIngredient2(new ItemStack(Material.GLASS, 3)) .setResult(new ItemStack(Material.SPYGLASS)) .setMinTrades(3) - .setMaxTrades(5); + .setMaxTrades(5)); + + public KList getValidItems(){ + KList valid = new KList<>(); + getItems().stream().filter(IrisVillagerTrade::isValidItems).forEach(valid::add); + return valid.size() == 0 ? null : valid; + } } diff --git a/src/main/java/com/volmit/iris/engine/object/entity/IrisVillagerTrade.java b/src/main/java/com/volmit/iris/engine/object/villager/IrisVillagerTrade.java similarity index 84% rename from src/main/java/com/volmit/iris/engine/object/entity/IrisVillagerTrade.java rename to src/main/java/com/volmit/iris/engine/object/villager/IrisVillagerTrade.java index 4f065144e..1fa624fd6 100644 --- a/src/main/java/com/volmit/iris/engine/object/entity/IrisVillagerTrade.java +++ b/src/main/java/com/volmit/iris/engine/object/villager/IrisVillagerTrade.java @@ -1,8 +1,9 @@ -package com.volmit.iris.engine.object.entity; +package com.volmit.iris.engine.object.villager; import com.volmit.iris.engine.object.annotations.*; import com.volmit.iris.util.collection.KList; +import com.volmit.iris.util.math.M; import com.volmit.iris.util.math.RNG; import lombok.AllArgsConstructor; import lombok.Data; @@ -10,6 +11,7 @@ import lombok.EqualsAndHashCode; import lombok.NoArgsConstructor; import lombok.experimental.Accessors; import org.bukkit.inventory.ItemStack; +import org.bukkit.inventory.MerchantRecipe; import java.util.List; @@ -19,10 +21,10 @@ import java.util.List; @AllArgsConstructor @SuppressWarnings("BooleanMethodIsAlwaysInverted") -@Desc("Override cartographer map trades with these items. ") +@Desc("Represents a villager trade.") @Data @EqualsAndHashCode(callSuper = false) -public class IrisEntityVillagerOverrideItems { +public class IrisVillagerTrade { @Required @RegistryListItemType @@ -78,4 +80,13 @@ public class IrisEntityVillagerOverrideItems { public int getAmount() { return RNG.r.i(minTrades, maxTrades); } + + /** + * @return the trade as a merchant recipe + */ + public MerchantRecipe convert(){ + MerchantRecipe recipe = new MerchantRecipe(getResult(), getAmount()); + recipe.setIngredients(getIngredients()); + return recipe; + } } From e5f14ac176bd9b8d4d543c52f9ae17d94831095c Mon Sep 17 00:00:00 2001 From: CocoTheOwner Date: Fri, 6 Aug 2021 11:36:12 +0200 Subject: [PATCH 05/12] Split into villager & dolphin manager --- src/main/java/com/volmit/iris/Iris.java | 20 ++----------- .../com/volmit/iris/core/DolphinManager.java | 28 +++++++++++++++++++ ...ctionManager.java => VillagerManager.java} | 21 +------------- 3 files changed, 31 insertions(+), 38 deletions(-) create mode 100644 src/main/java/com/volmit/iris/core/DolphinManager.java rename src/main/java/com/volmit/iris/core/{InteractionManager.java => VillagerManager.java} (68%) diff --git a/src/main/java/com/volmit/iris/Iris.java b/src/main/java/com/volmit/iris/Iris.java index 054751536..d571b5e59 100644 --- a/src/main/java/com/volmit/iris/Iris.java +++ b/src/main/java/com/volmit/iris/Iris.java @@ -56,30 +56,13 @@ import com.volmit.iris.util.scheduling.Queue; import com.volmit.iris.util.scheduling.ShurikenQueue; import io.papermc.lib.PaperLib; import org.bukkit.*; -import org.bukkit.attribute.Attribute; -import org.bukkit.attribute.AttributeInstance; -import org.bukkit.block.Block; -import org.bukkit.block.BlockFace; -import org.bukkit.block.PistonMoveReaction; import org.bukkit.command.Command; import org.bukkit.command.CommandSender; -import org.bukkit.entity.EntityType; import org.bukkit.entity.Player; import org.bukkit.event.Event; -import org.bukkit.event.EventHandler; import org.bukkit.event.HandlerList; import org.bukkit.event.Listener; -import org.bukkit.event.entity.EntityDamageEvent; -import org.bukkit.event.entity.EntitySpawnEvent; -import org.bukkit.event.player.PlayerTeleportEvent; -import org.bukkit.event.world.StructureGrowEvent; import org.bukkit.generator.ChunkGenerator; -import org.bukkit.inventory.EntityEquipment; -import org.bukkit.loot.LootTable; -import org.bukkit.metadata.MetadataValue; -import org.bukkit.permissions.PermissionAttachment; -import org.bukkit.permissions.PermissionAttachmentInfo; -import org.bukkit.persistence.PersistentDataContainer; import org.bukkit.plugin.Plugin; import java.io.*; @@ -156,7 +139,8 @@ public class Iris extends VolmitPlugin implements Listener { configWatcher = new FileWatcher(getDataFile("settings.json")); getServer().getPluginManager().registerEvents(new CommandLocate(), this); getServer().getPluginManager().registerEvents(new WandManager(), this); - getServer().getPluginManager().registerEvents(new InteractionManager(), this); + getServer().getPluginManager().registerEvents(new DolphinManager(), this); + getServer().getPluginManager().registerEvents(new VillagerManager(), this); super.onEnable(); Bukkit.getPluginManager().registerEvents(this, this); J.s(this::lateBind); diff --git a/src/main/java/com/volmit/iris/core/DolphinManager.java b/src/main/java/com/volmit/iris/core/DolphinManager.java new file mode 100644 index 000000000..3a2041946 --- /dev/null +++ b/src/main/java/com/volmit/iris/core/DolphinManager.java @@ -0,0 +1,28 @@ +package com.volmit.iris.core; + +import com.volmit.iris.Iris; +import com.volmit.iris.core.tools.IrisToolbelt; +import org.bukkit.Material; +import org.bukkit.entity.EntityType; +import org.bukkit.event.EventHandler; +import org.bukkit.event.Listener; +import org.bukkit.event.player.PlayerInteractEntityEvent; + +public class DolphinManager implements Listener { + + /** + * Prevents dolphins from being fed, to locate a treasure map. + * Note: This results in odd dolphin behaviour, but it's the best we can do. + */ + @EventHandler + public void on(PlayerInteractEntityEvent event){ + if (!IrisToolbelt.isIrisWorld(event.getPlayer().getWorld())){ + return; + } + + Material hand = event.getPlayer().getInventory().getItem(event.getHand()).getType(); + if (event.getRightClicked().getType().equals(EntityType.DOLPHIN) && (hand.equals(Material.TROPICAL_FISH) || hand.equals(Material.PUFFERFISH) || hand.equals(Material.COD) || hand.equals(Material.SALMON))){ + event.setCancelled(true); + } + } +} diff --git a/src/main/java/com/volmit/iris/core/InteractionManager.java b/src/main/java/com/volmit/iris/core/VillagerManager.java similarity index 68% rename from src/main/java/com/volmit/iris/core/InteractionManager.java rename to src/main/java/com/volmit/iris/core/VillagerManager.java index f7c6ecbd0..86c8c52ca 100644 --- a/src/main/java/com/volmit/iris/core/InteractionManager.java +++ b/src/main/java/com/volmit/iris/core/VillagerManager.java @@ -5,30 +5,11 @@ import com.volmit.iris.core.tools.IrisToolbelt; import com.volmit.iris.engine.object.villager.IrisVillagerOverride; import com.volmit.iris.engine.object.villager.IrisVillagerTrade; import org.bukkit.Material; -import org.bukkit.entity.EntityType; import org.bukkit.event.EventHandler; import org.bukkit.event.Listener; import org.bukkit.event.entity.VillagerAcquireTradeEvent; -import org.bukkit.event.player.PlayerInteractEntityEvent; - -public class InteractionManager implements Listener { - - /** - * Prevents dolphins from being fed, to locate a treasure map. - * Note: This results in odd dolphin behaviour, but it's the best we can do. - */ - @EventHandler - public void on(PlayerInteractEntityEvent event){ - if (!IrisToolbelt.isIrisWorld(event.getPlayer().getWorld())){ - return; - } - - Material hand = event.getPlayer().getInventory().getItem(event.getHand()).getType(); - if (event.getRightClicked().getType().equals(EntityType.DOLPHIN) && (hand.equals(Material.TROPICAL_FISH) || hand.equals(Material.PUFFERFISH) || hand.equals(Material.COD) || hand.equals(Material.SALMON))){ - event.setCancelled(true); - } - } +public class VillagerManager implements Listener { /** * Replace or disable villager trade add event to prevent explorer map */ From b844a0e98db909a57acf4f7830f66ef79f21af76 Mon Sep 17 00:00:00 2001 From: CocoTheOwner Date: Fri, 6 Aug 2021 11:37:26 +0200 Subject: [PATCH 06/12] Simplify --- .../com/volmit/iris/core/VillagerManager.java | 38 ++++++++++--------- 1 file changed, 20 insertions(+), 18 deletions(-) diff --git a/src/main/java/com/volmit/iris/core/VillagerManager.java b/src/main/java/com/volmit/iris/core/VillagerManager.java index 86c8c52ca..c7bd8bfda 100644 --- a/src/main/java/com/volmit/iris/core/VillagerManager.java +++ b/src/main/java/com/volmit/iris/core/VillagerManager.java @@ -20,24 +20,26 @@ public class VillagerManager implements Listener { } // Iris.info("Trade event: type " + event.getRecipe().getResult().getType() + " / meta " + event.getRecipe().getResult().getItemMeta() + " / data " + event.getRecipe().getResult().getData()); - if (event.getRecipe().getResult().getType().equals(Material.FILLED_MAP)){ - IrisVillagerOverride override = IrisToolbelt.access(event.getEntity().getWorld()).getCompound().getRootDimension().getPatchCartographers(); - - if (override.isDisableTrade()){ - event.setCancelled(true); - Iris.debug("Cancelled cartographer trade @ " + event.getEntity().getLocation()); - return; - } - - if (override.getValidItems() == null){ - event.setCancelled(true); - Iris.debug("Cancelled cartographer trade because no override items are valid @ " + event.getEntity().getLocation()); - return; - } - - IrisVillagerTrade trade = override.getValidItems().getRandom(); - event.setRecipe(trade.convert()); - Iris.debug("Overrode cartographer trade with: " + trade + " to prevent allowing cartography map trades"); + if (!event.getRecipe().getResult().getType().equals(Material.FILLED_MAP)) { + return; } + + IrisVillagerOverride override = IrisToolbelt.access(event.getEntity().getWorld()).getCompound().getRootDimension().getPatchCartographers(); + + if (override.isDisableTrade()){ + event.setCancelled(true); + Iris.debug("Cancelled cartographer trade @ " + event.getEntity().getLocation()); + return; + } + + if (override.getValidItems() == null){ + event.setCancelled(true); + Iris.debug("Cancelled cartographer trade because no override items are valid @ " + event.getEntity().getLocation()); + return; + } + + IrisVillagerTrade trade = override.getValidItems().getRandom(); + event.setRecipe(trade.convert()); + Iris.debug("Overrode cartographer trade with: " + trade + " to prevent allowing cartography map trades"); } } From a0b8581ec564c625deb0cd3cf3b5109ab075dda7 Mon Sep 17 00:00:00 2001 From: CocoTheOwner Date: Fri, 6 Aug 2021 12:03:10 +0200 Subject: [PATCH 07/12] Nothin --- .../iris/engine/object/villager/IrisVillagerOverride.java | 3 ++- 1 file changed, 2 insertions(+), 1 deletion(-) diff --git a/src/main/java/com/volmit/iris/engine/object/villager/IrisVillagerOverride.java b/src/main/java/com/volmit/iris/engine/object/villager/IrisVillagerOverride.java index a7c82c246..2f2a2c6c4 100644 --- a/src/main/java/com/volmit/iris/engine/object/villager/IrisVillagerOverride.java +++ b/src/main/java/com/volmit/iris/engine/object/villager/IrisVillagerOverride.java @@ -33,7 +33,8 @@ public class IrisVillagerOverride { @Required @Desc(""" The items to override the cartographer trade with. - By default, this is 3 emeralds + 3 glass blocks -> 1 spyglass. + By default, this is: + 3 emeralds + 3 glass blocks -> 1 spyglass. Can trade 3 to 5 times""") @ArrayType(min = 1, type = IrisVillagerTrade.class) private KList items = new KList<>(new IrisVillagerTrade() From 274469d299245fec3897d115f2441eb5ecb82a86 Mon Sep 17 00:00:00 2001 From: CocoTheOwner Date: Fri, 6 Aug 2021 12:09:32 +0200 Subject: [PATCH 08/12] This at least removes the warnings & replaces the description fields --- .../java/com/volmit/iris/core/project/SchemaBuilder.java | 6 ++++++ 1 file changed, 6 insertions(+) diff --git a/src/main/java/com/volmit/iris/core/project/SchemaBuilder.java b/src/main/java/com/volmit/iris/core/project/SchemaBuilder.java index b279ed987..089e252ec 100644 --- a/src/main/java/com/volmit/iris/core/project/SchemaBuilder.java +++ b/src/main/java/com/volmit/iris/core/project/SchemaBuilder.java @@ -561,10 +561,16 @@ public class SchemaBuilder { } private String getFieldDescription(Field r) { + if (r.isAnnotationPresent(Desc.class)) { return r.getDeclaredAnnotation(Desc.class).value(); } + // suppress warnings on bukkit classes + if (r.getDeclaringClass().getName().startsWith("org.bukkit.")){ + return "Bukkit package classes and enums have no descriptions"; + } + warnings.addIfMissing("Missing @Desc on field " + r.getName() + " (" + r.getType() + ") in " + r.getDeclaringClass().getCanonicalName()); return "No Field Description"; } From 6991fa39cc8545a3dc983b5fd5ab3b5c171e3091 Mon Sep 17 00:00:00 2001 From: CocoTheOwner Date: Fri, 6 Aug 2021 12:11:38 +0200 Subject: [PATCH 09/12] more supression --- .../java/com/volmit/iris/core/project/SchemaBuilder.java | 9 +++++++++ 1 file changed, 9 insertions(+) diff --git a/src/main/java/com/volmit/iris/core/project/SchemaBuilder.java b/src/main/java/com/volmit/iris/core/project/SchemaBuilder.java index 089e252ec..6e6dc53fc 100644 --- a/src/main/java/com/volmit/iris/core/project/SchemaBuilder.java +++ b/src/main/java/com/volmit/iris/core/project/SchemaBuilder.java @@ -553,6 +553,10 @@ public class SchemaBuilder { return "object"; } + if (c.getPackageName().startsWith("org.bukkit.")){ + return "object"; + } + if (!c.isAnnotationPresent(Desc.class)) { warnings.addIfMissing("Unsupported Type: " + c.getCanonicalName() + " Did you forget @Desc?"); } @@ -580,6 +584,11 @@ public class SchemaBuilder { return r.getDeclaredAnnotation(Desc.class).value(); } + // suppress warnings on bukkit classes + if (r.getDeclaringClass().getName().startsWith("org.bukkit.")){ + return "Bukkit package classes and enums have no descriptions"; + } + if (!r.isPrimitive() && !r.equals(KList.class) && !r.equals(KMap.class) && r.getCanonicalName().startsWith("com.volmit.")) { warnings.addIfMissing("Missing @Desc on " + r.getSimpleName() + " in " + r.getDeclaringClass().getCanonicalName()); } From 28b6ed500b0c4bd487d7a7aa6844fd30bd91422e Mon Sep 17 00:00:00 2001 From: CocoTheOwner Date: Fri, 6 Aug 2021 12:14:05 +0200 Subject: [PATCH 10/12] or not --- src/main/java/com/volmit/iris/core/project/SchemaBuilder.java | 4 ---- 1 file changed, 4 deletions(-) diff --git a/src/main/java/com/volmit/iris/core/project/SchemaBuilder.java b/src/main/java/com/volmit/iris/core/project/SchemaBuilder.java index 6e6dc53fc..07ba2fe90 100644 --- a/src/main/java/com/volmit/iris/core/project/SchemaBuilder.java +++ b/src/main/java/com/volmit/iris/core/project/SchemaBuilder.java @@ -553,10 +553,6 @@ public class SchemaBuilder { return "object"; } - if (c.getPackageName().startsWith("org.bukkit.")){ - return "object"; - } - if (!c.isAnnotationPresent(Desc.class)) { warnings.addIfMissing("Unsupported Type: " + c.getCanonicalName() + " Did you forget @Desc?"); } From a2af965bad33aef4b4f50a230afb38bf182e5120 Mon Sep 17 00:00:00 2001 From: CocoTheOwner Date: Fri, 6 Aug 2021 12:38:50 +0200 Subject: [PATCH 11/12] This solves the warnings but it's probably better to Probably better to implement an annotation that cancels warnings for fields in classes that aren't Iris', such as bukkit packages. The implementation would be something like @SuppressNoDesc ItemStack items; -> if !field.isAnnotationPresent(SND.class) { // error } --- .../com/volmit/iris/core/project/SchemaBuilder.java | 12 +++++------- 1 file changed, 5 insertions(+), 7 deletions(-) diff --git a/src/main/java/com/volmit/iris/core/project/SchemaBuilder.java b/src/main/java/com/volmit/iris/core/project/SchemaBuilder.java index 07ba2fe90..838560c11 100644 --- a/src/main/java/com/volmit/iris/core/project/SchemaBuilder.java +++ b/src/main/java/com/volmit/iris/core/project/SchemaBuilder.java @@ -28,6 +28,9 @@ import com.volmit.iris.util.data.B; import com.volmit.iris.util.json.JSONArray; import com.volmit.iris.util.json.JSONObject; import org.bukkit.enchantments.Enchantment; +import org.bukkit.inventory.ItemStack; +import org.bukkit.inventory.meta.ItemMeta; +import org.bukkit.material.MaterialData; import org.bukkit.potion.PotionEffectType; import java.awt.*; @@ -529,7 +532,7 @@ public class SchemaBuilder { } private String getType(Class c) { - if (c.equals(int.class) || c.equals(Integer.class) || c.equals(long.class)) { + if (c.equals(int.class) || c.equals(Integer.class) || c.equals(long.class) || c.equals(byte.class)) { return "integer"; } @@ -549,7 +552,7 @@ public class SchemaBuilder { return "array"; } - if (c.equals(KMap.class)) { + if (c.equals(KMap.class) || c.equals(ItemStack.class) || c.equals(ItemMeta.class) || c.equals(MaterialData.class)) { return "object"; } @@ -580,11 +583,6 @@ public class SchemaBuilder { return r.getDeclaredAnnotation(Desc.class).value(); } - // suppress warnings on bukkit classes - if (r.getDeclaringClass().getName().startsWith("org.bukkit.")){ - return "Bukkit package classes and enums have no descriptions"; - } - if (!r.isPrimitive() && !r.equals(KList.class) && !r.equals(KMap.class) && r.getCanonicalName().startsWith("com.volmit.")) { warnings.addIfMissing("Missing @Desc on " + r.getSimpleName() + " in " + r.getDeclaringClass().getCanonicalName()); } From a7761c18673f5805f032343df00a20182f89dde4 Mon Sep 17 00:00:00 2001 From: CocoTheOwner Date: Fri, 6 Aug 2021 12:45:00 +0200 Subject: [PATCH 12/12] Villager trade warning system --- .../object/villager/IrisVillagerTrade.java | 42 ++++++++++++++++++- 1 file changed, 40 insertions(+), 2 deletions(-) diff --git a/src/main/java/com/volmit/iris/engine/object/villager/IrisVillagerTrade.java b/src/main/java/com/volmit/iris/engine/object/villager/IrisVillagerTrade.java index 1fa624fd6..e11356d0b 100644 --- a/src/main/java/com/volmit/iris/engine/object/villager/IrisVillagerTrade.java +++ b/src/main/java/com/volmit/iris/engine/object/villager/IrisVillagerTrade.java @@ -1,10 +1,12 @@ package com.volmit.iris.engine.object.villager; +import com.volmit.iris.Iris; import com.volmit.iris.engine.object.annotations.*; import com.volmit.iris.util.collection.KList; import com.volmit.iris.util.math.M; import com.volmit.iris.util.math.RNG; +import com.volmit.iris.util.scheduling.S; import lombok.AllArgsConstructor; import lombok.Data; import lombok.EqualsAndHashCode; @@ -57,10 +59,46 @@ public class IrisVillagerTrade { * ingredient 1, (if defined ingredient 2) and the result are valid items */ public boolean isValidItems(){ - if (ingredient1 == null || result == null || minTrades <= 0 || maxTrades <= 0 || maxTrades < minTrades){ + KList warnings = new KList<>(); + if (ingredient1 == null) { + warnings.add("Ingredient 1 is null"); + } + + if (result == null) { + warnings.add("Result is null"); + } + + if (minTrades <= 0) { + warnings.add("Negative minimal trades"); + } + + if (maxTrades <= 0) { + warnings.add("Negative maximal trades"); + } + + if (minTrades > maxTrades) { + warnings.add("More minimal than maximal trades"); + } + + if (ingredient1 != null && !ingredient1.getType().isItem()){ + warnings.add("Ingredient 1 is not an item"); + } + + if (ingredient2 != null && !ingredient2.getType().isItem()){ + warnings.add("Ingredient 2 is not an item"); + } + + if (result != null && !result.getType().isItem()){ + warnings.add("Result is not an item"); + } + + if (warnings.isEmpty()) { + return true; + } else { + Iris.warn("Faulty item in cartographer item overrides: " + this); + warnings.forEach(w -> Iris.warn(" " + w)); return false; } - return ingredient1.getType().isItem() && (ingredient2 == null || ingredient2.getType().isItem()) && result.getType().isItem(); } /**