From 726654f5b80f37d4cbfeadd392c91e1fb681d1f5 Mon Sep 17 00:00:00 2001 From: Auxilor Date: Tue, 29 Dec 2020 16:06:32 +0000 Subject: [PATCH] Created Xray, Arborist, Fixed ArmorListener, Fixed Display Error. --- .../ecoenchants/enchantments/EcoEnchants.java | 4 + .../ecoenchants/normal/Arborist.java | 71 +++++++++++++ .../ecoenchants/spell/Dynamite.java | 2 +- .../enchantments/ecoenchants/spell/Xray.java | 99 +++++++++++++++++++ .../resources/enchants/normal/arborist.yml | 35 +++++++ .../main/resources/enchants/spell/xray.yml | 36 +++++++ .../java/com/willfp/eco/util/TeamUtils.java | 88 +++++++++++++++++ .../willfp/eco/util/config/BaseConfig.java | 3 +- .../util/events/armorequip/ArmorListener.java | 53 +++++----- 9 files changed, 362 insertions(+), 29 deletions(-) create mode 100644 eco-core/core-plugin/src/main/java/com/willfp/ecoenchants/enchantments/ecoenchants/normal/Arborist.java create mode 100644 eco-core/core-plugin/src/main/java/com/willfp/ecoenchants/enchantments/ecoenchants/spell/Xray.java create mode 100644 eco-core/core-plugin/src/main/resources/enchants/normal/arborist.yml create mode 100644 eco-core/core-plugin/src/main/resources/enchants/spell/xray.yml create mode 100644 eco-util/src/main/java/com/willfp/eco/util/TeamUtils.java diff --git a/eco-core/core-plugin/src/main/java/com/willfp/ecoenchants/enchantments/EcoEnchants.java b/eco-core/core-plugin/src/main/java/com/willfp/ecoenchants/enchantments/EcoEnchants.java index 0e4c9c74..590c1f7b 100644 --- a/eco-core/core-plugin/src/main/java/com/willfp/ecoenchants/enchantments/EcoEnchants.java +++ b/eco-core/core-plugin/src/main/java/com/willfp/ecoenchants/enchantments/EcoEnchants.java @@ -50,6 +50,7 @@ import com.willfp.ecoenchants.enchantments.ecoenchants.normal.Abrasion; import com.willfp.ecoenchants.enchantments.ecoenchants.normal.Aerial; import com.willfp.ecoenchants.enchantments.ecoenchants.normal.Aquatic; import com.willfp.ecoenchants.enchantments.ecoenchants.normal.Arachnid; +import com.willfp.ecoenchants.enchantments.ecoenchants.normal.Arborist; import com.willfp.ecoenchants.enchantments.ecoenchants.normal.Arcanic; import com.willfp.ecoenchants.enchantments.ecoenchants.normal.Atmospheric; import com.willfp.ecoenchants.enchantments.ecoenchants.normal.Backstab; @@ -225,6 +226,7 @@ import com.willfp.ecoenchants.enchantments.ecoenchants.spell.Dynamite; import com.willfp.ecoenchants.enchantments.ecoenchants.spell.Missile; import com.willfp.ecoenchants.enchantments.ecoenchants.spell.Quake; import com.willfp.ecoenchants.enchantments.ecoenchants.spell.Vitalize; +import com.willfp.ecoenchants.enchantments.ecoenchants.spell.Xray; import com.willfp.ecoenchants.enchantments.meta.EnchantmentType; import lombok.experimental.UtilityClass; import org.bukkit.NamespacedKey; @@ -467,6 +469,8 @@ public class EcoEnchants { public static final EcoEnchant DYNAMITE = new Dynamite(); public static final EcoEnchant CHARGE = new Charge(); public static final EcoEnchant ASCEND = new Ascend(); + public static final EcoEnchant ARBORIST = new Arborist(); + public static final EcoEnchant XRAY = new Xray(); /** * Get all registered {@link EcoEnchant}s. diff --git a/eco-core/core-plugin/src/main/java/com/willfp/ecoenchants/enchantments/ecoenchants/normal/Arborist.java b/eco-core/core-plugin/src/main/java/com/willfp/ecoenchants/enchantments/ecoenchants/normal/Arborist.java new file mode 100644 index 00000000..50cfa72a --- /dev/null +++ b/eco-core/core-plugin/src/main/java/com/willfp/ecoenchants/enchantments/ecoenchants/normal/Arborist.java @@ -0,0 +1,71 @@ +package com.willfp.ecoenchants.enchantments.ecoenchants.normal; + +import com.willfp.eco.util.drops.DropQueue; +import com.willfp.ecoenchants.enchantments.EcoEnchant; +import com.willfp.ecoenchants.enchantments.EcoEnchants; +import com.willfp.ecoenchants.enchantments.meta.EnchantmentType; +import com.willfp.ecoenchants.enchantments.util.EnchantmentUtils; +import org.bukkit.GameMode; +import org.bukkit.Material; +import org.bukkit.Tag; +import org.bukkit.block.Block; +import org.bukkit.entity.Player; +import org.bukkit.event.block.BlockBreakEvent; +import org.bukkit.inventory.ItemStack; +import org.jetbrains.annotations.NotNull; + +import java.util.ArrayList; +import java.util.List; +import java.util.Random; + +public class Arborist extends EcoEnchant { + public Arborist() { + super( + "arborist", EnchantmentType.NORMAL + ); + } + + @Override + public void onBlockBreak(@NotNull final Player player, + @NotNull final Block block, + final int level, + @NotNull final BlockBreakEvent event) { + if (player.getGameMode() == GameMode.CREATIVE || player.getGameMode() == GameMode.SPECTATOR) { + return; + } + + if (!EnchantmentUtils.passedChance(this, level)) { + return; + } + + if (!Tag.LEAVES.isTagged(block.getType())) { + return; + } + + event.setDropItems(false); + + Material toDrop; + + List materials = new ArrayList<>(); + + for (String materialName : this.getConfig().getStrings(EcoEnchants.CONFIG_LOCATION + "items")) { + Material material = Material.getMaterial(materialName.toUpperCase()); + if (material != null) { + materials.add(material); + } + } + + toDrop = materials.get(new Random().nextInt(materials.size())); + + if (toDrop == null) { + toDrop = block.getType(); + } + + ItemStack item = new ItemStack(toDrop, 1); + + new DropQueue(player) + .setLocation(block.getLocation()) + .addItem(item) + .push(); + } +} diff --git a/eco-core/core-plugin/src/main/java/com/willfp/ecoenchants/enchantments/ecoenchants/spell/Dynamite.java b/eco-core/core-plugin/src/main/java/com/willfp/ecoenchants/enchantments/ecoenchants/spell/Dynamite.java index 22774042..1e321b9d 100644 --- a/eco-core/core-plugin/src/main/java/com/willfp/ecoenchants/enchantments/ecoenchants/spell/Dynamite.java +++ b/eco-core/core-plugin/src/main/java/com/willfp/ecoenchants/enchantments/ecoenchants/spell/Dynamite.java @@ -23,7 +23,7 @@ public class Dynamite extends Spell { @Override public void onUse(@NotNull final Player player, - @NotNull final int level, + final int level, @NotNull final PlayerInteractEvent event) { Block block = event.getClickedBlock(); diff --git a/eco-core/core-plugin/src/main/java/com/willfp/ecoenchants/enchantments/ecoenchants/spell/Xray.java b/eco-core/core-plugin/src/main/java/com/willfp/ecoenchants/enchantments/ecoenchants/spell/Xray.java new file mode 100644 index 00000000..adcdd670 --- /dev/null +++ b/eco-core/core-plugin/src/main/java/com/willfp/ecoenchants/enchantments/ecoenchants/spell/Xray.java @@ -0,0 +1,99 @@ +package com.willfp.ecoenchants.enchantments.ecoenchants.spell; + +import com.willfp.eco.util.TeamUtils; +import com.willfp.ecoenchants.enchantments.EcoEnchants; +import com.willfp.ecoenchants.enchantments.itemtypes.Spell; +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.entity.Shulker; +import org.bukkit.event.block.Action; +import org.bukkit.event.player.PlayerInteractEvent; +import org.bukkit.scoreboard.Team; +import org.jetbrains.annotations.NotNull; + +import java.util.ArrayList; +import java.util.HashSet; +import java.util.List; +import java.util.Set; + +public class Xray extends Spell { + public Xray() { + super("xray"); + } + + @Override + public void onUse(@NotNull final Player player, + final int level, + @NotNull final PlayerInteractEvent event) { + Block block = event.getClickedBlock(); + + if (!event.getAction().equals(Action.RIGHT_CLICK_BLOCK)) { + return; + } + + if (block == null) { + return; + } + + Set toReveal = new HashSet<>(); + + int size = this.getConfig().getInt(EcoEnchants.CONFIG_LOCATION + "blocks-per-level") * level; + + int ticks = this.getConfig().getInt(EcoEnchants.CONFIG_LOCATION + "ticks"); + + List materials = new ArrayList<>(); + + for (String materialName : this.getConfig().getStrings(EcoEnchants.CONFIG_LOCATION + "blocks")) { + Material material = Material.getMaterial(materialName.toUpperCase()); + if (material != null) { + materials.add(material); + } + } + + for (int x = -size; x <= size; x++) { + for (int y = -size; y <= size; y++) { + for (int z = -size; z <= size; z++) { + Block block1 = block.getWorld().getBlockAt(block.getLocation().clone().add(x, y, z)); + + if (!materials.contains(block1.getType())) { + continue; + } + + boolean hidden = true; + + for (BlockFace face : new BlockFace[]{BlockFace.NORTH, BlockFace.EAST, BlockFace.SOUTH, BlockFace.WEST, BlockFace.UP, BlockFace.DOWN}) { + if (block1.getRelative(face).getType() == Material.AIR) { + hidden = false; + } + } + + if (!hidden) { + continue; + } + + toReveal.add(block1); + } + } + } + + toReveal.forEach(block1 -> { + Shulker shulker = (Shulker) block1.getWorld().spawnEntity(block1.getLocation(), EntityType.SHULKER); + shulker.setInvulnerable(true); + shulker.setSilent(true); + shulker.setAI(false); + shulker.setGravity(false); + shulker.setGlowing(true); + shulker.setInvisible(true); + + if (this.getConfig().getBool(EcoEnchants.CONFIG_LOCATION + "color-glow")) { + Team team = TeamUtils.getMaterialColorTeam(block1.getType()); + team.addEntry(shulker.getUniqueId().toString()); + } + + this.getPlugin().getScheduler().runLater(shulker::remove, ticks); + }); + } +} diff --git a/eco-core/core-plugin/src/main/resources/enchants/normal/arborist.yml b/eco-core/core-plugin/src/main/resources/enchants/normal/arborist.yml new file mode 100644 index 00000000..25ac5809 --- /dev/null +++ b/eco-core/core-plugin/src/main/resources/enchants/normal/arborist.yml @@ -0,0 +1,35 @@ +# +# Arborist EcoEnchant +# + +name: "Arborist" +description: Get more sticks, apples, and saplings from leaves. +enabled: true + +obtaining: + table: true + villager: true + loot: true + rarity: rare + +general-config: + targets: + - axe + - shears + grindstoneable: true + disabled-in-worlds: [] + conflicts: + - silk_touch + maximum-level: 4 + +config: + items: + - stick + - apple + - acacia_sapling + - birch_sapling + - dark_oak_sapling + - jungle_sapling + - oak_sapling + - spruce_sapling + chance-per-level: 0.03 # Chance to drop item. \ No newline at end of file diff --git a/eco-core/core-plugin/src/main/resources/enchants/spell/xray.yml b/eco-core/core-plugin/src/main/resources/enchants/spell/xray.yml new file mode 100644 index 00000000..32e31947 --- /dev/null +++ b/eco-core/core-plugin/src/main/resources/enchants/spell/xray.yml @@ -0,0 +1,36 @@ +# +# Xray EcoEnchant +# + +name: "Xray" +description: Show all nearby ores. +enabled: true + +obtaining: + table: true + villager: true + loot: true + rarity: legendary + +general-config: + targets: + - pickaxe + grindstoneable: true + disabled-in-worlds: [] + conflicts: [] + maximum-level: 3 + +config: + activation-sound: ENTITY_ENDERMAN_TELEPORT + cooldown: 60 # In seconds + blocks: + - coal_ore + - iron_ore + - gold_ore + - redstone_ore + - lapis_ore + - ancient_debris + - diamond_ore + blocks-per-level: 3 # Blocks on all sides to scan per level + ticks: 20 + color-glow: true # Color ore glow based on ore type. \ No newline at end of file diff --git a/eco-util/src/main/java/com/willfp/eco/util/TeamUtils.java b/eco-util/src/main/java/com/willfp/eco/util/TeamUtils.java new file mode 100644 index 00000000..0d89f778 --- /dev/null +++ b/eco-util/src/main/java/com/willfp/eco/util/TeamUtils.java @@ -0,0 +1,88 @@ +package com.willfp.eco.util; + +import com.google.common.collect.BiMap; +import com.google.common.collect.HashBiMap; +import com.willfp.eco.util.optional.Prerequisite; +import lombok.experimental.UtilityClass; +import org.bukkit.Bukkit; +import org.bukkit.ChatColor; +import org.bukkit.Material; +import org.bukkit.scoreboard.Scoreboard; +import org.bukkit.scoreboard.Team; +import org.jetbrains.annotations.NotNull; + +import java.util.stream.Collectors; + +@UtilityClass +public class TeamUtils { + /** + * Ore ChatColors. + */ + private static final BiMap MATERIAL_COLORS = HashBiMap.create(); + + /** + * All chat color teams. + */ + private static final BiMap CHAT_COLOR_TEAMS = HashBiMap.create(); + + /** + * The server scoreboard. + */ + private static final Scoreboard SCOREBOARD = Bukkit.getScoreboardManager().getMainScoreboard(); + + /** + * Get team from {@link ChatColor}. + *

+ * For {@link org.bukkit.potion.PotionEffectType#GLOWING}. + * + * @param color The color to find the team for. + * @return The team. + */ + public Team fromChatColor(@NotNull final ChatColor color) { + if (CHAT_COLOR_TEAMS.containsKey(color)) { + return CHAT_COLOR_TEAMS.get(color); + } + + Team team; + + if (!SCOREBOARD.getTeams().stream().map(Team::getName).collect(Collectors.toList()).contains("EE-" + color.name())) { + team = SCOREBOARD.registerNewTeam("EE-" + color.name()); + } else { + team = SCOREBOARD.getTeam("EE-" + color.name()); + } + assert team != null; + team.setColor(color); + CHAT_COLOR_TEAMS.forcePut(color, team); + + return team; + } + + /** + * Get team from material. + *

+ * For {@link org.bukkit.potion.PotionEffectType#GLOWING}. + * + * @param material The material to find the team from. + * @return The team. + */ + public Team getMaterialColorTeam(@NotNull final Material material) { + return fromChatColor(MATERIAL_COLORS.getOrDefault(material, ChatColor.WHITE)); + } + + static { + for (ChatColor value : ChatColor.values()) { + fromChatColor(value); + } + + MATERIAL_COLORS.forcePut(Material.COAL_ORE, ChatColor.BLACK); + MATERIAL_COLORS.forcePut(Material.IRON_ORE, ChatColor.GRAY); + MATERIAL_COLORS.forcePut(Material.GOLD_ORE, ChatColor.YELLOW); + MATERIAL_COLORS.forcePut(Material.LAPIS_ORE, ChatColor.BLUE); + MATERIAL_COLORS.forcePut(Material.REDSTONE_ORE, ChatColor.RED); + MATERIAL_COLORS.forcePut(Material.DIAMOND_ORE, ChatColor.AQUA); + + if (Prerequisite.MINIMUM_1_16.isMet()) { + MATERIAL_COLORS.forcePut(Material.ANCIENT_DEBRIS, ChatColor.DARK_RED); + } + } +} diff --git a/eco-util/src/main/java/com/willfp/eco/util/config/BaseConfig.java b/eco-util/src/main/java/com/willfp/eco/util/config/BaseConfig.java index 00a469ec..b81a188c 100644 --- a/eco-util/src/main/java/com/willfp/eco/util/config/BaseConfig.java +++ b/eco-util/src/main/java/com/willfp/eco/util/config/BaseConfig.java @@ -1,5 +1,6 @@ package com.willfp.eco.util.config; +import com.willfp.eco.util.StringUtils; import com.willfp.eco.util.injection.PluginDependent; import com.willfp.eco.util.plugin.AbstractEcoPlugin; import lombok.AccessLevel; @@ -177,7 +178,7 @@ public abstract class BaseConfig extends PluginDependent implements ValueGetter @Override @NotNull public String getString(@NotNull final String path) { - return Objects.requireNonNull(config.getString(path, "")); + return StringUtils.translate(Objects.requireNonNull(config.getString(path, ""))); } /** diff --git a/eco-util/src/main/java/com/willfp/eco/util/events/armorequip/ArmorListener.java b/eco-util/src/main/java/com/willfp/eco/util/events/armorequip/ArmorListener.java index 8e466eb4..7649236a 100644 --- a/eco-util/src/main/java/com/willfp/eco/util/events/armorequip/ArmorListener.java +++ b/eco-util/src/main/java/com/willfp/eco/util/events/armorequip/ArmorListener.java @@ -128,37 +128,36 @@ public class ArmorListener implements Listener { } @EventHandler(priority = EventPriority.HIGHEST) - public void playerInteractEvent(@NotNull final PlayerInteractEvent event) { - if (event.useItemInHand().equals(Result.DENY)) { + public void playerInteractEvent(@NotNull final PlayerInteractEvent e) { + if (e.useItemInHand().equals(Result.DENY)) { return; } - if (event.getAction() == Action.PHYSICAL) { + if (e.getAction() == Action.PHYSICAL) { return; } - if (event.getAction() == Action.RIGHT_CLICK_AIR || event.getAction() == Action.RIGHT_CLICK_BLOCK) { - Player player = event.getPlayer(); - ArmorType newArmorType = ArmorType.matchType(event.getItem()); - if ( - newArmorType != null - && newArmorType.equals(ArmorType.HELMET) - && isAirOrNull(event.getPlayer().getInventory().getHelmet()) - || newArmorType.equals(ArmorType.CHESTPLATE) - && isAirOrNull(event.getPlayer().getInventory().getChestplate()) - || newArmorType.equals(ArmorType.LEGGINGS) - && isAirOrNull(event.getPlayer().getInventory().getLeggings()) - || newArmorType.equals(ArmorType.BOOTS) - && isAirOrNull(event.getPlayer().getInventory().getBoots())) { - ArmorEquipEvent armorEquipEvent = new ArmorEquipEvent( - event.getPlayer(), - ArmorEquipEvent.EquipMethod.HOTBAR, - ArmorType.matchType(event.getItem()), - null, - event.getItem() - ); - Bukkit.getPluginManager().callEvent(armorEquipEvent); - if (armorEquipEvent.isCancelled()) { - event.setCancelled(true); - player.updateInventory(); + if (e.getAction() == Action.RIGHT_CLICK_AIR || e.getAction() == Action.RIGHT_CLICK_BLOCK) { + Player player = e.getPlayer(); + if (!e.useInteractedBlock().equals(Result.DENY)) { + if (e.getClickedBlock() != null && e.getAction() == Action.RIGHT_CLICK_BLOCK && !player.isSneaking()) { + Material mat = e.getClickedBlock().getType(); + } + } + ArmorType newArmorType = ArmorType.matchType(e.getItem()); + if (newArmorType != null) { + if (newArmorType.equals(ArmorType.HELMET) + && isAirOrNull(e.getPlayer().getInventory().getHelmet()) + || newArmorType.equals(ArmorType.CHESTPLATE) + && isAirOrNull(e.getPlayer().getInventory().getChestplate()) + || newArmorType.equals(ArmorType.LEGGINGS) + && isAirOrNull(e.getPlayer().getInventory().getLeggings()) + || newArmorType.equals(ArmorType.BOOTS) + && isAirOrNull(e.getPlayer().getInventory().getBoots())) { + ArmorEquipEvent armorEquipEvent = new ArmorEquipEvent(e.getPlayer(), ArmorEquipEvent.EquipMethod.HOTBAR, ArmorType.matchType(e.getItem()), null, e.getItem()); + Bukkit.getPluginManager().callEvent(armorEquipEvent); + if (armorEquipEvent.isCancelled()) { + e.setCancelled(true); + player.updateInventory(); + } } } }