From 7eb2f4e542cfbe2519770799e3bfb55e3d56ad89 Mon Sep 17 00:00:00 2001 From: Jikoo Date: Mon, 23 Mar 2020 12:16:11 -0400 Subject: [PATCH] Initial release --- .gitignore | 6 ++ README.MD | 8 +++ pom.xml | 65 +++++++++++++++++++ .../jikoo/anvilunlocker/AnvilUnlocker.java | 56 ++++++++++++++++ src/main/resources/plugin.yml | 6 ++ 5 files changed, 141 insertions(+) create mode 100644 .gitignore create mode 100644 README.MD create mode 100644 pom.xml create mode 100644 src/main/java/com/github/jikoo/anvilunlocker/AnvilUnlocker.java create mode 100644 src/main/resources/plugin.yml diff --git a/.gitignore b/.gitignore new file mode 100644 index 0000000..1ee0344 --- /dev/null +++ b/.gitignore @@ -0,0 +1,6 @@ +target/ +bin/ +.idea/ +**.iml +.project +.classpath diff --git a/README.MD b/README.MD new file mode 100644 index 0000000..1ea6f67 --- /dev/null +++ b/README.MD @@ -0,0 +1,8 @@ +### About +AnvilUnlocker is a Bukkit plugin allowing anvils to be used past the normal level cap of 40. No permissions, no setup. + +As this provides a definite gameplay advantage, I will not be modifying this plugin to add permissions. + +### Caveats +* Due to client limitations, repair costs over 40 levels cannot be displayed in red whether or not the client has the experience required to complete the repair. For simplicity and consistency, AnvilUnlocker uses an approach that sends a minimum number of packets but entirely removes the mechanic of the cost turning red when the client lacks the required experience, even when the cost is under 40 levels. +* Due to the client's inability to display items' costs greater than a short's max value (32767) and subsequent wrapping around, the new maximum is capped to 32767 instead of allowing any valid int value. diff --git a/pom.xml b/pom.xml new file mode 100644 index 0000000..cb333e4 --- /dev/null +++ b/pom.xml @@ -0,0 +1,65 @@ + + + 4.0.0 + + com.github.jikoo + anvilunlocker + AnvilUnlocker + 1.0.0 + + + UTF-8 + + + + + spigot-repo + https://hub.spigotmc.org/nexus/content/groups/public/ + + + dmulloy2-repo + http://repo.dmulloy2.net/nexus/repository/public/ + + + + + + org.spigotmc + spigot-api + 1.15.2-R0.1-SNAPSHOT + provided + + + com.comphenix.protocol + ProtocolLib + 4.5.0 + provided + + + + + ${project.name} + + + + src/main/resources + true + + + + + + org.apache.maven.plugins + maven-compiler-plugin + 3.8.1 + + 1.8 + 1.8 + + + + + + \ No newline at end of file diff --git a/src/main/java/com/github/jikoo/anvilunlocker/AnvilUnlocker.java b/src/main/java/com/github/jikoo/anvilunlocker/AnvilUnlocker.java new file mode 100644 index 0000000..9865c47 --- /dev/null +++ b/src/main/java/com/github/jikoo/anvilunlocker/AnvilUnlocker.java @@ -0,0 +1,56 @@ +package com.github.jikoo.anvilunlocker; + +import com.comphenix.protocol.PacketType; +import com.comphenix.protocol.ProtocolLibrary; +import com.comphenix.protocol.events.PacketContainer; +import java.lang.reflect.InvocationTargetException; +import org.bukkit.GameMode; +import org.bukkit.entity.Player; +import org.bukkit.event.EventHandler; +import org.bukkit.event.Listener; +import org.bukkit.event.inventory.InventoryCloseEvent; +import org.bukkit.event.inventory.InventoryOpenEvent; +import org.bukkit.inventory.AnvilInventory; +import org.bukkit.plugin.java.JavaPlugin; + +public class AnvilUnlocker extends JavaPlugin implements Listener { + + @Override + public void onEnable() { + getServer().getPluginManager().registerEvents(this, this); + } + + @EventHandler + public void onInventoryOpen(InventoryOpenEvent event) { + if (event.getInventory() instanceof AnvilInventory && event.getPlayer() instanceof Player + && event.getPlayer().getGameMode() != GameMode.CREATIVE) { + ((AnvilInventory) event.getInventory()).setMaximumRepairCost(Short.MAX_VALUE); + setInstantBuild((Player) event.getPlayer(), true); + } + } + + @EventHandler + public void onInventoryClose(InventoryCloseEvent event) { + if (event.getInventory() instanceof AnvilInventory && event.getPlayer() instanceof Player + && event.getPlayer().getGameMode() != GameMode.CREATIVE) { + setInstantBuild((Player) event.getPlayer(), false); + } + } + + public void setInstantBuild(Player player, boolean instantBuild) { + PacketContainer packet = new PacketContainer(PacketType.Play.Server.ABILITIES); + packet.getBooleans().write(0, player.isInvulnerable()); + packet.getBooleans().write(1, player.isFlying()); + packet.getBooleans().write(2, player.getAllowFlight()); + packet.getBooleans().write(3, instantBuild); + packet.getFloat().write(0, player.getFlySpeed() / 2); + packet.getFloat().write(1, player.getWalkSpeed() / 2); + + try { + ProtocolLibrary.getProtocolManager().sendServerPacket(player, packet); + } catch (InvocationTargetException e) { + e.printStackTrace(); + } + } + +} diff --git a/src/main/resources/plugin.yml b/src/main/resources/plugin.yml new file mode 100644 index 0000000..c7c7c49 --- /dev/null +++ b/src/main/resources/plugin.yml @@ -0,0 +1,6 @@ +name: ${project.name} +main: ${project.groupId}.${project.artifactId}.${project.name} +version: ${project.version} +api-version: "1.15" +author: Jikoo +softdepend: ["ProtocolLib"]