commit a780c49f42154b35b9216a4f00c334ce868458d1 Author: bunchy7s Date: Mon May 18 15:04:57 2026 -0500 Initial commit: Right Click Harvester plugin diff --git a/.vscode/settings.json b/.vscode/settings.json new file mode 100644 index 0000000..0153b31 --- /dev/null +++ b/.vscode/settings.json @@ -0,0 +1,4 @@ +{ + "java.configuration.updateBuildConfiguration": "interactive", + "java.compile.nullAnalysis.mode": "disabled" +} \ No newline at end of file diff --git a/pom.xml b/pom.xml new file mode 100644 index 0000000..62c7d69 --- /dev/null +++ b/pom.xml @@ -0,0 +1,56 @@ + + + 4.0.0 + + test + harvester + 1.0.0-SNAPSHOT + + Right Click Harvester + https://example.com + + + UTF-8 + 21 + 21 + + + + + papermc + https://repo.papermc.io/repository/maven-public/ + + + + + + io.papermc.paper + paper-api + 1.21.1-R0.1-SNAPSHOT + provided + + + com.google.code.gson + gson + 2.11.0 + provided + + + + + ${project.basedir}/src/main/java + + + ${project.basedir}/src/main/resources + + plugin.yml + paper-plugin.yml + + + + + + + \ No newline at end of file diff --git a/src/main/java/test/Harvester.java b/src/main/java/test/Harvester.java new file mode 100644 index 0000000..70824b8 --- /dev/null +++ b/src/main/java/test/Harvester.java @@ -0,0 +1,31 @@ +package test; + +import org.bukkit.plugin.java.JavaPlugin; +import test.managers.PluginManager; +import test.managers.ConfigManager; +import test.listeners.PlayerListener; +import test.listeners.CropHarvestListener; + +public class Harvester extends JavaPlugin { + + @Override + public void onEnable() { + + // Initialize managers + ConfigManager.initialize(this); + PluginManager.getInstance().initialize(); + + // Register listeners + getServer().getPluginManager().registerEvents(new PlayerListener(), this); + getServer().getPluginManager().registerEvents(new CropHarvestListener(), this); + + + getLogger().info("Right Click Harvester has been enabled!"); + } + + @Override + public void onDisable() { + getLogger().info("Right Click Harvester has been disabled!"); + } + +} diff --git a/src/main/java/test/listeners/CropHarvestListener.java b/src/main/java/test/listeners/CropHarvestListener.java new file mode 100644 index 0000000..7974f5a --- /dev/null +++ b/src/main/java/test/listeners/CropHarvestListener.java @@ -0,0 +1,110 @@ +package test.listeners; + +import net.kyori.adventure.text.Component; +import net.kyori.adventure.text.format.NamedTextColor; +import org.bukkit.Material; +import org.bukkit.block.Block; +import org.bukkit.block.data.Ageable; +import org.bukkit.block.data.BlockData; +import org.bukkit.entity.Player; +import org.bukkit.event.EventHandler; +import org.bukkit.event.Listener; +import org.bukkit.event.block.Action; +import org.bukkit.event.player.PlayerInteractEvent; +import org.bukkit.inventory.ItemStack; +import org.bukkit.inventory.meta.Damageable; +import test.managers.ConfigManager; + +import java.util.Collection; +import java.util.Map; + +public class CropHarvestListener implements Listener { + + @EventHandler + public void onCropHarvest(PlayerInteractEvent event) { + if (event.getAction() != Action.RIGHT_CLICK_BLOCK) { + return; + } + + Block block = event.getClickedBlock(); + if (block == null) { + return; + } + + BlockData blockData = block.getBlockData(); + if (!(blockData instanceof Ageable ageable)) { + return; + } + + // Check if fully grown + if (ageable.getAge() < ageable.getMaximumAge()) { + return; + } + + Player player = event.getPlayer(); + ItemStack itemInHand = player.getInventory().getItemInMainHand(); + ConfigManager.ConfigData config = ConfigManager.getInstance().getConfig(); + + // Check if holding a hoe + if (config.Require_Hoe && !isHoe(itemInHand.getType())) { + return; + } + + // Harvest crop + Collection drops = block.getDrops(itemInHand); + Material seedType = getSeedType(block.getType()); + + for (ItemStack drop : drops) { + // If Drop_Seeds is false, skip seeds + if (!config.Drop_Seeds && drop.getType() == seedType) { + continue; + } + + if (config.DropTo.equalsIgnoreCase("inventory")) { + Map leftover = player.getInventory().addItem(drop); + if (!leftover.isEmpty()) { + // Inventory full! + player.sendActionBar(Component.text("Inventory full!", NamedTextColor.RED)); + for (ItemStack item : leftover.values()) { + block.getWorld().dropItemNaturally(block.getLocation(), item); + } + } + } else { + block.getWorld().dropItemNaturally(block.getLocation(), drop); + } + } + + // Reset age to 0 (freshly planted) + ageable.setAge(0); + block.setBlockData(ageable); + + // Use durability if enabled + if (config.Use_Durability) { + if (itemInHand.getItemMeta() instanceof Damageable damageable) { + damageable.setDamage(damageable.getDamage() + 1); + itemInHand.setItemMeta(damageable); + if (damageable.getDamage() >= itemInHand.getType().getMaxDurability()) { + itemInHand.setAmount(0); + } + } + } + + event.setCancelled(true); + } + + private boolean isHoe(Material material) { + return material.name().endsWith("_HOE"); + } + + private Material getSeedType(Material crop) { + return switch (crop) { + case WHEAT -> Material.WHEAT_SEEDS; + case CARROTS -> Material.CARROT; + case POTATOES -> Material.POTATO; + case BEETROOTS -> Material.BEETROOT_SEEDS; + case NETHER_WART -> Material.NETHER_WART; + case COCOA -> Material.COCOA_BEANS; + default -> null; + }; + } +} diff --git a/src/main/java/test/listeners/PlayerListener.java b/src/main/java/test/listeners/PlayerListener.java new file mode 100644 index 0000000..94f8ca8 --- /dev/null +++ b/src/main/java/test/listeners/PlayerListener.java @@ -0,0 +1,13 @@ +package test.listeners; + +import org.bukkit.event.Listener; +import org.bukkit.event.EventHandler; +import org.bukkit.event.player.PlayerJoinEvent; + +public class PlayerListener implements Listener { + + @EventHandler + public void onPlayerJoin(PlayerJoinEvent event) { + // Handle player join event + } +} \ No newline at end of file diff --git a/src/main/java/test/managers/ConfigManager.java b/src/main/java/test/managers/ConfigManager.java new file mode 100644 index 0000000..3915dce --- /dev/null +++ b/src/main/java/test/managers/ConfigManager.java @@ -0,0 +1,77 @@ +package test.managers; + +import com.google.gson.Gson; +import com.google.gson.GsonBuilder; +import test.Harvester; + +import java.io.*; +import java.nio.charset.StandardCharsets; + +public class ConfigManager { + + private static ConfigManager instance; + private final File configFile; + private ConfigData configData; + private final Gson gson; + + private ConfigManager(Harvester plugin) { + this.configFile = new File(plugin.getDataFolder(), "harvester.json"); + this.gson = new GsonBuilder().setPrettyPrinting().create(); + load(); + } + + public static void initialize(Harvester plugin) { + instance = new ConfigManager(plugin); + } + + public static ConfigManager getInstance() { + return instance; + } + + public void load() { + if (!configFile.getParentFile().exists()) { + configFile.getParentFile().mkdirs(); + } + + if (!configFile.exists()) { + this.configData = new ConfigData(); + save(); + } else { + try (Reader reader = new InputStreamReader(new FileInputStream(configFile), StandardCharsets.UTF_8)) { + this.configData = gson.fromJson(reader, ConfigData.class); + if (this.configData == null) { + this.configData = new ConfigData(); + } + } catch (IOException e) { + e.printStackTrace(); + this.configData = new ConfigData(); + } + } + } + + public void save() { + try (Writer writer = new OutputStreamWriter(new FileOutputStream(configFile), StandardCharsets.UTF_8)) { + gson.toJson(configData, writer); + } catch (IOException e) { + e.printStackTrace(); + } + } + + public ConfigData getConfig() { + return configData; + } + + public static class ConfigData { + public String _comment1 = "Drop_Seeds: Whether to drop seeds when harvesting (true/false)"; + public boolean Drop_Seeds = true; + + public String _comment2 = "Use_Durability: Whether the hoe should lose durability (true/false)"; + public boolean Use_Durability = false; + + public String _comment3 = "DropTo: Where to put harvested items ('ground' or 'inventory')"; + public String DropTo = "ground"; + + public String _comment4 = "Require_Hoe: Whether a hoe is required to harvest (true/false)"; + public boolean Require_Hoe = true; + } +} diff --git a/src/main/java/test/managers/PluginManager.java b/src/main/java/test/managers/PluginManager.java new file mode 100644 index 0000000..765f732 --- /dev/null +++ b/src/main/java/test/managers/PluginManager.java @@ -0,0 +1,16 @@ +package test.managers; + +public class PluginManager { + private static PluginManager instance; + + public static PluginManager getInstance() { + if (instance == null) { + instance = new PluginManager(); + } + return instance; + } + + public void initialize() { + // Initialize your managers here + } +} \ No newline at end of file diff --git a/src/main/java/test/utils/Utils.java b/src/main/java/test/utils/Utils.java new file mode 100644 index 0000000..fc544b2 --- /dev/null +++ b/src/main/java/test/utils/Utils.java @@ -0,0 +1,21 @@ +package test.utils; + +import net.kyori.adventure.text.Component; +import net.kyori.adventure.text.minimessage.MiniMessage; +import net.kyori.adventure.text.serializer.legacy.LegacyComponentSerializer; + +public class Utils { + + public static Component colorize(String msg) { + if (msg.contains("<") && msg.contains(">")) { + return MiniMessage.miniMessage().deserialize(msg); + } + return LegacyComponentSerializer.legacyAmpersand().deserialize(msg); + } + + public static String legacyColorize(String msg) { + return LegacyComponentSerializer.legacyAmpersand().serialize( + LegacyComponentSerializer.legacyAmpersand().deserialize(msg) + ); + } +} \ No newline at end of file diff --git a/src/main/resources/paper-plugin.yml b/src/main/resources/paper-plugin.yml new file mode 100644 index 0000000..96cb546 --- /dev/null +++ b/src/main/resources/paper-plugin.yml @@ -0,0 +1,6 @@ +name: Harvester +version: 1.0.0-SNAPSHOT +main: test.Harvester +api-version: '1.21' +author: test +folia-supported: true diff --git a/src/main/resources/plugin.yml b/src/main/resources/plugin.yml new file mode 100644 index 0000000..d033019 --- /dev/null +++ b/src/main/resources/plugin.yml @@ -0,0 +1,5 @@ +main: test.Harvester +version: 1.0.0-SNAPSHOT +name: Harvester +author: test +api-version: 1.21 diff --git a/target/classes/paper-plugin.yml b/target/classes/paper-plugin.yml new file mode 100644 index 0000000..96cb546 --- /dev/null +++ b/target/classes/paper-plugin.yml @@ -0,0 +1,6 @@ +name: Harvester +version: 1.0.0-SNAPSHOT +main: test.Harvester +api-version: '1.21' +author: test +folia-supported: true diff --git a/target/classes/plugin.yml b/target/classes/plugin.yml new file mode 100644 index 0000000..d033019 --- /dev/null +++ b/target/classes/plugin.yml @@ -0,0 +1,5 @@ +main: test.Harvester +version: 1.0.0-SNAPSHOT +name: Harvester +author: test +api-version: 1.21 diff --git a/target/classes/test/Harvester.class b/target/classes/test/Harvester.class new file mode 100644 index 0000000..b3ded94 Binary files /dev/null and b/target/classes/test/Harvester.class differ diff --git a/target/classes/test/listeners/CropHarvestListener$1.class b/target/classes/test/listeners/CropHarvestListener$1.class new file mode 100644 index 0000000..0d49c68 Binary files /dev/null and b/target/classes/test/listeners/CropHarvestListener$1.class differ diff --git a/target/classes/test/listeners/CropHarvestListener.class b/target/classes/test/listeners/CropHarvestListener.class new file mode 100644 index 0000000..0a15ab4 Binary files /dev/null and b/target/classes/test/listeners/CropHarvestListener.class differ diff --git a/target/classes/test/listeners/PlayerListener.class b/target/classes/test/listeners/PlayerListener.class new file mode 100644 index 0000000..e07a3d0 Binary files /dev/null and b/target/classes/test/listeners/PlayerListener.class differ diff --git a/target/classes/test/managers/ConfigManager$ConfigData.class b/target/classes/test/managers/ConfigManager$ConfigData.class new file mode 100644 index 0000000..ff1541f Binary files /dev/null and b/target/classes/test/managers/ConfigManager$ConfigData.class differ diff --git a/target/classes/test/managers/ConfigManager.class b/target/classes/test/managers/ConfigManager.class new file mode 100644 index 0000000..87ccd13 Binary files /dev/null and b/target/classes/test/managers/ConfigManager.class differ diff --git a/target/classes/test/managers/PluginManager.class b/target/classes/test/managers/PluginManager.class new file mode 100644 index 0000000..0f7ccdc Binary files /dev/null and b/target/classes/test/managers/PluginManager.class differ diff --git a/target/classes/test/utils/Utils.class b/target/classes/test/utils/Utils.class new file mode 100644 index 0000000..720e082 Binary files /dev/null and b/target/classes/test/utils/Utils.class differ diff --git a/target/harvester-1.0.0-SNAPSHOT.jar b/target/harvester-1.0.0-SNAPSHOT.jar new file mode 100644 index 0000000..507f456 Binary files /dev/null and b/target/harvester-1.0.0-SNAPSHOT.jar differ diff --git a/target/maven-archiver/pom.properties b/target/maven-archiver/pom.properties new file mode 100644 index 0000000..66ae552 --- /dev/null +++ b/target/maven-archiver/pom.properties @@ -0,0 +1,5 @@ +#Generated by Maven +#Mon May 18 14:52:10 CDT 2026 +artifactId=harvester +groupId=test +version=1.0.0-SNAPSHOT diff --git a/target/maven-status/maven-compiler-plugin/compile/default-compile/createdFiles.lst b/target/maven-status/maven-compiler-plugin/compile/default-compile/createdFiles.lst new file mode 100644 index 0000000..f8288b8 --- /dev/null +++ b/target/maven-status/maven-compiler-plugin/compile/default-compile/createdFiles.lst @@ -0,0 +1,8 @@ +test/managers/ConfigManager$ConfigData.class +test/managers/PluginManager.class +test/listeners/PlayerListener.class +test/managers/ConfigManager.class +test/utils/Utils.class +test/listeners/CropHarvestListener$1.class +test/Harvester.class +test/listeners/CropHarvestListener.class diff --git a/target/maven-status/maven-compiler-plugin/compile/default-compile/inputFiles.lst b/target/maven-status/maven-compiler-plugin/compile/default-compile/inputFiles.lst new file mode 100644 index 0000000..1992bc1 --- /dev/null +++ b/target/maven-status/maven-compiler-plugin/compile/default-compile/inputFiles.lst @@ -0,0 +1,6 @@ +/home/bunchy7s/programs/mcplugins/test1/test/src/main/java/test/Harvester.java +/home/bunchy7s/programs/mcplugins/test1/test/src/main/java/test/listeners/PlayerListener.java +/home/bunchy7s/programs/mcplugins/test1/test/src/main/java/test/listeners/CropHarvestListener.java +/home/bunchy7s/programs/mcplugins/test1/test/src/main/java/test/utils/Utils.java +/home/bunchy7s/programs/mcplugins/test1/test/src/main/java/test/managers/PluginManager.java +/home/bunchy7s/programs/mcplugins/test1/test/src/main/java/test/managers/ConfigManager.java