From dd896abc287ba22cdeb3b64603a818667a2655c5 Mon Sep 17 00:00:00 2001 From: Benjamin Kraft Date: Thu, 29 Aug 2024 22:02:19 +0200 Subject: [PATCH] Version 1.0 done --- .gitignore | 115 ++++++++++++++ deploy.sh | 2 + pom.xml | 71 +++++++++ .../saplingsreplant/SaplingsReplant.java | 142 ++++++++++++++++++ src/main/resources/plugin.yml | 4 + start.sh | 3 + 6 files changed, 337 insertions(+) create mode 100644 .gitignore create mode 100644 deploy.sh create mode 100644 pom.xml create mode 100644 src/main/java/eu/benjaminkraft/saplingsreplant/SaplingsReplant.java create mode 100644 src/main/resources/plugin.yml create mode 100755 start.sh diff --git a/.gitignore b/.gitignore new file mode 100644 index 0000000..bb16192 --- /dev/null +++ b/.gitignore @@ -0,0 +1,115 @@ +# 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/ + +server diff --git a/deploy.sh b/deploy.sh new file mode 100644 index 0000000..b4d429a --- /dev/null +++ b/deploy.sh @@ -0,0 +1,2 @@ +#!/usr/bin/env bash +cp target/SaplingsReplant-1.0.jar server/plugins diff --git a/pom.xml b/pom.xml new file mode 100644 index 0000000..94e4527 --- /dev/null +++ b/pom.xml @@ -0,0 +1,71 @@ + + + 4.0.0 + + eu.benjaminkraft + SaplingsReplant + 1.0 + jar + + SaplingsReplant + + + 1.8 + UTF-8 + + + + + + org.apache.maven.plugins + maven-compiler-plugin + 3.8.1 + + ${java.version} + ${java.version} + + + + org.apache.maven.plugins + maven-shade-plugin + 3.2.4 + + + package + + shade + + + + + + + + src/main/resources + true + + + + + + + spigotmc-repo + https://hub.spigotmc.org/nexus/content/repositories/snapshots/ + + + sonatype + https://oss.sonatype.org/content/groups/public/ + + + + + + org.spigotmc + spigot-api + 1.19-R0.1-SNAPSHOT + provided + + + diff --git a/src/main/java/eu/benjaminkraft/saplingsreplant/SaplingsReplant.java b/src/main/java/eu/benjaminkraft/saplingsreplant/SaplingsReplant.java new file mode 100644 index 0000000..8037246 --- /dev/null +++ b/src/main/java/eu/benjaminkraft/saplingsreplant/SaplingsReplant.java @@ -0,0 +1,142 @@ +package eu.benjaminkraft.saplingsreplant; + +import org.bukkit.Bukkit; +import org.bukkit.Material; +import org.bukkit.block.Block; +import org.bukkit.block.BlockFace; +import org.bukkit.entity.Item; +import org.bukkit.event.EventHandler; +import org.bukkit.event.Listener; +import org.bukkit.event.entity.*; +import org.bukkit.plugin.java.JavaPlugin; + +import java.util.EnumSet; +import java.util.HashSet; +import java.util.Set; +import java.util.logging.Logger; + +public final class SaplingsReplant extends JavaPlugin implements Listener { + + Logger logger; + + Set trackedSaplings = new HashSet<>(); + + @Override + public void onEnable() { + logger = getLogger(); + getServer().getPluginManager().registerEvents(this, this); + Bukkit.getScheduler().runTaskTimer(this, this::handleSaplings, 0, 20); + } + + @EventHandler + public void onItemSpawn(ItemSpawnEvent event) { + Item item = event.getEntity(); + + if (!isSapling(item)) + return; + + trackedSaplings.add(item); + logger.info("Spawn: Added Sapling to Tracking-list: " + item.getName()); + } + + @EventHandler + public void onEntityDropItem(EntityDropItemEvent event) { + + Item item = event.getItemDrop(); + + if (!isSapling(item)) + return; + + trackedSaplings.add(item); + logger.info("Drop: Added Sapling to Tracking-list: " + item.getName()); + } + + @EventHandler + public void onItemDespawn(ItemDespawnEvent event) { + Item item = event.getEntity(); + + boolean removed = trackedSaplings.remove(item); + if (removed){ + logger.info("Despawn: Removed Sapling from Tracking-list: " + item.getName()); + } + } + + @EventHandler + public void onItemMerge(ItemMergeEvent event) { + Item item = event.getEntity(); + + boolean removed = trackedSaplings.remove(item); + if (removed){ + logger.info("Merge: Removed Sapling from Tracking-list: " + item.getName()); + } + } + + @EventHandler + public void onEntityPickupItem(EntityPickupItemEvent event) { + boolean removed = trackedSaplings.remove(event.getItem()); + if (removed){ + logger.info("Pickup: Removed Sapling from Tracking-list: " + event.getItem().getName()); + } + } + + private void handleSaplings() { + Set toRemove = new HashSet<>(); + for (Item sapling : trackedSaplings) { + if (!sapling.isOnGround()) + continue; + + Block currentBlock = sapling.getLocation().getBlock(); + if (isSapling(currentBlock.getType())) + continue; + + Block ground = currentBlock.getRelative(BlockFace.DOWN); + Set allowedGrounds = EnumSet.of( + Material.DIRT, + Material.COARSE_DIRT, + Material.ROOTED_DIRT, + Material.GRASS_BLOCK + ); + + if (!allowedGrounds.contains(ground.getType())) + continue; + + currentBlock.setType(sapling.getItemStack().getType()); + sapling.getItemStack().setAmount(sapling.getItemStack().getAmount() - 1); + logger.info("Planted: Reduced Sapling Stack amount"); + + if (sapling.getItemStack().getAmount() == 0){ + logger.info("Planted: Removed Sapling from Tracking-list"); + toRemove.add(sapling); + } + } + trackedSaplings.removeAll(toRemove); + } + + private boolean isSapling(Item item) { + return isSapling(item.getItemStack().getType()); + } + + private boolean isSapling(Material material) { + Set saplings = EnumSet.of( + Material.OAK_SAPLING, + Material.SPRUCE_SAPLING, + Material.ACACIA_SAPLING, + Material.BAMBOO_SAPLING, + Material.BIRCH_SAPLING, + Material.DARK_OAK_SAPLING, + Material.JUNGLE_SAPLING, + Material.POTTED_ACACIA_SAPLING, + Material.POTTED_BIRCH_SAPLING, + Material.POTTED_DARK_OAK_SAPLING, + Material.POTTED_JUNGLE_SAPLING, + Material.POTTED_OAK_SAPLING, + Material.POTTED_SPRUCE_SAPLING + ); + return saplings.contains(material); + } + + @Override + public void onDisable() { + + } +} diff --git a/src/main/resources/plugin.yml b/src/main/resources/plugin.yml new file mode 100644 index 0000000..bd5f7b4 --- /dev/null +++ b/src/main/resources/plugin.yml @@ -0,0 +1,4 @@ +name: SaplingsReplant +version: '${project.version}' +main: eu.benjaminkraft.saplingsreplant.SaplingsReplant +api-version: '1.19' diff --git a/start.sh b/start.sh new file mode 100755 index 0000000..86422ee --- /dev/null +++ b/start.sh @@ -0,0 +1,3 @@ +#!/usr/bin/env bash +cd server +java -jar -agentlib:jdwp=transport=dt_socket,server=y,suspend=n,address=*:5005 paper.jar nogui