From 6df0e5ab150a52316220c10e9c33163d56d04f63 Mon Sep 17 00:00:00 2001 From: trafficlunar Date: Tue, 30 Jun 2026 22:07:36 +0100 Subject: [PATCH] fix: i did it wrong version 1.0.1 --- pom.xml | 2 +- .../villagerrehab/TradesDataType.java | 40 +++++++++++++++++++ .../listeners/InteractListener.java | 32 ++++++++++++--- 3 files changed, 67 insertions(+), 7 deletions(-) create mode 100644 src/main/java/net/trafficlunar/villagerrehab/TradesDataType.java diff --git a/pom.xml b/pom.xml index 2351edd..3cc1a19 100644 --- a/pom.xml +++ b/pom.xml @@ -6,7 +6,7 @@ net.trafficlunar VillagerRehab - 1.0.0 + 1.0.1 jar VillagerRehab diff --git a/src/main/java/net/trafficlunar/villagerrehab/TradesDataType.java b/src/main/java/net/trafficlunar/villagerrehab/TradesDataType.java new file mode 100644 index 0000000..9fd4807 --- /dev/null +++ b/src/main/java/net/trafficlunar/villagerrehab/TradesDataType.java @@ -0,0 +1,40 @@ +package net.trafficlunar.villagerrehab; + +import org.bukkit.persistence.PersistentDataAdapterContext; +import org.bukkit.persistence.PersistentDataType; + +// Stolen from https://github.com/spartacus04/InstantRestock/blob/master/src/main/java/me/spartacus04/instantrestock/TradesDataType.kt +public class TradesDataType implements PersistentDataType { + + @Override + public Class getPrimitiveType() { + return byte[].class; + } + + @Override + public Class getComplexType() { + return int[].class; + } + + @Override + public byte[] toPrimitive(int[] complex, PersistentDataAdapterContext context) { + byte[] bytes = new byte[complex.length]; + + for (int i = 0; i < complex.length; i++) { + bytes[i] = (byte) complex[i]; + } + + return bytes; + } + + @Override + public int[] fromPrimitive(byte[] primitive, PersistentDataAdapterContext context) { + int[] ints = new int[primitive.length]; + + for (int i = 0; i < primitive.length; i++) { + ints[i] = primitive[i]; + } + + return ints; + } +} \ No newline at end of file diff --git a/src/main/java/net/trafficlunar/villagerrehab/listeners/InteractListener.java b/src/main/java/net/trafficlunar/villagerrehab/listeners/InteractListener.java index 2a5af97..b00862f 100644 --- a/src/main/java/net/trafficlunar/villagerrehab/listeners/InteractListener.java +++ b/src/main/java/net/trafficlunar/villagerrehab/listeners/InteractListener.java @@ -4,22 +4,24 @@ import net.kyori.adventure.key.Key; import net.kyori.adventure.sound.Sound; import net.kyori.adventure.text.Component; import net.kyori.adventure.text.format.NamedTextColor; -import net.trafficlunar.villagerrehab.commands.WandCommand; -import org.bukkit.Bukkit; -import org.bukkit.Effect; +import net.trafficlunar.villagerrehab.TradesDataType; +import org.bukkit.NamespacedKey; import org.bukkit.Particle; -import org.bukkit.attribute.Attribute; -import org.bukkit.attribute.AttributeInstance; import org.bukkit.entity.Entity; import org.bukkit.entity.Player; import org.bukkit.entity.Villager; import org.bukkit.event.EventHandler; import org.bukkit.event.Listener; import org.bukkit.event.player.PlayerInteractEntityEvent; +import org.bukkit.inventory.MerchantRecipe; + +import java.util.List; import static net.trafficlunar.villagerrehab.VillagerRehab.wandItem; public class InteractListener implements Listener { + private final NamespacedKey KEY = new NamespacedKey("instantrestock", "instant_restock"); + @EventHandler public void onInteract(PlayerInteractEntityEvent event) { Player player = event.getPlayer(); @@ -30,7 +32,25 @@ public class InteractListener implements Listener { if (clickedEntity instanceof Villager villager) { event.setCancelled(true); - villager.clearReputations(); + + int[] originalUses = villager.getPersistentDataContainer().get(KEY, new TradesDataType()); + int i = 0; + + List recipes = villager.getRecipes(); + + for (MerchantRecipe recipe : recipes) { + if (originalUses != null && i < originalUses.length) { + recipe.setMaxUses(originalUses[i]); + } else { + recipe.setMaxUses(12); // fallback + } + recipe.setUses(0); + recipe.setDemand(0); + i++; + } + + villager.setRecipes(recipes); + player.sendMessage(Component.text("Rehabbed!").color(NamedTextColor.GOLD)); player.playSound(Sound.sound(Key.key("block.amethyst_block.chime"), Sound.Source.BLOCK, 100.0f, 1.0f)); player.getWorld().spawnParticle(Particle.FIREWORK, villager.getLocation(), 150);