diff --git a/src/main/java/com/programmerdan/minecraft/simpleadminhacks/SimpleAdminHacks.java b/src/main/java/com/programmerdan/minecraft/simpleadminhacks/SimpleAdminHacks.java index b0d9406..e50ea05 100644 --- a/src/main/java/com/programmerdan/minecraft/simpleadminhacks/SimpleAdminHacks.java +++ b/src/main/java/com/programmerdan/minecraft/simpleadminhacks/SimpleAdminHacks.java @@ -21,12 +21,15 @@ public class SimpleAdminHacks extends ACivMod { private final SimpleAdminHacksConfig config; private final HackManager manager; - private CommandRegistrar commands; + private final CommandRegistrar commands; + private final SimpleAdminHacksSettingManager settingManager; public SimpleAdminHacks() { plugin = this; this.config = new SimpleAdminHacksConfig(this); this.manager = new HackManager(this); + this.commands = new CommandRegistrar(this); + this.settingManager = new SimpleAdminHacksSettingManager(); } @Override @@ -95,6 +98,15 @@ public class SimpleAdminHacks extends ACivMod { return plugin; } + /** + * Returns the CivModCore PlayerSetting Manager + * @return + */ + + public SimpleAdminHacksSettingManager getSettingManager() { + return settingManager; + } + // ------------------------------------------------------------ // Deprecated // ------------------------------------------------------------ diff --git a/src/main/java/com/programmerdan/minecraft/simpleadminhacks/SimpleAdminHacksSettingManager.java b/src/main/java/com/programmerdan/minecraft/simpleadminhacks/SimpleAdminHacksSettingManager.java new file mode 100644 index 0000000..6ddfec9 --- /dev/null +++ b/src/main/java/com/programmerdan/minecraft/simpleadminhacks/SimpleAdminHacksSettingManager.java @@ -0,0 +1,24 @@ +package com.programmerdan.minecraft.simpleadminhacks; + +import org.bukkit.Material; +import org.bukkit.inventory.ItemStack; +import vg.civcraft.mc.civmodcore.playersettings.PlayerSettingAPI; +import vg.civcraft.mc.civmodcore.playersettings.gui.MenuSection; + +public class SimpleAdminHacksSettingManager { + + private MenuSection mainMenu; + + public SimpleAdminHacksSettingManager() { + this.mainMenu = PlayerSettingAPI.getMainMenu().createMenuSection("SimpleAdminHacks", "Config values for all small tweaks from SAH", new ItemStack( + Material.CAULDRON)); + } + + /** + * Returns the Menu Section used to bundle together all SAH /config tweaks + * @return SAH /config Menu + */ + public MenuSection getMainMenu() { + return mainMenu; + } +} diff --git a/src/main/java/com/programmerdan/minecraft/simpleadminhacks/hacks/GameFeatures.java b/src/main/java/com/programmerdan/minecraft/simpleadminhacks/hacks/GameFeatures.java index 06a3ae6..dcd527a 100644 --- a/src/main/java/com/programmerdan/minecraft/simpleadminhacks/hacks/GameFeatures.java +++ b/src/main/java/com/programmerdan/minecraft/simpleadminhacks/hacks/GameFeatures.java @@ -1,6 +1,5 @@ package com.programmerdan.minecraft.simpleadminhacks.hacks; -import com.destroystokyo.paper.event.player.PlayerJumpEvent; import com.programmerdan.minecraft.simpleadminhacks.SimpleAdminHacks; import com.programmerdan.minecraft.simpleadminhacks.configs.GameFeaturesConfig; import com.programmerdan.minecraft.simpleadminhacks.framework.SimpleHack; @@ -14,7 +13,6 @@ import org.apache.commons.lang3.time.DateUtils; import org.bukkit.Bukkit; import org.bukkit.Location; import org.bukkit.Material; -import org.bukkit.Sound; import org.bukkit.block.Biome; import org.bukkit.block.Block; import org.bukkit.block.BlockFace; @@ -47,7 +45,6 @@ import org.bukkit.event.player.PlayerInteractEntityEvent; import org.bukkit.event.player.PlayerInteractEvent; import org.bukkit.event.player.PlayerQuitEvent; import org.bukkit.event.player.PlayerTeleportEvent; -import org.bukkit.event.player.PlayerToggleSneakEvent; import org.bukkit.event.vehicle.VehicleDestroyEvent; import org.bukkit.event.vehicle.VehicleExitEvent; import org.bukkit.inventory.ItemStack; @@ -549,37 +546,6 @@ public class GameFeatures extends SimpleHack implements List killer, loc.getWorld().getName(), loc.getBlockX(), loc.getBlockY(), loc.getBlockZ())); } - @EventHandler(priority = EventPriority.HIGH, ignoreCancelled = true) - public void goldBlockJump(PlayerJumpEvent event) { - Block below = event.getFrom().getBlock().getRelative(BlockFace.DOWN); - if (below.getType() != Material.GOLD_BLOCK) { - return; - } - for(int y = below.getY() + 1; y <= below.getWorld().getMaxHeight(); y++) { - if (doTeleport(below, event.getPlayer(), y)) { - return; - } - } - event.getPlayer().sendMessage(ChatColor.RED + "No gold block to teleport you up to. Sneak to teleport down instead."); - } - - @EventHandler(priority = EventPriority.HIGH, ignoreCancelled = true) - public void goldBlockSneak(PlayerToggleSneakEvent event) { - Block below = event.getPlayer().getLocation().getBlock().getRelative(BlockFace.DOWN); - if (below.getType() != Material.GOLD_BLOCK) { - return; - } - if (!event.isSneaking()) { - return; - } - for(int y = (below.getY() - 1); y > below.getWorld().getMinHeight(); y--) { - if (doTeleport(below, event.getPlayer(), y)) { - return; - } - } - event.getPlayer().sendMessage(ChatColor.RED + "No gold block to teleport you down to. Jump to teleport up instead."); - } - @EventHandler(priority = EventPriority.NORMAL) public void netheriteCrafting(PrepareSmithingEvent event) { if (!config.isEnabled() || !config.isDisableNetheriteCrafting()) { @@ -611,22 +577,4 @@ public class GameFeatures extends SimpleHack implements List break; } } - - private static boolean doTeleport(Block source, Player player, int y) { - Block target = source.getWorld().getBlockAt(source.getX(), y, source.getZ()); - if (target.getType() != Material.GOLD_BLOCK) { - return false; - } - if (!TeleportUtil.checkForTeleportSpace(target.getRelative(BlockFace.UP).getLocation())) { - return false; - } - source.getWorld().playSound(source.getLocation(), Sound.ENTITY_ENDERMAN_TELEPORT, 1.0F, 8.0F); - Location adjustedLocation = target.getLocation().clone(); - adjustedLocation.add(0.5, 1.02, 0.5); - adjustedLocation.setYaw(player.getLocation().getYaw()); - adjustedLocation.setPitch(player.getLocation().getPitch()); - player.playSound(adjustedLocation, Sound.ENTITY_ENDERMAN_TELEPORT, 1.0F, 8.0F); - player.teleport(adjustedLocation); - return true; - } } diff --git a/src/main/java/com/programmerdan/minecraft/simpleadminhacks/hacks/basic/AntiStatisChamber.java b/src/main/java/com/programmerdan/minecraft/simpleadminhacks/hacks/basic/AntiStatisChamber.java new file mode 100644 index 0000000..00364bc --- /dev/null +++ b/src/main/java/com/programmerdan/minecraft/simpleadminhacks/hacks/basic/AntiStatisChamber.java @@ -0,0 +1,68 @@ +package com.programmerdan.minecraft.simpleadminhacks.hacks.basic; + +import com.destroystokyo.paper.event.player.PlayerLaunchProjectileEvent; +import com.programmerdan.minecraft.simpleadminhacks.SimpleAdminHacks; +import com.programmerdan.minecraft.simpleadminhacks.framework.BasicHack; +import com.programmerdan.minecraft.simpleadminhacks.framework.BasicHackConfig; +import com.programmerdan.minecraft.simpleadminhacks.framework.autoload.AutoLoad; +import net.kyori.adventure.text.Component; +import net.kyori.adventure.text.format.NamedTextColor; +import org.bukkit.NamespacedKey; +import org.bukkit.entity.EnderPearl; +import org.bukkit.entity.Player; +import org.bukkit.entity.Projectile; +import org.bukkit.event.EventHandler; +import org.bukkit.event.EventPriority; +import org.bukkit.event.entity.ProjectileHitEvent; +import org.bukkit.persistence.PersistentDataContainer; +import org.bukkit.persistence.PersistentDataType; +import vg.civcraft.mc.civmodcore.util.ConfigParsing; + +public class AntiStatisChamber extends BasicHack { + + @AutoLoad + private String pearlLifetime; + private long lifetimeValue; + private NamespacedKey key; + + public AntiStatisChamber(SimpleAdminHacks plugin, BasicHackConfig config) { + super(plugin, config); + this.key = new NamespacedKey(plugin, "pearl_thrown_time"); + } + + @EventHandler(priority = EventPriority.LOWEST) + public void onPlayerThrowPearl(PlayerLaunchProjectileEvent event) { + Projectile projectile = event.getProjectile(); + if (!(projectile instanceof EnderPearl)) { + return; + } + EnderPearl pearl = (EnderPearl) projectile; + PersistentDataContainer pdc = pearl.getPersistentDataContainer(); + pdc.set(key, PersistentDataType.LONG, System.currentTimeMillis()); + } + + @EventHandler(priority = EventPriority.LOWEST) + public void onPearlLand(ProjectileHitEvent event) { + this.lifetimeValue = ConfigParsing.parseTime(this.pearlLifetime); + Projectile projectile = event.getEntity(); + if (!(projectile instanceof EnderPearl)) { + return; + } + EnderPearl pearl = (EnderPearl) projectile; + PersistentDataContainer pdc = pearl.getPersistentDataContainer(); + Long pearlThrownTime = pdc.get(key, PersistentDataType.LONG); + if (pearlThrownTime == null) { + pearl.remove(); + event.setCancelled(true); + return; + } + if ((System.currentTimeMillis() - pearlThrownTime) > lifetimeValue) { + //We remove the pearl here because cancelling the event doesn't prevent the pearl from actually landing + pearl.remove(); + if (pearl.getShooter() instanceof Player) { + ((Player) pearl.getShooter()).sendMessage(Component.text("Your pearl failed to land for being in flight for more than " + pearlLifetime).color(NamedTextColor.RED)); + } + event.setCancelled(true); + } + } +} diff --git a/src/main/java/com/programmerdan/minecraft/simpleadminhacks/hacks/basic/DogFacts.java b/src/main/java/com/programmerdan/minecraft/simpleadminhacks/hacks/basic/DogFacts.java index 75f842f..728c92a 100644 --- a/src/main/java/com/programmerdan/minecraft/simpleadminhacks/hacks/basic/DogFacts.java +++ b/src/main/java/com/programmerdan/minecraft/simpleadminhacks/hacks/basic/DogFacts.java @@ -7,7 +7,6 @@ import com.programmerdan.minecraft.simpleadminhacks.framework.autoload.AutoLoad; import java.util.List; import java.util.UUID; import org.bukkit.Bukkit; -import org.bukkit.Material; import org.bukkit.entity.Player; import org.bukkit.inventory.ItemStack; import vg.civcraft.mc.civmodcore.config.ConfigHelper; @@ -58,9 +57,7 @@ public class DogFacts extends BasicHack { } private void initSettings() { - MenuSection menu = PlayerSettingAPI.getMainMenu() - .createMenuSection("Announcement Settings", "Settings relating to Announcements", new ItemStack( - Material.OAK_SIGN)); + MenuSection menu = plugin.getSettingManager().getMainMenu(); disableAnnouncements = new BooleanSetting(plugin, false, "Disable Announcements", "disableAnnouncements", "Disable Announcements?"); diff --git a/src/main/java/com/programmerdan/minecraft/simpleadminhacks/hacks/basic/GoldBlockElevators.java b/src/main/java/com/programmerdan/minecraft/simpleadminhacks/hacks/basic/GoldBlockElevators.java new file mode 100644 index 0000000..db21e73 --- /dev/null +++ b/src/main/java/com/programmerdan/minecraft/simpleadminhacks/hacks/basic/GoldBlockElevators.java @@ -0,0 +1,145 @@ +package com.programmerdan.minecraft.simpleadminhacks.hacks.basic; + +import com.destroystokyo.paper.event.player.PlayerJumpEvent; +import com.programmerdan.minecraft.simpleadminhacks.SimpleAdminHacks; +import com.programmerdan.minecraft.simpleadminhacks.framework.BasicHack; +import com.programmerdan.minecraft.simpleadminhacks.framework.BasicHackConfig; +import com.programmerdan.minecraft.simpleadminhacks.framework.utilities.TeleportUtil; +import net.kyori.adventure.text.Component; +import net.kyori.adventure.text.format.NamedTextColor; +import net.md_5.bungee.api.ChatColor; +import org.bukkit.Location; +import org.bukkit.Material; +import org.bukkit.Sound; +import org.bukkit.block.Block; +import org.bukkit.block.BlockFace; +import org.bukkit.entity.Player; +import org.bukkit.event.EventHandler; +import org.bukkit.event.EventPriority; +import org.bukkit.event.block.Action; +import org.bukkit.event.player.PlayerInteractEvent; +import org.bukkit.event.player.PlayerToggleSneakEvent; +import vg.civcraft.mc.civmodcore.playersettings.PlayerSettingAPI; +import vg.civcraft.mc.civmodcore.playersettings.gui.MenuSection; +import vg.civcraft.mc.civmodcore.playersettings.impl.BooleanSetting; +import vg.civcraft.mc.civmodcore.util.DoubleInteractFixer; + +public class GoldBlockElevators extends BasicHack { + + private BooleanSetting useJumpSneakTP; + private DoubleInteractFixer interactFixer; + + public GoldBlockElevators(SimpleAdminHacks plugin, BasicHackConfig config) { + super(plugin, config); + this.interactFixer = new DoubleInteractFixer(plugin); + initSettings(); + } + + private void initSettings() { + MenuSection mainMenu = plugin.getSettingManager().getMainMenu(); + this.useJumpSneakTP = + new BooleanSetting(plugin, true, "Use Jump or Sneak to teleport on gold blocks", "jumpOrSneakTp", + "When true, jumping or sneaking on gold blocks will teleport you up/down, when false, right or left clicking will do the same."); + PlayerSettingAPI.registerSetting(this.useJumpSneakTP, mainMenu); + } + + @EventHandler(priority = EventPriority.HIGH, ignoreCancelled = true) + public void goldBlockSneak(PlayerToggleSneakEvent event) { + if (!this.useJumpSneakTP.getValue(event.getPlayer())) { + return; + } + Block below = event.getPlayer().getLocation().getBlock().getRelative(BlockFace.DOWN); + if (below.getType() != Material.GOLD_BLOCK) { + return; + } + if (!event.isSneaking()) { + return; + } + for (int y = (below.getY() - 1); y > below.getWorld().getMinHeight(); y--) { + if (doTeleport(below, event.getPlayer(), y)) { + return; + } + } + event.getPlayer().sendMessage( + ChatColor.RED + "No gold block to teleport you down to. Jump to teleport up instead."); + } + + @EventHandler(priority = EventPriority.HIGH, ignoreCancelled = true) + public void goldBlockJump(PlayerJumpEvent event) { + if (!this.useJumpSneakTP.getValue(event.getPlayer())) { + return; + } + Block below = event.getFrom().getBlock().getRelative(BlockFace.DOWN); + if (below.getType() != Material.GOLD_BLOCK) { + return; + } + for (int y = below.getY() + 1; y <= below.getWorld().getMaxHeight(); y++) { + if (doTeleport(below, event.getPlayer(), y)) { + return; + } + } + event.getPlayer() + .sendMessage(ChatColor.RED + "No gold block to teleport you up to. Sneak to teleport down instead."); + } + + @EventHandler(priority = EventPriority.HIGH, ignoreCancelled = true) + public void goldBlockInteract(PlayerInteractEvent event) { + if (this.useJumpSneakTP.getValue(event.getPlayer())) { + return; + } + if (event.getAction() == Action.RIGHT_CLICK_BLOCK) { + if (interactFixer.checkInteracted(event.getPlayer(), event.getClickedBlock())) { + return; + } + } else if (event.getAction() != Action.LEFT_CLICK_BLOCK) { + return; + } + Block below = event.getPlayer().getLocation().getBlock().getRelative(BlockFace.DOWN); + if (below.getType() != Material.GOLD_BLOCK) { + return; + } + if (event.getClickedBlock() == null) { + return; + } + if (!event.getClickedBlock().equals(below)) { + return; + } + if (event.getAction() == Action.LEFT_CLICK_BLOCK) { + for (int y = below.getY() - 1; y > below.getWorld().getMinHeight(); y--) { + if (doTeleport(below, event.getPlayer(), y)) { + return; + } + } + event.getPlayer().sendMessage( + Component.text("No gold block to teleport you down to. Right click to teleport up instead.") + .color(NamedTextColor.RED)); + } else { + for (int y = below.getY() + 1; y <= below.getWorld().getMaxHeight(); y++) { + if (doTeleport(below, event.getPlayer(), y)) { + return; + } + } + event.getPlayer().sendMessage( + Component.text("No gold block to teleport you up to. Left click to teleport down instead.") + .color(NamedTextColor.RED)); + } + } + + private boolean doTeleport(Block source, Player player, int y) { + Block target = source.getWorld().getBlockAt(source.getX(), y, source.getZ()); + if (target.getType() != Material.GOLD_BLOCK) { + return false; + } + if (!TeleportUtil.checkForTeleportSpace(target.getRelative(BlockFace.UP).getLocation())) { + return false; + } + source.getWorld().playSound(source.getLocation(), Sound.ENTITY_ENDERMAN_TELEPORT, 1.0F, 8.0F); + Location adjustedLocation = target.getLocation().clone(); + adjustedLocation.add(0.5, 1.02, 0.5); + adjustedLocation.setYaw(player.getLocation().getYaw()); + adjustedLocation.setPitch(player.getLocation().getPitch()); + player.playSound(adjustedLocation, Sound.ENTITY_ENDERMAN_TELEPORT, 1.0F, 8.0F); + player.teleport(adjustedLocation); + return true; + } +} diff --git a/src/main/resources/config.yml b/src/main/resources/config.yml index db45a1d..8336a46 100644 --- a/src/main/resources/config.yml +++ b/src/main/resources/config.yml @@ -13,6 +13,10 @@ hacks: enabled: true breakDenyDuration: 3000 laggLenciency: 1.2 + #Prevents pearls from landing that have been in flight for more than the configured amount of time + AntiStatisChamber: + enabled: true + pearlLifetime: 5m ArthropodEggHack: enabled: true eggChance: 0.03 @@ -96,6 +100,8 @@ hacks: enabled: true EventHandlerList: enabled: true + GoldBlockElevators: + enabled: true HumbugBatchOne: enabled: true allowSheepDying: true