From 47135983f30b75c8bda77fea315ca35dcaa1d47b Mon Sep 17 00:00:00 2001 From: Longboyy Date: Thu, 11 Apr 2019 15:10:22 +0100 Subject: [PATCH 01/28] Added ToggleLamp --- .../simpleadminhacks/SimpleHack.java | 2 +- .../configs/ToggleLampConfig.java | 25 +++ .../simpleadminhacks/hacks/ToggleLamp.java | 199 ++++++++++++++++++ src/main/resources/config.yml | 3 + 4 files changed, 228 insertions(+), 1 deletion(-) create mode 100644 src/main/java/com/programmerdan/minecraft/simpleadminhacks/configs/ToggleLampConfig.java create mode 100644 src/main/java/com/programmerdan/minecraft/simpleadminhacks/hacks/ToggleLamp.java diff --git a/src/main/java/com/programmerdan/minecraft/simpleadminhacks/SimpleHack.java b/src/main/java/com/programmerdan/minecraft/simpleadminhacks/SimpleHack.java index f64c6c78..59462937 100644 --- a/src/main/java/com/programmerdan/minecraft/simpleadminhacks/SimpleHack.java +++ b/src/main/java/com/programmerdan/minecraft/simpleadminhacks/SimpleHack.java @@ -149,7 +149,7 @@ public SimpleHackConfig config() { */ @Override public boolean equals(Object e) { - if (e != null && e instanceof SimpleHack) { + if (e instanceof SimpleHack) { SimpleHack f = (SimpleHack) e; if (f.config != null && this.config != null && f.config.getName().equals(this.config.getName())) { return true; diff --git a/src/main/java/com/programmerdan/minecraft/simpleadminhacks/configs/ToggleLampConfig.java b/src/main/java/com/programmerdan/minecraft/simpleadminhacks/configs/ToggleLampConfig.java new file mode 100644 index 00000000..d9a3c66d --- /dev/null +++ b/src/main/java/com/programmerdan/minecraft/simpleadminhacks/configs/ToggleLampConfig.java @@ -0,0 +1,25 @@ +package com.programmerdan.minecraft.simpleadminhacks.configs; + +import org.bukkit.configuration.ConfigurationSection; + +import com.programmerdan.minecraft.simpleadminhacks.SimpleAdminHacks; +import com.programmerdan.minecraft.simpleadminhacks.SimpleHackConfig; + +public class ToggleLampConfig extends SimpleHackConfig { + + private long cooldownTime; + + public ToggleLampConfig(SimpleAdminHacks plugin, ConfigurationSection base) { + super(plugin, base); + } + + @Override + protected void wireup(ConfigurationSection config) { + this.cooldownTime = config.getLong("cooldownTime", 100); + } + + public long getCooldownTime() { + return this.cooldownTime; + } + +} diff --git a/src/main/java/com/programmerdan/minecraft/simpleadminhacks/hacks/ToggleLamp.java b/src/main/java/com/programmerdan/minecraft/simpleadminhacks/hacks/ToggleLamp.java new file mode 100644 index 00000000..4be44352 --- /dev/null +++ b/src/main/java/com/programmerdan/minecraft/simpleadminhacks/hacks/ToggleLamp.java @@ -0,0 +1,199 @@ +package com.programmerdan.minecraft.simpleadminhacks.hacks; + +import java.util.logging.Level; + +import org.bukkit.Material; +import org.bukkit.Sound; +import org.bukkit.block.Block; +import org.bukkit.configuration.ConfigurationSection; +import org.bukkit.craftbukkit.v1_12_R1.CraftWorld; +import org.bukkit.entity.Player; +import org.bukkit.event.EventHandler; +import org.bukkit.event.EventPriority; +import org.bukkit.event.Listener; +import org.bukkit.event.block.Action; +import org.bukkit.event.block.BlockPhysicsEvent; +import org.bukkit.event.player.PlayerInteractEvent; +import org.bukkit.inventory.EquipmentSlot; +import org.bukkit.metadata.FixedMetadataValue; +import org.bukkit.metadata.MetadataValue; + +import com.programmerdan.minecraft.simpleadminhacks.SimpleAdminHacks; +import com.programmerdan.minecraft.simpleadminhacks.SimpleHack; +import com.programmerdan.minecraft.simpleadminhacks.configs.ToggleLampConfig; + +import net.minecraft.server.v1_12_R1.World; +import vg.civcraft.mc.citadel.Citadel; +import vg.civcraft.mc.citadel.ReinforcementManager; +import vg.civcraft.mc.citadel.reinforcement.PlayerReinforcement; +import vg.civcraft.mc.citadel.reinforcement.Reinforcement; + +public class ToggleLamp extends SimpleHack implements Listener { + + public static final String NAME = "ToggleLamp"; + + private static final String META_COOLDOWN = "ToggleLamp_NextToggle"; + private static final String META_TOGGLED = "ToggleLamp_Toggled"; + + private ReinforcementManager rm; + + public ToggleLamp(SimpleAdminHacks plugin, ToggleLampConfig config) { + super(plugin, config); + } + + @EventHandler(priority = EventPriority.NORMAL) + public void onInteract(PlayerInteractEvent event) { + if(!config.isEnabled()) { + return; + } + + Block clickedBlock = event.getClickedBlock(); + + if(clickedBlock == null) { + return; + } + + + // if it wasn't a right click + if(event.getAction() != Action.RIGHT_CLICK_BLOCK) { + return; + } + + if(event.getItem() == null) { + return; + } + + // if it wasn't a stick in their main hand + if(event.getHand() != EquipmentSlot.HAND || event.getItem().getType() != Material.STICK) { + return; + } + + Player eventPlayer = event.getPlayer(); + Material clickedBlockMat = clickedBlock.getType(); + + if(!(clickedBlockMat == Material.REDSTONE_LAMP_ON || clickedBlockMat == Material.REDSTONE_LAMP_OFF)) { + return; + } + + boolean toggled = clickedBlock.hasMetadata(META_TOGGLED) ? clickedBlock.getMetadata(META_TOGGLED).get(0).asBoolean() : false; + + if(!toggled && clickedBlockMat == Material.REDSTONE_LAMP_ON) { + return; + } + + if(clickedBlock.hasMetadata(META_COOLDOWN)){ + MetadataValue val = clickedBlock.getMetadata(META_COOLDOWN).get(0); + if(((long)val.value()) > System.currentTimeMillis()) { + return; + } + } + + if(rm != null) { + if(rm.isReinforced(clickedBlock)) { + Reinforcement rein = rm.getReinforcement(clickedBlock); + + if(rein instanceof PlayerReinforcement) { + PlayerReinforcement pr = (PlayerReinforcement)rein; + if(!pr.getGroup().isMember(eventPlayer.getUniqueId())) { + return; + } + } + } + } + + try { + switchLamp(clickedBlock, !clickedBlockMat.equals(Material.REDSTONE_LAMP_ON)); + } catch (NoSuchFieldException | SecurityException | IllegalArgumentException | IllegalAccessException e) { + plugin().log(Level.SEVERE, "Error when toggling lamp: ", e); + } + + eventPlayer.getWorld().playSound(clickedBlock.getLocation(), Sound.BLOCK_LEVER_CLICK, 0.5F, 1.0F); + + } + + // block update + @EventHandler(priority = EventPriority.NORMAL) + public void onBlockPhysics(BlockPhysicsEvent event) { + Block eventBlock = event.getBlock(); + Material eventMat = eventBlock.getType(); + + if(eventMat != Material.REDSTONE_LAMP_ON && eventMat != Material.REDSTONE_LAMP_OFF) { + return; + } + + boolean toggled = eventBlock.hasMetadata(META_TOGGLED) ? eventBlock.getMetadata(META_TOGGLED).get(0).asBoolean() : false; + + plugin().log(Level.INFO, "Found redstone lamp, toggled: {0}", toggled); + + if(toggled) { + plugin().log(Level.INFO, "Cancelled block update: {0}", eventMat.toString()); + event.setCancelled(true); + } + } + + @Override + public void registerListeners() { + if(config.isEnabled()) { + plugin().log("Registering ToggleLamp listeners"); + plugin().registerListener(this); + } + } + + @Override + public void registerCommands() { + } + + @Override + public void dataBootstrap() { + rm = plugin().serverHasPlugin("Citadel") ? Citadel.getReinforcementManager() : null; + } + + @Override + public void unregisterListeners() { + } + + @Override + public void unregisterCommands() { + } + + @Override + public void dataCleanup() { + rm = null; + } + + @Override + public String status() { + return config.isEnabled() ? "ToggleLamp enabled." : "ToggleLamp disabled."; + } + + public static ToggleLampConfig generate(SimpleAdminHacks plugin, ConfigurationSection config) { + return new ToggleLampConfig(plugin, config); + } + + private void switchLamp(Block block, boolean lighting) throws NoSuchFieldException, IllegalAccessException + { + World world = ((CraftWorld)block.getWorld()).getHandle(); + + if (lighting) + { + setWorldStatic(world, true); + block.setType(Material.REDSTONE_LAMP_ON); + setWorldStatic(world, false); + block.setMetadata(META_TOGGLED, new FixedMetadataValue(plugin(), true)); + } + else + { + block.setType(Material.REDSTONE_LAMP_OFF); + block.setMetadata(META_TOGGLED, new FixedMetadataValue(plugin(), false)); // need to add stuff to counteract redstone + } + block.setMetadata(META_COOLDOWN, new FixedMetadataValue(plugin(), System.currentTimeMillis()+config.getCooldownTime())); + } + + private void setWorldStatic(World world, boolean isStatic) throws NoSuchFieldException, IllegalAccessException { + java.lang.reflect.Field field = World.class.getDeclaredField("isClientSide"); + + field.setAccessible(true); + field.set(world, isStatic); + } + +} diff --git a/src/main/resources/config.yml b/src/main/resources/config.yml index 22f5c12e..58e47634 100644 --- a/src/main/resources/config.yml +++ b/src/main/resources/config.yml @@ -237,3 +237,6 @@ hacks: - org.bukkit.event.vehicle - org.bukkit.event.weather - org.bukkit.event.world + ToggleLamp: + enabled: false + cooldownTime: 100 \ No newline at end of file From 7977358ae1d6bbb6501f8e69e2ebffabab3031b0 Mon Sep 17 00:00:00 2001 From: Longboyy Date: Mon, 22 Apr 2019 19:49:20 +0100 Subject: [PATCH 02/28] Removed debug messages --- .../minecraft/simpleadminhacks/hacks/ToggleLamp.java | 3 --- 1 file changed, 3 deletions(-) diff --git a/src/main/java/com/programmerdan/minecraft/simpleadminhacks/hacks/ToggleLamp.java b/src/main/java/com/programmerdan/minecraft/simpleadminhacks/hacks/ToggleLamp.java index 4be44352..4ecf04fc 100644 --- a/src/main/java/com/programmerdan/minecraft/simpleadminhacks/hacks/ToggleLamp.java +++ b/src/main/java/com/programmerdan/minecraft/simpleadminhacks/hacks/ToggleLamp.java @@ -123,10 +123,7 @@ public void onBlockPhysics(BlockPhysicsEvent event) { boolean toggled = eventBlock.hasMetadata(META_TOGGLED) ? eventBlock.getMetadata(META_TOGGLED).get(0).asBoolean() : false; - plugin().log(Level.INFO, "Found redstone lamp, toggled: {0}", toggled); - if(toggled) { - plugin().log(Level.INFO, "Cancelled block update: {0}", eventMat.toString()); event.setCancelled(true); } } From 5f0d04df2ceea54d0a88957253b09e822033b8f8 Mon Sep 17 00:00:00 2001 From: Maxopoly Date: Tue, 20 Aug 2019 21:41:56 +0200 Subject: [PATCH 03/28] Add new BasicHack and autoloading infrastructure --- .../minecraft/simpleadminhacks/BasicHack.java | 96 ++++++++ .../simpleadminhacks/BasicHackConfig.java | 16 ++ .../simpleadminhacks/CommandListener.java | 4 +- .../simpleadminhacks/HackManager.java | 222 ++++++++++++++++++ .../simpleadminhacks/SimpleAdminHacks.java | 137 +---------- .../simpleadminhacks/autoload/AutoLoad.java | 31 +++ .../InvalidParameterValueException.java | 15 ++ .../autoload/ParameterParser.java | 9 + .../autoload/ParameterParsingFactory.java | 74 ++++++ .../impl/AbstractObjectParameterParser.java | 18 ++ .../impl/BlockFaceParameterParser.java | 21 ++ .../autoload/impl/BooleanParameterParser.java | 29 +++ .../autoload/impl/ByteParameterParser.java | 21 ++ .../autoload/impl/CharParameterParser.java | 20 ++ .../autoload/impl/DoubleParameterParser.java | 21 ++ .../autoload/impl/FloatParameterParser.java | 21 ++ .../autoload/impl/IntegerParameterParser.java | 21 ++ .../impl/LocationParameterParser.java | 37 +++ .../autoload/impl/LongParameterParser.java | 21 ++ .../autoload/impl/ShortParameterParser.java | 21 ++ .../autoload/impl/StringParameterParser.java | 16 ++ .../simpleadminhacks/hacks/BadBoyWatch.java | 4 +- .../hacks/InvisibleFixTwo.java | 4 +- 23 files changed, 749 insertions(+), 130 deletions(-) create mode 100644 src/main/java/com/programmerdan/minecraft/simpleadminhacks/BasicHack.java create mode 100644 src/main/java/com/programmerdan/minecraft/simpleadminhacks/BasicHackConfig.java create mode 100644 src/main/java/com/programmerdan/minecraft/simpleadminhacks/HackManager.java create mode 100644 src/main/java/com/programmerdan/minecraft/simpleadminhacks/autoload/AutoLoad.java create mode 100644 src/main/java/com/programmerdan/minecraft/simpleadminhacks/autoload/InvalidParameterValueException.java create mode 100644 src/main/java/com/programmerdan/minecraft/simpleadminhacks/autoload/ParameterParser.java create mode 100644 src/main/java/com/programmerdan/minecraft/simpleadminhacks/autoload/ParameterParsingFactory.java create mode 100644 src/main/java/com/programmerdan/minecraft/simpleadminhacks/autoload/impl/AbstractObjectParameterParser.java create mode 100644 src/main/java/com/programmerdan/minecraft/simpleadminhacks/autoload/impl/BlockFaceParameterParser.java create mode 100644 src/main/java/com/programmerdan/minecraft/simpleadminhacks/autoload/impl/BooleanParameterParser.java create mode 100644 src/main/java/com/programmerdan/minecraft/simpleadminhacks/autoload/impl/ByteParameterParser.java create mode 100644 src/main/java/com/programmerdan/minecraft/simpleadminhacks/autoload/impl/CharParameterParser.java create mode 100644 src/main/java/com/programmerdan/minecraft/simpleadminhacks/autoload/impl/DoubleParameterParser.java create mode 100644 src/main/java/com/programmerdan/minecraft/simpleadminhacks/autoload/impl/FloatParameterParser.java create mode 100644 src/main/java/com/programmerdan/minecraft/simpleadminhacks/autoload/impl/IntegerParameterParser.java create mode 100644 src/main/java/com/programmerdan/minecraft/simpleadminhacks/autoload/impl/LocationParameterParser.java create mode 100644 src/main/java/com/programmerdan/minecraft/simpleadminhacks/autoload/impl/LongParameterParser.java create mode 100644 src/main/java/com/programmerdan/minecraft/simpleadminhacks/autoload/impl/ShortParameterParser.java create mode 100644 src/main/java/com/programmerdan/minecraft/simpleadminhacks/autoload/impl/StringParameterParser.java diff --git a/src/main/java/com/programmerdan/minecraft/simpleadminhacks/BasicHack.java b/src/main/java/com/programmerdan/minecraft/simpleadminhacks/BasicHack.java new file mode 100644 index 00000000..f74f23c4 --- /dev/null +++ b/src/main/java/com/programmerdan/minecraft/simpleadminhacks/BasicHack.java @@ -0,0 +1,96 @@ +package com.programmerdan.minecraft.simpleadminhacks; + +import java.lang.reflect.Field; +import java.util.logging.Level; + +import org.bukkit.event.HandlerList; +import org.bukkit.event.Listener; + +/** + * Utility automating a lot of the boiler plate required by SimpleHack and thus allowing easier creation + * of small hacks + * + */ +public abstract class BasicHack extends SimpleHack implements Listener { + + public BasicHack(SimpleAdminHacks plugin, BasicHackConfig config) { + super(plugin, config); + } + + @Override + public void enable() { + dataBootstrap(); + registerCommands(); + registerListeners(); + onEnable(); + } + + public void disable() { + unregisterListeners(); + unregisterCommands(); + dataCleanup(); + onDisable(); + this.config = null; + } + + public abstract void onEnable(); + + public abstract void onDisable(); + + @Override + public void registerListeners() { + SimpleAdminHacks.instance().registerListener(this); + } + + @Override + public void registerCommands() { + //no commands + } + + @Override + public void dataBootstrap() { + //dont need this in a basic hack, use onEnable instead + } + + @Override + public void unregisterListeners() { + HandlerList.unregisterAll(this); + + } + + @Override + public void unregisterCommands() { + //no commands + } + + @Override + public void dataCleanup() { + //dont need this in a basic hack, use onDisable instead + + } + + @Override + public String status() { + StringBuilder genStatus = new StringBuilder(); + genStatus.append(this.getClass().getSimpleName()); + genStatus.append(" is "); + if (config == null || !config.isEnabled()) { + genStatus.append("disabled"); + return genStatus.toString(); + } + genStatus.append("enabled\n"); + for(Field field : this.getClass().getDeclaredFields()) { + genStatus.append(field.getName()); + genStatus.append(" = "); + field.setAccessible(true); + try { + genStatus.append(field.get(this)); + } catch (IllegalArgumentException | IllegalAccessException e) { + plugin().log(Level.WARNING, "Failed to read field", e); + } + genStatus.append('\n'); + } + return genStatus.toString(); + } + +} diff --git a/src/main/java/com/programmerdan/minecraft/simpleadminhacks/BasicHackConfig.java b/src/main/java/com/programmerdan/minecraft/simpleadminhacks/BasicHackConfig.java new file mode 100644 index 00000000..5f678391 --- /dev/null +++ b/src/main/java/com/programmerdan/minecraft/simpleadminhacks/BasicHackConfig.java @@ -0,0 +1,16 @@ +package com.programmerdan.minecraft.simpleadminhacks; + +import org.bukkit.configuration.ConfigurationSection; + +public class BasicHackConfig extends SimpleHackConfig { + + public BasicHackConfig(SimpleAdminHacks plugin, ConfigurationSection base) { + super(plugin, base); + } + + @Override + protected void wireup(ConfigurationSection config) { + //not needed + } + +} diff --git a/src/main/java/com/programmerdan/minecraft/simpleadminhacks/CommandListener.java b/src/main/java/com/programmerdan/minecraft/simpleadminhacks/CommandListener.java index da78b707..da636738 100644 --- a/src/main/java/com/programmerdan/minecraft/simpleadminhacks/CommandListener.java +++ b/src/main/java/com/programmerdan/minecraft/simpleadminhacks/CommandListener.java @@ -67,7 +67,7 @@ private boolean showHacks(CommandSender sender) { sb.append(ChatColor.WHITE).append("List of hacks:\n"); - for (SimpleHack hack : plugin.getHacks()) { + for (SimpleHack hack : plugin.getHackManager().getHacks()) { sb.append(" ") .append(ChatColor.AQUA).append(hack.getName()) .append(ChatColor.WHITE).append(": "); @@ -87,7 +87,7 @@ private boolean showHacks(CommandSender sender) { * Internal utility to get a hack from name. */ private SimpleHack findHack(String hackName) { - for (SimpleHack candidate : plugin.getHacks()) { + for (SimpleHack candidate : plugin.getHackManager().getHacks()) { if (candidate.getName().equals(hackName)) { return candidate; } diff --git a/src/main/java/com/programmerdan/minecraft/simpleadminhacks/HackManager.java b/src/main/java/com/programmerdan/minecraft/simpleadminhacks/HackManager.java new file mode 100644 index 00000000..7c3d9f7f --- /dev/null +++ b/src/main/java/com/programmerdan/minecraft/simpleadminhacks/HackManager.java @@ -0,0 +1,222 @@ +package com.programmerdan.minecraft.simpleadminhacks; + +import java.lang.reflect.Constructor; +import java.lang.reflect.Field; +import java.lang.reflect.InvocationTargetException; +import java.lang.reflect.Method; +import java.util.ArrayList; +import java.util.Collections; +import java.util.LinkedList; +import java.util.List; +import java.util.logging.Level; + +import org.bukkit.configuration.ConfigurationSection; + +import com.google.common.reflect.ClassPath; +import com.programmerdan.minecraft.simpleadminhacks.autoload.AutoLoad; +import com.programmerdan.minecraft.simpleadminhacks.autoload.InvalidParameterValueException; +import com.programmerdan.minecraft.simpleadminhacks.autoload.ParameterParser; +import com.programmerdan.minecraft.simpleadminhacks.autoload.ParameterParsingFactory; + +public class HackManager { + + private SimpleAdminHacks plugin; + private List> hacks; + private ParameterParsingFactory parsingFactory; + + public HackManager(SimpleAdminHacks plugin) { + this.plugin = plugin; + this.hacks = new LinkedList<>(); + this.parsingFactory = new ParameterParsingFactory(); + } + + public void reloadHacks() { + // Now load all the Hacks and register. + ConfigurationSection hackConfigs = plugin.getConfig().getConfigurationSection("hacks"); + try { + ClassPath getSamplersPath = ClassPath.from(plugin.exposeClassLoader()); + + for (ClassPath.ClassInfo clsInfo : getSamplersPath + .getTopLevelClassesRecursive("com.programmerdan.minecraft.simpleadminhacks.hacks")) { + try { + Class clazz = clsInfo.load(); + if (clazz != null && SimpleHack.class.isAssignableFrom(clazz)) { + plugin.log(Level.INFO, + "Found a hack class {0}, attempting to find a generating method and constructor", + clazz.getName()); + ConfigurationSection hackConfig = hackConfigs.getConfigurationSection(clazz.getSimpleName()); + SimpleHackConfig hackingConfig = null; + if (hackConfig != null) { + try { + Method genBasic = clazz.getMethod("generate", SimpleAdminHacks.class, + ConfigurationSection.class); + hackingConfig = (SimpleHackConfig) genBasic.invoke(null, this, hackConfig); + } catch (IllegalAccessException failure) { + plugin.log(Level.WARNING, + "Creating configuration for hack {0} failed, illegal access failure", + clazz.getName()); + } catch (IllegalArgumentException failure) { + plugin.log(Level.WARNING, + "Creating configuration for hack {0} failed, illegal argument failure", + clazz.getName()); + } catch (InvocationTargetException failure) { + plugin.log(Level.WARNING, + "Creating configuration for hack {0} failed, invocation target failure", + clazz.getName()); + } + } else { + plugin.log(Level.INFO, "Hack for {0} found but no configuration, skipping.", + clazz.getSimpleName()); + } + + if (hackingConfig != null) { + plugin.log(Level.INFO, "Configuration for Hack {0} found, instance: {1}", + clazz.getSimpleName(), hackingConfig.toString()); + SimpleHack hack = null; + try { + Constructor constructBasic = clazz.getConstructor(SimpleAdminHacks.class, + hackingConfig.getClass()); + hack = (SimpleHack) constructBasic.newInstance(this, hackingConfig); + plugin.log(Level.INFO, "Created a new Hack of type {0}", clazz.getSimpleName()); + } catch (InvalidConfigException ice) { + plugin.log(Level.WARNING, "Failed to activate {0} hack, configuration failed", + clazz.getSimpleName()); + } catch (Exception e) { + plugin.log(Level.WARNING, "Failed to activate {0} hack, configuration failed: {1}", + clazz.getSimpleName(), e.getMessage()); + } + + if (hack == null) { + plugin.log(Level.WARNING, "Failed to create a Hack of type {0}", clazz.getSimpleName()); + } else { + register(hack); + plugin.log(Level.INFO, "Registered a new hack: {0}", clazz.getSimpleName()); + } + } else { + plugin.log(Level.INFO, "Configuration generation for Hack {0} failed, skipping.", + clazz.getSimpleName()); + } + } + } catch (NoClassDefFoundError e) { + plugin.log(Level.INFO, "Unable to load discovered class {0} due to dependency failure", + clsInfo.getName()); + } catch (Exception e) { + plugin.log(Level.WARNING, "Failed to complete hack discovery {0}", clsInfo.getName()); + } + } + } catch (Exception e) { + plugin.log(Level.WARNING, "Failed to complete hack registration"); + } + // Warning if no hacks. + if (hacks.isEmpty()) { + plugin.log(Level.WARNING, "No hacks enabled."); + return; + } + // Boot up the hacks. + List> iterList = new ArrayList<>(hacks); + for (SimpleHack hack : iterList) { + try { + populateParameter(hack); + hack.enable(); + } catch (NoClassDefFoundError err) { + plugin.log(Level.WARNING, "Unable to activate hack {0}, missing dependency: {1}", hack.getName(), + err.getMessage()); + unregister(hack); + } catch (Exception e) { + plugin.log(Level.WARNING, "Unable to activate hack {0}, unrecognized error: {1}", hack.getName(), + e.getMessage()); + plugin.log(Level.WARNING, "Full stack trace: ", e); + unregister(hack); + } + } + } + + public void disableAllHacks() { + for (SimpleHack hack : hacks) { + try { + hack.disable(); + } catch (NoClassDefFoundError err) { + plugin.log(Level.WARNING, "Unable to cleanly disable hack {0}, missing dependency: {1}", hack.getName(), + err.getMessage()); + } catch (Exception e) { + plugin.log(Level.WARNING, "Unable to cleanly disable hack {0}, unrecognized error: {1}", hack.getName(), + e.getMessage()); + plugin.log(Level.WARNING, "Full stack trace: ", e); + } + } + hacks.clear(); + } + + private void populateParameter(SimpleHack hack) { + Class hackClass = hack.getClass(); + ConfigurationSection config = hack.config().getBase(); + for (Field field : hackClass.getDeclaredFields()) { + AutoLoad autoLoad = field.getAnnotation(AutoLoad.class); + if (autoLoad == null) { + continue; + } + String identifier; + if (autoLoad.id().equals("")) { + identifier = field.getName(); + } else { + identifier = autoLoad.id(); + } + String rawStringValue = config.getString(identifier); + if (rawStringValue == null) { + if (autoLoad.isRequired()) { + throw new IllegalArgumentException("Hack " + hackClass.getSimpleName() + " expects parameter " + + identifier + ", but did not get it"); + } + return; + } + ParameterParser parser = parsingFactory.getParser(field.getClass()); + if (parser == null) { + throw new IllegalStateException(field.getClass().getSimpleName() + " in " + hackClass.getSimpleName() + + " does not have an autoloading parser"); + } + Object value; + try { + value = parser.parse(rawStringValue); + } catch (InvalidParameterValueException ipve) { + plugin.log(Level.WARNING, "Failed to load parameter {0} for hack {1} {2}", rawStringValue, + hackClass.getSimpleName(), ipve.toString()); + if (autoLoad.isRequired()) { + throw new IllegalStateException(field.getClass().getSimpleName() + " in " + hackClass.getSimpleName() + + " could not be loaded " + ipve.toString()); + } + return; + } + field.setAccessible(true); + try { + field.set(hack, value); + } catch (IllegalArgumentException | IllegalAccessException e) { + throw new IllegalStateException(field.getClass().getSimpleName() + " in " + hackClass.getSimpleName() + + " could not be set " + e.toString()); + } + plugin.log(Level.INFO, "Loaded '{0}' = '{1}'", identifier, value); + } + } + + /** + * Registers a new SimpleHack. + */ + void register(SimpleHack hack) { + hacks.add(hack); + } + + /** + * Unregisters an existing SimpleHack. + */ + void unregister(SimpleHack hack) { + hacks.remove(hack); + } + + /** + * Returns a wrapped version of hacks preventing external removal but allowing + * interaction with the hacks. + */ + public List> getHacks() { + return Collections.unmodifiableList(hacks); + } + +} diff --git a/src/main/java/com/programmerdan/minecraft/simpleadminhacks/SimpleAdminHacks.java b/src/main/java/com/programmerdan/minecraft/simpleadminhacks/SimpleAdminHacks.java index 3e98eab8..69a95a44 100644 --- a/src/main/java/com/programmerdan/minecraft/simpleadminhacks/SimpleAdminHacks.java +++ b/src/main/java/com/programmerdan/minecraft/simpleadminhacks/SimpleAdminHacks.java @@ -31,9 +31,10 @@ * @author ProgrammerDan */ public class SimpleAdminHacks extends JavaPlugin { + private static SimpleAdminHacks plugin; private SimpleAdminHacksConfig config; - private List> hacks; + private HackManager hackManager; /** * No-op constructor @@ -47,7 +48,6 @@ public SimpleAdminHacks() { */ public void onEnable() { SimpleAdminHacks.plugin = this; - this.hacks = new LinkedList>(); // Config bootstrap this.saveDefaultConfig(); @@ -60,139 +60,21 @@ public void onEnable() { this.setEnabled(false); return; } - - - // Now load all the Hacks and register. - ConfigurationSection hackConfigs = this.getConfig().getConfigurationSection("hacks"); - try { - ClassPath getSamplersPath = ClassPath.from(this.getClassLoader()); - - for (ClassPath.ClassInfo clsInfo : getSamplersPath.getTopLevelClasses("com.programmerdan.minecraft.simpleadminhacks.hacks")) { - try { - Class clazz = clsInfo.load(); - if (clazz != null && SimpleHack.class.isAssignableFrom(clazz)) { - log(Level.INFO, "Found a hack class {0}, attempting to find a generating method and constructor", clazz.getName()); - ConfigurationSection hackConfig = hackConfigs.getConfigurationSection(clazz.getSimpleName()); - SimpleHackConfig hackingConfig = null; - if (hackConfig != null) { - try { - Method genBasic = clazz.getMethod("generate", SimpleAdminHacks.class, ConfigurationSection.class); - hackingConfig = (SimpleHackConfig) genBasic.invoke(null, this, hackConfig); - } catch (IllegalAccessException failure) { - log(Level.WARNING, "Creating configuration for hack {0} failed, illegal access failure", clazz.getName()); - } catch (IllegalArgumentException failure) { - log(Level.WARNING, "Creating configuration for hack {0} failed, illegal argument failure", clazz.getName()); - } catch (InvocationTargetException failure) { - log(Level.WARNING, "Creating configuration for hack {0} failed, invocation target failure", clazz.getName()); - } - } else { - log(Level.INFO, "Hack for {0} found but no configuration, skipping.", clazz.getSimpleName()); - } - - if (hackingConfig != null) { - log(Level.INFO, "Configuration for Hack {0} found, instance: {1}", clazz.getSimpleName(), hackingConfig.toString()); - SimpleHack hack = null; - try { - Constructor constructBasic = clazz.getConstructor(SimpleAdminHacks.class, hackingConfig.getClass()); - hack = (SimpleHack) constructBasic.newInstance(this, hackingConfig); - log(Level.INFO, "Created a new Hack of type {0}", clazz.getSimpleName()); - } catch (InvalidConfigException ice) { - log(Level.WARNING, "Failed to activate {0} hack, configuration failed", clazz.getSimpleName()); - } catch (Exception e) { - log(Level.WARNING, "Failed to activate {0} hack, configuration failed: {1}", clazz.getSimpleName(), e.getMessage()); - } - - if (hack == null) { - log(Level.WARNING, "Failed to create a Hack of type {0}", clazz.getSimpleName()); - } else { - register(hack); - log(Level.INFO, "Registered a new hack: {0}", clazz.getSimpleName()); - } - } else { - log(Level.INFO, "Configuration generation for Hack {0} failed, skipping.", clazz.getSimpleName()); - } - } - } catch (NoClassDefFoundError e) { - log(Level.INFO, "Unable to load discovered class {0} due to dependency failure", clsInfo.getName()); - } catch (Exception e) { - log(Level.WARNING, "Failed to complete hack discovery {0}", clsInfo.getName()); - } - } - } catch (Exception e) { - log(Level.WARNING, "Failed to complete hack registration"); - } - - - // Warning if no hacks. - if (hacks == null || hacks.size() == 0) { - log(Level.WARNING, "No hacks enabled."); - return; - } - - // Boot up the hacks. - List> iterList = new ArrayList>(hacks); - for (SimpleHack hack : iterList) { - try { - hack.enable(); - } catch (NoClassDefFoundError err) { - log(Level.WARNING, "Unable to activate hack {0}, missing dependency: {1}", hack.getName(), err.getMessage()); - unregister(hack); - } catch (Exception e) { - log(Level.WARNING, "Unable to activate hack {0}, unrecognized error: {1}", hack.getName(), e.getMessage()); - log(Level.WARNING, "Full stack trace: ", e); - unregister(hack); - } - } - + this.hackManager = new HackManager(this); this.registerCommand("hacks", new CommandListener(this)); } /** * Forwards disable to hacks, clears instance and static variables */ + @Override public void onDisable() { - if (hacks == null) return; - for (SimpleHack hack : hacks) { - try { - hack.disable(); - } catch (NoClassDefFoundError err) { - log(Level.WARNING, "Unable to cleanly disable hack {0}, missing dependency: {1}", hack.getName(), err.getMessage()); - } catch (Exception e) { - log(Level.WARNING, "Unable to cleanly disable hack {0}, unrecognized error: {1}", hack.getName(), e.getMessage()); - log(Level.WARNING, "Full stack trace: ", e); - } - } - hacks.clear(); - hacks = null; + hackManager.disableAllHacks(); + hackManager = null; config = null; SimpleAdminHacks.plugin = null; } - /** - * Registers a new SimpleHack. - */ - public void register(SimpleHack hack) { - if (hacks != null) { - hacks.add(hack); - } - } - - /** - * Unregisters an existing SimpleHack. - */ - public void unregister(SimpleHack hack) { - if (hacks != null) { - hacks.remove(hack); - } - } - - /** - * Returns a wrapped version of hacks preventing external removal but allowing interaction with the hacks. - */ - public List> getHacks() { - return Collections.unmodifiableList(hacks); - } - /** * Returns the psuedo-singleton instance of this plugin. */ @@ -356,5 +238,12 @@ public void registerCommand(String command, CommandExecutor executor) { public ClassLoader exposeClassLoader() { return this.getClassLoader(); } + + /** + * @return Manager holding hack instances + */ + public HackManager getHackManager() { + return hackManager; + } } diff --git a/src/main/java/com/programmerdan/minecraft/simpleadminhacks/autoload/AutoLoad.java b/src/main/java/com/programmerdan/minecraft/simpleadminhacks/autoload/AutoLoad.java new file mode 100644 index 00000000..6f7acf09 --- /dev/null +++ b/src/main/java/com/programmerdan/minecraft/simpleadminhacks/autoload/AutoLoad.java @@ -0,0 +1,31 @@ +package com.programmerdan.minecraft.simpleadminhacks.autoload; + +import java.lang.annotation.ElementType; +import java.lang.annotation.Retention; +import java.lang.annotation.RetentionPolicy; +import java.lang.annotation.Target; + +@Retention(RetentionPolicy.RUNTIME) +@Target(ElementType.FIELD) +public @interface AutoLoad { + + //Thanks Angelia + + /** + * The identifier used for this option when reading it from the hacks config yaml section. If + * this is not set, the variable name will be used + * + * @return Identifier used for this option or an empty string if the variable + * name should be used + */ + String id() default ""; + + /** + * Is the parameter required? If set to true, an exception will be thrown if no + * default is specified and the option is not specified in the config + * + * @return Whether this option is required + */ + boolean isRequired() default true; + +} diff --git a/src/main/java/com/programmerdan/minecraft/simpleadminhacks/autoload/InvalidParameterValueException.java b/src/main/java/com/programmerdan/minecraft/simpleadminhacks/autoload/InvalidParameterValueException.java new file mode 100644 index 00000000..6047e525 --- /dev/null +++ b/src/main/java/com/programmerdan/minecraft/simpleadminhacks/autoload/InvalidParameterValueException.java @@ -0,0 +1,15 @@ +package com.programmerdan.minecraft.simpleadminhacks.autoload; + +public class InvalidParameterValueException extends Exception { + + private static final long serialVersionUID = -6603220618719530965L; + + public InvalidParameterValueException() { + super(); + } + + public InvalidParameterValueException(String msg) { + super(msg); + } + +} diff --git a/src/main/java/com/programmerdan/minecraft/simpleadminhacks/autoload/ParameterParser.java b/src/main/java/com/programmerdan/minecraft/simpleadminhacks/autoload/ParameterParser.java new file mode 100644 index 00000000..8f4987aa --- /dev/null +++ b/src/main/java/com/programmerdan/minecraft/simpleadminhacks/autoload/ParameterParser.java @@ -0,0 +1,9 @@ +package com.programmerdan.minecraft.simpleadminhacks.autoload; + +public interface ParameterParser { + + Class getClassParsed(); + + T parse(String value) throws InvalidParameterValueException; + +} diff --git a/src/main/java/com/programmerdan/minecraft/simpleadminhacks/autoload/ParameterParsingFactory.java b/src/main/java/com/programmerdan/minecraft/simpleadminhacks/autoload/ParameterParsingFactory.java new file mode 100644 index 00000000..97c7ca72 --- /dev/null +++ b/src/main/java/com/programmerdan/minecraft/simpleadminhacks/autoload/ParameterParsingFactory.java @@ -0,0 +1,74 @@ +package com.programmerdan.minecraft.simpleadminhacks.autoload; + +import java.util.HashMap; +import java.util.Map; + +import com.programmerdan.minecraft.simpleadminhacks.autoload.impl.BlockFaceParameterParser; +import com.programmerdan.minecraft.simpleadminhacks.autoload.impl.BooleanParameterParser; +import com.programmerdan.minecraft.simpleadminhacks.autoload.impl.ByteParameterParser; +import com.programmerdan.minecraft.simpleadminhacks.autoload.impl.CharParameterParser; +import com.programmerdan.minecraft.simpleadminhacks.autoload.impl.DoubleParameterParser; +import com.programmerdan.minecraft.simpleadminhacks.autoload.impl.FloatParameterParser; +import com.programmerdan.minecraft.simpleadminhacks.autoload.impl.IntegerParameterParser; +import com.programmerdan.minecraft.simpleadminhacks.autoload.impl.LocationParameterParser; +import com.programmerdan.minecraft.simpleadminhacks.autoload.impl.LongParameterParser; +import com.programmerdan.minecraft.simpleadminhacks.autoload.impl.ShortParameterParser; +import com.programmerdan.minecraft.simpleadminhacks.autoload.impl.StringParameterParser; + +public class ParameterParsingFactory { + + private Map, ParameterParser> parserMap; + private Map, Class> wrapperClasses; + + public ParameterParsingFactory() { + loadParser(); + } + + @SuppressWarnings("unchecked") + private Class convertPrimitive(Class primType) { + return (Class) wrapperClasses.get(primType); + } + + @SuppressWarnings("unchecked") + public ParameterParser getParser(Class classType) { + if (classType.isPrimitive()) { + classType = convertPrimitive(classType); + } + ParameterParser parser = parserMap.get(classType); + if (parser == null) { + // need to do this explicitly, otherwise cast will throw exception + return null; + } + return (ParameterParser) parser; + } + + private void loadParser() { + parserMap = new HashMap<>(); + readyParser(new BlockFaceParameterParser()); + readyParser(new BooleanParameterParser()); + readyParser(new ByteParameterParser()); + readyParser(new CharParameterParser()); + readyParser(new DoubleParameterParser()); + readyParser(new FloatParameterParser()); + readyParser(new IntegerParameterParser()); + readyParser(new LocationParameterParser()); + readyParser(new LongParameterParser()); + readyParser(new ShortParameterParser()); + readyParser(new StringParameterParser()); + wrapperClasses = new HashMap<>(); + wrapperClasses.put(boolean.class, Boolean.class); + wrapperClasses.put(byte.class, Byte.class); + wrapperClasses.put(char.class, Character.class); + wrapperClasses.put(double.class, Double.class); + wrapperClasses.put(float.class, Float.class); + wrapperClasses.put(int.class, Integer.class); + wrapperClasses.put(long.class, Long.class); + wrapperClasses.put(short.class, Short.class); + wrapperClasses.put(void.class, Void.class); + } + + private void readyParser(ParameterParser parParser) { + this.parserMap.put(parParser.getClassParsed(), parParser); + } + +} diff --git a/src/main/java/com/programmerdan/minecraft/simpleadminhacks/autoload/impl/AbstractObjectParameterParser.java b/src/main/java/com/programmerdan/minecraft/simpleadminhacks/autoload/impl/AbstractObjectParameterParser.java new file mode 100644 index 00000000..e1b590be --- /dev/null +++ b/src/main/java/com/programmerdan/minecraft/simpleadminhacks/autoload/impl/AbstractObjectParameterParser.java @@ -0,0 +1,18 @@ +package com.programmerdan.minecraft.simpleadminhacks.autoload.impl; + +import com.programmerdan.minecraft.simpleadminhacks.autoload.InvalidParameterValueException; +import com.programmerdan.minecraft.simpleadminhacks.autoload.ParameterParser; + +public abstract class AbstractObjectParameterParser implements ParameterParser { + + @Override + public T parse(String value) throws InvalidParameterValueException { + String cleaned = value.trim().toLowerCase(); + if (cleaned.equals("null")) { + return null; + } + return parseObject(cleaned); + } + + public abstract T parseObject(String value) throws InvalidParameterValueException; +} diff --git a/src/main/java/com/programmerdan/minecraft/simpleadminhacks/autoload/impl/BlockFaceParameterParser.java b/src/main/java/com/programmerdan/minecraft/simpleadminhacks/autoload/impl/BlockFaceParameterParser.java new file mode 100644 index 00000000..7d99cad3 --- /dev/null +++ b/src/main/java/com/programmerdan/minecraft/simpleadminhacks/autoload/impl/BlockFaceParameterParser.java @@ -0,0 +1,21 @@ +package com.programmerdan.minecraft.simpleadminhacks.autoload.impl; +import org.bukkit.block.BlockFace; + +import com.programmerdan.minecraft.simpleadminhacks.autoload.InvalidParameterValueException; + +public class BlockFaceParameterParser extends AbstractObjectParameterParser { + + @Override + public Class getClassParsed() { + return BlockFace.class; + } + + @Override + public BlockFace parseObject(String value) throws InvalidParameterValueException { + try { + return BlockFace.valueOf(value.toUpperCase()); + } catch (IllegalArgumentException e) { + throw new InvalidParameterValueException(); + } + } +} diff --git a/src/main/java/com/programmerdan/minecraft/simpleadminhacks/autoload/impl/BooleanParameterParser.java b/src/main/java/com/programmerdan/minecraft/simpleadminhacks/autoload/impl/BooleanParameterParser.java new file mode 100644 index 00000000..c475ea02 --- /dev/null +++ b/src/main/java/com/programmerdan/minecraft/simpleadminhacks/autoload/impl/BooleanParameterParser.java @@ -0,0 +1,29 @@ +package com.programmerdan.minecraft.simpleadminhacks.autoload.impl; + +import com.programmerdan.minecraft.simpleadminhacks.autoload.InvalidParameterValueException; +import com.programmerdan.minecraft.simpleadminhacks.autoload.ParameterParser; + +public class BooleanParameterParser implements ParameterParser { + + @Override + public Class getClassParsed() { + return Boolean.class; + } + + @Override + public Boolean parse(String value) throws InvalidParameterValueException { + switch (value.toLowerCase()) { + case "1": + case "true": + case "t": + return true; + case "0": + case "false": + case "f": + return false; + case "null": + return null; + } + throw new InvalidParameterValueException(); + } +} diff --git a/src/main/java/com/programmerdan/minecraft/simpleadminhacks/autoload/impl/ByteParameterParser.java b/src/main/java/com/programmerdan/minecraft/simpleadminhacks/autoload/impl/ByteParameterParser.java new file mode 100644 index 00000000..b6942581 --- /dev/null +++ b/src/main/java/com/programmerdan/minecraft/simpleadminhacks/autoload/impl/ByteParameterParser.java @@ -0,0 +1,21 @@ +package com.programmerdan.minecraft.simpleadminhacks.autoload.impl; + +import com.programmerdan.minecraft.simpleadminhacks.autoload.InvalidParameterValueException; +import com.programmerdan.minecraft.simpleadminhacks.autoload.ParameterParser; + +public class ByteParameterParser implements ParameterParser { + + @Override + public Class getClassParsed() { + return Byte.class; + } + + @Override + public Byte parse(String value) throws InvalidParameterValueException { + try { + return Byte.parseByte(value); + } catch (NumberFormatException e) { + throw new InvalidParameterValueException(); + } + } +} diff --git a/src/main/java/com/programmerdan/minecraft/simpleadminhacks/autoload/impl/CharParameterParser.java b/src/main/java/com/programmerdan/minecraft/simpleadminhacks/autoload/impl/CharParameterParser.java new file mode 100644 index 00000000..68549621 --- /dev/null +++ b/src/main/java/com/programmerdan/minecraft/simpleadminhacks/autoload/impl/CharParameterParser.java @@ -0,0 +1,20 @@ +package com.programmerdan.minecraft.simpleadminhacks.autoload.impl; + +import com.programmerdan.minecraft.simpleadminhacks.autoload.InvalidParameterValueException; +import com.programmerdan.minecraft.simpleadminhacks.autoload.ParameterParser; + +public class CharParameterParser implements ParameterParser { + + @Override + public Class getClassParsed() { + return Character.class; + } + + @Override + public Character parse(String value) throws InvalidParameterValueException { + if (value.length() != 1) { + throw new InvalidParameterValueException(); + } + return value.charAt(0); + } +} diff --git a/src/main/java/com/programmerdan/minecraft/simpleadminhacks/autoload/impl/DoubleParameterParser.java b/src/main/java/com/programmerdan/minecraft/simpleadminhacks/autoload/impl/DoubleParameterParser.java new file mode 100644 index 00000000..f9692a61 --- /dev/null +++ b/src/main/java/com/programmerdan/minecraft/simpleadminhacks/autoload/impl/DoubleParameterParser.java @@ -0,0 +1,21 @@ +package com.programmerdan.minecraft.simpleadminhacks.autoload.impl; + +import com.programmerdan.minecraft.simpleadminhacks.autoload.InvalidParameterValueException; +import com.programmerdan.minecraft.simpleadminhacks.autoload.ParameterParser; + +public class DoubleParameterParser implements ParameterParser { + + @Override + public Class getClassParsed() { + return Double.class; + } + + @Override + public Double parse(String value) throws InvalidParameterValueException { + try { + return Double.parseDouble(value); + } catch (NumberFormatException e) { + throw new InvalidParameterValueException(); + } + } +} diff --git a/src/main/java/com/programmerdan/minecraft/simpleadminhacks/autoload/impl/FloatParameterParser.java b/src/main/java/com/programmerdan/minecraft/simpleadminhacks/autoload/impl/FloatParameterParser.java new file mode 100644 index 00000000..87a6c64d --- /dev/null +++ b/src/main/java/com/programmerdan/minecraft/simpleadminhacks/autoload/impl/FloatParameterParser.java @@ -0,0 +1,21 @@ +package com.programmerdan.minecraft.simpleadminhacks.autoload.impl; + +import com.programmerdan.minecraft.simpleadminhacks.autoload.InvalidParameterValueException; +import com.programmerdan.minecraft.simpleadminhacks.autoload.ParameterParser; + +public class FloatParameterParser implements ParameterParser { + + @Override + public Class getClassParsed() { + return Float.class; + } + + @Override + public Float parse(String value) throws InvalidParameterValueException { + try { + return Float.parseFloat(value); + } catch (NumberFormatException e) { + throw new InvalidParameterValueException(); + } + } +} diff --git a/src/main/java/com/programmerdan/minecraft/simpleadminhacks/autoload/impl/IntegerParameterParser.java b/src/main/java/com/programmerdan/minecraft/simpleadminhacks/autoload/impl/IntegerParameterParser.java new file mode 100644 index 00000000..1e7fc197 --- /dev/null +++ b/src/main/java/com/programmerdan/minecraft/simpleadminhacks/autoload/impl/IntegerParameterParser.java @@ -0,0 +1,21 @@ +package com.programmerdan.minecraft.simpleadminhacks.autoload.impl; + +import com.programmerdan.minecraft.simpleadminhacks.autoload.InvalidParameterValueException; +import com.programmerdan.minecraft.simpleadminhacks.autoload.ParameterParser; + +public class IntegerParameterParser implements ParameterParser { + + @Override + public Class getClassParsed() { + return Integer.class; + } + + @Override + public Integer parse(String value) throws InvalidParameterValueException { + try { + return Integer.parseInt(value); + } catch (NumberFormatException e) { + throw new InvalidParameterValueException(); + } + } +} diff --git a/src/main/java/com/programmerdan/minecraft/simpleadminhacks/autoload/impl/LocationParameterParser.java b/src/main/java/com/programmerdan/minecraft/simpleadminhacks/autoload/impl/LocationParameterParser.java new file mode 100644 index 00000000..30a76f76 --- /dev/null +++ b/src/main/java/com/programmerdan/minecraft/simpleadminhacks/autoload/impl/LocationParameterParser.java @@ -0,0 +1,37 @@ +package com.programmerdan.minecraft.simpleadminhacks.autoload.impl; + +import org.bukkit.Bukkit; +import org.bukkit.Location; +import org.bukkit.World; + +import com.programmerdan.minecraft.simpleadminhacks.autoload.InvalidParameterValueException; + +public class LocationParameterParser extends AbstractObjectParameterParser { + + @Override + public Class getClassParsed() { + return Location.class; + } + + @Override + public Location parseObject(String value) throws InvalidParameterValueException { + String[] args = value.split(" "); + if (args.length != 4) { + throw new InvalidParameterValueException(); + } + double[] parsed = new double[3]; + String worldName = args [0]; + World world = Bukkit.getWorld(worldName); + if (world == null) { + throw new InvalidParameterValueException(worldName + " is not a known world"); + } + try { + for (int i = 0; i < 3; i++) { + parsed[i] = Double.parseDouble(args[i + 1]); + } + } catch (NumberFormatException e) { + throw new InvalidParameterValueException(); + } + return new Location(world, parsed[0], parsed[1], parsed[2]); + } +} diff --git a/src/main/java/com/programmerdan/minecraft/simpleadminhacks/autoload/impl/LongParameterParser.java b/src/main/java/com/programmerdan/minecraft/simpleadminhacks/autoload/impl/LongParameterParser.java new file mode 100644 index 00000000..752e505f --- /dev/null +++ b/src/main/java/com/programmerdan/minecraft/simpleadminhacks/autoload/impl/LongParameterParser.java @@ -0,0 +1,21 @@ +package com.programmerdan.minecraft.simpleadminhacks.autoload.impl; + +import com.programmerdan.minecraft.simpleadminhacks.autoload.InvalidParameterValueException; +import com.programmerdan.minecraft.simpleadminhacks.autoload.ParameterParser; + +public class LongParameterParser implements ParameterParser { + + @Override + public Class getClassParsed() { + return Long.class; + } + + @Override + public Long parse(String value) throws InvalidParameterValueException { + try { + return Long.parseLong(value); + } catch (NumberFormatException e) { + throw new InvalidParameterValueException(); + } + } +} diff --git a/src/main/java/com/programmerdan/minecraft/simpleadminhacks/autoload/impl/ShortParameterParser.java b/src/main/java/com/programmerdan/minecraft/simpleadminhacks/autoload/impl/ShortParameterParser.java new file mode 100644 index 00000000..fbbc40de --- /dev/null +++ b/src/main/java/com/programmerdan/minecraft/simpleadminhacks/autoload/impl/ShortParameterParser.java @@ -0,0 +1,21 @@ +package com.programmerdan.minecraft.simpleadminhacks.autoload.impl; + +import com.programmerdan.minecraft.simpleadminhacks.autoload.InvalidParameterValueException; +import com.programmerdan.minecraft.simpleadminhacks.autoload.ParameterParser; + +public class ShortParameterParser implements ParameterParser { + + @Override + public Class getClassParsed() { + return Short.class; + } + + @Override + public Short parse(String value) throws InvalidParameterValueException { + try { + return Short.parseShort(value); + } catch (NumberFormatException e) { + throw new InvalidParameterValueException(); + } + } +} diff --git a/src/main/java/com/programmerdan/minecraft/simpleadminhacks/autoload/impl/StringParameterParser.java b/src/main/java/com/programmerdan/minecraft/simpleadminhacks/autoload/impl/StringParameterParser.java new file mode 100644 index 00000000..225d1969 --- /dev/null +++ b/src/main/java/com/programmerdan/minecraft/simpleadminhacks/autoload/impl/StringParameterParser.java @@ -0,0 +1,16 @@ +package com.programmerdan.minecraft.simpleadminhacks.autoload.impl; + +import com.programmerdan.minecraft.simpleadminhacks.autoload.ParameterParser; + +public class StringParameterParser implements ParameterParser { + + @Override + public Class getClassParsed() { + return String.class; + } + + @Override + public String parse(String value) { + return value; + } +} \ No newline at end of file diff --git a/src/main/java/com/programmerdan/minecraft/simpleadminhacks/hacks/BadBoyWatch.java b/src/main/java/com/programmerdan/minecraft/simpleadminhacks/hacks/BadBoyWatch.java index 4572b71e..848cab34 100644 --- a/src/main/java/com/programmerdan/minecraft/simpleadminhacks/hacks/BadBoyWatch.java +++ b/src/main/java/com/programmerdan/minecraft/simpleadminhacks/hacks/BadBoyWatch.java @@ -112,8 +112,8 @@ public void registerListeners() { @Override public void dataBootstrap() { - boys = new ConcurrentHashMap(); - lowBoys = new ConcurrentHashMap(); + boys = new ConcurrentHashMap<>(); + lowBoys = new ConcurrentHashMap<>(); } @Override diff --git a/src/main/java/com/programmerdan/minecraft/simpleadminhacks/hacks/InvisibleFixTwo.java b/src/main/java/com/programmerdan/minecraft/simpleadminhacks/hacks/InvisibleFixTwo.java index 7e6f4a84..0e2e11ed 100644 --- a/src/main/java/com/programmerdan/minecraft/simpleadminhacks/hacks/InvisibleFixTwo.java +++ b/src/main/java/com/programmerdan/minecraft/simpleadminhacks/hacks/InvisibleFixTwo.java @@ -76,7 +76,7 @@ public void onPlayerVehicleMove(VehicleMoveEvent move) { Vehicle vehicle = move.getVehicle(); if (vehicle == null) return; - if (vehicle.getPassengers() == null || vehicle.getPassengers().size() == 0) return; + if (vehicle.getPassengers() == null || vehicle.getPassengers().isEmpty()) return; for (Entity e : vehicle.getPassengers()) { if (e == null) continue; @@ -148,7 +148,7 @@ public void registerCommands() { @Override public void dataBootstrap() { - updateMap = new HashMap(); + updateMap = new HashMap<>(); } @Override From ab1e6adf854a502644d4e268ba6b423779295478 Mon Sep 17 00:00:00 2001 From: Maxopoly Date: Tue, 20 Aug 2019 22:18:10 +0200 Subject: [PATCH 04/28] Partial 1.14 update --- pom.xml | 2 +- .../minecraft/simpleadminhacks/BasicHack.java | 3 + .../simpleadminhacks/BasicHackConfig.java | 4 + .../configs/BadBoyWatchConfig.java | 4 +- .../configs/GameFeaturesConfig.java | 4 +- .../configs/GameFixesConfig.java | 33 +++- .../configs/GameTuningConfig.java | 6 +- .../simpleadminhacks/hacks/CTAnnounce.java | 4 +- .../simpleadminhacks/hacks/Experimental.java | 68 +++---- .../simpleadminhacks/hacks/GameTuning.java | 33 +--- .../simpleadminhacks/hacks/InvControl.java | 21 +- .../simpleadminhacks/hacks/InvisibleFix.java | 185 ------------------ .../hacks/InvisibleFixTwo.java | 181 ----------------- .../hacks/NewfriendAssist.java | 12 +- .../simpleadminhacks/hacks/ToggleLamp.java | 15 +- 15 files changed, 97 insertions(+), 478 deletions(-) delete mode 100644 src/main/java/com/programmerdan/minecraft/simpleadminhacks/hacks/InvisibleFix.java delete mode 100644 src/main/java/com/programmerdan/minecraft/simpleadminhacks/hacks/InvisibleFixTwo.java diff --git a/pom.xml b/pom.xml index 3a8d0adf..a20d380a 100644 --- a/pom.xml +++ b/pom.xml @@ -107,7 +107,7 @@ org.spigotmc spigot - 1.12.2-R0.1-SNAPSHOT + 1.14.4-R0.1-SNAPSHOT provided diff --git a/src/main/java/com/programmerdan/minecraft/simpleadminhacks/BasicHack.java b/src/main/java/com/programmerdan/minecraft/simpleadminhacks/BasicHack.java index f74f23c4..aacae139 100644 --- a/src/main/java/com/programmerdan/minecraft/simpleadminhacks/BasicHack.java +++ b/src/main/java/com/programmerdan/minecraft/simpleadminhacks/BasicHack.java @@ -19,6 +19,9 @@ public BasicHack(SimpleAdminHacks plugin, BasicHackConfig config) { @Override public void enable() { + if(!config.isEnabled()) { + return; + } dataBootstrap(); registerCommands(); registerListeners(); diff --git a/src/main/java/com/programmerdan/minecraft/simpleadminhacks/BasicHackConfig.java b/src/main/java/com/programmerdan/minecraft/simpleadminhacks/BasicHackConfig.java index 5f678391..ac5cf685 100644 --- a/src/main/java/com/programmerdan/minecraft/simpleadminhacks/BasicHackConfig.java +++ b/src/main/java/com/programmerdan/minecraft/simpleadminhacks/BasicHackConfig.java @@ -12,5 +12,9 @@ public BasicHackConfig(SimpleAdminHacks plugin, ConfigurationSection base) { protected void wireup(ConfigurationSection config) { //not needed } + + public static BasicHackConfig generate(SimpleAdminHacks plugin, ConfigurationSection config) { + return new BasicHackConfig(plugin, config); + } } diff --git a/src/main/java/com/programmerdan/minecraft/simpleadminhacks/configs/BadBoyWatchConfig.java b/src/main/java/com/programmerdan/minecraft/simpleadminhacks/configs/BadBoyWatchConfig.java index 0dca6262..a3544e72 100644 --- a/src/main/java/com/programmerdan/minecraft/simpleadminhacks/configs/BadBoyWatchConfig.java +++ b/src/main/java/com/programmerdan/minecraft/simpleadminhacks/configs/BadBoyWatchConfig.java @@ -29,7 +29,7 @@ public class BadBoyWatchConfig extends SimpleHackConfig { Material.JUKEBOX, Material.NOTE_BLOCK, Material.BEACON, - Material.ENCHANTMENT_TABLE, + Material.ENCHANTING_TABLE, Material.ENDER_CHEST, Material.FURNACE, Material.SPONGE); @@ -48,7 +48,7 @@ protected void wireup(ConfigurationSection config) { plugin().log(Level.INFO, " Minimum Breakpath Depth To Match: {0}", this.minDepthToMatch); @SuppressWarnings("unchecked") List watch = (List) config.getList("watchedMaterials"); - this.watchedMaterials = new HashSet(); + this.watchedMaterials = new HashSet<>(); if (watch == null || watch.isEmpty()) { this.watchedMaterials.addAll(defaultWatched); plugin().log(Level.INFO, " Adding default watch set"); diff --git a/src/main/java/com/programmerdan/minecraft/simpleadminhacks/configs/GameFeaturesConfig.java b/src/main/java/com/programmerdan/minecraft/simpleadminhacks/configs/GameFeaturesConfig.java index 6f8ad6f3..fc02936b 100644 --- a/src/main/java/com/programmerdan/minecraft/simpleadminhacks/configs/GameFeaturesConfig.java +++ b/src/main/java/com/programmerdan/minecraft/simpleadminhacks/configs/GameFeaturesConfig.java @@ -63,7 +63,9 @@ protected void wireup(ConfigurationSection config) { if (!this.elytraUse) plugin().log(" Elytra use is disabled"); this.chorusFruitUse = config.getBoolean("chorusFruitTeleportation", false); - if (!this.chorusFruitUse) plugin().log(" Chorus Fruit Teleportation is disabled"); + if (!this.chorusFruitUse) { + plugin().log(" Chorus Fruit Teleportation is disabled"); + } this.weepingAngel = config.getBoolean("weepingAngel.enabled", false); if (this.weepingAngel) { diff --git a/src/main/java/com/programmerdan/minecraft/simpleadminhacks/configs/GameFixesConfig.java b/src/main/java/com/programmerdan/minecraft/simpleadminhacks/configs/GameFixesConfig.java index 1bcdf067..52c609de 100644 --- a/src/main/java/com/programmerdan/minecraft/simpleadminhacks/configs/GameFixesConfig.java +++ b/src/main/java/com/programmerdan/minecraft/simpleadminhacks/configs/GameFixesConfig.java @@ -73,15 +73,30 @@ protected void wireup(ConfigurationSection config) { } private void wireUpArrays() { - bfArray = new ArrayList(); - railArray = new ArrayList(); - pistonArray = new ArrayList(); + bfArray = new ArrayList<>(); + railArray = new ArrayList<>(); + pistonArray = new ArrayList<>(); - railArray.add(Material.RAILS); + railArray.add(Material.RAIL); railArray.add(Material.ACTIVATOR_RAIL); railArray.add(Material.DETECTOR_RAIL); railArray.add(Material.POWERED_RAIL); - railArray.add(Material.CARPET); + railArray.add(Material.WHITE_CARPET); + railArray.add(Material.RED_CARPET); + railArray.add(Material.BLACK_CARPET); + railArray.add(Material.BLUE_CARPET); + railArray.add(Material.BROWN_CARPET); + railArray.add(Material.CYAN_CARPET); + railArray.add(Material.GRAY_CARPET); + railArray.add(Material.GREEN_CARPET); + railArray.add(Material.LIGHT_BLUE_CARPET); + railArray.add(Material.LIGHT_GRAY_CARPET); + railArray.add(Material.LIME_CARPET); + railArray.add(Material.YELLOW_CARPET); + railArray.add(Material.PURPLE_CARPET); + railArray.add(Material.PINK_CARPET); + railArray.add(Material.ORANGE_CARPET); + railArray.add(Material.MAGENTA_CARPET); bfArray.add(BlockFace.NORTH); bfArray.add(BlockFace.SOUTH); @@ -90,10 +105,10 @@ private void wireUpArrays() { bfArray.add(BlockFace.UP); bfArray.add(BlockFace.DOWN); - pistonArray.add(Material.PISTON_BASE); - pistonArray.add(Material.PISTON_EXTENSION); - pistonArray.add(Material.PISTON_MOVING_PIECE); - pistonArray.add(Material.PISTON_STICKY_BASE); + pistonArray.add(Material.PISTON); + pistonArray.add(Material.PISTON_HEAD); + pistonArray.add(Material.MOVING_PISTON); + pistonArray.add(Material.STICKY_PISTON); } public boolean isBlockElytraBreakBug() { diff --git a/src/main/java/com/programmerdan/minecraft/simpleadminhacks/configs/GameTuningConfig.java b/src/main/java/com/programmerdan/minecraft/simpleadminhacks/configs/GameTuningConfig.java index 27f01bb1..39d6e384 100644 --- a/src/main/java/com/programmerdan/minecraft/simpleadminhacks/configs/GameTuningConfig.java +++ b/src/main/java/com/programmerdan/minecraft/simpleadminhacks/configs/GameTuningConfig.java @@ -104,7 +104,7 @@ protected void wireup(ConfigurationSection config) { this.preventFallingThroughBedrock = config.getBoolean("preventFallingThroughBedrock", true); - noPlace = new HashSet(); + noPlace = new HashSet<>(); if(config.isList("noplace")) { for(String entry : config.getStringList("noplace")) { try { @@ -124,8 +124,8 @@ protected void wireup(ConfigurationSection config) { * @author ProgrammerDan */ private void wireupChunkLimits(ConfigurationSection config) { - this.blockEntityLimits = new HashMap(); - this.exemptFromLimits = new HashSet(); + this.blockEntityLimits = new HashMap<>(); + this.exemptFromLimits = new HashSet<>(); this.chunkLimitsEnabled = false; if (config == null) return; diff --git a/src/main/java/com/programmerdan/minecraft/simpleadminhacks/hacks/CTAnnounce.java b/src/main/java/com/programmerdan/minecraft/simpleadminhacks/hacks/CTAnnounce.java index dec8f6ed..b5894014 100644 --- a/src/main/java/com/programmerdan/minecraft/simpleadminhacks/hacks/CTAnnounce.java +++ b/src/main/java/com/programmerdan/minecraft/simpleadminhacks/hacks/CTAnnounce.java @@ -43,7 +43,7 @@ public CTAnnounce(SimpleAdminHacks plugin, CTAnnounceConfig config) { * @param event */ @EventHandler(priority=EventPriority.MONITOR, ignoreCancelled = true) - public void CTEvent(PlayerCombatTagEvent event) { + public void ctEvent(PlayerCombatTagEvent event) { if (!config.isEnabled()) return; // ignore if off if (event.getVictim() == null || event.getAttacker() == null) return; // ignore non-pvp and admin-pvp plugin().debug(" Victim: {0} Attacker: {1}", event.getVictim().getName(), event.getAttacker().getName()); @@ -99,7 +99,7 @@ public void registerCommands() { @Override public void dataBootstrap() { - lastCTAnnounce = new ConcurrentHashMap(); + lastCTAnnounce = new ConcurrentHashMap<>(); } @Override diff --git a/src/main/java/com/programmerdan/minecraft/simpleadminhacks/hacks/Experimental.java b/src/main/java/com/programmerdan/minecraft/simpleadminhacks/hacks/Experimental.java index 303811ff..c4b881f2 100644 --- a/src/main/java/com/programmerdan/minecraft/simpleadminhacks/hacks/Experimental.java +++ b/src/main/java/com/programmerdan/minecraft/simpleadminhacks/hacks/Experimental.java @@ -92,12 +92,10 @@ public boolean onCommand(CommandSender sender, Command command, String label, St Player player = (Player) sender; ItemStack item = player.getInventory().getItemInMainHand(); - if (item != null) { - YamlConfiguration yml = new YamlConfiguration(); - yml.set("template", item); - plugin().log(yml.saveToString()); - sender.sendMessage(yml.saveToString()); - } + YamlConfiguration yml = new YamlConfiguration(); + yml.set("template", item); + plugin().log(yml.saveToString()); + sender.sendMessage(yml.saveToString()); return true; } @@ -105,7 +103,7 @@ public boolean onCommand(CommandSender sender, Command command, String label, St private void monitorTeleportLow(PlayerTeleportEvent event) { if (!config.isEnabled()) return; if (!config.isTeleportSpy()) return; - StringBuffer sb = new StringBuffer("[LO] "); + StringBuilder sb = new StringBuilder("[LO] "); logTeleport(event, sb); } @@ -113,7 +111,7 @@ private void monitorTeleportLow(PlayerTeleportEvent event) { private void monitorTeleportHigh(PlayerTeleportEvent event) { if (!config.isEnabled()) return; if (!config.isTeleportSpy()) return; - StringBuffer sb = new StringBuffer("[HI] "); + StringBuilder sb = new StringBuilder("[HI] "); logTeleport(event, sb); } @@ -133,38 +131,30 @@ public void run() { this.cancel(); return; } - if (playerUUID != null) { - Player player = plugin().getServer().getPlayer(playerUUID); - if (player != null) { - StringBuffer sb = new StringBuffer("Tracking: "); - sb.append(playerUUID); - logPlayer(player, sb); - plugin().log(sb.toString()); - } else { - StringBuffer sb = new StringBuffer("Lost: "); - sb.append(playerUUID); - plugin().log(sb.toString()); - this.cancel(); - } + Player player = plugin().getServer().getPlayer(playerUUID); + if (player != null) { + StringBuilder sb = new StringBuilder("Tracking: "); + sb.append(playerUUID); + logPlayer(player, sb); + plugin().log(sb.toString()); } else { + StringBuilder sb = new StringBuilder("Lost: "); + sb.append(playerUUID); + plugin().log(sb.toString()); this.cancel(); } } }.runTaskTimer(plugin(), 2l, 4l); } - private void logTeleport(PlayerTeleportEvent event, StringBuffer sb) { + private void logTeleport(PlayerTeleportEvent event, StringBuilder sb) { sb.append(event.isCancelled() ? "C " : "A "); sb.append(event.getCause().name()); Player player = event.getPlayer(); Location from = event.getFrom(); Location to = event.getTo(); sb.append(String.format(" %16s", player != null ? player.getName() : "--unknown--")); - if (from != null) { - sb.append(String.format(" %s,%5.0f,%3.0f,%5.0f", from.getWorld().getName(), from.getX(), from.getY(), from.getZ())); - } else { - sb.append(" (none)"); - } + sb.append(String.format(" %s,%5.0f,%3.0f,%5.0f", from.getWorld().getName(), from.getX(), from.getY(), from.getZ())); sb.append(" ->"); if (to != null) { sb.append(String.format(" %s,%5.0f,%3.0f,%5.0f", to.getWorld().getName(), to.getX(), to.getY(), to.getZ())); @@ -177,37 +167,27 @@ private void logTeleport(PlayerTeleportEvent event, StringBuffer sb) { plugin().log(sb.toString()); } - private void logPlayer(final Player player, StringBuffer sb) { + private void logPlayer(final Player player, StringBuilder sb) { sb.append(player.getWorld().getName()); Location feet = player.getLocation(); Location eyes = player.getEyeLocation(); - if (feet != null) { - sb.append(String.format(" %s,%5.0f,%3.0f,%5.0f", feet.getWorld().getName(), feet.getX(), feet.getY(), feet.getZ())); - } else { - sb.append(" (none)"); - } - if (eyes != null) { - sb.append(String.format(" %s,%5.0f,%3.0f,%5.0f", eyes.getWorld().getName(), eyes.getX(), eyes.getY(), eyes.getZ())); - } else { - sb.append(" (none)"); - } + sb.append(String.format(" %s,%5.0f,%3.0f,%5.0f", feet.getWorld().getName(), feet.getX(), feet.getY(), feet.getZ())); + sb.append(String.format(" %s,%5.0f,%3.0f,%5.0f", eyes.getWorld().getName(), eyes.getX(), eyes.getY(), eyes.getZ())); } @EventHandler(priority = EventPriority.LOWEST, ignoreCancelled = false) private void monitorCombatLow(EntityDamageByEntityEvent event) { if (!config.isEnabled()) return; if (!config.isCombatSpy()) return; - StringBuffer sb = new StringBuffer("[LO] "); + StringBuilder sb = new StringBuilder("[LO] "); logCombat(event, sb); } - private void logCombat(EntityDamageByEntityEvent event, StringBuffer sb) { + private void logCombat(EntityDamageByEntityEvent event, StringBuilder sb) { sb.append(event.isCancelled() ? "C " : "A "); sb.append(event.getCause().name()); sb.append(String.format(", %5.2f->%5.2f", event.getDamage(), event.getFinalDamage())); - sb.append(String.format(", %16s v %16s", - event.getDamager() != null ? event.getDamager().getName() : "--unknown--", - event.getEntity() != null ? event.getEntity().getName() : "--unknown--" )); + sb.append(String.format(", %16s v %16s", event.getDamager().getName(), event.getEntity().getName())); for (EntityDamageEvent.DamageModifier mod : EntityDamageEvent.DamageModifier.values()) { sb.append(", ").append(mod.name()); try { @@ -223,7 +203,7 @@ private void logCombat(EntityDamageByEntityEvent event, StringBuffer sb) { private void monitorCombatHigh(EntityDamageByEntityEvent event) { if (!config.isEnabled()) return; if (!config.isCombatSpy()) return; - StringBuffer sb = new StringBuffer("[HI]: "); + StringBuilder sb = new StringBuilder("[HI]: "); logCombat(event, sb); } diff --git a/src/main/java/com/programmerdan/minecraft/simpleadminhacks/hacks/GameTuning.java b/src/main/java/com/programmerdan/minecraft/simpleadminhacks/hacks/GameTuning.java index 5203de04..8f3dd7ce 100644 --- a/src/main/java/com/programmerdan/minecraft/simpleadminhacks/hacks/GameTuning.java +++ b/src/main/java/com/programmerdan/minecraft/simpleadminhacks/hacks/GameTuning.java @@ -1,15 +1,13 @@ package com.programmerdan.minecraft.simpleadminhacks.hacks; -import java.util.ArrayList; import java.util.List; -import java.util.Random; import java.util.logging.Level; import org.bukkit.Bukkit; +import org.bukkit.ChatColor; import org.bukkit.GameMode; import org.bukkit.Location; import org.bukkit.Material; -import org.bukkit.World; import org.bukkit.block.Block; import org.bukkit.block.BlockState; import org.bukkit.configuration.ConfigurationSection; @@ -18,7 +16,6 @@ import org.bukkit.entity.Player; import org.bukkit.entity.Skeleton; import org.bukkit.entity.SkeletonHorse; -import org.bukkit.entity.WitherSkeleton; import org.bukkit.entity.minecart.HopperMinecart; import org.bukkit.entity.minecart.StorageMinecart; import org.bukkit.event.EventHandler; @@ -28,9 +25,7 @@ import org.bukkit.event.block.BlockPistonExtendEvent; import org.bukkit.event.block.BlockPistonRetractEvent; import org.bukkit.event.block.BlockPlaceEvent; -import org.bukkit.event.entity.CreatureSpawnEvent; import org.bukkit.event.entity.EntityChangeBlockEvent; -import org.bukkit.event.entity.EntityDeathEvent; import org.bukkit.event.entity.EntityPortalEvent; import org.bukkit.event.entity.EntityTargetEvent; import org.bukkit.event.inventory.InventoryMoveItemEvent; @@ -42,15 +37,12 @@ import org.bukkit.event.player.PlayerTeleportEvent; import org.bukkit.event.world.PortalCreateEvent; import org.bukkit.inventory.InventoryHolder; -import org.bukkit.inventory.ItemStack; import com.programmerdan.minecraft.simpleadminhacks.SimpleAdminHacks; import com.programmerdan.minecraft.simpleadminhacks.SimpleHack; import com.programmerdan.minecraft.simpleadminhacks.configs.GameTuningConfig; import com.programmerdan.minecraft.simpleadminhacks.util.TeleportUtil; -import net.md_5.bungee.api.ChatColor; - /** * This is a grab-bag class to hold any _tuning_ related configurations that impact the * game, server-wide. @@ -68,8 +60,6 @@ public class GameTuning extends SimpleHack implements Listener { public static final String NAME = "GameTuning"; - private Random rng = new Random(); - public GameTuning(SimpleAdminHacks plugin, GameTuningConfig config) { super(plugin, config); } @@ -159,21 +149,15 @@ public void chunkLimits(BlockPlaceEvent event) { if (!config.isEnabled() || !config.areChunkLimitsEnabled()) return; try { Player player = event.getPlayer(); - if (player == null) return; - Block block = event.getBlock(); - if (block == null) return; if (!config.applyChunkLimits(player.getUniqueId())) return; Material mat = block.getType(); - if (mat == null) return; Integer limit = config.getChunkLimit(mat); if (limit == null) return; - if (block.getChunk().getTileEntities() == null) return; - int current = 0; for (BlockState state : block.getChunk().getTileEntities()) { if (state != null && mat.equals(state.getType())) { @@ -194,9 +178,9 @@ public void chunkLimits(BlockPlaceEvent event) { public void chunkLimitsExploitExtend(BlockPistonExtendEvent event) { if (!config.isEnabled() || !config.areChunkLimitsEnabled()) return; List blocks = event.getBlocks(); - if (blocks != null && blocks.size() > 0) { + if (!blocks.isEmpty()) { for (Block b : blocks) { - if (b != null && b.getType() != null && config.getChunkLimit(b.getType()) != null) { + if (b != null && config.getChunkLimit(b.getType()) != null) { event.setCancelled(true); return; // TODO send message to nearby player warning of reason for stopping. } @@ -209,9 +193,9 @@ public void chunkLimitsExploitExtend(BlockPistonExtendEvent event) { public void chunkLimitsExploitRetract(BlockPistonRetractEvent event) { if (!config.isEnabled() || !config.areChunkLimitsEnabled()) return; List blocks = event.getBlocks(); - if (blocks != null && blocks.size() > 0) { + if (!blocks.isEmpty()) { for (Block b : blocks) { - if (b != null && b.getType() != null && config.getChunkLimit(b.getType()) != null) { + if (b != null && config.getChunkLimit(b.getType()) != null) { event.setCancelled(true); return; // TODO send message to nearby player warning of reason for stopping. } @@ -222,11 +206,12 @@ public void chunkLimitsExploitRetract(BlockPistonRetractEvent event) { @SuppressWarnings("deprecation") @EventHandler(priority = EventPriority.HIGH, ignoreCancelled = true) public void bedRClickToSetSpawn(PlayerInteractEvent event) { - if (!config.isEnabled() || !config.areDaytimeBedsEnabled() || event.getAction() != Action.RIGHT_CLICK_BLOCK || event.getClickedBlock().getType() != Material.BED_BLOCK) { + if (!config.isEnabled() || !config.areDaytimeBedsEnabled() || + event.getAction() != Action.RIGHT_CLICK_BLOCK || + event.getClickedBlock().getType() != Material.bed) { return; } - if (event.getPlayer() == null) return; if (event.getClickedBlock() == null) return; // Let plugins that already watch for and cancel this event have a turn, like ExilePearl @@ -340,7 +325,7 @@ public void onBlockPlace(BlockPlaceEvent event) { public void onPlayerInteractEntity(PlayerInteractEntityEvent event) { if(config.isEnabled() && !config.allowVillagerTrading()) { Entity npc = event.getRightClicked(); - if(npc != null && npc.getType() == EntityType.VILLAGER) { + if(npc.getType() == EntityType.VILLAGER) { event.setCancelled(true); } } diff --git a/src/main/java/com/programmerdan/minecraft/simpleadminhacks/hacks/InvControl.java b/src/main/java/com/programmerdan/minecraft/simpleadminhacks/hacks/InvControl.java index 172e960b..dc90bcda 100644 --- a/src/main/java/com/programmerdan/minecraft/simpleadminhacks/hacks/InvControl.java +++ b/src/main/java/com/programmerdan/minecraft/simpleadminhacks/hacks/InvControl.java @@ -11,8 +11,8 @@ import org.bukkit.command.CommandExecutor; import org.bukkit.command.CommandSender; import org.bukkit.configuration.ConfigurationSection; -import org.bukkit.craftbukkit.v1_12_R1.CraftServer; -import org.bukkit.craftbukkit.v1_12_R1.inventory.CraftInventoryPlayer; +import org.bukkit.craftbukkit.v1_14_R1.CraftServer; +import org.bukkit.craftbukkit.v1_14_R1.inventory.CraftInventoryPlayer; import org.bukkit.entity.Player; import org.bukkit.event.Listener; import org.bukkit.event.inventory.InventoryCloseEvent; @@ -25,9 +25,9 @@ import com.programmerdan.minecraft.simpleadminhacks.SimpleHack; import com.programmerdan.minecraft.simpleadminhacks.configs.InvControlConfig; -import net.minecraft.server.v1_12_R1.NBTTagCompound; -import net.minecraft.server.v1_12_R1.NBTTagList; -import net.minecraft.server.v1_12_R1.WorldNBTStorage; +import net.minecraft.server.v1_14_R1.NBTTagCompound; +import net.minecraft.server.v1_14_R1.NBTTagList; +import net.minecraft.server.v1_14_R1.WorldNBTStorage; import vg.civcraft.mc.namelayer.NameAPI; public class InvControl extends SimpleHack implements CommandExecutor, Listener { @@ -70,7 +70,8 @@ public boolean onCommand(CommandSender sender, Command command, String label, St } } if (player == null && playerUID != null) { // Go deep into NBT. - WorldNBTStorage storage = (WorldNBTStorage) (((CraftServer) plugin().getServer()).getServer().worlds.get(0).getDataManager()); + WorldNBTStorage storage = ((CraftServer) plugin().getServer()).getServer().getWorlds(). + iterator().next().getDataManager(); NBTTagCompound rawPlayer = storage.getPlayerData(playerUID.toString()); if (rawPlayer != null) { @@ -85,10 +86,10 @@ public boolean onCommand(CommandSender sender, Command command, String label, St int food = rawPlayer.getInt("foodLevel"); // Fun NMS inventory reconstruction from file data. - net.minecraft.server.v1_12_R1.PlayerInventory nms_pl_inv = new net.minecraft.server.v1_12_R1.PlayerInventory(null); + net.minecraft.server.v1_14_R1.PlayerInventory nms_pl_inv = new net.minecraft.server.v1_14_R1.PlayerInventory(null); NBTTagList inv = rawPlayer.getList("Inventory", rawPlayer.getTypeId()); nms_pl_inv.b(inv); // We use this to bypass the Craft code which requires a player object, unlike NMS. - PlayerInventory pl_inv = (PlayerInventory) new CraftInventoryPlayer(nms_pl_inv); + PlayerInventory pl_inv = new CraftInventoryPlayer(nms_pl_inv); invSee(sender, pl_inv, health, food, playername); return true; @@ -124,14 +125,14 @@ public boolean onCommand(CommandSender sender, Command command, String label, St } public void adminCloseInventory(InventoryCloseEvent event) { - if (event.getPlayer() != null && this.adminsWithInv.contains(event.getPlayer().getUniqueId())) { + if (this.adminsWithInv.contains(event.getPlayer().getUniqueId())) { this.adminsWithInv.remove(event.getPlayer().getUniqueId()); } } private void invSee(CommandSender sender, PlayerInventory pl_inv, double health, int food, String playername) { if (!(sender instanceof Player)) { // send text only. - StringBuffer sb = new StringBuffer(); + StringBuilder sb = new StringBuilder(); sb.append(playername).append("'s\n Health: ").append((int)health*2); sb.append("\n Food: ").append(food); sb.append("\n Inventory: "); diff --git a/src/main/java/com/programmerdan/minecraft/simpleadminhacks/hacks/InvisibleFix.java b/src/main/java/com/programmerdan/minecraft/simpleadminhacks/hacks/InvisibleFix.java deleted file mode 100644 index 088ed711..00000000 --- a/src/main/java/com/programmerdan/minecraft/simpleadminhacks/hacks/InvisibleFix.java +++ /dev/null @@ -1,185 +0,0 @@ -package com.programmerdan.minecraft.simpleadminhacks.hacks; - -import java.util.HashSet; -import java.util.LinkedList; -import java.util.UUID; -import java.util.concurrent.LinkedTransferQueue; -import java.util.concurrent.atomic.AtomicInteger; - -import org.bukkit.Bukkit; -import org.bukkit.configuration.ConfigurationSection; -import org.bukkit.entity.Player; -import org.bukkit.event.EventHandler; -import org.bukkit.event.EventPriority; -import org.bukkit.event.Listener; -import org.bukkit.event.player.PlayerJoinEvent; -import org.bukkit.scheduler.BukkitTask; - -import com.programmerdan.minecraft.simpleadminhacks.SimpleAdminHacks; -import com.programmerdan.minecraft.simpleadminhacks.SimpleHack; -import com.programmerdan.minecraft.simpleadminhacks.configs.InvisibleFixConfig; - -/** - * Sometimes when joining, a player is invisible due to some kind of spigot bug that's been - * known since 2015 but unfixed. - * - * This is widely reported as a fix -- hide then show the player to the other players online. - * To do this safely w/o crashing all the things, I schedule the hide and show delayed - * so if we get a huge influx of joins this doesn't take forever. - * - * @author ProgrammerDan - */ -public class InvisibleFix extends SimpleHack implements Listener { - public static final String NAME = "InvisibleFix"; - private AtomicInteger activeJoins = new AtomicInteger(0); - - private LinkedTransferQueue ltq = new LinkedTransferQueue(); - private BukkitTask recheckTask = null; - - public InvisibleFix(SimpleAdminHacks plugin, InvisibleFixConfig config) { - super(plugin, config); - } - - @EventHandler(priority=EventPriority.MONITOR, ignoreCancelled = true) - public void JoinEvent(PlayerJoinEvent event) { - if (!config.isEnabled()) return; // ignore if off - Player p = event.getPlayer(); - if (p == null) return; - final UUID uuid = p.getUniqueId(); - ltq.offer(uuid); - - if (p.isOp() && config.getIgnoreOps()) return; - String tPerm = config.getIgnorePermission(); - if (tPerm != null && p.hasPermission(tPerm)) return; - - Bukkit.getScheduler().runTaskLater(plugin(), new Runnable() { - @Override - public void run() { - plugin().debug("Hopefully fixing any invisibility for {0}", uuid); - try { - if (uuid == null) return; - Player p = Bukkit.getPlayer(uuid); - if (p == null) return; - for (Player online : Bukkit.getOnlinePlayers()) { - if (online != p) { - online.hidePlayer(p); - p.hidePlayer(online); - online.showPlayer(p); - p.showPlayer(online); - } - } - } finally { - if (activeJoins.decrementAndGet() < 0) { - activeJoins.set(0); - } - } - } - }, activeJoins.incrementAndGet() * 20); - } - - @Override - public void registerListeners() { - if (config.isEnabled()) { - plugin().log("Registering InvisibleFix listener"); - plugin().registerListener(this); - plugin().log("Starting recheck task"); - this.recheckTask = Bukkit.getScheduler().runTaskTimerAsynchronously(plugin(), - new Runnable() { - @Override - public void run() { - if (!config.isEnabled()) return; - doRecheck(); - } - }, - config.getRecheckInterval(), config.getRecheckInterval()); - } - } - - private void doRecheck() { - // unspool, then recheck. - plugin().debug("Refixing invisibles..."); - HashSet refix = new HashSet(config.getMaxPlayersPerRecheck()); - LinkedList skiplist = new LinkedList(); - int cnt = 0; - // accumulate - while (this.ltq.peek() != null && cnt < config.getMaxPlayersPerRecheck()) { - UUID fixerUUID = ltq.poll(); - if (fixerUUID == null) break; - Player fixer = Bukkit.getPlayer(fixerUUID); - if (fixer != null) { - if (fixer.isOp() && config.getIgnoreOps()) { - skiplist.add(fixerUUID); - continue; - } - String tPerm = config.getIgnorePermission(); - if (tPerm != null && fixer.hasPermission(tPerm)) { - skiplist.add(fixerUUID); - continue; - } - refix.add(fixer); - cnt++; - } - } - if (cnt > 0) { - plugin().debug("Found {0} players to refix", cnt); - // unblind - for (Player online : Bukkit.getOnlinePlayers()) { - for (Player fix : refix) { - if (!refix.contains(fix)) { - online.hidePlayer(fix); - fix.hidePlayer(online); - online.showPlayer(fix); - fix.hidePlayer(online); - } - } - } - // add them back. - for (Player fix : refix) { - this.ltq.offer(fix.getUniqueId()); - } - } - for (UUID skip : skiplist) { - this.ltq.offer(skip); - } - } - - @Override - public void registerCommands() { - } - - @Override - public void dataBootstrap() { - activeJoins.set(0); - ltq.clear(); - } - - @Override - public void unregisterListeners() { - if (this.recheckTask != null) { - plugin().debug("Stopping InvisibleFix recheck task"); - this.recheckTask.cancel(); - } - } - - @Override - public void unregisterCommands() { - } - - @Override - public void dataCleanup() { - ltq.clear(); - } - - @Override - public String status() { - if (config != null && config.isEnabled()) { - return "InvisibleFix active"; - } else { - return "InvisibleFix not active"; - } - } - - public static InvisibleFixConfig generate(SimpleAdminHacks plugin, ConfigurationSection config) { - return new InvisibleFixConfig(plugin, config); - } -} diff --git a/src/main/java/com/programmerdan/minecraft/simpleadminhacks/hacks/InvisibleFixTwo.java b/src/main/java/com/programmerdan/minecraft/simpleadminhacks/hacks/InvisibleFixTwo.java deleted file mode 100644 index 0e2e11ed..00000000 --- a/src/main/java/com/programmerdan/minecraft/simpleadminhacks/hacks/InvisibleFixTwo.java +++ /dev/null @@ -1,181 +0,0 @@ -package com.programmerdan.minecraft.simpleadminhacks.hacks; - -import java.util.HashMap; -import java.util.Map; - -import org.bukkit.Server; -import org.bukkit.World; -import org.bukkit.configuration.ConfigurationSection; -import org.bukkit.craftbukkit.v1_12_R1.CraftWorld; -import org.bukkit.craftbukkit.v1_12_R1.entity.CraftEntity; -import org.bukkit.entity.Entity; -import org.bukkit.entity.Player; -import org.bukkit.entity.Vehicle; -import org.bukkit.event.EventHandler; -import org.bukkit.event.EventPriority; -import org.bukkit.event.Listener; -import org.bukkit.event.player.PlayerMoveEvent; -import org.bukkit.event.player.PlayerTeleportEvent; -import org.bukkit.event.vehicle.VehicleMoveEvent; - -import com.programmerdan.minecraft.simpleadminhacks.SimpleAdminHacks; -import com.programmerdan.minecraft.simpleadminhacks.SimpleHack; -import com.programmerdan.minecraft.simpleadminhacks.configs.InvisibleFixTwoConfig; - -import net.minecraft.server.v1_12_R1.EntityTracker; -import net.minecraft.server.v1_12_R1.EntityTrackerEntry; -import net.minecraft.server.v1_12_R1.PacketPlayOutEntityTeleport; -import net.minecraft.server.v1_12_R1.WorldServer; - -/** - * DISABLE WITH 1.11 -- This is for 1.10 only. Basically doing what Mojang was too - * busy / lazy to do before 1.11. Note this is not a perfect fix, but at least - * seems to deal with the largest areas of issue, namely, boats and horses, - * by forcing a location packet to be broadcast to other players that are tracking. - * - * Portions adapted and heavily modified from code by aadnk: https://gist.github.com/aadnk/3773860 - * - * @author ProgrammerDan - */ -public class InvisibleFixTwo extends SimpleHack implements Listener { - public static final String NAME = "InvisibleFixTwo"; - - private Server server; - private Map updateMap; - - public InvisibleFixTwo(SimpleAdminHacks plugin, InvisibleFixTwoConfig config) { - super(plugin, config); - this.server = plugin.getServer(); - } - - @EventHandler(priority = EventPriority.MONITOR, ignoreCancelled = true) - public void onPlayerTeleport(PlayerTeleportEvent event) { - if (!config.isEnabled()) return; // ignore if off - - final Player player = event.getPlayer(); - - if (player.isOp() && config.getIgnoreOps()) return; - String tPerm = config.getIgnorePermission(); - if (tPerm != null && player.hasPermission(tPerm)) return; - - server.getScheduler().runTaskLater(plugin(), new Runnable() { - @Override - public void run() { - try { - forceUpdate(player); - } catch (NullPointerException npe) { - plugin().debug("Player offline, no forcefix"); - } - } - }, config.getTeleportFixDelay()); - } - - @EventHandler(priority = EventPriority.MONITOR, ignoreCancelled = true) - public void onPlayerVehicleMove(VehicleMoveEvent move) { - if (!config.isEnabled()) return; // ignore if off - - Vehicle vehicle = move.getVehicle(); - if (vehicle == null) return; - if (vehicle.getPassengers() == null || vehicle.getPassengers().isEmpty()) return; - - for (Entity e : vehicle.getPassengers()) { - if (e == null) continue; - - if (e.isOp() && config.getIgnoreOps()) continue; - String tPerm = config.getIgnorePermission(); - if (tPerm != null && e.hasPermission(tPerm)) continue; - - forceUpdate(e); - } - } - - @EventHandler(priority = EventPriority.MONITOR, ignoreCancelled = true) - public void onPlayerMoveInVehicle(PlayerMoveEvent move) { - if (!config.isEnabled()) return; // ignore if off - - Player p = move.getPlayer(); - if (p == null) return; - - if (p.isOp() && config.getIgnoreOps()) return; - String tPerm = config.getIgnorePermission(); - if (tPerm != null && p.hasPermission(tPerm)) return; - - Entity vehicle = p.getVehicle(); - if (vehicle == null) return; - forceUpdate(p); - } - - private void forceUpdate(Entity entity) { - Long last = updateMap.get(entity.getEntityId()); - long now = System.currentTimeMillis(); - if (last == null || last < now - config.getFixInterval()) { - updateEntities(entity); - updateMap.put(entity.getEntityId(), now); - //plugin().debug("Forcing packet-based update for {0}", entity); - } - } - - private void updateEntities(final Entity entity) { - World world = entity.getWorld(); - WorldServer worldServer = ((CraftWorld) world).getHandle(); - - EntityTracker tracker = worldServer.tracker; - - EntityTrackerEntry entry = (EntityTrackerEntry) tracker.trackedEntities - .get(entity.getEntityId()); - - net.minecraft.server.v1_12_R1.Entity eEntity = getNmsEntity(entity); - - entry.broadcast(new PacketPlayOutEntityTeleport(eEntity)); - } - - private net.minecraft.server.v1_12_R1.Entity getNmsEntity(final Entity entity) { - CraftEntity craftEntity = (CraftEntity) entity; - return craftEntity.getHandle(); - } - - @Override - public void registerListeners() { - if (config.isEnabled()) { - plugin().log("Registering InvisibleFixTwo listener"); - plugin().registerListener(this); - } - } - - @Override - public void registerCommands() { - } - - @Override - public void dataBootstrap() { - updateMap = new HashMap<>(); - } - - @Override - public void unregisterListeners() { - } - - @Override - public void unregisterCommands() { - } - - @Override - public void dataCleanup() { - if (updateMap != null) { - updateMap.clear(); - } - } - - @Override - public String status() { - if (config != null && config.isEnabled()) { - return "InvisibleFixTwo active"; - } else { - return "InvisibleFixTwo not active"; - } - } - - public static InvisibleFixTwoConfig generate(SimpleAdminHacks plugin, ConfigurationSection config) { - return new InvisibleFixTwoConfig(plugin, config); - } -} \ No newline at end of file diff --git a/src/main/java/com/programmerdan/minecraft/simpleadminhacks/hacks/NewfriendAssist.java b/src/main/java/com/programmerdan/minecraft/simpleadminhacks/hacks/NewfriendAssist.java index 7acc2329..56e9322b 100644 --- a/src/main/java/com/programmerdan/minecraft/simpleadminhacks/hacks/NewfriendAssist.java +++ b/src/main/java/com/programmerdan/minecraft/simpleadminhacks/hacks/NewfriendAssist.java @@ -48,7 +48,7 @@ public NewfriendAssist(SimpleAdminHacks plugin, NewfriendAssistConfig config) { * Track standard quit events to monitor newfriend playtime on the day of join. */ @EventHandler(priority=EventPriority.MONITOR, ignoreCancelled=true) - public void NewLeaveEvent(PlayerQuitEvent exit) { + public void newLeaveEvent(PlayerQuitEvent exit) { if (!config.isEnabled()) return; doLeave(exit.getPlayer()); } @@ -57,7 +57,7 @@ public void NewLeaveEvent(PlayerQuitEvent exit) { * Track standard kick events to monitor newfriend playtime on the day of join. */ @EventHandler(priority=EventPriority.MONITOR, ignoreCancelled=true) - public void NewKickEvent(PlayerKickEvent exit) { + public void newKickEvent(PlayerKickEvent exit) { if (!config.isEnabled()) return; doLeave(exit.getPlayer()); } @@ -95,7 +95,7 @@ public void NewJoinEvent(PlayerJoinEvent join) { newfriendNames.put(newUUID, newfriend.getName()); newfriendSessionTime.put(newUUID, new SessionTime(System.currentTimeMillis())); - if (config.getAnnounceBroadcast().size() > 0) { + if (!config.getAnnounceBroadcast().isEmpty()) { // Prepare message String cleanMessage = cleanMessage(join); @@ -155,8 +155,8 @@ public void registerCommands() { @Override public void dataBootstrap() { - this.newfriendNames = new HashMap(); - this.newfriendSessionTime = new HashMap(); + this.newfriendNames = new HashMap<>(); + this.newfriendSessionTime = new HashMap<>(); } @Override @@ -185,7 +185,7 @@ public void dataCleanup() { */ @Override public String status() { - StringBuffer sb = new StringBuffer(); + StringBuilder sb = new StringBuilder(); if (config != null && config.isEnabled()) { sb.append("NewfriendAssist.PlayerJoin/Quit/KickEvent monitoring active"); } else { diff --git a/src/main/java/com/programmerdan/minecraft/simpleadminhacks/hacks/ToggleLamp.java b/src/main/java/com/programmerdan/minecraft/simpleadminhacks/hacks/ToggleLamp.java index 4ecf04fc..a007c877 100644 --- a/src/main/java/com/programmerdan/minecraft/simpleadminhacks/hacks/ToggleLamp.java +++ b/src/main/java/com/programmerdan/minecraft/simpleadminhacks/hacks/ToggleLamp.java @@ -6,7 +6,7 @@ import org.bukkit.Sound; import org.bukkit.block.Block; import org.bukkit.configuration.ConfigurationSection; -import org.bukkit.craftbukkit.v1_12_R1.CraftWorld; +import org.bukkit.craftbukkit.v1_14_R1.CraftWorld; import org.bukkit.entity.Player; import org.bukkit.event.EventHandler; import org.bukkit.event.EventPriority; @@ -22,7 +22,7 @@ import com.programmerdan.minecraft.simpleadminhacks.SimpleHack; import com.programmerdan.minecraft.simpleadminhacks.configs.ToggleLampConfig; -import net.minecraft.server.v1_12_R1.World; +import net.minecraft.server.v1_14_R1.World; import vg.civcraft.mc.citadel.Citadel; import vg.civcraft.mc.citadel.ReinforcementManager; import vg.civcraft.mc.citadel.reinforcement.PlayerReinforcement; @@ -48,12 +48,10 @@ public void onInteract(PlayerInteractEvent event) { } Block clickedBlock = event.getClickedBlock(); - if(clickedBlock == null) { return; } - // if it wasn't a right click if(event.getAction() != Action.RIGHT_CLICK_BLOCK) { return; @@ -71,7 +69,7 @@ public void onInteract(PlayerInteractEvent event) { Player eventPlayer = event.getPlayer(); Material clickedBlockMat = clickedBlock.getType(); - if(!(clickedBlockMat == Material.REDSTONE_LAMP_ON || clickedBlockMat == Material.REDSTONE_LAMP_OFF)) { + if(clickedBlockMat != Material.REDSTONE_LAMP) { return; } @@ -116,13 +114,10 @@ public void onInteract(PlayerInteractEvent event) { public void onBlockPhysics(BlockPhysicsEvent event) { Block eventBlock = event.getBlock(); Material eventMat = eventBlock.getType(); - - if(eventMat != Material.REDSTONE_LAMP_ON && eventMat != Material.REDSTONE_LAMP_OFF) { + if(eventMat != Material.REDSTONE_LAMP) { return; } - - boolean toggled = eventBlock.hasMetadata(META_TOGGLED) ? eventBlock.getMetadata(META_TOGGLED).get(0).asBoolean() : false; - + boolean toggled = eventBlock.hasMetadata(META_TOGGLED) && eventBlock.getMetadata(META_TOGGLED).get(0).asBoolean(); if(toggled) { event.setCancelled(true); } From 4d52acf0bef6f9db71ce6aec4925ea15b428ddd2 Mon Sep 17 00:00:00 2001 From: Maxopoly Date: Tue, 20 Aug 2019 23:27:18 +0200 Subject: [PATCH 05/28] Mostly complete 1.14 update --- .../InvalidConfigException.java | 2 + .../simpleadminhacks/SimpleAdminHacks.java | 10 -- .../configs/TimingsHackConfig.java | 38 ++--- .../simpleadminhacks/hacks/Experimental.java | 2 +- .../simpleadminhacks/hacks/GameFeatures.java | 63 +++---- .../simpleadminhacks/hacks/GameFixes.java | 156 ++++++++++++++---- .../simpleadminhacks/hacks/GameTuning.java | 42 ++--- .../simpleadminhacks/hacks/Insight.java | 16 +- .../hacks/ReinforcedChestBreak.java | 17 +- .../simpleadminhacks/hacks/TimingsHack.java | 6 +- .../simpleadminhacks/hacks/ToggleLamp.java | 12 +- .../simpleadminhacks/util/TeleportUtil.java | 13 +- 12 files changed, 220 insertions(+), 157 deletions(-) diff --git a/src/main/java/com/programmerdan/minecraft/simpleadminhacks/InvalidConfigException.java b/src/main/java/com/programmerdan/minecraft/simpleadminhacks/InvalidConfigException.java index e9a1d495..9faa086b 100644 --- a/src/main/java/com/programmerdan/minecraft/simpleadminhacks/InvalidConfigException.java +++ b/src/main/java/com/programmerdan/minecraft/simpleadminhacks/InvalidConfigException.java @@ -2,6 +2,8 @@ public class InvalidConfigException extends RuntimeException { + private static final long serialVersionUID = 7614429135140646756L; + public InvalidConfigException(String message) { super(message); } diff --git a/src/main/java/com/programmerdan/minecraft/simpleadminhacks/SimpleAdminHacks.java b/src/main/java/com/programmerdan/minecraft/simpleadminhacks/SimpleAdminHacks.java index 69a95a44..c2fa4101 100644 --- a/src/main/java/com/programmerdan/minecraft/simpleadminhacks/SimpleAdminHacks.java +++ b/src/main/java/com/programmerdan/minecraft/simpleadminhacks/SimpleAdminHacks.java @@ -1,13 +1,6 @@ package com.programmerdan.minecraft.simpleadminhacks; -import java.lang.reflect.Constructor; -import java.lang.reflect.InvocationTargetException; -import java.lang.reflect.Method; -import java.util.ArrayList; import java.util.Collection; -import java.util.Collections; -import java.util.LinkedList; -import java.util.List; import java.util.Set; import java.util.UUID; import java.util.logging.Level; @@ -17,14 +10,11 @@ import org.bukkit.command.CommandExecutor; import org.bukkit.command.ConsoleCommandSender; import org.bukkit.command.PluginCommand; -import org.bukkit.configuration.ConfigurationSection; import org.bukkit.configuration.file.FileConfiguration; import org.bukkit.entity.Player; import org.bukkit.event.Listener; import org.bukkit.plugin.java.JavaPlugin; -import com.google.common.reflect.ClassPath; - /** * Wrapper for simple admin hacks, each doing a thing and each configurable. * diff --git a/src/main/java/com/programmerdan/minecraft/simpleadminhacks/configs/TimingsHackConfig.java b/src/main/java/com/programmerdan/minecraft/simpleadminhacks/configs/TimingsHackConfig.java index 7e2d994f..fe972023 100644 --- a/src/main/java/com/programmerdan/minecraft/simpleadminhacks/configs/TimingsHackConfig.java +++ b/src/main/java/com/programmerdan/minecraft/simpleadminhacks/configs/TimingsHackConfig.java @@ -11,9 +11,9 @@ public class TimingsHackConfig extends SimpleHackConfig { - private Short timingsMap; - private Map bindMaps; - private Map reverseBindMaps; + private Integer timingsMap; + private Map bindMaps; + private Map reverseBindMaps; public TimingsHackConfig(SimpleAdminHacks plugin, ConfigurationSection base) { super(plugin, base); @@ -21,45 +21,45 @@ public TimingsHackConfig(SimpleAdminHacks plugin, ConfigurationSection base) { @Override protected void wireup(ConfigurationSection config) { - timingsMap = config.contains("timingMap") ? (short) config.getInt("timingMap") : null; - bindMaps = new ConcurrentHashMap(); - reverseBindMaps = new ConcurrentHashMap(); + timingsMap = config.contains("timingMap") ? config.getInt("timingMap") : null; + bindMaps = new ConcurrentHashMap<>(); + reverseBindMaps = new ConcurrentHashMap<>(); if (config.contains("bindings")) { ConfigurationSection bindings = config.getConfigurationSection("bindings"); Set keys = bindings.getKeys(false); for (String key : keys) { - bindMaps.put(key, (short) bindings.getInt(key)); - reverseBindMaps.put((short) bindings.getInt(key), key); + bindMaps.put(key, bindings.getInt(key)); + reverseBindMaps.put(bindings.getInt(key), key); } } } - public Short getTimingsMap() { + public Integer getTimingsMap() { return timingsMap; } - public void setTimingsMap(short mapId) { - timingsMap = mapId; - getBase().set("timingMap", mapId); + public void setTimingsMap(int i) { + timingsMap = i; + getBase().set("timingMap", i); } - public Short getBindMap(String bind) { + public Integer getBindMap(String bind) { if (bind == null) { return null; } return bindMaps.get(bind); } - public void setBindMap(String bind, short mapId) { - Short prior = bindMaps.replace(bind, mapId); + public void setBindMap(String bind, int i) { + Integer prior = bindMaps.replace(bind, i); if (prior != null) { reverseBindMaps.remove(prior); } - reverseBindMaps.replace(mapId, bind); - getBase().set("bindings." + bind, mapId); + reverseBindMaps.replace(i, bind); + getBase().set("bindings." + bind, i); } - public String getBindFromId(short mapId) { - return reverseBindMaps.get(mapId); + public String getBindFromId(int i) { + return reverseBindMaps.get(i); } } diff --git a/src/main/java/com/programmerdan/minecraft/simpleadminhacks/hacks/Experimental.java b/src/main/java/com/programmerdan/minecraft/simpleadminhacks/hacks/Experimental.java index c4b881f2..bf6c5e82 100644 --- a/src/main/java/com/programmerdan/minecraft/simpleadminhacks/hacks/Experimental.java +++ b/src/main/java/com/programmerdan/minecraft/simpleadminhacks/hacks/Experimental.java @@ -153,7 +153,7 @@ private void logTeleport(PlayerTeleportEvent event, StringBuilder sb) { Player player = event.getPlayer(); Location from = event.getFrom(); Location to = event.getTo(); - sb.append(String.format(" %16s", player != null ? player.getName() : "--unknown--")); + sb.append(String.format(" %16s", player.getName())); sb.append(String.format(" %s,%5.0f,%3.0f,%5.0f", from.getWorld().getName(), from.getX(), from.getY(), from.getZ())); sb.append(" ->"); if (to != null) { 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 d0bcf6a4..8dcf0e23 100644 --- a/src/main/java/com/programmerdan/minecraft/simpleadminhacks/hacks/GameFeatures.java +++ b/src/main/java/com/programmerdan/minecraft/simpleadminhacks/hacks/GameFeatures.java @@ -12,6 +12,7 @@ import org.bukkit.block.Biome; import org.bukkit.block.Block; import org.bukkit.block.BlockFace; +import org.bukkit.block.data.type.Dispenser; import org.bukkit.configuration.ConfigurationSection; import org.bukkit.entity.Entity; import org.bukkit.entity.EntityType; @@ -43,7 +44,6 @@ import org.bukkit.event.vehicle.VehicleDestroyEvent; import org.bukkit.event.vehicle.VehicleExitEvent; import org.bukkit.inventory.ItemStack; -import org.bukkit.material.Dispenser; import com.programmerdan.minecraft.simpleadminhacks.SimpleAdminHacks; import com.programmerdan.minecraft.simpleadminhacks.SimpleHack; @@ -225,7 +225,6 @@ public void potatoXP(FurnaceExtractEvent event) { if (!config.isEnabled() || config.isPotatoXPEnabled()) return; try { Material mat = event.getItemType(); - if (mat == null) return; if (Material.BAKED_POTATO.equals(mat)) { event.setExpToDrop(0); @@ -240,11 +239,8 @@ public void disableVillagerTrading(PlayerInteractEntityEvent event) { if (!config.isEnabled()) return; if (!config.isVillagerTrading()) { Entity npc = event.getRightClicked(); - - if (npc != null) { - if (npc.getType().equals(EntityType.VILLAGER)) { - event.setCancelled(true); - } + if (npc.getType().equals(EntityType.VILLAGER)) { + event.setCancelled(true); } } } @@ -275,9 +271,9 @@ public void disableEnderChestUse(PlayerInteractEvent event) { if (!config.isEnderChestUse()) { Action action = event.getAction(); Material material = event.getClickedBlock().getType(); - boolean ender_chest = action == Action.RIGHT_CLICK_BLOCK && + boolean enderChest = action == Action.RIGHT_CLICK_BLOCK && material.equals(Material.ENDER_CHEST); - if (ender_chest) { + if (enderChest) { event.setCancelled(true); } } @@ -292,9 +288,9 @@ public void disableShulkerBoxUse(InventoryOpenEvent event){ } @EventHandler(priority = EventPriority.LOWEST, ignoreCancelled = true) public void disabledShulkerBoxHoppering(InventoryMoveItemEvent event) { - if (!config.isEnabled() || config.isShulkerBoxUse()) return; - - if ((event.getDestination() == null) || (event.getSource() == null)) return; + if (!config.isEnabled() || config.isShulkerBoxUse()) { + return; + } if (InventoryType.SHULKER_BOX.equals(event.getDestination().getType()) || InventoryType.SHULKER_BOX.equals(event.getSource().getType())) { event.setCancelled(true); @@ -379,7 +375,7 @@ public void run() { @EventHandler(priority = EventPriority.HIGHEST, ignoreCancelled = true) public void onPlayerBucketEmptyEvent(PlayerBucketEmptyEvent e) { if (config.isEnabled() && config.isBlockWaterInHell()) { - if ((e.getBlockClicked().getBiome() == Biome.HELL) && (e.getBucket() == Material.WATER_BUCKET)) { + if ((e.getBlockClicked().getBiome() == Biome.NETHER) && (e.getBucket() == Material.WATER_BUCKET)) { e.setCancelled(true); e.getItemStack().setType(Material.BUCKET); } @@ -388,16 +384,15 @@ public void onPlayerBucketEmptyEvent(PlayerBucketEmptyEvent e) { @EventHandler(priority = EventPriority.LOWEST, ignoreCancelled = true) public void onDispenseEvent(BlockDispenseEvent event) { - if (config.isEnabled() && config.isBlockWaterInHell()) { - if (event.getBlock().getType() == Material.DISPENSER) { - Dispenser disp = (Dispenser) event.getBlock().getState().getData(); - Biome biome = event.getBlock().getRelative(disp.getFacing()).getBiome(); - - if (Biome.HELL.equals(biome) && event.getItem() != null && event.getItem().getType().equals(Material.WATER_BUCKET)) { - event.setItem(new ItemStack(Material.BUCKET, event.getItem().getAmount())); - event.setCancelled(true); - } - + if (!config.isEnabled() || !config.isBlockWaterInHell()) { + return; + } + if (event.getBlock().getType() == Material.DISPENSER) { + Dispenser disp = (Dispenser) event.getBlock().getBlockData(); + Biome biome = event.getBlock().getRelative(disp.getFacing()).getBiome(); + if (Biome.NETHER.equals(biome) && event.getItem().getType().equals(Material.WATER_BUCKET)) { + event.setItem(new ItemStack(Material.BUCKET, event.getItem().getAmount())); + event.setCancelled(true); } } } @@ -423,11 +418,8 @@ public void onPlayerQuit(PlayerQuitEvent event) { public void onVehicleExit(VehicleExitEvent event) { if (config.isEnabled() && config.isMinecartTeleport()) { final Vehicle vehicle = event.getVehicle(); - if (vehicle == null) { - return; - } final Entity passenger = event.getExited(); - if (passenger == null || !(passenger instanceof Player)) { + if (!(passenger instanceof Player)) { return; } final Player player = (Player) passenger; @@ -445,13 +437,7 @@ public void onVehicleExit(VehicleExitEvent event) { public void onVehicleDestroy(VehicleDestroyEvent event) { if (config.isEnabled() && config.isMinecartTeleport()) { final Vehicle vehicle = event.getVehicle(); - if (vehicle == null) { - return; - } final List passengers = vehicle.getPassengers(); - if (passengers == null) { - return; - } final Location vehicleLocation = vehicle.getLocation(); passengers.removeIf((passenger -> !(passenger instanceof Player))); passengers.forEach((passenger) -> { @@ -469,20 +455,15 @@ public void onVehicleDestroy(VehicleDestroyEvent event) { @EventHandler public void onBlockFromTo(BlockFromToEvent event) { if (config.isEnabled() && config.isObsidianGenerators()) { - if (event.getBlock().getType() == Material.STATIONARY_LAVA || - event.getBlock().getType() == Material.LAVA) { + if (event.getBlock().getType() == Material.LAVA) { Block to = event.getToBlock(); if (to.getType() == Material.REDSTONE || to.getType() == Material.TRIPWIRE) { - if (to.getRelative(BlockFace.NORTH).getType() == Material.STATIONARY_WATER - || to.getRelative(BlockFace.SOUTH).getType() == Material.STATIONARY_WATER - || to.getRelative(BlockFace.WEST).getType() == Material.STATIONARY_WATER - || to.getRelative(BlockFace.EAST).getType() == Material.STATIONARY_WATER - || to.getRelative(BlockFace.NORTH).getType() == Material.WATER + if (to.getRelative(BlockFace.NORTH).getType() == Material.WATER || to.getRelative(BlockFace.SOUTH).getType() == Material.WATER || to.getRelative(BlockFace.WEST).getType() == Material.WATER || to.getRelative(BlockFace.EAST).getType() == Material.WATER) { to.setType(Material.OBSIDIAN); - } + } } } } diff --git a/src/main/java/com/programmerdan/minecraft/simpleadminhacks/hacks/GameFixes.java b/src/main/java/com/programmerdan/minecraft/simpleadminhacks/hacks/GameFixes.java index 7a3cdfff..7ee298d9 100644 --- a/src/main/java/com/programmerdan/minecraft/simpleadminhacks/hacks/GameFixes.java +++ b/src/main/java/com/programmerdan/minecraft/simpleadminhacks/hacks/GameFixes.java @@ -12,6 +12,8 @@ import org.bukkit.block.Block; import org.bukkit.block.BlockFace; import org.bukkit.block.BlockState; +import org.bukkit.block.data.type.Dispenser; +import org.bukkit.block.data.type.Hopper; import org.bukkit.configuration.ConfigurationSection; import org.bukkit.entity.Player; import org.bukkit.event.EventHandler; @@ -33,8 +35,6 @@ import org.bukkit.event.player.PlayerTeleportEvent.TeleportCause; import org.bukkit.event.world.StructureGrowEvent; import org.bukkit.inventory.InventoryHolder; -import org.bukkit.material.Dispenser; -import org.bukkit.material.Hopper; import com.programmerdan.minecraft.simpleadminhacks.SimpleAdminHacks; import com.programmerdan.minecraft.simpleadminhacks.SimpleHack; @@ -162,7 +162,6 @@ public void onBlockBreak(BlockBreakEvent event) { if (!config.isEnabled() || !config.isBlockElytraBreakBug()) return; Block block = event.getBlock(); Player player = event.getPlayer(); - if (block == null || player == null) return; if (!player.getLocation().equals(block.getLocation()) && player.getEyeLocation().getBlock().getType() != Material.AIR) { @@ -173,7 +172,9 @@ public void onBlockBreak(BlockBreakEvent event) { @EventHandler(priority = EventPriority.LOWEST, ignoreCancelled = true) public void onEntityTeleport(EntityTeleportEvent event) { - if (!config.isEnabled() || config.canStorageTeleport()) return; + if (!config.isEnabled() || config.canStorageTeleport()) { + return; + } if (event.getEntity() instanceof InventoryHolder) { event.setCancelled(true); } @@ -181,7 +182,9 @@ public void onEntityTeleport(EntityTeleportEvent event) { @EventHandler(priority = EventPriority.LOWEST, ignoreCancelled = true) public void onEntityPortal(EntityPortalEvent event) { - if (!config.isEnabled() || config.canStorageTeleport()) return; + if (!config.isEnabled() || config.canStorageTeleport()) { + return; + } if (event.getEntity() instanceof InventoryHolder) { event.setCancelled(true); } @@ -190,13 +193,14 @@ public void onEntityPortal(EntityPortalEvent event) { @EventHandler(priority = EventPriority.LOWEST, ignoreCancelled = true) public void onInventoryMoveItem(InventoryMoveItemEvent event) { if (!config.isEnabled() || !config.isStopHopperDupe()) return; - if ((event.getDestination() == null) || (event.getSource() == null) || - !(InventoryType.HOPPER.equals(event.getDestination().getType())) || + if (!(InventoryType.HOPPER.equals(event.getDestination().getType())) || !(InventoryType.HOPPER.equals(event.getSource().getType())) || !(Material.HOPPER.equals(event.getDestination().getLocation().getBlock().getType())) || - !(Material.HOPPER.equals(event.getSource().getLocation().getBlock().getType()))) return; - Hopper source = (Hopper) event.getSource().getLocation().getBlock().getState().getData(); - Hopper dest = (Hopper) event.getDestination().getLocation().getBlock().getState().getData(); + !(Material.HOPPER.equals(event.getSource().getLocation().getBlock().getType()))) { + return; + } + Hopper source = (Hopper) event.getSource().getLocation().getBlock().getBlockData(); + Hopper dest = (Hopper) event.getDestination().getLocation().getBlock().getBlockData(); if (source.getFacing().getOppositeFace() == dest.getFacing()) { //They're pointing into each other and will eventually dupe event.setCancelled(true); @@ -243,7 +247,7 @@ public void onPlayerBucketEmpty(PlayerBucketEmptyEvent event) { if (config.isEnabled() && config.isStopEndPortalDeletion()) { Block block = event.getBlockClicked().getRelative(event.getBlockFace()); - if (block.getType() == Material.ENDER_PORTAL) { + if (block.getType() == Material.END_PORTAL) { event.setCancelled(true); } } @@ -253,10 +257,10 @@ public void onPlayerBucketEmpty(PlayerBucketEmptyEvent event) { public void onDispenseEvent(BlockDispenseEvent event) { if (config.isEnabled() && config.isStopEndPortalDeletion()) { if (event.getBlock().getType() == Material.DISPENSER) { - Dispenser disp = (Dispenser) event.getBlock().getState().getData(); + Dispenser disp = (Dispenser) event.getBlock().getBlockData(); Material type = event.getBlock().getRelative(disp.getFacing()).getType(); - if (type == Material.ENDER_PORTAL) { + if (type == Material.END_PORTAL) { event.setCancelled(true); } } @@ -268,12 +272,32 @@ public void onPlayerEnterBed(BlockPlaceEvent event) { if (!config.isEnabled() || !config.stopBedBombing()) return; Block b = event.getBlock(); - if (!(b.getType() == Material.BED || b.getType() == Material.BED_BLOCK)) - return; - + switch (b.getType()) { + case BLACK_BED: + case BLUE_BED: + case BROWN_BED: + case CYAN_BED: + case GRAY_BED: + case GREEN_BED: + case LIME_BED: + case MAGENTA_BED: + case LIGHT_GRAY_BED: + case PURPLE_BED: + case PINK_BED: + case YELLOW_BED: + case WHITE_BED: + case RED_BED: + case ORANGE_BED: + case LIGHT_BLUE_BED: + break; + default: + return; + } Environment env = b.getLocation().getWorld().getEnvironment(); Biome biome = b.getLocation().getBlock().getBiome(); - if (env == Environment.NETHER || env == Environment.THE_END || Biome.HELL == biome || Biome.SKY == biome) { + if (env == Environment.NETHER || env == Environment.THE_END || Biome.NETHER == biome + || Biome.END_BARRENS == biome || Biome.END_HIGHLANDS == biome + || Biome.END_MIDLANDS == biome || Biome.SMALL_END_ISLANDS == biome) { event.setCancelled(true); } } @@ -281,7 +305,8 @@ public void onPlayerEnterBed(BlockPlaceEvent event) { @EventHandler(priority = EventPriority.LOWEST, ignoreCancelled=true) public void onStructureGrow(StructureGrowEvent event) { if(config.isEnabled() && config.stopTreeWraparound()) { - int maxY = 0, minY = 257; + int maxY = 0; + int minY = 257; for(BlockState bs : event.getBlocks()) { final int y = bs.getLocation().getBlockY(); maxY = Math.max(maxY, y); @@ -322,35 +347,108 @@ public void onPearlTeleport(PlayerTeleportEvent event) { case ENDER_CHEST: height = 0.875; break; - case STEP: + case ACACIA_SLAB: + case ANDESITE_SLAB: + case BIRCH_SLAB: + case BRICK_SLAB: + case COBBLESTONE_SLAB: + case CUT_RED_SANDSTONE_SLAB: + case CUT_SANDSTONE_SLAB: + case DARK_OAK_SLAB: + case DARK_PRISMARINE_SLAB: + case DIORITE_SLAB: + case END_STONE_BRICK_SLAB: + case GRANITE_SLAB: + case JUNGLE_SLAB: + case MOSSY_COBBLESTONE_SLAB: + case STONE_SLAB: + case STONE_BRICK_SLAB: + case SPRUCE_SLAB: + case SMOOTH_STONE_SLAB: + case SMOOTH_SANDSTONE_SLAB: + case SMOOTH_RED_SANDSTONE_SLAB: + case SMOOTH_QUARTZ_SLAB: + case SANDSTONE_SLAB: + case RED_SANDSTONE_SLAB: + case RED_NETHER_BRICK_SLAB: + case QUARTZ_SLAB: + case PURPUR_SLAB: + case PRISMARINE_SLAB: + case PRISMARINE_BRICK_SLAB: + case POLISHED_GRANITE_SLAB: + case POLISHED_DIORITE_SLAB: + case POLISHED_ANDESITE_SLAB: + case PETRIFIED_OAK_SLAB: + case OAK_SLAB: + case NETHER_BRICK_SLAB: + case MOSSY_STONE_BRICK_SLAB: lowerBlockBypass = true; height = 0.5; break; - case WATER_LILY: + case LILY_PAD: height = 0.016; break; - case ENCHANTMENT_TABLE: + case ENCHANTING_TABLE: lowerBlockBypass = true; height = 0.75; break; - case BED: - case BED_BLOCK: + case BLACK_BED: + case BLUE_BED: + case BROWN_BED: + case CYAN_BED: + case GRAY_BED: + case GREEN_BED: + case LIME_BED: + case MAGENTA_BED: + case LIGHT_GRAY_BED: + case PURPLE_BED: + case PINK_BED: + case YELLOW_BED: + case WHITE_BED: + case RED_BED: + case ORANGE_BED: + case LIGHT_BLUE_BED: break; case FLOWER_POT: - case FLOWER_POT_ITEM: height = 0.375; break; - case SKULL: + case SKELETON_SKULL: + case WITHER_SKELETON_WALL_SKULL: + case WITHER_SKELETON_SKULL: + case SKELETON_WALL_SKULL: height = 0.5; break; default: break; } switch (below.getType()) { - case FENCE: - case FENCE_GATE: - case NETHER_FENCE: - case COBBLE_WALL: + case ACACIA_FENCE: + case ACACIA_FENCE_GATE: + case BIRCH_FENCE: + case BIRCH_FENCE_GATE: + case DARK_OAK_FENCE: + case DARK_OAK_FENCE_GATE: + case JUNGLE_FENCE: + case JUNGLE_FENCE_GATE: + case SPRUCE_FENCE_GATE: + case SPRUCE_FENCE: + case OAK_FENCE_GATE: + case OAK_FENCE: + case NETHER_BRICK_FENCE: + case ANDESITE_WALL: + case BRICK_WALL: + case STONE_BRICK_WALL: + case COBBLESTONE_WALL: + case DIORITE_WALL: + case END_STONE_BRICK_WALL: + case GRANITE_WALL: + case SANDSTONE_WALL: + case RED_SANDSTONE_WALL: + case MOSSY_COBBLESTONE_WALL: + case MOSSY_STONE_BRICK_WALL: + case PRISMARINE_WALL: + case RED_NETHER_BRICK_WALL: + case NETHER_BRICK_WALL: height = 0.5; break; default: diff --git a/src/main/java/com/programmerdan/minecraft/simpleadminhacks/hacks/GameTuning.java b/src/main/java/com/programmerdan/minecraft/simpleadminhacks/hacks/GameTuning.java index 8f3dd7ce..a6879e84 100644 --- a/src/main/java/com/programmerdan/minecraft/simpleadminhacks/hacks/GameTuning.java +++ b/src/main/java/com/programmerdan/minecraft/simpleadminhacks/hacks/GameTuning.java @@ -8,6 +8,7 @@ import org.bukkit.GameMode; import org.bukkit.Location; import org.bukkit.Material; +import org.bukkit.World.Environment; import org.bukkit.block.Block; import org.bukkit.block.BlockState; import org.bukkit.configuration.ConfigurationSection; @@ -35,8 +36,10 @@ import org.bukkit.event.player.PlayerMoveEvent; import org.bukkit.event.player.PlayerPortalEvent; import org.bukkit.event.player.PlayerTeleportEvent; +import org.bukkit.event.player.PlayerBedEnterEvent.BedEnterResult; import org.bukkit.event.world.PortalCreateEvent; import org.bukkit.inventory.InventoryHolder; +import org.bukkit.inventory.meta.SpawnEggMeta; import com.programmerdan.minecraft.simpleadminhacks.SimpleAdminHacks; import com.programmerdan.minecraft.simpleadminhacks.SimpleHack; @@ -202,28 +205,16 @@ public void chunkLimitsExploitRetract(BlockPistonRetractEvent event) { } } } - - @SuppressWarnings("deprecation") - @EventHandler(priority = EventPriority.HIGH, ignoreCancelled = true) - public void bedRClickToSetSpawn(PlayerInteractEvent event) { - if (!config.isEnabled() || !config.areDaytimeBedsEnabled() || - event.getAction() != Action.RIGHT_CLICK_BLOCK || - event.getClickedBlock().getType() != Material.bed) { + + @EventHandler + public void enterBed(PlayerBedEnterEvent e) { + if (!config.isEnabled() || !config.areDaytimeBedsEnabled()) { return; } - - if (event.getClickedBlock() == null) return; - - // Let plugins that already watch for and cancel this event have a turn, like ExilePearl - PlayerBedEnterEvent pbee = new PlayerBedEnterEvent(event.getPlayer(), event.getClickedBlock()); - Bukkit.getServer().getPluginManager().callEvent(pbee); - if (pbee.isCancelled()) { - return; + if (e.getBedEnterResult() == BedEnterResult.NOT_POSSIBLE_NOW || e.getBedEnterResult() == BedEnterResult.NOT_SAFE) { + e.getPlayer().setBedSpawnLocation(e.getBed().getLocation(), false); + e.getPlayer().sendTitle("", config.getDaytimeBedSpawnSetMessage()); } - - event.getPlayer().setBedSpawnLocation(event.getClickedBlock().getLocation(), false); - Location loc = event.getClickedBlock().getLocation(); - event.getPlayer().sendTitle("", config.getDaytimeBedSpawnSetMessage()); } @EventHandler(priority = EventPriority.LOWEST) @@ -251,7 +242,7 @@ public void onPlayerPortalTravel(PlayerPortalEvent event) { @EventHandler(priority = EventPriority.LOWEST, ignoreCancelled = true) public void onPortalCreate(PortalCreateEvent event) { if (config.isEnabled() && !config.isReturnNetherPortal()) { - if (event.getReason() == PortalCreateEvent.CreateReason.FIRE && event.getWorld().getName().equals("world_nether")) { + if (event.getReason() == PortalCreateEvent.CreateReason.FIRE && event.getWorld().getEnvironment() == Environment.NETHER) { event.setCancelled(true); } } @@ -305,12 +296,13 @@ public void onEntityTarget(EntityTargetEvent event) { @EventHandler public void onPlayerInteract(PlayerInteractEvent event) { - if(config.isEnabled() && event.getAction() == Action.RIGHT_CLICK_BLOCK) { - boolean cancel = !config.isEnderChestInventories() && event.getClickedBlock().getType() == Material.ENDER_CHEST; - cancel = cancel || (!config.canChangeSpawnerType() && event.getClickedBlock().getType() == Material.MOB_SPAWNER - && event.getItem() != null && event.getItem().getType() == Material.MONSTER_EGG); - event.setCancelled(cancel); + if(!config.isEnabled() || event.getAction() != Action.RIGHT_CLICK_BLOCK) { + return; } + boolean cancel = !config.isEnderChestInventories() && event.getClickedBlock().getType() == Material.ENDER_CHEST; + cancel |= !config.canChangeSpawnerType() && event.getClickedBlock().getType() == Material.SPAWNER + && event.getItem() != null && event.getItem().getItemMeta() instanceof SpawnEggMeta; + event.setCancelled(cancel); } @EventHandler diff --git a/src/main/java/com/programmerdan/minecraft/simpleadminhacks/hacks/Insight.java b/src/main/java/com/programmerdan/minecraft/simpleadminhacks/hacks/Insight.java index 456632b1..f2e14078 100644 --- a/src/main/java/com/programmerdan/minecraft/simpleadminhacks/hacks/Insight.java +++ b/src/main/java/com/programmerdan/minecraft/simpleadminhacks/hacks/Insight.java @@ -77,11 +77,7 @@ public Insight(SimpleAdminHacks plugin, InsightConfig config) { @Override public boolean onCommand(CommandSender sender, Command command, String label, String[] args) { - if (args.length < 1) { // show help - return false; - } - - return true; + return args.length >= 1; } @@ -185,9 +181,9 @@ private void reboundHandlers(Class clazz) { Method method = clazz.getDeclaredMethod("getHandlerList"); HandlerList handler = (HandlerList) method.invoke(null); RegisteredListener[] listeners = handler.getRegisteredListeners(); - ArrayList newOrdering = new ArrayList(listeners.length); - ArrayList thisLow = new ArrayList(); - ArrayList thisHigh = new ArrayList(); + ArrayList newOrdering = new ArrayList<>(listeners.length); + ArrayList thisLow = new ArrayList<>(); + ArrayList thisHigh = new ArrayList<>(); for (RegisteredListener l : listeners) { handler.unregister(l); if (l.getPriority().equals(EventPriority.LOWEST)) { @@ -236,8 +232,8 @@ public void registerCommands() { @Override public void dataBootstrap() { if (config.isEnabled()) { - this.tracking = new ConcurrentHashMap(); - this.rebounders = new ArrayList>(); + this.tracking = new ConcurrentHashMap<>(); + this.rebounders = new ArrayList<>(); } } diff --git a/src/main/java/com/programmerdan/minecraft/simpleadminhacks/hacks/ReinforcedChestBreak.java b/src/main/java/com/programmerdan/minecraft/simpleadminhacks/hacks/ReinforcedChestBreak.java index 03ceff04..2e0037d0 100644 --- a/src/main/java/com/programmerdan/minecraft/simpleadminhacks/hacks/ReinforcedChestBreak.java +++ b/src/main/java/com/programmerdan/minecraft/simpleadminhacks/hacks/ReinforcedChestBreak.java @@ -42,7 +42,9 @@ public static ReinforcedChestBreakConfig generate(SimpleAdminHacks plugin, Confi @Override public void registerListeners() { - if (!config.isEnabled()) return; + if (!config.isEnabled()) { + return; + } Bukkit.getPluginManager().registerEvents(this, plugin()); } @@ -51,7 +53,9 @@ public void registerCommands() {} @Override public void dataBootstrap() { - if (!config.isEnabled()) return; + if (!config.isEnabled()) { + return; + } messages = new HashSet<>(); manager = Citadel.getReinforcementManager(); @@ -80,15 +84,14 @@ public String status() { */ @EventHandler(priority = EventPriority.LOWEST, ignoreCancelled=true) public void onBlockBreak(BlockBreakEvent eve) { - if (!config.isEnabled()) return; - if (eve.getPlayer() == null) return; - if (eve.getBlock() == null) return; + if (!config.isEnabled()) { + return; + } Material bbe = eve.getBlock().getType(); - if (bbe == null) return; if (manager == null) manager = Citadel.getReinforcementManager(); if (Material.CHEST.equals(bbe) || Material.TRAPPED_CHEST.equals(bbe) || Material.ENDER_CHEST.equals(bbe) || Material.FURNACE.equals(bbe) - || Material.BURNING_FURNACE.equals(bbe) || Material.DISPENSER.equals(bbe) + || Material.BLAST_FURNACE.equals(bbe) || Material.DISPENSER.equals(bbe) || Material.DROPPER.equals(bbe) || Material.HOPPER.equals(bbe)) { if(manager.isReinforced(eve.getBlock())) { String name = eve.getPlayer().getDisplayName(); diff --git a/src/main/java/com/programmerdan/minecraft/simpleadminhacks/hacks/TimingsHack.java b/src/main/java/com/programmerdan/minecraft/simpleadminhacks/hacks/TimingsHack.java index 299b8e7b..35e2a72f 100644 --- a/src/main/java/com/programmerdan/minecraft/simpleadminhacks/hacks/TimingsHack.java +++ b/src/main/java/com/programmerdan/minecraft/simpleadminhacks/hacks/TimingsHack.java @@ -418,7 +418,7 @@ public void dataBootstrap() { tickErrors = 0; for (int i = 0; i < LQ_CYCLES; i++) { - hqTickMap[i] = new ConcurrentHashMap(100); + hqTickMap[i] = new ConcurrentHashMap<>(100); } lastTick = System.nanoTime(); @@ -431,7 +431,7 @@ public void run(){ }, 0l, 1l); tickVisualize = new TimingsMap(); - bindVisualizers = new ConcurrentHashMap(); + bindVisualizers = new ConcurrentHashMap<>(); rootThread = Thread.currentThread().getId(); threadBean = ManagementFactory.getThreadMXBean(); @@ -1057,7 +1057,7 @@ public void run() { .append(ChatColor.AQUA).append("\n Elapsed Time: \n").append(ChatColor.BLUE) .append(String.format(" %13d", hqToLqElapsedTime[checkTick])).append(ChatColor.AQUA).append("ns"); - TreeMap reveals = new TreeMap(); + TreeMap reveals = new TreeMap<>(); for (ClassMethod cm : hqTickMap[checkTick].values()) { reveals.compute(cm.max(), (k, S) -> { diff --git a/src/main/java/com/programmerdan/minecraft/simpleadminhacks/hacks/ToggleLamp.java b/src/main/java/com/programmerdan/minecraft/simpleadminhacks/hacks/ToggleLamp.java index a007c877..1db310b1 100644 --- a/src/main/java/com/programmerdan/minecraft/simpleadminhacks/hacks/ToggleLamp.java +++ b/src/main/java/com/programmerdan/minecraft/simpleadminhacks/hacks/ToggleLamp.java @@ -1,10 +1,9 @@ package com.programmerdan.minecraft.simpleadminhacks.hacks; -import java.util.logging.Level; - import org.bukkit.Material; import org.bukkit.Sound; import org.bukkit.block.Block; +import org.bukkit.block.data.Lightable; import org.bukkit.configuration.ConfigurationSection; import org.bukkit.craftbukkit.v1_14_R1.CraftWorld; import org.bukkit.entity.Player; @@ -98,12 +97,9 @@ public void onInteract(PlayerInteractEvent event) { } } } - - try { - switchLamp(clickedBlock, !clickedBlockMat.equals(Material.REDSTONE_LAMP_ON)); - } catch (NoSuchFieldException | SecurityException | IllegalArgumentException | IllegalAccessException e) { - plugin().log(Level.SEVERE, "Error when toggling lamp: ", e); - } + Lightable lightable = (Lightable) clickedBlock.getBlockData(); + lightable.setLit(lightable.isLit()); + clickedBlock.setBlockData(lightable); eventPlayer.getWorld().playSound(clickedBlock.getLocation(), Sound.BLOCK_LEVER_CLICK, 0.5F, 1.0F); diff --git a/src/main/java/com/programmerdan/minecraft/simpleadminhacks/util/TeleportUtil.java b/src/main/java/com/programmerdan/minecraft/simpleadminhacks/util/TeleportUtil.java index 334ab3a5..98f68d01 100644 --- a/src/main/java/com/programmerdan/minecraft/simpleadminhacks/util/TeleportUtil.java +++ b/src/main/java/com/programmerdan/minecraft/simpleadminhacks/util/TeleportUtil.java @@ -13,6 +13,11 @@ import com.programmerdan.minecraft.simpleadminhacks.SimpleAdminHacks; public class TeleportUtil { + + private TeleportUtil() { + //static only, no constructor + } + private static boolean checkForTeleportSpace(Location loc) { final Block block = loc.getBlock(); final Material mat = block.getType(); @@ -51,7 +56,7 @@ public static boolean tryToTeleportVertically(Player player, Location location, // Create a sliding window of block types and track how many of those // are solid. Keep fetching the block below the current block to move down. int air_count = 0; - LinkedList air_window = new LinkedList(); + LinkedList air_window = new LinkedList<>(); loc.setY((float)world.getMaxHeight() - 2); Block block = world.getBlockAt(loc); for (int i = 0; i < 4; ++i) { @@ -64,8 +69,8 @@ public static boolean tryToTeleportVertically(Player player, Location location, } // Now that the window is prepared, scan down the Y-axis. while (block.getY() >= 1) { - Material block_mat = block.getType(); - if (block_mat.isSolid()) { + Material blockMat = block.getType(); + if (blockMat.isSolid()) { if (air_count == 4) { player.setVelocity(new Vector()); loc = block.getLocation(); @@ -81,7 +86,7 @@ public static boolean tryToTeleportVertically(Player player, Location location, } else { ++air_count; } - air_window.addLast(block_mat); + air_window.addLast(blockMat); if (!air_window.removeFirst().isSolid()) { --air_count; } From a2a8f51509e58529e00454e3c8577b0b815b2c0d Mon Sep 17 00:00:00 2001 From: Maxopoly Date: Thu, 22 Aug 2019 03:03:35 +0200 Subject: [PATCH 06/28] Add all of Humbug --- .../minecraft/simpleadminhacks/BasicHack.java | 31 +-- .../simpleadminhacks/HackManager.java | 33 +--- .../InvalidParameterValueException.java | 15 -- .../autoload/ParameterParser.java | 9 - .../autoload/ParameterParsingFactory.java | 74 ------- .../impl/AbstractObjectParameterParser.java | 18 -- .../impl/BlockFaceParameterParser.java | 21 -- .../autoload/impl/BooleanParameterParser.java | 29 --- .../autoload/impl/ByteParameterParser.java | 21 -- .../autoload/impl/CharParameterParser.java | 20 -- .../autoload/impl/DoubleParameterParser.java | 21 -- .../autoload/impl/FloatParameterParser.java | 21 -- .../autoload/impl/IntegerParameterParser.java | 21 -- .../impl/LocationParameterParser.java | 37 ---- .../autoload/impl/LongParameterParser.java | 21 -- .../autoload/impl/ShortParameterParser.java | 21 -- .../autoload/impl/StringParameterParser.java | 16 -- .../simpleadminhacks/hacks/GameTuning.java | 1 - .../simpleadminhacks/hacks/ToggleLamp.java | 61 ++---- .../hacks/basic/HumbugBatchOne.java | 187 ++++++++++++++++++ .../hacks/basic/PortalSpawnModifier.java | 88 +++++++++ src/main/resources/config.yml | 11 -- src/main/resources/plugin.yml | 2 +- 23 files changed, 299 insertions(+), 480 deletions(-) delete mode 100644 src/main/java/com/programmerdan/minecraft/simpleadminhacks/autoload/InvalidParameterValueException.java delete mode 100644 src/main/java/com/programmerdan/minecraft/simpleadminhacks/autoload/ParameterParser.java delete mode 100644 src/main/java/com/programmerdan/minecraft/simpleadminhacks/autoload/ParameterParsingFactory.java delete mode 100644 src/main/java/com/programmerdan/minecraft/simpleadminhacks/autoload/impl/AbstractObjectParameterParser.java delete mode 100644 src/main/java/com/programmerdan/minecraft/simpleadminhacks/autoload/impl/BlockFaceParameterParser.java delete mode 100644 src/main/java/com/programmerdan/minecraft/simpleadminhacks/autoload/impl/BooleanParameterParser.java delete mode 100644 src/main/java/com/programmerdan/minecraft/simpleadminhacks/autoload/impl/ByteParameterParser.java delete mode 100644 src/main/java/com/programmerdan/minecraft/simpleadminhacks/autoload/impl/CharParameterParser.java delete mode 100644 src/main/java/com/programmerdan/minecraft/simpleadminhacks/autoload/impl/DoubleParameterParser.java delete mode 100644 src/main/java/com/programmerdan/minecraft/simpleadminhacks/autoload/impl/FloatParameterParser.java delete mode 100644 src/main/java/com/programmerdan/minecraft/simpleadminhacks/autoload/impl/IntegerParameterParser.java delete mode 100644 src/main/java/com/programmerdan/minecraft/simpleadminhacks/autoload/impl/LocationParameterParser.java delete mode 100644 src/main/java/com/programmerdan/minecraft/simpleadminhacks/autoload/impl/LongParameterParser.java delete mode 100644 src/main/java/com/programmerdan/minecraft/simpleadminhacks/autoload/impl/ShortParameterParser.java delete mode 100644 src/main/java/com/programmerdan/minecraft/simpleadminhacks/autoload/impl/StringParameterParser.java create mode 100644 src/main/java/com/programmerdan/minecraft/simpleadminhacks/hacks/basic/HumbugBatchOne.java create mode 100644 src/main/java/com/programmerdan/minecraft/simpleadminhacks/hacks/basic/PortalSpawnModifier.java diff --git a/src/main/java/com/programmerdan/minecraft/simpleadminhacks/BasicHack.java b/src/main/java/com/programmerdan/minecraft/simpleadminhacks/BasicHack.java index aacae139..4324ad9e 100644 --- a/src/main/java/com/programmerdan/minecraft/simpleadminhacks/BasicHack.java +++ b/src/main/java/com/programmerdan/minecraft/simpleadminhacks/BasicHack.java @@ -16,29 +16,6 @@ public abstract class BasicHack extends SimpleHack implements L public BasicHack(SimpleAdminHacks plugin, BasicHackConfig config) { super(plugin, config); } - - @Override - public void enable() { - if(!config.isEnabled()) { - return; - } - dataBootstrap(); - registerCommands(); - registerListeners(); - onEnable(); - } - - public void disable() { - unregisterListeners(); - unregisterCommands(); - dataCleanup(); - onDisable(); - this.config = null; - } - - public abstract void onEnable(); - - public abstract void onDisable(); @Override public void registerListeners() { @@ -47,12 +24,12 @@ public void registerListeners() { @Override public void registerCommands() { - //no commands + //override in subclass if needed } @Override public void dataBootstrap() { - //dont need this in a basic hack, use onEnable instead + //override in subclass if needed } @Override @@ -63,12 +40,12 @@ public void unregisterListeners() { @Override public void unregisterCommands() { - //no commands + //override in subclass if needed } @Override public void dataCleanup() { - //dont need this in a basic hack, use onDisable instead + //override in subclass if needed } diff --git a/src/main/java/com/programmerdan/minecraft/simpleadminhacks/HackManager.java b/src/main/java/com/programmerdan/minecraft/simpleadminhacks/HackManager.java index 7c3d9f7f..1e0cb927 100644 --- a/src/main/java/com/programmerdan/minecraft/simpleadminhacks/HackManager.java +++ b/src/main/java/com/programmerdan/minecraft/simpleadminhacks/HackManager.java @@ -14,20 +14,15 @@ import com.google.common.reflect.ClassPath; import com.programmerdan.minecraft.simpleadminhacks.autoload.AutoLoad; -import com.programmerdan.minecraft.simpleadminhacks.autoload.InvalidParameterValueException; -import com.programmerdan.minecraft.simpleadminhacks.autoload.ParameterParser; -import com.programmerdan.minecraft.simpleadminhacks.autoload.ParameterParsingFactory; public class HackManager { private SimpleAdminHacks plugin; private List> hacks; - private ParameterParsingFactory parsingFactory; public HackManager(SimpleAdminHacks plugin) { this.plugin = plugin; this.hacks = new LinkedList<>(); - this.parsingFactory = new ParameterParsingFactory(); } public void reloadHacks() { @@ -161,37 +156,19 @@ private void populateParameter(SimpleHack hack) { } else { identifier = autoLoad.id(); } - String rawStringValue = config.getString(identifier); - if (rawStringValue == null) { - if (autoLoad.isRequired()) { - throw new IllegalArgumentException("Hack " + hackClass.getSimpleName() + " expects parameter " - + identifier + ", but did not get it"); - } - return; - } - ParameterParser parser = parsingFactory.getParser(field.getClass()); - if (parser == null) { - throw new IllegalStateException(field.getClass().getSimpleName() + " in " + hackClass.getSimpleName() - + " does not have an autoloading parser"); - } Object value; try { - value = parser.parse(rawStringValue); - } catch (InvalidParameterValueException ipve) { - plugin.log(Level.WARNING, "Failed to load parameter {0} for hack {1} {2}", rawStringValue, - hackClass.getSimpleName(), ipve.toString()); - if (autoLoad.isRequired()) { - throw new IllegalStateException(field.getClass().getSimpleName() + " in " + hackClass.getSimpleName() - + " could not be loaded " + ipve.toString()); - } - return; + value = config.getObject(identifier, field.getClass(), null); + } catch (Exception e) { + throw new IllegalArgumentException("Hack " + hackClass.getSimpleName() + " failed to read parameter " + + identifier, e); } field.setAccessible(true); try { field.set(hack, value); } catch (IllegalArgumentException | IllegalAccessException e) { throw new IllegalStateException(field.getClass().getSimpleName() + " in " + hackClass.getSimpleName() - + " could not be set " + e.toString()); + + " could not be set " + e.toString()); } plugin.log(Level.INFO, "Loaded '{0}' = '{1}'", identifier, value); } diff --git a/src/main/java/com/programmerdan/minecraft/simpleadminhacks/autoload/InvalidParameterValueException.java b/src/main/java/com/programmerdan/minecraft/simpleadminhacks/autoload/InvalidParameterValueException.java deleted file mode 100644 index 6047e525..00000000 --- a/src/main/java/com/programmerdan/minecraft/simpleadminhacks/autoload/InvalidParameterValueException.java +++ /dev/null @@ -1,15 +0,0 @@ -package com.programmerdan.minecraft.simpleadminhacks.autoload; - -public class InvalidParameterValueException extends Exception { - - private static final long serialVersionUID = -6603220618719530965L; - - public InvalidParameterValueException() { - super(); - } - - public InvalidParameterValueException(String msg) { - super(msg); - } - -} diff --git a/src/main/java/com/programmerdan/minecraft/simpleadminhacks/autoload/ParameterParser.java b/src/main/java/com/programmerdan/minecraft/simpleadminhacks/autoload/ParameterParser.java deleted file mode 100644 index 8f4987aa..00000000 --- a/src/main/java/com/programmerdan/minecraft/simpleadminhacks/autoload/ParameterParser.java +++ /dev/null @@ -1,9 +0,0 @@ -package com.programmerdan.minecraft.simpleadminhacks.autoload; - -public interface ParameterParser { - - Class getClassParsed(); - - T parse(String value) throws InvalidParameterValueException; - -} diff --git a/src/main/java/com/programmerdan/minecraft/simpleadminhacks/autoload/ParameterParsingFactory.java b/src/main/java/com/programmerdan/minecraft/simpleadminhacks/autoload/ParameterParsingFactory.java deleted file mode 100644 index 97c7ca72..00000000 --- a/src/main/java/com/programmerdan/minecraft/simpleadminhacks/autoload/ParameterParsingFactory.java +++ /dev/null @@ -1,74 +0,0 @@ -package com.programmerdan.minecraft.simpleadminhacks.autoload; - -import java.util.HashMap; -import java.util.Map; - -import com.programmerdan.minecraft.simpleadminhacks.autoload.impl.BlockFaceParameterParser; -import com.programmerdan.minecraft.simpleadminhacks.autoload.impl.BooleanParameterParser; -import com.programmerdan.minecraft.simpleadminhacks.autoload.impl.ByteParameterParser; -import com.programmerdan.minecraft.simpleadminhacks.autoload.impl.CharParameterParser; -import com.programmerdan.minecraft.simpleadminhacks.autoload.impl.DoubleParameterParser; -import com.programmerdan.minecraft.simpleadminhacks.autoload.impl.FloatParameterParser; -import com.programmerdan.minecraft.simpleadminhacks.autoload.impl.IntegerParameterParser; -import com.programmerdan.minecraft.simpleadminhacks.autoload.impl.LocationParameterParser; -import com.programmerdan.minecraft.simpleadminhacks.autoload.impl.LongParameterParser; -import com.programmerdan.minecraft.simpleadminhacks.autoload.impl.ShortParameterParser; -import com.programmerdan.minecraft.simpleadminhacks.autoload.impl.StringParameterParser; - -public class ParameterParsingFactory { - - private Map, ParameterParser> parserMap; - private Map, Class> wrapperClasses; - - public ParameterParsingFactory() { - loadParser(); - } - - @SuppressWarnings("unchecked") - private Class convertPrimitive(Class primType) { - return (Class) wrapperClasses.get(primType); - } - - @SuppressWarnings("unchecked") - public ParameterParser getParser(Class classType) { - if (classType.isPrimitive()) { - classType = convertPrimitive(classType); - } - ParameterParser parser = parserMap.get(classType); - if (parser == null) { - // need to do this explicitly, otherwise cast will throw exception - return null; - } - return (ParameterParser) parser; - } - - private void loadParser() { - parserMap = new HashMap<>(); - readyParser(new BlockFaceParameterParser()); - readyParser(new BooleanParameterParser()); - readyParser(new ByteParameterParser()); - readyParser(new CharParameterParser()); - readyParser(new DoubleParameterParser()); - readyParser(new FloatParameterParser()); - readyParser(new IntegerParameterParser()); - readyParser(new LocationParameterParser()); - readyParser(new LongParameterParser()); - readyParser(new ShortParameterParser()); - readyParser(new StringParameterParser()); - wrapperClasses = new HashMap<>(); - wrapperClasses.put(boolean.class, Boolean.class); - wrapperClasses.put(byte.class, Byte.class); - wrapperClasses.put(char.class, Character.class); - wrapperClasses.put(double.class, Double.class); - wrapperClasses.put(float.class, Float.class); - wrapperClasses.put(int.class, Integer.class); - wrapperClasses.put(long.class, Long.class); - wrapperClasses.put(short.class, Short.class); - wrapperClasses.put(void.class, Void.class); - } - - private void readyParser(ParameterParser parParser) { - this.parserMap.put(parParser.getClassParsed(), parParser); - } - -} diff --git a/src/main/java/com/programmerdan/minecraft/simpleadminhacks/autoload/impl/AbstractObjectParameterParser.java b/src/main/java/com/programmerdan/minecraft/simpleadminhacks/autoload/impl/AbstractObjectParameterParser.java deleted file mode 100644 index e1b590be..00000000 --- a/src/main/java/com/programmerdan/minecraft/simpleadminhacks/autoload/impl/AbstractObjectParameterParser.java +++ /dev/null @@ -1,18 +0,0 @@ -package com.programmerdan.minecraft.simpleadminhacks.autoload.impl; - -import com.programmerdan.minecraft.simpleadminhacks.autoload.InvalidParameterValueException; -import com.programmerdan.minecraft.simpleadminhacks.autoload.ParameterParser; - -public abstract class AbstractObjectParameterParser implements ParameterParser { - - @Override - public T parse(String value) throws InvalidParameterValueException { - String cleaned = value.trim().toLowerCase(); - if (cleaned.equals("null")) { - return null; - } - return parseObject(cleaned); - } - - public abstract T parseObject(String value) throws InvalidParameterValueException; -} diff --git a/src/main/java/com/programmerdan/minecraft/simpleadminhacks/autoload/impl/BlockFaceParameterParser.java b/src/main/java/com/programmerdan/minecraft/simpleadminhacks/autoload/impl/BlockFaceParameterParser.java deleted file mode 100644 index 7d99cad3..00000000 --- a/src/main/java/com/programmerdan/minecraft/simpleadminhacks/autoload/impl/BlockFaceParameterParser.java +++ /dev/null @@ -1,21 +0,0 @@ -package com.programmerdan.minecraft.simpleadminhacks.autoload.impl; -import org.bukkit.block.BlockFace; - -import com.programmerdan.minecraft.simpleadminhacks.autoload.InvalidParameterValueException; - -public class BlockFaceParameterParser extends AbstractObjectParameterParser { - - @Override - public Class getClassParsed() { - return BlockFace.class; - } - - @Override - public BlockFace parseObject(String value) throws InvalidParameterValueException { - try { - return BlockFace.valueOf(value.toUpperCase()); - } catch (IllegalArgumentException e) { - throw new InvalidParameterValueException(); - } - } -} diff --git a/src/main/java/com/programmerdan/minecraft/simpleadminhacks/autoload/impl/BooleanParameterParser.java b/src/main/java/com/programmerdan/minecraft/simpleadminhacks/autoload/impl/BooleanParameterParser.java deleted file mode 100644 index c475ea02..00000000 --- a/src/main/java/com/programmerdan/minecraft/simpleadminhacks/autoload/impl/BooleanParameterParser.java +++ /dev/null @@ -1,29 +0,0 @@ -package com.programmerdan.minecraft.simpleadminhacks.autoload.impl; - -import com.programmerdan.minecraft.simpleadminhacks.autoload.InvalidParameterValueException; -import com.programmerdan.minecraft.simpleadminhacks.autoload.ParameterParser; - -public class BooleanParameterParser implements ParameterParser { - - @Override - public Class getClassParsed() { - return Boolean.class; - } - - @Override - public Boolean parse(String value) throws InvalidParameterValueException { - switch (value.toLowerCase()) { - case "1": - case "true": - case "t": - return true; - case "0": - case "false": - case "f": - return false; - case "null": - return null; - } - throw new InvalidParameterValueException(); - } -} diff --git a/src/main/java/com/programmerdan/minecraft/simpleadminhacks/autoload/impl/ByteParameterParser.java b/src/main/java/com/programmerdan/minecraft/simpleadminhacks/autoload/impl/ByteParameterParser.java deleted file mode 100644 index b6942581..00000000 --- a/src/main/java/com/programmerdan/minecraft/simpleadminhacks/autoload/impl/ByteParameterParser.java +++ /dev/null @@ -1,21 +0,0 @@ -package com.programmerdan.minecraft.simpleadminhacks.autoload.impl; - -import com.programmerdan.minecraft.simpleadminhacks.autoload.InvalidParameterValueException; -import com.programmerdan.minecraft.simpleadminhacks.autoload.ParameterParser; - -public class ByteParameterParser implements ParameterParser { - - @Override - public Class getClassParsed() { - return Byte.class; - } - - @Override - public Byte parse(String value) throws InvalidParameterValueException { - try { - return Byte.parseByte(value); - } catch (NumberFormatException e) { - throw new InvalidParameterValueException(); - } - } -} diff --git a/src/main/java/com/programmerdan/minecraft/simpleadminhacks/autoload/impl/CharParameterParser.java b/src/main/java/com/programmerdan/minecraft/simpleadminhacks/autoload/impl/CharParameterParser.java deleted file mode 100644 index 68549621..00000000 --- a/src/main/java/com/programmerdan/minecraft/simpleadminhacks/autoload/impl/CharParameterParser.java +++ /dev/null @@ -1,20 +0,0 @@ -package com.programmerdan.minecraft.simpleadminhacks.autoload.impl; - -import com.programmerdan.minecraft.simpleadminhacks.autoload.InvalidParameterValueException; -import com.programmerdan.minecraft.simpleadminhacks.autoload.ParameterParser; - -public class CharParameterParser implements ParameterParser { - - @Override - public Class getClassParsed() { - return Character.class; - } - - @Override - public Character parse(String value) throws InvalidParameterValueException { - if (value.length() != 1) { - throw new InvalidParameterValueException(); - } - return value.charAt(0); - } -} diff --git a/src/main/java/com/programmerdan/minecraft/simpleadminhacks/autoload/impl/DoubleParameterParser.java b/src/main/java/com/programmerdan/minecraft/simpleadminhacks/autoload/impl/DoubleParameterParser.java deleted file mode 100644 index f9692a61..00000000 --- a/src/main/java/com/programmerdan/minecraft/simpleadminhacks/autoload/impl/DoubleParameterParser.java +++ /dev/null @@ -1,21 +0,0 @@ -package com.programmerdan.minecraft.simpleadminhacks.autoload.impl; - -import com.programmerdan.minecraft.simpleadminhacks.autoload.InvalidParameterValueException; -import com.programmerdan.minecraft.simpleadminhacks.autoload.ParameterParser; - -public class DoubleParameterParser implements ParameterParser { - - @Override - public Class getClassParsed() { - return Double.class; - } - - @Override - public Double parse(String value) throws InvalidParameterValueException { - try { - return Double.parseDouble(value); - } catch (NumberFormatException e) { - throw new InvalidParameterValueException(); - } - } -} diff --git a/src/main/java/com/programmerdan/minecraft/simpleadminhacks/autoload/impl/FloatParameterParser.java b/src/main/java/com/programmerdan/minecraft/simpleadminhacks/autoload/impl/FloatParameterParser.java deleted file mode 100644 index 87a6c64d..00000000 --- a/src/main/java/com/programmerdan/minecraft/simpleadminhacks/autoload/impl/FloatParameterParser.java +++ /dev/null @@ -1,21 +0,0 @@ -package com.programmerdan.minecraft.simpleadminhacks.autoload.impl; - -import com.programmerdan.minecraft.simpleadminhacks.autoload.InvalidParameterValueException; -import com.programmerdan.minecraft.simpleadminhacks.autoload.ParameterParser; - -public class FloatParameterParser implements ParameterParser { - - @Override - public Class getClassParsed() { - return Float.class; - } - - @Override - public Float parse(String value) throws InvalidParameterValueException { - try { - return Float.parseFloat(value); - } catch (NumberFormatException e) { - throw new InvalidParameterValueException(); - } - } -} diff --git a/src/main/java/com/programmerdan/minecraft/simpleadminhacks/autoload/impl/IntegerParameterParser.java b/src/main/java/com/programmerdan/minecraft/simpleadminhacks/autoload/impl/IntegerParameterParser.java deleted file mode 100644 index 1e7fc197..00000000 --- a/src/main/java/com/programmerdan/minecraft/simpleadminhacks/autoload/impl/IntegerParameterParser.java +++ /dev/null @@ -1,21 +0,0 @@ -package com.programmerdan.minecraft.simpleadminhacks.autoload.impl; - -import com.programmerdan.minecraft.simpleadminhacks.autoload.InvalidParameterValueException; -import com.programmerdan.minecraft.simpleadminhacks.autoload.ParameterParser; - -public class IntegerParameterParser implements ParameterParser { - - @Override - public Class getClassParsed() { - return Integer.class; - } - - @Override - public Integer parse(String value) throws InvalidParameterValueException { - try { - return Integer.parseInt(value); - } catch (NumberFormatException e) { - throw new InvalidParameterValueException(); - } - } -} diff --git a/src/main/java/com/programmerdan/minecraft/simpleadminhacks/autoload/impl/LocationParameterParser.java b/src/main/java/com/programmerdan/minecraft/simpleadminhacks/autoload/impl/LocationParameterParser.java deleted file mode 100644 index 30a76f76..00000000 --- a/src/main/java/com/programmerdan/minecraft/simpleadminhacks/autoload/impl/LocationParameterParser.java +++ /dev/null @@ -1,37 +0,0 @@ -package com.programmerdan.minecraft.simpleadminhacks.autoload.impl; - -import org.bukkit.Bukkit; -import org.bukkit.Location; -import org.bukkit.World; - -import com.programmerdan.minecraft.simpleadminhacks.autoload.InvalidParameterValueException; - -public class LocationParameterParser extends AbstractObjectParameterParser { - - @Override - public Class getClassParsed() { - return Location.class; - } - - @Override - public Location parseObject(String value) throws InvalidParameterValueException { - String[] args = value.split(" "); - if (args.length != 4) { - throw new InvalidParameterValueException(); - } - double[] parsed = new double[3]; - String worldName = args [0]; - World world = Bukkit.getWorld(worldName); - if (world == null) { - throw new InvalidParameterValueException(worldName + " is not a known world"); - } - try { - for (int i = 0; i < 3; i++) { - parsed[i] = Double.parseDouble(args[i + 1]); - } - } catch (NumberFormatException e) { - throw new InvalidParameterValueException(); - } - return new Location(world, parsed[0], parsed[1], parsed[2]); - } -} diff --git a/src/main/java/com/programmerdan/minecraft/simpleadminhacks/autoload/impl/LongParameterParser.java b/src/main/java/com/programmerdan/minecraft/simpleadminhacks/autoload/impl/LongParameterParser.java deleted file mode 100644 index 752e505f..00000000 --- a/src/main/java/com/programmerdan/minecraft/simpleadminhacks/autoload/impl/LongParameterParser.java +++ /dev/null @@ -1,21 +0,0 @@ -package com.programmerdan.minecraft.simpleadminhacks.autoload.impl; - -import com.programmerdan.minecraft.simpleadminhacks.autoload.InvalidParameterValueException; -import com.programmerdan.minecraft.simpleadminhacks.autoload.ParameterParser; - -public class LongParameterParser implements ParameterParser { - - @Override - public Class getClassParsed() { - return Long.class; - } - - @Override - public Long parse(String value) throws InvalidParameterValueException { - try { - return Long.parseLong(value); - } catch (NumberFormatException e) { - throw new InvalidParameterValueException(); - } - } -} diff --git a/src/main/java/com/programmerdan/minecraft/simpleadminhacks/autoload/impl/ShortParameterParser.java b/src/main/java/com/programmerdan/minecraft/simpleadminhacks/autoload/impl/ShortParameterParser.java deleted file mode 100644 index fbbc40de..00000000 --- a/src/main/java/com/programmerdan/minecraft/simpleadminhacks/autoload/impl/ShortParameterParser.java +++ /dev/null @@ -1,21 +0,0 @@ -package com.programmerdan.minecraft.simpleadminhacks.autoload.impl; - -import com.programmerdan.minecraft.simpleadminhacks.autoload.InvalidParameterValueException; -import com.programmerdan.minecraft.simpleadminhacks.autoload.ParameterParser; - -public class ShortParameterParser implements ParameterParser { - - @Override - public Class getClassParsed() { - return Short.class; - } - - @Override - public Short parse(String value) throws InvalidParameterValueException { - try { - return Short.parseShort(value); - } catch (NumberFormatException e) { - throw new InvalidParameterValueException(); - } - } -} diff --git a/src/main/java/com/programmerdan/minecraft/simpleadminhacks/autoload/impl/StringParameterParser.java b/src/main/java/com/programmerdan/minecraft/simpleadminhacks/autoload/impl/StringParameterParser.java deleted file mode 100644 index 225d1969..00000000 --- a/src/main/java/com/programmerdan/minecraft/simpleadminhacks/autoload/impl/StringParameterParser.java +++ /dev/null @@ -1,16 +0,0 @@ -package com.programmerdan.minecraft.simpleadminhacks.autoload.impl; - -import com.programmerdan.minecraft.simpleadminhacks.autoload.ParameterParser; - -public class StringParameterParser implements ParameterParser { - - @Override - public Class getClassParsed() { - return String.class; - } - - @Override - public String parse(String value) { - return value; - } -} \ No newline at end of file diff --git a/src/main/java/com/programmerdan/minecraft/simpleadminhacks/hacks/GameTuning.java b/src/main/java/com/programmerdan/minecraft/simpleadminhacks/hacks/GameTuning.java index a6879e84..f9cc9181 100644 --- a/src/main/java/com/programmerdan/minecraft/simpleadminhacks/hacks/GameTuning.java +++ b/src/main/java/com/programmerdan/minecraft/simpleadminhacks/hacks/GameTuning.java @@ -3,7 +3,6 @@ import java.util.List; import java.util.logging.Level; -import org.bukkit.Bukkit; import org.bukkit.ChatColor; import org.bukkit.GameMode; import org.bukkit.Location; diff --git a/src/main/java/com/programmerdan/minecraft/simpleadminhacks/hacks/ToggleLamp.java b/src/main/java/com/programmerdan/minecraft/simpleadminhacks/hacks/ToggleLamp.java index 1db310b1..5ce5b16e 100644 --- a/src/main/java/com/programmerdan/minecraft/simpleadminhacks/hacks/ToggleLamp.java +++ b/src/main/java/com/programmerdan/minecraft/simpleadminhacks/hacks/ToggleLamp.java @@ -5,13 +5,11 @@ import org.bukkit.block.Block; import org.bukkit.block.data.Lightable; import org.bukkit.configuration.ConfigurationSection; -import org.bukkit.craftbukkit.v1_14_R1.CraftWorld; import org.bukkit.entity.Player; import org.bukkit.event.EventHandler; import org.bukkit.event.EventPriority; import org.bukkit.event.Listener; import org.bukkit.event.block.Action; -import org.bukkit.event.block.BlockPhysicsEvent; import org.bukkit.event.player.PlayerInteractEvent; import org.bukkit.inventory.EquipmentSlot; import org.bukkit.metadata.FixedMetadataValue; @@ -21,7 +19,6 @@ import com.programmerdan.minecraft.simpleadminhacks.SimpleHack; import com.programmerdan.minecraft.simpleadminhacks.configs.ToggleLampConfig; -import net.minecraft.server.v1_14_R1.World; import vg.civcraft.mc.citadel.Citadel; import vg.civcraft.mc.citadel.ReinforcementManager; import vg.civcraft.mc.citadel.reinforcement.PlayerReinforcement; @@ -72,11 +69,7 @@ public void onInteract(PlayerInteractEvent event) { return; } - boolean toggled = clickedBlock.hasMetadata(META_TOGGLED) ? clickedBlock.getMetadata(META_TOGGLED).get(0).asBoolean() : false; - - if(!toggled && clickedBlockMat == Material.REDSTONE_LAMP_ON) { - return; - } + boolean toggled = clickedBlock.hasMetadata(META_TOGGLED) && clickedBlock.getMetadata(META_TOGGLED).get(0).asBoolean(); if(clickedBlock.hasMetadata(META_COOLDOWN)){ MetadataValue val = clickedBlock.getMetadata(META_COOLDOWN).get(0); @@ -97,27 +90,12 @@ public void onInteract(PlayerInteractEvent event) { } } } - Lightable lightable = (Lightable) clickedBlock.getBlockData(); - lightable.setLit(lightable.isLit()); - clickedBlock.setBlockData(lightable); + + switchLamp(clickedBlock, !toggled); eventPlayer.getWorld().playSound(clickedBlock.getLocation(), Sound.BLOCK_LEVER_CLICK, 0.5F, 1.0F); } - - // block update - @EventHandler(priority = EventPriority.NORMAL) - public void onBlockPhysics(BlockPhysicsEvent event) { - Block eventBlock = event.getBlock(); - Material eventMat = eventBlock.getType(); - if(eventMat != Material.REDSTONE_LAMP) { - return; - } - boolean toggled = eventBlock.hasMetadata(META_TOGGLED) && eventBlock.getMetadata(META_TOGGLED).get(0).asBoolean(); - if(toggled) { - event.setCancelled(true); - } - } @Override public void registerListeners() { @@ -158,30 +136,19 @@ public static ToggleLampConfig generate(SimpleAdminHacks plugin, ConfigurationSe return new ToggleLampConfig(plugin, config); } - private void switchLamp(Block block, boolean lighting) throws NoSuchFieldException, IllegalAccessException - { - World world = ((CraftWorld)block.getWorld()).getHandle(); - - if (lighting) - { - setWorldStatic(world, true); - block.setType(Material.REDSTONE_LAMP_ON); - setWorldStatic(world, false); - block.setMetadata(META_TOGGLED, new FixedMetadataValue(plugin(), true)); - } - else - { - block.setType(Material.REDSTONE_LAMP_OFF); - block.setMetadata(META_TOGGLED, new FixedMetadataValue(plugin(), false)); // need to add stuff to counteract redstone + private void switchLamp(Block block, boolean lit) { + + if(block.getType() != Material.REDSTONE_LAMP) { + return; } + + Lightable lightable = (Lightable)block.getBlockData(); + lightable.setLit(lit); + block.setBlockData(lightable); + + block.setMetadata(META_TOGGLED, new FixedMetadataValue(plugin(), lit)); block.setMetadata(META_COOLDOWN, new FixedMetadataValue(plugin(), System.currentTimeMillis()+config.getCooldownTime())); } - private void setWorldStatic(World world, boolean isStatic) throws NoSuchFieldException, IllegalAccessException { - java.lang.reflect.Field field = World.class.getDeclaredField("isClientSide"); - - field.setAccessible(true); - field.set(world, isStatic); - } -} +} \ No newline at end of file diff --git a/src/main/java/com/programmerdan/minecraft/simpleadminhacks/hacks/basic/HumbugBatchOne.java b/src/main/java/com/programmerdan/minecraft/simpleadminhacks/hacks/basic/HumbugBatchOne.java new file mode 100644 index 00000000..9ea0e932 --- /dev/null +++ b/src/main/java/com/programmerdan/minecraft/simpleadminhacks/hacks/basic/HumbugBatchOne.java @@ -0,0 +1,187 @@ +package com.programmerdan.minecraft.simpleadminhacks.hacks.basic; + +import java.util.Iterator; +import java.util.List; +import java.util.Set; +import java.util.TreeSet; + +import org.bukkit.Material; +import org.bukkit.block.Block; +import org.bukkit.block.BlockFace; +import org.bukkit.entity.EntityType; +import org.bukkit.entity.Player; +import org.bukkit.event.EventHandler; +import org.bukkit.event.block.Action; +import org.bukkit.event.block.CauldronLevelChangeEvent; +import org.bukkit.event.entity.EntityDamageByEntityEvent; +import org.bukkit.event.entity.EntityDeathEvent; +import org.bukkit.event.entity.EntityPotionEffectEvent; +import org.bukkit.event.entity.EntitySpawnEvent; +import org.bukkit.event.entity.SheepDyeWoolEvent; +import org.bukkit.event.player.PlayerInteractEvent; +import org.bukkit.inventory.Inventory; +import org.bukkit.inventory.InventoryHolder; +import org.bukkit.inventory.ItemStack; +import org.bukkit.potion.PotionEffectType; + +import com.programmerdan.minecraft.simpleadminhacks.BasicHack; +import com.programmerdan.minecraft.simpleadminhacks.BasicHackConfig; +import com.programmerdan.minecraft.simpleadminhacks.SimpleAdminHacks; +import com.programmerdan.minecraft.simpleadminhacks.autoload.AutoLoad; + +public class HumbugBatchOne extends BasicHack { + + @AutoLoad + private boolean allowSheepDying; + + @AutoLoad + private boolean allowUsingAnvils; + @AutoLoad + private boolean allowUsingEnchantingTables; + + @AutoLoad + private boolean infiniteCauldrons; + + @AutoLoad + private boolean disableEnderDragon; + + @AutoLoad + private boolean disableIronFarms; + + @AutoLoad + private boolean disableEnderCrystalDamage; + + @AutoLoad + private boolean disableMiningFatigue; + + @AutoLoad + private boolean canEquipBanners; + + public HumbugBatchOne(SimpleAdminHacks plugin, BasicHackConfig config) { + super(plugin, config); + } + + @EventHandler + public void onDyeWool(SheepDyeWoolEvent event) { + if (!allowSheepDying) { + event.setCancelled(true); + } + } + + @EventHandler + public void onDisallowedBlockUse(PlayerInteractEvent event) { + if (event.getClickedBlock() == null) { + return; + } + Material mat = event.getClickedBlock().getType(); + if (!allowUsingEnchantingTables + && (mat == Material.ANVIL || mat == Material.CHIPPED_ANVIL || mat == Material.DAMAGED_ANVIL)) { + event.setCancelled(true); + return; + } + if (!allowUsingEnchantingTables && mat == Material.ENCHANTING_TABLE) { + event.setCancelled(true); + } + } + + @EventHandler + public void cauldronEmpty(CauldronLevelChangeEvent e) { + if (infiniteCauldrons && e.getReason() == CauldronLevelChangeEvent.ChangeReason.BOTTLE_FILL) { + e.setNewLevel(e.getOldLevel()); + } + } + + @EventHandler + public void dragonSpawn(EntitySpawnEvent e) { + if (disableEnderDragon && e.getEntityType() == EntityType.ENDER_DRAGON) { + e.setCancelled(true); + } + } + + @EventHandler + public void golemDeath(EntityDeathEvent e) { + if (!disableIronFarms) { + return; + } + if (e.getEntity().getType() != EntityType.IRON_GOLEM) { + return; + } + Iterator iter = e.getDrops().iterator(); + while (iter.hasNext()) { + ItemStack is = iter.next(); + if (is.getType() == Material.IRON_INGOT) { + iter.remove(); + } + } + } + + @EventHandler + public void disableEnderCrystal(EntityDamageByEntityEvent e) { + if (disableEnderCrystalDamage && e.getDamager().getType() == EntityType.ENDER_CRYSTAL) { + e.setCancelled(true); + } + } + + @EventHandler + public void adminAccessBlockedChest(PlayerInteractEvent e) { + if (!e.getPlayer().hasPermission("simpleadmin.chestsee") && !e.getPlayer().isOp()) { + return; + } + if (e.getAction() != Action.RIGHT_CLICK_AIR && e.getAction() != Action.RIGHT_CLICK_BLOCK) { + return; + } + Player p = e.getPlayer(); + Set s = new TreeSet<>(); + s.add(Material.AIR); + s.add(Material.OBSIDIAN); // probably in a vault + List blocks = p.getLineOfSight(s, 8); + for (Block b : blocks) { + Material m = b.getType(); + if (m == Material.CHEST || m == Material.TRAPPED_CHEST) { + if (b.getRelative(BlockFace.UP).getType().isOccluding()) { + // dont show inventory twice if a normal chest is opened + final Inventory chestInv = ((InventoryHolder) b.getState()).getInventory(); + p.openInventory(chestInv); + p.updateInventory(); + } + break; + } + + } + } + + @EventHandler + public void potionEffect(EntityPotionEffectEvent event) { + if (!disableMiningFatigue) { + return; + } + if (event.getAction() == org.bukkit.event.entity.EntityPotionEffectEvent.Action.REMOVED) { + return; + } + if (event.getModifiedType() == PotionEffectType.SLOW_DIGGING) { + event.setCancelled(true); + } + } + + @EventHandler + public void equipBanner(PlayerInteractEvent event) { + if (!canEquipBanners) { + return; + } + if (event.getItem() == null || !event.getItem().getType().equals(Material.STONE) // TODO, waiting for material + // API + || (event.getAction() != Action.LEFT_CLICK_AIR && event.getAction() != Action.LEFT_CLICK_BLOCK)) { + return; + } + Player player = event.getPlayer(); + ItemStack banner = new ItemStack(event.getItem()); + banner.setAmount(1); + player.getInventory().removeItem(banner); + if (player.getEquipment().getHelmet() != null) { + if (player.getInventory().addItem(player.getEquipment().getHelmet()).size() != 0) { + player.getWorld().dropItem(player.getLocation(), player.getEquipment().getHelmet()); + } + } + player.getEquipment().setHelmet(banner); + } +} diff --git a/src/main/java/com/programmerdan/minecraft/simpleadminhacks/hacks/basic/PortalSpawnModifier.java b/src/main/java/com/programmerdan/minecraft/simpleadminhacks/hacks/basic/PortalSpawnModifier.java new file mode 100644 index 00000000..e360e665 --- /dev/null +++ b/src/main/java/com/programmerdan/minecraft/simpleadminhacks/hacks/basic/PortalSpawnModifier.java @@ -0,0 +1,88 @@ +package com.programmerdan.minecraft.simpleadminhacks.hacks.basic; + +import java.util.Iterator; +import java.util.Random; + +import org.bukkit.Location; +import org.bukkit.Material; +import org.bukkit.entity.EntityType; +import org.bukkit.event.EventHandler; +import org.bukkit.event.entity.CreatureSpawnEvent; +import org.bukkit.event.entity.CreatureSpawnEvent.SpawnReason; +import org.bukkit.event.entity.EntityDeathEvent; +import org.bukkit.inventory.ItemStack; + +import com.programmerdan.minecraft.simpleadminhacks.BasicHack; +import com.programmerdan.minecraft.simpleadminhacks.BasicHackConfig; +import com.programmerdan.minecraft.simpleadminhacks.SimpleAdminHacks; +import com.programmerdan.minecraft.simpleadminhacks.autoload.AutoLoad; + +public class PortalSpawnModifier extends BasicHack { + + private Random rng; + + @AutoLoad + private double pigManChance; + @AutoLoad + private double ghastChance; + @AutoLoad + private double witherSkeletonChance; + + @AutoLoad + private double witherHeadDropChance; + + public PortalSpawnModifier(SimpleAdminHacks plugin, BasicHackConfig config) { + super(plugin, config); + rng = new Random(); + } + + @EventHandler + public void portalSpawn(CreatureSpawnEvent event) { + if (event.getSpawnReason() != SpawnReason.NETHER_PORTAL) { + return; + } + if (event.getEntityType() == EntityType.WITHER_SKELETON) { + event.setCancelled(roll(witherSkeletonChance)); + return; + } + if (event.getEntityType() == EntityType.PIG_ZOMBIE) { + if (!roll(pigManChance)) { + event.setCancelled(true); + return; + } + if (roll(ghastChance)) { + event.setCancelled(true); + spawnGhast(event.getLocation()); + } + } + } + + private void spawnGhast(Location loc) { + //TODO check for space? + loc.getWorld().spawnEntity(loc.add(0, 2, 0), EntityType.GHAST); + } + + private boolean roll(double chance) { + return rng.nextDouble() <= chance; + } + + @EventHandler + public void witherSkeleDeath(EntityDeathEvent e) { + if (e.getEntityType() != EntityType.WITHER_SKELETON) { + return; + } + Iterator iter = e.getDrops().iterator(); + while(iter.hasNext()) { + ItemStack is = iter.next(); + if (is.getType() == Material.WITHER_SKELETON_SKULL) { + iter.remove(); + } + } + if (roll(witherHeadDropChance)) { + e.getDrops().add(new ItemStack(Material.WITHER_SKELETON_SKULL)); + } + } + + + +} diff --git a/src/main/resources/config.yml b/src/main/resources/config.yml index 58e47634..0c13dc02 100644 --- a/src/main/resources/config.yml +++ b/src/main/resources/config.yml @@ -48,9 +48,6 @@ hacks: stopBedBombingInHellBiomes: true preventTreeWraparound: true fixPearlGlitch: true - maxFluidHeight: 100 - maxFluidAmount: 400 - maxFluidTimer: 1200 GameTuning: enabled: true chunkLimits: @@ -86,14 +83,6 @@ hacks: allowVillagerTrading: false enderGrief: false witherGrief: false - #the following are random chances with max of 1000000 - extraGhastSpawnRate: 0 - extraWitherSpawnRate: 0 - extraGhastPortalSpawnRate: 0 - extraWitherPortalSpawnRate: 0 - pigPortalSpawnMultiplier: 1000000 - witherSkullDropRate: 10000 - extraMagmaSpawnRate: 0 allowEnchantedApples: false preventFallingThroughBedrock: true #a list of materials players shouldn't be allowed to place at all diff --git a/src/main/resources/plugin.yml b/src/main/resources/plugin.yml index 5ab09c2c..64e55647 100644 --- a/src/main/resources/plugin.yml +++ b/src/main/resources/plugin.yml @@ -1,7 +1,7 @@ name: ${project.name} main: com.programmerdan.minecraft.simpleadminhacks.SimpleAdminHacks author: ProgrammerDan -authors: [] +authors: [ProgrammerDan, Maxopoly] version: ${project.version} softdepend: [CombatTagPlus, Citadel, ProtocolLib, NameLayer] commands: From 9cb7b0d344bfa6667bfa2da047674c4c8603b70e Mon Sep 17 00:00:00 2001 From: ProgrammerDan Date: Wed, 4 Sep 2019 00:36:23 -0400 Subject: [PATCH 07/28] Reverting some null checks, I know this will cause warnings in IDE but some were hard earned. I do hope that Spigot is more faithful and careful in these later releases, but better to check and be sure then not check and be unsure. Some I did not add back in. Any I added back in I wrote why I added it. I also switched around some orderings to use equals() checks, and also addressed some changes to map views in new releases, although there is more to do there. As well, expanded certain block lists and biome lists even further, lots of new content in these new minecraft releases. Probably first of several commits, as I test. --- README.md | 31 +++++++-- pom.xml | 8 +-- .../configs/TimingsHackConfig.java | 18 ++--- .../simpleadminhacks/hacks/Experimental.java | 68 ++++++++++++++----- .../simpleadminhacks/hacks/GameFeatures.java | 34 ++++++---- .../simpleadminhacks/hacks/GameFixes.java | 30 +++++--- .../simpleadminhacks/hacks/GameTuning.java | 21 +++--- .../hacks/ReinforcedChestBreak.java | 24 ++++++- .../simpleadminhacks/hacks/TimingsHack.java | 23 ++++--- .../hacks/CTAnnounceTest.java | 8 +-- 10 files changed, 180 insertions(+), 85 deletions(-) diff --git a/README.md b/README.md index 96171085..d8a00b0f 100644 --- a/README.md +++ b/README.md @@ -65,11 +65,12 @@ Similar to Game Fixes, but distinct in that the intent here is on hacks that _tu or alter existing mechanics without fully disabling them or without fixing them. Things like altering armor damage reduction or tool impact would be good fits. -### HackBot +### ~~HackBot~~ -An experimental module whose complexity is approaching divorce from SAH, this is +(Removed in 1.2.4) +~~An experimental module whose complexity is approaching divorce from SAH, this is a bit of mid-work code that allows operators to define static Bots that show up -like "real" players but aren't. +like "real" players but aren't.~~ ### Introbook @@ -84,12 +85,13 @@ Host of the `/invsee` command, gives insight into active player inventory, armor health and more. I hope / intend to add another portion to this that allows online and offline inventory management via `/invmod` but this is as of now not started. -### InvisibleFix and InvisibleFixTwo +### ~~InvisibleFix and InvisibleFixTwo~~ -My hope is to remove these in time, but for 1.9 and 1.10 minecraft players +(Removed in 1.3.0) +~~My hope is to remove these in time, but for 1.9 and 1.10 minecraft players go invisible all the time. Both of these hacks use different approaches to help preserve the visiblity of players. The second hack is the more invasive, sending -explicit location packets when the situation indicates its usefulness. +explicit location packets when the situation indicates its usefulness.~~ ### NewfriendAssist @@ -107,6 +109,23 @@ are actively breaking reinforced containers. This one is pretty Devoted iteration 3 specific. Allows tracking server wide of all breaks or builds under a specific y level. +### ToggleLamp + +A solid piece of contributed code, this hack lets redstone lamps be used as +clickable-on, clickable-off light sources without additional redstone infrastructure. + +### HumbugBatchOne + +A new BasicHack (thanks Maxopoly) which encompases a number of previously unincluded +Humbug gameplay modifications. Specifically, sheep wool dying, anvil use, enchanting table use, +cauldrons sourcing infinite water, disabling ender dragon, disabling iron farms, +disabling ender crystal damage, disable mining fatigue, and equipping banners as hats. + + +### PortalSpawnModifier + +Another new BasicHack which allows control of the spawn of creatures rate from nether portals + ### TimingsHack This is mature enough to be its own plugin now, but for the moment I'm leaving it in diff --git a/pom.xml b/pom.xml index a20d380a..77d0b4d0 100644 --- a/pom.xml +++ b/pom.xml @@ -6,7 +6,7 @@ com.programmerdan.minecraft SimpleAdminHacks jar - 1.2.4 + 1.3.0 SimpleAdminHacks https://github.com/DevotedMC/SimpleAdminHacks @@ -136,8 +136,8 @@ com.comphenix.protocol - ProtocolLib-API - 4.3.0 + ProtocolLib + 4.4.0 vg.civcraft.mc.namelayer @@ -154,7 +154,7 @@ vg.civcraft.mc.civmodcore CivModCore - 1.6.0 + 1.7.5 provided diff --git a/src/main/java/com/programmerdan/minecraft/simpleadminhacks/configs/TimingsHackConfig.java b/src/main/java/com/programmerdan/minecraft/simpleadminhacks/configs/TimingsHackConfig.java index fe972023..1f6f934b 100644 --- a/src/main/java/com/programmerdan/minecraft/simpleadminhacks/configs/TimingsHackConfig.java +++ b/src/main/java/com/programmerdan/minecraft/simpleadminhacks/configs/TimingsHackConfig.java @@ -38,9 +38,9 @@ public Integer getTimingsMap() { return timingsMap; } - public void setTimingsMap(int i) { - timingsMap = i; - getBase().set("timingMap", i); + public void setTimingsMap(int mapId) { + timingsMap = mapId; + getBase().set("timingMap", mapId); } public Integer getBindMap(String bind) { @@ -50,16 +50,16 @@ public Integer getBindMap(String bind) { return bindMaps.get(bind); } - public void setBindMap(String bind, int i) { - Integer prior = bindMaps.replace(bind, i); + public void setBindMap(String bind, int mapId) { + Integer prior = bindMaps.replace(bind, mapId); if (prior != null) { reverseBindMaps.remove(prior); } - reverseBindMaps.replace(i, bind); - getBase().set("bindings." + bind, i); + reverseBindMaps.replace(mapId, bind); + getBase().set("bindings." + bind, mapId); } - public String getBindFromId(int i) { - return reverseBindMaps.get(i); + public String getBindFromId(int mapId) { + return reverseBindMaps.get(mapId); } } diff --git a/src/main/java/com/programmerdan/minecraft/simpleadminhacks/hacks/Experimental.java b/src/main/java/com/programmerdan/minecraft/simpleadminhacks/hacks/Experimental.java index bf6c5e82..b5524c12 100644 --- a/src/main/java/com/programmerdan/minecraft/simpleadminhacks/hacks/Experimental.java +++ b/src/main/java/com/programmerdan/minecraft/simpleadminhacks/hacks/Experimental.java @@ -92,10 +92,14 @@ public boolean onCommand(CommandSender sender, Command command, String label, St Player player = (Player) sender; ItemStack item = player.getInventory().getItemInMainHand(); - YamlConfiguration yml = new YamlConfiguration(); - yml.set("template", item); - plugin().log(yml.saveToString()); - sender.sendMessage(yml.saveToString()); + if (item != null && item.getType().isItem()) { // spigot claims @Notnull but unclear how well enforced + YamlConfiguration yml = new YamlConfiguration(); + yml.set("template", item); + plugin().log(yml.saveToString()); + sender.sendMessage(yml.saveToString()); + } else { + sender.sendMessage("No valid item in main hand"); + } return true; } @@ -131,16 +135,22 @@ public void run() { this.cancel(); return; } - Player player = plugin().getServer().getPlayer(playerUUID); - if (player != null) { - StringBuilder sb = new StringBuilder("Tracking: "); - sb.append(playerUUID); - logPlayer(player, sb); - plugin().log(sb.toString()); + // I recall running into situation where this UUID nulled out, don't remember how + // so, I check. + if (playerUUID != null) { + Player player = plugin().getServer().getPlayer(playerUUID); + if (player != null) { + StringBuilder sb = new StringBuilder("Tracking: "); + sb.append(playerUUID); + logPlayer(player, sb); + plugin().log(sb.toString()); + } else { + StringBuilder sb = new StringBuilder("Lost: "); + sb.append(playerUUID); + plugin().log(sb.toString()); + this.cancel(); + } } else { - StringBuilder sb = new StringBuilder("Lost: "); - sb.append(playerUUID); - plugin().log(sb.toString()); this.cancel(); } } @@ -153,8 +163,16 @@ private void logTeleport(PlayerTeleportEvent event, StringBuilder sb) { Player player = event.getPlayer(); Location from = event.getFrom(); Location to = event.getTo(); - sb.append(String.format(" %16s", player.getName())); - sb.append(String.format(" %s,%5.0f,%3.0f,%5.0f", from.getWorld().getName(), from.getX(), from.getY(), from.getZ())); + // Must of these nullchecks will gen warnings with compile time contracts. + // Experience tells me these can be violated at runtime due to spigot failures, + // esp moving between worlds with corresponding state desync. Leaving them in + // consequentially. + sb.append(String.format(" %16s", player != null ? player.getName() : "--unknown--")); + if (from != null) { + sb.append(String.format(" %s,%5.0f,%3.0f,%5.0f", from.getWorld().getName(), from.getX(), from.getY(), from.getZ())); + } else { + sb.append(" (none)"); + } sb.append(" ->"); if (to != null) { sb.append(String.format(" %s,%5.0f,%3.0f,%5.0f", to.getWorld().getName(), to.getX(), to.getY(), to.getZ())); @@ -171,8 +189,18 @@ private void logPlayer(final Player player, StringBuilder sb) { sb.append(player.getWorld().getName()); Location feet = player.getLocation(); Location eyes = player.getEyeLocation(); - sb.append(String.format(" %s,%5.0f,%3.0f,%5.0f", feet.getWorld().getName(), feet.getX(), feet.getY(), feet.getZ())); - sb.append(String.format(" %s,%5.0f,%3.0f,%5.0f", eyes.getWorld().getName(), eyes.getX(), eyes.getY(), eyes.getZ())); + // Similar comment here, most/all these nullchecks are from observed failures. + // I truly hope Spigot has eliminated all sources of these but I'm not the trusting type. + if (feet != null) { + sb.append(String.format(" %s,%5.0f,%3.0f,%5.0f", feet.getWorld().getName(), feet.getX(), feet.getY(), feet.getZ())); + } else { + sb.append(" (none)"); + } + if (eyes != null) { + sb.append(String.format(" %s,%5.0f,%3.0f,%5.0f", eyes.getWorld().getName(), eyes.getX(), eyes.getY(), eyes.getZ())); + } else { + sb.append(" (none)"); + } } @EventHandler(priority = EventPriority.LOWEST, ignoreCancelled = false) @@ -186,8 +214,12 @@ private void monitorCombatLow(EntityDamageByEntityEvent event) { private void logCombat(EntityDamageByEntityEvent event, StringBuilder sb) { sb.append(event.isCancelled() ? "C " : "A "); sb.append(event.getCause().name()); + // These null checks defend against specific kinds of malformed damage events, which can occur + // at runtime or while running with older plugins. sb.append(String.format(", %5.2f->%5.2f", event.getDamage(), event.getFinalDamage())); - sb.append(String.format(", %16s v %16s", event.getDamager().getName(), event.getEntity().getName())); + sb.append(String.format(", %16s v %16s", + event.getDamager() != null ? event.getDamager().getName() : "--unknown--", + event.getEntity() != null ? event.getEntity().getName() : "--unknown--")); for (EntityDamageEvent.DamageModifier mod : EntityDamageEvent.DamageModifier.values()) { sb.append(", ").append(mod.name()); try { 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 8dcf0e23..064af9ff 100644 --- a/src/main/java/com/programmerdan/minecraft/simpleadminhacks/hacks/GameFeatures.java +++ b/src/main/java/com/programmerdan/minecraft/simpleadminhacks/hacks/GameFeatures.java @@ -239,7 +239,10 @@ public void disableVillagerTrading(PlayerInteractEntityEvent event) { if (!config.isEnabled()) return; if (!config.isVillagerTrading()) { Entity npc = event.getRightClicked(); - if (npc.getType().equals(EntityType.VILLAGER)) { + // Don't recall specifically but considering I had this null check + // alone... I probably had an NPE here at some point. Probably plugin + // with plugin interactions. + if (npc != null && EntityType.VILLAGER.equals(npc.getType())) { event.setCancelled(true); } } @@ -249,7 +252,7 @@ public void disableVillagerTrading(PlayerInteractEntityEvent event) { public void disableWitherSpawning(CreatureSpawnEvent event) { if (!config.isEnabled()) return; if (!config.isWitherSpawning()) { - if (event.getEntityType().equals(EntityType.WITHER)) { + if (EntityType.WITHER.equals(event.getEntityType())) { event.setCancelled(true); } } @@ -259,7 +262,7 @@ public void disableWitherSpawning(CreatureSpawnEvent event) { public void disableEnderChestPlacement(BlockPlaceEvent event) { if (!config.isEnabled()) return; if (!config.isEnderChestPlacement()) { - if (event.getBlock().getType().equals(Material.ENDER_CHEST)) { + if (Material.ENDER_CHEST.equals(event.getBlock().getType())) { event.setCancelled(true); } } @@ -272,7 +275,7 @@ public void disableEnderChestUse(PlayerInteractEvent event) { Action action = event.getAction(); Material material = event.getClickedBlock().getType(); boolean enderChest = action == Action.RIGHT_CLICK_BLOCK && - material.equals(Material.ENDER_CHEST); + Material.ENDER_CHEST.equals(material); if (enderChest) { event.setCancelled(true); } @@ -311,7 +314,7 @@ public void disableTotemPowers(EntityResurrectEvent event) { public void disableChorusFruitTeleportation(PlayerTeleportEvent event) { if (!config.isEnabled() || config.isChorusFruitTeleportation()) return; - if (event.getCause().equals(PlayerTeleportEvent.TeleportCause.CHORUS_FRUIT)) { + if (PlayerTeleportEvent.TeleportCause.CHORUS_FRUIT.equals(event.getCause())) { event.setCancelled(true); } } @@ -375,7 +378,7 @@ public void run() { @EventHandler(priority = EventPriority.HIGHEST, ignoreCancelled = true) public void onPlayerBucketEmptyEvent(PlayerBucketEmptyEvent e) { if (config.isEnabled() && config.isBlockWaterInHell()) { - if ((e.getBlockClicked().getBiome() == Biome.NETHER) && (e.getBucket() == Material.WATER_BUCKET)) { + if (Biome.NETHER.equals(e.getBlockClicked().getBiome()) && Material.WATER_BUCKET.equals(e.getBucket())) { e.setCancelled(true); e.getItemStack().setType(Material.BUCKET); } @@ -387,10 +390,10 @@ public void onDispenseEvent(BlockDispenseEvent event) { if (!config.isEnabled() || !config.isBlockWaterInHell()) { return; } - if (event.getBlock().getType() == Material.DISPENSER) { + if (Material.DISPENSER.equals(event.getBlock().getType())) { Dispenser disp = (Dispenser) event.getBlock().getBlockData(); Biome biome = event.getBlock().getRelative(disp.getFacing()).getBiome(); - if (Biome.NETHER.equals(biome) && event.getItem().getType().equals(Material.WATER_BUCKET)) { + if (Biome.NETHER.equals(biome) && Material.WATER_BUCKET.equals(event.getItem().getType())) { event.setItem(new ItemStack(Material.BUCKET, event.getItem().getAmount())); event.setCancelled(true); } @@ -438,6 +441,9 @@ public void onVehicleDestroy(VehicleDestroyEvent event) { if (config.isEnabled() && config.isMinecartTeleport()) { final Vehicle vehicle = event.getVehicle(); final List passengers = vehicle.getPassengers(); + if (passengers.isEmpty()) { + return; + } final Location vehicleLocation = vehicle.getLocation(); passengers.removeIf((passenger -> !(passenger instanceof Player))); passengers.forEach((passenger) -> { @@ -455,13 +461,13 @@ public void onVehicleDestroy(VehicleDestroyEvent event) { @EventHandler public void onBlockFromTo(BlockFromToEvent event) { if (config.isEnabled() && config.isObsidianGenerators()) { - if (event.getBlock().getType() == Material.LAVA) { + if (Material.LAVA.equals(event.getBlock().getType())) { Block to = event.getToBlock(); - if (to.getType() == Material.REDSTONE || to.getType() == Material.TRIPWIRE) { - if (to.getRelative(BlockFace.NORTH).getType() == Material.WATER - || to.getRelative(BlockFace.SOUTH).getType() == Material.WATER - || to.getRelative(BlockFace.WEST).getType() == Material.WATER - || to.getRelative(BlockFace.EAST).getType() == Material.WATER) { + if (Material.REDSTONE.equals(to.getType()) || Material.TRIPWIRE.equals(to.getType())) { + if (Material.WATER.equals(to.getRelative(BlockFace.NORTH).getType()) + || Material.WATER.equals(to.getRelative(BlockFace.SOUTH).getType()) + || Material.WATER.equals(to.getRelative(BlockFace.WEST).getType()) + || Material.WATER.equals(to.getRelative(BlockFace.EAST).getType())) { to.setType(Material.OBSIDIAN); } } diff --git a/src/main/java/com/programmerdan/minecraft/simpleadminhacks/hacks/GameFixes.java b/src/main/java/com/programmerdan/minecraft/simpleadminhacks/hacks/GameFixes.java index 7ee298d9..97279341 100644 --- a/src/main/java/com/programmerdan/minecraft/simpleadminhacks/hacks/GameFixes.java +++ b/src/main/java/com/programmerdan/minecraft/simpleadminhacks/hacks/GameFixes.java @@ -193,7 +193,12 @@ public void onEntityPortal(EntityPortalEvent event) { @EventHandler(priority = EventPriority.LOWEST, ignoreCancelled = true) public void onInventoryMoveItem(InventoryMoveItemEvent event) { if (!config.isEnabled() || !config.isStopHopperDupe()) return; - if (!(InventoryType.HOPPER.equals(event.getDestination().getType())) || + // I recollect inventory handling to be the single biggest source of NPEs, so I'll add + // back in the nullcheck, although I do hope Spigot has addressed the sources with the + // addition of their annotations. + // + if ((event.getDestination() == null) || (event.getSource() == null) || + !(InventoryType.HOPPER.equals(event.getDestination().getType())) || !(InventoryType.HOPPER.equals(event.getSource().getType())) || !(Material.HOPPER.equals(event.getDestination().getLocation().getBlock().getType())) || !(Material.HOPPER.equals(event.getSource().getLocation().getBlock().getType()))) { @@ -247,7 +252,7 @@ public void onPlayerBucketEmpty(PlayerBucketEmptyEvent event) { if (config.isEnabled() && config.isStopEndPortalDeletion()) { Block block = event.getBlockClicked().getRelative(event.getBlockFace()); - if (block.getType() == Material.END_PORTAL) { + if (Material.END_PORTAL.equals(block.getType())) { event.setCancelled(true); } } @@ -256,11 +261,11 @@ public void onPlayerBucketEmpty(PlayerBucketEmptyEvent event) { @EventHandler(priority = EventPriority.LOWEST, ignoreCancelled = true) public void onDispenseEvent(BlockDispenseEvent event) { if (config.isEnabled() && config.isStopEndPortalDeletion()) { - if (event.getBlock().getType() == Material.DISPENSER) { + if (Material.DISPENSER.equals(event.getBlock().getType())) { Dispenser disp = (Dispenser) event.getBlock().getBlockData(); Material type = event.getBlock().getRelative(disp.getFacing()).getType(); - if (type == Material.END_PORTAL) { + if (Material.END_PORTAL.equals(type)) { event.setCancelled(true); } } @@ -295,9 +300,10 @@ public void onPlayerEnterBed(BlockPlaceEvent event) { } Environment env = b.getLocation().getWorld().getEnvironment(); Biome biome = b.getLocation().getBlock().getBiome(); - if (env == Environment.NETHER || env == Environment.THE_END || Biome.NETHER == biome - || Biome.END_BARRENS == biome || Biome.END_HIGHLANDS == biome - || Biome.END_MIDLANDS == biome || Biome.SMALL_END_ISLANDS == biome) { + if (Environment.NETHER.equals(env) || Environment.THE_END.equals(env) || Biome.NETHER.equals(biome) + || Biome.END_BARRENS.equals(biome) || Biome.END_HIGHLANDS.equals(biome) + || Biome.END_MIDLANDS.equals(biome) || Biome.SMALL_END_ISLANDS.equals(biome) + || Biome.THE_END.equals(biome)) { event.setCancelled(true); } } @@ -416,6 +422,14 @@ public void onPearlTeleport(PlayerTeleportEvent event) { case WITHER_SKELETON_WALL_SKULL: case WITHER_SKELETON_SKULL: case SKELETON_WALL_SKULL: + case PLAYER_HEAD: + case PLAYER_WALL_HEAD: + case CREEPER_HEAD: + case CREEPER_WALL_HEAD: + case DRAGON_HEAD: + case DRAGON_WALL_HEAD: + case ZOMBIE_HEAD: + case ZOMBIE_WALL_HEAD: height = 0.5; break; default: @@ -524,4 +538,4 @@ public void onSignChange(SignChangeEvent event) { public static GameFixesConfig generate(SimpleAdminHacks plugin, ConfigurationSection config) { return new GameFixesConfig(plugin, config); } -} \ No newline at end of file +} diff --git a/src/main/java/com/programmerdan/minecraft/simpleadminhacks/hacks/GameTuning.java b/src/main/java/com/programmerdan/minecraft/simpleadminhacks/hacks/GameTuning.java index f9cc9181..780fc9a7 100644 --- a/src/main/java/com/programmerdan/minecraft/simpleadminhacks/hacks/GameTuning.java +++ b/src/main/java/com/programmerdan/minecraft/simpleadminhacks/hacks/GameTuning.java @@ -210,7 +210,7 @@ public void enterBed(PlayerBedEnterEvent e) { if (!config.isEnabled() || !config.areDaytimeBedsEnabled()) { return; } - if (e.getBedEnterResult() == BedEnterResult.NOT_POSSIBLE_NOW || e.getBedEnterResult() == BedEnterResult.NOT_SAFE) { + if (BedEnterResult.NOT_POSSIBLE_NOW.equals(e.getBedEnterResult()) || BedEnterResult.NOT_SAFE.equals(e.getBedEnterResult())) { e.getPlayer().setBedSpawnLocation(e.getBed().getLocation(), false); e.getPlayer().sendTitle("", config.getDaytimeBedSpawnSetMessage()); } @@ -227,7 +227,7 @@ public void onPortalTravel(EntityPortalEvent event) { @EventHandler(priority = EventPriority.LOWEST) public void onPlayerPortalTravel(PlayerPortalEvent event) { - if(config.isEnabled() && event.getCause() == PlayerTeleportEvent.TeleportCause.NETHER_PORTAL) { + if(config.isEnabled() && PlayerTeleportEvent.TeleportCause.NETHER_PORTAL.equals(event.getCause())) { if(!config.allowNetherTravel()) { event.setCancelled(true); } else if (config.isOneToOneNether()) { @@ -241,7 +241,7 @@ public void onPlayerPortalTravel(PlayerPortalEvent event) { @EventHandler(priority = EventPriority.LOWEST, ignoreCancelled = true) public void onPortalCreate(PortalCreateEvent event) { if (config.isEnabled() && !config.isReturnNetherPortal()) { - if (event.getReason() == PortalCreateEvent.CreateReason.FIRE && event.getWorld().getEnvironment() == Environment.NETHER) { + if (PortalCreateEvent.CreateReason.FIRE.equals(event.getReason()) && Environment.NETHER.equals(event.getWorld().getEnvironment())) { event.setCancelled(true); } } @@ -295,11 +295,11 @@ public void onEntityTarget(EntityTargetEvent event) { @EventHandler public void onPlayerInteract(PlayerInteractEvent event) { - if(!config.isEnabled() || event.getAction() != Action.RIGHT_CLICK_BLOCK) { + if(!config.isEnabled() || !Action.RIGHT_CLICK_BLOCK.equals(event.getAction())) { return; } - boolean cancel = !config.isEnderChestInventories() && event.getClickedBlock().getType() == Material.ENDER_CHEST; - cancel |= !config.canChangeSpawnerType() && event.getClickedBlock().getType() == Material.SPAWNER + boolean cancel = !config.isEnderChestInventories() && Material.ENDER_CHEST.equals(event.getClickedBlock().getType()); + cancel |= !config.canChangeSpawnerType() && Material.SPAWNER.equals(event.getClickedBlock().getType()) && event.getItem() != null && event.getItem().getItemMeta() instanceof SpawnEggMeta; event.setCancelled(cancel); } @@ -316,7 +316,8 @@ public void onBlockPlace(BlockPlaceEvent event) { public void onPlayerInteractEntity(PlayerInteractEntityEvent event) { if(config.isEnabled() && !config.allowVillagerTrading()) { Entity npc = event.getRightClicked(); - if(npc.getType() == EntityType.VILLAGER) { + // consistency, preserving null check + if(npc != null && EntityType.VILLAGER.equals(npc.getType())) { event.setCancelled(true); } } @@ -325,8 +326,8 @@ public void onPlayerInteractEntity(PlayerInteractEntityEvent event) { @EventHandler(priority = EventPriority.LOW, ignoreCancelled = true) public void onEntityChangeBLock(EntityChangeBlockEvent event) { if(config.isEnabled() && - (!config.isEnderGrief() && event.getEntityType() == EntityType.ENDERMAN) || - (!config.isWitherGrief() && event.getEntityType() == EntityType.WITHER)) { + (!config.isEnderGrief() && EntityType.ENDERMAN.equals(event.getEntityType())) || + (!config.isWitherGrief() && EntityType.WITHER.equals(event.getEntityType()))) { event.setCancelled(true); } } @@ -334,7 +335,7 @@ public void onEntityChangeBLock(EntityChangeBlockEvent event) { @EventHandler public void onPlayerMove(PlayerMoveEvent event) { if(config.isEnabled() && config.isPreventFallingThroughBedrock() && event.getTo().getY() < 1 - && event.getPlayer().getGameMode() == GameMode.SURVIVAL) { + && GameMode.SURVIVAL.equals(event.getPlayer().getGameMode())) { TeleportUtil.tryToTeleportVertically(event.getPlayer(), event.getTo(), "falling into the void"); } } diff --git a/src/main/java/com/programmerdan/minecraft/simpleadminhacks/hacks/ReinforcedChestBreak.java b/src/main/java/com/programmerdan/minecraft/simpleadminhacks/hacks/ReinforcedChestBreak.java index 2e0037d0..7eef2b14 100644 --- a/src/main/java/com/programmerdan/minecraft/simpleadminhacks/hacks/ReinforcedChestBreak.java +++ b/src/main/java/com/programmerdan/minecraft/simpleadminhacks/hacks/ReinforcedChestBreak.java @@ -88,11 +88,31 @@ public void onBlockBreak(BlockBreakEvent eve) { return; } Material bbe = eve.getBlock().getType(); - if (manager == null) manager = Citadel.getReinforcementManager(); + if (manager == null) manager = Citadel.getReinforcementManager(); + // the list of items with inventories has grown a bit (1.14) if (Material.CHEST.equals(bbe) || Material.TRAPPED_CHEST.equals(bbe) || Material.ENDER_CHEST.equals(bbe) || Material.FURNACE.equals(bbe) || Material.BLAST_FURNACE.equals(bbe) || Material.DISPENSER.equals(bbe) - || Material.DROPPER.equals(bbe) || Material.HOPPER.equals(bbe)) { + || Material.DROPPER.equals(bbe) || Material.HOPPER.equals(bbe) + || Material.BARREL.equals(bbe) || Material.SMOKER.equals(bbe) + || Material.BLACK_SHULKER_BOX.equals(bbe) + || Material.BLUE_SHULKER_BOX.equals(bbe) + || Material.BROWN_SHULKER_BOX.equals(bbe) + || Material.CYAN_SHULKER_BOX.equals(bbe) + || Material.GRAY_SHULKER_BOX.equals(bbe) + || Material.GREEN_SHULKER_BOX.equals(bbe) + || Material.LIGHT_BLUE_SHULKER_BOX.equals(bbe) + || Material.LIGHT_GRAY_SHULKER_BOX.equals(bbe) + || Material.LIME_SHULKER_BOX.equals(bbe) + || Material.MAGENTA_SHULKER_BOX.equals(bbe) + || Material.ORANGE_SHULKER_BOX.equals(bbe) + || Material.PINK_SHULKER_BOX.equals(bbe) + || Material.PURPLE_SHULKER_BOX.equals(bbe) + || Material.RED_SHULKER_BOX.equals(bbe) + || Material.SHULKER_BOX.equals(bbe) + || Material.WHITE_SHULKER_BOX.equals(bbe) + || Material.YELLOW_SHULKER_BOX.equals(bbe) + || Material.LECTERN.equals(bbe) || Material.BREWING_STAND.equals(bbe)) { if(manager.isReinforced(eve.getBlock())) { String name = eve.getPlayer().getDisplayName(); Location loc = eve.getBlock().getLocation(); diff --git a/src/main/java/com/programmerdan/minecraft/simpleadminhacks/hacks/TimingsHack.java b/src/main/java/com/programmerdan/minecraft/simpleadminhacks/hacks/TimingsHack.java index 35e2a72f..44bc8b3b 100644 --- a/src/main/java/com/programmerdan/minecraft/simpleadminhacks/hacks/TimingsHack.java +++ b/src/main/java/com/programmerdan/minecraft/simpleadminhacks/hacks/TimingsHack.java @@ -30,6 +30,7 @@ import org.bukkit.inventory.ItemStack; import org.bukkit.inventory.PlayerInventory; import org.bukkit.inventory.meta.ItemMeta; +import org.bukkit.inventory.meta.MapMeta; import org.bukkit.map.MapCanvas; import org.bukkit.map.MapPalette; import org.bukkit.map.MapRenderer; @@ -256,9 +257,10 @@ public boolean onCommand(CommandSender sender, Command command, String label, St view.getRenderers().forEach(view::removeRenderer); view.addRenderer(this.tickVisualize); - ItemStack viewMap = new ItemStack(Material.MAP, 1, view.getId()); + ItemStack viewMap = new ItemStack(Material.MAP, 1); - ItemMeta mapMeta = viewMap.getItemMeta(); + MapMeta mapMeta = (MapMeta) viewMap.getItemMeta(); + mapMeta.setMapView(view); mapMeta.setDisplayName("Tick Health Monitor"); mapMeta.setLore(Arrays.asList( "TPS", @@ -286,7 +288,7 @@ public boolean onCommand(CommandSender sender, Command command, String label, St // Delay a few ticks, then give into inventory a map that shows the class % of TPS use MapView view = null; - Short mapId = config.getBindMap(args[0]); + Integer mapId = config.getBindMap(args[0]); if (mapId != null) { view = Bukkit.getMap(config.getBindMap(args[0])); if (!bindVisualizers.containsKey(args[0])) { @@ -303,9 +305,10 @@ public boolean onCommand(CommandSender sender, Command command, String label, St view.getRenderers().forEach(view::removeRenderer); view.addRenderer(this.bindVisualizers.get(args[0])); - ItemStack viewMap = new ItemStack(Material.MAP, 1, view.getId()); + ItemStack viewMap = new ItemStack(Material.MAP); - ItemMeta mapMeta = viewMap.getItemMeta(); + MapMeta mapMeta = (MapMeta) viewMap.getItemMeta(); + mapMeta.setMapView(view); mapMeta.setDisplayName(args[0] + " Utilization Monitor"); mapMeta.setLore(Arrays.asList( args[0], @@ -338,7 +341,7 @@ public void registerListeners() { @EventHandler(ignoreCancelled = true) public void onMapInit(MapInitializeEvent event) { MapView view = event.getMap(); - if (config.getTimingsMap() != null && view.getId() == config.getTimingsMap().shortValue()) { + if (config.getTimingsMap() != null && view.getId() == config.getTimingsMap()) { view.getRenderers().forEach(view::removeRenderer); view.addRenderer(this.tickVisualize); } else { @@ -360,21 +363,21 @@ public void onItemHeldChange(PlayerItemHeldEvent event) { PlayerInventory inventory = player.getInventory(); ItemStack newHeld = inventory.getItem(event.getNewSlot()); if (newHeld != null && newHeld.getType().equals(Material.MAP)) { - ItemMeta baseMeta = newHeld.getItemMeta(); + MapMeta baseMeta = (MapMeta) newHeld.getItemMeta(); if (baseMeta.hasLore()) { try { String ID = baseMeta.getLore().get(0); if (ID.equals("TPS")) { - MapView view = Bukkit.getMap(newHeld.getDurability()); + MapView view = baseMeta.hasMapView() ? baseMeta.getMapView() : Bukkit.getMap(baseMeta.getMapId()); if (view.getRenderers().size() == 1 && !view.getRenderers().get(0).equals(this.tickVisualize)) { view.getRenderers().forEach(view::removeRenderer); view.addRenderer(this.tickVisualize); } } else { - String bind = config.getBindFromId(newHeld.getDurability()); + String bind = config.getBindFromId(baseMeta.getMapId()); if (bind.equalsIgnoreCase(ID)) { - MapView view = Bukkit.getMap(newHeld.getDurability()); + MapView view = baseMeta.hasMapView() ? baseMeta.getMapView() : Bukkit.getMap(baseMeta.getMapId()); BindTimingMap bindViz = null; if (!this.bindVisualizers.containsKey(bind)) { bindVisualizers.put(bind, new BindTimingMap(bind)); // on demand binding. diff --git a/src/test/java/com/programmerdan/minecraft/simpleadminhacks/hacks/CTAnnounceTest.java b/src/test/java/com/programmerdan/minecraft/simpleadminhacks/hacks/CTAnnounceTest.java index db6fd4e1..6b724c9f 100644 --- a/src/test/java/com/programmerdan/minecraft/simpleadminhacks/hacks/CTAnnounceTest.java +++ b/src/test/java/com/programmerdan/minecraft/simpleadminhacks/hacks/CTAnnounceTest.java @@ -68,7 +68,7 @@ public void testCTEventQuickFail() { PlayerCombatTagEvent cte = new PlayerCombatTagEvent(null, null, 30); try { - instance.CTEvent(cte); + instance.ctEvent(cte); assertTrue(true); } catch( NullPointerException npe) { @@ -148,7 +148,7 @@ public Object answer(InvocationOnMock invocation) throws Throwable { online.add(att); when(plugin.serverOnlineBroadcast(anyString())).thenReturn(online.size()); - instance.CTEvent(cte); + instance.ctEvent(cte); // Now we make sure everyone got notified, and only once. // OPs got notified @@ -169,7 +169,7 @@ public Object answer(InvocationOnMock invocation) throws Throwable { } // This one should get throttled right away. - instance.CTEvent(cte); + instance.ctEvent(cte); // verify that console was _not_ alerted again (e.g. still only one message) verify(plugin).serverSendConsoleMessage(anyString()); @@ -180,7 +180,7 @@ public Object answer(InvocationOnMock invocation) throws Throwable { } // This one should not get throttled. - instance.CTEvent(cte); + instance.ctEvent(cte); // verify that console was alerted again (e.g. second throttled, third succeeded) verify(plugin, times(2)).serverSendConsoleMessage(anyString()); From 118e28f9ae0b4b59faec0249f88c416747775a3a Mon Sep 17 00:00:00 2001 From: ProgrammerDan Date: Tue, 10 Sep 2019 01:09:24 -0400 Subject: [PATCH 08/28] Adding in dragon controls, might need to separate out a bit, but adds a new dragon damage for servers that want to allow dragon spawning but would prefer they dont remove the world en mass. Untested at yet. Some other fixes as noted in my self-review. --- README.md | 2 +- .../configs/GameTuningConfig.java | 10 +++++++- .../simpleadminhacks/hacks/Experimental.java | 2 +- .../simpleadminhacks/hacks/GameTuning.java | 23 +++++++++++++++++-- src/main/resources/config.yml | 3 ++- 5 files changed, 34 insertions(+), 6 deletions(-) diff --git a/README.md b/README.md index d8a00b0f..887f48c3 100644 --- a/README.md +++ b/README.md @@ -116,7 +116,7 @@ clickable-on, clickable-off light sources without additional redstone infrastruc ### HumbugBatchOne -A new BasicHack (thanks Maxopoly) which encompases a number of previously unincluded +A new BasicHack (thanks Maxopoly) which encompasses a number of previously unincluded Humbug gameplay modifications. Specifically, sheep wool dying, anvil use, enchanting table use, cauldrons sourcing infinite water, disabling ender dragon, disabling iron farms, disabling ender crystal damage, disable mining fatigue, and equipping banners as hats. diff --git a/src/main/java/com/programmerdan/minecraft/simpleadminhacks/configs/GameTuningConfig.java b/src/main/java/com/programmerdan/minecraft/simpleadminhacks/configs/GameTuningConfig.java index 39d6e384..a1dbb696 100644 --- a/src/main/java/com/programmerdan/minecraft/simpleadminhacks/configs/GameTuningConfig.java +++ b/src/main/java/com/programmerdan/minecraft/simpleadminhacks/configs/GameTuningConfig.java @@ -49,6 +49,7 @@ public class GameTuningConfig extends SimpleHackConfig { private boolean enderGrief; private boolean witherGrief; + private boolean dragonGrief; private boolean preventFallingThroughBedrock; @@ -102,6 +103,9 @@ protected void wireup(ConfigurationSection config) { this.witherGrief = config.getBoolean("witherGrief", false); if (!witherGrief) plugin().log("Wither grief is disabled."); + this.dragonGrief = config.getBoolean("dragonGrief", true); + if (!dragonGrief) plugin().log("Dragon grief is disabled."); + this.preventFallingThroughBedrock = config.getBoolean("preventFallingThroughBedrock", true); noPlace = new HashSet<>(); @@ -289,6 +293,10 @@ public boolean isWitherGrief() { return witherGrief; } + public boolean isDragonGrief() { + return dragonGrief; + } + public boolean isPreventFallingThroughBedrock() { return preventFallingThroughBedrock; } @@ -297,4 +305,4 @@ public boolean canPlace(Material mat) { return !noPlace.contains(mat); } -} \ No newline at end of file +} diff --git a/src/main/java/com/programmerdan/minecraft/simpleadminhacks/hacks/Experimental.java b/src/main/java/com/programmerdan/minecraft/simpleadminhacks/hacks/Experimental.java index b5524c12..4993bcb3 100644 --- a/src/main/java/com/programmerdan/minecraft/simpleadminhacks/hacks/Experimental.java +++ b/src/main/java/com/programmerdan/minecraft/simpleadminhacks/hacks/Experimental.java @@ -163,7 +163,7 @@ private void logTeleport(PlayerTeleportEvent event, StringBuilder sb) { Player player = event.getPlayer(); Location from = event.getFrom(); Location to = event.getTo(); - // Must of these nullchecks will gen warnings with compile time contracts. + // Most of these nullchecks will gen warnings with compile time contracts. // Experience tells me these can be violated at runtime due to spigot failures, // esp moving between worlds with corresponding state desync. Leaving them in // consequentially. diff --git a/src/main/java/com/programmerdan/minecraft/simpleadminhacks/hacks/GameTuning.java b/src/main/java/com/programmerdan/minecraft/simpleadminhacks/hacks/GameTuning.java index 780fc9a7..77b0e065 100644 --- a/src/main/java/com/programmerdan/minecraft/simpleadminhacks/hacks/GameTuning.java +++ b/src/main/java/com/programmerdan/minecraft/simpleadminhacks/hacks/GameTuning.java @@ -26,6 +26,7 @@ import org.bukkit.event.block.BlockPistonRetractEvent; import org.bukkit.event.block.BlockPlaceEvent; import org.bukkit.event.entity.EntityChangeBlockEvent; +import org.bukkit.event.entity.EntityExplodeEvent; import org.bukkit.event.entity.EntityPortalEvent; import org.bukkit.event.entity.EntityTargetEvent; import org.bukkit.event.inventory.InventoryMoveItemEvent; @@ -324,14 +325,32 @@ public void onPlayerInteractEntity(PlayerInteractEntityEvent event) { } @EventHandler(priority = EventPriority.LOW, ignoreCancelled = true) - public void onEntityChangeBLock(EntityChangeBlockEvent event) { + public void onEntityChangeBlock(EntityChangeBlockEvent event) { if(config.isEnabled() && (!config.isEnderGrief() && EntityType.ENDERMAN.equals(event.getEntityType())) || - (!config.isWitherGrief() && EntityType.WITHER.equals(event.getEntityType()))) { + (!config.isWitherGrief() && EntityType.WITHER.equals(event.getEntityType())) || + (!config.isDragonGrief() && EntityType.ENDER_DRAGON.equals(event.getEntityType()))) { event.setCancelled(true); } } + /** + * Speculative handler for dragon fireballs and exploding wither skulls + * + * Some examples online prefer event.getEntity() instanceof DragonFireball and WitherSkull, could try that + * if this does not work + */ + @EventHandler(priority = EventPriority.LOW, ignoreCancelled = true) + public void onEntityExplodeEvent(EntityExplodeEvent event) { + if (config.isEnabled() && + (!config.isDragonGrief() && EntityType.DRAGON_FIREBALL.equals(event.getEntityType())) || + (!config.isWitherGrief() && EntityType.WITHER_SKULL.equals(event.getEntityType()))) { + event.setCancelled(true); + // note this might not prevent block breaks, check on that (1.14) + } + } + + @EventHandler public void onPlayerMove(PlayerMoveEvent event) { if(config.isEnabled() && config.isPreventFallingThroughBedrock() && event.getTo().getY() < 1 diff --git a/src/main/resources/config.yml b/src/main/resources/config.yml index 0c13dc02..cdc112b0 100644 --- a/src/main/resources/config.yml +++ b/src/main/resources/config.yml @@ -83,6 +83,7 @@ hacks: allowVillagerTrading: false enderGrief: false witherGrief: false + dragonGrief: true allowEnchantedApples: false preventFallingThroughBedrock: true #a list of materials players shouldn't be allowed to place at all @@ -228,4 +229,4 @@ hacks: - org.bukkit.event.world ToggleLamp: enabled: false - cooldownTime: 100 \ No newline at end of file + cooldownTime: 100 From 3746205277ced3e9a066b1c2fa003a0f1cc27a44 Mon Sep 17 00:00:00 2001 From: Maxopoly Date: Fri, 25 Oct 2019 00:44:14 +0200 Subject: [PATCH 09/28] Fix up ArthropodEgg hack --- pom.xml | 8 +- .../hacks/basic/ArthropodEggHack.java | 88 +++++++++++++++++++ 2 files changed, 92 insertions(+), 4 deletions(-) create mode 100644 src/main/java/com/programmerdan/minecraft/simpleadminhacks/hacks/basic/ArthropodEggHack.java diff --git a/pom.xml b/pom.xml index a20d380a..16686ceb 100644 --- a/pom.xml +++ b/pom.xml @@ -137,24 +137,24 @@ com.comphenix.protocol ProtocolLib-API - 4.3.0 + 4.5.0-SNAPSHOT vg.civcraft.mc.namelayer NameLayer - 2.11.0 + 2.12.0 provided vg.civcraft.mc.citadel Citadel - 3.9.0 + 4.0.1 provided vg.civcraft.mc.civmodcore CivModCore - 1.6.0 + 1.7.5 provided diff --git a/src/main/java/com/programmerdan/minecraft/simpleadminhacks/hacks/basic/ArthropodEggHack.java b/src/main/java/com/programmerdan/minecraft/simpleadminhacks/hacks/basic/ArthropodEggHack.java new file mode 100644 index 00000000..ea3ade70 --- /dev/null +++ b/src/main/java/com/programmerdan/minecraft/simpleadminhacks/hacks/basic/ArthropodEggHack.java @@ -0,0 +1,88 @@ +package com.programmerdan.minecraft.simpleadminhacks.hacks.basic; + +import java.util.List; +import java.util.Map; + +import org.bukkit.enchantments.Enchantment; +import org.bukkit.entity.Ageable; +import org.bukkit.entity.Player; +import org.bukkit.event.EventHandler; +import org.bukkit.event.entity.EntityDeathEvent; +import org.bukkit.inventory.ItemStack; + +import com.programmerdan.minecraft.simpleadminhacks.BasicHack; +import com.programmerdan.minecraft.simpleadminhacks.BasicHackConfig; +import com.programmerdan.minecraft.simpleadminhacks.SimpleAdminHacks; +import com.programmerdan.minecraft.simpleadminhacks.autoload.AutoLoad; + +import vg.civcraft.mc.civmodcore.api.SpawnEggAPI; + +public class ArthropodEggHack extends BasicHack { + + @AutoLoad + private double eggChance; + + @AutoLoad + private double lootingChance; + + @AutoLoad + private boolean removeDrops; + + @AutoLoad + private List allowedTypes; + + public ArthropodEggHack(SimpleAdminHacks plugin, BasicHackConfig config) { + super(plugin, config); + } + + @EventHandler + public void onEntityDeath(EntityDeathEvent event) { + Player targetPlayer = event.getEntity().getKiller(); + if (null == targetPlayer) { + return; + } + + String type = event.getEntity().getType().toString(); + if (allowedTypes == null || !allowedTypes.contains(type)) { + return; + } + + // Check for a baby animal + if (event.getEntity() instanceof Ageable) { + Ageable ageableEntity = (Ageable) event.getEntity(); + if (!ageableEntity.isAdult()) { + return; + } + } + + // Check the player's currently equipped weapon + ItemStack handstack = targetPlayer.getEquipment().getItemInMainHand(); + // Get the map of enchantments on that item + Map itemEnchants = handstack.getEnchantments(); + if (itemEnchants.isEmpty()) { + return; + } + + // Check if one enchantment is BaneOfArthropods + if (null == itemEnchants.get(Enchantment.DAMAGE_ARTHROPODS)) { + return; + } + + double randomNum = Math.random(); + double levelOfArthropod = handstack.getEnchantmentLevel(Enchantment.DAMAGE_ARTHROPODS); + double levelOfLooting = handstack.getEnchantmentLevel(Enchantment.LOOT_BONUS_MOBS); + + double targetPercentage = (eggChance * levelOfArthropod) + (lootingChance * levelOfLooting); + + // Check if egg should be spawned + if (randomNum < targetPercentage) { + ItemStack item = new ItemStack(SpawnEggAPI.getSpawnEgg(event.getEntityType()), 1); + if (removeDrops) { + event.getDrops().clear(); + event.setDroppedExp(0); + } + event.getDrops().add(item); + } + } + +} From b6ad1a0ab72cbfdcf3626a953dab46042cd1b986 Mon Sep 17 00:00:00 2001 From: Maxopoly Date: Fri, 25 Oct 2019 23:20:38 +0200 Subject: [PATCH 10/28] Last fixes to make compile --- pom.xml | 6 +- .../hacks/ReinforcedChestBreak.java | 8 +- .../simpleadminhacks/hacks/ToggleLamp.java | 82 ++++++++----------- 3 files changed, 41 insertions(+), 55 deletions(-) diff --git a/pom.xml b/pom.xml index cfc28534..2c3eb288 100644 --- a/pom.xml +++ b/pom.xml @@ -89,10 +89,6 @@ spigot-repo https://hub.spigotmc.org/nexus/content/groups/public/ - - byteflux-repo - http://repo.byteflux.net/repository/maven-snapshots/ - dmulloy2-repo http://repo.dmulloy2.net/content/groups/public/ @@ -137,7 +133,7 @@ com.comphenix.protocol ProtocolLib-API - 4.5.0-SNAPSHOT + 4.4.0 vg.civcraft.mc.namelayer diff --git a/src/main/java/com/programmerdan/minecraft/simpleadminhacks/hacks/ReinforcedChestBreak.java b/src/main/java/com/programmerdan/minecraft/simpleadminhacks/hacks/ReinforcedChestBreak.java index 7eef2b14..a0e141ba 100644 --- a/src/main/java/com/programmerdan/minecraft/simpleadminhacks/hacks/ReinforcedChestBreak.java +++ b/src/main/java/com/programmerdan/minecraft/simpleadminhacks/hacks/ReinforcedChestBreak.java @@ -58,7 +58,7 @@ public void dataBootstrap() { } messages = new HashSet<>(); - manager = Citadel.getReinforcementManager(); + manager = Citadel.getInstance().getReinforcementManager(); messenger = new Messenger(); Bukkit.getScheduler().runTaskTimer(plugin(), messenger, 0, config.getDelay() * 20); @@ -88,7 +88,9 @@ public void onBlockBreak(BlockBreakEvent eve) { return; } Material bbe = eve.getBlock().getType(); - if (manager == null) manager = Citadel.getReinforcementManager(); + if (manager == null) { + manager = Citadel.getInstance().getReinforcementManager(); + } // the list of items with inventories has grown a bit (1.14) if (Material.CHEST.equals(bbe) || Material.TRAPPED_CHEST.equals(bbe) || Material.ENDER_CHEST.equals(bbe) || Material.FURNACE.equals(bbe) @@ -113,7 +115,7 @@ public void onBlockBreak(BlockBreakEvent eve) { || Material.WHITE_SHULKER_BOX.equals(bbe) || Material.YELLOW_SHULKER_BOX.equals(bbe) || Material.LECTERN.equals(bbe) || Material.BREWING_STAND.equals(bbe)) { - if(manager.isReinforced(eve.getBlock())) { + if(manager.getReinforcement(eve.getBlock()) != null) { String name = eve.getPlayer().getDisplayName(); Location loc = eve.getBlock().getLocation(); diff --git a/src/main/java/com/programmerdan/minecraft/simpleadminhacks/hacks/ToggleLamp.java b/src/main/java/com/programmerdan/minecraft/simpleadminhacks/hacks/ToggleLamp.java index 5ce5b16e..eba935fc 100644 --- a/src/main/java/com/programmerdan/minecraft/simpleadminhacks/hacks/ToggleLamp.java +++ b/src/main/java/com/programmerdan/minecraft/simpleadminhacks/hacks/ToggleLamp.java @@ -21,85 +21,73 @@ import vg.civcraft.mc.citadel.Citadel; import vg.civcraft.mc.citadel.ReinforcementManager; -import vg.civcraft.mc.citadel.reinforcement.PlayerReinforcement; -import vg.civcraft.mc.citadel.reinforcement.Reinforcement; +import vg.civcraft.mc.citadel.model.Reinforcement; public class ToggleLamp extends SimpleHack implements Listener { public static final String NAME = "ToggleLamp"; - + private static final String META_COOLDOWN = "ToggleLamp_NextToggle"; private static final String META_TOGGLED = "ToggleLamp_Toggled"; - + private ReinforcementManager rm; - + public ToggleLamp(SimpleAdminHacks plugin, ToggleLampConfig config) { super(plugin, config); } - + @EventHandler(priority = EventPriority.NORMAL) public void onInteract(PlayerInteractEvent event) { - if(!config.isEnabled()) { + if (!config.isEnabled()) { return; } - Block clickedBlock = event.getClickedBlock(); - if(clickedBlock == null) { + if (clickedBlock == null) { return; } - - // if it wasn't a right click - if(event.getAction() != Action.RIGHT_CLICK_BLOCK) { + if (event.getAction() != Action.RIGHT_CLICK_BLOCK) { return; } - - if(event.getItem() == null) { + if (event.getItem() == null) { return; } - - // if it wasn't a stick in their main hand - if(event.getHand() != EquipmentSlot.HAND || event.getItem().getType() != Material.STICK) { + if (event.getHand() != EquipmentSlot.HAND || event.getItem().getType() != Material.STICK) { return; } - + Player eventPlayer = event.getPlayer(); Material clickedBlockMat = clickedBlock.getType(); - if(clickedBlockMat != Material.REDSTONE_LAMP) { + if (clickedBlockMat != Material.REDSTONE_LAMP) { return; } - - boolean toggled = clickedBlock.hasMetadata(META_TOGGLED) && clickedBlock.getMetadata(META_TOGGLED).get(0).asBoolean(); - - if(clickedBlock.hasMetadata(META_COOLDOWN)){ + + boolean toggled = clickedBlock.hasMetadata(META_TOGGLED) + && clickedBlock.getMetadata(META_TOGGLED).get(0).asBoolean(); + + if (clickedBlock.hasMetadata(META_COOLDOWN)) { MetadataValue val = clickedBlock.getMetadata(META_COOLDOWN).get(0); - if(((long)val.value()) > System.currentTimeMillis()) { + if (((long) val.value()) > System.currentTimeMillis()) { return; } } - - if(rm != null) { - if(rm.isReinforced(clickedBlock)) { - Reinforcement rein = rm.getReinforcement(clickedBlock); - - if(rein instanceof PlayerReinforcement) { - PlayerReinforcement pr = (PlayerReinforcement)rein; - if(!pr.getGroup().isMember(eventPlayer.getUniqueId())) { - return; - } + + if (rm != null) { + Reinforcement rein = rm.getReinforcement(clickedBlock); + if (rein != null) { + if (!rein.getGroup().isMember(eventPlayer.getUniqueId())) { + return; } } } - switchLamp(clickedBlock, !toggled); - eventPlayer.getWorld().playSound(clickedBlock.getLocation(), Sound.BLOCK_LEVER_CLICK, 0.5F, 1.0F); - + } @Override public void registerListeners() { - if(config.isEnabled()) { + if (config.isEnabled()) { plugin().log("Registering ToggleLamp listeners"); plugin().registerListener(this); } @@ -111,7 +99,7 @@ public void registerCommands() { @Override public void dataBootstrap() { - rm = plugin().serverHasPlugin("Citadel") ? Citadel.getReinforcementManager() : null; + rm = plugin().serverHasPlugin("Citadel") ? Citadel.getInstance().getReinforcementManager() : null; } @Override @@ -131,24 +119,24 @@ public void dataCleanup() { public String status() { return config.isEnabled() ? "ToggleLamp enabled." : "ToggleLamp disabled."; } - + public static ToggleLampConfig generate(SimpleAdminHacks plugin, ConfigurationSection config) { return new ToggleLampConfig(plugin, config); } - + private void switchLamp(Block block, boolean lit) { - if(block.getType() != Material.REDSTONE_LAMP) { + if (block.getType() != Material.REDSTONE_LAMP) { return; } - - Lightable lightable = (Lightable)block.getBlockData(); + + Lightable lightable = (Lightable) block.getBlockData(); lightable.setLit(lit); block.setBlockData(lightable); - + block.setMetadata(META_TOGGLED, new FixedMetadataValue(plugin(), lit)); - block.setMetadata(META_COOLDOWN, new FixedMetadataValue(plugin(), System.currentTimeMillis()+config.getCooldownTime())); + block.setMetadata(META_COOLDOWN, + new FixedMetadataValue(plugin(), System.currentTimeMillis() + config.getCooldownTime())); } - } \ No newline at end of file From 7056077cd5d7f37dfac811b792c28403cfe14843 Mon Sep 17 00:00:00 2001 From: Maxopoly Date: Fri, 25 Oct 2019 23:41:47 +0200 Subject: [PATCH 11/28] Add api version to plugin.yml --- src/main/resources/plugin.yml | 1 + 1 file changed, 1 insertion(+) diff --git a/src/main/resources/plugin.yml b/src/main/resources/plugin.yml index 64e55647..63dc9eec 100644 --- a/src/main/resources/plugin.yml +++ b/src/main/resources/plugin.yml @@ -124,3 +124,4 @@ permissions: simpleadmin.timings: description: Gives the ability to view and manage /...timings commands default: op +api-version: 1.14 \ No newline at end of file From 28beac2c8c5a3ac621b87399d2caeb8d953182b2 Mon Sep 17 00:00:00 2001 From: Maxopoly Date: Sun, 27 Oct 2019 18:06:47 +0100 Subject: [PATCH 12/28] Actually launch hacks --- .../programmerdan/minecraft/simpleadminhacks/HackManager.java | 1 + 1 file changed, 1 insertion(+) diff --git a/src/main/java/com/programmerdan/minecraft/simpleadminhacks/HackManager.java b/src/main/java/com/programmerdan/minecraft/simpleadminhacks/HackManager.java index 1e0cb927..bee56ae4 100644 --- a/src/main/java/com/programmerdan/minecraft/simpleadminhacks/HackManager.java +++ b/src/main/java/com/programmerdan/minecraft/simpleadminhacks/HackManager.java @@ -23,6 +23,7 @@ public class HackManager { public HackManager(SimpleAdminHacks plugin) { this.plugin = plugin; this.hacks = new LinkedList<>(); + reloadHacks(); } public void reloadHacks() { From 118d6c7cad6a94699112cdc7acac3382e97ef9ef Mon Sep 17 00:00:00 2001 From: Maxopoly Date: Sun, 27 Oct 2019 19:17:22 +0100 Subject: [PATCH 13/28] Actually make everything new work --- .../simpleadminhacks/HackManager.java | 31 +++++++++++++------ .../hacks/basic/ArthropodEggHack.java | 5 +++ .../hacks/basic/HumbugBatchOne.java | 5 +++ .../hacks/basic/PortalSpawnModifier.java | 5 +++ 4 files changed, 37 insertions(+), 9 deletions(-) diff --git a/src/main/java/com/programmerdan/minecraft/simpleadminhacks/HackManager.java b/src/main/java/com/programmerdan/minecraft/simpleadminhacks/HackManager.java index bee56ae4..0d1ab068 100644 --- a/src/main/java/com/programmerdan/minecraft/simpleadminhacks/HackManager.java +++ b/src/main/java/com/programmerdan/minecraft/simpleadminhacks/HackManager.java @@ -1,5 +1,6 @@ package com.programmerdan.minecraft.simpleadminhacks; +import java.lang.reflect.Array; import java.lang.reflect.Constructor; import java.lang.reflect.Field; import java.lang.reflect.InvocationTargetException; @@ -46,15 +47,15 @@ public void reloadHacks() { try { Method genBasic = clazz.getMethod("generate", SimpleAdminHacks.class, ConfigurationSection.class); - hackingConfig = (SimpleHackConfig) genBasic.invoke(null, this, hackConfig); + hackingConfig = (SimpleHackConfig) genBasic.invoke(null, plugin, hackConfig); } catch (IllegalAccessException failure) { plugin.log(Level.WARNING, - "Creating configuration for hack {0} failed, illegal access failure", - clazz.getName()); + "Creating configuration for hack {0} failed, illegal access failure: {1}", + clazz.getName(), failure.toString()); } catch (IllegalArgumentException failure) { plugin.log(Level.WARNING, - "Creating configuration for hack {0} failed, illegal argument failure", - clazz.getName()); + "Creating configuration for hack {0} failed, illegal argument failure: {1}", + clazz.getName(), failure.toString()); } catch (InvocationTargetException failure) { plugin.log(Level.WARNING, "Creating configuration for hack {0} failed, invocation target failure", @@ -72,7 +73,7 @@ public void reloadHacks() { try { Constructor constructBasic = clazz.getConstructor(SimpleAdminHacks.class, hackingConfig.getClass()); - hack = (SimpleHack) constructBasic.newInstance(this, hackingConfig); + hack = (SimpleHack) constructBasic.newInstance(plugin, hackingConfig); plugin.log(Level.INFO, "Created a new Hack of type {0}", clazz.getSimpleName()); } catch (InvalidConfigException ice) { plugin.log(Level.WARNING, "Failed to activate {0} hack, configuration failed", @@ -97,7 +98,7 @@ public void reloadHacks() { plugin.log(Level.INFO, "Unable to load discovered class {0} due to dependency failure", clsInfo.getName()); } catch (Exception e) { - plugin.log(Level.WARNING, "Failed to complete hack discovery {0}", clsInfo.getName()); + plugin.log(Level.WARNING, "Failed to complete hack discovery of {0}: {1}", clsInfo.getName(), e.toString()); } } } catch (Exception e) { @@ -157,13 +158,25 @@ private void populateParameter(SimpleHack hack) { } else { identifier = autoLoad.id(); } + Class clazz; + if (field.getType().getName().split("\\.").length == 1) { + //unwrap primitives + clazz = Array.get(Array.newInstance(field.getType(),1),0).getClass(); + } + else { + clazz = field.getType(); + } Object value; try { - value = config.getObject(identifier, field.getClass(), null); + value = config.getObject(identifier, clazz, null); } catch (Exception e) { throw new IllegalArgumentException("Hack " + hackClass.getSimpleName() + " failed to read parameter " + identifier, e); } + if (value == null) { + plugin.log(Level.WARNING, "Hack {0} had no value for option {1}", hackClass.getSimpleName(), identifier); + continue; + } field.setAccessible(true); try { field.set(hack, value); @@ -171,7 +184,7 @@ private void populateParameter(SimpleHack hack) { throw new IllegalStateException(field.getClass().getSimpleName() + " in " + hackClass.getSimpleName() + " could not be set " + e.toString()); } - plugin.log(Level.INFO, "Loaded '{0}' = '{1}'", identifier, value); + plugin.log(Level.INFO, "Loaded {0} = {1}", identifier, value); } } diff --git a/src/main/java/com/programmerdan/minecraft/simpleadminhacks/hacks/basic/ArthropodEggHack.java b/src/main/java/com/programmerdan/minecraft/simpleadminhacks/hacks/basic/ArthropodEggHack.java index ea3ade70..44e7c243 100644 --- a/src/main/java/com/programmerdan/minecraft/simpleadminhacks/hacks/basic/ArthropodEggHack.java +++ b/src/main/java/com/programmerdan/minecraft/simpleadminhacks/hacks/basic/ArthropodEggHack.java @@ -3,6 +3,7 @@ import java.util.List; import java.util.Map; +import org.bukkit.configuration.ConfigurationSection; import org.bukkit.enchantments.Enchantment; import org.bukkit.entity.Ageable; import org.bukkit.entity.Player; @@ -34,6 +35,10 @@ public class ArthropodEggHack extends BasicHack { public ArthropodEggHack(SimpleAdminHacks plugin, BasicHackConfig config) { super(plugin, config); } + + public static BasicHackConfig generate(SimpleAdminHacks plugin, ConfigurationSection config) { + return new BasicHackConfig(plugin, config); + } @EventHandler public void onEntityDeath(EntityDeathEvent event) { diff --git a/src/main/java/com/programmerdan/minecraft/simpleadminhacks/hacks/basic/HumbugBatchOne.java b/src/main/java/com/programmerdan/minecraft/simpleadminhacks/hacks/basic/HumbugBatchOne.java index 9ea0e932..64c4d918 100644 --- a/src/main/java/com/programmerdan/minecraft/simpleadminhacks/hacks/basic/HumbugBatchOne.java +++ b/src/main/java/com/programmerdan/minecraft/simpleadminhacks/hacks/basic/HumbugBatchOne.java @@ -8,6 +8,7 @@ import org.bukkit.Material; import org.bukkit.block.Block; import org.bukkit.block.BlockFace; +import org.bukkit.configuration.ConfigurationSection; import org.bukkit.entity.EntityType; import org.bukkit.entity.Player; import org.bukkit.event.EventHandler; @@ -56,6 +57,10 @@ public class HumbugBatchOne extends BasicHack { @AutoLoad private boolean canEquipBanners; + + public static BasicHackConfig generate(SimpleAdminHacks plugin, ConfigurationSection config) { + return new BasicHackConfig(plugin, config); + } public HumbugBatchOne(SimpleAdminHacks plugin, BasicHackConfig config) { super(plugin, config); diff --git a/src/main/java/com/programmerdan/minecraft/simpleadminhacks/hacks/basic/PortalSpawnModifier.java b/src/main/java/com/programmerdan/minecraft/simpleadminhacks/hacks/basic/PortalSpawnModifier.java index e360e665..6fbfa6d2 100644 --- a/src/main/java/com/programmerdan/minecraft/simpleadminhacks/hacks/basic/PortalSpawnModifier.java +++ b/src/main/java/com/programmerdan/minecraft/simpleadminhacks/hacks/basic/PortalSpawnModifier.java @@ -5,6 +5,7 @@ import org.bukkit.Location; import org.bukkit.Material; +import org.bukkit.configuration.ConfigurationSection; import org.bukkit.entity.EntityType; import org.bukkit.event.EventHandler; import org.bukkit.event.entity.CreatureSpawnEvent; @@ -30,6 +31,10 @@ public class PortalSpawnModifier extends BasicHack { @AutoLoad private double witherHeadDropChance; + + public static BasicHackConfig generate(SimpleAdminHacks plugin, ConfigurationSection config) { + return new BasicHackConfig(plugin, config); + } public PortalSpawnModifier(SimpleAdminHacks plugin, BasicHackConfig config) { super(plugin, config); From a66b62545947aaca51134127ee0703a5f9f4c18a Mon Sep 17 00:00:00 2001 From: Falvyu Date: Mon, 13 Apr 2020 00:38:24 +0200 Subject: [PATCH 14/28] Fixed issue where onPlayerInteract() would re-enable cancelled event and removed duplicated enderchest check --- .../minecraft/simpleadminhacks/hacks/GameTuning.java | 7 ++++--- 1 file changed, 4 insertions(+), 3 deletions(-) diff --git a/src/main/java/com/programmerdan/minecraft/simpleadminhacks/hacks/GameTuning.java b/src/main/java/com/programmerdan/minecraft/simpleadminhacks/hacks/GameTuning.java index 77b0e065..ffd757df 100644 --- a/src/main/java/com/programmerdan/minecraft/simpleadminhacks/hacks/GameTuning.java +++ b/src/main/java/com/programmerdan/minecraft/simpleadminhacks/hacks/GameTuning.java @@ -299,10 +299,11 @@ public void onPlayerInteract(PlayerInteractEvent event) { if(!config.isEnabled() || !Action.RIGHT_CLICK_BLOCK.equals(event.getAction())) { return; } - boolean cancel = !config.isEnderChestInventories() && Material.ENDER_CHEST.equals(event.getClickedBlock().getType()); - cancel |= !config.canChangeSpawnerType() && Material.SPAWNER.equals(event.getClickedBlock().getType()) + boolean cancel = !config.canChangeSpawnerType() && Material.SPAWNER.equals(event.getClickedBlock().getType()) && event.getItem() != null && event.getItem().getItemMeta() instanceof SpawnEggMeta; - event.setCancelled(cancel); + if (cancel) { + event.setCancelled(true); + } } @EventHandler From 67e90ac89ba165c160be03766c94f7c9a5a3126b Mon Sep 17 00:00:00 2001 From: Alexander <52572989+Protonull@users.noreply.github.com> Date: Mon, 17 Feb 2020 11:21:14 +0000 Subject: [PATCH 15/28] Cherry pick autorespawn --- .../configs/AutoRespawnConfig.java | 64 ++++++ .../simpleadminhacks/hacks/AutoRespawn.java | 202 ++++++++++++++++++ src/main/resources/config.yml | 15 ++ 3 files changed, 281 insertions(+) create mode 100644 src/main/java/com/programmerdan/minecraft/simpleadminhacks/configs/AutoRespawnConfig.java create mode 100644 src/main/java/com/programmerdan/minecraft/simpleadminhacks/hacks/AutoRespawn.java diff --git a/src/main/java/com/programmerdan/minecraft/simpleadminhacks/configs/AutoRespawnConfig.java b/src/main/java/com/programmerdan/minecraft/simpleadminhacks/configs/AutoRespawnConfig.java new file mode 100644 index 00000000..07449104 --- /dev/null +++ b/src/main/java/com/programmerdan/minecraft/simpleadminhacks/configs/AutoRespawnConfig.java @@ -0,0 +1,64 @@ +package com.programmerdan.minecraft.simpleadminhacks.configs; + +import com.programmerdan.minecraft.simpleadminhacks.SimpleAdminHacks; +import com.programmerdan.minecraft.simpleadminhacks.SimpleHackConfig; +import org.bukkit.configuration.ConfigurationSection; + +import java.util.logging.Level; + +public class AutoRespawnConfig extends SimpleHackConfig { + + private static final long defaultRespawnDelay = 1000 * 60 * 5; // Five minutes + private static final long defaultLoginRespawnDelay = 0; // Instantly + + private long respawnDelay; + private long loginRespawnDelay; + private String[] respawnQuotes; + + public AutoRespawnConfig(SimpleAdminHacks plugin, ConfigurationSection base) { + super(plugin, base); + } + + @Override + protected void wireup(ConfigurationSection config) { + this.respawnDelay = config.getLong("respawnDelay", defaultRespawnDelay); + if (this.respawnDelay <= 0) { + plugin().log(Level.WARNING, "\tAuto Respawn delay has an invalid value, defaulting."); + this.respawnDelay = defaultRespawnDelay; + } + else { + plugin().log(Level.INFO, "\tAuto Respawn delay set to: " + this.respawnDelay); + } + this.loginRespawnDelay =config.getLong("loginRespawnDelay", defaultLoginRespawnDelay); + if (this.loginRespawnDelay < 0) { + plugin().log(Level.WARNING, "\tLogin Respawn delay has an invalid value, defaulting."); + this.loginRespawnDelay = defaultLoginRespawnDelay; + } + else { + plugin().log(Level.INFO, "\tLogin Respawn delay set to: " + this.loginRespawnDelay); + } + this.respawnQuotes = config.getStringList("respawnQuotes").toArray(new String[0]); + if (this.respawnQuotes.length < 1) { + plugin().log(Level.WARNING, "\tThere are no auto respawn quotes :'("); + } + else { + plugin().log(Level.INFO, "\tThe following auto respawn quotes were loaded:"); + for (String quote : this.respawnQuotes) { + plugin().log(Level.INFO, "\t\t- " + quote); + } + } + } + + public long getRespawnDelay() { + return this.respawnDelay; + } + + public long getLoginRespawnDelay() { + return this.loginRespawnDelay; + } + + public String[] getRespawnQuotes() { + return this.respawnQuotes; + } + +} diff --git a/src/main/java/com/programmerdan/minecraft/simpleadminhacks/hacks/AutoRespawn.java b/src/main/java/com/programmerdan/minecraft/simpleadminhacks/hacks/AutoRespawn.java new file mode 100644 index 00000000..279797e1 --- /dev/null +++ b/src/main/java/com/programmerdan/minecraft/simpleadminhacks/hacks/AutoRespawn.java @@ -0,0 +1,202 @@ +package com.programmerdan.minecraft.simpleadminhacks.hacks; + +import com.programmerdan.minecraft.simpleadminhacks.SimpleAdminHacks; +import com.programmerdan.minecraft.simpleadminhacks.SimpleHack; +import com.programmerdan.minecraft.simpleadminhacks.configs.AutoRespawnConfig; +import org.bukkit.Bukkit; +import org.bukkit.boss.BarColor; +import org.bukkit.boss.BarStyle; +import org.bukkit.boss.BossBar; +import org.bukkit.configuration.ConfigurationSection; +import org.bukkit.entity.Player; +import org.bukkit.event.EventHandler; +import org.bukkit.event.HandlerList; +import org.bukkit.event.Listener; +import org.bukkit.event.entity.PlayerDeathEvent; +import org.bukkit.event.player.PlayerJoinEvent; +import org.bukkit.event.player.PlayerQuitEvent; +import org.bukkit.event.player.PlayerRespawnEvent; +import org.bukkit.scheduler.BukkitRunnable; +import org.bukkit.scheduler.BukkitTask; +import vg.civcraft.mc.civmodcore.util.TextUtil; + +import java.security.SecureRandom; +import java.util.HashMap; +import java.util.Map; +import java.util.Random; +import java.util.logging.Level; + +public class AutoRespawn extends SimpleHack implements Listener { + + private final Random random = new SecureRandom(); + private final Map respawnTimers = new HashMap<>(); + + public AutoRespawn(SimpleAdminHacks plugin, AutoRespawnConfig config) { + super(plugin, config); + } + + private void autoRespawnPlayer(Player player) { + player.spigot().respawn(); + String[] quotes = config.getRespawnQuotes(); + if (quotes.length > 0) { + player.sendMessage(TextUtil.parse(quotes[quotes.length == 1 ? 0 : random.nextInt(quotes.length)])); + } + } + + @EventHandler + public void onPlayerLogin(PlayerJoinEvent event) { + if (event.getPlayer().isDead()) { + plugin().log(Level.INFO, "Player [" + event.getPlayer().getName() + "] logged in while dead, respawning."); + if (config.getLoginRespawnDelay() == 0) { + autoRespawnPlayer(event.getPlayer()); + } + else { + this.respawnTimers.compute(event.getPlayer(), (player, timer) -> { + if (timer != null) { + timer.stop(); + } + return new RespawnTimer(player, config.getLoginRespawnDelay()); + }); + } + } + } + + @EventHandler + public void onPlayerDeath(PlayerDeathEvent event) { + plugin().log(Level.INFO, "Player [" + event.getEntity().getName() + "] died, setting respawn timer."); + this.respawnTimers.compute(event.getEntity(), (player, timer) -> { + if (timer != null) { + timer.stop(); + } + return new RespawnTimer(player, config.getRespawnDelay()); + }); + } + + @EventHandler + public void onPlayerLogout(PlayerQuitEvent event) { + if (event.getPlayer().isDead()) { + plugin().log(Level.INFO, "Player [" + event.getPlayer().getName() + "] logged out while dead."); + this.respawnTimers.computeIfPresent(event.getPlayer(), (player, timer) -> timer.stop()); + } + } + + @EventHandler + public void onPlayerRespawn(PlayerRespawnEvent event) { + this.respawnTimers.computeIfPresent(event.getPlayer(), (player, timer) -> timer.stop()); + } + + @Override + public void dataCleanup() { + this.respawnTimers.forEach((player, timer) -> timer.stop()); + this.respawnTimers.clear(); + } + + @Override + public void registerListeners() { + if (config.isEnabled()) { + plugin().log("Registering AutoRespawn listener"); + plugin().registerListener(this); + } + } + + @Override + public void unregisterListeners() { + HandlerList.unregisterAll(this); + } + + @Override + public String status() { + if (!config.isEnabled()) { + return "Auto Respawner disabled."; + } + return "Auto Respawner enabled (" + this.respawnTimers.size() + " players are waiting to respawn)"; + } + + @Override + public void dataBootstrap() {} + + @Override + public void registerCommands() {} + + @Override + public void unregisterCommands() {} + + public class RespawnTimer { + + private BossBar bar; + private long previousTime; + private final long setTime; + private long timeRemaining; + private long secondTimer; + private BukkitTask processor; + + public RespawnTimer(Player player, long delay) { + this.previousTime = System.currentTimeMillis(); + this.setTime = this.timeRemaining = delay; + this.secondTimer = 1000L; + this.bar = Bukkit.createBossBar(generateBarTitle(), BarColor.WHITE, BarStyle.SOLID); + this.bar.setVisible(true); + this.bar.setProgress(1.0d); + this.bar.addPlayer(player); + this.processor = new BukkitRunnable() { + @Override + public void run() { + tick(); + } + }.runTaskTimer(plugin(), 1L, 1L); + } + + private String generateBarTitle() { + if (this.timeRemaining <= 1000L) { + return "Respawning now."; + } + if (this.timeRemaining < 60000L) { + return "Respawning in " + (this.timeRemaining / 1000L) + " seconds."; + } + if (this.timeRemaining < 120000L) { + return "Respawning in 1 minute."; + } + if (this.timeRemaining < 3600000L) { + return "Respawning in " + (this.timeRemaining / 60000L) + " minutes."; + } + return "Respawning in " + (this.timeRemaining / 3600000L) + " hours."; + } + + private void tick() { + long currentTime = System.currentTimeMillis(); + long timeDifference = currentTime - this.previousTime; + this.previousTime = currentTime; + this.timeRemaining -= timeDifference; + this.secondTimer -= timeDifference; + if (this.secondTimer > 0) { + return; + } + this.secondTimer = 1000L; + this.bar.setTitle(generateBarTitle()); + this.bar.setProgress(Math.max((double) (this.timeRemaining - 1000L) / (double) this.setTime, 0)); + if (this.timeRemaining > 0) { + return; + } + this.bar.getPlayers().forEach(AutoRespawn.this::autoRespawnPlayer); + } + + public RespawnTimer stop() { + if (this.bar != null) { + this.bar.setVisible(false); + this.bar.removeAll(); + this.bar = null; + } + if (this.processor != null) { + this.processor.cancel(); + this.processor = null; + } + return null; + } + + } + + public static AutoRespawnConfig generate(SimpleAdminHacks plugin, ConfigurationSection config) { + return new AutoRespawnConfig(plugin, config); + } + +} diff --git a/src/main/resources/config.yml b/src/main/resources/config.yml index cdc112b0..5ff7e4f9 100644 --- a/src/main/resources/config.yml +++ b/src/main/resources/config.yml @@ -230,3 +230,18 @@ hacks: ToggleLamp: enabled: false cooldownTime: 100 + AutoRespawn: + enabled: true + # Delay in MS + # Default: 300000 (five minutes) + respawnDelay: 300000 + # The respawn delay (in MS) if someone logs in dead + # Default 0 (instant) + loginRespawnDelay: 0 + # Jokey joke messages sent to the player if auto-respawned + # Deactivate by removing all the quotes below + respawnQuotes: + - Wait... how did I get here? + - Must've been a rough night o.o + - Why does my entire body ache? + - That really hurt! From 89bfa33fbf9fa611e702a45000ac5197d172d12d Mon Sep 17 00:00:00 2001 From: Maxopoly Date: Wed, 22 Apr 2020 12:10:33 +0200 Subject: [PATCH 16/28] FIx banner hack --- .../simpleadminhacks/hacks/basic/HumbugBatchOne.java | 6 ++++-- 1 file changed, 4 insertions(+), 2 deletions(-) diff --git a/src/main/java/com/programmerdan/minecraft/simpleadminhacks/hacks/basic/HumbugBatchOne.java b/src/main/java/com/programmerdan/minecraft/simpleadminhacks/hacks/basic/HumbugBatchOne.java index 64c4d918..d5aae5f7 100644 --- a/src/main/java/com/programmerdan/minecraft/simpleadminhacks/hacks/basic/HumbugBatchOne.java +++ b/src/main/java/com/programmerdan/minecraft/simpleadminhacks/hacks/basic/HumbugBatchOne.java @@ -6,6 +6,7 @@ import java.util.TreeSet; import org.bukkit.Material; +import org.bukkit.Tag; import org.bukkit.block.Block; import org.bukkit.block.BlockFace; import org.bukkit.configuration.ConfigurationSection; @@ -30,6 +31,8 @@ import com.programmerdan.minecraft.simpleadminhacks.SimpleAdminHacks; import com.programmerdan.minecraft.simpleadminhacks.autoload.AutoLoad; +import vg.civcraft.mc.civmodcore.api.MaterialAPI; + public class HumbugBatchOne extends BasicHack { @AutoLoad @@ -173,8 +176,7 @@ public void equipBanner(PlayerInteractEvent event) { if (!canEquipBanners) { return; } - if (event.getItem() == null || !event.getItem().getType().equals(Material.STONE) // TODO, waiting for material - // API + if (event.getItem() == null || !Tag.BANNERS.isTagged(event.getItem().getType()) // API || (event.getAction() != Action.LEFT_CLICK_AIR && event.getAction() != Action.LEFT_CLICK_BLOCK)) { return; } From cf3f1bebfb33582c221da3625c75d8d77b00c623 Mon Sep 17 00:00:00 2001 From: Maxopoly Date: Thu, 23 Apr 2020 14:16:32 +0200 Subject: [PATCH 17/28] Begin implementing EventDebugger --- .../hacks/basic/EventDebugHack.java | 183 ++++++++++++++++++ .../hacks/basic/HumbugBatchOne.java | 2 - 2 files changed, 183 insertions(+), 2 deletions(-) create mode 100644 src/main/java/com/programmerdan/minecraft/simpleadminhacks/hacks/basic/EventDebugHack.java diff --git a/src/main/java/com/programmerdan/minecraft/simpleadminhacks/hacks/basic/EventDebugHack.java b/src/main/java/com/programmerdan/minecraft/simpleadminhacks/hacks/basic/EventDebugHack.java new file mode 100644 index 00000000..ea44f0d1 --- /dev/null +++ b/src/main/java/com/programmerdan/minecraft/simpleadminhacks/hacks/basic/EventDebugHack.java @@ -0,0 +1,183 @@ +package com.programmerdan.minecraft.simpleadminhacks.hacks.basic; + +import java.lang.reflect.Field; +import java.lang.reflect.InvocationTargetException; +import java.lang.reflect.Method; +import java.lang.reflect.Modifier; +import java.util.Collection; +import java.util.HashMap; +import java.util.LinkedList; +import java.util.List; +import java.util.Map; + +import org.bukkit.ChatColor; +import org.bukkit.World; +import org.bukkit.command.CommandSender; +import org.bukkit.configuration.ConfigurationSection; +import org.bukkit.craftbukkit.libs.org.apache.commons.lang3.ClassUtils; +import org.bukkit.entity.LivingEntity; +import org.bukkit.event.Event; +import org.bukkit.event.EventException; +import org.bukkit.event.EventHandler; +import org.bukkit.event.EventPriority; +import org.bukkit.event.HandlerList; +import org.bukkit.event.Listener; +import org.bukkit.plugin.EventExecutor; +import org.bukkit.plugin.Plugin; +import org.bukkit.plugin.RegisteredListener; + +import com.programmerdan.minecraft.simpleadminhacks.BasicHack; +import com.programmerdan.minecraft.simpleadminhacks.BasicHackConfig; +import com.programmerdan.minecraft.simpleadminhacks.SimpleAdminHacks; + +public class EventDebugHack extends BasicHack { + + private Map, List> classToListeners; + private Map, HandlerList> classToHandler; + + public EventDebugHack(SimpleAdminHacks plugin, BasicHackConfig config) { + super(plugin, config); + classToListeners = new HashMap<>(); + classToHandler = new HashMap<>(); + } + + public static BasicHackConfig generate(SimpleAdminHacks plugin, ConfigurationSection config) { + return new BasicHackConfig(plugin, config); + } + + public void untargetEvent(String eventName) { + Class eventClass = getEventClass(eventName); + if (eventClass == null) { + return; + } + HandlerList handler = classToHandler.get(eventClass); + List listeners = classToListeners.get(eventClass); + if (handler == null || listeners == null) { + return; + } + listeners.forEach(handler::unregister); + classToHandler.remove(eventClass); + classToListeners.remove(eventClass); + } + + @SuppressWarnings("unchecked") + private Class getEventClass(String eventName) { + if (eventName.startsWith(".")) { + eventName = "org.bukkit.event" + eventName; + } + try { + return (Class) Class.forName(eventName); + } catch (ClassCastException | ClassNotFoundException e) { + return null; + } + } + + public void targetEvent(String eventName, CommandSender sender) { + Class eventClass = getEventClass(eventName); + if (eventClass == null) { + sender.sendMessage(ChatColor.RED + "No event class with that path exists"); + return; + } + if (classToHandler.containsKey(eventClass)) { + sender.sendMessage(ChatColor.RED + "Event is already being investigated"); + return; + } + Method handlerGetter; + try { + handlerGetter = eventClass.getMethod("getHandlerList"); + } catch (NoSuchMethodException | SecurityException e) { + sender.sendMessage(ChatColor.RED + "The class did not have a handler getter"); + return; + } + if (handlerGetter.getReturnType() != HandlerList.class) { + sender.sendMessage(ChatColor.RED + "Getter had wrong return type"); + return; + } + HandlerList handlerList; + try { + handlerList = (HandlerList) handlerGetter.invoke(eventClass); + } catch (IllegalAccessException | IllegalArgumentException | InvocationTargetException e) { + sender.sendMessage(ChatColor.RED + "Could not invoke handler getter"); + return; + } + sender.sendMessage( + ChatColor.GOLD + "Currently registered listeners for " + eventClass.getSimpleName() + " are:"); + for (RegisteredListener listener : handlerList.getRegisteredListeners()) { + for (Method method : listener.getListener().getClass().getMethods()) { + if (method.isBridge() || method.isSynthetic()) { + continue; + } + if (Modifier.isStatic(method.getModifiers())) { + continue; + } + if (!method.isAnnotationPresent(EventHandler.class)) { + continue; + } + if (method.getParameterCount() != 1) { + continue; + } + Class clazz = method.getParameterTypes()[0]; + if (Event.class.isAssignableFrom(clazz)) { + continue; + } + sender.sendMessage(String.format("[%s] on %s is %s", listener.getPlugin().getName(), + listener.getPriority(), listener.getListener().getClass().getSimpleName())); + } + } + Listener fakeListener = new Listener() { + }; + // need to hack our listener in, because can't dynamically declare an actual + // class with annotations etc. + List listeners = new LinkedList<>(); + for (EventPriority prio : EventPriority.values()) { + RegisteredListener listener = new RegisteredListener(fakeListener, new EventExecutor() { + + @Override + public void execute(Listener arg0, Event arg1) throws EventException { + printEventState(prio, arg1); + } + }, prio, SimpleAdminHacks.instance(), false); + listeners.add(listener); + handlerList.register(listener); + } + classToHandler.put(eventClass, handlerList); + classToListeners.put(eventClass, listeners); + } + + private void printEventState(EventPriority prio, Event event) { + StringBuilder sb = new StringBuilder(); + sb.append("At stage " + prio.toString() + " " + event.getEventName() + " is as follows: "); + deepInspectObject(event, "event", sb, 0); + SimpleAdminHacks.instance().getLogger().info(sb.toString()); + } + + private void deepInspectObject(Object o, String fieldName, StringBuilder sb, int depth) { + String pre = new String(new char[depth]).replace("\0", "-") + " "; + if (o == null) { + sb.append(pre + fieldName + ": null"); + return; + } + if (ClassUtils.isPrimitiveOrWrapper(o.getClass()) || straightPrint(o)) { + sb.append(pre + o.getClass().getSimpleName() + " " + fieldName + " = " + o.toString()); + return; + } + sb.append(pre + o.getClass().getSimpleName() + " " + fieldName + ":"); + for (Field field : this.getClass().getFields()) { + Object member; + try { + member = field.get(o); + } catch (IllegalArgumentException | IllegalAccessException e) { + SimpleAdminHacks.instance().getLogger() + .severe("Failed to get member in deep inspection " + e.getMessage()); + continue; + } + deepInspectObject(member, field.getName(), sb, depth + 1); + } + } + + private static boolean straightPrint(Object o) { + return o instanceof LivingEntity || o instanceof String || o instanceof World || o instanceof Plugin + || o instanceof Collection || o instanceof Map; + } + +} diff --git a/src/main/java/com/programmerdan/minecraft/simpleadminhacks/hacks/basic/HumbugBatchOne.java b/src/main/java/com/programmerdan/minecraft/simpleadminhacks/hacks/basic/HumbugBatchOne.java index d5aae5f7..0c986323 100644 --- a/src/main/java/com/programmerdan/minecraft/simpleadminhacks/hacks/basic/HumbugBatchOne.java +++ b/src/main/java/com/programmerdan/minecraft/simpleadminhacks/hacks/basic/HumbugBatchOne.java @@ -31,8 +31,6 @@ import com.programmerdan.minecraft.simpleadminhacks.SimpleAdminHacks; import com.programmerdan.minecraft.simpleadminhacks.autoload.AutoLoad; -import vg.civcraft.mc.civmodcore.api.MaterialAPI; - public class HumbugBatchOne extends BasicHack { @AutoLoad From bdc233c47cd50e37aa4346a322f2f6a45db83080 Mon Sep 17 00:00:00 2001 From: Maxopoly Date: Fri, 24 Apr 2020 02:42:30 +0200 Subject: [PATCH 18/28] Working eventdebug --- .../hacks/basic/EventDebugHack.java | 81 +++++++++++++++---- src/main/resources/plugin.yml | 7 ++ 2 files changed, 73 insertions(+), 15 deletions(-) diff --git a/src/main/java/com/programmerdan/minecraft/simpleadminhacks/hacks/basic/EventDebugHack.java b/src/main/java/com/programmerdan/minecraft/simpleadminhacks/hacks/basic/EventDebugHack.java index ea44f0d1..7d472610 100644 --- a/src/main/java/com/programmerdan/minecraft/simpleadminhacks/hacks/basic/EventDebugHack.java +++ b/src/main/java/com/programmerdan/minecraft/simpleadminhacks/hacks/basic/EventDebugHack.java @@ -4,17 +4,28 @@ import java.lang.reflect.InvocationTargetException; import java.lang.reflect.Method; import java.lang.reflect.Modifier; +import java.util.Arrays; import java.util.Collection; import java.util.HashMap; +import java.util.HashSet; import java.util.LinkedList; import java.util.List; import java.util.Map; +import java.util.Random; +import java.util.Set; +import java.util.logging.Logger; import org.bukkit.ChatColor; +import org.bukkit.Location; +import org.bukkit.Server; import org.bukkit.World; +import org.bukkit.block.Block; +import org.bukkit.command.Command; +import org.bukkit.command.CommandExecutor; import org.bukkit.command.CommandSender; import org.bukkit.configuration.ConfigurationSection; import org.bukkit.craftbukkit.libs.org.apache.commons.lang3.ClassUtils; +import org.bukkit.entity.Entity; import org.bukkit.entity.LivingEntity; import org.bukkit.event.Event; import org.bukkit.event.EventException; @@ -22,6 +33,7 @@ import org.bukkit.event.EventPriority; import org.bukkit.event.HandlerList; import org.bukkit.event.Listener; +import org.bukkit.inventory.ItemStack; import org.bukkit.plugin.EventExecutor; import org.bukkit.plugin.Plugin; import org.bukkit.plugin.RegisteredListener; @@ -45,23 +57,44 @@ public static BasicHackConfig generate(SimpleAdminHacks plugin, ConfigurationSec return new BasicHackConfig(plugin, config); } - public void untargetEvent(String eventName) { + @Override + public void registerCommands() { + plugin().registerCommand("debugevent", new CommandExecutor() { + + @Override + public boolean onCommand(CommandSender sender, Command arg1, String arg2, String[] args) { + if (args.length == 0) { + sender.sendMessage(ChatColor.RED + "You must give an event"); + return false; + } + if (untargetEvent(args[0])) { + sender.sendMessage(ChatColor.GREEN + "Disabled tracking for " + args[0]); + return true; + } + targetEvent(args[0], sender); + return true; + } + }); + } + + public boolean untargetEvent(String eventName) { Class eventClass = getEventClass(eventName); if (eventClass == null) { - return; + return false; } HandlerList handler = classToHandler.get(eventClass); List listeners = classToListeners.get(eventClass); if (handler == null || listeners == null) { - return; + return false; } listeners.forEach(handler::unregister); classToHandler.remove(eventClass); classToListeners.remove(eventClass); + return true; } @SuppressWarnings("unchecked") - private Class getEventClass(String eventName) { + private static Class getEventClass(String eventName) { if (eventName.startsWith(".")) { eventName = "org.bukkit.event" + eventName; } @@ -117,7 +150,7 @@ public void targetEvent(String eventName, CommandSender sender) { continue; } Class clazz = method.getParameterTypes()[0]; - if (Event.class.isAssignableFrom(clazz)) { + if (clazz != eventClass) { continue; } sender.sendMessage(String.format("[%s] on %s is %s", listener.getPlugin().getName(), @@ -146,23 +179,31 @@ public void execute(Listener arg0, Event arg1) throws EventException { private void printEventState(EventPriority prio, Event event) { StringBuilder sb = new StringBuilder(); - sb.append("At stage " + prio.toString() + " " + event.getEventName() + " is as follows: "); - deepInspectObject(event, "event", sb, 0); + sb.append("At stage " + prio.toString() + " " + event.getEventName() + " is as follows: \n"); + deepInspectObject(event, "event", sb, 0, new HashSet<>()); SimpleAdminHacks.instance().getLogger().info(sb.toString()); } - private void deepInspectObject(Object o, String fieldName, StringBuilder sb, int depth) { - String pre = new String(new char[depth]).replace("\0", "-") + " "; + private static void deepInspectObject(Object o, String fieldName, StringBuilder sb, int depth, Set seen) { + String pre = new String(new char[depth * 2]).replace("\0", "-") + " "; if (o == null) { - sb.append(pre + fieldName + ": null"); + sb.append(pre + fieldName + ": null\n"); return; } if (ClassUtils.isPrimitiveOrWrapper(o.getClass()) || straightPrint(o)) { - sb.append(pre + o.getClass().getSimpleName() + " " + fieldName + " = " + o.toString()); + sb.append(pre + o.getClass().getSimpleName() + " " + fieldName + " = " + o.toString() + '\n'); return; } sb.append(pre + o.getClass().getSimpleName() + " " + fieldName + ":"); - for (Field field : this.getClass().getFields()) { + if (seen.contains(o)) { + sb.append(pre + "omitted\n"); + return; + } else { + sb.append('\n'); + } + seen.add(o); + for (Field field : getAllFields(new LinkedList<>(), o.getClass())) { + field.setAccessible(true); Object member; try { member = field.get(o); @@ -171,13 +212,23 @@ private void deepInspectObject(Object o, String fieldName, StringBuilder sb, int .severe("Failed to get member in deep inspection " + e.getMessage()); continue; } - deepInspectObject(member, field.getName(), sb, depth + 1); + deepInspectObject(member, field.getName(), sb, depth + 1, seen); + } + } + + public static List getAllFields(List fields, Class type) { + fields.addAll(Arrays.asList(type.getDeclaredFields())); + if (type.getSuperclass() != null) { + getAllFields(fields, type.getSuperclass()); } + return fields; } private static boolean straightPrint(Object o) { - return o instanceof LivingEntity || o instanceof String || o instanceof World || o instanceof Plugin - || o instanceof Collection || o instanceof Map; + return o instanceof Entity || o instanceof String || o instanceof World || o instanceof Plugin + || o instanceof Collection || o instanceof Map || o instanceof Server || o instanceof Location + || o instanceof Block || o.getClass().isEnum() || o instanceof HandlerList || o instanceof Random + || o instanceof Logger || o instanceof ItemStack; } } diff --git a/src/main/resources/plugin.yml b/src/main/resources/plugin.yml index 63dc9eec..f37ac394 100644 --- a/src/main/resources/plugin.yml +++ b/src/main/resources/plugin.yml @@ -79,6 +79,10 @@ commands: / periodic