From d2c6430af7a87bdbd00d6818d6e9c131ac39465c Mon Sep 17 00:00:00 2001 From: rattatwinko Date: Thu, 1 May 2025 15:30:06 +0200 Subject: [PATCH] sahur --- .gitignore | 113 +++++++++++++++++++++++ pom.xml | 87 +++++++++++++++++ src/main/kotlin/org/Sahur/sahur/Sahur.kt | 104 +++++++++++++++++++++ src/main/resources/plugin.yml | 10 ++ 4 files changed, 314 insertions(+) create mode 100644 .gitignore create mode 100644 pom.xml create mode 100644 src/main/kotlin/org/Sahur/sahur/Sahur.kt create mode 100644 src/main/resources/plugin.yml 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..f44fe03 --- /dev/null +++ b/pom.xml @@ -0,0 +1,87 @@ + + + 4.0.0 + + org.Sahur + Sahur + 1.0-SNAPSHOT + jar + + Sahur + + + 21 + 2.2.0-Beta2 + UTF-8 + + + + clean package + ${project.basedir}/src/main/kotlin + + + org.jetbrains.kotlin + kotlin-maven-plugin + ${kotlin.version} + + + compile + compile + + compile + + + + + ${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/ + + + sonatype + https://oss.sonatype.org/content/groups/public/ + + + + + + io.papermc.paper + paper-api + 1.21.5-R0.1-SNAPSHOT + provided + + + org.jetbrains.kotlin + kotlin-stdlib-jdk8 + ${kotlin.version} + + + diff --git a/src/main/kotlin/org/Sahur/sahur/Sahur.kt b/src/main/kotlin/org/Sahur/sahur/Sahur.kt new file mode 100644 index 0000000..b01a765 --- /dev/null +++ b/src/main/kotlin/org/Sahur/sahur/Sahur.kt @@ -0,0 +1,104 @@ +package org.Sahur.sahur + +import org.bukkit.* +import org.bukkit.command.* +import org.bukkit.enchantments.Enchantment +import org.bukkit.entity.Player +import org.bukkit.event.* +import org.bukkit.event.player.PlayerInteractEvent +import org.bukkit.event.entity.EntityDamageEvent +import org.bukkit.inventory.* +import org.bukkit.inventory.meta.ItemMeta +import org.bukkit.metadata.FixedMetadataValue +import org.bukkit.plugin.java.JavaPlugin +import org.bukkit.util.Vector + +class Sahur : JavaPlugin(), Listener { + + override fun onEnable() { + logger.info("Sahur is enabled!") + server.pluginManager.registerEvents(this, this) + getCommand("sahur")?.setExecutor(SahurCommand()) + } + + override fun onDisable() { + logger.info("Sahur is disabled!") + } + + inner class SahurCommand : CommandExecutor { + override fun onCommand(sender: CommandSender, command: Command, label: String, args: Array): Boolean { + if (sender !is Player) { + sender.sendMessage("${ChatColor.RED}Player-only command!") + return true + } + + if (!sender.isOp) { + sender.sendMessage("${ChatColor.RED}You don't have permission to use this command!") + return true + } + + val sahurStick = createSahurStick() + sender.inventory.addItem(sahurStick) + sender.sendMessage("${ChatColor.GREEN}You have received the ${ChatColor.GOLD}Sahur Stick!") + return true + } + } + + private fun createSahurStick(): ItemStack { + val stick = ItemStack(Material.STICK) + val meta = stick.itemMeta ?: return stick + + meta.setDisplayName("${ChatColor.GOLD}${ChatColor.BOLD}TUNG TUNG TUNG SAHUR") + meta.lore = listOf( + "${ChatColor.DARK_RED}${ChatColor.BOLD}☀ TUNG TUNG TUNG SAHUR ☀", + "${ChatColor.AQUA}Certified by Sahur Gang™", + "", + "${ChatColor.RED}${ChatColor.BOLD}TUNG TUNG TUNG!!!" + ) + + meta.addItemFlags(ItemFlag.HIDE_ENCHANTS, ItemFlag.HIDE_ATTRIBUTES) + meta.isUnbreakable = true + stick.itemMeta = meta + + stick.addUnsafeEnchantment(Enchantment.KNOCKBACK, 255) + stick.addUnsafeEnchantment(Enchantment.FIRE_ASPECT, 10) + stick.addUnsafeEnchantment(Enchantment.SWEEPING_EDGE, 10) + + return stick + } + + @EventHandler + fun onRightClick(event: PlayerInteractEvent) { + val player = event.player + val item = player.inventory.itemInMainHand + + if (item.type == Material.STICK && item.itemMeta?.displayName?.contains("SAHUR") == true) { + if (event.action.toString().contains("RIGHT_CLICK")) { + // Launch player forward + val direction: Vector = player.location.direction.multiply(2.5).setY(1.0) + player.velocity = direction + player.playSound(player.location, Sound.ENTITY_FIREWORK_ROCKET_LAUNCH, 1f, 1.2f) + + // Temporarily mark to prevent fall damage + player.setMetadata("no_fall_sahur", FixedMetadataValue(this, true)) + + // Remove metadata after 3 seconds (fall time) + server.scheduler.runTaskLater(this, Runnable { + if (player.hasMetadata("no_fall_sahur")) { + player.removeMetadata("no_fall_sahur", this) + } + }, 60L) // 60 ticks = 3 seconds + } + } + } + + @EventHandler + fun onFallDamage(event: EntityDamageEvent) { + if (event.entity is Player && event.cause == EntityDamageEvent.DamageCause.FALL) { + val player = event.entity as Player + if (player.hasMetadata("no_fall_sahur")) { + event.isCancelled = true + } + } + } +} \ No newline at end of file diff --git a/src/main/resources/plugin.yml b/src/main/resources/plugin.yml new file mode 100644 index 0000000..d9b4d1a --- /dev/null +++ b/src/main/resources/plugin.yml @@ -0,0 +1,10 @@ +name: Sahur +version: 1.0 +main: org.Sahur.sahur.Sahur +api-version: 1.20 +commands: + sahur: + description: Gives the player a Sahur stick + usage: /sahur + permission: sahur.use + permission-message: You don't have permission to use this command.