diff --git a/paper/src/main/java/com/programmerdan/minecraft/simpleadminhacks/SimpleAdminHacks.java b/paper/src/main/java/com/programmerdan/minecraft/simpleadminhacks/SimpleAdminHacks.java index 1f2715ce..0ab40c6e 100644 --- a/paper/src/main/java/com/programmerdan/minecraft/simpleadminhacks/SimpleAdminHacks.java +++ b/paper/src/main/java/com/programmerdan/minecraft/simpleadminhacks/SimpleAdminHacks.java @@ -3,10 +3,13 @@ import com.programmerdan.minecraft.simpleadminhacks.framework.HackManager; import com.programmerdan.minecraft.simpleadminhacks.framework.commands.CommandRegistrar; import java.util.logging.Level; + +import com.programmerdan.minecraft.simpleadminhacks.framework.utilities.BuildLimit; import org.bukkit.Bukkit; import org.bukkit.OfflinePlayer; import org.bukkit.command.CommandExecutor; import org.bukkit.command.PluginCommand; +import org.bukkit.configuration.serialization.ConfigurationSerialization; import org.bukkit.entity.Player; import vg.civcraft.mc.civmodcore.ACivMod; @@ -34,6 +37,7 @@ public SimpleAdminHacks() { @Override public void onEnable() { super.onEnable(); + this.registerSerializations(); if (!this.config.parse()) { setEnabled(false); return; @@ -51,6 +55,10 @@ public void onDisable() { super.onDisable(); } + public void registerSerializations() { + ConfigurationSerialization.registerClass(BuildLimit.class); + } + public void registerCommand(final String identifier, final CommandExecutor executor) { final PluginCommand command = getCommand(identifier); if (command != null) { diff --git a/paper/src/main/java/com/programmerdan/minecraft/simpleadminhacks/configs/BuildLimitsConfig.java b/paper/src/main/java/com/programmerdan/minecraft/simpleadminhacks/configs/BuildLimitsConfig.java new file mode 100644 index 00000000..4cb5be10 --- /dev/null +++ b/paper/src/main/java/com/programmerdan/minecraft/simpleadminhacks/configs/BuildLimitsConfig.java @@ -0,0 +1,49 @@ +package com.programmerdan.minecraft.simpleadminhacks.configs; + +import com.programmerdan.minecraft.simpleadminhacks.SimpleAdminHacks; +import com.programmerdan.minecraft.simpleadminhacks.framework.SimpleHackConfig; +import com.programmerdan.minecraft.simpleadminhacks.framework.utilities.BuildLimit; +import org.bukkit.configuration.ConfigurationSection; + +import java.util.List; + +public final class BuildLimitsConfig extends SimpleHackConfig { + private boolean enabled; + private BuildLimit[] buildLimits; + + public BuildLimitsConfig(SimpleAdminHacks plugin, ConfigurationSection base) { + super(plugin, base); + } + public BuildLimitsConfig(ConfigurationSection base) { + super(SimpleAdminHacks.instance(), base); + } + + @Override + protected void wireup(ConfigurationSection config) { + this.enabled = config.getBoolean("enabled"); + + if (this.enabled) { + List rawList = config.getList("limits"); + if (rawList != null && rawList.size() > 0) { + try { + this.buildLimits = rawList.toArray(new BuildLimit[rawList.size()]); + plugin().getLogger().info("buildlimits enabled"); + } catch(ArrayStoreException ase) { + plugin().getLogger().warning("buildlimits was enabled, but is invalid"); + ase.printStackTrace(); + } + } else { + plugin().getLogger().warning("buildlimits was enabled, but is missing or empty"); + } + } else { + plugin().getLogger().info("buildlimits disabled"); + } + } + + public boolean isEnabled() { + return this.enabled; + } + public BuildLimit[] getBuildLimits() { + return this.buildLimits; + } +} diff --git a/paper/src/main/java/com/programmerdan/minecraft/simpleadminhacks/framework/utilities/BuildLimit.java b/paper/src/main/java/com/programmerdan/minecraft/simpleadminhacks/framework/utilities/BuildLimit.java new file mode 100644 index 00000000..15929015 --- /dev/null +++ b/paper/src/main/java/com/programmerdan/minecraft/simpleadminhacks/framework/utilities/BuildLimit.java @@ -0,0 +1,81 @@ +package com.programmerdan.minecraft.simpleadminhacks.framework.utilities; + +import org.bukkit.configuration.serialization.ConfigurationSerializable; +import org.jetbrains.annotations.NotNull; + +import java.util.LinkedHashMap; +import java.util.Map; + +public class BuildLimit implements ConfigurationSerializable { + private String world; + private String type; + private int min_y; + private int max_y; + + public BuildLimit (String world, String type, int min_y, int max_y){ + this.world = world; + this.type = type; + this.min_y = min_y; + this.max_y = max_y; + } + + public String getWorld() { + return this.world; + } + public String getType() { + return this.type; + } + public int getMin_y() { + return this.min_y; + } + public int getMax_y() { + return this.max_y; + } + + public void setWorld(String world) { + this.world = world; + } + public void setType(String type) { + this.type = type; + } + public void setMin_y(int min_y) { + this.min_y = min_y; + } + public void setMax_y(int max_y) { + this.max_y = max_y; + } + + @NotNull + @Override + public final Map serialize(){ + Map result = new LinkedHashMap<>(); + + result.put("world", this.world); + result.put("type", this.type); + result.put("min_y", this.min_y); + result.put("max_y", this.max_y); + + return result; + } + @NotNull + public static BuildLimit deserialize(@NotNull Map args){ + String world = "world"; + String type = "altitude"; + int min_y = 0; + int max_y = 0; + + world = (String) args.get("world"); + type = (String) args.get("type"); + + if(type.equals("altitude")){ + if(args.containsKey("min_y")){ + min_y = (Integer) args.get("min_y"); + } + if(args.containsKey("max_y")){ + max_y = (Integer) args.get("max_y"); + } + } + + return new BuildLimit(world, type, min_y, max_y); + } +} diff --git a/paper/src/main/java/com/programmerdan/minecraft/simpleadminhacks/hacks/BuildLimits.java b/paper/src/main/java/com/programmerdan/minecraft/simpleadminhacks/hacks/BuildLimits.java new file mode 100644 index 00000000..ba68f354 --- /dev/null +++ b/paper/src/main/java/com/programmerdan/minecraft/simpleadminhacks/hacks/BuildLimits.java @@ -0,0 +1,62 @@ +package com.programmerdan.minecraft.simpleadminhacks.hacks; + +import com.programmerdan.minecraft.simpleadminhacks.SimpleAdminHacks; +import com.programmerdan.minecraft.simpleadminhacks.configs.BuildLimitsConfig; +import com.programmerdan.minecraft.simpleadminhacks.framework.SimpleHack; +import com.programmerdan.minecraft.simpleadminhacks.framework.utilities.BuildLimit; +import net.kyori.adventure.text.Component; +import net.kyori.adventure.text.format.NamedTextColor; +import org.bukkit.Location; +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.block.BlockPlaceEvent; +import org.jetbrains.annotations.NotNull; + +public class BuildLimits extends SimpleHack implements Listener { + public BuildLimits(SimpleAdminHacks plugin, BuildLimitsConfig config) { + super(plugin, config); + } + + public static BuildLimitsConfig generate ( + final @NotNull SimpleAdminHacks plugin, + final @NotNull ConfigurationSection config){ + return new BuildLimitsConfig(plugin, config); + } + + @Override + public void onEnable(){ + plugin.registerListener(this); + } + + @EventHandler(priority = EventPriority.HIGHEST) + public void onBlockPlaceEvent(BlockPlaceEvent e){ + if(!config.isEnabled()) return; + + Player player = e.getPlayer(); + Location loc = e.getBlock().getLocation(); + + if(!withinLimits(loc)){ + e.setCancelled(true); + player.sendMessage(Component.text().content("You can not place blocks here").color(NamedTextColor.RED)); + } + } + + private boolean withinLimits(Location loc){ + BuildLimit[] limits = config.getBuildLimits(); + + for (BuildLimit limit : limits){ + if(limit.getWorld().equals(loc.getWorld().getName())){ + if(limit.getType().equals("altitude")){ + if(loc.getBlock().getY() < limit.getMax_y() && loc.getBlock().getY() > limit.getMin_y()) + continue; + return false; + } + } + } + + return true; + } +} diff --git a/paper/src/main/resources/config.yml b/paper/src/main/resources/config.yml index 55a65dec..75304f0e 100644 --- a/paper/src/main/resources/config.yml +++ b/paper/src/main/resources/config.yml @@ -259,6 +259,14 @@ hacks: - PISTON_BASE - PISTON_STICKY_BASE - OBSERVER + BuildLimits: + enabled: true + limits: + - ==: com.programmerdan.minecraft.simpleadminhacks.framework.utilities.BuildLimit + world: "world_nether" + type: "altitude" + min_y: -64 + max_y: 128 CTAnnounce: enabled: false delay: 10000