mirror of
https://github.com/songoda/EpicAnchors.git
synced 2024-11-26 20:16:13 +01:00
Added holograms & redid timing design.
This commit is contained in:
parent
c0880b0a8c
commit
a85c8eff02
5
pom.xml
5
pom.xml
@ -79,5 +79,10 @@
|
|||||||
<artifactId>epicspawners</artifactId>
|
<artifactId>epicspawners</artifactId>
|
||||||
<version>6-pre4</version>
|
<version>6-pre4</version>
|
||||||
</dependency>
|
</dependency>
|
||||||
|
<dependency>
|
||||||
|
<groupId>com.gmail.filoghost.holographicdisplays</groupId>
|
||||||
|
<artifactId>holographicdisplays-api</artifactId>
|
||||||
|
<version>2.3.2</version>
|
||||||
|
</dependency>
|
||||||
</dependencies>
|
</dependencies>
|
||||||
</project>
|
</project>
|
||||||
|
@ -3,10 +3,14 @@ package com.songoda.epicanchors;
|
|||||||
import com.songoda.epicanchors.anchor.Anchor;
|
import com.songoda.epicanchors.anchor.Anchor;
|
||||||
import com.songoda.epicanchors.anchor.AnchorManager;
|
import com.songoda.epicanchors.anchor.AnchorManager;
|
||||||
import com.songoda.epicanchors.command.CommandManager;
|
import com.songoda.epicanchors.command.CommandManager;
|
||||||
|
import com.songoda.epicanchors.hologram.Hologram;
|
||||||
|
import com.songoda.epicanchors.hologram.HologramHolographicDisplays;
|
||||||
import com.songoda.epicanchors.tasks.AnchorTask;
|
import com.songoda.epicanchors.tasks.AnchorTask;
|
||||||
import com.songoda.epicanchors.listeners.BlockListeners;
|
import com.songoda.epicanchors.listeners.BlockListeners;
|
||||||
import com.songoda.epicanchors.listeners.InteractListeners;
|
import com.songoda.epicanchors.listeners.InteractListeners;
|
||||||
import com.songoda.epicanchors.utils.*;
|
import com.songoda.epicanchors.utils.*;
|
||||||
|
import com.songoda.epicanchors.utils.settings.Setting;
|
||||||
|
import com.songoda.epicanchors.utils.settings.SettingsManager;
|
||||||
import com.songoda.epicanchors.utils.updateModules.LocaleModule;
|
import com.songoda.epicanchors.utils.updateModules.LocaleModule;
|
||||||
import com.songoda.update.Plugin;
|
import com.songoda.update.Plugin;
|
||||||
import com.songoda.update.SongodaUpdate;
|
import com.songoda.update.SongodaUpdate;
|
||||||
@ -25,10 +29,10 @@ public class EpicAnchors extends JavaPlugin {
|
|||||||
|
|
||||||
public ConfigWrapper dataFile = new ConfigWrapper(this, "", "data.yml");
|
public ConfigWrapper dataFile = new ConfigWrapper(this, "", "data.yml");
|
||||||
|
|
||||||
private ConfigWrapper hooksFile = new ConfigWrapper(this, "", "hooks.yml");
|
|
||||||
|
|
||||||
private ServerVersion serverVersion = ServerVersion.fromPackageName(Bukkit.getServer().getClass().getPackage().getName());
|
private ServerVersion serverVersion = ServerVersion.fromPackageName(Bukkit.getServer().getClass().getPackage().getName());
|
||||||
|
|
||||||
|
private Hologram hologram;
|
||||||
|
|
||||||
private static EpicAnchors INSTANCE;
|
private static EpicAnchors INSTANCE;
|
||||||
|
|
||||||
private SettingsManager settingsManager;
|
private SettingsManager settingsManager;
|
||||||
@ -53,11 +57,10 @@ public class EpicAnchors extends JavaPlugin {
|
|||||||
console.sendMessage(Methods.formatText("&7Action: &aEnabling&7..."));
|
console.sendMessage(Methods.formatText("&7Action: &aEnabling&7..."));
|
||||||
|
|
||||||
this.settingsManager = new SettingsManager(this);
|
this.settingsManager = new SettingsManager(this);
|
||||||
|
this.settingsManager.setupConfig();
|
||||||
setupConfig();
|
|
||||||
|
|
||||||
// Locales
|
// Locales
|
||||||
String langMode = SettingsManager.Setting.LANGUGE_MODE.getString();
|
String langMode = Setting.LANGUGE_MODE.getString();
|
||||||
Locale.init(this);
|
Locale.init(this);
|
||||||
Locale.saveDefaultLocale("en_US");
|
Locale.saveDefaultLocale("en_US");
|
||||||
this.locale = Locale.getLocale(langMode);
|
this.locale = Locale.getLocale(langMode);
|
||||||
@ -87,6 +90,14 @@ public class EpicAnchors extends JavaPlugin {
|
|||||||
pluginManager.registerEvents(new BlockListeners(this), this);
|
pluginManager.registerEvents(new BlockListeners(this), this);
|
||||||
pluginManager.registerEvents(new InteractListeners(this), this);
|
pluginManager.registerEvents(new InteractListeners(this), this);
|
||||||
|
|
||||||
|
// Register Hologram Plugin
|
||||||
|
if (Setting.HOLOGRAMS.getBoolean()
|
||||||
|
&& pluginManager.isPluginEnabled("HolographicDisplays"))
|
||||||
|
hologram = new HologramHolographicDisplays(this);
|
||||||
|
|
||||||
|
if (hologram != null)
|
||||||
|
hologram.loadHolograms();
|
||||||
|
|
||||||
// Start Metrics
|
// Start Metrics
|
||||||
new Metrics(this);
|
new Metrics(this);
|
||||||
|
|
||||||
@ -95,7 +106,9 @@ public class EpicAnchors extends JavaPlugin {
|
|||||||
}
|
}
|
||||||
|
|
||||||
public void onDisable() {
|
public void onDisable() {
|
||||||
saveToFile();
|
this.saveToFile();
|
||||||
|
if (hologram != null)
|
||||||
|
this.hologram.unloadHolograms();
|
||||||
CommandSender console = Bukkit.getConsoleSender();
|
CommandSender console = Bukkit.getConsoleSender();
|
||||||
console.sendMessage(Methods.formatText("&a============================="));
|
console.sendMessage(Methods.formatText("&a============================="));
|
||||||
console.sendMessage(Methods.formatText("&7EpicAnchors " + this.getDescription().getVersion() + " by &5Brianna <3!"));
|
console.sendMessage(Methods.formatText("&7EpicAnchors " + this.getDescription().getVersion() + " by &5Brianna <3!"));
|
||||||
@ -103,13 +116,6 @@ public class EpicAnchors extends JavaPlugin {
|
|||||||
console.sendMessage(Methods.formatText("&a============================="));
|
console.sendMessage(Methods.formatText("&a============================="));
|
||||||
}
|
}
|
||||||
|
|
||||||
private void setupConfig() {
|
|
||||||
settingsManager.updateSettings();
|
|
||||||
|
|
||||||
getConfig().options().copyDefaults(true);
|
|
||||||
saveConfig();
|
|
||||||
}
|
|
||||||
|
|
||||||
private void loadAnchorsFromFile() {
|
private void loadAnchorsFromFile() {
|
||||||
if (dataFile.getConfig().contains("Anchors")) {
|
if (dataFile.getConfig().contains("Anchors")) {
|
||||||
for (String locationStr : dataFile.getConfig().getConfigurationSection("Anchors").getKeys(false)) {
|
for (String locationStr : dataFile.getConfig().getConfigurationSection("Anchors").getKeys(false)) {
|
||||||
@ -137,8 +143,7 @@ public class EpicAnchors extends JavaPlugin {
|
|||||||
this.locale.reloadMessages();
|
this.locale.reloadMessages();
|
||||||
this.references = new References();
|
this.references = new References();
|
||||||
this.loadAnchorsFromFile();
|
this.loadAnchorsFromFile();
|
||||||
this.reloadConfig();
|
this.settingsManager.reloadConfig();
|
||||||
this.setupConfig();
|
|
||||||
}
|
}
|
||||||
|
|
||||||
public int getTicksFromItem(ItemStack item) {
|
public int getTicksFromItem(ItemStack item) {
|
||||||
@ -152,9 +157,9 @@ public class EpicAnchors extends JavaPlugin {
|
|||||||
public ItemStack makAnchorItem(int ticks) {
|
public ItemStack makAnchorItem(int ticks) {
|
||||||
ItemStack item = new ItemStack(Material.valueOf(EpicAnchors.getInstance().getConfig().getString("Main.Anchor Block Material")), 1);
|
ItemStack item = new ItemStack(Material.valueOf(EpicAnchors.getInstance().getConfig().getString("Main.Anchor Block Material")), 1);
|
||||||
ItemMeta meta = item.getItemMeta();
|
ItemMeta meta = item.getItemMeta();
|
||||||
meta.setDisplayName(Methods.formatText(Methods.formatName(ticks, true)));
|
meta.setDisplayName(Methods.formatName(ticks, true));
|
||||||
ArrayList<String> lore = new ArrayList<>();
|
ArrayList<String> lore = new ArrayList<>();
|
||||||
String[] parts = getConfig().getString("Main.Anchor-Lore").split("\\|");
|
String[] parts = Setting.LORE.getString().split("\\|");
|
||||||
for (String line : parts) {
|
for (String line : parts) {
|
||||||
lore.add(Methods.formatText(line));
|
lore.add(Methods.formatText(line));
|
||||||
}
|
}
|
||||||
@ -187,6 +192,10 @@ public class EpicAnchors extends JavaPlugin {
|
|||||||
return locale;
|
return locale;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
public Hologram getHologram() {
|
||||||
|
return hologram;
|
||||||
|
}
|
||||||
|
|
||||||
public CommandManager getCommandManager() {
|
public CommandManager getCommandManager() {
|
||||||
return commandManager;
|
return commandManager;
|
||||||
}
|
}
|
||||||
|
@ -76,13 +76,35 @@ public class Anchor {
|
|||||||
location.getWorld().playSound(location, plugin.isServerVersionAtLeast(ServerVersion.V1_9)
|
location.getWorld().playSound(location, plugin.isServerVersionAtLeast(ServerVersion.V1_9)
|
||||||
? Sound.ENTITY_GENERIC_EXPLODE : Sound.valueOf("EXPLODE"), 10, 10);
|
? Sound.ENTITY_GENERIC_EXPLODE : Sound.valueOf("EXPLODE"), 10, 10);
|
||||||
|
|
||||||
plugin.getAnchorManager().removAnchor(location);
|
if (plugin.getHologram() != null)
|
||||||
|
plugin.getHologram().remove(this);
|
||||||
|
plugin.getAnchorManager().removeAnchor(location);
|
||||||
}
|
}
|
||||||
|
|
||||||
public Location getLocation() {
|
public Location getLocation() {
|
||||||
return location.clone();
|
return location.clone();
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
||||||
|
public int getX() {
|
||||||
|
return location.getBlockX();
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
|
public int getY() {
|
||||||
|
return location.getBlockY();
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
|
public int getZ() {
|
||||||
|
return location.getBlockZ();
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
|
public World getWorld() {
|
||||||
|
return location.getWorld();
|
||||||
|
}
|
||||||
|
|
||||||
public int getTicksLeft() {
|
public int getTicksLeft() {
|
||||||
return ticksLeft;
|
return ticksLeft;
|
||||||
}
|
}
|
||||||
|
@ -14,7 +14,7 @@ public class AnchorManager {
|
|||||||
return registeredAnchors.put(roundLocation(location), anchor);
|
return registeredAnchors.put(roundLocation(location), anchor);
|
||||||
}
|
}
|
||||||
|
|
||||||
public void removAnchor(Location location) {
|
public void removeAnchor(Location location) {
|
||||||
registeredAnchors.remove(roundLocation(location));
|
registeredAnchors.remove(roundLocation(location));
|
||||||
}
|
}
|
||||||
|
|
||||||
|
60
src/main/java/com/songoda/epicanchors/hologram/Hologram.java
Normal file
60
src/main/java/com/songoda/epicanchors/hologram/Hologram.java
Normal file
@ -0,0 +1,60 @@
|
|||||||
|
package com.songoda.epicanchors.hologram;
|
||||||
|
|
||||||
|
import com.songoda.epicanchors.EpicAnchors;
|
||||||
|
import com.songoda.epicanchors.anchor.Anchor;
|
||||||
|
import com.songoda.epicanchors.utils.Methods;
|
||||||
|
import org.bukkit.Location;
|
||||||
|
|
||||||
|
import java.util.Collection;
|
||||||
|
|
||||||
|
public abstract class Hologram {
|
||||||
|
|
||||||
|
protected final EpicAnchors plugin;
|
||||||
|
|
||||||
|
Hologram(EpicAnchors plugin) {
|
||||||
|
this.plugin = plugin;
|
||||||
|
}
|
||||||
|
|
||||||
|
public void loadHolograms() {
|
||||||
|
Collection<Anchor> anchors = plugin.getAnchorManager().getAnchors().values();
|
||||||
|
if (anchors.size() == 0) return;
|
||||||
|
|
||||||
|
for (Anchor anchor : anchors) {
|
||||||
|
if (anchor.getWorld() == null) continue;
|
||||||
|
add(anchor);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
public void unloadHolograms() {
|
||||||
|
Collection<Anchor> anchors = plugin.getAnchorManager().getAnchors().values();
|
||||||
|
if (anchors.size() == 0) return;
|
||||||
|
|
||||||
|
for (Anchor anchor : anchors) {
|
||||||
|
if (anchor.getWorld() == null) continue;
|
||||||
|
remove(anchor);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
public void add(Anchor anchor) {
|
||||||
|
String name = Methods.formatName(anchor.getTicksLeft(), false).trim();
|
||||||
|
|
||||||
|
add(anchor.getLocation(), name);
|
||||||
|
}
|
||||||
|
|
||||||
|
public void remove(Anchor anchor) {
|
||||||
|
remove(anchor.getLocation());
|
||||||
|
}
|
||||||
|
|
||||||
|
public void update(Anchor anchor) {
|
||||||
|
String name = Methods.formatName(anchor.getTicksLeft(), false).trim();
|
||||||
|
|
||||||
|
update(anchor.getLocation(), name);
|
||||||
|
}
|
||||||
|
|
||||||
|
protected abstract void add(Location location, String line);
|
||||||
|
|
||||||
|
protected abstract void remove(Location location);
|
||||||
|
|
||||||
|
protected abstract void update(Location location, String line);
|
||||||
|
|
||||||
|
}
|
@ -0,0 +1,48 @@
|
|||||||
|
package com.songoda.epicanchors.hologram;
|
||||||
|
|
||||||
|
import com.gmail.filoghost.holographicdisplays.api.HologramsAPI;
|
||||||
|
import com.songoda.epicanchors.EpicAnchors;
|
||||||
|
import org.bukkit.Location;
|
||||||
|
|
||||||
|
|
||||||
|
public class HologramHolographicDisplays extends Hologram {
|
||||||
|
|
||||||
|
public HologramHolographicDisplays(EpicAnchors plugin) {
|
||||||
|
super(plugin);
|
||||||
|
}
|
||||||
|
|
||||||
|
@Override
|
||||||
|
public void add(Location location, String line) {
|
||||||
|
fixLocation(location);
|
||||||
|
com.gmail.filoghost.holographicdisplays.api.Hologram hologram = HologramsAPI.createHologram(plugin, location);
|
||||||
|
hologram.appendTextLine(line);
|
||||||
|
}
|
||||||
|
|
||||||
|
@Override
|
||||||
|
public void remove(Location location) {
|
||||||
|
fixLocation(location);
|
||||||
|
for (com.gmail.filoghost.holographicdisplays.api.Hologram hologram : HologramsAPI.getHolograms(plugin)) {
|
||||||
|
if (hologram.getX() != location.getX()
|
||||||
|
|| hologram.getY() != location.getY()
|
||||||
|
|| hologram.getZ() != location.getZ()) continue;
|
||||||
|
hologram.delete();
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
@Override
|
||||||
|
public void update(Location location, String line) {
|
||||||
|
fixLocation(location);
|
||||||
|
for (com.gmail.filoghost.holographicdisplays.api.Hologram hologram : HologramsAPI.getHolograms(plugin)) {
|
||||||
|
if (hologram.getX() != location.getX()
|
||||||
|
|| hologram.getY() != location.getY()
|
||||||
|
|| hologram.getZ() != location.getZ()) continue;
|
||||||
|
if (hologram.getLine(0).toString().equals("CraftTextLine [text=" + line + "]")) continue;
|
||||||
|
hologram.clearLines();
|
||||||
|
hologram.appendTextLine(line);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
private void fixLocation(Location location) {
|
||||||
|
location.add(0.5, 1.52, 0.5);
|
||||||
|
}
|
||||||
|
}
|
@ -10,10 +10,10 @@ import org.bukkit.inventory.ItemStack;
|
|||||||
|
|
||||||
public class BlockListeners implements Listener {
|
public class BlockListeners implements Listener {
|
||||||
|
|
||||||
private EpicAnchors instance;
|
private EpicAnchors plugin;
|
||||||
|
|
||||||
public BlockListeners(EpicAnchors instance) {
|
public BlockListeners(EpicAnchors instance) {
|
||||||
this.instance = instance;
|
this.plugin = instance;
|
||||||
}
|
}
|
||||||
|
|
||||||
@EventHandler(ignoreCancelled = true)
|
@EventHandler(ignoreCancelled = true)
|
||||||
@ -23,15 +23,19 @@ public class BlockListeners implements Listener {
|
|||||||
|
|
||||||
if (!item.hasItemMeta()
|
if (!item.hasItemMeta()
|
||||||
|| !item.getItemMeta().hasDisplayName()
|
|| !item.getItemMeta().hasDisplayName()
|
||||||
|| instance.getTicksFromItem(item) == 0) return;
|
|| plugin.getTicksFromItem(item) == 0) return;
|
||||||
|
|
||||||
instance.getAnchorManager().addAnchor(event.getBlock().getLocation(), new Anchor(event.getBlock().getLocation(), instance.getTicksFromItem(item)));
|
Anchor anchor = new Anchor(event.getBlock().getLocation(), plugin.getTicksFromItem(item));
|
||||||
|
plugin.getAnchorManager().addAnchor(event.getBlock().getLocation(), anchor);
|
||||||
|
|
||||||
|
if (plugin.getHologram() != null)
|
||||||
|
plugin.getHologram().add(anchor);
|
||||||
|
|
||||||
}
|
}
|
||||||
|
|
||||||
@EventHandler
|
@EventHandler
|
||||||
public void onPortalCreation(EntityCreatePortalEvent e) {
|
public void onPortalCreation(EntityCreatePortalEvent e) {
|
||||||
if (e.getBlocks().size() < 1) return;
|
if (e.getBlocks().size() < 1) return;
|
||||||
if (instance.getAnchorManager().isAnchor(e.getBlocks().get(0).getLocation())) e.setCancelled(true);
|
if (plugin.getAnchorManager().isAnchor(e.getBlocks().get(0).getLocation())) e.setCancelled(true);
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
@ -34,7 +34,7 @@ public class AnchorTask extends BukkitRunnable {
|
|||||||
public AnchorTask(EpicAnchors plug) {
|
public AnchorTask(EpicAnchors plug) {
|
||||||
plugin = plug;
|
plugin = plug;
|
||||||
epicSpawners = Bukkit.getPluginManager().getPlugin("EpicSpawners") != null;
|
epicSpawners = Bukkit.getPluginManager().getPlugin("EpicSpawners") != null;
|
||||||
|
|
||||||
try {
|
try {
|
||||||
String ver = Bukkit.getServer().getClass().getPackage().getName().substring(23);
|
String ver = Bukkit.getServer().getClass().getPackage().getName().substring(23);
|
||||||
clazzMinecraftServer = Class.forName("net.minecraft.server." + ver + ".MinecraftServer");
|
clazzMinecraftServer = Class.forName("net.minecraft.server." + ver + ".MinecraftServer");
|
||||||
@ -68,14 +68,9 @@ public class AnchorTask extends BukkitRunnable {
|
|||||||
for (Anchor anchor : plugin.getAnchorManager().getAnchors().values()) {
|
for (Anchor anchor : plugin.getAnchorManager().getAnchors().values()) {
|
||||||
Location location1 = anchor.getLocation().add(.5, .5, .5);
|
Location location1 = anchor.getLocation().add(.5, .5, .5);
|
||||||
if (location1.getWorld() == null) continue;
|
if (location1.getWorld() == null) continue;
|
||||||
float xx = (float) (0 + (Math.random() * .15));
|
float xx = (float) (0 + (Math.random() * .75));
|
||||||
float yy = (float) (0 + (Math.random() * 1));
|
float yy = (float) (0 + (Math.random() * 1));
|
||||||
float zz = (float) (0 + (Math.random() * .15));
|
float zz = (float) (0 + (Math.random() * .75));
|
||||||
location1.getWorld().spawnParticle(Particle.SPELL, location1, 5, xx, yy, zz, 5);
|
|
||||||
|
|
||||||
xx = (float) (0 + (Math.random() * .75));
|
|
||||||
yy = (float) (0 + (Math.random() * 1));
|
|
||||||
zz = (float) (0 + (Math.random() * .75));
|
|
||||||
if (!plugin.isServerVersionAtLeast(ServerVersion.V1_13))
|
if (!plugin.isServerVersionAtLeast(ServerVersion.V1_13))
|
||||||
location1.getWorld().spawnParticle(Particle.REDSTONE, location1, 5, xx, yy, zz, 1);
|
location1.getWorld().spawnParticle(Particle.REDSTONE, location1, 5, xx, yy, zz, 1);
|
||||||
else
|
else
|
||||||
@ -91,6 +86,9 @@ public class AnchorTask extends BukkitRunnable {
|
|||||||
|
|
||||||
if (anchor.getLocation() == null) continue;
|
if (anchor.getLocation() == null) continue;
|
||||||
|
|
||||||
|
if (plugin.getHologram() != null)
|
||||||
|
plugin.getHologram().update(anchor);
|
||||||
|
|
||||||
Location location = anchor.getLocation();
|
Location location = anchor.getLocation();
|
||||||
|
|
||||||
if (anchor.getLocation().getBlock().getType() != Material.valueOf(plugin.getConfig().getString("Main.Anchor Block Material")))
|
if (anchor.getLocation().getBlock().getType() != Material.valueOf(plugin.getConfig().getString("Main.Anchor Block Material")))
|
||||||
@ -122,7 +120,7 @@ public class AnchorTask extends BukkitRunnable {
|
|||||||
anchor.setTicksLeft(ticksLeft - 3);
|
anchor.setTicksLeft(ticksLeft - 3);
|
||||||
|
|
||||||
if (ticksLeft <= 0) {
|
if (ticksLeft <= 0) {
|
||||||
plugin.getAnchorManager().removAnchor(location);
|
plugin.getAnchorManager().removeAnchor(location);
|
||||||
if (plugin.isServerVersionAtLeast(ServerVersion.V1_9))
|
if (plugin.isServerVersionAtLeast(ServerVersion.V1_9))
|
||||||
location.getWorld().spawnParticle(Particle.LAVA, location.clone().add(.5, .5, .5), 5, 0, 0, 0, 5);
|
location.getWorld().spawnParticle(Particle.LAVA, location.clone().add(.5, .5, .5), 5, 0, 0, 0, 5);
|
||||||
location.getWorld().playSound(location, plugin.isServerVersionAtLeast(ServerVersion.V1_13)
|
location.getWorld().playSound(location, plugin.isServerVersionAtLeast(ServerVersion.V1_13)
|
||||||
|
@ -1,6 +1,7 @@
|
|||||||
package com.songoda.epicanchors.utils;
|
package com.songoda.epicanchors.utils;
|
||||||
|
|
||||||
import com.songoda.epicanchors.EpicAnchors;
|
import com.songoda.epicanchors.EpicAnchors;
|
||||||
|
import com.songoda.epicanchors.utils.settings.Setting;
|
||||||
import org.bukkit.Bukkit;
|
import org.bukkit.Bukkit;
|
||||||
import org.bukkit.ChatColor;
|
import org.bukkit.ChatColor;
|
||||||
import org.bukkit.GameMode;
|
import org.bukkit.GameMode;
|
||||||
@ -23,27 +24,24 @@ public class Methods {
|
|||||||
|
|
||||||
private static Map<String, Location> serializeCache = new HashMap<>();
|
private static Map<String, Location> serializeCache = new HashMap<>();
|
||||||
|
|
||||||
public static void takeItem(Player p, int amt) {
|
public static void takeItem(Player player, int amt) {
|
||||||
if (p.getGameMode() != GameMode.CREATIVE) {
|
if (player.getGameMode() != GameMode.CREATIVE) {
|
||||||
int result = p.getInventory().getItemInHand().getAmount() - amt;
|
int result = player.getInventory().getItemInHand().getAmount() - amt;
|
||||||
if (result > 0) {
|
if (result > 0) {
|
||||||
ItemStack is = p.getItemInHand();
|
ItemStack is = player.getItemInHand();
|
||||||
is.setAmount(is.getAmount() - amt);
|
is.setAmount(is.getAmount() - amt);
|
||||||
p.setItemInHand(is);
|
player.setItemInHand(is);
|
||||||
} else {
|
} else {
|
||||||
p.setItemInHand(null);
|
player.setItemInHand(null);
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
public static String formatName(int ticks2, boolean full) {
|
public static String formatName(int ticks2, boolean full) {
|
||||||
int hours = ((ticks2 / 20) / 60) / 60;
|
|
||||||
int minutes = ((ticks2 / 20) / 60) - hours * 60;
|
|
||||||
|
|
||||||
String remaining = minutes == 0 ? String.format("%sh", hours) : String.format("%sh %sm", hours, minutes);
|
String remaining = Methods.makeReadable((ticks2 / 20L) * 1000L);
|
||||||
|
|
||||||
|
String name = Setting.NAMETAG.getString().replace("{REMAINING}", remaining);
|
||||||
String name = EpicAnchors.getInstance().getConfig().getString("Main.Name-Tag").replace("{REMAINING}", remaining);
|
|
||||||
|
|
||||||
String info = "";
|
String info = "";
|
||||||
if (full) {
|
if (full) {
|
||||||
@ -158,16 +156,56 @@ public class Methods {
|
|||||||
return location;
|
return location;
|
||||||
}
|
}
|
||||||
|
|
||||||
/**
|
|
||||||
* Makes the specified Unix Epoch time human readable as per the format settings in the Arconix config.
|
|
||||||
*
|
|
||||||
* @param time The time to convert.
|
|
||||||
* @return A human readable string representing to specified time.
|
|
||||||
*/
|
|
||||||
public static String makeReadable(Long time) {
|
public static String makeReadable(Long time) {
|
||||||
if (time == null)
|
if (time == null)
|
||||||
return "";
|
return "";
|
||||||
return String.format("%d hour(s), %d min(s), %d sec(s)", TimeUnit.MILLISECONDS.toHours(time), TimeUnit.MILLISECONDS.toMinutes(time) - TimeUnit.HOURS.toMinutes(TimeUnit.MILLISECONDS.toHours(time)), TimeUnit.MILLISECONDS.toSeconds(time) - TimeUnit.MINUTES.toSeconds(TimeUnit.MILLISECONDS.toMinutes(time)));
|
|
||||||
|
StringBuilder sb = new StringBuilder();
|
||||||
|
|
||||||
|
long days = TimeUnit.MILLISECONDS.toDays(time);
|
||||||
|
long hours = TimeUnit.MILLISECONDS.toHours(time) - TimeUnit.DAYS.toHours(TimeUnit.MILLISECONDS.toDays(time));
|
||||||
|
long minutes = TimeUnit.MILLISECONDS.toMinutes(time) - TimeUnit.HOURS.toMinutes(TimeUnit.MILLISECONDS.toHours(time));
|
||||||
|
long seconds = TimeUnit.MILLISECONDS.toSeconds(time) - TimeUnit.MINUTES.toSeconds(TimeUnit.MILLISECONDS.toMinutes(time));
|
||||||
|
|
||||||
|
if (days != 0L)
|
||||||
|
sb.append(" ").append(days).append("d");
|
||||||
|
if (hours != 0L)
|
||||||
|
sb.append(" ").append(hours).append("h");
|
||||||
|
if (minutes != 0L)
|
||||||
|
sb.append(" ").append(minutes).append("m");
|
||||||
|
if (seconds != 0L)
|
||||||
|
sb.append(" ").append(seconds).append("s");
|
||||||
|
return sb.toString().trim();
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
|
public static long parseTime(String input) {
|
||||||
|
long result = 0;
|
||||||
|
StringBuilder number = new StringBuilder();
|
||||||
|
for (int i = 0; i < input.length(); i++) {
|
||||||
|
char c = input.charAt(i);
|
||||||
|
if (Character.isDigit(c)) {
|
||||||
|
number.append(c);
|
||||||
|
} else if (Character.isLetter(c) && (number.length() > 0)) {
|
||||||
|
result += convert(Integer.parseInt(number.toString()), c);
|
||||||
|
number = new StringBuilder();
|
||||||
|
}
|
||||||
|
}
|
||||||
|
return result;
|
||||||
|
}
|
||||||
|
|
||||||
|
private static long convert(long value, char unit) {
|
||||||
|
switch (unit) {
|
||||||
|
case 'd':
|
||||||
|
return value * 1000 * 60 * 60 * 24;
|
||||||
|
case 'h':
|
||||||
|
return value * 1000 * 60 * 60;
|
||||||
|
case 'm':
|
||||||
|
return value * 1000 * 60;
|
||||||
|
case 's':
|
||||||
|
return value * 1000;
|
||||||
|
}
|
||||||
|
return 0;
|
||||||
}
|
}
|
||||||
|
|
||||||
/**
|
/**
|
||||||
|
@ -1,222 +0,0 @@
|
|||||||
package com.songoda.epicanchors.utils;
|
|
||||||
|
|
||||||
import com.songoda.epicanchors.EpicAnchors;
|
|
||||||
import org.bukkit.Bukkit;
|
|
||||||
import org.bukkit.ChatColor;
|
|
||||||
import org.bukkit.Material;
|
|
||||||
import org.bukkit.configuration.file.FileConfiguration;
|
|
||||||
import org.bukkit.entity.Player;
|
|
||||||
import org.bukkit.event.EventHandler;
|
|
||||||
import org.bukkit.event.Listener;
|
|
||||||
import org.bukkit.event.inventory.InventoryClickEvent;
|
|
||||||
import org.bukkit.event.player.AsyncPlayerChatEvent;
|
|
||||||
import org.bukkit.inventory.Inventory;
|
|
||||||
import org.bukkit.inventory.ItemStack;
|
|
||||||
import org.bukkit.inventory.meta.ItemMeta;
|
|
||||||
|
|
||||||
import java.util.ArrayList;
|
|
||||||
import java.util.Collections;
|
|
||||||
import java.util.HashMap;
|
|
||||||
import java.util.List;
|
|
||||||
import java.util.Map;
|
|
||||||
import java.util.regex.Pattern;
|
|
||||||
|
|
||||||
/**
|
|
||||||
* Created by songo on 6/4/2017.
|
|
||||||
*/
|
|
||||||
public class SettingsManager implements Listener {
|
|
||||||
|
|
||||||
private static final Pattern SETTINGS_PATTERN = Pattern.compile("(.{1,28}(?:\\s|$))|(.{0,28})", Pattern.DOTALL);
|
|
||||||
private final EpicAnchors instance;
|
|
||||||
private String pluginName = "EpicAnchors";
|
|
||||||
private Map<Player, String> cat = new HashMap<>();
|
|
||||||
private Map<Player, String> current = new HashMap<>();
|
|
||||||
|
|
||||||
public SettingsManager(EpicAnchors plugin) {
|
|
||||||
this.instance = plugin;
|
|
||||||
Bukkit.getPluginManager().registerEvents(this, plugin);
|
|
||||||
}
|
|
||||||
|
|
||||||
@EventHandler
|
|
||||||
public void onInventoryClick(InventoryClickEvent event) {
|
|
||||||
ItemStack clickedItem = event.getCurrentItem();
|
|
||||||
|
|
||||||
if (event.getInventory() != event.getWhoClicked().getOpenInventory().getTopInventory()
|
|
||||||
|| clickedItem == null || !clickedItem.hasItemMeta()
|
|
||||||
|| !clickedItem.getItemMeta().hasDisplayName()) {
|
|
||||||
return;
|
|
||||||
}
|
|
||||||
|
|
||||||
if (event.getView().getTitle().equals(pluginName + " Settings Manager")) {
|
|
||||||
event.setCancelled(true);
|
|
||||||
if (clickedItem.getType().name().contains("STAINED_GLASS")) return;
|
|
||||||
|
|
||||||
String type = ChatColor.stripColor(clickedItem.getItemMeta().getDisplayName());
|
|
||||||
this.cat.put((Player) event.getWhoClicked(), type);
|
|
||||||
this.openEditor((Player) event.getWhoClicked());
|
|
||||||
} else if (event.getView().getTitle().equals(pluginName + " Settings Editor")) {
|
|
||||||
event.setCancelled(true);
|
|
||||||
if (clickedItem.getType().name().contains("STAINED_GLASS")) return;
|
|
||||||
|
|
||||||
Player player = (Player) event.getWhoClicked();
|
|
||||||
|
|
||||||
String key = cat.get(player) + "." + ChatColor.stripColor(clickedItem.getItemMeta().getDisplayName());
|
|
||||||
|
|
||||||
if (instance.getConfig().get(key).getClass().getName().equals("java.lang.Boolean")) {
|
|
||||||
this.instance.getConfig().set(key, !instance.getConfig().getBoolean(key));
|
|
||||||
this.finishEditing(player);
|
|
||||||
} else {
|
|
||||||
this.editObject(player, key);
|
|
||||||
}
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
@EventHandler
|
|
||||||
public void onChat(AsyncPlayerChatEvent event) {
|
|
||||||
Player player = event.getPlayer();
|
|
||||||
if (!current.containsKey(player)) return;
|
|
||||||
|
|
||||||
String value = current.get(player);
|
|
||||||
FileConfiguration config = instance.getConfig();
|
|
||||||
if (config.isInt(value)) {
|
|
||||||
config.set(value, Integer.parseInt(event.getMessage()));
|
|
||||||
} else if (config.isDouble(value)) {
|
|
||||||
config.set(value, Double.parseDouble(event.getMessage()));
|
|
||||||
} else if (config.isString(value)) {
|
|
||||||
config.set(value, event.getMessage());
|
|
||||||
}
|
|
||||||
|
|
||||||
Bukkit.getScheduler().scheduleSyncDelayedTask(EpicAnchors.getInstance(), () ->
|
|
||||||
this.finishEditing(player), 0L);
|
|
||||||
|
|
||||||
event.setCancelled(true);
|
|
||||||
}
|
|
||||||
|
|
||||||
private void finishEditing(Player player) {
|
|
||||||
this.current.remove(player);
|
|
||||||
this.instance.saveConfig();
|
|
||||||
this.openEditor(player);
|
|
||||||
}
|
|
||||||
|
|
||||||
private void editObject(Player player, String current) {
|
|
||||||
this.current.put(player, ChatColor.stripColor(current));
|
|
||||||
|
|
||||||
player.closeInventory();
|
|
||||||
player.sendMessage("");
|
|
||||||
player.sendMessage(Methods.formatText("&7Please enter a value for &6" + current + "&7."));
|
|
||||||
if (instance.getConfig().isInt(current) || instance.getConfig().isDouble(current)) {
|
|
||||||
player.sendMessage(Methods.formatText("&cUse only numbers."));
|
|
||||||
}
|
|
||||||
player.sendMessage("");
|
|
||||||
}
|
|
||||||
|
|
||||||
public void openSettingsManager(Player player) {
|
|
||||||
Inventory inventory = Bukkit.createInventory(null, 27, pluginName + " Settings Manager");
|
|
||||||
ItemStack glass = Methods.getGlass();
|
|
||||||
for (int i = 0; i < inventory.getSize(); i++) {
|
|
||||||
inventory.setItem(i, glass);
|
|
||||||
}
|
|
||||||
|
|
||||||
int slot = 10;
|
|
||||||
for (String key : instance.getConfig().getDefaultSection().getKeys(false)) {
|
|
||||||
ItemStack item = new ItemStack(instance.isServerVersionAtLeast(ServerVersion.V1_13) ? Material.WHITE_WOOL : Material.valueOf("WOOL"), 1, (byte) (slot - 9)); //ToDo: Make this function as it was meant to.
|
|
||||||
ItemMeta meta = item.getItemMeta();
|
|
||||||
meta.setLore(Collections.singletonList(Methods.formatText("&6Click To Edit This Category.")));
|
|
||||||
meta.setDisplayName(Methods.formatText("&f&l" + key));
|
|
||||||
item.setItemMeta(meta);
|
|
||||||
inventory.setItem(slot, item);
|
|
||||||
slot++;
|
|
||||||
}
|
|
||||||
|
|
||||||
player.openInventory(inventory);
|
|
||||||
}
|
|
||||||
|
|
||||||
private void openEditor(Player player) {
|
|
||||||
Inventory inventory = Bukkit.createInventory(null, 54, pluginName + " Settings Editor");
|
|
||||||
FileConfiguration config = instance.getConfig();
|
|
||||||
|
|
||||||
int slot = 0;
|
|
||||||
for (String key : config.getConfigurationSection(cat.get(player)).getKeys(true)) {
|
|
||||||
String fKey = cat.get(player) + "." + key;
|
|
||||||
ItemStack item = new ItemStack(Material.DIAMOND_HELMET);
|
|
||||||
ItemMeta meta = item.getItemMeta();
|
|
||||||
meta.setDisplayName(Methods.formatText("&6" + key));
|
|
||||||
|
|
||||||
List<String> lore = new ArrayList<>();
|
|
||||||
if (config.isBoolean(fKey)) {
|
|
||||||
item.setType(Material.LEVER);
|
|
||||||
lore.add(Methods.formatText(config.getBoolean(fKey) ? "&atrue" : "&cfalse"));
|
|
||||||
} else if (config.isString(fKey)) {
|
|
||||||
item.setType(Material.PAPER);
|
|
||||||
lore.add(Methods.formatText("&9" + config.getString(fKey)));
|
|
||||||
} else if (config.isInt(fKey)) {
|
|
||||||
item.setType(instance.isServerVersionAtLeast(ServerVersion.V1_13) ? Material.CLOCK : Material.valueOf("WATCH"));
|
|
||||||
lore.add(Methods.formatText("&5" + config.getInt(fKey)));
|
|
||||||
}
|
|
||||||
|
|
||||||
meta.setLore(lore);
|
|
||||||
item.setItemMeta(meta);
|
|
||||||
|
|
||||||
inventory.setItem(slot, item);
|
|
||||||
slot++;
|
|
||||||
}
|
|
||||||
|
|
||||||
player.openInventory(inventory);
|
|
||||||
}
|
|
||||||
|
|
||||||
public void updateSettings() {
|
|
||||||
FileConfiguration config = instance.getConfig();
|
|
||||||
|
|
||||||
for (Setting setting : Setting.values()) {
|
|
||||||
config.addDefault(setting.setting, setting.option);
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
public enum Setting {
|
|
||||||
o1("Main.Name-Tag", "&Anchor &8(&7{REMAINING}&8)"),
|
|
||||||
o2("Main.Anchor-Lore", "&7Place down to keep that chunk|&7loaded until the time runs out."),
|
|
||||||
o3("Main.Anchor Block Material", EpicAnchors.getInstance().isServerVersionAtLeast(ServerVersion.V1_13) ? "END_PORTAL_FRAME" : "ENDER_PORTAL_FRAME"),
|
|
||||||
o4("Main.Add Time With Economy", true),
|
|
||||||
o5("Main.Economy Cost", 5000.0),
|
|
||||||
o6("Main.Add Time With XP", true),
|
|
||||||
o7("Main.XP Cost", 10),
|
|
||||||
o8("Main.Allow Anchor Breaking", false),
|
|
||||||
o9("Interfaces.Economy Icon", EpicAnchors.getInstance().isServerVersionAtLeast(ServerVersion.V1_13) ? "SUNFLOWER" : "GOLD_INGOT"),
|
|
||||||
o10("Interfaces.XP Icon", EpicAnchors.getInstance().isServerVersionAtLeast(ServerVersion.V1_13) ? "EXPERIENCE_BOTTLE" : "EXP_BOTTLE"),
|
|
||||||
o11("Interfaces.Glass Type 1", 7),
|
|
||||||
o12("Interfaces.Glass Type 2", 11),
|
|
||||||
o13("Interfaces.Glass Type 3", 3),
|
|
||||||
|
|
||||||
LANGUGE_MODE("System.Language Mode", "en_US");
|
|
||||||
|
|
||||||
private String setting;
|
|
||||||
private Object option;
|
|
||||||
|
|
||||||
Setting(String setting, Object option) {
|
|
||||||
this.setting = setting;
|
|
||||||
this.option = option;
|
|
||||||
}
|
|
||||||
|
|
||||||
public List<String> getStringList() {
|
|
||||||
return EpicAnchors.getInstance().getConfig().getStringList(setting);
|
|
||||||
}
|
|
||||||
|
|
||||||
public boolean getBoolean() {
|
|
||||||
return EpicAnchors.getInstance().getConfig().getBoolean(setting);
|
|
||||||
}
|
|
||||||
|
|
||||||
public int getInt() {
|
|
||||||
return EpicAnchors.getInstance().getConfig().getInt(setting);
|
|
||||||
}
|
|
||||||
|
|
||||||
public String getString() {
|
|
||||||
return EpicAnchors.getInstance().getConfig().getString(setting);
|
|
||||||
}
|
|
||||||
|
|
||||||
public char getChar() {
|
|
||||||
return EpicAnchors.getInstance().getConfig().getString(setting).charAt(0);
|
|
||||||
}
|
|
||||||
|
|
||||||
|
|
||||||
}
|
|
||||||
}
|
|
@ -0,0 +1,21 @@
|
|||||||
|
package com.songoda.epicanchors.utils.settings;
|
||||||
|
|
||||||
|
public enum Category {
|
||||||
|
|
||||||
|
MAIN("General settings and options."),
|
||||||
|
INTERFACES("These settings allow you to alter the way interfaces look.",
|
||||||
|
"They are used in GUI's to make patterns, change them up then open up a",
|
||||||
|
"GUI to see how it works."),
|
||||||
|
SYSTEM("System related settings.");
|
||||||
|
|
||||||
|
private String[] comments;
|
||||||
|
|
||||||
|
|
||||||
|
Category(String... comments) {
|
||||||
|
this.comments = comments;
|
||||||
|
}
|
||||||
|
|
||||||
|
public String[] getComments() {
|
||||||
|
return comments;
|
||||||
|
}
|
||||||
|
}
|
@ -0,0 +1,106 @@
|
|||||||
|
package com.songoda.epicanchors.utils.settings;
|
||||||
|
|
||||||
|
import com.songoda.epicanchors.EpicAnchors;
|
||||||
|
import com.songoda.epicanchors.utils.ServerVersion;
|
||||||
|
|
||||||
|
import java.util.Arrays;
|
||||||
|
import java.util.List;
|
||||||
|
import java.util.stream.Collectors;
|
||||||
|
|
||||||
|
public enum Setting {
|
||||||
|
|
||||||
|
NAMETAG("Main.Name Tag", "&6Anchor &8(&7{REMAINING}&8)"),
|
||||||
|
|
||||||
|
LORE("Main.Anchor Lore", "&7Place down to keep that chunk|&7loaded until the time runs out."),
|
||||||
|
|
||||||
|
MATERIAL("Main.Anchor Block Material", EpicAnchors.getInstance().isServerVersionAtLeast(ServerVersion.V1_13) ? "END_PORTAL_FRAME" : "ENDER_PORTAL_FRAME"),
|
||||||
|
|
||||||
|
ADD_TIME_WITH_ECONOMY("Main.Add Time With Economy", true),
|
||||||
|
|
||||||
|
ECONOMY_COST("Main.Economy Cost", 5000.0),
|
||||||
|
|
||||||
|
ADD_TIME_WITH_XP("Main.Add Time With XP", true),
|
||||||
|
|
||||||
|
XP_COST("Main.XP Cost", 10),
|
||||||
|
|
||||||
|
ALLOW_ANCHOR_BREAKING("Main.Allow Anchor Breaking", false),
|
||||||
|
|
||||||
|
HOLOGRAMS("Main.Holograms", true,
|
||||||
|
"Toggle holograms showing above anchors."),
|
||||||
|
|
||||||
|
ECO_ICON("Interfaces.Economy Icon", EpicAnchors.getInstance().isServerVersionAtLeast(ServerVersion.V1_13) ? "SUNFLOWER" : "DOUBLE_PLANT",
|
||||||
|
"Item to be displayed as the icon for economy upgrades."),
|
||||||
|
|
||||||
|
XP_ICON("Interfaces.XP Icon", EpicAnchors.getInstance().isServerVersionAtLeast(ServerVersion.V1_13) ? "EXPERIENCE_BOTTLE" : "EXP_BOTTLE",
|
||||||
|
"Item to be displayed as the icon for XP upgrades."),
|
||||||
|
|
||||||
|
GLASS_TYPE_1("Interfaces.Glass Type 1", 7),
|
||||||
|
GLASS_TYPE_2("Interfaces.Glass Type 2", 11),
|
||||||
|
GLASS_TYPE_3("Interfaces.Glass Type 3", 3),
|
||||||
|
|
||||||
|
LANGUGE_MODE("System.Language Mode", "en_US",
|
||||||
|
"The enabled language file.",
|
||||||
|
"More language files (if available) can be found in the plugins data folder.");
|
||||||
|
|
||||||
|
private String setting;
|
||||||
|
private Object option;
|
||||||
|
private String[] comments;
|
||||||
|
|
||||||
|
Setting(String setting, Object option, String... comments) {
|
||||||
|
this.setting = setting;
|
||||||
|
this.option = option;
|
||||||
|
this.comments = comments;
|
||||||
|
}
|
||||||
|
|
||||||
|
Setting(String setting, Object option) {
|
||||||
|
this.setting = setting;
|
||||||
|
this.option = option;
|
||||||
|
this.comments = null;
|
||||||
|
}
|
||||||
|
|
||||||
|
public static com.songoda.epicanchors.utils.settings.Setting getSetting(String setting) {
|
||||||
|
List<com.songoda.epicanchors.utils.settings.Setting> settings = Arrays.stream(values()).filter(setting1 -> setting1.setting.equals(setting)).collect(Collectors.toList());
|
||||||
|
if (settings.isEmpty()) return null;
|
||||||
|
return settings.get(0);
|
||||||
|
}
|
||||||
|
|
||||||
|
public String getSetting() {
|
||||||
|
return setting;
|
||||||
|
}
|
||||||
|
|
||||||
|
public Object getOption() {
|
||||||
|
return option;
|
||||||
|
}
|
||||||
|
|
||||||
|
public String[] getComments() {
|
||||||
|
return comments;
|
||||||
|
}
|
||||||
|
|
||||||
|
public List<String> getStringList() {
|
||||||
|
return EpicAnchors.getInstance().getConfig().getStringList(setting);
|
||||||
|
}
|
||||||
|
|
||||||
|
public boolean getBoolean() {
|
||||||
|
return EpicAnchors.getInstance().getConfig().getBoolean(setting);
|
||||||
|
}
|
||||||
|
|
||||||
|
public int getInt() {
|
||||||
|
return EpicAnchors.getInstance().getConfig().getInt(setting);
|
||||||
|
}
|
||||||
|
|
||||||
|
public long getLong() {
|
||||||
|
return EpicAnchors.getInstance().getConfig().getLong(setting);
|
||||||
|
}
|
||||||
|
|
||||||
|
public String getString() {
|
||||||
|
return EpicAnchors.getInstance().getConfig().getString(setting);
|
||||||
|
}
|
||||||
|
|
||||||
|
public char getChar() {
|
||||||
|
return EpicAnchors.getInstance().getConfig().getString(setting).charAt(0);
|
||||||
|
}
|
||||||
|
|
||||||
|
public double getDouble() {
|
||||||
|
return EpicAnchors.getInstance().getConfig().getDouble(setting);
|
||||||
|
}
|
||||||
|
}
|
@ -0,0 +1,311 @@
|
|||||||
|
package com.songoda.epicanchors.utils.settings;
|
||||||
|
|
||||||
|
import com.songoda.epicanchors.EpicAnchors;
|
||||||
|
import com.songoda.epicanchors.utils.Methods;
|
||||||
|
import com.songoda.epicanchors.utils.ServerVersion;
|
||||||
|
import com.songoda.epicanchors.utils.settings.Category;
|
||||||
|
import com.songoda.epicanchors.utils.settings.Setting;
|
||||||
|
import org.bukkit.Bukkit;
|
||||||
|
import org.bukkit.ChatColor;
|
||||||
|
import org.bukkit.Material;
|
||||||
|
import org.bukkit.configuration.file.FileConfiguration;
|
||||||
|
import org.bukkit.entity.Player;
|
||||||
|
import org.bukkit.event.EventHandler;
|
||||||
|
import org.bukkit.event.Listener;
|
||||||
|
import org.bukkit.event.inventory.InventoryClickEvent;
|
||||||
|
import org.bukkit.event.player.AsyncPlayerChatEvent;
|
||||||
|
import org.bukkit.inventory.Inventory;
|
||||||
|
import org.bukkit.inventory.ItemStack;
|
||||||
|
import org.bukkit.inventory.meta.ItemMeta;
|
||||||
|
|
||||||
|
import java.io.*;
|
||||||
|
import java.util.*;
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Created by songoda on 6/4/2017.
|
||||||
|
*/
|
||||||
|
public class SettingsManager implements Listener {
|
||||||
|
|
||||||
|
private final EpicAnchors plugin;
|
||||||
|
private Map<Player, String> cat = new HashMap<>();
|
||||||
|
private Map<Player, String> current = new HashMap<>();
|
||||||
|
|
||||||
|
public SettingsManager(EpicAnchors plugin) {
|
||||||
|
this.plugin = plugin;
|
||||||
|
Bukkit.getPluginManager().registerEvents(this, plugin);
|
||||||
|
}
|
||||||
|
|
||||||
|
@EventHandler
|
||||||
|
public void onInventoryClick(InventoryClickEvent event) {
|
||||||
|
ItemStack clickedItem = event.getCurrentItem();
|
||||||
|
|
||||||
|
if (event.getInventory() != event.getWhoClicked().getOpenInventory().getTopInventory()
|
||||||
|
|| clickedItem == null || !clickedItem.hasItemMeta()
|
||||||
|
|| !clickedItem.getItemMeta().hasDisplayName()) {
|
||||||
|
return;
|
||||||
|
}
|
||||||
|
|
||||||
|
if (event.getView().getTitle().equals(plugin.getName() + " Settings Manager")) {
|
||||||
|
event.setCancelled(true);
|
||||||
|
if (clickedItem.getType().name().contains("STAINED_GLASS")) return;
|
||||||
|
|
||||||
|
String type = ChatColor.stripColor(clickedItem.getItemMeta().getDisplayName());
|
||||||
|
this.cat.put((Player) event.getWhoClicked(), type);
|
||||||
|
this.openEditor((Player) event.getWhoClicked());
|
||||||
|
} else if (event.getView().getTitle().equals(plugin.getName() + " Settings Editor")) {
|
||||||
|
event.setCancelled(true);
|
||||||
|
if (clickedItem.getType().name().contains("STAINED_GLASS")) return;
|
||||||
|
|
||||||
|
Player player = (Player) event.getWhoClicked();
|
||||||
|
|
||||||
|
String key = cat.get(player) + "." + ChatColor.stripColor(clickedItem.getItemMeta().getDisplayName());
|
||||||
|
|
||||||
|
if (plugin.getConfig().get(key).getClass().getName().equals("java.lang.Boolean")) {
|
||||||
|
this.plugin.getConfig().set(key, !plugin.getConfig().getBoolean(key));
|
||||||
|
this.finishEditing(player);
|
||||||
|
} else {
|
||||||
|
this.editObject(player, key);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
@EventHandler
|
||||||
|
public void onChat(AsyncPlayerChatEvent event) {
|
||||||
|
Player player = event.getPlayer();
|
||||||
|
if (!current.containsKey(player)) return;
|
||||||
|
|
||||||
|
String value = current.get(player);
|
||||||
|
FileConfiguration config = plugin.getConfig();
|
||||||
|
if (config.isLong(value)) {
|
||||||
|
config.set(value, Long.parseLong(event.getMessage()));
|
||||||
|
} else if (config.isInt(value)) {
|
||||||
|
config.set(value, Integer.parseInt(event.getMessage()));
|
||||||
|
} else if (config.isDouble(value)) {
|
||||||
|
config.set(value, Double.parseDouble(event.getMessage()));
|
||||||
|
} else if (config.isString(value)) {
|
||||||
|
config.set(value, event.getMessage());
|
||||||
|
}
|
||||||
|
|
||||||
|
Bukkit.getScheduler().scheduleSyncDelayedTask(EpicAnchors.getInstance(), () ->
|
||||||
|
this.finishEditing(player), 0L);
|
||||||
|
|
||||||
|
event.setCancelled(true);
|
||||||
|
}
|
||||||
|
|
||||||
|
private void finishEditing(Player player) {
|
||||||
|
this.current.remove(player);
|
||||||
|
this.saveConfig();
|
||||||
|
this.openEditor(player);
|
||||||
|
}
|
||||||
|
|
||||||
|
private void editObject(Player player, String current) {
|
||||||
|
this.current.put(player, ChatColor.stripColor(current));
|
||||||
|
|
||||||
|
player.closeInventory();
|
||||||
|
player.sendMessage("");
|
||||||
|
player.sendMessage(Methods.formatText("&7Please enter a value for &6" + current + "&7."));
|
||||||
|
if (plugin.getConfig().isInt(current) || plugin.getConfig().isDouble(current)) {
|
||||||
|
player.sendMessage(Methods.formatText("&cUse only numbers."));
|
||||||
|
}
|
||||||
|
player.sendMessage("");
|
||||||
|
}
|
||||||
|
|
||||||
|
public void openSettingsManager(Player player) {
|
||||||
|
Inventory inventory = Bukkit.createInventory(null, 27, plugin.getName() + " Settings Manager");
|
||||||
|
ItemStack glass = Methods.getGlass();
|
||||||
|
for (int i = 0; i < inventory.getSize(); i++) {
|
||||||
|
inventory.setItem(i, glass);
|
||||||
|
}
|
||||||
|
|
||||||
|
int slot = 10;
|
||||||
|
for (String key : plugin.getConfig().getDefaultSection().getKeys(false)) {
|
||||||
|
ItemStack item = new ItemStack(plugin.isServerVersionAtLeast(ServerVersion.V1_13) ? Material.LEGACY_WOOL : Material.valueOf("WOOL"), 1, (byte) (slot - 9));
|
||||||
|
ItemMeta meta = item.getItemMeta();
|
||||||
|
meta.setLore(Collections.singletonList(Methods.formatText("&6Click To Edit This Category.")));
|
||||||
|
meta.setDisplayName(Methods.formatText("&f&l" + key));
|
||||||
|
item.setItemMeta(meta);
|
||||||
|
inventory.setItem(slot, item);
|
||||||
|
slot++;
|
||||||
|
}
|
||||||
|
|
||||||
|
player.openInventory(inventory);
|
||||||
|
}
|
||||||
|
|
||||||
|
private void openEditor(Player player) {
|
||||||
|
Inventory inventory = Bukkit.createInventory(null, 54, plugin.getName() + " Settings Editor");
|
||||||
|
FileConfiguration config = plugin.getConfig();
|
||||||
|
|
||||||
|
int slot = 0;
|
||||||
|
for (String key : config.getConfigurationSection(cat.get(player)).getKeys(true)) {
|
||||||
|
String fKey = cat.get(player) + "." + key;
|
||||||
|
ItemStack item = new ItemStack(Material.DIAMOND_HELMET);
|
||||||
|
ItemMeta meta = item.getItemMeta();
|
||||||
|
meta.setDisplayName(Methods.formatText("&6" + key));
|
||||||
|
|
||||||
|
List<String> lore = new ArrayList<>();
|
||||||
|
if (config.isBoolean(fKey)) {
|
||||||
|
item.setType(Material.LEVER);
|
||||||
|
lore.add(Methods.formatText(config.getBoolean(fKey) ? "&atrue" : "&cfalse"));
|
||||||
|
} else if (config.isString(fKey)) {
|
||||||
|
item.setType(Material.PAPER);
|
||||||
|
lore.add(Methods.formatText("&7" + config.getString(fKey)));
|
||||||
|
} else if (config.isInt(fKey)) {
|
||||||
|
item.setType(plugin.isServerVersionAtLeast(ServerVersion.V1_13) ? Material.CLOCK : Material.valueOf("WATCH"));
|
||||||
|
lore.add(Methods.formatText("&7" + config.getInt(fKey)));
|
||||||
|
} else if (config.isLong(fKey)) {
|
||||||
|
item.setType(plugin.isServerVersionAtLeast(ServerVersion.V1_13) ? Material.CLOCK : Material.valueOf("WATCH"));
|
||||||
|
lore.add(Methods.formatText("&7" + config.getLong(fKey)));
|
||||||
|
} else if (config.isDouble(fKey)) {
|
||||||
|
item.setType(plugin.isServerVersionAtLeast(ServerVersion.V1_13) ? Material.CLOCK : Material.valueOf("WATCH"));
|
||||||
|
lore.add(Methods.formatText("&7" + config.getDouble(fKey)));
|
||||||
|
}
|
||||||
|
|
||||||
|
Setting setting = Setting.getSetting(fKey);
|
||||||
|
|
||||||
|
if (setting != null && setting.getComments() != null) {
|
||||||
|
lore.add("");
|
||||||
|
|
||||||
|
String comment = String.join(" ", setting.getComments());
|
||||||
|
|
||||||
|
int lastIndex = 0;
|
||||||
|
for (int n = 0; n < comment.length(); n++) {
|
||||||
|
if (n - lastIndex < 30)
|
||||||
|
continue;
|
||||||
|
|
||||||
|
if (comment.charAt(n) == ' ') {
|
||||||
|
lore.add(Methods.formatText("&8" + comment.substring(lastIndex, n).trim()));
|
||||||
|
lastIndex = n;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
if (lastIndex - comment.length() < 30)
|
||||||
|
lore.add(Methods.formatText("&8" + comment.substring(lastIndex).trim()));
|
||||||
|
|
||||||
|
}
|
||||||
|
|
||||||
|
meta.setLore(lore);
|
||||||
|
item.setItemMeta(meta);
|
||||||
|
|
||||||
|
inventory.setItem(slot, item);
|
||||||
|
slot++;
|
||||||
|
}
|
||||||
|
|
||||||
|
player.openInventory(inventory);
|
||||||
|
}
|
||||||
|
|
||||||
|
public void reloadConfig() {
|
||||||
|
plugin.reloadConfig();
|
||||||
|
this.setupConfig();
|
||||||
|
}
|
||||||
|
|
||||||
|
public void setupConfig() {
|
||||||
|
FileConfiguration config = plugin.getConfig();
|
||||||
|
|
||||||
|
for (Setting setting : Setting.values()) {
|
||||||
|
config.addDefault(setting.getSetting(), setting.getOption());
|
||||||
|
}
|
||||||
|
plugin.getConfig().options().copyDefaults(true);
|
||||||
|
saveConfig();
|
||||||
|
}
|
||||||
|
|
||||||
|
private void saveConfig() {
|
||||||
|
String dump = plugin.getConfig().saveToString();
|
||||||
|
|
||||||
|
StringBuilder config = new StringBuilder();
|
||||||
|
|
||||||
|
BufferedReader bufReader = new BufferedReader(new StringReader(dump));
|
||||||
|
|
||||||
|
try {
|
||||||
|
boolean first = true;
|
||||||
|
|
||||||
|
String line;
|
||||||
|
int currentTab = 0;
|
||||||
|
String category = "";
|
||||||
|
|
||||||
|
while ((line = bufReader.readLine()) != null) {
|
||||||
|
if (line.trim().startsWith("#")) continue;
|
||||||
|
|
||||||
|
int tabChange = line.length() - line.trim().length();
|
||||||
|
if (currentTab != tabChange) {
|
||||||
|
category = category.contains(".") && tabChange != 0 ? category.substring(0, category.indexOf(".")) : "";
|
||||||
|
currentTab = tabChange;
|
||||||
|
}
|
||||||
|
|
||||||
|
if (line.endsWith(":")) {
|
||||||
|
bufReader.mark(1000);
|
||||||
|
String found = bufReader.readLine();
|
||||||
|
bufReader.reset();
|
||||||
|
|
||||||
|
if (!found.trim().startsWith("-")) {
|
||||||
|
|
||||||
|
String newCategory = line.substring(0, line.length() - 1).trim();
|
||||||
|
|
||||||
|
if (category.equals(""))
|
||||||
|
category = newCategory;
|
||||||
|
else
|
||||||
|
category += "." + newCategory;
|
||||||
|
|
||||||
|
currentTab = tabChange + 2;
|
||||||
|
|
||||||
|
if (!first) {
|
||||||
|
config.append("\n\n");
|
||||||
|
} else {
|
||||||
|
first = false;
|
||||||
|
}
|
||||||
|
|
||||||
|
if (!category.contains("."))
|
||||||
|
config.append("#").append("\n");
|
||||||
|
try {
|
||||||
|
Category categoryObj = Category.valueOf(category.toUpperCase()
|
||||||
|
.replace(" ", "_")
|
||||||
|
.replace(".", "_"));
|
||||||
|
|
||||||
|
config.append(new String(new char[tabChange]).replace('\0', ' '));
|
||||||
|
for (String l : categoryObj.getComments())
|
||||||
|
config.append("# ").append(l).append("\n");
|
||||||
|
} catch (IllegalArgumentException e) {
|
||||||
|
config.append("# ").append(category).append("\n");
|
||||||
|
}
|
||||||
|
if (!category.contains("."))
|
||||||
|
config.append("#").append("\n");
|
||||||
|
|
||||||
|
config.append(line).append("\n");
|
||||||
|
|
||||||
|
continue;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
if (line.trim().startsWith("-")) {
|
||||||
|
config.append(line).append("\n");
|
||||||
|
continue;
|
||||||
|
}
|
||||||
|
|
||||||
|
String key = category + "." + (line.split(":")[0].trim());
|
||||||
|
for (Setting setting : Setting.values()) {
|
||||||
|
if (!setting.getSetting().equals(key) || setting.getComments() == null) continue;
|
||||||
|
config.append(" ").append("\n");
|
||||||
|
for (String l : setting.getComments()) {
|
||||||
|
config.append(new String(new char[currentTab]).replace('\0', ' '));
|
||||||
|
config.append("# ").append(l).append("\n");
|
||||||
|
}
|
||||||
|
}
|
||||||
|
config.append(line).append("\n");
|
||||||
|
}
|
||||||
|
} catch (IOException e) {
|
||||||
|
e.printStackTrace();
|
||||||
|
}
|
||||||
|
|
||||||
|
try {
|
||||||
|
if (!plugin.getDataFolder().exists())
|
||||||
|
plugin.getDataFolder().mkdir();
|
||||||
|
BufferedWriter writer =
|
||||||
|
new BufferedWriter(new FileWriter(new File(plugin.getDataFolder() + File.separator + "config.yml")));
|
||||||
|
writer.write(config.toString());
|
||||||
|
writer.flush();
|
||||||
|
writer.close();
|
||||||
|
|
||||||
|
} catch (IOException e) {
|
||||||
|
e.printStackTrace();
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
Loading…
Reference in New Issue
Block a user