add safe ore break

This commit is contained in:
okx-code committed 2023-03-22 01:03:32 +00:00
1 parent 5347466bd4
commit 32401ad468
2 files changed
+205

No files matched your search

@@ -0,0 +1,198 @@
package com.programmerdan.minecraft.simpleadminhacks.hacks.basic;
import com.programmerdan.minecraft.simpleadminhacks.SimpleAdminHacks;
import com.programmerdan.minecraft.simpleadminhacks.framework.BasicHack;
import com.programmerdan.minecraft.simpleadminhacks.framework.BasicHackConfig;
import com.programmerdan.minecraft.simpleadminhacks.framework.autoload.AutoLoad;
import java.util.ArrayList;
import java.util.Arrays;
import java.util.Collections;
import java.util.List;
import java.util.Set;
import java.util.UUID;
import java.util.WeakHashMap;
import net.kyori.adventure.text.Component;
import net.kyori.adventure.text.format.NamedTextColor;
import net.kyori.adventure.text.serializer.plain.PlainTextComponentSerializer;
import org.bukkit.GameMode;
import org.bukkit.Material;
import org.bukkit.enchantments.Enchantment;
import org.bukkit.entity.Player;
import org.bukkit.event.EventHandler;
import org.bukkit.event.block.BlockBreakEvent;
import org.bukkit.inventory.ItemFlag;
import org.bukkit.inventory.ItemStack;
import org.bukkit.plugin.java.JavaPlugin;
import vg.civcraft.mc.civmodcore.inventory.items.MaterialUtils;
import vg.civcraft.mc.civmodcore.players.settings.PlayerSetting;
import vg.civcraft.mc.civmodcore.players.settings.PlayerSettingAPI;
import vg.civcraft.mc.civmodcore.players.settings.gui.MenuSection;
public final class SafeOreBreak extends BasicHack {
@AutoLoad
private List<String> ores;
private final List<BooleanOreSetting> oreSettings = new ArrayList<>();
private final List<List<Material>> breakOres = new ArrayList<>();
private final Set<Player> receivedWarning = Collections.newSetFromMap(new WeakHashMap<>());
public SafeOreBreak(final SimpleAdminHacks plugin, final BasicHackConfig config) {
super(plugin, config);
}
@Override
public void onEnable() {
super.onEnable();
MenuSection mainMenu = plugin.getSettingManager().getMainMenu();
OUTER:
for (String ore : ores) {
String[] parts = ore.split(",");
Material[] materialParts = new Material[parts.length];
for (int i = 0; i < parts.length; i++) {
String part = parts[i];
materialParts[i] = MaterialUtils.getMaterial(part);
if (materialParts[i] == null) {
logger.warning("Invalid material '" + parts[0] + "'. Skipping.");
continue OUTER;
}
}
breakOres.add(Arrays.asList(materialParts));
String materialName = PlainTextComponentSerializer.plainText() .serialize(Component.translatable(materialParts[0]));
BooleanOreSetting setting = new BooleanOreSetting(plugin, true,
"Safe " + materialName + " break",
"safeOreBreak_" + materialParts[0].getKey().getKey(),
"Prevents you from breaking " + materialName
+ " without a silk touch pickaxe.",
materialParts[0]);
oreSettings.add(setting);
PlayerSettingAPI.registerSetting(setting, mainMenu);
}
}
@Override
public void onDisable() {
super.onDisable();
}
@EventHandler(ignoreCancelled = true)
public void onOreBreak(BlockBreakEvent event) {
if (event.getPlayer().getGameMode() != GameMode.SURVIVAL) {
return;
}
ItemStack item = event.getPlayer().getInventory().getItemInMainHand();
if (item.hasItemMeta() && item.getItemMeta().hasEnchant(Enchantment.SILK_TOUCH)) {
return;
}
OUTER:
for (int i = 0; i < breakOres.size(); i++) {
List<Material> list = breakOres.get(i);
for (Material material : list) {
if (material == event.getBlock().getType()) {
Boolean value = oreSettings.get(i).getValue(event.getPlayer());
if (!value) {
continue OUTER;
}
if (receivedWarning.add(event.getPlayer())) {
event.getPlayer().sendMessage(Component.text(
"A SimpleAdminHacks /config option is preventing you from breaking that ore without a silk touch pickaxe.")
.color(NamedTextColor.RED));
}
event.setCancelled(true);
}
}
}
}
private static class BooleanOreSetting extends PlayerSetting<Boolean> {
private final Material ore;
public BooleanOreSetting(JavaPlugin owningPlugin, Boolean defaultValue, String name, String identifier,
String description, Material ore) {
super(owningPlugin, defaultValue, name, identifier, new ItemStack(Material.STONE), description, true);
this.ore = ore;
}
@Override
public Boolean deserialize(String serial) {
switch (serial.toLowerCase()) {
case "1":
case "true":
case "t":
case "y":
case "yes":
return true;
case "0":
case "false":
case "f":
case "n":
case "no":
return false;
case "null":
return null;
}
throw new IllegalArgumentException(serial + " is not a valid boolean value");
}
@Override
public ItemStack getGuiRepresentation(UUID player) {
ItemStack item;
if (getValue(player)) {
item = new ItemStack(ore);
item.addUnsafeEnchantment(Enchantment.DURABILITY, 1);
item.addItemFlags(ItemFlag.HIDE_ENCHANTS);
} else {
item = new ItemStack(ore);
}
applyInfoToItemStack(item, player);
return item;
}
@Override
public void handleMenuClick(Player player, MenuSection menu) {
setValue(player.getUniqueId(), !getValue(player.getUniqueId()));
menu.showScreen(player);
}
@Override
public String serialize(Boolean value) {
return String.valueOf(value);
}
@Override
public String toText(Boolean value) {
return String.valueOf(value);
}
@Override
public boolean isValidValue(String input) {
switch (input.toLowerCase()) {
case "1":
case "true":
case "t":
case "y":
case "yes":
case "0":
case "false":
case "f":
case "n":
case "no":
case "null":
return true;
default:
return false;
}
}
}
}
+7
View File
@@ -209,6 +209,13 @@ hacks:
ghastChance: 0.07
witherSkeletonChance: 0.05
witherHeadDropChance: 0.04
SafeOreBreak:
enabled: true
ores:
- DIAMOND_ORE,DEEPSLATE_DIAMOND_ORE
- COAL_ORE,DEEPSLATE_COAL_ORE
- REDSTONE_ORE,DEEPSLATE_REDSTONE_ORE
- LAPIS_ORE,DEEPSLATE_LAPIS_ORE
ShipOutOfLuck:
enabled: true
# The list of Material's that boats cannot be placed on and will eject passengers