commit 28a4e1d5c4e6887ce404abe7e5cb41f419c8535a Author: trafficlunar Date: Tue Jun 30 15:01:24 2026 +0100 feat: my awesome commit diff --git a/.gitattributes b/.gitattributes new file mode 100644 index 0000000..a87d264 --- /dev/null +++ b/.gitattributes @@ -0,0 +1,11 @@ +# +# https://help.github.com/articles/dealing-with-line-endings/ +# +# Linux start script should use lf +/gradlew text eol=lf + +# These are Windows script files and should use crlf +*.bat text eol=crlf + +# Binary files should be left untouched +*.jar binary diff --git a/.gitignore b/.gitignore new file mode 100644 index 0000000..4788b4b --- /dev/null +++ b/.gitignore @@ -0,0 +1,113 @@ +# User-specific stuff +.idea/ + +*.iml +*.ipr +*.iws + +# IntelliJ +out/ + +# Compiled class file +*.class + +# Log file +*.log + +# BlueJ files +*.ctxt + +# Package Files # +*.jar +*.war +*.nar +*.ear +*.zip +*.tar.gz +*.rar + +# virtual machine crash logs, see http://www.java.com/en/download/help/error_hotspot.xml +hs_err_pid* + +*~ + +# temporary files which can be created if a process still has a handle open of a deleted file +.fuse_hidden* + +# KDE directory preferences +.directory + +# Linux trash folder which might appear on any partition or disk +.Trash-* + +# .nfs files are created when an open file is removed but is still being accessed +.nfs* + +# General +.DS_Store +.AppleDouble +.LSOverride + +# Icon must end with two \r +Icon + +# Thumbnails +._* + +# Files that might appear in the root of a volume +.DocumentRevisions-V100 +.fseventsd +.Spotlight-V100 +.TemporaryItems +.Trashes +.VolumeIcon.icns +.com.apple.timemachine.donotpresent + +# Directories potentially created on remote AFP share +.AppleDB +.AppleDesktop +Network Trash Folder +Temporary Items +.apdisk + +# Windows thumbnail cache files +Thumbs.db +Thumbs.db:encryptable +ehthumbs.db +ehthumbs_vista.db + +# Dump file +*.stackdump + +# Folder config file +[Dd]esktop.ini + +# Recycle Bin used on file shares +$RECYCLE.BIN/ + +# Windows Installer files +*.cab +*.msi +*.msix +*.msm +*.msp + +# Windows shortcuts +*.lnk + +target/ + +pom.xml.tag +pom.xml.releaseBackup +pom.xml.versionsBackup +pom.xml.next + +release.properties +dependency-reduced-pom.xml +buildNumber.properties +.mvn/timing.properties +.mvn/wrapper/maven-wrapper.jar +.flattened-pom.xml + +# Common working directory +run/ diff --git a/pom.xml b/pom.xml new file mode 100644 index 0000000..2351edd --- /dev/null +++ b/pom.xml @@ -0,0 +1,68 @@ + + + 4.0.0 + + net.trafficlunar + VillagerRehab + 1.0.0 + jar + + VillagerRehab + + + 25 + UTF-8 + + + + clean package + + + org.apache.maven.plugins + maven-compiler-plugin + 3.13.0 + + ${java.version} + ${java.version} + + + + org.apache.maven.plugins + maven-shade-plugin + 3.5.3 + + + package + + shade + + + + + + + + src/main/resources + true + + + + + + + papermc-repo + https://repo.papermc.io/repository/maven-public/ + + + + + + io.papermc.paper + paper-api + [26.1.2.build,) + provided + + + diff --git a/src/main/java/net/trafficlunar/villagerrehab/VillagerRehab.java b/src/main/java/net/trafficlunar/villagerrehab/VillagerRehab.java new file mode 100644 index 0000000..b1fe6d7 --- /dev/null +++ b/src/main/java/net/trafficlunar/villagerrehab/VillagerRehab.java @@ -0,0 +1,31 @@ +package net.trafficlunar.villagerrehab; + +import net.kyori.adventure.text.Component; +import net.kyori.adventure.text.format.NamedTextColor; +import net.kyori.adventure.text.format.TextDecoration; +import net.trafficlunar.villagerrehab.commands.WandCommand; +import net.trafficlunar.villagerrehab.listeners.InteractListener; +import org.bukkit.Material; +import org.bukkit.inventory.ItemStack; +import org.bukkit.inventory.meta.ItemMeta; +import org.bukkit.plugin.java.JavaPlugin; + +public final class VillagerRehab extends JavaPlugin { + public static ItemStack wandItem; + + @Override + public void onEnable() { + getLogger().info("Crypto miner activated"); + getCommand("rehab").setExecutor(new WandCommand()); + getServer().getPluginManager().registerEvents(new InteractListener(), this); + + wandItem = new ItemStack(Material.GOLDEN_HOE); + ItemMeta meta = wandItem.getItemMeta(); + meta.setUnbreakable(true); + meta.displayName(Component + .text("REHAB WAND") + .color(NamedTextColor.GOLD) + .decorate(TextDecoration.BOLD)); + wandItem.setItemMeta(meta); + } +} diff --git a/src/main/java/net/trafficlunar/villagerrehab/commands/WandCommand.java b/src/main/java/net/trafficlunar/villagerrehab/commands/WandCommand.java new file mode 100644 index 0000000..5b54234 --- /dev/null +++ b/src/main/java/net/trafficlunar/villagerrehab/commands/WandCommand.java @@ -0,0 +1,40 @@ +package net.trafficlunar.villagerrehab.commands; + +import net.kyori.adventure.text.Component; +import net.kyori.adventure.text.format.NamedTextColor; +import net.kyori.adventure.text.format.TextDecoration; +import org.bukkit.command.Command; +import org.bukkit.command.CommandExecutor; +import org.bukkit.command.CommandSender; +import org.bukkit.entity.Player; +import org.bukkit.inventory.ItemStack; +import org.jetbrains.annotations.NotNull; + +import static net.trafficlunar.villagerrehab.VillagerRehab.wandItem; + +public class WandCommand implements CommandExecutor { + @Override + public boolean onCommand(@NotNull CommandSender sender, @NotNull Command command, @NotNull String label, @NotNull String @NotNull [] args) { + if (!(sender instanceof Player player)) { + sender.sendMessage(Component.text("Only players can use this command.").color(NamedTextColor.RED)); + return false; + } + + if (player.getName().equals("LamberJamber")) { + sender.sendMessage(Component.text("You don't deserve this.").color(NamedTextColor.RED).decorate(TextDecoration.BOLD)); + return true; + } + + // Remove existing wands + for (ItemStack stack : player.getInventory().getContents()) { + if (stack != null && stack.isSimilar(wandItem)) { + player.getInventory().remove(stack); + } + } + + player.getInventory().addItem(wandItem); + + sender.sendMessage(Component.text("Rehab Wand given! Right click on a villager to fix their trades").color(NamedTextColor.GOLD)); + return true; + } +} diff --git a/src/main/java/net/trafficlunar/villagerrehab/listeners/InteractListener.java b/src/main/java/net/trafficlunar/villagerrehab/listeners/InteractListener.java new file mode 100644 index 0000000..2a5af97 --- /dev/null +++ b/src/main/java/net/trafficlunar/villagerrehab/listeners/InteractListener.java @@ -0,0 +1,39 @@ +package net.trafficlunar.villagerrehab.listeners; + +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 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 static net.trafficlunar.villagerrehab.VillagerRehab.wandItem; + +public class InteractListener implements Listener { + @EventHandler + public void onInteract(PlayerInteractEntityEvent event) { + Player player = event.getPlayer(); + Entity clickedEntity = event.getRightClicked(); + + // Player must use the wand + if (!(player.getInventory().getItemInMainHand().isSimilar(wandItem))) return; + + if (clickedEntity instanceof Villager villager) { + event.setCancelled(true); + villager.clearReputations(); + 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); + } + } +} diff --git a/src/main/resources/plugin.yml b/src/main/resources/plugin.yml new file mode 100644 index 0000000..e718981 --- /dev/null +++ b/src/main/resources/plugin.yml @@ -0,0 +1,12 @@ +name: VillagerRehab +version: '${version}' + +main: net.trafficlunar.villagerrehab.VillagerRehab +api-version: '26.1.2' +load: POSTWORLD + +commands: + rehab: + description: Send a villager to rehab + usage: /rehab + permission: villagerrehab.rehab \ No newline at end of file